diff options
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; } |