Added ObjC @interface and @implementation member declarations.

This commit is contained in:
Erik Verbruggen
2009-07-16 14:31:13 +02:00
parent be69b8256a
commit fa03d46984
8 changed files with 201 additions and 18 deletions

View File

@@ -1981,6 +1981,7 @@ unsigned ObjCClassInterfaceDeclarationAST::firstToken() const
unsigned ObjCClassInterfaceDeclarationAST::lastToken() const
{
if (end_token) return end_token + 1;
if (inst_vars_decl) return inst_vars_decl->lastToken();
if (superclass_identifier_token) return superclass_identifier_token + 1;
if (colon_token) return colon_token + 1;
if (class_identifier_token) return class_identifier_token + 1;
@@ -2155,4 +2156,53 @@ unsigned ObjCEncodeExpressionAST::lastToken() const
return encode_token + 1;
}
unsigned ObjCInstanceVariableListAST::firstToken() const
{
if (declaration)
return declaration->firstToken();
if (next)
return next->firstToken();
// ### assert?
return 0;
}
unsigned ObjCInstanceVariableListAST::lastToken() const
{
for (const ObjCInstanceVariableListAST *it = this; it; it = it->next) {
if (! it->next && it->declaration) {
return it->declaration->lastToken();
}
}
// ### assert?
return 0;
}
unsigned ObjCInstanceVariablesDeclarationAST::firstToken() const
{
return lbrace_token;
}
unsigned ObjCInstanceVariablesDeclarationAST::lastToken() const
{
if (rbrace_token)
return rbrace_token + 1;
if (instance_variables)
return instance_variables->lastToken();
return lbrace_token + 1;
}
unsigned ObjCVisibilityDeclarationAST::firstToken() const
{
return visibility_token;
}
unsigned ObjCVisibilityDeclarationAST::lastToken() const
{
return visibility_token + 1;
}
CPLUSPLUS_END_NAMESPACE

View File

@@ -2491,6 +2491,7 @@ public:
unsigned colon_token;
unsigned superclass_identifier_token;
ObjCProtocolRefsAST *protocol_refs;
ObjCInstanceVariablesDeclarationAST *inst_vars_decl;
unsigned end_token;
public:
@@ -2714,6 +2715,63 @@ protected:
virtual void accept0(ASTVisitor *visitor);
};
class CPLUSPLUS_EXPORT ObjCInstanceVariableListAST: public AST
{
public:
DeclarationAST *declaration;
ObjCInstanceVariableListAST *next;
public:
virtual ObjCInstanceVariableListAST *asObjCInstanceVariableList()
{ return this; }
virtual unsigned firstToken() const;
virtual unsigned lastToken() const;
virtual ObjCInstanceVariableListAST *clone(MemoryPool *pool) const;
protected:
virtual void accept0(ASTVisitor *visitor);
};
class CPLUSPLUS_EXPORT ObjCInstanceVariablesDeclarationAST: public AST
{
public:
unsigned lbrace_token;
ObjCInstanceVariableListAST *instance_variables;
unsigned rbrace_token;
public:
virtual ObjCInstanceVariablesDeclarationAST *asObjCInstanceVariablesDeclaration()
{ return this; }
virtual unsigned firstToken() const;
virtual unsigned lastToken() const;
virtual ObjCInstanceVariablesDeclarationAST *clone(MemoryPool *pool) const;
protected:
virtual void accept0(ASTVisitor *visitor);
};
class CPLUSPLUS_EXPORT ObjCVisibilityDeclarationAST: public DeclarationAST
{
public:
unsigned visibility_token;
public:
virtual ObjCVisibilityDeclarationAST *asObjCVisibilityDeclaration()
{ return this; }
virtual unsigned firstToken() const;
virtual unsigned lastToken() const;
virtual ObjCVisibilityDeclarationAST *clone(MemoryPool *pool) const;
protected:
virtual void accept0(ASTVisitor *visitor);
};
CPLUSPLUS_END_NAMESPACE
CPLUSPLUS_END_HEADER

View File

