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); }
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); }
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); }
public void enterIndexerSetter(IndexerDeclarationNode declaration) { methodInfos.add(declaration.SetAccessor.getUserData(typeof(MethodInfo))); }