コード例 #1
0
ファイル: Extensions.cs プロジェクト: belav/roslyn
 internal static void Add(
     this AnalyzerTelemetryInfo analyzerTelemetryInfo,
     AnalyzerTelemetryInfo addendum
     )
 {
     analyzerTelemetryInfo.CodeBlockActionsCount        += addendum.CodeBlockActionsCount;
     analyzerTelemetryInfo.CodeBlockEndActionsCount     += addendum.CodeBlockEndActionsCount;
     analyzerTelemetryInfo.CodeBlockStartActionsCount   += addendum.CodeBlockStartActionsCount;
     analyzerTelemetryInfo.CompilationActionsCount      += addendum.CompilationActionsCount;
     analyzerTelemetryInfo.CompilationEndActionsCount   += addendum.CompilationEndActionsCount;
     analyzerTelemetryInfo.CompilationStartActionsCount +=
         addendum.CompilationStartActionsCount;
     analyzerTelemetryInfo.ExecutionTime                 += addendum.ExecutionTime;
     analyzerTelemetryInfo.OperationActionsCount         += addendum.OperationActionsCount;
     analyzerTelemetryInfo.OperationBlockActionsCount    += addendum.OperationBlockActionsCount;
     analyzerTelemetryInfo.OperationBlockEndActionsCount +=
         addendum.OperationBlockEndActionsCount;
     analyzerTelemetryInfo.OperationBlockStartActionsCount +=
         addendum.OperationBlockStartActionsCount;
     analyzerTelemetryInfo.SemanticModelActionsCount  += addendum.SemanticModelActionsCount;
     analyzerTelemetryInfo.SymbolActionsCount         += addendum.SymbolActionsCount;
     analyzerTelemetryInfo.SymbolStartActionsCount    += addendum.SymbolStartActionsCount;
     analyzerTelemetryInfo.SymbolEndActionsCount      += addendum.SymbolEndActionsCount;
     analyzerTelemetryInfo.SyntaxNodeActionsCount     += addendum.SyntaxNodeActionsCount;
     analyzerTelemetryInfo.SyntaxTreeActionsCount     += addendum.SyntaxTreeActionsCount;
     analyzerTelemetryInfo.AdditionalFileActionsCount += addendum.AdditionalFileActionsCount;
     analyzerTelemetryInfo.SuppressionActionsCount    += addendum.SuppressionActionsCount;
 }
コード例 #2
0
        private static void WriteTelemetry(ObjectWriter writer, AnalyzerTelemetryInfo telemetryInfo, CancellationToken cancellationToken)
        {
            cancellationToken.ThrowIfCancellationRequested();

            writer.WriteInt32(telemetryInfo.CompilationStartActionsCount);
            writer.WriteInt32(telemetryInfo.CompilationEndActionsCount);
            writer.WriteInt32(telemetryInfo.CompilationActionsCount);
            writer.WriteInt32(telemetryInfo.SyntaxTreeActionsCount);
            writer.WriteInt32(telemetryInfo.AdditionalFileActionsCount);
            writer.WriteInt32(telemetryInfo.SemanticModelActionsCount);
            writer.WriteInt32(telemetryInfo.SymbolActionsCount);
            writer.WriteInt32(telemetryInfo.SymbolStartActionsCount);
            writer.WriteInt32(telemetryInfo.SymbolEndActionsCount);
            writer.WriteInt32(telemetryInfo.SyntaxNodeActionsCount);
            writer.WriteInt32(telemetryInfo.CodeBlockStartActionsCount);
            writer.WriteInt32(telemetryInfo.CodeBlockEndActionsCount);
            writer.WriteInt32(telemetryInfo.CodeBlockActionsCount);
            writer.WriteInt32(telemetryInfo.OperationActionsCount);
            writer.WriteInt32(telemetryInfo.OperationBlockActionsCount);
            writer.WriteInt32(telemetryInfo.OperationBlockStartActionsCount);
            writer.WriteInt32(telemetryInfo.OperationBlockEndActionsCount);
            writer.WriteInt32(telemetryInfo.SuppressionActionsCount);
            writer.WriteInt64(telemetryInfo.ExecutionTime.Ticks);
            writer.WriteBoolean(telemetryInfo.Concurrent);
        }
