Skip to content

Commit 27a470f

Browse files
committed
fixed parser/state glitch; fine-tuned extract/implement interface refactorings
1 parent fad090d commit 27a470f

File tree

3 files changed

+51
-14
lines changed

3 files changed

+51
-14
lines changed

RetailCoder.VBE/Refactorings/ExtractInterface/ExtractInterfaceRefactoring.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ private void AddInterface()
6262
var interfaceComponent = _model.TargetDeclaration.Project.VBComponents.Add(vbext_ComponentType.vbext_ct_ClassModule);
6363
interfaceComponent.Name = _model.InterfaceName;
6464

65-
_editor.InsertLines(1, Tokens.Option + ' ' + Tokens.Explicit + Environment.NewLine + Environment.NewLine);
65+
_editor.InsertLines(1, Tokens.Option + ' ' + Tokens.Explicit + Environment.NewLine);
6666
_editor.InsertLines(3, GetInterfaceModuleBody());
6767

6868
var module = _model.TargetDeclaration.QualifiedSelection.QualifiedName.Component.CodeModule;

RetailCoder.VBE/Refactorings/ImplementInterface/ImplementInterfaceRefactoring.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ private void AddItems(List<Declaration> members)
8787

8888
foreach (var member in members)
8989
{
90-
module.InsertLines(module.CountOfDeclarationLines + 1, GetInterfaceMember(member));
90+
module.InsertLines(module.CountOfDeclarationLines + 2, GetInterfaceMember(member));
9191
}
9292
}
9393

Rubberduck.Parsing/VBA/RubberduckParserState.cs

Lines changed: 49 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,18 @@ public enum ResolutionState
1616
Unresolved
1717
}
1818

19+
public class ParserStateEventArgs : EventArgs
20+
{
21+
private readonly ParserState _state;
22+
23+
public ParserStateEventArgs(ParserState state)
24+
{
25+
_state = state;
26+
}
27+
28+
public ParserState State { get {return _state; } }
29+
}
30+
1931
public sealed class RubberduckParserState
2032
{
2133
public event EventHandler ParseRequest;
@@ -30,14 +42,14 @@ public sealed class RubberduckParserState
3042
private readonly ConcurrentDictionary<VBComponent, IParseTree> _parseTrees =
3143
new ConcurrentDictionary<VBComponent, IParseTree>();
3244

33-
public event EventHandler StateChanged;
45+
public event EventHandler<ParserStateEventArgs> StateChanged;
3446

35-
private void OnStateChanged()
47+
private void OnStateChanged(ParserState state)
3648
{
3749
var handler = StateChanged;
3850
if (handler != null)
3951
{
40-
handler.Invoke(this, EventArgs.Empty);
52+
handler.Invoke(this, new ParserStateEventArgs(state));
4153
}
4254
}
4355

@@ -56,16 +68,41 @@ public void SetModuleState(VBComponent component, ParserState state, SyntaxError
5668
// prevent multiple threads from changing state simultaneously:
5769
lock(_lock)
5870
{
59-
Status = _moduleStates.Values.Any(value => value == ParserState.Error)
60-
? ParserState.Error
61-
: _moduleStates.Values.Any(value => value == ParserState.Parsing)
62-
? ParserState.Parsing
63-
: _moduleStates.Values.Any(value => value == ParserState.Resolving)
64-
? ParserState.Resolving
65-
: ParserState.Ready;
71+
Status = EvaluateParserState();
72+
6673
}
6774
}
6875

76+
private ParserState EvaluateParserState()
77+
{
78+
var moduleStates = _moduleStates.Values.ToList();
79+
var state = Enum.GetValues(typeof (ParserState)).Cast<ParserState>()
80+
.SingleOrDefault(value => moduleStates.All(ps => ps == value));
81+
82+
if (state != default(ParserState))
83+
{
84+
// if all modules are in the same state, we have our result.
85+
return state;
86+
}
87+
88+
// intermediate states are toggled when *any* module has them.
89+
if (moduleStates.Any(ms => ms == ParserState.Error))
90+
{
91+
// error state takes precedence over every other state
92+
return ParserState.Error;
93+
}
94+
if (moduleStates.Any(ms => ms == ParserState.Parsing || ms == ParserState.Parsed))
95+
{
96+
return ParserState.Parsing;
97+
}
98+
if (moduleStates.Any(ms => ms == ParserState.Resolving))
99+
{
100+
return ParserState.Resolving;
101+
}
102+
103+
return ParserState.Pending;
104+
}
105+
69106
public ParserState GetModuleState(VBComponent component)
70107
{
71108
return _moduleStates[component];
@@ -80,7 +117,7 @@ private set
80117
if (_status != value)
81118
{
82119
_status = value;
83-
OnStateChanged();
120+
OnStateChanged(value);
84121
}
85122
}
86123
}
@@ -125,7 +162,7 @@ public IEnumerable<CommentNode> Comments
125162
{
126163
get
127164
{
128-
return _comments.Values.SelectMany(comments => comments);
165+
return _comments.Values.SelectMany(comments => comments.ToList());
129166
}
130167
}
131168

0 commit comments

Comments
 (0)