Exemplo n.º 1
0
        private Compilation AddSolutionReferences(IExecutionContext context, List <ISymbol> symbols, Compilation compilation)
        {
            IEnumerable <IFile> solutionFiles = context.FileSystem.GetInputFiles(_solutionGlobs)
                                                .Where(x => x.Path.Extension == ".sln" && x.Exists);

            foreach (IFile solutionFile in solutionFiles)
            {
                Trace.Verbose($"Creating workspace solution for {solutionFile.Path.FullPath}");
                StringWriter    log     = new StringWriter();
                AnalyzerManager manager = new AnalyzerManager(
                    solutionFile.Path.FullPath,
                    new AnalyzerManagerOptions
                {
                    LogWriter = log
                });
                foreach (ProjectAnalyzer analyzer in manager.Projects.Values)
                {
                    if (context.Bool(CodeAnalysisKeys.OutputBuildLog))
                    {
                        analyzer.WithBinaryLog();
                    }
                    ReadWorkspace.CompileProjectAndTrace(analyzer, log);
                }
                Workspace workspace = manager.GetWorkspace();
                compilation = AddProjectReferences(workspace.CurrentSolution.Projects, symbols, compilation);
            }
            return(compilation);
        }
Exemplo n.º 2
0
        public static async Task GoAsync(string[] args)
        {
            //.NET core csprojects are not supported all that well.
            // https://github.com/dotnet/roslyn/issues/21660 :sadpanda:
            // Use Buildalyzer to get a workspace from the solution.
            var analyzer  = new AnalyzerManager(Path.Combine(Program.InputDirPath, "Elasticsearch.DotNetCoreOnly.sln"));
            var workspace = analyzer.GetWorkspace();

            workspace.WorkspaceFailed += (s, e) =>
            {
                Console.Error.WriteLine(e.Diagnostic.Message);
            };

            // Buildalyzer, similar to MsBuildWorkspace with the new csproj file format, does
            // not pick up source documents in the project directory. Manually add them
            AddDocumentsToWorkspace(workspace);

            var projects = workspace.CurrentSolution.Projects
                           .ToDictionary(p => p.Name, StringComparer.OrdinalIgnoreCase);

            foreach (var file in GetDocumentFiles(projects).SelectMany(s => s))
            {
                await file.SaveToDocumentationFolderAsync();
            }

            Console.ForegroundColor = ConsoleColor.Green;
            Console.WriteLine("Documentation generated.");
            Console.ResetColor();

            if (Debugger.IsAttached)
            {
                Console.WriteLine("Press any key to continue...");
                Console.ReadKey();
            }
        }
Exemplo n.º 3
0
        static async Task Main(string[] args)
        {
            var solutionFilePath = args[0];

            var manager   = new AnalyzerManager(solutionFilePath);
            var workspace = manager.GetWorkspace();

            var builder = new Graph.Builder();

            foreach (var project in workspace.CurrentSolution.Projects)
            {
                Console.WriteLine(project.FilePath);

                foreach (var file in project.Documents)
                {
                    builder.AddDocument(new Uri(file.FilePath));

                    // var symbols = await (new DocumentSymbolProvider()).GetCodeElementsAsync(file);

                    // foreach (var symbol in symbols)
                    // {
                    //     Console.WriteLine(symbol);
                    // }
                }
            }

            Console.WriteLine(builder.Build().ToString());
        }
Exemplo n.º 4
0
        static void Main(string[] args)
        {
            var path = Environment.CurrentDirectory + "/../Pinger/Pinger.csproj";

            path = Path.GetFullPath(path);


            AnalyzerManager manager = new AnalyzerManager();

            manager.GetProject(path);

            Console.WriteLine("Starting");
            var workspace = manager.GetWorkspace();

            var project = workspace.CurrentSolution.Projects.Single();

            var compilation = project.GetCompilationAsync().GetAwaiter().GetResult();

            var isFound = compilation.ContainsSymbolsWithName(name => name == "Program", SymbolFilter.All);

            Console.WriteLine(isFound);

            foreach (var reference in project.Documents)
            {
                Console.WriteLine(reference.FilePath);
            }

            Console.WriteLine("Go");
        }
        private static async Task RunFormatItemAsync(IFormattingEngine engine, string item, string language, CancellationToken cancellationToken)
        {
            Console.WriteLine(Path.GetFileName(item));
            string extension = Path.GetExtension(item);

            if (StringComparer.OrdinalIgnoreCase.Equals(extension, ".rsp"))
            {
                using (var workspace = ResponseFileWorkspace.Create())
                {
                    Project project = workspace.OpenCommandLineProject(item, language);
                    await engine.FormatProjectAsync(project, cancellationToken);
                }
            }
            else if (StringComparer.OrdinalIgnoreCase.Equals(extension, ".sln"))
            {
                AnalyzerManager manager = new AnalyzerManager(item);
                using (var workspace = manager.GetWorkspace())
                {
                    var solution = workspace.CurrentSolution;
                    await engine.FormatSolutionAsync(solution, cancellationToken);
                }
            }
            else
            {
                AnalyzerManager manager  = new AnalyzerManager();
                ProjectAnalyzer analyzer = manager.GetProject(item);

                using (var workspace = analyzer.GetWorkspace())
                {
                    var project = workspace.CurrentSolution.Projects.FirstOrDefault();
                    await engine.FormatProjectAsync(project, cancellationToken);
                }
            }
        }
