Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 9 additions & 5 deletions RetailCoder.VBE/UI/SelectionChangeService.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using System;
using System.Linq;
using System.Threading.Tasks;
using Rubberduck.Parsing;
using Rubberduck.Parsing.Symbols;
using Rubberduck.VBEditor.Events;
Expand Down Expand Up @@ -39,8 +40,11 @@ private void OnVbeSelectionChanged(object sender, SelectionChangedEventArgs e)
return;
}

var eventArgs = new DeclarationChangedEventArgs(e.CodePane, _parser.State.FindSelectedDeclaration(e.CodePane));
DispatchSelectedDeclaration(eventArgs);
new Task(() =>
{
var eventArgs = new DeclarationChangedEventArgs(e.CodePane, _parser.State.FindSelectedDeclaration(e.CodePane));
DispatchSelectedDeclaration(eventArgs);
}).Start();
}

private void OnVbeFocusChanged(object sender, WindowChangedEventArgs e)
Expand All @@ -55,21 +59,21 @@ private void OnVbeFocusChanged(object sender, WindowChangedEventArgs e)
{
return;
}
DispatchSelectedDesignerDeclaration(_vbe.SelectedVBComponent);
new Task(() => DispatchSelectedDesignerDeclaration(_vbe.SelectedVBComponent)).Start();
break;
case WindowKind.CodeWindow:
//Caret changed in a code pane.
if (e.CodePane != null && !e.CodePane.IsWrappingNullReference)
{
DispatchSelectedDeclaration(new DeclarationChangedEventArgs(e.CodePane, _parser.State.FindSelectedDeclaration(e.CodePane)));
new Task(() => DispatchSelectedDeclaration(new DeclarationChangedEventArgs(e.CodePane, _parser.State.FindSelectedDeclaration(e.CodePane)))).Start();
}
break;
}
}
else if (e.EventType == FocusType.ChildFocus)
{
//Treeview selection changed in project window.
DispatchSelectedProjectNodeDeclaration(_vbe.SelectedVBComponent);
new Task(() => DispatchSelectedProjectNodeDeclaration(_vbe.SelectedVBComponent)).Start();
}
}

Expand Down
7 changes: 7 additions & 0 deletions Rubberduck.Parsing/Symbols/Declaration.cs
Original file line number Diff line number Diff line change
Expand Up @@ -616,5 +616,12 @@ public void ClearReferences()
{
_references = new ConcurrentBag<IdentifierReference>();
}

public void RemoveReferencesFrom(ICollection<QualifiedModuleName> modulesByWhichToRemoveReferences)
{
//This gets replaced with a new ConcurrentBag because one cannot remove specific items from a ConcurrentBag.
//Moreover, changing to a ConcurrentDictionary<IdentifierReference,byte> breaks all sorts of tests, for some obscure reason.
var newReferences = new ConcurrentBag<IdentifierReference>(_references.Where(reference => !modulesByWhichToRemoveReferences.Contains(reference.QualifiedModuleName)));
}
}
}
42 changes: 25 additions & 17 deletions Rubberduck.Parsing/Symbols/DeclarationFinder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ public static IEnumerable<TValue> AllValues<TKey, TValue>(
public static ConcurrentDictionary<TKey, ConcurrentBag<TValue>> ToConcurrentDictionary<TKey, TValue>(this IEnumerable<IGrouping<TKey, TValue>> source)
{
return new ConcurrentDictionary<TKey, ConcurrentBag<TValue>>(source.Select(x => new KeyValuePair<TKey, ConcurrentBag<TValue>>(x.Key, new ConcurrentBag<TValue>(x))));
}
}
}

public class DeclarationFinder
Expand All @@ -42,8 +42,9 @@ public class DeclarationFinder
private readonly AnnotationService _annotationService;
private readonly ConcurrentDictionary<string, ConcurrentBag<Declaration>> _declarationsByName;
private readonly ConcurrentDictionary<QualifiedModuleName, ConcurrentBag<Declaration>> _declarations;
private readonly ConcurrentDictionary<QualifiedMemberName, ConcurrentBag<Declaration>> _undeclared;
private readonly ConcurrentBag<UnboundMemberDeclaration> _unresolved;
private readonly ConcurrentDictionary<QualifiedMemberName, ConcurrentBag<Declaration>> _newUndeclared;
private readonly ConcurrentBag<UnboundMemberDeclaration> _newUnresolved;
private readonly List<UnboundMemberDeclaration> _unresolved;
private readonly ConcurrentDictionary<QualifiedModuleName, ConcurrentBag<IAnnotation>> _annotations;
private readonly ConcurrentDictionary<Declaration, ConcurrentBag<Declaration>> _parametersByParent;
private readonly ConcurrentDictionary<DeclarationType, ConcurrentBag<Declaration>> _userDeclarationsByType;
Expand All @@ -54,7 +55,7 @@ public class DeclarationFinder

