-
Notifications
You must be signed in to change notification settings - Fork 4k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Pass per-document options when organizing imports or usings #17347
Merged
jmarolf
merged 3 commits into
dotnet:master
from
jmarolf:bugfix/have-add-imports-check-option
Feb 24, 2017
Merged
Changes from 2 commits
Commits
File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -3,7 +3,9 @@ | |
using System.Linq; | ||
using System.Threading.Tasks; | ||
using Microsoft.CodeAnalysis.CSharp; | ||
using Microsoft.CodeAnalysis.Editing; | ||
using Microsoft.CodeAnalysis.Editor.UnitTests.Workspaces; | ||
using Microsoft.CodeAnalysis.Options; | ||
using Microsoft.CodeAnalysis.OrganizeImports; | ||
using Roslyn.Test.Utilities; | ||
using Xunit; | ||
|
@@ -12,28 +14,31 @@ namespace Microsoft.CodeAnalysis.Editor.CSharp.UnitTests.Organizing | |
{ | ||
public class OrganizeUsingsTests | ||
{ | ||
protected async Task CheckAsync(string initial, string final, bool specialCaseSystem, CSharpParseOptions options = null) | ||
protected async Task CheckAsync(string initial, string final, bool placeSystemNamespaceFirst = false, CSharpParseOptions options = null) | ||
{ | ||
using (var workspace = await TestWorkspace.CreateCSharpAsync(initial)) | ||
{ | ||
var document = workspace.CurrentSolution.GetDocument(workspace.Documents.First().Id); | ||
var newRoot = await (await OrganizeImportsService.OrganizeImportsAsync(document, specialCaseSystem)).GetSyntaxRootAsync(); | ||
var workspaceOptions = workspace.Options; | ||
var newOptionSet = workspaceOptions.WithChangedOption(new OptionKey(GenerationOptions.PlaceSystemNamespaceFirst, document.Project.Language), placeSystemNamespaceFirst); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. inline both these variables. |
||
workspace.Options = newOptionSet; | ||
var newRoot = await (await OrganizeImportsService.OrganizeImportsAsync(document)).GetSyntaxRootAsync(); | ||
Assert.Equal(final.NormalizeLineEndings(), newRoot.ToFullString()); | ||
} | ||
} | ||
|
||
[Fact, Trait(Traits.Feature, Traits.Features.Organizing)] | ||
public async Task EmptyFile() | ||
{ | ||
await CheckAsync(string.Empty, string.Empty, true); | ||
await CheckAsync(string.Empty, string.Empty); | ||
} | ||
|
||
[Fact, Trait(Traits.Feature, Traits.Features.Organizing)] | ||
public async Task SingleUsingStatement() | ||
{ | ||
var initial = @"using A;"; | ||
var final = initial; | ||
await CheckAsync(initial, final, true); | ||
await CheckAsync(initial, final); | ||
} | ||
|
||
[Fact, Trait(Traits.Feature, Traits.Features.Organizing)] | ||
|
@@ -52,7 +57,7 @@ public async Task AliasesAtBottom() | |
using D = E; | ||
"; | ||
|
||
await CheckAsync(initial, final, false); | ||
await CheckAsync(initial, final); | ||
} | ||
|
||
[Fact, Trait(Traits.Feature, Traits.Features.Organizing)] | ||
|
@@ -77,7 +82,7 @@ public async Task UsingStaticsBetweenUsingsAndAliases() | |
using D = E; | ||
"; | ||
|
||
await CheckAsync(initial, final, false); | ||
await CheckAsync(initial, final); | ||
} | ||
|
||
[Fact, Trait(Traits.Feature, Traits.Features.Organizing)] | ||
|
@@ -162,7 +167,7 @@ namespace N5 | |
using N; | ||
} | ||
}"; | ||
await CheckAsync(initial, final, true); | ||
await CheckAsync(initial, final); | ||
} | ||
|
||
[Fact, Trait(Traits.Feature, Traits.Features.Organizing)] | ||
|
@@ -180,7 +185,7 @@ public async Task SpecialCaseSystem() | |
using M1; | ||
using M2; | ||
"; | ||
await CheckAsync(initial, final, true); | ||
await CheckAsync(initial, final, placeSystemNamespaceFirst: true); | ||
} | ||
|
||
[Fact, Trait(Traits.Feature, Traits.Features.Organizing)] | ||
|
@@ -202,7 +207,7 @@ public async Task SpecialCaseSystemWithUsingStatic() | |
using static System.BitConverter; | ||
using static Microsoft.Win32.Registry; | ||
"; | ||
await CheckAsync(initial, final, true); | ||
await CheckAsync(initial, final, placeSystemNamespaceFirst: true); | ||
} | ||
|
||
[Fact, Trait(Traits.Feature, Traits.Features.Organizing)] | ||
|
@@ -221,7 +226,7 @@ public async Task DoNotSpecialCaseSystem() | |
using System.Linq; | ||
"; | ||
|
||
await CheckAsync(initial, final, false); | ||
await CheckAsync(initial, final); | ||
} | ||
|
||
[Fact, Trait(Traits.Feature, Traits.Features.Organizing)] | ||
|
@@ -242,7 +247,7 @@ public async Task DoNotSpecialCaseSystemWithUsingStatics() | |
using System.Linq; | ||
using static Microsoft.Win32.Registry; | ||
using static System.BitConverter;"; | ||
await CheckAsync(initial, final, false); | ||
await CheckAsync(initial, final); | ||
} | ||
|
||
[Fact, Trait(Traits.Feature, Traits.Features.Organizing)] | ||
|
@@ -276,7 +281,7 @@ namespace U { } | |
namespace V.W { } | ||
namespace X.Y.Z { }"; | ||
|
||
await CheckAsync(initial, final, true); | ||
await CheckAsync(initial, final); | ||
} | ||
|
||
[Fact, Trait(Traits.Feature, Traits.Features.Organizing)] | ||
|
@@ -302,7 +307,7 @@ namespace B { }"; | |
namespace A { } | ||
namespace B { }"; | ||
|
||
await CheckAsync(initial, final, true); | ||
await CheckAsync(initial, final); | ||
} | ||
|
||
[Fact, Trait(Traits.Feature, Traits.Features.Organizing)] | ||
|
@@ -328,7 +333,7 @@ namespace B { }"; | |
namespace A { } | ||
namespace B { }"; | ||
|
||
await CheckAsync(initial, final, true); | ||
await CheckAsync(initial, final); | ||
} | ||
|
||
[Fact, Trait(Traits.Feature, Traits.Features.Organizing)] | ||
|
@@ -354,7 +359,7 @@ namespace B { }"; | |
namespace A { } | ||
namespace B { }"; | ||
|
||
await CheckAsync(initial, final, true); | ||
await CheckAsync(initial, final); | ||
} | ||
|
||
[WorkItem(2480, "https://github.com/dotnet/roslyn/issues/2480")] | ||
|
@@ -379,7 +384,7 @@ namespace B { }"; | |
namespace A { } | ||
namespace B { }"; | ||
|
||
await CheckAsync(initial, final, true); | ||
await CheckAsync(initial, final); | ||
} | ||
|
||
[WorkItem(2480, "https://github.com/dotnet/roslyn/issues/2480")] | ||
|
@@ -404,7 +409,7 @@ namespace B { }"; | |
namespace A { } | ||
namespace B { }"; | ||
|
||
await CheckAsync(initial, final, true); | ||
await CheckAsync(initial, final); | ||
} | ||
|
||
[WorkItem(2480, "https://github.com/dotnet/roslyn/issues/2480")] | ||
|
@@ -429,7 +434,7 @@ namespace B { }"; | |
namespace A { } | ||
namespace B { }"; | ||
|
||
await CheckAsync(initial, final, true); | ||
await CheckAsync(initial, final); | ||
} | ||
|
||
[WorkItem(2480, "https://github.com/dotnet/roslyn/issues/2480")] | ||
|
@@ -454,7 +459,7 @@ public async Task CommentsNotAtTheStartOfTheFile1() | |
using System.Text; | ||
}"; | ||
|
||
await CheckAsync(initial, final, true); | ||
await CheckAsync(initial, final); | ||
} | ||
|
||
[WorkItem(2480, "https://github.com/dotnet/roslyn/issues/2480")] | ||
|
@@ -481,7 +486,7 @@ public async Task CommentsNotAtTheStartOfTheFile2() | |
using System.Text; | ||
}"; | ||
|
||
await CheckAsync(initial, final, true); | ||
await CheckAsync(initial, final); | ||
} | ||
|
||
[Fact, Trait(Traits.Feature, Traits.Features.Organizing)] | ||
|
@@ -502,7 +507,7 @@ namespace C { } | |
namespace D { }"; | ||
|
||
var final = initial; | ||
await CheckAsync(initial, final, true); | ||
await CheckAsync(initial, final); | ||
} | ||
|
||
[Fact, Trait(Traits.Feature, Traits.Features.Organizing)] | ||
|
@@ -582,7 +587,7 @@ struct T { } | |
} | ||
}"; | ||
|
||
await CheckAsync(initial, final, true); | ||
await CheckAsync(initial, final); | ||
} | ||
|
||
[Fact, Trait(Traits.Feature, Traits.Features.Organizing)] | ||
|
@@ -594,7 +599,7 @@ public async Task DuplicateUsings() | |
|
||
var final = initial; | ||
|
||
await CheckAsync(initial, final, true); | ||
await CheckAsync(initial, final); | ||
} | ||
|
||
[Fact, Trait(Traits.Feature, Traits.Features.Organizing)] | ||
|
@@ -614,7 +619,7 @@ public async Task InlineComments() | |
/*00*/using/*01*/D/*02*/;/*03*/ | ||
/*16*/"; | ||
|
||
await CheckAsync(initial, final, true); | ||
await CheckAsync(initial, final); | ||
} | ||
|
||
[Fact, Trait(Traits.Feature, Traits.Features.Organizing)] | ||
|
@@ -628,7 +633,7 @@ public async Task AllOnOneLine() | |
using B; | ||
using C; "; | ||
|
||
await CheckAsync(initial, final, true); | ||
await CheckAsync(initial, final); | ||
} | ||
|
||
[Fact, Trait(Traits.Feature, Traits.Features.Organizing)] | ||
|
@@ -655,7 +660,7 @@ class Class1 | |
{ | ||
}"; | ||
|
||
await CheckAsync(initial, final, true); | ||
await CheckAsync(initial, final); | ||
} | ||
|
||
[Fact, Trait(Traits.Feature, Traits.Features.Organizing)] | ||
|
@@ -670,7 +675,7 @@ public async Task NestedRegionBlock() | |
|
||
var final = initial; | ||
|
||
await CheckAsync(initial, final, true); | ||
await CheckAsync(initial, final); | ||
} | ||
|
||
[Fact, Trait(Traits.Feature, Traits.Features.Organizing)] | ||
|
@@ -687,7 +692,7 @@ public async Task MultipleRegionBlocks() | |
|
||
var final = initial; | ||
|
||
await CheckAsync(initial, final, true); | ||
await CheckAsync(initial, final); | ||
} | ||
|
||
[Fact, Trait(Traits.Feature, Traits.Features.Organizing)] | ||
|
@@ -709,7 +714,7 @@ class D { }"; | |
|
||
class D { }"; | ||
|
||
await CheckAsync(initial, final, true); | ||
await CheckAsync(initial, final); | ||
} | ||
|
||
[Fact, Trait(Traits.Feature, Traits.Features.Organizing)] | ||
|
@@ -729,7 +734,7 @@ public async Task InsideIfEndIfBlock() | |
using C; | ||
#endif"; | ||
|
||
await CheckAsync(initial, final, true); | ||
await CheckAsync(initial, final); | ||
} | ||
|
||
[Fact, Trait(Traits.Feature, Traits.Features.Organizing)] | ||
|
@@ -746,7 +751,7 @@ public async Task IfEndIfBlockAbove() | |
using E;"; | ||
|
||
var final = initial; | ||
await CheckAsync(initial, final, true); | ||
await CheckAsync(initial, final); | ||
} | ||
|
||
[Fact, Trait(Traits.Feature, Traits.Features.Organizing)] | ||
|
@@ -766,7 +771,7 @@ public async Task IfEndIfBlockMiddle() | |
using G;"; | ||
|
||
var final = initial; | ||
await CheckAsync(initial, final, true); | ||
await CheckAsync(initial, final); | ||
} | ||
|
||
[Fact, Trait(Traits.Feature, Traits.Features.Organizing)] | ||
|
@@ -783,7 +788,7 @@ public async Task IfEndIfBlockBelow() | |
#endif"; | ||
|
||
var final = initial; | ||
await CheckAsync(initial, final, true); | ||
await CheckAsync(initial, final); | ||
} | ||
|
||
[Fact, Trait(Traits.Feature, Traits.Features.Organizing)] | ||
|
@@ -822,7 +827,7 @@ public async Task Korean() | |
using 하; | ||
"; | ||
|
||
await CheckAsync(initial, final, true); | ||
await CheckAsync(initial, final); | ||
} | ||
|
||
[Fact, Trait(Traits.Feature, Traits.Features.Organizing)] | ||
|
@@ -851,7 +856,7 @@ public async Task DoNotSpecialCaseSystem1() | |
using SystemZ; | ||
"; | ||
|
||
await CheckAsync(initial, final, specialCaseSystem: false); | ||
await CheckAsync(initial, final, placeSystemNamespaceFirst: false); | ||
} | ||
|
||
[Fact, Trait(Traits.Feature, Traits.Features.Organizing)] | ||
|
@@ -894,7 +899,7 @@ public async Task DoNotSpecialCaseSystem2() | |
using Z = System.Int32; | ||
"; | ||
|
||
await CheckAsync(initial, final, specialCaseSystem: false); | ||
await CheckAsync(initial, final, placeSystemNamespaceFirst: false); | ||
} | ||
|
||
[Fact, Trait(Traits.Feature, Traits.Features.Organizing)] | ||
|
@@ -987,7 +992,7 @@ public async Task CaseSensitivity1() | |
|
||
// If Kana is sensitive あ != ア, if Kana is insensitive あ == ア. | ||
// If Width is sensitiveア != ア, if Width is insensitive ア == ア."; | ||
await CheckAsync(initial, final, specialCaseSystem: true); | ||
await CheckAsync(initial, final); | ||
} | ||
|
||
[Fact, Trait(Traits.Feature, Traits.Features.Organizing)] | ||
|
@@ -1022,7 +1027,7 @@ public async Task CaseSensitivity2() | |
using ああ; | ||
"; | ||
|
||
await CheckAsync(initial, final, specialCaseSystem: true); | ||
await CheckAsync(initial, final); | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
i hate that this is optional.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I can make it required. Just saw a lot of tests passing in random true/false values even when it didn't affect the test. false is the default in VS. It seemed reasonable that only tests that were explicitly testing this behavior should change it. should parse options be non-optional as well?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
i'm ok with this being optional now :)