Skip to content

Commit 6244087

Browse files
committed
Merge pull request #1154 from retailcoder/CodeExplorer
Parser/Resolver fixes
2 parents 4cd8396 + e4df1ab commit 6244087

File tree

2 files changed

+32
-24
lines changed

2 files changed

+32
-24
lines changed

RetailCoder.VBE/App.cs

Lines changed: 22 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -69,9 +69,9 @@ public App(VBE vbe, IMessageBox messageBox,
6969

7070
var sink = new VBProjectsEventsSink();
7171
var connectionPointContainer = (IConnectionPointContainer)_vbe.VBProjects;
72-
Guid interfaceId = typeof (_dispVBProjectsEvents).GUID;
72+
var interfaceId = typeof (_dispVBProjectsEvents).GUID;
7373
connectionPointContainer.FindConnectionPoint(ref interfaceId, out _projectsEventsConnectionPoint);
74-
74+
7575
sink.ProjectAdded += sink_ProjectAdded;
7676
sink.ProjectRemoved += sink_ProjectRemoved;
7777
sink.ProjectActivated += sink_ProjectActivated;
@@ -82,8 +82,9 @@ public App(VBE vbe, IMessageBox messageBox,
8282
UiDispatcher.Initialize();
8383
}
8484

85-
void sink_ProjectRemoved(object sender, DispatcherEventArgs<VBProject> e)
85+
async void sink_ProjectRemoved(object sender, DispatcherEventArgs<VBProject> e)
8686
{
87+
Debug.WriteLine(string.Format("Project '{0}' was removed.", e.Item.Name));
8788
Tuple<IConnectionPoint, int> value;
8889
if (_componentsEventsConnectionPoints.TryGetValue(e.Item.VBComponents, out value))
8990
{
@@ -94,8 +95,9 @@ void sink_ProjectRemoved(object sender, DispatcherEventArgs<VBProject> e)
9495
}
9596
}
9697

97-
void sink_ProjectAdded(object sender, DispatcherEventArgs<VBProject> e)
98+
async void sink_ProjectAdded(object sender, DispatcherEventArgs<VBProject> e)
9899
{
100+
Debug.WriteLine(string.Format("Project '{0}' was added.", e.Item.Name));
99101
var connectionPointContainer = (IConnectionPointContainer)e.Item.VBComponents;
100102
Guid interfaceId = typeof(_dispVBComponentsEvents).GUID;
101103

@@ -117,46 +119,54 @@ void sink_ProjectAdded(object sender, DispatcherEventArgs<VBProject> e)
117119
_parser.State.OnParseRequested();
118120
}
119121

120-
void sink_ComponentSelected(object sender, DispatcherEventArgs<VBComponent> e)
122+
async void sink_ComponentSelected(object sender, DispatcherEventArgs<VBComponent> e)
121123
{
124+
Debug.WriteLine(string.Format("Component '{0}' was selected.", e.Item.Name));
122125
// do something?
123126
}
124127

125-
void sink_ComponentRenamed(object sender, DispatcherRenamedEventArgs<VBComponent> e)
128+
async void sink_ComponentRenamed(object sender, DispatcherRenamedEventArgs<VBComponent> e)
126129
{
130+
Debug.WriteLine(string.Format("Component '{0}' was renamed.", e.Item.Name));
127131
_parser.State.ClearDeclarations(e.Item);
128132
_parser.State.OnParseRequested(e.Item);
129133
}
130134

131-
void sink_ComponentRemoved(object sender, DispatcherEventArgs<VBComponent> e)
135+
async void sink_ComponentRemoved(object sender, DispatcherEventArgs<VBComponent> e)
132136
{
137+
Debug.WriteLine(string.Format("Component '{0}' was removed.", e.Item.Name));
133138
_parser.State.ClearDeclarations(e.Item);
134139
}
135140

136-
void sink_ComponentReloaded(object sender, DispatcherEventArgs<VBComponent> e)
141+
async void sink_ComponentReloaded(object sender, DispatcherEventArgs<VBComponent> e)
137142
{
143+
Debug.WriteLine(string.Format("Component '{0}' was reloaded.", e.Item.Name));
138144
_parser.State.ClearDeclarations(e.Item);
139145
_parser.State.OnParseRequested(e.Item);
140146
}
141147

142-
void sink_ComponentAdded(object sender, DispatcherEventArgs<VBComponent> e)
148+
async void sink_ComponentAdded(object sender, DispatcherEventArgs<VBComponent> e)
143149
{
150+
Debug.WriteLine(string.Format("Component '{0}' was added.", e.Item.Name));
144151
_parser.State.OnParseRequested(e.Item);
145152
}
146153

147-
void sink_ComponentActivated(object sender, DispatcherEventArgs<VBComponent> e)
154+
async void sink_ComponentActivated(object sender, DispatcherEventArgs<VBComponent> e)
148155
{
156+
Debug.WriteLine(string.Format("Component '{0}' was activated.", e.Item.Name));
149157
// do something?
150158
}
151159

152-
void sink_ProjectRenamed(object sender, DispatcherRenamedEventArgs<VBProject> e)
160+
async void sink_ProjectRenamed(object sender, DispatcherRenamedEventArgs<VBProject> e)
153161
{
162+
Debug.WriteLine(string.Format("Project '{0}' was renamed.", e.Item.Name));
154163
_parser.State.ClearDeclarations(e.Item);
155164
_parser.State.OnParseRequested();
156165
}
157166

158-
void sink_ProjectActivated(object sender, DispatcherEventArgs<VBProject> e)
167+
async void sink_ProjectActivated(object sender, DispatcherEventArgs<VBProject> e)
159168
{
169+
Debug.WriteLine(string.Format("Project '{0}' was activated.", e.Item.Name));
160170
// do something?
161171
}
162172

@@ -249,13 +259,6 @@ public void Startup()
249259
_appMenus.Initialize();
250260
_appMenus.Localize();
251261

252-
// delay to allow the VBE to properly load. HostApplication is null until then.
253-
Task.Delay(1000).ContinueWith(t =>
254-
{
255-
_parser.State.AddBuiltInDeclarations(_vbe.HostApplication());
256-
//_parser.State.OnParseRequested();
257-
});
258-
259262
//_hooks.AddHook(new LowLevelKeyboardHook(_vbe));
260263
//_hooks.AddHook(new HotKey((IntPtr)_vbe.MainWindow.HWnd, "%^R", Keys.R));
261264
//_hooks.AddHook(new HotKey((IntPtr)_vbe.MainWindow.HWnd, "%^I", Keys.I));

Rubberduck.Parsing/VBA/RubberduckParser.cs

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,13 @@ public RubberduckParser(VBE vbe, RubberduckParserState state)
2929
state.ParseRequest += ReparseRequested;
3030
}
3131

