Skip to content

Commit 9d45411

Browse files
committed
Put extracted interfaces in same folder as the origin
1 parent be89af3 commit 9d45411

File tree

2 files changed

+60
-1
lines changed

2 files changed

+60
-1
lines changed

Rubberduck.Refactorings/ExtractInterface/ExtractInterfaceRefactoringAction.cs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,10 +74,17 @@ private static string InterfaceModuleBody(ExtractInterfaceModel model)
7474
{
7575
var interfaceMembers = string.Join(Environment.NewLine, model.SelectedMembers.Select(m => m.Body));
7676
var optionExplicit = $"{Tokens.Option} {Tokens.Explicit}{Environment.NewLine}";
77+
78+
var targetModule = Declaration.GetModuleParent(model.TargetDeclaration);
79+
var folderAnnotation = targetModule?.Annotations.FirstOrDefault(pta => pta.Annotation is FolderAnnotation);
80+
var folderAnnotationText = folderAnnotation != null
81+
? $"'@{folderAnnotation.Context.GetText()}{Environment.NewLine}"
82+
: string.Empty;
83+
7784
var interfaceAnnotation = new InterfaceAnnotation();
7885
var interfaceAnnotationText = $"'@{interfaceAnnotation.Name}{Environment.NewLine}";
7986

80-
return $"{optionExplicit}{Environment.NewLine}{interfaceAnnotationText}{Environment.NewLine}{interfaceMembers}";
87+
return $"{optionExplicit}{Environment.NewLine}{folderAnnotationText}{interfaceAnnotationText}{Environment.NewLine}{interfaceMembers}";
8188
}
8289

8390
private void AddImplementsStatement(ExtractInterfaceModel model, IRewriteSession rewriteSession)

RubberduckTests/Refactoring/ExtractInterfaceTests.cs

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -652,6 +652,58 @@ End Sub
652652
Assert.AreEqual(expectedInterfaceCode, actualInterfaceCode);
653653
}
654654

655+
[Test]
656+
[Category("Refactorings")]
657+
[Category("Extract Interface")]
658+
public void ExtractInterfaceRefactoring_PutsInterfaceInFolderOfClassItIsExtractedFrom()
659+
{
660+
//Input
661+
const string inputCode =
662+
@"'@Folder(""MyFolder.MySubFolder"")
663+
664+
Public Sub Foo(ByVal arg1 As Integer, ByVal arg2 As String)
665+
End Sub";
666+
var selection = new Selection(1, 23, 1, 27);
667+
668+
//Expectation
669+
const string expectedCode =
670+
@"Implements IClass
671+
672+
'@Folder(""MyFolder.MySubFolder"")
673+
674+
Public Sub Foo(ByVal arg1 As Integer, ByVal arg2 As String)
675+
End Sub
676+
677+
Private Sub IClass_Foo(ByVal arg1 As Integer, ByVal arg2 As String)
678+
Err.Raise 5 'TODO implement interface member
679+
End Sub
680+
";
681+
682+
const string expectedInterfaceCode =
683+
@"Option Explicit
684+
685+
'@Folder(""MyFolder.MySubFolder"")
686+
'@Interface
687+
688+
Public Sub Foo(ByVal arg1 As Integer, ByVal arg2 As String)
689+
End Sub
690+
";
691+
Func<ExtractInterfaceModel, ExtractInterfaceModel> presenterAction = model =>
692+
{
693+
foreach (var interfaceMember in model.Members)
694+
{
695+
interfaceMember.IsSelected = true;
696+
}
697+
698+
return model;
699+
};
700+
701+
var actualCode = RefactoredCode("Class", selection, presenterAction, null, false, ("Class", inputCode, ComponentType.ClassModule));
702+
Assert.AreEqual(expectedCode, actualCode["Class"]);
703+
var actualInterfaceCode = actualCode[actualCode.Keys.Single(componentName => !componentName.Equals("Class"))];
704+
Assert.AreEqual(expectedInterfaceCode, actualInterfaceCode);
705+
}
706+
655707
protected override IRefactoring TestRefactoring(IRewritingManager rewritingManager, RubberduckParserState state, IRefactoringPresenterFactory factory, ISelectionService selectionService)
656708
{
657709
var uiDispatcherMock = new Mock<IUiDispatcher>();

0 commit comments

Comments
 (0)