/// <inheritdoc /> public override int Run(Args arguments) { if (arguments.Help) { return(0); } // TODO: Don't assume particular hash types (this is particularly seen in WorkspaceNugetModuleResolver.TryGetExpectedContentHash). ContentHashingUtilities.SetDefaultHashType(); using (Logger.SetupEventListener(EventLevel.Informational)) { PathTable pathTable = new PathTable(); var logger = Logger.CreateLogger(); if (!WorkspaceBuilder.TryBuildWorkspaceAndCollectFilesToAnalyze( logger, pathTable, arguments.Analyzers.Max(a => a.RequiredPhases), arguments.Config, arguments.Filter, arguments.OutputDirectory, arguments.ObjectDirectory, out var workspace, out var pipGraph, out var filesToAnalyze, out var context)) { return(1); } foreach (var analyzer in arguments.Analyzers) { if (!analyzer.SetSharedState(arguments, context, logger, workspace, pipGraph)) { return(1); } } if (arguments.Fix && arguments.Analyzers.Last().Kind != AnalyzerKind.PrettyPrint) { logger.FixRequiresPrettyPrint(context.LoggingContext); } int errorCount = 0; // TODO: Make this multi-threaded. For now since we are developing keeping simple loop to maintain easy debugging. foreach (var kv in filesToAnalyze) { foreach (var analyzer in arguments.Analyzers) { if (!analyzer.AnalyzeSourceFile(workspace, kv.Key, kv.Value)) { Interlocked.Increment(ref errorCount); } } } foreach (var analyzer in arguments.Analyzers) { analyzer.FinalizeAnalysis(); } if (errorCount > 0) { logger.AnalysisErrorSummary(context.LoggingContext, errorCount, arguments.Analyzers.Count); return(1); } return(0); } }
/// <inheritdoc /> private int RunInner(Args arguments) { if (arguments.Help) { return(0); } // TODO: Don't assume particular hash types (this is particularly seen in WorkspaceNugetModuleResolver.TryGetExpectedContentHash). ContentHashingUtilities.SetDefaultHashType(); using (Logger.SetupEventListener(EventLevel.Informational)) { var logger = Logger.CreateLogger(); arguments.CommandLineConfig.Engine.Phase = arguments.Analyzers.Max(a => a.RequiredPhases); // This needs to be passed in as a path through environment variable because it changes every if (!WorkspaceBuilder.TryBuildWorkspaceAndCollectFilesToAnalyze( logger, m_pathTable, arguments.CommandLineConfig, arguments.Analyzers.Any(a => a.SerializeUsingTopSort), out var workspace, out var pipGraph, out var filesToAnalyze, out var context)) { return(1); } foreach (var analyzer in arguments.Analyzers) { if (!analyzer.SetSharedState(arguments, context, logger, workspace, pipGraph)) { return(1); } } if (arguments.Fix && arguments.Analyzers.Last().Kind != AnalyzerKind.PrettyPrint) { logger.FixRequiresPrettyPrint(context.LoggingContext); } int errorCount = 0; // TODO: Make this multi-threaded. For now since we are developing keeping simple loop to maintain easy debugging. foreach (var kv in filesToAnalyze) { foreach (var analyzer in arguments.Analyzers) { if (!analyzer.AnalyzeSourceFile(workspace, kv.Key, kv.Value)) { Interlocked.Increment(ref errorCount); } } } foreach (var analyzer in arguments.Analyzers) { analyzer.FinalizeAnalysis(); } if (errorCount > 0) { logger.AnalysisErrorSummary(context.LoggingContext, errorCount, arguments.Analyzers.Count); return(1); } return(0); } }