diff --git a/src/libs/qmljs/jsoncheck.cpp b/src/libs/qmljs/jsoncheck.cpp index 20370d0d583..966513c2085 100644 --- a/src/libs/qmljs/jsoncheck.cpp +++ b/src/libs/qmljs/jsoncheck.cpp @@ -269,7 +269,7 @@ bool JsonCheck::visit(StringLiteral *ast) analysis()->boostRanking(); - const QStringRef literal = ast->value; + const QStringView literal = ast->value; const QString &pattern = m_schema->pattern(); if (!pattern.isEmpty()) { diff --git a/src/libs/qmljs/parser/qmldirparser.cpp b/src/libs/qmljs/parser/qmldirparser.cpp index 003f4aa97bb..ffe5edcf20d 100644 --- a/src/libs/qmljs/parser/qmldirparser.cpp +++ b/src/libs/qmljs/parser/qmldirparser.cpp @@ -29,7 +29,7 @@ QT_QML_BEGIN_NAMESPACE -static int parseInt(const QStringRef &str, bool *ok) +static int parseInt(const QStringView &str, bool *ok) { int pos = 0; int number = 0; @@ -51,9 +51,10 @@ static bool parseVersion(const QString &str, int *major, int *minor) const int dotIndex = str.indexOf(QLatin1Char('.')); if (dotIndex != -1 && str.indexOf(QLatin1Char('.'), dotIndex + 1) == -1) { bool ok = false; - *major = parseInt(QStringRef(&str, 0, dotIndex), &ok); + *major = parseInt(QStringView(str.constData(), dotIndex), &ok); if (ok) - *minor = parseInt(QStringRef(&str, dotIndex + 1, str.length() - dotIndex - 1), &ok); + *minor = parseInt(QStringView(str.constData() + dotIndex + 1, str.length() - dotIndex - 1), + &ok); return ok; } return false; diff --git a/src/libs/qmljs/parser/qmljs.g b/src/libs/qmljs/parser/qmljs.g index 4aba778e93b..54aaf3b010c 100644 --- a/src/libs/qmljs/parser/qmljs.g +++ b/src/libs/qmljs/parser/qmljs.g @@ -403,10 +403,10 @@ protected: inline Value &sym(int index) { return sym_stack [tos + index - 1]; } - inline QStringRef &stringRef(int index) + inline QStringView &stringRef(int index) { return string_stack [tos + index - 1]; } - inline QStringRef &rawStringRef(int index) + inline QStringView &rawStringRef(int index) { return rawString_stack [tos + index - 1]; } inline SourceLocation &loc(int index) @@ -444,8 +444,8 @@ protected: Value *sym_stack = nullptr; int *state_stack = nullptr; SourceLocation *location_stack = nullptr; - QVector string_stack; - QVector rawString_stack; + QVector string_stack; + QVector rawString_stack; AST::Node *program = nullptr; @@ -456,14 +456,14 @@ protected: int token; double dval; SourceLocation loc; - QStringRef spell; - QStringRef raw; + QStringView spell; + QStringView raw; }; int yytoken = -1; double yylval = 0.; - QStringRef yytokenspell; - QStringRef yytokenraw; + QStringView yytokenspell; + QStringView yytokenraw; SourceLocation yylloc; SourceLocation yyprevlloc; @@ -555,7 +555,7 @@ static inline SourceLocation location(Lexer *lexer) AST::UiQualifiedId *Parser::reparseAsQualifiedId(AST::ExpressionNode *expr) { - QVarLengthArray nameIds; + QVarLengthArray nameIds; QVarLengthArray locations; AST::ExpressionNode *it = expr; @@ -3624,7 +3624,7 @@ ContinueStatement: T_CONTINUE IdentifierReference Semicolon; BreakStatement: T_BREAK Semicolon; /. case $rule_number: { - AST::BreakStatement *node = new (pool) AST::BreakStatement(QStringRef()); + AST::BreakStatement *node = new (pool) AST::BreakStatement(QStringView()); node->breakToken = loc(1); node->semicolonToken = loc(2); sym(1).Node = node; @@ -3898,7 +3898,7 @@ FunctionDeclaration_Default: Function T_LPAREN FormalParameters T_RPAREN TypeAnn case $rule_number: { if (!ensureNoFunctionTypeAnnotations(sym(5).TypeAnnotation, sym(3).FormalParameterList)) return false; - AST::FunctionDeclaration *node = new (pool) AST::FunctionDeclaration(QStringRef(), sym(3).FormalParameterList, sym(7).StatementList, + AST::FunctionDeclaration *node = new (pool) AST::FunctionDeclaration(QStringView(), sym(3).FormalParameterList, sym(7).StatementList, /*type annotation*/nullptr); node->functionToken = loc(1); node->lparenToken = loc(2); @@ -3932,7 +3932,7 @@ FunctionExpression: T_FUNCTION T_LPAREN FormalParameters T_RPAREN TypeAnnotation case $rule_number: { if (!ensureNoFunctionTypeAnnotations(sym(5).TypeAnnotation, sym(3).FormalParameterList)) return false; - AST::FunctionExpression *node = new (pool) AST::FunctionExpression(QStringRef(), sym(3).FormalParameterList, sym(7).StatementList, + AST::FunctionExpression *node = new (pool) AST::FunctionExpression(QStringView(), sym(3).FormalParameterList, sym(7).StatementList, /*type annotation*/nullptr); node->functionToken = loc(1); node->lparenToken = loc(2); @@ -4022,7 +4022,7 @@ ArrowFunction_In: ArrowParameters T_ARROW ConciseBodyLookahead AssignmentExpress ret->returnToken = sym(4).Node->firstSourceLocation(); ret->semicolonToken = sym(4).Node->lastSourceLocation(); AST::StatementList *statements = (new (pool) AST::StatementList(ret))->finish(); - AST::FunctionExpression *f = new (pool) AST::FunctionExpression(QStringRef(), sym(1).FormalParameterList, statements); + AST::FunctionExpression *f = new (pool) AST::FunctionExpression(QStringView(), sym(1).FormalParameterList, statements); f->isArrowFunction = true; f->functionToken = sym(1).Node ? sym(1).Node->firstSourceLocation() : loc(1); f->lbraceToken = sym(4).Node->firstSourceLocation(); @@ -4036,7 +4036,7 @@ ArrowFunction: ArrowParameters T_ARROW ConciseBodyLookahead T_FORCE_BLOCK Functi ArrowFunction_In: ArrowParameters T_ARROW ConciseBodyLookahead T_FORCE_BLOCK FunctionLBrace FunctionBody FunctionRBrace; /. case $rule_number: { - AST::FunctionExpression *f = new (pool) AST::FunctionExpression(QStringRef(), sym(1).FormalParameterList, sym(6).StatementList); + AST::FunctionExpression *f = new (pool) AST::FunctionExpression(QStringView(), sym(1).FormalParameterList, sym(6).StatementList); f->isArrowFunction = true; f->functionToken = sym(1).Node ? sym(1).Node->firstSourceLocation() : loc(1); f->lbraceToken = loc(6); @@ -4197,7 +4197,7 @@ GeneratorDeclaration_Default: GeneratorDeclaration; GeneratorDeclaration_Default: FunctionStar GeneratorLParen FormalParameters T_RPAREN FunctionLBrace GeneratorBody GeneratorRBrace; /. case $rule_number: { - AST::FunctionDeclaration *node = new (pool) AST::FunctionDeclaration(QStringRef(), sym(3).FormalParameterList, sym(6).StatementList); + AST::FunctionDeclaration *node = new (pool) AST::FunctionDeclaration(QStringView(), sym(3).FormalParameterList, sym(6).StatementList); node->functionToken = loc(1); node->lparenToken = loc(2); node->rparenToken = loc(4); @@ -4227,7 +4227,7 @@ GeneratorExpression: T_FUNCTION_STAR BindingIdentifier GeneratorLParen FormalPar GeneratorExpression: T_FUNCTION_STAR GeneratorLParen FormalParameters T_RPAREN FunctionLBrace GeneratorBody GeneratorRBrace; /. case $rule_number: { - AST::FunctionExpression *node = new (pool) AST::FunctionExpression(QStringRef(), sym(3).FormalParameterList, sym(6).StatementList); + AST::FunctionExpression *node = new (pool) AST::FunctionExpression(QStringView(), sym(3).FormalParameterList, sym(6).StatementList); node->functionToken = loc(1); node->lparenToken = loc(2); node->rparenToken = loc(4); @@ -4302,7 +4302,7 @@ ClassExpression: T_CLASS BindingIdentifier ClassHeritageOpt ClassLBrace ClassBod ClassDeclaration_Default: T_CLASS ClassHeritageOpt ClassLBrace ClassBodyOpt ClassRBrace; /. case $rule_number: { - AST::ClassDeclaration *node = new (pool) AST::ClassDeclaration(QStringRef(), sym(2).Expression, sym(4).ClassElementList); + AST::ClassDeclaration *node = new (pool) AST::ClassDeclaration(QStringView(), sym(2).Expression, sym(4).ClassElementList); node->classToken = loc(1); node->lbraceToken = loc(3); node->rbraceToken = loc(5); @@ -4313,7 +4313,7 @@ ClassDeclaration_Default: T_CLASS ClassHeritageOpt ClassLBrace ClassBodyOpt Clas ClassExpression: T_CLASS ClassHeritageOpt ClassLBrace ClassBodyOpt ClassRBrace; /. case $rule_number: { - AST::ClassExpression *node = new (pool) AST::ClassExpression(QStringRef(), sym(2).Expression, sym(4).ClassElementList); + AST::ClassExpression *node = new (pool) AST::ClassExpression(QStringView(), sym(2).Expression, sym(4).ClassElementList); node->classToken = loc(1); node->lbraceToken = loc(3); node->rbraceToken = loc(5); diff --git a/src/libs/qmljs/parser/qmljsast.cpp b/src/libs/qmljs/parser/qmljsast.cpp index 65337ec1099..af12c480d39 100644 --- a/src/libs/qmljs/parser/qmljsast.cpp +++ b/src/libs/qmljs/parser/qmljsast.cpp @@ -27,6 +27,8 @@ #include "qmljsastvisitor_p.h" +#include + QT_QML_BEGIN_NAMESPACE namespace QmlJS { namespace AST { @@ -1529,7 +1531,7 @@ QString Type::toString() const void Type::toString(QString *out) const { for (QmlJS::AST::UiQualifiedId *it = typeId; it; it = it->next) { - out->append(it->name); + out->append(it->name.toString()); if (it->next) out->append(QLatin1Char('.')); diff --git a/src/libs/qmljs/parser/qmljsast_p.h b/src/libs/qmljs/parser/qmljsast_p.h index 209a983c52a..bf70d245496 100644 --- a/src/libs/qmljs/parser/qmljsast_p.h +++ b/src/libs/qmljs/parser/qmljsast_p.h @@ -318,11 +318,12 @@ class QML_PARSER_EXPORT UiQualifiedId: public Node public: QMLJS_DECLARE_AST_NODE(UiQualifiedId) - UiQualifiedId(const QStringRef &name) - : next(this), name(name) + UiQualifiedId(const QStringView &name) + : next(this) + , name(name) { kind = K; } - UiQualifiedId(UiQualifiedId *previous, const QStringRef &name) + UiQualifiedId(UiQualifiedId *previous, const QStringView &name) : name(name) { kind = K; @@ -347,7 +348,7 @@ public: // attributes UiQualifiedId *next; - QStringRef name; + QStringView name; SourceLocation identifierToken; }; @@ -512,8 +513,11 @@ class QML_PARSER_EXPORT IdentifierExpression: public LeftHandSideExpression public: QMLJS_DECLARE_AST_NODE(IdentifierExpression) - IdentifierExpression(const QStringRef &n): - name (n) { kind = K; } + IdentifierExpression(const QStringView &n) + : name(n) + { + kind = K; + } void accept0(BaseVisitor *visitor) override; @@ -524,7 +528,7 @@ public: { return identifierToken; } // attributes - QStringRef name; + QStringView name; SourceLocation identifierToken; }; @@ -654,8 +658,11 @@ class QML_PARSER_EXPORT StringLiteral : public LeftHandSideExpression public: QMLJS_DECLARE_AST_NODE(StringLiteral) - StringLiteral(const QStringRef &v): - value (v) { kind = K; } + StringLiteral(const QStringView &v) + : value(v) + { + kind = K; + } void accept0(BaseVisitor *visitor) override; @@ -666,7 +673,7 @@ public: { return literalToken; } // attributes: - QStringRef value; + QStringView value; SourceLocation literalToken; }; @@ -675,8 +682,11 @@ class QML_PARSER_EXPORT TemplateLiteral : public LeftHandSideExpression public: QMLJS_DECLARE_AST_NODE(TemplateLiteral) - TemplateLiteral(const QStringRef &str, const QStringRef &raw, ExpressionNode *e) - : value(str), rawValue(raw), expression(e), next(nullptr) + TemplateLiteral(const QStringView &str, const QStringView &raw, ExpressionNode *e) + : value(str) + , rawValue(raw) + , expression(e) + , next(nullptr) { kind = K; } SourceLocation firstSourceLocation() const override @@ -690,8 +700,8 @@ public: void accept0(BaseVisitor *visitor) override; - QStringRef value; - QStringRef rawValue; + QStringView value; + QStringView rawValue; ExpressionNode *expression; TemplateLiteral *next; SourceLocation literalToken; @@ -702,8 +712,12 @@ class QML_PARSER_EXPORT RegExpLiteral: public LeftHandSideExpression public: QMLJS_DECLARE_AST_NODE(RegExpLiteral) - RegExpLiteral(const QStringRef &p, int f): - pattern (p), flags (f) { kind = K; } + RegExpLiteral(const QStringView &p, int f) + : pattern(p) + , flags(f) + { + kind = K; + } void accept0(BaseVisitor *visitor) override; @@ -714,7 +728,7 @@ public: { return literalToken; } // attributes: - QStringRef pattern; + QStringView pattern; int flags; SourceLocation literalToken; }; @@ -893,8 +907,13 @@ public: : initializer(i), type(t) { kind = K; } - PatternElement(const QStringRef &n, TypeAnnotation *typeAnnotation = nullptr, ExpressionNode *i = nullptr, Type t = Binding) - : bindingIdentifier(n), initializer(i), type(t) + PatternElement(const QStringView &n, + TypeAnnotation *typeAnnotation = nullptr, + ExpressionNode *i = nullptr, + Type t = Binding) + : bindingIdentifier(n) + , initializer(i) + , type(t) , typeAnnotation(typeAnnotation) { Q_ASSERT(t >= RestElement); @@ -929,7 +948,7 @@ public: // attributes SourceLocation identifierToken; - QStringRef bindingIdentifier; + QStringView bindingIdentifier; ExpressionNode *bindingTarget = nullptr; ExpressionNode *initializer = nullptr; Type type = Literal; @@ -988,8 +1007,9 @@ public: : PatternElement(i, t), name(name) { kind = K; } - PatternProperty(PropertyName *name, const QStringRef &n, ExpressionNode *i = nullptr) - : PatternElement(n, /*type annotation*/nullptr, i), name(name) + PatternProperty(PropertyName *name, const QStringView &n, ExpressionNode *i = nullptr) + : PatternElement(n, /*type annotation*/ nullptr, i) + , name(name) { kind = K; } PatternProperty(PropertyName *name, Pattern *pattern, ExpressionNode *i = nullptr) @@ -1058,15 +1078,18 @@ class QML_PARSER_EXPORT IdentifierPropertyName: public PropertyName public: QMLJS_DECLARE_AST_NODE(IdentifierPropertyName) - IdentifierPropertyName(const QStringRef &n): - id (n) { kind = K; } + IdentifierPropertyName(const QStringView &n) + : id(n) + { + kind = K; + } void accept0(BaseVisitor *visitor) override; QString asString() const override { return id.toString(); } // attributes - QStringRef id; + QStringView id; }; class QML_PARSER_EXPORT StringLiteralPropertyName: public PropertyName @@ -1074,15 +1097,18 @@ class QML_PARSER_EXPORT StringLiteralPropertyName: public PropertyName public: QMLJS_DECLARE_AST_NODE(StringLiteralPropertyName) - StringLiteralPropertyName(const QStringRef &n): - id (n) { kind = K; } + StringLiteralPropertyName(const QStringView &n) + : id(n) + { + kind = K; + } void accept0(BaseVisitor *visitor) override; QString asString() const override { return id.toString(); } // attributes - QStringRef id; + QStringView id; }; class QML_PARSER_EXPORT NumericLiteralPropertyName: public PropertyName @@ -1154,9 +1180,11 @@ class QML_PARSER_EXPORT FieldMemberExpression: public LeftHandSideExpression public: QMLJS_DECLARE_AST_NODE(FieldMemberExpression) - FieldMemberExpression(ExpressionNode *b, const QStringRef &n): - base (b), name (n) - { kind = K; } + FieldMemberExpression(ExpressionNode *b, const QStringView &n) + : base(b) + , name(n) + { + kind = K; } void accept0(BaseVisitor *visitor) override; @@ -1168,7 +1196,7 @@ public: // attributes ExpressionNode *base; - QStringRef name; + QStringView name; SourceLocation dotToken; SourceLocation identifierToken; }; @@ -1944,8 +1972,11 @@ class QML_PARSER_EXPORT ContinueStatement: public Statement public: QMLJS_DECLARE_AST_NODE(ContinueStatement) - ContinueStatement(const QStringRef &l = QStringRef()): - label (l) { kind = K; } + ContinueStatement(const QStringView &l = QStringView()) + : label(l) + { + kind = K; + } void accept0(BaseVisitor *visitor) override; @@ -1956,7 +1987,7 @@ public: { return semicolonToken; } // attributes - QStringRef label; + QStringView label; SourceLocation continueToken; SourceLocation identifierToken; SourceLocation semicolonToken; @@ -1967,8 +1998,11 @@ class QML_PARSER_EXPORT BreakStatement: public Statement public: QMLJS_DECLARE_AST_NODE(BreakStatement) - BreakStatement(const QStringRef &l): - label (l) { kind = K; } + BreakStatement(const QStringView &l) + : label(l) + { + kind = K; + } void accept0(BaseVisitor *visitor) override; @@ -1979,7 +2013,7 @@ public: { return semicolonToken; } // attributes - QStringRef label; + QStringView label; SourceLocation breakToken; SourceLocation identifierToken; SourceLocation semicolonToken; @@ -2195,9 +2229,11 @@ class QML_PARSER_EXPORT LabelledStatement: public Statement public: QMLJS_DECLARE_AST_NODE(LabelledStatement) - LabelledStatement(const QStringRef &l, Statement *stmt): - label (l), statement (stmt) - { kind = K; } + LabelledStatement(const QStringView &l, Statement *stmt) + : label(l) + , statement(stmt) + { + kind = K; } void accept0(BaseVisitor *visitor) override; @@ -2208,7 +2244,7 @@ public: { return statement->lastSourceLocation(); } // attributes - QStringRef label; + QStringView label; Statement *statement; SourceLocation identifierToken; SourceLocation colonToken; @@ -2328,10 +2364,16 @@ class QML_PARSER_EXPORT FunctionExpression: public ExpressionNode public: QMLJS_DECLARE_AST_NODE(FunctionExpression) - FunctionExpression(const QStringRef &n, FormalParameterList *f, StatementList *b, TypeAnnotation *typeAnnotation = nullptr): - name (n), formals (f), body (b), - typeAnnotation(typeAnnotation) - { kind = K; } + FunctionExpression(const QStringView &n, + FormalParameterList *f, + StatementList *b, + TypeAnnotation *typeAnnotation = nullptr) + : name(n) + , formals(f) + , body(b) + , typeAnnotation(typeAnnotation) + { + kind = K; } void accept0(BaseVisitor *visitor) override; @@ -2344,7 +2386,7 @@ public: FunctionExpression *asFunctionDefinition() override; // attributes - QStringRef name; + QStringView name; bool isArrowFunction = false; bool isGenerator = false; FormalParameterList *formals; @@ -2363,9 +2405,13 @@ class QML_PARSER_EXPORT FunctionDeclaration: public FunctionExpression public: QMLJS_DECLARE_AST_NODE(FunctionDeclaration) - FunctionDeclaration(const QStringRef &n, FormalParameterList *f, StatementList *b, TypeAnnotation *typeAnnotation = nullptr): - FunctionExpression(n, f, b, typeAnnotation) - { kind = K; } + FunctionDeclaration(const QStringView &n, + FormalParameterList *f, + StatementList *b, + TypeAnnotation *typeAnnotation = nullptr) + : FunctionExpression(n, f, b, typeAnnotation) + { + kind = K; } void accept0(BaseVisitor *visitor) override; }; @@ -2460,9 +2506,12 @@ class QML_PARSER_EXPORT ClassExpression : public ExpressionNode public: QMLJS_DECLARE_AST_NODE(ClassExpression) - ClassExpression(const QStringRef &n, ExpressionNode *heritage, ClassElementList *elements) - : name(n), heritage(heritage), elements(elements) - { kind = K; } + ClassExpression(const QStringView &n, ExpressionNode *heritage, ClassElementList *elements) + : name(n) + , heritage(heritage) + , elements(elements) + { + kind = K; } void accept0(BaseVisitor *visitor) override; @@ -2475,7 +2524,7 @@ public: ClassExpression *asClassDefinition() override; // attributes - QStringRef name; + QStringView name; ExpressionNode *heritage; ClassElementList *elements; SourceLocation classToken; @@ -2489,9 +2538,10 @@ class QML_PARSER_EXPORT ClassDeclaration: public ClassExpression public: QMLJS_DECLARE_AST_NODE(ClassDeclaration) - ClassDeclaration(const QStringRef &n, ExpressionNode *heritage, ClassElementList *elements) + ClassDeclaration(const QStringView &n, ExpressionNode *heritage, ClassElementList *elements) : ClassExpression(n, heritage, elements) - { kind = K; } + { + kind = K; } void accept0(BaseVisitor *visitor) override; }; @@ -2560,14 +2610,15 @@ class QML_PARSER_EXPORT ImportSpecifier: public Node public: QMLJS_DECLARE_AST_NODE(ImportSpecifier) - ImportSpecifier(const QStringRef &importedBinding) + ImportSpecifier(const QStringView &importedBinding) : importedBinding(importedBinding) { kind = K; } - ImportSpecifier(const QStringRef &identifier, const QStringRef &importedBinding) - : identifier(identifier), importedBinding(importedBinding) + ImportSpecifier(const QStringView &identifier, const QStringView &importedBinding) + : identifier(identifier) + , importedBinding(importedBinding) { kind = K; } @@ -2582,8 +2633,8 @@ public: // attributes SourceLocation identifierToken; SourceLocation importedBindingToken; - QStringRef identifier; - QStringRef importedBinding; + QStringView identifier; + QStringView importedBinding; }; class QML_PARSER_EXPORT ImportsList: public Node @@ -2667,7 +2718,7 @@ class QML_PARSER_EXPORT NameSpaceImport: public Node public: QMLJS_DECLARE_AST_NODE(NameSpaceImport) - NameSpaceImport(const QStringRef &importedBinding) + NameSpaceImport(const QStringView &importedBinding) : importedBinding(importedBinding) { kind = K; @@ -2683,7 +2734,7 @@ public: // attributes SourceLocation starToken; SourceLocation importedBindingToken; - QStringRef importedBinding; + QStringView importedBinding; }; class QML_PARSER_EXPORT ImportClause: public Node @@ -2691,7 +2742,7 @@ class QML_PARSER_EXPORT ImportClause: public Node public: QMLJS_DECLARE_AST_NODE(ImportClause) - ImportClause(const QStringRef &importedDefaultBinding) + ImportClause(const QStringView &importedDefaultBinding) : importedDefaultBinding(importedDefaultBinding) { kind = K; @@ -2709,14 +2760,14 @@ public: kind = K; } - ImportClause(const QStringRef &importedDefaultBinding, NameSpaceImport *nameSpaceImport) + ImportClause(const QStringView &importedDefaultBinding, NameSpaceImport *nameSpaceImport) : importedDefaultBinding(importedDefaultBinding) , nameSpaceImport(nameSpaceImport) { kind = K; } - ImportClause(const QStringRef &importedDefaultBinding, NamedImports *namedImports) + ImportClause(const QStringView &importedDefaultBinding, NamedImports *namedImports) : importedDefaultBinding(importedDefaultBinding) , namedImports(namedImports) { @@ -2732,7 +2783,7 @@ public: // attributes SourceLocation importedDefaultBindingToken; - QStringRef importedDefaultBinding; + QStringView importedDefaultBinding; NameSpaceImport *nameSpaceImport = nullptr; NamedImports *namedImports = nullptr; }; @@ -2742,7 +2793,7 @@ class QML_PARSER_EXPORT FromClause: public Node public: QMLJS_DECLARE_AST_NODE(FromClause) - FromClause(const QStringRef &moduleSpecifier) + FromClause(const QStringView &moduleSpecifier) : moduleSpecifier(moduleSpecifier) { kind = K; @@ -2759,7 +2810,7 @@ public: // attributes SourceLocation fromToken; SourceLocation moduleSpecifierToken; - QStringRef moduleSpecifier; + QStringView moduleSpecifier; }; class QML_PARSER_EXPORT ImportDeclaration: public Statement @@ -2773,7 +2824,7 @@ public: kind = K; } - ImportDeclaration(const QStringRef &moduleSpecifier) + ImportDeclaration(const QStringView &moduleSpecifier) : moduleSpecifier(moduleSpecifier) { kind = K; @@ -2790,7 +2841,7 @@ public: // attributes SourceLocation importToken; SourceLocation moduleSpecifierToken; - QStringRef moduleSpecifier; + QStringView moduleSpecifier; ImportClause *importClause = nullptr; FromClause *fromClause = nullptr; }; @@ -2800,14 +2851,16 @@ class QML_PARSER_EXPORT ExportSpecifier: public Node public: QMLJS_DECLARE_AST_NODE(ExportSpecifier) - ExportSpecifier(const QStringRef &identifier) - : identifier(identifier), exportedIdentifier(identifier) + ExportSpecifier(const QStringView &identifier) + : identifier(identifier) + , exportedIdentifier(identifier) { kind = K; } - ExportSpecifier(const QStringRef &identifier, const QStringRef &exportedIdentifier) - : identifier(identifier), exportedIdentifier(exportedIdentifier) + ExportSpecifier(const QStringView &identifier, const QStringView &exportedIdentifier) + : identifier(identifier) + , exportedIdentifier(exportedIdentifier) { kind = K; } @@ -2822,8 +2875,8 @@ public: // attributes SourceLocation identifierToken; SourceLocation exportedIdentifierToken; - QStringRef identifier; - QStringRef exportedIdentifier; + QStringView identifier; + QStringView exportedIdentifier; }; class QML_PARSER_EXPORT ExportsList: public Node @@ -2994,8 +3047,9 @@ class QML_PARSER_EXPORT UiImport: public Node public: QMLJS_DECLARE_AST_NODE(UiImport) - UiImport(const QStringRef &fileName) - : fileName(fileName), importUri(nullptr) + UiImport(const QStringView &fileName) + : fileName(fileName) + , importUri(nullptr) { kind = K; } UiImport(UiQualifiedId *uri) @@ -3011,9 +3065,9 @@ public: { return semicolonToken; } // attributes - QStringRef fileName; + QStringView fileName; UiQualifiedId *importUri; - QStringRef importId; + QStringView importId; SourceLocation importToken; SourceLocation fileNameToken; SourceLocation asToken; @@ -3076,7 +3130,7 @@ class QML_PARSER_EXPORT UiPragma: public Node public: QMLJS_DECLARE_AST_NODE(UiPragma) - UiPragma(QStringRef name) + UiPragma(QStringView name) : name(name) { kind = K; } @@ -3089,7 +3143,7 @@ public: { return semicolonToken; } // attributes - QStringRef name; + QStringView name; SourceLocation pragmaToken; SourceLocation semicolonToken; }; @@ -3099,8 +3153,8 @@ class QML_PARSER_EXPORT UiRequired: public Node public: QMLJS_DECLARE_AST_NODE(UiRequired) - UiRequired(QStringRef name) - :name(name) + UiRequired(QStringView name) + : name(name) { kind = K; } void accept0(BaseVisitor *visitor) override; @@ -3111,7 +3165,7 @@ public: SourceLocation lastSourceLocation() const override { return semicolonToken; } - QStringRef name; + QStringView name; SourceLocation requiredToken; SourceLocation semicolonToken; }; @@ -3265,12 +3319,16 @@ class QML_PARSER_EXPORT UiParameterList: public Node public: QMLJS_DECLARE_AST_NODE(UiParameterList) - UiParameterList(UiQualifiedId *t, const QStringRef &n): - type (t), name (n), next (this) - { kind = K; } + UiParameterList(UiQualifiedId *t, const QStringView &n) + : type(t) + , name(n) + , next(this) + { + kind = K; } - UiParameterList(UiParameterList *previous, UiQualifiedId *t, const QStringRef &n): - type (t), name (n) + UiParameterList(UiParameterList *previous, UiQualifiedId *t, const QStringView &n) + : type(t) + , name(n) { kind = K; next = previous->next; @@ -3297,7 +3355,7 @@ public: // attributes UiQualifiedId *type; - QStringRef name; + QStringView name; UiParameterList *next; SourceLocation commaToken; SourceLocation propertyTypeToken; @@ -3310,15 +3368,26 @@ class QML_PARSER_EXPORT UiPublicMember: public UiObjectMember public: QMLJS_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) + UiPublicMember(UiQualifiedId *memberType, const QStringView &name) + : type(Property) + , memberType(memberType) + , name(name) + , statement(nullptr) + , binding(nullptr) + , isDefaultMember(false) + , isReadonlyMember(false) + , parameters(nullptr) { kind = K; } - UiPublicMember(UiQualifiedId *memberType, - const QStringRef &name, - Statement *statement) - : type(Property), memberType(memberType), name(name), statement(statement), binding(nullptr), isDefaultMember(false), isReadonlyMember(false), parameters(nullptr) + UiPublicMember(UiQualifiedId *memberType, const QStringView &name, Statement *statement) + : type(Property) + , memberType(memberType) + , name(name) + , statement(statement) + , binding(nullptr) + , isDefaultMember(false) + , isReadonlyMember(false) + , parameters(nullptr) { kind = K; } void accept0(BaseVisitor *visitor) override; @@ -3347,9 +3416,9 @@ public: // attributes enum { Signal, Property } type; - QStringRef typeModifier; + 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; @@ -3396,8 +3465,9 @@ class QML_PARSER_EXPORT UiInlineComponent: public UiObjectMember public: QMLJS_DECLARE_AST_NODE(UiInlineComponent) - UiInlineComponent(const QStringRef& inlineComponentName, UiObjectDefinition* inlineComponent) - : name(inlineComponentName), component(inlineComponent) + UiInlineComponent(const QStringView &inlineComponentName, UiObjectDefinition *inlineComponent) + : name(inlineComponentName) + , component(inlineComponent) { kind = K; } SourceLocation lastSourceLocation() const override @@ -3409,7 +3479,7 @@ public: void accept0(BaseVisitor *visitor) override; // attributes - QStringRef name; + QStringView name; UiObjectDefinition* component; SourceLocation componentToken; }; @@ -3542,11 +3612,13 @@ class QML_PARSER_EXPORT UiEnumMemberList: public Node { QMLJS_DECLARE_AST_NODE(UiEnumMemberList) public: - UiEnumMemberList(const QStringRef &member, double v = 0.0) - : next(this), member(member), value(v) + UiEnumMemberList(const QStringView &member, double v = 0.0) + : next(this) + , member(member) + , value(v) { kind = K; } - UiEnumMemberList(UiEnumMemberList *previous, const QStringRef &member) + UiEnumMemberList(UiEnumMemberList *previous, const QStringView &member) : member(member) { kind = K; @@ -3555,8 +3627,9 @@ public: value = previous->value + 1; } - UiEnumMemberList(UiEnumMemberList *previous, const QStringRef &member, double v) - : member(member), value(v) + UiEnumMemberList(UiEnumMemberList *previous, const QStringView &member, double v) + : member(member) + , value(v) { kind = K; next = previous->next; @@ -3583,7 +3656,7 @@ public: // attributes UiEnumMemberList *next; - QStringRef member; + QStringView member; double value; SourceLocation memberToken; SourceLocation valueToken; @@ -3594,8 +3667,7 @@ class QML_PARSER_EXPORT UiEnumDeclaration: public UiObjectMember public: QMLJS_DECLARE_AST_NODE(UiEnumDeclaration) - UiEnumDeclaration(const QStringRef &name, - UiEnumMemberList *members) + UiEnumDeclaration(const QStringView &name, UiEnumMemberList *members) : name(name) , members(members) { kind = K; } @@ -3611,7 +3683,7 @@ public: // attributes SourceLocation enumToken; SourceLocation rbraceToken; - QStringRef name; + QStringView name; UiEnumMemberList *members; }; diff --git a/src/libs/qmljs/parser/qmljsengine_p.cpp b/src/libs/qmljs/parser/qmljsengine_p.cpp index 1a2b0fd2229..29456b8156e 100644 --- a/src/libs/qmljs/parser/qmljsengine_p.cpp +++ b/src/libs/qmljs/parser/qmljsengine_p.cpp @@ -26,9 +26,11 @@ #include "qmljsengine_p.h" #include "qmljsglobal_p.h" -#include -#include +#include + #include +#include +#include QT_QML_BEGIN_NAMESPACE @@ -129,14 +131,14 @@ void Engine::setDirectives(Directives *directives) MemoryPool *Engine::pool() { return &_pool; } -QStringRef Engine::newStringRef(const QString &text) +QStringView Engine::newStringRef(const QString &text) { const int pos = _extraCode.length(); _extraCode += text; - return _extraCode.midRef(pos, text.length()); + return Utils::midView(_extraCode, pos, text.length()); } -QStringRef Engine::newStringRef(const QChar *chars, int size) +QStringView Engine::newStringRef(const QChar *chars, int size) { return newStringRef(QString(chars, size)); } } // end of namespace QmlJS diff --git a/src/libs/qmljs/parser/qmljsengine_p.h b/src/libs/qmljs/parser/qmljsengine_p.h index 28d5913679f..acef6c015b6 100644 --- a/src/libs/qmljs/parser/qmljsengine_p.h +++ b/src/libs/qmljs/parser/qmljsengine_p.h @@ -105,10 +105,15 @@ public: MemoryPool *pool(); - inline QStringRef midRef(int position, int size) { return _code.midRef(position, size); } + inline QStringView midRef(int position, int size) + { + if (position + size > _code.size()) + return QStringView(_code).mid(position); + return QStringView(_code).mid(position, size); + } - QStringRef newStringRef(const QString &s); - QStringRef newStringRef(const QChar *chars, int size); + QStringView newStringRef(const QString &s); + QStringView newStringRef(const QChar *chars, int size); }; double integerFromString(const char *buf, int size, int radix); diff --git a/src/libs/qmljs/parser/qmljsgrammar.cpp b/src/libs/qmljs/parser/qmljsgrammar.cpp index 23162f83236..e4387c77b40 100644 --- a/src/libs/qmljs/parser/qmljsgrammar.cpp +++ b/src/libs/qmljs/parser/qmljsgrammar.cpp @@ -3,8 +3,9 @@ ** Copyright (C) 2016 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** -** This file is part of Qt Creator. +** This file is part of the Qt Toolkit. ** +** $QT_BEGIN_LICENSE:GPL-EXCEPT$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the diff --git a/src/libs/qmljs/parser/qmljslexer.cpp b/src/libs/qmljs/parser/qmljslexer.cpp index a914536e523..9fe13dffefc 100644 --- a/src/libs/qmljs/parser/qmljslexer.cpp +++ b/src/libs/qmljs/parser/qmljslexer.cpp @@ -124,8 +124,8 @@ void Lexer::setCode(const QString &code, int lineno, bool qmlMode) _tokenText.clear(); _tokenText.reserve(1024); _errorMessage.clear(); - _tokenSpell = QStringRef(); - _rawString = QStringRef(); + _tokenSpell = QStringView(); + _rawString = QStringView(); _codePtr = code.unicode(); _endPtr = _codePtr + code.length(); @@ -248,70 +248,70 @@ int Lexer::lex() const int previousTokenKind = _tokenKind; again: - _tokenSpell = QStringRef(); - _rawString = QStringRef(); - _tokenKind = scanToken(); - _tokenLength = _codePtr - _tokenStartPtr - 1; + _tokenSpell = QStringView(); + _rawString = QStringView(); + _tokenKind = scanToken(); + _tokenLength = _codePtr - _tokenStartPtr - 1; - _delimited = false; - _restrictedKeyword = false; - _followsClosingBrace = (previousTokenKind == T_RBRACE); + _delimited = false; + _restrictedKeyword = false; + _followsClosingBrace = (previousTokenKind == T_RBRACE); - // update the flags - switch (_tokenKind) { - case T_LBRACE: - if (_bracesCount > 0) - ++_bracesCount; - Q_FALLTHROUGH(); - case T_SEMICOLON: - _importState = ImportState::NoQmlImport; - Q_FALLTHROUGH(); - case T_QUESTION: - case T_COLON: - case T_TILDE: - _delimited = true; - break; - case T_AUTOMATIC_SEMICOLON: - case T_AS: - _importState = ImportState::NoQmlImport; - Q_FALLTHROUGH(); - default: - if (isBinop(_tokenKind)) - _delimited = true; - break; + // update the flags + switch (_tokenKind) { + case T_LBRACE: + if (_bracesCount > 0) + ++_bracesCount; + Q_FALLTHROUGH(); + case T_SEMICOLON: + _importState = ImportState::NoQmlImport; + Q_FALLTHROUGH(); + case T_QUESTION: + case T_COLON: + case T_TILDE: + _delimited = true; + break; + case T_AUTOMATIC_SEMICOLON: + case T_AS: + _importState = ImportState::NoQmlImport; + Q_FALLTHROUGH(); + default: + if (isBinop(_tokenKind)) + _delimited = true; + break; - case T_IMPORT: - if (qmlMode() || (_handlingDirectives && previousTokenKind == T_DOT)) - _importState = ImportState::SawImport; - if (isBinop(_tokenKind)) - _delimited = true; - break; + case T_IMPORT: + if (qmlMode() || (_handlingDirectives && previousTokenKind == T_DOT)) + _importState = ImportState::SawImport; + if (isBinop(_tokenKind)) + _delimited = true; + break; - case T_IF: - case T_FOR: - case T_WHILE: - case T_WITH: - _parenthesesState = CountParentheses; - _parenthesesCount = 0; - break; + case T_IF: + case T_FOR: + case T_WHILE: + case T_WITH: + _parenthesesState = CountParentheses; + _parenthesesCount = 0; + break; - case T_ELSE: - case T_DO: - _parenthesesState = BalancedParentheses; - break; + case T_ELSE: + case T_DO: + _parenthesesState = BalancedParentheses; + break; - case T_CONTINUE: - case T_BREAK: - case T_RETURN: - case T_YIELD: - case T_THROW: - _restrictedKeyword = true; - break; - case T_RBRACE: - if (_bracesCount > 0) - --_bracesCount; - if (_bracesCount == 0) - goto again; + case T_CONTINUE: + case T_BREAK: + case T_RETURN: + case T_YIELD: + case T_THROW: + _restrictedKeyword = true; + break; + case T_RBRACE: + if (_bracesCount > 0) + --_bracesCount; + if (_bracesCount == 0) + goto again; } // switch // update the parentheses state diff --git a/src/libs/qmljs/parser/qmljslexer_p.h b/src/libs/qmljs/parser/qmljslexer_p.h index 2a4388adad8..feb2055f62c 100644 --- a/src/libs/qmljs/parser/qmljslexer_p.h +++ b/src/libs/qmljs/parser/qmljslexer_p.h @@ -150,8 +150,8 @@ public: int tokenStartLine() const { return _tokenLine; } int tokenStartColumn() const { return _tokenColumn; } - inline QStringRef tokenSpell() const { return _tokenSpell; } - inline QStringRef rawString() const { return _rawString; } + inline QStringView tokenSpell() const { return _tokenSpell; } + inline QStringView rawString() const { return _rawString; } double tokenValue() const { return _tokenValue; } QString tokenText() const; @@ -204,8 +204,8 @@ private: QString _code; QString _tokenText; QString _errorMessage; - QStringRef _tokenSpell; - QStringRef _rawString; + QStringView _tokenSpell; + QStringView _rawString; const QChar *_codePtr; const QChar *_endPtr; diff --git a/src/libs/qmljs/parser/qmljsmemorypool_p.h b/src/libs/qmljs/parser/qmljsmemorypool_p.h index c1e07261697..40902ae63f9 100644 --- a/src/libs/qmljs/parser/qmljsmemorypool_p.h +++ b/src/libs/qmljs/parser/qmljsmemorypool_p.h @@ -90,9 +90,10 @@ public: template Tp *New(Ta... args) { return new (this->allocate(sizeof(Tp))) Tp(args...); } - QStringRef newString(const QString &string) { + QStringView newString(const QString &string) + { strings.append(new QString(string)); - return QStringRef(strings.last()); + return QStringView(*strings.last()); } private: diff --git a/src/libs/qmljs/parser/qmljsparser.cpp b/src/libs/qmljs/parser/qmljsparser.cpp index c9b79e7f47d..57b03b6cfbf 100644 --- a/src/libs/qmljs/parser/qmljsparser.cpp +++ b/src/libs/qmljs/parser/qmljsparser.cpp @@ -102,7 +102,7 @@ static inline SourceLocation location(Lexer *lexer) AST::UiQualifiedId *Parser::reparseAsQualifiedId(AST::ExpressionNode *expr) { - QVarLengthArray nameIds; + QVarLengthArray nameIds; QVarLengthArray locations; AST::ExpressionNode *it = expr; @@ -2655,7 +2655,7 @@ case 241: { #line 3625 "qmljs.g" case 483: { - AST::BreakStatement *node = new (pool) AST::BreakStatement(QStringRef()); + AST::BreakStatement *node = new (pool) AST::BreakStatement(QStringView()); node->breakToken = loc(1); node->semicolonToken = loc(2); sym(1).Node = node; @@ -2893,8 +2893,11 @@ case 241: { case 512: { if (!ensureNoFunctionTypeAnnotations(sym(5).TypeAnnotation, sym(3).FormalParameterList)) return false; - AST::FunctionDeclaration *node = new (pool) AST::FunctionDeclaration(QStringRef(), sym(3).FormalParameterList, sym(7).StatementList, - /*type annotation*/nullptr); + AST::FunctionDeclaration *node = new (pool) + AST::FunctionDeclaration(QStringView(), + sym(3).FormalParameterList, + sym(7).StatementList, + /*type annotation*/ nullptr); node->functionToken = loc(1); node->lparenToken = loc(2); node->rparenToken = loc(4); @@ -2925,8 +2928,11 @@ case 241: { case 514: { if (!ensureNoFunctionTypeAnnotations(sym(5).TypeAnnotation, sym(3).FormalParameterList)) return false; - AST::FunctionExpression *node = new (pool) AST::FunctionExpression(QStringRef(), sym(3).FormalParameterList, sym(7).StatementList, - /*type annotation*/nullptr); + AST::FunctionExpression *node = new (pool) + AST::FunctionExpression(QStringView(), + sym(3).FormalParameterList, + sym(7).StatementList, + /*type annotation*/ nullptr); node->functionToken = loc(1); node->lparenToken = loc(2); node->rparenToken = loc(4); @@ -2998,7 +3004,8 @@ case 241: { ret->returnToken = sym(4).Node->firstSourceLocation(); ret->semicolonToken = sym(4).Node->lastSourceLocation(); AST::StatementList *statements = (new (pool) AST::StatementList(ret))->finish(); - AST::FunctionExpression *f = new (pool) AST::FunctionExpression(QStringRef(), sym(1).FormalParameterList, statements); + AST::FunctionExpression *f = new (pool) + AST::FunctionExpression(QStringView(), sym(1).FormalParameterList, statements); f->isArrowFunction = true; f->functionToken = sym(1).Node ? sym(1).Node->firstSourceLocation() : loc(1); f->lbraceToken = sym(4).Node->firstSourceLocation(); @@ -3011,7 +3018,8 @@ case 241: { #line 4037 "qmljs.g" case 530: { - AST::FunctionExpression *f = new (pool) AST::FunctionExpression(QStringRef(), sym(1).FormalParameterList, sym(6).StatementList); + AST::FunctionExpression *f = new (pool) + AST::FunctionExpression(QStringView(), sym(1).FormalParameterList, sym(6).StatementList); f->isArrowFunction = true; f->functionToken = sym(1).Node ? sym(1).Node->firstSourceLocation() : loc(1); f->lbraceToken = loc(6); @@ -3150,7 +3158,8 @@ case 241: { #line 4198 "qmljs.g" case 544: { - AST::FunctionDeclaration *node = new (pool) AST::FunctionDeclaration(QStringRef(), sym(3).FormalParameterList, sym(6).StatementList); + AST::FunctionDeclaration *node = new (pool) + AST::FunctionDeclaration(QStringView(), sym(3).FormalParameterList, sym(6).StatementList); node->functionToken = loc(1); node->lparenToken = loc(2); node->rparenToken = loc(4); @@ -3178,7 +3187,8 @@ case 241: { #line 4228 "qmljs.g" case 546: { - AST::FunctionExpression *node = new (pool) AST::FunctionExpression(QStringRef(), sym(3).FormalParameterList, sym(6).StatementList); + AST::FunctionExpression *node = new (pool) + AST::FunctionExpression(QStringView(), sym(3).FormalParameterList, sym(6).StatementList); node->functionToken = loc(1); node->lparenToken = loc(2); node->rparenToken = loc(4); @@ -3244,7 +3254,8 @@ case 241: { #line 4303 "qmljs.g" case 556: { - AST::ClassDeclaration *node = new (pool) AST::ClassDeclaration(QStringRef(), sym(2).Expression, sym(4).ClassElementList); + AST::ClassDeclaration *node = new (pool) + AST::ClassDeclaration(QStringView(), sym(2).Expression, sym(4).ClassElementList); node->classToken = loc(1); node->lbraceToken = loc(3); node->rbraceToken = loc(5); @@ -3254,7 +3265,8 @@ case 241: { #line 4314 "qmljs.g" case 557: { - AST::ClassExpression *node = new (pool) AST::ClassExpression(QStringRef(), sym(2).Expression, sym(4).ClassElementList); + AST::ClassExpression *node = new (pool) + AST::ClassExpression(QStringView(), sym(2).Expression, sym(4).ClassElementList); node->classToken = loc(1); node->lbraceToken = loc(3); node->rbraceToken = loc(5); diff --git a/src/libs/qmljs/parser/qmljsparser_p.h b/src/libs/qmljs/parser/qmljsparser_p.h index e7a81f32084..4d2bfe528a5 100644 --- a/src/libs/qmljs/parser/qmljsparser_p.h +++ b/src/libs/qmljs/parser/qmljsparser_p.h @@ -207,10 +207,10 @@ protected: inline Value &sym(int index) { return sym_stack [tos + index - 1]; } - inline QStringRef &stringRef(int index) + inline QStringView &stringRef(int index) { return string_stack [tos + index - 1]; } - inline QStringRef &rawStringRef(int index) + inline QStringView &rawStringRef(int index) { return rawString_stack [tos + index - 1]; } inline SourceLocation &loc(int index) @@ -248,8 +248,8 @@ protected: Value *sym_stack = nullptr; int *state_stack = nullptr; SourceLocation *location_stack = nullptr; - QVector string_stack; - QVector rawString_stack; + QVector string_stack; + QVector rawString_stack; AST::Node *program = nullptr; @@ -260,14 +260,14 @@ protected: int token; double dval; SourceLocation loc; - QStringRef spell; - QStringRef raw; + QStringView spell; + QStringView raw; }; int yytoken = -1; double yylval = 0.; - QStringRef yytokenspell; - QStringRef yytokenraw; + QStringView yytokenspell; + QStringView yytokenraw; SourceLocation yylloc; SourceLocation yyprevlloc; diff --git a/src/libs/qmljs/qmljsbundle.cpp b/src/libs/qmljs/qmljsbundle.cpp index 6c7ee6029b7..ee5d24fcfa8 100644 --- a/src/libs/qmljs/qmljsbundle.cpp +++ b/src/libs/qmljs/qmljsbundle.cpp @@ -152,15 +152,13 @@ void QmlBundle::printEscaped(QTextStream &s, const QString &str) iEnd = str.constEnd(); while (i != iEnd) { if ((*i) != QLatin1Char('"')) { - s << QStringRef(&str, static_cast(iLast - str.constBegin()) - , static_cast(i - iLast) ).toString() + s << str.mid(static_cast(iLast - str.constBegin()), static_cast(i - iLast)) << QLatin1Char('\\'); iLast = i; } ++i; } - s << QStringRef(&str, static_cast(iLast - str.constBegin()) - , static_cast(i - iLast) ).toString(); + s << str.mid(static_cast(iLast - str.constBegin()), static_cast(i - iLast)); } void QmlBundle::writeTrie(QTextStream &stream, const Trie &t, const QString &indent) { diff --git a/src/libs/qmljs/qmljscheck.cpp b/src/libs/qmljs/qmljscheck.cpp index 375cb9b4526..f5d1e71f4f2 100644 --- a/src/libs/qmljs/qmljscheck.cpp +++ b/src/libs/qmljs/qmljscheck.cpp @@ -831,10 +831,10 @@ void Check::endVisit(UiObjectInitializer *) m_propertyStack.pop(); m_typeStack.pop(); UiObjectDefinition *objectDefinition = cast(parent()); - if (objectDefinition && objectDefinition->qualifiedTypeNameId->name == "Component") + if (objectDefinition && objectDefinition->qualifiedTypeNameId->name == QLatin1String("Component")) m_idStack.pop(); UiObjectBinding *objectBinding = cast(parent()); - if (objectBinding && objectBinding->qualifiedTypeNameId->name == "Component") + if (objectBinding && objectBinding->qualifiedTypeNameId->name == QLatin1String("Component")) m_idStack.pop(); } @@ -1028,7 +1028,7 @@ void Check::visitQmlObject(Node *ast, UiQualifiedId *typeId, bool Check::visit(UiScriptBinding *ast) { // special case for id property - if (ast->qualifiedId->name == "id" && !ast->qualifiedId->next) { + if (ast->qualifiedId->name == QLatin1String("id") && !ast->qualifiedId->next) { if (! ast->statement) return false; @@ -1125,20 +1125,20 @@ bool Check::visit(UiPublicMember *ast) { if (ast->type == UiPublicMember::Property) { if (ast->defaultToken.isValid() || ast->readonlyToken.isValid()) { - const QStringRef typeName = ast->memberType->name; + const QStringView typeName = ast->memberType->name; if (!typeName.isEmpty() && typeName.at(0).isLower()) { const QString typeNameS = typeName.toString(); if (!isValidBuiltinPropertyType(typeNameS)) addMessage(ErrInvalidPropertyType, ast->typeToken, typeNameS); } - const QStringRef name = ast->name; + const QStringView name = ast->name; - if (name == "data") + if (name == QLatin1String("data")) addMessage(ErrInvalidPropertyName, ast->identifierToken, name.toString()); // warn about dubious use of var/variant - if (typeName == "variant" || typeName == "var") { + if (typeName == QLatin1String("variant") || typeName == QLatin1String("var")) { Evaluate evaluator(&_scopeChain); const Value *init = evaluator(ast->statement); QString preferredType; @@ -1666,16 +1666,16 @@ bool Check::visit(NewMemberExpression *ast) // check for Number, Boolean, etc constructor usage if (IdentifierExpression *idExp = cast(ast->base)) { - const QStringRef name = idExp->name; - if (name == "Number") { + const QStringView name = idExp->name; + if (name == QLatin1String("Number")) { addMessage(WarnNumberConstructor, idExp->identifierToken); - } else if (name == "Boolean") { + } else if (name == QLatin1String("Boolean")) { addMessage(WarnBooleanConstructor, idExp->identifierToken); - } else if (name == "String") { + } else if (name == QLatin1String("String")) { addMessage(WarnStringConstructor, idExp->identifierToken); - } else if (name == "Object") { + } else if (name == QLatin1String("Object")) { addMessage(WarnObjectConstructor, idExp->identifierToken); - } else if (name == "Array") { + } else if (name == QLatin1String("Array")) { bool ok = false; if (ast->arguments && ast->arguments->expression && !ast->arguments->next) { Evaluate evaluate(&_scopeChain); @@ -1685,7 +1685,7 @@ bool Check::visit(NewMemberExpression *ast) } if (!ok) addMessage(WarnArrayConstructor, idExp->identifierToken); - } else if (name == "Function") { + } else if (name == QLatin1String("Function")) { addMessage(WarnFunctionConstructor, idExp->identifierToken); } } diff --git a/src/libs/qmljs/qmljscodeformatter.cpp b/src/libs/qmljs/qmljscodeformatter.cpp index af940938c93..63932e9ecdd 100644 --- a/src/libs/qmljs/qmljscodeformatter.cpp +++ b/src/libs/qmljs/qmljscodeformatter.cpp @@ -25,6 +25,8 @@ #include "qmljscodeformatter.h" +#include + #include #include #include @@ -205,11 +207,14 @@ void CodeFormatter::recalculateStateAfter(const QTextBlock &block) turnInto(property_maybe_initializer); break; - case property_list_open: - if (m_currentLine.midRef(m_currentToken.begin(), m_currentToken.length) == QLatin1String(">")) + case property_list_open: { + const QStringView tok = Utils::midView(m_currentLine, + m_currentToken.begin(), + m_currentToken.length); + if (tok == QLatin1String(">")) turnInto(property_name); break; - + } case property_maybe_initializer: switch (kind) { case Colon: turnInto(binding_assignment); break; @@ -846,9 +851,9 @@ int CodeFormatter::column(int index) const return col; } -QStringRef CodeFormatter::currentTokenText() const +QStringView CodeFormatter::currentTokenText() const { - return m_currentLine.midRef(m_currentToken.begin(), m_currentToken.length); + return Utils::midView(m_currentLine, m_currentToken.begin(), m_currentToken.length); } void CodeFormatter::turnInto(int newState) @@ -922,7 +927,7 @@ int CodeFormatter::tokenizeBlock(const QTextBlock &block) CodeFormatter::TokenKind CodeFormatter::extendedTokenKind(const QmlJS::Token &token) const { const int kind = token.kind; - QStringRef text = m_currentLine.midRef(token.begin(), token.length); + const QStringView text = Utils::midView(m_currentLine, token.begin(), token.length); if (kind == Identifier) { if (text == QLatin1String("as")) diff --git a/src/libs/qmljs/qmljscodeformatter.h b/src/libs/qmljs/qmljscodeformatter.h index 55fe2d2d86f..878b458f302 100644 --- a/src/libs/qmljs/qmljscodeformatter.h +++ b/src/libs/qmljs/qmljscodeformatter.h @@ -284,7 +284,7 @@ private: void saveCurrentState(const QTextBlock &block); void restoreCurrentState(const QTextBlock &block); - QStringRef currentTokenText() const; + QStringView currentTokenText() const; int tokenizeBlock(const QTextBlock &block); diff --git a/src/libs/qmljs/qmljscompletioncontextfinder.cpp b/src/libs/qmljs/qmljscompletioncontextfinder.cpp index a07080b2b32..dcfe255ec92 100644 --- a/src/libs/qmljs/qmljscompletioncontextfinder.cpp +++ b/src/libs/qmljs/qmljscompletioncontextfinder.cpp @@ -26,6 +26,8 @@ #include "qmljscompletioncontextfinder.h" #include "qmljsscanner.h" +#include + #include #include @@ -161,7 +163,7 @@ void CompletionContextFinder::checkBinding() break; case Token::Identifier: { - QStringRef tokenString = yyLine->midRef(token.begin(), token.length); + const QStringView tokenString = Utils::midView(*yyLine, token.begin(), token.length); dotExpected = false; if (identifierExpected) { m_bindingPropertyName.prepend(tokenString.toString()); @@ -231,7 +233,7 @@ void CompletionContextFinder::checkImport() switch (token.kind) { case Token::Identifier: { - const QStringRef tokenString = yyLine->midRef(token.begin(), token.length); + const QStringView tokenString = Utils::midView(*yyLine, token.begin(), token.length); if (tokenString == QLatin1String("as")) { isInLibVersionImport = 0; if (state == Unknown) { @@ -270,7 +272,7 @@ void CompletionContextFinder::checkImport() case Token::Number: if (state == Unknown || (state & ExpectVersion)) { state = ExpectAnyTarget; - libVersionImport.prepend(yyLine->midRef(token.begin(), token.length).toString()); + libVersionImport.prepend(yyLine->mid(token.begin(), token.length)); libVersionImport.prepend(QLatin1String(" ")); if (isInLibVersionImport == -1) isInLibVersionImport = 1; diff --git a/src/libs/qmljs/qmljsimportdependencies.cpp b/src/libs/qmljs/qmljsimportdependencies.cpp index d5242af3aa7..ca84e700145 100644 --- a/src/libs/qmljs/qmljsimportdependencies.cpp +++ b/src/libs/qmljs/qmljsimportdependencies.cpp @@ -313,7 +313,7 @@ ImportMatchStrength ImportKey::matchImport(const ImportKey &o, const ViewerConte } if (!p1.startsWith(QLatin1Char('+'))) return QList(); - QStringRef selectorAtt(&p1, 1, p1.size()-1); + const QStringView selectorAtt(p1.constData() + 1, p1.size() - 1); while (iSelector < nSelectors) { if (selectorAtt == vContext.selectors.at(iSelector)) break; diff --git a/src/libs/qmljs/qmljsinterpreter.cpp b/src/libs/qmljs/qmljsinterpreter.cpp index bf13df85455..3627e7b1747 100644 --- a/src/libs/qmljs/qmljsinterpreter.cpp +++ b/src/libs/qmljs/qmljsinterpreter.cpp @@ -246,8 +246,8 @@ CppComponentValue::CppComponentValue(FakeMetaObject::ConstPtr metaObject, const CppComponentValue::~CppComponentValue() { - delete m_metaSignatures.load(); - delete m_signalScopes.load(); + delete m_metaSignatures.loadRelaxed(); + delete m_signalScopes.loadRelaxed(); } static QString generatedSlotName(const QString &base) @@ -261,7 +261,7 @@ static QString generatedSlotName(const QString &base) if (c != QLatin1Char('_')) break; } - slotName += base.midRef(firstChar); + slotName += base.mid(firstChar); return slotName; } @@ -285,7 +285,7 @@ void CppComponentValue::processMembers(MemberProcessor *processor) const QSet explicitSignals; // make MetaFunction instances lazily when first needed - QList *signatures = m_metaSignatures.load(); + QList *signatures = m_metaSignatures.loadRelaxed(); if (!signatures) { signatures = new QList; signatures->reserve(m_metaObject->methodCount()); @@ -293,7 +293,7 @@ void CppComponentValue::processMembers(MemberProcessor *processor) const signatures->append(new MetaFunction(m_metaObject->method(index), valueOwner())); if (!m_metaSignatures.testAndSetOrdered(nullptr, signatures)) { delete signatures; - signatures = m_metaSignatures.load(); + signatures = m_metaSignatures.loadRelaxed(); } } @@ -523,7 +523,7 @@ const QmlEnumValue *CppComponentValue::getEnumValue(const QString &typeName, con const ObjectValue *CppComponentValue::signalScope(const QString &signalName) const { - QHash *scopes = m_signalScopes.load(); + QHash *scopes = m_signalScopes.loadRelaxed(); if (!scopes) { scopes = new QHash; // usually not all methods are signals @@ -549,7 +549,7 @@ const ObjectValue *CppComponentValue::signalScope(const QString &signalName) con } if (!m_signalScopes.testAndSetOrdered(nullptr, scopes)) { delete scopes; - scopes = m_signalScopes.load(); + scopes = m_signalScopes.loadRelaxed(); } } @@ -1055,7 +1055,7 @@ void ObjectValue::setMember(const QString &name, const Value *value) m_members[name].value = value; } -void ObjectValue::setMember(const QStringRef &name, const Value *value) +void ObjectValue::setMember(const QStringView &name, const Value *value) { m_members[name.toString()].value = value; } diff --git a/src/libs/qmljs/qmljsinterpreter.h b/src/libs/qmljs/qmljsinterpreter.h index 0a52b34999d..66c54f15f0b 100644 --- a/src/libs/qmljs/qmljsinterpreter.h +++ b/src/libs/qmljs/qmljsinterpreter.h @@ -508,7 +508,7 @@ public: virtual void processMembers(MemberProcessor *processor) const; virtual void setMember(const QString &name, const Value *value); - virtual void setMember(const QStringRef &name, const Value *value); + virtual void setMember(const QStringView &name, const Value *value); virtual void setPropertyInfo(const QString &name, const PropertyInfo &propertyInfo); virtual void removeMember(const QString &name); diff --git a/src/libs/qmljs/qmljslineinfo.cpp b/src/libs/qmljs/qmljslineinfo.cpp index 430f37031cf..610b6435363 100644 --- a/src/libs/qmljs/qmljslineinfo.cpp +++ b/src/libs/qmljs/qmljslineinfo.cpp @@ -64,6 +64,8 @@ #include #include +#include + using namespace QmlJS; /* @@ -128,7 +130,7 @@ QString LineInfo::trimmedCodeLine(const QString &t) QString trimmed; int previousTokenEnd = 0; foreach (const Token &token, yyLinizerState.tokens) { - trimmed.append(t.midRef(previousTokenEnd, token.begin() - previousTokenEnd)); + trimmed.append(t.mid(previousTokenEnd, token.begin() - previousTokenEnd)); if (token.is(Token::String)) { for (int i = 0; i < token.length; ++i) @@ -139,7 +141,7 @@ QString LineInfo::trimmedCodeLine(const QString &t) trimmed.append(QLatin1Char(' ')); } else { - trimmed.append(tokenText(token)); + trimmed.append(tokenText(token).toString()); } previousTokenEnd = token.end(); @@ -191,7 +193,7 @@ QString LineInfo::trimmedCodeLine(const QString &t) // "a = Somevar\n{" in a JS context // What's done here does not cover all cases, but goes as far as possible // with the limited information that's available. - const QStringRef text = tokenText(last); + const QStringView text = tokenText(last); if (yyLinizerState.leftBraceFollows && !text.isEmpty() && text.at(0).isUpper()) { int i = index; @@ -277,9 +279,9 @@ Token LineInfo::lastToken() const return Token(); } -QStringRef LineInfo::tokenText(const Token &token) const +QStringView LineInfo::tokenText(const Token &token) const { - return yyLinizerState.line.midRef(token.offset, token.length); + return Utils::midView(yyLinizerState.line, token.offset, token.length); } /* @@ -457,7 +459,7 @@ bool LineInfo::matchBracelessControlStatement() const Token &tk = yyLinizerState.tokens.at(tokenIndex - 1); if (tk.is(Token::Keyword)) { - const QStringRef text = tokenText(tk); + const QStringView text = tokenText(tk); /* We have diff --git a/src/libs/qmljs/qmljslineinfo.h b/src/libs/qmljs/qmljslineinfo.h index 5d3a0816a6e..6041f496ee2 100644 --- a/src/libs/qmljs/qmljslineinfo.h +++ b/src/libs/qmljs/qmljslineinfo.h @@ -69,7 +69,7 @@ protected: bool matchBracelessControlStatement(); Token lastToken() const; - QStringRef tokenText(const Token &token) const; + QStringView tokenText(const Token &token) const; protected: struct LinizerState diff --git a/src/libs/qmljs/qmljspropertyreader.cpp b/src/libs/qmljs/qmljspropertyreader.cpp index d78668ba1e7..6c6f7737726 100644 --- a/src/libs/qmljs/qmljspropertyreader.cpp +++ b/src/libs/qmljs/qmljspropertyreader.cpp @@ -201,7 +201,7 @@ QLinearGradient PropertyReader::parseGradient(const QString &propertyName, bool if (UiObjectBinding* objectBinding = cast(member)) { UiObjectInitializer *initializer = objectBinding->initializer; const QString objectPropertyName = objectBinding->qualifiedId->name.toString(); - const QStringRef typeName = objectBinding->qualifiedTypeNameId->name; + const QStringView typeName = objectBinding->qualifiedTypeNameId->name; if (objectPropertyName == propertyName && typeName.contains(QLatin1String("Gradient"))) { QLinearGradient gradient; QVector stops; diff --git a/src/libs/qmljs/qmljssimplereader.cpp b/src/libs/qmljs/qmljssimplereader.cpp index b0269594aa1..d0d43b4098e 100644 --- a/src/libs/qmljs/qmljssimplereader.cpp +++ b/src/libs/qmljs/qmljssimplereader.cpp @@ -33,6 +33,7 @@ #include #include +#include static Q_LOGGING_CATEGORY(simpleReaderLog, "qtc.qmljs.simpleReader", QtWarningMsg) diff --git a/src/libs/qmljs/qmljsutils.cpp b/src/libs/qmljs/qmljsutils.cpp index 8a84f7f0c4e..4549bcbdfed 100644 --- a/src/libs/qmljs/qmljsutils.cpp +++ b/src/libs/qmljs/qmljsutils.cpp @@ -83,7 +83,7 @@ QColor QmlJS::toQColor(const QString &qmlColorString) QColor color; if (qmlColorString.size() == 9 && qmlColorString.at(0) == QLatin1Char('#')) { bool ok; - const int alpha = qmlColorString.midRef(1, 2).toInt(&ok, 16); + const int alpha = qmlColorString.mid(1, 2).toInt(&ok, 16); if (ok) { const QString name = qmlColorString.at(0) + qmlColorString.right(6); if (QColor::isValidColor(name)) { @@ -106,7 +106,7 @@ QString QmlJS::toString(UiQualifiedId *qualifiedId, QChar delimiter) if (iter != qualifiedId) result += delimiter; - result += iter->name; + result += iter->name.toString(); } return result; diff --git a/src/libs/utils/porting.h b/src/libs/utils/porting.h index 53e730544d4..89c3daba893 100644 --- a/src/libs/utils/porting.h +++ b/src/libs/utils/porting.h @@ -51,6 +51,7 @@ using StringView = QStringRef; #else using StringView = QStringView; #endif + inline StringView make_stringview(const QString &s) { #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) @@ -60,4 +61,18 @@ inline StringView make_stringview(const QString &s) #endif } +// QStringView::mid in Qt5 does not do bounds checking, in Qt6 it does +inline QStringView midView(const QString &s, int offset, int length) +{ +#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) + if (offset > s.size()) + return {}; + if (offset + length > s.size()) + return QStringView(s).mid(offset); + return QStringView(s).mid(offset, length); +#else + return QStringView(s).mid(offset, length); +#endif +} + } // namespace Utils diff --git a/src/plugins/autotest/quick/quicktestvisitors.cpp b/src/plugins/autotest/quick/quicktestvisitors.cpp index 0b6548131e8..6f51425d015 100644 --- a/src/plugins/autotest/quick/quicktestvisitors.cpp +++ b/src/plugins/autotest/quick/quicktestvisitors.cpp @@ -74,7 +74,7 @@ static bool isDerivedFromTestCase(QmlJS::AST::UiQualifiedId *id, const QmlJS::Do if (auto prototype = val->prototype()) { if (auto qmlPrototypeRef = prototype->asQmlPrototypeReference()) { if (auto qmlTypeName = qmlPrototypeRef->qmlTypeName()) { - if (qmlTypeName->name == "TestCase") { + if (qmlTypeName->name == QLatin1String("TestCase")) { if (auto astObjVal = val->asAstObjectValue()) return documentImportsQtTest(astObjVal->document()); } @@ -87,9 +87,9 @@ static bool isDerivedFromTestCase(QmlJS::AST::UiQualifiedId *id, const QmlJS::Do bool TestQmlVisitor::visit(QmlJS::AST::UiObjectDefinition *ast) { - const QStringRef name = ast->qualifiedTypeNameId->name; + const QStringView name = ast->qualifiedTypeNameId->name; m_objectIsTestStack.push(false); - if (name != "TestCase") { + if (name != QLatin1String("TestCase")) { if (!isDerivedFromTestCase(ast->qualifiedTypeNameId, m_currentDoc, m_snapshot)) return true; } else if (!documentImportsQtTest(m_currentDoc.data())) { @@ -122,7 +122,7 @@ bool TestQmlVisitor::visit(QmlJS::AST::ExpressionStatement *ast) bool TestQmlVisitor::visit(QmlJS::AST::UiScriptBinding *ast) { if (m_objectIsTestStack.top()) - m_expectTestCaseName = ast->qualifiedId->name == "name"; + m_expectTestCaseName = ast->qualifiedId->name == QLatin1String("name"); return m_expectTestCaseName; } @@ -137,24 +137,22 @@ bool TestQmlVisitor::visit(QmlJS::AST::FunctionDeclaration *ast) if (m_caseParseStack.isEmpty()) return false; - const QStringRef name = ast->name; - if (name.startsWith("test_") - || name.startsWith("benchmark_") - || name.endsWith("_data") - || specialFunctions.contains(name.toString())) { + const QString name = ast->name.toString(); + if (name.startsWith("test_") || name.startsWith("benchmark_") || name.endsWith("_data") + || specialFunctions.contains(name)) { const auto sourceLocation = ast->firstSourceLocation(); TestCodeLocationAndType locationAndType; locationAndType.m_name = m_currentDoc->fileName(); locationAndType.m_line = sourceLocation.startLine; locationAndType.m_column = sourceLocation.startColumn - 1; - if (specialFunctions.contains(name.toString())) + if (specialFunctions.contains(name)) locationAndType.m_type = TestTreeItem::TestSpecialFunction; else if (name.endsWith("_data")) locationAndType.m_type = TestTreeItem::TestDataFunction; else locationAndType.m_type = TestTreeItem::TestFunction; - const QString nameStr = name.toString(); + const QString nameStr = name; // identical test functions inside the same file are not working - will fail at runtime if (!Utils::anyOf(m_caseParseStack.top().m_functions, [nameStr, locationAndType](const QuickTestFunctionSpec func) { diff --git a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp index 94814b74367..d23eac4f546 100644 --- a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp +++ b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp @@ -1203,7 +1203,7 @@ void TextToModelMerger::syncNode(ModelNode &modelNode, if (property->type == AST::UiPublicMember::Signal) continue; // QML designer doesn't support this yet. - const QStringRef astName = property->name; + const QStringView astName = property->name; QString astValue; if (property->statement) astValue = textAt(context->doc(), diff --git a/src/plugins/qmljseditor/qmljsautocompleter.cpp b/src/plugins/qmljseditor/qmljsautocompleter.cpp index a9a210248eb..43209507ca5 100644 --- a/src/plugins/qmljseditor/qmljsautocompleter.cpp +++ b/src/plugins/qmljseditor/qmljsautocompleter.cpp @@ -27,6 +27,8 @@ #include +#include + #include #include #include @@ -119,7 +121,7 @@ static bool shouldInsertNewline(const QTextCursor &tc) return false; } -static bool isCompleteStringLiteral(const QStringRef &text) +static bool isCompleteStringLiteral(const QStringView &text) { if (text.length() < 2) return false; @@ -173,7 +175,7 @@ bool AutoCompleter::contextAllowsAutoBrackets(const QTextCursor &cursor, case Token::String: { const QString blockText = cursor.block().text(); - const QStringRef tokenText = blockText.midRef(token.offset, token.length); + const QStringView tokenText = Utils::midView(blockText, token.offset, token.length); QChar quote = tokenText.at(0); // if a string literal doesn't start with a quote, it must be multiline if (quote != QLatin1Char('"') && quote != QLatin1Char('\'')) { @@ -217,7 +219,7 @@ bool AutoCompleter::contextAllowsAutoQuotes(const QTextCursor &cursor, case Token::String: { const QString blockText = cursor.block().text(); - const QStringRef tokenText = blockText.midRef(token.offset, token.length); + const QStringView tokenText = Utils::midView(blockText, token.offset, token.length); QChar quote = tokenText.at(0); // if a string literal doesn't start with a quote, it must be multiline if (quote != QLatin1Char('"') && quote != QLatin1Char('\'')) { diff --git a/src/plugins/qmljseditor/qmljseditor.cpp b/src/plugins/qmljseditor/qmljseditor.cpp index 235aa91af50..08d023b1c51 100644 --- a/src/plugins/qmljseditor/qmljseditor.cpp +++ b/src/plugins/qmljseditor/qmljseditor.cpp @@ -411,7 +411,7 @@ protected: { UiQualifiedId *id = qualifiedTypeNameId(member); if (id) { - const QStringRef &name = id->name; + const QStringView &name = id->name; if (!name.isEmpty() && name.at(0).isUpper()) return true; } @@ -429,7 +429,7 @@ protected: else if (script->qualifiedId->next) return false; - const QStringRef &propertyName = script->qualifiedId->name; + const QStringView &propertyName = script->qualifiedId->name; if (propertyName == QLatin1String("id")) return true; diff --git a/src/plugins/qmljseditor/qmljseditordocument.cpp b/src/plugins/qmljseditor/qmljseditordocument.cpp index d9f99eca868..59270b2ae0d 100644 --- a/src/plugins/qmljseditor/qmljseditordocument.cpp +++ b/src/plugins/qmljseditor/qmljseditordocument.cpp @@ -89,7 +89,7 @@ protected: QString text; for (; id; id = id->next) { if (!id->name.isEmpty()) - text += id->name; + text += id->name.toString(); else text += QLatin1Char('?'); @@ -174,7 +174,7 @@ protected: QString text; for (; id; id = id->next) { if (!id->name.isEmpty()) - text += id->name; + text += id->name.toString(); else text += QLatin1Char('?'); @@ -294,12 +294,12 @@ protected: init(&decl, ast); decl.text.fill(QLatin1Char(' '), _depth); - decl.text += ast->name; + decl.text += ast->name.toString(); decl.text += QLatin1Char('('); for (FormalParameterList *it = ast->formals; it; it = it->next) { if (!it->element->bindingIdentifier.isEmpty()) - decl.text += it->element->bindingIdentifier; + decl.text += it->element->bindingIdentifier.toString(); if (it->next) decl.text += QLatin1String(", "); @@ -319,7 +319,7 @@ protected: Declaration decl; decl.text.fill(QLatin1Char(' '), _depth); - decl.text += ast->bindingIdentifier; + decl.text += ast->bindingIdentifier.toString(); const SourceLocation first = ast->identifierToken; decl.startLine = first.startLine; @@ -342,12 +342,12 @@ protected: init(&decl, ast); decl.text.fill(QLatin1Char(' '), _depth); - decl.text += field->name; + decl.text += field->name.toString(); decl.text += QLatin1Char('('); for (FormalParameterList *it = funcExpr->formals; it; it = it->next) { if (!it->element->bindingIdentifier.isEmpty()) - decl.text += it->element->bindingIdentifier; + decl.text += it->element->bindingIdentifier.toString(); if (it->next) decl.text += QLatin1String(", "); diff --git a/src/plugins/qmljseditor/qmljshighlighter.cpp b/src/plugins/qmljseditor/qmljshighlighter.cpp index 6608a93a690..998021ce50b 100644 --- a/src/plugins/qmljseditor/qmljshighlighter.cpp +++ b/src/plugins/qmljseditor/qmljshighlighter.cpp @@ -27,6 +27,7 @@ #include +#include #include using namespace QmlJS; @@ -75,7 +76,8 @@ void QmlJSHighlighter::highlightBlock(const QString &text) break; case Token::Comment: - if (m_inMultilineComment && text.midRef(token.end() - 2, 2) == QLatin1String("*/")) { + if (m_inMultilineComment + && Utils::midView(text, token.end() - 2, 2) == QLatin1String("*/")) { onClosingParenthesis(QLatin1Char('-'), token.end() - 1, index == tokens.size()-1); m_inMultilineComment = false; } else if (!m_inMultilineComment @@ -119,7 +121,7 @@ void QmlJSHighlighter::highlightBlock(const QString &text) if (!m_qmlEnabled) break; - const QStringRef spell = text.midRef(token.offset, token.length); + const QStringView spell = Utils::midView(text, token.offset, token.length); if (maybeQmlKeyword(spell)) { // check the previous token @@ -129,25 +131,25 @@ void QmlJSHighlighter::highlightBlock(const QString &text) break; } } - if (text.midRef(token.offset, token.length) == QLatin1String("enum")) { + if (Utils::midView(text, token.offset, token.length) == QLatin1String("enum")) { setFormat(token.offset, token.length, formatForCategory(C_KEYWORD)); break; } } else if (index > 0 && maybeQmlBuiltinType(spell)) { const Token &previousToken = tokens.at(index - 1); if (previousToken.is(Token::Identifier) - && text.at(previousToken.offset) == QLatin1Char('p') - && text.midRef(previousToken.offset, previousToken.length) - == QLatin1String("property")) { + && text.at(previousToken.offset) == QLatin1Char('p') + && Utils::midView(text, previousToken.offset, previousToken.length) + == QLatin1String("property")) { setFormat(token.offset, token.length, formatForCategory(C_KEYWORD)); break; } } else if (index == 1) { const Token &previousToken = tokens.at(0); if (previousToken.is(Token::Identifier) - && text.at(previousToken.offset) == QLatin1Char('e') - && text.midRef(previousToken.offset, previousToken.length) - == QLatin1String("enum")) { + && text.at(previousToken.offset) == QLatin1Char('e') + && Utils::midView(text, previousToken.offset, previousToken.length) + == QLatin1String("enum")) { setFormat(token.offset, token.length, formatForCategory(C_ENUMERATION)); break; } @@ -200,7 +202,7 @@ void QmlJSHighlighter::highlightBlock(const QString &text) onBlockEnd(m_scanner.state()); } -bool QmlJSHighlighter::maybeQmlKeyword(const QStringRef &text) const +bool QmlJSHighlighter::maybeQmlKeyword(const QStringView &text) const { if (text.isEmpty()) return false; @@ -226,7 +228,7 @@ bool QmlJSHighlighter::maybeQmlKeyword(const QStringRef &text) const return false; } -bool QmlJSHighlighter::maybeQmlBuiltinType(const QStringRef &text) const +bool QmlJSHighlighter::maybeQmlBuiltinType(const QStringView &text) const { if (text.isEmpty()) return false; diff --git a/src/plugins/qmljseditor/qmljshighlighter.h b/src/plugins/qmljseditor/qmljshighlighter.h index b1d9abb0f1a..07bd8736ff8 100644 --- a/src/plugins/qmljseditor/qmljshighlighter.h +++ b/src/plugins/qmljseditor/qmljshighlighter.h @@ -56,8 +56,8 @@ protected: void onOpeningParenthesis(QChar parenthesis, int pos, bool atStart); void onClosingParenthesis(QChar parenthesis, int pos, bool atEnd); - bool maybeQmlKeyword(const QStringRef &text) const; - bool maybeQmlBuiltinType(const QStringRef &text) const; + bool maybeQmlKeyword(const QStringView &text) const; + bool maybeQmlBuiltinType(const QStringView &text) const; private: bool m_qmlEnabled; diff --git a/src/plugins/qmljseditor/qmljssemantichighlighter.cpp b/src/plugins/qmljseditor/qmljssemantichighlighter.cpp index b9ef9dc7469..823e57d7ab4 100644 --- a/src/plugins/qmljseditor/qmljssemantichighlighter.cpp +++ b/src/plugins/qmljseditor/qmljssemantichighlighter.cpp @@ -235,7 +235,7 @@ protected: m_scopeBuilder.pop(); } - void processName(const QStringRef &name, SourceLocation location) + void processName(const QStringView &name, SourceLocation location) { if (name.isEmpty()) return; diff --git a/src/plugins/qmljseditor/qmloutlinemodel.cpp b/src/plugins/qmljseditor/qmloutlinemodel.cpp index c9853fbe91b..00358290002 100644 --- a/src/plugins/qmljseditor/qmloutlinemodel.cpp +++ b/src/plugins/qmljseditor/qmloutlinemodel.cpp @@ -599,7 +599,7 @@ void QmlOutlineModel::leavePublicMember() leaveNode(); } -static QString functionDisplayName(QStringRef name, AST::FormalParameterList *formals) +static QString functionDisplayName(QStringView name, AST::FormalParameterList *formals) { QString display; @@ -1002,7 +1002,7 @@ QString QmlOutlineModel::asString(AST::UiQualifiedId *id) QString text; for (; id; id = id->next) { if (!id->name.isEmpty()) - text += id->name; + text += id->name.toString(); else text += QLatin1Char('?'); diff --git a/src/plugins/qmljstools/qmljssemanticinfo.cpp b/src/plugins/qmljstools/qmljssemanticinfo.cpp index ce490cd4450..ef375b77b7e 100644 --- a/src/plugins/qmljstools/qmljssemanticinfo.cpp +++ b/src/plugins/qmljstools/qmljssemanticinfo.cpp @@ -159,7 +159,7 @@ Node *SemanticInfo::declaringMemberNoProperties(int cursorPosition) const AST::Node *node = rangeAt(cursorPosition); if (auto objectDefinition = cast(node)) { - const QStringRef name = objectDefinition->qualifiedTypeNameId->name; + const QStringView name = objectDefinition->qualifiedTypeNameId->name; if (!name.isEmpty() && name.at(0).isLower()) { QList path = rangePath(cursorPosition); if (path.size() > 1) @@ -170,7 +170,7 @@ Node *SemanticInfo::declaringMemberNoProperties(int cursorPosition) const return path.at(path.size() - 3); } } else if (auto objectBinding = cast(node)) { - const QStringRef name = objectBinding->qualifiedTypeNameId->name; + const QStringView name = objectBinding->qualifiedTypeNameId->name; if (name.contains(QLatin1String("Gradient"))) { QList path = rangePath(cursorPosition); if (path.size() > 1)