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()