private static readonly object ThreadLock = new object();

public DeclarationFinder(IReadOnlyList<Declaration> declarations, IEnumerable<IAnnotation> annotations, IHostApplication hostApp = null)
public DeclarationFinder(IReadOnlyList<Declaration> declarations, IEnumerable<IAnnotation> annotations, IReadOnlyList<UnboundMemberDeclaration> unresolvedMemberDeclarations, IHostApplication hostApp = null)
{
_hostApp = hostApp;
_annotations = annotations.GroupBy(node => node.QualifiedSelection.QualifiedName).ToConcurrentDictionary();
Expand Down Expand Up @@ -90,8 +91,10 @@ public DeclarationFinder(IReadOnlyList<Declaration> declarations, IEnumerable<IA
.ToDictionary(item => item.WithEventsField, item => item.Handlers.ToArray())
), true);

_undeclared = new ConcurrentDictionary<QualifiedMemberName, ConcurrentBag<Declaration>>(new Dictionary<QualifiedMemberName, ConcurrentBag<Declaration>>());
_unresolved = new ConcurrentBag<UnboundMemberDeclaration>(new List<UnboundMemberDeclaration>());
_newUndeclared = new ConcurrentDictionary<QualifiedMemberName, ConcurrentBag<Declaration>>(new Dictionary<QualifiedMemberName, ConcurrentBag<Declaration>>());
_newUnresolved = new ConcurrentBag<UnboundMemberDeclaration>(new List<UnboundMemberDeclaration>());
_unresolved = unresolvedMemberDeclarations.ToList();

_annotationService = new AnnotationService(this);

var implementsInstructions = UserDeclarations(DeclarationType.ClassModule).SelectMany(cls =>
Expand Down Expand Up @@ -134,9 +137,9 @@ public DeclarationFinder(IReadOnlyList<Declaration> declarations, IEnumerable<IA
implementableMembers.ToDictionary(item => item.Context, item => item.Members)), true);
}

public IEnumerable<Declaration> Undeclared
public IEnumerable<Declaration> FreshUndeclared
{
get { return _undeclared.AllValues(); }
get { return _newUndeclared.AllValues(); }
}

public IEnumerable<Declaration> Members(Declaration module)
Expand Down Expand Up @@ -209,14 +212,19 @@ public IEnumerable<Declaration> UserDeclarations(DeclarationType type)
return result;
}

public IEnumerable<UnboundMemberDeclaration> UnresolvedMemberDeclarations()
public IEnumerable<UnboundMemberDeclaration> FreshUnresolvedMemberDeclarations()
{
lock (ThreadLock)
{
return _unresolved.ToArray();
return _newUnresolved.ToArray();
}
}

public IEnumerable<UnboundMemberDeclaration> UnresolvedMemberDeclarations()
{
return _unresolved.ToList();
}

