Skip to content

Commit 7f9d280

Browse files
committed
Simplified ParserState updates in RubberduckParserState by defining precedence
1 parent e9ef9b3 commit 7f9d280

File tree

3 files changed

+15
-51
lines changed

3 files changed

+15
-51
lines changed

Rubberduck.Parsing/VBA/ParserState.cs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,34 +5,34 @@ public enum ParserState
55
/// <summary>
66
/// Parse was requested but hasn't started yet.
77
/// </summary>
8-
Pending,
8+
Pending = 0,
99
/// <summary>
1010
/// Project references are being loaded into parser state.
1111
/// </summary>
12-
LoadingReference,
12+
LoadingReference = 1,
1313
/// <summary>
1414
/// Code from modified modules is being parsed.
1515
/// </summary>
16-
Parsing,
16+
Parsing = 2,
1717
/// <summary>
1818
/// Parse tree is waiting to be walked for identifier resolution.
1919
/// </summary>
20-
Parsed,
20+
Parsed = 3,
2121
/// <summary>
2222
/// Resolving identifier references.
2323
/// </summary>
24-
Resolving,
24+
Resolving = 4,
2525
/// <summary>
2626
/// Parser state is in sync with the actual code in the VBE.
2727
/// </summary>
28-
Ready,
28+
Ready = 5,
2929
/// <summary>
3030
/// Parsing could not be completed for one or more modules.
3131
/// </summary>
32-
Error,
32+
Error = 99,
3333
/// <summary>
3434
/// Parsing completed, but identifier references could not be resolved for one or more modules.
3535
/// </summary>
36-
ResolverError,
36+
ResolverError = 6,
3737
}
3838
}

Rubberduck.Parsing/VBA/RubberduckParser.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -129,8 +129,7 @@ private void AddDeclarationsFromProjectReferences(IReadOnlyList<VBProject> proje
129129
var references = projects
130130
.SelectMany(project => project.References.Cast<Reference>())
131131
.DistinctBy(reference => reference.Guid)
132-
.Where(reference => reference.Type == vbext_RefKind.vbext_rk_TypeLib)
133-
.ToList();
132+
.Where(reference => reference.Type == vbext_RefKind.vbext_rk_TypeLib);
134133
foreach (var reference in references)
135134
{
136135
AddDeclarationsFromReference(reference);

Rubberduck.Parsing/VBA/RubberduckParserState.cs

Lines changed: 6 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -96,51 +96,16 @@ public void SetModuleState(VBComponent component, ParserState state, SyntaxError
9696
Status = EvaluateParserState();
9797
}
9898

99-
private static readonly ParserState[] States = Enum.GetValues(typeof (ParserState)).Cast<ParserState>().ToArray();
100-
10199
private ParserState EvaluateParserState()
102100
{
103-
//lock (_lock)
104-
{
105-
var moduleStates = _moduleStates.Values.ToList();
106-
var state = States.SingleOrDefault(value => moduleStates.All(ps => ps == value));
107-
108-
if (state != default(ParserState))
109-
{
110-
// if all modules are in the same state, we have our result.
111-
Debug.WriteLine("ParserState evaluates to '{0}' (thread {1})", state, Thread.CurrentThread.ManagedThreadId);
112-
return state;
113-
}
101+
var moduleStates = _moduleStates.Values.ToList();
114102

115-
// error state takes precedence over every other state
116-
if (moduleStates.Any(ms => ms == ParserState.Error))
117-
{
118-
Debug.WriteLine("ParserState evaluates to '{0}' (thread {1})", ParserState.Error,
119-
Thread.CurrentThread.ManagedThreadId);
120-
return ParserState.Error;
121-
}
122-
if (moduleStates.Any(ms => ms == ParserState.ResolverError))
123-
{
124-
Debug.WriteLine("ParserState evaluates to '{0}' (thread {1})", ParserState.ResolverError,
125-
Thread.CurrentThread.ManagedThreadId);
126-
return ParserState.ResolverError;
127-
}
128-
129-
// intermediate states are toggled when *any* module has them.
130-
var result = moduleStates.Min();
131-
if (moduleStates.Any(ms => ms == ParserState.Parsing))
132-
{
133-
result = ParserState.Parsing;
134-
}
135-
if (moduleStates.Any(ms => ms == ParserState.Resolving))
136-
{
137-
result = ParserState.Resolving;
138-
}
139-
140-
Debug.WriteLine("ParserState evaluates to '{0}' (thread {1})", result,
141-
Thread.CurrentThread.ManagedThreadId);
142-
return result;
103+
var prelim = moduleStates.Max();
104+
if (prelim == ParserState.Parsed && !moduleStates.All(s => s == ParserState.Parsed))
105+
{
106+
prelim = moduleStates.Where(s => s != ParserState.Parsed).Max();
143107
}
108+
return prelim;
144109
}
145110

146111
public ParserState GetModuleState(VBComponent component)

0 commit comments

Comments
 (0)