コード例 #3
0
            public Data(
                AnalyzerTelemetryInfo analyzerTelemetryInfo,
                bool isTelemetryCollectionAllowed
                )
            {
                CodeBlockActionsCount           = analyzerTelemetryInfo.CodeBlockActionsCount;
                CodeBlockEndActionsCount        = analyzerTelemetryInfo.CodeBlockEndActionsCount;
                CodeBlockStartActionsCount      = analyzerTelemetryInfo.CodeBlockStartActionsCount;
                CompilationActionsCount         = analyzerTelemetryInfo.CompilationActionsCount;
                CompilationEndActionsCount      = analyzerTelemetryInfo.CompilationEndActionsCount;
                CompilationStartActionsCount    = analyzerTelemetryInfo.CompilationStartActionsCount;
                SemanticModelActionsCount       = analyzerTelemetryInfo.SemanticModelActionsCount;
                SymbolActionsCount              = analyzerTelemetryInfo.SymbolActionsCount;
                SyntaxNodeActionsCount          = analyzerTelemetryInfo.SyntaxNodeActionsCount;
                SyntaxTreeActionsCount          = analyzerTelemetryInfo.SyntaxTreeActionsCount;
                AdditionalFileActionsCount      = analyzerTelemetryInfo.AdditionalFileActionsCount;
                OperationActionsCount           = analyzerTelemetryInfo.OperationActionsCount;
                OperationBlockActionsCount      = analyzerTelemetryInfo.OperationBlockActionsCount;
                OperationBlockEndActionsCount   = analyzerTelemetryInfo.OperationBlockEndActionsCount;
                OperationBlockStartActionsCount =
                    analyzerTelemetryInfo.OperationBlockStartActionsCount;
                SymbolStartActionsCount = analyzerTelemetryInfo.SymbolStartActionsCount;
                SymbolEndActionsCount   = analyzerTelemetryInfo.SymbolEndActionsCount;
                SuppressionActionsCount = analyzerTelemetryInfo.SuppressionActionsCount;

                IsTelemetryCollectionAllowed = isTelemetryCollectionAllowed;
            }
コード例 #4
0
 public void UpdateAnalyzerActionsTelemetry(DiagnosticAnalyzer analyzer, AnalyzerTelemetryInfo analyzerTelemetryInfo, bool isTelemetryCollectionAllowed)
 {
     lock (_guard)
     {
         _analyzerInfoMap = _analyzerInfoMap.SetItem(analyzer.GetType(), new Data(analyzerTelemetryInfo, isTelemetryCollectionAllowed));
     }
 }
コード例 #5
0
        private static void WriteTelemetry(string analyzerName, AnalyzerTelemetryInfo telemetry)
        {
            WriteLine($"Statistics for {analyzerName}:", ConsoleColor.DarkCyan);
            WriteLine($"Concurrent:                     {telemetry.Concurrent}", telemetry.Concurrent ? ConsoleColor.White : ConsoleColor.DarkRed);
            WriteLine($"Execution time (ms):            {telemetry.ExecutionTime.TotalMilliseconds}", ConsoleColor.White);

            WriteLine($"Code Block Actions:             {telemetry.CodeBlockActionsCount}", ConsoleColor.White);
            WriteLine($"Code Block Start Actions:       {telemetry.CodeBlockStartActionsCount}", ConsoleColor.White);
            WriteLine($"Code Block End Actions:         {telemetry.CodeBlockEndActionsCount}", ConsoleColor.White);

            WriteLine($"Compilation Actions:            {telemetry.CompilationActionsCount}", ConsoleColor.White);
            WriteLine($"Compilation Start Actions:      {telemetry.CompilationStartActionsCount}", ConsoleColor.White);
            WriteLine($"Compilation End Actions:        {telemetry.CompilationEndActionsCount}", ConsoleColor.White);

            WriteLine($"Operation Actions:              {telemetry.OperationActionsCount}", ConsoleColor.White);
            WriteLine($"Operation Block Actions:        {telemetry.OperationBlockActionsCount}", ConsoleColor.White);
            WriteLine($"Operation Block Start Actions:  {telemetry.OperationBlockStartActionsCount}", ConsoleColor.White);
            WriteLine($"Operation Block End Actions:    {telemetry.OperationBlockEndActionsCount}", ConsoleColor.White);

            WriteLine($"Semantic Model Actions:         {telemetry.SemanticModelActionsCount}", ConsoleColor.White);
            WriteLine($"Symbol Actions:                 {telemetry.SymbolActionsCount}", ConsoleColor.White);
            WriteLine($"Symbol Start Actions:           {telemetry.SymbolStartActionsCount}", ConsoleColor.White);
            WriteLine($"Symbol End Actions:             {telemetry.SymbolEndActionsCount}", ConsoleColor.White);
            WriteLine($"Syntax Node Actions:            {telemetry.SyntaxNodeActionsCount}", ConsoleColor.White);
            WriteLine($"Syntax Tree Actions:            {telemetry.SyntaxTreeActionsCount}", ConsoleColor.White);

            WriteLine($"Suppression Actions:            {telemetry.SuppressionActionsCount}", ConsoleColor.White);
        }
