diff options
author | Erik Verbruggen <erik.verbruggen@nokia.com> | 2009-08-05 18:30:18 +0200 |
---|---|---|
committer | Erik Verbruggen <erik.verbruggen@nokia.com> | 2009-08-05 18:30:18 +0200 |
commit | 86a7b26fcd09c5c0510410631421956b877db840 (patch) | |
tree | 8b116f47776c64b60d182c246f9ddeab534403a7 /src/shared/cplusplus/CheckDeclaration.cpp | |
parent | ca34b0ca1c57a0ec0f8f61ad1b0dd4f8bfc9b554 (diff) | |
download | qt-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.cpp | 34 |
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; } |