forked from qt-creator/qt-creator
Added ObjC @interface and @implementation member declarations.
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -182,6 +182,9 @@ class ObjCMessageArgumentAST;
|
||||
class ObjCProtocolExpressionAST;
|
||||
class ObjCTypeNameAST;
|
||||
class ObjCEncodeExpressionAST;
|
||||
class ObjCInstanceVariableListAST;
|
||||
class ObjCInstanceVariablesDeclarationAST;
|
||||
class ObjCVisibilityDeclarationAST;
|
||||
|
||||
CPLUSPLUS_END_NAMESPACE
|
||||
CPLUSPLUS_END_HEADER
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user