diff --git a/src/shared/cplusplus/Bind.cpp b/src/shared/cplusplus/Bind.cpp index 436f68ebc19cb0dfb187cb5cede0c917d01b318d..9b5fe050ecab963ae61f5ea43c50b24e7d25537d 100644 --- a/src/shared/cplusplus/Bind.cpp +++ b/src/shared/cplusplus/Bind.cpp @@ -953,7 +953,6 @@ ObjCMethod *Bind::objCMethodPrototype(ObjCMethodPrototypeAST *ast) if (isObjCClassMethod(tokenKind(ast->method_type_token))) method->setStorage(Symbol::Static); method->setVisibility(_objcVisibility); - _scope->addMember(method); ast->symbol = method; Scope *previousScope = switchScope(method); @@ -969,7 +968,7 @@ ObjCMethod *Bind::objCMethodPrototype(ObjCMethodPrototypeAST *ast) for (SpecifierListAST *it = ast->attribute_list; it; it = it->next) { specifiers = this->specifier(it->value, specifiers); } - setDeclSpecifiers(method, specifiers); + //setDeclSpecifiers(method, specifiers); return method; } @@ -2285,10 +2284,17 @@ bool Bind::visit(ObjCMethodDeclarationAST *ast) { ObjCMethod *method = this->objCMethodPrototype(ast->method_prototype); - if (! _skipFunctionBodies && ast->function_body) { + if (! ast->function_body) { + const Name *name = method->name(); + unsigned sourceLocation = ast->firstToken(); + Declaration *decl = control()->newDeclaration(sourceLocation, name); + decl->setType(method); + _scope->addMember(decl); + } else if (! _skipFunctionBodies && ast->function_body) { Scope *previousScope = switchScope(method); this->statement(ast->function_body); (void) switchScope(previousScope); + _scope->addMember(method); } return false; diff --git a/tests/auto/cplusplus/lookup/tst_lookup.cpp b/tests/auto/cplusplus/lookup/tst_lookup.cpp index 1194600f18dfe8ea17ae15f8b164507f5fae3fed..a05c610199de7be665cc94b61a6a4ac5645e3302 100644 --- a/tests/auto/cplusplus/lookup/tst_lookup.cpp +++ b/tests/auto/cplusplus/lookup/tst_lookup.cpp @@ -334,19 +334,25 @@ void tst_Lookup::iface_impl_scoping() QCOMPARE(method1Impl->identifier()->chars(), "method1"); // get the body of method1 - QCOMPARE(method1Impl->memberCount(), 1U); - Block *method1Body = method1Impl->memberAt(0)->asBlock(); + QCOMPARE(method1Impl->memberCount(), 2U); + Argument *method1Arg = method1Impl->memberAt(0)->asArgument(); + QVERIFY(method1Arg); + QCOMPARE(method1Arg->identifier()->chars(), "arg"); + QVERIFY(method1Arg->type()->isIntegerType()); + + Block *method1Body = method1Impl->memberAt(1)->asBlock(); QVERIFY(method1Body); const LookupContext context(doc, snapshot); { // verify if we can resolve "arg" in the body - QCOMPARE(method1Impl->argumentCount(), 1U); + QCOMPARE(method1Impl->argumentCount(), 2U); Argument *arg = method1Impl->argumentAt(0)->asArgument(); QVERIFY(arg); QVERIFY(arg->name()); QVERIFY(arg->name()->identifier()); QCOMPARE(arg->name()->identifier()->chars(), "arg"); + QVERIFY(arg->type()->isIntegerType()); const QList<LookupItem> candidates = context.lookup(arg->name(), method1Body->scope()); QCOMPARE(candidates.size(), 1); diff --git a/tests/auto/cplusplus/semantic/tst_semantic.cpp b/tests/auto/cplusplus/semantic/tst_semantic.cpp index 52541b168c80fd29f5d17af5654c169ac935141b..b11f8ca634120709dd7797cbcfbbf7dd1ce3f984 100644 --- a/tests/auto/cplusplus/semantic/tst_semantic.cpp +++ b/tests/auto/cplusplus/semantic/tst_semantic.cpp @@ -565,7 +565,7 @@ void tst_Semantic::objcSelector_1() { QSharedPointer<Document> doc = document("\n" "@interface A {}\n" - "-(void)a:(int)a b:(int)b c:(int)c;\n" + "-(void) a:(int)a b:(int)b c:(int)c;\n" "@end\n", true);