diff options
author | Eike Ziller <eike.ziller@theqtcompany.com> | 2016-04-22 15:13:58 +0200 |
---|---|---|
committer | Eike Ziller <eike.ziller@theqtcompany.com> | 2016-04-22 15:13:58 +0200 |
commit | 4a826ada0486dd2c07b3932c6e62ad375f0edfbb (patch) | |
tree | 39360b652210c9d92506fe0c0170f8e45a91b159 /src/libs/3rdparty/cplusplus | |
parent | 582c46d34f28f9e04af4d8179f455a603ded5ec7 (diff) | |
parent | 427bb8c363fc3ee0d9c12ca7ac01d47dc0f6f8f4 (diff) |
Merge remote-tracking branch 'origin/4.0'
Conflicts:
qtcreator.pri
qtcreator.qbs
Change-Id: I0cbc9d335073e3234f472aa43f462eef9a9178aa
Diffstat (limited to 'src/libs/3rdparty/cplusplus')
-rw-r--r-- | src/libs/3rdparty/cplusplus/Parser.cpp | 65 |
1 files changed, 47 insertions, 18 deletions
diff --git a/src/libs/3rdparty/cplusplus/Parser.cpp b/src/libs/3rdparty/cplusplus/Parser.cpp index 901f5ac2c1..b55ac6f18a 100644 --- a/src/libs/3rdparty/cplusplus/Parser.cpp +++ b/src/libs/3rdparty/cplusplus/Parser.cpp @@ -162,13 +162,25 @@ class Parser::ASTCache public: enum ASTKind { + Declaration, Expression, ExpressionList, + MemberSpecification, ParameterDeclarationClause, TemplateId, TypeId }; + struct CacheKey { + CacheKey(unsigned initialCursor, ASTKind astKind) + : initialCursor(initialCursor) + , astKind(astKind) + {} + + const unsigned initialCursor; + const ASTKind astKind; + }; + public: ASTCache() {} @@ -255,6 +267,17 @@ inline void debugPrintCheckCache(bool) {} } \ } while (0) +#define CACHE_AND_RETURN(cacheKey, expression) \ + do { \ + const bool result = expression; \ + _astCache->insert(cacheKey.astKind, \ + cacheKey.initialCursor, \ + result ? node : 0, \ + cursor(), \ + result); \ + return result; \ + } while (0) + #define PARSE_EXPRESSION_WITH_OPERATOR_PRECEDENCE(node, minPrecedence) { \ if (LA() == T_THROW) { \ if (!parseThrowExpression(node)) \ @@ -2480,6 +2503,9 @@ bool Parser::parseQtInterfaces(DeclarationAST *&node) bool Parser::parseMemberSpecification(DeclarationAST *&node, ClassSpecifierAST *declaringClass) { DEBUG_THIS_RULE(); + const ASTCache::CacheKey cacheKey(cursor(), ASTCache::MemberSpecification); + CHECK_CACHE(cacheKey.astKind, DeclarationAST); + switch (LA()) { case T_Q_OBJECT: case T_Q_GADGET: @@ -2487,7 +2513,7 @@ bool Parser::parseMemberSpecification(DeclarationAST *&node, ClassSpecifierAST * QtObjectTagAST *ast = new (_pool) QtObjectTagAST; ast->q_object_token = consumeToken(); node = ast; - return true; + CACHE_AND_RETURN(cacheKey, true); } case T_Q_PRIVATE_SLOT: @@ -2505,44 +2531,44 @@ bool Parser::parseMemberSpecification(DeclarationAST *&node, ClassSpecifierAST * parseDeclarator(ast->declarator, ast->type_specifier_list); match(T_RPAREN, &ast->rparen_token); node = ast; - } return true; + } CACHE_AND_RETURN(cacheKey, true); case T_SEMICOLON: - return parseEmptyDeclaration(node); + CACHE_AND_RETURN(cacheKey, parseEmptyDeclaration(node)); case T_USING: - return parseUsing(node); + CACHE_AND_RETURN(cacheKey, parseUsing(node)); case T_TEMPLATE: - return parseTemplateDeclaration(node); + CACHE_AND_RETURN(cacheKey, parseTemplateDeclaration(node)); case T_Q_SIGNALS: case T_PUBLIC: case T_PROTECTED: case T_PRIVATE: case T_Q_SLOTS: - return parseAccessDeclaration(node); + CACHE_AND_RETURN(cacheKey, parseAccessDeclaration(node)); case T_Q_PROPERTY: case T_Q_PRIVATE_PROPERTY: - return parseQtPropertyDeclaration(node); + CACHE_AND_RETURN(cacheKey, parseQtPropertyDeclaration(node)); case T_Q_ENUMS: - return parseQtEnumDeclaration(node); + CACHE_AND_RETURN(cacheKey, parseQtEnumDeclaration(node)); case T_Q_FLAGS: - return parseQtFlags(node); + CACHE_AND_RETURN(cacheKey, parseQtFlags(node)); case T_Q_INTERFACES: - return parseQtInterfaces(node); + CACHE_AND_RETURN(cacheKey, parseQtInterfaces(node)); case T_STATIC_ASSERT: if (_languageFeatures.cxx11Enabled) - return parseStaticAssertDeclaration(node); + CACHE_AND_RETURN(cacheKey, parseStaticAssertDeclaration(node)); // fall-through default: - return parseSimpleDeclaration(node, declaringClass); + CACHE_AND_RETURN(cacheKey, parseSimpleDeclaration(node, declaringClass)); } // switch } @@ -4074,6 +4100,9 @@ bool Parser::parseBuiltinTypeSpecifier(SpecifierListAST *&node) bool Parser::parseSimpleDeclaration(DeclarationAST *&node, ClassSpecifierAST *declaringClass) { DEBUG_THIS_RULE(); + const ASTCache::CacheKey cacheKey(cursor(), ASTCache::Declaration); + CHECK_CACHE(cacheKey.astKind, DeclarationAST); + unsigned qt_invokable_token = 0; if (declaringClass && (LA() == T_Q_SIGNAL || LA() == T_Q_SLOT || LA() == T_Q_INVOKABLE)) qt_invokable_token = consumeToken(); @@ -4188,7 +4217,7 @@ bool Parser::parseSimpleDeclaration(DeclarationAST *&node, ClassSpecifierAST *de } } if (! parseInitDeclarator(declarator, decl_specifier_seq, declaringClass)) - return false; + CACHE_AND_RETURN(cacheKey, false); } } @@ -4196,7 +4225,7 @@ bool Parser::parseSimpleDeclaration(DeclarationAST *&node, ClassSpecifierAST *de // and it doesn't look like a fwd or a class declaration // then it's not a declarations if (! declarator && ! maybeForwardOrClassDeclaration(decl_specifier_seq)) - return false; + CACHE_AND_RETURN(cacheKey, false); DeclaratorAST *firstDeclarator = declarator; @@ -4223,7 +4252,7 @@ bool Parser::parseSimpleDeclaration(DeclarationAST *&node, ClassSpecifierAST *de ast->declarator_list = declarator_list; match(T_SEMICOLON, &ast->semicolon_token); node = ast; - return true; + CACHE_AND_RETURN(cacheKey, true); } else if (! _inFunctionBody && declarator && (LA() == T_COLON || LA() == T_LBRACE || LA() == T_TRY)) { if (LA() == T_TRY) { FunctionDefinitionAST *ast = new (_pool) FunctionDefinitionAST; @@ -4232,7 +4261,7 @@ bool Parser::parseSimpleDeclaration(DeclarationAST *&node, ClassSpecifierAST *de ast->declarator = firstDeclarator; parseTryBlockStatement(ast->function_body, &ast->ctor_initializer); node = ast; - return true; // recognized a function definition. + CACHE_AND_RETURN(cacheKey, true); // recognized a function definition. } else { CtorInitializerAST *ctor_initializer = 0; bool hasCtorInitializer = false; @@ -4263,13 +4292,13 @@ bool Parser::parseSimpleDeclaration(DeclarationAST *&node, ClassSpecifierAST *de ast->ctor_initializer = ctor_initializer; parseFunctionBody(ast->function_body); node = ast; - return true; // recognized a function definition. + CACHE_AND_RETURN(cacheKey, true); // recognized a function definition. } } } error(cursor(), "unexpected token `%s'", tok().spell()); - return false; + CACHE_AND_RETURN(cacheKey, false); } bool Parser::maybeForwardOrClassDeclaration(SpecifierListAST *decl_specifier_seq) const |