From a013d7572862cde46517d78c84c1a76be73eff66 Mon Sep 17 00:00:00 2001 From: Artem Sokolovskii Date: Mon, 18 Oct 2021 16:14:05 +0200 Subject: [PATCH] CppEditor: Change parsing opposite bracket Fixed behavior: - when comparing sign was determined as angle bracket - when in complex combination brackets, an opposite bracket was detected not correct - not correct mismatch case highlightning Added tests for the cases form bug 26395 Fixes: QTCREATORBUG-26400 Fixes: QTCREATORBUG-26395 Change-Id: Ic45566d2677f80fb9a8e4fe830307254dd1db51d Reviewed-by: Christian Kandeler --- src/plugins/cppeditor/semantichighlighter.cpp | 2 +- src/tools/clangbackend/source/tokeninfo.cpp | 6 +++- .../unit/unittest/data/highlightingmarks.cpp | 15 +++++++++ tests/unit/unittest/tokenprocessor-test.cpp | 31 +++++++++++++++++-- 4 files changed, 49 insertions(+), 5 deletions(-) diff --git a/src/plugins/cppeditor/semantichighlighter.cpp b/src/plugins/cppeditor/semantichighlighter.cpp index eb6e90fb2b9..6a02566981a 100644 --- a/src/plugins/cppeditor/semantichighlighter.cpp +++ b/src/plugins/cppeditor/semantichighlighter.cpp @@ -225,7 +225,7 @@ void SemanticHighlighter::onHighlighterResultAvailable(int from, int to) } else if (result.kind == DoubleAngleBracketClose) { Parenthesis extraParen = {Parenthesis::Closed, '>', result.column - 1}; extraParen.source = parenSource(); - parentheses.second.append(extraParen); + insertSorted(parentheses.second, extraParen); paren = {Parenthesis::Closed, '>', result.column}; } else if (result.kind == TernaryIf) { paren = {Parenthesis::Opened, '?', result.column - 1}; diff --git a/src/tools/clangbackend/source/tokeninfo.cpp b/src/tools/clangbackend/source/tokeninfo.cpp index e8ece9c06de..1535eb2cc24 100644 --- a/src/tools/clangbackend/source/tokeninfo.cpp +++ b/src/tools/clangbackend/source/tokeninfo.cpp @@ -607,7 +607,11 @@ void TokenInfo::punctuationOrOperatorKind() && m_types.mixinHighlightingTypes.empty() && kind != CXCursor_OverloadedDeclRef && kind != CXCursor_InclusionDirective - && kind != CXCursor_PreprocessingDirective) { + && kind != CXCursor_PreprocessingDirective + && kind != CXCursor_MacroDefinition + && kind != CXCursor_DeclStmt + && kind != CXCursor_CompoundStmt + && kind != CXCursor_FirstInvalid) { const ClangString spelling = m_token->spelling(); if (spelling == "<") m_types.mixinHighlightingTypes.push_back(HighlightingType::AngleBracketOpen); diff --git a/tests/unit/unittest/data/highlightingmarks.cpp b/tests/unit/unittest/data/highlightingmarks.cpp index 7631534d35f..57f4586daba 100644 --- a/tests/unit/unittest/data/highlightingmarks.cpp +++ b/tests/unit/unittest/data/highlightingmarks.cpp @@ -794,3 +794,18 @@ const char *cyrillic = "б"; struct foo { #define blubb }; + +#define test_micro(A,B) ((A##B>1?A:B)) + +int a = (a1 > 0); + +int func() { + int a = (a1 > 0); +} + +namespace std { + template struct pair; + template struct vector; +} + +static std::vector> pvr; diff --git a/tests/unit/unittest/tokenprocessor-test.cpp b/tests/unit/unittest/tokenprocessor-test.cpp index ade12cb1fcf..0a6106569f7 100644 --- a/tests/unit/unittest/tokenprocessor-test.cpp +++ b/tests/unit/unittest/tokenprocessor-test.cpp @@ -1794,11 +1794,10 @@ TEST_F(TokenProcessor, TemplateSeparateDeclDef) ASSERT_THAT(infos[37], IsHighlightingMark(764u, 5u, 9u, HighlightingType::GlobalVariable)); } -TEST_F(TokenProcessor, NestedTemplate) +TEST_F(TokenProcessor, NestedTemplateIncorrect) { const auto infos = translationUnit.tokenInfosInRange(sourceRange(773, 44)); - ASSERT_THAT(infos[12], HasTwoTypes(HighlightingType::Punctuation, - HighlightingType::DoubleAngleBracketClose)); + ASSERT_THAT(infos[12], HasOnlyType(HighlightingType::Punctuation)); } TEST_F(TokenProcessor, OperatorInTemplate) @@ -1819,6 +1818,32 @@ TEST_F(TokenProcessor, PreProcessorInStruct) ASSERT_THAT(infos[1], HasOnlyType(HighlightingType::Preprocessor)); } +TEST_F(TokenProcessor, DefinitionWithComparison) +{ + const auto infos = translationUnit.tokenInfosInRange(sourceRange(798, 39)); + ASSERT_THAT(infos[13], HasOnlyType(HighlightingType::Punctuation)); +} + +TEST_F(TokenProcessor, GlobalVariableWithComparison) +{ + const auto infos = translationUnit.tokenInfosInRange(sourceRange(800, 18)); + ASSERT_THAT(infos[5], HasOnlyType(HighlightingType::Punctuation)); +} + +TEST_F(TokenProcessor, VariableWithComparison) +{ + const auto infos = translationUnit.tokenInfosInRange(sourceRange(803, 22)); + ASSERT_THAT(infos[5], HasOnlyType(HighlightingType::Punctuation)); +} + + +TEST_F(TokenProcessor, NestedTemplate) +{ + const auto infos = translationUnit.tokenInfosInRange(sourceRange(811, 44)); + ASSERT_THAT(infos[12], HasTwoTypes(HighlightingType::Punctuation, + HighlightingType::DoubleAngleBracketClose)); +} + Data *TokenProcessor::d; void TokenProcessor::SetUpTestCase()