コード例 #6
0
        public static void UpdateAnalyzerTypeCount(DiagnosticAnalyzer analyzer, AnalyzerTelemetryInfo analyzerTelemetryInfo, Project projectOpt, DiagnosticLogAggregator logAggregator)
        {
            if (analyzerTelemetryInfo == null || analyzer == null || logAggregator == null)
            {
                return;
            }

            logAggregator.UpdateAnalyzerTypeCount(analyzer, analyzerTelemetryInfo, projectOpt);
        }
コード例 #7
0
 public void SetAnalyzerTypeCount(AnalyzerTelemetryInfo analyzerTelemetryInfo)
 {
     Counts[0] = analyzerTelemetryInfo.CodeBlockActionsCount;
     Counts[1] = analyzerTelemetryInfo.CodeBlockEndActionsCount;
     Counts[2] = analyzerTelemetryInfo.CodeBlockStartActionsCount;
     Counts[3] = analyzerTelemetryInfo.CompilationActionsCount;
     Counts[4] = analyzerTelemetryInfo.CompilationEndActionsCount;
     Counts[5] = analyzerTelemetryInfo.CompilationStartActionsCount;
     Counts[6] = analyzerTelemetryInfo.SemanticModelActionsCount;
     Counts[7] = analyzerTelemetryInfo.SymbolActionsCount;
     Counts[8] = analyzerTelemetryInfo.SyntaxNodeActionsCount;
     Counts[9] = analyzerTelemetryInfo.SyntaxTreeActionsCount;
 }
コード例 #8
0
        private static void WriteExecutionTimes(
            string analyzerName,
            int longestAnalyzerName,
            AnalyzerTelemetryInfo telemetry
            )
        {
            var padding = new string(' ', longestAnalyzerName - analyzerName.Length);

            WriteLine(
                $"{analyzerName}:{padding} {telemetry.ExecutionTime.TotalMilliseconds, 7:0}",
                ConsoleColor.White
                );
        }
コード例 #9
0
        public void UpdateAnalyzerTypeCount(DiagnosticAnalyzer analyzer, AnalyzerTelemetryInfo analyzerTelemetryInfo)
        {
            var isTelemetryAllowed = DiagnosticAnalyzerLogger.AllowsTelemetry(analyzer, _analyzerService);

            ImmutableInterlocked.AddOrUpdate(
                ref _analyzerInfoMap,
                analyzer.GetType(),
                addValue: new AnalyzerInfo(analyzer, analyzerTelemetryInfo, isTelemetryAllowed),
                updateValueFactory: (k, ai) =>
            {
                ai.SetAnalyzerTypeCount(analyzerTelemetryInfo);
                return(ai);
            });
        }
コード例 #10
0
        public void UpdateAnalyzerTypeCount(DiagnosticAnalyzer analyzer, AnalyzerTelemetryInfo analyzerTelemetryInfo, Project projectOpt)
        {
            var telemetry = DiagnosticAnalyzerLogger.AllowsTelemetry(_owner, analyzer, projectOpt?.Id);

            ImmutableInterlocked.AddOrUpdate(
                ref _analyzerInfoMap,
                analyzer.GetType(),
                addValue: new AnalyzerInfo(analyzer, analyzerTelemetryInfo, telemetry),
                updateValueFactory: (k, ai) =>
            {
                ai.SetAnalyzerTypeCount(analyzerTelemetryInfo);
                return(ai);
            });
        }
コード例 #11
0
            public AnalyzerInfo(DiagnosticAnalyzer analyzer, AnalyzerTelemetryInfo analyzerTelemetryInfo, bool telemetry)
            {
                CLRType   = analyzer.GetType();
                Telemetry = telemetry;

                Counts[0] = analyzerTelemetryInfo.CodeBlockActionsCount;
                Counts[1] = analyzerTelemetryInfo.CodeBlockEndActionsCount;
                Counts[2] = analyzerTelemetryInfo.CodeBlockStartActionsCount;
                Counts[3] = analyzerTelemetryInfo.CompilationActionsCount;
                Counts[4] = analyzerTelemetryInfo.CompilationEndActionsCount;
                Counts[5] = analyzerTelemetryInfo.CompilationStartActionsCount;
                Counts[6] = analyzerTelemetryInfo.SemanticModelActionsCount;
                Counts[7] = analyzerTelemetryInfo.SymbolActionsCount;
                Counts[8] = analyzerTelemetryInfo.SyntaxNodeActionsCount;
                Counts[9] = analyzerTelemetryInfo.SyntaxTreeActionsCount;
            }
