Skip to content

Commit 6de2747

Browse files
authored
Merge pull request #187 from rubberduck-vba/next
sync with main repo
2 parents bc4d894 + 94bac46 commit 6de2747

File tree

6 files changed

+144
-49
lines changed

6 files changed

+144
-49
lines changed

Rubberduck.Parsing/Symbols/AliasDeclarations.cs

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,14 @@ public IReadOnlyList<Declaration> Load()
5656

5757
private IReadOnlyList<Declaration> AddAliasDeclarations()
5858
{
59-
UpdateAliasFunctionModulesFromReferencedProjects(_state);
59+
var finder = new DeclarationFinder(_state.AllDeclarations, new CommentNode[] { }, new IAnnotation[] { });
60+
61+
if (WeHaveAlreadyLoadedTheDeclarationsBefore(finder))
62+
{
63+
return new List<Declaration>();
64+
}
65+
66+
UpdateAliasFunctionModulesFromReferencedProjects(finder);
6067

6168
if (NoReferenceToProjectContainingTheFunctionAliases())
6269
{
@@ -70,10 +77,8 @@ private IReadOnlyList<Declaration> AddAliasDeclarations()
7077
return functionAliases.Concat<Declaration>(PropertyGetDeclarations()).ToList();
7178
}
7279

73-
private void UpdateAliasFunctionModulesFromReferencedProjects(RubberduckParserState state)
80+
private void UpdateAliasFunctionModulesFromReferencedProjects(DeclarationFinder finder)
7481
{
75-
var finder = new DeclarationFinder(state.AllDeclarations, new CommentNode[] {}, new IAnnotation[] {});
76-
7782
var vba = finder.FindProject("VBA");
7883
if (vba == null)
7984
{
@@ -90,6 +95,19 @@ private void UpdateAliasFunctionModulesFromReferencedProjects(RubberduckParserSt
9095
}
9196

9297

98+
private static bool WeHaveAlreadyLoadedTheDeclarationsBefore(DeclarationFinder finder)
99+
{
100+
return ThereIsAGlobalBuiltInErrVariableDeclaration(finder);
101+
}
102+
103+
private static bool ThereIsAGlobalBuiltInErrVariableDeclaration(DeclarationFinder finder)
104+
{
105+
return finder.MatchName(Grammar.Tokens.Err).Any(declaration => declaration.IsBuiltIn
106+
&& declaration.DeclarationType == DeclarationType.Variable
107+
&& declaration.Accessibility == Accessibility.Global);
108+
}
109+
110+
93111
private bool NoReferenceToProjectContainingTheFunctionAliases()
94112
{
95113
return _conversionModule == null;

Rubberduck.Parsing/Symbols/DebugDeclarations.cs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ public IReadOnlyList<Declaration> Load()
2121
{
2222
var finder = new DeclarationFinder(_state.AllDeclarations, new CommentNode[] { }, new IAnnotation[] { });
2323

24-
if (ThereIsAGlobalBuiltInErrVariableDeclaration(finder))
24+
if (WeHaveAlreadyLoadedTheDeclarationsBefore(finder))
2525
{
2626
return new List<Declaration>();
2727
}
@@ -37,9 +37,14 @@ public IReadOnlyList<Declaration> Load()
3737
return LoadDebugDeclarations(vba);
3838
}
3939

40+
private static bool WeHaveAlreadyLoadedTheDeclarationsBefore(DeclarationFinder finder)
41+
{
42+
return ThereIsAGlobalBuiltInErrVariableDeclaration(finder);
43+
}
44+
4045
private static bool ThereIsAGlobalBuiltInErrVariableDeclaration(DeclarationFinder finder)
4146
{
42-
return finder.MatchName(Tokens.Err).Any(declaration => declaration.IsBuiltIn
47+
return finder.MatchName(Grammar.Tokens.Err).Any(declaration => declaration.IsBuiltIn
4348
&& declaration.DeclarationType == DeclarationType.Variable
4449
&& declaration.Accessibility == Accessibility.Global);
4550
}

Rubberduck.Parsing/Symbols/DeclarationFinder.cs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,24 @@ public Declaration FindStdModule(string name, Declaration parent = null, bool in
140140
return result;
141141
}
142142

143+
public Declaration FindClassModule(string name, Declaration parent = null, bool includeBuiltIn = false)
144+
{
145+
Declaration result = null;
146+
try
147+
{
148+
var matches = MatchName(name);
149+
result = matches.SingleOrDefault(declaration => declaration.DeclarationType.HasFlag(DeclarationType.ClassModule)
150+
&& (parent == null || parent.Equals(declaration.ParentDeclaration))
151+
&& (includeBuiltIn || !declaration.IsBuiltIn));
152+
}
153+
catch (InvalidOperationException exception)
154+
{
155+
Logger.Error(exception, "Multiple matches found for class module '{0}'.", name);
156+
}
157+
158+
return result;
159+
}
160+
143161
public Declaration FindReferencedProject(Declaration callingProject, string referencedProjectName)
144162
{
145163
return FindInReferencedProjectByPriority(callingProject, referencedProjectName, p => p.DeclarationType.HasFlag(DeclarationType.Project));

Rubberduck.Parsing/Symbols/FormEventDeclarations.cs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,12 +33,11 @@ private static Declaration FormsClassModuleFromParserState(RubberduckParserState
3333
var msForms = finder.FindProject("MSForms");
3434
if (msForms == null)
3535
{
36-
// If the VBA project is null, we haven't loaded any COM references;
37-
// we're in a unit test and the mock project didn't setup any references.
36+
//The corresponding COM reference has not been loaded.
3837
return null;
3938
}
4039

41-
return finder.FindStdModule("FormEvents", msForms, true);
40+
return finder.FindClassModule("FormEvents", msForms, true);
4241
}
4342

4443

Rubberduck.Parsing/Symbols/SpecialFormDeclarations.cs

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,38 +10,51 @@ namespace Rubberduck.Parsing.Symbols
1010
{
1111
public class SpecialFormDeclarations : ICustomDeclarationLoader
1212
{
13-
private readonly DeclarationFinder _finder;
13+
private readonly RubberduckParserState _state;
1414

1515
public SpecialFormDeclarations(RubberduckParserState state)
1616
{
17-
_finder = new DeclarationFinder(state.AllDeclarations, new CommentNode[] { }, new IAnnotation[] { });
17+
_state = state;
1818
}
1919

2020

2121
public IReadOnlyList<Declaration> Load()
2222
{
23-
if (ThereIsAGlobalBuiltInErrVariableDeclaration(_finder))
23+
var finder = new DeclarationFinder(_state.AllDeclarations, new CommentNode[] { }, new IAnnotation[] { });
24+
25+
if (WeHaveAlreadyLoadedTheDeclarationsBefore(finder))
2426
{
2527
return new List<Declaration>();
2628
}
2729

28-
var vba = _finder.FindProject("VBA");
30+
var vba = finder.FindProject("VBA");
2931
if (vba == null)
3032
{
3133
// If the VBA project is null, we haven't loaded any COM references;
3234
// we're in a unit test and the mock project didn't setup any references.
3335
return new List<Declaration>();
3436
}
3537

36-
var informationModule = _finder.FindStdModule("Information", vba, true);
37-
Debug.Assert(informationModule != null, "We expect the information module to exist in the VBA project.");
38+
var informationModule = finder.FindStdModule("Information", vba, true);
39+
if (informationModule == null)
40+
{
41+
//This should not happen under normal circumstances.
42+
//Most probably, we are in a test that only addded parts of the VBA project.
43+
return new List<Declaration>();
44+
}
3845

3946
return LoadSpecialFormDeclarations(informationModule);
4047
}
4148

49+
50+
private static bool WeHaveAlreadyLoadedTheDeclarationsBefore(DeclarationFinder finder)
51+
{
52+
return ThereIsAGlobalBuiltInErrVariableDeclaration(finder);
53+
}
54+
4255
private static bool ThereIsAGlobalBuiltInErrVariableDeclaration(DeclarationFinder finder)
4356
{
44-
return finder.MatchName(Tokens.Err).Any(declaration => declaration.IsBuiltIn
57+
return finder.MatchName(Grammar.Tokens.Err).Any(declaration => declaration.IsBuiltIn
4558
&& declaration.DeclarationType == DeclarationType.Variable
4659
&& declaration.Accessibility == Accessibility.Global);
4760
}

0 commit comments

Comments
 (0)