diff --git a/src/libs/cplusplus/CppDocument.cpp b/src/libs/cplusplus/CppDocument.cpp index 0c0f7c2e93d46b34138bf4523d7acd8f4222dffe..ec617ff929851e9efe4c9d7ac0507b1b49dfef17 100644 --- a/src/libs/cplusplus/CppDocument.cpp +++ b/src/libs/cplusplus/CppDocument.cpp @@ -473,7 +473,7 @@ const Macro *Document::findMacroDefinitionAt(unsigned line) const const Document::MacroUse *Document::findMacroUseAt(unsigned offset) const { foreach (const Document::MacroUse &use, _macroUses) { - if (use.contains(offset)) + if (use.contains(offset) && (offset < use.begin() + use.macro().name().length())) return &use; } return 0; @@ -482,7 +482,7 @@ const Document::MacroUse *Document::findMacroUseAt(unsigned offset) const const Document::UndefinedMacroUse *Document::findUndefinedMacroUseAt(unsigned offset) const { foreach (const Document::UndefinedMacroUse &use, _undefinedMacroUses) { - if (use.contains(offset)) + if (use.contains(offset) && (offset < use.begin() + use.name().length())) return &use; } return 0; diff --git a/src/plugins/cppeditor/cppeditor.cpp b/src/plugins/cppeditor/cppeditor.cpp index 4bf4a4fc40b79e64d28f94838dd01b5d76889bfa..e6149b9bacd1cc7e68837b0e0203156fc4518b0f 100644 --- a/src/plugins/cppeditor/cppeditor.cpp +++ b/src/plugins/cppeditor/cppeditor.cpp @@ -707,11 +707,14 @@ const Macro *CPPEditorWidget::findCanonicalMacro(const QTextCursor &cursor, Docu int line, col; convertPosition(cursor.position(), &line, &col); - if (const Macro *macro = doc->findMacroDefinitionAt(line)) - return macro; - - if (const Document::MacroUse *use = doc->findMacroUseAt(cursor.position())) + if (const Macro *macro = doc->findMacroDefinitionAt(line)) { + QTextCursor macroCursor = cursor; + const QByteArray name = identifierUnderCursor(¯oCursor).toLatin1(); + if (macro->name() == name) + return macro; + } else if (const Document::MacroUse *use = doc->findMacroUseAt(cursor.position())) { return &use->macro(); + } return 0; } @@ -722,12 +725,13 @@ void CPPEditorWidget::findUsages() info.snapshot = CppModelManagerInterface::instance()->snapshot(); info.snapshot.insert(info.doc); - CanonicalSymbol cs(this, info); - Symbol *canonicalSymbol = cs(textCursor()); - if (canonicalSymbol) { - m_modelManager->findUsages(canonicalSymbol, cs.context()); - } else if (const Macro *macro = findCanonicalMacro(textCursor(), info.doc)) { + if (const Macro *macro = findCanonicalMacro(textCursor(), info.doc)) { m_modelManager->findMacroUsages(*macro); + } else { + CanonicalSymbol cs(this, info); + Symbol *canonicalSymbol = cs(textCursor()); + if (canonicalSymbol) + m_modelManager->findUsages(canonicalSymbol, cs.context()); } } @@ -1381,6 +1385,25 @@ CPPEditorWidget::Link CPPEditorWidget::findLinkAt(const QTextCursor &cursor, tc.setPosition(endOfToken); } + // Handle macro uses + const Macro *macro = doc->findMacroDefinitionAt(line); + if (macro) { + QTextCursor macroCursor = cursor; + const QByteArray name = identifierUnderCursor(¯oCursor).toLatin1(); + if (macro->name() == name) + return link; //already on definition! + } else { + const Document::MacroUse *use = doc->findMacroUseAt(endOfToken - 1); + if (use && use->macro().fileName() != QLatin1String("")) { + const Macro ¯o = use->macro(); + link.fileName = macro.fileName(); + link.line = macro.line(); + link.begin = use->begin(); + link.end = use->end(); + return link; + } + } + // Find the last symbol up to the cursor position Scope *scope = doc->scopeAt(line, column); if (!scope)