Example #1
0
        private bool BuildModules(DependencyCollection <Location, Location> modDeps)
        {
            int nDeps;
            var deps   = modDeps.GetTopologicalSort(out nDeps, cancel);
            var flags  = new List <Flag>();
            var result = true;

            foreach (var d in deps)
            {
                Contract.Assert(d.Kind == DependencyNodeKind.Normal);
                if (d.Resource.AST.Node.NodeKind != NodeKind.Domain &&
                    d.Resource.AST.Node.NodeKind != NodeKind.Transform &&
                    d.Resource.AST.Node.NodeKind != NodeKind.TSystem &&
                    d.Resource.AST.Node.NodeKind != NodeKind.Model)
                {
                    continue; //// Others not implemented yet.
                }

                var ast     = d.Resource.AST;
                var modData = d.Resource.AST.Node.CompilerData as ModuleData;
                Contract.Assert(modData != null);

                //// In this case, the module was already compiled on an earlier interaction.
                if (modData.Phase != ModuleData.PhaseKind.Reduced)
                {
                    continue;
                }

                string name;
                modData.Reduced.Node.TryGetStringAttribute(AttributeKind.Name, out name);
                //// Console.WriteLine("Building symbol table for {0}", name);

                var symbTable = new SymbolTable(modData);

                flags.Clear();
                result = symbTable.Compile(flags, cancel) & result;
                Result.AddFlags((AST <Program>)Factory.Instance.ToAST(ast.Root), flags);
                flags.Clear();

                if (cancel.IsCancellationRequested)
                {
                    return(false);
                }

                if (!symbTable.IsValid)
                {
                    continue;
                }

                modData.PassedPhase(ModuleData.PhaseKind.TypesDefined, symbTable);

                if (modData.Source.AST.Node.NodeKind == NodeKind.Model)
                {
                    //// Console.WriteLine("Building fact table for {0}", name);
                    var facts = new FactSet(modData);
                    if (facts.Validate(flags, cancel))
                    {
                        modData.PassedPhase(ModuleData.PhaseKind.Compiled, facts);
                    }
                    else
                    {
                        result = false;
                    }
                }
                else if (modData.Source.AST.Node.NodeKind == NodeKind.TSystem)
                {
                    var tsys = new Common.Composites.CoreTSystem(modData);
                    if (tsys.Compile(flags, cancel))
                    {
                        modData.PassedPhase(ModuleData.PhaseKind.Compiled, tsys);
                    }
                    else
                    {
                        result = false;
                    }
                }
                else
                {
                    //// Console.WriteLine("Building rule table for {0}", name);
                    var ruleTable = new RuleTable(modData);
                    if (ruleTable.Compile(flags, cancel))
                    {
                        modData.PassedPhase(ModuleData.PhaseKind.Compiled, ruleTable);
                        Configuration conf = null;
                        switch (modData.Source.AST.Node.NodeKind)
                        {
                        case NodeKind.Domain:
                            conf = (Configuration)((Domain)modData.Source.AST.Node).Config.CompilerData;
                            break;

                        case NodeKind.Transform:
                            conf = (Configuration)((Transform)modData.Source.AST.Node).Config.CompilerData;
                            break;

                        default:
                            throw new NotImplementedException();
                        }

                        Cnst prodCheckSetting;
                        if (conf.TryGetSetting(Configuration.Compiler_ProductivityCheckSetting, out prodCheckSetting))
                        {
                            ruleTable.ProductivityCheck(prodCheckSetting, flags);
                        }
                    }
                    else
                    {
                        result = false;
                    }
                }

                Result.AddFlags((AST <Program>)Factory.Instance.ToAST(ast.Root), flags);

                if (cancel.IsCancellationRequested)
                {
                    return(false);
                }
            }

            return(result);
        }