diff options
author | Johannes Lorenz <johannes89@ist-einmalig.de> | 2015-02-25 21:22:16 +0100 |
---|---|---|
committer | Orgad Shaneh <orgads@gmail.com> | 2015-06-02 08:24:17 +0000 |
commit | 2a966a89177612c42574c6700d878fe864df4d76 (patch) | |
tree | 5699499eec3d496164d859c8e5b066df882a1aff /src/libs/3rdparty | |
parent | 697479572f3eaf09a2e563a25502f972050fbb11 (diff) |
C++: Support ellipsis on variadic inheritance parsing
Change-Id: I571aefdb1f2aba88ba0c7710f16b6d8ad2e8f5a8
Reviewed-by: André Hartmann <aha_1980@gmx.de>
Reviewed-by: Orgad Shaneh <orgads@gmail.com>
Reviewed-by: Nikolai Kosjar <nikolai.kosjar@theqtcompany.com>
Diffstat (limited to 'src/libs/3rdparty')
-rw-r--r-- | src/libs/3rdparty/cplusplus/AST.cpp | 4 | ||||
-rw-r--r-- | src/libs/3rdparty/cplusplus/AST.h | 2 | ||||
-rw-r--r-- | src/libs/3rdparty/cplusplus/ASTClone.cpp | 1 | ||||
-rw-r--r-- | src/libs/3rdparty/cplusplus/ASTMatcher.cpp | 2 | ||||
-rw-r--r-- | src/libs/3rdparty/cplusplus/Bind.cpp | 2 | ||||
-rw-r--r-- | src/libs/3rdparty/cplusplus/Parser.cpp | 5 | ||||
-rw-r--r-- | src/libs/3rdparty/cplusplus/Symbols.cpp | 6 | ||||
-rw-r--r-- | src/libs/3rdparty/cplusplus/Symbols.h | 4 |
8 files changed, 25 insertions, 1 deletions
diff --git a/src/libs/3rdparty/cplusplus/AST.cpp b/src/libs/3rdparty/cplusplus/AST.cpp index 0eb73f58fba..be235a8c41c 100644 --- a/src/libs/3rdparty/cplusplus/AST.cpp +++ b/src/libs/3rdparty/cplusplus/AST.cpp @@ -89,7 +89,9 @@ unsigned BaseSpecifierAST::firstToken() const unsigned BaseSpecifierAST::lastToken() const { - if (name) + if (ellipsis_token) + return ellipsis_token; + else if (name) return name->lastToken(); else if (virtual_token && access_specifier_token) return std::max(virtual_token, access_specifier_token) + 1; diff --git a/src/libs/3rdparty/cplusplus/AST.h b/src/libs/3rdparty/cplusplus/AST.h index 144af639e46..b8cda42b59c 100644 --- a/src/libs/3rdparty/cplusplus/AST.h +++ b/src/libs/3rdparty/cplusplus/AST.h @@ -1002,6 +1002,7 @@ public: unsigned virtual_token; unsigned access_specifier_token; NameAST *name; + unsigned ellipsis_token; public: // annotations BaseClass *symbol; @@ -1011,6 +1012,7 @@ public: : virtual_token(0) , access_specifier_token(0) , name(0) + , ellipsis_token(0) , symbol(0) {} diff --git a/src/libs/3rdparty/cplusplus/ASTClone.cpp b/src/libs/3rdparty/cplusplus/ASTClone.cpp index 3458846ea04..647929ad319 100644 --- a/src/libs/3rdparty/cplusplus/ASTClone.cpp +++ b/src/libs/3rdparty/cplusplus/ASTClone.cpp @@ -287,6 +287,7 @@ BaseSpecifierAST *BaseSpecifierAST::clone(MemoryPool *pool) const ast->access_specifier_token = access_specifier_token; if (name) ast->name = name->clone(pool); + ast->ellipsis_token = ellipsis_token; return ast; } diff --git a/src/libs/3rdparty/cplusplus/ASTMatcher.cpp b/src/libs/3rdparty/cplusplus/ASTMatcher.cpp index 055b55a32d8..ed8ef6b09f8 100644 --- a/src/libs/3rdparty/cplusplus/ASTMatcher.cpp +++ b/src/libs/3rdparty/cplusplus/ASTMatcher.cpp @@ -462,6 +462,8 @@ bool ASTMatcher::match(BaseSpecifierAST *node, BaseSpecifierAST *pattern) else if (! AST::match(node->name, pattern->name, this)) return false; + pattern->ellipsis_token = node->ellipsis_token; + return true; } diff --git a/src/libs/3rdparty/cplusplus/Bind.cpp b/src/libs/3rdparty/cplusplus/Bind.cpp index e3fd96de983..b80da2be4a0 100644 --- a/src/libs/3rdparty/cplusplus/Bind.cpp +++ b/src/libs/3rdparty/cplusplus/Bind.cpp @@ -429,6 +429,8 @@ void Bind::baseSpecifier(BaseSpecifierAST *ast, unsigned colon_token, Class *kla const int visibility = visibilityForAccessSpecifier(tokenKind(ast->access_specifier_token)); baseClass->setVisibility(visibility); // ### well, not exactly. } + if (ast->ellipsis_token) + baseClass->setVariadic(true); klass->addBaseClass(baseClass); ast->symbol = baseClass; } diff --git a/src/libs/3rdparty/cplusplus/Parser.cpp b/src/libs/3rdparty/cplusplus/Parser.cpp index 7c330ce3300..8229aff5ed5 100644 --- a/src/libs/3rdparty/cplusplus/Parser.cpp +++ b/src/libs/3rdparty/cplusplus/Parser.cpp @@ -3006,6 +3006,11 @@ bool Parser::parseBaseSpecifier(BaseSpecifierListAST *&node) if (! ast->name) error(cursor(), "expected class-name"); + // a name can have ellipsis in case of C++11 + // note: the id must be unqualified then - TODO + if (_languageFeatures.cxx11Enabled && LA() == T_DOT_DOT_DOT) + ast->ellipsis_token = consumeToken(); + node = new (_pool) BaseSpecifierListAST; node->value = ast; return true; diff --git a/src/libs/3rdparty/cplusplus/Symbols.cpp b/src/libs/3rdparty/cplusplus/Symbols.cpp index df29feeca94..f8a8440c097 100644 --- a/src/libs/3rdparty/cplusplus/Symbols.cpp +++ b/src/libs/3rdparty/cplusplus/Symbols.cpp @@ -599,6 +599,12 @@ bool BaseClass::isVirtual() const void BaseClass::setVirtual(bool isVirtual) { _isVirtual = isVirtual; } +bool BaseClass::isVariadic() const +{ return _isVariadic; } + +void BaseClass::setVariadic(bool isVariadic) +{ _isVariadic = isVariadic; } + void BaseClass::visitSymbol0(SymbolVisitor *visitor) { visitor->visit(this); } diff --git a/src/libs/3rdparty/cplusplus/Symbols.h b/src/libs/3rdparty/cplusplus/Symbols.h index 79c0f01024f..257bdb86826 100644 --- a/src/libs/3rdparty/cplusplus/Symbols.h +++ b/src/libs/3rdparty/cplusplus/Symbols.h @@ -474,6 +474,9 @@ public: bool isVirtual() const; void setVirtual(bool isVirtual); + bool isVariadic() const; + void setVariadic(bool isVariadic); + // Symbol's interface virtual FullySpecifiedType type() const; void setType(const FullySpecifiedType &type); @@ -488,6 +491,7 @@ protected: virtual void visitSymbol0(SymbolVisitor *visitor); private: + bool _isVariadic; bool _isVirtual; FullySpecifiedType _type; }; |