aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJoel Smith <joel.m.smith@gmail.com>2019-05-12 20:49:00 -0700
committerNikolai Kosjar <nikolai.kosjar@qt.io>2019-07-09 08:59:23 +0000
commit8c437362bc6e0374aa9b2dc9338aba1e5cf545a0 (patch)
tree450773172ae315bb3c7714e38de6a2367f21f081 /src
parent8a9c5a093d7a8869442c553a7fa40b8347b5f4af (diff)
C++: Support single quote digit separator in integer literals
C++14 supports the use of single quotes inserted between integer digits as a separator. Updates the built-in C++ code model to recognize such quotes. This fixes highlighting and indentation issues. Change-Id: Ic35ce93060b96700a11d108dce1f3cf6c4543632 Fixes: QTCREATORBUG-14939 Reviewed-by: Nikolai Kosjar <nikolai.kosjar@qt.io>
Diffstat (limited to 'src')
-rw-r--r--src/libs/3rdparty/cplusplus/Lexer.cpp12
-rw-r--r--src/libs/3rdparty/cplusplus/Token.h1
-rw-r--r--src/libs/cplusplus/MatchingText.cpp1
-rw-r--r--src/plugins/cpptools/cppcodeformatter.cpp2
-rw-r--r--src/plugins/cpptools/projectpart.cpp1
5 files changed, 13 insertions, 4 deletions
diff --git a/src/libs/3rdparty/cplusplus/Lexer.cpp b/src/libs/3rdparty/cplusplus/Lexer.cpp
index 079ae0ca6e..d1858f007c 100644
--- a/src/libs/3rdparty/cplusplus/Lexer.cpp
+++ b/src/libs/3rdparty/cplusplus/Lexer.cpp
@@ -954,7 +954,8 @@ void Lexer::scanNumericLiteral(Token *tok)
yyinp();
while (std::isdigit(_yychar) ||
(_yychar >= 'a' && _yychar <= 'f') ||
- (_yychar >= 'A' && _yychar <= 'F')) {
+ (_yychar >= 'A' && _yychar <= 'F') ||
+ ((_yychar == '\'') && _languageFeatures.cxx14Enabled)) {
yyinp();
}
if (!scanOptionalIntegerSuffix())
@@ -962,7 +963,8 @@ void Lexer::scanNumericLiteral(Token *tok)
goto theEnd;
} else if (_yychar == 'b' || _yychar == 'B') { // see n3472
yyinp();
- while (_yychar == '0' || _yychar == '1')
+ while (_yychar == '0' || _yychar == '1' ||
+ ((_yychar == '\'') && _languageFeatures.cxx14Enabled))
yyinp();
if (!scanOptionalIntegerSuffix())
scanOptionalUserDefinedLiteral(tok);
@@ -970,7 +972,8 @@ void Lexer::scanNumericLiteral(Token *tok)
} else if (_yychar >= '0' && _yychar <= '7') {
do {
yyinp();
- } while (_yychar >= '0' && _yychar <= '7');
+ } while ((_yychar >= '0' && _yychar <= '7') ||
+ ((_yychar == '\'') && _languageFeatures.cxx14Enabled));
if (!scanOptionalIntegerSuffix())
scanOptionalUserDefinedLiteral(tok);
goto theEnd;
@@ -989,7 +992,8 @@ void Lexer::scanNumericLiteral(Token *tok)
if (scanExponentPart() && !scanOptionalFloatingSuffix())
scanOptionalUserDefinedLiteral(tok);
break;
- } else if (std::isdigit(_yychar)) {
+ } else if (std::isdigit(_yychar) ||
+ ((_yychar == '\'') && _languageFeatures.cxx14Enabled)) {
yyinp();
} else {
if (!scanOptionalIntegerSuffix())
diff --git a/src/libs/3rdparty/cplusplus/Token.h b/src/libs/3rdparty/cplusplus/Token.h
index 67378b28a3..36a893efff 100644
--- a/src/libs/3rdparty/cplusplus/Token.h
+++ b/src/libs/3rdparty/cplusplus/Token.h
@@ -437,6 +437,7 @@ struct LanguageFeatures
unsigned int qtKeywordsEnabled : 1; // If Qt is used but QT_NO_KEYWORDS defined
unsigned int cxxEnabled : 1;
unsigned int cxx11Enabled : 1;
+ unsigned int cxx14Enabled : 1;
unsigned int objCEnabled : 1;
unsigned int c99Enabled : 1;
};
diff --git a/src/libs/cplusplus/MatchingText.cpp b/src/libs/cplusplus/MatchingText.cpp
index 59440813a7..5aea683f1e 100644
--- a/src/libs/cplusplus/MatchingText.cpp
+++ b/src/libs/cplusplus/MatchingText.cpp
@@ -145,6 +145,7 @@ static LanguageFeatures languageFeatures()
features.qtKeywordsEnabled = false;
features.qtMocRunEnabled = false;
features.cxx11Enabled = true;
+ features.cxx14Enabled = true;
features.cxxEnabled = true;
features.c99Enabled = true;
features.objCEnabled = true;
diff --git a/src/plugins/cpptools/cppcodeformatter.cpp b/src/plugins/cpptools/cppcodeformatter.cpp
index 069359d869..fca7998ece 100644
--- a/src/plugins/cpptools/cppcodeformatter.cpp
+++ b/src/plugins/cpptools/cppcodeformatter.cpp
@@ -1054,6 +1054,8 @@ int CodeFormatter::tokenizeBlock(const QTextBlock &block, bool *endedJoined)
features.qtKeywordsEnabled = true;
features.cxxEnabled = true;
features.objCEnabled = true;
+ features.cxx11Enabled = true;
+ features.cxx14Enabled = true;
SimpleLexer tokenize;
tokenize.setLanguageFeatures(features);
diff --git a/src/plugins/cpptools/projectpart.cpp b/src/plugins/cpptools/projectpart.cpp
index 4569f231d1..2205fb07b5 100644
--- a/src/plugins/cpptools/projectpart.cpp
+++ b/src/plugins/cpptools/projectpart.cpp
@@ -38,6 +38,7 @@ void ProjectPart::updateLanguageFeatures()
const bool hasCxx = languageVersion >= Utils::LanguageVersion::CXX98;
const bool hasQt = hasCxx && qtVersion != NoQt;
languageFeatures.cxx11Enabled = languageVersion >= Utils::LanguageVersion::CXX11;
+ languageFeatures.cxx14Enabled = languageVersion >= Utils::LanguageVersion::CXX14;
languageFeatures.cxxEnabled = hasCxx;
languageFeatures.c99Enabled = languageVersion >= Utils::LanguageVersion::C99;
languageFeatures.objCEnabled = languageExtensions.testFlag(Utils::LanguageExtension::ObjectiveC);