Skip to content

Commit 48a72ef

Browse files
committed
Merge pull request #1236 from retailcoder/next
fixes #1234; added more resolver tests
2 parents 9ccc262 + 9de20af commit 48a72ef

File tree

2 files changed

+225
-2
lines changed

2 files changed

+225
-2
lines changed

Rubberduck.Parsing/Symbols/IdentifierReferenceResolver.cs

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ private enum ContextAccessorType
2424
private readonly QualifiedModuleName _qualifiedModuleName;
2525

2626
private readonly IReadOnlyList<DeclarationType> _moduleTypes;
27+
private readonly IReadOnlyList<DeclarationType> _memberTypes;
2728
private readonly IReadOnlyList<DeclarationType> _returningMemberTypes;
2829

2930
private readonly Stack<Declaration> _withBlockQualifiers;
@@ -49,6 +50,15 @@ public IdentifierReferenceResolver(QualifiedModuleName qualifiedModuleName, Decl
4950
DeclarationType.Class,
5051
};
5152

53+
_memberTypes = new[]
54+
{
55+
DeclarationType.Procedure,
56+
DeclarationType.Function,
57+
DeclarationType.PropertyGet,
58+
DeclarationType.PropertyLet,
59+
DeclarationType.PropertySet,
60+
};
61+
5262
_returningMemberTypes = new[]
5363
{
5464
DeclarationType.Function,
@@ -352,7 +362,10 @@ private Declaration ResolveInScopeType(string identifier, Declaration scope)
352362
private Declaration ResolveType(Declaration parent)
353363
{
354364
if (parent != null && (parent.DeclarationType == DeclarationType.UserDefinedType
355-
|| parent.DeclarationType == DeclarationType.Enumeration))
365+
|| parent.DeclarationType == DeclarationType.Enumeration
366+
|| parent.DeclarationType == DeclarationType.Project
367+
|| parent.DeclarationType == DeclarationType.Module
368+
|| (parent.DeclarationType == DeclarationType.Class && (parent.IsBuiltIn || parent.HasPredeclaredId))))
356369
{
357370
return parent;
358371
}
@@ -1064,6 +1077,7 @@ private Declaration FindModuleScopeDeclaration(string identifierName, Declaratio
10641077
item.ParentScope == localScope.ParentScope
10651078
&& !item.DeclarationType.HasFlag(DeclarationType.Member)
10661079
&& !_moduleTypes.Contains(item.DeclarationType)
1080+
&& item.DeclarationType != DeclarationType.UserDefinedType
10671081
&& (item.DeclarationType != DeclarationType.Event || IsLocalEvent(item, localScope)))
10681082
.ToList();
10691083

