Added ObjC encode expressions.

This commit is contained in:
Erik Verbruggen
2009-07-16 12:44:47 +02:00
parent a262fce6d0
commit ef58d082ea
8 changed files with 138 additions and 16 deletions

View File

@@ -2123,4 +2123,36 @@ unsigned ObjCProtocolExpressionAST::lastToken() const
return protocol_token + 1; return protocol_token + 1;
} }
unsigned ObjCTypeNameAST::firstToken() const
{
return lparen_token;
}
unsigned ObjCTypeNameAST::lastToken() const
{
if (rparen_token)
return rparen_token + 1;
if (type_id)
return type_id->lastToken();
if (type_qualifier)
return type_qualifier + 1;
return lparen_token + 1;
}
unsigned ObjCEncodeExpressionAST::firstToken() const
{
return encode_token;
}
unsigned ObjCEncodeExpressionAST::lastToken() const
{
if (type_name)
return type_name->lastToken();
return encode_token + 1;
}
CPLUSPLUS_END_NAMESPACE CPLUSPLUS_END_NAMESPACE

View File

@@ -2674,6 +2674,46 @@ protected:
virtual void accept0(ASTVisitor *visitor); virtual void accept0(ASTVisitor *visitor);
}; };
class CPLUSPLUS_EXPORT ObjCTypeNameAST: public AST
{
public:
unsigned lparen_token;
unsigned type_qualifier;
ExpressionAST *type_id;
unsigned rparen_token;
public:
virtual ObjCTypeNameAST *asObjCTypeName()
{ return this; }
virtual unsigned firstToken() const;
virtual unsigned lastToken() const;
virtual ObjCTypeNameAST *clone(MemoryPool *pool) const;
protected:
virtual void accept0(ASTVisitor *visitor);
};
class CPLUSPLUS_EXPORT ObjCEncodeExpressionAST: public ExpressionAST
{
public:
unsigned encode_token;
ObjCTypeNameAST *type_name;
public:
virtual ObjCEncodeExpressionAST *asObjCEncodeExpression()
{ return this; }
virtual unsigned firstToken() const;
virtual unsigned lastToken() const;
virtual ObjCEncodeExpressionAST *clone(MemoryPool *pool) const;
protected:
virtual void accept0(ASTVisitor *visitor);
};
CPLUSPLUS_END_NAMESPACE CPLUSPLUS_END_NAMESPACE
CPLUSPLUS_END_HEADER CPLUSPLUS_END_HEADER

View File

@@ -1321,4 +1321,22 @@ ObjCProtocolExpressionAST *ObjCProtocolExpressionAST::clone(MemoryPool *pool) co
return ast; return ast;
} }
ObjCTypeNameAST *ObjCTypeNameAST::clone(MemoryPool *pool) const
{
ObjCTypeNameAST *ast = new (pool) ObjCTypeNameAST;
ast->lparen_token = lparen_token;
ast->type_qualifier = type_qualifier;
if (type_id) ast->type_id = type_id->clone(pool);
ast->rparen_token = rparen_token;
return ast;
}
ObjCEncodeExpressionAST *ObjCEncodeExpressionAST::clone(MemoryPool *pool) const
{
ObjCEncodeExpressionAST *ast = new (pool) ObjCEncodeExpressionAST;
ast->encode_token = encode_token;
if (type_name) ast->type_name = type_name->clone(pool);
return ast;
}
CPLUSPLUS_END_NAMESPACE CPLUSPLUS_END_NAMESPACE

View File

@@ -1243,4 +1243,26 @@ void ObjCProtocolExpressionAST::accept0(ASTVisitor *visitor)
visitor->endVisit(this); visitor->endVisit(this);
} }
void ObjCTypeNameAST::accept0(ASTVisitor *visitor)
{
if (visitor->visit(this)) {
// visit ObjCTypeNameAST
if (type_id)
accept(type_id, visitor);
// visit AST
}
visitor->endVisit(this);
}
void ObjCEncodeExpressionAST::accept0(ASTVisitor *visitor)
{
if (visitor->visit(this)) {
// visit ObjCEncodeExpressionAST
if (type_name)
accept(type_name, visitor);
// visit ExpressionAST
}
visitor->endVisit(this);
}
CPLUSPLUS_END_NAMESPACE CPLUSPLUS_END_NAMESPACE

View File

@@ -207,6 +207,8 @@ public:
virtual bool visit(ObjCMessageArgumentListAST *) { return true; } virtual bool visit(ObjCMessageArgumentListAST *) { return true; }
virtual bool visit(ObjCMessageArgumentAST *) { return true; } virtual bool visit(ObjCMessageArgumentAST *) { return true; }
virtual bool visit(ObjCProtocolExpressionAST *) { return true; } virtual bool visit(ObjCProtocolExpressionAST *) { return true; }
virtual bool visit(ObjCTypeNameAST *) { return true; }
virtual bool visit(ObjCEncodeExpressionAST *) { return true; }
virtual bool visit(DeclarationListAST *) { return true; } virtual bool visit(DeclarationListAST *) { return true; }
virtual void endVisit(DeclarationListAST *) { } virtual void endVisit(DeclarationListAST *) { }
@@ -325,6 +327,8 @@ public:
virtual void endVisit(ObjCMessageArgumentListAST *) { } virtual void endVisit(ObjCMessageArgumentListAST *) { }
virtual void endVisit(ObjCMessageArgumentAST *) { } virtual void endVisit(ObjCMessageArgumentAST *) { }
virtual void endVisit(ObjCProtocolExpressionAST *) { } virtual void endVisit(ObjCProtocolExpressionAST *) { }
virtual void endVisit(ObjCTypeNameAST *) { }
virtual void endVisit(ObjCEncodeExpressionAST *) { }
private: private:
Control *_control; Control *_control;

