diff --git a/src/shared/cplusplus/AST.cpp b/src/shared/cplusplus/AST.cpp index 0d859f385abb175463cd5aeafca68258c6acaf18..266d49c999a5b60f99d32b78070c80a1b219e51f 100644 --- a/src/shared/cplusplus/AST.cpp +++ b/src/shared/cplusplus/AST.cpp @@ -2398,21 +2398,9 @@ unsigned ObjCMethodDeclarationAST::lastToken() const { if (semicolon_token) return semicolon_token + 1; - else - return method_prototype->lastToken(); -} - -unsigned ObjCMethodDefinitionAST::firstToken() const -{ - return method_prototype->firstToken(); -} - -unsigned ObjCMethodDefinitionAST::lastToken() const -{ if (function_body) return function_body->lastToken(); - else - return method_prototype->lastToken(); + return method_prototype->lastToken(); } unsigned ObjCClassImplementationAST::firstToken() const diff --git a/src/shared/cplusplus/AST.h b/src/shared/cplusplus/AST.h index dcdf5abee256be64199122e4d509738ab63f11b2..f7e483f88182973b1aa2904b9895f0f3b29f7c03 100644 --- a/src/shared/cplusplus/AST.h +++ b/src/shared/cplusplus/AST.h @@ -222,7 +222,6 @@ public: virtual ObjCMessageArgumentDeclarationListAST *asObjCMessageArgumentDeclarationList() { return 0; } virtual ObjCMethodPrototypeAST *asObjCMethodPrototype() { return 0; } virtual ObjCMethodDeclarationAST *asObjCMethodDeclaration() { return 0; } - virtual ObjCMethodDefinitionAST *asObjCMethodDefinition() { return 0; } virtual ObjCClassImplementationAST *asObjCClassImplementation() { return 0; } virtual ObjCCategoryImplementationAST *asObjCCategoryImplementation() { return 0; } virtual ObjCSynthesizedPropertyAST *asObjCSynthesizedProperty() { return 0; } @@ -3040,6 +3039,7 @@ class CPLUSPLUS_EXPORT ObjCMethodDeclarationAST: public DeclarationAST { public: ObjCMethodPrototypeAST *method_prototype; + StatementAST *function_body; unsigned semicolon_token; public: @@ -3055,25 +3055,6 @@ protected: virtual void accept0(ASTVisitor *visitor); }; -class CPLUSPLUS_EXPORT ObjCMethodDefinitionAST: public DeclarationAST -{ -public: - ObjCMethodPrototypeAST *method_prototype; - StatementAST *function_body; - -public: - virtual ObjCMethodDefinitionAST *asObjCMethodDefinition() - { return this; } - - virtual unsigned firstToken() const; - virtual unsigned lastToken() const; - - virtual ObjCMethodDefinitionAST *clone(MemoryPool *pool) const; - -protected: - virtual void accept0(ASTVisitor *visitor); -}; - class CPLUSPLUS_EXPORT ObjCClassImplementationAST: public DeclarationAST { public: diff --git a/src/shared/cplusplus/ASTClone.cpp b/src/shared/cplusplus/ASTClone.cpp index a5167a59d41946372f77076b61971c181d96b229..de0be8287da9505b5b5b1afa03296cc01aaec4ac 100644 --- a/src/shared/cplusplus/ASTClone.cpp +++ b/src/shared/cplusplus/ASTClone.cpp @@ -1461,15 +1461,8 @@ ObjCMethodDeclarationAST *ObjCMethodDeclarationAST::clone(MemoryPool *pool) cons { ObjCMethodDeclarationAST *ast = new (pool) ObjCMethodDeclarationAST; if (method_prototype) ast->method_prototype = method_prototype->clone(pool); - ast->semicolon_token = semicolon_token; - return ast; -} - -ObjCMethodDefinitionAST *ObjCMethodDefinitionAST::clone(MemoryPool *pool) const -{ - ObjCMethodDefinitionAST *ast = new (pool) ObjCMethodDefinitionAST; - if (method_prototype) ast->method_prototype = method_prototype->clone(pool); if (function_body) ast->function_body = function_body->clone(pool); + ast->semicolon_token = semicolon_token; return ast; } diff --git a/src/shared/cplusplus/ASTVisit.cpp b/src/shared/cplusplus/ASTVisit.cpp index de05b380c13b12788aa00baed884d5db7a0817d7..2d4b4c2cc2bf7b216e706b24f6019305abf9665e 100644 --- a/src/shared/cplusplus/ASTVisit.cpp +++ b/src/shared/cplusplus/ASTVisit.cpp @@ -1406,16 +1406,6 @@ void ObjCMethodDeclarationAST::accept0(ASTVisitor *visitor) if (visitor->visit(this)) { // visit ObjCMethodDeclarationAST accept(method_prototype, visitor); - // visit DeclarationAST - } - visitor->endVisit(this); -} - -void ObjCMethodDefinitionAST::accept0(ASTVisitor *visitor) -{ - if (visitor->visit(this)) { - // visit ObjCMethodDefinitionAST - accept(method_prototype, visitor); accept(function_body, visitor); // visit DeclarationAST } diff --git a/src/shared/cplusplus/ASTVisitor.h b/src/shared/cplusplus/ASTVisitor.h index 6a7c72068629a8bfb60a7e24bd6b00ac7af00fa6..661874cc07307fdb23caf7c6d0996850e912b41a 100644 --- a/src/shared/cplusplus/ASTVisitor.h +++ b/src/shared/cplusplus/ASTVisitor.h @@ -221,7 +221,6 @@ public: virtual bool visit(ObjCPropertyDeclarationAST *) { return true; } virtual bool visit(ObjCMethodPrototypeAST *) { return true; } virtual bool visit(ObjCMethodDeclarationAST *) { return true; } - virtual bool visit(ObjCMethodDefinitionAST *) { return true; } virtual bool visit(ObjCMessageArgumentDeclarationListAST *) { return true; } virtual bool visit(ObjCMessageArgumentDeclarationAST *) { return true; } virtual bool visit(ObjCClassImplementationAST *) { return true; } @@ -363,7 +362,6 @@ public: virtual void endVisit(ObjCPropertyDeclarationAST *) { } virtual void endVisit(ObjCMethodPrototypeAST *) { } virtual void endVisit(ObjCMethodDeclarationAST *) { } - virtual void endVisit(ObjCMethodDefinitionAST *) { } virtual void endVisit(ObjCMessageArgumentDeclarationListAST *) { } virtual void endVisit(ObjCMessageArgumentDeclarationAST *) { } virtual void endVisit(ObjCClassImplementationAST *) { } diff --git a/src/shared/cplusplus/ASTfwd.h b/src/shared/cplusplus/ASTfwd.h index a269713e9b679f25e6235bab725def87f9db2ac8..c336650dae1a1bf1fba5e95a312a35e39db97498 100644 --- a/src/shared/cplusplus/ASTfwd.h +++ b/src/shared/cplusplus/ASTfwd.h @@ -195,7 +195,6 @@ class ObjCPropertyAttributeListAST; class ObjCPropertyAttributeAST; class ObjCMethodPrototypeAST; class ObjCMethodDeclarationAST; -class ObjCMethodDefinitionAST; class ObjCMessageArgumentDeclarationListAST; class ObjCMessageArgumentDeclarationAST; class ObjCCategoryImplementationAST; diff --git a/src/shared/cplusplus/CheckDeclaration.cpp b/src/shared/cplusplus/CheckDeclaration.cpp index f3157e7bc673b5d3a802a337e2673b09119bf87e..f82394548c4aaf40dfcac3415e204867913b5778 100644 --- a/src/shared/cplusplus/CheckDeclaration.cpp +++ b/src/shared/cplusplus/CheckDeclaration.cpp @@ -595,33 +595,7 @@ bool CheckDeclaration::visit(ObjCMethodDeclarationAST *ast) _scope->enterSymbol(symbol); - return false; -} - -bool CheckDeclaration::visit(ObjCMethodDefinitionAST *ast) -{ - if (!ast->method_prototype) - return false; - - FullySpecifiedType ty = semantic()->check(ast->method_prototype, _scope); - Function *fun = ty.type()->asFunctionType(); - if (!fun) - return false; - - Declaration *symbol = control()->newDeclaration(ast->firstToken(), fun->name()); - symbol->setStartOffset(tokenAt(ast->firstToken()).offset); - symbol->setEndOffset(tokenAt(ast->lastToken()).offset); - - symbol->setType(fun->returnType()); - - symbol->setVisibility(semantic()->currentVisibility()); - - if (semantic()->isObjCClassMethod(ast->method_prototype->method_type_token)) - symbol->setStorage(Symbol::Static); - - _scope->enterSymbol(symbol); - - if (! semantic()->skipFunctionBodies()) { + if (ast->function_body && !semantic()->skipFunctionBodies()) { semantic()->check(ast->function_body, fun->members()); } diff --git a/src/shared/cplusplus/CheckDeclaration.h b/src/shared/cplusplus/CheckDeclaration.h index b1880c5377f405ed2c9446f647c294655e113be2..97c4d5ff449021aa30d173faf2e8b59b417cf540 100644 --- a/src/shared/cplusplus/CheckDeclaration.h +++ b/src/shared/cplusplus/CheckDeclaration.h @@ -96,7 +96,6 @@ protected: virtual bool visit(ObjCClassDeclarationAST *ast); virtual bool visit(ObjCClassInterfaceDefinitionAST *ast); virtual bool visit(ObjCMethodDeclarationAST *ast); - virtual bool visit(ObjCMethodDefinitionAST *ast); virtual bool visit(ObjCVisibilityDeclarationAST *ast); private: diff --git a/src/shared/cplusplus/Parser.cpp b/src/shared/cplusplus/Parser.cpp index 70bc64ae3d5a0739007c121bfb11a31f86059cc9..c4eb17ab64e6618f0235eb9f6bf3e3db1f328552 100644 --- a/src/shared/cplusplus/Parser.cpp +++ b/src/shared/cplusplus/Parser.cpp @@ -4321,20 +4321,18 @@ bool Parser::parseObjCMethodDefinition(DeclarationAST *&node) if (! parseObjCMethodPrototype(method_prototype)) return false; + ObjCMethodDeclarationAST *ast = new (_pool) ObjCMethodDeclarationAST; + ast->method_prototype = method_prototype; + if (LA() == T_SEMICOLON) { // method declaration: - ObjCMethodDeclarationAST *ast = new (_pool) ObjCMethodDeclarationAST; - ast->method_prototype = method_prototype; ast->semicolon_token = consumeToken(); - node = ast; } else { // method definition: - ObjCMethodDefinitionAST *ast = new (_pool) ObjCMethodDefinitionAST; - ast->method_prototype = method_prototype; parseFunctionBody(ast->function_body); - node = ast; } + node = ast; return true; } @@ -4567,10 +4565,14 @@ bool Parser::parseObjCMethodPrototype(ObjCMethodPrototypeAST *&node) DeclarationAST *parameter_declaration = 0; parseParameterDeclaration(parameter_declaration); } + + node = ast; } else if (lookAtObjCSelector()) { ObjCSelectorWithoutArgumentsAST *sel = new (_pool) ObjCSelectorWithoutArgumentsAST; parseObjCSelector(sel->name_token); ast->selector = sel; + + node = ast; } else { _translationUnit->error(cursor(), "expected a selector"); } @@ -4579,7 +4581,6 @@ bool Parser::parseObjCMethodPrototype(ObjCMethodPrototypeAST *&node) while (parseAttributeSpecifier(*attr)) attr = &(*attr)->next; - node = ast; return true; }