summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/libs/3rdparty/cplusplus/Bind.cpp2
-rw-r--r--src/plugins/cpptools/cpplocatorfilter_test.cpp23
-rw-r--r--src/plugins/cpptools/searchsymbols.cpp70
-rw-r--r--src/plugins/cpptools/searchsymbols.h12
-rw-r--r--tests/cpplocators/testdata_basic/file1.mm23
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