private ImmutableArray <TypeParameterSymbol> MakeTypeParameters(DiagnosticBag diagnostics) { var result = ArrayBuilder <TypeParameterSymbol> .GetInstance(); var typeParameters = _syntax.TypeParameterList.Parameters; for (int ordinal = 0; ordinal < typeParameters.Count; ordinal++) { var parameter = typeParameters[ordinal]; var identifier = parameter.Identifier; var location = identifier.GetLocation(); var name = identifier.ValueText; // TODO: Add diagnostic checks for nested local functions (and containing method) if (name == this.Name) { diagnostics.Add(ErrorCode.ERR_TypeVariableSameAsParent, location, name); } for (int i = 0; i < result.Count; i++) { if (name == result[i].Name) { diagnostics.Add(ErrorCode.ERR_DuplicateTypeParameter, location, name); break; } } var tpEnclosing = ContainingSymbol.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.ContainingSymbol); } var typeParameter = new LocalFunctionTypeParameterSymbol( this, name, ordinal, ImmutableArray.Create(location), ImmutableArray.Create(parameter.GetReference())); result.Add(typeParameter); } return(result.ToImmutableAndFree()); }
private ImmutableArray <LocalFunctionTypeParameterSymbol> MakeTypeParameters(DiagnosticBag diagnostics) { var result = ArrayBuilder <LocalFunctionTypeParameterSymbol> .GetInstance(); var typeParameters = _syntax.TypeParameterList.Parameters; for (int ordinal = 0; ordinal < typeParameters.Count; ordinal++) { var parameter = typeParameters[ordinal]; var identifier = parameter.Identifier; var location = identifier.GetLocation(); var name = identifier.ValueText; ReportAnyAttributes(diagnostics, parameter.AttributeLists); foreach (var @param in result) { if (name == @param.Name) { diagnostics.Add(ErrorCode.ERR_DuplicateTypeParameter, location, name); break; } } var tpEnclosing = ContainingSymbol.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.ContainingSymbol); } var typeParameter = new LocalFunctionTypeParameterSymbol( this, name, ordinal, ImmutableArray.Create(location), ImmutableArray.Create(parameter.GetReference())); result.Add(typeParameter); } return(result.ToImmutableAndFree()); }
private ImmutableArray<TypeParameterSymbol> MakeTypeParameters(DiagnosticBag diagnostics) { var result = ArrayBuilder<TypeParameterSymbol>.GetInstance(); var typeParameters = _syntax.TypeParameterList.Parameters; for (int ordinal = 0; ordinal < typeParameters.Count; ordinal++) { var parameter = typeParameters[ordinal]; var identifier = parameter.Identifier; var location = identifier.GetLocation(); var name = identifier.ValueText; // TODO: Add diagnostic checks for nested local functions (and containing method) if (name == this.Name) { diagnostics.Add(ErrorCode.ERR_TypeVariableSameAsParent, location, name); } for (int i = 0; i < result.Count; i++) { if (name == result[i].Name) { diagnostics.Add(ErrorCode.ERR_DuplicateTypeParameter, location, name); break; } } var tpEnclosing = ContainingSymbol.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.ContainingSymbol); } var typeParameter = new LocalFunctionTypeParameterSymbol( this, name, ordinal, ImmutableArray.Create(location), ImmutableArray.Create(parameter.GetReference())); result.Add(typeParameter); } return result.ToImmutableAndFree(); }