예제 #1
0
        public static void ExtractStandalone(
            IEnumerable <string> sources,
            IEnumerable <string> referencePaths,
            IProgressMonitor pm,
            ILogger logger,
            CommonOptions options)
        {
            var canonicalPathCache = CanonicalPathCache.Create(logger, 1000);
            var pathTransformer    = new PathTransformer(canonicalPathCache);

            using var analyser   = new Analyser(pm, logger, false, pathTransformer);
            using var references = new BlockingCollection <MetadataReference>();
            try
            {
                var referenceTasks = referencePaths.Select <string, Action>(path => () =>
                {
                    var reference = MetadataReference.CreateFromFile(path);
                    references.Add(reference);
                });

                var syntaxTrees     = new List <SyntaxTree>();
                var syntaxTreeTasks = ReadSyntaxTrees(sources, analyser, null, null, syntaxTrees);

                var sw = new Stopwatch();
                sw.Start();

                Parallel.Invoke(
                    new ParallelOptions {
                    MaxDegreeOfParallelism = options.Threads
                },
                    referenceTasks.Interleave(syntaxTreeTasks).ToArray());

                if (syntaxTrees.Count == 0)
                {
                    analyser.Logger.Log(Severity.Error, "  No source files");
                    ++analyser.CompilationErrors;
                }

                var compilation = CSharpCompilation.Create(
                    "csharp.dll",
                    syntaxTrees,
                    references
                    );

                analyser.InitializeStandalone(compilation, options);
                analyser.AnalyseReferences();

                foreach (var tree in compilation.SyntaxTrees)
                {
                    analyser.AnalyseTree(tree);
                }

                sw.Stop();
                analyser.Logger.Log(Severity.Info, "  Models constructed in {0}", sw.Elapsed);

                sw.Restart();
                analyser.PerformExtraction(options.Threads);
                sw.Stop();
                analyser.Logger.Log(Severity.Info, "  Extraction took {0}", sw.Elapsed);

                foreach (var type in analyser.MissingNamespaces)
                {
                    pm.MissingNamespace(type);
                }

                foreach (var type in analyser.MissingTypes)
                {
                    pm.MissingType(type);
                }

                pm.MissingSummary(analyser.MissingTypes.Count(), analyser.MissingNamespaces.Count());
            }
            catch (Exception ex)  // lgtm[cs/catch-of-all-exceptions]
            {
                analyser.Logger.Log(Severity.Error, "  Unhandled exception: {0}", ex);
            }
        }