提交 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()
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)]
public async Task TypeNameMatchesFileName_RenameFile()
{
......@@ -31,7 +45,7 @@ public async Task TypeNameMatchesFileName_RenameFile()
}
[WpfFact, Trait(Traits.Feature, Traits.Features.CodeActionsMoveType)]
public async Task MoreThanOneTypeInFile_RenameFile()
public async Task MoreThanOneTopLevelTypeInFile_RenameFile()
{
var code =
@"[||]class Class1 { }
......
......@@ -20,6 +20,24 @@ public async Task SingleClassInFile_RenameType()
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)]
public async Task TypeNameMatchesFileName_RenameType()
{
......@@ -32,7 +50,7 @@ public async Task TypeNameMatchesFileName_RenameType()
}
[WpfFact, Trait(Traits.Feature, Traits.Features.CodeActionsMoveType)]
public async Task MoreThanOneTypeInFile_RenameType()
public async Task MoreThanOneTopLevelTypeInFile_RenameType()
{
var code =
@"[||]class Class1 { }
......
......@@ -41,10 +41,10 @@ protected virtual SyntaxNode GetNodeToAnalyze(SyntaxNode root, TextSpan span)
/// <summary>
/// checks if there is a single top level type declaration in a document
/// </summary>
private bool IsSingleTypeDeclarationInSourceDocument(SyntaxNode root) =>
root.DescendantNodes()
private bool MultipleTopLevelTypeDeclarationInSourceDocument(SyntaxNode root) =>
root.DescendantNodes(n => (n is TCompilationUnitSyntax || n is TNamespaceDeclarationSyntax))
.OfType<TTypeDeclarationSyntax>()
.Count() == 1;
.Count() > 1;
public async Task<CodeRefactoring> GetRefactoringAsync(Document document, TextSpan textSpan, CancellationToken cancellationToken)
{
......@@ -73,9 +73,15 @@ public async Task<CodeRefactoring> GetRefactoringAsync(Document document, TextSp
private List<CodeAction> CreateActions(State state, CancellationToken cancellationToken)
{
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
// 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
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;
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册