From af88a7876b50ed9dd71e3fc7614eef5998908d03 Mon Sep 17 00:00:00 2001 From: Fawzi Mohamed Date: Tue, 6 Jul 2021 23:50:30 +0200 Subject: qmljs: update Qml parser to parser of Qt 6.2 this is needed (among other things) for * null coalescing * shebang support Change-Id: I1b37fd86593f143de8b39c0daf433831a8785568 Reviewed-by: Fabian Kosmale --- src/libs/qmljs/CMakeLists.txt | 1 + src/libs/qmljs/parser/parser.pri | 2 + src/libs/qmljs/parser/qmldirparser.cpp | 96 +- src/libs/qmljs/parser/qmldirparser_p.h | 41 +- src/libs/qmljs/parser/qmlimportresolver.cpp | 108 + src/libs/qmljs/parser/qmlimportresolver_p.h | 50 + src/libs/qmljs/parser/qmljs.g | 128 +- src/libs/qmljs/parser/qmljsast.cpp | 63 +- src/libs/qmljs/parser/qmljsast_p.h | 271 +- src/libs/qmljs/parser/qmljsastfwd_p.h | 3 +- src/libs/qmljs/parser/qmljsastvisitor.cpp | 2 +- src/libs/qmljs/parser/qmljsastvisitor_p.h | 8 +- src/libs/qmljs/parser/qmljsdiagnosticmessage_p.h | 2 +- src/libs/qmljs/parser/qmljsengine_p.cpp | 12 +- src/libs/qmljs/parser/qmljsengine_p.h | 13 +- src/libs/qmljs/parser/qmljsglobal_p.h | 2 +- src/libs/qmljs/parser/qmljsgrammar.cpp | 4038 +++++++++++----------- src/libs/qmljs/parser/qmljsgrammar_p.h | 92 +- src/libs/qmljs/parser/qmljskeywords_p.h | 2 +- src/libs/qmljs/parser/qmljslexer.cpp | 539 +-- src/libs/qmljs/parser/qmljslexer_p.h | 3 +- src/libs/qmljs/parser/qmljsmemorypool_p.h | 5 +- src/libs/qmljs/parser/qmljsparser.cpp | 1568 +++++---- src/libs/qmljs/parser/qmljsparser_p.h | 22 +- src/libs/qmljs/parser/qmljssourcelocation_p.h | 46 +- src/libs/qmljs/qmljs.qbs | 1 + src/libs/qmljs/qmljs_global.h | 2 +- src/libs/qmljs/qmljsdocument.cpp | 8 +- src/libs/qmljs/qmljsdocument.h | 6 +- src/libs/qmljs/qmljsmodelmanagerinterface.cpp | 2 +- src/libs/qmljs/qmljsplugindumper.cpp | 4 +- src/libs/qmljs/qmljsutils.cpp | 2 +- 32 files changed, 3748 insertions(+), 3394 deletions(-) create mode 100644 src/libs/qmljs/parser/qmlimportresolver.cpp create mode 100644 src/libs/qmljs/parser/qmlimportresolver_p.h diff --git a/src/libs/qmljs/CMakeLists.txt b/src/libs/qmljs/CMakeLists.txt index ebb985daf8..bf06a2a88d 100644 --- a/src/libs/qmljs/CMakeLists.txt +++ b/src/libs/qmljs/CMakeLists.txt @@ -4,6 +4,7 @@ add_qtc_library(QmlJS SOURCES jsoncheck.cpp jsoncheck.h parser/qmldirparser.cpp parser/qmldirparser_p.h + parser/qmlimportresolver.cpp parser/qmlimportresolver_p.h parser/qmljsast.cpp parser/qmljsast_p.h parser/qmljsastfwd_p.h parser/qmljsastvisitor.cpp parser/qmljsastvisitor_p.h diff --git a/src/libs/qmljs/parser/parser.pri b/src/libs/qmljs/parser/parser.pri index 0694a5188b..d27091628c 100644 --- a/src/libs/qmljs/parser/parser.pri +++ b/src/libs/qmljs/parser/parser.pri @@ -3,6 +3,7 @@ HEADERS += \ $$PWD/qmljsastfwd_p.h \ $$PWD/qmljsastvisitor_p.h \ $$PWD/qmljsengine_p.h \ + $$PWD/qmlimportresolver_p.h \ $$PWD/qmljslexer_p.h \ $$PWD/qmljsglobal_p.h \ $$PWD/qmljssourcelocation_p.h \ @@ -16,6 +17,7 @@ SOURCES += \ $$PWD/qmljsast.cpp \ $$PWD/qmljsastvisitor.cpp \ $$PWD/qmljsengine_p.cpp \ + $$PWD/qmlimportresolver.cpp \ $$PWD/qmljslexer.cpp \ $$PWD/qmldirparser.cpp \ $$PWD/qmljsgrammar.cpp \ diff --git a/src/libs/qmljs/parser/qmldirparser.cpp b/src/libs/qmljs/parser/qmldirparser.cpp index 88a5b5f6ab..f8bce96962 100644 --- a/src/libs/qmljs/parser/qmldirparser.cpp +++ b/src/libs/qmljs/parser/qmldirparser.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2016 The Qt Company Ltd. +** Copyright (C) 2021 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of Qt Creator. @@ -102,7 +102,7 @@ void QmlDirParser::clear() _plugins.clear(); _designerSupported = false; _typeInfos.clear(); - _className.clear(); + _classNames.clear(); } inline static void scanSpace(const QChar *&ch) { @@ -258,7 +258,6 @@ bool QmlDirParser::parse(const QString &source) "not %1.").arg(sections[1])); continue; } - } else if (sections[0] == QLatin1String("classname")) { if (sectionCount < 2) { reportError(lineNumber, 0, @@ -267,7 +266,7 @@ bool QmlDirParser::parse(const QString &source) continue; } - _className = sections[1]; + _classNames.append(sections[1]); } else if (sections[0] == QLatin1String("internal")) { if (sectionCount != 3) { @@ -308,19 +307,38 @@ bool QmlDirParser::parse(const QString &source) QStringLiteral("typeinfo requires 1 argument, but %1 were provided").arg(sectionCount - 1)); continue; } -#ifdef QT_CREATOR - TypeInfo typeInfo(sections[1]); - _typeInfos.append(typeInfo); -#endif - + _typeInfos.append(sections[1]); } else if (sections[0] == QLatin1String("designersupported")) { if (sectionCount != 1) reportError(lineNumber, 0, QStringLiteral("designersupported does not expect any argument")); else _designerSupported = true; - } else if (sections[0] == QLatin1String("depends") || sections[0] == QLatin1String("import")) { + } else if (sections[0] == QLatin1String("import") + || sections[0] == QLatin1String("depends")) { if (!readImport(sections, sectionCount, Import::Default)) continue; + } else if (sections[0] == QLatin1String("prefer")) { + if (sectionCount < 2) { + reportError(lineNumber, 0, + QStringLiteral("prefer directive requires one argument, " + "but %1 were provided").arg(sectionCount - 1)); + continue; + } + + if (!_preferredPath.isEmpty()) { + reportError(lineNumber, 0, QStringLiteral( + "only one prefer directive may be defined in a qmldir file")); + continue; + } + + if (!sections[1].endsWith(u'/')) { + // Yes. People should realize it's a directory. + reportError(lineNumber, 0, QStringLiteral( + "the preferred directory has to end with a '/'")); + continue; + } + + _preferredPath = sections[1]; } else if (sectionCount == 2) { // No version specified (should only be used for relative qmldir files) const Component entry(sections[0], sections[1], -1, -1); @@ -361,14 +379,6 @@ void QmlDirParser::reportError(quint16 line, quint16 column, const QString &desc _errors.append(error); } -bool QmlDirParser::hasError() const -{ - if (! _errors.isEmpty()) - return true; - - return false; -} - void QmlDirParser::setError(const QmlJS::DiagnosticMessage &e) { _errors.clear(); @@ -388,56 +398,6 @@ QList QmlDirParser::errors(const QString &uri) const return errors; } -QString QmlDirParser::typeNamespace() const -{ - return _typeNamespace; -} - -void QmlDirParser::setTypeNamespace(const QString &s) -{ - _typeNamespace = s; -} - -QList QmlDirParser::plugins() const -{ - return _plugins; -} - -QMultiHash QmlDirParser::components() const -{ - return _components; -} - -QList QmlDirParser::dependencies() const -{ - return _dependencies; -} - -QList QmlDirParser::imports() const -{ - return _imports; -} - -QList QmlDirParser::scripts() const -{ - return _scripts; -} - -QList QmlDirParser::typeInfos() const -{ - return _typeInfos; -} - -bool QmlDirParser::designerSupported() const -{ - return _designerSupported; -} - -QString QmlDirParser::className() const -{ - return _className; -} - QDebug &operator<< (QDebug &debug, const QmlDirParser::Component &component) { const QString output = QStringLiteral("{%1 %2.%3}"). diff --git a/src/libs/qmljs/parser/qmldirparser_p.h b/src/libs/qmljs/parser/qmldirparser_p.h index 5576cfa515..21315fd71c 100644 --- a/src/libs/qmljs/parser/qmldirparser_p.h +++ b/src/libs/qmljs/parser/qmldirparser_p.h @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2016 The Qt Company Ltd. +** Copyright (C) 2021 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of Qt Creator. @@ -55,12 +55,12 @@ public: void clear(); bool parse(const QString &source); - bool hasError() const; + bool hasError() const { return !_errors.isEmpty(); } void setError(const QmlJS::DiagnosticMessage &); QList errors(const QString &uri) const; - QString typeNamespace() const; - void setTypeNamespace(const QString &s); + QString typeNamespace() const { return _typeNamespace; } + void setTypeNamespace(const QString &s) { _typeNamespace = s; } static void checkNonRelative(const char *item, const QString &typeName, const QString &fileName) { @@ -141,25 +141,16 @@ public: Flags flags; }; - QMultiHash components() const; - QList dependencies() const; - QList imports() const; - QList