View File

@@ -180,6 +180,8 @@ class ObjCMessageExpressionAST;
class ObjCMessageArgumentListAST; class ObjCMessageArgumentListAST;
class ObjCMessageArgumentAST; class ObjCMessageArgumentAST;
class ObjCProtocolExpressionAST; class ObjCProtocolExpressionAST;
class ObjCTypeNameAST;
class ObjCEncodeExpressionAST;
CPLUSPLUS_END_NAMESPACE CPLUSPLUS_END_NAMESPACE
CPLUSPLUS_END_HEADER CPLUSPLUS_END_HEADER

View File

@@ -2839,13 +2839,15 @@ bool Parser::parseObjCStringLiteral(ExpressionAST *&node)
return true; return true;
} }
bool Parser::parseObjCEncodeExpression(ExpressionAST *&) bool Parser::parseObjCEncodeExpression(ExpressionAST *&node)
{ {
if (LA() != T_AT_ENCODE) if (LA() != T_AT_ENCODE)
return false; return false;
/*unsigned encode_token = */ consumeToken(); ObjCEncodeExpressionAST *ast = new (_pool) ObjCEncodeExpressionAST;
parseObjCTypeName(); ast->encode_token = consumeToken();
parseObjCTypeName(ast->type_name);
node = ast;
return true; return true;
} }
@@ -4349,7 +4351,8 @@ bool Parser::parseObjCMethodPrototype()
/*unsigned method_type_token = */ consumeToken(); /*unsigned method_type_token = */ consumeToken();
parseObjCTypeName(); ObjCTypeNameAST *type_name = 0;
parseObjCTypeName(type_name);
unsigned selector_token = 0; unsigned selector_token = 0;
@@ -4408,17 +4411,17 @@ bool Parser::parseObjCPropertyAttribute()
// objc-type-name ::= T_LPAREN objc-type-qualifiers-opt type-id T_RPAREN // objc-type-name ::= T_LPAREN objc-type-qualifiers-opt type-id T_RPAREN
// //
bool Parser::parseObjCTypeName() bool Parser::parseObjCTypeName(ObjCTypeNameAST *&node)
{ {
if (LA() != T_LPAREN) if (LA() != T_LPAREN)
return false; return false;
unsigned lparen_token = 0, rparen_token = 0; ObjCTypeNameAST *ast = new (_pool) ObjCTypeNameAST;
match(T_LPAREN, &lparen_token); match(T_LPAREN, &(ast->lparen_token));
parseObjCTypeQualifiers(); parseObjCTypeQualifiers(ast->type_qualifier);
ExpressionAST *type_id = 0; parseTypeId(ast->type_id);
parseTypeId(type_id); match(T_RPAREN, &(ast->rparen_token));
match(T_RPAREN, &rparen_token); node = ast;
return true; return true;
} }
@@ -4446,7 +4449,8 @@ bool Parser::parseObjCKeywordDeclaration()
unsigned colon_token = 0; unsigned colon_token = 0;
match(T_COLON, &colon_token); match(T_COLON, &colon_token);
parseObjCTypeName(); ObjCTypeNameAST *type_name = 0;
parseObjCTypeName(type_name);
SpecifierAST *attributes = 0, **attr = &attributes; SpecifierAST *attributes = 0, **attr = &attributes;
while (parseAttributeSpecifier(*attr)) while (parseAttributeSpecifier(*attr))
@@ -4458,7 +4462,7 @@ bool Parser::parseObjCKeywordDeclaration()
return true; return true;
} }
bool Parser::parseObjCTypeQualifiers() bool Parser::parseObjCTypeQualifiers(unsigned &type_qualifier)
{ {
if (LA() != T_IDENTIFIER) if (LA() != T_IDENTIFIER)
return false; return false;
@@ -4467,7 +4471,7 @@ bool Parser::parseObjCTypeQualifiers()
const int k = classifyObjectiveCTypeQualifiers(id->chars(), id->size()); const int k = classifyObjectiveCTypeQualifiers(id->chars(), id->size());
if (k == Token_identifier) if (k == Token_identifier)
return false; return false;
consumeToken(); type_qualifier = consumeToken();
return true; return true;
} }

View File

@@ -240,10 +240,10 @@ public:
bool parseObjCImplementation(DeclarationAST *&node); bool parseObjCImplementation(DeclarationAST *&node);
bool parseObjCMethodPrototype(); bool parseObjCMethodPrototype();
bool parseObjCPropertyAttribute(); bool parseObjCPropertyAttribute();
bool parseObjCTypeName(); bool parseObjCTypeName(ObjCTypeNameAST *&node);
bool parseObjCSelector(unsigned &selector_token); bool parseObjCSelector(unsigned &selector_token);
bool parseObjCKeywordDeclaration(); bool parseObjCKeywordDeclaration();
bool parseObjCTypeQualifiers(); bool parseObjCTypeQualifiers(unsigned &type_qualifier);
bool parseObjCEnd(DeclarationAST *&node); bool parseObjCEnd(DeclarationAST *&node);
bool lookAtObjCSelector() const; bool lookAtObjCSelector() const;