@@ -1235,6 +1235,7 @@ ObjCClassInterfaceDeclarationAST *ObjCClassInterfaceDeclarationAST::clone(Memory
ast->colon_token = colon_token;
ast->superclass_identifier_token = superclass_identifier_token;
if (protocol_refs) ast->protocol_refs = protocol_refs->clone(pool);
if (inst_vars_decl) ast->inst_vars_decl = inst_vars_decl->clone(pool);
ast->end_token = end_token;
return ast;
}
@@ -1339,4 +1340,28 @@ ObjCEncodeExpressionAST *ObjCEncodeExpressionAST::clone(MemoryPool *pool) const
return ast;
}
ObjCInstanceVariableListAST *ObjCInstanceVariableListAST::clone(MemoryPool *pool) const
{
ObjCInstanceVariableListAST *ast = new (pool) ObjCInstanceVariableListAST;
if (declaration) ast->declaration = declaration->clone(pool);
if (next) ast->next = next->clone(pool);
return ast;
}
ObjCInstanceVariablesDeclarationAST *ObjCInstanceVariablesDeclarationAST::clone(MemoryPool *pool) const
{
ObjCInstanceVariablesDeclarationAST *ast = new (pool) ObjCInstanceVariablesDeclarationAST;
ast->lbrace_token = lbrace_token;
if (instance_variables) ast->instance_variables = instance_variables->clone(pool);
ast->rbrace_token = rbrace_token;
return ast;
}
ObjCVisibilityDeclarationAST *ObjCVisibilityDeclarationAST::clone(MemoryPool *pool) const
{
ObjCVisibilityDeclarationAST *ast = new (pool) ObjCVisibilityDeclarationAST;
ast->visibility_token = visibility_token;
return ast;
}
CPLUSPLUS_END_NAMESPACE

View File

@@ -1146,6 +1146,8 @@ void ObjCClassInterfaceDeclarationAST::accept0(ASTVisitor *visitor)
for (SpecifierAST *it = attributes; it; it = it->next)
accept(it, visitor);
accept(protocol_refs, visitor);
if (inst_vars_decl)
accept(inst_vars_decl, visitor);
// visit DeclarationAST
}
visitor->endVisit(this);
@@ -1265,4 +1267,37 @@ void ObjCEncodeExpressionAST::accept0(ASTVisitor *visitor)
visitor->endVisit(this);
}
void ObjCInstanceVariableListAST::accept0(ASTVisitor *visitor)
{
if (visitor->visit(this)) {
// visit ObjCInstanceVariableListAST
if (declaration)
accept(declaration, visitor);
if (next)
accept(next, visitor);
// visit AST
}
visitor->endVisit(this);
}
void ObjCInstanceVariablesDeclarationAST::accept0(ASTVisitor *visitor)
{
if (visitor->visit(this)) {
// visit ObjCInstanceVariablesDeclarationAST
if (instance_variables)
accept(instance_variables, visitor);
// visit AST
}
visitor->endVisit(this);
}
void ObjCVisibilityDeclarationAST::accept0(ASTVisitor *visitor)
{
if (visitor->visit(this)) {
// visit ObjCVisibilityDeclarationAST
// visit DeclarationAST
}
visitor->endVisit(this);
}
CPLUSPLUS_END_NAMESPACE

View File

@@ -209,6 +209,9 @@ public:
virtual bool visit(ObjCProtocolExpressionAST *) { return true; }
virtual bool visit(ObjCTypeNameAST *) { return true; }
virtual bool visit(ObjCEncodeExpressionAST *) { return true; }
virtual bool visit(ObjCInstanceVariableListAST *) { return true; }
virtual bool visit(ObjCInstanceVariablesDeclarationAST *) { return true; }
virtual bool visit(ObjCVisibilityDeclarationAST *) { return true; }
virtual bool visit(DeclarationListAST *) { return true; }
virtual void endVisit(DeclarationListAST *) { }
@@ -329,6 +332,9 @@ public:
virtual void endVisit(ObjCProtocolExpressionAST *) { }
virtual void endVisit(ObjCTypeNameAST *) { }
virtual void endVisit(ObjCEncodeExpressionAST *) { }
virtual void endVisit(ObjCInstanceVariableListAST *) { }
virtual void endVisit(ObjCInstanceVariablesDeclarationAST *) { }
virtual void endVisit(ObjCVisibilityDeclarationAST *) { }
private:
Control *_control;

