private void CountLines(Solution solution, CodeMetricsOptions options, CancellationToken cancellationToken) { WriteLine($"Count logical lines for solution '{solution.FilePath}'", ConsoleColor.Cyan, Verbosity.Minimal); IEnumerable <Project> projects = FilterProjects(solution, Options); Stopwatch stopwatch = Stopwatch.StartNew(); ImmutableDictionary <ProjectId, CodeMetricsInfo> codeMetrics = WorkspaceCodeMetrics.CountLinesInParallel(projects, CodeMetricsCounterFactory.GetLogicalLinesCounter, options, cancellationToken); stopwatch.Stop(); if (codeMetrics.Count > 0) { WriteLine(Verbosity.Normal); WriteLine("Logical lines of code by project:", Verbosity.Normal); WriteLinesOfCode(solution, codeMetrics); } WriteLine(Verbosity.Minimal); WriteMetrics( codeMetrics.Sum(f => f.Value.CodeLineCount), codeMetrics.Sum(f => f.Value.WhitespaceLineCount), codeMetrics.Sum(f => f.Value.CommentLineCount), codeMetrics.Sum(f => f.Value.PreprocessorDirectiveLineCount), codeMetrics.Sum(f => f.Value.TotalLineCount)); WriteLine(Verbosity.Minimal); WriteLine($"Done counting logical lines for solution '{solution.FilePath}' in {stopwatch.Elapsed:mm\\:ss\\.ff}", Verbosity.Normal); }
public override async Task <CommandResult> ExecuteAsync(ProjectOrSolution projectOrSolution, CancellationToken cancellationToken = default) { var codeMetricsOptions = new CodeMetricsOptions(includeGenerated: Options.IncludeGeneratedCode); if (projectOrSolution.IsProject) { Project project = projectOrSolution.AsProject(); CodeMetricsCounter counter = CodeMetricsCounterFactory.GetLogicalLinesCounter(project.Language); if (counter != null) { await CountLinesAsync(project, counter, codeMetricsOptions, cancellationToken); } else { WriteLine($"Cannot count logical lines for language '{project.Language}'", ConsoleColor.Yellow, Verbosity.Minimal); } } else { CountLines(projectOrSolution.AsSolution(), codeMetricsOptions, cancellationToken); } return(CommandResult.Success); }
protected CSharpLinesWalker(TextLineCollection lines, CodeMetricsOptions options, CancellationToken cancellationToken) : base(SyntaxWalkerDepth.Trivia) { Lines = lines; Options = options; CancellationToken = cancellationToken; }
public override async Task<CommandResult> ExecuteAsync(ProjectOrSolution projectOrSolution, CancellationToken cancellationToken = default) { var codeMetricsOptions = new CodeMetricsOptions( includeGenerated: Options.IncludeGeneratedCode, includeWhitespace: Options.IncludeWhitespace, includeComments: Options.IncludeComments, includePreprocessorDirectives: Options.IncludePreprocessorDirectives, ignoreBlockBoundary: Options.IgnoreBlockBoundary); if (projectOrSolution.IsProject) { Project project = projectOrSolution.AsProject(); ICodeMetricsService service = MefWorkspaceServices.Default.GetService<ICodeMetricsService>(project.Language); if (service != null) { await CountLinesAsync(project, service, codeMetricsOptions, cancellationToken); } else { WriteLine($"Cannot count lines for '{project.FilePath}', language '{project.Language}' is not supported", ConsoleColor.Yellow, Verbosity.Minimal); } } else { CountLines(projectOrSolution.AsSolution(), codeMetricsOptions, cancellationToken); } return CommandResult.Success; }
public static ImmutableDictionary <ProjectId, CodeMetricsInfo> CountLinesInParallel( IEnumerable <Project> projects, LinesOfCodeKind kind, CodeMetricsOptions options = null, CancellationToken cancellationToken = default) { var codeMetrics = new ConcurrentBag <(ProjectId projectId, CodeMetricsInfo codeMetrics)>(); Parallel.ForEach(projects, project => { ICodeMetricsService service = MefWorkspaceServices.Default.GetService <ICodeMetricsService>(project.Language); CodeMetricsInfo projectMetrics = (service != null) ? service.CountLinesAsync(project, kind, options, cancellationToken).Result : CodeMetricsInfo.NotAvailable; codeMetrics.Add((project.Id, codeMetrics: projectMetrics)); });
private static async Task CountLinesAsync(Project project, CodeMetricsCounter counter, CodeMetricsOptions options, CancellationToken cancellationToken) { WriteLine($"Count logical lines for '{project.Name}'", ConsoleColor.Cyan, Verbosity.Minimal); Stopwatch stopwatch = Stopwatch.StartNew(); CodeMetricsInfo codeMetrics = await WorkspaceCodeMetrics.CountLinesAsync(project, counter, options, cancellationToken); stopwatch.Stop(); WriteLine(Verbosity.Minimal); WriteMetrics( codeMetrics.CodeLineCount, codeMetrics.WhitespaceLineCount, codeMetrics.CommentLineCount, codeMetrics.PreprocessorDirectiveLineCount, codeMetrics.TotalLineCount); WriteLine(Verbosity.Minimal); WriteLine($"Done counting logical lines for '{project.FilePath}' in {stopwatch.Elapsed:mm\\:ss\\.ff}", Verbosity.Normal); }
public VisualBasicPhysicalLinesWalker(TextLineCollection lines, CodeMetricsOptions options, CancellationToken cancellationToken) : base(lines, options, cancellationToken) { }
public CSharpLogicalLinesWalker(TextLineCollection lines, CodeMetricsOptions options, CancellationToken cancellationToken) : base(lines, options, cancellationToken) { }
public override CodeMetricsInfo CountLogicalLines(SyntaxNode node, SourceText sourceText, CodeMetricsOptions options, CancellationToken cancellationToken) { TextLineCollection lines = sourceText.Lines; var walker = new CSharpLogicalLinesWalker(lines, options, cancellationToken); walker.Visit(node); int whitespaceLineCount = (options.IncludeWhitespace) ? 0 : CountWhitespaceLines(node, sourceText); return(new CodeMetricsInfo( totalLineCount: lines.Count, codeLineCount: walker.LogicalLineCount, whitespaceLineCount: whitespaceLineCount, commentLineCount: walker.CommentLineCount, preprocessorDirectiveLineCount: walker.PreprocessorDirectiveLineCount, blockBoundaryLineCount: 0)); }
private async Task CountLinesAsync(Project project, ICodeMetricsService service, CodeMetricsOptions options, CancellationToken cancellationToken) { WriteLine($"Count lines for '{project.Name}'", ConsoleColor.Cyan, Verbosity.Minimal); Stopwatch stopwatch = Stopwatch.StartNew(); CodeMetricsInfo codeMetrics = await service.CountLinesAsync(project, LinesOfCodeKind.Physical, options, cancellationToken); stopwatch.Stop(); WriteLine(Verbosity.Minimal); WriteMetrics( codeMetrics.CodeLineCount, codeMetrics.BlockBoundaryLineCount, codeMetrics.WhitespaceLineCount, codeMetrics.CommentLineCount, codeMetrics.PreprocessorDirectiveLineCount, codeMetrics.TotalLineCount); WriteLine(Verbosity.Minimal); WriteLine($"Done counting lines for '{project.FilePath}' in {stopwatch.Elapsed:mm\\:ss\\.ff}", Verbosity.Normal); }