コード例 #12
0
 public static void Add(this AnalyzerTelemetryInfo telemetryInfo, AnalyzerTelemetryInfo telemetryInfoToAdd)
 {
     telemetryInfo.CodeBlockActionsCount        += telemetryInfoToAdd.CodeBlockActionsCount;
     telemetryInfo.CodeBlockEndActionsCount     += telemetryInfoToAdd.CodeBlockEndActionsCount;
     telemetryInfo.CodeBlockStartActionsCount   += telemetryInfoToAdd.CodeBlockStartActionsCount;
     telemetryInfo.CompilationActionsCount      += telemetryInfoToAdd.CompilationActionsCount;
     telemetryInfo.CompilationEndActionsCount   += telemetryInfoToAdd.CompilationEndActionsCount;
     telemetryInfo.CompilationStartActionsCount += telemetryInfoToAdd.CompilationStartActionsCount;
     telemetryInfo.ExecutionTime                   += telemetryInfoToAdd.ExecutionTime;
     telemetryInfo.OperationActionsCount           += telemetryInfoToAdd.OperationActionsCount;
     telemetryInfo.OperationBlockActionsCount      += telemetryInfoToAdd.OperationBlockActionsCount;
     telemetryInfo.OperationBlockEndActionsCount   += telemetryInfoToAdd.OperationBlockEndActionsCount;
     telemetryInfo.OperationBlockStartActionsCount += telemetryInfoToAdd.OperationBlockStartActionsCount;
     telemetryInfo.SemanticModelActionsCount       += telemetryInfoToAdd.SemanticModelActionsCount;
     telemetryInfo.SymbolActionsCount              += telemetryInfoToAdd.SymbolActionsCount;
     telemetryInfo.SyntaxNodeActionsCount          += telemetryInfoToAdd.SyntaxNodeActionsCount;
     telemetryInfo.SyntaxTreeActionsCount          += telemetryInfoToAdd.SyntaxTreeActionsCount;
 }
コード例 #13
0
        private ImmutableDictionary <DiagnosticAnalyzer, AnalyzerTelemetryInfo> GetTelemetryInfo(
            ImmutableArray <DiagnosticAnalyzer> analyzers,
            CancellationToken cancellationToken)
        {
            var builder = ImmutableDictionary.CreateBuilder <DiagnosticAnalyzer, AnalyzerTelemetryInfo>();

            lock (_gate)
            {
                foreach (var analyzer in analyzers)
                {
                    var actionCounts  = _analyzerActionCounts[analyzer];
                    var executionTime = _analyzerExecutionTimeOpt != null ? _analyzerExecutionTimeOpt[analyzer] : default(TimeSpan);
                    var telemetryInfo = new AnalyzerTelemetryInfo(actionCounts, executionTime);
                    builder.Add(analyzer, telemetryInfo);
                }
            }

            return(builder.ToImmutable());
        }
コード例 #14
0
        private ImmutableDictionary <DiagnosticAnalyzer, AnalyzerTelemetryInfo> GetTelemetryInfo(
            ImmutableArray <DiagnosticAnalyzer> analyzers)
        {
            var builder = ImmutableDictionary.CreateBuilder <DiagnosticAnalyzer, AnalyzerTelemetryInfo>();

            lock (_gate)
            {
                foreach (var analyzer in analyzers)
                {
                    var actionCounts            = _analyzerActionCounts[analyzer];
                    var suppressionActionCounts = analyzer is DiagnosticSuppressor ? 1 : 0;
                    var executionTime           = _analyzerExecutionTimeOpt != null ? _analyzerExecutionTimeOpt[analyzer] : default;
                    var telemetryInfo           = new AnalyzerTelemetryInfo(actionCounts, suppressionActionCounts, executionTime);
                    builder.Add(analyzer, telemetryInfo);
                }
            }

            return(builder.ToImmutable());
        }
