Пример #1
0
        public bool AnalyzeDfsTree(PhpSourceFile /*!*/ rootSourceFile)
        {
            CompilationUnit root = GetNode(rootSourceFile);

            ScriptCompilationUnit rootScript = root as ScriptCompilationUnit;

            if (rootScript != null && rootScript.State == CompilationUnit.States.Initial)
            {
                Analyzer analyzer = null;

                try
                {
                    // builds the tree of parsed units via DFS:
                    ProcessNode(rootScript);

                    // finishes pending inclusions via MFP:
                    ProcessPendingInclusions();

                    analyzer = new Analyzer(context);

                    // pre-analysis:
                    rootScript.PreAnalyzeRecursively(analyzer);

                    // member analysis:
                    rootScript.AnalyzeMembersRecursively(analyzer);

                    if (context.Errors.AnyFatalError)
                    {
                        return(false);
                    }

                    // full analysis:
                    rootScript.AnalyzeRecursively(analyzer);

                    if (context.Errors.AnyFatalError)
                    {
                        return(false);
                    }

                    // perform post analysis:
                    analyzer.PostAnalyze();

                    if (context.Errors.AnyError)
                    {
                        return(false);
                    }

                    // TODO:
                    // define constructed types:
                    analyzer.DefineConstructedTypeBuilders();
                }
                catch (CompilerException)
                {
                    root.State = CompilationUnit.States.Erroneous;
                    return(false);
                }

                if (context.Errors.AnyError)
                {
                    return(false);
                }
            }
            else if (root.State != CompilationUnit.States.Analyzed && root.State != CompilationUnit.States.Reflected)
            {
                return(false);
            }

            return(true);
        }