diff options
Diffstat (limited to 'src/qml/parser/qqmljsast_p.h')
-rw-r--r-- | src/qml/parser/qqmljsast_p.h | 1110 |
1 files changed, 791 insertions, 319 deletions
diff --git a/src/qml/parser/qqmljsast_p.h b/src/qml/parser/qqmljsast_p.h index e84c62af2f..bfeab7518c 100644 --- a/src/qml/parser/qqmljsast_p.h +++ b/src/qml/parser/qqmljsast_p.h @@ -1,41 +1,5 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtQml module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only #ifndef QQMLJSAST_P_H #define QQMLJSAST_P_H @@ -53,11 +17,21 @@ #include "qqmljsastvisitor_p.h" #include "qqmljsglobal_p.h" -#include "qqmljsmemorypool_p.h" -#include <QtCore/qstring.h> +#include <private/qqmljsmemorypool_p.h> -QT_QML_BEGIN_NAMESPACE +#include <QtCore/qtaggedpointer.h> +#include <QtCore/qversionnumber.h> + +#include <type_traits> + +QT_BEGIN_NAMESPACE + +class QString; + +namespace QQmlJS { + class Parser; +} #define QQMLJS_DECLARE_AST_NODE(name) \ enum { K = Kind_##name }; @@ -103,6 +77,8 @@ enum Op { URShift, InplaceURightShift, InplaceXor, + As, + Coalesce, Invalid }; @@ -122,10 +98,10 @@ enum class VariableScope { template <typename T1, typename T2> T1 cast(T2 *ast) { - if (ast && ast->kind == static_cast<T1>(0)->K) + if (ast && ast->kind == std::remove_pointer_t<T1>::K) return static_cast<T1>(ast); - return 0; + return nullptr; } FunctionExpression *asAnonymousFunctionDefinition(AST::Node *n); @@ -173,6 +149,7 @@ public: Kind_ClassDeclaration, Kind_IdentifierExpression, Kind_IdentifierPropertyName, + Kind_InitializerExpression, Kind_ComputedPropertyName, Kind_IfStatement, Kind_LabelledStatement, @@ -213,6 +190,7 @@ public: Kind_SwitchStatement, Kind_TemplateLiteral, Kind_TaggedTemplate, + Kind_TypeExpression, Kind_ThisExpression, Kind_ThrowStatement, Kind_TildeExpression, @@ -233,25 +211,34 @@ public: Kind_PatternElementList, Kind_PatternProperty, Kind_PatternPropertyList, - + Kind_Type, + Kind_TypeArgument, + Kind_TypeAnnotation, Kind_UiArrayBinding, Kind_UiImport, Kind_UiObjectBinding, Kind_UiObjectDefinition, + Kind_UiInlineComponent, Kind_UiObjectInitializer, Kind_UiObjectMemberList, Kind_UiArrayMemberList, + Kind_UiPragmaValueList, Kind_UiPragma, Kind_UiProgram, Kind_UiParameterList, + Kind_UiPropertyAttributes, Kind_UiPublicMember, Kind_UiQualifiedId, Kind_UiScriptBinding, Kind_UiSourceElement, Kind_UiHeaderItemList, Kind_UiEnumDeclaration, - Kind_UiEnumMemberList + Kind_UiEnumMemberList, + Kind_UiVersionSpecifier, + Kind_UiRequired, + Kind_UiAnnotation, + Kind_UiAnnotationList }; inline Node() {} @@ -271,10 +258,16 @@ public: virtual FunctionExpression *asFunctionDefinition(); virtual ClassExpression *asClassDefinition(); - inline void accept(Visitor *visitor) + bool ignoreRecursionDepth() const; + + inline void accept(BaseVisitor *visitor) { - Visitor::RecursionDepthCheck recursionCheck(visitor); - if (recursionCheck()) { + BaseVisitor::RecursionDepthCheck recursionCheck(visitor); + + // Stack overflow is uncommon, ignoreRecursionDepth() only returns true if + // QV4_CRASH_ON_STACKOVERFLOW is set, and ignoreRecursionDepth() needs to be out of line. + // Therefore, check for ignoreRecursionDepth() _after_ calling the inline recursionCheck(). + if (recursionCheck() || ignoreRecursionDepth()) { if (visitor->preVisit(this)) accept0(visitor); visitor->postVisit(this); @@ -283,19 +276,13 @@ public: } } - inline static void accept(Node *node, Visitor *visitor) + inline static void accept(Node *node, BaseVisitor *visitor) { if (node) node->accept(visitor); } - // ### Remove when we can. This is part of the qmldevtools library, though. - inline static void acceptChild(Node *node, Visitor *visitor) - { - return accept(node, visitor); - } - - virtual void accept0(Visitor *visitor) = 0; + virtual void accept0(BaseVisitor *visitor) = 0; virtual SourceLocation firstSourceLocation() const = 0; virtual SourceLocation lastSourceLocation() const = 0; @@ -303,12 +290,128 @@ public: int kind = Kind_Undefined; }; +template<typename T> +T lastListElement(T head) +{ + auto current = head; + while (current->next) + current = current->next; + return current; +} + +class QML_PARSER_EXPORT UiQualifiedId: public Node +{ +public: + QQMLJS_DECLARE_AST_NODE(UiQualifiedId) + + UiQualifiedId(QStringView name) + : next(this), name(name) + { kind = K; } + + UiQualifiedId(UiQualifiedId *previous, QStringView name) + : name(name) + { + kind = K; + next = previous->next; + previous->next = this; + } + + UiQualifiedId *finish() + { + UiQualifiedId *head = next; + next = nullptr; + return head; + } + + void accept0(BaseVisitor *visitor) override; + + SourceLocation firstSourceLocation() const override + { return identifierToken; } + + SourceLocation lastSourceLocation() const override + { + return lastListElement(this)->lastOwnSourceLocation(); + } + + SourceLocation lastOwnSourceLocation() const { return identifierToken; } + + QString toString() const + { + QString result; + toString(&result); + return result; + } + + void toString(QString *out) const + { + for (const UiQualifiedId *it = this; it; it = it->next) { + out->append(it->name); + if (it->next) + out->append(QLatin1Char('.')); + } + } + +// attributes + UiQualifiedId *next; + QStringView name; + SourceLocation identifierToken; + SourceLocation dotToken; +}; + +class QML_PARSER_EXPORT Type: public Node +{ +public: + QQMLJS_DECLARE_AST_NODE(Type) + + Type(UiQualifiedId *typeId, Type *typeArgument = nullptr) + : typeId(typeId) + , typeArgument(typeArgument ? typeArgument->typeId : nullptr) + { kind = K; } + + void accept0(BaseVisitor *visitor) override; + + SourceLocation firstSourceLocation() const override + { return typeId->firstSourceLocation(); } + + SourceLocation lastSourceLocation() const override + { return typeArgument ? typeArgument->lastSourceLocation() : typeId->lastSourceLocation(); } + + QString toString() const; + void toString(QString *out) const; + +// attributes + UiQualifiedId *typeId; + UiQualifiedId *typeArgument; +}; + +class QML_PARSER_EXPORT TypeAnnotation: public Node +{ +public: + QQMLJS_DECLARE_AST_NODE(TypeAnnotation) + + TypeAnnotation(Type *type) + : type(type) + { kind = K; } + + void accept0(BaseVisitor *visitor) override; + + SourceLocation firstSourceLocation() const override + { return colonToken; } + + SourceLocation lastSourceLocation() const override + { return type->lastSourceLocation(); } + +// attributes + Type *type; + SourceLocation colonToken; +}; class QML_PARSER_EXPORT ExpressionNode: public Node { public: ExpressionNode() {} ExpressionNode *expressionCast() override; + bool containsOptionalChain() const; AST::FormalParameterList *reparseAsFormalParameterList(MemoryPool *pool); @@ -336,7 +439,7 @@ public: : expression(expression) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return lparenToken; } @@ -354,6 +457,26 @@ public: SourceLocation rparenToken; }; + +class QML_PARSER_EXPORT TypeExpression : public ExpressionNode +{ +public: + QQMLJS_DECLARE_AST_NODE(TypeExpression) + TypeExpression(Type *t) : m_type(t) { kind = K; } + + void accept0(BaseVisitor *visitor) override; + + SourceLocation firstSourceLocation() const override { + return m_type->firstSourceLocation(); + } + + SourceLocation lastSourceLocation() const override { + return m_type->lastSourceLocation(); + } + + Type *m_type; +}; + class QML_PARSER_EXPORT ThisExpression: public LeftHandSideExpression { public: @@ -361,7 +484,7 @@ public: ThisExpression() { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return thisToken; } @@ -378,10 +501,10 @@ class QML_PARSER_EXPORT IdentifierExpression: public LeftHandSideExpression public: QQMLJS_DECLARE_AST_NODE(IdentifierExpression) - IdentifierExpression(const QStringRef &n): + IdentifierExpression(QStringView n): name (n) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return identifierToken; } @@ -390,7 +513,7 @@ public: { return identifierToken; } // attributes - QStringRef name; + QStringView name; SourceLocation identifierToken; }; @@ -401,7 +524,7 @@ public: NullExpression() { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return nullToken; } @@ -420,7 +543,7 @@ public: TrueLiteral() { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return trueToken; } @@ -439,7 +562,7 @@ public: FalseLiteral() { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return falseToken; } @@ -458,7 +581,7 @@ public: SuperLiteral() { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return superToken; } @@ -479,7 +602,7 @@ public: NumericLiteral(double v): value(v) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return literalToken; } @@ -492,15 +615,45 @@ public: SourceLocation literalToken; }; -class QML_PARSER_EXPORT StringLiteral: public LeftHandSideExpression +class QML_PARSER_EXPORT UiVersionSpecifier : public Node +{ +public: + QQMLJS_DECLARE_AST_NODE(UiVersionSpecifier) + + UiVersionSpecifier(int majorum) : version(QTypeRevision::fromMajorVersion(majorum)) + { + kind = K; + } + + UiVersionSpecifier(int majorum, int minorum) : version(QTypeRevision::fromVersion(majorum, minorum)) + { + kind = K; + } + + void accept0(BaseVisitor *visitor) override; + + SourceLocation firstSourceLocation() const override { return majorToken; } + + SourceLocation lastSourceLocation() const override + { + return minorToken.isValid() ? minorToken : majorToken; + } + + // attributes: + QTypeRevision version; + SourceLocation majorToken; + SourceLocation minorToken; +}; + +class QML_PARSER_EXPORT StringLiteral : public LeftHandSideExpression { public: QQMLJS_DECLARE_AST_NODE(StringLiteral) - StringLiteral(const QStringRef &v): + StringLiteral(QStringView v): value (v) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return literalToken; } @@ -509,7 +662,7 @@ public: { return literalToken; } // attributes: - QStringRef value; + QStringView value; SourceLocation literalToken; }; @@ -518,7 +671,7 @@ class QML_PARSER_EXPORT TemplateLiteral : public LeftHandSideExpression public: QQMLJS_DECLARE_AST_NODE(TemplateLiteral) - TemplateLiteral(const QStringRef &str, const QStringRef &raw, ExpressionNode *e) + TemplateLiteral(QStringView str, QStringView raw, ExpressionNode *e) : value(str), rawValue(raw), expression(e), next(nullptr) { kind = K; } @@ -526,12 +679,16 @@ public: { return literalToken; } SourceLocation lastSourceLocation() const override - { return next ? next->lastSourceLocation() : (expression ? expression->lastSourceLocation() : literalToken); } + { + auto last = lastListElement(this); + return (last->expression ? last->expression->lastSourceLocation() : last->literalToken); + } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; - QStringRef value; - QStringRef rawValue; + bool hasNoSubstitution = false; + QStringView value; + QStringView rawValue; ExpressionNode *expression; TemplateLiteral *next; SourceLocation literalToken; @@ -542,10 +699,10 @@ class QML_PARSER_EXPORT RegExpLiteral: public LeftHandSideExpression public: QQMLJS_DECLARE_AST_NODE(RegExpLiteral) - RegExpLiteral(const QStringRef &p, int f): + RegExpLiteral(QStringView p, int f): pattern (p), flags (f) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return literalToken; } @@ -554,7 +711,7 @@ public: { return literalToken; } // attributes: - QStringRef pattern; + QStringView pattern; int flags; SourceLocation literalToken; }; @@ -580,7 +737,7 @@ public: : elements(elts) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return lbracketToken; } @@ -611,7 +768,7 @@ public: : properties(plist) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return lbraceToken; } @@ -642,13 +799,13 @@ public: previous->next = this; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return commaToken; } SourceLocation lastSourceLocation() const override - { return next ? next->lastSourceLocation() : commaToken; } + { return lastListElement(this)->commaToken; } inline Elision *finish () { @@ -681,6 +838,75 @@ public: SourceLocation propertyNameToken; }; +struct QML_PARSER_EXPORT BoundName +{ + enum Type { + Declared, + Injected, + }; + + QString id; + QQmlJS::SourceLocation location; + QTaggedPointer<TypeAnnotation, Type> typeAnnotation; + BoundName(const QString &id, const QQmlJS::SourceLocation &location, + TypeAnnotation *typeAnnotation, Type type = Declared) + : id(id), location(location), typeAnnotation(typeAnnotation, type) + {} + BoundName() = default; + + bool isInjected() const { return typeAnnotation.tag() == Injected; } +}; + +struct BoundNames : public QVector<BoundName> +{ + int indexOf(const QString &name, int from = 0) const + { + auto found = std::find_if(constBegin() + from, constEnd(), + [name](const BoundName &it) { return it.id == name; }); + if (found == constEnd()) + return -1; + return found - constBegin(); + } + + bool contains(const QString &name) const + { + return indexOf(name) != -1; + } +}; + +/*! +\internal +This class is needed to pass the information about the equalToken in the parser, and is only needed +during AST construction. It behaves exactly like the expression it contains: that avoids changing +all the usages in qqmljs.g from ExpressionNode to InitializerExpression for every rule expecting a +InitializerOpt_In or InitializerOpt. +*/ +class QML_PARSER_EXPORT InitializerExpression : public ExpressionNode +{ +public: + QQMLJS_DECLARE_AST_NODE(InitializerExpression) + + InitializerExpression(ExpressionNode *e) : expression(e) { kind = K; } + + void accept0(BaseVisitor *visitor) override; + + SourceLocation firstSourceLocation() const override + { return equalToken; } + + SourceLocation lastSourceLocation() const override { return expression->lastSourceLocation(); } + + FunctionExpression *asFunctionDefinition() override + { + return expression->asFunctionDefinition(); + } + + ClassExpression *asClassDefinition() override { return expression->asClassDefinition(); } + + // attributes + ExpressionNode *expression; + SourceLocation equalToken; +}; + class QML_PARSER_EXPORT PatternElement : public Node { public: @@ -701,15 +927,36 @@ public: Binding, }; +private: + /*! + \internal + Hide InitializerExpression from the AST. InitializerExpression is only needed during parsing for + the AST construction, and it is not possible for the parser to directly embed the location of + equal tokens inside the PatternElement without the InitializerExpression. + */ + void unwrapInitializer() + { + if (auto unwrapped = AST::cast<InitializerExpression *>(initializer)) { + equalToken = unwrapped->equalToken; + initializer = unwrapped->expression; + } + } +public: + PatternElement(ExpressionNode *i = nullptr, Type t = Literal) : initializer(i), type(t) - { kind = K; } + { + kind = K; + unwrapInitializer(); + } - PatternElement(const QStringRef &n, ExpressionNode *i = nullptr, Type t = Binding) + PatternElement(QStringView n, TypeAnnotation *typeAnnotation = nullptr, ExpressionNode *i = nullptr, Type t = Binding) : bindingIdentifier(n), initializer(i), type(t) + , typeAnnotation(typeAnnotation) { Q_ASSERT(t >= RestElement); kind = K; + unwrapInitializer(); } PatternElement(Pattern *pattern, ExpressionNode *i = nullptr, Type t = Binding) @@ -717,16 +964,17 @@ public: { Q_ASSERT(t >= RestElement); kind = K; + unwrapInitializer(); } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; virtual bool convertLiteralToAssignmentPattern(MemoryPool *pool, SourceLocation *errorLocation, QString *errorMessage); SourceLocation firstSourceLocation() const override { return identifierToken.isValid() ? identifierToken : (bindingTarget ? bindingTarget->firstSourceLocation() : initializer->firstSourceLocation()); } SourceLocation lastSourceLocation() const override - { return initializer ? initializer->lastSourceLocation() : (bindingTarget ? bindingTarget->lastSourceLocation() : identifierToken); } + { return initializer ? initializer->lastSourceLocation() : (bindingTarget ? bindingTarget->lastSourceLocation() : (typeAnnotation ? typeAnnotation->lastSourceLocation() : identifierToken)); } ExpressionNode *destructuringTarget() const { return bindingTarget; } Pattern *destructuringPattern() const { return bindingTarget ? bindingTarget->patternCast() : nullptr; } @@ -736,17 +984,21 @@ public: bool isVariableDeclaration() const { return scope != VariableScope::NoScope; } bool isLexicallyScoped() const { return scope == VariableScope::Let || scope == VariableScope::Const; } - virtual void boundNames(QStringList *names); + virtual void boundNames(BoundNames *names); // attributes SourceLocation identifierToken; - QStringRef bindingIdentifier; + SourceLocation equalToken; + QStringView bindingIdentifier; ExpressionNode *bindingTarget = nullptr; ExpressionNode *initializer = nullptr; Type type = Literal; + TypeAnnotation *typeAnnotation = nullptr; // when used in a VariableDeclarationList + SourceLocation declarationKindToken; VariableScope scope = VariableScope::NoScope; bool isForDeclaration = false; + bool isInjectedSignalParameter = false; }; class QML_PARSER_EXPORT PatternElementList : public Node @@ -771,15 +1023,18 @@ public: return front; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; - void boundNames(QStringList *names); + void boundNames(BoundNames *names); SourceLocation firstSourceLocation() const override { return elision ? elision->firstSourceLocation() : element->firstSourceLocation(); } SourceLocation lastSourceLocation() const override - { return next ? next->lastSourceLocation() : (element ? element->lastSourceLocation() : elision->lastSourceLocation()); } + { + auto last = lastListElement(this); + return last->element ? last->element->lastSourceLocation() : last->elision->lastSourceLocation(); + } Elision *elision = nullptr; PatternElement *element = nullptr; @@ -795,15 +1050,15 @@ public: : PatternElement(i, t), name(name) { kind = K; } - PatternProperty(PropertyName *name, const QStringRef &n, ExpressionNode *i = nullptr) - : PatternElement(n, i), name(name) + PatternProperty(PropertyName *name, QStringView n, ExpressionNode *i = nullptr) + : PatternElement(n, /*type annotation*/nullptr, i), name(name) { kind = K; } PatternProperty(PropertyName *name, Pattern *pattern, ExpressionNode *i = nullptr) : PatternElement(pattern, i), name(name) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return name->firstSourceLocation(); } @@ -813,7 +1068,7 @@ public: return loc.isValid() ? loc : name->lastSourceLocation(); } - void boundNames(QStringList *names) override; + void boundNames(BoundNames *names) override; bool convertLiteralToAssignmentPattern(MemoryPool *pool, SourceLocation *errorLocation, QString *errorMessage) override; // attributes @@ -839,9 +1094,9 @@ public: previous->next = this; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; - void boundNames(QStringList *names); + void boundNames(BoundNames *names); inline PatternPropertyList *finish () { @@ -854,26 +1109,26 @@ public: { return property->firstSourceLocation(); } SourceLocation lastSourceLocation() const override - { return next ? next->lastSourceLocation() : property->lastSourceLocation(); } + { return lastListElement(this)->property->lastSourceLocation(); } PatternProperty *property; PatternPropertyList *next; }; -class QML_PARSER_EXPORT IdentifierPropertyName : public PropertyName +class QML_PARSER_EXPORT IdentifierPropertyName: public PropertyName { public: QQMLJS_DECLARE_AST_NODE(IdentifierPropertyName) - IdentifierPropertyName(const QStringRef &n): + IdentifierPropertyName(QStringView n): id (n) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; QString asString() const override { return id.toString(); } // attributes - QStringRef id; + QStringView id; }; class QML_PARSER_EXPORT StringLiteralPropertyName: public PropertyName @@ -881,15 +1136,15 @@ class QML_PARSER_EXPORT StringLiteralPropertyName: public PropertyName public: QQMLJS_DECLARE_AST_NODE(StringLiteralPropertyName) - StringLiteralPropertyName(const QStringRef &n): + StringLiteralPropertyName(QStringView n): id (n) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; QString asString() const override { return id.toString(); } // attributes - QStringRef id; + QStringView id; }; class QML_PARSER_EXPORT NumericLiteralPropertyName: public PropertyName @@ -900,7 +1155,7 @@ public: NumericLiteralPropertyName(double n): id (n) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; QString asString() const override; @@ -917,7 +1172,7 @@ public: : expression(expression) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; QString asString() const override { return QString(); } @@ -941,7 +1196,7 @@ public: base (b), expression (e) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return base->firstSourceLocation(); } @@ -954,6 +1209,7 @@ public: ExpressionNode *expression; SourceLocation lbracketToken; SourceLocation rbracketToken; + bool isOptional = false; }; class QML_PARSER_EXPORT FieldMemberExpression: public LeftHandSideExpression @@ -961,11 +1217,11 @@ class QML_PARSER_EXPORT FieldMemberExpression: public LeftHandSideExpression public: QQMLJS_DECLARE_AST_NODE(FieldMemberExpression) - FieldMemberExpression(ExpressionNode *b, const QStringRef &n): + FieldMemberExpression(ExpressionNode *b, QStringView n): base (b), name (n) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return base->firstSourceLocation(); } @@ -975,9 +1231,10 @@ public: // attributes ExpressionNode *base; - QStringRef name; + QStringView name; SourceLocation dotToken; SourceLocation identifierToken; + bool isOptional = false; }; class QML_PARSER_EXPORT TaggedTemplate : public LeftHandSideExpression @@ -989,7 +1246,7 @@ public: : base (b), templateLiteral(t) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return base->firstSourceLocation(); } @@ -1011,7 +1268,7 @@ public: base (b), arguments (a) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return newToken; } @@ -1035,7 +1292,7 @@ public: NewExpression(ExpressionNode *e): expression (e) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return newToken; } @@ -1057,7 +1314,7 @@ public: base (b), arguments (a) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return base->firstSourceLocation(); } @@ -1070,6 +1327,7 @@ public: ArgumentList *arguments; SourceLocation lparenToken; SourceLocation rparenToken; + bool isOptional = false; }; class QML_PARSER_EXPORT ArgumentList: public Node @@ -1089,7 +1347,7 @@ public: previous->next = this; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return expression->firstSourceLocation(); } @@ -1123,7 +1381,7 @@ public: PostIncrementExpression(ExpressionNode *b): base (b) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return base->firstSourceLocation(); } @@ -1144,7 +1402,7 @@ public: PostDecrementExpression(ExpressionNode *b): base (b) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return base->firstSourceLocation(); } @@ -1165,7 +1423,7 @@ public: DeleteExpression(ExpressionNode *e): expression (e) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return deleteToken; } @@ -1186,7 +1444,7 @@ public: VoidExpression(ExpressionNode *e): expression (e) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return voidToken; } @@ -1207,7 +1465,7 @@ public: TypeOfExpression(ExpressionNode *e): expression (e) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return typeofToken; } @@ -1228,7 +1486,7 @@ public: PreIncrementExpression(ExpressionNode *e): expression (e) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return incrementToken; } @@ -1249,7 +1507,7 @@ public: PreDecrementExpression(ExpressionNode *e): expression (e) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return decrementToken; } @@ -1270,7 +1528,7 @@ public: UnaryPlusExpression(ExpressionNode *e): expression (e) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return plusToken; } @@ -1291,7 +1549,7 @@ public: UnaryMinusExpression(ExpressionNode *e): expression (e) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return minusToken; } @@ -1312,7 +1570,7 @@ public: TildeExpression(ExpressionNode *e): expression (e) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return tildeToken; } @@ -1333,7 +1591,7 @@ public: NotExpression(ExpressionNode *e): expression (e) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return notToken; } @@ -1357,7 +1615,7 @@ public: BinaryExpression *binaryExpressionCast() override; - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return left->firstSourceLocation(); } @@ -1381,7 +1639,7 @@ public: expression (e), ok (t), ko (f) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return expression->firstSourceLocation(); } @@ -1405,7 +1663,7 @@ public: Expression(ExpressionNode *l, ExpressionNode *r): left (l), right (r) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return left->firstSourceLocation(); } @@ -1427,7 +1685,7 @@ public: Block(StatementList *slist): statements (slist) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return lbraceToken; } @@ -1457,13 +1715,15 @@ public: return n; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return statement->firstSourceLocation(); } SourceLocation lastSourceLocation() const override - { return next ? next->lastSourceLocation() : statement->lastSourceLocation(); } + { + return lastListElement(this)->statement->lastSourceLocation(); + } inline StatementList *finish () { @@ -1494,7 +1754,7 @@ public: previous->next = this; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return declaration->firstSourceLocation(); } @@ -1532,7 +1792,7 @@ public: declarations (vlist) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return declarationKindToken; } @@ -1552,7 +1812,7 @@ public: EmptyStatement() { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return semicolonToken; } @@ -1572,13 +1832,13 @@ public: ExpressionStatement(ExpressionNode *e): expression (e) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return expression->firstSourceLocation(); } SourceLocation lastSourceLocation() const override - { return expression->lastSourceLocation(); } + { return semicolonToken; } // attributes ExpressionNode *expression; @@ -1594,7 +1854,7 @@ public: expression (e), ok (t), ko (f) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return ifToken; } @@ -1626,7 +1886,7 @@ public: statement (stmt), expression (e) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return doToken; } @@ -1653,7 +1913,7 @@ public: expression (e), statement (stmt) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return whileToken; } @@ -1683,7 +1943,7 @@ public: { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return forToken; } @@ -1721,7 +1981,7 @@ public: : lhs(v), expression(e), statement(stmt) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return forToken; } @@ -1749,10 +2009,10 @@ class QML_PARSER_EXPORT ContinueStatement: public Statement public: QQMLJS_DECLARE_AST_NODE(ContinueStatement) - ContinueStatement(const QStringRef &l = QStringRef()): + ContinueStatement(QStringView l = QStringView()): label (l) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return continueToken; } @@ -1761,7 +2021,7 @@ public: { return semicolonToken; } // attributes - QStringRef label; + QStringView label; SourceLocation continueToken; SourceLocation identifierToken; SourceLocation semicolonToken; @@ -1772,10 +2032,10 @@ class QML_PARSER_EXPORT BreakStatement: public Statement public: QQMLJS_DECLARE_AST_NODE(BreakStatement) - BreakStatement(const QStringRef &l): + BreakStatement(QStringView l): label (l) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return breakToken; } @@ -1784,7 +2044,7 @@ public: { return semicolonToken; } // attributes - QStringRef label; + QStringView label; SourceLocation breakToken; SourceLocation identifierToken; SourceLocation semicolonToken; @@ -1798,7 +2058,7 @@ public: ReturnStatement(ExpressionNode *e): expression (e) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return returnToken; } @@ -1820,7 +2080,7 @@ public: YieldExpression(ExpressionNode *e = nullptr): expression (e) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return yieldToken; } @@ -1843,7 +2103,7 @@ public: expression (e), statement (stmt) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return withToken; } @@ -1868,7 +2128,7 @@ public: clauses (c), defaultClause (d), moreClauses (r) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return lbraceToken; } @@ -1893,7 +2153,7 @@ public: expression (e), block (b) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return switchToken; } @@ -1918,7 +2178,7 @@ public: expression (e), statements (slist) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return caseToken; } @@ -1950,13 +2210,15 @@ public: previous->next = this; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return clause->firstSourceLocation(); } SourceLocation lastSourceLocation() const override - { return next ? next->lastSourceLocation() : clause->lastSourceLocation(); } + { + return lastListElement(this)->clause->lastSourceLocation(); + } inline CaseClauses *finish () { @@ -1979,7 +2241,7 @@ public: statements (slist) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return defaultToken; } @@ -1998,11 +2260,11 @@ class QML_PARSER_EXPORT LabelledStatement: public Statement public: QQMLJS_DECLARE_AST_NODE(LabelledStatement) - LabelledStatement(const QStringRef &l, Statement *stmt): + LabelledStatement(QStringView l, Statement *stmt): label (l), statement (stmt) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return identifierToken; } @@ -2011,7 +2273,7 @@ public: { return statement->lastSourceLocation(); } // attributes - QStringRef label; + QStringView label; Statement *statement; SourceLocation identifierToken; SourceLocation colonToken; @@ -2025,7 +2287,7 @@ public: ThrowStatement(ExpressionNode *e): expression (e) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return throwToken; } @@ -2048,7 +2310,7 @@ public: : patternElement(p), statement(stmt) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return catchToken; } @@ -2074,7 +2336,7 @@ public: statement (stmt) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return finallyToken; } @@ -2104,7 +2366,7 @@ public: statement (stmt), catchExpression (c), finallyExpression (nullptr) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return tryToken; } @@ -2131,11 +2393,12 @@ class QML_PARSER_EXPORT FunctionExpression: public ExpressionNode public: QQMLJS_DECLARE_AST_NODE(FunctionExpression) - FunctionExpression(const QStringRef &n, FormalParameterList *f, StatementList *b): - name (n), formals (f), body (b) + FunctionExpression(QStringView n, FormalParameterList *f, StatementList *b, TypeAnnotation *typeAnnotation = nullptr): + name (n), formals (f), body (b), + typeAnnotation(typeAnnotation) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return functionToken; } @@ -2146,11 +2409,12 @@ public: FunctionExpression *asFunctionDefinition() override; // attributes - QStringRef name; + QStringView name; bool isArrowFunction = false; bool isGenerator = false; FormalParameterList *formals; StatementList *body; + TypeAnnotation *typeAnnotation; SourceLocation functionToken; SourceLocation identifierToken; SourceLocation lparenToken; @@ -2164,11 +2428,11 @@ class QML_PARSER_EXPORT FunctionDeclaration: public FunctionExpression public: QQMLJS_DECLARE_AST_NODE(FunctionDeclaration) - FunctionDeclaration(const QStringRef &n, FormalParameterList *f, StatementList *b): - FunctionExpression(n, f, b) + FunctionDeclaration(QStringView n, FormalParameterList *f, StatementList *b, TypeAnnotation *typeAnnotation = nullptr): + FunctionExpression(n, f, b, typeAnnotation) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; }; class QML_PARSER_EXPORT FormalParameterList: public Node @@ -2235,17 +2499,19 @@ public: return false; } - QStringList formals() const; + BoundNames formals() const; - QStringList boundNames() const; + BoundNames boundNames() const; - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return element->firstSourceLocation(); } SourceLocation lastSourceLocation() const override - { return next ? next->lastSourceLocation() : element->lastSourceLocation(); } + { + return lastListElement(this)->element->lastSourceLocation(); + } FormalParameterList *finish(MemoryPool *pool); @@ -2259,11 +2525,11 @@ class QML_PARSER_EXPORT ClassExpression : public ExpressionNode public: QQMLJS_DECLARE_AST_NODE(ClassExpression) - ClassExpression(const QStringRef &n, ExpressionNode *heritage, ClassElementList *elements) + ClassExpression(QStringView n, ExpressionNode *heritage, ClassElementList *elements) : name(n), heritage(heritage), elements(elements) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return classToken; } @@ -2274,7 +2540,7 @@ public: ClassExpression *asClassDefinition() override; // attributes - QStringRef name; + QStringView name; ExpressionNode *heritage; ClassElementList *elements; SourceLocation classToken; @@ -2288,11 +2554,11 @@ class QML_PARSER_EXPORT ClassDeclaration: public ClassExpression public: QQMLJS_DECLARE_AST_NODE(ClassDeclaration) - ClassDeclaration(const QStringRef &n, ExpressionNode *heritage, ClassElementList *elements) + ClassDeclaration(QStringView n, ExpressionNode *heritage, ClassElementList *elements) : ClassExpression(n, heritage, elements) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; }; @@ -2314,7 +2580,7 @@ public: return n; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return property->firstSourceLocation(); } @@ -2342,7 +2608,7 @@ public: : statements(statements) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return statements ? statements->firstSourceLocation() : SourceLocation(); } @@ -2359,19 +2625,19 @@ class QML_PARSER_EXPORT ImportSpecifier: public Node public: QQMLJS_DECLARE_AST_NODE(ImportSpecifier) - ImportSpecifier(const QStringRef &importedBinding) + ImportSpecifier(QStringView importedBinding) : importedBinding(importedBinding) { kind = K; } - ImportSpecifier(const QStringRef &identifier, const QStringRef &importedBinding) + ImportSpecifier(QStringView identifier, QStringView importedBinding) : identifier(identifier), importedBinding(importedBinding) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return identifier.isNull() ? importedBindingToken : identifierToken; } @@ -2381,8 +2647,8 @@ public: // attributes SourceLocation identifierToken; SourceLocation importedBindingToken; - QStringRef identifier; - QStringRef importedBinding; + QStringView identifier; + QStringView importedBinding; }; class QML_PARSER_EXPORT ImportsList: public Node @@ -2416,13 +2682,15 @@ public: return head; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return importSpecifierToken; } SourceLocation lastSourceLocation() const override - { return next ? next->lastSourceLocation() : importSpecifierToken; } + { + return lastListElement(this)->importSpecifierToken; + } // attributes SourceLocation importSpecifierToken; @@ -2446,7 +2714,7 @@ public: kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return leftBraceToken; } @@ -2464,13 +2732,13 @@ class QML_PARSER_EXPORT NameSpaceImport: public Node public: QQMLJS_DECLARE_AST_NODE(NameSpaceImport) - NameSpaceImport(const QStringRef &importedBinding) + NameSpaceImport(QStringView importedBinding) : importedBinding(importedBinding) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; virtual SourceLocation firstSourceLocation() const override { return starToken; } @@ -2480,7 +2748,7 @@ public: // attributes SourceLocation starToken; SourceLocation importedBindingToken; - QStringRef importedBinding; + QStringView importedBinding; }; class QML_PARSER_EXPORT ImportClause: public Node @@ -2488,7 +2756,7 @@ class QML_PARSER_EXPORT ImportClause: public Node public: QQMLJS_DECLARE_AST_NODE(ImportClause) - ImportClause(const QStringRef &importedDefaultBinding) + ImportClause(QStringView importedDefaultBinding) : importedDefaultBinding(importedDefaultBinding) { kind = K; @@ -2506,21 +2774,21 @@ public: kind = K; } - ImportClause(const QStringRef &importedDefaultBinding, NameSpaceImport *nameSpaceImport) + ImportClause(QStringView importedDefaultBinding, NameSpaceImport *nameSpaceImport) : importedDefaultBinding(importedDefaultBinding) , nameSpaceImport(nameSpaceImport) { kind = K; } - ImportClause(const QStringRef &importedDefaultBinding, NamedImports *namedImports) + ImportClause(QStringView importedDefaultBinding, NamedImports *namedImports) : importedDefaultBinding(importedDefaultBinding) , namedImports(namedImports) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; virtual SourceLocation firstSourceLocation() const override { return importedDefaultBinding.isNull() ? (nameSpaceImport ? nameSpaceImport->firstSourceLocation() : namedImports->firstSourceLocation()) : importedDefaultBindingToken; } @@ -2529,7 +2797,7 @@ public: // attributes SourceLocation importedDefaultBindingToken; - QStringRef importedDefaultBinding; + QStringView importedDefaultBinding; NameSpaceImport *nameSpaceImport = nullptr; NamedImports *namedImports = nullptr; }; @@ -2539,13 +2807,13 @@ class QML_PARSER_EXPORT FromClause: public Node public: QQMLJS_DECLARE_AST_NODE(FromClause) - FromClause(const QStringRef &moduleSpecifier) + FromClause(QStringView moduleSpecifier) : moduleSpecifier(moduleSpecifier) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return fromToken; } @@ -2556,7 +2824,7 @@ public: // attributes SourceLocation fromToken; SourceLocation moduleSpecifierToken; - QStringRef moduleSpecifier; + QStringView moduleSpecifier; }; class QML_PARSER_EXPORT ImportDeclaration: public Statement @@ -2570,13 +2838,13 @@ public: kind = K; } - ImportDeclaration(const QStringRef &moduleSpecifier) + ImportDeclaration(QStringView moduleSpecifier) : moduleSpecifier(moduleSpecifier) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return importToken; } @@ -2587,7 +2855,7 @@ public: // attributes SourceLocation importToken; SourceLocation moduleSpecifierToken; - QStringRef moduleSpecifier; + QStringView moduleSpecifier; ImportClause *importClause = nullptr; FromClause *fromClause = nullptr; }; @@ -2597,19 +2865,19 @@ class QML_PARSER_EXPORT ExportSpecifier: public Node public: QQMLJS_DECLARE_AST_NODE(ExportSpecifier) - ExportSpecifier(const QStringRef &identifier) + ExportSpecifier(QStringView identifier) : identifier(identifier), exportedIdentifier(identifier) { kind = K; } - ExportSpecifier(const QStringRef &identifier, const QStringRef &exportedIdentifier) + ExportSpecifier(QStringView identifier, QStringView exportedIdentifier) : identifier(identifier), exportedIdentifier(exportedIdentifier) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return identifierToken; } @@ -2619,8 +2887,8 @@ public: // attributes SourceLocation identifierToken; SourceLocation exportedIdentifierToken; - QStringRef identifier; - QStringRef exportedIdentifier; + QStringView identifier; + QStringView exportedIdentifier; }; class QML_PARSER_EXPORT ExportsList: public Node @@ -2654,12 +2922,12 @@ public: return head; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return exportSpecifier->firstSourceLocation(); } SourceLocation lastSourceLocation() const override - { return next ? next->lastSourceLocation() : exportSpecifier->lastSourceLocation(); } + { return lastListElement(this)->exportSpecifier->lastSourceLocation(); } // attributes ExportSpecifier *exportSpecifier; @@ -2682,7 +2950,7 @@ public: kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return leftBraceToken; } @@ -2703,7 +2971,6 @@ public: ExportDeclaration(FromClause *fromClause) : fromClause(fromClause) { - exportAll = true; kind = K; } @@ -2726,7 +2993,12 @@ public: kind = K; } - void accept0(Visitor *visitor) override; + bool exportsAll() const + { + return fromClause && !exportClause; + } + + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return exportToken; } @@ -2735,7 +3007,6 @@ public: // attributes SourceLocation exportToken; - bool exportAll = false; ExportClause *exportClause = nullptr; FromClause *fromClause = nullptr; Node *variableStatementOrDeclaration = nullptr; @@ -2753,7 +3024,7 @@ public: kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return body ? body->firstSourceLocation() : SourceLocation(); } @@ -2773,7 +3044,7 @@ public: DebuggerStatement() { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return debuggerToken; } @@ -2786,50 +3057,12 @@ public: SourceLocation semicolonToken; }; -class QML_PARSER_EXPORT UiQualifiedId: public Node -{ -public: - QQMLJS_DECLARE_AST_NODE(UiQualifiedId) - - UiQualifiedId(const QStringRef &name) - : next(this), name(name) - { kind = K; } - - UiQualifiedId(UiQualifiedId *previous, const QStringRef &name) - : name(name) - { - kind = K; - next = previous->next; - previous->next = this; - } - - UiQualifiedId *finish() - { - UiQualifiedId *head = next; - next = nullptr; - return head; - } - - void accept0(Visitor *visitor) override; - - SourceLocation firstSourceLocation() const override - { return identifierToken; } - - SourceLocation lastSourceLocation() const override - { return next ? next->lastSourceLocation() : identifierToken; } - -// attributes - UiQualifiedId *next; - QStringRef name; - SourceLocation identifierToken; -}; - class QML_PARSER_EXPORT UiImport: public Node { public: QQMLJS_DECLARE_AST_NODE(UiImport) - UiImport(const QStringRef &fileName) + UiImport(QStringView fileName) : fileName(fileName), importUri(nullptr) { kind = K; } @@ -2837,7 +3070,7 @@ public: : importUri(uri) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return importToken; } @@ -2846,15 +3079,15 @@ public: { return semicolonToken; } // attributes - QStringRef fileName; + QStringView fileName; UiQualifiedId *importUri; - QStringRef importId; + QStringView importId; SourceLocation importToken; SourceLocation fileNameToken; - SourceLocation versionToken; SourceLocation asToken; SourceLocation importIdToken; SourceLocation semicolonToken; + UiVersionSpecifier *version = nullptr; }; class QML_PARSER_EXPORT UiObjectMember: public Node @@ -2864,6 +3097,9 @@ public: SourceLocation lastSourceLocation() const override = 0; UiObjectMember *uiObjectMemberCast() override; + +// attributes + UiAnnotationList *annotations = nullptr; }; class QML_PARSER_EXPORT UiObjectMemberList: public Node @@ -2883,13 +3119,13 @@ public: previous->next = this; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return member->firstSourceLocation(); } SourceLocation lastSourceLocation() const override - { return next ? next->lastSourceLocation() : member->lastSourceLocation(); } + { return lastListElement(this)->member->lastSourceLocation(); } UiObjectMemberList *finish() { @@ -2903,16 +3139,56 @@ public: UiObjectMember *member; }; +class QML_PARSER_EXPORT UiPragmaValueList: public Node +{ +public: + QQMLJS_DECLARE_AST_NODE(UiPragmaValueList) + + UiPragmaValueList(QStringView value) + : value(value) + , next(this) + { + kind = K; + } + + UiPragmaValueList(UiPragmaValueList *previous, QStringView value) + : value(value) + { + kind = K; + next = previous->next; + previous->next = this; + } + + void accept0(BaseVisitor *visitor) override; + + SourceLocation firstSourceLocation() const override + { return location; } + + SourceLocation lastSourceLocation() const override + { return lastListElement(this)->location; } + + UiPragmaValueList *finish() + { + UiPragmaValueList *head = next; + next = nullptr; + return head; + } + + QStringView value; + UiPragmaValueList *next; + SourceLocation location; +}; + class QML_PARSER_EXPORT UiPragma: public Node { public: QQMLJS_DECLARE_AST_NODE(UiPragma) - UiPragma(QStringRef name) - : name(name) + UiPragma(QStringView name, UiPragmaValueList *values = nullptr) + : name(name), values(values) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return pragmaToken; } @@ -2921,8 +3197,33 @@ public: { return semicolonToken; } // attributes - QStringRef name; + QStringView name; + UiPragmaValueList *values; SourceLocation pragmaToken; + SourceLocation pragmaIdToken; + SourceLocation colonToken; + SourceLocation semicolonToken; +}; + +class QML_PARSER_EXPORT UiRequired: public Node +{ +public: + QQMLJS_DECLARE_AST_NODE(UiRequired) + + UiRequired(QStringView name) + :name(name) + { kind = K; } + + void accept0(BaseVisitor *visitor) override; + + SourceLocation firstSourceLocation() const override + { return requiredToken; } + + SourceLocation lastSourceLocation() const override + { return semicolonToken; } + + QStringView name; + SourceLocation requiredToken; SourceLocation semicolonToken; }; @@ -2962,13 +3263,13 @@ public: return head; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return headerItem->firstSourceLocation(); } SourceLocation lastSourceLocation() const override - { return next ? next->lastSourceLocation() : headerItem->lastSourceLocation(); } + { return lastListElement(this)->headerItem->lastSourceLocation(); } // attributes Node *headerItem; @@ -2984,7 +3285,7 @@ public: : headers(headers), members(members) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { @@ -3026,13 +3327,13 @@ public: previous->next = this; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return member->firstSourceLocation(); } SourceLocation lastSourceLocation() const override - { return next ? next->lastSourceLocation() : member->lastSourceLocation(); } + { return lastListElement(this)->member->lastSourceLocation(); } UiArrayMemberList *finish() { @@ -3056,7 +3357,7 @@ public: : members(members) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return lbraceToken; } @@ -3075,11 +3376,11 @@ class QML_PARSER_EXPORT UiParameterList: public Node public: QQMLJS_DECLARE_AST_NODE(UiParameterList) - UiParameterList(UiQualifiedId *t, const QStringRef &n): + UiParameterList(Type *t, QStringView n): type (t), name (n), next (this) { kind = K; } - UiParameterList(UiParameterList *previous, UiQualifiedId *t, const QStringRef &n): + UiParameterList(UiParameterList *previous, Type *t, QStringView n): type (t), name (n) { kind = K; @@ -3087,13 +3388,21 @@ public: previous->next = this; } - void accept0(Visitor *) override; + void accept0(BaseVisitor *) override; SourceLocation firstSourceLocation() const override - { return propertyTypeToken; } + { return colonToken.isValid() ? identifierToken : propertyTypeToken; } SourceLocation lastSourceLocation() const override - { return next ? next->lastSourceLocation() : identifierToken; } + { + auto last = lastListElement(this); + return last->lastOwnSourceLocation(); + } + + SourceLocation lastOwnSourceLocation() const + { + return (colonToken.isValid() ? propertyTypeToken : identifierToken); + } inline UiParameterList *finish () { @@ -3103,12 +3412,53 @@ public: } // attributes - UiQualifiedId *type; - QStringRef name; + Type *type; + QStringView name; UiParameterList *next; SourceLocation commaToken; SourceLocation propertyTypeToken; SourceLocation identifierToken; + SourceLocation colonToken; +}; + +class QML_PARSER_EXPORT UiPropertyAttributes : public Node +{ + QQMLJS_DECLARE_AST_NODE(UiPropertyAttributes) +public: + UiPropertyAttributes() { kind = K; } + + SourceLocation defaultToken() const { return m_defaultToken; } + bool isDefaultMember() const { return defaultToken().isValid(); } + SourceLocation requiredToken() const { return m_requiredToken; } + bool isRequired() const { return requiredToken().isValid(); } + SourceLocation readonlyToken() const { return m_readonlyToken; } + bool isReadonly() const { return readonlyToken().isValid(); } + + SourceLocation propertyToken() const { return m_propertyToken; } + + template <bool InvalidIsLargest = true> + static bool compareLocationsByBegin(const SourceLocation *& lhs, const SourceLocation *& rhs) + { + if (lhs->isValid() && rhs->isValid()) + return lhs->begin() < rhs->begin(); + else if (lhs->isValid()) + return InvalidIsLargest; + else + return !InvalidIsLargest; + } + + void accept0(BaseVisitor *) override {} // intentionally do nothing + + SourceLocation firstSourceLocation() const override; + + SourceLocation lastSourceLocation() const override; + +private: + friend class QQmlJS::Parser; + SourceLocation m_defaultToken; + SourceLocation m_readonlyToken; + SourceLocation m_requiredToken; + SourceLocation m_propertyToken; }; class QML_PARSER_EXPORT UiPublicMember: public UiObjectMember @@ -3117,26 +3467,24 @@ public: QQMLJS_DECLARE_AST_NODE(UiPublicMember) UiPublicMember(UiQualifiedId *memberType, - const QStringRef &name) - : type(Property), memberType(memberType), name(name), statement(nullptr), binding(nullptr), isDefaultMember(false), isReadonlyMember(false), parameters(nullptr) + QStringView name) + : type(Property), memberType(memberType), name(name), statement(nullptr), binding(nullptr), parameters(nullptr) { kind = K; } UiPublicMember(UiQualifiedId *memberType, - const QStringRef &name, + QStringView name, Statement *statement) - : type(Property), memberType(memberType), name(name), statement(statement), binding(nullptr), isDefaultMember(false), isReadonlyMember(false), parameters(nullptr) + : type(Property), memberType(memberType), name(name), statement(statement), binding(nullptr), parameters(nullptr) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { - if (defaultToken.isValid()) - return defaultToken; - else if (readonlyToken.isValid()) - return readonlyToken; - - return propertyToken; + if (hasAttributes) + return m_attributes->firstSourceLocation(); + else + return m_propertyToken; } SourceLocation lastSourceLocation() const override @@ -3149,24 +3497,61 @@ public: return semicolonToken; } + SourceLocation defaultToken() const + { + return hasAttributes ? m_attributes->defaultToken() : SourceLocation {}; + } + bool isDefaultMember() const { return defaultToken().isValid(); } + + SourceLocation requiredToken() const + { + return hasAttributes ? m_attributes->requiredToken() : SourceLocation {}; + } + bool isRequired() const { return requiredToken().isValid(); } + + SourceLocation readonlyToken() const + { + return hasAttributes ? m_attributes->readonlyToken() : SourceLocation {}; + } + bool isReadonly() const { return readonlyToken().isValid(); } + + void setAttributes(UiPropertyAttributes *attributes) + { + m_attributes = attributes; + hasAttributes = true; + } + + SourceLocation propertyToken() const + { + return hasAttributes ? m_attributes->propertyToken() : m_propertyToken; + } + + void setPropertyToken(SourceLocation token) + { + m_propertyToken = token; + hasAttributes = false; + } + // attributes - enum { Signal, Property } type; - QStringRef typeModifier; + enum : bool { Signal, Property } type; + bool hasAttributes = false; + QStringView typeModifier; UiQualifiedId *memberType; - QStringRef name; + QStringView name; Statement *statement; // initialized with a JS expression UiObjectMember *binding; // initialized with a QML object or array. - bool isDefaultMember; - bool isReadonlyMember; UiParameterList *parameters; - SourceLocation defaultToken; - SourceLocation readonlyToken; - SourceLocation propertyToken; + // TODO: merge source locations SourceLocation typeModifierToken; SourceLocation typeToken; SourceLocation identifierToken; SourceLocation colonToken; SourceLocation semicolonToken; +private: + union { + SourceLocation m_propertyToken = SourceLocation {}; + UiPropertyAttributes *m_attributes; + }; }; class QML_PARSER_EXPORT UiObjectDefinition: public UiObjectMember @@ -3179,7 +3564,7 @@ public: : qualifiedTypeNameId(qualifiedTypeNameId), initializer(initializer) { kind = K; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; SourceLocation firstSourceLocation() const override { return qualifiedTypeNameId->identifierToken; } @@ -3192,6 +3577,30 @@ public: UiObjectInitializer *initializer; }; +class QML_PARSER_EXPORT UiInlineComponent: public UiObjectMember +{ +public: + QQMLJS_DECLARE_AST_NODE(UiInlineComponent) + + UiInlineComponent(QStringView inlineComponentName, UiObjectDefinition* inlineComponent) + : name(inlineComponentName), component(inlineComponent) + { kind = K; } + + SourceLocation lastSourceLocation() const override + {return component->lastSourceLocation();} + + SourceLocation firstSourceLocation() const override + {return componentToken;} + + void accept0(BaseVisitor *visitor) override; + + // attributes + QStringView name; + UiObjectDefinition* component; + SourceLocation componentToken; + SourceLocation identifierToken; +}; + class QML_PARSER_EXPORT UiSourceElement: public UiObjectMember { public: @@ -3203,7 +3612,7 @@ public: SourceLocation firstSourceLocation() const override { - if (FunctionDeclaration *funDecl = cast<FunctionDeclaration *>(sourceElement)) + if (FunctionExpression *funDecl = sourceElement->asFunctionDefinition()) return funDecl->firstSourceLocation(); else if (VariableStatement *varStmt = cast<VariableStatement *>(sourceElement)) return varStmt->firstSourceLocation(); @@ -3213,7 +3622,7 @@ public: SourceLocation lastSourceLocation() const override { - if (FunctionDeclaration *funDecl = cast<FunctionDeclaration *>(sourceElement)) + if (FunctionExpression *funDecl = sourceElement->asFunctionDefinition()) return funDecl->lastSourceLocation(); else if (VariableStatement *varStmt = cast<VariableStatement *>(sourceElement)) return varStmt->lastSourceLocation(); @@ -3221,7 +3630,7 @@ public: return SourceLocation(); } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; // attributes @@ -3253,7 +3662,7 @@ public: SourceLocation lastSourceLocation() const override { return initializer->rbraceToken; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; // attributes @@ -3281,7 +3690,7 @@ public: SourceLocation lastSourceLocation() const override { return statement->lastSourceLocation(); } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; // attributes UiQualifiedId *qualifiedId; @@ -3301,12 +3710,12 @@ public: { kind = K; } SourceLocation firstSourceLocation() const override - { return qualifiedId->identifierToken; } + { Q_ASSERT(qualifiedId); return qualifiedId->identifierToken; } SourceLocation lastSourceLocation() const override { return rbracketToken; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; // attributes UiQualifiedId *qualifiedId; @@ -3320,11 +3729,11 @@ class QML_PARSER_EXPORT UiEnumMemberList: public Node { QQMLJS_DECLARE_AST_NODE(UiEnumMemberList) public: - UiEnumMemberList(const QStringRef &member, double v = 0.0) + UiEnumMemberList(QStringView member, double v = 0.0) : next(this), member(member), value(v) { kind = K; } - UiEnumMemberList(UiEnumMemberList *previous, const QStringRef &member) + UiEnumMemberList(UiEnumMemberList *previous, QStringView member) : member(member) { kind = K; @@ -3333,7 +3742,7 @@ public: value = previous->value + 1; } - UiEnumMemberList(UiEnumMemberList *previous, const QStringRef &member, double v) + UiEnumMemberList(UiEnumMemberList *previous, QStringView member, double v) : member(member), value(v) { kind = K; @@ -3345,10 +3754,12 @@ public: { return memberToken; } SourceLocation lastSourceLocation() const override - { return next ? next->lastSourceLocation() : - valueToken.isValid() ? valueToken : memberToken; } + { + auto last = lastListElement(this); + return last->valueToken.isValid() ? last->valueToken : last->memberToken; + } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; UiEnumMemberList *finish() { @@ -3359,7 +3770,7 @@ public: // attributes UiEnumMemberList *next; - QStringRef member; + QStringView member; double value; SourceLocation memberToken; SourceLocation valueToken; @@ -3370,7 +3781,7 @@ class QML_PARSER_EXPORT UiEnumDeclaration: public UiObjectMember public: QQMLJS_DECLARE_AST_NODE(UiEnumDeclaration) - UiEnumDeclaration(const QStringRef &name, + UiEnumDeclaration(QStringView name, UiEnumMemberList *members) : name(name) , members(members) @@ -3382,19 +3793,80 @@ public: SourceLocation lastSourceLocation() const override { return rbraceToken; } - void accept0(Visitor *visitor) override; + void accept0(BaseVisitor *visitor) override; // attributes SourceLocation enumToken; + SourceLocation identifierToken; + SourceLocation lbraceToken; SourceLocation rbraceToken; - QStringRef name; + QStringView name; UiEnumMemberList *members; }; -} } // namespace AST +class QML_PARSER_EXPORT UiAnnotation: public Node +{ +public: + QQMLJS_DECLARE_AST_NODE(UiAnnotation) + + UiAnnotation(UiQualifiedId *qualifiedTypeNameId, + UiObjectInitializer *initializer) + : qualifiedTypeNameId(qualifiedTypeNameId), initializer(initializer) + { kind = K; } + + void accept0(BaseVisitor *visitor) override; + + SourceLocation firstSourceLocation() const override + { return qualifiedTypeNameId->identifierToken; } + + SourceLocation lastSourceLocation() const override + { return initializer->rbraceToken; } + +// attributes + UiQualifiedId *qualifiedTypeNameId; + UiObjectInitializer *initializer; +}; + +class QML_PARSER_EXPORT UiAnnotationList: public Node +{ +public: + QQMLJS_DECLARE_AST_NODE(UiAnnotationList) + UiAnnotationList(UiAnnotation *annotation) + : next(this), annotation(annotation) + { kind = K; } + + UiAnnotationList(UiAnnotationList *previous, UiAnnotation *annotation) + : annotation(annotation) + { + kind = K; + next = previous->next; + previous->next = this; + } + + void accept0(BaseVisitor *visitor) override; + + SourceLocation firstSourceLocation() const override + { return annotation->firstSourceLocation(); } + + SourceLocation lastSourceLocation() const override + { return lastListElement(this)->annotation->lastSourceLocation(); } + + UiAnnotationList *finish() + { + UiAnnotationList *head = next; + next = nullptr; + return head; + } + +// attributes + UiAnnotationList *next; + UiAnnotation *annotation; +}; + +} } // namespace AST -QT_QML_END_NAMESPACE +QT_END_NAMESPACE #endif |