// Goto slot invoked by the designer context menu. Either navigates // to an existing slot function or create a new one. bool navigateToSlot(const QString &uiFileName, const QString & /* objectName */, const QString & /* signalSignature */, const QStringList & /* parameterNames */, QString *errorMessage) { // Find the generated header. const QString generatedHeaderFile = generatedHeaderOf(uiFileName); if (generatedHeaderFile.isEmpty()) { *errorMessage = QCoreApplication::translate("Designer", "The generated header of the form '%1' could not be found.\nRebuilding the project might help.").arg(uiFileName); return false; } const CPlusPlus::Snapshot snapshot = CPlusPlus::CppModelManagerInterface::instance()->snapshot(); const DocumentPtr generatedHeaderDoc = snapshot.document(generatedHeaderFile); if (!generatedHeaderDoc) { *errorMessage = QCoreApplication::translate("Designer", "The generated header '%1' could not be found in the code model.\nRebuilding the project might help.").arg(generatedHeaderFile); return false; } // Look for setupUi SearchFunction searchFunc(setupUiC); const SearchFunction::FunctionList funcs = searchFunc(generatedHeaderDoc); if (funcs.size() != 1) { *errorMessage = QString::fromLatin1("Internal error: The function '%1' could not be found in in %2").arg(QLatin1String(setupUiC), generatedHeaderFile); return false; } return true; }
QString AbstractEditorSupport::functionAt(const CppModelManagerInterface *modelManager, const QString &fileName, int line, int column) { const CPlusPlus::Snapshot snapshot = modelManager->snapshot(); const CPlusPlus::Document::Ptr document = snapshot.document(fileName); if (!document) return QString(); if (const CPlusPlus::Symbol *symbol = document->lastVisibleSymbolAt(line, column)) if (const CPlusPlus::Scope *scope = symbol->enclosingScope()) if (const CPlusPlus::Scope *functionScope = scope->enclosingFunction()) if (const CPlusPlus::Symbol *function = functionScope) { const CPlusPlus::Overview o; QString rc = o.prettyName(function->name()); // Prepend namespace "Foo::Foo::foo()" up to empty root namespace for (const CPlusPlus::Symbol *owner = function->enclosingNamespace(); owner; owner = owner->enclosingNamespace()) { const QString name = o.prettyName(owner->name()); if (name.isEmpty()) { break; } else { rc.prepend(QLatin1String("::")); rc.prepend(name); } } return rc; } return QString(); }
CPlusPlus::Function *CppFunction::function(int line, int column, const QString &fileName) { const CPlusPlus::Snapshot snapshot = CppTools::CppModelManagerInterface::instance()->snapshot(); const CPlusPlus::Document::Ptr document = snapshot.document(fileName); if (!document) return 0; CPlusPlus::Symbol *symbol = document->lastVisibleSymbolAt(line, column); if (!symbol) return 0; // Find the enclosing function scope (which might be several levels up, or we might be standing on it) CPlusPlus::Scope *scope; if (symbol->isScope()) scope = symbol->asScope(); else scope = symbol->enclosingScope(); while (scope && !scope->isFunction() ) scope = scope->enclosingScope(); if (!scope) return 0; return scope->asFunction(); }