Skip to content

Commit 8c7c516

Browse files
Merge a738da8 into 5d98796
2 parents 5d98796 + a738da8 commit 8c7c516

File tree

40 files changed

+330
-100
lines changed

40 files changed

+330
-100
lines changed

StyleCop.Analyzers/StyleCop.Analyzers.Test/AnalyzerExtensionsTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ public override void Initialize(AnalysisContext context)
7474
context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.None);
7575
context.EnableConcurrentExecution();
7676

77-
context.RegisterCompilationStartAction(
77+
context.RegisterCompilationStartActionWithSettings(
7878
compilationStartContext =>
7979
{
8080
compilationStartContext.RegisterSyntaxNodeAction(

StyleCop.Analyzers/StyleCop.Analyzers/AnalyzerExtensions.cs

Lines changed: 57 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -8,31 +8,42 @@ namespace StyleCop.Analyzers
88
using System;
99
using System.Collections.Concurrent;
1010
using System.Collections.Immutable;
11-
using System.Diagnostics.CodeAnalysis;
1211
using Microsoft.CodeAnalysis;
1312
using Microsoft.CodeAnalysis.Diagnostics;
13+
using StyleCop.Analyzers.Helpers;
1414
using StyleCop.Analyzers.Settings.ObjectModel;
1515

1616
/// <summary>
1717
/// Provides extension methods to deal for analyzers.
1818
/// </summary>
1919
internal static class AnalyzerExtensions
2020
{
21+
public static void RegisterCompilationStartActionWithSettings(this AnalysisContext context, Action<CompilationStartAnalysisContextWithSettings> action)
22+
{
23+
context.RegisterCompilationStartAction(context =>
24+
{
25+
var settingsFile = context.GetStyleCopSettingsFile(context.CancellationToken);
26+
var settingsObjectCache = context.Compilation.GetOrCreateStyleCopSettingsCache();
27+
var contextWithSettings = new CompilationStartAnalysisContextWithSettings(context, settingsFile, settingsObjectCache);
28+
action(contextWithSettings);
29+
});
30+
}
31+
2132
/// <summary>
2233
/// Register an action to be executed at completion of parsing of a code document. A syntax tree action reports
2334
/// diagnostics about the <see cref="SyntaxTree"/> of a document.
2435
/// </summary>
2536
/// <param name="context">The analysis context.</param>
2637
/// <param name="action">Action to be executed at completion of parsing of a document.</param>
27-
[SuppressMessage("MicrosoftCodeAnalysisPerformance", "RS1012:Start action has no registered actions", Justification = "This is not a start action")]
28-
public static void RegisterSyntaxTreeAction(this CompilationStartAnalysisContext context, Action<SyntaxTreeAnalysisContext, StyleCopSettings> action)
38+
public static void RegisterSyntaxTreeAction(this CompilationStartAnalysisContextWithSettings context, Action<SyntaxTreeAnalysisContext, StyleCopSettings> action)
2939
{
30-
var settingsFile = context.GetStyleCopSettingsFile(context.CancellationToken);
40+
var settingsFile = context.SettingsFile;
41+
var settingsObjectCache = context.SettingsObjectCache;
3142

32-
context.RegisterSyntaxTreeAction(
43+
context.InnerContext.RegisterSyntaxTreeAction(
3344
context =>
3445
{
35-
StyleCopSettings settings = context.GetStyleCopSettings(settingsFile);
46+
StyleCopSettings settings = context.GetStyleCopSettings(settingsFile, settingsObjectCache);
3647
action(context, settings);
3748
});
3849
}
@@ -48,7 +59,7 @@ public static void RegisterSyntaxTreeAction(this CompilationStartAnalysisContext
4859
/// <param name="syntaxKind">The kind of syntax that should be analyzed.</param>
4960
/// <typeparam name="TLanguageKindEnum">Enum type giving the syntax node kinds of the source language for which
5061
/// the action applies.</typeparam>
51-
public static void RegisterSyntaxNodeAction<TLanguageKindEnum>(this CompilationStartAnalysisContext context, Action<SyntaxNodeAnalysisContext, StyleCopSettings> action, TLanguageKindEnum syntaxKind)
62+
public static void RegisterSyntaxNodeAction<TLanguageKindEnum>(this CompilationStartAnalysisContextWithSettings context, Action<SyntaxNodeAnalysisContext, StyleCopSettings> action, TLanguageKindEnum syntaxKind)
5263
where TLanguageKindEnum : struct
5364
{
5465
context.RegisterSyntaxNodeAction(action, LanguageKindArrays<TLanguageKindEnum>.GetOrCreateArray(syntaxKind));
@@ -65,21 +76,55 @@ public static void RegisterSyntaxNodeAction<TLanguageKindEnum>(this CompilationS
6576
/// <param name="syntaxKinds">The kinds of syntax that should be analyzed.</param>
6677
/// <typeparam name="TLanguageKindEnum">Enum type giving the syntax node kinds of the source language for which
6778
/// the action applies.</typeparam>
68-
[SuppressMessage("MicrosoftCodeAnalysisPerformance", "RS1012:Start action has no registered actions", Justification = "This is not a start action")]
69-
public static void RegisterSyntaxNodeAction<TLanguageKindEnum>(this CompilationStartAnalysisContext context, Action<SyntaxNodeAnalysisContext, StyleCopSettings> action, ImmutableArray<TLanguageKindEnum> syntaxKinds)
79+
public static void RegisterSyntaxNodeAction<TLanguageKindEnum>(this CompilationStartAnalysisContextWithSettings context, Action<SyntaxNodeAnalysisContext, StyleCopSettings> action, ImmutableArray<TLanguageKindEnum> syntaxKinds)
7080
where TLanguageKindEnum : struct
7181
{
72-
var settingsFile = context.GetStyleCopSettingsFile(context.CancellationToken);
82+
var settingsFile = context.SettingsFile;
83+
var settingsObjectCache = context.SettingsObjectCache;
7384

74-
context.RegisterSyntaxNodeAction(
85+
context.InnerContext.RegisterSyntaxNodeAction(
7586
context =>
7687
{
77-
StyleCopSettings settings = context.GetStyleCopSettings(settingsFile);
88+
StyleCopSettings settings = context.GetStyleCopSettings(settingsFile, settingsObjectCache);
7889
action(context, settings);
7990
},
8091
syntaxKinds);
8192
}
8293

94+
/// <summary>
95+
/// Register an action to be executed at completion of semantic analysis of a <see cref="SyntaxNode"/> with an
96+
/// appropriate kind. A syntax node action can report diagnostics about a <see cref="SyntaxNode"/>, and can also
97+
/// collect state information to be used by other syntax node actions or code block end actions.
98+
/// </summary>
99+
/// <param name="context">The analysis context.</param>
100+
/// <param name="action">Action to be executed at completion of semantic analysis of a
101+
/// <see cref="SyntaxNode"/>.</param>
102+
/// <param name="syntaxKind">The kind of syntax that should be analyzed.</param>
103+
/// <typeparam name="TLanguageKindEnum">Enum type giving the syntax node kinds of the source language for which
104+
/// the action applies.</typeparam>
105+
public static void RegisterSyntaxNodeAction<TLanguageKindEnum>(this CompilationStartAnalysisContextWithSettings context, Action<SyntaxNodeAnalysisContext> action, TLanguageKindEnum syntaxKind)
106+
where TLanguageKindEnum : struct
107+
{
108+
context.RegisterSyntaxNodeAction(action, LanguageKindArrays<TLanguageKindEnum>.GetOrCreateArray(syntaxKind));
109+
}
110+
111+
/// <summary>
112+
/// Register an action to be executed at completion of semantic analysis of a <see cref="SyntaxNode"/> with an
113+
/// appropriate kind. A syntax node action can report diagnostics about a <see cref="SyntaxNode"/>, and can also
114+
/// collect state information to be used by other syntax node actions or code block end actions.
115+
/// </summary>
116+
/// <param name="context">The analysis context.</param>
117+
/// <param name="action">Action to be executed at completion of semantic analysis of a
118+
/// <see cref="SyntaxNode"/>.</param>
119+
/// <param name="syntaxKinds">The kinds of syntax that should be analyzed.</param>
120+
/// <typeparam name="TLanguageKindEnum">Enum type giving the syntax node kinds of the source language for which
121+
/// the action applies.</typeparam>
122+
public static void RegisterSyntaxNodeAction<TLanguageKindEnum>(this CompilationStartAnalysisContextWithSettings context, Action<SyntaxNodeAnalysisContext> action, ImmutableArray<TLanguageKindEnum> syntaxKinds)
123+
where TLanguageKindEnum : struct
124+
{
125+
context.InnerContext.RegisterSyntaxNodeAction(action, syntaxKinds);
126+
}
127+
83128
private static class LanguageKindArrays<TLanguageKindEnum>
84129
where TLanguageKindEnum : struct
85130
{
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
// Copyright (c) Tunnel Vision Laboratories, LLC. All Rights Reserved.
2+
// Licensed under the MIT License. See LICENSE in the project root for license information.
3+
4+
namespace StyleCop.Analyzers
5+
{
6+
using System;
7+
using System.Collections.Concurrent;
8+
using System.Diagnostics.CodeAnalysis;
9+
using Microsoft.CodeAnalysis;
10+
using Microsoft.CodeAnalysis.Diagnostics;
11+
using StyleCop.Analyzers.Settings.ObjectModel;
12+
13+
internal class CompilationStartAnalysisContextWithSettings
14+
{
15+
[SuppressMessage("MicrosoftCodeAnalysisPerformance", "RS1012:Start action has no registered actions", Justification = "This is not a start action")]
16+
public CompilationStartAnalysisContextWithSettings(
17+
CompilationStartAnalysisContext innerContext,
18+
SettingsHelper.SettingsFile settingsFile,
19+
ConcurrentDictionary<SyntaxTree, Lazy<StyleCopSettings>> settingsObjectCache)
20+
{
21+
this.InnerContext = innerContext;
22+
this.SettingsFile = settingsFile;
23+
this.SettingsObjectCache = settingsObjectCache;
24+
}
25+
26+
public CompilationStartAnalysisContext InnerContext { get; }
27+
28+
public SettingsHelper.SettingsFile SettingsFile { get; }
29+
30+
public ConcurrentDictionary<SyntaxTree, Lazy<StyleCopSettings>> SettingsObjectCache { get; }
31+
32+
/// <summary>
33+
/// Gets the Microsoft.CodeAnalysis.Compilation that is the subject of the analysis.
34+
/// </summary>
35+
/// <value>
36+
/// The Microsoft.CodeAnalysis.Compilation that is the subject of the analysis.
37+
/// </value>
38+
public Compilation Compilation => this.InnerContext.Compilation;
39+
}
40+
}

StyleCop.Analyzers/StyleCop.Analyzers/DocumentationRules/ElementDocumentationBase.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ public override void Initialize(AnalysisContext context)
5858
context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.None);
5959
context.EnableConcurrentExecution();
6060

61-
context.RegisterCompilationStartAction(context =>
61+
context.RegisterCompilationStartActionWithSettings(context =>
6262
{
6363
context.RegisterSyntaxNodeAction(this.methodDeclarationAction, SyntaxKind.MethodDeclaration);
6464
context.RegisterSyntaxNodeAction(this.constructorDeclarationAction, SyntaxKind.ConstructorDeclaration);

StyleCop.Analyzers/StyleCop.Analyzers/DocumentationRules/ElementDocumentationSummaryBase.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ public override void Initialize(AnalysisContext context)
4949
context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.None);
5050
context.EnableConcurrentExecution();
5151

52-
context.RegisterCompilationStartAction(context =>
52+
context.RegisterCompilationStartActionWithSettings(context =>
5353
{
5454
context.RegisterSyntaxNodeAction(this.typeDeclarationAction, SyntaxKinds.BaseTypeDeclaration);
5555
context.RegisterSyntaxNodeAction(this.methodDeclarationAction, SyntaxKind.MethodDeclaration);

StyleCop.Analyzers/StyleCop.Analyzers/DocumentationRules/FileHeaderAnalyzers.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ internal class FileHeaderAnalyzers : DiagnosticAnalyzer
8585
private static readonly LocalizableString SA1641Description = new LocalizableResourceString(nameof(DocumentationResources.SA1641Description), DocumentationResources.ResourceManager, typeof(DocumentationResources));
8686
private static readonly string SA1641HelpLink = "https://github.com/DotNetAnalyzers/StyleCopAnalyzers/blob/master/documentation/SA1641.md";
8787

88-
private static readonly Action<CompilationStartAnalysisContext> CompilationStartAction = HandleCompilationStart;
88+
private static readonly Action<CompilationStartAnalysisContextWithSettings> CompilationStartAction = HandleCompilationStart;
8989

9090
/// <summary>
9191
/// Gets the diagnostic descriptor for SA1633 with a missing header.
@@ -176,10 +176,10 @@ public override void Initialize(AnalysisContext context)
176176
context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.None);
177177
context.EnableConcurrentExecution();
178178

179-
context.RegisterCompilationStartAction(CompilationStartAction);
179+
context.RegisterCompilationStartActionWithSettings(CompilationStartAction);
180180
}
181181

182-
private static void HandleCompilationStart(CompilationStartAnalysisContext context)
182+
private static void HandleCompilationStart(CompilationStartAnalysisContextWithSettings context)
183183
{
184184
var compilation = context.Compilation;
185185

StyleCop.Analyzers/StyleCop.Analyzers/DocumentationRules/PartialElementDocumentationSummaryBase.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ public override void Initialize(AnalysisContext context)
3737
context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.None);
3838
context.EnableConcurrentExecution();
3939

40-
context.RegisterCompilationStartAction(context =>
40+
context.RegisterCompilationStartActionWithSettings(context =>
4141
{
4242
context.RegisterSyntaxNodeAction(this.typeDeclarationAction, SyntaxKinds.TypeDeclaration);
4343
context.RegisterSyntaxNodeAction(this.methodDeclarationAction, SyntaxKind.MethodDeclaration);

StyleCop.Analyzers/StyleCop.Analyzers/DocumentationRules/PropertyDocumentationBase.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ public override void Initialize(AnalysisContext context)
4444
context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.None);
4545
context.EnableConcurrentExecution();
4646

47-
context.RegisterCompilationStartAction(context =>
47+
context.RegisterCompilationStartActionWithSettings(context =>
4848
{
4949
context.RegisterSyntaxNodeAction(this.propertyDeclarationAction, SyntaxKind.PropertyDeclaration);
5050
});

StyleCop.Analyzers/StyleCop.Analyzers/DocumentationRules/SA1600ElementsMustBeDocumented.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ public override void Initialize(AnalysisContext context)
112112
context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.None);
113113
context.EnableConcurrentExecution();
114114

115-
context.RegisterCompilationStartAction(context =>
115+
context.RegisterCompilationStartActionWithSettings(context =>
116116
{
117117
context.RegisterSyntaxNodeAction(BaseTypeDeclarationAction, BaseTypeDeclarationKinds);
118118
context.RegisterSyntaxNodeAction(MethodDeclarationAction, SyntaxKind.MethodDeclaration);

StyleCop.Analyzers/StyleCop.Analyzers/DocumentationRules/SA1601PartialElementsMustBeDocumented.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ public override void Initialize(AnalysisContext context)
9797
context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.None);
9898
context.EnableConcurrentExecution();
9999

100-
context.RegisterCompilationStartAction(context =>
100+
context.RegisterCompilationStartActionWithSettings(context =>
101101
{
102102
context.RegisterSyntaxNodeAction(BaseTypeDeclarationAction, BaseTypeDeclarationKinds);
103103
context.RegisterSyntaxNodeAction(MethodDeclarationAction, SyntaxKind.MethodDeclaration);

0 commit comments

Comments
 (0)