@@ -1086,7 +1100,8 @@ private Declaration FindModuleScopeProcedure(string identifierName, Declaration
10861100

10871101
var matches = _declarationFinder.MatchName(identifierName);
10881102
var result = matches.Where(item =>
1089-
localScope.ProjectName == item.ProjectName
1103+
_memberTypes.Contains(item.DeclarationType)
1104+
&& localScope.ProjectName == item.ProjectName
10901105
&& (localScope.ComponentName.Replace("_", string.Empty) == item.ComponentName.Replace("_", string.Empty))
10911106
&& (IsProcedure(item, localScope) || IsPropertyAccessor(item, accessorType, localScope, isAssignmentTarget)))
10921107
.ToList();

RubberduckTests/Grammar/ResolverTests.cs

Lines changed: 208 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1182,5 +1182,213 @@ End Sub
11821182

11831183
Assert.AreEqual(1, usages.Count());
11841184
}
1185+
1186+
[TestMethod]
1187+
public void GivenField_NamedUnambiguously_FieldAssignmentCallResolvesToFieldDeclaration()
1188+
{
1189+
var code = @"
1190+
Private Type TestModule1
1191+
Foo As Integer
1192+
End Type
1193+
1194+
Private Bar As TestModule1
1195+
1196+
Public Sub DoSomething()
1197+
Bar.Foo = 42
1198+
End Sub
1199+
";
1200+
var state = Resolve(code);
1201+
1202+
var declaration = state.AllUserDeclarations.Single(item =>
1203+
item.DeclarationType == DeclarationType.Variable
1204+
&& item.IdentifierName == "Bar");
1205+
1206+
var usages = declaration.References.Where(item =>
1207+
item.ParentScoping.IdentifierName == "DoSomething");
1208+
1209+
Assert.AreEqual(1, usages.Count());
1210+
}
1211+
1212+
[TestMethod]
1213+
public void GivenField_NamedUnambiguously_InStatementFieldCallResolvesToFieldDeclaration()
1214+
{
1215+
var code = @"
1216+
Private Type TestModule1
1217+
Foo As Integer
1218+
End Type
1219+
1220+
Private Bar As TestModule1
1221+
1222+
Public Sub DoSomething()
1223+
Debug.Print Bar.Foo
1224+
End Sub
1225+
";
1226+
var state = Resolve(code);
1227+
1228+
var declaration = state.AllUserDeclarations.Single(item =>
1229+
item.DeclarationType == DeclarationType.Variable
1230+
&& item.IdentifierName == "Bar");
1231+
1232+
var usages = declaration.References.Where(item =>
1233+
item.ParentScoping.IdentifierName == "DoSomething");
1234+
1235+
Assert.AreEqual(1, usages.Count());
1236+
}
1237+
1238+
[TestMethod]
1239+
public void GivenField_NamedAmbiguously_FieldAssignmentCallResolvesToFieldDeclaration()
1240+
{
1241+
var code = @"
1242+
Private Type TestModule1
1243+
Foo As Integer
1244+
End Type
1245+
1246+
Private TestModule1 As TestModule1
1247+
1248+
Public Sub DoSomething()
1249+
TestModule1.Foo = 42
1250+
End Sub
1251+
";
1252+
var state = Resolve(code);
1253+
1254+
var declaration = state.AllUserDeclarations.Single(item =>
1255+
item.DeclarationType == DeclarationType.Variable
1256+
&& item.IdentifierName == item.ComponentName);
1257+
1258+
var usages = declaration.References.Where(item =>
1259+
item.ParentScoping.IdentifierName == "DoSomething");
1260+
1261+
Assert.AreEqual(1, usages.Count());
1262+
}
1263+
1264+
[TestMethod]
1265+
public void GivenUDTField_NamedAmbiguously_MemberAssignmentCallResolvesToUDTMember()
1266+
{
1267+
var code = @"
1268+
Private Type TestModule1
1269+
Foo As Integer
1270+
End Type
1271+
1272+
Private TestModule1 As TestModule1
1273+
1274+
Public Sub DoSomething()
1275+
TestModule1.Foo = 42
1276+
End Sub
1277+
";
1278+
var state = Resolve(code);
1279+
1280+
var declaration = state.AllUserDeclarations.Single(item =>
1281+
item.DeclarationType == DeclarationType.UserDefinedTypeMember
1282+
&& item.IdentifierName == "Foo");
1283+
1284+
var usages = declaration.References.Where(item =>
1285+
item.ParentScoping.IdentifierName == "DoSomething");
1286+
1287+
Assert.AreEqual(1, usages.Count());
1288+
}
1289+
1290+
[TestMethod]
1291+
public void GivenUDTField_NamedAmbiguously_FullyQualifiedMemberAssignmentCallResolvesToUDTMember()
1292+
{
1293+
var code = @"
1294+
Private Type TestModule1
1295+
Foo As Integer
1296+
End Type
1297+
1298+
Private TestModule1 As TestModule1
1299+
1300+
Public Sub DoSomething()
1301+
TestProject1.TestModule1.TestModule1.Foo = 42
1302+
End Sub
1303+
";
1304+
var state = Resolve(code);
1305+
1306+
var declaration = state.AllUserDeclarations.Single(item =>
1307+
item.DeclarationType == DeclarationType.UserDefinedTypeMember
1308+
&& item.IdentifierName == "Foo");
1309+
1310+
var usages = declaration.References.Where(item =>
1311+
item.ParentScoping.IdentifierName == "DoSomething");
1312+
1313+
Assert.AreEqual(1, usages.Count());
1314+
}
1315+
1316+
[TestMethod]
1317+
public void GivenFullyReferencedUDTFieldMemberCall_ProjectParentMember_ResolvesToProject()
1318+
{
1319+
var code = @"
1320+
Private Type TestModule1
1321+
Foo As Integer
1322+
End Type
1323+
1324+
Private TestModule1 As TestModule1
1325+
1326+
Public Sub DoSomething()
1327+
TestProject1.TestModule1.TestModule1.Foo = 42
1328+
End Sub
1329+
";
1330+
var state = Resolve(code);
1331+
1332+
var declaration = state.AllUserDeclarations.Single(item =>
1333+
item.DeclarationType == DeclarationType.Project
1334+
&& item.IdentifierName == item.ProjectName);
1335+
1336+
var usages = declaration.References.Where(item =>
1337+
item.ParentScoping.IdentifierName == "DoSomething");
1338+
1339+
Assert.AreEqual(1, usages.Count());
1340+
}
1341+
1342+
[TestMethod]
1343+
public void GivenFullyReferencedUDTFieldMemberCall_ModuleParentMember_ResolvesToModule()
1344+
{
1345+
var code = @"
1346+
Private Type TestModule1
1347+
Foo As Integer
1348+
End Type
1349+
1350+
Private TestModule1 As TestModule1
1351+
1352+
Public Sub DoSomething()
1353+
TestProject1.TestModule1.TestModule1.Foo = 42
1354+
End Sub
1355+
";
1356+
var state = Resolve(code);
1357+
1358+
var declaration = state.AllUserDeclarations.Single(item =>
1359+
item.DeclarationType == DeclarationType.Module
1360+
&& item.IdentifierName == item.ComponentName);
1361+
1362+
var usages = declaration.References.Where(item =>
1363+
item.ParentScoping.IdentifierName == "DoSomething");
1364+
1365+
Assert.AreEqual(1, usages.Count());
1366+
}
1367+
1368+
[TestMethod]
1369+
public void GivenFullyReferencedUDTFieldMemberCall_FieldParentMember_ResolvesToVariable()
1370+
{
1371+
var code = @"
1372+
Private Type TestModule1
1373+
Foo As Integer
1374+
End Type
1375+
1376+
Private TestModule1 As TestModule1
1377+
1378+
Public Sub DoSomething()
1379+
TestProject1.TestModule1.TestModule1.Foo = 42
1380+
End Sub
1381+
";
1382+
var state = Resolve(code);
1383+
1384+
var declaration = state.AllUserDeclarations.Single(item =>
1385+
item.DeclarationType == DeclarationType.Variable
1386+
&& item.IdentifierName == item.ComponentName);
1387+
1388+
var usages = declaration.References.Where(item =>
1389+
item.ParentScoping.IdentifierName == "DoSomething");
1390+
1391+
Assert.AreEqual(1, usages.Count());
1392+
}
11851393
}
11861394
}

0 commit comments

Comments
 (0)