public IEnumerable<Declaration> FindHandlersForWithEventsField(Declaration field)
{
Declaration[] result;
Expand Down Expand Up @@ -510,13 +518,13 @@ public Declaration OnUndeclaredVariable(Declaration enclosingProcedure, string i
Accessibility.Implicit, DeclarationType.Variable, context, context.GetSelection(), false, null,
false, annotations, null, true);

var hasUndeclared = _undeclared.ContainsKey(enclosingProcedure.QualifiedName);
var hasUndeclared = _newUndeclared.ContainsKey(enclosingProcedure.QualifiedName);
if (hasUndeclared)
{
ConcurrentBag<Declaration> undeclared;
while (!_undeclared.TryGetValue(enclosingProcedure.QualifiedName, out undeclared))
while (!_newUndeclared.TryGetValue(enclosingProcedure.QualifiedName, out undeclared))
{
_undeclared.TryGetValue(enclosingProcedure.QualifiedName, out undeclared);
_newUndeclared.TryGetValue(enclosingProcedure.QualifiedName, out undeclared);
}
var inScopeUndeclared = undeclared.FirstOrDefault(d => d.IdentifierName == identifierName);
if (inScopeUndeclared != null)
Expand All @@ -527,7 +535,7 @@ public Declaration OnUndeclaredVariable(Declaration enclosingProcedure, string i
}
else
{
_undeclared.TryAdd(enclosingProcedure.QualifiedName, new ConcurrentBag<Declaration> { undeclaredLocal });
_newUndeclared.TryAdd(enclosingProcedure.QualifiedName, new ConcurrentBag<Declaration> { undeclaredLocal });
}
return undeclaredLocal;
}
Expand All @@ -550,7 +558,7 @@ public void AddUnboundContext(Declaration parentDeclaration, VBAParser.LExprCont
(access is VBAParser.MemberAccessExprContext) ? (ParserRuleContext)access.children[0] : withExpression.Context,
annotations);

_unresolved.Add(declaration);
_newUnresolved.Add(declaration);
}

public Declaration OnBracketedExpression(string expression, ParserRuleContext context)
Expand All @@ -561,13 +569,13 @@ public Declaration OnBracketedExpression(string expression, ParserRuleContext co
var qualifiedName = hostApp.QualifiedName.QualifiedModuleName.QualifyMemberName(expression);

ConcurrentBag<Declaration> undeclared;
if (_undeclared.TryGetValue(qualifiedName, out undeclared))
if (_newUndeclared.TryGetValue(qualifiedName, out undeclared))
{
return undeclared.SingleOrDefault();
}

var item = new Declaration(qualifiedName, hostApp, hostApp, Tokens.Variant, string.Empty, false, false, Accessibility.Global, DeclarationType.BracketedExpression, context, context.GetSelection(), false, null);
_undeclared.TryAdd(qualifiedName, new ConcurrentBag<Declaration> { item });
_newUndeclared.TryAdd(qualifiedName, new ConcurrentBag<Declaration> { item });
return item;
}

Expand Down
7 changes: 6 additions & 1 deletion Rubberduck.Parsing/VBA/ModuleState.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ namespace Rubberduck.Parsing.VBA
public class ModuleState
{
public ConcurrentDictionary<Declaration, byte> Declarations { get; private set; }
public ConcurrentDictionary<UnboundMemberDeclaration, byte> UnresolvedMemberDeclarations { get; private set; }
public ITokenStream TokenStream { get; private set; }
public IParseTree ParseTree { get; private set; }
public ParserState State { get; private set; }
Expand All @@ -29,7 +30,8 @@ public class ModuleState
public ModuleState(ConcurrentDictionary<Declaration, byte> declarations)
{
Declarations = declarations;
TokenStream = null;
UnresolvedMemberDeclarations = new ConcurrentDictionary<UnboundMemberDeclaration, byte>();
TokenStream = null;UnboundMemberDeclaration
ParseTree = null;

if (declarations.Any() && declarations.ElementAt(0).Key.QualifiedName.QualifiedModuleName.Component != null)
Expand All @@ -55,6 +57,7 @@ public ModuleState(ConcurrentDictionary<Declaration, byte> declarations)
public ModuleState(ParserState state)
{
Declarations = new ConcurrentDictionary<Declaration, byte>();
UnresolvedMemberDeclarations = new ConcurrentDictionary<UnboundMemberDeclaration, byte>();
TokenStream = null;
ParseTree = null;
State = state;
Expand All @@ -72,6 +75,7 @@ public ModuleState(ParserState state)
public ModuleState(SyntaxErrorException moduleException)
{
Declarations = new ConcurrentDictionary<Declaration, byte>();
UnresolvedMemberDeclarations = new ConcurrentDictionary<UnboundMemberDeclaration, byte>();
TokenStream = null;
ParseTree = null;
State = ParserState.Error;
Expand All @@ -89,6 +93,7 @@ public ModuleState(SyntaxErrorException moduleException)
public ModuleState(IDictionary<Tuple<string, DeclarationType>, Attributes> moduleAttributes)
{
Declarations = new ConcurrentDictionary<Declaration, byte>();
UnresolvedMemberDeclarations = new ConcurrentDictionary<UnboundMemberDeclaration, byte>();
TokenStream = null;
ParseTree = null;
State = ParserState.None;
Expand Down
Loading