Exemplo n.º 6
0
        /*
         * To get a Roslyn workspace, we use the Buildalyzer to build the solution in design
         * mode. This allows it work out all the depencies that need to be referenced in order
         * for the Roslyn compiler to succeed.
         *
         * The BuildSolution method below uses Buildalyzer to first load a solution, and
         * then build each project separately. The build log can be optionally written
         * to a file, if the `--buildlog` option was given.
         */
        private Solution BuildSolution()
        {
            var logwriter = _options.BuildLog != null?
                            File.CreateText(_options.BuildLog) :
                                TextWriter.Null;

            using (logwriter)
            {
                var amanager = new AnalyzerManager(_options.Solution,
                                                   new AnalyzerManagerOptions()
                {
                    LogWriter = logwriter
                });
                foreach (var proj in amanager.Projects)
                {
                    proj.Value.SetGlobalProperty("OutputPath", Path.GetTempPath());
                    ConsoleOut("Building project {0}", proj.Key);
                    proj.Value.Build();
                }
                if (_options.BuildLog != null)
                {
                    ConsoleOut("Build log written to {0}", _options.BuildLog);
                }
                return(amanager.GetWorkspace().CurrentSolution);
            }
        }
Exemplo n.º 7
0
    static TestProject()
    {
        var manager = new AnalyzerManager();

        manager.GetProject(@"../../../../AOTMapper.TestProject/AOTMapper.TestProject.csproj");
        var workspace = manager.GetWorkspace();

        Project = workspace.CurrentSolution.Projects.First(o => o.Name == "AOTMapper.TestProject");
    }
            internal Options(
                IEnumerable <Project> projects    = null,
                IEnumerable <string> projectPaths = null,
                IEnumerable <string> sourcePaths  = null,
                IEnumerable <IEnumerable <string> > symbolConfigurations = null,
                IEnumerable <string> alwaysIgnoredSymbols  = null,
                IEnumerable <string> alwaysDefinedSymbols  = null,
                IEnumerable <string> alwaysDisabledSymbols = null,
                Tristate undefinedSymbolValue = default(Tristate),
                IAnalysisLogger logger        = null)
            {
                if (projectPaths != null)
                {
                    List <Project> projectsToAdd = new List <Project>();
                    projectPaths.ToList().ForEach(filePath =>
                    {
                        AnalyzerManager analyzerManager = new AnalyzerManager();
                        ProjectAnalyzer analyzer        = analyzerManager.GetProject(filePath);
                        projectsToAdd.AddRange(analyzerManager.GetWorkspace().CurrentSolution.Projects);
                    });
                    projects = projectsToAdd.AsEnumerable();
                }
                if (projects != null)
                {
                    Documents = GetSharedDocuments(projects);
                }

                if (projects == null && sourcePaths != null)
                {
                    var projectId = ProjectId.CreateNewId("AnalysisProject");
                    var solution  = new AdhocWorkspace()
                                    .CurrentSolution
                                    .AddProject(projectId, "AnalysisProject", "AnalysisProject", LanguageNames.CSharp);

                    foreach (var path in sourcePaths)
                    {
                        var documentId = DocumentId.CreateNewId(projectId);
                        solution = solution.AddDocument(
                            documentId,
                            Path.GetFileName(path),
                            new FileTextLoader(path, defaultEncoding: Encoding.UTF8));
                    }

                    Documents = solution.Projects.Single().Documents.ToImmutableArray();
                }

                _symbolConfigurations = CalculateSymbolConfigurations(
                    alwaysDisabledSymbols,
                    alwaysDefinedSymbols,
                    alwaysIgnoredSymbols,
                    symbolConfigurations);

                _undefinedSymbolValue = undefinedSymbolValue;

                Logger = logger ?? new ConsoleAnalysisLogger();
            }
