forked from qt-creator/qt-creator
		
	Process objc methods
This commit is contained in:
		| @@ -847,15 +847,14 @@ bool Bind::visit(ObjCTypeNameAST *ast) | ||||
|     return false; | ||||
| } | ||||
|  | ||||
| void Bind::objCTypeName(ObjCTypeNameAST *ast) | ||||
| FullySpecifiedType Bind::objCTypeName(ObjCTypeNameAST *ast) | ||||
| { | ||||
|     if (! ast) | ||||
|         return; | ||||
|         return FullySpecifiedType(); | ||||
|  | ||||
|     // unsigned lparen_token = ast->lparen_token; | ||||
|     // unsigned type_qualifier_token = ast->type_qualifier_token; | ||||
|     ExpressionTy type_id = this->expression(ast->type_id); | ||||
|     // unsigned rparen_token = ast->rparen_token; | ||||
|     return type_id; | ||||
| } | ||||
|  | ||||
| bool Bind::visit(ObjCInstanceVariablesDeclarationAST *ast) | ||||
| @@ -903,18 +902,23 @@ bool Bind::visit(ObjCMessageArgumentDeclarationAST *ast) | ||||
|     return false; | ||||
| } | ||||
|  | ||||
| void Bind::objCMessageArgumentDeclaration(ObjCMessageArgumentDeclarationAST *ast) | ||||
| void Bind::objCMessageArgumentDeclaration(ObjCMessageArgumentDeclarationAST *ast, ObjCMethod *method) | ||||
| { | ||||
|     if (! ast) | ||||
|         return; | ||||
|  | ||||
|     this->objCTypeName(ast->type_name); | ||||
|     FullySpecifiedType type; | ||||
|     FullySpecifiedType type = this->objCTypeName(ast->type_name); | ||||
|  | ||||
|     for (SpecifierListAST *it = ast->attribute_list; it; it = it->next) { | ||||
|         type = this->specifier(it->value, type); | ||||
|     } | ||||
|     /*const Name *param_name =*/ this->name(ast->param_name); | ||||
|     // Argument *argument = ast->argument; | ||||
|  | ||||
|     const Name *param_name = this->name(ast->param_name); | ||||
|     const unsigned sourceLocation = ast->param_name ? ast->param_name->firstToken() : ast->firstToken(); | ||||
|     Argument *arg = control()->newArgument(sourceLocation, param_name); | ||||
|     arg->setType(type); | ||||
|     ast->argument = arg; | ||||
|     method->addMember(arg); | ||||
| } | ||||
|  | ||||
| bool Bind::visit(ObjCMethodPrototypeAST *ast) | ||||
| @@ -924,23 +928,41 @@ bool Bind::visit(ObjCMethodPrototypeAST *ast) | ||||
|     return false; | ||||
| } | ||||
|  | ||||
| void Bind::objCMethodPrototype(ObjCMethodPrototypeAST *ast) | ||||
| ObjCMethod *Bind::objCMethodPrototype(ObjCMethodPrototypeAST *ast) | ||||
| { | ||||
|     if (! ast) | ||||
|         return; | ||||
|         return 0; | ||||
|  | ||||
|     // unsigned method_type_token = ast->method_type_token; | ||||
|     this->objCTypeName(ast->type_name); | ||||
|     /*const Name *selector =*/ this->name(ast->selector); | ||||
|     FullySpecifiedType returnType = this->objCTypeName(ast->type_name); | ||||
|     const Name *selector = this->name(ast->selector); | ||||
|  | ||||
|     const unsigned sourceLocation = ast->selector ? ast->selector->firstToken() : ast->firstToken(); | ||||
|     ObjCMethod *method = control()->newObjCMethod(sourceLocation, selector); | ||||
|     // ### set the offsets | ||||
|     method->setReturnType(returnType); | ||||
|     if (isObjCClassMethod(tokenKind(ast->method_type_token))) | ||||
|         method->setStorage(Symbol::Static); | ||||
|     method->setVisibility(_objcVisibility); | ||||
|     _scope->addMember(method); | ||||
|     ast->symbol = method; | ||||
|  | ||||
|     Scope *previousScope = switchScope(method); | ||||
|     for (ObjCMessageArgumentDeclarationListAST *it = ast->argument_list; it; it = it->next) { | ||||
|         this->objCMessageArgumentDeclaration(it->value); | ||||
|         this->objCMessageArgumentDeclaration(it->value, method); | ||||
|     } | ||||
|     // unsigned dot_dot_dot_token = ast->dot_dot_dot_token; | ||||
|     FullySpecifiedType type; | ||||
|     (void) switchScope(previousScope); | ||||
|  | ||||
|     if (ast->dot_dot_dot_token) | ||||
|         method->setVariadic(true); | ||||
|  | ||||
|     FullySpecifiedType specifiers; | ||||
|     for (SpecifierListAST *it = ast->attribute_list; it; it = it->next) { | ||||
|         type = this->specifier(it->value, type); | ||||
|         specifiers = this->specifier(it->value, specifiers); | ||||
|     } | ||||
|     // ObjCMethod *symbol = ast->symbol; | ||||
|     setDeclSpecifiers(method, specifiers); | ||||
|  | ||||
|     return method; | ||||
| } | ||||
|  | ||||
| bool Bind::visit(ObjCSynthesizedPropertyAST *ast) | ||||
| @@ -1579,7 +1601,7 @@ bool Bind::visit(ObjCProtocolExpressionAST *ast) | ||||
| bool Bind::visit(ObjCEncodeExpressionAST *ast) | ||||
| { | ||||
|     // unsigned encode_token = ast->encode_token; | ||||
|     this->objCTypeName(ast->type_name); | ||||
|     FullySpecifiedType type = this->objCTypeName(ast->type_name); | ||||
|     return false; | ||||
| } | ||||
|  | ||||
| @@ -2227,9 +2249,14 @@ bool Bind::visit(ObjCPropertyDeclarationAST *ast) | ||||
|  | ||||
| bool Bind::visit(ObjCMethodDeclarationAST *ast) | ||||
| { | ||||
|     this->objCMethodPrototype(ast->method_prototype); | ||||
|     this->statement(ast->function_body); | ||||
|     // unsigned semicolon_token = ast->semicolon_token; | ||||
|     ObjCMethod *method = this->objCMethodPrototype(ast->method_prototype); | ||||
|  | ||||
|     if (! _skipFunctionBodies && ast->function_body) { | ||||
|         Scope *previousScope = switchScope(method); | ||||
|         this->statement(ast->function_body); | ||||
|         (void) switchScope(previousScope); | ||||
|     } | ||||
|  | ||||
|     return false; | ||||
| } | ||||
|  | ||||
| @@ -2831,3 +2858,14 @@ int Bind::visibilityForObjCAccessSpecifier(int tokenKind) | ||||
|         return Symbol::Protected; | ||||
|     } | ||||
| } | ||||
|  | ||||
| bool Bind::isObjCClassMethod(int tokenKind) | ||||
| { | ||||
|     switch (tokenKind) { | ||||
|     case T_PLUS: | ||||
|         return true; | ||||
|     case T_MINUS: | ||||
|     default: | ||||
|         return false; | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -72,6 +72,7 @@ protected: | ||||
|     static int visibilityForAccessSpecifier(int tokenKind); | ||||
|     static int visibilityForClassKey(int tokenKind); | ||||
|     static int visibilityForObjCAccessSpecifier(int tokenKind); | ||||
|     static bool isObjCClassMethod(int tokenKind); | ||||
|  | ||||
|     void setDeclSpecifiers(Symbol *symbol, const FullySpecifiedType &declSpecifiers); | ||||
|  | ||||
| @@ -116,11 +117,11 @@ protected: | ||||
|     void translationUnit(TranslationUnitAST *ast); | ||||
|     void objCProtocolRefs(ObjCProtocolRefsAST *ast, Symbol *objcClassOrProtocol); | ||||
|     void objCMessageArgument(ObjCMessageArgumentAST *ast); | ||||
|     void objCTypeName(ObjCTypeNameAST *ast); | ||||
|     FullySpecifiedType objCTypeName(ObjCTypeNameAST *ast); | ||||
|     void objCInstanceVariablesDeclaration(ObjCInstanceVariablesDeclarationAST *ast, ObjCClass *klass); | ||||
|     void objCPropertyAttribute(ObjCPropertyAttributeAST *ast); | ||||
|     void objCMessageArgumentDeclaration(ObjCMessageArgumentDeclarationAST *ast); | ||||
|     void objCMethodPrototype(ObjCMethodPrototypeAST *ast); | ||||
|     void objCMessageArgumentDeclaration(ObjCMessageArgumentDeclarationAST *ast, ObjCMethod *method); | ||||
|     ObjCMethod *objCMethodPrototype(ObjCMethodPrototypeAST *ast); | ||||
|     void objCSynthesizedProperty(ObjCSynthesizedPropertyAST *ast); | ||||
|     void lambdaIntroducer(LambdaIntroducerAST *ast); | ||||
|     void lambdaCapture(LambdaCaptureAST *ast); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user