private ImmutableArray <TypeParameterSymbol> MakeTypeParameters(MethodDeclarationSyntax syntax, DiagnosticBag diagnostics) { Debug.Assert(syntax.TypeParameterList != null); OverriddenMethodTypeParameterMapBase typeMap = null; if (this.IsOverride) { typeMap = new OverriddenMethodTypeParameterMap(this); } else if (this.IsExplicitInterfaceImplementation) { typeMap = new ExplicitInterfaceMethodTypeParameterMap(this); } var typeParameters = syntax.TypeParameterList.Parameters; var result = ArrayBuilder <TypeParameterSymbol> .GetInstance(); for (int ordinal = 0; ordinal < typeParameters.Count; ordinal++) { var parameter = typeParameters[ordinal]; var identifier = parameter.Identifier; var location = identifier.GetLocation(); var name = identifier.ValueText; // Note: It is not an error to have a type parameter named the same as its enclosing method: void M<M>() {} for (int i = 0; i < result.Count; i++) { if (name == result[i].Name) { diagnostics.Add(ErrorCode.ERR_DuplicateTypeParameter, location, name); break; } } var tpEnclosing = ContainingType.FindEnclosingTypeParameter(name); if ((object)tpEnclosing != null) { // Type parameter '{0}' has the same name as the type parameter from outer type '{1}' diagnostics.Add(ErrorCode.WRN_TypeParameterSameAsOuterTypeParameter, location, name, tpEnclosing.ContainingType); } var syntaxRefs = ImmutableArray.Create(parameter.GetReference()); var locations = ImmutableArray.Create(location); var typeParameter = (typeMap != null) ? (TypeParameterSymbol) new SourceOverridingMethodTypeParameterSymbol( typeMap, name, ordinal, locations, syntaxRefs) : new SourceMethodTypeParameterSymbol( this, name, ordinal, locations, syntaxRefs); result.Add(typeParameter); } return(result.ToImmutableAndFree()); }
private ImmutableArray<TypeParameterSymbol> MakeTypeParameters(MethodDeclarationSyntax syntax, DiagnosticBag diagnostics) { Debug.Assert(syntax.TypeParameterList != null); OverriddenMethodTypeParameterMapBase typeMap = null; if (this.IsOverride) { typeMap = new OverriddenMethodTypeParameterMap(this); } else if (this.IsExplicitInterfaceImplementation) { typeMap = new ExplicitInterfaceMethodTypeParameterMap(this); } var typeParameters = syntax.TypeParameterList.Parameters; var result = ArrayBuilder<TypeParameterSymbol>.GetInstance(); for (int ordinal = 0; ordinal < typeParameters.Count; ordinal++) { var parameter = typeParameters[ordinal]; var identifier = parameter.Identifier; var location = identifier.GetLocation(); var name = identifier.ValueText; // Note: It is not an error to have a type parameter named the same as its enclosing method: void M<M>() {} for (int i = 0; i < result.Count; i++) { if (name == result[i].Name) { diagnostics.Add(ErrorCode.ERR_DuplicateTypeParameter, location, name); break; } } var tpEnclosing = ContainingType.FindEnclosingTypeParameter(name); if ((object)tpEnclosing != null) { // Type parameter '{0}' has the same name as the type parameter from outer type '{1}' diagnostics.Add(ErrorCode.WRN_TypeParameterSameAsOuterTypeParameter, location, name, tpEnclosing.ContainingType); } var syntaxRefs = ImmutableArray.Create(parameter.GetReference()); var locations = ImmutableArray.Create(location); var typeParameter = (typeMap != null) ? (TypeParameterSymbol)new SourceOverridingMethodTypeParameterSymbol( typeMap, name, ordinal, locations, syntaxRefs) : new SourceMethodTypeParameterSymbol( this, name, ordinal, locations, syntaxRefs); result.Add(typeParameter); } return result.ToImmutableAndFree(); }