From c6968d956e9d8d3e72c7944091cc4245fb36fb8b Mon Sep 17 00:00:00 2001 From: Roberto Raggi <roberto.raggi@nokia.com> Date: Thu, 25 Jun 2009 16:11:28 +0200 Subject: [PATCH] Mark the externals --- src/plugins/cppeditor/cppeditor.cpp | 194 +++++++++++----------------- 1 file changed, 78 insertions(+), 116 deletions(-) diff --git a/src/plugins/cppeditor/cppeditor.cpp b/src/plugins/cppeditor/cppeditor.cpp index 249badf7a76..d1f84bd6032 100644 --- a/src/plugins/cppeditor/cppeditor.cpp +++ b/src/plugins/cppeditor/cppeditor.cpp @@ -110,7 +110,7 @@ public: } }; -class FindLocals: protected ASTVisitor +class FindUses: protected ASTVisitor { Scope *_functionScope; @@ -177,7 +177,7 @@ class FindLocals: protected ASTVisitor }; public: - FindLocals(Control *control) + FindUses(Control *control) : ASTVisitor(control) { } @@ -193,19 +193,25 @@ public: : name(name), line(line), column(column), length(length) {} }; - typedef QHash<Symbol *, QList<Use> > UseMap; - typedef QHashIterator<Symbol *, QList<Use> > UseIterator; + typedef QHash<Symbol *, QList<Use> > LocalUseMap; + typedef QHashIterator<Symbol *, QList<Use> > LocalUseIterator; - UseMap uses; // ### private + typedef QHash<Identifier *, QList<Use> > ExternalUseMap; + typedef QHashIterator<Identifier *, QList<Use> > ExternalUseIterator; - UseMap operator()(FunctionDefinitionAST *ast) + // local and external uses. + LocalUseMap localUses; + ExternalUseMap externalUses; + + void operator()(FunctionDefinitionAST *ast) { - uses.clear(); + localUses.clear(); + externalUses.clear(); + if (ast && ast->symbol) { _functionScope = ast->symbol->members(); accept(ast); } - return uses; } protected: @@ -221,7 +227,7 @@ protected: continue; else if (member->line() < line || (member->line() == line && member->column() <= column)) { //qDebug() << "*** found member:" << member->line() << member->column() << member->name()->identifier()->chars(); - uses[member].append(Use(ast, line, column, id->size())); + localUses[member].append(Use(ast, line, column, id->size())); return true; } } @@ -258,10 +264,8 @@ protected: scope = scope->enclosingScope(); } -#if 0 - qDebug() << "symbol:" << id->chars() << "at pos:" << line << column - << "is not defined"; -#endif + Identifier *id = identifier(ast->identifier_token); + externalUses[id].append(Use(ast, line, column, id->size())); return false; } @@ -875,6 +879,41 @@ void CPPEditor::updateMethodBoxIndex() m_updateMethodBoxTimer->start(UPDATE_METHOD_BOX_INTERVAL); } +static void highlightUses(QTextDocument *doc, + const QTextCharFormat &format, + TranslationUnit *translationUnit, + const QList<FindUses::Use> &uses, + QList<QTextEdit::ExtraSelection> *selections) +{ + foreach (const FindUses::Use &use, uses) { + SimpleNameAST *name = use.name; + bool generated = false; + + for (unsigned tk = name->firstToken(), end = name->lastToken(); tk != end; ++tk) { + if (translationUnit->tokenAt(tk).generated) { + generated = true; + break; + } + } + + if (! generated) { + unsigned startLine, startColumn; + unsigned endLine, endColumn; + translationUnit->getTokenStartPosition(name->firstToken(), &startLine, &startColumn); + translationUnit->getTokenEndPosition(name->lastToken() - 1, &endLine, &endColumn); + + QTextEdit::ExtraSelection sel; + sel.cursor = QTextCursor(doc); + sel.cursor.setPosition(doc->findBlockByNumber(startLine - 1).position() + startColumn - 1); + sel.cursor.setPosition(doc->findBlockByLineNumber(endLine - 1).position() + endColumn - 1, + QTextCursor::KeepAnchor); + sel.format = format; + + selections->append(sel); + } + } +} + void CPPEditor::updateMethodBoxIndexNow() { m_updateMethodBoxTimer->stop(); @@ -913,18 +952,19 @@ void CPPEditor::updateMethodBoxIndexNow() FunctionDefinitionUnderCursor functionDefinitionUnderCursor(control); FunctionDefinitionAST *currentFunctionDefinition = functionDefinitionUnderCursor(ast, textCursor()); - QTextCharFormat format; format.setBackground(Qt::lightGray); - FindLocals findLocals(control); - const FindLocals::UseMap useMap = findLocals(currentFunctionDefinition); - FindLocals::UseIterator it(useMap); + + FindUses useTable(control); + useTable(currentFunctionDefinition); + + FindUses::LocalUseIterator it(useTable.localUses); while (it.hasNext()) { it.next(); - const QList<FindLocals::Use> &uses = it.value(); + const QList<FindUses::Use> &uses = it.value(); bool good = false; - foreach (const FindLocals::Use &use, uses) { + foreach (const FindUses::Use &use, uses) { unsigned l = line; unsigned c = column + 1; // convertCursorPosition() returns a 0-based column number. if (l == use.line && c >= use.column && c <= (use.column + use.length)) { @@ -936,111 +976,33 @@ void CPPEditor::updateMethodBoxIndexNow() if (! good) continue; - foreach (const FindLocals::Use &use, uses) { - SimpleNameAST *name = use.name; - bool generated = false; - for (unsigned tk = name->firstToken(), end = name->lastToken(); tk != end; ++tk) { - if (translationUnit->tokenAt(tk).generated) { - generated = true; - break; - } - } - if (generated) - continue; - unsigned startLine, startColumn; - unsigned endLine, endColumn; - translationUnit->getTokenStartPosition(name->firstToken(), &startLine, &startColumn); - translationUnit->getTokenEndPosition(name->lastToken() - 1, &endLine, &endColumn); - QTextEdit::ExtraSelection sel; - sel.cursor = textCursor(); - sel.cursor.setPosition(document()->findBlockByNumber(startLine - 1).position() + startColumn - 1); - sel.cursor.setPosition(document()->findBlockByLineNumber(endLine - 1).position() + endColumn - 1, - QTextCursor::KeepAnchor); - sel.format = format; - selections.append(sel); - } - break; // done. + highlightUses(document(), format, translationUnit, uses, &selections); + break; // done } - setExtraSelections(CodeSemanticsSelection, selections); - -#ifdef QTCREATOR_WITH_ADVANCED_HIGHLIGHTER - Snapshot snapshot = m_modelManager->snapshot(); - Document::Ptr thisDocument = snapshot.value(file()->fileName()); - if (! thisDocument) - return; - - if (Symbol *symbol = thisDocument->findSymbolAt(line, column)) { - QTextCursor tc = textCursor(); - tc.movePosition(QTextCursor::EndOfWord); - - ExpressionUnderCursor expressionUnderCursor; - - const QString expression = expressionUnderCursor(tc); - //qDebug() << "expression:" << expression; - - Snapshot snapshot; - snapshot.insert(thisDocument->fileName(), thisDocument); - - TypeOfExpression typeOfExpression; - typeOfExpression.setSnapshot(snapshot); - - const QList<TypeOfExpression::Result> results = - typeOfExpression(expression, thisDocument, symbol, TypeOfExpression::Preprocess); - - LookupContext context = typeOfExpression.lookupContext(); - - foreach (const TypeOfExpression::Result &result, results) { - FullySpecifiedType ty = result.first; - Symbol *symbol = result.second; - - if (file()->fileName() != symbol->fileName()) - continue; - - else if (symbol->isGenerated()) - continue; - - else if (symbol->isBlock()) - continue; - - if (symbol) { - int column = symbol->column(); - - if (column != 0) - --column; + FindUses::ExternalUseIterator it2(useTable.externalUses); + while (it2.hasNext()) { + it2.next(); + const QList<FindUses::Use> &uses = it2.value(); - if (symbol->isGenerated()) - column = 0; - - QTextCursor c(document()->findBlockByNumber(symbol->line() - 1)); - c.setPosition(c.position() + column); - - const QString text = c.block().text(); - - int i = column; - for (; i < text.length(); ++i) { - const QChar &ch = text.at(i); - - if (ch == QLatin1Char('*') || ch == QLatin1Char('&')) - c.movePosition(QTextCursor::NextCharacter); - else - break; - } - - c.movePosition(QTextCursor::EndOfWord, QTextCursor::KeepAnchor); - - QTextEdit::ExtraSelection sel; - sel.cursor = c; - sel.format.setBackground(Qt::darkYellow); - - selections.append(sel); - //break; + bool good = false; + foreach (const FindUses::Use &use, uses) { + unsigned l = line; + unsigned c = column + 1; // convertCursorPosition() returns a 0-based column number. + if (l == use.line && c >= use.column && c <= (use.column + use.length)) { + good = true; + break; } } + + if (! good) + continue; + + highlightUses(document(), format, translationUnit, uses, &selections); + break; // done } setExtraSelections(CodeSemanticsSelection, selections); -#endif // QTCREATOR_WITH_ADVANCED_HIGHLIGHTER } void CPPEditor::updateMethodBoxToolTip() -- GitLab