Fixed the objc auto tests

This commit is contained in:
Roberto Raggi
2010-08-13 16:52:59 +02:00
parent ae5db839e1
commit d21de8c621
3 changed files with 19 additions and 7 deletions

View File

@@ -953,7 +953,6 @@ ObjCMethod *Bind::objCMethodPrototype(ObjCMethodPrototypeAST *ast)
if (isObjCClassMethod(tokenKind(ast->method_type_token))) if (isObjCClassMethod(tokenKind(ast->method_type_token)))
method->setStorage(Symbol::Static); method->setStorage(Symbol::Static);
method->setVisibility(_objcVisibility); method->setVisibility(_objcVisibility);
_scope->addMember(method);
ast->symbol = method; ast->symbol = method;
Scope *previousScope = switchScope(method); Scope *previousScope = switchScope(method);
@@ -969,7 +968,7 @@ ObjCMethod *Bind::objCMethodPrototype(ObjCMethodPrototypeAST *ast)
for (SpecifierListAST *it = ast->attribute_list; it; it = it->next) { for (SpecifierListAST *it = ast->attribute_list; it; it = it->next) {
specifiers = this->specifier(it->value, specifiers); specifiers = this->specifier(it->value, specifiers);
} }
setDeclSpecifiers(method, specifiers); //setDeclSpecifiers(method, specifiers);
return method; return method;
} }
@@ -2285,10 +2284,17 @@ bool Bind::visit(ObjCMethodDeclarationAST *ast)
{ {
ObjCMethod *method = this->objCMethodPrototype(ast->method_prototype); 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); Scope *previousScope = switchScope(method);
this->statement(ast->function_body); this->statement(ast->function_body);
(void) switchScope(previousScope); (void) switchScope(previousScope);
_scope->addMember(method);
} }
return false; return false;

View File

@@ -334,19 +334,25 @@ void tst_Lookup::iface_impl_scoping()
QCOMPARE(method1Impl->identifier()->chars(), "method1"); QCOMPARE(method1Impl->identifier()->chars(), "method1");
// get the body of method1 // get the body of method1
QCOMPARE(method1Impl->memberCount(), 1U); QCOMPARE(method1Impl->memberCount(), 2U);
Block *method1Body = method1Impl->memberAt(0)->asBlock(); 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); QVERIFY(method1Body);
const LookupContext context(doc, snapshot); const LookupContext context(doc, snapshot);
{ // verify if we can resolve "arg" in the body { // verify if we can resolve "arg" in the body
QCOMPARE(method1Impl->argumentCount(), 1U); QCOMPARE(method1Impl->argumentCount(), 2U);
Argument *arg = method1Impl->argumentAt(0)->asArgument(); Argument *arg = method1Impl->argumentAt(0)->asArgument();
QVERIFY(arg); QVERIFY(arg);
QVERIFY(arg->name()); QVERIFY(arg->name());
QVERIFY(arg->name()->identifier()); QVERIFY(arg->name()->identifier());
QCOMPARE(arg->name()->identifier()->chars(), "arg"); QCOMPARE(arg->name()->identifier()->chars(), "arg");
QVERIFY(arg->type()->isIntegerType());
const QList<LookupItem> candidates = context.lookup(arg->name(), method1Body->scope()); const QList<LookupItem> candidates = context.lookup(arg->name(), method1Body->scope());
QCOMPARE(candidates.size(), 1); QCOMPARE(candidates.size(), 1);