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