private static ImmutableArray<TypeSymbol> GetTypeArguments(ImmutableArray<TypeParameterSymbol> definitionTypeParameters, AbstractTypeParameterMap currentTypeMap, AbstractTypeParameterMap typeSubstitutionOpt) { var typeArguments = ImmutableArray.CreateBuilder<TypeSymbol>(definitionTypeParameters.Length); foreach (var typeParameterSymbol in definitionTypeParameters) { if (typeSubstitutionOpt != null) { var substitutedType = currentTypeMap.SubstituteType(typeParameterSymbol); if (!object.ReferenceEquals(substitutedType, typeParameterSymbol)) { typeArguments.Add(currentTypeMap.SubstituteType(substitutedType)); } else { var substitutedTypeOpt = typeSubstitutionOpt.SubstituteType(typeParameterSymbol.OriginalDefinition); typeArguments.Add(currentTypeMap.SubstituteType(substitutedTypeOpt)); } } else { typeArguments.Add(currentTypeMap.SubstituteType(typeParameterSymbol)); } } return typeArguments.ToImmutableArray(); }