Ejemplo n.º 1
0
        public override WorkflowResult Process(WorkflowResult workflowResult       = null,
                                               CancellationToken cancellationToken = default(CancellationToken))
        {
            Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;

            BaseLanguages = GetBaseLanguages(AnalyzedLanguages);
            var result = workflowResult ??
                         new WorkflowResult(AnalyzedLanguages.ToArray(), ThreadCount, Stage, IsIncludeIntermediateResult);

            result.BaseLanguages = BaseLanguages.ToArray();
            result.RenderStages  = RenderStages;
            result.IsSimplifyUst = IsSimplifyUst;

            IEnumerable <string> fileNames = SourceCodeRepository.GetFileNames();

            if (fileNames is IList <string> fileNamesList)
            {
                result.TotalFilesCount = fileNamesList.Count;
            }
            else
            {
                filesCountTask = Task.Factory.StartNew(() => result.TotalFilesCount = fileNames.Count());
            }

            try
            {
                var patternMatcher = new PatternMatcher
                {
                    Logger   = Logger,
                    Patterns = ConvertPatterns(result),
                    IsIgnoreFilenameWildcards = IsIgnoreFilenameWildcards
                };

                var parallelOptions = PrepareParallelOptions(cancellationToken);
                Parallel.ForEach(
                    fileNames,
                    parallelOptions,
                    fileName =>
                {
                    Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;
                    ProcessFileWithTimeout(fileName, patternMatcher, result, parallelOptions.CancellationToken);
                });
            }
            catch (OperationCanceledException)
            {
                Logger.LogInfo("Scan has been cancelled");
            }

            if (result.TotalProcessedFilesCount > 1)
            {
                AntlrParser.ClearCacheIfRequired();
            }

            DumpJsonOutput(result);
            result.ErrorCount = logger?.ErrorCount ?? 0;
            return(result);
        }
Ejemplo n.º 2
0
        public override WorkflowResult Process(WorkflowResult workflowResult       = null,
                                               CancellationToken cancellationToken = default(CancellationToken))
        {
            var  result = workflowResult ?? new WorkflowResult(Languages, ThreadCount, Stage, IsIncludeIntermediateResult);
            Task convertPatternsTask = GetConvertPatternsTask(result);

            if (Stage == Stage.Patterns)
            {
                if (!convertPatternsTask.IsCompleted)
                {
                    convertPatternsTask.Wait();
                }
            }
            else
            {
                IEnumerable <string> fileNames = SourceCodeRepository.GetFileNames();
                result.TotalFilesCount = fileNames.Count();

                try
                {
                    if (ThreadCount == 1 || result.TotalFilesCount == 1)
                    {
                        Thread.CurrentThread.CurrentCulture   = CultureInfo.InvariantCulture;
                        Thread.CurrentThread.CurrentUICulture = CultureInfo.InvariantCulture;

                        foreach (string fileName in fileNames)
                        {
                            ProcessFile(fileName, convertPatternsTask, result, cancellationToken);
                        }
                    }
                    else
                    {
                        var parallelOptions = new ParallelOptions
                        {
                            MaxDegreeOfParallelism = ThreadCount == 0 ? -1 : ThreadCount,
                            CancellationToken      = cancellationToken
                        };

                        Parallel.ForEach(
                            fileNames,
                            parallelOptions,
                            fileName =>
                        {
                            Thread.CurrentThread.CurrentCulture   = CultureInfo.InvariantCulture;
                            Thread.CurrentThread.CurrentUICulture = CultureInfo.InvariantCulture;
                            ProcessFile(fileName, convertPatternsTask, result, parallelOptions.CancellationToken);
                        });
                    }
                }
                catch (OperationCanceledException)
                {
                    Logger.LogInfo("Scan has been cancelled by user");
                }

                foreach (var pair in ParserConverterSets)
                {
                    pair.Value?.Parser.ClearCache();
                }
            }

            result.ErrorCount = logger?.ErrorCount ?? 0;
            return(result);
        }