diff options
Diffstat (limited to 'src/shared/cplusplus')
| -rw-r--r-- | src/shared/cplusplus/AST.cpp | 51 | ||||
| -rw-r--r-- | src/shared/cplusplus/AST.h | 61 | ||||
| -rw-r--r-- | src/shared/cplusplus/ASTClone.cpp | 28 | ||||
| -rw-r--r-- | src/shared/cplusplus/ASTVisit.cpp | 31 | ||||
| -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 | 45 | ||||
| -rw-r--r-- | src/shared/cplusplus/Parser.h | 4 |
8 files changed, 207 insertions, 22 deletions
diff --git a/src/shared/cplusplus/AST.cpp b/src/shared/cplusplus/AST.cpp index 6a72e3b90a..946ecf5cb5 100644 --- a/src/shared/cplusplus/AST.cpp +++ b/src/shared/cplusplus/AST.cpp @@ -2104,4 +2104,55 @@ unsigned ObjCMessageArgumentAST::lastToken() const return parameter_key_identifier + 1; } +unsigned ObjCProtocolExpressionAST::firstToken() const +{ + return protocol_token; +} + +unsigned ObjCProtocolExpressionAST::lastToken() const +{ + if (rparen_token) + return rparen_token + 1; + + if (identifier_token) + return identifier_token + 1; + + if (lparen_token) + return lparen_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 diff --git a/src/shared/cplusplus/AST.h b/src/shared/cplusplus/AST.h index 393126c9d4..290a84324b 100644 --- a/src/shared/cplusplus/AST.h +++ b/src/shared/cplusplus/AST.h @@ -2653,6 +2653,67 @@ protected: virtual void accept0(ASTVisitor *visitor); }; +class CPLUSPLUS_EXPORT ObjCProtocolExpressionAST: public ExpressionAST +{ +public: + unsigned protocol_token; + unsigned lparen_token; + unsigned identifier_token; + unsigned rparen_token; + +public: + virtual ObjCProtocolExpressionAST *asObjCProtocolExpression() + { return this; } + + virtual unsigned firstToken() const; + virtual unsigned lastToken() const; + + virtual ObjCProtocolExpressionAST *clone(MemoryPool *pool) const; + +protected: + 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_HEADER diff --git a/src/shared/cplusplus/ASTClone.cpp b/src/shared/cplusplus/ASTClone.cpp index 5065cfdd23..abc89510a5 100644 --- a/src/shared/cplusplus/ASTClone.cpp +++ b/src/shared/cplusplus/ASTClone.cpp @@ -1311,4 +1311,32 @@ ObjCMessageArgumentAST *ObjCMessageArgumentAST::clone(MemoryPool *pool) const return ast; } +ObjCProtocolExpressionAST *ObjCProtocolExpressionAST::clone(MemoryPool *pool) const +{ + ObjCProtocolExpressionAST *ast = new (pool) ObjCProtocolExpressionAST; + ast->protocol_token = protocol_token; + ast->lparen_token = lparen_token; + ast->identifier_token = identifier_token; + ast->rparen_token = rparen_token; + 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 diff --git a/src/shared/cplusplus/ASTVisit.cpp b/src/shared/cplusplus/ASTVisit.cpp index 0f2052127d..02f1218afe 100644 --- a/src/shared/cplusplus/ASTVisit.cpp +++ b/src/shared/cplusplus/ASTVisit.cpp @@ -1234,4 +1234,35 @@ void ObjCMessageArgumentAST::accept0(ASTVisitor *visitor) visitor->endVisit(this); } +void ObjCProtocolExpressionAST::accept0(ASTVisitor *visitor) +{ + if (visitor->visit(this)) { + // visit ObjCProtocolExpressionAST + // visit ExpressionAST + } + 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 diff --git a/src/shared/cplusplus/ASTVisitor.h b/src/shared/cplusplus/ASTVisitor.h index 4b0672cbc1..130c666262 100644 --- a/src/shared/cplusplus/ASTVisitor.h +++ b/src/shared/cplusplus/ASTVisitor.h @@ -206,6 +206,9 @@ public: virtual bool visit(ObjCMessageExpressionAST *) { return true; } virtual bool visit(ObjCMessageArgumentListAST *) { return true; } virtual bool visit(ObjCMessageArgumentAST *) { 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 void endVisit(DeclarationListAST *) { } @@ -323,6 +326,9 @@ public: virtual void endVisit(ObjCMessageExpressionAST *) { } virtual void endVisit(ObjCMessageArgumentListAST *) { } virtual void endVisit(ObjCMessageArgumentAST *) { } + virtual void endVisit(ObjCProtocolExpressionAST *) { } + virtual void endVisit(ObjCTypeNameAST *) { } + virtual void endVisit(ObjCEncodeExpressionAST *) { } private: Control *_control; diff --git a/src/shared/cplusplus/ASTfwd.h b/src/shared/cplusplus/ASTfwd.h index e12393df6a..f25e293282 100644 --- a/src/shared/cplusplus/ASTfwd.h +++ b/src/shared/cplusplus/ASTfwd.h @@ -179,6 +179,9 @@ class ObjCProtocolRefsAST; class ObjCMessageExpressionAST; class ObjCMessageArgumentListAST; class ObjCMessageArgumentAST; +class ObjCProtocolExpressionAST; +class ObjCTypeNameAST; +class ObjCEncodeExpressionAST; CPLUSPLUS_END_NAMESPACE CPLUSPLUS_END_HEADER diff --git a/src/shared/cplusplus/Parser.cpp b/src/shared/cplusplus/Parser.cpp index ba705f9551..571ceaa074 100644 --- a/src/shared/cplusplus/Parser.cpp +++ b/src/shared/cplusplus/Parser.cpp @@ -2839,26 +2839,29 @@ bool Parser::parseObjCStringLiteral(ExpressionAST *&node) return true; } -bool Parser::parseObjCEncodeExpression(ExpressionAST *&) +bool Parser::parseObjCEncodeExpression(ExpressionAST *&node) { if (LA() != T_AT_ENCODE) return false; - /*unsigned encode_token = */ consumeToken(); - parseObjCTypeName(); + ObjCEncodeExpressionAST *ast = new (_pool) ObjCEncodeExpressionAST; + ast->encode_token = consumeToken(); + parseObjCTypeName(ast->type_name); + node = ast; return true; } -bool Parser::parseObjCProtocolExpression(ExpressionAST *&) +bool Parser::parseObjCProtocolExpression(ExpressionAST *&node) { if (LA() != T_AT_PROTOCOL) return false; - /*unsigned protocol_token = */ consumeToken(); - unsigned lparen_token = 0, identifier_token = 0, rparen_token = 0; - match(T_LPAREN, &lparen_token); - match(T_IDENTIFIER, &identifier_token); - match(T_RPAREN, &rparen_token); + ObjCProtocolExpressionAST *ast = new (_pool) ObjCProtocolExpressionAST; + ast->protocol_token = consumeToken(); + match(T_LPAREN, &(ast->lparen_token)); + match(T_IDENTIFIER, &(ast->identifier_token)); + match(T_RPAREN, &(ast->rparen_token)); + node = ast; return true; } @@ -4348,7 +4351,8 @@ bool Parser::parseObjCMethodPrototype() /*unsigned method_type_token = */ consumeToken(); - parseObjCTypeName(); + ObjCTypeNameAST *type_name = 0; + parseObjCTypeName(type_name); unsigned selector_token = 0; @@ -4407,17 +4411,17 @@ bool Parser::parseObjCPropertyAttribute() // 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) return false; - unsigned lparen_token = 0, rparen_token = 0; - match(T_LPAREN, &lparen_token); - parseObjCTypeQualifiers(); - ExpressionAST *type_id = 0; - parseTypeId(type_id); - match(T_RPAREN, &rparen_token); + ObjCTypeNameAST *ast = new (_pool) ObjCTypeNameAST; + match(T_LPAREN, &(ast->lparen_token)); + parseObjCTypeQualifiers(ast->type_qualifier); + parseTypeId(ast->type_id); + match(T_RPAREN, &(ast->rparen_token)); + node = ast; return true; } @@ -4445,7 +4449,8 @@ bool Parser::parseObjCKeywordDeclaration() unsigned colon_token = 0; match(T_COLON, &colon_token); - parseObjCTypeName(); + ObjCTypeNameAST *type_name = 0; + parseObjCTypeName(type_name); SpecifierAST *attributes = 0, **attr = &attributes; while (parseAttributeSpecifier(*attr)) @@ -4457,7 +4462,7 @@ bool Parser::parseObjCKeywordDeclaration() return true; } -bool Parser::parseObjCTypeQualifiers() +bool Parser::parseObjCTypeQualifiers(unsigned &type_qualifier) { if (LA() != T_IDENTIFIER) return false; @@ -4466,7 +4471,7 @@ bool Parser::parseObjCTypeQualifiers() const int k = classifyObjectiveCTypeQualifiers(id->chars(), id->size()); if (k == Token_identifier) return false; - consumeToken(); + type_qualifier = consumeToken(); return true; } diff --git a/src/shared/cplusplus/Parser.h b/src/shared/cplusplus/Parser.h index c81312d94f..2de07f1bea 100644 --- a/src/shared/cplusplus/Parser.h +++ b/src/shared/cplusplus/Parser.h @@ -240,10 +240,10 @@ public: bool parseObjCImplementation(DeclarationAST *&node); bool parseObjCMethodPrototype(); bool parseObjCPropertyAttribute(); - bool parseObjCTypeName(); + bool parseObjCTypeName(ObjCTypeNameAST *&node); bool parseObjCSelector(unsigned &selector_token); bool parseObjCKeywordDeclaration(); - bool parseObjCTypeQualifiers(); + bool parseObjCTypeQualifiers(unsigned &type_qualifier); bool parseObjCEnd(DeclarationAST *&node); bool lookAtObjCSelector() const; |
