public SourceOverridingMethodTypeParameterSymbol(
     OverriddenMethodTypeParameterMapBase map,
     string name,
     int ordinal,
     ImmutableArray <Location> locations,
     ImmutableArray <SyntaxReference> syntaxRefs
     ) : base(name, ordinal, locations, syntaxRefs)
 {
     _map = map;
 }
Beispiel #2
0
        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());
        }
 public SourceOverridingMethodTypeParameterSymbol(OverriddenMethodTypeParameterMapBase map, string name, int ordinal, NullabilityPreservationKind preservationKind, ImmutableArray<Location> locations, ImmutableArray<SyntaxReference> syntaxRefs)
     : base(name, ordinal, preservationKind, locations, syntaxRefs)
 {
     _map = map;
 }
 public SourceOverridingMethodTypeParameterSymbol(OverriddenMethodTypeParameterMapBase map, string name, int ordinal, ImmutableArray<Location> locations, ImmutableArray<SyntaxReference> syntaxRefs)
     : base(name, ordinal, locations, syntaxRefs)
 {
     this.map = map;
 }