8#include <private/qqmljsdiagnosticmessage_p.h>
9#include <private/qqmljsmemorypool_p.h>
10#include <private/qlocale_tools_p.h>
13#include <QtCore/qcoreapplication.h>
14#include <QtCore/qvarlengtharray.h>
15#include <QtCore/qdebug.h>
16#include <QtCore/QScopedValueRollback>
25 switch (
ch.unicode()) {
37 if (
c >=
'0' &&
c <=
'9')
39 else if (
c >=
'a' &&
c <=
'f')
40 return (
c -
'a' + 10);
42 return (
c -
'A' + 10);
51 : _engine(
engine), _lexMode(lexMode), _endPtr(
nullptr), _qmlMode(true)
71 _currentOffset += _code.
size();
79 _skipLinefeed =
false;
83 _errorMessage.
clear();
89 _tokenStartPtr = _codePtr;
92 _currentLineNumber = lineno;
93 _currentColumnNumber = 0;
94 _tokenLine = _currentLineNumber;
102void Lexer::scanChar()
107 _skipLinefeed =
false;
110 ++_currentColumnNumber;
112 if (isLineTerminator()) {
114 if (_codePtr < _endPtr && *_codePtr == u
'\n')
115 _skipLinefeed =
true;
118 ++_currentLineNumber;
119 _currentColumnNumber = 0;
123QChar Lexer::peekChar()
125 auto peekPtr = _codePtr;
126 if (peekPtr < _endPtr)
132inline bool isBinop(
int tok)
136 case Lexer::T_AND_AND:
137 case Lexer::T_AND_EQ:
138 case Lexer::T_DIVIDE_:
139 case Lexer::T_DIVIDE_EQ:
142 case Lexer::T_EQ_EQ_EQ:
146 case Lexer::T_GT_GT_EQ:
147 case Lexer::T_GT_GT_GT:
148 case Lexer::T_GT_GT_GT_EQ:
152 case Lexer::T_LT_LT_EQ:
154 case Lexer::T_MINUS_EQ:
155 case Lexer::T_NOT_EQ:
156 case Lexer::T_NOT_EQ_EQ:
161 case Lexer::T_PLUS_EQ:
162 case Lexer::T_REMAINDER:
163 case Lexer::T_REMAINDER_EQ:
164 case Lexer::T_RETURN:
166 case Lexer::T_STAR_EQ:
168 case Lexer::T_XOR_EQ:
178 if (
c >= u
'0' &&
c <= u
'9')
179 return c.unicode() - u
'0';
180 if (
c >= u
'a' &&
c <= u
'f')
181 return c.unicode() - u
'a' + 10;
182 if (
c >= u
'A' &&
c <= u
'F')
183 return c.unicode() - u
'A' + 10;
189 if (
c >= u
'0' &&
c <= u
'7')
190 return c.unicode() - u
'0';
198 const int previousTokenKind = _state.
tokenKind;
200 bool firstPass =
true;
213 _tokenStartPtr = _codePtr - 1;
214 _tokenLine = _currentLineNumber;
215 _tokenColumn = _currentColumnNumber;
216 while (_codePtr <= _endPtr) {
223 _codePtr - _tokenStartPtr - 1 - 4,
237 std::optional<ScanStringMode> scanMode;
238 switch (previousTokenKind) {
239 case T_PARTIAL_SINGLE_QUOTE_STRING_LITERAL:
240 scanMode = ScanStringMode::SingleQuote;
242 case T_PARTIAL_DOUBLE_QUOTE_STRING_LITERAL:
243 scanMode = ScanStringMode::DoubleQuote;
245 case T_PARTIAL_TEMPLATE_HEAD:
246 scanMode = ScanStringMode::TemplateHead;
248 case T_PARTIAL_TEMPLATE_MIDDLE:
249 scanMode = ScanStringMode::TemplateContinuation;
256 _tokenStartPtr = _codePtr - 1;
257 _tokenLine = _currentLineNumber;
258 _tokenColumn = _currentColumnNumber;
265 _tokenLength = _codePtr - _tokenStartPtr - 1;
273 case T_PARTIAL_COMMENT:
300 case T_AUTOMATIC_SEMICOLON:
353 }
else if (_state.
tokenKind == T_LPAREN) {
367uint Lexer::decodeUnicodeEscapeCharacter(
bool *
ok)
371 if (_codePtr + 4 <= _endPtr && isHexDigit(_state.
currentChar)) {
373 for (
int i = 0;
i < 4; ++
i) {
384 }
else if (_codePtr < _endPtr && _state.
currentChar == u
'{') {
391 while (_codePtr <= _endPtr) {
397 if (codePoint > 0x10ffff)
420QChar Lexer::decodeHexEscapeCharacter(
bool *
ok)
422 if (isHexDigit(_codePtr[0]) && isHexDigit(_codePtr[1])) {
445 <<
" engine:" <<
qsizetype(l._engine) <<
",\n"
446 <<
" lexMode:" << int(l._lexMode) <<
",\n"
448 <<
" endPtr: codePtr + " << (l._endPtr - l._codePtr) <<
",\n"
449 <<
" qmlMode:" << l._qmlMode <<
",\n"
450 <<
" staticIsKeyword:" << l._staticIsKeyword <<
",\n"
451 <<
" currentLineNumber:" << l._currentLineNumber <<
",\n"
452 <<
" currentColumnNumber:" << l._currentColumnNumber <<
",\n"
453 <<
" currentOffset:" << l._currentOffset <<
",\n"
454 <<
" tokenLength:" << l._tokenLength <<
",\n"
455 <<
" tokenLine:" << l._tokenLine <<
",\n"
456 <<
" tokenColumn:" << l._tokenColumn <<
",\n"
457 <<
" tokenText:" << l._tokenText <<
",\n"
458 <<
" skipLinefeed:" << l._skipLinefeed <<
",\n"
459 <<
" errorMessage:" << l._errorMessage <<
",\n"
460 <<
" tokenSpell:" << l._tokenSpell <<
",\n"
461 <<
" rawString:" << l._rawString <<
",\n";
463 dbg <<
" codePtr: code.unicode()+" << (l._codePtr - l._code.
unicode()) <<
",\n";
465 dbg <<
" codePtr: *null*,\n";
466 if (l._tokenStartPtr)
467 dbg <<
" tokenStartPtr: codePtr " << (l._tokenStartPtr - l._codePtr) <<
",\n";
469 dbg <<
" tokenStartPtr: *null*,\n";
470 dbg <<
" state:" << l._state <<
"\n}";
478 if ((
ch >= u
'a' &&
ch <= u
'z') ||
479 (
ch >= u
'A' &&
ch <= u
'Z') ||
480 ch == u
'$' ||
ch == u
'_')
500 if ((
ch >= u
'a' &&
ch <= u
'z') ||
501 (
ch >= u
'A' &&
ch <= u
'Z') ||
502 (
ch >= u
'0' &&
ch <= u
'9') ||
503 ch == u
'$' ||
ch == u
'_' ||
504 ch == 0x200c ||
ch == 0x200d )
528int Lexer::scanToken()
538 return scanString(TemplateContinuation);
548 if (isLineTerminator()) {
549 bool isAtEnd = (_codePtr + (_skipLinefeed ? 1 : 0)) == _endPtr;
552 _tokenLine = _currentLineNumber;
553 _tokenColumn = _currentColumnNumber;
554 _tokenStartPtr = _codePtr - 1;
558 syncProhibitAutomaticSemicolon();
565 _tokenStartPtr = _codePtr - 1;
566 _tokenLine = _currentLineNumber;
567 _tokenColumn = _currentColumnNumber;
569 if (_codePtr >= _endPtr) {
577 }
else if (_codePtr > _endPtr) {
585 switch (
ch.unicode()) {
586 case u
'~':
return T_TILDE;
587 case u
'}':
return T_RBRACE;
599 case u
'{':
return T_LBRACE;
608 case u
']':
return T_RBRACKET;
609 case u
'[':
return T_LBRACKET;
613 return T_QUESTION_QUESTION;
617 return T_QUESTION_DOT;
630 return T_GT_GT_GT_EQ;
672 case u
';':
return T_SEMICOLON;
673 case u
':':
return T_COLON;
679 while (_codePtr <= _endPtr) {
699 return T_PARTIAL_COMMENT;
703 while (_codePtr <= _endPtr && !isLineTerminator()) {
724 return scanNumber(
ch);
751 return T_MINUS_MINUS;
755 case u
',':
return T_COMMA;
782 return T_STAR_STAR_EQ;
788 case u
')':
return T_RPAREN;
789 case u
'(':
return T_LPAREN;
791 case u
'@':
return T_AT;
806 return T_REMAINDER_EQ;
826 return scanString(ScanStringMode(
ch.unicode()));
838 return scanVersionNumber(
ch);
840 return scanNumber(
ch);
843 if (_currentLineNumber == 1 && _currentColumnNumber == 2) {
845 while (_codePtr <= _endPtr && !isLineTerminator()) {
861 bool identifierWithEscapeChars =
false;
866 identifierWithEscapeChars =
true;
868 c = decodeUnicodeEscapeCharacter(&
ok);
873 if (identifierWithEscapeChars) {
883 while (_codePtr <= _endPtr) {
888 }
else if (_state.
currentChar == u
'\\' && _codePtr[0] == u
'u') {
889 if (!identifierWithEscapeChars) {
890 identifierWithEscapeChars =
true;
892 _tokenText.
insert(0, _tokenStartPtr, _codePtr - _tokenStartPtr - 1);
898 c = decodeUnicodeEscapeCharacter(&
ok);
917 if (identifierWithEscapeChars) {
928 _tokenLength = _codePtr - _tokenStartPtr - 1;
930 int kind = T_IDENTIFIER;
932 if (!identifierWithEscapeChars)
935 if (kind == T_FUNCTION) {
940 _tokenLength = _codePtr - _tokenStartPtr - 1;
941 kind = T_FUNCTION_STAR;
948 while (_codePtr <= _endPtr) {
955 _codePtr - _tokenStartPtr - 1 - 4,
961 goto continue_skipping;
968 return T_PARTIAL_COMMENT;
970 goto continue_skipping;
972 while (_codePtr <= _endPtr && !isLineTerminator()) {
977 _codePtr - _tokenStartPtr - 1 - 2,
983 goto continue_skipping;
991 if (kind == T_IDENTIFIER && identifierWithEscapeChars)
994 _tokenSpell = _engine->
midRef(_tokenStartPtr - _code.
unicode(), _tokenLength);
1007int Lexer::scanString(ScanStringMode
mode)
1015 bool multilineStringLiteral =
false;
1017 const QChar *startCode = _codePtr - 1;
1020 _skipLinefeed =
false;
1024 while (_codePtr <= _endPtr) {
1025 if (isLineTerminator()) {
1028 --_currentLineNumber;
1033 "Stray newline in string literal");
1041 _engine->
midRef(startCode - _code.
unicode(), _codePtr - startCode - 1);
1042 _rawString = _tokenSpell;
1047 if (
mode == TemplateHead)
1048 return T_NO_SUBSTITUTION_TEMPLATE;
1049 else if (
mode == TemplateContinuation)
1050 return T_TEMPLATE_TAIL;
1051 else if (multilineStringLiteral)
1052 return T_MULTILINE_STRING_LITERAL;
1054 return T_STRING_LITERAL;
1058 ++_currentColumnNumber;
1065 --_currentColumnNumber;
1068 _tokenText =
QString(startCode, _codePtr - startCode);
1070 auto setRawString = [&](
const QChar *
end) {
1073 raw.replace(u
'\r', u
'\n');
1079 while (_codePtr <= _endPtr) {
1086 setRawString(_codePtr - 1);
1092 if (
mode == TemplateContinuation)
1093 return T_TEMPLATE_TAIL;
1094 else if (
mode == TemplateHead)
1095 return T_NO_SUBSTITUTION_TEMPLATE;
1097 return multilineStringLiteral ? T_MULTILINE_STRING_LITERAL : T_STRING_LITERAL;
1098 }
else if (
quote == u
'`' && _state.
currentChar == u
'$' && *_codePtr == u
'{') {
1104 setRawString(_codePtr - 2);
1107 return (
mode == TemplateHead ? T_TEMPLATE_HEAD : T_TEMPLATE_MIDDLE);
1110 if (_codePtr > _endPtr) {
1113 "QQmlParser",
"End of file reached at escape sequence");
1123 uint codePoint = decodeUnicodeEscapeCharacter(&
ok);
1131 u =
QChar(codePoint);
1138 u = decodeHexEscapeCharacter(&
ok);
1142 "QQmlParser",
"Illegal hexadecimal escape sequence");
1148 case u
'\\': u = u
'\\'; scanChar();
break;
1149 case u
'\'': u = u
'\''; scanChar();
break;
1150 case u
'\"': u = u
'\"'; scanChar();
break;
1151 case u
'b': u = u
'\b'; scanChar();
break;
1152 case u
'f': u = u
'\f'; scanChar();
break;
1153 case u
'n': u = u
'\n'; scanChar();
break;
1154 case u
'r': u = u
'\r'; scanChar();
break;
1155 case u
't': u = u
'\t'; scanChar();
break;
1156 case u
'v': u = u
'\v'; scanChar();
break;
1176 "QQmlParser",
"Octal escape sequences are not allowed");
1201 if (
mode == TemplateContinuation)
1202 return T_PARTIAL_TEMPLATE_MIDDLE;
1203 else if (
mode == TemplateHead)
1204 return T_PARTIAL_TEMPLATE_HEAD;
1205 else if (
mode == SingleQuote)
1206 return T_PARTIAL_SINGLE_QUOTE_STRING_LITERAL;
1207 return T_PARTIAL_DOUBLE_QUOTE_STRING_LITERAL;
1214int Lexer::scanNumber(
QChar ch)
1227 "At least one hexadecimal digit is required after '0%1'")
1243 return T_NUMERIC_LITERAL;
1254 "QQmlParser",
"At least one octal digit is required after '0%1'")
1270 return T_NUMERIC_LITERAL;
1281 "QQmlParser",
"At least one binary digit is required after '0%1'")
1299 return T_NUMERIC_LITERAL;
1303 "Decimal numbers can't start with '0'");
1331 || ((_codePtr[0] == u
'+' || _codePtr[0] == u
'-') && _codePtr[1].
isDigit())) {
1349 const char *
end =
nullptr;
1361 return T_NUMERIC_LITERAL;
1364int Lexer::scanVersionNumber(
QChar ch)
1368 return T_VERSION_NUMBER;
1372 acc +=
ch.digitValue();
1381 return T_VERSION_NUMBER;
1404 "QQmlParser",
"Invalid regular expression flag '%0'")
1412 _tokenLength = _codePtr - _tokenStartPtr - 1;
1420 if (_codePtr > _endPtr || isLineTerminator()) {
1422 "QQmlParser",
"Unterminated regular expression backslash sequence");
1435 while (_codePtr <= _endPtr && !isLineTerminator()) {
1443 if (_codePtr > _endPtr || isLineTerminator()) {
1445 "QQmlParser",
"Unterminated regular expression backslash sequence");
1459 "QQmlParser",
"Unterminated regular expression class");
1468 if (_codePtr > _endPtr || isLineTerminator()) {
1470 "QQmlParser",
"Unterminated regular expression literal");
1482bool Lexer::isLineTerminator()
const
1485 return unicode == 0x000Au
1486 || unicode == 0x000Du
1487 || unicode == 0x2028u
1488 || unicode == 0x2029u;
1491unsigned Lexer::isLineTerminatorSequence()
const
1499 if (_codePtr->
unicode() == 0x000Au)
1508bool Lexer::isIdentLetter(
QChar ch)
1512 if ((
ch >= u
'a' &&
ch <= u
'z')
1513 || (
ch >= u
'A' &&
ch <= u
'Z')
1514 ||
ch == u
'$' ||
ch == u
'_')
1516 if (
ch.unicode() < 128)
1518 return ch.isLetterOrNumber();
1521bool Lexer::isDecimalDigit(
ushort c)
1523 return (
c >= u
'0' &&
c <= u
'9');
1526bool Lexer::isHexDigit(
QChar c)
1528 return ((
c >= u
'0' &&
c <= u
'9')
1529 || (
c >= u
'a' &&
c <= u
'f')
1530 || (
c >= u
'A' &&
c <= u
'F'));
1533bool Lexer::isOctalDigit(
ushort c)
1535 return (
c >= u
'0' &&
c <= u
'7');
1543 if (_state.
tokenKind == T_STRING_LITERAL)
1544 return QString(_tokenStartPtr + 1, _tokenLength - 2);
1546 return QString(_tokenStartPtr, _tokenLength);
1556 return _errorMessage;
1559void Lexer::syncProhibitAutomaticSemicolon()
1589 QQmlJSGrammar::T_IDENTIFIER,
1590 QQmlJSGrammar::T_PROPERTY,
1591 QQmlJSGrammar::T_SIGNAL,
1592 QQmlJSGrammar::T_READONLY,
1593 QQmlJSGrammar::T_ON,
1594 QQmlJSGrammar::T_BREAK,
1595 QQmlJSGrammar::T_CASE,
1596 QQmlJSGrammar::T_CATCH,
1597 QQmlJSGrammar::T_CONTINUE,
1598 QQmlJSGrammar::T_DEFAULT,
1599 QQmlJSGrammar::T_DELETE,
1600 QQmlJSGrammar::T_DO,
1601 QQmlJSGrammar::T_ELSE,
1602 QQmlJSGrammar::T_FALSE,
1603 QQmlJSGrammar::T_FINALLY,
1604 QQmlJSGrammar::T_FOR,
1605 QQmlJSGrammar::T_FUNCTION,
1606 QQmlJSGrammar::T_FUNCTION_STAR,
1607 QQmlJSGrammar::T_IF,
1608 QQmlJSGrammar::T_IN,
1609 QQmlJSGrammar::T_OF,
1610 QQmlJSGrammar::T_INSTANCEOF,
1611 QQmlJSGrammar::T_NEW,
1612 QQmlJSGrammar::T_NULL,
1613 QQmlJSGrammar::T_RETURN,
1614 QQmlJSGrammar::T_SWITCH,
1615 QQmlJSGrammar::T_THIS,
1616 QQmlJSGrammar::T_THROW,
1617 QQmlJSGrammar::T_TRUE,
1618 QQmlJSGrammar::T_TRY,
1619 QQmlJSGrammar::T_TYPEOF,
1620 QQmlJSGrammar::T_VAR,
1621 QQmlJSGrammar::T_VOID,
1622 QQmlJSGrammar::T_WHILE,
1623 QQmlJSGrammar::T_CONST,
1624 QQmlJSGrammar::T_DEBUGGER,
1625 QQmlJSGrammar::T_RESERVED_WORD,
1626 QQmlJSGrammar::T_WITH,
1628 QQmlJSGrammar::EOF_SYMBOL
1633 while (*current != QQmlJSGrammar::EOF_SYMBOL) {
1634 if (*current ==
token)
1691 bool fileImport =
false;
1693 if (_state.
tokenKind == T_STRING_LITERAL) {
1705 }
else if (_state.
tokenKind == T_IDENTIFIER) {
1720 if (_state.
tokenKind != QQmlJSGrammar::T_DOT)
1732 if (_state.
tokenKind == T_VERSION_NUMBER) {
1738 if (_state.
tokenKind != T_VERSION_NUMBER) {
1740 "QQmlParser",
"Incomplete version number (dot but no minor)"));
1758 error->loc.startLine = lineNumber;
1809 <<
" errorCode:" << int(
s.errorCode) <<
",\n"
1810 <<
" currentChar:" <<
s.currentChar <<
",\n"
1811 <<
" tokenValue:" <<
s.tokenValue <<
",\n"
1812 <<
" parenthesesState:" <<
s.parenthesesState <<
",\n"
1813 <<
" parenthesesCount:" <<
s.parenthesesCount <<
",\n"
1814 <<
" outerTemplateBraceCount:" <<
s.outerTemplateBraceCount <<
",\n"
1815 <<
" bracesCount:" <<
s.bracesCount <<
",\n"
1816 <<
" stackToken:" <<
s.stackToken <<
",\n"
1817 <<
" patternFlags:" <<
s.patternFlags <<
",\n"
1818 <<
" tokenKind:" <<
s.tokenKind <<
",\n"
1819 <<
" importState:" << int(
s.importState) <<
",\n"
1820 <<
" validTokenText:" <<
s.validTokenText <<
",\n"
1821 <<
" prohibitAutomaticSemicolon:" <<
s.prohibitAutomaticSemicolon <<
",\n"
1822 <<
" restrictedKeyword:" <<
s.restrictedKeyword <<
",\n"
1823 <<
" terminator:" <<
s.terminator <<
",\n"
1824 <<
" followsClosingBrace:" <<
s.followsClosingBrace <<
",\n"
1825 <<
" delimited:" <<
s.delimited <<
",\n"
1826 <<
" handlingDirectives:" <<
s.handlingDirectives <<
",\n"
1827 <<
" generatorLevel:" <<
s.generatorLevel <<
"\n}";
static constexpr char32_t surrogateToUcs4(char16_t high, char16_t low) noexcept
Converts a UTF16 surrogate pair with the given high and low values to it's UCS-4-encoded code point.
static constexpr bool requiresSurrogates(char32_t ucs4) noexcept
Returns true if the UCS-4-encoded character specified by ucs4 can be split into the high and low part...
constexpr bool isDigit() const noexcept
Returns true if the character is a decimal digit (Number_DecimalDigit); otherwise returns false.
int digitValue() const noexcept
Returns the numeric value of the digit, or -1 if the character is not a digit.
static constexpr char16_t highSurrogate(char32_t ucs4) noexcept
Returns the high surrogate part of a UCS-4-encoded code point.
constexpr bool isLowSurrogate() const noexcept
Returns true if the QChar is the low part of a UTF16 surrogate (for example if its code point is in r...
constexpr char16_t unicode() const noexcept
Returns the numeric Unicode value of the QChar.
static constexpr char16_t lowSurrogate(char32_t ucs4) noexcept
Returns the low surrogate part of a UCS-4-encoded code point.
Category category() const noexcept
Returns the character's category.
constexpr bool isUpper() const noexcept
Returns true if the character is an uppercase letter, for example category() is Letter_Uppercase.
constexpr bool isSpace() const noexcept
Returns true if the character is a separator character (Separator_* categories or certain code points...
constexpr bool isHighSurrogate() const noexcept
Returns true if the QChar is the high part of a UTF16 surrogate (for example if its code point is in ...
static QString translate(const char *context, const char *key, const char *disambiguation=nullptr, int n=-1)
\threadsafe
virtual void pragmaLibrary()
virtual void importFile(const QString &jsfile, const QString &module, int line, int column)
virtual void importModule(const QString &uri, const QString &version, const QString &module, int line, int column)
void addComment(int pos, int len, int line, int col)
QStringView midRef(int position, int size)
QStringView newStringRef(const QString &text)
void setCode(const QString &code)
void setCode(const QString &code, int lineno, bool qmlMode=true, CodeContinuation codeContinuation=CodeContinuation::Reset)
static int classify(const QChar *s, int n, int parseModeFlags)
int tokenStartColumn() const
QString tokenText() const
bool followsClosingBrace() const
@ IllegalUnicodeEscapeSequence
@ IllegalExponentIndicator
@ IllegalHexadecimalEscapeSequence
bool scanDirectives(Directives *directives, DiagnosticMessage *error)
bool prevTerminator() const
bool scanRegExp(RegExpBodyPrefix prefix=NoPrefix)
const State & state() const
int tokenStartLine() const
void setState(const State &state)
Lexer(Engine *engine, LexMode lexMode=LexMode::WholeCode)
QString errorMessage() const
int parseModeFlags() const
bool canInsertAutomaticSemicolon(int token) const
T pop()
Removes the top item from the stack and returns it.
void push(const T &t)
Adds element t to the top of the stack.
\macro QT_RESTRICTED_CAST_FROM_ASCII
void reserve(qsizetype size)
Ensures the string has space for at least size characters.
void clear()
Clears the contents of the string and makes it null.
qsizetype size() const
Returns the number of characters in this string.
QString arg(qlonglong a, int fieldwidth=0, int base=10, QChar fillChar=u' ') const
const QChar at(qsizetype i) const
Returns the character at the given index position in the string.
bool endsWith(const QString &s, Qt::CaseSensitivity cs=Qt::CaseSensitive) const
Returns true if the string ends with s; otherwise returns false.
bool isEmpty() const
Returns true if the string has no characters; otherwise returns false.
QString & insert(qsizetype i, QChar c)
QString & append(QChar c)
const QChar * unicode() const
Returns a Unicode representation of the string.
void resize(qsizetype size)
Sets the size of the string to size characters.
constexpr size_type size() const noexcept
const T * constData() const
QDebug operator<<(QDebug dbg, const Lexer &l)
Combined button and popup list for selecting options.
DBusConnection const char DBusError * error
GLuint GLsizei const GLchar * message
GLenum GLenum GLsizei void GLsizei void * column
static int regExpFlagFromChar(const QChar &ch)
static const int uriTokens[]
static bool isIdentifierPart(uint ch)
static bool isUriToken(int token)
static unsigned char convertHex(ushort c)
static bool isIdentifierStart(uint ch)
static void setError(QJsonObject *response, const QString &msg)
static QT_BEGIN_NAMESPACE bool isDigit(ushort ch)
QtPrivate::QRegularExpressionMatchIteratorRangeBasedForIterator begin(const QRegularExpressionMatchIterator &iterator)
QLatin1StringView QLatin1String
static QString quote(const QString &str)
ParenthesesState parenthesesState
bool prohibitAutomaticSemicolon
QStack< int > outerTemplateBraceCount