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

Restore merging code.

上级 4218bd1c
// 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;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Linq;
using System.Threading;
using Microsoft.CodeAnalysis.CSharp.RemoveUnnecessaryImports;
......@@ -21,9 +23,13 @@ internal sealed class CSharpRemoveUnnecessaryImportsDiagnosticAnalyzer :
new LocalizableResourceString(nameof(CSharpFeaturesResources.Using_directive_is_unnecessary), CSharpFeaturesResources.ResourceManager, typeof(CSharpFeaturesResources));
protected override LocalizableString GetTitleAndMessageFormatForClassificationIdDescriptor()
{
return s_TitleAndMessageFormat;
}
=> s_TitleAndMessageFormat;
// C# has no need to do any merging of using statements. Only VB needs to
// merge import clauses to an import statement if it all the import clauses
// are unnecessary.
protected override ImmutableArray<SyntaxNode> MergeImports(ImmutableArray<SyntaxNode> unnecessaryImports)
=> unnecessaryImports;
protected override IEnumerable<TextSpan> GetFixableDiagnosticSpans(
IEnumerable<SyntaxNode> nodes, SyntaxTree tree, CancellationToken cancellationToken)
......
......@@ -50,6 +50,7 @@ private DiagnosticDescriptor GetClassificationIdDescriptor()
}
public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics => ImmutableArray.Create(s_fixableIdDescriptor, GetClassificationIdDescriptor());
public bool OpenFileOnly(Workspace workspace) => true;
public override void Initialize(AnalysisContext context)
......@@ -70,6 +71,8 @@ private void AnalyzeSemanticModel(SemanticModelAnalysisContext context)
var unnecessaryImports = service.GetUnnecessaryImports(context.SemanticModel, root, cancellationToken);
if (unnecessaryImports.Any())
{
unnecessaryImports = MergeImports(unnecessaryImports);
Func<SyntaxNode, SyntaxToken> getLastTokenFunc = GetLastTokenDelegateForContiguousSpans();
var contiguousSpans = unnecessaryImports.GetContiguousSpans(getLastTokenFunc);
var diagnostics =
......@@ -83,6 +86,8 @@ private void AnalyzeSemanticModel(SemanticModelAnalysisContext context)
}
}
protected abstract ImmutableArray<SyntaxNode> MergeImports(ImmutableArray<SyntaxNode> unnecessaryImports);
protected virtual Func<SyntaxNode, SyntaxToken> GetLastTokenDelegateForContiguousSpans()
{
return null;
......
......@@ -5,7 +5,7 @@ Imports System.Threading
Imports Microsoft.CodeAnalysis.Diagnostics
Imports Microsoft.CodeAnalysis.RemoveUnnecessaryImports
Imports Microsoft.CodeAnalysis.Text
Imports Microsoft.CodeAnalysis.VisualBasic.RemoveUnnecessaryImports
Imports Microsoft.CodeAnalysis.VisualBasic.Syntax
Namespace Microsoft.CodeAnalysis.VisualBasic.RemoveUnnecessaryImports
......@@ -20,6 +20,24 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.RemoveUnnecessaryImports
Return s_TitleAndMessageFormat
End Function
Protected Overrides Function MergeImports(unnecessaryImports As ImmutableArray(Of SyntaxNode)) As ImmutableArray(Of SyntaxNode)
Dim result = ArrayBuilder(Of SyntaxNode).GetInstance()
Dim importsClauses = unnecessaryImports.CastArray(Of ImportsClauseSyntax)
For Each clause In importsClauses
If Not result.Contains(clause.Parent) Then
Dim statement = DirectCast(clause.Parent, ImportsStatementSyntax)
If statement.ImportsClauses.All(AddressOf importsClauses.Contains) Then
result.Add(statement)
Else
result.Add(clause)
End If
End If
Next
Return result.ToImmutableAndFree()
End Function
Protected Overrides Function GetFixableDiagnosticSpans(
nodes As IEnumerable(Of SyntaxNode), tree As SyntaxTree, cancellationToken As CancellationToken) As IEnumerable(Of TextSpan)
' Create one fixable diagnostic that contains the entire Imports list.
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册