提交 6cf00498 编写于 作者: C CyrusNajmabadi

Simplify code.

上级 1e8245e3
......@@ -57,7 +57,7 @@ protected void Clear()
protected abstract void AddMatches(ArrayBuilder<TMatch> matches);
public ImmutableArray<TMatch>? Analyze()
protected ImmutableArray<TMatch>? AnalyzeWorker()
{
if (_syntaxFacts.GetObjectCreationInitializer(_objectCreationExpression) != null)
{
......
......@@ -51,7 +51,7 @@ public override Task RegisterCodeFixesAsync(CodeFixContext context)
}
protected override async Task FixAllAsync(
Document document, ImmutableArray<Diagnostic> diagnostics,
Document document, ImmutableArray<Diagnostic> diagnostics,
SyntaxEditor editor, CancellationToken cancellationToken)
{
// Fix-All for this feature is somewhat complicated. As Collection-Initializers
......@@ -85,37 +85,29 @@ public override Task RegisterCodeFixesAsync(CodeFixContext context)
var originalObjectCreation = originalObjectCreationNodes.Pop();
var objectCreation = currentRoot.GetCurrentNodes(originalObjectCreation).Single();
var analyzer = ObjectCreationExpressionAnalyzer<TExpressionSyntax, TStatementSyntax, TObjectCreationExpressionSyntax, TMemberAccessExpressionSyntax, TInvocationExpressionSyntax, TExpressionStatementSyntax, TVariableDeclaratorSyntax>.Allocate();
analyzer.Initialize(semanticModel, syntaxFacts, objectCreation, cancellationToken);
var matches = ObjectCreationExpressionAnalyzer<TExpressionSyntax, TStatementSyntax, TObjectCreationExpressionSyntax, TMemberAccessExpressionSyntax, TInvocationExpressionSyntax, TExpressionStatementSyntax, TVariableDeclaratorSyntax>.Analyze(
semanticModel, syntaxFacts, objectCreation, cancellationToken);
try
if (matches == null || matches.Value.Length == 0)
{
var matches = analyzer.Analyze();
if (matches == null || matches.Value.Length == 0)
{
continue;
}
var statement = objectCreation.FirstAncestorOrSelf<TStatementSyntax>();
var newStatement = GetNewStatement(statement, objectCreation, matches.Value)
.WithAdditionalAnnotations(Formatter.Annotation);
var subEditor = new SyntaxEditor(currentRoot, workspace);
subEditor.ReplaceNode(statement, newStatement);
foreach (var match in matches)
{
subEditor.RemoveNode(match);
}
document = document.WithSyntaxRoot(subEditor.GetChangedRoot());
semanticModel = await document.GetSemanticModelAsync(cancellationToken).ConfigureAwait(false);
currentRoot = await document.GetSyntaxRootAsync(cancellationToken).ConfigureAwait(false);
continue;
}
finally
var statement = objectCreation.FirstAncestorOrSelf<TStatementSyntax>();
var newStatement = GetNewStatement(statement, objectCreation, matches.Value)
.WithAdditionalAnnotations(Formatter.Annotation);
var subEditor = new SyntaxEditor(currentRoot, workspace);
subEditor.ReplaceNode(statement, newStatement);
foreach (var match in matches)
{
analyzer.Free();
subEditor.RemoveNode(match);
}
document = document.WithSyntaxRoot(subEditor.GetChangedRoot());
semanticModel = await document.GetSemanticModelAsync(cancellationToken).ConfigureAwait(false);
currentRoot = await document.GetSyntaxRootAsync(cancellationToken).ConfigureAwait(false);
}
editor.ReplaceNode(originalRoot, currentRoot);
......
......@@ -91,38 +91,31 @@ private void AnalyzeNode(SyntaxNodeAnalysisContext context, INamedTypeSymbol ien
return;
}
var analyzer = ObjectCreationExpressionAnalyzer<TExpressionSyntax, TStatementSyntax, TObjectCreationExpressionSyntax, TMemberAccessExpressionSyntax, TInvocationExpressionSyntax, TExpressionStatementSyntax, TVariableDeclaratorSyntax>.Allocate();
analyzer.Initialize(semanticModel, GetSyntaxFactsService(), objectCreationExpression, cancellationToken);
try
var matches = ObjectCreationExpressionAnalyzer<TExpressionSyntax, TStatementSyntax, TObjectCreationExpressionSyntax, TMemberAccessExpressionSyntax, TInvocationExpressionSyntax, TExpressionStatementSyntax, TVariableDeclaratorSyntax>.Analyze(
semanticModel, GetSyntaxFactsService(), objectCreationExpression, cancellationToken);
if (matches == null || matches.Value.Length == 0)
{
var matches = analyzer.Analyze();
if (matches == null || matches.Value.Length == 0)
{
return;
}
return;
}
var containingStatement = objectCreationExpression.FirstAncestorOrSelf<TStatementSyntax>();
var nodes = ImmutableArray.Create<SyntaxNode>(containingStatement).AddRange(matches.Value);
var syntaxFacts = GetSyntaxFactsService();
if (syntaxFacts.ContainsInterleavedDirective(nodes, cancellationToken))
{
return;
}
var containingStatement = objectCreationExpression.FirstAncestorOrSelf<TStatementSyntax>();
var nodes = ImmutableArray.Create<SyntaxNode>(containingStatement).AddRange(matches.Value);
var syntaxFacts = GetSyntaxFactsService();
if (syntaxFacts.ContainsInterleavedDirective(nodes, cancellationToken))
{
return;
}
var locations = ImmutableArray.Create(objectCreationExpression.GetLocation());
var locations = ImmutableArray.Create(objectCreationExpression.GetLocation());
var severity = option.Notification.Value;
context.ReportDiagnostic(Diagnostic.Create(
CreateDescriptorWithSeverity(severity),
objectCreationExpression.GetLocation(),
additionalLocations: locations));
var severity = option.Notification.Value;
context.ReportDiagnostic(Diagnostic.Create(
CreateDescriptorWithSeverity(severity),
objectCreationExpression.GetLocation(),
additionalLocations: locations));
FadeOutCode(context, optionSet, matches.Value, locations);
}
finally
{
analyzer.Free();
}
FadeOutCode(context, optionSet, matches.Value, locations);
}
private void FadeOutCode(
......
// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System.Collections;
using System.Collections.Immutable;
using System.Threading;
using Microsoft.CodeAnalysis.LanguageServices;
using Roslyn.Utilities;
namespace Microsoft.CodeAnalysis.UseCollectionInitializer
......@@ -30,17 +33,27 @@ internal class ObjectCreationExpressionAnalyzer<
= new ObjectPool<ObjectCreationExpressionAnalyzer<TExpressionSyntax, TStatementSyntax, TObjectCreationExpressionSyntax, TMemberAccessExpressionSyntax, TInvocationExpressionSyntax, TExpressionStatementSyntax, TVariableDeclaratorSyntax>>(
() => new ObjectCreationExpressionAnalyzer<TExpressionSyntax, TStatementSyntax, TObjectCreationExpressionSyntax, TMemberAccessExpressionSyntax, TInvocationExpressionSyntax, TExpressionStatementSyntax, TVariableDeclaratorSyntax>());
public static ObjectCreationExpressionAnalyzer<TExpressionSyntax, TStatementSyntax, TObjectCreationExpressionSyntax, TMemberAccessExpressionSyntax, TInvocationExpressionSyntax, TExpressionStatementSyntax, TVariableDeclaratorSyntax> Allocate()
=> s_pool.Allocate();
private ObjectCreationExpressionAnalyzer()
{
}
public void Free()
public static ImmutableArray<TExpressionStatementSyntax>? Analyze(
SemanticModel semanticModel,
ISyntaxFactsService syntaxFacts,
TObjectCreationExpressionSyntax objectCreationExpression,
CancellationToken cancellationToken)
{
this.Clear();
s_pool.Free(this);
var analyzer = s_pool.Allocate();
analyzer.Initialize(semanticModel, syntaxFacts, objectCreationExpression, cancellationToken);
try
{
return analyzer.AnalyzeWorker();
}
finally
{
analyzer.Clear();
s_pool.Free(analyzer);
}
}
protected override void AddMatches(ArrayBuilder<TExpressionStatementSyntax> matches)
......
......@@ -84,37 +84,29 @@ public override Task RegisterCodeFixesAsync(CodeFixContext context)
var originalObjectCreation = originalObjectCreationNodes.Pop();
var objectCreation = currentRoot.GetCurrentNodes(originalObjectCreation).Single();
var analyzer = ObjectCreationExpressionAnalyzer<TExpressionSyntax, TStatementSyntax, TObjectCreationExpressionSyntax, TMemberAccessExpressionSyntax, TAssignmentStatementSyntax, TVariableDeclaratorSyntax>.Allocate();
analyzer.Initialize(semanticModel, syntaxFacts, objectCreation, cancellationToken);
var matches = ObjectCreationExpressionAnalyzer<TExpressionSyntax, TStatementSyntax, TObjectCreationExpressionSyntax, TMemberAccessExpressionSyntax, TAssignmentStatementSyntax, TVariableDeclaratorSyntax>.Analyze(
semanticModel, syntaxFacts, objectCreation, cancellationToken);
try
if (matches == null || matches.Value.Length == 0)
{
var matches = analyzer.Analyze();
if (matches == null || matches.Value.Length == 0)
{
continue;
}
var statement = objectCreation.FirstAncestorOrSelf<TStatementSyntax>();
var newStatement = GetNewStatement(statement, objectCreation, matches.Value)
.WithAdditionalAnnotations(Formatter.Annotation);
var subEditor = new SyntaxEditor(currentRoot, workspace);
subEditor.ReplaceNode(statement, newStatement);
foreach (var match in matches)
{
subEditor.RemoveNode(match.Statement);
}
document = document.WithSyntaxRoot(subEditor.GetChangedRoot());
semanticModel = await document.GetSemanticModelAsync(cancellationToken).ConfigureAwait(false);
currentRoot = await document.GetSyntaxRootAsync(cancellationToken).ConfigureAwait(false);
continue;
}
finally
var statement = objectCreation.FirstAncestorOrSelf<TStatementSyntax>();
var newStatement = GetNewStatement(statement, objectCreation, matches.Value)
.WithAdditionalAnnotations(Formatter.Annotation);
var subEditor = new SyntaxEditor(currentRoot, workspace);
subEditor.ReplaceNode(statement, newStatement);
foreach (var match in matches)
{
analyzer.Free();
subEditor.RemoveNode(match.Statement);
}
document = document.WithSyntaxRoot(subEditor.GetChangedRoot());
semanticModel = await document.GetSemanticModelAsync(cancellationToken).ConfigureAwait(false);
currentRoot = await document.GetSyntaxRootAsync(cancellationToken).ConfigureAwait(false);
}
editor.ReplaceNode(editor.OriginalRoot, currentRoot);
......
......@@ -70,39 +70,30 @@ private void AnalyzeNode(SyntaxNodeAnalysisContext context)
}
var syntaxFacts = GetSyntaxFactsService();
var analyzer = ObjectCreationExpressionAnalyzer<TExpressionSyntax, TStatementSyntax, TObjectCreationExpressionSyntax, TMemberAccessExpressionSyntax, TAssignmentStatementSyntax, TVariableDeclaratorSyntax>.Allocate();
analyzer.Initialize(context.SemanticModel, syntaxFacts, objectCreationExpression, context.CancellationToken);
var matches = ObjectCreationExpressionAnalyzer<TExpressionSyntax, TStatementSyntax, TObjectCreationExpressionSyntax, TMemberAccessExpressionSyntax, TAssignmentStatementSyntax, TVariableDeclaratorSyntax>.Analyze(
context.SemanticModel, syntaxFacts, objectCreationExpression, context.CancellationToken);
try
if (matches == null || matches.Value.Length == 0)
{
var result = analyzer.Analyze();
if (result == null || result.Value.Length == 0)
{
return;
}
return;
}
var containingStatement = objectCreationExpression.FirstAncestorOrSelf<TStatementSyntax>();
var nodes = ImmutableArray.Create<SyntaxNode>(containingStatement).AddRange(result.Value.Select(m => m.Statement));
if (syntaxFacts.ContainsInterleavedDirective(nodes, cancellationToken))
{
return;
}
var containingStatement = objectCreationExpression.FirstAncestorOrSelf<TStatementSyntax>();
var nodes = ImmutableArray.Create<SyntaxNode>(containingStatement).AddRange(matches.Value.Select(m => m.Statement));
if (syntaxFacts.ContainsInterleavedDirective(nodes, cancellationToken))
{
return;
}
var locations = ImmutableArray.Create(objectCreationExpression.GetLocation());
var locations = ImmutableArray.Create(objectCreationExpression.GetLocation());
var severity = option.Notification.Value;
context.ReportDiagnostic(Diagnostic.Create(
CreateDescriptorWithSeverity(severity),
objectCreationExpression.GetLocation(),
additionalLocations: locations));
var severity = option.Notification.Value;
context.ReportDiagnostic(Diagnostic.Create(
CreateDescriptorWithSeverity(severity),
objectCreationExpression.GetLocation(),
additionalLocations: locations));
FadeOutCode(context, optionSet, result.Value, locations);
}
finally
{
analyzer.Free();
}
FadeOutCode(context, optionSet, matches.Value, locations);
}
private void FadeOutCode(
......
// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Threading;
using Microsoft.CodeAnalysis.LanguageServices;
using Microsoft.CodeAnalysis.UseCollectionInitializer;
using Roslyn.Utilities;
......@@ -26,17 +29,27 @@ internal class ObjectCreationExpressionAnalyzer<
= new ObjectPool<ObjectCreationExpressionAnalyzer<TExpressionSyntax, TStatementSyntax, TObjectCreationExpressionSyntax, TMemberAccessExpressionSyntax, TAssignmentStatementSyntax, TVariableDeclaratorSyntax>>(
() => new ObjectCreationExpressionAnalyzer<TExpressionSyntax, TStatementSyntax, TObjectCreationExpressionSyntax, TMemberAccessExpressionSyntax, TAssignmentStatementSyntax, TVariableDeclaratorSyntax>());
public static ObjectCreationExpressionAnalyzer<TExpressionSyntax, TStatementSyntax, TObjectCreationExpressionSyntax, TMemberAccessExpressionSyntax, TAssignmentStatementSyntax, TVariableDeclaratorSyntax> Allocate()
=> s_pool.Allocate();
private ObjectCreationExpressionAnalyzer()
{
}
public void Free()
public static ImmutableArray<Match<TExpressionSyntax, TStatementSyntax, TMemberAccessExpressionSyntax, TAssignmentStatementSyntax>>? Analyze(
SemanticModel semanticModel,
ISyntaxFactsService syntaxFacts,
TObjectCreationExpressionSyntax objectCreationExpression,
CancellationToken cancellationToken)
{
this.Clear();
s_pool.Free(this);
var analyzer = s_pool.Allocate();
analyzer.Initialize(semanticModel, syntaxFacts, objectCreationExpression, cancellationToken);
try
{
return analyzer.AnalyzeWorker();
}
finally
{
analyzer.Clear();
s_pool.Free(analyzer);
}
}
protected override void AddMatches(ArrayBuilder<Match<TExpressionSyntax, TStatementSyntax, TMemberAccessExpressionSyntax, TAssignmentStatementSyntax>> matches)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册