提交 d4d0b1d5 编写于 作者: S Shyam N

Merge pull request #1896 from shyamnamboodiripad/MissingSimplifierAnnotationInAddUsing

Add simplifier annotation as part of Add Using fix

Fixes #1893
...@@ -1927,6 +1927,49 @@ public void TestAddUsingForField() ...@@ -1927,6 +1927,49 @@ public void TestAddUsingForField()
@"using System ; using System . Collections . Generic ; using System . Linq ; using System . Threading . Tasks ; using A ; class Program { public B B { get { return B . Instance ; } } } namespace A { public class B { public static readonly B Instance ; } } "); @"using System ; using System . Collections . Generic ; using System . Linq ; using System . Threading . Tasks ; using A ; class Program { public B B { get { return B . Instance ; } } } namespace A { public class B { public static readonly B Instance ; } } ");
} }
[WorkItem(1893, "https://github.com/dotnet/roslyn/issues/1893")]
[Fact, Trait(Traits.Feature, Traits.Features.CodeActionsAddUsing)]
public void TestNameSimplification()
{
// Generated using directive must be simplified from "using A.B;" to "using B;" below.
Test(
@"
namespace A.B
{
class T1 { }
}
namespace A.C
{
using System;
class T2
{
void Test()
{
Console.WriteLine();
[|T1|] t1;
}
}
}",
@"
namespace A.B
{
class T1 { }
}
namespace A.C
{
using System;
using B;
class T2
{
void Test()
{
Console.WriteLine();
T1 t1;
}
}
}");
}
public partial class AddUsingTestsWithAddImportDiagnosticProvider : AbstractCSharpDiagnosticProviderBasedUserDiagnosticTest public partial class AddUsingTestsWithAddImportDiagnosticProvider : AbstractCSharpDiagnosticProviderBasedUserDiagnosticTest
{ {
internal override Tuple<DiagnosticAnalyzer, CodeFixProvider> CreateDiagnosticProviderAndFixer(Workspace workspace) internal override Tuple<DiagnosticAnalyzer, CodeFixProvider> CreateDiagnosticProviderAndFixer(Workspace workspace)
......
// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. // 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.Generic;
using System.Collections.Immutable; using System.Collections.Immutable;
using System.Composition; using System.Composition;
...@@ -10,12 +9,10 @@ ...@@ -10,12 +9,10 @@
using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CodeFixes; using Microsoft.CodeAnalysis.CodeFixes;
using Microsoft.CodeAnalysis.CodeFixes.AddImport; using Microsoft.CodeAnalysis.CodeFixes.AddImport;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.CSharp.Extensions; using Microsoft.CodeAnalysis.CSharp.Extensions;
using Microsoft.CodeAnalysis.CSharp.Symbols; using Microsoft.CodeAnalysis.CSharp.Symbols;
using Microsoft.CodeAnalysis.CSharp.Syntax; using Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.CodeAnalysis.CSharp.Utilities; using Microsoft.CodeAnalysis.CSharp.Utilities;
using Microsoft.CodeAnalysis.FindSymbols;
using Microsoft.CodeAnalysis.Formatting; using Microsoft.CodeAnalysis.Formatting;
using Microsoft.CodeAnalysis.LanguageServices; using Microsoft.CodeAnalysis.LanguageServices;
using Microsoft.CodeAnalysis.Shared.Extensions; using Microsoft.CodeAnalysis.Shared.Extensions;
...@@ -491,7 +488,7 @@ private UsingDirectiveSyntax GetUsingDirective(CompilationUnitSyntax root, IName ...@@ -491,7 +488,7 @@ private UsingDirectiveSyntax GetUsingDirective(CompilationUnitSyntax root, IName
{ {
if (TryGetNamespaceString(namespaceSymbol, root, false, externAliasString, out namespaceString)) if (TryGetNamespaceString(namespaceSymbol, root, false, externAliasString, out namespaceString))
{ {
return SyntaxFactory.UsingDirective(SyntaxFactory.ParseName(namespaceString)); return SyntaxFactory.UsingDirective(SyntaxFactory.ParseName(namespaceString).WithAdditionalAnnotations(Simplifier.Annotation));
} }
return null; return null;
...@@ -499,7 +496,7 @@ private UsingDirectiveSyntax GetUsingDirective(CompilationUnitSyntax root, IName ...@@ -499,7 +496,7 @@ private UsingDirectiveSyntax GetUsingDirective(CompilationUnitSyntax root, IName
if (TryGetNamespaceString(namespaceSymbol, root, fullyQualify, null, out namespaceString)) if (TryGetNamespaceString(namespaceSymbol, root, fullyQualify, null, out namespaceString))
{ {
return SyntaxFactory.UsingDirective(SyntaxFactory.ParseName(namespaceString)); return SyntaxFactory.UsingDirective(SyntaxFactory.ParseName(namespaceString).WithAdditionalAnnotations(Simplifier.Annotation));
} }
} }
...@@ -512,7 +509,7 @@ private UsingDirectiveSyntax GetUsingDirective(CompilationUnitSyntax root, IName ...@@ -512,7 +509,7 @@ private UsingDirectiveSyntax GetUsingDirective(CompilationUnitSyntax root, IName
SyntaxFactory.Token(SyntaxKind.UsingKeyword), SyntaxFactory.Token(SyntaxKind.UsingKeyword),
SyntaxFactory.Token(SyntaxKind.StaticKeyword), SyntaxFactory.Token(SyntaxKind.StaticKeyword),
null, null,
SyntaxFactory.ParseName(staticNamespaceString), SyntaxFactory.ParseName(staticNamespaceString).WithAdditionalAnnotations(Simplifier.Annotation),
SyntaxFactory.Token(SyntaxKind.SemicolonToken)); SyntaxFactory.Token(SyntaxKind.SemicolonToken));
} }
} }
......
...@@ -8,6 +8,7 @@ Imports Microsoft.CodeAnalysis.CodeFixes ...@@ -8,6 +8,7 @@ Imports Microsoft.CodeAnalysis.CodeFixes
Imports Microsoft.CodeAnalysis.CodeFixes.AddImport Imports Microsoft.CodeAnalysis.CodeFixes.AddImport
Imports Microsoft.CodeAnalysis.Formatting Imports Microsoft.CodeAnalysis.Formatting
Imports Microsoft.CodeAnalysis.LanguageServices Imports Microsoft.CodeAnalysis.LanguageServices
Imports Microsoft.CodeAnalysis.Simplification
Imports Microsoft.CodeAnalysis.VisualBasic.Syntax Imports Microsoft.CodeAnalysis.VisualBasic.Syntax
Namespace Microsoft.CodeAnalysis.VisualBasic.CodeFixes.AddImport Namespace Microsoft.CodeAnalysis.VisualBasic.CodeFixes.AddImport
...@@ -282,7 +283,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.CodeFixes.AddImport ...@@ -282,7 +283,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.CodeFixes.AddImport
placeSystemNamespaceFirst As Boolean, placeSystemNamespaceFirst As Boolean,
cancellationToken As CancellationToken) As Task(Of Document) cancellationToken As CancellationToken) As Task(Of Document)
Dim memberImportsClause = Dim memberImportsClause =
SyntaxFactory.SimpleImportsClause(name:=DirectCast(symbol.GenerateTypeSyntax(addGlobal:=False), NameSyntax)) SyntaxFactory.SimpleImportsClause(name:=DirectCast(symbol.GenerateTypeSyntax(addGlobal:=False), NameSyntax).WithAdditionalAnnotations(Simplifier.Annotation))
Dim newImport = SyntaxFactory.ImportsStatement( Dim newImport = SyntaxFactory.ImportsStatement(
importsClauses:=SyntaxFactory.SingletonSeparatedList(Of ImportsClauseSyntax)(memberImportsClause)) importsClauses:=SyntaxFactory.SingletonSeparatedList(Of ImportsClauseSyntax)(memberImportsClause))
......
...@@ -3,15 +3,11 @@ ...@@ -3,15 +3,11 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Threading; using System.Threading;
using Microsoft.CodeAnalysis.CodeGeneration;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.CSharp.Extensions; using Microsoft.CodeAnalysis.CSharp.Extensions;
using Microsoft.CodeAnalysis.CSharp.Symbols;
using Microsoft.CodeAnalysis.CSharp.Syntax; using Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.CodeAnalysis.Formatting; using Microsoft.CodeAnalysis.Formatting;
using Microsoft.CodeAnalysis.Shared.Extensions; using Microsoft.CodeAnalysis.Shared.Extensions;
using Microsoft.CodeAnalysis.Text; using Microsoft.CodeAnalysis.Simplification;
using Roslyn.Utilities;
namespace Microsoft.CodeAnalysis.CSharp.CodeGeneration namespace Microsoft.CodeAnalysis.CSharp.CodeGeneration
{ {
...@@ -41,7 +37,7 @@ private IList<UsingDirectiveSyntax> CreateDirectives(IList<INamespaceSymbol> nam ...@@ -41,7 +37,7 @@ private IList<UsingDirectiveSyntax> CreateDirectives(IList<INamespaceSymbol> nam
var usingDirectives = var usingDirectives =
from n in namespaces from n in namespaces
let displayString = n.ToDisplayString(SymbolDisplayFormats.NameFormat) let displayString = n.ToDisplayString(SymbolDisplayFormats.NameFormat)
let name = SyntaxFactory.ParseName(displayString) let name = SyntaxFactory.ParseName(displayString).WithAdditionalAnnotations(Simplifier.Annotation)
select SyntaxFactory.UsingDirective(name); select SyntaxFactory.UsingDirective(name);
return usingDirectives.ToList(); return usingDirectives.ToList();
......
' Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. ' Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
Imports System.Collections.Generic
Imports System.Linq
Imports System.Threading Imports System.Threading
Imports System.Threading.Tasks Imports System.Threading.Tasks
Imports Microsoft.CodeAnalysis Imports Microsoft.CodeAnalysis
Imports Microsoft.CodeAnalysis.CaseCorrection Imports Microsoft.CodeAnalysis.CaseCorrection
Imports Microsoft.CodeAnalysis.CodeGeneration Imports Microsoft.CodeAnalysis.CodeGeneration
Imports Microsoft.CodeAnalysis.Formatting Imports Microsoft.CodeAnalysis.Formatting
Imports Microsoft.CodeAnalysis.Shared.Extensions Imports Microsoft.CodeAnalysis.Simplification
Imports Microsoft.CodeAnalysis.Text
Imports Microsoft.CodeAnalysis.VisualBasic
Imports Microsoft.CodeAnalysis.VisualBasic.Extensions
Imports Microsoft.CodeAnalysis.VisualBasic.Symbols
Imports Microsoft.CodeAnalysis.VisualBasic.Syntax Imports Microsoft.CodeAnalysis.VisualBasic.Syntax
Imports Roslyn.Utilities
Namespace Microsoft.CodeAnalysis.VisualBasic.CodeGeneration Namespace Microsoft.CodeAnalysis.VisualBasic.CodeGeneration
Friend Class ImportsStatementsAdder Friend Class ImportsStatementsAdder
...@@ -45,7 +38,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.CodeGeneration ...@@ -45,7 +38,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.CodeGeneration
Private Overloads Function GetExistingNamespaces(semanticModel As SemanticModel, namespaceDeclaration As NamespaceBlockSyntax, cancellationToken As CancellationToken) As IList(Of INamespaceSymbol) Private Overloads Function GetExistingNamespaces(semanticModel As SemanticModel, namespaceDeclaration As NamespaceBlockSyntax, cancellationToken As CancellationToken) As IList(Of INamespaceSymbol)
Dim namespaceSymbol = TryCast(semanticModel.GetDeclaredSymbol(namespaceDeclaration, cancellationToken), INamespaceSymbol) Dim namespaceSymbol = TryCast(semanticModel.GetDeclaredSymbol(namespaceDeclaration, cancellationToken), INamespaceSymbol)
Dim namespaceImports = GetContainingNamespacesAndThis(NamespaceSymbol).ToList() Dim namespaceImports = GetContainingNamespacesAndThis(namespaceSymbol).ToList()
Dim outerNamespaces = Me.GetExistingNamespaces(semanticModel, namespaceDeclaration.Parent, cancellationToken) Dim outerNamespaces = Me.GetExistingNamespaces(semanticModel, namespaceDeclaration.Parent, cancellationToken)
...@@ -91,7 +84,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.CodeGeneration ...@@ -91,7 +84,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.CodeGeneration
Dim usingDirectives = Dim usingDirectives =
From n In importsContainerToMissingNamespaces.Values.Flatten From n In importsContainerToMissingNamespaces.Values.Flatten
Let name = DirectCast(n.GenerateTypeSyntax(addGlobal:=False), NameSyntax) Let name = DirectCast(n.GenerateTypeSyntax(addGlobal:=False), NameSyntax).WithAdditionalAnnotations(Simplifier.Annotation)
Select SyntaxFactory.ImportsStatement( Select SyntaxFactory.ImportsStatement(
importsClauses:=SyntaxFactory.SingletonSeparatedList(Of ImportsClauseSyntax)(SyntaxFactory.SimpleImportsClause(name))) importsClauses:=SyntaxFactory.SingletonSeparatedList(Of ImportsClauseSyntax)(SyntaxFactory.SimpleImportsClause(name)))
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册