summaryrefslogtreecommitdiff
path: root/src/shared/cplusplus
diff options
context:
space:
mode:
Diffstat (limited to 'src/shared/cplusplus')
-rw-r--r--src/shared/cplusplus/AST.cpp50
-rw-r--r--src/shared/cplusplus/AST.h58
-rw-r--r--src/shared/cplusplus/ASTClone.cpp25
-rw-r--r--src/shared/cplusplus/ASTVisit.cpp35
-rw-r--r--src/shared/cplusplus/ASTVisitor.h6
-rw-r--r--src/shared/cplusplus/ASTfwd.h3
-rw-r--r--src/shared/cplusplus/Parser.cpp40
-rw-r--r--src/shared/cplusplus/Parser.h2
8 files changed, 201 insertions, 18 deletions
diff --git a/src/shared/cplusplus/AST.cpp b/src/shared/cplusplus/AST.cpp
index 946ecf5cb5..07e68a74db 100644
--- a/src/shared/cplusplus/AST.cpp
+++ b/src/shared/cplusplus/AST.cpp
@@ -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
diff --git a/src/shared/cplusplus/AST.h b/src/shared/cplusplus/AST.h
index 290a84324b..4a11119260 100644
--- a/src/shared/cplusplus/AST.h
+++ b/src/shared/cplusplus/AST.h
@@ -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
diff --git a/src/shared/cplusplus/ASTClone.cpp b/src/shared/cplusplus/ASTClone.cpp
index abc89510a5..0f3e99b7fa 100644
--- a/src/shared/cplusplus/ASTClone.cpp
+++ b/src/shared/cplusplus/ASTClone.cpp
@@ -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
diff --git a/src/shared/cplusplus/ASTVisit.cpp b/src/shared/cplusplus/ASTVisit.cpp
index 02f1218afe..ec00c8573a 100644
--- a/src/shared/cplusplus/ASTVisit.cpp
+++ b/src/shared/cplusplus/ASTVisit.cpp
@@ -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
diff --git a/src/shared/cplusplus/ASTVisitor.h b/src/shared/cplusplus/ASTVisitor.h
index 130c666262..7fad994a90 100644
--- a/src/shared/cplusplus/ASTVisitor.h
+++ b/src/shared/cplusplus/ASTVisitor.h
@@ -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;
diff --git a/src/shared/cplusplus/ASTfwd.h b/src/shared/cplusplus/ASTfwd.h
index f25e293282..e9ded00d87 100644
--- a/src/shared/cplusplus/ASTfwd.h
+++ b/src/shared/cplusplus/ASTfwd.h
@@ -182,6 +182,9 @@ class ObjCMessageArgumentAST;
class ObjCProtocolExpressionAST;
class ObjCTypeNameAST;
class ObjCEncodeExpressionAST;
+class ObjCInstanceVariableListAST;
+class ObjCInstanceVariablesDeclarationAST;
+class ObjCVisibilityDeclarationAST;
CPLUSPLUS_END_NAMESPACE
CPLUSPLUS_END_HEADER
diff --git a/src/shared/cplusplus/Parser.cpp b/src/shared/cplusplus/Parser.cpp
index 571ceaa074..723c99fb1e 100644
--- a/src/shared/cplusplus/Parser.cpp
+++ b/src/shared/cplusplus/Parser.cpp
@@ -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);
}
}
diff --git a/src/shared/cplusplus/Parser.h b/src/shared/cplusplus/Parser.h
index 2de07f1bea..31f2383cf4 100644
--- a/src/shared/cplusplus/Parser.h
+++ b/src/shared/cplusplus/Parser.h
@@ -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,