Skip to content

Commit 2b4cb61

Browse files
committed
closes #2356
1 parent a29efdf commit 2b4cb61

File tree

2 files changed

+86
-2
lines changed

2 files changed

+86
-2
lines changed

RetailCoder.VBE/Refactorings/ImplementInterface/ImplementInterfaceRefactoring.cs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,12 +51,19 @@ public void Refactor()
5151
Refactor(qualifiedSelection.Value);
5252
}
5353

54+
private static readonly IReadOnlyList<DeclarationType> ImplementingModuleTypes = new[]
55+
{
56+
DeclarationType.ClassModule,
57+
DeclarationType.UserForm,
58+
DeclarationType.Document,
59+
};
60+
5461
public void Refactor(QualifiedSelection selection)
5562
{
5663
_targetInterface = _declarations.FindInterface(selection);
5764

5865
_targetClass = _declarations.SingleOrDefault(d =>
59-
!d.IsBuiltIn && d.DeclarationType == DeclarationType.ClassModule &&
66+
!d.IsBuiltIn && ImplementingModuleTypes.Contains(d.DeclarationType) &&
6067
d.QualifiedSelection.QualifiedName.Equals(selection.QualifiedName));
6168

6269
if (_targetClass == null || _targetInterface == null)

RubberduckTests/Refactoring/ImplementInterfaceTests.cs

Lines changed: 78 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -676,7 +676,7 @@ Public Property Let Buz(ByVal a As Boolean, ByRef value As Integer)
676676
const string inputCode2 =
677677
@"Implements Class1";
678678

679-
var selection = new Selection(1, 1, 1, 1);
679+
var selection = Selection.Home;
680680

681681
//Expectation
682682
const string expectedCode =
@@ -800,5 +800,82 @@ End Property
800800
//Assert
801801
Assert.AreEqual(expectedCode, module.Content());
802802
}
803+
804+
[TestMethod]
805+
public void ImplementsInterfaceInDocumentModule()
806+
{
807+
const string interfaceCode = @"Option Explicit
808+
Public Sub DoSomething()
809+
End Sub
810+
";
811+
const string initialCode = @"Implements IInterface";
812+
const string expectedCode = @"Implements IInterface
813+
814+
Private Sub IInterface_DoSomething()
815+
Err.Raise 5 'TODO implement interface member
816+
End Sub
817+
";
818+
var selection = Selection.Home;
819+
var vbe = new MockVbeBuilder()
820+
.ProjectBuilder("TestProject", ProjectProtection.Unprotected)
821+
.AddComponent("IInterface", ComponentType.ClassModule, interfaceCode)
822+
.AddComponent("Sheet1", ComponentType.Document, initialCode, selection)
823+
.MockVbeBuilder()
824+
.Build();
825+
826+
var project = vbe.Object.VBProjects[0];
827+
var component = project.VBComponents["Sheet1"];
828+
829+
var parser = MockParser.Create(vbe.Object, new RubberduckParserState(new Mock<ISinks>().Object));
830+
parser.Parse(new CancellationTokenSource());
831+
if (parser.State.Status >= ParserState.Error) { Assert.Inconclusive("Parser Error"); }
832+
833+
var qualifiedSelection = new QualifiedSelection(new QualifiedModuleName(component), Selection.Home);
834+
var module = component.CodeModule;
835+
836+
var refactoring = new ImplementInterfaceRefactoring(vbe.Object, parser.State, null);
837+
refactoring.Refactor(qualifiedSelection);
838+
839+
Assert.AreEqual(expectedCode, module.Content());
840+
}
841+
842+
[TestMethod]
843+
public void ImplementsInterfaceInUserFormModule()
844+
{
845+
const string interfaceCode = @"Option Explicit
846+
Public Sub DoSomething()
847+
End Sub
848+
";
849+
const string initialCode = @"Implements IInterface";
850+
const string expectedCode = @"Implements IInterface
851+
852+
Private Sub IInterface_DoSomething()
853+
Err.Raise 5 'TODO implement interface member
854+
End Sub
855+
";
856+
var selection = Selection.Home;
857+
var vbe = new MockVbeBuilder()
858+
.ProjectBuilder("TestProject", ProjectProtection.Unprotected)
859+
.AddComponent("IInterface", ComponentType.ClassModule, interfaceCode)
860+
.AddComponent("Form1", ComponentType.UserForm, initialCode, selection)
861+
.MockVbeBuilder()
862+
.Build();
863+
864+
var project = vbe.Object.VBProjects[0];
865+
var component = project.VBComponents["Form1"];
866+
867+
var parser = MockParser.Create(vbe.Object, new RubberduckParserState(new Mock<ISinks>().Object));
868+
parser.Parse(new CancellationTokenSource());
869+
if (parser.State.Status >= ParserState.Error) { Assert.Inconclusive("Parser Error"); }
870+
871+
var qualifiedSelection = new QualifiedSelection(new QualifiedModuleName(component), Selection.Home);
872+
var module = component.CodeModule;
873+
874+
var refactoring = new ImplementInterfaceRefactoring(vbe.Object, parser.State, null);
875+
refactoring.Refactor(qualifiedSelection);
876+
877+
Assert.AreEqual(expectedCode, module.Content());
878+
}
803879
}
804880
}
881+

0 commit comments

Comments
 (0)