summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/plugins/cppeditor/cppeditor.cpp23
-rw-r--r--src/shared/cplusplus/Scope.cpp8
-rw-r--r--src/shared/cplusplus/Scope.h3
3 files changed, 33 insertions, 1 deletions
diff --git a/src/plugins/cppeditor/cppeditor.cpp b/src/plugins/cppeditor/cppeditor.cpp
index 7947f4c4b4..ba09cff487 100644
--- a/src/plugins/cppeditor/cppeditor.cpp
+++ b/src/plugins/cppeditor/cppeditor.cpp
@@ -155,6 +155,9 @@ private:
virtual bool visit(Function *function)
{ return processScope(function->members()); }
+ virtual bool visit(ObjCMethod *method)
+ { return processScope(method->members()); }
+
bool processScope(Scope *scope)
{
if (_scope || ! scope)
@@ -258,9 +261,15 @@ protected:
}
virtual bool visit(SimpleNameAST *ast)
+ { return findMemberForToken(ast->firstToken(), ast); }
+
+ virtual bool visit(ObjCMessageArgumentDeclarationAST *ast)
+ { return findMemberForToken(ast->param_name_token, ast); }
+
+ bool findMemberForToken(unsigned tokenIdx, NameAST *ast)
{
unsigned line, column;
- getTokenStartPosition(ast->firstToken(), &line, &column);
+ getTokenStartPosition(tokenIdx, &line, &column);
Scope *scope = findScope(line, column,
_functionScope->owner(),
@@ -273,6 +282,12 @@ protected:
return false;
else if (findMember(fun->arguments(), ast, line, column))
return false;
+ } else if (scope->isObjCMethodScope()) {
+ ObjCMethod *method = scope->owner()->asObjCMethod();
+ if (findMember(method->members(), ast, line, column))
+ return false;
+ else if (findMember(method->arguments(), ast, line, column))
+ return false;
} else if (scope->isBlockScope()) {
if (findMember(scope, ast, line, column))
return false;
@@ -395,6 +410,12 @@ protected:
return false;
}
+
+ virtual bool visit(ObjCMethodPrototypeAST *ast)
+ {
+ accept(ast->argument_list);
+ return false;
+ }
};
diff --git a/src/shared/cplusplus/Scope.cpp b/src/shared/cplusplus/Scope.cpp
index 86503826d7..9743e98e44 100644
--- a/src/shared/cplusplus/Scope.cpp
+++ b/src/shared/cplusplus/Scope.cpp
@@ -187,6 +187,14 @@ bool Scope::isFunctionScope() const
return false;
}
+bool Scope::isObjCMethodScope() const
+{
+ ObjCMethod *m = 0;
+ if (_owner && 0 != (m = _owner->asObjCMethod()))
+ return m->arguments() != this;
+ return false;
+}
+
void Scope::enterSymbol(Symbol *symbol)
{
if (++_symbolCount == _allocatedSymbols) {
diff --git a/src/shared/cplusplus/Scope.h b/src/shared/cplusplus/Scope.h
index a31b6459be..25df03a25e 100644
--- a/src/shared/cplusplus/Scope.h
+++ b/src/shared/cplusplus/Scope.h
@@ -114,6 +114,9 @@ public:
/// Returns true if this scope's owner is an ObjCClass Symbol.
bool isObjCClassScope() const;
+ /// Returns true if this scope's owner is an ObjCMethod symbol.
+ bool isObjCMethodScope() const;
+
/// Adds a Symbol to this Scope.
void enterSymbol(Symbol *symbol);