forked from qt-creator/qt-creator
qmljs: update parser
Update the qtcreator qmljs parser to the one of Qt 5.12. It supports EcmaScript 7. Task-number: QTCREATORBUG-20341 Change-Id: I0d1cff71402ba17e22cde6b46c65614e162280de Reviewed-by: Erik Verbruggen <erik.verbruggen@qt.io>
This commit is contained in:
@@ -40,6 +40,7 @@
|
||||
#include "qmljsgrammar_p.h"
|
||||
|
||||
#include <QtCore/qstring.h>
|
||||
#include <QtCore/qstack.h>
|
||||
|
||||
QT_QML_BEGIN_NAMESPACE
|
||||
|
||||
@@ -47,35 +48,7 @@ namespace QmlJS {
|
||||
|
||||
class Engine;
|
||||
class DiagnosticMessage;
|
||||
|
||||
class QML_PARSER_EXPORT Directives {
|
||||
|
||||
public:
|
||||
virtual ~Directives() {}
|
||||
|
||||
virtual void pragmaLibrary(int line, int column)
|
||||
{
|
||||
Q_UNUSED(line);
|
||||
Q_UNUSED(column);
|
||||
}
|
||||
|
||||
virtual void importFile(const QString &jsfile, const QString &module, int line, int column)
|
||||
{
|
||||
Q_UNUSED(jsfile);
|
||||
Q_UNUSED(module);
|
||||
Q_UNUSED(line);
|
||||
Q_UNUSED(column);
|
||||
}
|
||||
|
||||
virtual void importModule(const QString &uri, const QString &version, const QString &module, int line, int column)
|
||||
{
|
||||
Q_UNUSED(uri);
|
||||
Q_UNUSED(version);
|
||||
Q_UNUSED(module);
|
||||
Q_UNUSED(line);
|
||||
Q_UNUSED(column);
|
||||
}
|
||||
};
|
||||
class Directives;
|
||||
|
||||
class QML_PARSER_EXPORT Lexer: public QmlJSGrammar
|
||||
{
|
||||
@@ -85,10 +58,7 @@ public:
|
||||
T_BOOLEAN = T_RESERVED_WORD,
|
||||
T_BYTE = T_RESERVED_WORD,
|
||||
T_CHAR = T_RESERVED_WORD,
|
||||
T_CLASS = T_RESERVED_WORD,
|
||||
T_DOUBLE = T_RESERVED_WORD,
|
||||
T_EXPORT = T_RESERVED_WORD,
|
||||
T_EXTENDS = T_RESERVED_WORD,
|
||||
T_FINAL = T_RESERVED_WORD,
|
||||
T_FLOAT = T_RESERVED_WORD,
|
||||
T_GOTO = T_RESERVED_WORD,
|
||||
@@ -101,8 +71,6 @@ public:
|
||||
T_PRIVATE = T_RESERVED_WORD,
|
||||
T_PROTECTED = T_RESERVED_WORD,
|
||||
T_SHORT = T_RESERVED_WORD,
|
||||
T_STATIC = T_RESERVED_WORD,
|
||||
T_SUPER = T_RESERVED_WORD,
|
||||
T_SYNCHRONIZED = T_RESERVED_WORD,
|
||||
T_THROWS = T_RESERVED_WORD,
|
||||
T_TRANSIENT = T_RESERVED_WORD,
|
||||
@@ -112,7 +80,7 @@ public:
|
||||
enum Error {
|
||||
NoError,
|
||||
IllegalCharacter,
|
||||
IllegalHexNumber,
|
||||
IllegalNumber,
|
||||
UnclosedStringLiteral,
|
||||
IllegalEscapeSequence,
|
||||
IllegalUnicodeEscapeSequence,
|
||||
@@ -130,13 +98,34 @@ public:
|
||||
enum RegExpFlag {
|
||||
RegExp_Global = 0x01,
|
||||
RegExp_IgnoreCase = 0x02,
|
||||
RegExp_Multiline = 0x04
|
||||
RegExp_Multiline = 0x04,
|
||||
RegExp_Unicode = 0x08,
|
||||
RegExp_Sticky = 0x10
|
||||
};
|
||||
|
||||
enum ParseModeFlags {
|
||||
QmlMode = 0x1,
|
||||
YieldIsKeyword = 0x2,
|
||||
StaticIsKeyword = 0x4
|
||||
};
|
||||
|
||||
public:
|
||||
Lexer(Engine *engine);
|
||||
|
||||
int parseModeFlags() const {
|
||||
int flags = 0;
|
||||
if (qmlMode())
|
||||
flags |= QmlMode|StaticIsKeyword;
|
||||
if (yieldIsKeyWord())
|
||||
flags |= YieldIsKeyword;
|
||||
if (_staticIsKeyword)
|
||||
flags |= StaticIsKeyword;
|
||||
return flags;
|
||||
}
|
||||
|
||||
bool qmlMode() const;
|
||||
bool yieldIsKeyWord() const { return _generatorLevel != 0; }
|
||||
void setStaticIsKeyword(bool b) { _staticIsKeyword = b; }
|
||||
|
||||
QString code() const;
|
||||
void setCode(const QString &code, int lineno, bool qmlMode = true);
|
||||
@@ -154,10 +143,7 @@ public:
|
||||
int tokenLength() const { return _tokenLength; }
|
||||
|
||||
int tokenStartLine() const { return _tokenLine; }
|
||||
int tokenStartColumn() const { return _tokenStartPtr - _tokenLinePtr + 1; }
|
||||
|
||||
int tokenEndLine() const;
|
||||
int tokenEndColumn() const;
|
||||
int tokenStartColumn() const { return _tokenColumn; }
|
||||
|
||||
inline QStringRef tokenSpell() const { return _tokenSpell; }
|
||||
double tokenValue() const { return _tokenValue; }
|
||||
@@ -176,13 +162,23 @@ public:
|
||||
BalancedParentheses
|
||||
};
|
||||
|
||||
void enterGeneratorBody() { ++_generatorLevel; }
|
||||
void leaveGeneratorBody() { --_generatorLevel; }
|
||||
|
||||
protected:
|
||||
int classify(const QChar *s, int n, bool qmlMode);
|
||||
static int classify(const QChar *s, int n, int parseModeFlags);
|
||||
|
||||
private:
|
||||
inline void scanChar();
|
||||
int scanToken();
|
||||
int scanNumber(QChar ch);
|
||||
enum ScanStringMode {
|
||||
SingleQuote = '\'',
|
||||
DoubleQuote = '"',
|
||||
TemplateHead = '`',
|
||||
TemplateContinuation = 0
|
||||
};
|
||||
int scanString(ScanStringMode mode);
|
||||
|
||||
bool isLineTerminator() const;
|
||||
unsigned isLineTerminatorSequence() const;
|
||||
@@ -190,10 +186,9 @@ private:
|
||||
static bool isDecimalDigit(ushort c);
|
||||
static bool isHexDigit(QChar c);
|
||||
static bool isOctalDigit(ushort c);
|
||||
static bool isUnicodeEscapeSequence(const QChar *chars);
|
||||
|
||||
void syncProhibitAutomaticSemicolon();
|
||||
QChar decodeUnicodeEscapeCharacter(bool *ok);
|
||||
uint decodeUnicodeEscapeCharacter(bool *ok);
|
||||
QChar decodeHexEscapeCharacter(bool *ok);
|
||||
|
||||
private:
|
||||
@@ -206,26 +201,30 @@ private:
|
||||
|
||||
const QChar *_codePtr;
|
||||
const QChar *_endPtr;
|
||||
const QChar *_lastLinePtr;
|
||||
const QChar *_tokenLinePtr;
|
||||
const QChar *_tokenStartPtr;
|
||||
|
||||
QChar _char;
|
||||
Error _errorCode;
|
||||
|
||||
int _currentLineNumber;
|
||||
int _currentColumnNumber;
|
||||
double _tokenValue;
|
||||
|
||||
// parentheses state
|
||||
ParenthesesState _parenthesesState;
|
||||
int _parenthesesCount;
|
||||
|
||||
// template string stack
|
||||
QStack<int> _outerTemplateBraceCount;
|
||||
int _bracesCount = -1;
|
||||
|
||||
int _stackToken;
|
||||
|
||||
int _patternFlags;
|
||||
int _tokenKind;
|
||||
int _tokenLength;
|
||||
int _tokenLine;
|
||||
int _tokenColumn;
|
||||
|
||||
bool _validTokenText;
|
||||
bool _prohibitAutomaticSemicolon;
|
||||
@@ -234,6 +233,8 @@ private:
|
||||
bool _followsClosingBrace;
|
||||
bool _delimited;
|
||||
bool _qmlMode;
|
||||
int _generatorLevel = 0;
|
||||
bool _staticIsKeyword = false;
|
||||
};
|
||||
|
||||
} // end of namespace QmlJS
|
||||
|
||||
Reference in New Issue
Block a user