forked from qt-creator/qt-creator
CppEditor: Do not format strings in the basic highlighter
... if a semantic highlighter is available. Otherwise, raw string literals can introduce formatting artifacts, in particular when using clangd. Task-number: QTCREATORBUG-26211 Change-Id: If76c173fa98188930221e89e2665b66deb91c5e0 Reviewed-by: Alp Öz <aoz@qt.io> Reviewed-by: David Schulz <david.schulz@qt.io>
This commit is contained in:
@@ -26,6 +26,7 @@
|
|||||||
#include "cpphighlighter.h"
|
#include "cpphighlighter.h"
|
||||||
|
|
||||||
#include "cppdoxygen.h"
|
#include "cppdoxygen.h"
|
||||||
|
#include "cppmodelmanager.h"
|
||||||
#include "cpptoolsreuse.h"
|
#include "cpptoolsreuse.h"
|
||||||
|
|
||||||
#include <texteditor/textdocumentlayout.h>
|
#include <texteditor/textdocumentlayout.h>
|
||||||
@@ -165,7 +166,22 @@ void CppHighlighter::highlightBlock(const QString &text)
|
|||||||
} else if (tk.is(T_NUMERIC_LITERAL)) {
|
} else if (tk.is(T_NUMERIC_LITERAL)) {
|
||||||
setFormat(tk.utf16charsBegin(), tk.utf16chars(), formatForCategory(C_NUMBER));
|
setFormat(tk.utf16charsBegin(), tk.utf16chars(), formatForCategory(C_NUMBER));
|
||||||
} else if (tk.isStringLiteral() || tk.isCharLiteral()) {
|
} else if (tk.isStringLiteral() || tk.isCharLiteral()) {
|
||||||
if (!highlightRawStringLiteral(text, tk)) {
|
// Our highlighting is broken for multi-line raw string literals, so if a superior
|
||||||
|
// option is available, don't do anything.
|
||||||
|
// Note that this does not just save unneeded work, but can actually be required,
|
||||||
|
// because mis-detected strings are not necessarily overwritten by the semantic
|
||||||
|
// highlighter. Example:
|
||||||
|
// const char *s = R"delim(
|
||||||
|
// line1
|
||||||
|
// "line)" // <- is misdeteced by SimpleLexer as end of raw string literal
|
||||||
|
// line3 // <- erroneously not formatted by us, but that would be ok;
|
||||||
|
// // the semantic highlighter does it for us later
|
||||||
|
// )delim"; // <- end quote is erroneously interpreted as *start* of a string,
|
||||||
|
// // and because clangd does not include punctuation in its semantic
|
||||||
|
// // tokens, the semicolon would stay formatted as a string even
|
||||||
|
// // after the semantic highlighter has run.
|
||||||
|
if (!CppModelManager::instance()->isClangCodeModelActive()
|
||||||
|
&& !highlightRawStringLiteral(text, tk)) {
|
||||||
setFormatWithSpaces(text, tk.utf16charsBegin(), tk.utf16chars(),
|
setFormatWithSpaces(text, tk.utf16charsBegin(), tk.utf16chars(),
|
||||||
formatForCategory(C_STRING));
|
formatForCategory(C_STRING));
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user