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); }