Exemplo n.º 9
0
        /// <inheritdoc />
        protected override IEnumerable <Project> GetProjects(IFile file)
        {
            StringWriter    log     = new StringWriter();
            AnalyzerManager manager = new AnalyzerManager(file.Path.Directory.FullPath, log);

            foreach (ProjectAnalyzer analyzer in manager.Projects.Values)
            {
                CompileProjectAndTrace(analyzer, log);
            }
            Workspace workspace = manager.GetWorkspace();

            return(workspace.CurrentSolution.Projects);
        }
Exemplo n.º 10
0
        static async Task <int> Main(string[] args)
        {
            try
            {
                var arguments     = Args.Parse <Arguments>(args);
                var language      = arguments.Language.GetValueOrDefault(DetermineLanguageByOutputFileName(arguments.OutputFile));
                var logSink       = arguments.Verbose ? (ILogSink)ConsoleLogSink.Instance : NullLogSink.Instance;
                var loggerFactory = new LoggerFactory();
                loggerFactory.AddProvider(new LogSinkLoggerProvider(logSink));
                var options = new AnalyzerManagerOptions
                {
                    LoggerFactory = loggerFactory,
                };
                var manager          = new AnalyzerManager(arguments.SolutionFile, options);
                var workspace        = manager.GetWorkspace();
                var compilationTasks = workspace
                                       .CurrentSolution
                                       .Projects
                                       .Select(project => project.GetCompilationAsync());
                var compilations = await Task.WhenAll(compilationTasks);

                var syntaxNodes = XmlBasedGenerator.GenerateMocks(
                    logSink,
                    language,
                    compilations.ToImmutableList(),
                    arguments.ConfigurationFile);
                var result = syntaxNodes
                             .Aggregate(
                    new StringBuilder(),
                    (acc, next) => acc.AppendLine(next.ToFullString()).AppendLine(),
                    acc => acc.ToString());

                var log = logSink.ToString();
                File.WriteAllText(arguments.OutputFile, result);
                return(0);
            }
            catch (ArgException ex)
            {
                WriteLine(OutputType.Error, ex.Message);
                WriteLine();
                WriteLine(ArgUsage.GenerateUsageFromTemplate <Arguments>().ToNormalString());
                return(-1);
            }
            catch (Exception ex)
            {
                WriteLine(OutputType.Error, "Failed to generate code: {0}", ex);
                return(-1);
            }
        }
        public void LoadsSolution()
        {
            // Given
            string          solutionPath = GetFullPath(@"projects\TestProjects.sln");
            StringWriter    log          = new StringWriter();
            AnalyzerManager manager      = new AnalyzerManager(solutionPath, new AnalyzerManagerOptions {
                LogWriter = log
            });

            // When
            Workspace workspace = manager.GetWorkspace();

            // Then
            workspace.CurrentSolution.FilePath.ShouldBe(solutionPath);
            workspace.CurrentSolution.Projects.ShouldContain(p => p.Name == "LegacyFrameworkProject");
            workspace.CurrentSolution.Projects.ShouldContain(p => p.Name == "SdkFrameworkProject");
        }
        public static async Task <AnalysisEngine> FromFilePaths(
            IEnumerable <string> filePaths,
            IEnumerable <IEnumerable <string> > symbolConfigurations = null,
            IEnumerable <string> alwaysIgnoredSymbols  = null,
            IEnumerable <string> alwaysDefinedSymbols  = null,
            IEnumerable <string> alwaysDisabledSymbols = null,
            Tristate undefinedSymbolValue       = default(Tristate),
            CancellationToken cancellationToken = default(CancellationToken))
        {
            if (filePaths == null || !filePaths.Any())
            {
                throw new ArgumentException("Must specify at least one file path");
            }

            IEnumerable <string> sourcePaths = null;
            List <Project>       projects    = new List <Project>();

            var firstFileExt = Path.GetExtension(filePaths.First());

            if (firstFileExt.EndsWith("proj", StringComparison.OrdinalIgnoreCase))
            {
                filePaths.ToList().ForEach(filePath =>
                {
                    AnalyzerManager manager  = new AnalyzerManager();
                    ProjectAnalyzer analyzer = manager.GetProject(filePath);
                    projects.AddRange(manager.GetWorkspace().CurrentSolution.Projects);
                });
            }
            else
            {
                sourcePaths = filePaths;
            }

            var options = new Options(
                projects: projects,
                sourcePaths: sourcePaths,
                symbolConfigurations: symbolConfigurations,
                alwaysIgnoredSymbols: alwaysIgnoredSymbols,
                alwaysDefinedSymbols: alwaysDefinedSymbols,
                alwaysDisabledSymbols: alwaysDisabledSymbols,
                undefinedSymbolValue: undefinedSymbolValue);

            return(new AnalysisEngine(options));
        }
