Ejemplo n.º 1
0
        private IndexerSymbol BuildIndexer(IndexerDeclarationNode indexerNode, TypeSymbol typeSymbol)
        {
            TypeSymbol indexerType = typeSymbol.SymbolSet.ResolveType(indexerNode.Type, _symbolTable, typeSymbol);

            Debug.Assert(indexerType != null);

            if (indexerType != null)
            {
                IndexerSymbol indexer = new IndexerSymbol(typeSymbol, indexerType);
                BuildMemberDetails(indexer, typeSymbol, indexerNode, indexerNode.Attributes);

                if (AttributeNode.FindAttribute(indexerNode.Attributes, "IntrinsicProperty") != null)
                {
                    indexer.SetIntrinsic();
                }

                SymbolImplementationFlags implFlags = SymbolImplementationFlags.Regular;
                if (indexerNode.SetAccessor == null)
                {
                    implFlags |= SymbolImplementationFlags.ReadOnly;
                }
                if ((indexerNode.Modifiers & Modifiers.Abstract) != 0)
                {
                    implFlags |= SymbolImplementationFlags.Abstract;
                }
                else if ((indexerNode.Modifiers & Modifiers.Override) != 0)
                {
                    implFlags |= SymbolImplementationFlags.Override;
                }

                indexer.SetImplementationState(implFlags);

                Debug.Assert(indexerNode.Parameters.Count != 0);
                foreach (ParameterNode parameterNode in indexerNode.Parameters)
                {
                    ParameterSymbol paramSymbol = BuildParameter(parameterNode, indexer);
                    if (paramSymbol != null)
                    {
                        paramSymbol.SetParseContext(parameterNode);
                        indexer.AddParameter(paramSymbol);
                    }
                }

                indexer.AddParameter(new ParameterSymbol("value", indexer, indexerType, ParameterMode.In));

                return(indexer);
            }

            return(null);
        }
Ejemplo n.º 2
0
        bool IParseNodeValidator.Validate(ParseNode node, CompilerOptions options, IErrorHandler errorHandler)
        {
            IndexerDeclarationNode indexerNode = (IndexerDeclarationNode)node;

            if ((indexerNode.Modifiers & Modifiers.New) != 0)
            {
                errorHandler.ReportNodeValidationError(DSharpStringResources.INDEXER_NEW_KEYWORD_NOT_SUPPORTED_ERROR, indexerNode);

                return(false);
            }

            if (indexerNode.GetAccessor == null)
            {
                errorHandler.ReportNodeValidationError(DSharpStringResources.INDEXER_SET_ONLY_NOT_SUPPORTED, indexerNode);

                return(false);
            }

            return(true);
        }
Ejemplo n.º 3
0
        bool IParseNodeValidator.Validate(ParseNode node, CompilerOptions options, IErrorHandler errorHandler)
        {
            IndexerDeclarationNode indexerNode = (IndexerDeclarationNode)node;

            if ((indexerNode.Modifiers & Modifiers.New) != 0)
            {
                errorHandler.ReportError("The new modifier is not supported.",
                                         indexerNode.Token.Location);

                return(false);
            }

            if (indexerNode.GetAccessor == null)
            {
                errorHandler.ReportError("Set-only properties are not supported. Use a set method instead.",
                                         indexerNode.Token.Location);
                return(false);
            }

            return(true);
        }
Ejemplo n.º 4
0
 public void enterIndexerSetter(IndexerDeclarationNode declaration)
 {
     methodInfos.add(declaration.SetAccessor.getUserData(typeof(MethodInfo)));
 }