提交 4fc33051 编写于 作者: B Balaji Krishnan

Fix a bug and add tests.

We didn't offer move type to new file if there was a single outer type
in a document with a nested type in it. Move to new file should be
offered for the nested type here.
上级 bf949837
...@@ -19,6 +19,20 @@ public async Task SingleClassInFile_RenameFile() ...@@ -19,6 +19,20 @@ public async Task SingleClassInFile_RenameFile()
await TestRenameFileToMatchTypeAsync(code, expectedDocumentName); await TestRenameFileToMatchTypeAsync(code, expectedDocumentName);
} }
[WpfFact, Trait(Traits.Feature, Traits.Features.CodeActionsMoveType)]
public async Task MoreThanOneTypeInFile_RenameFile()
{
var code =
@"[||]class Class1
{
class Inner { }
}";
var expectedDocumentName = "Class1.cs";
await TestRenameFileToMatchTypeAsync(code, expectedDocumentName);
}
[WpfFact, Trait(Traits.Feature, Traits.Features.CodeActionsMoveType)] [WpfFact, Trait(Traits.Feature, Traits.Features.CodeActionsMoveType)]
public async Task TypeNameMatchesFileName_RenameFile() public async Task TypeNameMatchesFileName_RenameFile()
{ {
...@@ -31,7 +45,7 @@ public async Task TypeNameMatchesFileName_RenameFile() ...@@ -31,7 +45,7 @@ public async Task TypeNameMatchesFileName_RenameFile()
} }
[WpfFact, Trait(Traits.Feature, Traits.Features.CodeActionsMoveType)] [WpfFact, Trait(Traits.Feature, Traits.Features.CodeActionsMoveType)]
public async Task MoreThanOneTypeInFile_RenameFile() public async Task MoreThanOneTopLevelTypeInFile_RenameFile()
{ {
var code = var code =
@"[||]class Class1 { } @"[||]class Class1 { }
......
...@@ -20,6 +20,24 @@ public async Task SingleClassInFile_RenameType() ...@@ -20,6 +20,24 @@ public async Task SingleClassInFile_RenameType()
await TestRenameTypeToMatchFileAsync(code, codeWithTypeRenamedToMatchFileName); await TestRenameTypeToMatchFileAsync(code, codeWithTypeRenamedToMatchFileName);
} }
[WpfFact, Trait(Traits.Feature, Traits.Features.CodeActionsMoveType)]
public async Task MoreThanOneTypeInFile_RenameType()
{
var code =
@"[||]class Class1
{
class Inner { }
}";
var codeWithTypeRenamedToMatchFileName =
@"class [|test1|]
{
class Inner { }
}";
await TestRenameTypeToMatchFileAsync(code, codeWithTypeRenamedToMatchFileName);
}
[WpfFact, Trait(Traits.Feature, Traits.Features.CodeActionsMoveType)] [WpfFact, Trait(Traits.Feature, Traits.Features.CodeActionsMoveType)]
public async Task TypeNameMatchesFileName_RenameType() public async Task TypeNameMatchesFileName_RenameType()
{ {
...@@ -32,7 +50,7 @@ public async Task TypeNameMatchesFileName_RenameType() ...@@ -32,7 +50,7 @@ public async Task TypeNameMatchesFileName_RenameType()
} }
[WpfFact, Trait(Traits.Feature, Traits.Features.CodeActionsMoveType)] [WpfFact, Trait(Traits.Feature, Traits.Features.CodeActionsMoveType)]
public async Task MoreThanOneTypeInFile_RenameType() public async Task MoreThanOneTopLevelTypeInFile_RenameType()
{ {
var code = var code =
@"[||]class Class1 { } @"[||]class Class1 { }
......
...@@ -41,10 +41,10 @@ protected virtual SyntaxNode GetNodeToAnalyze(SyntaxNode root, TextSpan span) ...@@ -41,10 +41,10 @@ protected virtual SyntaxNode GetNodeToAnalyze(SyntaxNode root, TextSpan span)
/// <summary> /// <summary>
/// checks if there is a single top level type declaration in a document /// checks if there is a single top level type declaration in a document
/// </summary> /// </summary>
private bool IsSingleTypeDeclarationInSourceDocument(SyntaxNode root) => private bool MultipleTopLevelTypeDeclarationInSourceDocument(SyntaxNode root) =>
root.DescendantNodes() root.DescendantNodes(n => (n is TCompilationUnitSyntax || n is TNamespaceDeclarationSyntax))
.OfType<TTypeDeclarationSyntax>() .OfType<TTypeDeclarationSyntax>()
.Count() == 1; .Count() > 1;
public async Task<CodeRefactoring> GetRefactoringAsync(Document document, TextSpan textSpan, CancellationToken cancellationToken) public async Task<CodeRefactoring> GetRefactoringAsync(Document document, TextSpan textSpan, CancellationToken cancellationToken)
{ {
...@@ -73,9 +73,15 @@ public async Task<CodeRefactoring> GetRefactoringAsync(Document document, TextSp ...@@ -73,9 +73,15 @@ public async Task<CodeRefactoring> GetRefactoringAsync(Document document, TextSp
private List<CodeAction> CreateActions(State state, CancellationToken cancellationToken) private List<CodeAction> CreateActions(State state, CancellationToken cancellationToken)
{ {
var actions = new List<CodeAction>(); var actions = new List<CodeAction>();
var singleType = IsSingleTypeDeclarationInSourceDocument(state.SemanticDocument.Root); var manyTypes = MultipleTopLevelTypeDeclarationInSourceDocument(state.SemanticDocument.Root);
if (singleType) if (manyTypes || IsNestedType(state.TypeNode))
{
// If there are multiple type declarations in current document. offer, move to new file.
// Or if this is a nested type, offer to move to new file.
actions.Add(GetCodeAction(state, operationKind: OperationKind.MoveType));
}
else
{ {
// one type declaration in current document. No moving around required, just sync // one type declaration in current document. No moving around required, just sync
// document name and type name by offering rename in both directions between type and document. // document name and type name by offering rename in both directions between type and document.
...@@ -88,11 +94,6 @@ private List<CodeAction> CreateActions(State state, CancellationToken cancellati ...@@ -88,11 +94,6 @@ private List<CodeAction> CreateActions(State state, CancellationToken cancellati
actions.Add(GetCodeAction(state, operationKind: OperationKind.RenameType)); actions.Add(GetCodeAction(state, operationKind: OperationKind.RenameType));
} }
} }
else
{
// multiple type declarations in current document. so, move to new file.
actions.Add(GetCodeAction(state, operationKind: OperationKind.MoveType));
}
return actions; return actions;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册