diff options
-rw-r--r-- | src/libs/3rdparty/cplusplus/Bind.cpp | 2 | ||||
-rw-r--r-- | src/plugins/cpptools/cpplocatorfilter_test.cpp | 23 | ||||
-rw-r--r-- | src/plugins/cpptools/searchsymbols.cpp | 70 | ||||
-rw-r--r-- | src/plugins/cpptools/searchsymbols.h | 12 | ||||
-rw-r--r-- | tests/cpplocators/testdata_basic/file1.mm | 23 |
5 files changed, 101 insertions, 29 deletions
diff --git a/src/libs/3rdparty/cplusplus/Bind.cpp b/src/libs/3rdparty/cplusplus/Bind.cpp index ed39f95c1c..604bafe26b 100644 --- a/src/libs/3rdparty/cplusplus/Bind.cpp +++ b/src/libs/3rdparty/cplusplus/Bind.cpp @@ -2567,6 +2567,8 @@ bool Bind::visit(ObjCMethodDeclarationAST *ast) this->statement(ast->function_body); (void) switchScope(previousScope); _scope->addMember(method); + } else if (method) { + _scope->addMember(method); } return false; diff --git a/src/plugins/cpptools/cpplocatorfilter_test.cpp b/src/plugins/cpptools/cpplocatorfilter_test.cpp index 1a6b2472f2..ad4da2fc5c 100644 --- a/src/plugins/cpptools/cpplocatorfilter_test.cpp +++ b/src/plugins/cpptools/cpplocatorfilter_test.cpp @@ -168,7 +168,9 @@ void CppToolsPlugin::test_cpplocatorfilters_CppLocatorFilter_data() MyTestDataDir testDirectory(QLatin1String("testdata_basic")); const QString testFile = testDirectory.file(QLatin1String("file1.cpp")); + const QString objTestFile = testDirectory.file(QLatin1String("file1.mm")); const QString testFileShort = FileUtils::shortNativePath(FileName::fromString(testFile)); + const QString objTestFileShort = FileUtils::shortNativePath(FileName::fromString(objTestFile)); QTest::newRow("CppFunctionsFilter") << testFile @@ -247,6 +249,27 @@ void CppToolsPlugin::test_cpplocatorfilters_CppLocatorFilter_data() << ResultData(_("MyNamespace::myFunction"), _("(bool, int)")) << ResultData(_("myFunction"), _("(bool, int)")) ); + + QTest::newRow("CppClassesFilter-ObjC") + << objTestFile + << cppClassesFilter + << _("M") + << (QList<ResultData>() + << ResultData(_("MyClass"), objTestFileShort) + << ResultData(_("MyClass"), objTestFileShort) + << ResultData(_("MyClass"), objTestFileShort) + << ResultData(_("MyProtocol"), objTestFileShort) + ); + + QTest::newRow("CppFunctionsFilter-ObjC") + << objTestFile + << cppFunctionsFilter + << _("M") + << (QList<ResultData>() + << ResultData(_("anotherMethod"), _("MyClass")) + << ResultData(_("anotherMethod:"), _("MyClass")) + << ResultData(_("someMethod"), _("MyClass")) + ); } void CppToolsPlugin::test_cpplocatorfilters_CppCurrentDocumentFilter() diff --git a/src/plugins/cpptools/searchsymbols.cpp b/src/plugins/cpptools/searchsymbols.cpp index 0fe83a1a41..e142d057aa 100644 --- a/src/plugins/cpptools/searchsymbols.cpp +++ b/src/plugins/cpptools/searchsymbols.cpp @@ -105,11 +105,7 @@ bool SearchSymbols::visit(Enum *symbol) bool SearchSymbols::visit(Function *symbol) { - if (!(symbolsToSearchFor & SymbolSearcher::Functions) || !symbol->name()) - return false; - QString name = overview.prettyName(symbol->name()); - QString type = overview.prettyType(symbol->type()); - addChildItem(name, type, _scope, IndexItem::Function, symbol); + processFunction(symbol); return false; } @@ -130,10 +126,12 @@ bool SearchSymbols::visit(Declaration *symbol) // if we're searching for functions, still allow signal declarations to show up. if (symbolsToSearchFor & SymbolSearcher::Functions) { Function *funTy = symbol->type()->asFunctionType(); - if (!funTy) - return false; - if (!funTy->isSignal()) + if (!funTy) { + if (!symbol->type()->asObjCMethodType()) + return false; + } else if (!funTy->isSignal()) { return false; + } } else { return false; } @@ -153,19 +151,7 @@ bool SearchSymbols::visit(Declaration *symbol) bool SearchSymbols::visit(Class *symbol) { - QString name = overview.prettyName(symbol->name()); - - IndexItem::Ptr newParent; - if (symbolsToSearchFor & SymbolSearcher::Classes) - newParent = addChildItem(name, QString(), _scope, IndexItem::Class, symbol); - if (!newParent) - newParent = _parent; - ScopedIndexItemPtr parentRaii(_parent, newParent); - - QString newScope = scopedSymbolName(name, symbol); - ScopedScope scopeRaii(_scope, newScope); - for (unsigned i = 0, ei = symbol->memberCount(); i != ei; ++i) - accept(symbol->memberAt(i)); + processClass(symbol); return false; } @@ -225,8 +211,10 @@ bool SearchSymbols::visit(CPlusPlus::ObjCBaseProtocol *) return false; } -bool SearchSymbols::visit(CPlusPlus::ObjCClass *) +bool SearchSymbols::visit(CPlusPlus::ObjCClass *symbol) { + processClass(symbol); + return false; } @@ -235,8 +223,10 @@ bool SearchSymbols::visit(CPlusPlus::ObjCForwardClassDeclaration *) return false; } -bool SearchSymbols::visit(CPlusPlus::ObjCProtocol *) +bool SearchSymbols::visit(CPlusPlus::ObjCProtocol *symbol) { + processClass(symbol); + return false; } @@ -245,13 +235,15 @@ bool SearchSymbols::visit(CPlusPlus::ObjCForwardProtocolDeclaration *) return false; } -bool SearchSymbols::visit(CPlusPlus::ObjCMethod *) +bool SearchSymbols::visit(CPlusPlus::ObjCMethod *symbol) { + processFunction(symbol); return false; } -bool SearchSymbols::visit(CPlusPlus::ObjCPropertyDeclaration *) +bool SearchSymbols::visit(CPlusPlus::ObjCPropertyDeclaration *symbol) { + processFunction(symbol); return false; } @@ -315,3 +307,31 @@ IndexItem::Ptr SearchSymbols::addChildItem(const QString &symbolName, const QStr _parent->addChild(newItem); return newItem; } + +template<class T> +void SearchSymbols::processClass(T *clazz) +{ + QString name = overview.prettyName(clazz->name()); + + IndexItem::Ptr newParent; + if (symbolsToSearchFor & SymbolSearcher::Classes) + newParent = addChildItem(name, QString(), _scope, IndexItem::Class, clazz); + if (!newParent) + newParent = _parent; + ScopedIndexItemPtr parentRaii(_parent, newParent); + + QString newScope = scopedSymbolName(name, clazz); + ScopedScope scopeRaii(_scope, newScope); + for (unsigned i = 0, ei = clazz->memberCount(); i != ei; ++i) + accept(clazz->memberAt(i)); +} + +template<class T> +void SearchSymbols::processFunction(T *func) +{ + if (!(symbolsToSearchFor & SymbolSearcher::Functions) || !func->name()) + return; + QString name = overview.prettyName(func->name()); + QString type = overview.prettyType(func->type()); + addChildItem(name, type, _scope, IndexItem::Function, func); +} diff --git a/src/plugins/cpptools/searchsymbols.h b/src/plugins/cpptools/searchsymbols.h index c4306bfb96..8aad1d701a 100644 --- a/src/plugins/cpptools/searchsymbols.h +++ b/src/plugins/cpptools/searchsymbols.h @@ -85,12 +85,12 @@ protected: // Objective-C virtual bool visit(CPlusPlus::ObjCBaseClass *); virtual bool visit(CPlusPlus::ObjCBaseProtocol *); - virtual bool visit(CPlusPlus::ObjCClass *); + virtual bool visit(CPlusPlus::ObjCClass *symbol); virtual bool visit(CPlusPlus::ObjCForwardClassDeclaration *); - virtual bool visit(CPlusPlus::ObjCProtocol *); + virtual bool visit(CPlusPlus::ObjCProtocol *symbol); virtual bool visit(CPlusPlus::ObjCForwardProtocolDeclaration *); - virtual bool visit(CPlusPlus::ObjCMethod *); - virtual bool visit(CPlusPlus::ObjCPropertyDeclaration *); + virtual bool visit(CPlusPlus::ObjCMethod *symbol); + virtual bool visit(CPlusPlus::ObjCPropertyDeclaration *symbol); QString scopedSymbolName(const QString &symbolName, const CPlusPlus::Symbol *symbol) const; QString scopedSymbolName(const CPlusPlus::Symbol *symbol) const; @@ -100,6 +100,10 @@ protected: CPlusPlus::Symbol *symbol); private: + template<class T> void processClass(T *clazz); + template<class T> void processFunction(T *func); + +private: QString findOrInsert(const QString &s) { return strings.insert(s); } diff --git a/tests/cpplocators/testdata_basic/file1.mm b/tests/cpplocators/testdata_basic/file1.mm new file mode 100644 index 0000000000..841a31051c --- /dev/null +++ b/tests/cpplocators/testdata_basic/file1.mm @@ -0,0 +1,23 @@ +// Copyright header to keep the Qt Insanity Bot happy. + +@protocol NSObject +@end + +@interface NSObject<NSObject> +@end + +@protocol MyProtocol <NSObject> +- (void) someMethod; +@end + +@interface MyClass: NSObject <MyProtocol> +@end + +@implementation MyClass +- (void) someMethod {} +@end + +@implementation MyClass(MyCategory) +- (void) anotherMethod;{} +- (void) anotherMethod:(NSObject*)withAnObject{} +@end |