Exemplo n.º 13
0
        static void Main(string[] args)
        {
            var mgr = new AnalyzerManager(new AnalyzerManagerOptions());

            var proj = mgr.GetProject(MVCAPP);
            var cop  = proj.Compile();

            Workspace   workspace         = mgr.GetWorkspace();
            Compilation compilation       = workspace.CurrentSolution.Projects.First().GetCompilationAsync().Result;
            var         controllerSymbols = compilation.GetSymbolsWithName(x => x.EndsWith("Controller"));

            foreach (var controller in controllerSymbols)
            {
                foreach (var controllerTree in controller.DeclaringSyntaxReferences)
                {
                    AnalyseController(controllerTree.SyntaxTree);
                }
            }
        }
Exemplo n.º 14
0
        /// <inheritdoc />
        protected override IEnumerable <Project> GetProjects(IExecutionContext context, IFile file)
        {
            StringWriter    log     = new StringWriter();
            AnalyzerManager manager = new AnalyzerManager(file.Path.Directory.FullPath, new AnalyzerManagerOptions
            {
                LogWriter = log
            });

            foreach (ProjectAnalyzer analyzer in manager.Projects.Values)
            {
                if (context.Bool(CodeAnalysisKeys.OutputBuildLog))
                {
                    analyzer.WithBinaryLog();
                }
                CompileProjectAndTrace(analyzer, log);
            }
            Workspace workspace = manager.GetWorkspace();

            return(workspace.CurrentSolution.Projects);
        }
Exemplo n.º 15
0
        /*
         * To get a Roslyn workspace, we use the Buildalyzer to build the solution in design
         * mode. This allows it work out all the depencies that need to be referenced in order
         * for the Roslyn compiler to succeed.
         *
         * The BuildSolution method below uses Buildalyzer to first load a solution, and
         * then build each project separately. The build log can be optionally written
         * to a file, if the `--buildlog` option was given.
         */
        private Solution BuildSolution()
        {
            var logwriter = _options.BuildLog != null?
                            File.CreateText(_options.BuildLog) :
                                TextWriter.Null;

            using (logwriter)
            {
                var amanager = new AnalyzerManager(Path.GetFullPath(_options.Solution),
                                                   new AnalyzerManagerOptions()
                {
                    LogWriter = logwriter
                });
                ConsoleOut("Building solution...");
                var solution = amanager.GetWorkspace().CurrentSolution;
                if (_options.BuildLog != null)
                {
                    ConsoleOut("Build log written to {0}", _options.BuildLog);
                }
                return(solution);
            }
        }
Exemplo n.º 16
0
        static void Main()
        {
            // However you might want to change this filepath for your testing
            var solutionFilePath = Directory.GetCurrentDirectory() + @"/Benchmarks/eShopOnWeb/eShopOnWeb.sln";

            Console.WriteLine("Parsing solution... " + solutionFilePath);
            if (!File.Exists(solutionFilePath))
            {
                Console.WriteLine("File not found, the folder " + Directory.GetCurrentDirectory()
                                  + " should be the one containing the Benchmarks folder, so the root directory of the git repo");
                return;
            }

            var manager   = new AnalyzerManager(solutionFilePath);
            var workspace = manager.GetWorkspace();
            var projects  = workspace.CurrentSolution.Projects;

            Console.WriteLine("Parsing source code for expected issues and traps...");
            Helper.AnalyzeWalker(projects, new ExpectedIssueWalker());
            IssueReporter.Instance.EndExpectMode();

            Console.WriteLine("Analyzing source code...");
            var walkersNames = Assembly.GetExecutingAssembly().GetTypes()
                               .Where(t => String.Equals(t.Namespace, "Compiler.IssueWalkers", StringComparison.Ordinal));

            var walkers = walkersNames.Select(x => Activator.CreateInstance(x)).OfType <DefaultWalker>();

            Helper.AnalyzeWalkers(projects, walkers);

            // And reporting results
            var sw = new StreamWriter(Console.OpenStandardOutput());

            sw.AutoFlush = true;
            Console.SetOut(sw);

            IssueReporter.Instance.Report(sw);
        }
