/// <summary> /// If source type is insided target type, only grab the type parameters up to the target type. Otherwise, grab consolidated. /// </summary> private static TypeNodeList FindNonStandardTypeParametersToBeDuplicated(FindClosurePartsToDuplicate fmd, TypeNode sourceType, TypeNode targetType) { Debug.Assert(TypeNode.IsCompleteTemplate(sourceType)); Debug.Assert(TypeNode.IsCompleteTemplate(targetType)); TypeNodeList result = null; if (sourceType.DeclaringType != null) { if (fmd.MembersToDuplicate.Contains(sourceType.DeclaringType)) { Debug.Assert(false); return null; } if (sourceType.DeclaringType == targetType) return null; if (IsInsideOf(sourceType, targetType)) { // difficult case. Grab consolidated type parameters, except the ones up from the target type var sourceConsolidated = sourceType.ConsolidatedTemplateParameters; if (sourceConsolidated == null || sourceConsolidated.Count == 0) return null; var targetConsolidated = targetType.ConsolidatedTemplateParameters; if (targetConsolidated == null || targetConsolidated.Count == 0) return sourceConsolidated; if (sourceConsolidated.Count == targetConsolidated.Count) return null; // no extra type parameters result = new TypeNodeList(sourceConsolidated.Count - targetConsolidated.Count); for (int i = 0; i < sourceConsolidated.Count; i++) { if (i < targetConsolidated.Count) continue; result.Add(sourceConsolidated[i]); return result; } } else { // For Roslyn-based closures we need to combine all the types from source and target types together. if (sourceType.IsRoslynBasedStaticClosure()) { var sourceConsolidated = sourceType.ConsolidatedTemplateParameters; if (sourceConsolidated == null || sourceConsolidated.Count == 0) return null; var targetConsolidated = targetType.ConsolidatedTemplateParameters; if (targetConsolidated == null || targetConsolidated.Count == 0) return sourceConsolidated; if (sourceConsolidated.Count == targetConsolidated.Count) return null; // no extra type parameters result = new TypeNodeList(sourceConsolidated.Count + targetConsolidated.Count); for (int i = 0; i < targetConsolidated.Count; i++) { result.Add(targetConsolidated[i]); } for (int i = 0; i < sourceConsolidated.Count; i++) { result.Add(sourceConsolidated[i]); } return result; } result = sourceType.ConsolidatedTemplateParameters; } } return result; }