32-
private void ReparseRequested(object sender, EventArgs e)
32+
private async void ReparseRequested(object sender, EventArgs e)
3333
{
34-
Task.Run(() => ParseParallel());
34+
if (!_state.ParseTrees.Any())
35+
{
36+
_state.AddBuiltInDeclarations(_vbe.HostApplication());
37+
}
38+
await ParseParallel();
3539
}
3640

3741
private readonly VBE _vbe;
@@ -102,7 +106,7 @@ private CancellationTokenSource RenewTokenSource(VBComponent component)
102106
return tokenSource;
103107
}
104108

105-
private void ParseParallel()
109+
private async Task ParseParallel()
106110
{
107111
try
108112
{
@@ -114,7 +118,7 @@ private void ParseParallel()
114118
SetComponentsState(components, ParserState.Pending);
115119

116120
var parseTasks = components.Select(vbComponent => Task.Run(() => ParseComponent(vbComponent, false))).ToArray();
117-
Task.WhenAll(parseTasks)
121+
await Task.WhenAll(parseTasks)
118122
.ContinueWith(t =>
119123
{
120124
using (var tokenSource = new CancellationTokenSource())
@@ -148,7 +152,7 @@ private void Parse(VBComponent vbComponent, CancellationToken token, TokenStream
148152
var code = rewriter == null
149153
? string.Join(Environment.NewLine, vbComponent.CodeModule.GetSanitizedCode())
150154
: rewriter.GetText();
151-
// note: removes everything ignored by the parser, e.g. line numbers and comments
155+
// note: removes everything ignored by the parser, e.g. line numbers
152156

153157
ParseInternal(component, code, token);
154158
}
@@ -287,6 +291,7 @@ private void ResolveReferences(VBComponent component, IParseTree tree, Cancellat
287291
return;
288292
}
289293

294+
_state.SetModuleState(component, ParserState.Resolving);
290295
Debug.Print("Resolving '{0}'...", component.Name);
291296

292297
if (!string.IsNullOrWhiteSpace(tree.GetText().Trim()))

0 commit comments

Comments
 (0)