From 463f83630f8a5797cec1bd7dac354a3557572efb Mon Sep 17 00:00:00 2001 From: Roberto Raggi Date: Fri, 6 Aug 2010 11:29:41 +0200 Subject: Speed up the comutation of the local members. --- src/plugins/cppeditor/cpplocalsymbols.cpp | 236 +++++++++++++----------------- 1 file changed, 99 insertions(+), 137 deletions(-) (limited to 'src/plugins/cppeditor/cpplocalsymbols.cpp') diff --git a/src/plugins/cppeditor/cpplocalsymbols.cpp b/src/plugins/cppeditor/cpplocalsymbols.cpp index 0ec5b58934..e3fbaaee2a 100644 --- a/src/plugins/cppeditor/cpplocalsymbols.cpp +++ b/src/plugins/cppeditor/cpplocalsymbols.cpp @@ -81,205 +81,167 @@ public: protected: using ASTVisitor::visit; + using ASTVisitor::endVisit; - bool findMember(Scope *scope, NameAST *ast, unsigned line, unsigned column) + void enterScope(Scope *scope) { - if (! (ast && ast->name)) - return false; - - const Identifier *id = ast->name->identifier(); - - if (scope) { - for (Symbol *member = scope->lookat(id); member; member = member->next()) { - if (member->identifier() != id) - continue; - else if (member->line() < line || (member->line() == line && member->column() <= column)) { - localUses[member].append(SemanticInfo::Use(line, column, id->size(), SemanticInfo::Use::Local)); - return true; + _scopeStack.append(scope); + + for (unsigned i = 0; i < scope->symbolCount(); ++i) { + if (Symbol *member = scope->symbolAt(i)) { + if (member->isDeclaration() || member->isArgument()) { + if (member->name() && member->name()->isNameId()) { + const Identifier *id = member->identifier(); + unsigned line, column; + getTokenStartPosition(member->sourceLocation(), &line, &column); + localUses[member].append(SemanticInfo::Use(line, column, id->size(), SemanticInfo::Use::Local)); + } } } } - - return false; } - void searchUsesInTemplateArguments(NameAST *name) + virtual bool visit(IdExpressionAST *ast) { - if (! name) - return; - - else if (TemplateIdAST *template_id = name->asTemplateId()) { - for (TemplateArgumentListAST *it = template_id->template_argument_list; it; it = it->next) { - accept(it->value); + if (SimpleNameAST *simpleName = ast->name->asSimpleName()) { + const Identifier *id = identifier(simpleName->identifier_token); + for (int i = _scopeStack.size() - 1; i != -1; --i) { + if (Symbol *member = _scopeStack.at(i)->lookat(id)) { + if (member->sourceLocation() < ast->firstToken() || member->scope()->isPrototypeScope()) { + unsigned line, column; + getTokenStartPosition(simpleName->identifier_token, &line, &column); + localUses[member].append(SemanticInfo::Use(line, column, id->size(), SemanticInfo::Use::Local)); + return false; + } + } } } - } - virtual bool visit(SimpleNameAST *ast) - { return findMemberForToken(ast->firstToken(), ast); } + return true; + } - bool findMemberForToken(unsigned tokenIdx, NameAST *ast) + virtual bool visit(QtMemberDeclarationAST *ast) { - const Token &tok = tokenAt(tokenIdx); - if (tok.generated()) - return false; - - unsigned line, column; - getTokenStartPosition(tokenIdx, &line, &column); - - Scope *scope = _doc->scopeAt(line, column); - - while (scope) { - if (scope->isPrototypeScope()) { - Function *fun = scope->owner()->asFunction(); - if (findMember(fun->members(), ast, line, column)) - return false; - else if (findMember(fun->members(), ast, line, column)) - return false; - } else if (scope->isObjCMethodScope()) { - ObjCMethod *method = scope->owner()->asObjCMethod(); - if (findMember(method->members(), ast, line, column)) - return false; - else if (findMember(method->arguments(), ast, line, column)) - return false; - } else if (scope->isBlockScope()) { - if (findMember(scope, ast, line, column)) - return false; - } else { - break; - } - - scope = scope->enclosingScope(); - } + if (tokenKind(ast->q_token) == T_Q_D) + hasD = true; + else + hasQ = true; - return false; + return true; } - virtual bool visit(MemInitializerAST *ast) + virtual bool visit(FunctionDefinitionAST *ast) { - accept(ast->expression_list); - return false; + if (ast->symbol) + enterScope(ast->symbol->members()); + return true; } - virtual bool visit(TemplateIdAST *ast) + virtual void endVisit(FunctionDefinitionAST *ast) { - for (TemplateArgumentListAST *arg = ast->template_argument_list; arg; arg = arg->next) - accept(arg->value); - - const Token &tok = tokenAt(ast->identifier_token); - if (tok.generated()) - return false; - - unsigned line, column; - getTokenStartPosition(ast->firstToken(), &line, &column); - - Scope *scope = _doc->scopeAt(line, column); - - while (scope) { - if (scope->isPrototypeScope()) { - Function *fun = scope->owner()->asFunction(); - if (findMember(fun->members(), ast, line, column)) - return false; - else if (fun->block() && findMember(fun->block()->members(), ast, line, column)) - return false; - } else if (scope->isBlockScope()) { - if (findMember(scope, ast, line, column)) - return false; - } else { - break; - } - - scope = scope->enclosingScope(); - } - - return false; + if (ast->symbol) + _scopeStack.removeLast(); } - virtual bool visit(QualifiedNameAST *ast) + virtual bool visit(CompoundStatementAST *ast) { - for (NestedNameSpecifierListAST *it = ast->nested_name_specifier_list; it; it = it->next) - searchUsesInTemplateArguments(it->value->class_or_namespace_name); - - searchUsesInTemplateArguments(ast->unqualified_name); - return false; + if (ast->symbol) + enterScope(ast->symbol->members()); + return true; } - virtual bool visit(MemberAccessAST *ast) + virtual void endVisit(CompoundStatementAST *ast) { - // accept only the base expression - accept(ast->base_expression); - // and ignore the member name. - return false; + if (ast->symbol) + _scopeStack.removeLast(); } - virtual bool visit(ElaboratedTypeSpecifierAST *) + virtual bool visit(IfStatementAST *ast) { - // ### template args - return false; + if (ast->symbol) + enterScope(ast->symbol->members()); + return true; } - virtual bool visit(ClassSpecifierAST *) + virtual void endVisit(IfStatementAST *ast) { - // ### template args - return false; + if (ast->symbol) + _scopeStack.removeLast(); } - virtual bool visit(EnumSpecifierAST *) + virtual bool visit(WhileStatementAST *ast) { - // ### template args - return false; + if (ast->symbol) + enterScope(ast->symbol->members()); + return true; } - virtual bool visit(UsingDirectiveAST *) + virtual void endVisit(WhileStatementAST *ast) { - return false; + if (ast->symbol) + _scopeStack.removeLast(); } - virtual bool visit(UsingAST *ast) + virtual bool visit(ForStatementAST *ast) { - accept(ast->name); - return false; + if (ast->symbol) + enterScope(ast->symbol->members()); + return true; } - virtual bool visit(QtMemberDeclarationAST *ast) + virtual void endVisit(ForStatementAST *ast) { - if (tokenKind(ast->q_token) == T_Q_D) - hasD = true; - else - hasQ = true; + if (ast->symbol) + _scopeStack.removeLast(); + } + virtual bool visit(ForeachStatementAST *ast) + { + if (ast->symbol) + enterScope(ast->symbol->members()); return true; } - virtual bool visit(ExpressionOrDeclarationStatementAST *ast) + virtual void endVisit(ForeachStatementAST *ast) { - accept(ast->declaration); - return false; + if (ast->symbol) + _scopeStack.removeLast(); } - virtual bool visit(FunctionDeclaratorAST *ast) + virtual bool visit(SwitchStatementAST *ast) { - accept(ast->parameters); - - for (SpecifierListAST *it = ast->cv_qualifier_list; it; it = it->next) - accept(it->value); + if (ast->symbol) + enterScope(ast->symbol->members()); + return true; + } - accept(ast->exception_specification); + virtual void endVisit(SwitchStatementAST *ast) + { + if (ast->symbol) + _scopeStack.removeLast(); + } - return false; + virtual bool visit(CatchClauseAST *ast) + { + if (ast->symbol) + enterScope(ast->symbol->members()); + return true; } - virtual bool visit(ObjCMethodPrototypeAST *ast) + virtual void endVisit(CatchClauseAST *ast) { - accept(ast->argument_list); - return false; + if (ast->symbol) + _scopeStack.removeLast(); } - virtual bool visit(ObjCMessageArgumentDeclarationAST *ast) + virtual bool visit(ExpressionOrDeclarationStatementAST *ast) { - accept(ast->param_name); + accept(ast->declaration); return false; } + +private: + QList _scopeStack; }; } // end of anonymous namespace -- cgit v1.2.3