Exemplo n.º 17
0
        public static async Task <int> GoAsync(string[] args)
        {
            //.NET core csprojects are not supported all that well.
            // https://github.com/dotnet/roslyn/issues/21660 :sadpanda:
            // Use Buildalyzer to get a workspace from the solution.
            var options = new AnalyzerManagerOptions()
            {
                ProjectFilter = p => ProjectsWeWant.Contains(p.ProjectName)
            };

            var analyzer = new AnalyzerManager(Path.Combine(Program.InputDirPath, "..", "Elasticsearch.sln"), options);

            var workspace = analyzer.GetWorkspace();

            var seenFailures = false;

            workspace.WorkspaceFailed += (s, e) =>
            {
                Console.Error.WriteLine($"Workplace failure: {e.Diagnostic.Message}");
                seenFailures = true;
            };

            // Buildalyzer, similar to MsBuildWorkspace with the new csproj file format, does
            // not pick up source documents in the project directory. Manually add them
            // AddDocumentsToWorkspace(workspace);

            var projects = workspace.CurrentSolution.Projects
                           .ToDictionary(p => p.Name, StringComparer.OrdinalIgnoreCase);

            if (seenFailures)
            {
                Console.ForegroundColor = ConsoleColor.Red;
                Console.Error.WriteLine("Documentation failed to generate.");
                Console.ResetColor();
                return(2);
            }

            DeleteExistingTmpDocs();

            foreach (var file in GetDocumentFiles(projects).SelectMany(s => s))
            {
                await file.SaveToDocumentationFolderAsync();
            }

            if (seenFailures)
            {
                Console.ForegroundColor = ConsoleColor.Red;
                Console.Error.WriteLine("Documentation failed to generate.");
                Console.ResetColor();
                return(2);
            }



            CopyBreakingChangesDocs();
            DeleteExistingDocsAndSwap();

            Console.ForegroundColor = ConsoleColor.Green;
            Console.WriteLine("Documentation generated.");
            Console.ResetColor();

            if (Debugger.IsAttached)
            {
                Console.WriteLine("Press any key to continue...");
                Console.ReadKey();
            }
            return(0);
        }
Exemplo n.º 18
0
        static async Task Main(string[] args)
        {
            // Buildalyzerのルート
            var manager = new AnalyzerManager();

            // slnを指定してまるっと持ってくるでもいいんですが、とりあえずcsproj単品で並べてみた。
            // 解析対象となる対象のプロジェクトと、参照としてのUniRxのプロジェクトを登録(Getすると同時に登録も行われるという仕様……)
            manager.GetProject(@"C:\***\UniRx.csproj");
            manager.GetProject(@"C:\***\UniRx.Async.csproj");
            manager.GetProject(@"C:\***\Assembly-CSharp.csproj");

            // 登録されたプロジェクト群からAdhocWorkspaceを作成
            var workspace     = manager.GetWorkspace();
            var targetProject = workspace.CurrentSolution.Projects.First(x => x.Name == "Assembly-CSharp");

            // コンパイル結果みたいなのを取得
            var compilation = await targetProject.GetCompilationAsync();

            // 比較対象の型シンボルをCompilationから持ってくる
            var observableSymbol = compilation.GetTypeByMetadataName("UniRx.Observable");

            // 収集
            var methods = new List <IMethodSymbol>();

            foreach (var tree in compilation.SyntaxTrees)
            {
                // Syntax -> Symbol変換するためのModelの取得
                var semanticModel = compilation.GetSemanticModel(tree);

                // シンタックスツリーからメソッド呼び出しだけを抜き出し
                var invocationExpressions = tree.GetRoot()
                                            .DescendantNodes()
                                            .OfType <InvocationExpressionSyntax>();

                foreach (var expr in invocationExpressions)
                {
                    // その中からUniRx.Observableに属するメソッドのみを抽出
                    var methodSymbol = semanticModel.GetSymbolInfo(expr).Symbol as IMethodSymbol;
                    if (methodSymbol?.ContainingType == observableSymbol)
                    {
                        methods.Add(methodSymbol);
                    }
                }
            }

            // 解析
            Console.WriteLine("## TotalCount:" + methods.Count);

            var grouping = methods
                           .Select(x => x.OriginalDefinition) // Foo -> Fooへ変換
                           .Select(x => x.Name)               // 今回はメソッド名だけ取る(オーバーロードの違いは無視)
                           .GroupBy(x => x)
                           .OrderByDescending(x => x.Count())
                           .Select(x => new { MethodName = x.Key, Count = x.Count() })
                           .ToArray();

            // マークダウンの表で出力
            Console.WriteLine("| メソッド名| 呼び出し数 |");
            Console.WriteLine("| --- | --- |");
            foreach (var item in grouping)
            {
                Console.WriteLine($"| {item.MethodName} | {item.Count} |");
            }
        }
