/// <summary> /// Project file analysis phase /// </summary> /// <param name="project">Porject file object</param> /// <param name="output">C# ASG output path</param> /// <param name="fxCopPath">FxCopCmd.exe path</param> /// <param name="fXCopOut">FxCop result directory</param> private static void Analyse(Project project, string output, string fxCopPath, string fXCopOut) { if (!string.IsNullOrEmpty(fxCopPath)) { MainDeclaration.Instance.FxCopTasks.Add(Task.Run(() => StartFxCopAnalysis(project.OutputFilePath, (string.IsNullOrEmpty(fXCopOut)) ? output : fXCopOut, fxCopPath))); } CreateComponent(project); Csharp.Asg.Factory Factory = new Csharp.Asg.Factory(new StrTable()); Dictionary <Microsoft.CodeAnalysis.CSharp.CSharpSyntaxNode, uint> CSharpMap = new Dictionary <Microsoft.CodeAnalysis.CSharp.CSharpSyntaxNode, uint>(); NodeBuilder mapBuilder = new NodeBuilder(Factory, CSharpMap); TreeEdgeBuilder edgeBuilder = new TreeEdgeBuilder(Factory, CSharpMap); CrossEdgeFiller crossEdgeFiller = new CrossEdgeFiller(Factory, CSharpMap); foreach (var document in project.Documents) { if (Commons.Common.CheckOuterFilters(document.FilePath)) { continue; } MainDeclaration.Instance.RoslynWatch.Start(); MainDeclaration.Instance.Model = document.GetSemanticModelAsync().Result; MainDeclaration.Instance.RoslynWatch.Stop(); MainDeclaration.Instance.CSSIWatch.Start(); BuildCSSIASG(document, mapBuilder, edgeBuilder); MainDeclaration.Instance.CSSIWatch.Stop(); MainDeclaration.Instance.LIMWatch.Start(); BuildLIMASG(CSharpMap, crossEdgeFiller); MainDeclaration.Instance.LIMWatch.Stop(); } SaveCsharpASG(project, output, Factory); }
/// <summary> /// LIM ASG building phase /// </summary> /// <param name="map">Roslyn node and C# ASG ids map</param> /// <param name="crossEdgeFiller">C# ASG cross edge filler object</param> private static void BuildLIMASG(Dictionary <Microsoft.CodeAnalysis.CSharp.CSharpSyntaxNode, uint> map, CrossEdgeFiller crossEdgeFiller) { if (!MainDeclaration.Instance.LocalMap.ContainsKey(MainDeclaration.Instance.Model.Compilation.Assembly.GlobalNamespace)) { MainDeclaration.Instance.LocalMap.Add(MainDeclaration.Instance.Model.Compilation.Assembly.GlobalNamespace, MainDeclaration.Instance.LimFactory.Root); MainDeclaration.Instance.Root = MainDeclaration.Instance.LimFactory.getRef(MainDeclaration.Instance.LimFactory.Root) as Lim.Asg.Nodes.Logical.Package; SymbolBuilder.BuildDispatch <Lim.Asg.Nodes.Logical.Package, INamespaceSymbol>(MainDeclaration.Instance.Model.Compilation.Assembly.GlobalNamespace); MainDeclaration.Instance.UsesStack.Pop(); } Commons.Common.Safe_Edge(MainDeclaration.Instance.Root, "BelongsTo", MainDeclaration.Instance.Component.Id); if (!GetAlreadyContain(MainDeclaration.Instance.Component)) { MainDeclaration.Instance.LimFactory.ComponentRootRef.addContains(MainDeclaration.Instance.Component); } MainDeclaration.Instance.RoslynWatch.Start(); var root = MainDeclaration.Instance.Model.SyntaxTree.GetRoot(); MainDeclaration.Instance.RoslynWatch.Stop(); //Visitor.Visit(root, ref map, crossEdgeFiller); RoslynVisitor.GetInstance(map, crossEdgeFiller).Visit(root); }