Esempio n. 1
0
        /// <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);
        }
Esempio n. 2
0
 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);
 }