aboutsummaryrefslogtreecommitdiffstats
path: root/src/libs
diff options
context:
space:
mode:
authorJohannes Lorenz <johannes89@ist-einmalig.de>2015-02-25 21:22:16 +0100
committerOrgad Shaneh <orgads@gmail.com>2015-06-02 08:24:17 +0000
commit2a966a89177612c42574c6700d878fe864df4d76 (patch)
tree5699499eec3d496164d859c8e5b066df882a1aff /src/libs
parent697479572f3eaf09a2e563a25502f972050fbb11 (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')
-rw-r--r--src/libs/3rdparty/cplusplus/AST.cpp4
-rw-r--r--src/libs/3rdparty/cplusplus/AST.h2
-rw-r--r--src/libs/3rdparty/cplusplus/ASTClone.cpp1
-rw-r--r--src/libs/3rdparty/cplusplus/ASTMatcher.cpp2
-rw-r--r--src/libs/3rdparty/cplusplus/Bind.cpp2
-rw-r--r--src/libs/3rdparty/cplusplus/Parser.cpp5
-rw-r--r--src/libs/3rdparty/cplusplus/Symbols.cpp6
-rw-r--r--src/libs/3rdparty/cplusplus/Symbols.h4
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;
};