diff options
Diffstat (limited to 'src/shared/cplusplus')
-rw-r--r-- | src/shared/cplusplus/AST.cpp | 50 | ||||
-rw-r--r-- | src/shared/cplusplus/AST.h | 58 | ||||
-rw-r--r-- | src/shared/cplusplus/ASTClone.cpp | 25 | ||||
-rw-r--r-- | src/shared/cplusplus/ASTVisit.cpp | 35 | ||||
-rw-r--r-- | src/shared/cplusplus/ASTVisitor.h | 6 | ||||
-rw-r--r-- | src/shared/cplusplus/ASTfwd.h | 3 | ||||
-rw-r--r-- | src/shared/cplusplus/Parser.cpp | 40 | ||||
-rw-r--r-- | src/shared/cplusplus/Parser.h | 2 |
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, |