@@ -23,7 +23,13 @@ namespace Rubberduck.Parsing.VBA
23
23
{
24
24
public class RubberduckParser : IRubberduckParser , IDisposable
25
25
{
26
- public RubberduckParserState State { get { return _state ; } }
26
+ public RubberduckParserState State
27
+ {
28
+ get
29
+ {
30
+ return _state ;
31
+ }
32
+ }
27
33
28
34
private CancellationTokenSource _central = new CancellationTokenSource ( ) ;
29
35
private CancellationTokenSource _resolverTokenSource ; // linked to _central later
@@ -39,11 +45,11 @@ private readonly IDictionary<VBComponent, IDictionary<Tuple<string, DeclarationT
39
45
private readonly VBE _vbe ;
40
46
private readonly RubberduckParserState _state ;
41
47
private readonly IAttributeParser _attributeParser ;
42
- private static readonly Logger Logger = LogManager . GetCurrentClassLogger ( ) ;
43
48
private readonly Func < IVBAPreprocessor > _preprocessorFactory ;
49
+ private static readonly Logger _logger = LogManager . GetCurrentClassLogger ( ) ;
44
50
45
51
public RubberduckParser (
46
- VBE vbe ,
52
+ VBE vbe ,
47
53
RubberduckParserState state ,
48
54
IAttributeParser attributeParser ,
49
55
Func < IVBAPreprocessor > preprocessorFactory )
@@ -62,13 +68,13 @@ public RubberduckParser(
62
68
63
69
private void StateOnStateChanged ( object sender , EventArgs e )
64
70
{
65
- Logger . Debug ( "RubberduckParser handles OnStateChanged ({0})" , _state . Status ) ;
71
+ _logger . Debug ( "RubberduckParser handles OnStateChanged ({0})" , _state . Status ) ;
66
72
67
- /* if (_state.Status == ParserState.Parsed)
73
+ if ( _state . Status == ParserState . Parsed )
68
74
{
69
- Logger .Debug("(handling OnStateChanged) Starting resolver task");
75
+ _logger . Debug ( "(handling OnStateChanged) Starting resolver task" ) ;
70
76
Resolve ( _central . Token ) ; // Tests expect this to be synchronous
71
- }*/
77
+ }
72
78
}
73
79
74
80
private void ReparseRequested ( object sender , ParseRequestEventArgs e )
@@ -81,10 +87,7 @@ private void ReparseRequested(object sender, ParseRequestEventArgs e)
81
87
else
82
88
{
83
89
Cancel ( e . Component ) ;
84
- ParseAsync ( e . Component , CancellationToken . None ) . Wait ( ) ;
85
-
86
- Logger . Trace ( "Starting resolver task" ) ;
87
- Resolve ( _central . Token ) ; // Tests expect this to be synchronous
90
+ ParseAsync ( e . Component , CancellationToken . None ) ;
88
91
}
89
92
}
90
93
@@ -140,14 +143,6 @@ private void ParseAll()
140
143
var toParse = components . Where ( c => _state . IsNewOrModified ( c ) ) . ToList ( ) ;
141
144
var unchanged = components . Where ( c => ! _state . IsNewOrModified ( c ) ) . ToList ( ) ;
142
145
143
- File . AppendAllLines ( "C:/Users/hosch/Desktop/debug.txt" , new [ ]
144
- {
145
- "Projects: " + projects . Count ,
146
- "Components: " + components . Count ,
147
- "ToParse: " + toParse . Count ,
148
- "Unchanged: " + unchanged . Count
149
- } ) ;
150
-
151
146
AddBuiltInDeclarations ( projects ) ;
152
147
153
148
if ( ! toParse . Any ( ) )
@@ -179,11 +174,10 @@ private void ParseAll()
179
174
_componentAttributes . Remove ( invalidated ) ;
180
175
}
181
176
182
- var parseTasks = toParse . Select ( vbComponent => ParseAsync ( vbComponent , CancellationToken . None ) ) . ToArray ( ) ;
183
- Task . WaitAll ( parseTasks ) ;
184
-
185
- Logger . Trace ( "Starting resolver task" ) ;
186
- Resolve ( _central . Token ) ; // Tests expect this to be synchronous
177
+ foreach ( var vbComponent in toParse )
178
+ {
179
+ ParseAsync ( vbComponent , CancellationToken . None ) ;
180
+ }
187
181
}
188
182
189
183
private void AddBuiltInDeclarations ( IReadOnlyList < VBProject > projects )
@@ -491,20 +485,16 @@ private void ResolveInternal(CancellationToken token)
491
485
var components = _state . Projects
492
486
. Where ( project => project . Protection == vbext_ProjectProtection . vbext_pp_none )
493
487
. SelectMany ( p => p . VBComponents . Cast < VBComponent > ( ) ) . ToList ( ) ;
494
-
495
- File . AppendAllLines ( "C:/Users/hosch/Desktop/debug.txt" , new [ ]
488
+ if ( ! _state . HasAllParseTrees ( components ) )
496
489
{
497
- "Parse tree count: " + _state . ParseTrees . Count ( )
498
- } ) ;
499
-
500
- Debug . Assert ( _state . HasAllParseTrees ( components ) , string . Format ( "Expected parse trees: {0}\r \n Parse trees: {1}" , components . Count , _state . ParseTrees . Count ( ) ) ) ;
501
-
490
+ return ;
491
+ }
502
492
_projectDeclarations . Clear ( ) ;
503
493
_state . ClearBuiltInReferences ( ) ;
504
494
foreach ( var kvp in _state . ParseTrees )
505
495
{
506
496
var qualifiedName = kvp . Key ;
507
- Logger . Debug ( "Module '{0}' {1}" , qualifiedName . ComponentName , _state . IsNewOrModified ( qualifiedName ) ? "was modified" : "was NOT modified" ) ;
497
+ _logger . Debug ( "Module '{0}' {1}" , qualifiedName . ComponentName , _state . IsNewOrModified ( qualifiedName ) ? "was modified" : "was NOT modified" ) ;
508
498
// modified module; walk parse tree and re-acquire all declarations
509
499
if ( token . IsCancellationRequested ) return ;
510
500
ResolveDeclarations ( qualifiedName . Component , kvp . Value ) ;
@@ -548,12 +538,7 @@ private void ResolveDeclarations(VBComponent component, IParseTree tree)
548
538
_state . AddDeclaration ( projectDeclaration ) ;
549
539
}
550
540
}
551
- var declarationsListener = new DeclarationSymbolsListener ( qualifiedModuleName , Accessibility . Implicit , component . Type , _state . GetModuleComments ( component ) , _state . GetModuleAnnotations ( component ) , _state . GetModuleAttributes ( component ) , _projectReferences , projectDeclaration ) ;
552
- // TODO: should we unify the API? consider working like the other listeners instead of event-based
553
- declarationsListener . NewDeclaration += ( sender , e ) => _state . AddDeclaration ( e . Declaration ) ;
554
- declarationsListener . CreateModuleDeclarations ( ) ;
555
-
556
- Logger . Debug ( "Walking parse tree for '{0}'... (acquiring declarations)" , qualifiedModuleName . Name ) ;
541
+ _logger . Debug ( "Creating declarations for module {0}." , qualifiedModuleName . Name ) ;
557
542
var declarationsListener = new DeclarationSymbolsListener ( qualifiedModuleName , component . Type , _state . GetModuleComments ( component ) , _state . GetModuleAnnotations ( component ) , _state . GetModuleAttributes ( component ) , _projectReferences , projectDeclaration ) ;
558
543
ParseTreeWalker . Default . Walk ( declarationsListener , tree ) ;
559
544
foreach ( var createdDeclaration in declarationsListener . CreatedDeclarations )
@@ -563,7 +548,7 @@ private void ResolveDeclarations(VBComponent component, IParseTree tree)
563
548
}
564
549
catch ( Exception exception )
565
550
{
566
- Logger . Error ( exception , "Exception thrown acquiring declarations for '{0}' (thread {1})." , component . Name , Thread . CurrentThread . ManagedThreadId ) ;
551
+ _logger . Error ( exception , "Exception thrown acquiring declarations for '{0}' (thread {1})." , component . Name , Thread . CurrentThread . ManagedThreadId ) ;
567
552
lock ( _state )
568
553
{
569
554
_state . SetModuleState ( component , ParserState . ResolverError ) ;
@@ -593,7 +578,7 @@ private void ResolveReferences(DeclarationFinder finder, VBComponent component,
593
578
return ;
594
579
}
595
580
var qualifiedName = new QualifiedModuleName ( component ) ;
596
- Logger . Debug ( "Resolving identifier references in '{0}'... (thread {1})" , qualifiedName . Name , Thread . CurrentThread . ManagedThreadId ) ;
581
+ _logger . Debug ( "Resolving identifier references in '{0}'... (thread {1})" , qualifiedName . Name , Thread . CurrentThread . ManagedThreadId ) ;
597
582
var resolver = new IdentifierReferenceResolver ( qualifiedName , finder ) ;
598
583
var listener = new IdentifierReferenceListener ( resolver ) ;
599
584
if ( ! string . IsNullOrWhiteSpace ( tree . GetText ( ) . Trim ( ) ) )
@@ -604,19 +589,19 @@ private void ResolveReferences(DeclarationFinder finder, VBComponent component,
604
589
Stopwatch watch = Stopwatch . StartNew ( ) ;
605
590
walker . Walk ( listener , tree ) ;
606
591
watch . Stop ( ) ;
607
- Logger . Debug ( "Binding Resolution done for component '{0}' in {1}ms (thread {2})" , component . Name , watch . ElapsedMilliseconds , Thread . CurrentThread . ManagedThreadId ) ;
592
+ _logger . Debug ( "Binding Resolution done for component '{0}' in {1}ms (thread {2})" , component . Name , watch . ElapsedMilliseconds , Thread . CurrentThread . ManagedThreadId ) ;
608
593
_state . RebuildSelectionCache ( ) ;
609
594
state = ParserState . Ready ;
610
595
}
611
596
catch ( Exception exception )
612
597
{
613
- Logger . Error ( exception , "Exception thrown resolving '{0}' (thread {1})." , component . Name , Thread . CurrentThread . ManagedThreadId ) ;
598
+ _logger . Error ( exception , "Exception thrown resolving '{0}' (thread {1})." , component . Name , Thread . CurrentThread . ManagedThreadId ) ;
614
599
state = ParserState . ResolverError ;
615
600
}
616
601
}
617
602
618
603
_state . SetModuleState ( component , state ) ;
619
- Logger . Debug ( "'{0}' is {1} (thread {2})" , component . Name , _state . GetModuleState ( component ) , Thread . CurrentThread . ManagedThreadId ) ;
604
+ _logger . Debug ( "'{0}' is {1} (thread {2})" , component . Name , _state . GetModuleState ( component ) , Thread . CurrentThread . ManagedThreadId ) ;
620
605
}
621
606
622
607
public void Dispose ( )
0 commit comments