summaryrefslogtreecommitdiff
path: root/src/shared/cplusplus/CheckDeclaration.cpp
diff options
context:
space:
mode:
authorErik Verbruggen <erik.verbruggen@nokia.com>2009-08-05 18:30:18 +0200
committerErik Verbruggen <erik.verbruggen@nokia.com>2009-08-05 18:30:18 +0200
commit86a7b26fcd09c5c0510410631421956b877db840 (patch)
tree8b116f47776c64b60d182c246f9ddeab534403a7 /src/shared/cplusplus/CheckDeclaration.cpp
parentca34b0ca1c57a0ec0f8f61ad1b0dd4f8bfc9b554 (diff)
downloadqt-creator-86a7b26fcd09c5c0510410631421956b877db840.tar.gz
Fixed semantic checks for Objective-C methods and fast-enumeration.
Diffstat (limited to 'src/shared/cplusplus/CheckDeclaration.cpp')
-rw-r--r--src/shared/cplusplus/CheckDeclaration.cpp34
1 files changed, 23 insertions, 11 deletions
diff --git a/src/shared/cplusplus/CheckDeclaration.cpp b/src/shared/cplusplus/CheckDeclaration.cpp
index 9543973055..32e48cadf4 100644
--- a/src/shared/cplusplus/CheckDeclaration.cpp
+++ b/src/shared/cplusplus/CheckDeclaration.cpp
@@ -552,7 +552,14 @@ bool CheckDeclaration::visit(ObjCClassDeclarationAST *ast)
klass->setEndOffset(tokenAt(ast->lastToken()).offset);
ast->symbol = klass;
- // TODO: walk category name, super-class, and protocols (EV)
+ klass->setInterface(ast->interface_token != 0);
+
+ if (ast->category_name) {
+ Name *categoryName = semantic()->check(ast->category_name, _scope);
+ klass->setCategoryName(categoryName);
+ }
+
+ // TODO: super-class, and protocols (EV)
_scope->enterSymbol(klass);
int previousObjCVisibility = semantic()->switchObjCVisibility(Function::Protected);
@@ -580,16 +587,25 @@ bool CheckDeclaration::visit(ObjCMethodDeclarationAST *ast)
return false;
FullySpecifiedType ty = semantic()->check(ast->method_prototype, _scope);
- Function *fun = ty.type()->asFunctionType();
- if (!fun)
+ ObjCMethod *methodType = ty.type()->asObjCMethodType();
+ if (!methodType)
return false;
- Declaration *symbol = control()->newDeclaration(ast->firstToken(), fun->name());
- symbol->setStartOffset(tokenAt(ast->firstToken()).offset);
- symbol->setEndOffset(tokenAt(ast->lastToken()).offset);
+ Symbol *symbol;
+ if (!ast->function_body) {
+ Declaration *decl = control()->newDeclaration(ast->firstToken(), methodType->name());
+ decl->setType(methodType);
+ symbol = decl;
+ } else {
+ if (!semantic()->skipFunctionBodies()) {
+ semantic()->check(ast->function_body, methodType->members());
+ }
- symbol->setType(fun->returnType());
+ symbol = methodType;
+ }
+ symbol->setStartOffset(tokenAt(ast->firstToken()).offset);
+ symbol->setEndOffset(tokenAt(ast->lastToken()).offset);
symbol->setVisibility(semantic()->currentVisibility());
if (semantic()->isObjCClassMethod(ast->method_prototype->method_type_token))
@@ -597,10 +613,6 @@ bool CheckDeclaration::visit(ObjCMethodDeclarationAST *ast)
_scope->enterSymbol(symbol);
- if (ast->function_body && !semantic()->skipFunctionBodies()) {
- semantic()->check(ast->function_body, fun->members());
- }
-
return false;
}