aboutsummaryrefslogtreecommitdiffstats
path: root/src/libs/3rdparty/cplusplus
diff options
context:
space:
mode:
Diffstat (limited to 'src/libs/3rdparty/cplusplus')
-rw-r--r--src/libs/3rdparty/cplusplus/Parser.cpp9
-rw-r--r--src/libs/3rdparty/cplusplus/Parser.h3
-rw-r--r--src/libs/3rdparty/cplusplus/TranslationUnit.cpp5
-rw-r--r--src/libs/3rdparty/cplusplus/TranslationUnit.h5
4 files changed, 14 insertions, 8 deletions
diff --git a/src/libs/3rdparty/cplusplus/Parser.cpp b/src/libs/3rdparty/cplusplus/Parser.cpp
index 11656bd47f1..c98f92cc37b 100644
--- a/src/libs/3rdparty/cplusplus/Parser.cpp
+++ b/src/libs/3rdparty/cplusplus/Parser.cpp
@@ -66,8 +66,6 @@ public:
int DebugRule::depth = 0;
-const int declarationsInRowAllowedToFail = 2;
-
inline bool lookAtAssignmentOperator(int tokenKind)
{
switch (tokenKind) {
@@ -267,12 +265,13 @@ inline void debugPrintCheckCache(bool) {}
return true; \
}
-Parser::Parser(TranslationUnit *unit)
+Parser::Parser(TranslationUnit *unit, int retryParseDeclarationLimit)
: _translationUnit(unit),
_control(unit->control()),
_pool(unit->memoryPool()),
_languageFeatures(unit->languageFeatures()),
_tokenIndex(1),
+ _retryParseDeclarationLimit(retryParseDeclarationLimit),
_templateArguments(0),
_inFunctionBody(false),
_inExpressionStatement(false),
@@ -657,7 +656,7 @@ bool Parser::parseTranslationUnit(TranslationUnitAST *&node)
} else {
error(start_declaration, "expected a declaration");
rewind(start_declaration + 1);
- if (++declarationsInRowFailedToParse == declarationsInRowAllowedToFail)
+ if (++declarationsInRowFailedToParse == _retryParseDeclarationLimit)
skipUntilAfterSemicolonOrRightBrace();
else
skipUntilDeclaration();
@@ -825,7 +824,7 @@ bool Parser::parseLinkageBody(DeclarationAST *&node)
} else {
error(start_declaration, "expected a declaration");
rewind(start_declaration + 1);
- if (++declarationsInRowFailedToParse == declarationsInRowAllowedToFail)
+ if (++declarationsInRowFailedToParse == _retryParseDeclarationLimit)
skipUntilAfterSemicolonOrRightBrace();
else
skipUntilDeclaration();
diff --git a/src/libs/3rdparty/cplusplus/Parser.h b/src/libs/3rdparty/cplusplus/Parser.h
index 923b0c4dc82..5f0a182bd12 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);
+ Parser(TranslationUnit *translationUnit, int retryParseDeclarationLimit);
~Parser();
bool parseTranslationUnit(TranslationUnitAST *&node);
@@ -317,6 +317,7 @@ 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 ace6eda549a..86eb25f1e35 100644
--- a/src/libs/3rdparty/cplusplus/TranslationUnit.cpp
+++ b/src/libs/3rdparty/cplusplus/TranslationUnit.cpp
@@ -49,7 +49,8 @@ TranslationUnit::TranslationUnit(Control *control, const StringLiteral *fileId)
_lastSourceChar(0),
_pool(0),
_ast(0),
- _flags(0)
+ _flags(0),
+ _retryParseDeclarationLimit(defaultRetryParseDeclarationLimit())
{
_tokens = new std::vector<Token>();
_comments = new std::vector<Token>();
@@ -299,7 +300,7 @@ bool TranslationUnit::parse(ParseMode mode)
f._parsed = true;
- Parser parser(this);
+ Parser parser(this, _retryParseDeclarationLimit);
bool parsed = false;
switch (mode) {
diff --git a/src/libs/3rdparty/cplusplus/TranslationUnit.h b/src/libs/3rdparty/cplusplus/TranslationUnit.h
index 94eb81666be..eb4e1f2e3a5 100644
--- a/src/libs/3rdparty/cplusplus/TranslationUnit.h
+++ b/src/libs/3rdparty/cplusplus/TranslationUnit.h
@@ -149,6 +149,9 @@ 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;
@@ -210,6 +213,8 @@ private:
Flags f;
};
LanguageFeatures _languageFeatures;
+
+ int _retryParseDeclarationLimit;
};
} // namespace CPlusPlus