aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/parser
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@qt.io>2018-03-14 10:04:39 +0100
committerLars Knoll <lars.knoll@qt.io>2018-04-25 17:50:24 +0000
commitd3058682fd3c9994c3a598d901398c1d751e2586 (patch)
tree6e6050d12b295ff208b2aba291c6fa4950fa5cdf /src/qml/parser
parent62143542d40096119c4a3425dd6fa50a4750423c (diff)
Support static as a keyword in class definitions
This requires some interaction between parser and lexer as static is only recognized as a keyword directly in the class declaration. Change-Id: Ib64157ae6ad542706a5eee8ff4ec7f9cb79a62c3 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
Diffstat (limited to 'src/qml/parser')
-rw-r--r--src/qml/parser/qqmljs.g29
-rw-r--r--src/qml/parser/qqmljskeywords_p.h2
-rw-r--r--src/qml/parser/qqmljslexer_p.h9
3 files changed, 34 insertions, 6 deletions
diff --git a/src/qml/parser/qqmljs.g b/src/qml/parser/qqmljs.g
index d49a07a664..fe8e744264 100644
--- a/src/qml/parser/qqmljs.g
+++ b/src/qml/parser/qqmljs.g
@@ -3480,8 +3480,24 @@ ClassExpression: T_CLASS BindingIdentifier ClassTail;
ClassExpression: T_CLASS ClassTail;
-ClassTail: T_LBRACE ClassBodyOpt T_RBRACE;
-ClassTail: ClassHeritage T_LBRACE ClassBodyOpt T_RBRACE;
+ClassLBrace: T_LBRACE;
+/.
+ case $rule_number: {
+ lexer->setStaticIsKeyword(true);
+ } break;
+./
+
+ClassRBrace: T_RBRACE;
+/. case $rule_number: ./
+ClassStaticQualifier: T_STATIC;
+/.
+ case $rule_number: {
+ lexer->setStaticIsKeyword(false);
+ } break;
+./
+
+ClassTail: ClassLBrace ClassBodyOpt ClassRBrace;
+ClassTail: ClassHeritage ClassLBrace ClassBodyOpt ClassRBrace;
ClassHeritage: T_EXTENDS LeftHandSideExpression;
@@ -3495,7 +3511,14 @@ ClassElementList: ClassElement;
ClassElementList: ClassElementList ClassElement;
ClassElement: MethodDefinition;
-ClassElement: T_STATIC MethodDefinition;
+
+ClassElement: ClassStaticQualifier MethodDefinition;
+/.
+ case $rule_number: {
+ lexer->setStaticIsKeyword(true);
+ } break;
+./
+
ClassElement: T_SEMICOLON;
-- Scripts and Modules
diff --git a/src/qml/parser/qqmljskeywords_p.h b/src/qml/parser/qqmljskeywords_p.h
index e2ae66d796..9cc47469e5 100644
--- a/src/qml/parser/qqmljskeywords_p.h
+++ b/src/qml/parser/qqmljskeywords_p.h
@@ -503,7 +503,7 @@ static inline int classify6(const QChar *s, int parseModeFlags) {
if (s[3].unicode() == 't') {
if (s[4].unicode() == 'i') {
if (s[5].unicode() == 'c') {
- return (parseModeFlags & Lexer::QmlMode) ? int(Lexer::T_STATIC) : int(Lexer::T_IDENTIFIER);
+ return (parseModeFlags & Lexer::StaticIsKeyword) ? int(Lexer::T_STATIC) : int(Lexer::T_IDENTIFIER);
}
}
}
diff --git a/src/qml/parser/qqmljslexer_p.h b/src/qml/parser/qqmljslexer_p.h
index 3dc1339cd1..a6ac8cb354 100644
--- a/src/qml/parser/qqmljslexer_p.h
+++ b/src/qml/parser/qqmljslexer_p.h
@@ -118,7 +118,8 @@ public:
enum ParseModeFlags {
QmlMode = 0x1,
- YieldIsKeyword = 0x2
+ YieldIsKeyword = 0x2,
+ StaticIsKeyword = 0x4
};
public:
@@ -127,14 +128,17 @@ public:
int parseModeFlags() const {
int flags = 0;
if (qmlMode())
- flags |= 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);
@@ -243,6 +247,7 @@ private:
bool _delimited;
bool _qmlMode;
int _generatorLevel = 0;
+ bool _staticIsKeyword = false;
};
} // end of namespace QQmlJS