protected void ResolveDeclarations(QualifiedModuleName module, IParseTree tree, CancellationToken token) { var stopwatch = Stopwatch.StartNew(); try { var projectDeclaration = GetOrCreateProjectDeclaration(module); Logger.Debug("Creating declarations for module {0}.", module.Name); var declarationsListener = new DeclarationSymbolsListener(_state, module, _state.GetModuleAnnotations(module), _state.GetModuleAttributes(module), projectDeclaration); ParseTreeWalker.Default.Walk(declarationsListener, tree); foreach (var createdDeclaration in declarationsListener.CreatedDeclarations) { _state.AddDeclaration(createdDeclaration); } } catch (Exception exception) { Logger.Error(exception, "Exception thrown acquiring declarations for '{0}' (thread {1}).", module.Name, Thread.CurrentThread.ManagedThreadId); _parserStateManager.SetModuleState(module, ParserState.ResolverError, token); } stopwatch.Stop(); Logger.Debug("{0}ms to resolve declarations for component {1}", stopwatch.ElapsedMilliseconds, module.Name); }
/// <summary> /// Locates all declared symbols (identifiers) in the project. /// </summary> /// <remarks> /// This method walks the entire parse tree for each module. /// </remarks> private void IdentifySymbols() { foreach (var componentParseResult in _parseResults.Where(r => r.Component != null)) { try { var listener = new DeclarationSymbolsListener(componentParseResult); var walker = new ParseTreeWalker(); walker.Walk(listener, componentParseResult.ParseTree); if (!_declarations.Items.Any()) { var projectIdentifier = componentParseResult.QualifiedName.Project.Name; var memberName = componentParseResult.QualifiedName.QualifyMemberName(projectIdentifier); var projectDeclaration = new Declaration(memberName, "VBE", projectIdentifier, false, false, Accessibility.Global, DeclarationType.Project, false); _declarations.Add(projectDeclaration); } foreach (var declaration in listener.Declarations.Items) { _declarations.Add(declaration); } } catch (COMException) { // something happened, couldn't access VBComponent for some reason } } }
public VBComponentParseResult(VBComponent component, IParseTree parseTree, IEnumerable <CommentNode> comments, ITokenStream tokenStream) { _component = component; _qualifiedName = new QualifiedModuleName(component); _parseTree = parseTree; _comments = comments; _tokenStream = tokenStream; var listener = new DeclarationSymbolsListener(_qualifiedName, Accessibility.Implicit, _component.Type); var walker = new ParseTreeWalker(); walker.Walk(listener, _parseTree); _declarations.AddRange(listener.Declarations.Items); }
private void ResolveDeclarations(VBComponent component, IParseTree tree) { var qualifiedModuleName = new QualifiedModuleName(component); var obsoleteCallStatementListener = new ObsoleteCallStatementListener(); var obsoleteLetStatementListener = new ObsoleteLetStatementListener(); var emptyStringLiteralListener = new EmptyStringLiteralListener(); var argListWithOneByRefParamListener = new ArgListWithOneByRefParamListener(); try { ParseTreeWalker.Default.Walk(new CombinedParseTreeListener(new IParseTreeListener[] { obsoleteCallStatementListener, obsoleteLetStatementListener, emptyStringLiteralListener, argListWithOneByRefParamListener, }), tree); // TODO: these are actually (almost) inspection results.. we should handle them as such _state.ArgListsWithOneByRefParam = argListWithOneByRefParamListener.Contexts.Select(context => new QualifiedContext(qualifiedModuleName, context)); _state.EmptyStringLiterals = emptyStringLiteralListener.Contexts.Select(context => new QualifiedContext(qualifiedModuleName, context)); _state.ObsoleteLetContexts = obsoleteLetStatementListener.Contexts.Select(context => new QualifiedContext(qualifiedModuleName, context)); _state.ObsoleteCallContexts = obsoleteCallStatementListener.Contexts.Select(context => new QualifiedContext(qualifiedModuleName, context)); var project = component.Collection.Parent; var projectQualifiedName = new QualifiedModuleName(project); Declaration projectDeclaration; if (!_projectDeclarations.TryGetValue(projectQualifiedName.ProjectId, out projectDeclaration)) { projectDeclaration = CreateProjectDeclaration(projectQualifiedName, project); _projectDeclarations.Add(projectQualifiedName.ProjectId, projectDeclaration); _state.AddDeclaration(projectDeclaration); } var declarationsListener = new DeclarationSymbolsListener(qualifiedModuleName, Accessibility.Implicit, component.Type, _state.GetModuleComments(component), _state.GetModuleAnnotations(component), _state.GetModuleAttributes(component), _projectReferences, projectDeclaration); // TODO: should we unify the API? consider working like the other listeners instead of event-based declarationsListener.NewDeclaration += (sender, e) => _state.AddDeclaration(e.Declaration); declarationsListener.CreateModuleDeclarations(); // rewalk parse tree for second declaration level Debug.WriteLine("Walking parse tree for '{0}'... (acquiring declarations)", qualifiedModuleName.Name); ParseTreeWalker.Default.Walk(declarationsListener, tree); } catch (Exception exception) { Debug.Print("Exception thrown acquiring declarations for '{0}' (thread {2}): {1}", component.Name, exception, Thread.CurrentThread.ManagedThreadId); _state.SetModuleState(component, ParserState.ResolverError); } }
private void ResolveDeclarations(VBComponent component, IParseTree tree) { if (component == null) { return; } var qualifiedModuleName = new QualifiedModuleName(component); try { var project = component.Collection.Parent; var projectQualifiedName = new QualifiedModuleName(project); Declaration projectDeclaration; if (!_projectDeclarations.TryGetValue(projectQualifiedName.ProjectId, out projectDeclaration)) { projectDeclaration = CreateProjectDeclaration(projectQualifiedName, project); _projectDeclarations.Add(projectQualifiedName.ProjectId, projectDeclaration); lock (_state) { _state.AddDeclaration(projectDeclaration); } } Logger.Debug("Creating declarations for module {0}.", qualifiedModuleName.Name); var declarationsListener = new DeclarationSymbolsListener(qualifiedModuleName, component.Type, _state.GetModuleComments(component), _state.GetModuleAnnotations(component), _state.GetModuleAttributes(component), _projectReferences, projectDeclaration); ParseTreeWalker.Default.Walk(declarationsListener, tree); foreach (var createdDeclaration in declarationsListener.CreatedDeclarations) { _state.AddDeclaration(createdDeclaration); } } catch (Exception exception) { Logger.Error(exception, "Exception thrown acquiring declarations for '{0}' (thread {1}).", component.Name, Thread.CurrentThread.ManagedThreadId); lock (_state) { _state.SetModuleState(component, ParserState.ResolverError); } } }
private void ResolveDeclarations(VBComponent component, IParseTree tree) { if (component == null) { return; } var qualifiedModuleName = new QualifiedModuleName(component); var stopwatch = Stopwatch.StartNew(); try { var project = component.Collection.Parent; var projectQualifiedName = new QualifiedModuleName(project); Declaration projectDeclaration; if (!_projectDeclarations.TryGetValue(projectQualifiedName.ProjectId, out projectDeclaration)) { projectDeclaration = CreateProjectDeclaration(projectQualifiedName, project); _projectDeclarations.AddOrUpdate(projectQualifiedName.ProjectId, projectDeclaration, (s, c) => projectDeclaration); State.AddDeclaration(projectDeclaration); } Logger.Debug("Creating declarations for module {0}.", qualifiedModuleName.Name); var declarationsListener = new DeclarationSymbolsListener(State, qualifiedModuleName, component.Type, State.GetModuleAnnotations(component), State.GetModuleAttributes(component), projectDeclaration); ParseTreeWalker.Default.Walk(declarationsListener, tree); foreach (var createdDeclaration in declarationsListener.CreatedDeclarations) { State.AddDeclaration(createdDeclaration); } } catch (Exception exception) { Logger.Error(exception, "Exception thrown acquiring declarations for '{0}' (thread {1}).", component.Name, Thread.CurrentThread.ManagedThreadId); State.SetModuleState(component, ParserState.ResolverError); } stopwatch.Stop(); Logger.Debug("{0}ms to resolve declarations for component {1}", stopwatch.ElapsedMilliseconds, component.Name); }