aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNikolai Kosjar <nikolai.kosjar@theqtcompany.com>2015-02-06 15:04:23 +0100
committerNikolai Kosjar <nikolai.kosjar@theqtcompany.com>2015-02-12 10:39:51 +0000
commitae3aa07c4df1f8e6e413b7513611d306063b126b (patch)
treeafcc64f1f8fa654482b1d3a11e4e2522b968184f
parentd68fc038cccc168ae8f3d03f12c00779876233f0 (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.cpp33
-rw-r--r--src/libs/3rdparty/cplusplus/Parser.h4
-rw-r--r--src/libs/3rdparty/cplusplus/TranslationUnit.cpp5
-rw-r--r--src/libs/3rdparty/cplusplus/TranslationUnit.h5
-rw-r--r--src/libs/cplusplus/CppDocument.cpp7
-rw-r--r--src/libs/cplusplus/CppDocument.h1
-rw-r--r--src/plugins/cpptools/cppsemanticinfoupdater.cpp1
-rw-r--r--tests/auto/cplusplus/ast/tst_ast.cpp7
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);