提交 ee2eeed3 编写于 作者: J John Hamby

Respond to review feedback.

上级 d9429233
...@@ -134,7 +134,7 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "InteractiveWindow", "src\In ...@@ -134,7 +134,7 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "InteractiveWindow", "src\In
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CSharpEditorServicesTest", "src\EditorFeatures\CSharpTest\CSharpEditorServicesTest.csproj", "{AC2BCEFB-9298-4621-AC48-1FF5E639E48D}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CSharpEditorServicesTest", "src\EditorFeatures\CSharpTest\CSharpEditorServicesTest.csproj", "{AC2BCEFB-9298-4621-AC48-1FF5E639E48D}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CSharpEditorServicesTest2", "src\EditorFeatures\CSharpTest2\CSharpEditorServicesTest2.csproj", "{16e93074-4252-466c-89a3-3b905abaf779}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CSharpEditorServicesTest2", "src\EditorFeatures\CSharpTest2\CSharpEditorServicesTest2.csproj", "{16E93074-4252-466C-89A3-3B905ABAF779}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EditorServicesTest", "src\EditorFeatures\Test\EditorServicesTest.csproj", "{8CEE3609-A5A9-4A9B-86D7-33118F5D6B33}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EditorServicesTest", "src\EditorFeatures\Test\EditorServicesTest.csproj", "{8CEE3609-A5A9-4A9B-86D7-33118F5D6B33}"
EndProject EndProject
...@@ -1436,26 +1436,26 @@ Global ...@@ -1436,26 +1436,26 @@ Global
{AC2BCEFB-9298-4621-AC48-1FF5E639E48D}.Release|x64.Build.0 = Release|Any CPU {AC2BCEFB-9298-4621-AC48-1FF5E639E48D}.Release|x64.Build.0 = Release|Any CPU
{AC2BCEFB-9298-4621-AC48-1FF5E639E48D}.Release|x86.ActiveCfg = Release|Any CPU {AC2BCEFB-9298-4621-AC48-1FF5E639E48D}.Release|x86.ActiveCfg = Release|Any CPU
{AC2BCEFB-9298-4621-AC48-1FF5E639E48D}.Release|x86.Build.0 = Release|Any CPU {AC2BCEFB-9298-4621-AC48-1FF5E639E48D}.Release|x86.Build.0 = Release|Any CPU
{16e93074-4252-466c-89a3-3b905abaf779}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {16E93074-4252-466C-89A3-3B905ABAF779}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{16e93074-4252-466c-89a3-3b905abaf779}.Debug|Any CPU.Build.0 = Debug|Any CPU {16E93074-4252-466C-89A3-3B905ABAF779}.Debug|Any CPU.Build.0 = Debug|Any CPU
{16e93074-4252-466c-89a3-3b905abaf779}.Debug|ARM.ActiveCfg = Debug|Any CPU {16E93074-4252-466C-89A3-3B905ABAF779}.Debug|ARM.ActiveCfg = Debug|Any CPU
{16e93074-4252-466c-89a3-3b905abaf779}.Debug|ARM.Build.0 = Debug|Any CPU {16E93074-4252-466C-89A3-3B905ABAF779}.Debug|ARM.Build.0 = Debug|Any CPU
{16e93074-4252-466c-89a3-3b905abaf779}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU {16E93074-4252-466C-89A3-3B905ABAF779}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{16e93074-4252-466c-89a3-3b905abaf779}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU {16E93074-4252-466C-89A3-3B905ABAF779}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{16e93074-4252-466c-89a3-3b905abaf779}.Debug|x64.ActiveCfg = Debug|Any CPU {16E93074-4252-466C-89A3-3B905ABAF779}.Debug|x64.ActiveCfg = Debug|Any CPU
{16e93074-4252-466c-89a3-3b905abaf779}.Debug|x64.Build.0 = Debug|Any CPU {16E93074-4252-466C-89A3-3B905ABAF779}.Debug|x64.Build.0 = Debug|Any CPU
{16e93074-4252-466c-89a3-3b905abaf779}.Debug|x86.ActiveCfg = Debug|Any CPU {16E93074-4252-466C-89A3-3B905ABAF779}.Debug|x86.ActiveCfg = Debug|Any CPU
{16e93074-4252-466c-89a3-3b905abaf779}.Debug|x86.Build.0 = Debug|Any CPU {16E93074-4252-466C-89A3-3B905ABAF779}.Debug|x86.Build.0 = Debug|Any CPU
{16e93074-4252-466c-89a3-3b905abaf779}.Release|Any CPU.ActiveCfg = Release|Any CPU {16E93074-4252-466C-89A3-3B905ABAF779}.Release|Any CPU.ActiveCfg = Release|Any CPU
{16e93074-4252-466c-89a3-3b905abaf779}.Release|Any CPU.Build.0 = Release|Any CPU {16E93074-4252-466C-89A3-3B905ABAF779}.Release|Any CPU.Build.0 = Release|Any CPU
{16e93074-4252-466c-89a3-3b905abaf779}.Release|ARM.ActiveCfg = Release|Any CPU {16E93074-4252-466C-89A3-3B905ABAF779}.Release|ARM.ActiveCfg = Release|Any CPU
{16e93074-4252-466c-89a3-3b905abaf779}.Release|ARM.Build.0 = Release|Any CPU {16E93074-4252-466C-89A3-3B905ABAF779}.Release|ARM.Build.0 = Release|Any CPU
{16e93074-4252-466c-89a3-3b905abaf779}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU {16E93074-4252-466C-89A3-3B905ABAF779}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{16e93074-4252-466c-89a3-3b905abaf779}.Release|Mixed Platforms.Build.0 = Release|Any CPU {16E93074-4252-466C-89A3-3B905ABAF779}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{16e93074-4252-466c-89a3-3b905abaf779}.Release|x64.ActiveCfg = Release|Any CPU {16E93074-4252-466C-89A3-3B905ABAF779}.Release|x64.ActiveCfg = Release|Any CPU
{16e93074-4252-466c-89a3-3b905abaf779}.Release|x64.Build.0 = Release|Any CPU {16E93074-4252-466C-89A3-3B905ABAF779}.Release|x64.Build.0 = Release|Any CPU
{16e93074-4252-466c-89a3-3b905abaf779}.Release|x86.ActiveCfg = Release|Any CPU {16E93074-4252-466C-89A3-3B905ABAF779}.Release|x86.ActiveCfg = Release|Any CPU
{16e93074-4252-466c-89a3-3b905abaf779}.Release|x86.Build.0 = Release|Any CPU {16E93074-4252-466C-89A3-3B905ABAF779}.Release|x86.Build.0 = Release|Any CPU
{8CEE3609-A5A9-4A9B-86D7-33118F5D6B33}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {8CEE3609-A5A9-4A9B-86D7-33118F5D6B33}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{8CEE3609-A5A9-4A9B-86D7-33118F5D6B33}.Debug|Any CPU.Build.0 = Debug|Any CPU {8CEE3609-A5A9-4A9B-86D7-33118F5D6B33}.Debug|Any CPU.Build.0 = Debug|Any CPU
{8CEE3609-A5A9-4A9B-86D7-33118F5D6B33}.Debug|ARM.ActiveCfg = Debug|Any CPU {8CEE3609-A5A9-4A9B-86D7-33118F5D6B33}.Debug|ARM.ActiveCfg = Debug|Any CPU
...@@ -2638,22 +2638,22 @@ Global ...@@ -2638,22 +2638,22 @@ Global
{ECBB1F28-2672-4344-8CB3-83882F291739}.Release|x86.Build.0 = Release|Any CPU {ECBB1F28-2672-4344-8CB3-83882F291739}.Release|x86.Build.0 = Release|Any CPU
{308CEBD4-418A-4C3B-97A5-24723B288157}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {308CEBD4-418A-4C3B-97A5-24723B288157}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{308CEBD4-418A-4C3B-97A5-24723B288157}.Debug|Any CPU.Build.0 = Debug|Any CPU {308CEBD4-418A-4C3B-97A5-24723B288157}.Debug|Any CPU.Build.0 = Debug|Any CPU
{308CEBD4-418A-4C3B-97A5-24723B288157}.Debug|ARM.ActiveCfg = Debug|ARM {308CEBD4-418A-4C3B-97A5-24723B288157}.Debug|ARM.ActiveCfg = Debug|Any CPU
{308CEBD4-418A-4C3B-97A5-24723B288157}.Debug|ARM.Build.0 = Debug|ARM {308CEBD4-418A-4C3B-97A5-24723B288157}.Debug|ARM.Build.0 = Debug|Any CPU
{308CEBD4-418A-4C3B-97A5-24723B288157}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU {308CEBD4-418A-4C3B-97A5-24723B288157}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{308CEBD4-418A-4C3B-97A5-24723B288157}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU {308CEBD4-418A-4C3B-97A5-24723B288157}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{308CEBD4-418A-4C3B-97A5-24723B288157}.Debug|x64.ActiveCfg = Debug|x64 {308CEBD4-418A-4C3B-97A5-24723B288157}.Debug|x64.ActiveCfg = Debug|Any CPU
{308CEBD4-418A-4C3B-97A5-24723B288157}.Debug|x64.Build.0 = Debug|x64 {308CEBD4-418A-4C3B-97A5-24723B288157}.Debug|x64.Build.0 = Debug|Any CPU
{308CEBD4-418A-4C3B-97A5-24723B288157}.Debug|x86.ActiveCfg = Debug|Any CPU {308CEBD4-418A-4C3B-97A5-24723B288157}.Debug|x86.ActiveCfg = Debug|Any CPU
{308CEBD4-418A-4C3B-97A5-24723B288157}.Debug|x86.Build.0 = Debug|Any CPU {308CEBD4-418A-4C3B-97A5-24723B288157}.Debug|x86.Build.0 = Debug|Any CPU
{308CEBD4-418A-4C3B-97A5-24723B288157}.Release|Any CPU.ActiveCfg = Release|Any CPU {308CEBD4-418A-4C3B-97A5-24723B288157}.Release|Any CPU.ActiveCfg = Release|Any CPU
{308CEBD4-418A-4C3B-97A5-24723B288157}.Release|Any CPU.Build.0 = Release|Any CPU {308CEBD4-418A-4C3B-97A5-24723B288157}.Release|Any CPU.Build.0 = Release|Any CPU
{308CEBD4-418A-4C3B-97A5-24723B288157}.Release|ARM.ActiveCfg = Release|ARM {308CEBD4-418A-4C3B-97A5-24723B288157}.Release|ARM.ActiveCfg = Release|Any CPU
{308CEBD4-418A-4C3B-97A5-24723B288157}.Release|ARM.Build.0 = Release|ARM {308CEBD4-418A-4C3B-97A5-24723B288157}.Release|ARM.Build.0 = Release|Any CPU
{308CEBD4-418A-4C3B-97A5-24723B288157}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU {308CEBD4-418A-4C3B-97A5-24723B288157}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{308CEBD4-418A-4C3B-97A5-24723B288157}.Release|Mixed Platforms.Build.0 = Release|Any CPU {308CEBD4-418A-4C3B-97A5-24723B288157}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{308CEBD4-418A-4C3B-97A5-24723B288157}.Release|x64.ActiveCfg = Release|x64 {308CEBD4-418A-4C3B-97A5-24723B288157}.Release|x64.ActiveCfg = Release|Any CPU
{308CEBD4-418A-4C3B-97A5-24723B288157}.Release|x64.Build.0 = Release|x64 {308CEBD4-418A-4C3B-97A5-24723B288157}.Release|x64.Build.0 = Release|Any CPU
{308CEBD4-418A-4C3B-97A5-24723B288157}.Release|x86.ActiveCfg = Release|Any CPU {308CEBD4-418A-4C3B-97A5-24723B288157}.Release|x86.ActiveCfg = Release|Any CPU
{308CEBD4-418A-4C3B-97A5-24723B288157}.Release|x86.Build.0 = Release|Any CPU {308CEBD4-418A-4C3B-97A5-24723B288157}.Release|x86.Build.0 = Release|Any CPU
{0835A7FB-C472-4F7D-A500-F9FD072CFF21}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {0835A7FB-C472-4F7D-A500-F9FD072CFF21}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
...@@ -2779,7 +2779,7 @@ Global ...@@ -2779,7 +2779,7 @@ Global
{8E2A252E-A140-45A6-A81A-2652996EA589} = {2491A9B9-C0A8-49EE-9077-A32DE76E1E94} {8E2A252E-A140-45A6-A81A-2652996EA589} = {2491A9B9-C0A8-49EE-9077-A32DE76E1E94}
{01E9BD68-0339-4A13-B42F-A3CA84D164F3} = {999FBDA2-33DA-4F74-B957-03AC72CCE5EC} {01E9BD68-0339-4A13-B42F-A3CA84D164F3} = {999FBDA2-33DA-4F74-B957-03AC72CCE5EC}
{AC2BCEFB-9298-4621-AC48-1FF5E639E48D} = {EE97CB90-33BB-4F3A-9B3D-69375DEC6AC6} {AC2BCEFB-9298-4621-AC48-1FF5E639E48D} = {EE97CB90-33BB-4F3A-9B3D-69375DEC6AC6}
{16e93074-4252-466c-89a3-3b905abaf779} = {EE97CB90-33BB-4F3A-9B3D-69375DEC6AC6} {16E93074-4252-466C-89A3-3B905ABAF779} = {EE97CB90-33BB-4F3A-9B3D-69375DEC6AC6}
{8CEE3609-A5A9-4A9B-86D7-33118F5D6B33} = {EE97CB90-33BB-4F3A-9B3D-69375DEC6AC6} {8CEE3609-A5A9-4A9B-86D7-33118F5D6B33} = {EE97CB90-33BB-4F3A-9B3D-69375DEC6AC6}
{3CEA0D69-00D3-40E5-A661-DC41EA07269B} = {EE97CB90-33BB-4F3A-9B3D-69375DEC6AC6} {3CEA0D69-00D3-40E5-A661-DC41EA07269B} = {EE97CB90-33BB-4F3A-9B3D-69375DEC6AC6}
{76C6F005-C89D-4348-BB4A-39189DDBEB52} = {EE97CB90-33BB-4F3A-9B3D-69375DEC6AC6} {76C6F005-C89D-4348-BB4A-39189DDBEB52} = {EE97CB90-33BB-4F3A-9B3D-69375DEC6AC6}
......
...@@ -45,13 +45,13 @@ public sealed override void Initialize(AnalysisContext context) ...@@ -45,13 +45,13 @@ public sealed override void Initialize(AnalysisContext context)
if (containingMethod != null) if (containingMethod != null)
{ {
bool inConstructor = containingMethod.MethodKind == MethodKind.Constructor; bool inConstructor = containingMethod.MethodKind == MethodKind.Constructor;
ITypeSymbol inStaticConstructor = containingMethod.MethodKind == MethodKind.StaticConstructor ? containingMethod.ContainingType : null; ITypeSymbol staticConstructorType = containingMethod.MethodKind == MethodKind.StaticConstructor ? containingMethod.ContainingType : null;
operationBlockContext.RegisterOperationAction( operationBlockContext.RegisterOperationAction(
(operationContext) => (operationContext) =>
{ {
IAssignmentExpression assignment = (IAssignmentExpression)operationContext.Operation; IAssignmentExpression assignment = (IAssignmentExpression)operationContext.Operation;
AssignTo(assignment.Target, inConstructor, inStaticConstructor, assignedToFields, mightBecomeReadOnlyFields); AssignTo(assignment.Target, inConstructor, staticConstructorType, assignedToFields, mightBecomeReadOnlyFields);
}, },
OperationKind.AssignmentExpression, OperationKind.AssignmentExpression,
OperationKind.CompoundAssignmentExpression); OperationKind.CompoundAssignmentExpression);
...@@ -64,7 +64,7 @@ public sealed override void Initialize(AnalysisContext context) ...@@ -64,7 +64,7 @@ public sealed override void Initialize(AnalysisContext context)
{ {
if (argument.Parameter.RefKind == RefKind.Out || argument.Parameter.RefKind == RefKind.Ref) if (argument.Parameter.RefKind == RefKind.Out || argument.Parameter.RefKind == RefKind.Ref)
{ {
AssignTo(argument.Value, inConstructor, inStaticConstructor, assignedToFields, mightBecomeReadOnlyFields); AssignTo(argument.Value, inConstructor, staticConstructorType, assignedToFields, mightBecomeReadOnlyFields);
} }
} }
}, },
...@@ -95,7 +95,7 @@ public sealed override void Initialize(AnalysisContext context) ...@@ -95,7 +95,7 @@ public sealed override void Initialize(AnalysisContext context)
}); });
} }
static void AssignTo(IExpression target, bool inConstructor, ITypeSymbol inStaticConstructor, HashSet<IFieldSymbol> assignedToFields, HashSet<IFieldSymbol> mightBecomeReadOnlyFields) static void AssignTo(IExpression target, bool inConstructor, ITypeSymbol staticConstructorType, HashSet<IFieldSymbol> assignedToFields, HashSet<IFieldSymbol> mightBecomeReadOnlyFields)
{ {
if (target.Kind == OperationKind.FieldReferenceExpression) if (target.Kind == OperationKind.FieldReferenceExpression)
{ {
...@@ -113,7 +113,7 @@ static void AssignTo(IExpression target, bool inConstructor, ITypeSymbol inStati ...@@ -113,7 +113,7 @@ static void AssignTo(IExpression target, bool inConstructor, ITypeSymbol inStati
IFieldSymbol targetField = fieldReference.Field; IFieldSymbol targetField = fieldReference.Field;
if (inStaticConstructor != null && targetField.IsStatic && targetField.ContainingType == inStaticConstructor) if (staticConstructorType != null && targetField.IsStatic && targetField.ContainingType == staticConstructorType)
{ {
return; return;
} }
......
...@@ -1090,14 +1090,14 @@ private bool ShouldExecuteOperationActions(AnalysisScope analysisScope) ...@@ -1090,14 +1090,14 @@ private bool ShouldExecuteOperationActions(AnalysisScope analysisScope)
return analysisScope.Analyzers.Any(analyzer => this.OperationActionsByAnalyzerAndKind.ContainsKey(analyzer)); return analysisScope.Analyzers.Any(analyzer => this.OperationActionsByAnalyzerAndKind.ContainsKey(analyzer));
} }
private bool ShouldExecuteCodeBlockActions(AnalysisScope analysisScope, ISymbol symbol) private bool ShouldExecuteBlockActions<T0, T1>(ImmutableDictionary<DiagnosticAnalyzer, ImmutableArray<T0>> blockStartActions, ImmutableDictionary<DiagnosticAnalyzer, ImmutableArray<T1>> blockActions, AnalysisScope analysisScope, ISymbol symbol)
{ {
if (AnalyzerExecutor.CanHaveExecutableCodeBlock(symbol)) if (AnalyzerExecutor.CanHaveExecutableCodeBlock(symbol))
{ {
foreach (var analyzer in analysisScope.Analyzers) foreach (var analyzer in analysisScope.Analyzers)
{ {
if (this.CodeBlockStartActionsByAnalyzer.ContainsKey(analyzer) || if (blockStartActions.ContainsKey(analyzer) ||
this.CodeBlockActionsByAnalyzer.ContainsKey(analyzer)) blockActions.ContainsKey(analyzer))
{ {
return true; return true;
} }
...@@ -1107,21 +1107,14 @@ private bool ShouldExecuteCodeBlockActions(AnalysisScope analysisScope, ISymbol ...@@ -1107,21 +1107,14 @@ private bool ShouldExecuteCodeBlockActions(AnalysisScope analysisScope, ISymbol
return false; return false;
} }
private bool ShouldExecuteOperationBlockActions(AnalysisScope analysisScope, ISymbol symbol) private bool ShouldExecuteCodeBlockActions(AnalysisScope analysisScope, ISymbol symbol)
{ {
if (AnalyzerExecutor.CanHaveExecutableCodeBlock(symbol)) return ShouldExecuteBlockActions(this.CodeBlockStartActionsByAnalyzer, this.CodeBlockActionsByAnalyzer, analysisScope, symbol);
{ }
foreach (var analyzer in analysisScope.Analyzers)
{
if (this.OperationBlockStartActionsByAnalyzer.ContainsKey(analyzer) ||
this.OperationBlockActionsByAnalyzer.ContainsKey(analyzer))
{
return true;
}
}
}
return false; private bool ShouldExecuteOperationBlockActions(AnalysisScope analysisScope, ISymbol symbol)
{
return ShouldExecuteBlockActions(this.OperationBlockStartActionsByAnalyzer, this.OperationBlockActionsByAnalyzer, analysisScope, symbol);
} }
protected override void ExecuteDeclaringReferenceActions( protected override void ExecuteDeclaringReferenceActions(
...@@ -1311,53 +1304,61 @@ private static void ComputeDeclarationsInNode(SemanticModel semanticModel, ISymb ...@@ -1311,53 +1304,61 @@ private static void ComputeDeclarationsInNode(SemanticModel semanticModel, ISymb
{ {
// Compute the executable code blocks of interest. // Compute the executable code blocks of interest.
var executableCodeBlocks = ImmutableArray<SyntaxNode>.Empty; var executableCodeBlocks = ImmutableArray<SyntaxNode>.Empty;
IEnumerable<CodeBlockAnalyzerActions> codeBlockActions = null;
foreach (var declInNode in declarationAnalysisData.DeclarationsInNode) foreach (var declInNode in declarationAnalysisData.DeclarationsInNode)
{ {
if (declInNode.DeclaredNode == declarationAnalysisData.TopmostNodeForAnalysis || declInNode.DeclaredNode == declarationAnalysisData.DeclaringReferenceSyntax) if (declInNode.DeclaredNode == declarationAnalysisData.TopmostNodeForAnalysis || declInNode.DeclaredNode == declarationAnalysisData.DeclaringReferenceSyntax)
{ {
executableCodeBlocks = declInNode.ExecutableCodeBlocks; executableCodeBlocks = declInNode.ExecutableCodeBlocks;
if (executableCodeBlocks.Any())
// Execute operation actions.
if ((shouldExecuteOperationActions || shouldExecuteOperationBlockActions) && executableCodeBlocks.Any())
{ {
var operationBlocksToAnalyze = GetOperationBlocksToAnalyze(executableCodeBlocks, semanticModel, cancellationToken); if (shouldExecuteCodeBlockActions || shouldExecuteOperationBlockActions)
var operationsToAnalyze = GetOperationsToAnalyze(operationBlocksToAnalyze); {
codeBlockActions = GetCodeBlockActions(analysisScope);
}
if (!operationsToAnalyze.IsEmpty) // Execute operation actions.
if (shouldExecuteOperationActions || shouldExecuteOperationBlockActions)
{ {
if (shouldExecuteOperationActions) var operationBlocksToAnalyze = GetOperationBlocksToAnalyze(executableCodeBlocks, semanticModel, cancellationToken);
var operationsToAnalyze = GetOperationsToAnalyze(operationBlocksToAnalyze);
if (!operationsToAnalyze.IsEmpty)
{ {
foreach (var analyzer in analysisScope.Analyzers) if (shouldExecuteOperationActions)
{ {
ImmutableDictionary<OperationKind, ImmutableArray<OperationAnalyzerAction>> operationActionsByKind; foreach (var analyzer in analysisScope.Analyzers)
if (this.OperationActionsByAnalyzerAndKind.TryGetValue(analyzer, out operationActionsByKind))
{ {
analyzerExecutor.ExecuteOperationActions(operationsToAnalyze, operationActionsByKind, ImmutableDictionary<OperationKind, ImmutableArray<OperationAnalyzerAction>> operationActionsByKind;
analyzer, semanticModel, declarationAnalysisData.TopmostNodeForAnalysis.FullSpan, decl, analysisScope, analysisStateOpt); if (this.OperationActionsByAnalyzerAndKind.TryGetValue(analyzer, out operationActionsByKind))
{
analyzerExecutor.ExecuteOperationActions(operationsToAnalyze, operationActionsByKind,
analyzer, semanticModel, declarationAnalysisData.TopmostNodeForAnalysis.FullSpan, decl, analysisScope, analysisStateOpt);
}
} }
} }
}
if (shouldExecuteOperationBlockActions) if (shouldExecuteOperationBlockActions)
{
foreach (var analyzerActions in GetCodeBlockActions(analysisScope))
{ {
analyzerExecutor.ExecuteOperationBlockActions( foreach (var analyzerActions in codeBlockActions)
analyzerActions.OperationBlockStartActions, analyzerActions.OperationBlockActions, {
analyzerActions.OpererationBlockEndActions, analyzerActions.Analyzer, declarationAnalysisData.TopmostNodeForAnalysis, symbol, analyzerExecutor.ExecuteOperationBlockActions(
operationBlocksToAnalyze, operationsToAnalyze, semanticModel, decl, analysisScope, analysisStateOpt); analyzerActions.OperationBlockStartActions, analyzerActions.OperationBlockActions,
analyzerActions.OpererationBlockEndActions, analyzerActions.Analyzer, declarationAnalysisData.TopmostNodeForAnalysis, symbol,
operationBlocksToAnalyze, operationsToAnalyze, semanticModel, decl, analysisScope, analysisStateOpt);
}
} }
} }
} }
}
break; break;
}
} }
} }
if (executableCodeBlocks.Any() && shouldExecuteCodeBlockActions) if (executableCodeBlocks.Any() && shouldExecuteCodeBlockActions)
{ {
foreach (var analyzerActions in GetCodeBlockActions(analysisScope)) foreach (var analyzerActions in codeBlockActions)
{ {
analyzerExecutor.ExecuteCodeBlockActions( analyzerExecutor.ExecuteCodeBlockActions(
analyzerActions.CodeBlockStartActions, analyzerActions.CodeBlockActions, analyzerActions.CodeBlockStartActions, analyzerActions.CodeBlockActions,
...@@ -1393,7 +1394,7 @@ private struct CodeBlockAnalyzerActions ...@@ -1393,7 +1394,7 @@ private struct CodeBlockAnalyzerActions
public ImmutableArray<OperationBlockAnalyzerAction> OperationBlockActions; public ImmutableArray<OperationBlockAnalyzerAction> OperationBlockActions;
public ImmutableArray<OperationBlockAnalyzerAction> OpererationBlockEndActions; public ImmutableArray<OperationBlockAnalyzerAction> OpererationBlockEndActions;
} }
private IEnumerable<CodeBlockAnalyzerActions> GetCodeBlockActions(AnalysisScope analysisScope) private IEnumerable<CodeBlockAnalyzerActions> GetCodeBlockActions(AnalysisScope analysisScope)
{ {
foreach (var analyzer in analysisScope.Analyzers) foreach (var analyzer in analysisScope.Analyzers)
......
...@@ -454,7 +454,7 @@ private void ExecuteCompilationActionsCore(ImmutableArray<CompilationAnalyzerAct ...@@ -454,7 +454,7 @@ private void ExecuteCompilationActionsCore(ImmutableArray<CompilationAnalyzerAct
analyzerStateOpt?.ProcessedActions.Add(operationAction); analyzerStateOpt?.ProcessedActions.Add(operationAction);
} }
} }
public void ExecuteCodeBlockActions<TLanguageKindEnum>( public void ExecuteCodeBlockActions<TLanguageKindEnum>(
IEnumerable<CodeBlockStartAnalyzerAction<TLanguageKindEnum>> codeBlockStartActions, IEnumerable<CodeBlockStartAnalyzerAction<TLanguageKindEnum>> codeBlockStartActions,
IEnumerable<CodeBlockAnalyzerAction> codeBlockActions, IEnumerable<CodeBlockAnalyzerAction> codeBlockActions,
...@@ -591,7 +591,6 @@ private void ExecuteCompilationActionsCore(ImmutableArray<CompilationAnalyzerAct ...@@ -591,7 +591,6 @@ private void ExecuteCompilationActionsCore(ImmutableArray<CompilationAnalyzerAct
syntaxNodeActions.AddRange(codeBlockScope.SyntaxNodeActions); syntaxNodeActions.AddRange(codeBlockScope.SyntaxNodeActions);
}); });
} }
else else
{ {
var operationBlockStartAction = startAction as OperationBlockStartAnalyzerAction; var operationBlockStartAction = startAction as OperationBlockStartAnalyzerAction;
...@@ -666,22 +665,18 @@ private void ExecuteCompilationActionsCore(ImmutableArray<CompilationAnalyzerAct ...@@ -666,22 +665,18 @@ private void ExecuteCompilationActionsCore(ImmutableArray<CompilationAnalyzerAct
Func<Diagnostic, bool> isSupportedDiagnostic = d => IsSupportedDiagnostic(blockAction.Analyzer, d); Func<Diagnostic, bool> isSupportedDiagnostic = d => IsSupportedDiagnostic(blockAction.Analyzer, d);
if (codeBlockAction != null) if (codeBlockAction != null)
{ {
ExecuteAndCatchIfThrows(codeBlockAction.Analyzer, ExecuteAndCatchIfThrows(
() => codeBlockAction.Analyzer,
{ () => codeBlockAction.Action(new CodeBlockAnalysisContext(declaredNode, declaredSymbol, semanticModel, _analyzerOptions, addDiagnostic, isSupportedDiagnostic, _cancellationToken)));
codeBlockAction.Action(new CodeBlockAnalysisContext(declaredNode, declaredSymbol, semanticModel, _analyzerOptions, addDiagnostic, isSupportedDiagnostic, _cancellationToken));
});
} }
else else
{ {
var operationBlockAction = blockAction as OperationBlockAnalyzerAction; var operationBlockAction = blockAction as OperationBlockAnalyzerAction;
if (operationBlockAction != null) if (operationBlockAction != null)
{ {
ExecuteAndCatchIfThrows(operationBlockAction.Analyzer, ExecuteAndCatchIfThrows(
() => operationBlockAction.Analyzer,
{ () => operationBlockAction.Action(new OperationBlockAnalysisContext(operationBlocks, declaredSymbol, _analyzerOptions, addDiagnostic, isSupportedDiagnostic, _cancellationToken)));
operationBlockAction.Action(new OperationBlockAnalysisContext(operationBlocks, declaredSymbol, _analyzerOptions, addDiagnostic, isSupportedDiagnostic, _cancellationToken));
});
} }
} }
...@@ -691,7 +686,7 @@ private void ExecuteCompilationActionsCore(ImmutableArray<CompilationAnalyzerAct ...@@ -691,7 +686,7 @@ private void ExecuteCompilationActionsCore(ImmutableArray<CompilationAnalyzerAct
blockActions.Free(); blockActions.Free();
} }
internal static ImmutableDictionary<TLanguageKindEnum, ImmutableArray<SyntaxNodeAnalyzerAction<TLanguageKindEnum>>> GetNodeActionsByKind<TLanguageKindEnum>( internal static ImmutableDictionary<TLanguageKindEnum, ImmutableArray<SyntaxNodeAnalyzerAction<TLanguageKindEnum>>> GetNodeActionsByKind<TLanguageKindEnum>(
IEnumerable<SyntaxNodeAnalyzerAction<TLanguageKindEnum>> nodeActions) IEnumerable<SyntaxNodeAnalyzerAction<TLanguageKindEnum>> nodeActions)
where TLanguageKindEnum : struct where TLanguageKindEnum : struct
......
...@@ -712,7 +712,7 @@ public struct OperationBlockAnalysisContext ...@@ -712,7 +712,7 @@ public struct OperationBlockAnalysisContext
/// <summary> /// <summary>
/// Code block that is the subject of the analysis. /// Code block that is the subject of the analysis.
/// </summary> /// </summary>
public ImmutableArray<IOperation> CodeBlock => _operationBlocks; public ImmutableArray<IOperation> OperationBlocks => _operationBlocks;
/// <summary> /// <summary>
/// <see cref="ISymbol"/> for which the code block provides a definition or value. /// <see cref="ISymbol"/> for which the code block provides a definition or value.
......
...@@ -80,12 +80,7 @@ Microsoft.CodeAnalysis.Diagnostics.AnalysisContext.RegisterOperationAction(Syste ...@@ -80,12 +80,7 @@ Microsoft.CodeAnalysis.Diagnostics.AnalysisContext.RegisterOperationAction(Syste
Microsoft.CodeAnalysis.Diagnostics.CompilationStartAnalysisContext.RegisterOperationAction(System.Action<Microsoft.CodeAnalysis.Diagnostics.OperationAnalysisContext> action, params Microsoft.CodeAnalysis.Semantics.OperationKind[] operationKinds) -> void Microsoft.CodeAnalysis.Diagnostics.CompilationStartAnalysisContext.RegisterOperationAction(System.Action<Microsoft.CodeAnalysis.Diagnostics.OperationAnalysisContext> action, params Microsoft.CodeAnalysis.Semantics.OperationKind[] operationKinds) -> void
abstract Microsoft.CodeAnalysis.Diagnostics.AnalysisContext.RegisterOperationAction(System.Action<Microsoft.CodeAnalysis.Diagnostics.OperationAnalysisContext> action, System.Collections.Immutable.ImmutableArray<Microsoft.CodeAnalysis.Semantics.OperationKind> operationKinds) -> void abstract Microsoft.CodeAnalysis.Diagnostics.AnalysisContext.RegisterOperationAction(System.Action<Microsoft.CodeAnalysis.Diagnostics.OperationAnalysisContext> action, System.Collections.Immutable.ImmutableArray<Microsoft.CodeAnalysis.Semantics.OperationKind> operationKinds) -> void
abstract Microsoft.CodeAnalysis.Diagnostics.CompilationStartAnalysisContext.RegisterOperationAction(System.Action<Microsoft.CodeAnalysis.Diagnostics.OperationAnalysisContext> action, System.Collections.Immutable.ImmutableArray<Microsoft.CodeAnalysis.Semantics.OperationKind> operationKinds) -> void abstract Microsoft.CodeAnalysis.Diagnostics.CompilationStartAnalysisContext.RegisterOperationAction(System.Action<Microsoft.CodeAnalysis.Diagnostics.OperationAnalysisContext> action, System.Collections.Immutable.ImmutableArray<Microsoft.CodeAnalysis.Semantics.OperationKind> operationKinds) -> void
Microsoft.CodeAnalysis.Diagnostics.OperationAnalysisContext abstract Microsoft.CodeAnalysis.Diagnostics.CompilationStartAnalysisContext.RegisterOperationBlockStartAction(System.Action<Microsoft.CodeAnalysis.Diagnostics.OperationBlockStartAnalysisContext> action) -> void
Microsoft.CodeAnalysis.Diagnostics.OperationAnalysisContext.Options.get -> Microsoft.CodeAnalysis.Diagnostics.AnalyzerOptions
Microsoft.CodeAnalysis.Diagnostics.OperationAnalysisContext.CancellationToken.get -> System.Threading.CancellationToken
Microsoft.CodeAnalysis.Diagnostics.OperationAnalysisContext.ReportDiagnostic(Microsoft.CodeAnalysis.Diagnostic diagnostic) -> void
Microsoft.CodeAnalysis.Diagnostics.OperationAnalysisContext.Operation.get -> Microsoft.CodeAnalysis.Semantics.IOperation
Microsoft.CodeAnalysis.Diagnostics.OperationAnalysisContext.OperationAnalysisContext(Microsoft.CodeAnalysis.Semantics.IOperation operation, Microsoft.CodeAnalysis.Diagnostics.AnalyzerOptions options, System.Action<Microsoft.CodeAnalysis.Diagnostic> reportDiagnostic, System.Func<Microsoft.CodeAnalysis.Diagnostic, bool> isSupportedDiagnostic, System.Threading.CancellationToken cancellationToken) -> void
Microsoft.CodeAnalysis.Semantics.IOperation Microsoft.CodeAnalysis.Semantics.IOperation
Microsoft.CodeAnalysis.Semantics.IOperation.Kind.get -> Microsoft.CodeAnalysis.Semantics.OperationKind Microsoft.CodeAnalysis.Semantics.IOperation.Kind.get -> Microsoft.CodeAnalysis.Semantics.OperationKind
Microsoft.CodeAnalysis.Semantics.IOperation.Syntax.get -> Microsoft.CodeAnalysis.SyntaxNode Microsoft.CodeAnalysis.Semantics.IOperation.Syntax.get -> Microsoft.CodeAnalysis.SyntaxNode
...@@ -636,18 +631,19 @@ Microsoft.CodeAnalysis.Semantics.OperationKind.ConditionalAccessExpression = 60 ...@@ -636,18 +631,19 @@ Microsoft.CodeAnalysis.Semantics.OperationKind.ConditionalAccessExpression = 60
Microsoft.CodeAnalysis.Semantics.OperationKind.IncrementExpression = 61 -> Microsoft.CodeAnalysis.Semantics.OperationKind Microsoft.CodeAnalysis.Semantics.OperationKind.IncrementExpression = 61 -> Microsoft.CodeAnalysis.Semantics.OperationKind
Microsoft.CodeAnalysis.Diagnostics.OperationBlockAnalysisContext Microsoft.CodeAnalysis.Diagnostics.OperationBlockAnalysisContext
Microsoft.CodeAnalysis.Diagnostics.OperationBlockAnalysisContext.CancellationToken.get -> System.Threading.CancellationToken Microsoft.CodeAnalysis.Diagnostics.OperationBlockAnalysisContext.CancellationToken.get -> System.Threading.CancellationToken
Microsoft.CodeAnalysis.Diagnostics.OperationBlockAnalysisContext.OperationBlock.get -> Microsoft.CodeAnalysis.Semantics.IOperation Microsoft.CodeAnalysis.Diagnostics.OperationBlockAnalysisContext.OperationBlocks.get -> System.Collections.Immutable.ImmutableArray<Microsoft.CodeAnalysis.Semantics.IOperation>
Microsoft.CodeAnalysis.Diagnostics.OperationBlockAnalysisContext.OperationBlockAnalysisContext(Microsoft.CodeAnalysis.Semantics.IOperation operationBlock, Microsoft.CodeAnalysis.ISymbol owningSymbol, Microsoft.CodeAnalysis.Diagnostics.AnalyzerOptions options, System.Action<Microsoft.CodeAnalysis.Diagnostic> reportDiagnostic, System.Func<Microsoft.CodeAnalysis.Diagnostic, bool> isSupportedDiagnostic, System.Threading.CancellationToken cancellationToken) -> void Microsoft.CodeAnalysis.Diagnostics.OperationBlockAnalysisContext.OperationBlockAnalysisContext(System.Collections.Immutable.ImmutableArray<Microsoft.CodeAnalysis.Semantics.IOperation> operationBlocks, Microsoft.CodeAnalysis.ISymbol owningSymbol, Microsoft.CodeAnalysis.Diagnostics.AnalyzerOptions options, System.Action<Microsoft.CodeAnalysis.Diagnostic> reportDiagnostic, System.Func<Microsoft.CodeAnalysis.Diagnostic, bool> isSupportedDiagnostic, System.Threading.CancellationToken cancellationToken) -> void
Microsoft.CodeAnalysis.Diagnostics.OperationBlockAnalysisContext.Options.get -> Microsoft.CodeAnalysis.Diagnostics.AnalyzerOptions Microsoft.CodeAnalysis.Diagnostics.OperationBlockAnalysisContext.Options.get -> Microsoft.CodeAnalysis.Diagnostics.AnalyzerOptions
Microsoft.CodeAnalysis.Diagnostics.OperationBlockAnalysisContext.OwningSymbol.get -> Microsoft.CodeAnalysis.ISymbol Microsoft.CodeAnalysis.Diagnostics.OperationBlockAnalysisContext.OwningSymbol.get -> Microsoft.CodeAnalysis.ISymbol
Microsoft.CodeAnalysis.Diagnostics.OperationBlockAnalysisContext.ReportDiagnostic(Microsoft.CodeAnalysis.Diagnostic diagnostic) -> void Microsoft.CodeAnalysis.Diagnostics.OperationBlockAnalysisContext.ReportDiagnostic(Microsoft.CodeAnalysis.Diagnostic diagnostic) -> void
Microsoft.CodeAnalysis.Diagnostics.OperationBlockStartAnalysisContext Microsoft.CodeAnalysis.Diagnostics.OperationBlockStartAnalysisContext
Microsoft.CodeAnalysis.Diagnostics.OperationBlockStartAnalysisContext.CancellationToken.get -> System.Threading.CancellationToken Microsoft.CodeAnalysis.Diagnostics.OperationBlockStartAnalysisContext.CancellationToken.get -> System.Threading.CancellationToken
Microsoft.CodeAnalysis.Diagnostics.OperationBlockStartAnalysisContext.OperationBlock.get -> Microsoft.CodeAnalysis.Semantics.IOperation Microsoft.CodeAnalysis.Diagnostics.OperationBlockStartAnalysisContext.OperationBlocks.get -> System.Collections.Immutable.ImmutableArray<Microsoft.CodeAnalysis.Semantics.IOperation>
Microsoft.CodeAnalysis.Diagnostics.OperationBlockStartAnalysisContext.OperationBlockStartAnalysisContext(Microsoft.CodeAnalysis.Semantics.IOperation operationBlock, Microsoft.CodeAnalysis.ISymbol owningSymbol, Microsoft.CodeAnalysis.Diagnostics.AnalyzerOptions options, System.Threading.CancellationToken cancellationToken) -> void Microsoft.CodeAnalysis.Diagnostics.OperationBlockStartAnalysisContext.OperationBlockStartAnalysisContext(System.Collections.Immutable.ImmutableArray<Microsoft.CodeAnalysis.Semantics.IOperation> operationBlocks, Microsoft.CodeAnalysis.ISymbol owningSymbol, Microsoft.CodeAnalysis.Diagnostics.AnalyzerOptions options, System.Threading.CancellationToken cancellationToken) -> void
Microsoft.CodeAnalysis.Diagnostics.OperationBlockStartAnalysisContext.Options.get -> Microsoft.CodeAnalysis.Diagnostics.AnalyzerOptions Microsoft.CodeAnalysis.Diagnostics.OperationBlockStartAnalysisContext.Options.get -> Microsoft.CodeAnalysis.Diagnostics.AnalyzerOptions
Microsoft.CodeAnalysis.Diagnostics.OperationBlockStartAnalysisContext.OwningSymbol.get -> Microsoft.CodeAnalysis.ISymbol Microsoft.CodeAnalysis.Diagnostics.OperationBlockStartAnalysisContext.OwningSymbol.get -> Microsoft.CodeAnalysis.ISymbol
abstract Microsoft.CodeAnalysis.Diagnostics.OperationBlockStartAnalysisContext.RegisterOperationAction(System.Action<Microsoft.CodeAnalysis.Diagnostics.OperationAnalysisContext> action, params Microsoft.CodeAnalysis.Semantics.OperationKind[] operationKinds) -> void Microsoft.CodeAnalysis.Diagnostics.OperationBlockStartAnalysisContext.RegisterOperationAction(System.Action<Microsoft.CodeAnalysis.Diagnostics.OperationAnalysisContext> action, params Microsoft.CodeAnalysis.Semantics.OperationKind[] operationKinds) -> void
abstract Microsoft.CodeAnalysis.Diagnostics.OperationBlockStartAnalysisContext.RegisterOperationAction(System.Action<Microsoft.CodeAnalysis.Diagnostics.OperationAnalysisContext> action, System.Collections.Immutable.ImmutableArray<Microsoft.CodeAnalysis.Semantics.OperationKind> operationKinds) -> void
abstract Microsoft.CodeAnalysis.Diagnostics.OperationBlockStartAnalysisContext.RegisterOperationBlockEndAction(System.Action<Microsoft.CodeAnalysis.Diagnostics.OperationBlockAnalysisContext> action) -> void abstract Microsoft.CodeAnalysis.Diagnostics.OperationBlockStartAnalysisContext.RegisterOperationBlockEndAction(System.Action<Microsoft.CodeAnalysis.Diagnostics.OperationBlockAnalysisContext> action) -> void
Microsoft.CodeAnalysis.Diagnostics.OperationAnalysisContext Microsoft.CodeAnalysis.Diagnostics.OperationAnalysisContext
Microsoft.CodeAnalysis.Diagnostics.OperationAnalysisContext.CancellationToken.get -> System.Threading.CancellationToken Microsoft.CodeAnalysis.Diagnostics.OperationAnalysisContext.CancellationToken.get -> System.Threading.CancellationToken
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册