/// <summary> /// File-in and process the actions contained in the node. /// </summary> /// <param name="processor">Interchange format processor responsible for the processing context.</param> /// <param name="parseErrorSink">Error sink for reporting parse errors.</param> /// <param name="sourceCodeService">Source code service that can convert tokens to source code span and reports issues.</param> /// <returns>Return an interchange unit node for annotation, usually just self.</returns> public override InterchangeUnitNode FileIn(InterchangeFormatProcessor processor, IParseErrorSink parseErrorSink, ISourceCodeReferenceService sourceCodeService) { if (processor == null) { throw new ArgumentNullException("processor"); } if (parseErrorSink == null) { throw new ArgumentNullException("parseErrorSink"); } if (sourceCodeService == null) { throw new ArgumentNullException("sourceCodeService"); } // ALL instance vars must be set. If one is missing, then source code bug, and // InterchangeFormatParser.ParsePoolValueInitialization() should have reported the error. if ((this.PoolName == null) || (this.PoolVariableName == null)) { return(this); } // <poolValueInitialization> ::= <poolName> ’initializerFor:’ <poolVariableNameString> // <elementSeparator> <variableInitializer> <elementSeparator> // <variableInitializer> ::= <initializer definition> ISourceCodeReferenceService methodSourceCodeService; InitializerNode initializer = processor.ParseInitializer(out methodSourceCodeService); if (initializer == null) { return(this); // Processor/Parser should have reported errors } if (!initializer.Accept(IronSmalltalk.Compiler.Visiting.ParseTreeValidatingVisitor.Current)) { // We expect the parser to have reported the errors. Just in case, we do it once more to the installer. // Bad practice here is to use the 'processor.SourcePosition', but we don't have anything better :-/ if (processor.ErrorSink != null) { processor.ErrorSink.AddInterchangeError(processor.SourcePosition, processor.SourcePosition, "Invalid initializer source code."); } return(this); } RuntimePoolVariableInitializerFactory factory = new RuntimePoolVariableInitializerFactory(initializer, methodSourceCodeService, this.PoolName.Value, this.PoolVariableName.Value); PoolVariableInitializer definition = new PoolVariableInitializer( processor.CreateSourceReference(this.PoolName.Value, this.PoolName, sourceCodeService), processor.CreateSourceReference(this.PoolVariableName.Value, this.PoolVariableName, sourceCodeService), sourceCodeService, methodSourceCodeService, factory); this.Definfition = definition; // This may fail, but we don't care. If failed, it reported the error through its error sink. processor.FileInProcessor.FileInPoolVariableInitializer(definition); return(this); }
public bool ValidatePoolVariableInitializer(PoolVariableInitializer definition, Pool pool, IDefinitionInstallerContext installer, ICodeValidationErrorSink errorSink) { return(((RuntimePoolItemInitializer)this.CreateInitializer(definition, installer)).Validate(installer.NameScope, this.GetErrorSink(errorSink))); }
bool IInterchangeFileInProcessor.FileInPoolVariableInitializer(PoolVariableInitializer initializer) { this.AddPoolVariableInitializer(initializer); return(true); }
/// <summary> /// Add a pool variable or pool constant initializer definition to the installation context. /// </summary> /// <param name="initializer">Definition of the initializer to be added.</param> public void AddPoolVariableInitializer(PoolVariableInitializer initializer) { this._initializers.Add(initializer); }