Skip to content

Commit f56a634

Browse files
Hosch250retailcoder
authored andcommitted
Code Explorer #1513 (#1547)
* Close #1513 * Fix failing tests. Add more.
1 parent 23f2796 commit f56a634

File tree

2 files changed

+209
-6
lines changed

2 files changed

+209
-6
lines changed

RetailCoder.VBE/Navigation/CodeExplorer/CodeExplorerItemViewModel.cs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,22 @@ public override int Compare(CodeExplorerItemViewModel x, CodeExplorerItemViewMod
2828

2929
public class CompareByType : Comparer<CodeExplorerItemViewModel>
3030
{
31+
private static readonly Dictionary<DeclarationType, int> SortOrder = new Dictionary<DeclarationType, int>
32+
{
33+
{DeclarationType.LibraryFunction, 0},
34+
{DeclarationType.LibraryProcedure, 1},
35+
{DeclarationType.UserDefinedType, 2},
36+
{DeclarationType.Enumeration, 3},
37+
{DeclarationType.Event, 4},
38+
{DeclarationType.Constant, 5},
39+
{DeclarationType.Variable, 6},
40+
{DeclarationType.PropertyGet, 7},
41+
{DeclarationType.PropertyLet, 8},
42+
{DeclarationType.PropertySet, 9},
43+
{DeclarationType.Function, 10},
44+
{DeclarationType.Procedure, 11}
45+
};
46+
3147
public override int Compare(CodeExplorerItemViewModel x, CodeExplorerItemViewModel y)
3248
{
3349
if (x == y)
@@ -54,6 +70,14 @@ public override int Compare(CodeExplorerItemViewModel x, CodeExplorerItemViewMod
5470
// keep separate types separate
5571
if (xNode.Declaration.DeclarationType != yNode.Declaration.DeclarationType)
5672
{
73+
int xValue, yValue;
74+
75+
if (SortOrder.TryGetValue(xNode.Declaration.DeclarationType, out xValue) &&
76+
SortOrder.TryGetValue(yNode.Declaration.DeclarationType, out yValue))
77+
{
78+
return xValue < yValue ? -1 : 1;
79+
}
80+
5781
return xNode.Declaration.DeclarationType < yNode.Declaration.DeclarationType ? -1 : 1;
5882
}
5983

RubberduckTests/CodeExplorer/CodeExplorerTests.cs

Lines changed: 185 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1038,13 +1038,192 @@ public void CompareByType_ReturnsZeroForErrorNodes()
10381038
}
10391039

10401040
[TestMethod]
1041-
public void CompareByType_ReturnsFieldBelowSub()
1041+
public void CompareByType_ReturnsEventAboveConst()
10421042
{
10431043
var inputCode =
1044-
@"Public Foo As Boolean
1044+
@"Public Event Foo(ByVal arg1 As Integer, ByVal arg2 As String)
1045+
Public Const Bar = 0";
10451046

1046-
Sub Bar()
1047-
End Sub";
1047+
var builder = new MockVbeBuilder();
1048+
VBComponent component;
1049+
var vbe = builder.BuildFromSingleStandardModule(inputCode, out component);
1050+
var mockHost = new Mock<IHostApplication>();
1051+
mockHost.SetupAllProperties();
1052+
1053+
var state = new RubberduckParserState();
1054+
var commands = new List<ICommand>();
1055+
1056+
var vm = new CodeExplorerViewModel(new FolderHelper(state, GetDelimiterConfigLoader()), state, commands);
1057+
1058+
var parser = MockParser.Create(vbe.Object, state);
1059+
parser.Parse();
1060+
1061+
var eventNode = vm.Projects.First().Items.First().Items.First().Items.Single(s => s.Name == "Foo");
1062+
var constNode = vm.Projects.First().Items.First().Items.First().Items.Single(s => s.Name == "Bar = 0");
1063+
1064+
Assert.AreEqual(-1, new CompareByType().Compare(eventNode, constNode));
1065+
}
1066+
1067+
[TestMethod]
1068+
public void CompareByType_ReturnsConstAboveField()
1069+
{
1070+
var inputCode =
1071+
@"Public Const Foo = 0
1072+
Public Bar As Boolean";
1073+
1074+
var builder = new MockVbeBuilder();
1075+
VBComponent component;
1076+
var vbe = builder.BuildFromSingleStandardModule(inputCode, out component);
1077+
var mockHost = new Mock<IHostApplication>();
1078+
mockHost.SetupAllProperties();
1079+
1080+
var state = new RubberduckParserState();
1081+
var commands = new List<ICommand>();
1082+
1083+
var vm = new CodeExplorerViewModel(new FolderHelper(state, GetDelimiterConfigLoader()), state, commands);
1084+
1085+
var parser = MockParser.Create(vbe.Object, state);
1086+
parser.Parse();
1087+
1088+
var constNode = vm.Projects.First().Items.First().Items.First().Items.Single(s => s.Name == "Foo = 0");
1089+
var fieldNode = vm.Projects.First().Items.First().Items.First().Items.Single(s => s.Name == "Bar");
1090+
1091+
Assert.AreEqual(-1, new CompareByType().Compare(constNode, fieldNode));
1092+
}
1093+
1094+
[TestMethod]
1095+
public void CompareByType_ReturnsFieldAbovePropertyGet()
1096+
{
1097+
var inputCode =
1098+
@"Private Bar As Boolean
1099+
1100+
Public Property Get Foo() As Variant
1101+
End Property
1102+
";
1103+
1104+
var builder = new MockVbeBuilder();
1105+
VBComponent component;
1106+
var vbe = builder.BuildFromSingleStandardModule(inputCode, out component);
1107+
var mockHost = new Mock<IHostApplication>();
1108+
mockHost.SetupAllProperties();
1109+
1110+
var state = new RubberduckParserState();
1111+
var commands = new List<ICommand>();
1112+
1113+
var vm = new CodeExplorerViewModel(new FolderHelper(state, GetDelimiterConfigLoader()), state, commands);
1114+
1115+
var parser = MockParser.Create(vbe.Object, state);
1116+
parser.Parse();
1117+
1118+
var fieldNode = vm.Projects.First().Items.First().Items.First().Items.Single(s => s.Name == "Bar");
1119+
var propertyGetNode = vm.Projects.First().Items.First().Items.First().Items.Single(s => s.Name == "Foo (Get)");
1120+
1121+
Assert.AreEqual(-1, new CompareByType().Compare(fieldNode, propertyGetNode));
1122+
}
1123+
1124+
[TestMethod]
1125+
public void CompareByType_ReturnsPropertyGetAbovePropertyLet()
1126+
{
1127+
var inputCode =
1128+
@"Public Property Get Foo() As Variant
1129+
End Property
1130+
1131+
Public Property Let Foo(ByVal Value As Variant)
1132+
End Property
1133+
";
1134+
1135+
var builder = new MockVbeBuilder();
1136+
VBComponent component;
1137+
var vbe = builder.BuildFromSingleStandardModule(inputCode, out component);
1138+
var mockHost = new Mock<IHostApplication>();
1139+
mockHost.SetupAllProperties();
1140+
1141+
var state = new RubberduckParserState();
1142+
var commands = new List<ICommand>();
1143+
1144+
var vm = new CodeExplorerViewModel(new FolderHelper(state, GetDelimiterConfigLoader()), state, commands);
1145+
1146+
var parser = MockParser.Create(vbe.Object, state);
1147+
parser.Parse();
1148+
1149+
var propertyGetNode = vm.Projects.First().Items.First().Items.First().Items.Single(s => s.Name == "Foo (Get)");
1150+
var propertyLetNode = vm.Projects.First().Items.First().Items.First().Items.Single(s => s.Name == "Foo (Let)");
1151+
1152+
Assert.AreEqual(-1, new CompareByType().Compare(propertyGetNode, propertyLetNode));
1153+
}
1154+
1155+
[TestMethod]
1156+
public void CompareByType_ReturnsPropertyLetAbovePropertySet()
1157+
{
1158+
var inputCode =
1159+
@"Public Property Let Foo(ByVal Value As Variant)
1160+
End Property
1161+
1162+
Public Property Set Foo(ByVal Value As Variant)
1163+
End Property
1164+
";
1165+
1166+
var builder = new MockVbeBuilder();
1167+
VBComponent component;
1168+
var vbe = builder.BuildFromSingleStandardModule(inputCode, out component);
1169+
var mockHost = new Mock<IHostApplication>();
1170+
mockHost.SetupAllProperties();
1171+
1172+
var state = new RubberduckParserState();
1173+
var commands = new List<ICommand>();
1174+
1175+
var vm = new CodeExplorerViewModel(new FolderHelper(state, GetDelimiterConfigLoader()), state, commands);
1176+
1177+
var parser = MockParser.Create(vbe.Object, state);
1178+
parser.Parse();
1179+
1180+
var propertyLetNode = vm.Projects.First().Items.First().Items.First().Items.Single(s => s.Name == "Foo (Let)");
1181+
var propertySetNode = vm.Projects.First().Items.First().Items.First().Items.Single(s => s.Name == "Foo (Set)");
1182+
1183+
Assert.AreEqual(-1, new CompareByType().Compare(propertyLetNode, propertySetNode));
1184+
}
1185+
1186+
[TestMethod]
1187+
public void CompareByType_ReturnsPropertySetAboveFunction()
1188+
{
1189+
var inputCode =
1190+
@"Public Property Set Foo(ByVal Value As Variant)
1191+
End Property
1192+
1193+
Public Function Bar() As Boolean
1194+
End Function
1195+
";
1196+
1197+
var builder = new MockVbeBuilder();
1198+
VBComponent component;
1199+
var vbe = builder.BuildFromSingleStandardModule(inputCode, out component);
1200+
var mockHost = new Mock<IHostApplication>();
1201+
mockHost.SetupAllProperties();
1202+
1203+
var state = new RubberduckParserState();
1204+
var commands = new List<ICommand>();
1205+
1206+
var vm = new CodeExplorerViewModel(new FolderHelper(state, GetDelimiterConfigLoader()), state, commands);
1207+
1208+
var parser = MockParser.Create(vbe.Object, state);
1209+
parser.Parse();
1210+
1211+
var propertySetNode = vm.Projects.First().Items.First().Items.First().Items.Single(s => s.Name == "Foo (Set)");
1212+
var functionNode = vm.Projects.First().Items.First().Items.First().Items.Single(s => s.Name == "Bar");
1213+
1214+
Assert.AreEqual(-1, new CompareByType().Compare(propertySetNode, functionNode));
1215+
}
1216+
1217+
[TestMethod]
1218+
public void CompareByType_ReturnsFunctionAboveSub()
1219+
{
1220+
var inputCode =
1221+
@"Public Function Foo() As Boolean
1222+
End Function
1223+
1224+
Public Sub Bar()
1225+
End Sub
1226+
";
10481227

10491228
var builder = new MockVbeBuilder();
10501229
VBComponent component;
@@ -1060,10 +1239,10 @@ Sub Bar()
10601239
var parser = MockParser.Create(vbe.Object, state);
10611240
parser.Parse();
10621241

1242+
var functionNode = vm.Projects.First().Items.First().Items.First().Items.Single(s => s.Name == "Foo");
10631243
var subNode = vm.Projects.First().Items.First().Items.First().Items.Single(s => s.Name == "Bar");
1064-
var fieldNode = vm.Projects.First().Items.First().Items.First().Items.Single(s => s.Name == "Foo");
10651244

1066-
Assert.AreEqual(-1, new CompareByType().Compare(subNode, fieldNode));
1245+
Assert.AreEqual(-1, new CompareByType().Compare(functionNode, subNode));
10671246
}
10681247

10691248
[TestMethod]

0 commit comments

Comments
 (0)