View File

@@ -182,6 +182,9 @@ class ObjCMessageArgumentAST;
class ObjCProtocolExpressionAST;
class ObjCTypeNameAST;
class ObjCEncodeExpressionAST;
class ObjCInstanceVariableListAST;
class ObjCInstanceVariablesDeclarationAST;
class ObjCVisibilityDeclarationAST;
CPLUSPLUS_END_NAMESPACE
CPLUSPLUS_END_HEADER

View File

@@ -3981,7 +3981,7 @@ bool Parser::parseObjCInterface(DeclarationAST *&node,
}
parseObjCProtocolRefs(ast->protocol_refs);
parseObjClassInstanceVariables();
parseObjClassInstanceVariables(ast->inst_vars_decl);
while (parseObjCInterfaceMemberDeclaration()) {
}
match(T_AT_END, &(ast->end_token));
@@ -4081,7 +4081,8 @@ bool Parser::parseObjCImplementation(DeclarationAST *&)
match(T_IDENTIFIER, &super_class_name_token);
}
parseObjClassInstanceVariables();
ObjCInstanceVariablesDeclarationAST *inst_vars_decl;
parseObjClassInstanceVariables(inst_vars_decl);
parseObjCMethodDefinitionList();
return true;
}
@@ -4221,22 +4222,22 @@ bool Parser::parseObjCProtocolRefs(ObjCProtocolRefsAST *&node)
// objc-instance-variable-decl-list-opt
// T_RBRACE
//
bool Parser::parseObjClassInstanceVariables()
bool Parser::parseObjClassInstanceVariables(ObjCInstanceVariablesDeclarationAST *&node)
{
if (LA() != T_LBRACE)
return false;
unsigned lbrace_token = 0, rbrace_token = 0;
ObjCInstanceVariablesDeclarationAST *ast = new (_pool) ObjCInstanceVariablesDeclarationAST;
match(T_LBRACE, &(ast->lbrace_token));
match(T_LBRACE, &lbrace_token);
while (LA()) {
for (ObjCInstanceVariableListAST **next = &(ast->instance_variables); LA(); next = &((*next)->next)) {
if (LA() == T_RBRACE)
break;
const unsigned start = cursor();
DeclarationAST *declaration = 0;
parseObjCInstanceVariableDeclaration(declaration);
*next = new (_pool) ObjCInstanceVariableListAST;
parseObjCInstanceVariableDeclaration((*next)->declaration);
if (start == cursor()) {
// skip stray token.
@@ -4245,7 +4246,9 @@ bool Parser::parseObjClassInstanceVariables()
}
}
match(T_RBRACE, &rbrace_token);
match(T_RBRACE, &(ast->rbrace_token));
node = ast;
return true;
}
@@ -4300,15 +4303,18 @@ bool Parser::parseObjCInterfaceMemberDeclaration()
bool Parser::parseObjCInstanceVariableDeclaration(DeclarationAST *&node)
{
switch (LA()) {
case T_AT_PRIVATE:
case T_AT_PROTECTED:
case T_AT_PUBLIC:
case T_AT_PACKAGE:
consumeToken();
return true;
case T_AT_PRIVATE:
case T_AT_PROTECTED:
case T_AT_PUBLIC:
case T_AT_PACKAGE: {
ObjCVisibilityDeclarationAST *ast = new (_pool) ObjCVisibilityDeclarationAST;
ast->visibility_token = consumeToken();
node = ast;
return true;
}
default:
return parseSimpleDeclaration(node, true);
default:
return parseSimpleDeclaration(node, true);
}
}

View File

@@ -232,7 +232,7 @@ public:
bool parseObjCMethodDefinition();
bool parseObjCProtocolRefs(ObjCProtocolRefsAST *&node);
bool parseObjClassInstanceVariables();
bool parseObjClassInstanceVariables(ObjCInstanceVariablesDeclarationAST *&node);
bool parseObjCInterfaceMemberDeclaration();
bool parseObjCInstanceVariableDeclaration(DeclarationAST *&node);
bool parseObjCPropertyDeclaration(DeclarationAST *&node,