diff --git a/src/libs/qmljs/qmljsreformatter.cpp b/src/libs/qmljs/qmljsreformatter.cpp index d4f3f1042d8..98b18c760d2 100644 --- a/src/libs/qmljs/qmljsreformatter.cpp +++ b/src/libs/qmljs/qmljsreformatter.cpp @@ -957,10 +957,10 @@ protected: accept(ast->left); // in general, avoid splitting at the operator - // but && and || are ok + // but && || and ?? are ok qreal splitBadness = 30; if (ast->op == QSOperator::And - || ast->op == QSOperator::Or) + || ast->op == QSOperator::Or || ast->op == QSOperator::Coalesce) splitBadness = 0; addPossibleSplit(splitBadness); diff --git a/src/libs/qmljs/qmljsscanner.cpp b/src/libs/qmljs/qmljsscanner.cpp index 35c616b3bc9..75fdc907f5f 100644 --- a/src/libs/qmljs/qmljsscanner.cpp +++ b/src/libs/qmljs/qmljsscanner.cpp @@ -498,6 +498,18 @@ QList Scanner::operator()(const QString &text, int startState) setRegexpMayFollow(&_state, true); break; + case '?': + switch (la.unicode()) { + case '?': + case '.': + tokens.append(Token(index, 2, Token::Delimiter)); + index += 2; + default: + tokens.append(Token(index++, 1, Token::Delimiter)); + } + setRegexpMayFollow(&_state, true); + break; + default: if (ch.isSpace()) { do { diff --git a/tests/auto/qml/reformatter/nullishCoalescing.qml b/tests/auto/qml/reformatter/nullishCoalescing.qml new file mode 100644 index 00000000000..f4407c0001a --- /dev/null +++ b/tests/auto/qml/reformatter/nullishCoalescing.qml @@ -0,0 +1,9 @@ +import QtQuick 2.15 +import QtQuick.Controls 2.15 + +Item { + property string otherString: "" + property string aProp: otherString ?? "N/A" + property string bProp: otherString?.trim() + property int unrelatedProp: 10 +}