Exemplo n.º 19
0
        public override async Task <IDataToSent> TransformData(IDataToSent receiveData)
        {
            if (!File.Exists(fileNameSln))
            {
                throw new FileNotFoundException(fileNameSln);
            }

            if (receiveData == null)
            {
                receiveData = new DataToSentTable();
            }
            var manager = new AnalyzerManager(fileNameSln);
            var sol     = manager.GetWorkspace().CurrentSolution;

            var dtSolution = new DataTable();

            dtSolution.TableName = "solutions";

            dtSolution.Columns.Add("Name", typeof(string));
            dtSolution.Columns.Add("FilePath", typeof(string));
            dtSolution.Columns.Add("Type", typeof(string));

            dtSolution.Rows.Add(Path.GetFileNameWithoutExtension(fileNameSln), fileNameSln);

            var dtProjects = new DataTable();

            dtProjects.TableName = "projects";
            dtProjects.Columns.Add("Id", typeof(string));
            dtProjects.Columns.Add("SolutionFilePath", typeof(string));
            dtProjects.Columns.Add("Name", typeof(string));
            dtProjects.Columns.Add("FilePath", typeof(string));
            dtProjects.Columns.Add("Type", typeof(string));


            var dtRelationProject = new DataTable();

            dtRelationProject.TableName = "projectReferences";
            dtRelationProject.Columns.Add("PrjId", typeof(string));
            dtRelationProject.Columns.Add("RefPrjId", typeof(string));

            var dtAssemblies = new DataTable();

            dtAssemblies.TableName = "assemblies";
            dtAssemblies.Columns.Add("Name", typeof(string));
            dtAssemblies.Columns.Add("DisplayNameToken", typeof(string));
            dtAssemblies.Columns.Add("FullName", typeof(string));
            dtAssemblies.Columns.Add("Version", typeof(string));

            var dtRelProjectAssemblies = new DataTable();

            dtRelProjectAssemblies.TableName = "projectAssemblies";
            dtRelProjectAssemblies.Columns.Add("PrjId", typeof(string));
            dtRelProjectAssemblies.Columns.Add("FullName", typeof(string));

            var existsAssemblies = new List <string>();

            foreach (var prj in sol.Projects)
            {
                var id = prj.Id.Id.ToString("N");
                dtProjects.Rows.Add(
                    id,
                    fileNameSln,
                    prj.Name,
                    prj.FilePath,
                    prj.GetType().Name
                    );
                foreach (var prjProjectReference in prj.ProjectReferences)
                {
                    dtRelationProject.Rows.Add(id, prjProjectReference.ProjectId.Id.ToString("N"));
                }

                var c = await prj.GetCompilationAsync();

                foreach (var referencedAssemblyName in c.ReferencedAssemblyNames)
                {
                    var fullName = referencedAssemblyName.GetDisplayName(true);
                    if (!existsAssemblies.Contains(fullName))
                    {
                        existsAssemblies.Add(fullName);
                        dtAssemblies.Rows.Add(referencedAssemblyName.Name,
                                              referencedAssemblyName.GetDisplayName(false),
                                              fullName,
                                              referencedAssemblyName.Version.ToString());
                    }

                    dtRelProjectAssemblies.Rows.Add(id, fullName);
                }
                //TODO: project.MetadataReferences
            }

            FastAddTables(receiveData, dtSolution, dtProjects, dtRelationProject, dtAssemblies, dtRelProjectAssemblies);

            return(receiveData);
        }