コード例 #15
0
        private static void Serialize(ObjectWriter writer, AnalyzerTelemetryInfo telemetryInfo, CancellationToken cancellationToken)
        {
            cancellationToken.ThrowIfCancellationRequested();

            writer.WriteInt32(telemetryInfo.CompilationStartActionsCount);
            writer.WriteInt32(telemetryInfo.CompilationEndActionsCount);
            writer.WriteInt32(telemetryInfo.CompilationActionsCount);
            writer.WriteInt32(telemetryInfo.SyntaxTreeActionsCount);
            writer.WriteInt32(telemetryInfo.SemanticModelActionsCount);
            writer.WriteInt32(telemetryInfo.SymbolActionsCount);
            writer.WriteInt32(telemetryInfo.SyntaxNodeActionsCount);
            writer.WriteInt32(telemetryInfo.CodeBlockStartActionsCount);
            writer.WriteInt32(telemetryInfo.CodeBlockEndActionsCount);
            writer.WriteInt32(telemetryInfo.CodeBlockActionsCount);
            writer.WriteInt32(telemetryInfo.OperationActionsCount);
            writer.WriteInt32(telemetryInfo.OperationBlockActionsCount);
            writer.WriteInt32(telemetryInfo.OperationBlockStartActionsCount);
            writer.WriteInt32(telemetryInfo.OperationBlockEndActionsCount);
            writer.WriteInt64(telemetryInfo.ExecutionTime.Ticks);
        }
コード例 #16
0
ファイル: CodeAnalyzer.cs プロジェクト: skyhoshi/Roslynator
        private void WriteProjectAnalysisResults(IList <ProjectAnalysisResult> results)
        {
            if (Options.LogAnalyzerExecutionTime)
            {
                WriteExecutionTime();
            }

            int totalCount = results.Sum(f => f.Diagnostics.Length + f.CompilerDiagnostics.Length);

            if (totalCount > 0)
            {
                WriteLine(Verbosity.Normal);

                Dictionary <DiagnosticDescriptor, int> diagnosticsByDescriptor = results
                                                                                 .SelectMany(f => f.Diagnostics.Concat(f.CompilerDiagnostics))
                                                                                 .GroupBy(f => f.Descriptor, DiagnosticDescriptorComparer.Id)
                                                                                 .ToDictionary(f => f.Key, f => f.Count());

                int maxCountLength = Math.Max(totalCount.ToString().Length, diagnosticsByDescriptor.Max(f => f.Value.ToString().Length));
                int maxIdLength    = diagnosticsByDescriptor.Max(f => f.Key.Id.Length);

                foreach (KeyValuePair <DiagnosticDescriptor, int> kvp in diagnosticsByDescriptor.OrderBy(f => f.Key.Id))
                {
                    WriteLine($"{kvp.Value.ToString().PadLeft(maxCountLength)} {kvp.Key.Id.PadRight(maxIdLength)} {kvp.Key.Title}", Verbosity.Normal);
                }
            }

            WriteLine(Verbosity.Minimal);
            WriteLine($"{totalCount} {((totalCount == 1) ? "diagnostic" : "diagnostics")} found", ConsoleColors.Green, Verbosity.Minimal);

            void WriteExecutionTime()
            {
                var telemetryInfos = new Dictionary <DiagnosticAnalyzer, AnalyzerTelemetryInfo>();

                foreach (ProjectAnalysisResult result in results)
                {
                    foreach (KeyValuePair <DiagnosticAnalyzer, AnalyzerTelemetryInfo> kvp in result.Telemetry)
                    {
                        DiagnosticAnalyzer analyzer = kvp.Key;

                        if (!telemetryInfos.TryGetValue(analyzer, out AnalyzerTelemetryInfo telemetryInfo))
                        {
                            telemetryInfo = new AnalyzerTelemetryInfo();
                        }

                        telemetryInfo.Add(kvp.Value);

                        telemetryInfos[analyzer] = telemetryInfo;
                    }
                }

                using (IEnumerator <KeyValuePair <DiagnosticAnalyzer, AnalyzerTelemetryInfo> > en = telemetryInfos
                                                                                                    .Where(f => f.Value.ExecutionTime >= MinimalExecutionTime)
                                                                                                    .OrderByDescending(f => f.Value.ExecutionTime)
                                                                                                    .GetEnumerator())
                {
                    if (en.MoveNext())
                    {
                        WriteLine(Verbosity.Minimal);

                        do
                        {
                            WriteLine($"{en.Current.Value.ExecutionTime:mm\\:ss\\.fff} '{en.Current.Key.GetType().FullName}'", Verbosity.Minimal);
                        }while (en.MoveNext());
                    }
                }
            }
        }
コード例 #17
0
 public AnalyzerInfo(DiagnosticAnalyzer analyzer, AnalyzerTelemetryInfo analyzerTelemetryInfo, bool telemetry)
 {
     CLRType   = analyzer.GetType();
     Telemetry = telemetry;
     SetAnalyzerTypeCount(analyzerTelemetryInfo);
 }