diff options
author | Nikolai Kosjar <nikolai.kosjar@theqtcompany.com> | 2015-02-06 15:04:23 +0100 |
---|---|---|
committer | Nikolai Kosjar <nikolai.kosjar@theqtcompany.com> | 2015-02-12 10:39:51 +0000 |
commit | ae3aa07c4df1f8e6e413b7513611d306063b126b (patch) | |
tree | afcc64f1f8fa654482b1d3a11e4e2522b968184f | |
parent | d68fc038cccc168ae8f3d03f12c00779876233f0 (diff) |
C++: Remove workaround for crashing if parsing invalid code
This reverts the changes
commit beac7b9539457fe721de1709b9a406cac2379851
C++: Fix highlighting after "invalid code"
commit 78ab287fc6d3770646012e461b0a518db4e9c9f4
C++: Stop parsing a declaration after two tries
which were a work around for QTCREATORBUG-12890.
A follow-up patch provides a proper fix.
Task-number: QTCREATORBUG-12890
Change-Id: I2650a8e41c8ff1180cad9f069e463fc51bd2f1b1
Reviewed-by: Erik Verbruggen <erik.verbruggen@theqtcompany.com>
-rw-r--r-- | src/libs/3rdparty/cplusplus/Parser.cpp | 33 | ||||
-rw-r--r-- | src/libs/3rdparty/cplusplus/Parser.h | 4 | ||||
-rw-r--r-- | src/libs/3rdparty/cplusplus/TranslationUnit.cpp | 5 | ||||
-rw-r--r-- | src/libs/3rdparty/cplusplus/TranslationUnit.h | 5 | ||||
-rw-r--r-- | src/libs/cplusplus/CppDocument.cpp | 7 | ||||
-rw-r--r-- | src/libs/cplusplus/CppDocument.h | 1 | ||||
-rw-r--r-- | src/plugins/cpptools/cppsemanticinfoupdater.cpp | 1 | ||||
-rw-r--r-- | tests/auto/cplusplus/ast/tst_ast.cpp | 7 |
8 files changed, 8 insertions, 55 deletions
diff --git a/src/libs/3rdparty/cplusplus/Parser.cpp b/src/libs/3rdparty/cplusplus/Parser.cpp index c98f92cc37b..86eeaa2f2a4 100644 --- a/src/libs/3rdparty/cplusplus/Parser.cpp +++ b/src/libs/3rdparty/cplusplus/Parser.cpp @@ -265,13 +265,12 @@ inline void debugPrintCheckCache(bool) {} return true; \ } -Parser::Parser(TranslationUnit *unit, int retryParseDeclarationLimit) +Parser::Parser(TranslationUnit *unit) : _translationUnit(unit), _control(unit->control()), _pool(unit->memoryPool()), _languageFeatures(unit->languageFeatures()), _tokenIndex(1), - _retryParseDeclarationLimit(retryParseDeclarationLimit), _templateArguments(0), _inFunctionBody(false), _inExpressionStatement(false), @@ -311,20 +310,6 @@ bool Parser::skipUntil(int token) return false; } -void Parser::skipUntilAfterSemicolonOrRightBrace() -{ - while (int tk = LA()) { - switch (tk) { - case T_SEMICOLON: - case T_RBRACE: - consumeToken(); - return; - default: - consumeToken(); - } - } -} - void Parser::skipUntilDeclaration() { for (; ; consumeToken()) { @@ -641,25 +626,19 @@ bool Parser::parseTranslationUnit(TranslationUnitAST *&node) TranslationUnitAST *ast = new (_pool) TranslationUnitAST; DeclarationListAST **decl = &ast->declaration_list; - int declarationsInRowFailedToParse = 0; - while (LA()) { unsigned start_declaration = cursor(); DeclarationAST *declaration = 0; if (parseDeclaration(declaration)) { - declarationsInRowFailedToParse = 0; *decl = new (_pool) DeclarationListAST; (*decl)->value = declaration; decl = &(*decl)->next; } else { error(start_declaration, "expected a declaration"); rewind(start_declaration + 1); - if (++declarationsInRowFailedToParse == _retryParseDeclarationLimit) - skipUntilAfterSemicolonOrRightBrace(); - else - skipUntilDeclaration(); + skipUntilDeclaration(); } @@ -808,8 +787,6 @@ bool Parser::parseLinkageBody(DeclarationAST *&node) ast->lbrace_token = consumeToken(); DeclarationListAST **declaration_ptr = &ast->declaration_list; - int declarationsInRowFailedToParse = 0; - while (int tk = LA()) { if (tk == T_RBRACE) break; @@ -817,17 +794,13 @@ bool Parser::parseLinkageBody(DeclarationAST *&node) unsigned start_declaration = cursor(); DeclarationAST *declaration = 0; if (parseDeclaration(declaration)) { - declarationsInRowFailedToParse = 0; *declaration_ptr = new (_pool) DeclarationListAST; (*declaration_ptr)->value = declaration; declaration_ptr = &(*declaration_ptr)->next; } else { error(start_declaration, "expected a declaration"); rewind(start_declaration + 1); - if (++declarationsInRowFailedToParse == _retryParseDeclarationLimit) - skipUntilAfterSemicolonOrRightBrace(); - else - skipUntilDeclaration(); + skipUntilDeclaration(); } _templateArgumentList.clear(); diff --git a/src/libs/3rdparty/cplusplus/Parser.h b/src/libs/3rdparty/cplusplus/Parser.h index 5f0a182bd12..4a2a6dfb7e0 100644 --- a/src/libs/3rdparty/cplusplus/Parser.h +++ b/src/libs/3rdparty/cplusplus/Parser.h @@ -33,7 +33,7 @@ namespace CPlusPlus { class CPLUSPLUS_EXPORT Parser { public: - Parser(TranslationUnit *translationUnit, int retryParseDeclarationLimit); + Parser(TranslationUnit *translationUnit); ~Parser(); bool parseTranslationUnit(TranslationUnitAST *&node); @@ -254,7 +254,6 @@ public: bool parseDesignator(DesignatorAST *&node); bool skipUntil(int token); - void skipUntilAfterSemicolonOrRightBrace(); void skipUntilDeclaration(); bool skipUntilStatement(); bool skip(int l, int r); @@ -317,7 +316,6 @@ private: MemoryPool *_pool; LanguageFeatures _languageFeatures; unsigned _tokenIndex; - int _retryParseDeclarationLimit; bool _templateArguments: 1; bool _inFunctionBody: 1; bool _inExpressionStatement: 1; diff --git a/src/libs/3rdparty/cplusplus/TranslationUnit.cpp b/src/libs/3rdparty/cplusplus/TranslationUnit.cpp index 4f1ff721390..ea180af5bfd 100644 --- a/src/libs/3rdparty/cplusplus/TranslationUnit.cpp +++ b/src/libs/3rdparty/cplusplus/TranslationUnit.cpp @@ -49,8 +49,7 @@ TranslationUnit::TranslationUnit(Control *control, const StringLiteral *fileId) _lastSourceChar(0), _pool(0), _ast(0), - _flags(0), - _retryParseDeclarationLimit(defaultRetryParseDeclarationLimit()) + _flags(0) { _tokens = new std::vector<Token>(); _comments = new std::vector<Token>(); @@ -300,7 +299,7 @@ bool TranslationUnit::parse(ParseMode mode) f._parsed = true; - Parser parser(this, _retryParseDeclarationLimit); + Parser parser(this); bool parsed = false; switch (mode) { diff --git a/src/libs/3rdparty/cplusplus/TranslationUnit.h b/src/libs/3rdparty/cplusplus/TranslationUnit.h index eb4e1f2e3a5..94eb81666be 100644 --- a/src/libs/3rdparty/cplusplus/TranslationUnit.h +++ b/src/libs/3rdparty/cplusplus/TranslationUnit.h @@ -149,9 +149,6 @@ public: LanguageFeatures languageFeatures() const { return _languageFeatures; } void setLanguageFeatures(LanguageFeatures features) { _languageFeatures = features; } - static int defaultRetryParseDeclarationLimit() { return 2; } - void setRetryParseDeclarationLimit(int limit) { _retryParseDeclarationLimit = limit; } - private: struct PPLine { unsigned utf16charOffset; @@ -213,8 +210,6 @@ private: Flags f; }; LanguageFeatures _languageFeatures; - - int _retryParseDeclarationLimit; }; } // namespace CPlusPlus diff --git a/src/libs/cplusplus/CppDocument.cpp b/src/libs/cplusplus/CppDocument.cpp index 3c98a249894..6ffbcdf6d87 100644 --- a/src/libs/cplusplus/CppDocument.cpp +++ b/src/libs/cplusplus/CppDocument.cpp @@ -623,13 +623,6 @@ void Document::tokenize() _translationUnit->tokenize(); } -void Document::setRetryHarderToParseDeclarations(bool yesno) -{ - _translationUnit->setRetryParseDeclarationLimit( - yesno ? 1000 - : TranslationUnit::defaultRetryParseDeclarationLimit()); -} - bool Document::isParsed() const { return _translationUnit->isParsed(); diff --git a/src/libs/cplusplus/CppDocument.h b/src/libs/cplusplus/CppDocument.h index c4ffaa7cd38..7991ac3b871 100644 --- a/src/libs/cplusplus/CppDocument.h +++ b/src/libs/cplusplus/CppDocument.h @@ -129,7 +129,6 @@ public: bool isTokenized() const; void tokenize(); - void setRetryHarderToParseDeclarations(bool yesno); bool isParsed() const; bool parse(ParseMode mode = ParseTranlationUnit); diff --git a/src/plugins/cpptools/cppsemanticinfoupdater.cpp b/src/plugins/cpptools/cppsemanticinfoupdater.cpp index a8508969920..40607213ffa 100644 --- a/src/plugins/cpptools/cppsemanticinfoupdater.cpp +++ b/src/plugins/cpptools/cppsemanticinfoupdater.cpp @@ -125,7 +125,6 @@ SemanticInfo SemanticInfoUpdaterPrivate::update(const SemanticInfo::Source &sour Document::Ptr doc = newSemanticInfo.snapshot.preprocessedDocument(source.code, source.fileName); if (processor) doc->control()->setTopLevelDeclarationProcessor(processor); - doc->setRetryHarderToParseDeclarations(true); doc->check(); if (processor && processor->isCanceled()) newSemanticInfo.complete = false; diff --git a/tests/auto/cplusplus/ast/tst_ast.cpp b/tests/auto/cplusplus/ast/tst_ast.cpp index 30e56b2350c..a01e103d551 100644 --- a/tests/auto/cplusplus/ast/tst_ast.cpp +++ b/tests/auto/cplusplus/ast/tst_ast.cpp @@ -51,9 +51,7 @@ public: TranslationUnit::ParseMode mode, bool blockErrors = false, bool qtMocRun = false, - bool cxx11Enabled = false, - int retryParseDeclarationLimit - = TranslationUnit::defaultRetryParseDeclarationLimit()) + bool cxx11Enabled = false) { const StringLiteral *fileId = control.stringLiteral("<stdin>"); LanguageFeatures features; @@ -64,7 +62,6 @@ public: features.qtMocRunEnabled = qtMocRun; TranslationUnit *unit = new TranslationUnit(&control, fileId); unit->setLanguageFeatures(features); - unit->setRetryParseDeclarationLimit(retryParseDeclarationLimit); unit->setSource(source.constData(), source.length()); unit->blockErrors(blockErrors); unit->parse(mode); @@ -1866,7 +1863,7 @@ void tst_AST::invalidCode() "class Foo {};\n"; QSharedPointer<TranslationUnit> unit(parse(invalidCode, TranslationUnit::ParseTranlationUnit, - false, false, false, 1000)); + false, false, false)); QVERIFY(unit->ast()); TranslationUnitAST *unitAST = unit->ast()->asTranslationUnit(); QVERIFY(unitAST->declaration_list); |