diff options
author | Eike Ziller <eike.ziller@qt.io> | 2020-08-10 14:23:50 +0200 |
---|---|---|
committer | Eike Ziller <eike.ziller@qt.io> | 2020-08-10 15:56:54 +0200 |
commit | 3944162039d9cea30384a0d867afab35cc3bfabf (patch) | |
tree | ec07f797055a69823f47edff588f5dc82a1dfeca | |
parent | 84e4b3af31364973c44ad52c8c01430d42f996a4 (diff) | |
parent | acadee710e00cca55736db864263bdcdcbac31a6 (diff) |
Merge remote-tracking branch 'origin/4.13' into master
Conflicts:
cmake/QtCreatorIDEBranding.cmake
qbs/modules/qtc/qtc.qbs
qtcreator_ide_branding.pri
src/plugins/cmakeprojectmanager/cmakebuildstep.cpp
src/plugins/cmakeprojectmanager/cmakebuildstep.h
tests/auto/debugger/tst_namedemangler.cpp
tests/auto/qml/codemodel/check/tst_check.cpp
Change-Id: Iefd5f71c03c0078513b76a92af764a4fb22ee4c2
205 files changed, 6078 insertions, 10090 deletions
@@ -258,7 +258,7 @@ http://llvm.org/docs/GettingStarted.html#git-mirror: 1. Clone LLVM/Clang and checkout a suitable branch - git clone -b release_80-based --recursive https://code.qt.io/clang/llvm-project.git + git clone -b release_100-based --recursive https://code.qt.io/clang/llvm-project.git 2. Build and install LLVM/Clang @@ -278,7 +278,7 @@ http://llvm.org/docs/GettingStarted.html#git-mirror: For Windows: cmake ^ - -G "NMake Makefiles JOM" ^ + -G Ninja ^ -D CMAKE_BUILD_TYPE=Release ^ -D LLVM_ENABLE_RTTI=ON ^ -D LLVM_ENABLE_PROJECTS="clang;clang-tools-extra" ^ @@ -290,7 +290,7 @@ http://llvm.org/docs/GettingStarted.html#git-mirror: The ClangFormat plugin depends on the additional patch - https://code.qt.io/cgit/clang/clang.git/commit/?h=release_80-based&id=fa1b9053729ec6a4425a44ec5502dd388928274a + https://code.qt.io/cgit/clang/llvm-project.git/commit/?h=release_100-based&id=9b992a0f7f160dd6c75f20a4dcfcf7c60a4894df While the plugin builds without it, it will be disabled on start with an error message. diff --git a/cmake/Findyaml-cpp.cmake b/cmake/Findyaml-cpp.cmake index 3d5828ebd8..d8e92f070d 100644 --- a/cmake/Findyaml-cpp.cmake +++ b/cmake/Findyaml-cpp.cmake @@ -15,7 +15,7 @@ if (yaml-cpp_FOUND) unset(yaml_cpp_include_dir CACHE) find_path(yaml_cpp_include_dir yaml-cpp/yaml.h) endif() - target_include_directories(yaml-cpp INTERFACE ${yaml_cpp_include_dir}) + set_target_properties(yaml-cpp PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${yaml_cpp_include_dir}") else() set(yaml-cpp_FOUND 1) set_package_properties(yaml-cpp PROPERTIES DESCRIPTION "using internal src/libs/3rdparty/yaml-cpp") diff --git a/dist/changes-4.13.0.md b/dist/changes-4.13.0.md index b526ee54a3..c9d7affb56 100644 --- a/dist/changes-4.13.0.md +++ b/dist/changes-4.13.0.md @@ -37,6 +37,7 @@ Editing * Added editor tool button for `Analyze File` (QTCREATORBUG-23348) * Added `Add forward declaration` refactoring action (QTCREATORBUG-23444) * Extended `Add Include` refactoring action to non-Qt classes (QTCREATORBUG-21) +* Fixed MSVC detection with some locale settings (QTCREATORBUG-24311) * Fixed indentation with C++11 list initialization (QTCREATORBUG-16977, QTCREATORBUG-24035) * Fixed indentation with trailing return types (QTCREATORBUG-23502) * Fixed issue with `std::chrono::time_point` (QTCREATORBUG-24067) @@ -69,6 +70,7 @@ Editing ### Python * Added tool button for opening interactive Python, optionally importing current file +* Fixed highlighting of parentheses ### Diff Viewer @@ -121,6 +123,7 @@ Debugging --------- * Added option to reset all formats for watches to default +* Added option to override sysroot setting when starting or attaching to external application Analyzer -------- @@ -130,6 +133,7 @@ Analyzer * Re-added editor text marks for diagnostics (QTCREATORBUG-23349) * Changed to use separate `clazy-standalone` executable * Fixed issue with `clang-tidy` and `WarningsAsErrors` (QTCREATORBUG-23423) +* Fixed output parsing of `clazy` Version Control Systems ----------------------- @@ -142,7 +146,7 @@ Version Control Systems Test Integration ---------------- -* Added support for Catch test framework (QTCREATORBUG-19740) +* Added support for Catch2 test framework (QTCREATORBUG-19740) ### Google Test @@ -163,6 +167,7 @@ Platforms * Removed Ministro deployment option (QTCREATORBUG-23761) * Added service editor to manifest editor (QTCREATORBUG-23937) * Added splash screen editor to manifest editor (QTCREATORBUG-24011, QTCREATORBUG-24013) +* Fixed QML debugging and profiling (QTCREATORBUG-24155) * Fixed debugging on x86 and armv7 architectures (QTCREATORBUG-24191) * Fixed issue with long kit names (QTBUG-83875) diff --git a/doc/qtcreator/src/android/deploying-android.qdoc b/doc/qtcreator/src/android/deploying-android.qdoc index 2437b7aaa2..a730932d62 100644 --- a/doc/qtcreator/src/android/deploying-android.qdoc +++ b/doc/qtcreator/src/android/deploying-android.qdoc @@ -102,7 +102,7 @@ The packages are deployed on the connected Android devices. To switch the device used as a default device for the selected kit, select - \uicontrol Projects > \uicontrol Run > \uicontrol {Deploy to Android device} + \uicontrol Projects > \uicontrol Run > \uicontrol {Deploy to Android Device} > \uicontrol {Reset Default Devices}. The setting applies until you restart \QC. For more information, see \l{Selecting Android Devices}. diff --git a/doc/qtcreator/src/editors/creator-diff-editor.qdoc b/doc/qtcreator/src/editors/creator-diff-editor.qdoc index ca73e3b0f0..6614729293 100644 --- a/doc/qtcreator/src/editors/creator-diff-editor.qdoc +++ b/doc/qtcreator/src/editors/creator-diff-editor.qdoc @@ -75,6 +75,10 @@ \endlist + If \QC cannot detect the encoding of the files to compare, an info bar + appears that displays the option to reload the document using some other + encoding. For more information, see \l {File Encoding}. + \section1 Viewing the Changes \image creator-diff-editor.png "Diff editor output in the Edit mode" diff --git a/doc/qtcreator/src/projects/creator-only/creator-projects-creating.qdoc b/doc/qtcreator/src/projects/creator-only/creator-projects-creating.qdoc index 4622b2cc45..13080a27ef 100644 --- a/doc/qtcreator/src/projects/creator-only/creator-projects-creating.qdoc +++ b/doc/qtcreator/src/projects/creator-only/creator-projects-creating.qdoc @@ -406,6 +406,9 @@ Select \uicontrol {Add Files} to locate and add individual files. + To list the folders and files in ascending alphabetic order in the source + tree, select \uicontrol {Sort Alphabetically} in the context menu. + By default, resources are accessible in the application under the same file name as they have in the source tree, with a \c{:/} prefix, or by a URL with a \c qrc scheme. To specify a path prefix for all files in the \c .qrc file, diff --git a/scripts/deployqt.py b/scripts/deployqt.py index 5d7011e068..851a642633 100755 --- a/scripts/deployqt.py +++ b/scripts/deployqt.py @@ -253,25 +253,29 @@ def deploy_libclang(install_dir, llvm_install_dir, chrpath_bin): clangbindirtarget)) resourcetarget = os.path.join(clanglibdirtarget, 'clang') else: + # libclang -> Qt Creator libraries libsources = glob(os.path.join(llvm_install_dir, 'lib', 'libclang.so*')) for libsource in libsources: deployinfo.append((libsource, os.path.join(install_dir, 'lib', 'qtcreator'))) - clangbinary = os.path.join(llvm_install_dir, 'bin', 'clang') - clangdbinary = os.path.join(llvm_install_dir, 'bin', 'clangd') - clangtidybinary = os.path.join(llvm_install_dir, 'bin', 'clang-tidy') - clazybinary = os.path.join(llvm_install_dir, 'bin', 'clazy-standalone') + # clang binaries -> clang libexec clangbinary_targetdir = os.path.join(install_dir, 'libexec', 'qtcreator', 'clang', 'bin') if not os.path.exists(clangbinary_targetdir): os.makedirs(clangbinary_targetdir) - deployinfo.append((clangbinary, clangbinary_targetdir)) - deployinfo.append((clangdbinary, clangbinary_targetdir)) - deployinfo.append((clangtidybinary, clangbinary_targetdir)) - deployinfo.append((clazybinary, clangbinary_targetdir)) - # copy link target if clang is actually a symlink - if os.path.islink(clangbinary): - linktarget = os.readlink(clangbinary) - deployinfo.append((os.path.join(os.path.dirname(clangbinary), linktarget), - os.path.join(clangbinary_targetdir, linktarget))) + for binary in ['clang', 'clangd', 'clang-tidy', 'clazy-standalone']: + binary_filepath = os.path.join(llvm_install_dir, 'bin', binary) + deployinfo.append((binary_filepath, clangbinary_targetdir)) + # add link target if binary is actually a symlink (to a binary in the same directory) + if os.path.islink(binary_filepath): + linktarget = os.readlink(binary_filepath) + deployinfo.append((os.path.join(os.path.dirname(binary_filepath), linktarget), + os.path.join(clangbinary_targetdir, linktarget))) + clanglibs_targetdir = os.path.join(install_dir, 'libexec', 'qtcreator', 'clang', 'lib') + # support libraries (for clazy) -> clang libexec + if not os.path.exists(clanglibs_targetdir): + os.makedirs(clanglibs_targetdir) + for lib_pattern in ['ClazyPlugin.so', 'libclang-cpp.so*']: + for lib in glob(os.path.join(llvm_install_dir, 'lib', lib_pattern)): + deployinfo.append((lib, clanglibs_targetdir)) resourcetarget = os.path.join(install_dir, 'libexec', 'qtcreator', 'clang', 'lib', 'clang') print("copying libclang...") @@ -281,10 +285,15 @@ def deploy_libclang(install_dir, llvm_install_dir, chrpath_bin): if common.is_linux_platform(): # libclang was statically compiled, so there is no need for the RPATHs - # and they are confusing when fixing RPATHs later in the process - print("removing libclang RPATHs...") + # and they are confusing when fixing RPATHs later in the process. + # Also fix clazy-standalone RPATH. + print("fixing Clang RPATHs...") for source, target in deployinfo: - if not os.path.islink(target): + filename = os.path.basename(source) + targetfilepath = target if not os.path.isdir(target) else os.path.join(target, filename) + if filename == 'clazy-standalone': + subprocess.check_call([chrpath_bin, '-r', '$ORIGIN/../lib', targetfilepath]) + elif not os.path.islink(target): targetfilepath = target if not os.path.isdir(target) else os.path.join(target, os.path.basename(source)) subprocess.check_call([chrpath_bin, '-d', targetfilepath]) diff --git a/scripts/deployqtHelper_mac.sh b/scripts/deployqtHelper_mac.sh index 8844f8502d..f91423accb 100755 --- a/scripts/deployqtHelper_mac.sh +++ b/scripts/deployqtHelper_mac.sh @@ -133,6 +133,8 @@ if [ $LLVM_INSTALL_DIR ]; then mkdir -p "$libexec_path/clang/lib" cp -Rf "$LLVM_INSTALL_DIR"/lib/libclang.*dylib "$app_path/Contents/Frameworks/" || exit 1 cp -Rf "$LLVM_INSTALL_DIR"/lib/clang "$libexec_path/clang/lib/" || exit 1 + cp -Rf "$LLVM_INSTALL_DIR"/lib/libclang-cpp.dylib "$libexec_path/clang/lib/" || exit 1 + cp -Rf "$LLVM_INSTALL_DIR"/lib/ClazyPlugin.dylib "$libexec_path/clang/lib/" || exit 1 clangsource="$LLVM_INSTALL_DIR"/bin/clang clanglinktarget="$(readlink "$clangsource")" cp -Rf "$clangsource" "$libexec_path/clang/bin/" || exit 1 @@ -145,6 +147,7 @@ if [ $LLVM_INSTALL_DIR ]; then cp -Rf "$clangtidysource" "$libexec_path/clang/bin/" || exit 1 clazysource="$LLVM_INSTALL_DIR"/bin/clazy-standalone cp -Rf "$clazysource" "$libexec_path/clang/bin/" || exit 1 + install_name_tool -add_rpath "@executable_path/../lib" "$libexec_path/clang/bin/clazy-standalone" || exit 1 fi clangbackendArgument="-executable=$libexec_path/clangbackend" clangpchmanagerArgument="-executable=$libexec_path/clangpchmanagerbackend" diff --git a/share/qtcreator/debugger/cdbbridge.py b/share/qtcreator/debugger/cdbbridge.py index aa76d69892..8f2dbada3b 100644 --- a/share/qtcreator/debugger/cdbbridge.py +++ b/share/qtcreator/debugger/cdbbridge.py @@ -110,7 +110,10 @@ class Dumper(DumperBase): # There is no cdb api for the size of bitfields. # Workaround this issue by parsing the native debugger text for integral types. if val.type.code == TypeCode.Integral: - integerString = nativeValue.nativeDebuggerValue() + try: + integerString = nativeValue.nativeDebuggerValue() + except UnicodeDecodeError: + integerString = '' # cannot decode - read raw if integerString == 'true': val.ldata = int(1).to_bytes(1, byteorder='little') elif integerString == 'false': diff --git a/share/qtcreator/debugger/dumper.py b/share/qtcreator/debugger/dumper.py index e66900c1ef..42dd8e9ba8 100644 --- a/share/qtcreator/debugger/dumper.py +++ b/share/qtcreator/debugger/dumper.py @@ -2903,11 +2903,11 @@ class DumperBase(): return dd(intval, self.laddress, form) def display(self): + if self.ldisplay is not None: + return self.ldisplay simple = self.value() if simple is not None: return str(simple) - if self.ldisplay is not None: - return self.ldisplay #if self.ldata is not None: # if sys.version_info[0] == 2 and isinstance(self.ldata, buffer): # return bytes(self.ldata).encode('hex') diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/AxisHelperArm.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/AxisHelperArm.qml index 0fd5ad1e98..0121938cad 100644 --- a/share/qtcreator/qml/qmlpuppet/mockfiles/AxisHelperArm.qml +++ b/share/qtcreator/qml/qmlpuppet/mockfiles/AxisHelperArm.qml @@ -45,7 +45,7 @@ Node { source: "meshes/axishelper.mesh" materials: DefaultMaterial { id: posMat - emissiveColor: posModel.hovering ? armRoot.hoverColor : armRoot.color + diffuseColor: posModel.hovering ? armRoot.hoverColor : armRoot.color lighting: DefaultMaterial.NoLighting } pickable: true @@ -62,7 +62,7 @@ Node { scale: Qt.vector3d(0.025, 0.025, 0.025) materials: DefaultMaterial { id: negMat - emissiveColor: negModel.hovering ? armRoot.hoverColor : armRoot.color + diffuseColor: negModel.hovering ? armRoot.hoverColor : armRoot.color lighting: DefaultMaterial.NoLighting } pickable: true diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/CameraFrustum.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/CameraFrustum.qml index 0ba02e362b..22c404ff67 100644 --- a/share/qtcreator/qml/qmlpuppet/mockfiles/CameraFrustum.qml +++ b/share/qtcreator/qml/qmlpuppet/mockfiles/CameraFrustum.qml @@ -48,7 +48,7 @@ Model { materials: [ DefaultMaterial { id: defaultMaterial - emissiveColor: cameraFrustum.selected ? "#FF0000" : "#555555" + diffuseColor: cameraFrustum.selected ? "#FF0000" : "#555555" lighting: DefaultMaterial.NoLighting cullMode: Material.NoCulling } diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/DirectionalDraggable.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/DirectionalDraggable.qml index e88b9c4c51..29548bee1e 100644 --- a/share/qtcreator/qml/qmlpuppet/mockfiles/DirectionalDraggable.qml +++ b/share/qtcreator/qml/qmlpuppet/mockfiles/DirectionalDraggable.qml @@ -31,7 +31,7 @@ Model { id: rootModel property View3D view3D - property alias color: material.emissiveColor + property alias color: material.diffuseColor property Node targetNode: null property bool dragging: mouseAreaYZ.dragging || mouseAreaXZ.dragging property bool active: false @@ -52,7 +52,7 @@ Model { DefaultMaterial { id: material - emissiveColor: "white" + diffuseColor: "white" lighting: DefaultMaterial.NoLighting } diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/EditView3D.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/EditView3D.qml index 2bf81b837f..95245aae5e 100644 --- a/share/qtcreator/qml/qmlpuppet/mockfiles/EditView3D.qml +++ b/share/qtcreator/qml/qmlpuppet/mockfiles/EditView3D.qml @@ -202,7 +202,7 @@ Item { if ("transformMode" in toolStates) transformMode = toolStates.transformMode; else if (resetToDefault) - selectionMode = EditView3D.TransformMode.Move; + transformMode = EditView3D.TransformMode.Move; if ("editCamState" in toolStates) cameraControl.restoreCameraState(toolStates.editCamState); @@ -266,8 +266,10 @@ Item { { var theObject = object; if (selectionMode === EditView3D.SelectionMode.Group) { - while (theObject && theObject !== activeScene && theObject.parent !== activeScene) + while (theObject && theObject !== activeScene + && (activeScene instanceof Model || theObject.parent !== activeScene)) { theObject = theObject.parent; + } } // Object selection logic: // Regular click: Clear any multiselection, single-selects the clicked object @@ -487,6 +489,12 @@ Item { position: moveGizmo.scenePosition } + AutoScaleHelper { + id: pivotAutoScale + view3D: overlayView + position: pivotLine.startPos + } + Line3D { id: pivotLine visible: viewRoot.selectedNode @@ -513,14 +521,14 @@ Item { Model { id: pivotCap source: "#Sphere" - scale: autoScale.getScale(Qt.vector3d(0.03, 0.03, 0.03)) + scale: pivotAutoScale.getScale(Qt.vector3d(0.03, 0.03, 0.03)) position: pivotLine.startPos materials: [ DefaultMaterial { id: lineMat lighting: DefaultMaterial.NoLighting cullMode: Material.NoCulling - emissiveColor: pivotLine.color + diffuseColor: pivotLine.color } ] } diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/HelperGrid.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/HelperGrid.qml index 70e6e82ee3..dbd7f38523 100644 --- a/share/qtcreator/qml/qmlpuppet/mockfiles/HelperGrid.qml +++ b/share/qtcreator/qml/qmlpuppet/mockfiles/HelperGrid.qml @@ -47,7 +47,7 @@ Node { materials: [ DefaultMaterial { id: mainGridMaterial - emissiveColor: "#aaaaaa" + diffuseColor: "#aaaaaa" lighting: DefaultMaterial.NoLighting cullMode: Material.NoCulling } @@ -65,7 +65,7 @@ Node { materials: [ DefaultMaterial { id: subGridMaterial - emissiveColor: mainGridMaterial.emissiveColor + diffuseColor: mainGridMaterial.diffuseColor lighting: DefaultMaterial.NoLighting cullMode: Material.NoCulling } @@ -82,7 +82,7 @@ Node { materials: [ DefaultMaterial { id: vCenterLineMaterial - emissiveColor: "#00a1d2" + diffuseColor: "#00a1d2" lighting: DefaultMaterial.NoLighting cullMode: Material.NoCulling } @@ -99,7 +99,7 @@ Node { materials: [ DefaultMaterial { id: hCenterLineMaterial - emissiveColor: "#cb211a" + diffuseColor: "#cb211a" lighting: DefaultMaterial.NoLighting cullMode: Material.NoCulling } diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/LightGizmo.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/LightGizmo.qml index ee1c5017ef..2e9791dc28 100644 --- a/share/qtcreator/qml/qmlpuppet/mockfiles/LightGizmo.qml +++ b/share/qtcreator/qml/qmlpuppet/mockfiles/LightGizmo.qml @@ -336,7 +336,7 @@ Node { DefaultMaterial { id: lightMaterial - emissiveColor: lightGizmo.color + diffuseColor: lightGizmo.color lighting: DefaultMaterial.NoLighting cullMode: Material.NoCulling } diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/Line3D.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/Line3D.qml index 79718d042f..f9af707057 100644 --- a/share/qtcreator/qml/qmlpuppet/mockfiles/Line3D.qml +++ b/share/qtcreator/qml/qmlpuppet/mockfiles/Line3D.qml @@ -33,7 +33,7 @@ Node { property alias startPos: lineGeometry.startPos property alias endPos: lineGeometry.endPos property alias name: lineGeometry.name // Name must be unique for each line - property alias color: lineMat.emissiveColor + property alias color: lineMat.diffuseColor Model { geometry: LineGeometry { diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/PlanarDraggable.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/PlanarDraggable.qml index 41a44f2386..0d66033eaa 100644 --- a/share/qtcreator/qml/qmlpuppet/mockfiles/PlanarDraggable.qml +++ b/share/qtcreator/qml/qmlpuppet/mockfiles/PlanarDraggable.qml @@ -31,7 +31,7 @@ Model { id: rootModel property View3D view3D - property alias color: gizmoMaterial.emissiveColor + property alias color: gizmoMaterial.diffuseColor property alias priority: mouseArea.priority property Node targetNode: null property bool dragging: mouseArea.dragging @@ -53,7 +53,7 @@ Model { DefaultMaterial { id: gizmoMaterial - emissiveColor: "white" + diffuseColor: "white" lighting: DefaultMaterial.NoLighting cullMode: Material.NoCulling } diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/RotateGizmo.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/RotateGizmo.qml index 8ed85f3296..6fccfbcdc7 100644 --- a/share/qtcreator/qml/qmlpuppet/mockfiles/RotateGizmo.qml +++ b/share/qtcreator/qml/qmlpuppet/mockfiles/RotateGizmo.qml @@ -175,7 +175,7 @@ Node { source: "#Sphere" materials: DefaultMaterial { id: material - emissiveColor: "black" + diffuseColor: "black" opacity: mouseAreaFree.hovering ? 0.15 : 0 lighting: DefaultMaterial.NoLighting } diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/RotateRing.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/RotateRing.qml index fc803c679a..00494a5d91 100644 --- a/share/qtcreator/qml/qmlpuppet/mockfiles/RotateRing.qml +++ b/share/qtcreator/qml/qmlpuppet/mockfiles/RotateRing.qml @@ -31,7 +31,7 @@ Model { id: rotateRing property View3D view3D - property alias color: material.emissiveColor + property alias color: material.diffuseColor property Node targetNode: null property bool dragging: mouseAreaMain.dragging property bool active: false @@ -60,7 +60,7 @@ Model { materials: DefaultMaterial { id: material - emissiveColor: "white" + diffuseColor: "white" lighting: DefaultMaterial.NoLighting } diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/ScaleGizmo.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/ScaleGizmo.qml index ff64957699..076f8d53a6 100644 --- a/share/qtcreator/qml/qmlpuppet/mockfiles/ScaleGizmo.qml +++ b/share/qtcreator/qml/qmlpuppet/mockfiles/ScaleGizmo.qml @@ -170,7 +170,7 @@ Node { scale: Qt.vector3d(0.024, 0.024, 0.024) materials: DefaultMaterial { id: material - emissiveColor: highlightOnHover + diffuseColor: highlightOnHover && (centerMouseArea.hovering || centerMouseArea.dragging) ? Qt.lighter(Qt.rgba(0.5, 0.5, 0.5, 1)) : Qt.rgba(0.5, 0.5, 0.5, 1) diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/ScaleRod.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/ScaleRod.qml index ead4f1458d..fcdf4a7415 100644 --- a/share/qtcreator/qml/qmlpuppet/mockfiles/ScaleRod.qml +++ b/share/qtcreator/qml/qmlpuppet/mockfiles/ScaleRod.qml @@ -44,7 +44,7 @@ DirectionalDraggable { scale: Qt.vector3d(0.020, 0.020, 0.020) materials: DefaultMaterial { id: material - emissiveColor: scaleRod.color + diffuseColor: scaleRod.color lighting: DefaultMaterial.NoLighting } } diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/SelectionBox.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/SelectionBox.qml index 739c7a6d34..201d1a6377 100644 --- a/share/qtcreator/qml/qmlpuppet/mockfiles/SelectionBox.qml +++ b/share/qtcreator/qml/qmlpuppet/mockfiles/SelectionBox.qml @@ -56,7 +56,7 @@ Node { materials: [ DefaultMaterial { - emissiveColor: "#fff600" + diffuseColor: "#fff600" lighting: DefaultMaterial.NoLighting cullMode: Material.NoCulling } diff --git a/share/qtcreator/qmldesigner/itemLibraryQmlSources/ItemDelegate.qml b/share/qtcreator/qmldesigner/itemLibraryQmlSources/ItemDelegate.qml index cd3ddef34d..1cbec5d802 100644 --- a/share/qtcreator/qmldesigner/itemLibraryQmlSources/ItemDelegate.qml +++ b/share/qtcreator/qmldesigner/itemLibraryQmlSources/ItemDelegate.qml @@ -23,9 +23,8 @@ ** ****************************************************************************/ -import QtQuick 2.1 -import QtQuick.Controls 1.1 -import QtQuick.Controls.Styles 1.0 +import QtQuick 2.15 +import QtQuick.Controls 2.15 import QtQuickDesignerTheme 1.0 import HelperWidgets 2.0 @@ -76,8 +75,6 @@ Item { id: mouseRegion anchors.fill: parent tooltip: itemName - - onPressed: { rootView.startDragAndDrop(mouseRegion, itemLibraryEntry) } diff --git a/share/qtcreator/qmldesigner/itemLibraryQmlSources/ItemsView.qml b/share/qtcreator/qmldesigner/itemLibraryQmlSources/ItemsView.qml index 30b741f99d..c761952693 100644 --- a/share/qtcreator/qmldesigner/itemLibraryQmlSources/ItemsView.qml +++ b/share/qtcreator/qmldesigner/itemLibraryQmlSources/ItemsView.qml @@ -23,15 +23,11 @@ ** ****************************************************************************/ -import QtQuick 2.1 -import QtQuick.Controls 1.1 -import QtQuick.Controls.Styles 1.0 -import "../common" - -import QtQuick.Layouts 1.0 -import HelperWidgets 2.0 - +import QtQuick 2.15 +import QtQuick.Layouts 1.15 import QtQuickDesignerTheme 1.0 +import HelperWidgets 2.0 +import StudioTheme 1.0 as StudioTheme /* The view displaying the item grid. @@ -65,9 +61,6 @@ ScrollView { Item { id: styleConstants - readonly property color backgroundColor: Theme.qmlDesignerBackgroundColorDarkAlternate() - readonly property color lighterBackgroundColor: Theme.color(Theme.FancyToolBarSeparatorColor) - property int textWidth: 58 property int textHeight: Theme.smallFontPixelSize() * 2 @@ -81,48 +74,37 @@ ScrollView { 2 * cellVerticalMargin + cellVerticalSpacing } - Rectangle { - id: background - anchors.fill: parent - color: styleConstants.backgroundColor - } - - style: DesignerScrollViewStyle { - - } - - Flickable { - contentHeight: column.height - Column { - id: column - Repeater { - model: itemLibraryModel // to be set in Qml context - delegate: Section { - width: itemsView.viewport.width - caption: sectionName // to be set by model - visible: sectionVisible - topPadding: 2 - leftPadding: 2 - rightPadding: 1 - expanded: sectionExpanded - onExpandedChanged: itemLibraryModel.setExpanded(expanded, sectionName); - Grid { - id: itemGrid - - columns: parent.width / styleConstants.cellWidth - property int flexibleWidth: (parent.width - styleConstants.cellWidth * columns) / columns - - Repeater { - model: sectionEntries - delegate: ItemDelegate { - visible: itemVisible - width: styleConstants.cellWidth + itemGrid.flexibleWidth - height: styleConstants.cellHeight - } + Column { + id: column + Repeater { + model: itemLibraryModel // to be set in Qml context + delegate: Section { + width: itemsView.width - + (itemsView.verticalScrollBarVisible ? StudioTheme.Values.scrollBarThickness : 0) + caption: sectionName // to be set by model + visible: sectionVisible + topPadding: 2 + leftPadding: 2 + rightPadding: 1 + expanded: sectionExpanded + onExpandedChanged: itemLibraryModel.setExpanded(expanded, sectionName); + Grid { + id: itemGrid + + columns: parent.width / styleConstants.cellWidth + property int flexibleWidth: (parent.width - styleConstants.cellWidth * columns) / columns + + Repeater { + model: sectionEntries + delegate: ItemDelegate { + visible: itemVisible + width: styleConstants.cellWidth + itemGrid.flexibleWidth + height: styleConstants.cellHeight } } } } } } + } diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/QtQuick/AdvancedSection.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/QtQuick/AdvancedSection.qml index a37af55dbb..f5a51b7383 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/QtQuick/AdvancedSection.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/QtQuick/AdvancedSection.qml @@ -33,7 +33,7 @@ Section { caption: qsTr("Advanced") SectionLayout { - rows: 4 + columns: 2 Label { text: qsTr("Origin") @@ -171,7 +171,6 @@ Section { backendValue: backendValues.focus text: backendValues.focus.valueToString enabled: backendValues.focus.isAvailable - implicitWidth: 180 } ExpandingSpacer { } @@ -187,7 +186,6 @@ Section { backendValue: backendValues.activeFocusOnTab text: backendValues.activeFocusOnTab.valueToString enabled: backendValues.activeFocusOnTab.isAvailable - implicitWidth: 180 } ExpandingSpacer { } diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/QtQuick/AlignDistributeSection.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/QtQuick/AlignDistributeSection.qml index 36f4c02642..e21879057b 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/QtQuick/AlignDistributeSection.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/QtQuick/AlignDistributeSection.qml @@ -32,10 +32,10 @@ import StudioTheme 1.0 as StudioTheme Section { anchors.left: parent.left anchors.right: parent.right + caption: qsTr("Align") - ColumnLayout { - width: parent.width + SectionLayout { enabled: alignDistribute.multiSelection && !alignDistribute.selectionHasAnchors && alignDistribute.selectionExclusivlyItems && @@ -49,8 +49,11 @@ Section { Label { text: qsTr("Align objects") width: 120 + Layout.columnSpan: 2 } + RowLayout { + Layout.columnSpan: 2 Row { spacing: -StudioTheme.Values.border AbstractButton { @@ -105,8 +108,11 @@ Section { Label { text: qsTr("Distribute objects") width: 120 + Layout.columnSpan: 2 } + RowLayout { + Layout.columnSpan: 2 Row { spacing: -StudioTheme.Values.border AbstractButton { @@ -161,8 +167,11 @@ Section { Label { text: qsTr("Distribute spacing") width: 120 + Layout.columnSpan: 2 } + RowLayout { + Layout.columnSpan: 2 Row { spacing: -StudioTheme.Values.border AbstractButton { @@ -242,18 +251,16 @@ Section { } } - SectionLayout { - columns: 2 - - ItemFilterModel { - id: itemFilterModel - modelNodeBackendProperty: modelNodeBackend - selectionOnly: true - } + ItemFilterModel { + id: itemFilterModel + modelNodeBackendProperty: modelNodeBackend + selectionOnly: true + } - Label { - text: qsTr("Align to") - } + Label { + text: qsTr("Align to") + } + SecondColumnLayout { ComboBox { id: alignToComboBox Layout.fillWidth: true @@ -267,9 +274,14 @@ Section { } } - Label { - text: qsTr("Key object") + ExpandingSpacer { } + } + + Label { + text: qsTr("Key object") + } + SecondColumnLayout { ComboBox { id: keyObjectComboBox enabled: alignToComboBox.currentIndex === 2 @@ -285,11 +297,15 @@ Section { lastSelectedItem = "" // TODO } } + + ExpandingSpacer { + } } SectionLayout { columns: 1 Layout.topMargin: 30 + Layout.columnSpan: 2 visible: alignDistribute.multiSelection && (alignDistribute.selectionHasAnchors || !alignDistribute.selectionExclusivlyItems || diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/QtQuick/AnchorRow.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/QtQuick/AnchorRow.qml index 7d18d6a1f9..406e5af011 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/QtQuick/AnchorRow.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/QtQuick/AnchorRow.qml @@ -23,9 +23,9 @@ ** ****************************************************************************/ -import QtQuick 2.0 +import QtQuick 2.15 import HelperWidgets 2.0 -import QtQuick.Layouts 1.0 +import QtQuick.Layouts 1.15 import QtQuickDesignerTheme 1.0 import StudioControls 1.0 as StudioControls @@ -34,11 +34,9 @@ import StudioTheme 1.0 as StudioTheme RowLayout { id: anchorRow - anchors.left: parent.left - anchors.right: parent.right opacity: enabled ? 1 : 0.5 - property alias iconSource: icon.source + property alias iconSource: iconLabel.icon property variant anchorMargin @@ -64,8 +62,10 @@ RowLayout { readonly property color __defaultTextColor: StudioTheme.Values.themeTextColor IconLabel { - id: icon + id: iconLabel Layout.alignment: Qt.AlignTop + Layout.topMargin: 4 + Layout.leftMargin: 4 } GridLayout { diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/QtQuick/ItemPane.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/QtQuick/ItemPane.qml index 4415375cef..fd39b0bd2d 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/QtQuick/ItemPane.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/QtQuick/ItemPane.qml @@ -23,10 +23,11 @@ ** ****************************************************************************/ -import QtQuick 2.0 -import HelperWidgets 2.0 -import QtQuick.Layouts 1.0 +import QtQuick 2.15 +import QtQuick.Controls 2.15 +import QtQuick.Layouts 1.15 import QtQuickDesignerTheme 1.0 +import HelperWidgets 2.0 import StudioControls 1.0 as StudioControls import StudioTheme 1.0 as StudioTheme @@ -35,14 +36,15 @@ Rectangle { width: 320 height: 400 color: Theme.qmlDesignerBackgroundColorDarkAlternate() + MouseArea { anchors.fill: parent onClicked: forceActiveFocus() } ScrollView { + clip: true anchors.fill: parent - horizontalScrollBarPolicy: Qt.ScrollBarAlwaysOff Column { y: -1 @@ -57,7 +59,6 @@ Rectangle { SectionLayout { Label { text: qsTr("Type") - } SecondColumnLayout { @@ -65,15 +66,12 @@ Rectangle { RoundedPanel { Layout.fillWidth: true - height: 24 + height: StudioTheme.Values.height Label { - x: 6 anchors.fill: parent - anchors.leftMargin: 16 - + anchors.leftMargin: StudioTheme.Values.inputHorizontalPadding text: backendValues.className.value - verticalAlignment: Text.AlignVCenter } ToolTipArea { anchors.fill: parent @@ -87,10 +85,10 @@ Rectangle { } ExpressionTextField { - z: 2 id: typeLineEdit + z: 2 completeOnlyTypes: true - + replaceCurrentTextByCompletion: true anchors.fill: parent visible: false @@ -98,10 +96,26 @@ Rectangle { showButtons: false fixedSize: true + property bool blockEditingFinished: false + onEditingFinished: { - if (visible) + if (typeLineEdit.blockEditingFinished) + return + + typeLineEdit.blockEditingFinished = true + + if (typeLineEdit.visible) changeTypeName(typeLineEdit.text.trim()) - visible = false + typeLineEdit.visible = false + + typeLineEdit.blockEditingFinished = false + + typeLineEdit.completionList.model = null + } + + onRejected: { + typeLineEdit.visible = false + typeLineEdit.completionList.model = null } } @@ -117,6 +131,7 @@ Rectangle { } SecondColumnLayout { + spacing: 2 LineEdit { id: lineEdit @@ -129,29 +144,55 @@ Rectangle { showExtendedFunctionButton: false enabled: !modelNodeBackend.multiSelection } - // workaround: without this item the lineedit does not shrink to the - // right size after resizing to a wider width - Image { - visible: !modelNodeBackend.multiSelection - Layout.preferredWidth: 20 - Layout.preferredHeight: 20 - horizontalAlignment: Image.AlignHCenter - verticalAlignment: Image.AlignVCenter - source: hasAliasExport ? "image://icons/alias-export-checked" : "image://icons/alias-export-unchecked" + Rectangle { + id: aliasIndicator + color: "transparent" + border.color: "transparent" + implicitWidth: StudioTheme.Values.height + implicitHeight: StudioTheme.Values.height + z: 10 + + Label { + id: aliasIndicatorIcon + enabled: !modelNodeBackend.multiSelection + anchors.fill: parent + text: { + if (!aliasIndicatorIcon.enabled) + return StudioTheme.Constants.idAliasOff + + return hasAliasExport ? StudioTheme.Constants.idAliasOn : StudioTheme.Constants.idAliasOff + } + color: { + if (!aliasIndicatorIcon.enabled) + return StudioTheme.Values.themeTextColorDisabled + + return hasAliasExport ? StudioTheme.Values.themeInteraction : StudioTheme.Values.themeTextColor + } + font.family: StudioTheme.Constants.iconFont.family + font.pixelSize: Math.round(16 * StudioTheme.Values.scaleFactor) + verticalAlignment: Text.AlignVCenter + horizontalAlignment: Text.AlignHCenter + states: [ + State { + name: "hovered" + when: toolTipArea.containsMouse && aliasIndicatorIcon.enabled + PropertyChanges { + target: aliasIndicatorIcon + scale: 1.2 + } + } + ] + } + ToolTipArea { + id: toolTipArea enabled: !modelNodeBackend.multiSelection anchors.fill: parent onClicked: toogleExportAlias() tooltip: qsTr("Exports this item as an alias property of the root item.") } } - Item { //dummy object to preserve layout in case of multiselection - Layout.preferredWidth: 20 - Layout.preferredHeight: 20 - enabled: modelNodeBackend.multiSelection - visible: enabled - } } Label { @@ -280,7 +321,6 @@ Rectangle { Item { width: 10 height: 10 - } CheckBox { @@ -319,88 +359,92 @@ Rectangle { width: 4 } - TabView { + StudioControls.TabBar { + id: tabBar + anchors.left: parent.left anchors.right: parent.right - frameVisible: false - id: tabView + StudioControls.TabButton { + text: backendValues.className.value + } + StudioControls.TabButton { + text: qsTr("Layout") + } + StudioControls.TabButton { + text: qsTr("Advanced") + } + } - height: currentHeight + extraHeight + StackLayout { + anchors.left: parent.left + anchors.right: parent.right + currentIndex: tabBar.currentIndex - property int currentHeight: getTab(currentIndex).item.implicitHeight + property int currentHeight: children[currentIndex].implicitHeight property int extraHeight: 40 - Tab { - title: backendValues.className.value + height: currentHeight + extraHeight + + Column { + anchors.left: parent.left + anchors.right: parent.right - component: Column { + Loader { anchors.left: parent.left anchors.right: parent.right + visible: theSource !== "" - Loader { - anchors.left: parent.left - anchors.right: parent.right - visible: theSource !== "" - - id: specificsTwo; - sourceComponent: specificQmlComponent + id: specificsTwo; + sourceComponent: specificQmlComponent - property string theSource: specificQmlData + property string theSource: specificQmlData - onTheSourceChanged: { - active = false - active = true - } + onTheSourceChanged: { + active = false + active = true } + } - Loader { - anchors.left: parent.left - anchors.right: parent.right + Loader { + anchors.left: parent.left + anchors.right: parent.right - id: specificsOne; - source: specificsUrl; + id: specificsOne; + source: specificsUrl; - property int loaderHeight: specificsOne.item.height + tabView.extraHeight - } + property int loaderHeight: specificsOne.item.height + tabView.extraHeight } } - Tab { - title: qsTr("Layout") - component: Column { - anchors.left: parent.left - anchors.right: parent.right + Column { + anchors.left: parent.left + anchors.right: parent.right - LayoutSection { - } + LayoutSection { + } - MarginSection { - visible: anchorBackend.isInLayout - backendValueTopMargin: backendValues.Layout_topMargin - backendValueBottomMargin: backendValues.Layout_bottomMargin - backendValueLeftMargin: backendValues.Layout_leftMargin - backendValueRightMargin: backendValues.Layout_rightMargin - backendValueMargins: backendValues.Layout_margins - } + MarginSection { + visible: anchorBackend.isInLayout + backendValueTopMargin: backendValues.Layout_topMargin + backendValueBottomMargin: backendValues.Layout_bottomMargin + backendValueLeftMargin: backendValues.Layout_leftMargin + backendValueRightMargin: backendValues.Layout_rightMargin + backendValueMargins: backendValues.Layout_margins + } - AlignDistributeSection { - visible: !anchorBackend.isInLayout - } + AlignDistributeSection { + visible: !anchorBackend.isInLayout } } - Tab { - anchors.fill: parent - title: qsTr("Advanced") - component: Column { - anchors.left: parent.left - anchors.right: parent.right + Column { + anchors.left: parent.left + anchors.right: parent.right - AdvancedSection { - } - LayerSection { - } + AdvancedSection { + } + LayerSection { } } } diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/QtQuick/LayoutSection.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/QtQuick/LayoutSection.qml index 7eeb8d2285..458e394fbf 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/QtQuick/LayoutSection.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/QtQuick/LayoutSection.qml @@ -50,8 +50,8 @@ Section { } AnchorRow { - visible: anchorBackend.topAnchored; - iconSource: "image://icons/anchor-top" + visible: anchorBackend.topAnchored + iconSource: StudioTheme.Constants.anchorTop anchorMargin: backendValues.anchors_topMargin targetName: anchorBackend.topTarget onTargetChanged: { @@ -73,8 +73,8 @@ Section { } AnchorRow { - visible: anchorBackend.bottomAnchored; - iconSource: "image://icons/anchor-bottom" + visible: anchorBackend.bottomAnchored + iconSource: StudioTheme.Constants.anchorBottom anchorMargin: backendValues.anchors_bottomMargin targetName: anchorBackend.bottomTarget onTargetChanged: { @@ -97,8 +97,8 @@ Section { } AnchorRow { - visible: anchorBackend.leftAnchored; - iconSource: "image://icons/anchor-left" + visible: anchorBackend.leftAnchored + iconSource: StudioTheme.Constants.anchorLeft anchorMargin: backendValues.anchors_leftMargin targetName: anchorBackend.leftTarget onTargetChanged: { @@ -120,8 +120,8 @@ Section { } AnchorRow { - visible: anchorBackend.rightAnchored; - iconSource: "image://icons/anchor-right" + visible: anchorBackend.rightAnchored + iconSource: StudioTheme.Constants.anchorRight anchorMargin: backendValues.anchors_rightMargin targetName: anchorBackend.rightTarget onTargetChanged: { @@ -145,8 +145,8 @@ Section { AnchorRow { showAlternativeTargets: false - visible: anchorBackend.horizontalCentered; - iconSource: "image://icons/anchor-horizontal" + visible: anchorBackend.horizontalCentered + iconSource: StudioTheme.Constants.centerHorizontal anchorMargin: backendValues.anchors_horizontalCenterOffset targetName: anchorBackend.horizontalTarget onTargetChanged: { @@ -158,8 +158,8 @@ Section { AnchorRow { showAlternativeTargets: false - visible: anchorBackend.verticalCentered; - iconSource: "image://icons/anchor-vertical" + visible: anchorBackend.verticalCentered + iconSource: StudioTheme.Constants.centerVertical anchorMargin: backendValues.anchors_verticalCenterOffset targetName: anchorBackend.verticalTarget onTargetChanged: { diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/QtQuick/QtObjectPane.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/QtQuick/QtObjectPane.qml index a91a98cdbe..96d22e5a7b 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/QtQuick/QtObjectPane.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/QtQuick/QtObjectPane.qml @@ -23,10 +23,11 @@ ** ****************************************************************************/ -import QtQuick 2.0 -import HelperWidgets 2.0 +import QtQuick 2.15 import QtQuick.Layouts 1.0 import QtQuickDesignerTheme 1.0 +import HelperWidgets 2.0 +import StudioTheme 1.0 as StudioTheme Rectangle { id: itemPane @@ -43,6 +44,7 @@ Rectangle { anchors.fill: parent Column { + id: rootColumn y: -1 width: itemPane.width Section { @@ -54,7 +56,6 @@ Rectangle { SectionLayout { Label { text: qsTr("Type") - } SecondColumnLayout { @@ -62,15 +63,12 @@ Rectangle { RoundedPanel { Layout.fillWidth: true - height: 24 + height: StudioTheme.Values.height Label { - x: 6 anchors.fill: parent - anchors.leftMargin: 16 - + anchors.leftMargin: StudioTheme.Values.inputHorizontalPadding text: backendValues.className.value - verticalAlignment: Text.AlignVCenter } ToolTipArea { anchors.fill: parent @@ -87,7 +85,7 @@ Rectangle { z: 2 id: typeLineEdit completeOnlyTypes: true - + replaceCurrentTextByCompletion: true anchors.fill: parent visible: false @@ -95,17 +93,33 @@ Rectangle { showButtons: false fixedSize: true + property bool blockEditingFinished: false + onEditingFinished: { - if (visible) + if (typeLineEdit.blockEditingFinished) + return + + typeLineEdit.blockEditingFinished = true + + if (typeLineEdit.visible) changeTypeName(typeLineEdit.text.trim()) - visible = false + typeLineEdit.visible = false + + typeLineEdit.blockEditingFinished = false + + typeLineEdit.completionList.model = null + } + + onRejected: { + typeLineEdit.visible = false + typeLineEdit.completionList.model = null } } } Item { - Layout.preferredWidth: 16 - Layout.preferredHeight: 16 + Layout.preferredWidth: 20 + Layout.preferredHeight: 20 } } @@ -114,6 +128,7 @@ Rectangle { } SecondColumnLayout { + spacing: 2 LineEdit { id: lineEdit @@ -127,12 +142,48 @@ Rectangle { enabled: !modelNodeBackend.multiSelection } - Image { - visible: !modelNodeBackend.multiSelection - Layout.preferredWidth: 16 - Layout.preferredHeight: 16 - source: hasAliasExport ? "image://icons/alias-export-checked" : "image://icons/alias-export-unchecked" + Rectangle { + id: aliasIndicator + color: "transparent" + border.color: "transparent" + implicitWidth: StudioTheme.Values.height + implicitHeight: StudioTheme.Values.height + z: 10 + + Label { + id: aliasIndicatorIcon + enabled: !modelNodeBackend.multiSelection + anchors.fill: parent + text: { + if (!aliasIndicatorIcon.enabled) + return StudioTheme.Constants.idAliasOff + + return hasAliasExport ? StudioTheme.Constants.idAliasOn : StudioTheme.Constants.idAliasOff + } + color: { + if (!aliasIndicatorIcon.enabled) + return StudioTheme.Values.themeTextColorDisabled + + return hasAliasExport ? StudioTheme.Values.themeInteraction : StudioTheme.Values.themeTextColor + } + font.family: StudioTheme.Constants.iconFont.family + font.pixelSize: Math.round(16 * StudioTheme.Values.scaleFactor) + verticalAlignment: Text.AlignVCenter + horizontalAlignment: Text.AlignHCenter + states: [ + State { + name: "hovered" + when: toolTipArea.containsMouse && aliasIndicatorIcon.enabled + PropertyChanges { + target: aliasIndicatorIcon + scale: 1.2 + } + } + ] + } + ToolTipArea { + id: toolTipArea enabled: !modelNodeBackend.multiSelection anchors.fill: parent onClicked: toogleExportAlias() @@ -148,69 +199,30 @@ Rectangle { width: 4 } - TabView { + Column { anchors.left: parent.left anchors.right: parent.right - frameVisible: false - - id: tabView - height: Math.max(layoutSectionHeight, specficsHeight) - - property int layoutSectionHeight: 400 - property int specficsOneHeight: 0 - property int specficsTwoHeight: 0 - - property int specficsHeight: Math.max(specficsOneHeight, specficsTwoHeight) - - property int extraHeight: 40 - - Tab { - id: tab - title: backendValues.className.value - - component: Column { - anchors.left: parent.left - anchors.right: parent.right - Loader { - anchors.left: parent.left - anchors.right: parent.right - - visible: theSource !== "" - - id: specificsTwo; - sourceComponent: specificQmlComponent - - property string theSource: specificQmlData - - onTheSourceChanged: { - active = false - active = true - } - - property int loaderHeight: specificsTwo.item.height + tabView.extraHeight - onLoaderHeightChanged: tabView.specficsTwoHeight = loaderHeight - - onLoaded: { - tabView.specficsTwoHeight = loaderHeight - } - } - - Loader { - anchors.left: parent.left - anchors.right: parent.right - - id: specificsOne; - source: specificsUrl; - - property int loaderHeight: specificsOne.item.height + tabView.extraHeight - onLoaderHeightChanged: tabView.specficsHeight = loaderHeight - - onLoaded: { - tabView.specficsOneHeight = loaderHeight - } - } + Loader { + id: specificsTwo + anchors.left: parent.left + anchors.right: parent.right + visible: theSource !== "" + sourceComponent: specificQmlComponent + + property string theSource: specificQmlData + + onTheSourceChanged: { + active = false + active = true } } + + Loader { + id: specificsOne + anchors.left: parent.left + anchors.right: parent.right + source: specificsUrl + } } } } diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/AnchorButtons.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/AnchorButtons.qml index 84d5090125..483c4947f0 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/AnchorButtons.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/AnchorButtons.qml @@ -156,7 +156,7 @@ StudioControls.ButtonRow { buttonIcon: StudioTheme.Constants.centerVertical tooltip: qsTr("Anchor item vertically.") - property bool verticalCentered: anchorBackend.verticalCentered; + property bool verticalCentered: anchorBackend.verticalCentered onVerticalCenteredChanged: { checked = verticalCentered } @@ -179,7 +179,7 @@ StudioControls.ButtonRow { buttonIcon: StudioTheme.Constants.centerHorizontal tooltip: qsTr("Anchor item horizontally.") - property bool horizontalCentered: anchorBackend.horizontalCentered; + property bool horizontalCentered: anchorBackend.horizontalCentered onHorizontalCenteredChanged: { checked = horizontalCentered } diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/Button.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/Button.qml index 5f989d7e5f..a20469966a 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/Button.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/Button.qml @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2016 The Qt Company Ltd. +** Copyright (C) 2020 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of Qt Creator. @@ -23,48 +23,79 @@ ** ****************************************************************************/ -import QtQuick 2.1 -import QtQuick.Controls 1.1 as Controls -import QtQuick.Controls.Styles 1.1 -import "Constants.js" as Constants +import QtQuick 2.15 +import QtQuick.Templates 2.15 as T +import StudioTheme 1.0 as StudioTheme -Controls.Button { - property color borderColor: "#222" - property color highlightColor: "orange" - property color textColor: "#eee" - style: ButtonStyle { - label: Text { - color: Constants.colorsDefaultText - anchors.fill: parent - renderType: Text.NativeRendering - verticalAlignment: Text.AlignVCenter - horizontalAlignment: Text.AlignHCenter - text: control.text - opacity: enabled ? 1 : 0.7 - } - background: Rectangle { - implicitWidth: 100 - implicitHeight: 23 - radius: 3 - gradient: control.pressed ? pressedGradient : gradient - Gradient{ - id: pressedGradient - GradientStop{color: "#333" ; position: 0} +T.AbstractButton { + id: myButton + + implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset, + implicitContentWidth + leftPadding + rightPadding) + implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset, + implicitContentHeight + topPadding + bottomPadding) + + background: Rectangle { + id: buttonBackground + implicitWidth: 100 + implicitHeight: 23 + radius: 3 + color: StudioTheme.Values.themeControlBackground + border.color: StudioTheme.Values.themeControlOutline + border.width: StudioTheme.Values.border + } + + contentItem: Text { + id: buttonText + color: StudioTheme.Values.themeTextColor + font.family: StudioTheme.Constants.font.family + font.pixelSize: StudioTheme.Values.myFontSize + verticalAlignment: Text.AlignVCenter + horizontalAlignment: Text.AlignHCenter + anchors.fill: parent + renderType: Text.QtRendering + text: myButton.text + } + + states: [ + State { + name: "default" + when: myButton.enabled && !myButton.hovered && !myButton.pressed + && !myButton.checked + PropertyChanges { + target: buttonBackground + color: StudioTheme.Values.themeControlBackground + } + }, + State { + name: "hovered" + when: myButton.hovered && !myButton.pressed + PropertyChanges { + target: buttonBackground + color: StudioTheme.Values.themeHoverHighlight } - Gradient { - id: gradient - GradientStop {color: "#606060" ; position: 0} - GradientStop {color: "#404040" ; position: 0.07} - GradientStop {color: "#303030" ; position: 1} + }, + State { + name: "pressed" + when: myButton.hovered && myButton.pressed + PropertyChanges { + target: buttonBackground + color: StudioTheme.Values.themeControlBackgroundPressed + border.color: StudioTheme.Values.themeInteraction } - Rectangle { - anchors.fill: parent - anchors.margins: -1 - color: "transparent" - radius: 4 - opacity: 0.3 - visible: control.activeFocus + }, + State { + name: "disabled" + when: !myButton.enabled + PropertyChanges { + target: buttonBackground + color: StudioTheme.Values.themeControlBackgroundDisabled + border.color: StudioTheme.Values.themeControlOutlineDisabled + } + PropertyChanges { + target: buttonText + color: StudioTheme.Values.themeTextColorDisabled } } - } + ] } diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/ButtonRowButton.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/ButtonRowButton.qml index 6ba9957cd5..a893a12529 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/ButtonRowButton.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/ButtonRowButton.qml @@ -23,10 +23,8 @@ ** ****************************************************************************/ -import QtQuick 2.1 -import QtQuick.Controls 1.0 as Controls -import QtQuick.Layouts 1.0 -import QtQuick.Controls.Private 1.0 +import QtQuick 2.15 +import QtQuick.Layouts 1.15 import QtQuickDesignerTheme 1.0 Item { diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/ColorEditor.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/ColorEditor.qml index 8c12d37bb5..3d8291e7e7 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/ColorEditor.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/ColorEditor.qml @@ -38,7 +38,7 @@ Column { property bool supportGradient: false - property string caption: "Color" + property string caption: qsTr("Color") property variant backendValue @@ -47,7 +47,6 @@ Column { return Qt.rgba(backendValue.value.x, backendValue.value.y, backendValue.value.z, 1); else return backendValue.value; - } property alias gradientPropertyName: gradientLine.gradientPropertyName diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/EditableListView.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/EditableListView.qml index e1d177fe07..c3344fcfe0 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/EditableListView.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/EditableListView.qml @@ -104,6 +104,7 @@ Rectangle { color: "transparent" border.width: StudioTheme.Values.border border.color: StudioTheme.Values.themeInteraction + visible: myColumn.currentItem ? myColumn.currentItem.focus : false x: myColumn.currentItem ? myColumn.currentItem.x : 0 y: myColumn.currentItem ? myColumn.currentItem.y : 0 z: 10 diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/ExpressionTextField.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/ExpressionTextField.qml index 6209325e7e..53557780d1 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/ExpressionTextField.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/ExpressionTextField.qml @@ -23,13 +23,14 @@ ** ****************************************************************************/ -import QtQuick 2.1 -import "Constants.js" as Constants -import StudioControls 1.0 as StudioControls +import QtQuick 2.15 +import QtQuick.Window 2.15 +import QtQuick.Controls 2.15 import QtQuickDesignerTheme 1.0 +import StudioControls 1.0 as StudioControls +import StudioTheme 1.0 as StudioTheme StudioControls.TextField { - id: textField signal rejected @@ -38,103 +39,199 @@ StudioControls.TextField { actionIndicator.visible: false property bool completeOnlyTypes: false - - property bool completionActive: listView.count > 0 + property bool completionActive: listView.model !== null property bool dotCompletion: false property int dotCursorPos: 0 property string prefix - property alias showButtons: buttonrow.visible - property bool fixedSize: false + property bool replaceCurrentTextByCompletion: false - function commitCompletion() { - var cursorPos = textField.cursorPosition + property alias completionList: listView - var string = textField.text - var before = string.slice(0, cursorPos - textField.prefix.length) - var after = string.slice(cursorPos) - - textField.text = before + listView.currentItem.text + after - - textField.cursorPosition = cursorPos + listView.currentItem.text.length - prefix.length + function commitCompletion() { + if (replaceCurrentTextByCompletion) { + textField.text = listView.currentItem.text + } else { + var cursorPos = textField.cursorPosition + var string = textField.text + var before = string.slice(0, cursorPos - textField.prefix.length) + var after = string.slice(cursorPos) + textField.text = before + listView.currentItem.text + after + textField.cursorPosition = cursorPos + listView.currentItem.text.length - prefix.length + } listView.model = null } - ListView { - id: listView + Popup { + id: textFieldPopup + x: textField.x + y: textField.height - StudioTheme.Values.border + width: textField.width + // TODO Setting the height on the popup solved the problem with the popup of height 0, + // but it has the problem that it sometimes extend over the border of the actual window + // and is then cut off. + height: Math.min(contentItem.implicitHeight + textFieldPopup.topPadding + textFieldPopup.bottomPadding, + textField.Window.height - topMargin - bottomMargin, + StudioTheme.Values.maxComboBoxPopupHeight) + padding: StudioTheme.Values.border + margins: 0 // If not defined margin will be -1 + closePolicy: Popup.CloseOnPressOutside | Popup.CloseOnPressOutsideParent + | Popup.CloseOnEscape | Popup.CloseOnReleaseOutside + | Popup.CloseOnReleaseOutsideParent - clip: true - cacheBuffer: 0 - snapMode: ListView.SnapToItem - boundsBehavior: Flickable.StopAtBounds visible: textField.completionActive - delegate: Text { - text: modelData - color: Theme.color(Theme.PanelTextColorLight) - Rectangle { - visible: index === listView.currentIndex - z: -1 - anchors.fill: parent - color: Theme.qmlDesignerBackgroundColorDarkAlternate() + + onClosed: listView.model = null + + contentItem: ListView { + id: listView + clip: true + implicitHeight: contentHeight + boundsBehavior: Flickable.StopAtBounds + ScrollBar.vertical: StudioControls.ScrollBar { + id: popupScrollBar } - } - anchors.top: parent.top - anchors.topMargin: 26 - anchors.bottomMargin: textField.fixedSize ? -180 : 12 - anchors.bottom: parent.bottom - anchors.left: parent.left - width: 200 - spacing: 2 - children: [ - Rectangle { - visible: textField.fixedSize - anchors.fill: parent - color: Theme.qmlDesignerBackgroundColorDarker() - border.color: Theme.qmlDesignerBorderColor() - anchors.rightMargin: 12 - z: -1 + model: null + + delegate: ItemDelegate { + id: myItemDelegate + + width: textFieldPopup.width - textFieldPopup.leftPadding - textFieldPopup.rightPadding + - (popupScrollBar.visible ? popupScrollBar.contentItem.implicitWidth + + 2 : 0) // TODO Magic number + height: StudioTheme.Values.height - 2 * StudioTheme.Values.border + padding: 0 + text: itemDelegateText.text + + contentItem: Text { + id: itemDelegateText + leftPadding: 8 + text: modelData + color: StudioTheme.Values.themeTextColor + font: textField.font + elide: Text.ElideRight + verticalAlignment: Text.AlignVCenter + } + background: Rectangle { + color: "transparent" + } + + hoverEnabled: true + onHoveredChanged: { + if (hovered) + listView.currentIndex = index + } + onClicked: { + listView.currentIndex = index + if (textField.completionActive) + textField.commitCompletion() + } } - ] + highlight: Rectangle { + id: listViewHighlight + width: textFieldPopup.width - textFieldPopup.leftPadding - textFieldPopup.rightPadding + - (popupScrollBar.visible ? popupScrollBar.contentItem.implicitWidth + + 2 : 0) + height: StudioTheme.Values.height - 2 * StudioTheme.Values.border + color: StudioTheme.Values.themeInteraction + y: listView.currentItem.y + } + highlightFollowsCurrentItem: false + } + + background: Rectangle { + color: StudioTheme.Values.themeControlBackground + border.color: StudioTheme.Values.themeInteraction + border.width: StudioTheme.Values.border + } + + enter: Transition { + } + exit: Transition { + } } verticalAlignment: Text.AlignTop + onPressed: listView.model = null + Keys.priority: Keys.BeforeItem Keys.onPressed: { + var text = textField.text + var pos = textField.cursorPosition + var explicitComplete = true + + switch (event.key) { - if (event.key === Qt.Key_Period) { + case Qt.Key_Period: textField.dotCursorPos = textField.cursorPosition + 1 - var list = autoComplete(textField.text+".", textField.dotCursorPos, false, textField.completeOnlyTypes) - textField.prefix = list.pop() - listView.model = list; + text = textField.text + "." + pos = textField.dotCursorPos + explicitComplete = false textField.dotCompletion = true - } else { - if (textField.completionActive) { - var list2 = autoComplete(textField.text + event.text, - textField.cursorPosition + event.text.length, - true, textField.completeOnlyTypes) - textField.prefix = list2.pop() - listView.model = list2; - } + break + + case Qt.Key_Right: + if (!textField.completionActive) + return + + pos = Math.min(textField.cursorPosition + 1, textField.text.length) + break + + case Qt.Key_Left: + if (!textField.completionActive) + return + + pos = Math.max(0, textField.cursorPosition - 1) + break + + case Qt.Key_Backspace: + if (!textField.completionActive) + return + + pos = textField.cursorPosition - 1 + if (pos < 0) + return + + text = textField.text.substring(0, pos) + textField.text.substring(textField.cursorPosition) + break + + case Qt.Key_Delete: + return + + default: + if (!textField.completionActive) + return + + var tmp = textField.text + text = tmp.substring(0, textField.cursorPosition) + event.text + tmp.substring(textField.cursorPosition) + pos = textField.cursorPosition + event.text.length } + + var list = autoComplete(text.trim(), pos, explicitComplete, textField.completeOnlyTypes) + textField.prefix = text.substring(0, pos) + + if (list.length && list[list.length - 1] === textField.prefix) + list.pop() + + listView.model = list } Keys.onSpacePressed: { if (event.modifiers & Qt.ControlModifier) { var list = autoComplete(textField.text, textField.cursorPosition, true, textField.completeOnlyTypes) - textField.prefix = list.pop() - listView.model = list; + textField.prefix = textField.text.substring(0, textField.cursorPosition) + if (list.length && list[list.length - 1] === textField.prefix) + list.pop() + + listView.model = list textField.dotCompletion = false event.accepted = true; - - if (list.length == 1) - textField.commitCompletion() - } else { event.accepted = false } diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/FontSection.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/FontSection.qml index bf81004f97..d9da551044 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/FontSection.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/FontSection.qml @@ -73,7 +73,6 @@ Section { Layout.fillWidth: true width: 160 property string familyName: backendValue.value - onFamilyNameChanged: print(styleNamesForFamily(familyName)) } Label { diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/GradientPresetList.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/GradientPresetList.qml index d756b53fe6..4a0665076a 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/GradientPresetList.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/GradientPresetList.qml @@ -23,12 +23,11 @@ ** ****************************************************************************/ -import QtQuick 2.11 -import QtQuick.Layouts 1.12 +import QtQuick 2.15 +import QtQuick.Layouts 1.15 import QtQuick.Dialogs 1.3 - -import HelperWidgets 2.0 import QtQuickDesignerTheme 1.0 +import HelperWidgets 2.0 import StudioControls 1.0 as StudioControls import StudioTheme 1.0 as StudioTheme @@ -76,49 +75,52 @@ Dialog { anchors.margins: 13 anchors.bottomMargin: 71 - TabView { - id: presetTabView - Layout.alignment: Qt.AlignTop | Qt.AlignHCenter - Layout.fillHeight: true - Layout.fillWidth: true + StudioControls.TabBar { + id: presetTabBar - Tab { - title: qsTr("System Presets") - anchors.fill: parent + anchors.left: parent.left + anchors.right: parent.right - GradientPresetTabContent { - id: defaultTabContent - viewModel: defaultPresetListModel - editableName: false - } + StudioControls.TabButton { + text: qsTr("System Presets") } + StudioControls.TabButton { + text: qsTr("User Presets") + } + } + + StackLayout { + anchors.left: parent.left + anchors.right: parent.right + currentIndex: presetTabBar.currentIndex + + GradientPresetTabContent { + id: defaultTabContent + viewModel: defaultPresetListModel + editableName: false + } + + GradientPresetTabContent { + id: customTabContent + viewModel: customPresetListModel + editableName: true + onPresetNameChanged: customPresetListModel.changePresetName(id, name) + + property int deleteId + + onDeleteButtonClicked: { + deleteId = id + deleteDialog.open() + } - Tab { - title: qsTr("User Presets") - anchors.fill: parent - - GradientPresetTabContent { - id: customTabContent - viewModel: customPresetListModel - editableName: true - onPresetNameChanged: customPresetListModel.changePresetName(id, name) - - property int deleteId - - onDeleteButtonClicked: { - deleteId = id - deleteDialog.open() - } - - MessageDialog { - id: deleteDialog - visible: false - modality: Qt.WindowModal - standardButtons: Dialog.No | Dialog.Yes - title: qsTr("Delete preset?") - text: qsTr("Are you sure you want to delete this preset?") - onAccepted: customPresetListModel.deletePreset(customTabContent.deleteId) - } + MessageDialog { + id: deleteDialog + visible: false + modality: Qt.WindowModal + standardButtons: Dialog.No | Dialog.Yes + title: qsTr("Delete preset?") + text: qsTr("Are you sure you want to delete this preset?") + onAccepted: customPresetListModel.deletePreset(customTabContent.deleteId) } } } diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/GradientPresetTabContent.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/GradientPresetTabContent.qml index f26064dd21..fd0fee4cf7 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/GradientPresetTabContent.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/GradientPresetTabContent.qml @@ -23,12 +23,11 @@ ** ****************************************************************************/ -import QtQuick 2.11 -import QtQuick.Layouts 1.12 -import QtQuick.Dialogs 1.3 - -import HelperWidgets 2.0 +import QtQuick 2.15 +import QtQuick.Controls 2.15 +import QtQuick.Layouts 1.15 import QtQuickDesignerTheme 1.0 +import HelperWidgets 2.0 import StudioControls 1.0 as StudioControls import StudioTheme 1.0 as StudioTheme @@ -48,271 +47,277 @@ Rectangle { property real delegateHeight: 178 property real gridCellWidth: 160 - ScrollView { + GridView { + id: gradientTable Layout.fillWidth: true Layout.fillHeight: true anchors.fill: parent + anchors.leftMargin: 10 + clip: true + delegate: gradientDelegate + + property int gridColumns: width / tabBackground.gridCellWidth; + cellWidth: width / gridColumns + cellHeight: 185 + + property bool bothVisible: horizontal.scrollBarVisible && vertical.scrollBarVisible + + ScrollBar.horizontal: HorizontalScrollBar { + id: horizontal + parent: gradientTable + } + + ScrollBar.vertical: VerticalScrollBar { + id: vertical + parent: gradientTable + } + + Component { + id: gradientDelegate + + Rectangle { + id: backgroundCard + color: StudioTheme.Values.themeControlOutline + clip: true - GridView { - id: gradientTable - Layout.fillWidth: true - Layout.fillHeight: true - anchors.fill: parent - anchors.leftMargin: 10 - clip: true - delegate: gradientDelegate - - property int gridColumns: width / tabBackground.gridCellWidth; - cellWidth: width / gridColumns - cellHeight: 185 - - Component { - id: gradientDelegate - - Rectangle { - id: backgroundCard - color: StudioTheme.Values.themeControlOutline - clip: true - - property real flexibleWidth: (gradientTable.width - gradientTable.cellWidth * gradientTable.gridColumns) / gradientTable.gridColumns - property bool isSelected: false - - width: gradientTable.cellWidth + flexibleWidth - 8 - height: tabBackground.delegateHeight - radius: 16 - - function selectPreset(index) { - gradientTable.currentIndex = index - gradientData.stops = stopsPosList - gradientData.colors = stopsColorList - gradientData.stopsCount = stopListSize - gradientData.presetID = presetID - gradientData.presetType = presetTabView.currentIndex - - if (gradientData.selectedItem != null) - gradientData.selectedItem.isSelected = false - - backgroundCard.isSelected = true - gradientData.selectedItem = backgroundCard + property real flexibleWidth: (gradientTable.width - gradientTable.cellWidth * gradientTable.gridColumns) / gradientTable.gridColumns + property bool isSelected: false + + width: gradientTable.cellWidth + flexibleWidth - 8 + height: tabBackground.delegateHeight + radius: 16 + + function selectPreset(index) { + gradientTable.currentIndex = index + gradientData.stops = stopsPosList + gradientData.colors = stopsColorList + gradientData.stopsCount = stopListSize + gradientData.presetID = presetID + gradientData.presetType = presetTabBar.currentIndex + + if (gradientData.selectedItem != null) + gradientData.selectedItem.isSelected = false + + backgroundCard.isSelected = true + gradientData.selectedItem = backgroundCard + } + + MouseArea { + id: rectMouseArea + anchors.fill: parent + hoverEnabled: true + onClicked: { + presetNameBox.edit = false + nameInput.focus = false + backgroundCard.selectPreset(index) } + } - MouseArea { - id: rectMouseArea - anchors.fill: parent - hoverEnabled: true - onClicked: { - presetNameBox.edit = false - nameInput.focus = false - backgroundCard.selectPreset(index) + states: [ + State { + name: "default" + when: !(rectMouseArea.containsMouse || removeButton.hovered || + (nameMouseArea.containsMouse && !tabBackground.editableName)) && + !backgroundCard.isSelected + PropertyChanges { + target: backgroundCard + color: StudioTheme.Values.themeControlOutline + border.width: 0 + } + }, + State { + name: "hovered" + when: (rectMouseArea.containsMouse || removeButton.hovered || + (nameMouseArea.containsMouse && !tabBackground.editableName)) && + !backgroundCard.isSelected + PropertyChanges { + target: backgroundCard + color: StudioTheme.Values.themeControlBackgroundPressed + border.width: 1 + border.color: StudioTheme.Values.themeInteraction + } + }, + State { + name: "selected" + when: backgroundCard.isSelected + PropertyChanges { + target: backgroundCard + color:StudioTheme.Values.themeInteraction + border.width: 1 + border.color: StudioTheme.Values.themeControlBackgroundPressed } } + ] + + ColumnLayout { + spacing: 2 + anchors.fill: parent + + Rectangle { + id: gradientRect + width: 150 + height: 150 + radius: 16 + Layout.alignment: Qt.AlignHCenter | Qt.AlignVCenter + Layout.topMargin: 2 + + gradient: Gradient { + id: showGr + } - states: [ - State { - name: "default" - when: !(rectMouseArea.containsMouse || removeButton.hovered || - (nameMouseArea.containsMouse && !tabBackground.editableName)) && - !backgroundCard.isSelected - PropertyChanges { - target: backgroundCard - color: StudioTheme.Values.themeControlOutline - border.width: 0 - } - }, - State { - name: "hovered" - when: (rectMouseArea.containsMouse || removeButton.hovered || - (nameMouseArea.containsMouse && !tabBackground.editableName)) && - !backgroundCard.isSelected - PropertyChanges { - target: backgroundCard - color: StudioTheme.Values.themeControlBackgroundPressed - border.width: 1 - border.color: StudioTheme.Values.themeInteraction - } - }, - State { - name: "selected" - when: backgroundCard.isSelected - PropertyChanges { - target: backgroundCard - color:StudioTheme.Values.themeInteraction - border.width: 1 - border.color: StudioTheme.Values.themeControlBackgroundPressed + Component { + id: stopComponent + GradientStop {} + } + + Component.onCompleted: { + var stopsAmount = stopListSize; + var newStops = []; + for (var i = 0; i < stopsAmount; i++) { + newStops.push( stopComponent.createObject(showGr, { "position": stopsPosList[i], "color": stopsColorList[i] }) ); } + showGr.stops = newStops; } - ] - ColumnLayout { - spacing: 2 - anchors.fill: parent + AbstractButton { + id: removeButton + visible: editableName && (rectMouseArea.containsMouse || removeButton.hovered) + backgroundRadius: StudioTheme.Values.smallRectWidth + anchors.right: parent.right + anchors.rightMargin: 5 + anchors.top: parent.top + anchors.topMargin: 5 + width: Math.round(StudioTheme.Values.smallRectWidth) + height: Math.round(StudioTheme.Values.smallRectWidth) + buttonIcon: StudioTheme.Constants.closeCross + onClicked: tabBackground.deleteButtonClicked(index) + } + } + + Item { + id: presetNameBox + Layout.alignment: Qt.AlignHCenter | Qt.AlignVCenter + Layout.preferredWidth: backgroundCard.width - 2 + Layout.preferredHeight: backgroundCard.height - gradientRect.height - 4 + Layout.bottomMargin: 4 + + property bool edit: false Rectangle { - id: gradientRect - width: 150 - height: 150 + id: nameBackgroundColor + enabled: tabBackground.editableName + color: "transparent" radius: 16 - Layout.alignment: Qt.AlignHCenter | Qt.AlignVCenter - Layout.topMargin: 2 - - gradient: Gradient { - id: showGr - } + visible: true + anchors.fill: parent + } - Component { - id: stopComponent - GradientStop {} - } + ToolTipArea { + id: nameMouseArea + anchors.fill: parent + tooltip: nameText.text + propagateComposedEvents: true - Component.onCompleted: { - var stopsAmount = stopListSize; - var newStops = []; - for (var i = 0; i < stopsAmount; i++) { - newStops.push( stopComponent.createObject(showGr, { "position": stopsPosList[i], "color": stopsColorList[i] }) ); + onClicked: { + if (!tabBackground.editableName) { + backgroundCard.selectPreset(index) + return } - showGr.stops = newStops; - } - AbstractButton { - id: removeButton - visible: editableName && (rectMouseArea.containsMouse || removeButton.hovered) - backgroundRadius: StudioTheme.Values.smallRectWidth - anchors.right: parent.right - anchors.rightMargin: 5 - anchors.top: parent.top - anchors.topMargin: 5 - width: Math.round(StudioTheme.Values.smallRectWidth) - height: Math.round(StudioTheme.Values.smallRectWidth) - buttonIcon: StudioTheme.Constants.closeCross - onClicked: tabBackground.deleteButtonClicked(index) + presetNameBox.edit = true + nameInput.forceActiveFocus() + // have to select text like this, otherwise there is an issue with long names + nameInput.cursorPosition = 0 + nameInput.cursorPosition = nameInput.length + nameInput.selectAll() } } - Item { - id: presetNameBox - Layout.alignment: Qt.AlignHCenter | Qt.AlignVCenter - Layout.preferredWidth: backgroundCard.width - 2 - Layout.preferredHeight: backgroundCard.height - gradientRect.height - 4 - Layout.bottomMargin: 4 - - property bool edit: false - - Rectangle { - id: nameBackgroundColor - enabled: tabBackground.editableName - color: "transparent" - radius: 16 - visible: true - anchors.fill: parent - } - - ToolTipArea { - id: nameMouseArea - anchors.fill: parent - tooltip: nameText.text - propagateComposedEvents: true - - onClicked: { - if (!tabBackground.editableName) { - backgroundCard.selectPreset(index) - return - } - - presetNameBox.edit = true - nameInput.forceActiveFocus() - // have to select text like this, otherwise there is an issue with long names - nameInput.cursorPosition = 0 - nameInput.cursorPosition = nameInput.length - nameInput.selectAll() - } - } + Text { + id: nameText + text: presetName + anchors.fill: parent + horizontalAlignment: Text.AlignHCenter + verticalAlignment: Text.AlignVCenter + color: StudioTheme.Values.themeTextColor + elide: Text.ElideMiddle + maximumLineCount: 1 + } - Text { - id: nameText - text: presetName - anchors.fill: parent - horizontalAlignment: Text.AlignHCenter - verticalAlignment: Text.AlignVCenter - color: StudioTheme.Values.themeTextColor - elide: Text.ElideMiddle - maximumLineCount: 1 + TextInput { + id: nameInput + enabled: tabBackground.editableName + visible: false + text: presetName + anchors.fill: parent + anchors.leftMargin: 5 + anchors.rightMargin: 5 + horizontalAlignment: TextInput.AlignHCenter + verticalAlignment: TextInput.AlignVCenter + color: StudioTheme.Values.themeTextColor + selectionColor: StudioTheme.Values.themeInteraction + selectByMouse: true + activeFocusOnPress: true + wrapMode: TextInput.NoWrap + clip: true + + onEditingFinished: { + nameText.text = text + tabBackground.presetNameChanged(index, text) + presetNameBox.edit = false } - TextInput { - id: nameInput - enabled: tabBackground.editableName - visible: false - text: presetName - anchors.fill: parent - anchors.leftMargin: 5 - anchors.rightMargin: 5 - horizontalAlignment: TextInput.AlignHCenter - verticalAlignment: TextInput.AlignVCenter - color: StudioTheme.Values.themeTextColor - selectionColor: StudioTheme.Values.themeInteraction - selectByMouse: true - activeFocusOnPress: true - wrapMode: TextInput.NoWrap - clip: true - - onEditingFinished: { - nameText.text = text - tabBackground.presetNameChanged(index, text) - presetNameBox.edit = false + Keys.onPressed: { + if (event.key === Qt.Key_Enter || event.key === Qt.Key_Return) { + event.accepted = true + nameInput.editingFinished() + nameInput.focus = false } - Keys.onPressed: { - if (event.key === Qt.Key_Enter || event.key === Qt.Key_Return) { - event.accepted = true - nameInput.editingFinished() - nameInput.focus = false - } - - if (event.key === Qt.Key_Escape) { - event.accepted = true - nameInput.text = nameText.text - nameInput.focus = false - } + if (event.key === Qt.Key_Escape) { + event.accepted = true + nameInput.text = nameText.text + nameInput.focus = false } } + } - states: [ - State { - name: "default" - when: tabBackground.editableName && !nameMouseArea.containsMouse && !presetNameBox.edit - PropertyChanges { - target: nameBackgroundColor - color: "transparent" - border.width: 0 - } - PropertyChanges { target: nameText; visible: true } - PropertyChanges { target: nameInput; visible: false } - }, - State { - name: "hovered" - when: tabBackground.editableName && nameMouseArea.containsMouse && !presetNameBox.edit - PropertyChanges { - target: nameBackgroundColor - color: StudioTheme.Values.themeControlBackgroundPressed - border.width: 0 - } - PropertyChanges { target: nameText; visible: true } - PropertyChanges { target: nameInput; visible: false } - }, - State { - name: "edit" - when: tabBackground.editableName && presetNameBox.edit - PropertyChanges { - target: nameBackgroundColor - color: StudioTheme.Values.themeControlBackgroundPressed - border.color: StudioTheme.Values.themeInteraction - border.width: 1 - } - PropertyChanges { target: nameText; visible: false } - PropertyChanges { target: nameInput; visible: true } + states: [ + State { + name: "default" + when: tabBackground.editableName && !nameMouseArea.containsMouse && !presetNameBox.edit + PropertyChanges { + target: nameBackgroundColor + color: "transparent" + border.width: 0 } - ] - } + PropertyChanges { target: nameText; visible: true } + PropertyChanges { target: nameInput; visible: false } + }, + State { + name: "hovered" + when: tabBackground.editableName && nameMouseArea.containsMouse && !presetNameBox.edit + PropertyChanges { + target: nameBackgroundColor + color: StudioTheme.Values.themeControlBackgroundPressed + border.width: 0 + } + PropertyChanges { target: nameText; visible: true } + PropertyChanges { target: nameInput; visible: false } + }, + State { + name: "edit" + when: tabBackground.editableName && presetNameBox.edit + PropertyChanges { + target: nameBackgroundColor + color: StudioTheme.Values.themeControlBackgroundPressed + border.color: StudioTheme.Values.themeInteraction + border.width: 1 + } + PropertyChanges { target: nameText; visible: false } + PropertyChanges { target: nameInput; visible: true } + } + ] } } } diff --git a/share/qtcreator/qmldesigner/statesEditorQmlSources/DesignerTextFieldStyle.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/HorizontalScrollBar.qml index 64a8835db7..12111f7e1c 100644 --- a/share/qtcreator/qmldesigner/statesEditorQmlSources/DesignerTextFieldStyle.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/HorizontalScrollBar.qml @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2016 The Qt Company Ltd. +** Copyright (C) 2020 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of Qt Creator. @@ -23,25 +23,29 @@ ** ****************************************************************************/ -import QtQuick 2.2 -import QtQuick.Controls 1.1 -import QtQuick.Controls.Styles 1.1 -import QtQuickDesignerTheme 1.0 +import QtQuick 2.15 +import QtQuick.Controls 2.15 +import StudioTheme 1.0 as StudioTheme -TextFieldStyle { - selectionColor: Theme.color(Theme.PanelTextColorLight) - selectedTextColor: Theme.color(Theme.PanelTextColorDark) - textColor: Theme.color(Theme.PanelTextColorLight) - placeholderTextColor: Theme.color(Theme.PanelTextColorMid) +ScrollBar { + id: scrollBar - padding.top: 4 - padding.bottom: 4 + property bool scrollBarVisible: parent.childrenRect.width > parent.width + + orientation: Qt.Horizontal + policy: scrollBar.scrollBarVisible ? ScrollBar.AlwaysOn : ScrollBar.AlwaysOff + x: 0 + y: parent.height - height + width: parent.availableWidth + - (parent.bothVisible ? parent.verticalThickness : 0) + padding: 0 background: Rectangle { - implicitWidth: 100 - implicitHeight: font.pixelSize + padding.top + padding.bottom - color: Theme.color(Theme.FancyToolButtonSelectedColor) - border.color: Theme.qmlDesignerBackgroundColorDarker() + color: StudioTheme.Values.themeSectionHeadBackground + } + + contentItem: Rectangle { + implicitHeight: StudioTheme.Values.scrollBarThickness + color: StudioTheme.Values.themeScrollBarHandle } - renderType: Text.NativeRendering } diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/IconLabel.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/IconLabel.qml index f61a057ae0..85ed936a6b 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/IconLabel.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/IconLabel.qml @@ -23,31 +23,16 @@ ** ****************************************************************************/ -import QtQuick 2.1 -import QtQuick.Controls 2.0 as Controls -import QtQuick.Layouts 1.0 +import QtQuick 2.15 +import HelperWidgets 2.0 +import StudioTheme 1.0 as StudioTheme -Item { - id: label - width: parent.width < 300 ? 80 : Math.min(140, parent.width - 220) - height: 16 - property alias source: image.source +Label { + id: myLabel - Item { - width: 16 - height: 16 - Image { - id: image - anchors.fill: parent - } + property alias icon: myLabel.text - } - - Layout.preferredWidth: width - Layout.minimumWidth: width - Layout.maximumWidth: width - -// Component.onCompleted: { -// label.Layout.preferredWidth = width -// } + text: StudioTheme.Constants.actionIcon + font.family: StudioTheme.Constants.iconFont.family + font.pixelSize: StudioTheme.Values.myIconFontSize } diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/ScrollView.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/ScrollView.qml index 7dc4a0e395..c101bff09c 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/ScrollView.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/ScrollView.qml @@ -23,13 +23,37 @@ ** ****************************************************************************/ -import QtQuick 2.1 -import QtQuick.Controls 1.0 as Controls -import "../../../common/" +import QtQuick 2.15 +import QtQuick.Controls 2.15 +import StudioTheme 1.0 as StudioTheme -Controls.ScrollView { - style: DesignerScrollViewStyle { +Flickable { + id: flickable + property alias horizontalThickness: horizontalScrollBar.height + property alias verticalThickness: verticalScrollBar.width + property bool bothVisible: verticalScrollBar.scrollBarVisible + && horizontalScrollBar.scrollBarVisible + + contentWidth: areaItem.childrenRect.width + contentHeight: areaItem.childrenRect.height + boundsBehavior: Flickable.StopAtBounds + + default property alias content: areaItem.children + + Item { + id: areaItem + } + + ScrollBar.horizontal: HorizontalScrollBar { + id: horizontalScrollBar + parent: flickable + scrollBarVisible: areaItem.childrenRect.width > flickable.width + } + + ScrollBar.vertical: VerticalScrollBar { + id: verticalScrollBar + parent: flickable + scrollBarVisible: areaItem.childrenRect.height > flickable.height } - frameVisible: false } diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/Tab.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/VerticalScrollBar.qml index 79806d2bcc..97234524d4 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/Tab.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/VerticalScrollBar.qml @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2016 The Qt Company Ltd. +** Copyright (C) 2020 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of Qt Creator. @@ -23,9 +23,29 @@ ** ****************************************************************************/ -import QtQuick 2.1 -import QtQuick.Controls 1.0 as Controls +import QtQuick 2.15 +import QtQuick.Controls 2.15 +import StudioTheme 1.0 as StudioTheme -Controls.Tab { +ScrollBar { + id: scrollBar + property bool scrollBarVisible: parent.childrenRect.height > parent.height + + orientation: Qt.Vertical + policy: scrollBar.scrollBarVisible ? ScrollBar.AlwaysOn : ScrollBar.AlwaysOff + x: parent.width - width + y: 0 + height: parent.availableHeight + - (parent.bothVisible ? parent.horizontalThickness : 0) + padding: 0 + + background: Rectangle { + color: StudioTheme.Values.themeSectionHeadBackground + } + + contentItem: Rectangle { + implicitWidth: StudioTheme.Values.scrollBarThickness + color: StudioTheme.Values.themeScrollBarHandle + } } diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/qmldir b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/qmldir index f77c9e1934..59573217c5 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/qmldir +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/qmldir @@ -39,11 +39,11 @@ SimpleColorPalette 2.0 SimpleColorPalette.qml DoubleSpinBox 2.0 DoubleSpinBox.qml SpinBox 2.0 SpinBox.qml StandardTextSection 2.0 StandardTextSection.qml -Tab 2.0 Tab.qml -TabView 2.0 TabView.qml ToolTipArea 2.0 ToolTipArea.qml UrlChooser 2.0 UrlChooser.qml PaddingSection 2.0 PaddingSection.qml RoundedPanel 2.0 RoundedPanel.qml ExpressionTextField 2.0 ExpressionTextField.qml MarginSection 2.0 MarginSection.qml +HorizontalScrollBar 2.0 HorizontalScrollBar.qml +VerticalScrollBar 2.0 VerticalScrollBar.qml diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/ActionIndicator.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/ActionIndicator.qml index 908f2274e6..a055447d96 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/ActionIndicator.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/ActionIndicator.qml @@ -116,7 +116,6 @@ Rectangle { color: StudioTheme.Values.themeHoverHighlight border.color: StudioTheme.Values.themeControlOutline } - }, State { name: "edit" diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/CheckBox.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/CheckBox.qml index 0faaf7e0a8..5e55a4855b 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/CheckBox.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/CheckBox.qml @@ -46,8 +46,7 @@ T.CheckBox { implicitWidth: Math.max( implicitBackgroundWidth + leftInset + rightInset, - implicitContentWidth + leftPadding + rightPadding - + implicitIndicatorWidth + spacing + actionIndicator.width) + implicitContentWidth + leftPadding + rightPadding) implicitHeight: Math.max( implicitBackgroundHeight + topInset + bottomInset, implicitContentHeight + topPadding + bottomPadding, diff --git a/share/qtcreator/qmldesigner/common/DesignerScrollViewStyle.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/TabBar.qml index b8284e7d4d..1b71f1f4de 100644 --- a/share/qtcreator/qmldesigner/common/DesignerScrollViewStyle.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/TabBar.qml @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2016 The Qt Company Ltd. +** Copyright (C) 2020 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of Qt Creator. @@ -23,38 +23,33 @@ ** ****************************************************************************/ -import QtQuick 2.2 -import QtQuick.Controls 1.1 -import QtQuick.Controls.Styles 1.1 -import QtQuickDesignerTheme 1.0 +import QtQuick 2.15 +import QtQuick.Templates 2.15 as T +import StudioTheme 1.0 as StudioTheme -ScrollViewStyle { - readonly property color scrollbarColor: Theme.color(Theme.BackgroundColorDark) - readonly property color scrollBarHandleColor: Theme.color(Theme.QmlDesigner_ScrollBarHandleColor) +T.TabBar { + id: myButton - padding {left: 0; top: 0; right: 0; bottom: 0} + implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset, + implicitContentWidth + leftPadding + rightPadding) + implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset, + implicitContentHeight + topPadding + bottomPadding) - scrollBarBackground: Rectangle { - height: 10 - width: 10 - color: scrollbarColor - } - handle: Item { - implicitWidth: 10 - implicitHeight: 10 - Rectangle { - anchors.fill: parent - color: scrollBarHandleColor - } - } + spacing: 0 + bottomPadding: 4 - decrementControl: Item {} - incrementControl: Item {} - corner: Item {} + contentItem: ListView { + model: myButton.contentModel + currentIndex: myButton.currentIndex + + spacing: myButton.spacing + orientation: ListView.Horizontal + boundsBehavior: Flickable.StopAtBounds + flickableDirection: Flickable.AutoFlickIfNeeded + snapMode: ListView.SnapToItem + } - //Even if the platform style reports touch support a scrollview should not be flickable. - Component.onCompleted: { - control.flickableItem.interactive = false + background: Rectangle { + color: StudioTheme.Values.themeTabLight } - transientScrollBars: false } diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/TabView.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/TabButton.qml index b5e0ac0221..3b8efdfe55 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/TabView.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/TabButton.qml @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2016 The Qt Company Ltd. +** Copyright (C) 2020 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of Qt Creator. @@ -23,40 +23,38 @@ ** ****************************************************************************/ -import QtQuick 2.1 -import QtQuick.Controls 1.0 as Controls -import QtQuick.Controls.Styles 1.1 -import QtQuickDesignerTheme 1.0 +import QtQuick 2.15 +import QtQuick.Templates 2.15 as T import StudioTheme 1.0 as StudioTheme -Controls.TabView { - id: root +T.TabButton { + id: myButton - frameVisible: false - style: TabViewStyle { - frameOverlap: 0 - frame: Item { } - tab: Rectangle { - color: styleData.selected ? Theme.qmlDesignerTabLight() : Theme.qmlDesignerTabDark() - implicitWidth: root.width/root.count + 2 - implicitHeight: 28 - Text { - id: text - font.bold: true - font.pixelSize: StudioTheme.Values.myFontSize - anchors.centerIn: parent - anchors.verticalCenterOffset: -1 - text: styleData.title - renderType: Text.NativeRendering - color: styleData.selected ? Theme.qmlDesignerTabDark() : Theme.qmlDesignerTabLight() - } + implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset, + implicitContentWidth + leftPadding + rightPadding) + implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset, + implicitContentHeight + topPadding + bottomPadding) - Rectangle { - color:Theme.qmlDesignerTabLight() - width: parent.width - height: 4 - anchors.bottom: parent.bottom - } - } + padding: 1 + + background: Rectangle { + id: buttonBackground + color: myButton.checked ? StudioTheme.Values.themeTabLight : StudioTheme.Values.themeTabDark + border.color: StudioTheme.Values.themeControlOutline + border.width: 0 + } + + contentItem: T.Label { + id: buttonIcon + color: myButton.checked ? StudioTheme.Values.themeTabDark : StudioTheme.Values.themeTabLight + font.weight: Font.Bold + //font.family: StudioTheme.Constants.font.family + font.pixelSize: StudioTheme.Values.myFontSize + verticalAlignment: Text.AlignVCenter + horizontalAlignment: Text.AlignHCenter + anchors.fill: parent + renderType: Text.QtRendering + + text: myButton.text } } diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/qmldir b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/qmldir index ee876cc935..75cf4f0cfa 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/qmldir +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/qmldir @@ -28,6 +28,8 @@ SliderPopup 1.0 SliderPopup.qml SpinBox 1.0 SpinBox.qml SpinBoxIndicator 1.0 SpinBoxIndicator.qml SpinBoxInput 1.0 SpinBoxInput.qml +TabBar 1.0 TabBar.qml +TabButton 1.0 TabButton.qml TextArea 1.0 TextArea.qml TextField 1.0 TextField.qml TranslationIndicator 1.0 TranslationIndicator.qml diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioTheme/InternalConstants.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioTheme/InternalConstants.qml index c326cc08f1..3d17883c54 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioTheme/InternalConstants.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioTheme/InternalConstants.qml @@ -94,27 +94,33 @@ QtObject { readonly property string fontStyleItalic: "\u0057" readonly property string fontStyleStrikethrough: "\u0058" readonly property string fontStyleUnderline: "\u0059" - readonly property string mergeCells: "\u005A" - readonly property string redo: "\u005B" - readonly property string splitColumns: "\u005C" - readonly property string splitRows: "\u005D" - readonly property string startNode: "\u005E" - readonly property string testIcon: "\u005F" - readonly property string textAlignBottom: "\u0060" - readonly property string textAlignCenter: "\u0061" - readonly property string textAlignLeft: "\u0062" - readonly property string textAlignMiddle: "\u0063" - readonly property string textAlignRight: "\u0064" - readonly property string textAlignTop: "\u0065" - readonly property string textBulletList: "\u0066" - readonly property string textFullJustification: "\u0067" - readonly property string textNumberedList: "\u0068" - readonly property string tickIcon: "\u0069" - readonly property string triState: "\u006A" - readonly property string undo: "\u006B" - readonly property string upDownIcon: "\u006C" - readonly property string upDownSquare2: "\u006D" - readonly property string wildcard: "\u006E" + readonly property string idAliasOff: "\u005A" + readonly property string idAliasOn: "\u005B" + readonly property string mergeCells: "\u005C" + readonly property string redo: "\u005D" + readonly property string splitColumns: "\u005E" + readonly property string splitRows: "\u005F" + readonly property string startNode: "\u0060" + readonly property string testIcon: "\u0061" + readonly property string textAlignBottom: "\u0062" + readonly property string textAlignCenter: "\u0063" + readonly property string textAlignLeft: "\u0064" + readonly property string textAlignMiddle: "\u0065" + readonly property string textAlignRight: "\u0066" + readonly property string textAlignTop: "\u0067" + readonly property string textBulletList: "\u0068" + readonly property string textFullJustification: "\u0069" + readonly property string textNumberedList: "\u006A" + readonly property string tickIcon: "\u006B" + readonly property string triState: "\u006C" + readonly property string undo: "\u006D" + readonly property string upDownIcon: "\u006E" + readonly property string upDownSquare2: "\u006F" + readonly property string wildcard: "\u0070" + readonly property string zoomAll: "\u0071" + readonly property string zoomIn: "\u0072" + readonly property string zoomOut: "\u0073" + readonly property string zoomSelection: "\u0074" readonly property font iconFont: Qt.font({ "family": controlIcons.name, diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioTheme/Values.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioTheme/Values.qml index 9f04812af9..65cc7f3cfc 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioTheme/Values.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioTheme/Values.qml @@ -79,6 +79,8 @@ QtObject { property real inputHorizontalPadding: Math.round(4 * values.scaleFactor) + property real scrollBarThickness: 10 + // Theme Colors // COLORS NOW COME FROM THE THEME FILES @@ -117,6 +119,9 @@ QtObject { property string themeTranslationIndicatorBorder: Theme.color(Theme.DStranlsationIndicatorBorder) property string themeSectionHeadBackground: Theme.color(Theme.DSsectionHeadBackground) + property string themeTabDark: Theme.color(Theme.QmlDesigner_TabDark) + property string themeTabLight: Theme.color(Theme.QmlDesigner_TabLight) + // Taken out of Constants.js property string themeChangedStateText: Theme.color(Theme.DSchangedStateText) } diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioTheme/icons.ttf b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioTheme/icons.ttf Binary files differindex 47becb6873..46a677784a 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioTheme/icons.ttf +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioTheme/icons.ttf diff --git a/share/qtcreator/qmldesigner/statesEditorQmlSources/StatesDelegate.qml b/share/qtcreator/qmldesigner/statesEditorQmlSources/StatesDelegate.qml index e6e5be7523..ef624574ac 100644 --- a/share/qtcreator/qmldesigner/statesEditorQmlSources/StatesDelegate.qml +++ b/share/qtcreator/qmldesigner/statesEditorQmlSources/StatesDelegate.qml @@ -23,13 +23,15 @@ ** ****************************************************************************/ -import QtQuick 2.2 -import QtQuick.Controls 1.1 -import QtQuick.Controls.Styles 1.1 -import HelperWidgets 2.0 +import QtQuick 2.15 import QtQuickDesignerTheme 1.0 +import HelperWidgets 2.0 +import StudioControls 1.0 as StudioControls +import StudioTheme 1.0 as StudioTheme Rectangle { + id: myRoot + border.width: 1 property bool isBaseState property bool isCurrentState @@ -41,6 +43,8 @@ Rectangle { property string delegateWhenConditionString readonly property bool isDefaultState: isDefault + signal delegateInteraction + color: baseColor border.color: Theme.qmlDesignerBorderColor() @@ -50,38 +54,28 @@ Rectangle { } MouseArea { + id: mouseArea anchors.fill: parent acceptedButtons: Qt.LeftButton onClicked: { focus = true root.currentStateInternalId = internalNodeId + contextMenu.dismiss() // close potentially open context menu + myRoot.delegateInteraction() } } - ToolButton { + StudioControls.AbstractButton { id: removeStateButton - - style: ButtonStyle { - background: Rectangle { - color: control.hovered ? Qt.lighter(baseColor, 1.2) : "transparent" - Image { - source: "image://icons/close" - height: 16 - width: 16 - } - } - } - - + buttonIcon: StudioTheme.Constants.closeCross anchors.right: parent.right - anchors.rightMargin: 2 + anchors.rightMargin: 4 anchors.verticalCenter: stateNameField.verticalCenter - height: 16 - width: 16 visible: !isBaseState onClicked: { + myRoot.delegateInteraction() if (isDefaultState) statesEditorModel.resetDefaultState() @@ -89,86 +83,77 @@ Rectangle { } } - Image { - id: whenButton - visible: !isBaseState || (isBaseState && modelHasDefaultState) - width: 14 - height: 14 - x: 4 - y: 6 - source: { - if (whenMouseArea.containsMouse) - return "image://icons/submenu" - - return delegateHasWhenCondition ? "image://icons/expression" : "image://icons/placeholder" + StudioControls.Menu { + id: contextMenu + StudioControls.MenuItem { + enabled: !isBaseState + text: qsTr("Set when Condition") + onTriggered: { + bindingEditor.showWidget() + bindingEditor.text = delegateWhenConditionString + bindingEditor.prepareBindings() + } } - MouseArea { - id: whenMouseArea - hoverEnabled: true - anchors.fill: parent - onClicked: contextMenu.popup() - } - Menu { - id: contextMenu - - MenuItem { - visible: !isBaseState - text: qsTr("Set when Condition") - onTriggered: { - bindingEditor.showWidget() - bindingEditor.text = delegateWhenConditionString - bindingEditor.prepareBindings() - } + StudioControls.MenuItem { + enabled: !isBaseState && delegateHasWhenCondition + text: qsTr("Reset when Condition") + onTriggered: { + statesEditorModel.resetWhenCondition(internalNodeId) } + } - MenuItem { - visible: !isBaseState && delegateHasWhenCondition - text: qsTr("Reset when Condition") - onTriggered: { - statesEditorModel.resetWhenCondition(internalNodeId) - } + StudioControls.MenuItem { + enabled: !isBaseState && !isDefaultState + text: qsTr("Set as Default") + onTriggered: { + statesEditorModel.setStateAsDefault(internalNodeId) } + } - MenuItem { - visible: !isBaseState && !isDefaultState - text: qsTr("Set as Default") - onTriggered: { - statesEditorModel.setStateAsDefault(internalNodeId) - } + StudioControls.MenuItem { + enabled: (!isBaseState && isDefaultState) || (isBaseState && modelHasDefaultState) + text: qsTr("Reset Default") + onTriggered: { + statesEditorModel.resetDefaultState() } + } - MenuItem { - visible: (!isBaseState && isDefaultState) || (isBaseState && modelHasDefaultState) - text: qsTr("Reset Default") - onTriggered: { - statesEditorModel.resetDefaultState() - } - } + onClosed: { + stateNameField.actionIndicator.forceVisible = false + } + + onOpened: { + myRoot.delegateInteraction() } } - TextField { + + StudioControls.TextField { id: stateNameField + + actionIndicator.onClicked: { + stateNameField.actionIndicator.forceVisible = true + contextMenu.popup() + } + + onEditChanged: { + if (contextMenu.open && stateNameField.edit) + contextMenu.dismiss() + } + + actionIndicator.icon.text: delegateHasWhenCondition + ? StudioTheme.Constants.actionIconBinding : StudioTheme.Constants.actionIcon + + translationIndicatorVisible: false y: 4 - font.pixelSize: Theme.smallFontPixelSize() - anchors.left: whenButton.right + anchors.left: parent.left // use the spacing which the image to the delegate rectangle has anchors.leftMargin: 4 anchors.right: removeStateButton.left - anchors.rightMargin: 4 - style: DesignerTextFieldStyle { - background: Rectangle { - implicitWidth: 100 - implicitHeight: font.pixelSize + padding.top + padding.bottom - color: ((isBaseState && modelHasDefaultState) ? "transparent" - : Theme.color(Theme.FancyToolButtonSelectedColor)) - border.color: ((isBaseState && !modelHasDefaultState) || isDefaultState) ? "#ffd700" - : (isBaseState && modelHasDefaultState) ? "transparent" - : Theme.qmlDesignerBackgroundColorDarker() - } - } + anchors.rightMargin: 2 + readOnly: isBaseState onActiveFocusChanged: { @@ -188,7 +173,7 @@ Rectangle { stateNameField.oldValue = stateNameField.text - if (stateNameField.text != delegateStateName) + if (stateNameField.text !== delegateStateName) statesEditorModel.renameState(internalNodeId, stateNameField.text) } } @@ -220,8 +205,8 @@ Rectangle { Text { id: stateDefaultIndicator - anchors.left: whenButton.left - anchors.leftMargin: 0 + anchors.left: parent.left + anchors.leftMargin: StudioTheme.Values.height anchors.right: removeStateButton.left anchors.rightMargin: 4 anchors.bottom: parent.bottom diff --git a/share/qtcreator/qmldesigner/statesEditorQmlSources/StatesList.qml b/share/qtcreator/qmldesigner/statesEditorQmlSources/StatesList.qml index c512b7098a..8eb80fbfc6 100644 --- a/share/qtcreator/qmldesigner/statesEditorQmlSources/StatesList.qml +++ b/share/qtcreator/qmldesigner/statesEditorQmlSources/StatesList.qml @@ -23,32 +23,33 @@ ** ****************************************************************************/ -import QtQuick 2.2 -import QtQuick.Controls 1.1 -import QtQuick.Controls.Styles 1.1 -import "../common" +import QtQuick 2.15 +import QtQuick.Controls 2.15 import QtQuickDesignerTheme 1.0 +import HelperWidgets 2.0 +import StudioControls 1.0 as StudioControls +import StudioTheme 1.0 as StudioTheme FocusScope { id: root - height: expanded ? 192 : 40 + height: (root.expanded ? 192 : 40) + StudioTheme.Values.scrollBarThickness signal createNewState signal deleteState(int internalNodeId) signal duplicateCurrentState property int stateImageSize: 180 - property int delegateWidth: stateImageSize + 44 property int padding: 2 - property int delegateHeight: root.height - padding * 2 + 1 + property int delegateWidth: root.stateImageSize + 44 + property int delegateHeight: root.height - StudioTheme.Values.scrollBarThickness - root.padding * 2 + 1 property int innerSpacing: 0 - property int currentStateInternalId : 0 + property int currentStateInternalId: 0 property bool expanded: true Connections { target: statesEditorModel - onChangedToState: root.currentStateInternalId = n + function onChangedToState(n) { root.currentStateInternalId = n } } SystemPalette { @@ -66,35 +67,41 @@ FocusScope { acceptedButtons: Qt.LeftButton | Qt.RightButton onClicked: { - if (mouse.button === Qt.LeftButton) + if (mouse.button === Qt.LeftButton) { + contextMenu.dismiss() focus = true - else if (mouse.button === Qt.RightButton) + } else if (mouse.button === Qt.RightButton) { contextMenu.popup() + } } - Menu { + StudioControls.Menu { id: contextMenu - MenuItem { + StudioControls.MenuItem { text: root.expanded ? qsTr("Collapse") : qsTr("Expand") onTriggered: { root.expanded = !root.expanded } - } } } + function closeContextMenu() { + if (contextMenu.open) + contextMenu.dismiss() + } + Item { id: addStateItem - property int buttonLeftSpacing: 8 * (expanded ? 1 : 2) + property int buttonLeftSpacing: 8 * (root.expanded ? 1 : 2) anchors.right: parent.right - width: delegateHeight / 2 + buttonLeftSpacing - height: delegateHeight + width: root.delegateHeight / 2 + buttonLeftSpacing + height: root.delegateHeight - Button { + AbstractButton { id: addStateButton visible: canAddNewStates @@ -106,56 +113,69 @@ FocusScope { width: Math.max(parent.height / 2 - 8, 18) height: width - onClicked: root.createNewState() - - style: ButtonStyle { - background: Rectangle { - property color buttonBaseColor: Qt.darker(Theme.qmlDesignerBackgroundColorDarkAlternate(), 1.1) - color: control.hovered ? Qt.lighter(buttonBaseColor, 1.2) : buttonBaseColor - border.color: Theme.qmlDesignerBorderColor() - border.width: 1 - Image { - source: "image://icons/plus" - width: 16 - height: 16 - anchors.centerIn: parent - smooth: false - } + onClicked: { + root.closeContextMenu() + root.createNewState() + } + + background: Rectangle { + property color buttonBaseColor: Qt.darker(Theme.qmlDesignerBackgroundColorDarkAlternate(), 1.1) + color: addStateButton.hovered ? Qt.lighter(buttonBaseColor, 1.2) : buttonBaseColor + border.color: Theme.qmlDesignerBorderColor() + border.width: 1 + Image { + source: "image://icons/plus" + width: 16 + height: 16 + anchors.centerIn: parent + smooth: false } } } } - ScrollView { + ListView { + id: flickable + + boundsBehavior: Flickable.StopAtBounds + clip: true + anchors.left: parent.left anchors.right: addStateItem.left - height: delegateHeight - y: padding - anchors.leftMargin: padding - anchors.rightMargin: padding + height: root.delegateHeight + StudioTheme.Values.scrollBarThickness + y: root.padding + anchors.leftMargin: root.padding + anchors.rightMargin: root.padding + + model: statesEditorModel + orientation: ListView.Horizontal + spacing: root.innerSpacing + + delegate: StatesDelegate { + id: statesDelegate + width: root.delegateWidth + height: root.delegateHeight + isBaseState: 0 == internalNodeId + isCurrentState: root.currentStateInternalId == internalNodeId + baseColor: isCurrentState ? Theme.color(Theme.QmlDesigner_HighlightColor) : background.color + delegateStateName: stateName + delegateStateImageSource: stateImageSource + delegateStateImageSize: stateImageSize + delegateHasWhenCondition: hasWhenCondition + delegateWhenConditionString: whenConditionString + onDelegateInteraction: root.closeContextMenu() + } - style: DesignerScrollViewStyle { + property bool bothVisible: horizontal.scrollBarVisible && vertical.scrollBarVisible + + ScrollBar.horizontal: HorizontalScrollBar { + id: horizontal + parent: flickable } - ListView { - anchors.fill: parent - model: statesEditorModel - orientation: ListView.Horizontal - spacing: innerSpacing - - delegate: StatesDelegate { - id: statesDelegate - width: delegateWidth - height: delegateHeight - isBaseState: 0 == internalNodeId - isCurrentState: root.currentStateInternalId == internalNodeId - baseColor: isCurrentState ? Theme.color(Theme.QmlDesigner_HighlightColor) : background.color - delegateStateName: stateName - delegateStateImageSource: stateImageSource - delegateStateImageSize: stateImageSize - delegateHasWhenCondition: hasWhenCondition - delegateWhenConditionString: whenConditionString - } + ScrollBar.vertical: VerticalScrollBar { + id: vertical + parent: flickable } } } diff --git a/src/libs/advanceddockingsystem/dockwidgettab.cpp b/src/libs/advanceddockingsystem/dockwidgettab.cpp index af0ce4baef..7a4784b6e0 100644 --- a/src/libs/advanceddockingsystem/dockwidgettab.cpp +++ b/src/libs/advanceddockingsystem/dockwidgettab.cpp @@ -201,6 +201,9 @@ namespace ADS boxLayout->addSpacing(qRound(spacing * 4.0 / 3.0)); boxLayout->setAlignment(Qt::AlignCenter | Qt::AlignVCenter); + if (DockManager::testConfigFlag(DockManager::FocusHighlighting)) + m_closeButton->setCheckable(true); + m_titleLabel->setVisible(true); } @@ -425,7 +428,6 @@ namespace ADS setFocus(Qt::OtherFocusReason); updateFocusStyle = true; } - if (d->m_isActiveTab == active) { if (updateFocusStyle) updateStyle(); @@ -527,6 +529,7 @@ namespace ADS d->m_titleLabel->setToolTip(text); } #endif + return Super::event(event); } @@ -547,6 +550,13 @@ namespace ADS void DockWidgetTab::updateStyle() { + if (DockManager::testConfigFlag(DockManager::FocusHighlighting)) { + if (property("focused").toBool()) + d->m_closeButton->setChecked(true); + else + d->m_closeButton->setChecked(false); + } + internal::repolishStyle(this, internal::RepolishDirectChildren); } diff --git a/src/libs/cplusplus/pp-engine.cpp b/src/libs/cplusplus/pp-engine.cpp index 107e2ed4b7..6ce879ea53 100644 --- a/src/libs/cplusplus/pp-engine.cpp +++ b/src/libs/cplusplus/pp-engine.cpp @@ -1557,7 +1557,8 @@ bool Preprocessor::collectActualArguments(PPToken *tk, QVector<QVector<PPToken> } if (!tk->is(T_RPAREN)) { - //###TODO: else error message + return false; + //###TODO: error message } return true; } diff --git a/src/libs/qmljs/parser/qmljs.g b/src/libs/qmljs/parser/qmljs.g index 46505af1ea..4aba778e93 100644 --- a/src/libs/qmljs/parser/qmljs.g +++ b/src/libs/qmljs/parser/qmljs.g @@ -1320,6 +1320,40 @@ UiObjectMember: T_DEFAULT UiObjectMemberPropertyNoInitialiser; } break; ./ +UiObjectMember: T_REQUIRED UiObjectMemberListPropertyNoInitialiser; +/. + case $rule_number: { + AST::UiPublicMember *node = sym(2).UiPublicMember; + node->isRequired = true; + node->requiredToken = loc(1); + sym(1).Node = node; + } break; +./ + +UiObjectMember: T_DEFAULT T_REQUIRED UiObjectMemberListPropertyNoInitialiser; +/. + case $rule_number: { + AST::UiPublicMember *node = sym(3).UiPublicMember; + node->isRequired = true; + node->requiredToken = loc(2); + node->isDefaultMember = true; + node->defaultToken = loc(1); + sym(1).Node = node; + } break; +./ + +UiObjectMember: T_REQUIRED T_DEFAULT UiObjectMemberListPropertyNoInitialiser; +/. + case $rule_number: { + AST::UiPublicMember *node = sym(3).UiPublicMember; + node->isRequired = true; + node->requiredToken = loc(1); + node->isDefaultMember = true; + node->defaultToken = loc(2); + sym(1).Node = node; + } break; +./ + UiObjectMember: T_DEFAULT UiObjectMemberListPropertyNoInitialiser; /. case $rule_number: { diff --git a/src/libs/qmljs/parser/qmljsgrammar.cpp b/src/libs/qmljs/parser/qmljsgrammar.cpp index d468b9d6dc..23162f8323 100644 --- a/src/libs/qmljs/parser/qmljsgrammar.cpp +++ b/src/libs/qmljs/parser/qmljsgrammar.cpp @@ -79,60 +79,60 @@ const short QmlJSGrammar::lhs [] = { 169, 169, 169, 169, 169, 169, 169, 169, 169, 165, 177, 177, 177, 177, 178, 178, 179, 179, 179, 179, 165, 165, 180, 165, 165, 181, 165, 165, 165, 165, - 165, 182, 182, 183, 165, 165, 184, 165, 165, 165, - 185, 165, 165, 186, 165, 165, 165, 165, 165, 164, - 165, 165, 190, 190, 190, 190, 154, 154, 154, 154, - 154, 154, 154, 154, 154, 154, 154, 148, 148, 148, + 165, 165, 165, 165, 182, 182, 183, 165, 165, 184, + 165, 165, 165, 185, 165, 165, 186, 165, 165, 165, + 165, 165, 164, 165, 165, 190, 190, 190, 190, 154, + 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, - 191, 192, 193, 193, 194, 194, 194, 195, 196, 196, - 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, - 197, 206, 206, 206, 206, 198, 198, 198, 198, 198, - 198, 204, 204, 199, 199, 199, 211, 211, 211, 211, - 211, 213, 213, 210, 210, 214, 200, 200, 200, 168, - 216, 168, 216, 218, 218, 219, 217, 218, 218, 222, - 222, 224, 221, 224, 221, 224, 226, 226, 227, 227, + 148, 148, 148, 191, 192, 193, 193, 194, 194, 194, + 195, 196, 196, 197, 197, 197, 197, 197, 197, 197, + 197, 197, 197, 197, 206, 206, 206, 206, 198, 198, + 198, 198, 198, 198, 204, 204, 199, 199, 199, 211, + 211, 211, 211, 211, 213, 213, 210, 210, 214, 200, + 200, 200, 168, 216, 168, 216, 218, 218, 219, 217, + 218, 218, 222, 222, 224, 221, 224, 221, 224, 226, + 226, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, - 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, - 227, 227, 227, 227, 227, 227, 225, 228, 220, 229, - 230, 229, 230, 205, 231, 231, 205, 151, 232, 151, - 151, 233, 151, 151, 151, 151, 234, 236, 236, 237, - 151, 237, 237, 237, 237, 237, 235, 235, 235, 238, - 238, 238, 238, 239, 239, 240, 240, 240, 240, 240, - 241, 241, 241, 241, 241, 241, 241, 241, 242, 242, - 243, 243, 244, 244, 244, 245, 245, 245, 246, 246, - 246, 246, 247, 248, 247, 248, 249, 249, 249, 249, - 249, 247, 250, 251, 247, 248, 252, 253, 252, 253, - 254, 254, 254, 254, 255, 256, 255, 256, 257, 258, - 257, 258, 259, 260, 259, 260, 261, 262, 261, 262, - 263, 264, 263, 264, 265, 266, 265, 266, 267, 268, - 267, 268, 215, 212, 215, 212, 215, 212, 215, 212, - 215, 212, 273, 273, 273, 273, 273, 273, 273, 273, - 273, 273, 273, 273, 137, 207, 137, 207, 274, 275, - 274, 275, 136, 136, 136, 136, 136, 136, 136, 136, - 136, 136, 136, 136, 136, 136, 284, 284, 284, 285, - 285, 289, 289, 277, 277, 276, 171, 294, 294, 295, - 295, 293, 293, 296, 296, 297, 298, 287, 301, 303, - 189, 299, 300, 302, 304, 299, 300, 302, 304, 308, - 305, 306, 307, 308, 305, 306, 307, 309, 309, 310, - 310, 310, 311, 311, 311, 312, 312, 313, 313, 315, - 314, 314, 314, 316, 316, 208, 208, 209, 209, 172, - 166, 170, 173, 173, 292, 292, 292, 292, 292, 292, - 317, 317, 292, 292, 318, 318, 318, 318, 278, 278, - 279, 279, 280, 174, 175, 319, 319, 322, 322, 320, - 320, 323, 321, 281, 324, 324, 282, 176, 176, 176, - 325, 326, 327, 327, 283, 328, 288, 188, 290, 290, - 201, 201, 333, 329, 329, 329, 329, 329, 334, 334, - 335, 330, 332, 331, 271, 272, 271, 272, 336, 336, - 337, 223, 223, 223, 223, 341, 338, 340, 342, 187, - 291, 291, 203, 203, 339, 269, 270, 269, 270, 269, - 270, 286, 202, 347, 202, 347, 344, 346, 348, 343, - 343, 345, 345, 349, 349, 350, 350, 350, 139, 139, - 351, 140, 353, 352, 352, 354, 354, 355, 355, 355, - 356, 356, 358, 358, 358, 358, 358, 361, 362, 363, - 363, 363, 359, 365, 365, 366, 366, 360, 364, 367, - 357, 357, 357, 357, 357, 357, 357, 357, 368, 368, - 368, 369, 369, 370, 370, 371 + 227, 227, 227, 227, 227, 227, 227, 227, 227, 225, + 228, 220, 229, 230, 229, 230, 205, 231, 231, 205, + 151, 232, 151, 151, 233, 151, 151, 151, 151, 234, + 236, 236, 237, 151, 237, 237, 237, 237, 237, 235, + 235, 235, 238, 238, 238, 238, 239, 239, 240, 240, + 240, 240, 240, 241, 241, 241, 241, 241, 241, 241, + 241, 242, 242, 243, 243, 244, 244, 244, 245, 245, + 245, 246, 246, 246, 246, 247, 248, 247, 248, 249, + 249, 249, 249, 249, 247, 250, 251, 247, 248, 252, + 253, 252, 253, 254, 254, 254, 254, 255, 256, 255, + 256, 257, 258, 257, 258, 259, 260, 259, 260, 261, + 262, 261, 262, 263, 264, 263, 264, 265, 266, 265, + 266, 267, 268, 267, 268, 215, 212, 215, 212, 215, + 212, 215, 212, 215, 212, 273, 273, 273, 273, 273, + 273, 273, 273, 273, 273, 273, 273, 137, 207, 137, + 207, 274, 275, 274, 275, 136, 136, 136, 136, 136, + 136, 136, 136, 136, 136, 136, 136, 136, 136, 284, + 284, 284, 285, 285, 289, 289, 277, 277, 276, 171, + 294, 294, 295, 295, 293, 293, 296, 296, 297, 298, + 287, 301, 303, 189, 299, 300, 302, 304, 299, 300, + 302, 304, 308, 305, 306, 307, 308, 305, 306, 307, + 309, 309, 310, 310, 310, 311, 311, 311, 312, 312, + 313, 313, 315, 314, 314, 314, 316, 316, 208, 208, + 209, 209, 172, 166, 170, 173, 173, 292, 292, 292, + 292, 292, 292, 317, 317, 292, 292, 318, 318, 318, + 318, 278, 278, 279, 279, 280, 174, 175, 319, 319, + 322, 322, 320, 320, 323, 321, 281, 324, 324, 282, + 176, 176, 176, 325, 326, 327, 327, 283, 328, 288, + 188, 290, 290, 201, 201, 333, 329, 329, 329, 329, + 329, 334, 334, 335, 330, 332, 331, 271, 272, 271, + 272, 336, 336, 337, 223, 223, 223, 223, 341, 338, + 340, 342, 187, 291, 291, 203, 203, 339, 269, 270, + 269, 270, 269, 270, 286, 202, 347, 202, 347, 344, + 346, 348, 343, 343, 345, 345, 349, 349, 350, 350, + 350, 139, 139, 351, 140, 353, 352, 352, 354, 354, + 355, 355, 355, 356, 356, 358, 358, 358, 358, 358, + 361, 362, 363, 363, 363, 359, 365, 365, 366, 366, + 360, 364, 367, 357, 357, 357, 357, 357, 357, 357, + 357, 368, 368, 368, 369, 369, 370, 370, 371 }; const short QmlJSGrammar::rhs [] = { @@ -144,60 +144,60 @@ const short QmlJSGrammar::rhs [] = { 3, 3, 3, 2, 2, 2, 2, 2, 2, 3, 1, 1, 1, 3, 0, 1, 3, 2, 5, 4, 6, 3, 7, 1, 2, 4, 1, 2, 2, 3, - 3, 0, 1, 3, 1, 2, 6, 1, 2, 2, - 11, 1, 2, 8, 1, 2, 1, 1, 1, 1, - 5, 4, 1, 3, 3, 5, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 3, 4, 1, 1, 2, 1, 0, + 3, 2, 3, 3, 0, 1, 3, 1, 2, 6, + 1, 2, 2, 11, 1, 2, 8, 1, 2, 1, + 1, 1, 1, 5, 4, 1, 3, 3, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 3, 2, 3, 5, 1, 1, 1, 1, 1, - 1, 1, 1, 3, 3, 5, 1, 2, 2, 4, - 4, 1, 2, 0, 1, 2, 2, 3, 4, 1, - 1, 3, 3, 1, 1, 2, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 3, 4, 1, 1, + 2, 1, 0, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 3, 2, 3, 5, 1, 1, + 1, 1, 1, 1, 1, 1, 3, 3, 5, 1, + 2, 2, 4, 4, 1, 2, 0, 1, 2, 2, + 3, 4, 1, 1, 3, 3, 1, 1, 2, 3, + 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 3, 2, 2, 0, - 0, 1, 1, 1, 1, 3, 3, 1, 1, 4, - 4, 3, 3, 3, 1, 5, 1, 1, 2, 2, - 2, 4, 4, 4, 4, 3, 0, 1, 2, 1, - 2, 3, 4, 1, 1, 1, 2, 2, 2, 2, - 1, 2, 2, 2, 2, 2, 2, 2, 1, 3, - 1, 3, 1, 1, 1, 1, 3, 3, 1, 3, - 3, 3, 1, 1, 3, 3, 1, 1, 1, 1, - 1, 3, 3, 3, 1, 1, 1, 1, 3, 3, - 1, 1, 1, 1, 1, 1, 3, 3, 1, 1, - 3, 3, 1, 1, 3, 3, 1, 1, 3, 3, - 1, 1, 3, 3, 1, 1, 3, 3, 1, 1, - 5, 5, 1, 1, 1, 1, 1, 1, 3, 3, - 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 3, 3, 0, 0, - 1, 1, 3, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 3, 1, 2, 1, - 4, 1, 1, 1, 1, 1, 2, 2, 2, 2, - 2, 1, 1, 1, 1, 3, 3, 3, 3, 3, - 3, 3, 3, 2, 2, 2, 2, 3, 3, 0, - 1, 2, 2, 1, 4, 1, 3, 1, 3, 2, - 2, 4, 4, 3, 2, 2, 2, 0, 1, 1, - 0, 2, 7, 5, 7, 7, 5, 9, 9, 9, - 1, 1, 7, 7, 3, 3, 2, 2, 2, 3, - 2, 3, 3, 5, 5, 3, 5, 1, 2, 0, - 1, 4, 3, 3, 1, 3, 3, 3, 3, 4, - 5, 2, 1, 1, 2, 1, 9, 9, 1, 8, - 9, 8, 1, 0, 1, 1, 2, 3, 1, 3, - 1, 1, 1, 1, 4, 4, 7, 7, 1, 1, - 0, 8, 9, 8, 9, 1, 1, 1, 1, 8, - 1, 7, 8, 7, 1, 1, 1, 3, 3, 2, - 2, 6, 6, 5, 5, 1, 1, 1, 1, 0, - 2, 0, 1, 1, 2, 1, 2, 1, 0, 1, - 1, 1, 1, 0, 1, 1, 2, 2, 2, 1, - 3, 2, 1, 1, 1, 3, 3, 1, 3, 2, - 3, 4, 2, 1, 3, 1, 3, 1, 1, 0, - 3, 3, 2, 2, 2, 5, 5, 4, 2, 3, - 4, 1, 3, 1, 3, 2 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, + 2, 2, 0, 0, 1, 1, 1, 1, 3, 3, + 1, 1, 4, 4, 3, 3, 3, 1, 5, 1, + 1, 2, 2, 2, 4, 4, 4, 4, 3, 0, + 1, 2, 1, 2, 3, 4, 1, 1, 1, 2, + 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, + 2, 1, 3, 1, 3, 1, 1, 1, 1, 3, + 3, 1, 3, 3, 3, 1, 1, 3, 3, 1, + 1, 1, 1, 1, 3, 3, 3, 1, 1, 1, + 1, 3, 3, 1, 1, 1, 1, 1, 1, 3, + 3, 1, 1, 3, 3, 1, 1, 3, 3, 1, + 1, 3, 3, 1, 1, 3, 3, 1, 1, 3, + 3, 1, 1, 5, 5, 1, 1, 1, 1, 1, + 1, 3, 3, 3, 3, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, + 3, 0, 0, 1, 1, 3, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, + 1, 2, 1, 4, 1, 1, 1, 1, 1, 2, + 2, 2, 2, 2, 1, 1, 1, 1, 3, 3, + 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, + 3, 3, 0, 1, 2, 2, 1, 4, 1, 3, + 1, 3, 2, 2, 4, 4, 3, 2, 2, 2, + 0, 1, 1, 0, 2, 7, 5, 7, 7, 5, + 9, 9, 9, 1, 1, 7, 7, 3, 3, 2, + 2, 2, 3, 2, 3, 3, 5, 5, 3, 5, + 1, 2, 0, 1, 4, 3, 3, 1, 3, 3, + 3, 3, 4, 5, 2, 1, 1, 2, 1, 9, + 9, 1, 8, 9, 8, 1, 0, 1, 1, 2, + 3, 1, 3, 1, 1, 1, 1, 4, 4, 7, + 7, 1, 1, 0, 8, 9, 8, 9, 1, 1, + 1, 1, 8, 1, 7, 8, 7, 1, 1, 1, + 3, 3, 2, 2, 6, 6, 5, 5, 1, 1, + 1, 1, 0, 2, 0, 1, 1, 2, 1, 2, + 1, 0, 1, 1, 1, 1, 0, 1, 1, 2, + 2, 2, 1, 3, 2, 1, 1, 1, 3, 3, + 1, 3, 2, 3, 4, 2, 1, 3, 1, 3, + 1, 1, 0, 3, 3, 2, 2, 2, 5, 5, + 4, 2, 3, 4, 1, 3, 1, 3, 2 }; @@ -210,61 +210,61 @@ const int QmlJSGrammar::rule_info [] = { 158, 34, 162, 57, 161, 164, 158, 138, 160, 165, 138, 165, 165, 161, 165, 164, 7, 166, 35, 163, 58, 165, 164, 7, 166, 164, 158, 165, 164, 130, 164, 158, 167, 34, 166, 168, 57, 149, 167, 34, 166, 168, 8, 57, 149, 169, 166, 127, 170, 169, 166, 128, 171, 169, 166, 128, 167, 169, 166, 172, 169, 166, 170, 169, 166, 173, 169, 166, 174, 169, 166, 175, 169, 166, 176, 165, 164, 7, 169, 177, 79, 177, 92, 177, 30, 177, 177, 15, 30, 178, 178, 179, 179, 154, 7, 177, 179, 177, 154, 179, 179, 8, 154, 7, 177, 179, 179, 8, 177, 154, - 165, 71, 30, 37, 178, 62, 149, 165, 71, 30, 149, 180, 70, 30, 38, 177, 25, 154, 149, 165, 180, 165, 72, 180, 181, 70, 177, 154, 149, 165, 181, 165, 10, 181, 165, 10, 180, 165, 10, 107, 181, - 165, 107, 10, 181, 182, 182, 149, 183, 107, 154, 149, 165, 183, 165, 107, 181, 184, 70, 177, 154, 7, 169, 182, 165, 184, 165, 72, 184, 165, 10, 184, - 185, 70, 30, 38, 177, 25, 154, 7, 35, 163, 58, 149, 165, 185, 165, 72, 185, 186, 70, 177, 154, 7, 166, 164, 158, 149, 165, 186, 165, 72, 186, 165, 187, 165, 188, 165, 189, 164, 151, - 165, 98, 30, 34, 190, 57, 165, 108, 30, 7, 161, 190, 30, 190, 30, 17, 48, 190, 190, 8, 30, 190, 190, 8, 30, 17, 48, 154, 30, 154, 70, 154, 71, 154, 72, - 154, 130, 154, 118, 154, 119, 154, 106, 154, 117, 154, 107, 154, 108, 148, 30, 148, 70, 148, 71, - 148, 72, 148, 130, 148, 118, 148, 119, 148, 106, 148, 104, 148, 117, 148, 116, 148, 107, 148, 108, - 191, 148, 192, 191, 193, 194, 193, 193, 8, 194, 194, 164, 38, 193, 25, 194, 92, 194, 164, 195, 7, 194, 196, 195, 196, - 197, 74, 197, 191, 197, 198, 197, 199, 197, 200, 197, 201, 197, 202, 197, 203, 197, 204, 197, 205, - 197, 206, 206, 37, 207, 62, 206, 37, 62, 206, 37, 208, 62, 206, 37, 207, 8, 209, 62, 198, 85, 198, 86, 198, 87, 198, 48, 198, 93, - 198, 69, 204, 12, 204, 13, 199, 35, 210, 58, 199, 35, 211, 58, 199, 35, 211, 8, 210, 58, 211, 212, 211, 213, 212, 211, 210, 214, 211, 211, 8, 210, 212, - 211, 211, 8, 210, 214, 213, 8, 213, 213, 8, 210, 210, 213, 214, 99, 215, 200, 34, 57, 200, 34, 216, 57, 200, 34, 216, 8, 57, 168, 217, - 216, 218, 168, 168, 8, 217, 216, 216, 8, 218, 218, 191, 218, 219, 219, 191, 220, 217, 221, 7, 212, 218, 222, 7, 212, 218, 223, 222, 224, - 222, 225, 224, 226, 221, 69, 224, 69, 221, 48, 224, 48, 226, 191, 226, 227, 227, 4, 227, 5, - 227, 6, 227, 9, 227, 10, 227, 11, 227, 14, 227, 16, 227, 98, 227, 87, 227, 20, 227, 21, - 227, 23, 227, 31, 227, 32, 227, 33, 227, 44, 227, 85, 227, 61, 227, 73, 227, 74, 227, 75, - 227, 86, 227, 77, 227, 78, 227, 79, 227, 80, 227, 81, 227, 88, 227, 89, 227, 91, 227, 92, - 227, 101, 227, 82, 227, 102, 227, 103, 227, 105, 227, 114, 225, 35, 212, 58, 228, 17, 215, 220, 17, 212, 229, - 230, 229, 228, 230, 220, 205, 109, 231, 112, 231, 111, 137, 231, 205, 110, 137, 231, 151, 197, 232, 101, 151, 232, 35, 207, 58, - 151, 151, 35, 207, 58, 233, 44, 15, 30, 151, 232, 15, 226, 151, 151, 15, 226, 151, 234, 151, 44, 151, 37, 235, 62, 234, 233, 236, 151, 236, 44, 236, 237, 237, 205, - 151, 151, 205, 237, 151, 37, 235, 62, 237, 232, 37, 235, 62, 237, 237, 37, 235, 62, 237, 237, 35, 207, 58, 237, 237, 15, 226, 235, 235, 238, 235, 238, 8, 238, 212, - 238, 99, 212, 238, 238, 8, 212, 238, 238, 8, 99, 212, 239, 236, 239, 237, 240, 239, 240, 239, 55, 240, 239, 43, 240, 55, 241, 240, 43, 241, - 241, 240, 241, 11, 241, 241, 80, 241, 241, 78, 241, 241, 53, 241, 241, 41, 241, 241, 76, 241, 241, 45, 241, 242, 241, 242, 240, 66, 242, - 243, 242, 243, 243, 244, 242, 244, 65, 244, 12, 244, 59, 245, 243, 245, 245, 53, 243, 245, 245, 41, 243, 246, 245, 246, 246, 39, 245, - 246, 246, 26, 245, 246, 246, 28, 245, 247, 246, 248, 246, 247, 247, 249, 246, 248, 248, 249, 246, 249, 38, 249, 25, 249, 36, 249, 24, - 249, 33, 247, 247, 32, 246, 250, 247, 116, 194, 251, 248, 116, 194, 247, 250, 248, 251, 252, 247, 253, 248, 252, 252, 254, 247, 253, 253, 254, 248, - 254, 18, 254, 46, 254, 19, 254, 47, 255, 253, 256, 252, 255, 255, 1, 253, 256, 256, 1, 252, 257, 255, 258, 256, - 257, 257, 83, 255, 258, 258, 83, 256, 259, 257, 260, 258, 259, 259, 49, 257, 260, 260, 49, 258, 261, 259, 262, 260, 261, 261, 2, 259, 262, 262, 2, 260, - 263, 261, 264, 262, 263, 263, 52, 261, 264, 264, 52, 262, 265, 263, 266, 264, 265, 265, 97, 263, 266, 266, 97, 264, 267, 265, 268, 266, - 267, 265, 56, 212, 7, 215, 268, 266, 56, 212, 7, 212, 215, 267, 212, 268, 215, 269, 212, 270, 215, 271, 212, 272, 215, 239, 17, 215, 212, 239, 17, 212, - 215, 239, 273, 215, 212, 239, 273, 212, 273, 68, 273, 67, 273, 13, 273, 60, 273, 54, 273, 42, 273, 40, 273, 27, - 273, 29, 273, 3, 273, 84, 273, 51, 137, 215, 207, 212, 137, 137, 8, 215, 207, 207, 8, 212, 274, 275, - 274, 137, 275, 207, 136, 166, 128, 276, 136, 166, 189, 136, 166, 172, 136, 166, 170, 136, 166, 173, 136, 166, 277, 136, 166, 278, 136, 166, 279, - 136, 166, 280, 136, 166, 174, 136, 166, 281, 136, 166, 282, 136, 166, 176, 136, 166, 283, 284, 285, 284, 286, 284, 287, 285, 288, - 285, 187, 289, 290, 289, 291, 277, 292, 277, 175, 276, 171, 171, 34, 293, 57, 294, 295, 294, 294, 295, 295, 136, - 295, 166, 127, 284, 149, 293, 166, 293, 294, 296, 89, 296, 88, 297, 79, 298, 296, 299, 287, 296, 300, 301, 297, 302, 303, 297, 304, - 189, 303, 149, 299, 305, 300, 305, 302, 306, 304, 307, 299, 299, 8, 308, 300, 300, 8, 305, 302, 302, 8, 306, 304, 304, 8, 307, 308, 192, 196, 229, - 305, 192, 196, 230, 306, 192, 196, 229, 307, 192, 196, 230, 308, 309, 228, 305, 309, 220, 306, 309, 228, 307, 309, 220, 309, 34, 310, 57, 309, 35, 311, 58, 310, - 310, 312, 310, 312, 8, 311, 210, 209, 311, 313, 311, 313, 8, 210, 209, 312, 314, 312, 312, 8, 314, 313, 315, 313, 313, 8, 315, 315, 210, 316, - 314, 192, 230, 314, 222, 7, 192, 230, 314, 222, 7, 309, 230, 316, 192, 196, 230, 316, 309, 230, 208, 99, 192, 208, 99, 309, 209, 209, 208, 172, 63, - 166, 170, 207, 149, 173, 31, 37, 207, 62, 136, 16, 136, 173, 31, 37, 207, 62, 136, 292, 14, 136, 81, 37, 207, 62, 95, 292, 14, 136, 81, 37, 207, 62, 149, 292, 81, 37, 207, 62, 136, 292, 21, 37, 274, 63, 275, 63, 275, 62, 136, 292, 21, 37, 301, 63, 275, 63, 275, 62, 136, 292, 21, 37, 298, 63, 275, 63, 275, 62, 136, - 317, 32, 317, 117, 292, 21, 37, 239, 317, 207, 62, 136, 292, 21, 37, 318, 317, 207, 62, 136, 318, 296, 192, 196, 318, 297, 192, 196, 318, 296, 309, 318, 297, 309, 278, 9, 149, 278, 9, 191, 149, - 279, 4, 149, 279, 4, 191, 149, 280, 61, 275, 149, 174, 82, 37, 207, 62, 136, 175, 73, 37, 207, 62, 319, 319, 34, 320, 57, 319, 34, 320, 321, 320, 57, 322, 323, 322, 322, 323, 320, - 320, 322, 323, 5, 207, 7, 293, 321, 10, 7, 293, 281, 191, 7, 324, 324, 136, 324, 166, 127, 288, 282, 75, 207, 149, 176, 77, 171, 325, 176, 77, 171, 326, 176, 77, 171, 325, 326, - 325, 6, 37, 327, 62, 171, 326, 20, 171, 327, 192, 327, 309, 283, 91, 149, 328, 23, 288, 328, 192, 37, 329, 62, 196, 330, 331, 332, 188, 328, 192, 37, 329, 62, 196, 330, 331, 332, 290, 288, 290, 328, 37, 329, 62, 196, 330, 331, 332, - 201, 23, 192, 37, 329, 62, 196, 330, 331, 332, 201, 23, 37, 329, 62, 196, 330, 331, 332, 333, 329, 329, 329, 208, 329, 334, 329, 334, 8, 329, 334, 8, 208, 334, 316, 334, 334, 8, 316, - 335, 316, 330, 34, 332, 57, 331, 293, 271, 336, 96, 337, 215, 272, 336, 96, 337, 212, 271, 336, 96, 337, 128, 330, 331, 332, 272, 336, 96, 337, 128, 330, 331, 332, 336, 192, 336, 206, - 337, 223, 222, 37, 333, 62, 196, 330, 331, 332, 223, 65, 222, 338, 333, 62, 196, 330, 339, 340, 223, 118, 222, 37, 62, 196, 330, 331, 332, 223, 119, 222, 37, 341, 62, 196, 330, 331, 332, 341, 335, 338, 37, 340, 57, 342, 22, 187, 342, 192, 338, 329, 62, 330, 339, 340, - 291, 187, 291, 342, 338, 329, 62, 330, 339, 340, 203, 22, 192, 338, 329, 62, 330, 339, 340, 203, 22, 338, 329, 62, 330, 339, 340, 339, 331, 269, 100, 270, 100, 269, 100, 65, 215, 270, 100, 65, 212, 269, 100, 215, - 270, 100, 212, 286, 102, 192, 343, 344, 345, 346, 202, 102, 192, 343, 344, 345, 346, 347, 102, 343, 344, 345, 346, 202, 102, 343, 344, 345, 346, 347, 286, 344, 34, 346, 57, 348, 104, 343, - 343, 103, 239, 345, 345, 349, 349, 350, 349, 349, 350, 350, 223, 350, 348, 223, 350, 63, 139, 139, 351, - 351, 294, 140, 352, 353, 354, 352, 352, 353, 354, 355, 354, 354, 355, 355, 356, 149, 355, 357, 149, 355, 295, - 356, 114, 358, 359, 356, 114, 360, 358, 361, 358, 362, 358, 363, 358, 361, 8, 362, 358, 361, 8, 363, 361, 364, 362, 65, 116, 364, 363, 34, 57, - 363, 34, 365, 57, 363, 34, 365, 8, 57, 359, 106, 360, 365, 366, 365, 365, 8, 366, 366, 364, 366, 226, 116, 364, 360, 69, 364, 192, 367, - 357, 105, 65, 359, 357, 105, 368, 359, 357, 105, 368, 357, 105, 189, 357, 105, 284, 357, 105, 10, 367, 127, 289, 357, 105, 10, 367, 127, 347, 357, 105, 10, 367, 212, 368, 34, 57, 368, 34, 369, 57, - 368, 34, 369, 8, 57, 369, 370, 369, 369, 8, 370, 370, 226, 370, 226, 116, 226, 371, 134, 0 + 165, 71, 30, 37, 178, 62, 149, 165, 71, 30, 149, 180, 70, 30, 38, 177, 25, 154, 149, 165, 180, 165, 72, 180, 181, 70, 177, 154, 149, 165, 181, 165, 10, 181, 165, 107, 180, 165, 10, 107, 180, + 165, 107, 10, 180, 165, 10, 180, 165, 10, 107, 181, 165, 107, 10, 181, 182, 182, 149, 183, 107, 154, 149, 165, 183, 165, 107, 181, 184, 70, 177, 154, 7, 169, 182, + 165, 184, 165, 72, 184, 165, 10, 184, 185, 70, 30, 38, 177, 25, 154, 7, 35, 163, 58, 149, 165, 185, 165, 72, 185, 186, 70, 177, 154, 7, 166, 164, 158, 149, 165, 186, 165, 72, 186, 165, 187, + 165, 188, 165, 189, 164, 151, 165, 98, 30, 34, 190, 57, 165, 108, 30, 7, 161, 190, 30, 190, 30, 17, 48, 190, 190, 8, 30, 190, 190, 8, 30, 17, 48, 154, 30, + 154, 70, 154, 71, 154, 72, 154, 130, 154, 118, 154, 119, 154, 106, 154, 117, 154, 107, 154, 108, + 148, 30, 148, 70, 148, 71, 148, 72, 148, 130, 148, 118, 148, 119, 148, 106, 148, 104, 148, 117, + 148, 116, 148, 107, 148, 108, 191, 148, 192, 191, 193, 194, 193, 193, 8, 194, 194, 164, 38, 193, 25, 194, 92, 194, 164, + 195, 7, 194, 196, 195, 196, 197, 74, 197, 191, 197, 198, 197, 199, 197, 200, 197, 201, 197, 202, + 197, 203, 197, 204, 197, 205, 197, 206, 206, 37, 207, 62, 206, 37, 62, 206, 37, 208, 62, 206, 37, 207, 8, 209, 62, 198, 85, 198, 86, + 198, 87, 198, 48, 198, 93, 198, 69, 204, 12, 204, 13, 199, 35, 210, 58, 199, 35, 211, 58, 199, 35, 211, 8, 210, 58, 211, 212, + 211, 213, 212, 211, 210, 214, 211, 211, 8, 210, 212, 211, 211, 8, 210, 214, 213, 8, 213, 213, 8, 210, 210, 213, 214, 99, 215, 200, 34, 57, + 200, 34, 216, 57, 200, 34, 216, 8, 57, 168, 217, 216, 218, 168, 168, 8, 217, 216, 216, 8, 218, 218, 191, 218, 219, 219, 191, 220, 217, 221, 7, 212, + 218, 222, 7, 212, 218, 223, 222, 224, 222, 225, 224, 226, 221, 69, 224, 69, 221, 48, 224, 48, 226, 191, + 226, 227, 227, 4, 227, 5, 227, 6, 227, 9, 227, 10, 227, 11, 227, 14, 227, 16, 227, 98, + 227, 87, 227, 20, 227, 21, 227, 23, 227, 31, 227, 32, 227, 33, 227, 44, 227, 85, 227, 61, + 227, 73, 227, 74, 227, 75, 227, 86, 227, 77, 227, 78, 227, 79, 227, 80, 227, 81, 227, 88, + 227, 89, 227, 91, 227, 92, 227, 101, 227, 82, 227, 102, 227, 103, 227, 105, 227, 114, 225, 35, 212, 58, + 228, 17, 215, 220, 17, 212, 229, 230, 229, 228, 230, 220, 205, 109, 231, 112, 231, 111, 137, 231, 205, 110, 137, 231, + 151, 197, 232, 101, 151, 232, 35, 207, 58, 151, 151, 35, 207, 58, 233, 44, 15, 30, 151, 232, 15, 226, 151, 151, 15, 226, 151, 234, 151, 44, 151, 37, 235, 62, 234, 233, + 236, 151, 236, 44, 236, 237, 237, 205, 151, 151, 205, 237, 151, 37, 235, 62, 237, 232, 37, 235, 62, 237, 237, 37, 235, 62, 237, 237, 35, 207, 58, 237, 237, 15, 226, 235, + 235, 238, 235, 238, 8, 238, 212, 238, 99, 212, 238, 238, 8, 212, 238, 238, 8, 99, 212, 239, 236, 239, 237, 240, 239, 240, 239, 55, + 240, 239, 43, 240, 55, 241, 240, 43, 241, 241, 240, 241, 11, 241, 241, 80, 241, 241, 78, 241, 241, 53, 241, 241, 41, 241, 241, 76, 241, + 241, 45, 241, 242, 241, 242, 240, 66, 242, 243, 242, 243, 243, 244, 242, 244, 65, 244, 12, 244, 59, 245, 243, 245, 245, 53, 243, + 245, 245, 41, 243, 246, 245, 246, 246, 39, 245, 246, 246, 26, 245, 246, 246, 28, 245, 247, 246, 248, 246, 247, 247, 249, 246, 248, 248, 249, 246, 249, 38, + 249, 25, 249, 36, 249, 24, 249, 33, 247, 247, 32, 246, 250, 247, 116, 194, 251, 248, 116, 194, 247, 250, 248, 251, 252, 247, + 253, 248, 252, 252, 254, 247, 253, 253, 254, 248, 254, 18, 254, 46, 254, 19, 254, 47, 255, 253, 256, 252, 255, 255, 1, 253, + 256, 256, 1, 252, 257, 255, 258, 256, 257, 257, 83, 255, 258, 258, 83, 256, 259, 257, 260, 258, 259, 259, 49, 257, 260, 260, 49, 258, 261, 259, + 262, 260, 261, 261, 2, 259, 262, 262, 2, 260, 263, 261, 264, 262, 263, 263, 52, 261, 264, 264, 52, 262, 265, 263, 266, 264, 265, 265, 97, 263, + 266, 266, 97, 264, 267, 265, 268, 266, 267, 265, 56, 212, 7, 215, 268, 266, 56, 212, 7, 212, 215, 267, 212, 268, 215, 269, 212, 270, 215, 271, + 212, 272, 215, 239, 17, 215, 212, 239, 17, 212, 215, 239, 273, 215, 212, 239, 273, 212, 273, 68, 273, 67, 273, 13, 273, 60, 273, 54, + 273, 42, 273, 40, 273, 27, 273, 29, 273, 3, 273, 84, 273, 51, 137, 215, 207, 212, 137, 137, 8, 215, + 207, 207, 8, 212, 274, 275, 274, 137, 275, 207, 136, 166, 128, 276, 136, 166, 189, 136, 166, 172, 136, 166, 170, 136, 166, 173, + 136, 166, 277, 136, 166, 278, 136, 166, 279, 136, 166, 280, 136, 166, 174, 136, 166, 281, 136, 166, 282, 136, 166, 176, 136, 166, 283, 284, 285, + 284, 286, 284, 287, 285, 288, 285, 187, 289, 290, 289, 291, 277, 292, 277, 175, 276, 171, 171, 34, 293, 57, + 294, 295, 294, 294, 295, 295, 136, 295, 166, 127, 284, 149, 293, 166, 293, 294, 296, 89, 296, 88, 297, 79, 298, 296, 299, + 287, 296, 300, 301, 297, 302, 303, 297, 304, 189, 303, 149, 299, 305, 300, 305, 302, 306, 304, 307, 299, 299, 8, 308, 300, 300, 8, 305, + 302, 302, 8, 306, 304, 304, 8, 307, 308, 192, 196, 229, 305, 192, 196, 230, 306, 192, 196, 229, 307, 192, 196, 230, 308, 309, 228, 305, 309, 220, 306, 309, 228, 307, 309, 220, + 309, 34, 310, 57, 309, 35, 311, 58, 310, 310, 312, 310, 312, 8, 311, 210, 209, 311, 313, 311, 313, 8, 210, 209, 312, 314, 312, 312, 8, 314, + 313, 315, 313, 313, 8, 315, 315, 210, 316, 314, 192, 230, 314, 222, 7, 192, 230, 314, 222, 7, 309, 230, 316, 192, 196, 230, 316, 309, 230, 208, 99, 192, 208, 99, 309, + 209, 209, 208, 172, 63, 166, 170, 207, 149, 173, 31, 37, 207, 62, 136, 16, 136, 173, 31, 37, 207, 62, 136, 292, 14, 136, 81, 37, 207, 62, 95, 292, 14, 136, 81, 37, 207, 62, 149, 292, 81, 37, 207, 62, 136, + 292, 21, 37, 274, 63, 275, 63, 275, 62, 136, 292, 21, 37, 301, 63, 275, 63, 275, 62, 136, 292, 21, 37, 298, 63, 275, 63, 275, 62, 136, 317, 32, 317, 117, 292, 21, 37, 239, 317, 207, 62, 136, 292, 21, 37, 318, 317, 207, 62, 136, 318, 296, 192, 196, 318, 297, 192, 196, 318, 296, 309, + 318, 297, 309, 278, 9, 149, 278, 9, 191, 149, 279, 4, 149, 279, 4, 191, 149, 280, 61, 275, 149, 174, 82, 37, 207, 62, 136, 175, 73, 37, 207, 62, 319, 319, 34, 320, 57, 319, 34, 320, 321, 320, 57, + 322, 323, 322, 322, 323, 320, 320, 322, 323, 5, 207, 7, 293, 321, 10, 7, 293, 281, 191, 7, 324, 324, 136, 324, 166, 127, 288, 282, 75, 207, 149, + 176, 77, 171, 325, 176, 77, 171, 326, 176, 77, 171, 325, 326, 325, 6, 37, 327, 62, 171, 326, 20, 171, 327, 192, 327, 309, 283, 91, 149, 328, 23, 288, 328, 192, 37, 329, 62, 196, 330, 331, 332, + 188, 328, 192, 37, 329, 62, 196, 330, 331, 332, 290, 288, 290, 328, 37, 329, 62, 196, 330, 331, 332, 201, 23, 192, 37, 329, 62, 196, 330, 331, 332, 201, 23, 37, 329, 62, 196, 330, 331, 332, 333, 329, 329, 329, 208, 329, 334, 329, 334, 8, + 329, 334, 8, 208, 334, 316, 334, 334, 8, 316, 335, 316, 330, 34, 332, 57, 331, 293, 271, 336, 96, 337, 215, 272, 336, 96, 337, 212, 271, 336, 96, 337, 128, 330, 331, 332, + 272, 336, 96, 337, 128, 330, 331, 332, 336, 192, 336, 206, 337, 223, 222, 37, 333, 62, 196, 330, 331, 332, 223, 65, 222, 338, 333, 62, 196, 330, 339, 340, 223, 118, 222, 37, 62, 196, 330, 331, 332, 223, 119, 222, 37, 341, 62, 196, 330, 331, 332, 341, 335, 338, 37, + 340, 57, 342, 22, 187, 342, 192, 338, 329, 62, 330, 339, 340, 291, 187, 291, 342, 338, 329, 62, 330, 339, 340, 203, 22, 192, 338, 329, 62, 330, 339, 340, 203, 22, 338, 329, 62, 330, 339, 340, 339, 331, 269, 100, 270, 100, + 269, 100, 65, 215, 270, 100, 65, 212, 269, 100, 215, 270, 100, 212, 286, 102, 192, 343, 344, 345, 346, 202, 102, 192, 343, 344, 345, 346, 347, 102, 343, 344, 345, 346, 202, 102, 343, 344, 345, 346, 347, 286, 344, 34, + 346, 57, 348, 104, 343, 343, 103, 239, 345, 345, 349, 349, 350, 349, 349, 350, 350, 223, 350, 348, 223, + 350, 63, 139, 139, 351, 351, 294, 140, 352, 353, 354, 352, 352, 353, 354, 355, 354, 354, 355, + 355, 356, 149, 355, 357, 149, 355, 295, 356, 114, 358, 359, 356, 114, 360, 358, 361, 358, 362, 358, 363, 358, 361, 8, 362, 358, 361, 8, 363, + 361, 364, 362, 65, 116, 364, 363, 34, 57, 363, 34, 365, 57, 363, 34, 365, 8, 57, 359, 106, 360, 365, 366, 365, 365, 8, 366, 366, 364, 366, 226, 116, 364, + 360, 69, 364, 192, 367, 357, 105, 65, 359, 357, 105, 368, 359, 357, 105, 368, 357, 105, 189, 357, 105, 284, 357, 105, 10, 367, 127, 289, 357, 105, 10, 367, 127, 347, + 357, 105, 10, 367, 212, 368, 34, 57, 368, 34, 369, 57, 368, 34, 369, 8, 57, 369, 370, 369, 369, 8, 370, 370, 226, 370, 226, 116, 226, 371, 134, 0 }; const int QmlJSGrammar::rule_index [] = { @@ -276,183 +276,184 @@ const int QmlJSGrammar::rule_index [] = { 158, 162, 166, 170, 173, 176, 179, 182, 185, 188, 192, 194, 196, 198, 202, 203, 205, 209, 212, 218, 223, 230, 234, 242, 244, 247, 252, 254, 257, 260, - 264, 268, 269, 271, 275, 277, 280, 287, 289, 292, - 295, 307, 309, 312, 321, 323, 326, 328, 330, 332, - 334, 340, 345, 347, 351, 355, 361, 363, 365, 367, - 369, 371, 373, 375, 377, 379, 381, 383, 385, 387, - 389, 391, 393, 395, 397, 399, 401, 403, 405, 407, - 409, 411, 413, 415, 419, 424, 426, 428, 431, 433, - 434, 436, 438, 440, 442, 444, 446, 448, 450, 452, - 454, 456, 460, 463, 467, 473, 475, 477, 479, 481, - 483, 485, 487, 489, 493, 497, 503, 505, 508, 511, - 516, 521, 523, 526, 527, 529, 532, 535, 539, 544, - 546, 548, 552, 556, 558, 560, 563, 567, 571, 573, - 575, 577, 579, 581, 583, 585, 587, 589, 591, 593, - 595, 597, 599, 601, 603, 605, 607, 609, 611, 613, - 615, 617, 619, 621, 623, 625, 627, 629, 631, 633, - 635, 637, 639, 641, 643, 645, 647, 649, 651, 653, - 655, 657, 659, 661, 663, 665, 667, 671, 674, 677, - 678, 679, 681, 683, 685, 687, 691, 695, 697, 699, - 704, 709, 713, 717, 721, 723, 729, 731, 733, 736, - 739, 742, 747, 752, 757, 762, 766, 767, 769, 772, - 774, 777, 781, 786, 788, 790, 792, 795, 798, 801, - 804, 806, 809, 812, 815, 818, 821, 824, 827, 829, - 833, 835, 839, 841, 843, 845, 847, 851, 855, 857, - 861, 865, 869, 871, 873, 877, 881, 883, 885, 887, - 889, 891, 895, 899, 903, 905, 907, 909, 911, 915, - 919, 921, 923, 925, 927, 929, 931, 935, 939, 941, - 943, 947, 951, 953, 955, 959, 963, 965, 967, 971, - 975, 977, 979, 983, 987, 989, 991, 995, 999, 1001, - 1003, 1009, 1015, 1017, 1019, 1021, 1023, 1025, 1027, 1031, - 1035, 1039, 1043, 1045, 1047, 1049, 1051, 1053, 1055, 1057, - 1059, 1061, 1063, 1065, 1067, 1069, 1071, 1075, 1079, 1080, - 1081, 1083, 1085, 1089, 1092, 1095, 1098, 1101, 1104, 1107, - 1110, 1113, 1116, 1119, 1122, 1125, 1128, 1130, 1132, 1134, - 1136, 1138, 1140, 1142, 1144, 1146, 1148, 1152, 1154, 1157, - 1159, 1164, 1166, 1168, 1170, 1172, 1174, 1177, 1180, 1183, - 1186, 1189, 1191, 1193, 1195, 1197, 1201, 1205, 1209, 1213, - 1217, 1221, 1225, 1229, 1232, 1235, 1238, 1241, 1245, 1249, - 1250, 1252, 1255, 1258, 1260, 1265, 1267, 1271, 1273, 1277, - 1280, 1283, 1288, 1293, 1297, 1300, 1303, 1306, 1307, 1309, - 1311, 1312, 1315, 1323, 1329, 1337, 1345, 1351, 1361, 1371, - 1381, 1383, 1385, 1393, 1401, 1405, 1409, 1412, 1415, 1418, - 1422, 1425, 1429, 1433, 1439, 1445, 1449, 1455, 1457, 1460, - 1461, 1463, 1468, 1472, 1476, 1478, 1482, 1486, 1490, 1494, - 1499, 1505, 1508, 1510, 1512, 1515, 1517, 1527, 1537, 1539, - 1548, 1558, 1567, 1569, 1570, 1572, 1574, 1577, 1581, 1583, - 1587, 1589, 1591, 1593, 1595, 1600, 1605, 1613, 1621, 1623, - 1625, 1626, 1635, 1645, 1654, 1664, 1666, 1668, 1670, 1672, - 1681, 1683, 1691, 1700, 1708, 1710, 1712, 1714, 1718, 1722, - 1725, 1728, 1735, 1742, 1748, 1754, 1756, 1758, 1760, 1762, - 1763, 1766, 1767, 1769, 1771, 1774, 1776, 1779, 1781, 1782, - 1784, 1786, 1788, 1790, 1791, 1793, 1795, 1798, 1801, 1804, - 1806, 1810, 1813, 1815, 1817, 1819, 1823, 1827, 1829, 1833, - 1836, 1840, 1845, 1848, 1850, 1854, 1856, 1860, 1862, 1864, - 1865, 1869, 1873, 1876, 1879, 1882, 1888, 1894, 1899, 1902, - 1906, 1911, 1913, 1917, 1919, 1923 + 264, 268, 271, 275, 279, 280, 282, 286, 288, 291, + 298, 300, 303, 306, 318, 320, 323, 332, 334, 337, + 339, 341, 343, 345, 351, 356, 358, 362, 366, 372, + 374, 376, 378, 380, 382, 384, 386, 388, 390, 392, + 394, 396, 398, 400, 402, 404, 406, 408, 410, 412, + 414, 416, 418, 420, 422, 424, 426, 430, 435, 437, + 439, 442, 444, 445, 447, 449, 451, 453, 455, 457, + 459, 461, 463, 465, 467, 471, 474, 478, 484, 486, + 488, 490, 492, 494, 496, 498, 500, 504, 508, 514, + 516, 519, 522, 527, 532, 534, 537, 538, 540, 543, + 546, 550, 555, 557, 559, 563, 567, 569, 571, 574, + 578, 582, 584, 586, 588, 590, 592, 594, 596, 598, + 600, 602, 604, 606, 608, 610, 612, 614, 616, 618, + 620, 622, 624, 626, 628, 630, 632, 634, 636, 638, + 640, 642, 644, 646, 648, 650, 652, 654, 656, 658, + 660, 662, 664, 666, 668, 670, 672, 674, 676, 678, + 682, 685, 688, 689, 690, 692, 694, 696, 698, 702, + 706, 708, 710, 715, 720, 724, 728, 732, 734, 740, + 742, 744, 747, 750, 753, 758, 763, 768, 773, 777, + 778, 780, 783, 785, 788, 792, 797, 799, 801, 803, + 806, 809, 812, 815, 817, 820, 823, 826, 829, 832, + 835, 838, 840, 844, 846, 850, 852, 854, 856, 858, + 862, 866, 868, 872, 876, 880, 882, 884, 888, 892, + 894, 896, 898, 900, 902, 906, 910, 914, 916, 918, + 920, 922, 926, 930, 932, 934, 936, 938, 940, 942, + 946, 950, 952, 954, 958, 962, 964, 966, 970, 974, + 976, 978, 982, 986, 988, 990, 994, 998, 1000, 1002, + 1006, 1010, 1012, 1014, 1020, 1026, 1028, 1030, 1032, 1034, + 1036, 1038, 1042, 1046, 1050, 1054, 1056, 1058, 1060, 1062, + 1064, 1066, 1068, 1070, 1072, 1074, 1076, 1078, 1080, 1082, + 1086, 1090, 1091, 1092, 1094, 1096, 1100, 1103, 1106, 1109, + 1112, 1115, 1118, 1121, 1124, 1127, 1130, 1133, 1136, 1139, + 1141, 1143, 1145, 1147, 1149, 1151, 1153, 1155, 1157, 1159, + 1163, 1165, 1168, 1170, 1175, 1177, 1179, 1181, 1183, 1185, + 1188, 1191, 1194, 1197, 1200, 1202, 1204, 1206, 1208, 1212, + 1216, 1220, 1224, 1228, 1232, 1236, 1240, 1243, 1246, 1249, + 1252, 1256, 1260, 1261, 1263, 1266, 1269, 1271, 1276, 1278, + 1282, 1284, 1288, 1291, 1294, 1299, 1304, 1308, 1311, 1314, + 1317, 1318, 1320, 1322, 1323, 1326, 1334, 1340, 1348, 1356, + 1362, 1372, 1382, 1392, 1394, 1396, 1404, 1412, 1416, 1420, + 1423, 1426, 1429, 1433, 1436, 1440, 1444, 1450, 1456, 1460, + 1466, 1468, 1471, 1472, 1474, 1479, 1483, 1487, 1489, 1493, + 1497, 1501, 1505, 1510, 1516, 1519, 1521, 1523, 1526, 1528, + 1538, 1548, 1550, 1559, 1569, 1578, 1580, 1581, 1583, 1585, + 1588, 1592, 1594, 1598, 1600, 1602, 1604, 1606, 1611, 1616, + 1624, 1632, 1634, 1636, 1637, 1646, 1656, 1665, 1675, 1677, + 1679, 1681, 1683, 1692, 1694, 1702, 1711, 1719, 1721, 1723, + 1725, 1729, 1733, 1736, 1739, 1746, 1753, 1759, 1765, 1767, + 1769, 1771, 1773, 1774, 1777, 1778, 1780, 1782, 1785, 1787, + 1790, 1792, 1793, 1795, 1797, 1799, 1801, 1802, 1804, 1806, + 1809, 1812, 1815, 1817, 1821, 1824, 1826, 1828, 1830, 1834, + 1838, 1840, 1844, 1847, 1851, 1856, 1859, 1861, 1865, 1867, + 1871, 1873, 1875, 1876, 1880, 1884, 1887, 1890, 1893, 1899, + 1905, 1910, 1913, 1917, 1922, 1924, 1928, 1930, 1934 }; #endif // QLALR_NO_QMLJSGRAMMAR_DEBUG_INFO const short QmlJSGrammar::action_default [] = { - 0, 0, 461, 461, 461, 0, 26, 0, 299, 144, - 357, 0, 375, 529, 329, 337, 333, 275, 147, 349, - 353, 151, 325, 291, 3, 146, 148, 142, 131, 276, - 143, 341, 345, 258, 255, 296, 274, 257, 145, 248, - 149, 318, 304, 0, 128, 560, 130, 0, 162, 163, - 158, 125, 0, 0, 123, 118, 0, 174, 0, 0, - 0, 160, 0, 0, 244, 156, 159, 127, 122, 0, - 0, 119, 121, 129, 124, 120, 126, 161, 249, 0, - 141, 0, 157, 0, 0, 546, 150, 316, 289, 281, - 355, 0, 0, 151, 142, 276, 298, 278, 277, 0, - 294, 295, 293, 292, 297, 531, 0, 525, 0, 461, - 522, 412, 0, 410, 461, 408, 524, 358, 0, 376, - 330, 338, 334, 390, 388, 350, 354, 389, 396, 385, - 326, 386, 0, 142, 387, 404, 393, 276, 342, 346, - 317, 391, 303, 405, 0, 0, 0, 461, 0, 0, - 0, 0, 380, 460, 0, 0, 0, 416, 0, 0, - 547, 394, 395, 315, 0, 0, 384, 392, 356, 531, - 0, 526, 0, 461, 0, 528, 523, 0, 328, 0, - 321, 323, 322, 324, 319, 0, 0, 310, 308, 0, - 311, 309, 307, 305, 0, 0, 0, 301, 302, 300, - 100, 0, 0, 136, 313, 137, 0, 0, 261, 254, - 197, 198, 199, 200, 201, 233, 227, 202, 229, 203, - 204, 205, 206, 207, 235, 234, 208, 209, 210, 211, - 212, 236, 213, 214, 228, 215, 216, 230, 217, 231, - 218, 219, 220, 221, 222, 223, 224, 225, 226, 232, - 0, 0, 251, 378, 0, 0, 253, 0, 250, 0, - 0, 267, 268, 0, 270, 0, 269, 272, 0, 273, - 256, 271, 252, 0, 133, 0, 0, 135, 134, 312, - 0, 336, 0, 332, 0, 0, 0, 0, 352, 348, - 0, 344, 0, 340, 462, 15, 16, 461, 0, 494, - 495, 0, 0, 496, 506, 0, 132, 514, 519, 140, - 241, 515, 516, 0, 0, 440, 174, 0, 139, 241, - 138, 454, 243, 0, 239, 455, 517, 520, 518, 140, - 0, 461, 0, 507, 456, 457, 241, 446, 441, 191, - 192, 132, 190, 0, 0, 0, 196, 194, 451, 442, - 447, 438, 0, 241, 241, 452, 453, 0, 237, 0, - 444, 448, 175, 458, 172, 439, 174, 449, 458, 450, - 459, 445, 173, 443, 0, 372, 365, 0, 370, 371, - 369, 368, 374, 367, 366, 363, 364, 373, 362, 360, - 0, 481, 482, 0, 479, 480, 505, 0, 0, 0, - 0, 0, 0, 466, 465, 379, 381, 0, 0, 276, - 0, 0, 415, 414, 0, 0, 0, 377, 380, 0, - 382, 380, 0, 461, 468, 0, 471, 472, 0, 461, - 474, 0, 0, 0, 361, 0, 461, 473, 359, 140, - 417, 477, 422, 475, 431, 0, 140, 0, 426, 240, - 242, 430, 0, 238, 434, 435, 380, 0, 380, 0, - 461, 470, 140, 478, 424, 419, 476, 432, 436, 0, - 140, 0, 428, 240, 380, 0, 380, 0, 461, 469, - 406, 383, 461, 0, 407, 398, 0, 400, 0, 401, - 397, 0, 399, 0, 539, 411, 0, 514, 537, 0, - 0, 461, 545, 0, 540, 538, 140, 418, 0, 423, - 241, 0, 427, 560, 0, 0, 562, 557, 0, 564, - 563, 0, 566, 0, 123, 568, 124, 0, 559, 552, - 558, 565, 567, 514, 513, 0, 140, 0, 461, 0, - 532, 0, 0, 140, 0, 461, 0, 534, 0, 0, - 521, 536, 0, 140, 0, 461, 0, 535, 0, 514, - 0, 140, 0, 461, 0, 533, 561, 0, 0, 461, - 464, 461, 463, 0, 483, 0, 0, 0, 485, 490, - 488, 491, 0, 0, 489, 490, 0, 486, 0, 487, - 461, 493, 0, 461, 492, 0, 497, 0, 498, 499, - 0, 0, 500, 0, 503, 504, 0, 0, 501, 502, - 0, 0, 461, 467, 0, 0, 461, 484, 551, 0, - 549, 140, 0, 420, 425, 241, 433, 437, 0, 429, - 421, 527, 0, 409, 0, 327, 0, 320, 0, 0, - 306, 314, 0, 335, 0, 331, 0, 0, 267, 260, - 266, 0, 265, 0, 264, 0, 0, 0, 0, 351, - 347, 0, 343, 0, 339, 267, 0, 262, 267, 0, - 263, 560, 0, 0, 562, 0, 553, 562, 0, 555, - 282, 281, 0, 514, 514, 0, 140, 0, 461, 0, - 511, 0, 140, 0, 461, 0, 512, 0, 514, 514, - 0, 0, 461, 0, 543, 0, 0, 461, 0, 544, - 185, 184, 189, 181, 0, 0, 177, 186, 0, 178, - 183, 179, 0, 188, 167, 0, 175, 0, 174, 165, - 0, 170, 171, 0, 166, 176, 168, 169, 164, 0, - 0, 153, 154, 458, 152, 0, 155, 286, 280, 258, - 259, 288, 285, 279, 0, 0, 245, 247, 0, 246, - 287, 284, 283, 550, 0, 548, 0, 290, 0, 0, - 6, 575, 572, 576, 461, 580, 0, 0, 579, 578, - 577, 605, 603, 600, 0, 0, 604, 602, 0, 593, - 598, 0, 608, 0, 556, 607, 0, 509, 402, 0, - 541, 403, 606, 560, 514, 0, 140, 0, 461, 0, - 510, 514, 0, 0, 461, 0, 542, 0, 562, 0, - 554, 612, 0, 614, 609, 0, 610, 613, 611, 0, - 615, 601, 599, 0, 588, 583, 582, 584, 585, 0, - 0, 581, 0, 586, 587, 0, 594, 596, 0, 590, - 0, 597, 0, 591, 595, 592, 0, 589, 5, 570, - 461, 2, 0, 98, 97, 0, 130, 0, 0, 506, - 539, 119, 121, 129, 120, 4, 32, 0, 45, 44, - 95, 74, 77, 92, 88, 0, 85, 99, 0, 514, - 0, 140, 0, 461, 0, 508, 28, 31, 0, 0, + 0, 0, 464, 464, 464, 0, 26, 0, 302, 147, + 360, 0, 378, 532, 332, 340, 336, 278, 150, 352, + 356, 154, 328, 294, 3, 149, 151, 145, 134, 279, + 146, 344, 348, 261, 258, 299, 277, 260, 148, 251, + 152, 321, 307, 0, 131, 563, 133, 0, 165, 166, + 161, 128, 0, 0, 126, 121, 0, 177, 0, 0, + 0, 163, 0, 0, 247, 159, 162, 130, 125, 0, + 0, 122, 124, 132, 127, 123, 129, 164, 252, 0, + 144, 0, 160, 0, 0, 549, 153, 319, 292, 284, + 358, 0, 0, 154, 145, 279, 301, 281, 280, 0, + 297, 298, 296, 295, 300, 534, 0, 528, 0, 464, + 525, 415, 0, 413, 464, 411, 527, 361, 0, 379, + 333, 341, 337, 393, 391, 353, 357, 392, 399, 388, + 329, 389, 0, 145, 390, 407, 396, 279, 345, 349, + 320, 394, 306, 408, 0, 0, 0, 464, 0, 0, + 0, 0, 383, 463, 0, 0, 0, 419, 0, 0, + 550, 397, 398, 318, 0, 0, 387, 395, 359, 534, + 0, 529, 0, 464, 0, 531, 526, 0, 331, 0, + 324, 326, 325, 327, 322, 0, 0, 313, 311, 0, + 314, 312, 310, 308, 0, 0, 0, 304, 305, 303, + 103, 0, 0, 139, 316, 140, 0, 0, 264, 257, + 200, 201, 202, 203, 204, 236, 230, 205, 232, 206, + 207, 208, 209, 210, 238, 237, 211, 212, 213, 214, + 215, 239, 216, 217, 231, 218, 219, 233, 220, 234, + 221, 222, 223, 224, 225, 226, 227, 228, 229, 235, + 0, 0, 254, 381, 0, 0, 256, 0, 253, 0, + 0, 270, 271, 0, 273, 0, 272, 275, 0, 276, + 259, 274, 255, 0, 136, 0, 0, 138, 137, 315, + 0, 339, 0, 335, 0, 0, 0, 0, 355, 351, + 0, 347, 0, 343, 465, 15, 16, 464, 0, 497, + 498, 0, 0, 499, 509, 0, 135, 517, 522, 143, + 244, 518, 519, 0, 0, 443, 177, 0, 142, 244, + 141, 457, 246, 0, 242, 458, 520, 523, 521, 143, + 0, 464, 0, 510, 459, 460, 244, 449, 444, 194, + 195, 135, 193, 0, 0, 0, 199, 197, 454, 445, + 450, 441, 0, 244, 244, 455, 456, 0, 240, 0, + 447, 451, 178, 461, 175, 442, 177, 452, 461, 453, + 462, 448, 176, 446, 0, 375, 368, 0, 373, 374, + 372, 371, 377, 370, 369, 366, 367, 376, 365, 363, + 0, 484, 485, 0, 482, 483, 508, 0, 0, 0, + 0, 0, 0, 469, 468, 382, 384, 0, 0, 279, + 0, 0, 418, 417, 0, 0, 0, 380, 383, 0, + 385, 383, 0, 464, 471, 0, 474, 475, 0, 464, + 477, 0, 0, 0, 364, 0, 464, 476, 362, 143, + 420, 480, 425, 478, 434, 0, 143, 0, 429, 243, + 245, 433, 0, 241, 437, 438, 383, 0, 383, 0, + 464, 473, 143, 481, 427, 422, 479, 435, 439, 0, + 143, 0, 431, 243, 383, 0, 383, 0, 464, 472, + 409, 386, 464, 0, 410, 401, 0, 403, 0, 404, + 400, 0, 402, 0, 542, 414, 0, 517, 540, 0, + 0, 464, 548, 0, 543, 541, 143, 421, 0, 426, + 244, 0, 430, 563, 0, 0, 565, 560, 0, 567, + 566, 0, 569, 0, 126, 571, 127, 0, 562, 555, + 561, 568, 570, 517, 516, 0, 143, 0, 464, 0, + 535, 0, 0, 143, 0, 464, 0, 537, 0, 0, + 524, 539, 0, 143, 0, 464, 0, 538, 0, 517, + 0, 143, 0, 464, 0, 536, 564, 0, 0, 464, + 467, 464, 466, 0, 486, 0, 0, 0, 488, 493, + 491, 494, 0, 0, 492, 493, 0, 489, 0, 490, + 464, 496, 0, 464, 495, 0, 500, 0, 501, 502, + 0, 0, 503, 0, 506, 507, 0, 0, 504, 505, + 0, 0, 464, 470, 0, 0, 464, 487, 554, 0, + 552, 143, 0, 423, 428, 244, 436, 440, 0, 432, + 424, 530, 0, 412, 0, 330, 0, 323, 0, 0, + 309, 317, 0, 338, 0, 334, 0, 0, 270, 263, + 269, 0, 268, 0, 267, 0, 0, 0, 0, 354, + 350, 0, 346, 0, 342, 270, 0, 265, 270, 0, + 266, 563, 0, 0, 565, 0, 556, 565, 0, 558, + 285, 284, 0, 517, 517, 0, 143, 0, 464, 0, + 514, 0, 143, 0, 464, 0, 515, 0, 517, 517, + 0, 0, 464, 0, 546, 0, 0, 464, 0, 547, + 188, 187, 192, 184, 0, 0, 180, 189, 0, 181, + 186, 182, 0, 191, 170, 0, 178, 0, 177, 168, + 0, 173, 174, 0, 169, 179, 171, 172, 167, 0, + 0, 156, 157, 461, 155, 0, 158, 289, 283, 261, + 262, 291, 288, 282, 0, 0, 248, 250, 0, 249, + 290, 287, 286, 553, 0, 551, 0, 293, 0, 0, + 6, 578, 575, 579, 464, 583, 0, 0, 582, 581, + 580, 608, 606, 603, 0, 0, 607, 605, 0, 596, + 601, 0, 611, 0, 559, 610, 0, 512, 405, 0, + 544, 406, 609, 563, 517, 0, 143, 0, 464, 0, + 513, 517, 0, 0, 464, 0, 545, 0, 565, 0, + 557, 615, 0, 617, 612, 0, 613, 616, 614, 0, + 618, 604, 602, 0, 591, 586, 585, 587, 588, 0, + 0, 584, 0, 589, 590, 0, 597, 599, 0, 593, + 0, 600, 0, 594, 598, 595, 0, 592, 5, 573, + 464, 2, 0, 101, 100, 0, 133, 0, 0, 509, + 542, 122, 124, 132, 123, 4, 32, 0, 45, 44, + 98, 74, 77, 95, 91, 0, 88, 102, 0, 517, + 0, 143, 0, 464, 0, 511, 28, 31, 0, 0, 0, 30, 29, 40, 36, 0, 41, 37, 0, 0, - 102, 0, 42, 0, 0, 79, 78, 90, 63, 62, - 61, 0, 0, 63, 0, 0, 0, 64, 0, 117, - 114, 112, 107, 115, 111, 108, 110, 116, 113, 109, - 73, 0, 76, 461, 0, 82, 54, 55, 56, 58, - 0, 0, 59, 57, 52, 461, 53, 412, 159, 161, - 180, 0, 0, 0, 0, 195, 0, 193, 182, 50, - 49, 0, 187, 51, 87, 83, 0, 80, 0, 0, - 0, 0, 0, 103, 0, 101, 105, 0, 106, 0, - 104, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 38, 0, 0, 39, 91, 0, 461, 0, 258, 0, - 0, 94, 0, 96, 75, 93, 89, 63, 0, 0, - 0, 0, 0, 0, 461, 0, 258, 0, 0, 108, - 86, 84, 81, 0, 72, 65, 0, 63, 66, 0, - 0, 0, 67, 0, 0, 0, 0, 69, 70, 0, - 71, 68, 33, 43, 461, 0, 0, 60, 174, 0, - 0, 46, 47, 0, 48, 8, 0, 0, 9, 0, - 11, 0, 10, 1, 25, 18, 14, 0, 17, 13, - 12, 27, 0, 35, 7, 34, 19, 0, 21, 0, - 0, 24, 0, 20, 22, 0, 0, 23, 616 + 105, 0, 42, 0, 0, 82, 78, 93, 63, 62, + 61, 0, 0, 63, 0, 0, 0, 64, 0, 120, + 117, 115, 110, 118, 114, 111, 113, 119, 116, 112, + 73, 0, 76, 464, 0, 85, 54, 55, 56, 58, + 0, 0, 59, 57, 52, 464, 53, 415, 162, 164, + 183, 0, 0, 0, 0, 198, 0, 196, 185, 50, + 49, 0, 190, 51, 90, 86, 0, 80, 83, 0, + 0, 0, 0, 0, 106, 0, 104, 108, 0, 109, + 0, 107, 63, 0, 0, 0, 0, 0, 0, 0, + 0, 38, 0, 0, 39, 94, 0, 464, 0, 261, + 0, 0, 97, 0, 99, 75, 96, 92, 63, 0, + 0, 0, 0, 0, 0, 464, 0, 261, 0, 0, + 111, 79, 89, 87, 81, 84, 63, 0, 72, 65, + 0, 63, 66, 0, 0, 0, 67, 0, 0, 0, + 0, 69, 70, 0, 71, 68, 33, 43, 464, 0, + 0, 60, 177, 0, 0, 46, 47, 0, 48, 8, + 0, 0, 9, 0, 11, 0, 10, 1, 25, 18, + 14, 0, 17, 13, 12, 27, 0, 35, 7, 34, + 19, 0, 21, 0, 0, 24, 0, 20, 22, 0, + 0, 23, 619 }; const short QmlJSGrammar::goto_default [] = { - 7, 1073, 113, 24, 875, 858, 770, 1069, 1084, 1065, - 1068, 1072, 1070, 1077, 28, 942, 1074, 33, 1071, 1089, - 1027, 1081, 898, 897, 912, 876, 877, 878, 905, 999, + 7, 1077, 113, 24, 875, 858, 770, 1073, 1088, 1069, + 1072, 1076, 1074, 1081, 28, 942, 1078, 33, 1075, 1093, + 1028, 1085, 898, 897, 912, 876, 877, 878, 905, 1000, 911, 879, 111, 956, 961, 945, 131, 480, 129, 134, - 167, 143, 162, 978, 1039, 1038, 881, 882, 974, 886, - 884, 883, 880, 864, 863, 166, 982, 27, 13, 275, + 167, 143, 162, 979, 1043, 1042, 881, 882, 974, 886, + 884, 883, 880, 864, 863, 166, 983, 27, 13, 275, 204, 318, 319, 39, 30, 9, 38, 25, 18, 26, 40, 86, 21, 132, 311, 373, 727, 725, 119, 362, 737, 12, 714, 960, 713, 710, 322, 962, 523, 522, @@ -474,580 +475,512 @@ const short QmlJSGrammar::goto_default [] = { }; const short QmlJSGrammar::action_index [] = { - 430, 3137, 359, 14, -134, 2520, 182, 21, 252, -134, - -134, -74, -134, -134, 22, -23, -56, 498, -134, 265, - -134, -68, 609, -134, 23, -134, -134, -67, -134, 1527, - -134, 30, -15, 504, -134, 358, -134, -134, -134, -134, - -134, 545, 369, 493, -134, 1248, -134, 2891, -134, -134, - -134, -134, 1045, 1144, -134, -134, 6158, 3878, 4619, 2891, - 2891, -134, 2152, 2891, -134, -134, -134, -134, -134, 2891, - 2891, -134, -134, -134, -134, -134, -134, -134, -134, 3137, - -134, 2891, -134, 2891, 2891, 3383, -134, -134, -134, 0, - -134, 2891, 2891, -134, -134, 227, 426, -134, -134, 2891, - -134, -134, -134, -134, 419, -134, 3506, -134, 59, -134, - -134, 6808, 45, -134, 391, -134, -134, -134, -10, -134, - 87, 46, 6, -134, -134, 268, -134, -134, -134, -134, - 491, -134, 342, 326, -134, -134, -134, 1330, 94, 49, - 573, -134, 321, -134, 1560, 1402, 267, -134, 66, 70, - 434, 68, 3014, -134, 69, 3014, 73, -134, 71, 74, - 4250, -134, -134, -134, 1194, 222, -134, -134, -134, -134, - 4373, -134, 81, -134, 86, -134, -134, 2891, 478, 2891, - -134, -134, -134, -134, 593, 2891, 2274, -134, -134, 2891, - -134, -134, -134, 408, 2891, 2891, 2891, 190, 214, 221, - 435, 209, 2396, -134, -134, 122, 5118, 3014, -134, -134, + 413, 2929, 356, 2, -134, 2435, 195, 17, 211, -134, + -134, -77, -134, -134, 21, -26, -59, 479, -134, 198, + -134, -71, 446, -134, 18, -134, -134, -68, -134, 1114, + -134, 30, -18, 601, -134, 392, -134, -134, -134, -134, + -134, 538, 482, 409, -134, 1032, -134, 2806, -134, -134, + -134, -134, 903, 874, -134, -134, 6073, 3796, 4534, 2806, + 2806, -134, 2189, 2806, -134, -134, -134, -134, -134, 2806, + 2806, -134, -134, -134, -134, -134, -134, -134, -134, 2929, + -134, 2806, -134, 2806, 2806, 3919, -134, -134, -134, 0, + -134, 2806, 2806, -134, -134, 303, 338, -134, -134, 2806, + -134, -134, -134, -134, 348, -134, 3298, -134, 51, -134, + -134, 6463, 42, -134, 360, -134, -134, -134, -12, -134, + 85, 46, 13, -134, -134, 232, -134, -134, -134, -134, + 457, -134, 364, 243, -134, -134, -134, 1371, 91, 54, + 545, -134, 482, -134, 1259, 1186, 192, -134, 60, 66, + 444, 65, 3052, -134, 67, 3052, 73, -134, 72, 74, + 3670, -134, -134, -134, 1136, 217, -134, -134, -134, -134, + 4288, -134, 81, -134, 78, -134, -134, 2806, 440, 2806, + -134, -134, -134, -134, 560, 2806, 1945, -134, -134, 2806, + -134, -134, -134, 482, 2806, 2806, 2806, 193, 188, 299, + 456, 207, 2311, -134, -134, 129, 1554, 3052, -134, -134, -134, -134, -134, -134, -134, -134, -134, -134, -134, -134, -134, -134, -134, -134, -134, -134, -134, -134, -134, -134, -134, -134, -134, -134, -134, -134, -134, -134, -134, -134, -134, -134, -134, -134, -134, -134, -134, -134, -134, -134, - 220, 3014, -134, -134, 5118, 3014, -134, 293, -134, 492, - 137, 3260, 129, 131, -134, 3014, 4001, -134, 3014, -134, - -134, -134, -134, 2274, -134, 318, 2274, -134, -134, 345, - 2891, 139, 2891, 144, 3014, 2891, 146, 3014, -134, 142, - 2891, 152, 2891, 147, -134, -134, -134, -134, 6548, -134, - -134, 149, 936, -134, -134, 158, -134, 1664, -134, 167, - 168, -134, 169, 170, 1352, 5768, 171, 2274, -134, 173, - -134, -134, -134, 3014, -134, -134, 1664, -134, -134, 180, - 178, -134, 179, -134, -134, -134, 189, -134, 199, -134, - -134, 206, -134, 181, 202, 3014, -134, -134, -134, 5768, - -134, -134, 1456, 187, 185, -134, -134, 177, -134, 176, - 192, -134, 191, 1664, -134, -134, 174, -134, 1664, -134, - -134, -134, -134, -134, 3014, -134, -134, 3014, -134, -134, + 215, 3052, -134, -134, 5033, 3052, -134, 225, -134, 492, + 138, 3421, 134, 131, -134, 3052, 3175, -134, 3052, -134, + -134, -134, -134, 1945, -134, 305, 1945, -134, -134, 345, + 2806, 136, 2806, 142, 3052, 2806, 146, 3052, -134, 144, + 2806, 148, 2806, 151, -134, -134, -134, -134, 6723, -134, + -134, 150, 749, -134, -134, 153, -134, 1579, -134, 165, + 167, -134, 172, 174, 1136, 5683, 177, 1945, -134, 175, + -134, -134, -134, 3052, -134, -134, 1579, -134, -134, 179, + 183, -134, 247, -134, -134, -134, 184, -134, 194, -134, + -134, 202, -134, 191, 201, 3052, -134, -134, -134, 5683, + -134, -134, 1240, 190, 189, -134, -134, 185, -134, 182, + 187, -134, 181, 1579, -134, -134, 180, -134, 1579, -134, + -134, -134, -134, -134, 3052, -134, -134, 3052, -134, -134, -134, -134, -134, -134, -134, -134, -134, -134, -134, -134, - 226, -134, -134, 228, -134, -134, -134, 6418, 164, 161, - 3014, 276, 323, -134, -134, 4742, 162, 151, 201, 1642, - 1169, 145, -134, -134, 1163, 140, 3137, -134, 3014, 138, - 136, 3014, 130, -134, -134, 3014, -134, -134, 238, -134, - -134, 3137, 3014, 3137, -134, 215, -134, -134, -134, 121, - 246, 113, -134, 344, -134, 1456, 111, 100, -134, 97, - -134, -134, 3137, -134, -134, -134, 3014, 78, 3014, 61, - -134, -134, 120, 82, -134, 83, 361, -134, -134, 1352, - 120, 65, -134, 63, 3014, 18, 3014, 7, -134, -134, - -134, -134, -134, 11, -134, -134, 200, -134, 907, -134, - -134, 1456, -134, 733, -134, -134, 26, 1664, -134, -5, - 24, -134, -134, -3, -134, -134, 120, 39, 35, -134, - 32, 1352, -134, -61, 10, 1908, 6028, -134, -22, -134, - 6028, 5898, -134, -12, 5768, -134, 5768, 5768, -19, -134, - -134, -134, -134, 1664, -134, -49, 120, -26, -134, -50, - -134, -32, -60, -7, -33, -134, -54, -134, -31, 1352, - -134, -134, -53, 120, -24, -134, -46, -134, -25, 1664, - -47, 120, -18, -134, -40, -134, -134, 3014, 272, -134, - 8, -134, -134, 248, -134, 3014, 320, -4, -134, 28, - -134, 29, 319, 3014, -134, 33, 34, -134, -14, -134, - -134, -134, 232, -134, -134, 441, -134, 374, 36, -134, - 13, 19, -134, 1219, -134, -134, -2, 27, -134, -134, - 3014, 328, -134, -134, 3014, 217, -134, -134, -134, 3014, - -134, 120, 50, 62, -134, 55, -134, -134, 1345, -134, - -134, -134, 6808, -134, 2891, 609, 2891, 549, 2891, 2274, - 365, -134, 2891, 15, 2891, 89, 5118, 3014, 3260, -134, - -134, 317, -134, 58, -134, 3014, 2891, 90, 3137, -134, - 64, 2891, 98, 2891, 72, 3260, 76, -134, 3260, 84, - -134, 9, 88, 91, 6028, 92, -134, 6028, 93, -134, - -134, -134, 96, 1664, 1664, 102, 112, 105, -134, 104, - -134, 107, 119, 108, -134, 109, -134, 110, 1664, 1664, - 116, 123, -134, 118, -134, 124, 125, -134, 126, -134, - -134, 418, -134, -134, 298, 302, -134, -134, 6288, -134, - -134, -134, 3014, -134, -134, 327, 4127, 184, 160, -134, - 4496, -134, -134, 3137, -134, -134, -134, -134, -134, 154, - 294, -134, -134, 3752, -134, 159, -134, -134, -134, 483, - -134, -134, -134, -134, 403, 3137, -134, -134, 355, -134, - -134, -134, -134, -134, 3137, -134, 2891, -134, 197, 195, - -134, -134, -134, -134, 348, -134, 557, 1531, -134, -134, - -134, -134, 175, -134, 5638, 175, -134, -134, 172, -134, - -134, 3629, -134, 429, -134, -134, 1101, -134, -134, 979, - -134, -134, -134, 961, 1664, 165, 166, 157, -134, 163, - -134, 1664, 156, 155, -134, 153, -134, 150, 6028, 148, - -134, -134, 307, -112, -134, 5378, -134, -134, -134, 5118, - -134, -134, -134, 141, -134, 143, -134, -134, -134, 5508, - 20, -134, 303, -134, -134, 16, -134, -134, 315, -134, - 857, -134, 5248, -134, -134, -134, 803, -134, -134, -134, - 134, -134, 936, -134, -134, 135, 133, 203, 132, 216, - 211, 407, 127, 580, 128, -134, -134, 2520, -134, -134, - -134, -134, -134, -134, -134, 347, -134, -134, 115, 1664, - 114, 117, 106, -134, 99, -134, -134, -134, 196, 101, - 2768, -134, -134, -134, -134, 2644, -134, -134, 103, 1786, - -134, 95, -134, 414, 85, -134, -134, -134, 75, -134, - -134, 651, 390, -134, 251, 79, 713, -134, 235, -134, + 227, -134, -134, 233, -134, -134, -134, 6333, 168, 166, + 3052, 249, 346, -134, -134, 4657, 163, 155, 273, 1483, + 1136, 149, -134, -134, 1136, 147, 2929, -134, 3052, 141, + 140, 3052, 137, -134, -134, 3052, -134, -134, 257, -134, + -134, 2929, 3052, 2929, -134, 216, -134, -134, -134, 130, + 125, 123, -134, 439, -134, 1357, 116, 108, -134, 105, + -134, -134, 2929, -134, -134, -134, 3052, 92, 3052, 70, + -134, -134, 103, 88, -134, 93, 435, -134, -134, 1240, + 87, 71, -134, 64, 3052, 19, 3052, 11, -134, -134, + -134, -134, -134, 7, -134, -134, 281, -134, 928, -134, + -134, 1136, -134, 818, -134, -134, 38, 1373, -134, -3, + 43, -134, -134, 1, -134, -134, 47, 45, 35, -134, + 34, 1136, -134, -55, 9, 1823, 5943, -134, -19, -134, + 5943, 5813, -134, -6, 5683, -134, 5683, 5683, -16, -134, + -134, -134, -134, 1579, -134, -46, 8, 43, -134, -48, + -134, -30, -58, -4, 43, -134, -57, -134, -36, 1240, + -134, -134, -56, -2, 43, -134, -49, -134, -27, 1579, + -50, 6, 43, -134, -43, -134, -134, 3052, 212, -134, + 4, -134, -134, 208, -134, 3052, 220, -7, -134, 24, + -134, 25, 228, 3052, -134, 31, 28, -134, -20, -134, + -134, -134, 224, -134, -134, 370, -134, 287, 29, -134, + 10, 16, -134, 1007, -134, -134, -5, 22, -134, -134, + 3052, 300, -134, -134, 3052, 320, -134, -134, -134, 3052, + -134, 56, 48, 59, -134, 52, -134, -134, 1129, -134, + -134, -134, 6463, -134, 2806, 459, 2806, 523, 2806, 1945, + 482, -134, 2806, 15, 2806, 89, 5033, 3052, 3421, -134, + -134, 236, -134, 57, -134, 3052, 2806, 96, 2929, -134, + 61, 2806, 106, 2806, 63, 3421, 68, -134, 3421, 69, + -134, 75, 83, 90, 5943, 77, -134, 5943, 94, -134, + -134, -134, 99, 1579, 1579, 98, 113, 104, -134, 101, + -134, 102, 114, 107, -134, 109, -134, 115, 1412, 1579, + 117, 120, -134, 118, -134, 121, 127, -134, 124, -134, + -134, 425, -134, -134, 245, 374, -134, -134, 6203, -134, + -134, -134, 3052, -134, -134, 335, 3547, 284, 161, -134, + 4411, -134, -134, 2929, -134, -134, -134, -134, -134, 154, + 295, -134, -134, 4042, -134, 159, -134, -134, -134, 485, + -134, -134, -134, -134, 384, 2929, -134, -134, 406, -134, + -134, -134, -134, -134, 2929, -134, 2806, -134, 206, 203, + -134, -134, -134, -134, 375, -134, 577, 1475, -134, -134, + -134, -134, 186, -134, 5423, 178, -134, -134, 176, -134, + -134, 4165, -134, 377, -134, -134, 978, -134, -134, 957, + -134, -134, -134, 1032, 1579, 173, 169, 171, -134, 247, + -134, 1579, 164, 160, -134, 158, -134, 157, 5943, 156, + -134, -134, 304, 152, -134, 5163, -134, -134, -134, 5033, + -134, -134, -134, 145, -134, 162, -134, -134, -134, 5553, + 143, -134, 314, -134, -134, 12, -134, -134, 312, -134, + 928, -134, 5293, -134, -134, -134, 928, -134, -134, -134, + 139, -134, 698, -134, -134, 135, 133, 209, 132, 238, + 221, 389, 128, 599, 126, -134, -134, 2435, -134, -134, + -134, -134, -134, -134, -134, 411, -134, -134, 122, 1579, + 112, 119, 110, -134, 100, -134, -134, -134, 196, 97, + 2559, -134, -134, -134, -134, 2683, -134, -134, 111, 1701, + -134, 95, -134, 390, 79, -134, -134, -134, 76, -134, + -134, 824, 405, -134, 222, 86, 705, -134, 223, -134, -134, -134, -134, -134, -134, -134, -134, -134, -134, -134, - -134, 339, -134, -134, 4988, 277, -134, -134, -134, -134, - 60, 3014, -134, -134, -134, -134, -134, 6678, 80, 77, - -134, 300, 67, 364, 240, -134, 231, -134, -134, -134, - -134, 3014, -134, -134, -134, -134, 409, -134, 705, 205, - 51, 53, 218, 56, 47, -134, 54, 44, -134, 17, - -134, 41, 632, 349, 204, 607, 351, 43, 1786, 207, - -134, 1786, 193, -134, -134, 346, -134, 4988, 525, 42, - 188, -134, 353, -134, -134, -134, -134, 37, 832, 400, - 292, 713, 335, 57, -134, 4988, 531, 256, -8, 337, - -134, -134, -134, 363, -134, 875, 52, 48, 40, -11, - 832, 389, 31, 806, 38, 832, 410, 25, -134, 224, - -134, -134, -134, -134, -134, 1786, 4865, -134, 3878, 5, - 308, -134, -134, 2, -134, -134, 1786, 1040, 230, 2030, - -134, 396, -134, -134, -134, 439, -134, 250, -134, -134, - -134, -134, 2030, -134, -134, -134, -134, 713, 4, 379, - 208, -134, -30, -134, -134, 600, 186, -134, -134, + -134, 391, -134, -134, 4780, 237, -134, -134, -134, -134, + 58, 3052, -134, -134, -134, -134, -134, 6593, 84, 82, + -134, 298, 80, 332, 260, -134, 262, -134, -134, -134, + -134, 3052, -134, -134, -134, -134, 329, -134, -134, 625, + 270, 49, 50, 339, 62, 44, -134, 55, 20, -134, + 14, -134, 40, 642, 323, 326, 705, 359, 41, 1701, + 330, -134, 1701, 272, -134, -134, 342, -134, 4780, 515, + 37, 268, -134, 333, -134, -134, -134, -134, 32, 824, + 337, 302, 705, 367, 53, -134, 4780, 508, 258, -15, + 347, -134, -134, -134, -134, -134, 23, 331, -134, 755, + 170, 39, 36, -17, 824, 357, 27, 799, 33, 824, + 361, 26, -134, 235, -134, -134, -134, -134, -134, 1701, + 4903, -134, 3796, 5, 231, -134, -134, -1, -134, -134, + 1701, 928, 200, 2067, -134, 410, -134, -134, -134, 448, + -134, 213, -134, -134, -134, -134, 2067, -134, -134, -134, + -134, 574, 3, 322, 199, -134, -39, -134, -134, 556, + 197, -134, -134, - -238, 221, 177, 179, 208, 796, -238, -238, -238, -238, - -238, -238, -238, -238, -238, -238, -238, -53, -238, -238, - -238, -238, -96, -238, -238, -238, -238, -238, -238, -238, - -238, -238, -238, -44, -238, -238, -238, -238, -238, -238, - -238, -89, -238, -238, -238, 160, -238, 691, -238, -238, - -238, -238, 166, 168, -238, -238, 292, 150, 159, 644, - 635, -238, 632, 576, -238, -238, -238, -238, -238, 565, - 554, -238, -238, -238, -238, -238, -238, -238, -238, 520, - -238, 533, -238, 593, 675, 492, -238, -238, -238, -238, - -238, 512, 498, -238, -238, -238, -238, -238, -238, 472, - -238, -238, -238, -238, -238, -238, 462, -238, -238, -152, - -238, -11, -238, -238, 215, -238, -238, -238, -238, -238, + -238, 224, 247, 241, 286, 805, -238, -238, -238, -238, + -238, -238, -238, -238, -238, -238, -238, -46, -238, -238, + -238, -238, -82, -238, -238, -238, -238, -238, -238, -238, + -238, -238, -238, -30, -238, -238, -238, -238, -238, -238, + -238, -70, -238, -238, -238, 250, -238, 699, -238, -238, + -238, -238, 248, 240, -238, -238, 267, 222, 220, 660, + 641, -238, 659, 601, -238, -238, -238, -238, -238, 598, + 584, -238, -238, -238, -238, -238, -238, -238, -238, 509, + -238, 556, -238, 538, 574, 500, -238, -238, -238, -238, + -238, 520, 688, -238, -238, -238, -238, -238, -238, 499, + -238, -238, -238, -238, -238, -238, 470, -238, -238, -113, + -238, 48, -238, -238, 221, -238, -238, -238, -238, -238, -238, -238, -238, -238, -238, -238, -238, -238, -238, -238, - -238, -238, 34, -238, -238, -238, -238, -88, -238, -238, - -238, -238, -238, -238, 234, 240, 40, 255, -238, -238, - 211, -238, -16, -238, -238, -7, 41, -238, -238, -238, - 6, -238, -238, -238, 351, 72, -238, -238, -238, -114, - 19, -238, -95, -72, -69, -238, -238, 415, -238, 529, - -238, -238, -238, -238, -238, 524, 735, -238, -238, 460, - -238, -238, -238, -238, 404, 391, 375, -238, -238, -238, - 63, -238, 481, -238, -238, -238, 258, 62, -238, -238, + -238, -238, 115, -238, -238, -238, -238, -1, -238, -238, + -238, -238, -238, -238, 219, 213, 133, 217, -238, -238, + 167, -238, 93, -238, -238, 96, 139, -238, -238, -238, + 102, -238, -238, -238, 335, 175, -238, -238, -238, -4, + 82, -238, -32, -39, -45, -238, -238, 416, -238, 452, + -238, -238, -238, -238, -238, 468, 909, -238, -238, 486, + -238, -238, -238, -238, 498, 515, 497, -238, -238, -238, + -23, -238, 392, -238, -238, -238, 238, -42, -238, -238, -238, -238, -238, -238, -238, -238, -238, -238, -238, -238, -238, -238, -238, -238, -238, -238, -238, -238, -238, -238, -238, -238, -238, -238, -238, -238, -238, -238, -238, -238, -238, -238, -238, -238, -238, -238, -238, -238, -238, -238, - -238, 64, -238, -238, 250, 66, -238, -238, -238, 69, - -238, 67, -238, -238, -238, 68, 70, -238, 71, -238, - -238, -238, -238, 788, -238, -238, 799, -238, -238, -238, - 373, -238, 541, -238, 76, 354, -238, 77, -238, -238, - 361, -238, 362, -238, -238, -238, -238, 261, 101, -238, - -238, 106, 201, -238, -238, -238, -238, 313, -238, -238, - 74, -238, -238, -238, 307, 304, 84, 806, -238, 83, - -238, -238, -238, 90, -238, -238, 461, -238, -238, 119, - -9, -8, -14, -238, -238, -238, 92, -238, -238, -238, - -238, -238, -238, -238, -238, 108, -238, -238, -238, 505, - -238, -238, 300, 95, 96, -238, -238, -238, -238, -238, - -238, -238, -238, 448, -238, -238, 136, -238, 653, -238, - -238, -238, -238, -238, 118, -238, -238, 123, -238, -238, + -238, 56, -238, -238, 255, -63, -238, -238, -238, -60, + -238, -55, -238, -238, -238, -54, -51, -238, -49, -238, + -238, -238, -238, 812, -238, -238, 759, -238, -238, -238, + 350, -238, 356, -238, -31, 362, -238, -27, -238, -238, + 363, -238, 463, -238, -238, -238, -238, 270, 8, -238, + -238, 120, 210, -238, -238, -238, -238, 300, -238, -238, + 4, -238, -238, -238, 314, 316, 41, 723, -238, 25, + -238, -238, -238, 54, -238, -238, 442, -238, -238, 71, + -57, -56, -53, -238, -238, -238, 46, -238, -238, -238, + -238, -238, -238, -238, -238, 76, -238, -238, -238, 413, + -238, -238, 331, 65, 66, -238, -238, -238, -238, -238, + -238, -238, -238, 385, -238, -238, 145, -238, 591, -238, + -238, -238, -238, -238, 85, -238, -238, 90, -238, -238, -238, -238, -238, -238, -238, -238, -238, -238, -238, -238, - 183, -238, -238, 184, -238, -238, -238, 143, -238, -238, - 131, -238, 187, -238, -238, 652, -238, -238, -238, 20, - 337, -238, -238, -238, 283, -238, 348, -238, 140, -238, - -238, 141, -238, 214, -238, 122, -238, -238, -238, 205, - -238, 494, 117, 504, -238, -238, 219, -238, -238, 120, - -238, 91, -238, -238, -238, 302, 116, 89, -238, 85, - -238, -238, 456, -238, -238, -238, 171, -238, 172, -238, - 239, -238, 103, 82, -238, -238, -238, -238, -238, 367, - 100, 82, -238, -238, 175, -238, 188, -238, 260, -238, - -238, -238, 7, -238, -238, -238, 135, -238, 226, -238, - -238, 359, -238, 248, -238, -238, -57, 296, -238, -238, - -52, -238, -238, -238, -238, -238, 75, -238, 50, -238, - -238, 407, -238, -66, -238, 262, 81, -238, -238, -238, - 257, 246, -238, -238, 244, -238, 242, 233, -238, -238, - -238, -238, -238, 237, -238, -238, 59, -68, -70, -74, - -238, -238, -238, 58, -73, -75, -79, -238, -238, 267, - -238, -238, -238, 55, -80, -82, -85, -238, -93, 329, - -238, 47, -91, -97, -99, -238, -238, 31, -238, 206, - -238, 272, -238, 79, -238, 18, -238, -238, -238, -238, - -238, -103, -238, 17, -238, -101, -238, -238, -238, -238, - -76, -238, -238, -77, -238, 65, -238, -238, -115, -238, - -238, 42, -238, 339, -238, -238, -238, 38, -238, -238, - -1, -238, 270, -238, -5, -238, 266, -238, -238, -13, - -238, 5, -22, -238, -238, -33, -238, -238, 381, -238, - -238, -238, 1, -238, 612, -64, 621, -62, 459, 983, - -238, -238, 648, -238, 682, -238, 186, -30, 164, -238, - -238, -238, -238, -238, -238, -37, 664, -238, 323, -238, - -238, 563, -238, 590, -238, 153, -238, -238, 152, -238, - -238, -174, -176, -178, 162, -184, -238, 158, -187, -238, - -238, -238, -238, 290, 288, -238, -40, -175, -177, -179, - -238, -238, -45, -180, -183, -186, -238, -194, 286, 279, - -238, -190, -200, -202, -238, -238, -193, -203, -205, -238, - -238, -86, -238, -238, -238, -238, -238, -238, 353, -238, - -238, -238, -71, -238, -238, -238, -67, -238, -63, -238, - 142, -238, -238, 389, -238, -238, -238, -238, -238, -238, - -238, -238, -238, 253, -238, -238, -238, -238, -238, -38, - -238, -238, -238, -238, -238, 454, -238, -238, -55, -238, - -238, -238, -238, -238, 398, -238, 399, -238, 37, 39, - -238, -238, -238, -238, 331, -238, 319, 327, -238, -238, - -238, -238, -238, -238, 216, -155, -238, -238, -153, -238, - -238, -4, -238, 458, -238, -238, 222, -238, -238, 356, - -238, -238, -238, 349, 345, -238, 26, -104, -102, -105, - -238, 341, -238, -98, -106, -100, -238, -110, 220, -109, - -238, -238, -238, -238, -238, 309, -238, -238, -238, 228, - -238, -238, -238, -107, -238, -238, -238, -238, -238, 320, - -238, -238, 60, -238, -238, -238, -238, -238, -238, -238, - 265, -238, 363, -238, -238, -238, 294, -238, -238, -238, - 254, -238, 252, -238, -238, -238, -238, 343, -238, 212, - 209, 114, 400, 109, -238, -238, -238, 857, -238, -238, - -238, -238, -238, -238, -238, -238, -238, -238, -238, 298, - -238, 107, -24, -23, -25, -238, -238, -238, 151, -238, - 853, -238, -238, -238, -238, 820, -238, -238, -238, 686, - -238, -238, -238, 154, 147, -238, -238, -238, -238, -238, - -238, 185, 163, -238, -238, -238, 173, -238, 170, -238, + 159, -238, -238, 160, -238, -238, -238, 126, -238, -238, + 114, -238, 179, -238, -238, 718, -238, -238, -238, 13, + 340, -238, -238, -238, 342, -238, 324, -238, 130, -238, + -238, 134, -238, 195, -238, 122, -238, -238, -238, 204, + -238, 325, -73, 336, -238, -238, 206, -238, -238, 124, + -238, 98, -238, -238, -238, 338, 119, 88, -238, 84, + -238, -238, 346, -238, -238, -238, 141, -238, 142, -238, + 211, -238, 109, 73, -238, -238, -238, -238, -238, 374, + 95, 73, -238, -238, 143, -238, 144, -238, 216, -238, + -238, -238, 0, -238, -238, -238, 140, -238, 166, -238, + -238, 366, -238, 168, -238, -238, -48, 328, -238, -238, + -50, -238, -238, -238, -238, -238, 78, -238, 57, -238, + -238, 425, -238, -65, -238, 297, 79, -238, -238, -238, + 187, 197, -238, -238, 256, -238, 193, 199, -238, -238, + -238, -238, -238, 194, -238, -238, 63, -68, -66, -69, + -238, -238, -238, 61, -72, -75, -79, -238, -238, 302, + -238, -238, -238, 52, -81, -84, -86, -238, -94, 263, + -238, 49, -87, -98, -100, -238, -238, 30, -238, 257, + -238, 259, -238, 86, -238, 26, -238, -238, -238, -238, + -238, -93, -238, 21, -238, -95, -238, -238, -238, -238, + -71, -238, -238, -76, -238, 67, -238, -238, -111, -238, + -238, 43, -238, 291, -238, -238, -238, 39, -238, -238, + 2, -238, 260, -238, -2, -238, 264, -238, -238, -11, + -238, 6, -22, -238, -238, -33, -238, -238, 526, -238, + -238, -238, 5, -238, 581, -59, 638, -61, 473, 784, + -238, -238, 667, -238, 679, -238, 223, -29, 231, -238, + -238, -238, -238, -238, -238, -36, 669, -238, 364, -238, + -238, 665, -238, 657, -238, 232, -238, -238, 233, -238, + -238, -172, -174, -175, 242, -184, -238, 246, -186, -238, + -238, -238, -238, 284, 282, -238, -40, -177, -176, -178, + -238, -238, -44, -179, -181, -183, -238, -190, 280, 265, + -238, -188, -198, -200, -238, -238, -191, -202, -204, -238, + -238, -85, -238, -238, -238, -238, -238, -238, 475, -238, + -238, -238, -74, -238, -238, -238, 87, -238, -67, -238, + 239, -238, -238, 334, -238, -238, -238, -238, -238, -238, + -238, -238, -238, 253, -238, -238, -238, -238, -238, -41, + -238, -238, -238, -238, -238, 360, -238, -238, -58, -238, + -238, -238, -238, -238, 417, -238, 439, -238, 34, 35, + -238, -238, -238, -238, 507, -238, 521, 288, -238, -238, + -238, -238, -238, -238, 212, -159, -238, -238, -157, -238, + -238, -6, -238, 480, -238, -238, 207, -238, -238, 293, + -238, -238, -238, 295, 308, -238, 24, -107, -112, -108, + -238, 310, -238, -103, -110, -109, -238, -106, 200, -114, + -238, -238, -238, -238, -238, 278, -238, -238, -238, 198, + -238, -238, -238, -105, -238, -238, -238, -238, -238, 318, + -238, -238, 11, -238, -238, -238, -238, -238, -238, -238, + 320, -238, 450, -238, -238, -238, 322, -238, -238, -238, + 201, -238, 189, -238, -238, -238, -238, 337, -238, 184, + 174, 108, 435, 183, -238, -238, -238, 862, -238, -238, + -238, -238, -238, -238, -238, -238, -238, -238, -238, 333, + -238, 110, -26, -24, -21, -238, -238, -238, 154, -238, + 833, -238, -238, -238, -238, 834, -238, -238, -238, 620, + -238, -238, -238, 150, 163, -238, -238, -238, -238, -238, + -238, 182, 161, -238, -238, -238, 178, -238, 177, -238, -238, -238, -238, -238, -238, -238, -238, -238, -238, -238, - -238, -238, -238, 139, 770, 149, -238, -238, -238, -238, - 130, 127, -238, -238, -238, 224, -238, 102, -238, -238, - -238, -238, -238, 78, 138, -238, 360, -238, -238, -238, - -238, 73, -238, -238, -238, -238, -238, -238, 121, -238, + -238, -238, -238, 117, 771, 132, -238, -238, -238, -238, + 100, 99, -238, -238, -238, 205, -238, 59, -238, -238, + -238, -238, -238, -5, 62, -238, 55, -238, -238, -238, + -238, -20, -238, -238, -238, -238, -238, -238, -238, 12, -238, -238, -238, -238, -238, -238, -238, -238, -238, -238, - -238, -238, 113, 88, -238, 112, 115, -238, 729, -238, - -238, 640, 111, -238, -238, -238, 80, 922, 43, 86, - 87, -238, 53, -238, -238, -238, -238, -238, 61, 33, - -238, 51, 54, -238, 30, 896, -10, 45, 12, -238, - -238, -238, -238, 35, -238, 232, -238, -238, -238, -238, - 28, 4, -238, 207, -238, 24, -3, -238, -238, 23, - -238, -238, -238, -238, 204, 657, 881, -238, 762, 15, - -238, -238, -238, 13, -238, -238, 530, 22, 223, 804, - -238, 16, -238, -238, -238, -41, -238, 14, -238, -238, - -238, -238, 745, -238, -238, -238, -238, 3, -238, 0, - -6, -238, -238, -238, -238, -12, 137, -238, -238 + -238, -238, -238, 23, 3, -238, 32, 40, -238, 637, + -238, -238, 670, 58, -238, -238, -238, 70, 912, 37, + 301, 112, -238, 107, -238, -238, -238, -238, -238, 180, + 162, -238, 181, 176, -238, 156, 905, 118, 170, 165, + -238, -238, -238, -238, -238, -238, -238, 137, -238, 202, + -238, -238, -238, -238, 106, 75, -238, 215, -238, 72, + 44, -238, -238, 64, -238, -238, -238, -238, 228, 666, + 1130, -238, 606, 50, -238, -238, -238, 36, -238, -238, + 544, 45, 266, 798, -238, 42, -238, -238, -238, -15, + -238, 38, -238, -238, -238, -238, 761, -238, -238, -238, + -238, 20, -238, 19, 18, -238, -238, -238, -238, -7, + -3, -238, -238 }; const short QmlJSGrammar::action_info [] = { - 317, 110, 543, 176, 829, 542, 549, 176, 110, 553, - 110, 176, 498, 536, -569, 561, 110, 505, -126, 1092, - 1093, 1098, 105, 634, 571, 533, 642, 644, -530, -132, - 579, 416, 663, 583, 583, 530, 900, 661, 583, 900, - 925, 590, 515, 589, 517, 1046, 925, 511, 1043, 323, - 603, 1049, 323, 482, 505, -107, 601, 500, 110, 1041, - 607, 482, 976, 498, 1024, 990, 766, 323, 484, 478, - 628, 987, 323, 989, 971, 1019, 900, 986, 998, 993, - 452, 476, 452, 983, -193, 981, 169, -195, 177, 282, - 634, 469, 988, 110, 955, 280, 292, 658, 644, 452, - 663, 290, 176, 405, 482, 567, 575, 482, 610, 927, - 909, 614, 515, 922, 452, 110, 661, 452, 317, 317, - 654, 642, 517, 460, 317, 517, 317, 317, 317, 900, - 323, 902, 850, 684, -571, 0, 856, 266, 667, 110, - 110, 458, 110, 176, 251, 177, 670, 498, 0, 530, - 530, 842, 889, 287, 292, 976, 176, 110, 1033, 110, - 273, 176, 980, 908, 686, 896, 176, 272, 364, 692, - 416, 0, 304, 317, 317, 505, 891, 326, 701, 364, - 0, 0, 364, 505, 517, 323, 706, 317, 0, 110, - 323, 110, 423, 270, 290, 307, 280, 1012, 400, 372, - 366, 421, 323, 474, 323, 530, 323, 349, 456, 352, - 505, 899, 110, -197, 418, 1001, 742, 0, 813, 925, - 176, 746, 282, 251, 254, 251, 984, 806, 251, 995, - 900, 91, 329, 426, 365, 358, 176, 0, 351, 593, - 251, 790, 738, 92, 255, 399, 251, 788, 498, 296, - 295, 296, 295, 683, 445, 91, 296, 295, 296, 295, - 296, 295, 91, 296, 295, 1002, 925, 92, 296, 295, - 97, 296, 295, 913, 92, 985, 926, 436, 252, 616, - 251, 788, 98, 733, 251, 296, 295, 296, 295, 296, - 295, 296, 295, 91, 296, 295, 1066, 1067, 296, 295, - 429, 251, 743, 296, 295, 92, 718, 925, 963, 722, - 914, 296, 295, 296, 295, 825, 1001, 1021, 427, 296, - 295, 655, -197, 852, 284, 251, 276, 44, 251, 586, - 296, 295, 44, 297, 569, 728, 251, 839, 402, 533, - 296, 295, 997, 277, 1066, 1067, 943, 194, -573, 195, - 251, 258, -241, 1006, 1054, 719, 744, 964, 997, -574, - 196, 323, 656, 416, 826, 285, 1061, 923, 840, -240, - 100, 194, 853, 195, 0, 652, 587, 0, 452, 923, - 600, 900, 577, 1017, 196, 729, 296, 295, 0, 0, - 612, 194, 0, 195, 601, 194, -413, 195, 296, 295, - 1035, -413, 296, 295, 196, 296, 295, -241, 196, 296, - 295, 416, 965, 0, 296, 295, 920, 101, 404, 923, - 923, 966, -132, 102, -240, -197, 296, 295, 920, 919, - 923, 100, 920, 967, 194, 323, 195, 991, 100, 923, - 923, 919, 296, 295, 918, 919, 1088, 196, -413, 251, - 206, 494, 304, 776, 206, -197, 494, 304, 0, 296, - 295, 0, 777, 0, 776, 0, 755, 756, 920, 920, - 207, 0, 0, 777, 207, 0, 0, 1055, 101, 920, - 0, 919, 919, 0, 102, 101, 920, 0, 920, 920, - 0, 102, 919, 920, 0, 1095, 180, 181, 206, 919, - 0, 919, 919, 0, 296, 295, 919, 206, 254, 180, - 181, 0, 1087, 646, 755, 756, 0, 0, 207, 206, - 261, 0, 412, 413, 182, 183, 0, 207, 255, 261, - 668, 803, 0, 647, 0, 648, 493, 182, 183, 207, - 206, 665, 0, 0, 64, 79, 206, 0, 64, 79, - 0, 6, 5, 4, 1, 3, 2, 0, 0, -100, - 207, 0, 665, 0, 0, -100, 207, 783, 665, 187, - 188, 0, 0, 187, 188, 0, 0, 0, 190, 494, - 304, 191, 190, 192, 0, 191, 0, 192, 0, 0, - 1028, 784, 64, 79, 0, 0, 0, 187, 188, 0, - 0, 64, 79, 0, 0, 189, 190, 64, 79, 191, - 932, 192, 0, 64, 79, 0, 0, 187, 188, 0, - 0, 0, 785, 0, 0, 189, 190, 180, 181, 191, - 932, 192, 0, 0, 64, 79, 157, 932, 0, 0, - 64, 79, 0, 0, 0, 412, 413, 925, 0, 0, - 1029, 939, 936, 0, 0, 182, 183, 0, 0, 493, - 0, 639, 932, 0, 0, 639, 925, 0, 0, 0, - 935, 939, 936, 0, 0, 0, 0, 935, 939, 936, - 0, 932, 0, 0, 0, 0, 930, 937, 929, 186, - 0, 0, 0, 0, 0, 0, 0, 933, 931, 938, - 0, 0, 935, 939, 936, 0, 930, 937, 929, 186, - 0, 0, 0, 930, 937, 929, 0, 933, 931, 938, - 925, 935, 939, 936, 933, 931, 938, 0, 0, 0, - 934, 0, 0, 0, 0, 932, 0, 934, 930, 937, - 929, 0, 0, 932, 0, 0, 0, 0, 0, 933, - 931, 938, 0, 0, 0, 0, 0, 930, 937, 929, - 0, 0, 934, 55, 0, 0, 0, 0, 933, 931, - 938, 0, 0, 0, 0, 935, 939, 936, 0, 0, - 0, 934, 0, 935, 939, 936, 0, 0, 0, 0, + 176, 549, -572, 317, 543, 317, 553, 542, 176, 176, + 498, 1097, 561, 317, 505, 317, 536, 1102, 1096, 105, + 571, -129, 634, 642, 644, -533, 416, 579, -135, 583, + 583, 533, 663, 900, 661, 590, 583, 589, 530, 900, + 1050, 925, 925, 517, 1047, 1053, -110, 603, 515, 601, + 482, 323, 323, 511, 317, 976, 482, 607, 505, 500, + 1025, 922, 991, 317, 484, 323, 766, 628, 989, 323, + 1020, 900, 988, 478, 987, 498, 999, 110, 994, 990, + 984, 452, 476, 982, 169, 110, 177, 971, 452, -196, + 634, -198, 955, 292, 317, 280, 282, 405, 644, 176, + 482, 469, 567, 658, 575, 452, 290, 482, 663, 610, + 317, 614, 642, 661, 922, 110, 927, 517, 909, 654, + 317, 317, 452, 317, 517, 452, 317, 902, 850, 900, + 667, 670, 460, 445, 530, 176, 684, 317, 110, -574, + 323, 110, 266, 177, 110, 0, 0, 0, 251, 976, + 292, 530, 498, 287, 110, 458, 1037, 176, 176, 889, + 686, 110, 981, 908, 692, 896, 176, 273, 272, 364, + 842, 416, 317, 304, 891, 505, 317, 1045, 515, 701, + 326, 505, 0, 706, 323, 364, 317, 0, 364, 372, + 307, 517, 323, 270, 110, 366, 290, 0, 1013, 423, + 280, 323, 349, 400, 421, 110, 323, 323, 352, -200, + 474, 899, 456, 530, 0, 505, 742, 110, 418, 282, + 251, 746, 254, 251, 251, 0, 813, 0, 251, 91, + 900, 593, 251, 251, 91, 806, 329, 925, 586, 1002, + 365, 92, 255, 358, 251, 790, 92, 926, 351, 399, + 297, 788, 91, 718, 655, 296, 295, 251, 498, 856, + 296, 295, 296, 295, 92, 251, 296, 295, 829, 296, + 295, 296, 295, 252, 569, 683, 296, 295, 436, 913, + 296, 295, 577, 258, 788, 587, 296, 295, 284, 1065, + 296, 295, 788, 600, 652, 656, 296, 295, 296, 295, + 296, 295, 719, 743, 176, 426, 963, 601, 251, 1070, + 1071, 402, 825, 276, 1070, 1071, 914, 925, -200, 429, + 852, 296, 295, 296, 295, 296, 295, 1022, 251, 285, + 277, 296, 295, 296, 295, 296, 295, 44, 1002, -135, + 91, 925, 738, 728, 296, 295, 97, 985, 839, 1007, + 100, 996, 92, 923, 44, 964, -577, 744, 98, 918, + 100, 826, 612, 1018, 0, -416, 998, 923, 1039, 853, + -416, 194, 251, 195, 998, -576, 0, 1036, 251, 840, + 965, 722, 616, 733, 196, 296, 295, 923, 1003, 966, + 427, 923, 416, 729, 296, 295, 986, 101, 943, 494, + 304, 967, 920, 102, 100, 296, 295, 101, 920, 296, + 295, 533, 920, 102, 416, 919, 920, -416, 1058, 992, + 918, 919, 296, 295, 254, 919, 920, 296, 295, 919, + 296, 295, -200, 296, 295, 923, 920, 0, 1099, 919, + 920, 404, 323, -243, 255, 900, 668, -244, 0, 919, + 0, 101, 452, 919, 296, 295, 323, 102, 180, 181, + 1092, 776, -200, 206, 180, 181, 494, 304, 920, 920, + 777, 206, 0, 296, 295, 180, 181, 180, 181, 803, + 776, 919, 919, 207, 920, 0, 182, 183, 0, 777, + 0, 207, 182, 183, 646, 755, 756, 919, -243, 0, + 206, 0, -244, 182, 183, 182, 183, 206, 194, 0, + 195, 0, 0, 0, 647, 0, 648, 755, 756, 0, + 207, 196, 261, 206, 0, 0, 1091, 207, 0, 261, + 206, 0, 412, 413, 6, 5, 4, 1, 3, 2, + 0, 1059, -103, 207, 0, 665, 493, 187, 188, -103, + 207, 0, 665, 0, 0, 0, 190, 64, 79, 191, + 0, 192, 187, 188, 0, 64, 79, 0, 0, 187, + 188, 190, 0, 0, 191, 0, 192, 189, 190, 0, + 0, 191, 0, 192, 187, 188, 932, 783, 64, 79, + 0, 0, 189, 190, 64, 79, 191, 0, 192, 494, + 304, 64, 79, 0, 932, 0, 0, 0, 0, 1029, + 0, 784, 0, 0, 0, 0, 206, 64, 79, 0, + 0, 0, 0, 0, 64, 79, 935, 939, 936, 932, + 0, 0, 0, 0, 0, 0, 207, 0, 665, 639, + 925, 0, 785, 0, 935, 939, 936, 0, 0, 0, + 0, 0, 0, 0, 639, 932, 157, 925, 0, 0, + 0, 186, 930, 937, 929, 412, 413, 0, 0, 1030, + 939, 936, 932, 933, 931, 938, 186, 0, 0, 493, + 930, 937, 929, 0, 0, 0, 934, 0, 0, 0, + 0, 933, 931, 938, 0, 935, 939, 936, 0, 0, + 0, 0, 0, 0, 934, 930, 937, 929, 0, 0, + 64, 79, 935, 939, 936, 0, 933, 931, 938, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, + 0, 930, 937, 929, 0, 932, 0, 0, 0, 0, + 0, 0, 933, 931, 938, 0, 0, 0, 930, 937, + 929, 0, 0, 0, 0, 934, 0, 0, 0, 933, + 931, 938, 0, 0, 0, 0, 0, 0, 71, 75, + 72, 0, 934, 0, 0, 935, 939, 936, 0, 55, + 0, 0, 0, 0, 0, 1041, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 71, 75, 72, 0, 0, 0, 0, - 0, 930, 937, 929, 0, 0, 0, 0, 0, 930, - 937, 929, 933, 931, 938, 0, 0, 0, 0, 0, - 933, 931, 938, 55, 0, 934, 1037, 76, 0, 51, - 73, 46, 0, 934, 0, 0, 0, 925, 0, 44, - 67, 54, 74, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 932, 68, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 71, 75, 72, 935, 939, 936, 0, - 0, 0, 0, 0, 0, 920, 0, 55, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 919, 0, - 0, 0, 935, 939, 936, 1037, 0, 76, 0, 51, - 73, 46, 930, 937, 929, 0, 0, 0, 0, 44, - 67, 54, 74, 933, 931, 938, 0, 71, 75, 72, - 0, 0, 0, 68, 0, 0, 934, 55, 930, 937, - 929, 0, 0, 0, 0, 935, 939, 936, 0, 933, - 931, 938, 0, 0, 920, 0, 0, 0, 0, 0, - 0, 76, 934, 51, 73, 46, 55, 919, 0, 0, - 0, 0, 0, 44, 67, 54, 74, 71, 75, 72, - 0, 930, 937, 929, 0, 0, 0, 68, 0, 0, - 0, 55, 933, 931, 938, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 934, 71, 75, 72, 55, - 0, 76, 0, 51, 73, 46, 498, 0, 0, 0, - 0, 0, 0, 44, 67, 54, 74, 0, 0, 0, - 0, 71, 75, 72, 0, 0, 0, 68, 0, 0, - 76, 0, 51, 73, 46, 0, 0, 0, 0, 71, - 75, 72, 44, 67, 54, 74, 0, 0, 0, 0, - 0, 0, 0, 0, 515, 76, 68, 51, 73, 46, - 55, 0, 0, 0, 0, 55, 0, 44, 67, 54, - 74, 0, 683, 76, 0, 51, 73, 46, 0, 0, - 0, 68, 0, 0, 0, 44, 67, 54, 74, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, - 71, 75, 72, 0, 0, 71, 75, 72, 0, 0, + 0, 0, 76, 0, 51, 73, 46, 0, 0, 0, + 0, 930, 937, 929, 44, 67, 54, 74, 0, 71, + 75, 72, 933, 931, 938, 935, 939, 936, 68, 1041, + 0, 0, 0, 0, 920, 934, 0, 0, 0, 925, + 0, 0, 0, 0, 0, 0, 0, 919, 55, 0, + 0, 0, 0, 76, 932, 51, 73, 46, 0, 0, + 0, 930, 937, 929, 0, 44, 67, 54, 74, 935, + 939, 936, 933, 931, 938, 0, 0, 0, 920, 68, + 0, 0, 0, 0, 0, 934, 0, 0, 71, 75, + 72, 919, 0, 0, 935, 939, 936, 0, 0, 0, + 0, 0, 0, 0, 55, 930, 937, 929, 0, 0, + 0, 498, 0, 0, 0, 0, 933, 931, 938, 0, + 0, 0, 76, 0, 51, 73, 46, 0, 0, 934, + 930, 937, 929, 55, 44, 67, 54, 74, 0, 0, + 683, 933, 931, 938, 71, 75, 72, 0, 68, 0, + 0, 0, 0, 0, 934, 0, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 55, 0, 0, 0, 0, 0, 0, 804, 0, - 0, 0, 0, 0, 76, 0, 51, 73, 46, 76, - 0, 51, 73, 46, 0, 0, 44, 67, 54, 74, - 0, 44, 67, 54, 74, 0, 0, 0, 0, 0, - 68, 71, 75, 72, 55, 68, 0, 0, 0, 0, - 0, 498, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 55, 0, 0, 0, 315, 316, 55, - 0, 0, 0, 315, 316, 76, 0, 51, 73, 46, - 0, 0, 0, 0, 71, 75, 72, 44, 67, 54, - 74, 0, 0, 0, 55, 0, 0, 0, 315, 316, - 0, 68, 0, 71, 75, 72, 0, 0, 0, 71, - 75, 72, 0, 0, 0, 0, 0, 0, 76, 55, - 51, 73, 46, 315, 316, 0, 0, 0, 0, 0, - 44, 67, 54, 74, 71, 75, 72, 76, 0, 51, - 73, 46, 0, 76, 68, 51, 73, 46, 55, 44, - 67, 54, 74, 0, 0, 44, 67, 54, 74, 71, - 75, 72, 0, 68, 0, 0, 0, 0, 76, 68, - 51, 73, 46, 0, 0, 0, 0, 0, 0, 0, - 44, 67, 54, 74, 0, 0, 0, 0, 71, 75, - 72, 0, 0, 76, 68, 51, 73, 46, 0, 0, - 0, 0, 0, 375, 0, 44, 67, 54, 74, 0, - 0, 0, 0, 376, 0, 0, 0, 377, 0, 68, - 0, 515, 76, 0, 51, 73, 46, 378, 0, 379, + 0, 0, 0, 71, 75, 72, 0, 0, 76, 0, + 51, 73, 46, 0, 0, 0, 0, 55, 0, 0, + 44, 67, 54, 74, 498, 0, 0, 0, 71, 75, + 72, 0, 0, 0, 68, 0, 0, 76, 55, 51, + 73, 46, 0, 0, 0, 804, 0, 0, 0, 44, + 67, 54, 74, 0, 0, 0, 0, 71, 75, 72, + 0, 0, 76, 68, 51, 73, 46, 55, 0, 0, + 0, 315, 316, 0, 44, 67, 54, 74, 71, 75, + 72, 0, 0, 0, 0, 0, 0, 0, 68, 0, + 0, 76, 55, 51, 73, 46, 0, 0, 0, 0, + 0, 0, 0, 44, 67, 54, 74, 71, 75, 72, + 0, 0, 76, 0, 51, 73, 46, 68, 0, 0, 0, 0, 0, 0, 44, 67, 54, 74, 0, 0, - 380, 0, 381, 97, 0, 55, 0, 0, 68, 315, - 316, 382, 55, 0, 383, 98, 315, 316, 0, 0, - 384, 0, 0, 0, 0, 0, 0, 386, 385, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 387, 71, 75, 72, 0, 0, - 0, 0, 71, 75, 72, 0, 0, 0, 0, 0, - 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, - 0, 51, 73, 46, 0, 0, 76, 0, 51, 73, - 46, 44, 67, 54, 74, 296, 295, 0, 44, 67, - 54, 74, 71, 75, 72, 68, 0, 0, 0, 0, - 0, 0, 68, 0, 0, 0, 55, 0, 0, 0, - 315, 316, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 76, 0, 51, 73, - 46, 0, 0, 0, 0, 0, 0, 0, 44, 67, - 54, 74, 0, 0, 0, 0, 71, 75, 72, 0, - 375, 0, 68, 0, 0, 0, 0, 0, 0, 0, - 376, 0, 0, 0, 433, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 378, 0, 379, 0, 0, 0, - 76, 55, 51, 73, 46, 839, 0, 380, 0, 381, - 97, 0, 44, 67, 54, 74, 0, 0, 382, 0, - 0, 383, 98, 0, 0, 0, 68, 384, 0, 0, - 55, 0, 0, 0, 386, 385, 840, 0, 0, 0, - 790, 71, 75, 72, 0, 0, 0, 0, 0, 0, - 0, 387, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 296, 295, 0, 0, 0, 0, 0, - 71, 75, 72, 0, 0, 76, 0, 51, 73, 46, - 0, 0, 0, 0, 0, 375, 0, 44, 67, 54, - 74, 0, 0, 0, 0, 376, 0, 0, 0, 433, - 0, 68, 0, 0, 76, 0, 51, 73, 46, 378, - 0, 379, 0, 0, 426, 0, 44, 67, 54, 74, - 0, 0, 380, 0, 381, 97, 0, 0, 0, 0, - 68, 0, 0, 382, 55, 0, 383, 98, 315, 316, - 0, 0, 384, 0, 0, 0, 0, 0, 0, 386, - 385, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 387, 0, 0, 0, - 0, 0, 0, 0, 71, 75, 72, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 427, - 0, 0, 0, 314, 0, 0, 0, 0, 76, 0, - 51, 73, 46, 0, 0, 0, 0, 0, 0, 0, - 44, 67, 54, 74, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 0, 0, 0, 48, 49, - 0, 0, 0, 0, 0, 0, 0, 0, 53, 52, + 0, 0, 71, 75, 72, 0, 0, 0, 68, 0, + 0, 76, 0, 51, 73, 46, 0, 375, 0, 0, + 0, 0, 0, 44, 67, 54, 74, 376, 0, 0, + 0, 433, 0, 0, 0, 515, 76, 68, 51, 73, + 46, 378, 0, 379, 0, 0, 0, 0, 44, 67, + 54, 74, 0, 0, 380, 0, 381, 97, 0, 55, + 0, 0, 68, 315, 316, 382, 55, 0, 383, 98, + 315, 316, 0, 0, 384, 0, 0, 0, 0, 0, + 0, 386, 385, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 387, 71, + 75, 72, 0, 0, 0, 0, 71, 75, 72, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, - 56, 57, 0, 58, 0, 0, 0, 0, 0, 0, - 202, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 77, 71, 75, 72, 0, - 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 65, 82, 50, 0, 0, 0, 0, 0, 61, - 0, 0, 0, 0, 0, 0, 0, 78, 45, 0, - 76, 0, 51, 73, 46, 64, 79, 0, 0, 0, - 0, 0, 44, 67, 54, 74, 0, 0, 0, 0, + 0, 0, 0, 76, 0, 51, 73, 46, 0, 0, + 76, 0, 51, 73, 46, 44, 67, 54, 74, 296, + 295, 0, 44, 67, 54, 74, 71, 75, 72, 68, 0, 0, 0, 0, 0, 0, 68, 0, 0, 0, - 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, - 53, 52, 0, 0, 0, 0, 0, 0, 55, 0, - 0, 0, 56, 57, 0, 58, 0, 0, 0, 0, - 0, 0, 62, 0, 0, 0, 66, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 77, 71, 75, - 72, 0, 80, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 65, 82, 50, 0, 0, 0, 0, - 0, 61, 0, 0, 0, 0, 0, 0, 0, 78, - 45, 0, 76, 0, 51, 73, 46, 64, 79, 0, - 0, 0, 0, 0, 44, 67, 54, 74, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 0, - 0, 0, 48, 49, 0, 0, 0, 0, 0, 0, - 0, 0, 53, 52, 0, 0, 0, 0, 0, 0, - 55, 0, 0, 0, 56, 57, 0, 58, 0, 0, - 0, 0, 0, 0, 202, 0, 0, 0, 66, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, - 71, 75, 72, 0, 80, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 65, 82, 50, 0, 0, - 865, 0, 0, 61, 0, 0, 0, 0, 0, 0, - 0, 78, 45, 0, 76, 0, 51, 73, 46, 64, - 79, 0, 0, 0, 0, 0, 44, 67, 54, 74, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 0, 0, 0, 48, 49, 0, 260, 0, 0, - 0, 0, 0, 0, 53, 52, 0, 0, 0, 0, - 0, 0, 55, 0, 0, 0, 56, 57, 0, 58, - 0, 0, 0, 0, 0, 0, 62, 0, 0, 0, - 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 77, 71, 75, 72, 0, 80, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 65, 82, 50, - 0, 0, 0, 0, 0, 61, 0, 0, 0, 0, - 0, 0, 0, 78, 45, 0, 76, 0, 51, 73, - 46, 64, 79, 0, 0, 0, 0, 0, 44, 67, - 54, 74, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 68, 0, 0, 0, 48, 49, 0, 0, - 0, 0, 0, 0, 0, 0, 53, 52, 0, 0, - 0, 0, 0, 0, 55, 0, 0, 0, 56, 57, - 0, 58, 0, 0, 0, 0, 0, 0, 202, 0, - 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 77, 71, 75, 72, 0, 80, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, - 82, 50, 0, 0, 0, 0, 203, 61, 0, 0, - 0, 0, 0, 0, 0, 78, 45, 0, 76, 0, - 51, 73, 46, 64, 79, 0, 0, 0, 0, 0, - 44, 67, 54, 74, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 0, 0, 0, 48, 49, - 0, 260, 0, 0, 0, 0, 0, 0, 53, 52, - 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, - 56, 57, 0, 58, 0, 0, 0, 0, 0, 0, - 202, 0, 0, 0, 66, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 77, 71, 75, 72, 0, - 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 65, 82, 50, 0, 0, 0, 0, 0, 61, - 0, 0, 0, 0, 0, 0, 0, 78, 45, 0, - 76, 0, 51, 73, 46, 64, 79, 0, 0, 0, + 55, 0, 0, 0, 315, 316, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, + 76, 0, 51, 73, 46, 0, 0, 0, 0, 0, 0, 0, 44, 67, 54, 74, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 68, 0, 0, 0, - 867, 0, 48, 49, 0, 0, 0, 0, 0, 0, - 0, 0, 870, 869, 0, 0, 0, 0, 0, 0, - 55, 0, 0, 0, 56, 57, 0, 58, 0, 0, - 0, 0, 0, 0, 202, 0, 0, 0, 66, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, - 871, 874, 872, 0, 80, 0, 0, 0, 0, 157, - 0, 0, 0, 0, 0, 65, 82, 50, 0, 0, - 865, 0, 0, 61, 0, 0, 0, 0, 868, 0, - 0, 78, 45, 0, 76, 0, 51, 873, 866, 64, - 79, 0, 0, 0, 0, 0, 44, 67, 54, 74, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 0, 0, 0, 867, 0, 48, 49, 0, 0, - 0, 0, 0, 0, 0, 0, 870, 869, 0, 0, - 0, 0, 0, 0, 55, 0, 0, 0, 56, 57, - 0, 58, 0, 0, 0, 0, 0, 0, 202, 0, - 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, - 0, 906, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 77, 871, 874, 872, 0, 80, 0, - 0, 0, 0, 157, 0, 0, 0, 0, 0, 65, - 82, 50, 0, 0, 865, 0, 0, 61, 0, 0, - 0, 0, 868, 0, 0, 78, 45, 0, 76, 0, - 51, 873, 866, 64, 79, 0, 0, 0, 0, 0, - 44, 67, 54, 74, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 0, 0, 0, 867, 0, - 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, - 870, 869, 0, 0, 0, 0, 0, 0, 55, 0, - 0, 0, 56, 57, 0, 58, 0, 0, 0, 0, - 0, 0, 202, 0, 0, 0, 66, 0, 0, 0, - 0, 0, 0, 0, 0, 903, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 77, 871, 874, - 872, 0, 80, 0, 0, 0, 0, 157, 0, 0, - 0, 0, 0, 65, 82, 50, 0, 0, 865, 0, - 0, 61, 0, 0, 0, 0, 868, 0, 0, 78, - 45, 0, 76, 0, 51, 873, 866, 64, 79, 0, - 0, 0, 0, 0, 44, 67, 54, 74, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 0, - 0, 0, 47, 48, 49, 0, 0, 0, 0, 0, + 71, 75, 72, 0, 0, 0, 68, 0, 0, 0, + 0, 0, 296, 295, 0, 0, 0, 0, 0, 71, + 75, 72, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 76, 0, 51, 73, 46, 0, + 0, 0, 0, 0, 0, 0, 44, 67, 54, 74, + 0, 0, 0, 76, 0, 51, 73, 46, 0, 0, + 68, 0, 0, 0, 375, 44, 67, 54, 74, 0, + 0, 0, 0, 0, 376, 0, 0, 55, 377, 68, + 0, 315, 316, 0, 0, 0, 0, 0, 378, 0, + 379, 0, 0, 55, 0, 0, 0, 315, 316, 0, + 0, 380, 0, 381, 97, 0, 0, 0, 0, 0, + 0, 0, 382, 0, 0, 383, 98, 71, 75, 72, + 0, 384, 0, 0, 0, 0, 0, 0, 386, 385, + 0, 0, 55, 71, 75, 72, 315, 316, 0, 0, + 0, 0, 0, 0, 0, 387, 0, 0, 0, 0, + 0, 76, 0, 51, 73, 46, 0, 0, 0, 0, + 0, 0, 314, 44, 67, 54, 74, 76, 0, 51, + 73, 46, 71, 75, 72, 0, 375, 68, 0, 44, + 67, 54, 74, 0, 0, 0, 376, 0, 0, 0, + 433, 0, 0, 68, 0, 55, 0, 0, 0, 839, + 378, 314, 379, 0, 0, 426, 76, 0, 51, 73, + 46, 0, 0, 380, 0, 381, 97, 0, 44, 67, + 54, 74, 0, 0, 382, 0, 0, 383, 98, 0, + 840, 0, 68, 384, 790, 71, 75, 72, 0, 0, + 386, 385, 0, 0, 0, 0, 0, 0, 212, 213, + 214, 0, 0, 217, 219, 220, 0, 387, 221, 0, + 222, 0, 0, 0, 227, 228, 0, 229, 0, 76, + 0, 51, 73, 46, 55, 230, 232, 233, 0, 0, + 0, 44, 67, 54, 74, 0, 0, 0, 235, 0, + 427, 0, 0, 0, 0, 68, 0, 0, 0, 55, + 0, 0, 0, 315, 316, 238, 0, 0, 0, 0, + 0, 0, 0, 0, 71, 75, 72, 240, 241, 242, + 0, 244, 245, 246, 247, 248, 249, 0, 0, 236, + 243, 226, 216, 234, 0, 218, 237, 0, 0, 71, + 75, 72, 223, 0, 0, 239, 215, 225, 76, 224, + 51, 73, 46, 0, 0, 0, 0, 0, 231, 0, + 44, 67, 54, 74, 0, 0, 0, 0, 314, 0, + 0, 0, 0, 76, 68, 51, 73, 46, 0, 0, + 0, 0, 0, 0, 0, 44, 67, 54, 74, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, + 0, 0, 0, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 53, 52, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 56, 57, 0, 58, 0, - 0, 0, 59, 0, 60, 62, 63, 0, 0, 66, - 0, 0, 0, 0, 69, 0, 70, 0, 0, 0, + 0, 0, 0, 0, 0, 202, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 77, 71, 75, 72, 0, 80, 0, 81, 0, 83, - 0, 84, 0, 0, 0, 0, 65, 82, 50, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 77, 71, 75, 72, 0, 80, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 65, 82, 50, 0, 0, 0, 0, 0, 61, 0, 0, 0, 0, 0, 0, 0, 78, 45, 0, 76, 0, 51, 73, 46, 64, 79, 0, 0, 0, 0, 0, 44, 67, 54, 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 68, 0, 0, 0, 47, 48, 49, 0, 0, - 0, 0, 0, 0, 0, 0, 53, 52, 0, 0, - 0, 0, 0, 0, 55, 0, 0, 0, 56, 57, - 0, 58, 0, 0, 0, 59, 0, 60, 62, 63, - 0, 0, 66, 0, 0, 0, 0, 69, 0, 70, + 0, 68, 0, 0, 0, 48, 49, 0, 0, 0, + 0, 0, 0, 0, 0, 53, 52, 0, 0, 0, + 0, 0, 0, 55, 0, 0, 0, 56, 57, 0, + 58, 0, 0, 0, 0, 0, 0, 62, 0, 0, + 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 77, 71, 75, 72, 0, 80, 0, - 81, 0, 83, 0, 84, 0, 0, 0, 0, 65, - 82, 50, 0, 0, 0, 0, 0, 61, 0, 0, - 0, 0, 0, 0, 160, 78, 45, 0, 76, 0, - 51, 73, 46, 64, 79, 0, 0, 0, 0, 0, - 44, 67, 54, 74, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 0, 0, 0, 47, 48, + 0, 0, 77, 71, 75, 72, 0, 80, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 65, 82, + 50, 0, 0, 0, 0, 0, 61, 0, 0, 0, + 0, 0, 0, 0, 78, 45, 0, 76, 0, 51, + 73, 46, 64, 79, 0, 0, 0, 0, 0, 44, + 67, 54, 74, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 68, 0, 0, 0, 48, 49, 0, + 0, 0, 0, 0, 0, 0, 0, 53, 52, 0, + 0, 0, 0, 0, 0, 55, 0, 0, 0, 56, + 57, 0, 58, 0, 0, 0, 0, 0, 0, 202, + 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 77, 71, 75, 72, 0, 80, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 65, 82, 50, 0, 0, 0, 0, 203, 61, 0, + 0, 0, 0, 0, 0, 0, 78, 45, 0, 76, + 0, 51, 73, 46, 64, 79, 0, 0, 0, 0, + 0, 44, 67, 54, 74, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 68, 0, 0, 0, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 53, 52, 0, 0, 0, 0, 0, 0, 55, 0, 0, - 0, 56, 57, 0, 58, 0, 0, 0, 59, 0, - 60, 62, 63, 0, 0, 66, 0, 0, 0, 0, - 69, 0, 70, 0, 0, 0, 0, 0, 0, 0, + 0, 56, 57, 0, 58, 0, 0, 0, 0, 0, + 0, 202, 0, 0, 0, 66, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 71, 75, 72, - 0, 80, 0, 81, 0, 83, 0, 84, 0, 0, - 0, 0, 65, 82, 50, 0, 0, 0, 0, 0, - 61, 0, 0, 0, 0, 0, 0, 85, 78, 45, + 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 65, 82, 50, 0, 0, 865, 0, 0, + 61, 0, 0, 0, 0, 0, 0, 0, 78, 45, 0, 76, 0, 51, 73, 46, 64, 79, 0, 0, 0, 0, 0, 44, 67, 54, 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 0, 0, - 0, 47, 48, 49, 0, 0, 0, 0, 0, 0, - 0, 0, 53, 52, 0, 0, 0, 0, 0, 0, - 55, 0, 0, 0, 56, 57, 0, 58, 0, 0, - 0, 59, 0, 60, 62, 63, 0, 0, 66, 0, - 0, 0, 0, 69, 0, 70, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, - 71, 75, 72, 0, 80, 0, 81, 0, 83, 0, - 84, 0, 0, 0, 0, 65, 82, 50, 0, 0, - 0, 0, 0, 61, 0, 0, 0, 0, 0, 265, - 160, 78, 45, 0, 76, 0, 51, 73, 46, 64, - 79, 0, 0, 0, 0, 0, 44, 67, 54, 74, + 0, 48, 49, 0, 260, 0, 0, 0, 0, 0, + 0, 53, 52, 0, 0, 0, 0, 0, 0, 55, + 0, 0, 0, 56, 57, 0, 58, 0, 0, 0, + 0, 0, 0, 62, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 0, 0, 0, 47, 48, 49, 0, 0, 0, - 0, 0, 0, 0, 0, 53, 52, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 77, 71, + 75, 72, 0, 80, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 65, 82, 50, 0, 0, 0, + 0, 0, 61, 0, 0, 0, 0, 0, 0, 0, + 78, 45, 0, 76, 0, 51, 73, 46, 64, 79, + 0, 0, 0, 0, 0, 44, 67, 54, 74, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, + 0, 0, 0, 48, 49, 0, 260, 0, 0, 0, + 0, 0, 0, 53, 52, 0, 0, 0, 0, 0, + 0, 55, 0, 0, 0, 56, 57, 0, 58, 0, + 0, 0, 0, 0, 0, 202, 0, 0, 0, 66, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 77, 71, 75, 72, 0, 80, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 65, 82, 50, 0, + 0, 0, 0, 0, 61, 0, 0, 0, 0, 0, + 0, 0, 78, 45, 0, 76, 0, 51, 73, 46, + 64, 79, 0, 0, 0, 0, 0, 44, 67, 54, + 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 68, 0, 0, 0, 867, 0, 48, 49, 0, + 0, 0, 0, 0, 0, 0, 0, 870, 869, 0, + 0, 0, 0, 0, 0, 55, 0, 0, 0, 56, + 57, 0, 58, 0, 0, 0, 0, 0, 0, 202, + 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 77, 871, 874, 872, 0, 80, + 0, 0, 0, 0, 157, 0, 0, 0, 0, 0, + 65, 82, 50, 0, 0, 865, 0, 0, 61, 0, + 0, 0, 0, 868, 0, 0, 78, 45, 0, 76, + 0, 51, 873, 866, 64, 79, 0, 0, 0, 0, + 0, 44, 67, 54, 74, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 68, 0, 0, 0, 867, + 0, 48, 49, 0, 0, 0, 0, 0, 0, 0, + 0, 870, 869, 0, 0, 0, 0, 0, 0, 55, + 0, 0, 0, 56, 57, 0, 58, 0, 0, 0, + 0, 0, 0, 202, 0, 0, 0, 66, 0, 0, + 0, 0, 0, 0, 0, 0, 903, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 77, 871, + 874, 872, 0, 80, 0, 0, 0, 0, 157, 0, + 0, 0, 0, 0, 65, 82, 50, 0, 0, 865, + 0, 0, 61, 0, 0, 0, 0, 868, 0, 0, + 78, 45, 0, 76, 0, 51, 873, 866, 64, 79, + 0, 0, 0, 0, 0, 44, 67, 54, 74, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, + 0, 0, 0, 867, 0, 48, 49, 0, 0, 0, + 0, 0, 0, 0, 0, 870, 869, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 56, 57, 0, - 58, 0, 0, 0, 59, 0, 60, 62, 63, 0, - 0, 66, 0, 0, 0, 0, 69, 0, 70, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 764, 0, - 0, 0, 77, 71, 75, 72, 0, 80, 0, 81, - 0, 83, 0, 84, 0, 0, 0, 0, 65, 82, - 50, 0, 0, 0, 0, 0, 61, 0, 0, 0, - 0, 0, 0, 85, 78, 45, 0, 76, 0, 51, - 73, 46, 64, 79, 0, 0, 0, 0, 0, 44, + 58, 0, 0, 0, 0, 0, 0, 202, 0, 0, + 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, + 906, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 77, 871, 874, 872, 0, 80, 0, 0, + 0, 0, 157, 0, 0, 0, 0, 0, 65, 82, + 50, 0, 0, 865, 0, 0, 61, 0, 0, 0, + 0, 868, 0, 0, 78, 45, 0, 76, 0, 51, + 873, 866, 64, 79, 0, 0, 0, 0, 0, 44, 67, 54, 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 0, 0, 0, 47, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 53, 52, @@ -1058,10 +991,10 @@ const short QmlJSGrammar::action_info [] = { 0, 0, 0, 0, 0, 77, 71, 75, 72, 0, 80, 0, 81, 0, 83, 0, 84, 0, 0, 0, 0, 65, 82, 50, 0, 0, 0, 0, 0, 61, - 0, 0, 0, 0, 0, 0, 85, 78, 45, 0, + 0, 0, 0, 0, 0, 0, 0, 78, 45, 0, 76, 0, 51, 73, 46, 64, 79, 0, 0, 0, 0, 0, 44, 67, 54, 74, 0, 0, 0, 0, - 0, 0, 0, 0, 108, 0, 68, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 68, 0, 0, 0, 47, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 53, 52, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 56, 57, 0, 58, 0, 0, 0, @@ -1070,10 +1003,10 @@ const short QmlJSGrammar::action_info [] = { 0, 0, 0, 0, 0, 0, 0, 0, 77, 71, 75, 72, 0, 80, 0, 81, 0, 83, 0, 84, 0, 0, 0, 0, 65, 82, 50, 0, 0, 0, - 0, 0, 61, 0, 0, 0, 0, 0, 0, 160, + 0, 0, 61, 0, 0, 0, 0, 0, 0, 85, 78, 45, 0, 76, 0, 51, 73, 46, 64, 79, 0, 0, 0, 0, 0, 44, 67, 54, 74, 0, - 0, 0, 0, 0, 0, 0, 793, 0, 0, 68, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 0, 0, 0, 47, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 53, 52, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 56, 57, 0, 58, @@ -1083,10 +1016,22 @@ const short QmlJSGrammar::action_info [] = { 0, 77, 71, 75, 72, 0, 80, 0, 81, 0, 83, 0, 84, 0, 0, 0, 0, 65, 82, 50, 0, 0, 0, 0, 0, 61, 0, 0, 0, 0, - 0, 314, 160, 78, 45, 0, 76, 0, 51, 73, + 0, 0, 160, 78, 45, 0, 76, 0, 51, 73, 46, 64, 79, 0, 0, 0, 0, 0, 44, 67, 54, 74, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 68, 0, 0, 0, 364, 0, 0, 47, + 0, 0, 68, 0, 0, 0, 47, 48, 49, 0, + 0, 0, 0, 0, 0, 0, 0, 53, 52, 0, + 0, 0, 0, 0, 0, 55, 0, 0, 0, 56, + 57, 0, 58, 0, 0, 0, 59, 0, 60, 62, + 63, 0, 0, 66, 0, 0, 0, 0, 69, 0, + 70, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 77, 71, 75, 72, 0, 80, + 0, 81, 0, 83, 0, 84, 0, 0, 0, 0, + 65, 82, 50, 0, 0, 0, 0, 0, 61, 0, + 0, 0, 0, 0, 268, 160, 78, 45, 0, 76, + 0, 51, 73, 46, 64, 79, 0, 0, 0, 0, + 0, 44, 67, 54, 74, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 68, 0, 0, 0, 47, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 53, 52, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 56, 57, 0, 58, 0, 0, 0, 59, @@ -1095,10 +1040,10 @@ const short QmlJSGrammar::action_info [] = { 0, 0, 0, 0, 0, 0, 0, 77, 71, 75, 72, 0, 80, 0, 81, 0, 83, 0, 84, 0, 0, 0, 0, 65, 82, 50, 0, 0, 0, 0, - 0, 61, 0, 0, 0, 0, 0, 0, 160, 78, + 0, 61, 0, 0, 0, 0, 0, 0, 85, 78, 45, 0, 76, 0, 51, 73, 46, 64, 79, 0, 0, 0, 0, 0, 44, 67, 54, 74, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 0, + 0, 0, 0, 0, 0, 0, 108, 0, 68, 0, 0, 0, 47, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 53, 52, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 56, 57, 0, 58, 0, @@ -1108,7 +1053,7 @@ const short QmlJSGrammar::action_info [] = { 77, 71, 75, 72, 0, 80, 0, 81, 0, 83, 0, 84, 0, 0, 0, 0, 65, 82, 50, 0, 0, 0, 0, 0, 61, 0, 0, 0, 0, 0, - 268, 160, 78, 45, 0, 76, 0, 51, 73, 46, + 265, 160, 78, 45, 0, 76, 0, 51, 73, 46, 64, 79, 0, 0, 0, 0, 0, 44, 67, 54, 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 0, 0, 0, 372, 0, 0, 47, 48, @@ -1136,28 +1081,16 @@ const short QmlJSGrammar::action_info [] = { 160, 78, 45, 0, 76, 0, 51, 73, 46, 64, 79, 0, 0, 0, 0, 0, 44, 67, 54, 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 0, 0, 0, 47, 48, 49, 0, 0, 0, - 0, 0, 0, 0, 0, 53, 52, 0, 0, 0, - 0, 0, 0, 55, 0, 0, 0, 56, 57, 0, - 58, 0, 0, 0, 59, 0, 60, 62, 63, 0, - 0, 66, 0, 0, 0, 0, 69, 0, 70, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 77, 71, 75, 72, 0, 80, 0, 81, - 0, 83, 0, 84, 0, 0, 0, 0, 65, 82, - 50, 0, 0, 0, 0, 0, 61, 0, 0, 0, - 0, 0, 0, 160, 78, 45, 0, 76, 0, 51, - 73, 46, 64, 79, 0, 0, 0, 0, 0, 44, - 67, 54, 74, 0, 0, 0, 0, 0, 0, 0, - 0, 172, 0, 68, 0, 0, 0, 47, 48, 49, + 68, 0, 0, 0, 364, 0, 0, 47, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 53, 52, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 56, 57, 0, 58, 0, 0, 0, 59, 0, 60, 62, 63, 0, 0, 66, 0, 0, 0, 0, 69, - 0, 70, 0, 0, 734, 0, 0, 0, 0, 0, + 0, 70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 71, 75, 72, 0, 80, 0, 81, 0, 83, 0, 84, 0, 0, 0, 0, 65, 82, 50, 0, 0, 0, 0, 0, 61, - 0, 0, 0, 0, 0, 733, 160, 78, 45, 0, + 0, 0, 0, 0, 0, 0, 160, 78, 45, 0, 76, 0, 51, 73, 46, 64, 79, 0, 0, 0, 0, 0, 44, 67, 54, 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 0, 0, 0, @@ -1166,10 +1099,10 @@ const short QmlJSGrammar::action_info [] = { 0, 0, 0, 56, 57, 0, 58, 0, 0, 0, 59, 0, 60, 62, 63, 0, 0, 66, 0, 0, 0, 0, 69, 0, 70, 0, 0, 0, 0, 0, - 0, 741, 0, 0, 0, 0, 0, 0, 77, 71, + 0, 0, 0, 0, 764, 0, 0, 0, 77, 71, 75, 72, 0, 80, 0, 81, 0, 83, 0, 84, 0, 0, 0, 0, 65, 82, 50, 0, 0, 0, - 0, 0, 61, 0, 0, 0, 0, 0, 314, 160, + 0, 0, 61, 0, 0, 0, 0, 0, 0, 85, 78, 45, 0, 76, 0, 51, 73, 46, 64, 79, 0, 0, 0, 0, 0, 44, 67, 54, 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, @@ -1180,331 +1113,399 @@ const short QmlJSGrammar::action_info [] = { 66, 0, 0, 0, 0, 69, 0, 70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 71, 75, 72, 0, 80, 0, 81, 0, - 83, 157, 84, 0, 0, 0, 0, 65, 82, 50, - 412, 413, 0, 0, 0, 61, 0, 0, 0, 0, - 0, 0, 85, 78, 45, 0, 76, 0, 51, 73, + 83, 0, 84, 0, 0, 0, 0, 65, 82, 50, + 0, 0, 0, 0, 0, 61, 0, 0, 0, 0, + 0, 314, 160, 78, 45, 0, 76, 0, 51, 73, 46, 64, 79, 0, 0, 0, 0, 0, 44, 67, 54, 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 0, 0, 0, 47, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 53, 52, 0, - 0, 0, 0, 0, 0, 55, 151, 0, 0, 56, - 1058, 0, 58, 0, 0, 0, 59, 0, 60, 62, + 0, 0, 0, 0, 0, 55, 0, 0, 0, 56, + 57, 0, 58, 0, 0, 0, 59, 0, 60, 62, 63, 0, 0, 66, 0, 0, 0, 0, 69, 0, - 70, 0, 0, 0, 0, 0, 0, 0, 153, 0, - 0, 0, 0, 0, 77, 71, 75, 72, 154, 80, - 0, 81, 156, 83, 0, 84, 0, 159, 0, 0, + 70, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 77, 71, 75, 72, 0, 80, + 0, 81, 0, 83, 0, 84, 0, 0, 0, 0, 65, 82, 50, 0, 0, 0, 0, 0, 61, 0, 0, 0, 0, 0, 0, 160, 78, 45, 0, 76, 0, 51, 73, 46, 64, 79, 0, 0, 0, 0, 0, 44, 67, 54, 74, 0, 0, 0, 0, 0, - 0, 0, 951, 950, 0, 68, 0, 0, 0, 47, + 0, 0, 793, 0, 0, 68, 0, 0, 0, 47, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, - 53, 52, 0, 0, 0, 0, 0, 0, 55, 151, + 53, 52, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 56, 57, 0, 58, 0, 0, 0, 59, 0, 60, 62, 63, 0, 0, 66, 0, 0, 0, 0, 69, 0, 70, 0, 0, 0, 0, 0, 0, - 0, 153, 0, 0, 0, 0, 0, 77, 71, 75, - 72, 154, 80, 0, 81, 156, 83, 0, 84, 0, - 159, 0, 0, 65, 82, 50, 0, 0, 0, 0, - 0, 61, 0, 0, 0, 0, 0, 0, 160, 78, - 45, 0, 76, 0, 51, 73, 46, 64, 79, 0, - 0, 0, 0, 0, 44, 67, 54, 74, 0, 0, - 0, 0, 0, 0, 0, 951, 950, 0, 68, 0, - 0, 0, 212, 213, 214, 0, 0, 217, 219, 220, - 0, 0, 221, 0, 222, 0, 0, 0, 227, 228, - 0, 229, 0, 0, 0, 0, 0, 0, 55, 230, - 232, 233, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 235, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 238, - 0, 0, 0, 0, 0, 0, 0, 0, 71, 75, - 72, 240, 241, 242, 0, 244, 245, 246, 247, 248, - 249, 0, 0, 236, 243, 226, 216, 234, 0, 218, - 237, 0, 0, 0, 0, 0, 223, 0, 0, 239, - 215, 225, 76, 224, 51, 73, 46, 0, 0, 0, - 0, 0, 231, 0, 44, 67, 54, 74, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 0, - 0, 0, 212, 213, 214, 0, 0, 217, 219, 220, - 0, 0, 221, 0, 222, 0, 0, 0, 227, 228, - 0, 229, 0, 0, 0, 0, 0, 0, 55, 230, - 232, 233, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 235, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 855, 0, 0, 0, 238, - 0, 0, 0, 0, 0, 0, 0, 0, 71, 75, - 72, 240, 241, 242, 0, 244, 245, 246, 247, 248, - 249, 0, 0, 236, 243, 226, 216, 234, 0, 218, - 237, 0, 0, 0, 0, 0, 223, 0, 0, 239, - 215, 225, 76, 224, 51, 73, 46, 0, 0, 0, - 0, 0, 231, 0, 44, 67, 54, 74, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 0, - 0, 0, 212, 213, 214, 0, 0, 217, 219, 220, - 0, 0, 221, 0, 222, 0, 0, 0, 227, 228, - 0, 229, 0, 0, 0, 0, 0, 0, 55, 230, - 232, 233, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 235, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 828, 0, 0, 0, 238, - 0, 0, 0, 0, 0, 0, 0, 0, 71, 75, - 72, 240, 241, 242, 0, 244, 245, 246, 247, 248, - 249, 0, 0, 236, 243, 226, 216, 234, 0, 218, - 237, 0, 0, 0, 0, 0, 223, 0, 0, 239, - 215, 225, 76, 224, 51, 73, 46, 0, 0, 0, - 0, 0, 231, 0, 44, 67, 54, 74, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 0, - 0, 0, 212, 213, 214, 0, 0, 217, 219, 220, - 0, 0, 221, 0, 222, 0, 0, 0, 227, 228, - 0, 229, 0, 0, 0, 0, 0, 0, 55, 230, - 232, 233, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 235, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 849, 0, 0, 0, 238, - 0, 0, 0, 0, 0, 0, 0, 0, 71, 75, - 72, 240, 241, 242, 0, 244, 245, 246, 247, 248, - 249, 0, 0, 236, 243, 226, 216, 234, 0, 218, - 237, 0, 0, 0, 0, 0, 223, 0, 0, 239, - 215, 225, 76, 224, 51, 73, 46, 0, 0, 0, - 0, 0, 231, 0, 44, 67, 54, 74, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 0, - 0, 0, 212, 213, 214, 0, 0, 217, 219, 220, - 0, 0, 221, 0, 222, 0, 0, 0, 227, 228, - 0, 229, 0, 0, 0, 0, 0, 0, 55, 230, - 232, 233, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 235, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 824, 0, 0, 0, 238, - 0, 0, 0, 0, 0, 0, 0, 0, 71, 75, - 72, 240, 241, 242, 0, 244, 245, 246, 247, 248, - 249, 0, 0, 236, 243, 226, 216, 234, 0, 218, - 237, 0, 0, 0, 0, 0, 223, 0, 0, 239, - 215, 225, 76, 224, 51, 73, 46, 0, 0, 0, - 0, 0, 231, 0, 44, 67, 54, 74, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 0, - 0, 0, 212, 213, 214, 0, 0, 217, 219, 220, - 0, 0, 221, 0, 222, 0, 0, 0, 227, 228, - 0, 229, 0, 0, 0, 0, 0, 0, 55, 230, - 232, 233, 0, 345, 0, 0, 0, 0, 0, 0, - 0, 0, 235, 0, 0, 0, 346, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 238, - 0, 0, 0, 0, 0, 0, 0, 347, 71, 75, - 72, 240, 241, 242, 0, 244, 245, 246, 247, 248, - 249, 0, 0, 236, 243, 226, 216, 234, 0, 218, - 237, 0, 0, 0, 0, 0, 223, 0, 0, 239, - 215, 225, 76, 224, 51, 73, 46, 0, 0, 0, - 0, 0, 231, 0, 44, 67, 54, 74, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 0, - 0, 0, 212, 213, 214, 0, 0, 217, 219, 220, - 0, 0, 221, 0, 222, 0, 0, 0, 227, 228, - 0, 229, 0, 0, 0, 0, 0, 0, 55, 230, - 232, 233, 0, 345, 0, 0, 0, 0, 0, 0, - 0, 0, 235, 0, 0, 0, 346, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 238, - 0, 0, 0, 527, 0, 0, 0, 347, 71, 75, - 72, 240, 241, 242, 0, 244, 245, 246, 247, 248, - 249, 0, 0, 236, 243, 226, 216, 234, 0, 218, - 237, 0, 0, 0, 0, 0, 223, 0, 0, 239, - 215, 225, 76, 224, 51, 73, 46, 0, 0, 0, - 0, 0, 231, 0, 44, 67, 524, 526, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 0, - 0, 0, 212, 213, 214, 0, 0, 217, 219, 220, - 0, 0, 221, 0, 222, 0, 0, 0, 227, 228, - 0, 229, 0, 0, 0, 0, 0, 0, 55, 230, - 232, 233, 0, 345, 0, 0, 0, 0, 0, 0, - 0, 0, 235, 0, 0, 0, 346, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 238, - 0, 525, 0, 527, 0, 0, 0, 347, 71, 75, - 72, 240, 241, 242, 0, 244, 245, 246, 247, 248, - 249, 0, 0, 236, 243, 226, 216, 234, 0, 218, - 237, 0, 0, 0, 0, 0, 223, 0, 0, 239, - 215, 225, 528, 224, 51, 73, 46, 0, 0, 0, - 0, 0, 231, 0, 44, 67, 524, 526, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 0, - 0, 0, 212, 213, 214, 0, 0, 217, 219, 220, - 0, 0, 221, 0, 222, 0, 0, 0, 227, 228, - 0, 229, 0, 0, 0, 0, 0, 0, 55, 230, - 232, 233, 0, 345, 0, 0, 0, 0, 0, 0, - 0, 0, 235, 0, 0, 0, 346, 0, 0, 0, - 0, 0, 0, 0, 0, 716, 0, 0, 0, 238, - 0, 0, 0, 527, 0, 0, 0, 347, 71, 75, - 72, 240, 241, 242, 0, 244, 245, 246, 247, 248, - 249, 0, 0, 236, 243, 226, 216, 234, 0, 218, - 237, 0, 0, 0, 0, 0, 223, 0, 0, 239, - 215, 225, 76, 224, 51, 73, 46, 0, 0, 0, - 0, 0, 231, 0, 44, 67, 524, 526, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 0, - 0, 0, 212, 213, 214, 0, 0, 217, 219, 220, - 0, 0, 221, 0, 222, 0, 0, 0, 227, 228, - 0, 229, 0, 0, 0, 0, 0, 0, 55, 230, - 232, 233, 0, 345, 0, 0, 0, 0, 0, 0, - 0, 0, 235, 0, 0, 0, 346, 0, 0, 0, - 0, 0, 0, 0, 0, 721, 0, 0, 0, 238, - 0, 0, 0, 527, 0, 0, 0, 347, 71, 75, - 72, 240, 241, 242, 0, 244, 245, 246, 247, 248, - 249, 0, 0, 236, 243, 226, 216, 234, 0, 218, - 237, 0, 0, 0, 0, 0, 223, 0, 0, 239, - 215, 225, 76, 224, 51, 73, 46, 0, 0, 0, - 0, 0, 231, 0, 44, 67, 524, 526, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 0, - 0, 0, 144, 0, 0, 0, 0, 145, 0, 47, - 48, 49, 147, 0, 0, 0, 0, 0, 0, 148, - 53, 52, 0, 0, 0, 0, 0, 0, 55, 151, - 0, 0, 56, 57, 0, 58, 0, 0, 0, 59, - 0, 60, 62, 63, 0, 0, 66, 0, 0, 0, - 0, 69, 0, 70, 0, 0, 0, 0, 0, 152, - 0, 153, 0, 0, 0, 0, 0, 77, 71, 75, - 72, 154, 80, 155, 81, 156, 83, 157, 84, 158, - 159, 0, 0, 65, 82, 50, 0, 0, 0, 146, - 0, 61, 0, 0, 0, 0, 0, 0, 160, 78, - 45, 0, 76, 0, 51, 73, 46, 64, 79, 0, - 0, 0, 0, 0, 44, 67, 54, 74, 0, 0, - 0, 0, 0, 0, 0, 0, 149, 0, 68, 0, - 0, 0, 144, 0, 0, 0, 0, 145, 0, 47, - 48, 49, 147, 0, 0, 0, 0, 0, 0, 148, - 53, 52, 0, 0, 0, 0, 0, 0, 55, 151, - 0, 0, 56, 57, 0, 58, 0, 0, 0, 59, - 0, 60, 62, 63, 0, 0, 66, 0, 0, 0, - 0, 69, 0, 70, 0, 0, 0, 0, 0, 152, - 0, 153, 0, 0, 0, 0, 0, 77, 71, 75, - 72, 154, 80, 155, 81, 156, 83, 157, 84, 158, - 159, 0, 0, 65, 82, 50, 0, 0, 0, 146, - 0, 61, 0, 0, 0, 0, 0, 0, 160, 78, - 45, 0, 76, 0, 51, 73, 46, 64, 79, 0, - 0, 0, 0, 0, 44, 67, 54, 74, 0, 0, - 0, 0, 0, 0, 0, 301, 149, 0, 68, 0, - 0, 0, 144, 0, 0, 0, 0, 145, 0, 47, - 48, 49, 147, 0, 0, 0, 0, 0, 0, 148, - 53, 52, 0, 0, 0, 0, 0, 0, 55, 151, - 0, 0, 56, 57, 0, 58, 0, 0, 0, 59, - 0, 60, 62, 63, 0, 0, 958, 0, 0, 0, - 0, 69, 0, 70, 0, 0, 0, 0, 0, 152, - 0, 153, 0, 0, 0, 0, 0, 959, 71, 75, - 72, 154, 80, 155, 81, 156, 83, 157, 84, 158, - 159, 0, 0, 65, 82, 50, 0, 0, 0, 146, - 0, 61, 0, 0, 0, 0, 0, 0, 160, 78, - 45, 0, 76, 0, 51, 73, 46, 64, 79, 0, - 0, 0, 0, 0, 44, 67, 54, 74, 0, 0, - 0, 0, 0, 0, 0, 150, 149, 0, 68, 0, - 0, 0, 144, 0, 0, 0, 0, 145, 0, 47, - 48, 49, 147, 0, 0, 0, 0, 0, 0, 148, - 53, 52, 0, 0, 0, 0, 0, 0, 55, 151, - 0, 0, 56, 57, 0, 58, 0, 0, 0, 59, - 0, 60, 62, 63, 0, 0, 66, 0, 0, 0, - 0, 69, 0, 70, 0, 0, 0, 0, 0, 152, - 0, 153, 0, 0, 0, 0, 0, 77, 71, 75, - 72, 154, 80, 155, 81, 156, 83, 157, 84, 158, - 159, 0, 0, 65, 82, 50, 0, 0, 0, 146, + 0, 0, 0, 0, 0, 0, 0, 77, 71, 75, + 72, 0, 80, 0, 81, 0, 83, 0, 84, 0, + 0, 0, 0, 65, 82, 50, 0, 0, 0, 0, 0, 61, 0, 0, 0, 0, 0, 0, 160, 78, 45, 0, 76, 0, 51, 73, 46, 64, 79, 0, 0, 0, 0, 0, 44, 67, 54, 74, 0, 0, - 0, 0, 0, 0, 0, 150, 149, 0, 68, 0, - 0, 0, - - 717, 709, 708, 707, 704, 703, 702, 723, 1096, 1091, - 699, 736, 696, 730, 695, 1094, 694, 693, 649, 690, - 689, 688, 687, 1090, 636, 679, 638, 208, 676, 1078, - 208, 1086, 674, 208, 677, 673, 1076, 1064, 1050, 1062, - 1047, 657, 759, 651, 1048, 112, 133, 1042, 1051, 294, - 1034, 374, 778, 638, 779, 396, 636, 420, 133, 1032, - 1031, 208, 1025, 626, 627, 620, 595, 625, 615, 940, - 831, 1022, 611, 789, 792, 608, 1020, 602, 597, 609, - 596, 1023, 594, 591, 618, 588, 584, 630, 807, 170, - 592, 576, 808, 810, 574, 809, 1018, 171, 814, 815, - 818, 173, 1011, 820, 568, 563, 816, 565, 564, 562, - 1010, 559, 1007, 557, 208, 556, 555, 554, 841, 547, - 544, 537, 546, 545, 540, 174, 1004, 539, 538, 175, - 940, 994, 996, 1005, 208, 250, 455, 510, 210, 257, - 208, 979, 253, 514, 501, 264, 271, 497, 267, 269, - 495, 972, 1097, 970, 286, 288, 1030, 992, 133, 133, - 363, 968, 473, 973, 975, 466, 483, 954, 324, 892, - 325, 944, 893, 895, 894, 901, 468, 455, 449, 321, - 451, 330, 443, 454, 333, 940, 357, 331, 348, 332, - 435, 355, 356, 928, 977, 428, 388, 921, 392, 395, - 133, 389, 403, 432, 401, 941, 924, 430, 570, 632, - 861, 632, 368, 420, 420, 210, 424, 306, 671, 210, - 731, 437, 732, 306, 682, 306, 697, 1044, 724, 726, - 264, 264, 740, 739, 1080, 1079, 1056, 397, 397, 1057, - 397, 461, 264, 210, 420, 420, 397, 632, 420, 391, - 1045, 397, 1036, 669, 666, 394, 957, 398, 306, 305, - 303, 420, 479, 300, 489, 653, 306, 697, 617, 306, - 682, 397, 613, 210, 572, 1040, 0, 210, 650, 306, - 305, 419, 422, 306, 496, 210, 632, 397, 843, 844, - 210, 390, 397, 298, 306, 309, 0, 393, 397, 210, - 302, 210, 397, 210, 397, 306, 513, 210, 823, 306, - 888, 0, 457, 459, 210, 210, 475, 367, 0, 94, - 830, 558, 306, 832, 306, 309, 29, 370, 745, 477, - 548, 253, 541, 42, 93, 532, 306, 309, 775, 860, - 306, 462, 256, 306, 309, 306, 309, 306, 309, 711, - 209, 306, 832, 306, 309, 306, 309, 306, 353, 306, - 446, 341, 336, 632, 306, 334, 210, 566, 0, 678, - 306, 309, 489, 675, 786, 969, 633, 341, 832, 0, - 715, 712, 0, 483, 306, 832, 306, 309, 0, 915, - 916, 0, 344, 917, 306, 439, 306, 604, 306, 309, - 0, 823, 306, 309, 659, 302, 306, 513, 306, 621, - 711, 94, 845, 306, 496, 633, 306, 506, 94, 94, - 341, 832, 0, 11, 306, 470, 93, 0, 29, 417, - 94, 819, 94, 93, 93, 42, 0, 720, 306, 621, - 0, 715, 712, 0, 0, 93, 1014, 93, 94, 550, - 1016, 1015, 1013, 29, 0, 845, 94, 758, 463, 95, - 42, 94, 0, 93, 306, 506, 95, 95, 0, 781, - 735, 93, 94, 531, 700, 354, 93, 447, 95, 765, - 95, 705, 335, 685, 289, 691, 199, 93, 293, 291, - 0, 499, 775, 890, 29, 851, 95, 281, 259, 0, - 0, 42, 198, 29, 95, 306, 309, 767, 313, 95, - 42, 800, 441, 302, 605, 197, 94, 94, 306, 309, - 95, 0, 370, 754, 857, 11, 622, 0, 560, 94, - 509, 93, 93, 178, 508, 328, 812, 453, 94, 472, - 805, 0, 471, 107, 93, 827, 0, 1075, 0, 0, - 11, 0, 780, 93, 629, 94, 622, 834, 817, 29, - 811, 29, 341, 336, 95, 95, 42, 29, 42, 94, - 93, 640, 279, 763, 42, 434, 0, 95, 512, 201, - 103, 94, 508, 0, 93, 438, 94, 94, 0, 0, - 94, 11, 0, 344, 0, 854, 93, 29, 94, 29, - 11, 93, 93, 95, 42, 93, 42, 104, 0, 29, - 794, 94, 797, 93, 0, 0, 42, 95, 0, 0, - 94, 96, 94, 0, 0, 29, 93, 0, 201, 95, - 369, 0, 42, 94, 95, 93, 193, 93, 95, 681, - 760, 0, 184, 327, 0, 0, 95, 94, 93, 749, - 94, 0, 796, 0, 0, 406, 11, 200, 11, 95, - 681, 753, 93, 283, 11, 93, 799, 1003, 95, 94, - 95, 681, 752, 0, 200, 42, 0, 0, 94, 0, - 0, 95, 681, 751, 93, 350, 0, 1063, 0, 94, - 662, 0, 94, 93, 11, 95, 11, 94, 95, 681, - 761, 94, 42, 200, 93, 94, 11, 93, 0, 0, - 306, 309, 93, 910, 94, 664, 93, 95, 0, 0, - 93, 94, 11, 0, 42, 0, 95, 370, 371, 93, - 201, 635, 94, 42, 750, 637, 93, 0, 201, 94, - 95, 681, 748, 94, 0, 0, 200, 93, 94, 95, - 681, 747, 200, 95, 93, 201, 1000, 409, 93, 0, - 42, 0, 200, 93, 42, 205, 0, 0, 0, 95, - 1052, 643, 1085, 0, 0, 0, 42, 0, 0, 1008, - 95, 681, 762, 0, 201, 0, 94, 95, 0, 1000, - 0, 1060, 94, 660, 42, 0, 95, 681, 680, 0, - 0, 93, 94, 645, 0, 200, 947, 93, 946, 948, - 953, 949, 952, 200, 410, 414, 200, 93, 205, 0, - 0, 200, 0, 200, 907, 0, 885, 201, 0, 205, - 1082, 1083, 0, 201, 0, 369, 205, 200, 0, 0, - 724, 726, 0, 201, 0, 94, 0, 0, 274, 0, - 885, 887, 0, 94, 11, 0, 94, 904, 0, 278, - 93, 94, 0, 94, 0, 0, 320, 0, 93, 0, - 200, 93, 0, 0, 200, 887, 93, 94, 93, 0, - 0, 0, 1052, 885, 0, 0, 201, 885, 1053, 0, - 0, 0, 93, 0, 201, 0, 0, 201, 1026, 0, - 0, 0, 201, 0, 201, 0, 0, 0, 887, 0, - 94, 1059, 887, 1026, 94, 0, 0, 947, 201, 946, - 948, 953, 949, 952, 0, 93, 1009, 0, 0, 93, - 0, 0, 947, 0, 946, 948, 953, 949, 952, 1008, + 0, 0, 0, 0, 0, 0, 172, 0, 68, 0, + 0, 0, 47, 48, 49, 0, 0, 0, 0, 0, + 0, 0, 0, 53, 52, 0, 0, 0, 0, 0, + 0, 55, 0, 0, 0, 56, 57, 0, 58, 0, + 0, 0, 59, 0, 60, 62, 63, 0, 0, 66, + 0, 0, 0, 0, 69, 0, 70, 0, 0, 734, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 77, 71, 75, 72, 0, 80, 0, 81, 0, 83, + 0, 84, 0, 0, 0, 0, 65, 82, 50, 0, + 0, 0, 0, 0, 61, 0, 0, 0, 0, 0, + 733, 160, 78, 45, 0, 76, 0, 51, 73, 46, + 64, 79, 0, 0, 0, 0, 0, 44, 67, 54, + 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 68, 0, 0, 0, 47, 48, 49, 0, 0, + 0, 0, 0, 0, 0, 0, 53, 52, 0, 0, + 0, 0, 0, 0, 55, 0, 0, 0, 56, 57, + 0, 58, 0, 0, 0, 59, 0, 60, 62, 63, + 0, 0, 66, 0, 0, 0, 0, 69, 0, 70, + 0, 0, 0, 0, 0, 0, 741, 0, 0, 0, + 0, 0, 0, 77, 71, 75, 72, 0, 80, 0, + 81, 0, 83, 0, 84, 0, 0, 0, 0, 65, + 82, 50, 0, 0, 0, 0, 0, 61, 0, 0, + 0, 0, 0, 314, 160, 78, 45, 0, 76, 0, + 51, 73, 46, 64, 79, 0, 0, 0, 0, 0, + 44, 67, 54, 74, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 68, 0, 0, 0, 47, 48, + 49, 0, 0, 0, 0, 0, 0, 0, 0, 53, + 52, 0, 0, 0, 0, 0, 0, 55, 0, 0, + 0, 56, 57, 0, 58, 0, 0, 0, 59, 0, + 60, 62, 63, 0, 0, 66, 0, 0, 0, 0, + 69, 0, 70, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 77, 71, 75, 72, + 0, 80, 0, 81, 0, 83, 157, 84, 0, 0, + 0, 0, 65, 82, 50, 412, 413, 0, 0, 0, + 61, 0, 0, 0, 0, 0, 0, 85, 78, 45, + 0, 76, 0, 51, 73, 46, 64, 79, 0, 0, + 0, 0, 0, 44, 67, 54, 74, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 68, 0, 0, + 0, 47, 48, 49, 0, 0, 0, 0, 0, 0, + 0, 0, 53, 52, 0, 0, 0, 0, 0, 0, + 55, 151, 0, 0, 56, 57, 0, 58, 0, 0, + 0, 59, 0, 60, 62, 63, 0, 0, 66, 0, + 0, 0, 0, 69, 0, 70, 0, 0, 0, 0, + 0, 0, 0, 153, 0, 0, 0, 0, 0, 77, + 71, 75, 72, 154, 80, 0, 81, 156, 83, 0, + 84, 0, 159, 0, 0, 65, 82, 50, 0, 0, + 0, 0, 0, 61, 0, 0, 0, 0, 0, 0, + 160, 78, 45, 0, 76, 0, 51, 73, 46, 64, + 79, 0, 0, 0, 0, 0, 44, 67, 54, 74, + 0, 0, 0, 0, 0, 0, 0, 951, 950, 0, + 68, 0, 0, 0, 47, 48, 49, 0, 0, 0, + 0, 0, 0, 0, 0, 53, 52, 0, 0, 0, + 0, 0, 0, 55, 151, 0, 0, 56, 1062, 0, + 58, 0, 0, 0, 59, 0, 60, 62, 63, 0, + 0, 66, 0, 0, 0, 0, 69, 0, 70, 0, + 0, 0, 0, 0, 0, 0, 153, 0, 0, 0, + 0, 0, 77, 71, 75, 72, 154, 80, 0, 81, + 156, 83, 0, 84, 0, 159, 0, 0, 65, 82, + 50, 0, 0, 0, 0, 0, 61, 0, 0, 0, + 0, 0, 0, 160, 78, 45, 0, 76, 0, 51, + 73, 46, 64, 79, 0, 0, 0, 0, 0, 44, + 67, 54, 74, 0, 0, 0, 0, 0, 0, 0, + 951, 950, 0, 68, 0, 0, 0, 212, 213, 214, + 0, 0, 217, 219, 220, 0, 0, 221, 0, 222, + 0, 0, 0, 227, 228, 0, 229, 0, 0, 0, + 0, 0, 0, 55, 230, 232, 233, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 235, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 238, 0, 0, 0, 0, 0, + 0, 0, 0, 71, 75, 72, 240, 241, 242, 0, + 244, 245, 246, 247, 248, 249, 0, 0, 236, 243, + 226, 216, 234, 0, 218, 237, 0, 0, 0, 0, + 0, 223, 0, 0, 239, 215, 225, 76, 224, 51, + 73, 46, 0, 0, 0, 0, 0, 231, 0, 44, + 67, 54, 74, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 68, 0, 0, 0, 212, 213, 214, + 0, 0, 217, 219, 220, 0, 0, 221, 0, 222, + 0, 0, 0, 227, 228, 0, 229, 0, 0, 0, + 0, 0, 0, 55, 230, 232, 233, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 235, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 201, 1009, 0, 0, 201, 0, 0, 947, 0, + 828, 0, 0, 0, 238, 0, 0, 0, 0, 0, + 0, 0, 0, 71, 75, 72, 240, 241, 242, 0, + 244, 245, 246, 247, 248, 249, 0, 0, 236, 243, + 226, 216, 234, 0, 218, 237, 0, 0, 0, 0, + 0, 223, 0, 0, 239, 215, 225, 76, 224, 51, + 73, 46, 0, 0, 0, 0, 0, 231, 0, 44, + 67, 54, 74, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 68, 0, 0, 0, 212, 213, 214, + 0, 0, 217, 219, 220, 0, 0, 221, 0, 222, + 0, 0, 0, 227, 228, 0, 229, 0, 0, 0, + 0, 0, 0, 55, 230, 232, 233, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 235, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 855, 0, 0, 0, 238, 0, 0, 0, 0, 0, + 0, 0, 0, 71, 75, 72, 240, 241, 242, 0, + 244, 245, 246, 247, 248, 249, 0, 0, 236, 243, + 226, 216, 234, 0, 218, 237, 0, 0, 0, 0, + 0, 223, 0, 0, 239, 215, 225, 76, 224, 51, + 73, 46, 0, 0, 0, 0, 0, 231, 0, 44, + 67, 54, 74, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 68, 0, 0, 0, 212, 213, 214, + 0, 0, 217, 219, 220, 0, 0, 221, 0, 222, + 0, 0, 0, 227, 228, 0, 229, 0, 0, 0, + 0, 0, 0, 55, 230, 232, 233, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 235, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 824, 0, 0, 0, 238, 0, 0, 0, 0, 0, + 0, 0, 0, 71, 75, 72, 240, 241, 242, 0, + 244, 245, 246, 247, 248, 249, 0, 0, 236, 243, + 226, 216, 234, 0, 218, 237, 0, 0, 0, 0, + 0, 223, 0, 0, 239, 215, 225, 76, 224, 51, + 73, 46, 0, 0, 0, 0, 0, 231, 0, 44, + 67, 54, 74, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 68, 0, 0, 0, 212, 213, 214, + 0, 0, 217, 219, 220, 0, 0, 221, 0, 222, + 0, 0, 0, 227, 228, 0, 229, 0, 0, 0, + 0, 0, 0, 55, 230, 232, 233, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 235, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 849, 0, 0, 0, 238, 0, 0, 0, 0, 0, + 0, 0, 0, 71, 75, 72, 240, 241, 242, 0, + 244, 245, 246, 247, 248, 249, 0, 0, 236, 243, + 226, 216, 234, 0, 218, 237, 0, 0, 0, 0, + 0, 223, 0, 0, 239, 215, 225, 76, 224, 51, + 73, 46, 0, 0, 0, 0, 0, 231, 0, 44, + 67, 54, 74, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 68, 0, 0, 0, 212, 213, 214, + 0, 0, 217, 219, 220, 0, 0, 221, 0, 222, + 0, 0, 0, 227, 228, 0, 229, 0, 0, 0, + 0, 0, 0, 55, 230, 232, 233, 0, 345, 0, + 0, 0, 0, 0, 0, 0, 0, 235, 0, 0, + 0, 346, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 238, 0, 0, 0, 0, 0, + 0, 0, 347, 71, 75, 72, 240, 241, 242, 0, + 244, 245, 246, 247, 248, 249, 0, 0, 236, 243, + 226, 216, 234, 0, 218, 237, 0, 0, 0, 0, + 0, 223, 0, 0, 239, 215, 225, 76, 224, 51, + 73, 46, 0, 0, 0, 0, 0, 231, 0, 44, + 67, 54, 74, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 68, 0, 0, 0, 212, 213, 214, + 0, 0, 217, 219, 220, 0, 0, 221, 0, 222, + 0, 0, 0, 227, 228, 0, 229, 0, 0, 0, + 0, 0, 0, 55, 230, 232, 233, 0, 345, 0, + 0, 0, 0, 0, 0, 0, 0, 235, 0, 0, + 0, 346, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 238, 0, 0, 0, 527, 0, + 0, 0, 347, 71, 75, 72, 240, 241, 242, 0, + 244, 245, 246, 247, 248, 249, 0, 0, 236, 243, + 226, 216, 234, 0, 218, 237, 0, 0, 0, 0, + 0, 223, 0, 0, 239, 215, 225, 76, 224, 51, + 73, 46, 0, 0, 0, 0, 0, 231, 0, 44, + 67, 524, 526, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 68, 0, 0, 0, 212, 213, 214, + 0, 0, 217, 219, 220, 0, 0, 221, 0, 222, + 0, 0, 0, 227, 228, 0, 229, 0, 0, 0, + 0, 0, 0, 55, 230, 232, 233, 0, 345, 0, + 0, 0, 0, 0, 0, 0, 0, 235, 0, 0, + 0, 346, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 238, 0, 525, 0, 527, 0, + 0, 0, 347, 71, 75, 72, 240, 241, 242, 0, + 244, 245, 246, 247, 248, 249, 0, 0, 236, 243, + 226, 216, 234, 0, 218, 237, 0, 0, 0, 0, + 0, 223, 0, 0, 239, 215, 225, 528, 224, 51, + 73, 46, 0, 0, 0, 0, 0, 231, 0, 44, + 67, 524, 526, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 68, 0, 0, 0, 212, 213, 214, + 0, 0, 217, 219, 220, 0, 0, 221, 0, 222, + 0, 0, 0, 227, 228, 0, 229, 0, 0, 0, + 0, 0, 0, 55, 230, 232, 233, 0, 345, 0, + 0, 0, 0, 0, 0, 0, 0, 235, 0, 0, + 0, 346, 0, 0, 0, 0, 0, 0, 0, 0, + 716, 0, 0, 0, 238, 0, 0, 0, 527, 0, + 0, 0, 347, 71, 75, 72, 240, 241, 242, 0, + 244, 245, 246, 247, 248, 249, 0, 0, 236, 243, + 226, 216, 234, 0, 218, 237, 0, 0, 0, 0, + 0, 223, 0, 0, 239, 215, 225, 76, 224, 51, + 73, 46, 0, 0, 0, 0, 0, 231, 0, 44, + 67, 524, 526, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 68, 0, 0, 0, 212, 213, 214, + 0, 0, 217, 219, 220, 0, 0, 221, 0, 222, + 0, 0, 0, 227, 228, 0, 229, 0, 0, 0, + 0, 0, 0, 55, 230, 232, 233, 0, 345, 0, + 0, 0, 0, 0, 0, 0, 0, 235, 0, 0, + 0, 346, 0, 0, 0, 0, 0, 0, 0, 0, + 721, 0, 0, 0, 238, 0, 0, 0, 527, 0, + 0, 0, 347, 71, 75, 72, 240, 241, 242, 0, + 244, 245, 246, 247, 248, 249, 0, 0, 236, 243, + 226, 216, 234, 0, 218, 237, 0, 0, 0, 0, + 0, 223, 0, 0, 239, 215, 225, 76, 224, 51, + 73, 46, 0, 0, 0, 0, 0, 231, 0, 44, + 67, 524, 526, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 68, 0, 0, 0, 144, 0, 0, + 0, 0, 145, 0, 47, 48, 49, 147, 0, 0, + 0, 0, 0, 0, 148, 53, 52, 0, 0, 0, + 0, 0, 0, 55, 151, 0, 0, 56, 57, 0, + 58, 0, 0, 0, 59, 0, 60, 62, 63, 0, + 0, 66, 0, 0, 0, 0, 69, 0, 70, 0, + 0, 0, 0, 0, 152, 0, 153, 0, 0, 0, + 0, 0, 77, 71, 75, 72, 154, 80, 155, 81, + 156, 83, 157, 84, 158, 159, 0, 0, 65, 82, + 50, 0, 0, 0, 146, 0, 61, 0, 0, 0, + 0, 0, 0, 160, 78, 45, 0, 76, 0, 51, + 73, 46, 64, 79, 0, 0, 0, 0, 0, 44, + 67, 54, 74, 0, 0, 0, 0, 0, 0, 0, + 0, 149, 0, 68, 0, 0, 0, 144, 0, 0, + 0, 0, 145, 0, 47, 48, 49, 147, 0, 0, + 0, 0, 0, 0, 148, 53, 52, 0, 0, 0, + 0, 0, 0, 55, 151, 0, 0, 56, 57, 0, + 58, 0, 0, 0, 59, 0, 60, 62, 63, 0, + 0, 66, 0, 0, 0, 0, 69, 0, 70, 0, + 0, 0, 0, 0, 152, 0, 153, 0, 0, 0, + 0, 0, 77, 71, 75, 72, 154, 80, 155, 81, + 156, 83, 157, 84, 158, 159, 0, 0, 65, 82, + 50, 0, 0, 0, 146, 0, 61, 0, 0, 0, + 0, 0, 0, 160, 78, 45, 0, 76, 0, 51, + 73, 46, 64, 79, 0, 0, 0, 0, 0, 44, + 67, 54, 74, 0, 0, 0, 0, 0, 0, 0, + 150, 149, 0, 68, 0, 0, 0, 144, 0, 0, + 0, 0, 145, 0, 47, 48, 49, 147, 0, 0, + 0, 0, 0, 0, 148, 53, 52, 0, 0, 0, + 0, 0, 0, 55, 151, 0, 0, 56, 57, 0, + 58, 0, 0, 0, 59, 0, 60, 62, 63, 0, + 0, 958, 0, 0, 0, 0, 69, 0, 70, 0, + 0, 0, 0, 0, 152, 0, 153, 0, 0, 0, + 0, 0, 959, 71, 75, 72, 154, 80, 155, 81, + 156, 83, 157, 84, 158, 159, 0, 0, 65, 82, + 50, 0, 0, 0, 146, 0, 61, 0, 0, 0, + 0, 0, 0, 160, 78, 45, 0, 76, 0, 51, + 73, 46, 64, 79, 0, 0, 0, 0, 0, 44, + 67, 54, 74, 0, 0, 0, 0, 0, 0, 0, + 150, 149, 0, 68, 0, 0, 0, 144, 0, 0, + 0, 0, 145, 0, 47, 48, 49, 147, 0, 0, + 0, 0, 0, 0, 148, 53, 52, 0, 0, 0, + 0, 0, 0, 55, 151, 0, 0, 56, 57, 0, + 58, 0, 0, 0, 59, 0, 60, 62, 63, 0, + 0, 66, 0, 0, 0, 0, 69, 0, 70, 0, + 0, 0, 0, 0, 152, 0, 153, 0, 0, 0, + 0, 0, 77, 71, 75, 72, 154, 80, 155, 81, + 156, 83, 157, 84, 158, 159, 0, 0, 65, 82, + 50, 0, 0, 0, 146, 0, 61, 0, 0, 0, + 0, 0, 0, 160, 78, 45, 0, 76, 0, 51, + 73, 46, 64, 79, 0, 0, 0, 0, 0, 44, + 67, 54, 74, 0, 0, 0, 0, 0, 0, 0, + 301, 149, 0, 68, 0, 0, 0, + + 435, 717, 709, 708, 723, 707, 704, 703, 702, 730, + 257, 208, 1101, 1100, 699, 696, 695, 694, 693, 688, + 690, 689, 687, 264, 271, 649, 679, 267, 676, 269, + 208, 250, 980, 1095, 1098, 674, 677, 673, 636, 759, + 1094, 208, 657, 1006, 651, 638, 995, 286, 208, 778, + 779, 288, 997, 1082, 638, 940, 208, 1090, 972, 1080, + 1068, 636, 133, 626, 627, 133, 831, 620, 625, 789, + 969, 615, 792, 1005, 1066, 611, 608, 970, 968, 1054, + 609, 602, 596, 594, 112, 809, 807, 1051, 591, 808, + 810, 588, 1052, 814, 592, 815, 584, 816, 820, 576, + 325, 574, 1008, 568, 818, 133, 565, 564, 208, 563, + 559, 562, 557, 556, 554, 555, 133, 363, 1046, 547, + 841, 321, 546, 544, 545, 537, 1055, 1012, 538, 540, + 294, 539, 324, 330, 253, 973, 210, 954, 374, 331, + 510, 332, 348, 455, 514, 333, 501, 975, 396, 944, + 1019, 993, 1038, 175, 357, 495, 497, 473, 174, 483, + 171, 355, 356, 388, 173, 736, 420, 468, 389, 595, + 893, 466, 892, 894, 392, 395, 597, 895, 901, 451, + 618, 449, 454, 133, 455, 1033, 443, 401, 1026, 208, + 630, 940, 940, 921, 403, 428, 432, 424, 928, 170, + 1024, 1023, 941, 420, 924, 1021, 430, 420, 437, 977, + 978, 1034, 1035, 461, 420, 420, 420, 420, 479, 398, + 489, 368, 1040, 306, 496, 306, 513, 397, 394, 1031, + 1032, 306, 697, 632, 391, 1048, 397, 957, 397, 843, + 844, 306, 682, 397, 210, 1044, 306, 888, 397, 397, + 210, 306, 309, 632, 210, 210, 210, 210, 1049, 570, + 1060, 572, 613, 1061, 306, 305, 617, 306, 305, 210, + 393, 419, 300, 632, 303, 422, 390, 1084, 1083, 632, + 210, 548, 457, 459, 475, 477, 532, 558, 861, 397, + 830, 397, 397, 740, 739, 210, 397, 306, 697, 210, + 724, 726, 298, 210, 823, 306, 682, 306, 671, 264, + 264, 264, 210, 210, 302, 650, 0, 731, 397, 732, + 306, 309, 306, 309, 711, 1011, 367, 370, 745, 29, + 209, 253, 653, 666, 669, 210, 42, 306, 309, 306, + 309, 306, 309, 0, 541, 306, 832, 256, 306, 604, + 306, 496, 306, 513, 94, 715, 712, 306, 309, 306, + 309, 302, 633, 758, 483, 306, 309, 306, 309, 93, + 823, 306, 334, 341, 336, 341, 832, 306, 832, 306, + 832, 0, 633, 915, 916, 306, 309, 917, 306, 353, + 306, 309, 306, 621, 0, 306, 446, 306, 439, 306, + 462, 860, 566, 531, 344, 417, 434, 94, 775, 259, + 845, 819, 0, 94, 0, 735, 0, 438, 0, 94, + 94, 0, 93, 306, 506, 0, 11, 453, 93, 29, + 29, 306, 470, 0, 93, 93, 42, 42, 0, 29, + 0, 29, 306, 309, 0, 659, 42, 0, 42, 94, + 0, 29, 0, 675, 0, 95, 0, 678, 42, 370, + 700, 95, 560, 0, 93, 29, 605, 95, 95, 29, + 341, 336, 42, 94, 281, 705, 42, 685, 283, 691, + 0, 1015, 306, 506, 550, 1017, 1016, 1014, 93, 335, + 201, 291, 289, 0, 0, 313, 94, 811, 765, 306, + 309, 344, 0, 805, 817, 812, 354, 341, 832, 94, + 622, 93, 754, 447, 827, 441, 328, 463, 834, 0, + 94, 95, 29, 499, 93, 94, 11, 11, 890, 42, + 94, 0, 711, 800, 178, 93, 11, 509, 11, 632, + 93, 508, 845, 94, 95, 93, 472, 767, 11, 471, + 851, 107, 857, 0, 94, 94, 94, 95, 93, 720, + 0, 1079, 11, 715, 712, 184, 11, 369, 95, 93, + 93, 93, 94, 95, 489, 29, 786, 94, 95, 0, + 193, 763, 42, 306, 621, 640, 0, 93, 0, 293, + 0, 95, 93, 350, 0, 94, 512, 0, 279, 0, + 508, 94, 95, 95, 95, 29, 0, 103, 199, 197, + 93, 0, 42, 94, 29, 0, 93, 0, 0, 11, + 95, 42, 0, 1009, 327, 95, 198, 0, 93, 96, + 0, 94, 794, 1001, 797, 1064, 0, 200, 94, 0, + 0, 94, 201, 95, 681, 761, 93, 910, 306, 309, + 0, 0, 0, 93, 200, 94, 93, 0, 94, 0, + 0, 95, 681, 760, 1001, 370, 371, 0, 775, 0, + 93, 781, 11, 93, 796, 0, 749, 94, 0, 95, + 681, 762, 854, 200, 724, 726, 95, 200, 799, 95, + 681, 753, 93, 42, 94, 94, 1067, 1004, 94, 629, + 635, 622, 11, 95, 681, 752, 95, 681, 751, 93, + 93, 11, 0, 93, 94, 302, 94, 94, 201, 0, + 0, 406, 94, 94, 94, 0, 94, 94, 780, 93, + 0, 93, 93, 0, 0, 201, 94, 93, 93, 93, + 200, 93, 93, 95, 0, 94, 95, 681, 748, 0, + 42, 93, 637, 205, 0, 0, 94, 201, 0, 0, + 93, 750, 95, 0, 201, 95, 681, 747, 201, 42, + 95, 93, 95, 369, 95, 0, 200, 42, 200, 42, + 94, 42, 664, 320, 95, 0, 1056, 0, 1089, 205, + 643, 42, 662, 95, 0, 93, 0, 104, 660, 0, + 645, 200, 0, 0, 95, 681, 680, 947, 0, 946, + 948, 953, 949, 952, 205, 200, 94, 0, 94, 278, + 0, 201, 200, 409, 1086, 1087, 0, 0, 0, 200, + 42, 93, 0, 93, 0, 885, 0, 904, 907, 0, + 0, 94, 205, 0, 641, 0, 0, 0, 0, 0, + 200, 200, 0, 0, 0, 94, 93, 201, 0, 201, + 887, 0, 94, 885, 885, 0, 0, 0, 0, 94, + 93, 0, 274, 0, 0, 0, 0, 93, 0, 200, + 410, 414, 201, 0, 93, 0, 0, 1056, 887, 887, + 94, 94, 885, 1057, 0, 0, 201, 0, 0, 0, + 0, 0, 0, 201, 0, 93, 93, 0, 0, 0, + 201, 0, 0, 0, 0, 0, 0, 887, 0, 94, + 11, 0, 1027, 0, 0, 0, 200, 0, 0, 1009, + 0, 201, 201, 0, 93, 1010, 0, 0, 0, 205, + 0, 947, 1010, 946, 948, 953, 949, 952, 947, 0, 946, 948, 953, 949, 952, 0, 0, 0, 0, 0, + 201, 0, 0, 0, 0, 0, 94, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 93, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 201, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 200, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 205, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 94, 0, 0, 641, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 93, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 201, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1027, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1063, 0, 0, 0, 0, 0, 947, 0, 946, 948, + 953, 949, 952, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -1516,359 +1517,296 @@ const short QmlJSGrammar::action_info [] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0 }; const short QmlJSGrammar::action_check [] = { - 7, 34, 62, 57, 116, 37, 37, 57, 34, 62, - 34, 57, 37, 62, 0, 62, 34, 57, 37, 15, - 50, 0, 96, 1, 16, 37, 49, 83, 96, 96, - 34, 8, 2, 5, 5, 57, 34, 52, 5, 34, - 15, 7, 103, 57, 34, 7, 15, 8, 8, 17, - 37, 62, 17, 34, 57, 7, 20, 62, 34, 7, - 62, 34, 70, 37, 7, 48, 66, 17, 57, 62, - 8, 17, 17, 17, 7, 38, 34, 30, 35, 38, - 17, 63, 17, 30, 7, 34, 96, 7, 1, 83, - 1, 8, 48, 34, 34, 49, 2, 7, 83, 17, - 2, 52, 57, 37, 34, 37, 37, 34, 37, 30, - 7, 37, 103, 38, 17, 34, 52, 17, 7, 7, - 62, 49, 34, 62, 7, 34, 7, 7, 7, 34, - 17, 30, 116, 37, 0, -1, 116, 8, 62, 34, - 34, 63, 34, 57, 8, 1, 62, 37, -1, 57, - 57, 8, 37, 7, 2, 70, 57, 34, 30, 34, - 38, 57, 30, 30, 62, 30, 57, 30, 8, 62, - 8, -1, 23, 7, 7, 57, 62, 8, 62, 8, - -1, -1, 8, 57, 34, 17, 62, 7, -1, 34, - 17, 34, 62, 62, 52, 37, 49, 70, 37, 8, - 8, 63, 17, 63, 17, 57, 17, 8, 63, 7, - 57, 15, 34, 7, 63, 8, 62, -1, 62, 15, - 57, 62, 83, 8, 15, 8, 8, 62, 8, 25, - 34, 41, 62, 32, 58, 58, 57, -1, 57, 7, - 8, 69, 58, 53, 35, 81, 8, 106, 37, 63, - 64, 63, 64, 37, 8, 41, 63, 64, 63, 64, - 63, 64, 41, 63, 64, 58, 15, 53, 63, 64, - 43, 63, 64, 70, 53, 57, 25, 62, 58, 62, - 8, 106, 55, 99, 8, 63, 64, 63, 64, 63, - 64, 63, 64, 41, 63, 64, 114, 115, 63, 64, - 62, 8, 8, 63, 64, 53, 8, 15, 8, 7, - 107, 63, 64, 63, 64, 8, 8, 25, 117, 63, - 64, 56, 116, 8, 56, 8, 8, 116, 8, 10, - 63, 64, 116, 7, 62, 8, 8, 34, 62, 37, - 63, 64, 7, 25, 114, 115, 7, 26, 0, 28, - 8, 58, 8, 7, 7, 57, 62, 57, 7, 0, - 39, 17, 97, 8, 57, 97, 58, 30, 65, 8, - 12, 26, 57, 28, -1, 58, 57, -1, 17, 30, - 6, 34, 62, 30, 39, 58, 63, 64, -1, -1, - 62, 26, -1, 28, 20, 26, 5, 28, 63, 64, - 37, 10, 63, 64, 39, 63, 64, 63, 39, 63, - 64, 8, 48, -1, 63, 64, 79, 59, 95, 30, - 30, 57, 96, 65, 63, 7, 63, 64, 79, 92, - 30, 12, 79, 69, 26, 17, 28, 30, 12, 30, - 30, 92, 63, 64, 30, 92, 50, 39, 57, 8, - 15, 22, 23, 105, 15, 37, 22, 23, -1, 63, - 64, -1, 114, -1, 105, -1, 111, 112, 79, 79, - 35, -1, -1, 114, 35, -1, -1, 130, 59, 79, - -1, 92, 92, -1, 65, 59, 79, -1, 79, 79, - -1, 65, 92, 79, -1, 116, 18, 19, 15, 92, - -1, 92, 92, -1, 63, 64, 92, 15, 15, 18, - 19, -1, 116, 15, 111, 112, -1, -1, 35, 15, - 37, -1, 88, 89, 46, 47, -1, 35, 35, 37, - 37, 102, -1, 35, -1, 37, 102, 46, 47, 35, - 15, 37, -1, -1, 109, 110, 15, -1, 109, 110, - -1, 121, 122, 123, 124, 125, 126, -1, -1, 34, - 35, -1, 37, -1, -1, 34, 35, 10, 37, 24, - 25, -1, -1, 24, 25, -1, -1, -1, 33, 22, - 23, 36, 33, 38, -1, 36, -1, 38, -1, -1, - 10, 34, 109, 110, -1, -1, -1, 24, 25, -1, - -1, 109, 110, -1, -1, 32, 33, 109, 110, 36, - 30, 38, -1, 109, 110, -1, -1, 24, 25, -1, - -1, -1, 65, -1, -1, 32, 33, 18, 19, 36, - 30, 38, -1, -1, 109, 110, 79, 30, -1, -1, - 109, 110, -1, -1, -1, 88, 89, 15, -1, -1, - 70, 71, 72, -1, -1, 46, 47, -1, -1, 102, - -1, 116, 30, -1, -1, 116, 15, -1, -1, -1, - 70, 71, 72, -1, -1, -1, -1, 70, 71, 72, - -1, 30, -1, -1, -1, -1, 106, 107, 108, 116, - -1, -1, -1, -1, -1, -1, -1, 117, 118, 119, - -1, -1, 70, 71, 72, -1, 106, 107, 108, 116, - -1, -1, -1, 106, 107, 108, -1, 117, 118, 119, - 15, 70, 71, 72, 117, 118, 119, -1, -1, -1, - 130, -1, -1, -1, -1, 30, -1, 130, 106, 107, - 108, -1, -1, 30, -1, -1, -1, -1, -1, 117, - 118, 119, -1, -1, -1, -1, -1, 106, 107, 108, - -1, -1, 130, 30, -1, -1, -1, -1, 117, 118, - 119, -1, -1, -1, -1, 70, 71, 72, -1, -1, - -1, 130, -1, 70, 71, 72, -1, -1, -1, -1, + 57, 37, 0, 7, 62, 7, 62, 37, 57, 57, + 37, 50, 62, 7, 57, 7, 62, 0, 15, 96, + 16, 37, 1, 49, 83, 96, 8, 34, 96, 5, + 5, 37, 2, 34, 52, 7, 5, 57, 57, 34, + 7, 15, 15, 34, 8, 62, 7, 37, 103, 20, + 34, 17, 17, 8, 7, 70, 34, 62, 57, 62, + 7, 38, 48, 7, 57, 17, 66, 8, 48, 17, + 38, 34, 17, 62, 30, 37, 35, 34, 38, 17, + 30, 17, 63, 34, 96, 34, 1, 7, 17, 7, + 1, 7, 34, 2, 7, 49, 83, 37, 83, 57, + 34, 8, 37, 7, 37, 17, 52, 34, 2, 37, + 7, 37, 49, 52, 38, 34, 30, 34, 7, 62, + 7, 7, 17, 7, 34, 17, 7, 30, 116, 34, + 62, 62, 62, 8, 57, 57, 37, 7, 34, 0, + 17, 34, 8, 1, 34, -1, -1, -1, 8, 70, + 2, 57, 37, 7, 34, 63, 30, 57, 57, 37, + 62, 34, 30, 30, 62, 30, 57, 38, 30, 8, + 8, 8, 7, 23, 62, 57, 7, 7, 103, 62, + 8, 57, -1, 62, 17, 8, 7, -1, 8, 8, + 37, 34, 17, 62, 34, 8, 52, -1, 70, 62, + 49, 17, 8, 37, 63, 34, 17, 17, 7, 7, + 63, 15, 63, 57, -1, 57, 62, 34, 63, 83, + 8, 62, 15, 8, 8, -1, 62, -1, 8, 41, + 34, 7, 8, 8, 41, 62, 62, 15, 10, 8, + 58, 53, 35, 58, 8, 69, 53, 25, 57, 81, + 7, 106, 41, 8, 56, 63, 64, 8, 37, 116, + 63, 64, 63, 64, 53, 8, 63, 64, 116, 63, + 64, 63, 64, 58, 62, 37, 63, 64, 62, 70, + 63, 64, 62, 58, 106, 57, 63, 64, 56, 58, + 63, 64, 106, 6, 58, 97, 63, 64, 63, 64, + 63, 64, 57, 8, 57, 32, 8, 20, 8, 114, + 115, 62, 8, 8, 114, 115, 107, 15, 116, 62, + 8, 63, 64, 63, 64, 63, 64, 25, 8, 97, + 25, 63, 64, 63, 64, 63, 64, 116, 8, 96, + 41, 15, 58, 8, 63, 64, 43, 8, 34, 7, + 12, 25, 53, 30, 116, 57, 0, 62, 55, 30, + 12, 57, 62, 30, -1, 5, 7, 30, 37, 57, + 10, 26, 8, 28, 7, 0, -1, 30, 8, 65, + 48, 7, 62, 99, 39, 63, 64, 30, 58, 57, + 117, 30, 8, 58, 63, 64, 57, 59, 7, 22, + 23, 69, 79, 65, 12, 63, 64, 59, 79, 63, + 64, 37, 79, 65, 8, 92, 79, 57, 7, 30, + 30, 92, 63, 64, 15, 92, 79, 63, 64, 92, + 63, 64, 7, 63, 64, 30, 79, -1, 116, 92, + 79, 95, 17, 8, 35, 34, 37, 8, -1, 92, + -1, 59, 17, 92, 63, 64, 17, 65, 18, 19, + 50, 105, 37, 15, 18, 19, 22, 23, 79, 79, + 114, 15, -1, 63, 64, 18, 19, 18, 19, 102, + 105, 92, 92, 35, 79, -1, 46, 47, -1, 114, + -1, 35, 46, 47, 15, 111, 112, 92, 63, -1, + 15, -1, 63, 46, 47, 46, 47, 15, 26, -1, + 28, -1, -1, -1, 35, -1, 37, 111, 112, -1, + 35, 39, 37, 15, -1, -1, 116, 35, -1, 37, + 15, -1, 88, 89, 121, 122, 123, 124, 125, 126, + -1, 130, 34, 35, -1, 37, 102, 24, 25, 34, + 35, -1, 37, -1, -1, -1, 33, 109, 110, 36, + -1, 38, 24, 25, -1, 109, 110, -1, -1, 24, + 25, 33, -1, -1, 36, -1, 38, 32, 33, -1, + -1, 36, -1, 38, 24, 25, 30, 10, 109, 110, + -1, -1, 32, 33, 109, 110, 36, -1, 38, 22, + 23, 109, 110, -1, 30, -1, -1, -1, -1, 10, + -1, 34, -1, -1, -1, -1, 15, 109, 110, -1, + -1, -1, -1, -1, 109, 110, 70, 71, 72, 30, + -1, -1, -1, -1, -1, -1, 35, -1, 37, 116, + 15, -1, 65, -1, 70, 71, 72, -1, -1, -1, + -1, -1, -1, -1, 116, 30, 79, 15, -1, -1, + -1, 116, 106, 107, 108, 88, 89, -1, -1, 70, + 71, 72, 30, 117, 118, 119, 116, -1, -1, 102, + 106, 107, 108, -1, -1, -1, 130, -1, -1, -1, + -1, 117, 118, 119, -1, 70, 71, 72, -1, -1, + -1, -1, -1, -1, 130, 106, 107, 108, -1, -1, + 109, 110, 70, 71, 72, -1, 117, 118, 119, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 30, -1, + -1, 106, 107, 108, -1, 30, -1, -1, -1, -1, + -1, -1, 117, 118, 119, -1, -1, -1, 106, 107, + 108, -1, -1, -1, -1, 130, -1, -1, -1, 117, + 118, 119, -1, -1, -1, -1, -1, -1, 70, 71, + 72, -1, 130, -1, -1, 70, 71, 72, -1, 30, + -1, -1, -1, -1, -1, 30, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 70, 71, 72, -1, -1, -1, -1, - -1, 106, 107, 108, -1, -1, -1, -1, -1, 106, - 107, 108, 117, 118, 119, -1, -1, -1, -1, -1, - 117, 118, 119, 30, -1, 130, 30, 104, -1, 106, - 107, 108, -1, 130, -1, -1, -1, 15, -1, 116, - 117, 118, 119, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 30, 130, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 70, 71, 72, 70, 71, 72, -1, - -1, -1, -1, -1, -1, 79, -1, 30, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 92, -1, - -1, -1, 70, 71, 72, 30, -1, 104, -1, 106, - 107, 108, 106, 107, 108, -1, -1, -1, -1, 116, - 117, 118, 119, 117, 118, 119, -1, 70, 71, 72, - -1, -1, -1, 130, -1, -1, 130, 30, 106, 107, - 108, -1, -1, -1, -1, 70, 71, 72, -1, 117, - 118, 119, -1, -1, 79, -1, -1, -1, -1, -1, - -1, 104, 130, 106, 107, 108, 30, 92, -1, -1, - -1, -1, -1, 116, 117, 118, 119, 70, 71, 72, - -1, 106, 107, 108, -1, -1, -1, 130, -1, -1, - -1, 30, 117, 118, 119, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 130, 70, 71, 72, 30, - -1, 104, -1, 106, 107, 108, 37, -1, -1, -1, - -1, -1, -1, 116, 117, 118, 119, -1, -1, -1, - -1, 70, 71, 72, -1, -1, -1, 130, -1, -1, - 104, -1, 106, 107, 108, -1, -1, -1, -1, 70, - 71, 72, 116, 117, 118, 119, -1, -1, -1, -1, - -1, -1, -1, -1, 103, 104, 130, 106, 107, 108, - 30, -1, -1, -1, -1, 30, -1, 116, 117, 118, - 119, -1, 37, 104, -1, 106, 107, 108, -1, -1, - -1, 130, -1, -1, -1, 116, 117, 118, 119, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 130, - 70, 71, 72, -1, -1, 70, 71, 72, -1, -1, + -1, -1, 104, -1, 106, 107, 108, -1, -1, -1, + -1, 106, 107, 108, 116, 117, 118, 119, -1, 70, + 71, 72, 117, 118, 119, 70, 71, 72, 130, 30, + -1, -1, -1, -1, 79, 130, -1, -1, -1, 15, + -1, -1, -1, -1, -1, -1, -1, 92, 30, -1, + -1, -1, -1, 104, 30, 106, 107, 108, -1, -1, + -1, 106, 107, 108, -1, 116, 117, 118, 119, 70, + 71, 72, 117, 118, 119, -1, -1, -1, 79, 130, + -1, -1, -1, -1, -1, 130, -1, -1, 70, 71, + 72, 92, -1, -1, 70, 71, 72, -1, -1, -1, + -1, -1, -1, -1, 30, 106, 107, 108, -1, -1, + -1, 37, -1, -1, -1, -1, 117, 118, 119, -1, + -1, -1, 104, -1, 106, 107, 108, -1, -1, 130, + 106, 107, 108, 30, 116, 117, 118, 119, -1, -1, + 37, 117, 118, 119, 70, 71, 72, -1, 130, -1, + -1, -1, -1, -1, 130, -1, -1, -1, 30, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 30, -1, -1, -1, -1, -1, -1, 37, -1, - -1, -1, -1, -1, 104, -1, 106, 107, 108, 104, - -1, 106, 107, 108, -1, -1, 116, 117, 118, 119, - -1, 116, 117, 118, 119, -1, -1, -1, -1, -1, - 130, 70, 71, 72, 30, 130, -1, -1, -1, -1, - -1, 37, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 30, -1, -1, -1, 34, 35, 30, - -1, -1, -1, 34, 35, 104, -1, 106, 107, 108, - -1, -1, -1, -1, 70, 71, 72, 116, 117, 118, - 119, -1, -1, -1, 30, -1, -1, -1, 34, 35, - -1, 130, -1, 70, 71, 72, -1, -1, -1, 70, - 71, 72, -1, -1, -1, -1, -1, -1, 104, 30, - 106, 107, 108, 34, 35, -1, -1, -1, -1, -1, - 116, 117, 118, 119, 70, 71, 72, 104, -1, 106, - 107, 108, -1, 104, 130, 106, 107, 108, 30, 116, - 117, 118, 119, -1, -1, 116, 117, 118, 119, 70, - 71, 72, -1, 130, -1, -1, -1, -1, 104, 130, - 106, 107, 108, -1, -1, -1, -1, -1, -1, -1, - 116, 117, 118, 119, -1, -1, -1, -1, 70, 71, - 72, -1, -1, 104, 130, 106, 107, 108, -1, -1, - -1, -1, -1, 3, -1, 116, 117, 118, 119, -1, - -1, -1, -1, 13, -1, -1, -1, 17, -1, 130, - -1, 103, 104, -1, 106, 107, 108, 27, -1, 29, + -1, -1, -1, 70, 71, 72, -1, -1, 104, -1, + 106, 107, 108, -1, -1, -1, -1, 30, -1, -1, + 116, 117, 118, 119, 37, -1, -1, -1, 70, 71, + 72, -1, -1, -1, 130, -1, -1, 104, 30, 106, + 107, 108, -1, -1, -1, 37, -1, -1, -1, 116, + 117, 118, 119, -1, -1, -1, -1, 70, 71, 72, + -1, -1, 104, 130, 106, 107, 108, 30, -1, -1, + -1, 34, 35, -1, 116, 117, 118, 119, 70, 71, + 72, -1, -1, -1, -1, -1, -1, -1, 130, -1, + -1, 104, 30, 106, 107, 108, -1, -1, -1, -1, + -1, -1, -1, 116, 117, 118, 119, 70, 71, 72, + -1, -1, 104, -1, 106, 107, 108, 130, -1, -1, -1, -1, -1, -1, 116, 117, 118, 119, -1, -1, - 40, -1, 42, 43, -1, 30, -1, -1, 130, 34, - 35, 51, 30, -1, 54, 55, 34, 35, -1, -1, - 60, -1, -1, -1, -1, -1, -1, 67, 68, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 84, 70, 71, 72, -1, -1, - -1, -1, 70, 71, 72, -1, -1, -1, -1, -1, - -1, -1, 30, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 104, - -1, 106, 107, 108, -1, -1, 104, -1, 106, 107, - 108, 116, 117, 118, 119, 63, 64, -1, 116, 117, - 118, 119, 70, 71, 72, 130, -1, -1, -1, -1, - -1, -1, 130, -1, -1, -1, 30, -1, -1, -1, - 34, 35, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 104, -1, 106, 107, - 108, -1, -1, -1, -1, -1, -1, -1, 116, 117, - 118, 119, -1, -1, -1, -1, 70, 71, 72, -1, - 3, -1, 130, -1, -1, -1, -1, -1, -1, -1, - 13, -1, -1, -1, 17, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 27, -1, 29, -1, -1, -1, - 104, 30, 106, 107, 108, 34, -1, 40, -1, 42, - 43, -1, 116, 117, 118, 119, -1, -1, 51, -1, - -1, 54, 55, -1, -1, -1, 130, 60, -1, -1, - 30, -1, -1, -1, 67, 68, 65, -1, -1, -1, - 69, 70, 71, 72, -1, -1, -1, -1, -1, -1, - -1, 84, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 63, 64, -1, -1, -1, -1, -1, - 70, 71, 72, -1, -1, 104, -1, 106, 107, 108, - -1, -1, -1, -1, -1, 3, -1, 116, 117, 118, - 119, -1, -1, -1, -1, 13, -1, -1, -1, 17, - -1, 130, -1, -1, 104, -1, 106, 107, 108, 27, - -1, 29, -1, -1, 32, -1, 116, 117, 118, 119, - -1, -1, 40, -1, 42, 43, -1, -1, -1, -1, - 130, -1, -1, 51, 30, -1, 54, 55, 34, 35, - -1, -1, 60, -1, -1, -1, -1, -1, -1, 67, - 68, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 84, -1, -1, -1, - -1, -1, -1, -1, 70, 71, 72, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 117, - -1, -1, -1, 99, -1, -1, -1, -1, 104, -1, - 106, 107, 108, -1, -1, -1, -1, -1, -1, -1, - 116, 117, 118, 119, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 130, -1, -1, -1, 12, 13, - -1, -1, -1, -1, -1, -1, -1, -1, 22, 23, + -1, -1, 70, 71, 72, -1, -1, -1, 130, -1, + -1, 104, -1, 106, 107, 108, -1, 3, -1, -1, + -1, -1, -1, 116, 117, 118, 119, 13, -1, -1, + -1, 17, -1, -1, -1, 103, 104, 130, 106, 107, + 108, 27, -1, 29, -1, -1, -1, -1, 116, 117, + 118, 119, -1, -1, 40, -1, 42, 43, -1, 30, + -1, -1, 130, 34, 35, 51, 30, -1, 54, 55, + 34, 35, -1, -1, 60, -1, -1, -1, -1, -1, + -1, 67, 68, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 84, 70, + 71, 72, -1, -1, -1, -1, 70, 71, 72, -1, -1, -1, -1, -1, -1, -1, 30, -1, -1, -1, - 34, 35, -1, 37, -1, -1, -1, -1, -1, -1, - 44, -1, -1, -1, 48, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 69, 70, 71, 72, -1, - 74, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 85, 86, 87, -1, -1, -1, -1, -1, 93, - -1, -1, -1, -1, -1, -1, -1, 101, 102, -1, - 104, -1, 106, 107, 108, 109, 110, -1, -1, -1, - -1, -1, 116, 117, 118, 119, -1, -1, -1, -1, + -1, -1, -1, 104, -1, 106, 107, 108, -1, -1, + 104, -1, 106, 107, 108, 116, 117, 118, 119, 63, + 64, -1, 116, 117, 118, 119, 70, 71, 72, 130, -1, -1, -1, -1, -1, -1, 130, -1, -1, -1, - 12, 13, -1, -1, -1, -1, -1, -1, -1, -1, - 22, 23, -1, -1, -1, -1, -1, -1, 30, -1, - -1, -1, 34, 35, -1, 37, -1, -1, -1, -1, - -1, -1, 44, -1, -1, -1, 48, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 69, 70, 71, - 72, -1, 74, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 85, 86, 87, -1, -1, -1, -1, - -1, 93, -1, -1, -1, -1, -1, -1, -1, 101, - 102, -1, 104, -1, 106, 107, 108, 109, 110, -1, - -1, -1, -1, -1, 116, 117, 118, 119, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 130, -1, - -1, -1, 12, 13, -1, -1, -1, -1, -1, -1, - -1, -1, 22, 23, -1, -1, -1, -1, -1, -1, - 30, -1, -1, -1, 34, 35, -1, 37, -1, -1, - -1, -1, -1, -1, 44, -1, -1, -1, 48, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 69, - 70, 71, 72, -1, 74, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 85, 86, 87, -1, -1, - 90, -1, -1, 93, -1, -1, -1, -1, -1, -1, - -1, 101, 102, -1, 104, -1, 106, 107, 108, 109, - 110, -1, -1, -1, -1, -1, 116, 117, 118, 119, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 130, -1, -1, -1, 12, 13, -1, 15, -1, -1, - -1, -1, -1, -1, 22, 23, -1, -1, -1, -1, - -1, -1, 30, -1, -1, -1, 34, 35, -1, 37, - -1, -1, -1, -1, -1, -1, 44, -1, -1, -1, - 48, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 69, 70, 71, 72, -1, 74, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 85, 86, 87, - -1, -1, -1, -1, -1, 93, -1, -1, -1, -1, - -1, -1, -1, 101, 102, -1, 104, -1, 106, 107, - 108, 109, 110, -1, -1, -1, -1, -1, 116, 117, - 118, 119, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 130, -1, -1, -1, 12, 13, -1, -1, - -1, -1, -1, -1, -1, -1, 22, 23, -1, -1, - -1, -1, -1, -1, 30, -1, -1, -1, 34, 35, - -1, 37, -1, -1, -1, -1, -1, -1, 44, -1, - -1, -1, 48, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 69, 70, 71, 72, -1, 74, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 85, - 86, 87, -1, -1, -1, -1, 92, 93, -1, -1, - -1, -1, -1, -1, -1, 101, 102, -1, 104, -1, - 106, 107, 108, 109, 110, -1, -1, -1, -1, -1, - 116, 117, 118, 119, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 130, -1, -1, -1, 12, 13, - -1, 15, -1, -1, -1, -1, -1, -1, 22, 23, - -1, -1, -1, -1, -1, -1, 30, -1, -1, -1, - 34, 35, -1, 37, -1, -1, -1, -1, -1, -1, - 44, -1, -1, -1, 48, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 69, 70, 71, 72, -1, - 74, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 85, 86, 87, -1, -1, -1, -1, -1, 93, - -1, -1, -1, -1, -1, -1, -1, 101, 102, -1, - 104, -1, 106, 107, 108, 109, 110, -1, -1, -1, + 30, -1, -1, -1, 34, 35, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 30, + 104, -1, 106, 107, 108, -1, -1, -1, -1, -1, -1, -1, 116, 117, 118, 119, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 130, -1, -1, -1, - 10, -1, 12, 13, -1, -1, -1, -1, -1, -1, - -1, -1, 22, 23, -1, -1, -1, -1, -1, -1, - 30, -1, -1, -1, 34, 35, -1, 37, -1, -1, - -1, -1, -1, -1, 44, -1, -1, -1, 48, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 69, - 70, 71, 72, -1, 74, -1, -1, -1, -1, 79, - -1, -1, -1, -1, -1, 85, 86, 87, -1, -1, - 90, -1, -1, 93, -1, -1, -1, -1, 98, -1, - -1, 101, 102, -1, 104, -1, 106, 107, 108, 109, - 110, -1, -1, -1, -1, -1, 116, 117, 118, 119, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 130, -1, -1, -1, 10, -1, 12, 13, -1, -1, - -1, -1, -1, -1, -1, -1, 22, 23, -1, -1, - -1, -1, -1, -1, 30, -1, -1, -1, 34, 35, - -1, 37, -1, -1, -1, -1, -1, -1, 44, -1, - -1, -1, 48, -1, -1, -1, -1, -1, -1, -1, - -1, 57, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 69, 70, 71, 72, -1, 74, -1, - -1, -1, -1, 79, -1, -1, -1, -1, -1, 85, - 86, 87, -1, -1, 90, -1, -1, 93, -1, -1, - -1, -1, 98, -1, -1, 101, 102, -1, 104, -1, - 106, 107, 108, 109, 110, -1, -1, -1, -1, -1, - 116, 117, 118, 119, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 130, -1, -1, -1, 10, -1, - 12, 13, -1, -1, -1, -1, -1, -1, -1, -1, - 22, 23, -1, -1, -1, -1, -1, -1, 30, -1, - -1, -1, 34, 35, -1, 37, -1, -1, -1, -1, - -1, -1, 44, -1, -1, -1, 48, -1, -1, -1, - -1, -1, -1, -1, -1, 57, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 69, 70, 71, - 72, -1, 74, -1, -1, -1, -1, 79, -1, -1, - -1, -1, -1, 85, 86, 87, -1, -1, 90, -1, - -1, 93, -1, -1, -1, -1, 98, -1, -1, 101, - 102, -1, 104, -1, 106, 107, 108, 109, 110, -1, - -1, -1, -1, -1, 116, 117, 118, 119, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 130, -1, - -1, -1, 11, 12, 13, -1, -1, -1, -1, -1, + 70, 71, 72, -1, -1, -1, 130, -1, -1, -1, + -1, -1, 63, 64, -1, -1, -1, -1, -1, 70, + 71, 72, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 104, -1, 106, 107, 108, -1, + -1, -1, -1, -1, -1, -1, 116, 117, 118, 119, + -1, -1, -1, 104, -1, 106, 107, 108, -1, -1, + 130, -1, -1, -1, 3, 116, 117, 118, 119, -1, + -1, -1, -1, -1, 13, -1, -1, 30, 17, 130, + -1, 34, 35, -1, -1, -1, -1, -1, 27, -1, + 29, -1, -1, 30, -1, -1, -1, 34, 35, -1, + -1, 40, -1, 42, 43, -1, -1, -1, -1, -1, + -1, -1, 51, -1, -1, 54, 55, 70, 71, 72, + -1, 60, -1, -1, -1, -1, -1, -1, 67, 68, + -1, -1, 30, 70, 71, 72, 34, 35, -1, -1, + -1, -1, -1, -1, -1, 84, -1, -1, -1, -1, + -1, 104, -1, 106, 107, 108, -1, -1, -1, -1, + -1, -1, 99, 116, 117, 118, 119, 104, -1, 106, + 107, 108, 70, 71, 72, -1, 3, 130, -1, 116, + 117, 118, 119, -1, -1, -1, 13, -1, -1, -1, + 17, -1, -1, 130, -1, 30, -1, -1, -1, 34, + 27, 99, 29, -1, -1, 32, 104, -1, 106, 107, + 108, -1, -1, 40, -1, 42, 43, -1, 116, 117, + 118, 119, -1, -1, 51, -1, -1, 54, 55, -1, + 65, -1, 130, 60, 69, 70, 71, 72, -1, -1, + 67, 68, -1, -1, -1, -1, -1, -1, 4, 5, + 6, -1, -1, 9, 10, 11, -1, 84, 14, -1, + 16, -1, -1, -1, 20, 21, -1, 23, -1, 104, + -1, 106, 107, 108, 30, 31, 32, 33, -1, -1, + -1, 116, 117, 118, 119, -1, -1, -1, 44, -1, + 117, -1, -1, -1, -1, 130, -1, -1, -1, 30, + -1, -1, -1, 34, 35, 61, -1, -1, -1, -1, + -1, -1, -1, -1, 70, 71, 72, 73, 74, 75, + -1, 77, 78, 79, 80, 81, 82, -1, -1, 85, + 86, 87, 88, 89, -1, 91, 92, -1, -1, 70, + 71, 72, 98, -1, -1, 101, 102, 103, 104, 105, + 106, 107, 108, -1, -1, -1, -1, -1, 114, -1, + 116, 117, 118, 119, -1, -1, -1, -1, 99, -1, + -1, -1, -1, 104, 130, 106, 107, 108, -1, -1, + -1, -1, -1, -1, -1, 116, 117, 118, 119, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 130, + -1, -1, -1, 12, 13, -1, -1, -1, -1, -1, -1, -1, -1, 22, 23, -1, -1, -1, -1, -1, -1, 30, -1, -1, -1, 34, 35, -1, 37, -1, - -1, -1, 41, -1, 43, 44, 45, -1, -1, 48, - -1, -1, -1, -1, 53, -1, 55, -1, -1, -1, + -1, -1, -1, -1, -1, 44, -1, -1, -1, 48, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 69, 70, 71, 72, -1, 74, -1, 76, -1, 78, - -1, 80, -1, -1, -1, -1, 85, 86, 87, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 69, 70, 71, 72, -1, 74, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 85, 86, 87, -1, -1, -1, -1, -1, 93, -1, -1, -1, -1, -1, -1, -1, 101, 102, -1, 104, -1, 106, 107, 108, 109, 110, -1, -1, -1, -1, -1, 116, 117, 118, 119, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 130, -1, -1, -1, 11, 12, 13, -1, -1, - -1, -1, -1, -1, -1, -1, 22, 23, -1, -1, - -1, -1, -1, -1, 30, -1, -1, -1, 34, 35, - -1, 37, -1, -1, -1, 41, -1, 43, 44, 45, - -1, -1, 48, -1, -1, -1, -1, 53, -1, 55, + -1, 130, -1, -1, -1, 12, 13, -1, -1, -1, + -1, -1, -1, -1, -1, 22, 23, -1, -1, -1, + -1, -1, -1, 30, -1, -1, -1, 34, 35, -1, + 37, -1, -1, -1, -1, -1, -1, 44, -1, -1, + -1, 48, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 69, 70, 71, 72, -1, 74, -1, - 76, -1, 78, -1, 80, -1, -1, -1, -1, 85, - 86, 87, -1, -1, -1, -1, -1, 93, -1, -1, - -1, -1, -1, -1, 100, 101, 102, -1, 104, -1, - 106, 107, 108, 109, 110, -1, -1, -1, -1, -1, - 116, 117, 118, 119, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 130, -1, -1, -1, 11, 12, + -1, -1, 69, 70, 71, 72, -1, 74, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 85, 86, + 87, -1, -1, -1, -1, -1, 93, -1, -1, -1, + -1, -1, -1, -1, 101, 102, -1, 104, -1, 106, + 107, 108, 109, 110, -1, -1, -1, -1, -1, 116, + 117, 118, 119, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 130, -1, -1, -1, 12, 13, -1, + -1, -1, -1, -1, -1, -1, -1, 22, 23, -1, + -1, -1, -1, -1, -1, 30, -1, -1, -1, 34, + 35, -1, 37, -1, -1, -1, -1, -1, -1, 44, + -1, -1, -1, 48, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 69, 70, 71, 72, -1, 74, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 85, 86, 87, -1, -1, -1, -1, 92, 93, -1, + -1, -1, -1, -1, -1, -1, 101, 102, -1, 104, + -1, 106, 107, 108, 109, 110, -1, -1, -1, -1, + -1, 116, 117, 118, 119, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 130, -1, -1, -1, 12, 13, -1, -1, -1, -1, -1, -1, -1, -1, 22, 23, -1, -1, -1, -1, -1, -1, 30, -1, -1, - -1, 34, 35, -1, 37, -1, -1, -1, 41, -1, - 43, 44, 45, -1, -1, 48, -1, -1, -1, -1, - 53, -1, 55, -1, -1, -1, -1, -1, -1, -1, + -1, 34, 35, -1, 37, -1, -1, -1, -1, -1, + -1, 44, -1, -1, -1, 48, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 69, 70, 71, 72, - -1, 74, -1, 76, -1, 78, -1, 80, -1, -1, - -1, -1, 85, 86, 87, -1, -1, -1, -1, -1, - 93, -1, -1, -1, -1, -1, -1, 100, 101, 102, + -1, 74, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 85, 86, 87, -1, -1, 90, -1, -1, + 93, -1, -1, -1, -1, -1, -1, -1, 101, 102, -1, 104, -1, 106, 107, 108, 109, 110, -1, -1, -1, -1, -1, 116, 117, 118, 119, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 130, -1, -1, - -1, 11, 12, 13, -1, -1, -1, -1, -1, -1, - -1, -1, 22, 23, -1, -1, -1, -1, -1, -1, - 30, -1, -1, -1, 34, 35, -1, 37, -1, -1, - -1, 41, -1, 43, 44, 45, -1, -1, 48, -1, - -1, -1, -1, 53, -1, 55, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 69, - 70, 71, 72, -1, 74, -1, 76, -1, 78, -1, - 80, -1, -1, -1, -1, 85, 86, 87, -1, -1, - -1, -1, -1, 93, -1, -1, -1, -1, -1, 99, - 100, 101, 102, -1, 104, -1, 106, 107, 108, 109, - 110, -1, -1, -1, -1, -1, 116, 117, 118, 119, + -1, 12, 13, -1, 15, -1, -1, -1, -1, -1, + -1, 22, 23, -1, -1, -1, -1, -1, -1, 30, + -1, -1, -1, 34, 35, -1, 37, -1, -1, -1, + -1, -1, -1, 44, -1, -1, -1, 48, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 130, -1, -1, -1, 11, 12, 13, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 69, 70, + 71, 72, -1, 74, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 85, 86, 87, -1, -1, -1, + -1, -1, 93, -1, -1, -1, -1, -1, -1, -1, + 101, 102, -1, 104, -1, 106, 107, 108, 109, 110, + -1, -1, -1, -1, -1, 116, 117, 118, 119, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 130, + -1, -1, -1, 12, 13, -1, 15, -1, -1, -1, + -1, -1, -1, 22, 23, -1, -1, -1, -1, -1, + -1, 30, -1, -1, -1, 34, 35, -1, 37, -1, + -1, -1, -1, -1, -1, 44, -1, -1, -1, 48, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 69, 70, 71, 72, -1, 74, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 85, 86, 87, -1, + -1, -1, -1, -1, 93, -1, -1, -1, -1, -1, + -1, -1, 101, 102, -1, 104, -1, 106, 107, 108, + 109, 110, -1, -1, -1, -1, -1, 116, 117, 118, + 119, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 130, -1, -1, -1, 10, -1, 12, 13, -1, + -1, -1, -1, -1, -1, -1, -1, 22, 23, -1, + -1, -1, -1, -1, -1, 30, -1, -1, -1, 34, + 35, -1, 37, -1, -1, -1, -1, -1, -1, 44, + -1, -1, -1, 48, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 69, 70, 71, 72, -1, 74, + -1, -1, -1, -1, 79, -1, -1, -1, -1, -1, + 85, 86, 87, -1, -1, 90, -1, -1, 93, -1, + -1, -1, -1, 98, -1, -1, 101, 102, -1, 104, + -1, 106, 107, 108, 109, 110, -1, -1, -1, -1, + -1, 116, 117, 118, 119, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 130, -1, -1, -1, 10, + -1, 12, 13, -1, -1, -1, -1, -1, -1, -1, + -1, 22, 23, -1, -1, -1, -1, -1, -1, 30, + -1, -1, -1, 34, 35, -1, 37, -1, -1, -1, + -1, -1, -1, 44, -1, -1, -1, 48, -1, -1, + -1, -1, -1, -1, -1, -1, 57, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 69, 70, + 71, 72, -1, 74, -1, -1, -1, -1, 79, -1, + -1, -1, -1, -1, 85, 86, 87, -1, -1, 90, + -1, -1, 93, -1, -1, -1, -1, 98, -1, -1, + 101, 102, -1, 104, -1, 106, 107, 108, 109, 110, + -1, -1, -1, -1, -1, 116, 117, 118, 119, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 130, + -1, -1, -1, 10, -1, 12, 13, -1, -1, -1, -1, -1, -1, -1, -1, 22, 23, -1, -1, -1, -1, -1, -1, 30, -1, -1, -1, 34, 35, -1, - 37, -1, -1, -1, 41, -1, 43, 44, 45, -1, - -1, 48, -1, -1, -1, -1, 53, -1, 55, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 65, -1, - -1, -1, 69, 70, 71, 72, -1, 74, -1, 76, - -1, 78, -1, 80, -1, -1, -1, -1, 85, 86, - 87, -1, -1, -1, -1, -1, 93, -1, -1, -1, - -1, -1, -1, 100, 101, 102, -1, 104, -1, 106, + 37, -1, -1, -1, -1, -1, -1, 44, -1, -1, + -1, 48, -1, -1, -1, -1, -1, -1, -1, -1, + 57, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 69, 70, 71, 72, -1, 74, -1, -1, + -1, -1, 79, -1, -1, -1, -1, -1, 85, 86, + 87, -1, -1, 90, -1, -1, 93, -1, -1, -1, + -1, 98, -1, -1, 101, 102, -1, 104, -1, 106, 107, 108, 109, 110, -1, -1, -1, -1, -1, 116, 117, 118, 119, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 130, -1, -1, -1, 11, 12, 13, @@ -1880,10 +1818,10 @@ const short QmlJSGrammar::action_check [] = { -1, -1, -1, -1, -1, 69, 70, 71, 72, -1, 74, -1, 76, -1, 78, -1, 80, -1, -1, -1, -1, 85, 86, 87, -1, -1, -1, -1, -1, 93, - -1, -1, -1, -1, -1, -1, 100, 101, 102, -1, + -1, -1, -1, -1, -1, -1, -1, 101, 102, -1, 104, -1, 106, 107, 108, 109, 110, -1, -1, -1, -1, -1, 116, 117, 118, 119, -1, -1, -1, -1, - -1, -1, -1, -1, 128, -1, 130, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 130, -1, -1, -1, 11, 12, 13, -1, -1, -1, -1, -1, -1, -1, -1, 22, 23, -1, -1, -1, -1, -1, -1, 30, -1, -1, -1, 34, 35, -1, 37, -1, -1, -1, @@ -1895,7 +1833,7 @@ const short QmlJSGrammar::action_check [] = { -1, -1, 93, -1, -1, -1, -1, -1, -1, 100, 101, 102, -1, 104, -1, 106, 107, 108, 109, 110, -1, -1, -1, -1, -1, 116, 117, 118, 119, -1, - -1, -1, -1, -1, -1, -1, 127, -1, -1, 130, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 130, -1, -1, -1, 11, 12, 13, -1, -1, -1, -1, -1, -1, -1, -1, 22, 23, -1, -1, -1, -1, -1, -1, 30, -1, -1, -1, 34, 35, -1, 37, @@ -1905,10 +1843,22 @@ const short QmlJSGrammar::action_check [] = { -1, 69, 70, 71, 72, -1, 74, -1, 76, -1, 78, -1, 80, -1, -1, -1, -1, 85, 86, 87, -1, -1, -1, -1, -1, 93, -1, -1, -1, -1, - -1, 99, 100, 101, 102, -1, 104, -1, 106, 107, + -1, -1, 100, 101, 102, -1, 104, -1, 106, 107, 108, 109, 110, -1, -1, -1, -1, -1, 116, 117, 118, 119, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 130, -1, -1, -1, 8, -1, -1, 11, + -1, -1, 130, -1, -1, -1, 11, 12, 13, -1, + -1, -1, -1, -1, -1, -1, -1, 22, 23, -1, + -1, -1, -1, -1, -1, 30, -1, -1, -1, 34, + 35, -1, 37, -1, -1, -1, 41, -1, 43, 44, + 45, -1, -1, 48, -1, -1, -1, -1, 53, -1, + 55, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 69, 70, 71, 72, -1, 74, + -1, 76, -1, 78, -1, 80, -1, -1, -1, -1, + 85, 86, 87, -1, -1, -1, -1, -1, 93, -1, + -1, -1, -1, -1, 99, 100, 101, 102, -1, 104, + -1, 106, 107, 108, 109, 110, -1, -1, -1, -1, + -1, 116, 117, 118, 119, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 130, -1, -1, -1, 11, 12, 13, -1, -1, -1, -1, -1, -1, -1, -1, 22, 23, -1, -1, -1, -1, -1, -1, 30, -1, -1, -1, 34, 35, -1, 37, -1, -1, -1, 41, @@ -1920,7 +1870,7 @@ const short QmlJSGrammar::action_check [] = { -1, 93, -1, -1, -1, -1, -1, -1, 100, 101, 102, -1, 104, -1, 106, 107, 108, 109, 110, -1, -1, -1, -1, -1, 116, 117, 118, 119, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 130, -1, + -1, -1, -1, -1, -1, -1, 128, -1, 130, -1, -1, -1, 11, 12, 13, -1, -1, -1, -1, -1, -1, -1, -1, 22, 23, -1, -1, -1, -1, -1, -1, 30, -1, -1, -1, 34, 35, -1, 37, -1, @@ -1958,28 +1908,16 @@ const short QmlJSGrammar::action_check [] = { 100, 101, 102, -1, 104, -1, 106, 107, 108, 109, 110, -1, -1, -1, -1, -1, 116, 117, 118, 119, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 130, -1, -1, -1, 11, 12, 13, -1, -1, -1, - -1, -1, -1, -1, -1, 22, 23, -1, -1, -1, - -1, -1, -1, 30, -1, -1, -1, 34, 35, -1, - 37, -1, -1, -1, 41, -1, 43, 44, 45, -1, - -1, 48, -1, -1, -1, -1, 53, -1, 55, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 69, 70, 71, 72, -1, 74, -1, 76, - -1, 78, -1, 80, -1, -1, -1, -1, 85, 86, - 87, -1, -1, -1, -1, -1, 93, -1, -1, -1, - -1, -1, -1, 100, 101, 102, -1, 104, -1, 106, - 107, 108, 109, 110, -1, -1, -1, -1, -1, 116, - 117, 118, 119, -1, -1, -1, -1, -1, -1, -1, - -1, 128, -1, 130, -1, -1, -1, 11, 12, 13, + 130, -1, -1, -1, 8, -1, -1, 11, 12, 13, -1, -1, -1, -1, -1, -1, -1, -1, 22, 23, -1, -1, -1, -1, -1, -1, 30, -1, -1, -1, 34, 35, -1, 37, -1, -1, -1, 41, -1, 43, 44, 45, -1, -1, 48, -1, -1, -1, -1, 53, - -1, 55, -1, -1, 58, -1, -1, -1, -1, -1, + -1, 55, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 69, 70, 71, 72, -1, 74, -1, 76, -1, 78, -1, 80, -1, -1, -1, -1, 85, 86, 87, -1, -1, -1, -1, -1, 93, - -1, -1, -1, -1, -1, 99, 100, 101, 102, -1, + -1, -1, -1, -1, -1, -1, 100, 101, 102, -1, 104, -1, 106, 107, 108, 109, 110, -1, -1, -1, -1, -1, 116, 117, 118, 119, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 130, -1, -1, -1, @@ -1988,10 +1926,10 @@ const short QmlJSGrammar::action_check [] = { -1, -1, -1, 34, 35, -1, 37, -1, -1, -1, 41, -1, 43, 44, 45, -1, -1, 48, -1, -1, -1, -1, 53, -1, 55, -1, -1, -1, -1, -1, - -1, 62, -1, -1, -1, -1, -1, -1, 69, 70, + -1, -1, -1, -1, 65, -1, -1, -1, 69, 70, 71, 72, -1, 74, -1, 76, -1, 78, -1, 80, -1, -1, -1, -1, 85, 86, 87, -1, -1, -1, - -1, -1, 93, -1, -1, -1, -1, -1, 99, 100, + -1, -1, 93, -1, -1, -1, -1, -1, -1, 100, 101, 102, -1, 104, -1, 106, 107, 108, 109, 110, -1, -1, -1, -1, -1, 116, 117, 118, 119, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 130, @@ -2002,329 +1940,404 @@ const short QmlJSGrammar::action_check [] = { 48, -1, -1, -1, -1, 53, -1, 55, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 69, 70, 71, 72, -1, 74, -1, 76, -1, - 78, 79, 80, -1, -1, -1, -1, 85, 86, 87, - 88, 89, -1, -1, -1, 93, -1, -1, -1, -1, - -1, -1, 100, 101, 102, -1, 104, -1, 106, 107, + 78, -1, 80, -1, -1, -1, -1, 85, 86, 87, + -1, -1, -1, -1, -1, 93, -1, -1, -1, -1, + -1, 99, 100, 101, 102, -1, 104, -1, 106, 107, 108, 109, 110, -1, -1, -1, -1, -1, 116, 117, 118, 119, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 130, -1, -1, -1, 11, 12, 13, -1, -1, -1, -1, -1, -1, -1, -1, 22, 23, -1, - -1, -1, -1, -1, -1, 30, 31, -1, -1, 34, + -1, -1, -1, -1, -1, 30, -1, -1, -1, 34, 35, -1, 37, -1, -1, -1, 41, -1, 43, 44, 45, -1, -1, 48, -1, -1, -1, -1, 53, -1, - 55, -1, -1, -1, -1, -1, -1, -1, 63, -1, - -1, -1, -1, -1, 69, 70, 71, 72, 73, 74, - -1, 76, 77, 78, -1, 80, -1, 82, -1, -1, + 55, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 69, 70, 71, 72, -1, 74, + -1, 76, -1, 78, -1, 80, -1, -1, -1, -1, 85, 86, 87, -1, -1, -1, -1, -1, 93, -1, -1, -1, -1, -1, -1, 100, 101, 102, -1, 104, -1, 106, 107, 108, 109, 110, -1, -1, -1, -1, -1, 116, 117, 118, 119, -1, -1, -1, -1, -1, - -1, -1, 127, 128, -1, 130, -1, -1, -1, 11, + -1, -1, 127, -1, -1, 130, -1, -1, -1, 11, 12, 13, -1, -1, -1, -1, -1, -1, -1, -1, - 22, 23, -1, -1, -1, -1, -1, -1, 30, 31, + 22, 23, -1, -1, -1, -1, -1, -1, 30, -1, -1, -1, 34, 35, -1, 37, -1, -1, -1, 41, -1, 43, 44, 45, -1, -1, 48, -1, -1, -1, -1, 53, -1, 55, -1, -1, -1, -1, -1, -1, - -1, 63, -1, -1, -1, -1, -1, 69, 70, 71, - 72, 73, 74, -1, 76, 77, 78, -1, 80, -1, - 82, -1, -1, 85, 86, 87, -1, -1, -1, -1, - -1, 93, -1, -1, -1, -1, -1, -1, 100, 101, - 102, -1, 104, -1, 106, 107, 108, 109, 110, -1, - -1, -1, -1, -1, 116, 117, 118, 119, -1, -1, - -1, -1, -1, -1, -1, 127, 128, -1, 130, -1, - -1, -1, 4, 5, 6, -1, -1, 9, 10, 11, - -1, -1, 14, -1, 16, -1, -1, -1, 20, 21, - -1, 23, -1, -1, -1, -1, -1, -1, 30, 31, - 32, 33, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 44, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 61, - -1, -1, -1, -1, -1, -1, -1, -1, 70, 71, - 72, 73, 74, 75, -1, 77, 78, 79, 80, 81, - 82, -1, -1, 85, 86, 87, 88, 89, -1, 91, - 92, -1, -1, -1, -1, -1, 98, -1, -1, 101, - 102, 103, 104, 105, 106, 107, 108, -1, -1, -1, - -1, -1, 114, -1, 116, 117, 118, 119, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 130, -1, - -1, -1, 4, 5, 6, -1, -1, 9, 10, 11, - -1, -1, 14, -1, 16, -1, -1, -1, 20, 21, - -1, 23, -1, -1, -1, -1, -1, -1, 30, 31, - 32, 33, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 44, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 57, -1, -1, -1, 61, - -1, -1, -1, -1, -1, -1, -1, -1, 70, 71, - 72, 73, 74, 75, -1, 77, 78, 79, 80, 81, - 82, -1, -1, 85, 86, 87, 88, 89, -1, 91, - 92, -1, -1, -1, -1, -1, 98, -1, -1, 101, - 102, 103, 104, 105, 106, 107, 108, -1, -1, -1, - -1, -1, 114, -1, 116, 117, 118, 119, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 130, -1, - -1, -1, 4, 5, 6, -1, -1, 9, 10, 11, - -1, -1, 14, -1, 16, -1, -1, -1, 20, 21, - -1, 23, -1, -1, -1, -1, -1, -1, 30, 31, - 32, 33, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 44, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 57, -1, -1, -1, 61, - -1, -1, -1, -1, -1, -1, -1, -1, 70, 71, - 72, 73, 74, 75, -1, 77, 78, 79, 80, 81, - 82, -1, -1, 85, 86, 87, 88, 89, -1, 91, - 92, -1, -1, -1, -1, -1, 98, -1, -1, 101, - 102, 103, 104, 105, 106, 107, 108, -1, -1, -1, - -1, -1, 114, -1, 116, 117, 118, 119, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 130, -1, - -1, -1, 4, 5, 6, -1, -1, 9, 10, 11, - -1, -1, 14, -1, 16, -1, -1, -1, 20, 21, - -1, 23, -1, -1, -1, -1, -1, -1, 30, 31, - 32, 33, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 44, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 57, -1, -1, -1, 61, - -1, -1, -1, -1, -1, -1, -1, -1, 70, 71, - 72, 73, 74, 75, -1, 77, 78, 79, 80, 81, - 82, -1, -1, 85, 86, 87, 88, 89, -1, 91, - 92, -1, -1, -1, -1, -1, 98, -1, -1, 101, - 102, 103, 104, 105, 106, 107, 108, -1, -1, -1, - -1, -1, 114, -1, 116, 117, 118, 119, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 130, -1, - -1, -1, 4, 5, 6, -1, -1, 9, 10, 11, - -1, -1, 14, -1, 16, -1, -1, -1, 20, 21, - -1, 23, -1, -1, -1, -1, -1, -1, 30, 31, - 32, 33, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 44, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 57, -1, -1, -1, 61, - -1, -1, -1, -1, -1, -1, -1, -1, 70, 71, - 72, 73, 74, 75, -1, 77, 78, 79, 80, 81, - 82, -1, -1, 85, 86, 87, 88, 89, -1, 91, - 92, -1, -1, -1, -1, -1, 98, -1, -1, 101, - 102, 103, 104, 105, 106, 107, 108, -1, -1, -1, - -1, -1, 114, -1, 116, 117, 118, 119, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 130, -1, - -1, -1, 4, 5, 6, -1, -1, 9, 10, 11, - -1, -1, 14, -1, 16, -1, -1, -1, 20, 21, - -1, 23, -1, -1, -1, -1, -1, -1, 30, 31, - 32, 33, -1, 35, -1, -1, -1, -1, -1, -1, - -1, -1, 44, -1, -1, -1, 48, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 61, -1, -1, -1, -1, -1, -1, -1, 69, 70, 71, - 72, 73, 74, 75, -1, 77, 78, 79, 80, 81, - 82, -1, -1, 85, 86, 87, 88, 89, -1, 91, - 92, -1, -1, -1, -1, -1, 98, -1, -1, 101, - 102, 103, 104, 105, 106, 107, 108, -1, -1, -1, - -1, -1, 114, -1, 116, 117, 118, 119, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 130, -1, - -1, -1, 4, 5, 6, -1, -1, 9, 10, 11, - -1, -1, 14, -1, 16, -1, -1, -1, 20, 21, - -1, 23, -1, -1, -1, -1, -1, -1, 30, 31, - 32, 33, -1, 35, -1, -1, -1, -1, -1, -1, - -1, -1, 44, -1, -1, -1, 48, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 61, - -1, -1, -1, 65, -1, -1, -1, 69, 70, 71, - 72, 73, 74, 75, -1, 77, 78, 79, 80, 81, - 82, -1, -1, 85, 86, 87, 88, 89, -1, 91, - 92, -1, -1, -1, -1, -1, 98, -1, -1, 101, - 102, 103, 104, 105, 106, 107, 108, -1, -1, -1, - -1, -1, 114, -1, 116, 117, 118, 119, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 130, -1, - -1, -1, 4, 5, 6, -1, -1, 9, 10, 11, - -1, -1, 14, -1, 16, -1, -1, -1, 20, 21, - -1, 23, -1, -1, -1, -1, -1, -1, 30, 31, - 32, 33, -1, 35, -1, -1, -1, -1, -1, -1, - -1, -1, 44, -1, -1, -1, 48, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 61, - -1, 63, -1, 65, -1, -1, -1, 69, 70, 71, - 72, 73, 74, 75, -1, 77, 78, 79, 80, 81, - 82, -1, -1, 85, 86, 87, 88, 89, -1, 91, - 92, -1, -1, -1, -1, -1, 98, -1, -1, 101, - 102, 103, 104, 105, 106, 107, 108, -1, -1, -1, - -1, -1, 114, -1, 116, 117, 118, 119, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 130, -1, - -1, -1, 4, 5, 6, -1, -1, 9, 10, 11, - -1, -1, 14, -1, 16, -1, -1, -1, 20, 21, - -1, 23, -1, -1, -1, -1, -1, -1, 30, 31, - 32, 33, -1, 35, -1, -1, -1, -1, -1, -1, - -1, -1, 44, -1, -1, -1, 48, -1, -1, -1, - -1, -1, -1, -1, -1, 57, -1, -1, -1, 61, - -1, -1, -1, 65, -1, -1, -1, 69, 70, 71, - 72, 73, 74, 75, -1, 77, 78, 79, 80, 81, - 82, -1, -1, 85, 86, 87, 88, 89, -1, 91, - 92, -1, -1, -1, -1, -1, 98, -1, -1, 101, - 102, 103, 104, 105, 106, 107, 108, -1, -1, -1, - -1, -1, 114, -1, 116, 117, 118, 119, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 130, -1, - -1, -1, 4, 5, 6, -1, -1, 9, 10, 11, - -1, -1, 14, -1, 16, -1, -1, -1, 20, 21, - -1, 23, -1, -1, -1, -1, -1, -1, 30, 31, - 32, 33, -1, 35, -1, -1, -1, -1, -1, -1, - -1, -1, 44, -1, -1, -1, 48, -1, -1, -1, - -1, -1, -1, -1, -1, 57, -1, -1, -1, 61, - -1, -1, -1, 65, -1, -1, -1, 69, 70, 71, - 72, 73, 74, 75, -1, 77, 78, 79, 80, 81, - 82, -1, -1, 85, 86, 87, 88, 89, -1, 91, - 92, -1, -1, -1, -1, -1, 98, -1, -1, 101, - 102, 103, 104, 105, 106, 107, 108, -1, -1, -1, - -1, -1, 114, -1, 116, 117, 118, 119, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 130, -1, - -1, -1, 4, -1, -1, -1, -1, 9, -1, 11, - 12, 13, 14, -1, -1, -1, -1, -1, -1, 21, - 22, 23, -1, -1, -1, -1, -1, -1, 30, 31, - -1, -1, 34, 35, -1, 37, -1, -1, -1, 41, - -1, 43, 44, 45, -1, -1, 48, -1, -1, -1, - -1, 53, -1, 55, -1, -1, -1, -1, -1, 61, - -1, 63, -1, -1, -1, -1, -1, 69, 70, 71, - 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, - 82, -1, -1, 85, 86, 87, -1, -1, -1, 91, + 72, -1, 74, -1, 76, -1, 78, -1, 80, -1, + -1, -1, -1, 85, 86, 87, -1, -1, -1, -1, -1, 93, -1, -1, -1, -1, -1, -1, 100, 101, 102, -1, 104, -1, 106, 107, 108, 109, 110, -1, -1, -1, -1, -1, 116, 117, 118, 119, -1, -1, -1, -1, -1, -1, -1, -1, 128, -1, 130, -1, - -1, -1, 4, -1, -1, -1, -1, 9, -1, 11, - 12, 13, 14, -1, -1, -1, -1, -1, -1, 21, - 22, 23, -1, -1, -1, -1, -1, -1, 30, 31, - -1, -1, 34, 35, -1, 37, -1, -1, -1, 41, - -1, 43, 44, 45, -1, -1, 48, -1, -1, -1, - -1, 53, -1, 55, -1, -1, -1, -1, -1, 61, - -1, 63, -1, -1, -1, -1, -1, 69, 70, 71, - 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, - 82, -1, -1, 85, 86, 87, -1, -1, -1, 91, - -1, 93, -1, -1, -1, -1, -1, -1, 100, 101, - 102, -1, 104, -1, 106, 107, 108, 109, 110, -1, - -1, -1, -1, -1, 116, 117, 118, 119, -1, -1, - -1, -1, -1, -1, -1, 127, 128, -1, 130, -1, - -1, -1, 4, -1, -1, -1, -1, 9, -1, 11, - 12, 13, 14, -1, -1, -1, -1, -1, -1, 21, - 22, 23, -1, -1, -1, -1, -1, -1, 30, 31, - -1, -1, 34, 35, -1, 37, -1, -1, -1, 41, - -1, 43, 44, 45, -1, -1, 48, -1, -1, -1, - -1, 53, -1, 55, -1, -1, -1, -1, -1, 61, - -1, 63, -1, -1, -1, -1, -1, 69, 70, 71, - 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, - 82, -1, -1, 85, 86, 87, -1, -1, -1, 91, - -1, 93, -1, -1, -1, -1, -1, -1, 100, 101, - 102, -1, 104, -1, 106, 107, 108, 109, 110, -1, - -1, -1, -1, -1, 116, 117, 118, 119, -1, -1, - -1, -1, -1, -1, -1, 127, 128, -1, 130, -1, - -1, -1, 4, -1, -1, -1, -1, 9, -1, 11, - 12, 13, 14, -1, -1, -1, -1, -1, -1, 21, - 22, 23, -1, -1, -1, -1, -1, -1, 30, 31, - -1, -1, 34, 35, -1, 37, -1, -1, -1, 41, - -1, 43, 44, 45, -1, -1, 48, -1, -1, -1, - -1, 53, -1, 55, -1, -1, -1, -1, -1, 61, - -1, 63, -1, -1, -1, -1, -1, 69, 70, 71, - 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, - 82, -1, -1, 85, 86, 87, -1, -1, -1, 91, - -1, 93, -1, -1, -1, -1, -1, -1, 100, 101, - 102, -1, 104, -1, 106, 107, 108, 109, 110, -1, - -1, -1, -1, -1, 116, 117, 118, 119, -1, -1, - -1, -1, -1, -1, -1, 127, 128, -1, 130, -1, - -1, -1, + -1, -1, 11, 12, 13, -1, -1, -1, -1, -1, + -1, -1, -1, 22, 23, -1, -1, -1, -1, -1, + -1, 30, -1, -1, -1, 34, 35, -1, 37, -1, + -1, -1, 41, -1, 43, 44, 45, -1, -1, 48, + -1, -1, -1, -1, 53, -1, 55, -1, -1, 58, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 69, 70, 71, 72, -1, 74, -1, 76, -1, 78, + -1, 80, -1, -1, -1, -1, 85, 86, 87, -1, + -1, -1, -1, -1, 93, -1, -1, -1, -1, -1, + 99, 100, 101, 102, -1, 104, -1, 106, 107, 108, + 109, 110, -1, -1, -1, -1, -1, 116, 117, 118, + 119, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 130, -1, -1, -1, 11, 12, 13, -1, -1, + -1, -1, -1, -1, -1, -1, 22, 23, -1, -1, + -1, -1, -1, -1, 30, -1, -1, -1, 34, 35, + -1, 37, -1, -1, -1, 41, -1, 43, 44, 45, + -1, -1, 48, -1, -1, -1, -1, 53, -1, 55, + -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, + -1, -1, -1, 69, 70, 71, 72, -1, 74, -1, + 76, -1, 78, -1, 80, -1, -1, -1, -1, 85, + 86, 87, -1, -1, -1, -1, -1, 93, -1, -1, + -1, -1, -1, 99, 100, 101, 102, -1, 104, -1, + 106, 107, 108, 109, 110, -1, -1, -1, -1, -1, + 116, 117, 118, 119, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 130, -1, -1, -1, 11, 12, + 13, -1, -1, -1, -1, -1, -1, -1, -1, 22, + 23, -1, -1, -1, -1, -1, -1, 30, -1, -1, + -1, 34, 35, -1, 37, -1, -1, -1, 41, -1, + 43, 44, 45, -1, -1, 48, -1, -1, -1, -1, + 53, -1, 55, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 69, 70, 71, 72, + -1, 74, -1, 76, -1, 78, 79, 80, -1, -1, + -1, -1, 85, 86, 87, 88, 89, -1, -1, -1, + 93, -1, -1, -1, -1, -1, -1, 100, 101, 102, + -1, 104, -1, 106, 107, 108, 109, 110, -1, -1, + -1, -1, -1, 116, 117, 118, 119, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 130, -1, -1, + -1, 11, 12, 13, -1, -1, -1, -1, -1, -1, + -1, -1, 22, 23, -1, -1, -1, -1, -1, -1, + 30, 31, -1, -1, 34, 35, -1, 37, -1, -1, + -1, 41, -1, 43, 44, 45, -1, -1, 48, -1, + -1, -1, -1, 53, -1, 55, -1, -1, -1, -1, + -1, -1, -1, 63, -1, -1, -1, -1, -1, 69, + 70, 71, 72, 73, 74, -1, 76, 77, 78, -1, + 80, -1, 82, -1, -1, 85, 86, 87, -1, -1, + -1, -1, -1, 93, -1, -1, -1, -1, -1, -1, + 100, 101, 102, -1, 104, -1, 106, 107, 108, 109, + 110, -1, -1, -1, -1, -1, 116, 117, 118, 119, + -1, -1, -1, -1, -1, -1, -1, 127, 128, -1, + 130, -1, -1, -1, 11, 12, 13, -1, -1, -1, + -1, -1, -1, -1, -1, 22, 23, -1, -1, -1, + -1, -1, -1, 30, 31, -1, -1, 34, 35, -1, + 37, -1, -1, -1, 41, -1, 43, 44, 45, -1, + -1, 48, -1, -1, -1, -1, 53, -1, 55, -1, + -1, -1, -1, -1, -1, -1, 63, -1, -1, -1, + -1, -1, 69, 70, 71, 72, 73, 74, -1, 76, + 77, 78, -1, 80, -1, 82, -1, -1, 85, 86, + 87, -1, -1, -1, -1, -1, 93, -1, -1, -1, + -1, -1, -1, 100, 101, 102, -1, 104, -1, 106, + 107, 108, 109, 110, -1, -1, -1, -1, -1, 116, + 117, 118, 119, -1, -1, -1, -1, -1, -1, -1, + 127, 128, -1, 130, -1, -1, -1, 4, 5, 6, + -1, -1, 9, 10, 11, -1, -1, 14, -1, 16, + -1, -1, -1, 20, 21, -1, 23, -1, -1, -1, + -1, -1, -1, 30, 31, 32, 33, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 44, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 61, -1, -1, -1, -1, -1, + -1, -1, -1, 70, 71, 72, 73, 74, 75, -1, + 77, 78, 79, 80, 81, 82, -1, -1, 85, 86, + 87, 88, 89, -1, 91, 92, -1, -1, -1, -1, + -1, 98, -1, -1, 101, 102, 103, 104, 105, 106, + 107, 108, -1, -1, -1, -1, -1, 114, -1, 116, + 117, 118, 119, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 130, -1, -1, -1, 4, 5, 6, + -1, -1, 9, 10, 11, -1, -1, 14, -1, 16, + -1, -1, -1, 20, 21, -1, 23, -1, -1, -1, + -1, -1, -1, 30, 31, 32, 33, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 44, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 57, -1, -1, -1, 61, -1, -1, -1, -1, -1, + -1, -1, -1, 70, 71, 72, 73, 74, 75, -1, + 77, 78, 79, 80, 81, 82, -1, -1, 85, 86, + 87, 88, 89, -1, 91, 92, -1, -1, -1, -1, + -1, 98, -1, -1, 101, 102, 103, 104, 105, 106, + 107, 108, -1, -1, -1, -1, -1, 114, -1, 116, + 117, 118, 119, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 130, -1, -1, -1, 4, 5, 6, + -1, -1, 9, 10, 11, -1, -1, 14, -1, 16, + -1, -1, -1, 20, 21, -1, 23, -1, -1, -1, + -1, -1, -1, 30, 31, 32, 33, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 44, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 57, -1, -1, -1, 61, -1, -1, -1, -1, -1, + -1, -1, -1, 70, 71, 72, 73, 74, 75, -1, + 77, 78, 79, 80, 81, 82, -1, -1, 85, 86, + 87, 88, 89, -1, 91, 92, -1, -1, -1, -1, + -1, 98, -1, -1, 101, 102, 103, 104, 105, 106, + 107, 108, -1, -1, -1, -1, -1, 114, -1, 116, + 117, 118, 119, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 130, -1, -1, -1, 4, 5, 6, + -1, -1, 9, 10, 11, -1, -1, 14, -1, 16, + -1, -1, -1, 20, 21, -1, 23, -1, -1, -1, + -1, -1, -1, 30, 31, 32, 33, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 44, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 57, -1, -1, -1, 61, -1, -1, -1, -1, -1, + -1, -1, -1, 70, 71, 72, 73, 74, 75, -1, + 77, 78, 79, 80, 81, 82, -1, -1, 85, 86, + 87, 88, 89, -1, 91, 92, -1, -1, -1, -1, + -1, 98, -1, -1, 101, 102, 103, 104, 105, 106, + 107, 108, -1, -1, -1, -1, -1, 114, -1, 116, + 117, 118, 119, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 130, -1, -1, -1, 4, 5, 6, + -1, -1, 9, 10, 11, -1, -1, 14, -1, 16, + -1, -1, -1, 20, 21, -1, 23, -1, -1, -1, + -1, -1, -1, 30, 31, 32, 33, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 44, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 57, -1, -1, -1, 61, -1, -1, -1, -1, -1, + -1, -1, -1, 70, 71, 72, 73, 74, 75, -1, + 77, 78, 79, 80, 81, 82, -1, -1, 85, 86, + 87, 88, 89, -1, 91, 92, -1, -1, -1, -1, + -1, 98, -1, -1, 101, 102, 103, 104, 105, 106, + 107, 108, -1, -1, -1, -1, -1, 114, -1, 116, + 117, 118, 119, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 130, -1, -1, -1, 4, 5, 6, + -1, -1, 9, 10, 11, -1, -1, 14, -1, 16, + -1, -1, -1, 20, 21, -1, 23, -1, -1, -1, + -1, -1, -1, 30, 31, 32, 33, -1, 35, -1, + -1, -1, -1, -1, -1, -1, -1, 44, -1, -1, + -1, 48, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 61, -1, -1, -1, -1, -1, + -1, -1, 69, 70, 71, 72, 73, 74, 75, -1, + 77, 78, 79, 80, 81, 82, -1, -1, 85, 86, + 87, 88, 89, -1, 91, 92, -1, -1, -1, -1, + -1, 98, -1, -1, 101, 102, 103, 104, 105, 106, + 107, 108, -1, -1, -1, -1, -1, 114, -1, 116, + 117, 118, 119, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 130, -1, -1, -1, 4, 5, 6, + -1, -1, 9, 10, 11, -1, -1, 14, -1, 16, + -1, -1, -1, 20, 21, -1, 23, -1, -1, -1, + -1, -1, -1, 30, 31, 32, 33, -1, 35, -1, + -1, -1, -1, -1, -1, -1, -1, 44, -1, -1, + -1, 48, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 61, -1, -1, -1, 65, -1, + -1, -1, 69, 70, 71, 72, 73, 74, 75, -1, + 77, 78, 79, 80, 81, 82, -1, -1, 85, 86, + 87, 88, 89, -1, 91, 92, -1, -1, -1, -1, + -1, 98, -1, -1, 101, 102, 103, 104, 105, 106, + 107, 108, -1, -1, -1, -1, -1, 114, -1, 116, + 117, 118, 119, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 130, -1, -1, -1, 4, 5, 6, + -1, -1, 9, 10, 11, -1, -1, 14, -1, 16, + -1, -1, -1, 20, 21, -1, 23, -1, -1, -1, + -1, -1, -1, 30, 31, 32, 33, -1, 35, -1, + -1, -1, -1, -1, -1, -1, -1, 44, -1, -1, + -1, 48, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 61, -1, 63, -1, 65, -1, + -1, -1, 69, 70, 71, 72, 73, 74, 75, -1, + 77, 78, 79, 80, 81, 82, -1, -1, 85, 86, + 87, 88, 89, -1, 91, 92, -1, -1, -1, -1, + -1, 98, -1, -1, 101, 102, 103, 104, 105, 106, + 107, 108, -1, -1, -1, -1, -1, 114, -1, 116, + 117, 118, 119, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 130, -1, -1, -1, 4, 5, 6, + -1, -1, 9, 10, 11, -1, -1, 14, -1, 16, + -1, -1, -1, 20, 21, -1, 23, -1, -1, -1, + -1, -1, -1, 30, 31, 32, 33, -1, 35, -1, + -1, -1, -1, -1, -1, -1, -1, 44, -1, -1, + -1, 48, -1, -1, -1, -1, -1, -1, -1, -1, + 57, -1, -1, -1, 61, -1, -1, -1, 65, -1, + -1, -1, 69, 70, 71, 72, 73, 74, 75, -1, + 77, 78, 79, 80, 81, 82, -1, -1, 85, 86, + 87, 88, 89, -1, 91, 92, -1, -1, -1, -1, + -1, 98, -1, -1, 101, 102, 103, 104, 105, 106, + 107, 108, -1, -1, -1, -1, -1, 114, -1, 116, + 117, 118, 119, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 130, -1, -1, -1, 4, 5, 6, + -1, -1, 9, 10, 11, -1, -1, 14, -1, 16, + -1, -1, -1, 20, 21, -1, 23, -1, -1, -1, + -1, -1, -1, 30, 31, 32, 33, -1, 35, -1, + -1, -1, -1, -1, -1, -1, -1, 44, -1, -1, + -1, 48, -1, -1, -1, -1, -1, -1, -1, -1, + 57, -1, -1, -1, 61, -1, -1, -1, 65, -1, + -1, -1, 69, 70, 71, 72, 73, 74, 75, -1, + 77, 78, 79, 80, 81, 82, -1, -1, 85, 86, + 87, 88, 89, -1, 91, 92, -1, -1, -1, -1, + -1, 98, -1, -1, 101, 102, 103, 104, 105, 106, + 107, 108, -1, -1, -1, -1, -1, 114, -1, 116, + 117, 118, 119, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 130, -1, -1, -1, 4, -1, -1, + -1, -1, 9, -1, 11, 12, 13, 14, -1, -1, + -1, -1, -1, -1, 21, 22, 23, -1, -1, -1, + -1, -1, -1, 30, 31, -1, -1, 34, 35, -1, + 37, -1, -1, -1, 41, -1, 43, 44, 45, -1, + -1, 48, -1, -1, -1, -1, 53, -1, 55, -1, + -1, -1, -1, -1, 61, -1, 63, -1, -1, -1, + -1, -1, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, -1, -1, 85, 86, + 87, -1, -1, -1, 91, -1, 93, -1, -1, -1, + -1, -1, -1, 100, 101, 102, -1, 104, -1, 106, + 107, 108, 109, 110, -1, -1, -1, -1, -1, 116, + 117, 118, 119, -1, -1, -1, -1, -1, -1, -1, + -1, 128, -1, 130, -1, -1, -1, 4, -1, -1, + -1, -1, 9, -1, 11, 12, 13, 14, -1, -1, + -1, -1, -1, -1, 21, 22, 23, -1, -1, -1, + -1, -1, -1, 30, 31, -1, -1, 34, 35, -1, + 37, -1, -1, -1, 41, -1, 43, 44, 45, -1, + -1, 48, -1, -1, -1, -1, 53, -1, 55, -1, + -1, -1, -1, -1, 61, -1, 63, -1, -1, -1, + -1, -1, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, -1, -1, 85, 86, + 87, -1, -1, -1, 91, -1, 93, -1, -1, -1, + -1, -1, -1, 100, 101, 102, -1, 104, -1, 106, + 107, 108, 109, 110, -1, -1, -1, -1, -1, 116, + 117, 118, 119, -1, -1, -1, -1, -1, -1, -1, + 127, 128, -1, 130, -1, -1, -1, 4, -1, -1, + -1, -1, 9, -1, 11, 12, 13, 14, -1, -1, + -1, -1, -1, -1, 21, 22, 23, -1, -1, -1, + -1, -1, -1, 30, 31, -1, -1, 34, 35, -1, + 37, -1, -1, -1, 41, -1, 43, 44, 45, -1, + -1, 48, -1, -1, -1, -1, 53, -1, 55, -1, + -1, -1, -1, -1, 61, -1, 63, -1, -1, -1, + -1, -1, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, -1, -1, 85, 86, + 87, -1, -1, -1, 91, -1, 93, -1, -1, -1, + -1, -1, -1, 100, 101, 102, -1, 104, -1, 106, + 107, 108, 109, 110, -1, -1, -1, -1, -1, 116, + 117, 118, 119, -1, -1, -1, -1, -1, -1, -1, + 127, 128, -1, 130, -1, -1, -1, 4, -1, -1, + -1, -1, 9, -1, 11, 12, 13, 14, -1, -1, + -1, -1, -1, -1, 21, 22, 23, -1, -1, -1, + -1, -1, -1, 30, 31, -1, -1, 34, 35, -1, + 37, -1, -1, -1, 41, -1, 43, 44, 45, -1, + -1, 48, -1, -1, -1, -1, 53, -1, 55, -1, + -1, -1, -1, -1, 61, -1, 63, -1, -1, -1, + -1, -1, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, -1, -1, 85, 86, + 87, -1, -1, -1, 91, -1, 93, -1, -1, -1, + -1, -1, -1, 100, 101, 102, -1, 104, -1, 106, + 107, 108, 109, 110, -1, -1, -1, -1, -1, 116, + 117, 118, 119, -1, -1, -1, -1, -1, -1, -1, + 127, 128, -1, 130, -1, -1, -1, - 86, 206, 205, 196, 206, 205, 196, 78, 20, 15, - 204, 78, 198, 76, 197, 15, 196, 62, 71, 198, - 197, 196, 62, 20, 120, 212, 115, 71, 212, 15, - 71, 15, 210, 71, 210, 209, 14, 24, 15, 24, - 43, 78, 97, 73, 20, 197, 57, 43, 20, 15, - 15, 139, 15, 115, 15, 15, 120, 73, 57, 47, - 15, 71, 32, 96, 86, 78, 73, 62, 73, 15, - 225, 20, 73, 226, 78, 37, 43, 192, 37, 37, - 15, 20, 159, 159, 78, 186, 189, 15, 62, 203, - 73, 73, 196, 198, 15, 197, 43, 78, 196, 205, - 210, 196, 15, 212, 73, 196, 206, 206, 205, 62, - 24, 204, 32, 198, 71, 197, 196, 62, 225, 198, - 62, 62, 197, 196, 198, 197, 15, 197, 196, 198, - 15, 43, 20, 20, 71, 73, 86, 62, 57, 73, - 71, 20, 78, 209, 196, 78, 78, 204, 78, 78, - 15, 78, 15, 15, 78, 78, 47, 43, 57, 57, - 76, 83, 62, 36, 15, 62, 159, 37, 78, 62, - 96, 32, 196, 198, 197, 24, 94, 86, 62, 96, - 95, 62, 62, 94, 198, 15, 78, 196, 96, 197, - 73, 96, 96, 20, 47, 73, 78, 43, 15, 15, - 57, 78, 15, 183, 73, 20, 43, 2, 2, 32, - 2, 32, 76, 73, 73, 57, 2, 57, 58, 57, - 78, 2, 80, 57, 58, 57, 58, 20, 78, 79, - 78, 78, 73, 74, 11, 12, 32, 32, 32, 35, - 32, 2, 78, 57, 73, 73, 32, 32, 73, 15, - 43, 32, 20, 101, 101, 15, 32, 2, 57, 58, - 154, 73, 2, 2, 53, 101, 57, 58, 2, 57, - 58, 32, 2, 57, 2, 43, -1, 57, 92, 57, - 58, 141, 141, 57, 58, 57, 32, 32, 228, 229, - 57, 57, 32, 32, 57, 58, -1, 57, 32, 57, - 194, 57, 32, 57, 32, 57, 58, 57, 92, 57, - 58, -1, 141, 141, 57, 57, 141, 181, -1, 57, - 92, 88, 57, 58, 57, 58, 105, 74, 75, 141, - 88, 78, 88, 112, 72, 89, 57, 58, 161, 160, - 57, 58, 92, 57, 58, 57, 58, 57, 58, 57, + 73, 86, 206, 205, 78, 196, 206, 205, 196, 76, + 73, 71, 15, 20, 204, 198, 197, 196, 62, 196, + 198, 197, 62, 78, 78, 71, 212, 78, 212, 78, + 71, 73, 20, 15, 15, 210, 210, 209, 120, 97, + 20, 71, 78, 20, 73, 115, 43, 78, 71, 15, + 15, 78, 20, 15, 115, 15, 71, 15, 78, 14, + 24, 120, 57, 96, 86, 57, 225, 78, 62, 226, + 15, 73, 78, 15, 24, 73, 37, 15, 83, 15, + 37, 192, 15, 159, 197, 197, 62, 43, 159, 196, + 198, 186, 20, 196, 73, 205, 189, 206, 212, 73, + 96, 15, 32, 73, 210, 57, 206, 205, 71, 196, + 204, 62, 198, 197, 62, 196, 57, 76, 43, 198, + 225, 96, 197, 62, 196, 62, 20, 15, 196, 198, + 15, 197, 78, 62, 78, 36, 57, 37, 139, 196, + 62, 197, 96, 86, 209, 198, 196, 15, 15, 32, + 43, 43, 15, 198, 78, 15, 204, 62, 197, 159, + 78, 96, 96, 78, 196, 78, 73, 94, 78, 73, + 196, 62, 62, 197, 15, 15, 37, 198, 24, 95, + 78, 62, 94, 57, 86, 15, 62, 73, 32, 71, + 15, 15, 15, 43, 15, 73, 183, 2, 20, 203, + 20, 20, 20, 73, 43, 43, 2, 73, 2, 46, + 47, 46, 47, 2, 73, 73, 73, 73, 2, 2, + 53, 76, 20, 57, 58, 57, 58, 32, 15, 46, + 47, 57, 58, 32, 15, 20, 32, 32, 32, 228, + 229, 57, 58, 32, 57, 43, 57, 58, 32, 32, + 57, 57, 58, 32, 57, 57, 57, 57, 43, 2, + 32, 2, 2, 35, 57, 58, 2, 57, 58, 57, + 57, 141, 2, 32, 154, 141, 57, 11, 12, 32, + 57, 88, 141, 141, 141, 141, 89, 88, 2, 32, + 92, 32, 32, 73, 74, 57, 32, 57, 58, 57, + 78, 79, 32, 57, 92, 57, 58, 57, 58, 78, + 78, 78, 57, 57, 194, 92, -1, 78, 32, 80, + 57, 58, 57, 58, 57, 24, 181, 74, 75, 105, + 92, 78, 101, 101, 101, 57, 112, 57, 58, 57, + 58, 57, 58, -1, 88, 57, 58, 92, 57, 58, + 57, 58, 57, 58, 57, 88, 89, 57, 58, 57, + 58, 194, 161, 3, 159, 57, 58, 57, 58, 72, 92, 57, 58, 57, 58, 57, 58, 57, 58, 57, - 58, 57, 58, 32, 57, 58, 57, 105, -1, 211, - 57, 58, 53, 211, 55, 15, 161, 57, 58, -1, - 88, 89, -1, 159, 57, 58, 57, 58, -1, 46, - 47, -1, 88, 50, 57, 58, 57, 58, 57, 58, - -1, 92, 57, 58, 81, 194, 57, 58, 57, 58, - 57, 57, 92, 57, 58, 161, 57, 58, 57, 57, - 57, 58, -1, 202, 57, 58, 72, -1, 105, 81, - 57, 211, 57, 72, 72, 112, -1, 84, 57, 58, - -1, 88, 89, -1, -1, 72, 46, 72, 57, 182, - 50, 51, 52, 105, -1, 92, 57, 3, 175, 105, - 112, 57, -1, 72, 57, 58, 105, 105, -1, 150, - 81, 72, 57, 216, 195, 175, 72, 175, 105, 81, - 105, 195, 175, 195, 130, 195, 111, 72, 126, 128, - -1, 195, 161, 195, 105, 230, 105, 124, 17, -1, - -1, 112, 111, 105, 105, 57, 58, 108, 195, 105, - 112, 53, 175, 194, 175, 111, 57, 57, 57, 58, - 105, -1, 74, 3, 230, 202, 175, -1, 199, 57, - 171, 72, 72, 118, 175, 74, 195, 81, 57, 172, - 195, -1, 175, 81, 72, 236, -1, 17, -1, -1, - 202, -1, 221, 72, 173, 57, 175, 230, 209, 105, - 204, 105, 57, 58, 105, 105, 112, 105, 112, 57, - 72, 112, 112, 81, 112, 81, -1, 105, 171, 98, - 108, 57, 175, -1, 72, 81, 57, 57, -1, -1, - 57, 202, -1, 88, -1, 232, 72, 105, 57, 105, - 202, 72, 72, 105, 112, 72, 112, 109, -1, 105, - 152, 57, 154, 72, -1, -1, 112, 105, -1, -1, - 57, 109, 57, -1, -1, 105, 72, -1, 98, 105, - 182, -1, 112, 57, 105, 72, 112, 72, 105, 106, - 107, -1, 113, 182, -1, -1, 105, 57, 72, 17, - 57, -1, 194, -1, -1, 3, 202, 17, 202, 105, - 106, 107, 72, 122, 202, 72, 208, 27, 105, 57, - 105, 106, 107, -1, 17, 112, -1, -1, 57, -1, - -1, 105, 106, 107, 72, 180, -1, 30, -1, 57, - 127, -1, 57, 72, 202, 105, 202, 57, 105, 106, - 107, 57, 112, 17, 72, 57, 202, 72, -1, -1, - 57, 58, 72, 27, 57, 125, 72, 105, -1, -1, - 72, 57, 202, -1, 112, -1, 105, 74, 75, 72, - 98, 119, 57, 112, 102, 114, 72, -1, 98, 57, - 105, 106, 107, 57, -1, -1, 17, 72, 57, 105, - 106, 107, 17, 105, 72, 98, 27, 105, 72, -1, - 112, -1, 17, 72, 112, 30, -1, -1, -1, 105, - 25, 123, 27, -1, -1, -1, 112, -1, -1, 17, - 105, 106, 107, -1, 98, -1, 57, 105, -1, 27, - -1, 29, 57, 129, 112, -1, 105, 106, 107, -1, - -1, 72, 57, 121, -1, 17, 36, 72, 38, 39, - 40, 41, 42, 17, 162, 163, 17, 72, 30, -1, - -1, 17, -1, 17, 4, -1, 30, 98, -1, 30, - 26, 27, -1, 98, -1, 182, 30, 17, -1, -1, - 78, 79, -1, 98, -1, 57, -1, -1, 60, -1, - 30, 55, -1, 57, 202, -1, 57, 4, -1, 60, - 72, 57, -1, 57, -1, -1, 60, -1, 72, -1, - 17, 72, -1, -1, 17, 55, 72, 57, 72, -1, - -1, -1, 25, 30, -1, -1, 98, 30, 31, -1, - -1, -1, 72, -1, 98, -1, -1, 98, 17, -1, - -1, -1, 98, -1, 98, -1, -1, -1, 55, -1, - 57, 30, 55, 17, 57, -1, -1, 36, 98, 38, - 39, 40, 41, 42, -1, 72, 30, -1, -1, 72, - -1, -1, 36, -1, 38, 39, 40, 41, 42, 17, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 98, 30, -1, -1, 98, -1, -1, 36, -1, + 58, -1, 161, 46, 47, 57, 58, 50, 57, 58, + 57, 58, 57, 58, -1, 57, 58, 57, 58, 57, + 58, 160, 105, 216, 88, 81, 81, 57, 161, 17, + 92, 211, -1, 57, -1, 81, -1, 81, -1, 57, + 57, -1, 72, 57, 58, -1, 202, 81, 72, 105, + 105, 57, 58, -1, 72, 72, 112, 112, -1, 105, + -1, 105, 57, 58, -1, 81, 112, -1, 112, 57, + -1, 105, -1, 211, -1, 105, -1, 211, 112, 74, + 195, 105, 199, -1, 72, 105, 175, 105, 105, 105, + 57, 58, 112, 57, 124, 195, 112, 195, 122, 195, + -1, 46, 57, 58, 182, 50, 51, 52, 72, 175, + 98, 128, 130, -1, -1, 195, 57, 204, 81, 57, + 58, 88, -1, 195, 209, 195, 175, 57, 58, 57, + 175, 72, 3, 175, 236, 175, 74, 175, 230, -1, + 57, 105, 105, 195, 72, 57, 202, 202, 195, 112, + 57, -1, 57, 53, 118, 72, 202, 171, 202, 32, + 72, 175, 92, 57, 105, 72, 172, 108, 202, 175, + 230, 81, 230, -1, 57, 57, 57, 105, 72, 84, + -1, 17, 202, 88, 89, 113, 202, 182, 105, 72, + 72, 72, 57, 105, 53, 105, 55, 57, 105, -1, + 112, 81, 112, 57, 58, 112, -1, 72, -1, 126, + -1, 105, 72, 180, -1, 57, 171, -1, 112, -1, + 175, 57, 105, 105, 105, 105, -1, 108, 111, 111, + 72, -1, 112, 57, 105, -1, 72, -1, -1, 202, + 105, 112, -1, 17, 182, 105, 111, -1, 72, 109, + -1, 57, 152, 27, 154, 29, -1, 17, 57, -1, + -1, 57, 98, 105, 106, 107, 72, 27, 57, 58, + -1, -1, -1, 72, 17, 57, 72, -1, 57, -1, + -1, 105, 106, 107, 27, 74, 75, -1, 161, -1, + 72, 150, 202, 72, 194, -1, 17, 57, -1, 105, + 106, 107, 232, 17, 78, 79, 105, 17, 208, 105, + 106, 107, 72, 112, 57, 57, 30, 27, 57, 173, + 119, 175, 202, 105, 106, 107, 105, 106, 107, 72, + 72, 202, -1, 72, 57, 194, 57, 57, 98, -1, + -1, 3, 57, 57, 57, -1, 57, 57, 221, 72, + -1, 72, 72, -1, -1, 98, 57, 72, 72, 72, + 17, 72, 72, 105, -1, 57, 105, 106, 107, -1, + 112, 72, 114, 30, -1, -1, 57, 98, -1, -1, + 72, 102, 105, -1, 98, 105, 106, 107, 98, 112, + 105, 72, 105, 182, 105, -1, 17, 112, 17, 112, + 57, 112, 125, 60, 105, -1, 25, -1, 27, 30, + 123, 112, 127, 105, -1, 72, -1, 109, 129, -1, + 121, 17, -1, -1, 105, 106, 107, 36, -1, 38, + 39, 40, 41, 42, 30, 17, 57, -1, 57, 60, + -1, 98, 17, 105, 26, 27, -1, -1, -1, 17, + 112, 72, -1, 72, -1, 30, -1, 4, 4, -1, + -1, 57, 30, -1, 60, -1, -1, -1, -1, -1, + 17, 17, -1, -1, -1, 57, 72, 98, -1, 98, + 55, -1, 57, 30, 30, -1, -1, -1, -1, 57, + 72, -1, 60, -1, -1, -1, -1, 72, -1, 17, + 162, 163, 98, -1, 72, -1, -1, 25, 55, 55, + 57, 57, 30, 31, -1, -1, 98, -1, -1, -1, + -1, -1, -1, 98, -1, 72, 72, -1, -1, -1, + 98, -1, -1, -1, -1, -1, -1, 55, -1, 57, + 202, -1, 17, -1, -1, -1, 17, -1, -1, 17, + -1, 98, 98, -1, 72, 30, -1, -1, -1, 30, + -1, 36, 30, 38, 39, 40, 41, 42, 36, -1, 38, 39, 40, 41, 42, -1, -1, -1, -1, -1, + 98, -1, -1, -1, -1, -1, 57, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 72, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 98, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 17, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 30, -1, -1, -1, -1, -1, 36, -1, 38, 39, + 40, 41, 42, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 17, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 30, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 57, -1, -1, 60, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 72, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 98, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, @@ -2338,6 +2351,6 @@ const short QmlJSGrammar::action_check [] = { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1 + -1, -1, -1, -1, -1, -1, -1, -1 }; diff --git a/src/libs/qmljs/parser/qmljsgrammar_p.h b/src/libs/qmljs/parser/qmljsgrammar_p.h index ca006cfd96..d4c9593add 100644 --- a/src/libs/qmljs/parser/qmljsgrammar_p.h +++ b/src/libs/qmljs/parser/qmljsgrammar_p.h @@ -166,15 +166,15 @@ public: T_XOR_EQ = 84, T_YIELD = 100, - ACCEPT_STATE = 1098, - RULE_COUNT = 616, - STATE_COUNT = 1099, + ACCEPT_STATE = 1102, + RULE_COUNT = 619, + STATE_COUNT = 1103, TERMINAL_COUNT = 134, NON_TERMINAL_COUNT = 238, - GOTO_INDEX_OFFSET = 1099, - GOTO_INFO_OFFSET = 6942, - GOTO_CHECK_OFFSET = 6942 + GOTO_INDEX_OFFSET = 1103, + GOTO_INFO_OFFSET = 6857, + GOTO_CHECK_OFFSET = 6857 }; static const char *const spell[]; diff --git a/src/libs/qmljs/parser/qmljsparser.cpp b/src/libs/qmljs/parser/qmljsparser.cpp index fdc442694a..c9b79e7f47 100644 --- a/src/libs/qmljs/parser/qmljsparser.cpp +++ b/src/libs/qmljs/parser/qmljsparser.cpp @@ -1,3 +1,5 @@ + +#line 134 "qmljs.g" /**************************************************************************** ** ** Copyright (C) 2016 The Qt Company Ltd. @@ -22,7 +24,6 @@ ** be met: https://www.gnu.org/licenses/gpl-3.0.html. ** ****************************************************************************/ -#line 172 "qmljs.g" #include "qmljs/parser/qmljsengine_p.h" #include "qmljs/parser/qmljslexer_p.h" @@ -780,8 +781,8 @@ case 59: case 78: { AST::UiPublicMember *node = sym(2).UiPublicMember; - node->isDefaultMember = true; - node->defaultToken = loc(1); + node->isRequired = true; + node->requiredToken = loc(1); sym(1).Node = node; } break; @@ -789,6 +790,37 @@ case 59: case 79: { AST::UiPublicMember *node = sym(3).UiPublicMember; + node->isRequired = true; + node->requiredToken = loc(2); + node->isDefaultMember = true; + node->defaultToken = loc(1); + sym(1).Node = node; + } break; + +#line 1346 "qmljs.g" + + case 80: { + AST::UiPublicMember *node = sym(3).UiPublicMember; + node->isRequired = true; + node->requiredToken = loc(1); + node->isDefaultMember = true; + node->defaultToken = loc(2); + sym(1).Node = node; + } break; + +#line 1358 "qmljs.g" + + case 81: { + AST::UiPublicMember *node = sym(2).UiPublicMember; + node->isDefaultMember = true; + node->defaultToken = loc(1); + sym(1).Node = node; + } break; + +#line 1368 "qmljs.g" + + case 82: { + AST::UiPublicMember *node = sym(3).UiPublicMember; node->isDefaultMember = true; node->defaultToken = loc(1); node->isRequired = true; @@ -796,9 +828,9 @@ case 59: sym(1).Node = node; } break; -#line 1347 "qmljs.g" +#line 1381 "qmljs.g" - case 80: { + case 83: { AST::UiPublicMember *node = sym(3).UiPublicMember; node->isDefaultMember = true; node->defaultToken = loc(2); @@ -807,32 +839,32 @@ case 59: sym(1).Node = node; } break; -#line 1359 "qmljs.g" +#line 1393 "qmljs.g" /* we need OptionalSemicolon because UiScriptStatement might already parse the last semicolon and then we would miss a semicolon (see tests/auto/quick/qquickvisualdatamodel/data/objectlist.qml)*/ -#line 1365 "qmljs.g" +#line 1399 "qmljs.g" - case 83: { + case 86: { AST::UiRequired *node = new (pool) AST::UiRequired(stringRef(2)); node->requiredToken = loc(1); node->semicolonToken = loc(3); sym(1).Node = node; } break; -#line 1377 "qmljs.g" +#line 1411 "qmljs.g" - case 85: { + case 88: { AST::UiPublicMember *node = sym(2).UiPublicMember; node->requiredToken = loc(1); node->isRequired = true; sym(1).Node = node; } break; -#line 1387 "qmljs.g" +#line 1421 "qmljs.g" - case 86: { + case 89: { AST::UiPublicMember *node = new (pool) AST::UiPublicMember(sym(2).UiQualifiedId->finish(), stringRef(3), sym(5).Statement); node->propertyToken = loc(1); node->typeToken = loc(2); @@ -841,27 +873,27 @@ case 59: sym(1).Node = node; } break; -#line 1401 "qmljs.g" +#line 1435 "qmljs.g" - case 88: { + case 91: { AST::UiPublicMember *node = sym(2).UiPublicMember; node->isReadonlyMember = true; node->readonlyToken = loc(1); sym(1).Node = node; } break; -#line 1411 "qmljs.g" +#line 1445 "qmljs.g" - case 89: { + case 92: { AST::UiPublicMember *node = sym(2).UiPublicMember; node->isDefaultMember = true; node->defaultToken = loc(1); sym(1).Node = node; } break; -#line 1421 "qmljs.g" +#line 1455 "qmljs.g" - case 90: { + case 93: { AST::UiPublicMember *node = new (pool) AST::UiPublicMember(sym(4).UiQualifiedId->finish(), stringRef(6)); node->typeModifier = stringRef(2); node->propertyToken = loc(1); @@ -884,18 +916,18 @@ case 59: sym(1).Node = node; } break; -#line 1449 "qmljs.g" +#line 1483 "qmljs.g" - case 92: { + case 95: { AST::UiPublicMember *node = sym(2).UiPublicMember; node->isReadonlyMember = true; node->readonlyToken = loc(1); sym(1).Node = node; } break; -#line 1459 "qmljs.g" +#line 1493 "qmljs.g" - case 93: { + case 96: { AST::UiPublicMember *node = new (pool) AST::UiPublicMember(sym(2).UiQualifiedId->finish(), stringRef(3)); node->propertyToken = loc(1); node->typeToken = loc(2); @@ -915,37 +947,37 @@ case 59: sym(1).Node = node; } break; -#line 1484 "qmljs.g" +#line 1518 "qmljs.g" - case 95: { + case 98: { AST::UiPublicMember *node = sym(2).UiPublicMember; node->isReadonlyMember = true; node->readonlyToken = loc(1); sym(1).Node = node; } break; -#line 1494 "qmljs.g" +#line 1528 "qmljs.g" - case 96: { + case 99: { auto node = new (pool) AST::UiSourceElement(sym(1).Node); sym(1).Node = node; } break; -#line 1502 "qmljs.g" +#line 1536 "qmljs.g" - case 97: { + case 100: { sym(1).Node = new (pool) AST::UiSourceElement(sym(1).Node); } break; -#line 1509 "qmljs.g" +#line 1543 "qmljs.g" - case 98: { + case 101: { sym(1).Node = new (pool) AST::UiSourceElement(sym(1).Node); } break; -#line 1516 "qmljs.g" +#line 1550 "qmljs.g" - case 99: { + case 102: { if (AST::ArrayMemberExpression *mem = AST::cast<AST::ArrayMemberExpression *>(sym(1).Expression)) { diagnostic_messages.append(compileError(mem->lbracketToken, QLatin1String("Ignored annotation"), QtWarningMsg)); @@ -965,9 +997,9 @@ case 59: } } break; -#line 1539 "qmljs.g" +#line 1573 "qmljs.g" - case 100: { + case 103: { AST::UiEnumDeclaration *enumDeclaration = new (pool) AST::UiEnumDeclaration(stringRef(2), sym(4).UiEnumMemberList->finish()); enumDeclaration->enumToken = loc(1); enumDeclaration->rbraceToken = loc(5); @@ -975,9 +1007,9 @@ case 59: break; } -#line 1550 "qmljs.g" +#line 1584 "qmljs.g" - case 101: { + case 104: { if (!stringRef(2).front().isUpper()) { diagnostic_messages.append(compileError(loc(2), QLatin1String("Type name must be upper case"), QtWarningMsg)); @@ -987,18 +1019,18 @@ case 59: sym(1).Node = inlineComponent; } break; -#line 1563 "qmljs.g" +#line 1597 "qmljs.g" - case 102: { + case 105: { AST::UiEnumMemberList *node = new (pool) AST::UiEnumMemberList(stringRef(1)); node->memberToken = loc(1); sym(1).Node = node; break; } -#line 1573 "qmljs.g" +#line 1607 "qmljs.g" - case 103: { + case 106: { AST::UiEnumMemberList *node = new (pool) AST::UiEnumMemberList(stringRef(1), sym(3).dval); node->memberToken = loc(1); node->valueToken = loc(3); @@ -1006,18 +1038,18 @@ case 59: break; } -#line 1584 "qmljs.g" +#line 1618 "qmljs.g" - case 104: { + case 107: { AST::UiEnumMemberList *node = new (pool) AST::UiEnumMemberList(sym(1).UiEnumMemberList, stringRef(3)); node->memberToken = loc(3); sym(1).Node = node; break; } -#line 1594 "qmljs.g" +#line 1628 "qmljs.g" - case 105: { + case 108: { AST::UiEnumMemberList *node = new (pool) AST::UiEnumMemberList(sym(1).UiEnumMemberList, stringRef(3), sym(5).dval); node->memberToken = loc(3); node->valueToken = loc(5); @@ -1025,79 +1057,79 @@ case 59: break; } -#line 1638 "qmljs.g" +#line 1672 "qmljs.g" - case 132: { + case 135: { sym(1).TypeArgumentList = new (pool) AST::TypeArgumentList(sym(1).Type); } break; -#line 1645 "qmljs.g" +#line 1679 "qmljs.g" - case 133: { + case 136: { sym(1).TypeArgumentList = new (pool) AST::TypeArgumentList(sym(1).TypeArgumentList, sym(3).Type); } break; -#line 1652 "qmljs.g" +#line 1686 "qmljs.g" - case 134: { + case 137: { sym(1).Type = new (pool) AST::Type(sym(1).UiQualifiedId, sym(3).TypeArgumentList->finish()); } break; -#line 1659 "qmljs.g" +#line 1693 "qmljs.g" - case 135: { + case 138: { AST::UiQualifiedId *id = new (pool) AST::UiQualifiedId(stringRef(1)); id->identifierToken = loc(1); sym(1).Type = new (pool) AST::Type(id->finish()); } break; -#line 1668 "qmljs.g" +#line 1702 "qmljs.g" - case 136: { + case 139: { sym(1).Type = new (pool) AST::Type(sym(1).UiQualifiedId); } break; -#line 1675 "qmljs.g" +#line 1709 "qmljs.g" - case 137: { + case 140: { sym(1).TypeAnnotation = new (pool) AST::TypeAnnotation(sym(2).Type); sym(1).TypeAnnotation->colonToken = loc(1); } break; -#line 1684 "qmljs.g" +#line 1718 "qmljs.g" - case 139: { + case 142: { sym(1).TypeAnnotation = nullptr; } break; -#line 1695 "qmljs.g" +#line 1729 "qmljs.g" - case 140: { + case 143: { AST::ThisExpression *node = new (pool) AST::ThisExpression(); node->thisToken = loc(1); sym(1).Node = node; } break; -#line 1704 "qmljs.g" +#line 1738 "qmljs.g" - case 141: { + case 144: { AST::IdentifierExpression *node = new (pool) AST::IdentifierExpression(stringRef(1)); node->identifierToken = loc(1); sym(1).Node = node; } break; -#line 1722 "qmljs.g" +#line 1756 "qmljs.g" - case 150: { + case 153: { if (coverExpressionType != CE_ParenthesizedExpression) { syntaxError(coverExpressionErrorLocation, "Expected token ')'."); return false; } } break; -#line 1733 "qmljs.g" +#line 1767 "qmljs.g" - case 151: { + case 154: { AST::NestedExpression *node = new (pool) AST::NestedExpression(sym(2).Expression); node->lparenToken = loc(1); node->rparenToken = loc(3); @@ -1105,26 +1137,26 @@ case 59: coverExpressionType = CE_ParenthesizedExpression; } break; -#line 1744 "qmljs.g" +#line 1778 "qmljs.g" - case 152: { + case 155: { sym(1).Node = nullptr; coverExpressionErrorLocation = loc(2); coverExpressionType = CE_FormalParameterList; } break; -#line 1753 "qmljs.g" +#line 1787 "qmljs.g" - case 153: { + case 156: { AST::FormalParameterList *node = (new (pool) AST::FormalParameterList(nullptr, sym(2).PatternElement))->finish(pool); sym(1).Node = node; coverExpressionErrorLocation = loc(2); coverExpressionType = CE_FormalParameterList; } break; -#line 1763 "qmljs.g" +#line 1797 "qmljs.g" - case 154: { + case 157: { AST::FormalParameterList *list = sym(2).Expression->reparseAsFormalParameterList(pool); if (!list) { syntaxError(loc(1), "Invalid Arrow parameter list."); @@ -1138,59 +1170,59 @@ case 59: sym(1).Node = list->finish(pool); } break; -#line 1780 "qmljs.g" +#line 1814 "qmljs.g" - case 155: { + case 158: { AST::NullExpression *node = new (pool) AST::NullExpression(); node->nullToken = loc(1); sym(1).Node = node; } break; -#line 1789 "qmljs.g" +#line 1823 "qmljs.g" - case 156: { + case 159: { AST::TrueLiteral *node = new (pool) AST::TrueLiteral(); node->trueToken = loc(1); sym(1).Node = node; } break; -#line 1798 "qmljs.g" +#line 1832 "qmljs.g" - case 157: { + case 160: { AST::FalseLiteral *node = new (pool) AST::FalseLiteral(); node->falseToken = loc(1); sym(1).Node = node; } break; -#line 1807 "qmljs.g" +#line 1841 "qmljs.g" - case 158: { + case 161: { AST::NumericLiteral *node = new (pool) AST::NumericLiteral(sym(1).dval); node->literalToken = loc(1); sym(1).Node = node; } break; -#line 1816 "qmljs.g" - case 159: Q_FALLTHROUGH(); -#line 1819 "qmljs.g" +#line 1850 "qmljs.g" + case 162: Q_FALLTHROUGH(); +#line 1853 "qmljs.g" - case 160: { + case 163: { AST::StringLiteral *node = new (pool) AST::StringLiteral(stringRef(1)); node->literalToken = loc(1); sym(1).Node = node; } break; -#line 1831 "qmljs.g" +#line 1865 "qmljs.g" { Lexer::RegExpBodyPrefix prefix; - case 161: + case 164: prefix = Lexer::NoPrefix; goto scan_regexp; -#line 1843 "qmljs.g" +#line 1877 "qmljs.g" - case 162: + case 165: prefix = Lexer::EqualPrefix; goto scan_regexp; @@ -1210,9 +1242,9 @@ case 59: } break; } -#line 1867 "qmljs.g" +#line 1901 "qmljs.g" - case 163: { + case 166: { AST::PatternElementList *list = nullptr; if (sym(2).Elision) list = (new (pool) AST::PatternElementList(sym(2).Elision, nullptr))->finish(); @@ -1222,18 +1254,18 @@ case 59: sym(1).Node = node; } break; -#line 1880 "qmljs.g" +#line 1914 "qmljs.g" - case 164: { + case 167: { AST::ArrayPattern *node = new (pool) AST::ArrayPattern(sym(2).PatternElementList->finish()); node->lbracketToken = loc(1); node->rbracketToken = loc(3); sym(1).Node = node; } break; -#line 1890 "qmljs.g" +#line 1924 "qmljs.g" - case 165: { + case 168: { auto *list = sym(2).PatternElementList; if (sym(4).Elision) { AST::PatternElementList *l = new (pool) AST::PatternElementList(sym(4).Elision, nullptr); @@ -1247,124 +1279,124 @@ case 59: Q_ASSERT(node->isValidArrayLiteral()); } break; -#line 1907 "qmljs.g" +#line 1941 "qmljs.g" - case 166: { + case 169: { AST::PatternElement *e = new (pool) AST::PatternElement(sym(1).Expression); sym(1).Node = new (pool) AST::PatternElementList(nullptr, e); } break; -#line 1915 "qmljs.g" +#line 1949 "qmljs.g" - case 167: { + case 170: { AST::PatternElement *e = new (pool) AST::PatternElement(sym(2).Expression); sym(1).Node = new (pool) AST::PatternElementList(sym(1).Elision->finish(), e); } break; -#line 1923 "qmljs.g" +#line 1957 "qmljs.g" - case 168: { + case 171: { AST::PatternElementList *node = new (pool) AST::PatternElementList(sym(1).Elision, sym(2).PatternElement); sym(1).Node = node; } break; -#line 1931 "qmljs.g" +#line 1965 "qmljs.g" - case 169: { + case 172: { AST::PatternElement *e = new (pool) AST::PatternElement(sym(4).Expression); AST::PatternElementList *node = new (pool) AST::PatternElementList(sym(3).Elision, e); sym(1).Node = sym(1).PatternElementList->append(node); } break; -#line 1940 "qmljs.g" +#line 1974 "qmljs.g" - case 170: { + case 173: { AST::PatternElementList *node = new (pool) AST::PatternElementList(sym(3).Elision, sym(4).PatternElement); sym(1).Node = sym(1).PatternElementList->append(node); } break; -#line 1948 "qmljs.g" +#line 1982 "qmljs.g" - case 171: { + case 174: { AST::Elision *node = new (pool) AST::Elision(); node->commaToken = loc(1); sym(1).Node = node; } break; -#line 1957 "qmljs.g" +#line 1991 "qmljs.g" - case 172: { + case 175: { AST::Elision *node = new (pool) AST::Elision(sym(1).Elision); node->commaToken = loc(2); sym(1).Node = node; } break; -#line 1966 "qmljs.g" +#line 2000 "qmljs.g" - case 173: { + case 176: { sym(1).Node = nullptr; } break; -#line 1973 "qmljs.g" +#line 2007 "qmljs.g" - case 174: { + case 177: { sym(1).Node = sym(1).Elision->finish(); } break; -#line 1980 "qmljs.g" +#line 2014 "qmljs.g" - case 175: { + case 178: { AST::PatternElement *node = new (pool) AST::PatternElement(sym(2).Expression, AST::PatternElement::SpreadElement); sym(1).Node = node; } break; -#line 1988 "qmljs.g" +#line 2022 "qmljs.g" - case 176: { + case 179: { AST::ObjectPattern *node = new (pool) AST::ObjectPattern(); node->lbraceToken = loc(1); node->rbraceToken = loc(2); sym(1).Node = node; } break; -#line 1998 "qmljs.g" +#line 2032 "qmljs.g" - case 177: { + case 180: { AST::ObjectPattern *node = new (pool) AST::ObjectPattern(sym(2).PatternPropertyList->finish()); node->lbraceToken = loc(1); node->rbraceToken = loc(3); sym(1).Node = node; } break; -#line 2008 "qmljs.g" +#line 2042 "qmljs.g" - case 178: { + case 181: { AST::ObjectPattern *node = new (pool) AST::ObjectPattern(sym(2).PatternPropertyList->finish()); node->lbraceToken = loc(1); node->rbraceToken = loc(4); sym(1).Node = node; } break; -#line 2019 "qmljs.g" - case 179: Q_FALLTHROUGH(); -#line 2021 "qmljs.g" +#line 2053 "qmljs.g" + case 182: Q_FALLTHROUGH(); +#line 2055 "qmljs.g" - case 180: { + case 183: { sym(1).Node = new (pool) AST::PatternPropertyList(sym(1).PatternProperty); } break; -#line 2028 "qmljs.g" - case 181: Q_FALLTHROUGH(); -#line 2030 "qmljs.g" +#line 2062 "qmljs.g" + case 184: Q_FALLTHROUGH(); +#line 2064 "qmljs.g" - case 182: { + case 185: { AST::PatternPropertyList *node = new (pool) AST::PatternPropertyList(sym(1).PatternPropertyList, sym(3).PatternProperty); sym(1).Node = node; } break; -#line 2038 "qmljs.g" +#line 2072 "qmljs.g" - case 183: { + case 186: { AST::IdentifierPropertyName *name = new (pool) AST::IdentifierPropertyName(stringRef(1)); name->propertyNameToken = loc(1); AST::IdentifierExpression *expr = new (pool) AST::IdentifierExpression(stringRef(1)); @@ -1374,9 +1406,9 @@ case 59: sym(1).Node = node; } break; -#line 2054 "qmljs.g" +#line 2088 "qmljs.g" - case 185: { + case 188: { AST::IdentifierPropertyName *name = new (pool) AST::IdentifierPropertyName(stringRef(1)); name->propertyNameToken = loc(1); AST::IdentifierExpression *left = new (pool) AST::IdentifierExpression(stringRef(1)); @@ -1393,11 +1425,11 @@ case 59: } break; -#line 2074 "qmljs.g" - case 186: Q_FALLTHROUGH(); -#line 2076 "qmljs.g" +#line 2108 "qmljs.g" + case 189: Q_FALLTHROUGH(); +#line 2110 "qmljs.g" - case 187: { + case 190: { AST::PatternProperty *node = new (pool) AST::PatternProperty(sym(1).PropertyName, sym(3).Expression); if (auto *c = asAnonymousClassDefinition(sym(3).Expression)) { if (!AST::cast<AST::ComputedPropertyName *>(sym(1).PropertyName)) @@ -1407,120 +1439,120 @@ case 59: sym(1).Node = node; } break; -#line 2094 "qmljs.g" +#line 2128 "qmljs.g" - case 191: { + case 194: { AST::IdentifierPropertyName *node = new (pool) AST::IdentifierPropertyName(stringRef(1)); node->propertyNameToken = loc(1); sym(1).Node = node; } break; -#line 2103 "qmljs.g" - case 192: Q_FALLTHROUGH(); -#line 2105 "qmljs.g" +#line 2137 "qmljs.g" + case 195: Q_FALLTHROUGH(); +#line 2139 "qmljs.g" - case 193: { + case 196: { AST::StringLiteralPropertyName *node = new (pool) AST::StringLiteralPropertyName(stringRef(1)); node->propertyNameToken = loc(1); sym(1).Node = node; } break; -#line 2114 "qmljs.g" - case 194: Q_FALLTHROUGH(); -#line 2116 "qmljs.g" +#line 2148 "qmljs.g" + case 197: Q_FALLTHROUGH(); +#line 2150 "qmljs.g" - case 195: { + case 198: { AST::NumericLiteralPropertyName *node = new (pool) AST::NumericLiteralPropertyName(sym(1).dval); node->propertyNameToken = loc(1); sym(1).Node = node; } break; -#line 2167 "qmljs.g" +#line 2201 "qmljs.g" - case 236: { + case 239: { AST::ComputedPropertyName *node = new (pool) AST::ComputedPropertyName(sym(2).Expression); node->propertyNameToken = loc(1); sym(1).Node = node; } break; -#line 2176 "qmljs.g" - case 237: Q_FALLTHROUGH(); -#line 2178 "qmljs.g" +#line 2210 "qmljs.g" + case 240: Q_FALLTHROUGH(); +#line 2212 "qmljs.g" -case 238: { +case 241: { sym(1) = sym(2); } break; -#line 2186 "qmljs.g" - case 239: Q_FALLTHROUGH(); -#line 2188 "qmljs.g" +#line 2220 "qmljs.g" + case 242: Q_FALLTHROUGH(); +#line 2222 "qmljs.g" - case 240: { + case 243: { sym(1).Node = nullptr; } break; -#line 2198 "qmljs.g" - case 243: Q_FALLTHROUGH(); -#line 2201 "qmljs.g" +#line 2232 "qmljs.g" + case 246: Q_FALLTHROUGH(); +#line 2235 "qmljs.g" - case 244: { + case 247: { AST::TemplateLiteral *node = new (pool) AST::TemplateLiteral(stringRef(1), rawStringRef(1), nullptr); node->literalToken = loc(1); sym(1).Node = node; } break; -#line 2210 "qmljs.g" - case 245: Q_FALLTHROUGH(); -#line 2213 "qmljs.g" +#line 2244 "qmljs.g" + case 248: Q_FALLTHROUGH(); +#line 2247 "qmljs.g" - case 246: { + case 249: { AST::TemplateLiteral *node = new (pool) AST::TemplateLiteral(stringRef(1), rawStringRef(1), sym(2).Expression); node->next = sym(3).Template; node->literalToken = loc(1); sym(1).Node = node; } break; -#line 2226 "qmljs.g" +#line 2260 "qmljs.g" - case 248: { + case 251: { AST::SuperLiteral *node = new (pool) AST::SuperLiteral(); node->superToken = loc(1); sym(1).Node = node; } break; -#line 2236 "qmljs.g" - case 249: Q_FALLTHROUGH(); -#line 2238 "qmljs.g" +#line 2270 "qmljs.g" + case 252: Q_FALLTHROUGH(); +#line 2272 "qmljs.g" - case 250: { + case 253: { AST::ArrayMemberExpression *node = new (pool) AST::ArrayMemberExpression(sym(1).Expression, sym(3).Expression); node->lbracketToken = loc(2); node->rbracketToken = loc(4); sym(1).Node = node; } break; -#line 2250 "qmljs.g" - case 251: +#line 2284 "qmljs.g" + case 254: { AST::IdentifierExpression *node = new (pool) AST::IdentifierExpression(stringRef(1)); node->identifierToken= loc(1); sym(1).Node = node; } Q_FALLTHROUGH(); -#line 2258 "qmljs.g" - case 252: Q_FALLTHROUGH(); -#line 2260 "qmljs.g" +#line 2292 "qmljs.g" + case 255: Q_FALLTHROUGH(); +#line 2294 "qmljs.g" - case 253: { + case 256: { AST::FieldMemberExpression *node = new (pool) AST::FieldMemberExpression(sym(1).Expression, stringRef(3)); node->dotToken = loc(2); node->identifierToken = loc(3); sym(1).Node = node; } break; -#line 2272 "qmljs.g" +#line 2306 "qmljs.g" - case 255: { + case 258: { AST::NewMemberExpression *node = new (pool) AST::NewMemberExpression(sym(2).Expression, sym(4).ArgumentList); node->newToken = loc(1); node->lparenToken = loc(3); @@ -1528,415 +1560,415 @@ case 238: { sym(1).Node = node; } break; -#line 2288 "qmljs.g" +#line 2322 "qmljs.g" - case 258: { + case 261: { AST::NewExpression *node = new (pool) AST::NewExpression(sym(2).Expression); node->newToken = loc(1); sym(1).Node = node; } break; -#line 2298 "qmljs.g" - case 259: Q_FALLTHROUGH(); -#line 2300 "qmljs.g" +#line 2332 "qmljs.g" + case 262: Q_FALLTHROUGH(); +#line 2334 "qmljs.g" - case 260: { + case 263: { AST::TaggedTemplate *node = new (pool) AST::TaggedTemplate(sym(1).Expression, sym(2).Template); sym(1).Node = node; } break; -#line 2308 "qmljs.g" +#line 2342 "qmljs.g" - case 261: { + case 264: { AST::CallExpression *node = new (pool) AST::CallExpression(sym(1).Expression, sym(3).ArgumentList); node->lparenToken = loc(2); node->rparenToken = loc(4); sym(1).Node = node; } break; -#line 2318 "qmljs.g" - case 262: Q_FALLTHROUGH(); -#line 2320 "qmljs.g" +#line 2352 "qmljs.g" + case 265: Q_FALLTHROUGH(); +#line 2354 "qmljs.g" - case 263: { + case 266: { AST::CallExpression *node = new (pool) AST::CallExpression(sym(1).Expression, sym(3).ArgumentList); node->lparenToken = loc(2); node->rparenToken = loc(4); sym(1).Node = node; } break; -#line 2330 "qmljs.g" +#line 2364 "qmljs.g" - case 264: { + case 267: { AST::ArrayMemberExpression *node = new (pool) AST::ArrayMemberExpression(sym(1).Expression, sym(3).Expression); node->lbracketToken = loc(2); node->rbracketToken = loc(4); sym(1).Node = node; } break; -#line 2340 "qmljs.g" +#line 2374 "qmljs.g" - case 265: { + case 268: { AST::FieldMemberExpression *node = new (pool) AST::FieldMemberExpression(sym(1).Expression, stringRef(3)); node->dotToken = loc(2); node->identifierToken = loc(3); sym(1).Node = node; } break; -#line 2350 "qmljs.g" +#line 2384 "qmljs.g" - case 266: { + case 269: { sym(1).Node = nullptr; } break; -#line 2357 "qmljs.g" - case 267: Q_FALLTHROUGH(); -#line 2359 "qmljs.g" +#line 2391 "qmljs.g" + case 270: Q_FALLTHROUGH(); +#line 2393 "qmljs.g" - case 268: { + case 271: { sym(1).Node = sym(1).ArgumentList->finish(); } break; -#line 2366 "qmljs.g" +#line 2400 "qmljs.g" - case 269: { + case 272: { sym(1).Node = new (pool) AST::ArgumentList(sym(1).Expression); } break; -#line 2373 "qmljs.g" +#line 2407 "qmljs.g" - case 270: { + case 273: { AST::ArgumentList *node = new (pool) AST::ArgumentList(sym(2).Expression); node->isSpreadElement = true; sym(1).Node = node; } break; -#line 2382 "qmljs.g" +#line 2416 "qmljs.g" - case 271: { + case 274: { AST::ArgumentList *node = new (pool) AST::ArgumentList(sym(1).ArgumentList, sym(3).Expression); node->commaToken = loc(2); sym(1).Node = node; } break; -#line 2391 "qmljs.g" +#line 2425 "qmljs.g" - case 272: { + case 275: { AST::ArgumentList *node = new (pool) AST::ArgumentList(sym(1).ArgumentList, sym(4).Expression); node->commaToken = loc(2); node->isSpreadElement = true; sym(1).Node = node; } break; -#line 2406 "qmljs.g" +#line 2440 "qmljs.g" - case 276: { + case 279: { AST::PostIncrementExpression *node = new (pool) AST::PostIncrementExpression(sym(1).Expression); node->incrementToken = loc(2); sym(1).Node = node; } break; -#line 2415 "qmljs.g" +#line 2449 "qmljs.g" - case 277: { + case 280: { AST::PostDecrementExpression *node = new (pool) AST::PostDecrementExpression(sym(1).Expression); node->decrementToken = loc(2); sym(1).Node = node; } break; -#line 2424 "qmljs.g" +#line 2458 "qmljs.g" - case 278: { + case 281: { AST::PreIncrementExpression *node = new (pool) AST::PreIncrementExpression(sym(2).Expression); node->incrementToken = loc(1); sym(1).Node = node; } break; -#line 2433 "qmljs.g" +#line 2467 "qmljs.g" - case 279: { + case 282: { AST::PreDecrementExpression *node = new (pool) AST::PreDecrementExpression(sym(2).Expression); node->decrementToken = loc(1); sym(1).Node = node; } break; -#line 2444 "qmljs.g" +#line 2478 "qmljs.g" - case 281: { + case 284: { AST::DeleteExpression *node = new (pool) AST::DeleteExpression(sym(2).Expression); node->deleteToken = loc(1); sym(1).Node = node; } break; -#line 2453 "qmljs.g" +#line 2487 "qmljs.g" - case 282: { + case 285: { AST::VoidExpression *node = new (pool) AST::VoidExpression(sym(2).Expression); node->voidToken = loc(1); sym(1).Node = node; } break; -#line 2462 "qmljs.g" +#line 2496 "qmljs.g" - case 283: { + case 286: { AST::TypeOfExpression *node = new (pool) AST::TypeOfExpression(sym(2).Expression); node->typeofToken = loc(1); sym(1).Node = node; } break; -#line 2471 "qmljs.g" +#line 2505 "qmljs.g" - case 284: { + case 287: { AST::UnaryPlusExpression *node = new (pool) AST::UnaryPlusExpression(sym(2).Expression); node->plusToken = loc(1); sym(1).Node = node; } break; -#line 2480 "qmljs.g" +#line 2514 "qmljs.g" - case 285: { + case 288: { AST::UnaryMinusExpression *node = new (pool) AST::UnaryMinusExpression(sym(2).Expression); node->minusToken = loc(1); sym(1).Node = node; } break; -#line 2489 "qmljs.g" +#line 2523 "qmljs.g" - case 286: { + case 289: { AST::TildeExpression *node = new (pool) AST::TildeExpression(sym(2).Expression); node->tildeToken = loc(1); sym(1).Node = node; } break; -#line 2498 "qmljs.g" +#line 2532 "qmljs.g" - case 287: { + case 290: { AST::NotExpression *node = new (pool) AST::NotExpression(sym(2).Expression); node->notToken = loc(1); sym(1).Node = node; } break; -#line 2509 "qmljs.g" +#line 2543 "qmljs.g" - case 289: { + case 292: { AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression, QSOperator::Exp, sym(3).Expression); node->operatorToken = loc(2); sym(1).Node = node; } break; -#line 2520 "qmljs.g" +#line 2554 "qmljs.g" - case 291: { + case 294: { AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression, sym(2).ival, sym(3).Expression); node->operatorToken = loc(2); sym(1).Node = node; } break; -#line 2529 "qmljs.g" +#line 2563 "qmljs.g" - case 292: { + case 295: { sym(1).ival = QSOperator::Mul; } break; -#line 2536 "qmljs.g" +#line 2570 "qmljs.g" - case 293: { + case 296: { sym(1).ival = QSOperator::Div; } break; -#line 2543 "qmljs.g" +#line 2577 "qmljs.g" - case 294: { + case 297: { sym(1).ival = QSOperator::Mod; } break; -#line 2552 "qmljs.g" +#line 2586 "qmljs.g" - case 296: { + case 299: { AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression, QSOperator::Add, sym(3).Expression); node->operatorToken = loc(2); sym(1).Node = node; } break; -#line 2561 "qmljs.g" +#line 2595 "qmljs.g" - case 297: { + case 300: { AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression, QSOperator::Sub, sym(3).Expression); node->operatorToken = loc(2); sym(1).Node = node; } break; -#line 2572 "qmljs.g" +#line 2606 "qmljs.g" - case 299: { + case 302: { AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression, QSOperator::LShift, sym(3).Expression); node->operatorToken = loc(2); sym(1).Node = node; } break; -#line 2581 "qmljs.g" +#line 2615 "qmljs.g" - case 300: { + case 303: { AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression, QSOperator::RShift, sym(3).Expression); node->operatorToken = loc(2); sym(1).Node = node; } break; -#line 2590 "qmljs.g" +#line 2624 "qmljs.g" - case 301: { + case 304: { AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression, QSOperator::URShift, sym(3).Expression); node->operatorToken = loc(2); sym(1).Node = node; } break; -#line 2602 "qmljs.g" - case 304: Q_FALLTHROUGH(); -#line 2604 "qmljs.g" +#line 2636 "qmljs.g" + case 307: Q_FALLTHROUGH(); +#line 2638 "qmljs.g" - case 305: { + case 308: { AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression, sym(2).ival, sym(3).Expression); node->operatorToken = loc(2); sym(1).Node = node; } break; -#line 2613 "qmljs.g" +#line 2647 "qmljs.g" - case 306: { + case 309: { sym(1).ival = QSOperator::Lt; } break; -#line 2619 "qmljs.g" +#line 2653 "qmljs.g" - case 307: { + case 310: { sym(1).ival = QSOperator::Gt; } break; -#line 2625 "qmljs.g" +#line 2659 "qmljs.g" - case 308: { + case 311: { sym(1).ival = QSOperator::Le; } break; -#line 2631 "qmljs.g" +#line 2665 "qmljs.g" - case 309: { + case 312: { sym(1).ival = QSOperator::Ge; } break; -#line 2637 "qmljs.g" +#line 2671 "qmljs.g" - case 310: { + case 313: { sym(1).ival = QSOperator::InstanceOf; } break; -#line 2644 "qmljs.g" +#line 2678 "qmljs.g" - case 311: { + case 314: { AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression, QSOperator::In, sym(3).Expression); node->operatorToken = loc(2); sym(1).Node = node; } break; -#line 2653 "qmljs.g" - case 312: Q_FALLTHROUGH(); -#line 2655 "qmljs.g" +#line 2687 "qmljs.g" + case 315: Q_FALLTHROUGH(); +#line 2689 "qmljs.g" - case 313: { + case 316: { AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression, QSOperator::As, sym(3).Expression); node->operatorToken = loc(2); sym(1).Node = node; } break; -#line 2670 "qmljs.g" - case 318: Q_FALLTHROUGH(); -#line 2672 "qmljs.g" +#line 2704 "qmljs.g" + case 321: Q_FALLTHROUGH(); +#line 2706 "qmljs.g" - case 319: { + case 322: { AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression, sym(2).ival, sym(3).Expression); node->operatorToken = loc(2); sym(1).Node = node; } break; -#line 2681 "qmljs.g" +#line 2715 "qmljs.g" - case 320: { + case 323: { sym(1).ival = QSOperator::Equal; } break; -#line 2687 "qmljs.g" +#line 2721 "qmljs.g" - case 321: { + case 324: { sym(1).ival = QSOperator::NotEqual; } break; -#line 2693 "qmljs.g" +#line 2727 "qmljs.g" - case 322: { + case 325: { sym(1).ival = QSOperator::StrictEqual; } break; -#line 2699 "qmljs.g" +#line 2733 "qmljs.g" - case 323: { + case 326: { sym(1).ival = QSOperator::StrictNotEqual; } break; -#line 2710 "qmljs.g" - case 326: Q_FALLTHROUGH(); -#line 2712 "qmljs.g" +#line 2744 "qmljs.g" + case 329: Q_FALLTHROUGH(); +#line 2746 "qmljs.g" - case 327: { + case 330: { AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression, QSOperator::BitAnd, sym(3).Expression); node->operatorToken = loc(2); sym(1).Node = node; } break; -#line 2725 "qmljs.g" - case 330: Q_FALLTHROUGH(); -#line 2727 "qmljs.g" +#line 2759 "qmljs.g" + case 333: Q_FALLTHROUGH(); +#line 2761 "qmljs.g" - case 331: { + case 334: { AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression, QSOperator::BitXor, sym(3).Expression); node->operatorToken = loc(2); sym(1).Node = node; } break; -#line 2739 "qmljs.g" - case 334: Q_FALLTHROUGH(); -#line 2741 "qmljs.g" +#line 2773 "qmljs.g" + case 337: Q_FALLTHROUGH(); +#line 2775 "qmljs.g" - case 335: { + case 338: { AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression, QSOperator::BitOr, sym(3).Expression); node->operatorToken = loc(2); sym(1).Node = node; } break; -#line 2753 "qmljs.g" - case 338: Q_FALLTHROUGH(); -#line 2755 "qmljs.g" +#line 2787 "qmljs.g" + case 341: Q_FALLTHROUGH(); +#line 2789 "qmljs.g" - case 339: { + case 342: { AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression, QSOperator::And, sym(3).Expression); node->operatorToken = loc(2); sym(1).Node = node; } break; -#line 2767 "qmljs.g" - case 342: Q_FALLTHROUGH(); -#line 2769 "qmljs.g" +#line 2801 "qmljs.g" + case 345: Q_FALLTHROUGH(); +#line 2803 "qmljs.g" - case 343: { + case 346: { AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression, QSOperator::Or, sym(3).Expression); node->operatorToken = loc(2); sym(1).Node = node; } break; -#line 2781 "qmljs.g" - case 346: Q_FALLTHROUGH(); -#line 2783 "qmljs.g" +#line 2815 "qmljs.g" + case 349: Q_FALLTHROUGH(); +#line 2817 "qmljs.g" - case 347: { + case 350: { auto *lhs = sym(1).Expression; auto *rhs = sym(3).Expression; @@ -1964,22 +1996,22 @@ case 238: { sym(1).Node = node; } break; -#line 2817 "qmljs.g" - case 350: Q_FALLTHROUGH(); -#line 2819 "qmljs.g" +#line 2851 "qmljs.g" + case 353: Q_FALLTHROUGH(); +#line 2853 "qmljs.g" - case 351: { + case 354: { AST::ConditionalExpression *node = new (pool) AST::ConditionalExpression(sym(1).Expression, sym(3).Expression, sym(5).Expression); node->questionToken = loc(2); node->colonToken = loc(4); sym(1).Node = node; } break; -#line 2838 "qmljs.g" - case 358: Q_FALLTHROUGH(); -#line 2840 "qmljs.g" +#line 2872 "qmljs.g" + case 361: Q_FALLTHROUGH(); +#line 2874 "qmljs.g" - case 359: { + case 362: { // need to convert the LHS to an AssignmentPattern if it was an Array/ObjectLiteral if (AST::Pattern *p = sym(1).Expression->patternCast()) { SourceLocation errorLoc; @@ -2004,208 +2036,208 @@ case 238: { sym(1).Node = node; } break; -#line 2868 "qmljs.g" - case 360: Q_FALLTHROUGH(); -#line 2870 "qmljs.g" +#line 2902 "qmljs.g" + case 363: Q_FALLTHROUGH(); +#line 2904 "qmljs.g" - case 361: { + case 364: { AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression, sym(2).ival, sym(3).Expression); node->operatorToken = loc(2); sym(1).Node = node; } break; -#line 2879 "qmljs.g" +#line 2913 "qmljs.g" - case 362: { + case 365: { sym(1).ival = QSOperator::InplaceMul; } break; -#line 2886 "qmljs.g" +#line 2920 "qmljs.g" - case 363: { + case 366: { sym(1).ival = QSOperator::InplaceExp; } break; -#line 2893 "qmljs.g" +#line 2927 "qmljs.g" - case 364: { + case 367: { sym(1).ival = QSOperator::InplaceDiv; } break; -#line 2900 "qmljs.g" +#line 2934 "qmljs.g" - case 365: { + case 368: { sym(1).ival = QSOperator::InplaceMod; } break; -#line 2907 "qmljs.g" +#line 2941 "qmljs.g" - case 366: { + case 369: { sym(1).ival = QSOperator::InplaceAdd; } break; -#line 2914 "qmljs.g" +#line 2948 "qmljs.g" - case 367: { + case 370: { sym(1).ival = QSOperator::InplaceSub; } break; -#line 2921 "qmljs.g" +#line 2955 "qmljs.g" - case 368: { + case 371: { sym(1).ival = QSOperator::InplaceLeftShift; } break; -#line 2928 "qmljs.g" +#line 2962 "qmljs.g" - case 369: { + case 372: { sym(1).ival = QSOperator::InplaceRightShift; } break; -#line 2935 "qmljs.g" +#line 2969 "qmljs.g" - case 370: { + case 373: { sym(1).ival = QSOperator::InplaceURightShift; } break; -#line 2942 "qmljs.g" +#line 2976 "qmljs.g" - case 371: { + case 374: { sym(1).ival = QSOperator::InplaceAnd; } break; -#line 2949 "qmljs.g" +#line 2983 "qmljs.g" - case 372: { + case 375: { sym(1).ival = QSOperator::InplaceXor; } break; -#line 2956 "qmljs.g" +#line 2990 "qmljs.g" - case 373: { + case 376: { sym(1).ival = QSOperator::InplaceOr; } break; -#line 2966 "qmljs.g" - case 376: Q_FALLTHROUGH(); -#line 2968 "qmljs.g" +#line 3000 "qmljs.g" + case 379: Q_FALLTHROUGH(); +#line 3002 "qmljs.g" - case 377: { + case 380: { AST::Expression *node = new (pool) AST::Expression(sym(1).Expression, sym(3).Expression); node->commaToken = loc(2); sym(1).Node = node; } break; -#line 2977 "qmljs.g" - case 378: Q_FALLTHROUGH(); -#line 2979 "qmljs.g" +#line 3011 "qmljs.g" + case 381: Q_FALLTHROUGH(); +#line 3013 "qmljs.g" - case 379: { + case 382: { sym(1).Node = nullptr; } break; -#line 2991 "qmljs.g" +#line 3025 "qmljs.g" - case 382: { + case 385: { sym(1).Node = sym(3).Node; } break; -#line 2998 "qmljs.g" - case 383: Q_FALLTHROUGH(); -#line 3000 "qmljs.g" - case 384: Q_FALLTHROUGH(); -#line 3002 "qmljs.g" - case 385: Q_FALLTHROUGH(); -#line 3004 "qmljs.g" +#line 3032 "qmljs.g" case 386: Q_FALLTHROUGH(); -#line 3006 "qmljs.g" +#line 3034 "qmljs.g" case 387: Q_FALLTHROUGH(); -#line 3008 "qmljs.g" +#line 3036 "qmljs.g" case 388: Q_FALLTHROUGH(); -#line 3010 "qmljs.g" +#line 3038 "qmljs.g" case 389: Q_FALLTHROUGH(); -#line 3012 "qmljs.g" +#line 3040 "qmljs.g" case 390: Q_FALLTHROUGH(); -#line 3014 "qmljs.g" +#line 3042 "qmljs.g" case 391: Q_FALLTHROUGH(); -#line 3016 "qmljs.g" +#line 3044 "qmljs.g" case 392: Q_FALLTHROUGH(); -#line 3018 "qmljs.g" +#line 3046 "qmljs.g" case 393: Q_FALLTHROUGH(); -#line 3020 "qmljs.g" +#line 3048 "qmljs.g" case 394: Q_FALLTHROUGH(); -#line 3022 "qmljs.g" +#line 3050 "qmljs.g" + case 395: Q_FALLTHROUGH(); +#line 3052 "qmljs.g" + case 396: Q_FALLTHROUGH(); +#line 3054 "qmljs.g" + case 397: Q_FALLTHROUGH(); +#line 3056 "qmljs.g" - case 395: { + case 398: { sym(1).Node = sym(2).Node; } break; -#line 3044 "qmljs.g" +#line 3078 "qmljs.g" - case 406: { + case 409: { AST::Block *node = new (pool) AST::Block(sym(2).StatementList); node->lbraceToken = loc(1); node->rbraceToken = loc(3); sym(1).Node = node; } break; -#line 3056 "qmljs.g" +#line 3090 "qmljs.g" - case 408: { + case 411: { sym(1).StatementList = sym(1).StatementList->append(sym(2).StatementList); } break; -#line 3063 "qmljs.g" +#line 3097 "qmljs.g" - case 409: { + case 412: { sym(1).StatementList = new (pool) AST::StatementList(sym(1).Statement); } break; -#line 3070 "qmljs.g" +#line 3104 "qmljs.g" - case 410: { + case 413: { sym(1).Node = new (pool) AST::StatementList(sym(3).FunctionDeclaration); } break; -#line 3077 "qmljs.g" +#line 3111 "qmljs.g" - case 411: { + case 414: { sym(1).Node = nullptr; } break; -#line 3084 "qmljs.g" +#line 3118 "qmljs.g" - case 412: { + case 415: { sym(1).Node = sym(1).StatementList->finish(); } break; -#line 3091 "qmljs.g" +#line 3125 "qmljs.g" - case 413: { + case 416: { sym(1).scope = AST::VariableScope::Let; } break; -#line 3097 "qmljs.g" +#line 3131 "qmljs.g" - case 414: { + case 417: { sym(1).scope = AST::VariableScope::Const; } break; -#line 3104 "qmljs.g" +#line 3138 "qmljs.g" - case 415: { + case 418: { sym(1).scope = AST::VariableScope::Var; } break; -#line 3111 "qmljs.g" - case 416: Q_FALLTHROUGH(); -#line 3113 "qmljs.g" - case 417: Q_FALLTHROUGH(); -#line 3115 "qmljs.g" - case 418: Q_FALLTHROUGH(); -#line 3117 "qmljs.g" - - case 419: { +#line 3145 "qmljs.g" + case 419: Q_FALLTHROUGH(); +#line 3147 "qmljs.g" + case 420: Q_FALLTHROUGH(); +#line 3149 "qmljs.g" + case 421: Q_FALLTHROUGH(); +#line 3151 "qmljs.g" + + case 422: { AST::VariableDeclarationList *declarations = sym(2).VariableDeclarationList->finish(sym(1).scope); for (auto it = declarations; it; it = it->next) { if (it->declaration && it->declaration->typeAnnotation) { @@ -2218,41 +2250,41 @@ case 238: { sym(1).Node = node; } break; -#line 3135 "qmljs.g" - case 421: Q_FALLTHROUGH(); -#line 3137 "qmljs.g" - case 422: Q_FALLTHROUGH(); -#line 3139 "qmljs.g" - case 423: Q_FALLTHROUGH(); -#line 3141 "qmljs.g" +#line 3169 "qmljs.g" + case 424: Q_FALLTHROUGH(); +#line 3171 "qmljs.g" + case 425: Q_FALLTHROUGH(); +#line 3173 "qmljs.g" + case 426: Q_FALLTHROUGH(); +#line 3175 "qmljs.g" - case 424: { + case 427: { sym(1).Node = new (pool) AST::VariableDeclarationList(sym(1).PatternElement); } break; -#line 3148 "qmljs.g" - case 425: Q_FALLTHROUGH(); -#line 3150 "qmljs.g" - case 426: Q_FALLTHROUGH(); -#line 3152 "qmljs.g" - case 427: Q_FALLTHROUGH(); -#line 3154 "qmljs.g" +#line 3182 "qmljs.g" + case 428: Q_FALLTHROUGH(); +#line 3184 "qmljs.g" + case 429: Q_FALLTHROUGH(); +#line 3186 "qmljs.g" + case 430: Q_FALLTHROUGH(); +#line 3188 "qmljs.g" - case 428: { + case 431: { AST::VariableDeclarationList *node = new (pool) AST::VariableDeclarationList(sym(1).VariableDeclarationList, sym(3).PatternElement); node->commaToken = loc(2); sym(1).Node = node; } break; -#line 3163 "qmljs.g" - case 429: Q_FALLTHROUGH(); -#line 3165 "qmljs.g" - case 430: Q_FALLTHROUGH(); -#line 3167 "qmljs.g" - case 431: Q_FALLTHROUGH(); -#line 3169 "qmljs.g" +#line 3197 "qmljs.g" + case 432: Q_FALLTHROUGH(); +#line 3199 "qmljs.g" + case 433: Q_FALLTHROUGH(); +#line 3201 "qmljs.g" + case 434: Q_FALLTHROUGH(); +#line 3203 "qmljs.g" - case 432: { + case 435: { auto *node = new (pool) AST::PatternElement(stringRef(1), sym(2).TypeAnnotation, sym(3).Expression); node->identifierToken = loc(1); sym(1).Node = node; @@ -2263,23 +2295,23 @@ case 238: { c->name = stringRef(1); } break; -#line 3183 "qmljs.g" - case 433: Q_FALLTHROUGH(); -#line 3185 "qmljs.g" - case 434: Q_FALLTHROUGH(); -#line 3187 "qmljs.g" - case 435: Q_FALLTHROUGH(); -#line 3189 "qmljs.g" +#line 3217 "qmljs.g" + case 436: Q_FALLTHROUGH(); +#line 3219 "qmljs.g" + case 437: Q_FALLTHROUGH(); +#line 3221 "qmljs.g" + case 438: Q_FALLTHROUGH(); +#line 3223 "qmljs.g" - case 436: { + case 439: { auto *node = new (pool) AST::PatternElement(sym(1).Pattern, sym(2).Expression); node->identifierToken = loc(1); sym(1).Node = node; } break; -#line 3198 "qmljs.g" +#line 3232 "qmljs.g" - case 437: { + case 440: { auto *node = new (pool) AST::ObjectPattern(sym(2).PatternPropertyList); node->lbraceToken = loc(1); node->rbraceToken = loc(3); @@ -2287,9 +2319,9 @@ case 238: { sym(1).Node = node; } break; -#line 3209 "qmljs.g" +#line 3243 "qmljs.g" - case 438: { + case 441: { auto *node = new (pool) AST::ArrayPattern(sym(2).PatternElementList); node->lbracketToken = loc(1); node->rbracketToken = loc(3); @@ -2297,23 +2329,23 @@ case 238: { sym(1).Node = node; } break; -#line 3220 "qmljs.g" +#line 3254 "qmljs.g" - case 439: { + case 442: { sym(1).Node = nullptr; } break; -#line 3227 "qmljs.g" - case 440: -#line 3229 "qmljs.g" +#line 3261 "qmljs.g" + case 443: +#line 3263 "qmljs.g" - case 441: { + case 444: { sym(1).Node = sym(1).PatternPropertyList->finish(); } break; -#line 3236 "qmljs.g" +#line 3270 "qmljs.g" - case 442: { + case 445: { if (sym(1).Elision || sym(2).Node) { auto *l = new (pool) AST::PatternElementList(sym(1).Elision, sym(2).PatternElement); sym(1).Node = l->finish(); @@ -2322,15 +2354,15 @@ case 238: { } } break; -#line 3248 "qmljs.g" +#line 3282 "qmljs.g" - case 443: { + case 446: { sym(1).Node = sym(1).PatternElementList->finish(); } break; -#line 3255 "qmljs.g" +#line 3289 "qmljs.g" - case 444: { + case 447: { if (sym(3).Elision || sym(4).Node) { auto *l = new (pool) AST::PatternElementList(sym(3).Elision, sym(4).PatternElement); l = sym(1).PatternElementList->append(l); @@ -2339,33 +2371,33 @@ case 238: { sym(1).Node = sym(1).PatternElementList->finish(); } break; -#line 3267 "qmljs.g" +#line 3301 "qmljs.g" - case 445: { + case 448: { sym(1).Node = new (pool) AST::PatternPropertyList(sym(1).PatternProperty); } break; -#line 3274 "qmljs.g" +#line 3308 "qmljs.g" - case 446: { + case 449: { sym(1).Node = new (pool) AST::PatternPropertyList(sym(1).PatternPropertyList, sym(3).PatternProperty); } break; -#line 3283 "qmljs.g" +#line 3317 "qmljs.g" - case 448: { + case 451: { sym(1).PatternElementList = sym(1).PatternElementList->append(sym(3).PatternElementList); } break; -#line 3290 "qmljs.g" +#line 3324 "qmljs.g" - case 449: { + case 452: { sym(1).Node = new (pool) AST::PatternElementList(sym(1).Elision, sym(2).PatternElement); } break; -#line 3298 "qmljs.g" +#line 3332 "qmljs.g" - case 450: { + case 453: { AST::StringLiteralPropertyName *name = new (pool) AST::StringLiteralPropertyName(stringRef(1)); name->propertyNameToken = loc(1); // if initializer is an anonymous function expression, we need to assign identifierref as it's name @@ -2376,23 +2408,23 @@ case 238: { sym(1).Node = new (pool) AST::PatternProperty(name, stringRef(1), sym(2).Expression); } break; -#line 3312 "qmljs.g" +#line 3346 "qmljs.g" - case 451: { + case 454: { AST::PatternProperty *node = new (pool) AST::PatternProperty(sym(1).PropertyName, stringRef(3), sym(4).Expression); sym(1).Node = node; } break; -#line 3320 "qmljs.g" +#line 3354 "qmljs.g" - case 452: { + case 455: { AST::PatternProperty *node = new (pool) AST::PatternProperty(sym(1).PropertyName, sym(3).Pattern, sym(4).Expression); sym(1).Node = node; } break; -#line 3328 "qmljs.g" +#line 3362 "qmljs.g" - case 453: { + case 456: { AST::PatternElement *node = new (pool) AST::PatternElement(stringRef(1), sym(2).TypeAnnotation, sym(3).Expression); node->identifierToken = loc(1); // if initializer is an anonymous function expression, we need to assign identifierref as it's name @@ -2403,45 +2435,45 @@ case 238: { sym(1).Node = node; } break; -#line 3342 "qmljs.g" +#line 3376 "qmljs.g" - case 454: { + case 457: { AST::PatternElement *node = new (pool) AST::PatternElement(sym(1).Pattern, sym(2).Expression); sym(1).Node = node; } break; -#line 3350 "qmljs.g" +#line 3384 "qmljs.g" - case 455: { + case 458: { AST::PatternElement *node = new (pool) AST::PatternElement(stringRef(2), /*type annotation*/nullptr, nullptr, AST::PatternElement::RestElement); node->identifierToken = loc(2); sym(1).Node = node; } break; -#line 3359 "qmljs.g" +#line 3393 "qmljs.g" - case 456: { + case 459: { AST::PatternElement *node = new (pool) AST::PatternElement(sym(2).Pattern, nullptr, AST::PatternElement::RestElement); sym(1).Node = node; } break; -#line 3367 "qmljs.g" +#line 3401 "qmljs.g" - case 457: { + case 460: { sym(1).Node = nullptr; } break; -#line 3377 "qmljs.g" +#line 3411 "qmljs.g" - case 459: { + case 462: { AST::EmptyStatement *node = new (pool) AST::EmptyStatement(); node->semicolonToken = loc(1); sym(1).Node = node; } break; -#line 3392 "qmljs.g" +#line 3426 "qmljs.g" - case 460: { + case 463: { int token = lookaheadToken(lexer); if (token == T_LBRACE) pushToken(T_FORCE_BLOCK); @@ -2449,17 +2481,17 @@ case 238: { pushToken(T_FORCE_DECLARATION); } break; -#line 3403 "qmljs.g" +#line 3437 "qmljs.g" - case 461: { + case 464: { AST::ExpressionStatement *node = new (pool) AST::ExpressionStatement(sym(1).Expression); node->semicolonToken = loc(2); sym(1).Node = node; } break; -#line 3412 "qmljs.g" +#line 3446 "qmljs.g" - case 462: { + case 465: { AST::IfStatement *node = new (pool) AST::IfStatement(sym(3).Expression, sym(5).Statement, sym(7).Statement); node->ifToken = loc(1); node->lparenToken = loc(2); @@ -2468,9 +2500,9 @@ case 238: { sym(1).Node = node; } break; -#line 3424 "qmljs.g" +#line 3458 "qmljs.g" - case 463: { + case 466: { AST::IfStatement *node = new (pool) AST::IfStatement(sym(3).Expression, sym(5).Statement); node->ifToken = loc(1); node->lparenToken = loc(2); @@ -2478,9 +2510,9 @@ case 238: { sym(1).Node = node; } break; -#line 3437 "qmljs.g" +#line 3471 "qmljs.g" - case 465: { + case 468: { AST::DoWhileStatement *node = new (pool) AST::DoWhileStatement(sym(2).Statement, sym(5).Expression); node->doToken = loc(1); node->whileToken = loc(3); @@ -2490,9 +2522,9 @@ case 238: { sym(1).Node = node; } break; -#line 3450 "qmljs.g" +#line 3484 "qmljs.g" - case 466: { + case 469: { AST::WhileStatement *node = new (pool) AST::WhileStatement(sym(3).Expression, sym(5).Statement); node->whileToken = loc(1); node->lparenToken = loc(2); @@ -2500,9 +2532,9 @@ case 238: { sym(1).Node = node; } break; -#line 3461 "qmljs.g" +#line 3495 "qmljs.g" - case 467: { + case 470: { AST::ForStatement *node = new (pool) AST::ForStatement(sym(3).Expression, sym(5).Expression, sym(7).Expression, sym(9).Statement); node->forToken = loc(1); node->lparenToken = loc(2); @@ -2512,11 +2544,11 @@ case 238: { sym(1).Node = node; } break; -#line 3474 "qmljs.g" - case 468: Q_FALLTHROUGH(); -#line 3476 "qmljs.g" +#line 3508 "qmljs.g" + case 471: Q_FALLTHROUGH(); +#line 3510 "qmljs.g" - case 469: { + case 472: { // ### get rid of the static_cast! AST::ForStatement *node = new (pool) AST::ForStatement( static_cast<AST::VariableStatement *>(sym(3).Node)->declarations, sym(5).Expression, @@ -2529,21 +2561,21 @@ case 238: { sym(1).Node = node; } break; -#line 3492 "qmljs.g" +#line 3526 "qmljs.g" - case 470: { + case 473: { sym(1).forEachType = AST::ForEachType::In; } break; -#line 3499 "qmljs.g" +#line 3533 "qmljs.g" - case 471: { + case 474: { sym(1).forEachType = AST::ForEachType::Of; } break; -#line 3506 "qmljs.g" +#line 3540 "qmljs.g" - case 472: { + case 475: { // need to convert the LHS to an AssignmentPattern if it was an Array/ObjectLiteral if (AST::Pattern *p = sym(3).Expression->patternCast()) { SourceLocation errorLoc; @@ -2562,9 +2594,9 @@ case 238: { sym(1).Node = node; } break; -#line 3528 "qmljs.g" +#line 3562 "qmljs.g" - case 473: { + case 476: { AST::ForEachStatement *node = new (pool) AST::ForEachStatement(sym(3).PatternElement, sym(5).Expression, sym(7).Statement); node->forToken = loc(1); node->lparenToken = loc(2); @@ -2574,11 +2606,11 @@ case 238: { sym(1).Node = node; } break; -#line 3541 "qmljs.g" - case 474: Q_FALLTHROUGH(); -#line 3543 "qmljs.g" +#line 3575 "qmljs.g" + case 477: Q_FALLTHROUGH(); +#line 3577 "qmljs.g" - case 475: { + case 478: { if (auto typeAnnotation = sym(3).TypeAnnotation) { syntaxError(typeAnnotation->firstSourceLocation(), "Type annotations are not permitted in variable declarations"); return false; @@ -2590,29 +2622,29 @@ case 238: { sym(1).Node = node; } break; -#line 3558 "qmljs.g" - case 476: Q_FALLTHROUGH(); -#line 3560 "qmljs.g" +#line 3592 "qmljs.g" + case 479: Q_FALLTHROUGH(); +#line 3594 "qmljs.g" - case 477: { + case 480: { auto *node = new (pool) AST::PatternElement(sym(2).Pattern, nullptr); node->scope = sym(1).scope; node->isForDeclaration = true; sym(1).Node = node; } break; -#line 3570 "qmljs.g" +#line 3604 "qmljs.g" - case 478: { + case 481: { AST::ContinueStatement *node = new (pool) AST::ContinueStatement(); node->continueToken = loc(1); node->semicolonToken = loc(2); sym(1).Node = node; } break; -#line 3580 "qmljs.g" +#line 3614 "qmljs.g" - case 479: { + case 482: { AST::ContinueStatement *node = new (pool) AST::ContinueStatement(stringRef(2)); node->continueToken = loc(1); node->identifierToken = loc(2); @@ -2620,18 +2652,18 @@ case 238: { sym(1).Node = node; } break; -#line 3591 "qmljs.g" +#line 3625 "qmljs.g" - case 480: { + case 483: { AST::BreakStatement *node = new (pool) AST::BreakStatement(QStringRef()); node->breakToken = loc(1); node->semicolonToken = loc(2); sym(1).Node = node; } break; -#line 3601 "qmljs.g" +#line 3635 "qmljs.g" - case 481: { + case 484: { AST::BreakStatement *node = new (pool) AST::BreakStatement(stringRef(2)); node->breakToken = loc(1); node->identifierToken = loc(2); @@ -2639,9 +2671,9 @@ case 238: { sym(1).Node = node; } break; -#line 3612 "qmljs.g" +#line 3646 "qmljs.g" - case 482: { + case 485: { if (!functionNestingLevel) { syntaxError(loc(1), "Return statement not allowed outside of Function declaration."); return false; @@ -2652,9 +2684,9 @@ case 238: { sym(1).Node = node; } break; -#line 3626 "qmljs.g" +#line 3660 "qmljs.g" - case 483: { + case 486: { AST::WithStatement *node = new (pool) AST::WithStatement(sym(3).Expression, sym(5).Statement); node->withToken = loc(1); node->lparenToken = loc(2); @@ -2662,9 +2694,9 @@ case 238: { sym(1).Node = node; } break; -#line 3637 "qmljs.g" +#line 3671 "qmljs.g" - case 484: { + case 487: { AST::SwitchStatement *node = new (pool) AST::SwitchStatement(sym(3).Expression, sym(5).CaseBlock); node->switchToken = loc(1); node->lparenToken = loc(2); @@ -2672,118 +2704,118 @@ case 238: { sym(1).Node = node; } break; -#line 3648 "qmljs.g" +#line 3682 "qmljs.g" - case 485: { + case 488: { AST::CaseBlock *node = new (pool) AST::CaseBlock(sym(2).CaseClauses); node->lbraceToken = loc(1); node->rbraceToken = loc(3); sym(1).Node = node; } break; -#line 3658 "qmljs.g" +#line 3692 "qmljs.g" - case 486: { + case 489: { AST::CaseBlock *node = new (pool) AST::CaseBlock(sym(2).CaseClauses, sym(3).DefaultClause, sym(4).CaseClauses); node->lbraceToken = loc(1); node->rbraceToken = loc(5); sym(1).Node = node; } break; -#line 3668 "qmljs.g" +#line 3702 "qmljs.g" - case 487: { + case 490: { sym(1).Node = new (pool) AST::CaseClauses(sym(1).CaseClause); } break; -#line 3675 "qmljs.g" +#line 3709 "qmljs.g" - case 488: { + case 491: { sym(1).Node = new (pool) AST::CaseClauses(sym(1).CaseClauses, sym(2).CaseClause); } break; -#line 3682 "qmljs.g" +#line 3716 "qmljs.g" - case 489: { + case 492: { sym(1).Node = nullptr; } break; -#line 3689 "qmljs.g" +#line 3723 "qmljs.g" - case 490: { + case 493: { sym(1).Node = sym(1).CaseClauses->finish(); } break; -#line 3696 "qmljs.g" +#line 3730 "qmljs.g" - case 491: { + case 494: { AST::CaseClause *node = new (pool) AST::CaseClause(sym(2).Expression, sym(4).StatementList); node->caseToken = loc(1); node->colonToken = loc(3); sym(1).Node = node; } break; -#line 3706 "qmljs.g" +#line 3740 "qmljs.g" - case 492: { + case 495: { AST::DefaultClause *node = new (pool) AST::DefaultClause(sym(3).StatementList); node->defaultToken = loc(1); node->colonToken = loc(2); sym(1).Node = node; } break; -#line 3716 "qmljs.g" +#line 3750 "qmljs.g" - case 493: { + case 496: { AST::LabelledStatement *node = new (pool) AST::LabelledStatement(stringRef(1), sym(3).Statement); node->identifierToken = loc(1); node->colonToken = loc(2); sym(1).Node = node; } break; -#line 3728 "qmljs.g" +#line 3762 "qmljs.g" - case 495: { + case 498: { syntaxError(loc(3), "FunctionDeclarations are not allowed after a label."); return false; } break; -#line 3736 "qmljs.g" +#line 3770 "qmljs.g" - case 496: { + case 499: { AST::ThrowStatement *node = new (pool) AST::ThrowStatement(sym(2).Expression); node->throwToken = loc(1); node->semicolonToken = loc(3); sym(1).Node = node; } break; -#line 3746 "qmljs.g" +#line 3780 "qmljs.g" - case 497: { + case 500: { AST::TryStatement *node = new (pool) AST::TryStatement(sym(2).Statement, sym(3).Catch); node->tryToken = loc(1); sym(1).Node = node; } break; -#line 3755 "qmljs.g" +#line 3789 "qmljs.g" - case 498: { + case 501: { AST::TryStatement *node = new (pool) AST::TryStatement(sym(2).Statement, sym(3).Finally); node->tryToken = loc(1); sym(1).Node = node; } break; -#line 3764 "qmljs.g" +#line 3798 "qmljs.g" - case 499: { + case 502: { AST::TryStatement *node = new (pool) AST::TryStatement(sym(2).Statement, sym(3).Catch, sym(4).Finally); node->tryToken = loc(1); sym(1).Node = node; } break; -#line 3773 "qmljs.g" +#line 3807 "qmljs.g" - case 500: { + case 503: { AST::Catch *node = new (pool) AST::Catch(sym(3).PatternElement, sym(5).Block); node->catchToken = loc(1); node->lparenToken = loc(2); @@ -2792,43 +2824,43 @@ case 238: { sym(1).Node = node; } break; -#line 3785 "qmljs.g" +#line 3819 "qmljs.g" - case 501: { + case 504: { AST::Finally *node = new (pool) AST::Finally(sym(2).Block); node->finallyToken = loc(1); sym(1).Node = node; } break; -#line 3794 "qmljs.g" +#line 3828 "qmljs.g" - case 502: { + case 505: { AST::PatternElement *node = new (pool) AST::PatternElement(stringRef(1)); node->identifierToken = loc(1); node->scope = AST::VariableScope::Let; sym(1).Node = node; } break; -#line 3804 "qmljs.g" +#line 3838 "qmljs.g" - case 503: { + case 506: { AST::PatternElement *node = new (pool) AST::PatternElement(sym(1).Pattern); node->scope = AST::VariableScope::Let; sym(1).Node = node; } break; -#line 3813 "qmljs.g" +#line 3847 "qmljs.g" - case 504: { + case 507: { AST::DebuggerStatement *node = new (pool) AST::DebuggerStatement(); node->debuggerToken = loc(1); node->semicolonToken = loc(2); sym(1).Node = node; } break; -#line 3830 "qmljs.g" +#line 3864 "qmljs.g" - case 506: { + case 509: { if (!ensureNoFunctionTypeAnnotations(sym(6).TypeAnnotation, sym(4).FormalParameterList)) return false; AST::FunctionDeclaration *node = new (pool) AST::FunctionDeclaration(stringRef(2), sym(4).FormalParameterList, sym(8).StatementList, @@ -2842,9 +2874,9 @@ case 238: { sym(1).Node = node; } break; -#line 3847 "qmljs.g" +#line 3881 "qmljs.g" - case 507: { + case 510: { AST::FunctionDeclaration *node = new (pool) AST::FunctionDeclaration(stringRef(2), sym(4).FormalParameterList, sym(8).StatementList, sym(6).TypeAnnotation); node->functionToken = loc(1); @@ -2856,9 +2888,9 @@ case 238: { sym(1).Node = node; } break; -#line 3863 "qmljs.g" +#line 3897 "qmljs.g" - case 509: { + 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, @@ -2871,9 +2903,9 @@ case 238: { sym(1).Node = node; } break; -#line 3879 "qmljs.g" +#line 3913 "qmljs.g" - case 510: { + case 513: { if (!ensureNoFunctionTypeAnnotations(sym(6).TypeAnnotation, sym(4).FormalParameterList)) return false; AST::FunctionExpression *node = new (pool) AST::FunctionExpression(stringRef(2), sym(4).FormalParameterList, sym(8).StatementList, @@ -2888,9 +2920,9 @@ case 238: { sym(1).Node = node; } break; -#line 3897 "qmljs.g" +#line 3931 "qmljs.g" - case 511: { + 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, @@ -2903,65 +2935,65 @@ case 238: { sym(1).Node = node; } break; -#line 3915 "qmljs.g" +#line 3949 "qmljs.g" - case 513: { + case 516: { sym(1).Node = nullptr; } break; -#line 3922 "qmljs.g" +#line 3956 "qmljs.g" - case 514: { + case 517: { AST::FormalParameterList *node = (new (pool) AST::FormalParameterList(nullptr, sym(1).PatternElement))->finish(pool); sym(1).Node = node; } break; -#line 3930 "qmljs.g" - case 515: -#line 3932 "qmljs.g" +#line 3964 "qmljs.g" + case 518: +#line 3966 "qmljs.g" - case 516: { + case 519: { sym(1).Node = sym(1).FormalParameterList->finish(pool); } break; -#line 3939 "qmljs.g" +#line 3973 "qmljs.g" - case 517: { + case 520: { AST::FormalParameterList *node = (new (pool) AST::FormalParameterList(sym(1).FormalParameterList, sym(3).PatternElement))->finish(pool); sym(1).Node = node; } break; -#line 3947 "qmljs.g" +#line 3981 "qmljs.g" - case 518: { + case 521: { AST::FormalParameterList *node = new (pool) AST::FormalParameterList(nullptr, sym(1).PatternElement); sym(1).Node = node; } break; -#line 3956 "qmljs.g" +#line 3990 "qmljs.g" - case 519: { + case 522: { AST::FormalParameterList *node = new (pool) AST::FormalParameterList(sym(1).FormalParameterList, sym(3).PatternElement); sym(1).Node = node; } break; -#line 3966 "qmljs.g" +#line 4000 "qmljs.g" - case 521: { + case 524: { ++functionNestingLevel; } break; -#line 3973 "qmljs.g" +#line 4007 "qmljs.g" - case 522: { + case 525: { --functionNestingLevel; } break; -#line 3983 "qmljs.g" - case 524: Q_FALLTHROUGH(); -#line 3985 "qmljs.g" +#line 4017 "qmljs.g" + case 527: Q_FALLTHROUGH(); +#line 4019 "qmljs.g" - case 525: { + case 528: { AST::ReturnStatement *ret = new (pool) AST::ReturnStatement(sym(4).Expression); ret->returnToken = sym(4).Node->firstSourceLocation(); ret->semicolonToken = sym(4).Node->lastSourceLocation(); @@ -2974,11 +3006,11 @@ case 238: { sym(1).Node = f; } break; -#line 4001 "qmljs.g" - case 526: Q_FALLTHROUGH(); -#line 4003 "qmljs.g" +#line 4035 "qmljs.g" + case 529: Q_FALLTHROUGH(); +#line 4037 "qmljs.g" - case 527: { + case 530: { AST::FunctionExpression *f = new (pool) AST::FunctionExpression(QStringRef(), sym(1).FormalParameterList, sym(6).StatementList); f->isArrowFunction = true; f->functionToken = sym(1).Node ? sym(1).Node->firstSourceLocation() : loc(1); @@ -2987,17 +3019,17 @@ case 238: { sym(1).Node = f; } break; -#line 4015 "qmljs.g" +#line 4049 "qmljs.g" - case 528: { + case 531: { AST::PatternElement *e = new (pool) AST::PatternElement(stringRef(1), /*type annotation*/nullptr, nullptr, AST::PatternElement::Binding); e->identifierToken = loc(1); sym(1).FormalParameterList = (new (pool) AST::FormalParameterList(nullptr, e))->finish(pool); } break; -#line 4026 "qmljs.g" +#line 4060 "qmljs.g" - case 529: { + case 532: { if (coverExpressionType != CE_FormalParameterList) { AST::NestedExpression *ne = static_cast<AST::NestedExpression *>(sym(1).Node); AST::FormalParameterList *list = ne->expression->reparseAsFormalParameterList(pool); @@ -3009,16 +3041,16 @@ case 238: { } } break; -#line 4044 "qmljs.g" +#line 4078 "qmljs.g" - case 530: { + case 533: { if (lookaheadToken(lexer) == T_LBRACE) pushToken(T_FORCE_BLOCK); } break; -#line 4052 "qmljs.g" +#line 4086 "qmljs.g" - case 531: { + case 534: { if (!ensureNoFunctionTypeAnnotations(sym(5).TypeAnnotation, sym(3).FormalParameterList)) return false; AST::FunctionExpression *f = new (pool) AST::FunctionExpression(stringRef(1), sym(3).FormalParameterList, sym(7).StatementList); @@ -3032,9 +3064,9 @@ case 238: { sym(1).Node = node; } break; -#line 4069 "qmljs.g" +#line 4103 "qmljs.g" - case 532: { + case 535: { if (!ensureNoFunctionTypeAnnotations(sym(6).TypeAnnotation, sym(4).FormalParameterList)) return false; AST::FunctionExpression *f = new (pool) AST::FunctionExpression(stringRef(2), sym(4).FormalParameterList, sym(8).StatementList); @@ -3049,9 +3081,9 @@ case 238: { sym(1).Node = node; } break; -#line 4088 "qmljs.g" +#line 4122 "qmljs.g" - case 533: { + case 536: { if (!ensureNoFunctionTypeAnnotations(sym(5).TypeAnnotation, /*formals*/nullptr)) return false; AST::FunctionExpression *f = new (pool) AST::FunctionExpression(stringRef(2), nullptr, sym(7).StatementList); @@ -3065,9 +3097,9 @@ case 238: { sym(1).Node = node; } break; -#line 4105 "qmljs.g" +#line 4139 "qmljs.g" - case 534: { + case 537: { if (!ensureNoFunctionTypeAnnotations(sym(6).TypeAnnotation, sym(4).FormalParameterList)) return false; AST::FunctionExpression *f = new (pool) AST::FunctionExpression(stringRef(2), sym(4).FormalParameterList, sym(8).StatementList); @@ -3081,29 +3113,29 @@ case 238: { sym(1).Node = node; } break; -#line 4123 "qmljs.g" +#line 4157 "qmljs.g" - case 535: { + case 538: { AST::FormalParameterList *node = (new (pool) AST::FormalParameterList(nullptr, sym(1).PatternElement))->finish(pool); sym(1).Node = node; } break; -#line 4131 "qmljs.g" +#line 4165 "qmljs.g" - case 536: { + case 539: { lexer->enterGeneratorBody(); } break; -#line 4138 "qmljs.g" +#line 4172 "qmljs.g" - case 537: { + case 540: { --functionNestingLevel; lexer->leaveGeneratorBody(); } break; -#line 4148 "qmljs.g" +#line 4182 "qmljs.g" - case 539: { + case 542: { AST::FunctionDeclaration *node = new (pool) AST::FunctionDeclaration(stringRef(2), sym(4).FormalParameterList, sym(7).StatementList); node->functionToken = loc(1); node->identifierToken = loc(2); @@ -3115,9 +3147,9 @@ case 238: { sym(1).Node = node; } break; -#line 4164 "qmljs.g" +#line 4198 "qmljs.g" - case 541: { + case 544: { AST::FunctionDeclaration *node = new (pool) AST::FunctionDeclaration(QStringRef(), sym(3).FormalParameterList, sym(6).StatementList); node->functionToken = loc(1); node->lparenToken = loc(2); @@ -3128,9 +3160,9 @@ case 238: { sym(1).Node = node; } break; -#line 4178 "qmljs.g" +#line 4212 "qmljs.g" - case 542: { + case 545: { AST::FunctionExpression *node = new (pool) AST::FunctionExpression(stringRef(2), sym(4).FormalParameterList, sym(7).StatementList); node->functionToken = loc(1); if (!stringRef(2).isNull()) @@ -3143,9 +3175,9 @@ case 238: { sym(1).Node = node; } break; -#line 4194 "qmljs.g" +#line 4228 "qmljs.g" - case 543: { + case 546: { AST::FunctionExpression *node = new (pool) AST::FunctionExpression(QStringRef(), sym(3).FormalParameterList, sym(6).StatementList); node->functionToken = loc(1); node->lparenToken = loc(2); @@ -3156,40 +3188,40 @@ case 238: { sym(1).Node = node; } break; -#line 4210 "qmljs.g" - case 545: Q_FALLTHROUGH(); -#line 4212 "qmljs.g" +#line 4244 "qmljs.g" + case 548: Q_FALLTHROUGH(); +#line 4246 "qmljs.g" - case 546: { + case 549: { AST::YieldExpression *node = new (pool) AST::YieldExpression(); node->yieldToken = loc(1); sym(1).Node = node; } break; -#line 4221 "qmljs.g" - case 547: Q_FALLTHROUGH(); -#line 4223 "qmljs.g" +#line 4255 "qmljs.g" + case 550: Q_FALLTHROUGH(); +#line 4257 "qmljs.g" - case 548: { + case 551: { AST::YieldExpression *node = new (pool) AST::YieldExpression(sym(3).Expression); node->yieldToken = loc(1); node->isYieldStar = true; sym(1).Node = node; } break; -#line 4233 "qmljs.g" - case 549: Q_FALLTHROUGH(); -#line 4235 "qmljs.g" +#line 4267 "qmljs.g" + case 552: Q_FALLTHROUGH(); +#line 4269 "qmljs.g" - case 550: { + case 553: { AST::YieldExpression *node = new (pool) AST::YieldExpression(sym(2).Expression); node->yieldToken = loc(1); sym(1).Node = node; } break; -#line 4245 "qmljs.g" +#line 4279 "qmljs.g" - case 551: { + case 554: { AST::ClassDeclaration *node = new (pool) AST::ClassDeclaration(stringRef(2), sym(3).Expression, sym(5).ClassElementList); node->classToken = loc(1); node->identifierToken = loc(2); @@ -3198,9 +3230,9 @@ case 238: { sym(1).Node = node; } break; -#line 4257 "qmljs.g" +#line 4291 "qmljs.g" - case 552: { + case 555: { AST::ClassExpression *node = new (pool) AST::ClassExpression(stringRef(2), sym(3).Expression, sym(5).ClassElementList); node->classToken = loc(1); node->identifierToken = loc(2); @@ -3209,9 +3241,9 @@ case 238: { sym(1).Node = node; } break; -#line 4269 "qmljs.g" +#line 4303 "qmljs.g" - case 553: { + case 556: { AST::ClassDeclaration *node = new (pool) AST::ClassDeclaration(QStringRef(), sym(2).Expression, sym(4).ClassElementList); node->classToken = loc(1); node->lbraceToken = loc(3); @@ -3219,9 +3251,9 @@ case 238: { sym(1).Node = node; } break; -#line 4280 "qmljs.g" +#line 4314 "qmljs.g" - case 554: { + case 557: { AST::ClassExpression *node = new (pool) AST::ClassExpression(QStringRef(), sym(2).Expression, sym(4).ClassElementList); node->classToken = loc(1); node->lbraceToken = loc(3); @@ -3229,48 +3261,48 @@ case 238: { sym(1).Node = node; } break; -#line 4293 "qmljs.g" +#line 4327 "qmljs.g" - case 556: { + case 559: { lexer->setStaticIsKeyword(true); } break; -#line 4300 "qmljs.g" - case 557: -#line 4302 "qmljs.g" +#line 4334 "qmljs.g" + case 560: +#line 4336 "qmljs.g" - case 558: { + case 561: { lexer->setStaticIsKeyword(false); } break; -#line 4309 "qmljs.g" +#line 4343 "qmljs.g" - case 559: { + case 562: { sym(1).Node = nullptr; } break; -#line 4316 "qmljs.g" +#line 4350 "qmljs.g" - case 560: { + case 563: { sym(1).Node = sym(2).Node; } break; -#line 4323 "qmljs.g" +#line 4357 "qmljs.g" - case 561: { + case 564: { sym(1).Node = nullptr; } break; -#line 4330 "qmljs.g" +#line 4364 "qmljs.g" - case 562: { + case 565: { if (sym(1).Node) sym(1).Node = sym(1).ClassElementList->finish(); } break; -#line 4340 "qmljs.g" +#line 4374 "qmljs.g" - case 564: { + case 567: { if (sym(1).Node) { if (sym(2).Node) sym(1).ClassElementList = sym(1).ClassElementList->append(sym(2).ClassElementList); @@ -3279,246 +3311,246 @@ case 238: { } } break; -#line 4352 "qmljs.g" +#line 4386 "qmljs.g" - case 565: { + case 568: { AST::ClassElementList *node = new (pool) AST::ClassElementList(sym(1).PatternProperty, false); sym(1).Node = node; } break; -#line 4360 "qmljs.g" +#line 4394 "qmljs.g" - case 566: { + case 569: { lexer->setStaticIsKeyword(true); AST::ClassElementList *node = new (pool) AST::ClassElementList(sym(2).PatternProperty, true); sym(1).Node = node; } break; -#line 4369 "qmljs.g" +#line 4403 "qmljs.g" - case 567: { + case 570: { sym(1).Node = nullptr; } break; -#line 4378 "qmljs.g" +#line 4412 "qmljs.g" - case 568: { + case 571: { sym(1).Node = nullptr; } break; -#line 4387 "qmljs.g" +#line 4421 "qmljs.g" - case 570: { + case 573: { sym(1).Node = new (pool) AST::Program(sym(1).StatementList->finish()); } break; -#line 4394 "qmljs.g" - case 571: { +#line 4428 "qmljs.g" + case 574: { sym(1).Node = new (pool) AST::ESModule(sym(1).StatementList); } break; -#line 4400 "qmljs.g" +#line 4434 "qmljs.g" - case 572: { + case 575: { sym(1).StatementList = sym(1).StatementList->finish(); } break; -#line 4407 "qmljs.g" +#line 4441 "qmljs.g" - case 573: { + case 576: { sym(1).StatementList = nullptr; } break; -#line 4417 "qmljs.g" +#line 4451 "qmljs.g" - case 576: { + case 579: { sym(1).StatementList = sym(1).StatementList->append(sym(2).StatementList); } break; -#line 4425 "qmljs.g" - case 577: Q_FALLTHROUGH(); -#line 4427 "qmljs.g" +#line 4459 "qmljs.g" + case 580: Q_FALLTHROUGH(); +#line 4461 "qmljs.g" - case 578: { + case 581: { sym(1).StatementList = new (pool) AST::StatementList(sym(1).Node); } break; -#line 4436 "qmljs.g" +#line 4470 "qmljs.g" - case 580: { + case 583: { auto decl = new (pool) AST::ImportDeclaration(sym(2).ImportClause, sym(3).FromClause); decl->importToken = loc(1); sym(1).Node = decl; } break; -#line 4444 "qmljs.g" +#line 4478 "qmljs.g" - case 581: { + case 584: { auto decl = new (pool) AST::ImportDeclaration(stringRef(2)); decl->importToken = loc(1); decl->moduleSpecifierToken = loc(2); sym(1).Node = decl; } break; -#line 4454 "qmljs.g" +#line 4488 "qmljs.g" - case 582: { + case 585: { auto clause = new (pool) AST::ImportClause(stringRef(1)); clause->importedDefaultBindingToken = loc(1); sym(1).ImportClause = clause; } break; -#line 4462 "qmljs.g" +#line 4496 "qmljs.g" - case 583: { + case 586: { sym(1).ImportClause = new (pool) AST::ImportClause(sym(1).NameSpaceImport); } break; -#line 4468 "qmljs.g" +#line 4502 "qmljs.g" - case 584: { + case 587: { sym(1).ImportClause = new (pool) AST::ImportClause(sym(1).NamedImports); } break; -#line 4474 "qmljs.g" +#line 4508 "qmljs.g" - case 585: { + case 588: { auto importClause = new (pool) AST::ImportClause(stringRef(1), sym(3).NameSpaceImport); importClause->importedDefaultBindingToken = loc(1); sym(1).ImportClause = importClause; } break; -#line 4482 "qmljs.g" +#line 4516 "qmljs.g" - case 586: { + case 589: { auto importClause = new (pool) AST::ImportClause(stringRef(1), sym(3).NamedImports); importClause->importedDefaultBindingToken = loc(1); sym(1).ImportClause = importClause; } break; -#line 4493 "qmljs.g" +#line 4527 "qmljs.g" - case 588: { + case 591: { auto import = new (pool) AST::NameSpaceImport(stringRef(3)); import->starToken = loc(1); import->importedBindingToken = loc(3); sym(1).NameSpaceImport = import; } break; -#line 4503 "qmljs.g" +#line 4537 "qmljs.g" - case 589: { + case 592: { auto namedImports = new (pool) AST::NamedImports(); namedImports->leftBraceToken = loc(1); namedImports->rightBraceToken = loc(2); sym(1).NamedImports = namedImports; } break; -#line 4512 "qmljs.g" +#line 4546 "qmljs.g" - case 590: { + case 593: { auto namedImports = new (pool) AST::NamedImports(sym(2).ImportsList->finish()); namedImports->leftBraceToken = loc(1); namedImports->rightBraceToken = loc(3); sym(1).NamedImports = namedImports; } break; -#line 4521 "qmljs.g" +#line 4555 "qmljs.g" - case 591: { + case 594: { auto namedImports = new (pool) AST::NamedImports(sym(2).ImportsList->finish()); namedImports->leftBraceToken = loc(1); namedImports->rightBraceToken = loc(4); sym(1).NamedImports = namedImports; } break; -#line 4531 "qmljs.g" +#line 4565 "qmljs.g" - case 592: { + case 595: { auto clause = new (pool) AST::FromClause(stringRef(2)); clause->fromToken = loc(1); clause->moduleSpecifierToken = loc(2); sym(1).FromClause = clause; } break; -#line 4541 "qmljs.g" +#line 4575 "qmljs.g" - case 593: { + case 596: { auto importsList = new (pool) AST::ImportsList(sym(1).ImportSpecifier); importsList->importSpecifierToken = loc(1); sym(1).ImportsList = importsList; } break; -#line 4549 "qmljs.g" +#line 4583 "qmljs.g" - case 594: { + case 597: { auto importsList = new (pool) AST::ImportsList(sym(1).ImportsList, sym(3).ImportSpecifier); importsList->importSpecifierToken = loc(3); sym(1).ImportsList = importsList; } break; -#line 4561 "qmljs.g" +#line 4595 "qmljs.g" - case 595: { + case 598: { auto importSpecifier = new (pool) AST::ImportSpecifier(stringRef(1)); importSpecifier->importedBindingToken = loc(1); sym(1).ImportSpecifier = importSpecifier; } break; -#line 4569 "qmljs.g" +#line 4603 "qmljs.g" - case 596: { + case 599: { auto importSpecifier = new (pool) AST::ImportSpecifier(stringRef(1), stringRef(3)); importSpecifier->identifierToken = loc(1); importSpecifier->importedBindingToken = loc(3); sym(1).ImportSpecifier = importSpecifier; } break; -#line 4586 "qmljs.g" +#line 4620 "qmljs.g" - case 599: { + case 602: { int token = lookaheadToken(lexer); if (token == T_FUNCTION || token == T_FUNCTION_STAR || token == T_CLASS) pushToken(T_FORCE_DECLARATION); } break; -#line 4595 "qmljs.g" +#line 4629 "qmljs.g" - case 600: { + case 603: { auto exportDeclaration = new (pool) AST::ExportDeclaration(sym(3).FromClause); exportDeclaration->exportToken = loc(1); sym(1).ExportDeclaration = exportDeclaration; } break; -#line 4603 "qmljs.g" +#line 4637 "qmljs.g" - case 601: { + case 604: { auto exportDeclaration = new (pool) AST::ExportDeclaration(sym(2).ExportClause, sym(3).FromClause); exportDeclaration->exportToken = loc(1); sym(1).ExportDeclaration = exportDeclaration; } break; -#line 4611 "qmljs.g" +#line 4645 "qmljs.g" - case 602: { + case 605: { auto exportDeclaration = new (pool) AST::ExportDeclaration(sym(2).ExportClause); exportDeclaration->exportToken = loc(1); sym(1).ExportDeclaration = exportDeclaration; } break; -#line 4619 "qmljs.g" - case 603: Q_FALLTHROUGH(); -#line 4621 "qmljs.g" +#line 4653 "qmljs.g" + case 606: Q_FALLTHROUGH(); +#line 4655 "qmljs.g" - case 604: { + case 607: { auto exportDeclaration = new (pool) AST::ExportDeclaration(/*exportDefault=*/false, sym(2).Node); exportDeclaration->exportToken = loc(1); sym(1).ExportDeclaration = exportDeclaration; } break; -#line 4629 "qmljs.g" +#line 4663 "qmljs.g" - case 605: { + case 608: { if (auto *f = AST::cast<AST::FunctionDeclaration*>(sym(5).Node)) { if (f->name.isEmpty()) { f->name = stringRef(2); @@ -3527,9 +3559,9 @@ case 238: { } } Q_FALLTHROUGH(); -#line 4640 "qmljs.g" +#line 4674 "qmljs.g" - case 606: { + case 609: { // Emulate 15.2.3.11 if (auto *cls = AST::cast<AST::ClassDeclaration*>(sym(5).Node)) { if (cls->name.isEmpty()) { @@ -3543,9 +3575,9 @@ case 238: { sym(1).ExportDeclaration = exportDeclaration; } break; -#line 4656 "qmljs.g" +#line 4690 "qmljs.g" - case 607: { + case 610: { // if lhs is an identifier expression and rhs is an anonymous function expression, we need to assign the name of lhs to the function if (auto *f = asAnonymousFunctionDefinition(sym(4).Node)) { f->name = stringRef(2); @@ -3559,63 +3591,63 @@ case 238: { sym(1).ExportDeclaration = exportDeclaration; } break; -#line 4673 "qmljs.g" +#line 4707 "qmljs.g" - case 608: { + case 611: { auto exportClause = new (pool) AST::ExportClause(); exportClause->leftBraceToken = loc(1); exportClause->rightBraceToken = loc(2); sym(1).ExportClause = exportClause; } break; -#line 4682 "qmljs.g" +#line 4716 "qmljs.g" - case 609: { + case 612: { auto exportClause = new (pool) AST::ExportClause(sym(2).ExportsList->finish()); exportClause->leftBraceToken = loc(1); exportClause->rightBraceToken = loc(3); sym(1).ExportClause = exportClause; } break; -#line 4691 "qmljs.g" +#line 4725 "qmljs.g" - case 610: { + case 613: { auto exportClause = new (pool) AST::ExportClause(sym(2).ExportsList->finish()); exportClause->leftBraceToken = loc(1); exportClause->rightBraceToken = loc(4); sym(1).ExportClause = exportClause; } break; -#line 4701 "qmljs.g" +#line 4735 "qmljs.g" - case 611: { + case 614: { sym(1).ExportsList = new (pool) AST::ExportsList(sym(1).ExportSpecifier); } break; -#line 4707 "qmljs.g" +#line 4741 "qmljs.g" - case 612: { + case 615: { sym(1).ExportsList = new (pool) AST::ExportsList(sym(1).ExportsList, sym(3).ExportSpecifier); } break; -#line 4714 "qmljs.g" +#line 4748 "qmljs.g" - case 613: { + case 616: { auto exportSpecifier = new (pool) AST::ExportSpecifier(stringRef(1)); exportSpecifier->identifierToken = loc(1); sym(1).ExportSpecifier = exportSpecifier; } break; -#line 4722 "qmljs.g" +#line 4756 "qmljs.g" - case 614: { + case 617: { auto exportSpecifier = new (pool) AST::ExportSpecifier(stringRef(1), stringRef(3)); exportSpecifier->identifierToken = loc(1); exportSpecifier->exportedIdentifierToken = loc(3); sym(1).ExportSpecifier = exportSpecifier; } break; -#line 4733 "qmljs.g" +#line 4767 "qmljs.g" // ------------ end of switch statement } // switch diff --git a/src/libs/qmljs/parser/qmljsparser_p.h b/src/libs/qmljs/parser/qmljsparser_p.h index 9d9a0f2fc9..e7a81f3208 100644 --- a/src/libs/qmljs/parser/qmljsparser_p.h +++ b/src/libs/qmljs/parser/qmljsparser_p.h @@ -1,3 +1,5 @@ + +#line 185 "qmljs.g" /**************************************************************************** ** ** Copyright (C) 2016 The Qt Company Ltd. @@ -22,7 +24,6 @@ ** be met: https://www.gnu.org/licenses/gpl-3.0.html. ** ****************************************************************************/ -#line 223 "qmljs.g" // @@ -291,27 +292,27 @@ protected: -#line 1828 "qmljs.g" +#line 1862 "qmljs.g" -#define J_SCRIPT_REGEXPLITERAL_RULE1 161 +#define J_SCRIPT_REGEXPLITERAL_RULE1 164 -#line 1840 "qmljs.g" +#line 1874 "qmljs.g" -#define J_SCRIPT_REGEXPLITERAL_RULE2 162 +#define J_SCRIPT_REGEXPLITERAL_RULE2 165 -#line 3389 "qmljs.g" +#line 3423 "qmljs.g" -#define J_SCRIPT_EXPRESSIONSTATEMENTLOOKAHEAD_RULE 460 +#define J_SCRIPT_EXPRESSIONSTATEMENTLOOKAHEAD_RULE 463 -#line 4041 "qmljs.g" +#line 4075 "qmljs.g" -#define J_SCRIPT_CONCISEBODYLOOKAHEAD_RULE 530 +#define J_SCRIPT_CONCISEBODYLOOKAHEAD_RULE 533 -#line 4583 "qmljs.g" +#line 4617 "qmljs.g" -#define J_SCRIPT_EXPORTDECLARATIONLOOKAHEAD_RULE 599 +#define J_SCRIPT_EXPORTDECLARATIONLOOKAHEAD_RULE 602 -#line 4867 "qmljs.g" +#line 4901 "qmljs.g" QT_QML_END_NAMESPACE diff --git a/src/libs/qmljs/qmljscheck.cpp b/src/libs/qmljs/qmljscheck.cpp index f58b414487..175ea0341d 100644 --- a/src/libs/qmljs/qmljscheck.cpp +++ b/src/libs/qmljs/qmljscheck.cpp @@ -502,13 +502,13 @@ protected: return false; } - bool visit(Block *) override + bool openBlock() { ++_block; return true; } - void endVisit(Block *) override + void closeBlock() { auto it = _declaredBlockVariables.begin(); auto end = _declaredBlockVariables.end(); @@ -521,6 +521,26 @@ protected: --_block; } + bool visit(Block *) override + { + return openBlock(); + } + + void endVisit(Block *) override + { + closeBlock(); + } + + bool visit(Catch *) override + { + return openBlock(); + } + + void endVisit(Catch *) override + { + closeBlock(); + } + void throwRecursionDepthError() override { addMessage(ErrHitMaximumRecursion, SourceLocation()); diff --git a/src/libs/qtcreatorcdbext/pycdbextmodule.cpp b/src/libs/qtcreatorcdbext/pycdbextmodule.cpp index c1584587c0..49eed21616 100644 --- a/src/libs/qtcreatorcdbext/pycdbextmodule.cpp +++ b/src/libs/qtcreatorcdbext/pycdbextmodule.cpp @@ -220,17 +220,13 @@ static PyObject *cdbext_listOfLocals(PyObject *, PyObject *args) // -> [ Value ] ++currentPartialIname; // skip "local" part ULONG symbolGroupIndex = 0; - ULONG childEndIndex = 0; for (;symbolGroupIndex < scopeEnd; ++symbolGroupIndex) { PyValue value(symbolGroupIndex, symbolGroup); - if (childEndIndex <= symbolGroupIndex) { // do not return a child value - if (value.name() == *currentPartialIname) { - PyList_Append(locals, createPythonObject(value)); - return locals; - } - ++childEndIndex; + if (value.name() == *currentPartialIname) { + PyList_Append(locals, createPythonObject(value)); + return locals; } - childEndIndex += ULONG(value.childCount()); + symbolGroupIndex += value.currentNumberOfDescendants(); } } diff --git a/src/libs/qtcreatorcdbext/pyvalue.cpp b/src/libs/qtcreatorcdbext/pyvalue.cpp index a56cb08ba9..c92b694bf3 100644 --- a/src/libs/qtcreatorcdbext/pyvalue.cpp +++ b/src/libs/qtcreatorcdbext/pyvalue.cpp @@ -278,13 +278,18 @@ PyValue PyValue::childFromIndex(int index) int offset = index + 1; for (ULONG childIndex = m_index + 1; childIndex < m_index + offset; ) { - const ULONG childDescendantCount = currentNumberOfDescendants(childIndex, m_symbolGroup); + const ULONG childDescendantCount = ::currentNumberOfDescendants(childIndex, m_symbolGroup); childIndex += childDescendantCount + 1; offset += childDescendantCount; } return PyValue(m_index + offset, m_symbolGroup); } +ULONG PyValue::currentNumberOfDescendants() +{ + return ::currentNumberOfDescendants(m_index, m_symbolGroup); +} + PyValue PyValue::createValue(ULONG64 address, const PyType &type) { if (debuggingValueEnabled()) { diff --git a/src/libs/qtcreatorcdbext/pyvalue.h b/src/libs/qtcreatorcdbext/pyvalue.h index fa89c73062..045658a01b 100644 --- a/src/libs/qtcreatorcdbext/pyvalue.h +++ b/src/libs/qtcreatorcdbext/pyvalue.h @@ -55,6 +55,7 @@ public: PyValue childFromName(const std::string &name); PyValue childFromField(const PyField &field); PyValue childFromIndex(int index); + ULONG currentNumberOfDescendants(); static PyValue createValue(ULONG64 address, const PyType &type); static int tag(const std::string &typeName); diff --git a/src/libs/qtcreatorcdbext/qtcreatorcdbextension.cpp b/src/libs/qtcreatorcdbext/qtcreatorcdbextension.cpp index f60ad90cc9..e9bdd5af92 100644 --- a/src/libs/qtcreatorcdbext/qtcreatorcdbextension.cpp +++ b/src/libs/qtcreatorcdbext/qtcreatorcdbextension.cpp @@ -1250,7 +1250,7 @@ extern "C" HRESULT CALLBACK qmlstack(CIDebugClient *client, PCSTR argsIn) // the start assuming this is invoked for crashed applications. std::ostringstream callStr; const QtInfo &qtInfo = QtInfo::get(SymbolGroupValueContext(exc.dataSpaces(), exc.symbols())); - callStr << qtInfo.prependQtModule("qt_v4StackTrace(", QtInfo::Qml) << std::showbase << std::hex + callStr << qtInfo.prependQtModule("qt_v4StackTraceForEngine(", QtInfo::Qml) << std::showbase << std::hex << jsExecutionEngine << std::dec << std::noshowbase << ')'; std::wstring wOutput; if (!ExtensionContext::instance().call(callStr.str(), ExtensionContext::CallWithExceptionsHandled, &wOutput, &errorMessage)) diff --git a/src/libs/utils/fileutils.cpp b/src/libs/utils/fileutils.cpp index 4b55c08301..23be348698 100644 --- a/src/libs/utils/fileutils.cpp +++ b/src/libs/utils/fileutils.cpp @@ -33,7 +33,6 @@ #include <QDataStream> #include <QDateTime> #include <QDebug> -#include <QDir> #include <QOperatingSystemVersion> #include <QRegularExpression> #include <QTimer> @@ -202,46 +201,22 @@ bool FileUtils::removeRecursively(const FilePath &filePath, QString *error) Returns whether the operation succeeded. */ -bool FileUtils::copyRecursively(const FilePath &srcFilePath, const FilePath &tgtFilePath, - QString *error, const std::function<bool (QFileInfo, QFileInfo, QString *)> ©Helper) -{ - QFileInfo srcFileInfo = srcFilePath.toFileInfo(); - if (srcFileInfo.isDir()) { - if (!tgtFilePath.exists()) { - QDir targetDir(tgtFilePath.toString()); - targetDir.cdUp(); - if (!targetDir.mkdir(tgtFilePath.fileName())) { - if (error) { - *error = QCoreApplication::translate("Utils::FileUtils", "Failed to create directory \"%1\".") - .arg(tgtFilePath.toUserOutput()); - } - return false; - } - } - QDir sourceDir(srcFilePath.toString()); - const QStringList fileNames = sourceDir.entryList( - QDir::Files | QDir::Dirs | QDir::NoDotAndDotDot | QDir::Hidden | QDir::System); - for (const QString &fileName : fileNames) { - const FilePath newSrcFilePath = srcFilePath / fileName; - const FilePath newTgtFilePath = tgtFilePath / fileName; - if (!copyRecursively(newSrcFilePath, newTgtFilePath, error, copyHelper)) - return false; - } - } else { - if (copyHelper) { - if (!copyHelper(srcFileInfo, tgtFilePath.toFileInfo(), error)) - return false; - } else { - if (!QFile::copy(srcFilePath.toString(), tgtFilePath.toString())) { + +bool FileUtils::copyRecursively(const FilePath &srcFilePath, const FilePath &tgtFilePath, QString *error) +{ + return copyRecursively( + srcFilePath, tgtFilePath, error, [](const QFileInfo &src, const QFileInfo &dest, QString *error) { + if (!QFile::copy(src.filePath(), dest.filePath())) { if (error) { - *error = QCoreApplication::translate("Utils::FileUtils", "Could not copy file \"%1\" to \"%2\".") - .arg(srcFilePath.toUserOutput(), tgtFilePath.toUserOutput()); + *error = QCoreApplication::translate("Utils::FileUtils", + "Could not copy file \"%1\" to \"%2\".") + .arg(FilePath::fromFileInfo(src).toUserOutput(), + FilePath::fromFileInfo(dest).toUserOutput()); } return false; } - } - } - return true; + return true; + }); } /*! diff --git a/src/libs/utils/fileutils.h b/src/libs/utils/fileutils.h index dc57d1add1..5db3a0a1c2 100644 --- a/src/libs/utils/fileutils.h +++ b/src/libs/utils/fileutils.h @@ -30,10 +30,12 @@ #include "hostosinfo.h" #include <QCoreApplication> -#include <QXmlStreamWriter> // Mac. +#include <QDir> +#include <QFileInfo> #include <QMetaType> #include <QStringList> #include <QUrl> +#include <QXmlStreamWriter> // Mac. #include <functional> #include <memory> @@ -179,9 +181,14 @@ public: #endif // QT_GUI_LIB static bool removeRecursively(const FilePath &filePath, QString *error = nullptr); - static bool copyRecursively( - const FilePath &srcFilePath, const FilePath &tgtFilePath, QString *error = nullptr, - const std::function<bool (QFileInfo, QFileInfo, QString *)> ©Helper = nullptr); + static bool copyRecursively(const FilePath &srcFilePath, + const FilePath &tgtFilePath, + QString *error = nullptr); + template<typename T> + static bool copyRecursively(const FilePath &srcFilePath, + const FilePath &tgtFilePath, + QString *error, + T &©Helper); static FilePath resolveSymlinks(const FilePath &path); static QString fileSystemFriendlyName(const QString &name); static int indexOfQmakeUnfriendly(const QString &name, int startpos = 0); @@ -195,6 +202,42 @@ public: static QByteArray fileId(const FilePath &fileName); }; +template<typename T> +bool FileUtils::copyRecursively(const FilePath &srcFilePath, + const FilePath &tgtFilePath, + QString *error, + T &©Helper) +{ + const QFileInfo srcFileInfo = srcFilePath.toFileInfo(); + if (srcFileInfo.isDir()) { + if (!tgtFilePath.exists()) { + QDir targetDir(tgtFilePath.toString()); + targetDir.cdUp(); + if (!targetDir.mkdir(tgtFilePath.fileName())) { + if (error) { + *error = QCoreApplication::translate("Utils::FileUtils", + "Failed to create directory \"%1\".") + .arg(tgtFilePath.toUserOutput()); + } + return false; + } + } + const QDir sourceDir(srcFilePath.toString()); + const QStringList fileNames = sourceDir.entryList( + QDir::Files | QDir::Dirs | QDir::NoDotAndDotDot | QDir::Hidden | QDir::System); + for (const QString &fileName : fileNames) { + const FilePath newSrcFilePath = srcFilePath / fileName; + const FilePath newTgtFilePath = tgtFilePath / fileName; + if (!copyRecursively(newSrcFilePath, newTgtFilePath, error, copyHelper)) + return false; + } + } else { + if (!copyHelper(srcFileInfo, tgtFilePath.toFileInfo(), error)) + return false; + } + return true; +} + // for actually finding out if e.g. directories are writable on Windows #ifdef Q_OS_WIN diff --git a/src/libs/utils/namevaluedictionary.cpp b/src/libs/utils/namevaluedictionary.cpp index b6218d9592..57eb2ffe99 100644 --- a/src/libs/utils/namevaluedictionary.cpp +++ b/src/libs/utils/namevaluedictionary.cpp @@ -154,7 +154,7 @@ NameValueItems NameValueDictionary::diff(const NameValueDictionary &other, bool const QString &newValue = otherIt.value().first; const bool oldEnabled = thisIt.value().second; const bool newEnabled = otherIt.value().second; - if (oldValue != newValue) { + if (oldValue != newValue || oldEnabled != newEnabled) { if (checkAppendPrepend && newValue.startsWith(oldValue) && oldEnabled == newEnabled) { QString appended = newValue.right(newValue.size() - oldValue.size()); diff --git a/src/libs/utils/outputformatter.cpp b/src/libs/utils/outputformatter.cpp index 355fcb24ab..34c76d3ce6 100644 --- a/src/libs/utils/outputformatter.cpp +++ b/src/libs/utils/outputformatter.cpp @@ -140,12 +140,15 @@ FilePath OutputLineParser::absoluteFilePath(const FilePath &filePath) return filePath; FilePaths candidates; for (const FilePath &dir : searchDirectories()) { - const FilePath candidate = dir.pathAppended(filePath.toString()); - if (candidate.exists() || d->skipFileExistsCheck) - candidates << candidate; + FilePath candidate = dir.pathAppended(filePath.toString()); + if (candidate.exists() || d->skipFileExistsCheck) { + candidate = FilePath::fromString(QDir::cleanPath(candidate.toString())); + if (!candidates.contains(candidate)) + candidates << candidate; + } } if (candidates.count() == 1) - return FilePath::fromString(QDir::cleanPath(candidates.first().toString())); + return candidates.first(); QString fp = filePath.toString(); while (fp.startsWith("../")) @@ -282,12 +285,24 @@ void OutputFormatter::overridePostPrintAction(const PostPrintAction &postPrintAc void OutputFormatter::doAppendMessage(const QString &text, OutputFormat format) { - const QTextCharFormat charFmt = charFormat(format); - const QList<FormattedText> formattedText = parseAnsi(text, charFmt); + QTextCharFormat charFmt = charFormat(format); + QList<FormattedText> formattedText = parseAnsi(text, charFmt); const QString cleanLine = std::accumulate(formattedText.begin(), formattedText.end(), QString(), [](const FormattedText &t1, const FormattedText &t2) { return t1.text + t2.text; }); QList<OutputLineParser *> involvedParsers; const OutputLineParser::Result res = handleMessage(cleanLine, format, involvedParsers); + + // If the line was recognized by a parser and a redirection was detected for that parser, + // then our formatting should reflect that redirection as well, i.e. print in red + // even if the nominal format is stdout. + if (!involvedParsers.isEmpty()) { + const OutputFormat formatForParser = outputTypeForParser(involvedParsers.last(), format); + if (formatForParser != format && cleanLine == text && formattedText.length() == 1) { + charFmt = charFormat(formatForParser); + formattedText.first().format = charFmt; + } + } + if (res.newContent) { append(res.newContent.value(), charFmt); return; diff --git a/src/libs/utils/stylehelper.cpp b/src/libs/utils/stylehelper.cpp index 6f8868cc7b..4b317116c4 100644 --- a/src/libs/utils/stylehelper.cpp +++ b/src/libs/utils/stylehelper.cpp @@ -546,6 +546,41 @@ QLinearGradient StyleHelper::statusBarGradient(const QRect &statusBarRect) return grad; } +QIcon StyleHelper::getIconFromIconFont(const QString &fontName, const QList<IconFontHelper> ¶meters) +{ + QFontDatabase a; + + QTC_ASSERT(a.hasFamily(fontName), {}); + + if (!a.hasFamily(fontName)) + return {}; + + QIcon icon; + + for (const IconFontHelper &p : parameters) { + const int maxDpr = qRound(qApp->devicePixelRatio()); + for (int dpr = 1; dpr <= maxDpr; dpr++) { + QPixmap pixmap(p.size() * dpr); + pixmap.setDevicePixelRatio(dpr); + pixmap.fill(Qt::transparent); + + QFont font(fontName); + font.setPixelSize(p.size().height()); + + QPainter painter(&pixmap); + painter.save(); + painter.setPen(p.color()); + painter.setFont(font); + painter.drawText(QRectF(QPoint(0, 0), p.size()), p.iconSymbol()); + painter.restore(); + + icon.addPixmap(pixmap, p.mode(), p.state()); + } + } + + return icon; +} + QIcon StyleHelper::getIconFromIconFont(const QString &fontName, const QString &iconSymbol, int fontSize, int iconSize, QColor color) { QFontDatabase a; diff --git a/src/libs/utils/stylehelper.h b/src/libs/utils/stylehelper.h index 09f3253435..a1a24a8d5b 100644 --- a/src/libs/utils/stylehelper.h +++ b/src/libs/utils/stylehelper.h @@ -93,6 +93,36 @@ public: static void tintImage(QImage &img, const QColor &tintColor); static QLinearGradient statusBarGradient(const QRect &statusBarRect); + class IconFontHelper + { + public: + IconFontHelper(const QString &iconSymbol, + const QColor &color, + const QSize &size, + QIcon::Mode mode = QIcon::Normal, + QIcon::State state = QIcon::Off) + : m_iconSymbol(iconSymbol) + , m_color(color) + , m_size(size) + , m_mode(mode) + , m_state(state) + {} + + QString iconSymbol() const { return m_iconSymbol; } + QColor color() const { return m_color; } + QSize size() const { return m_size; } + QIcon::Mode mode() const { return m_mode; } + QIcon::State state() const { return m_state; } + + private: + QString m_iconSymbol; + QColor m_color; + QSize m_size; + QIcon::Mode m_mode; + QIcon::State m_state; + }; + + static QIcon getIconFromIconFont(const QString &fontName, const QList<IconFontHelper> ¶meters); static QIcon getIconFromIconFont(const QString &fontName, const QString &iconSymbol, int fontSize, int iconSize, QColor color); static QIcon getIconFromIconFont(const QString &fontName, const QString &iconSymbol, int fontSize, int iconSize); diff --git a/src/plugins/android/androidavdmanager.cpp b/src/plugins/android/androidavdmanager.cpp index 55ae7a5cdc..f27247300e 100644 --- a/src/plugins/android/androidavdmanager.cpp +++ b/src/plugins/android/androidavdmanager.cpp @@ -25,6 +25,7 @@ #include "androidavdmanager.h" #include <coreplugin/icore.h> +#include <projectexplorer/projectexplorerconstants.h> #include <utils/algorithm.h> #include <utils/qtcassert.h> #include <utils/runextensions.h> @@ -424,8 +425,8 @@ AndroidDeviceInfoList AvdManagerOutputParser::parseAvdList(const QString &output } } else if (parseAvd(avdInfo, &avd)) { // armeabi-v7a devices can also run armeabi code - if (avd.cpuAbi.contains("armeabi-v7a")) - avd.cpuAbi << "armeabi"; + if (avd.cpuAbi.contains(ProjectExplorer::Constants::ANDROID_ABI_ARMEABI_V7A)) + avd.cpuAbi << ProjectExplorer::Constants::ANDROID_ABI_ARMEABI; avd.state = AndroidDeviceInfo::OkState; avd.type = AndroidDeviceInfo::Emulator; avdList << avd; diff --git a/src/plugins/android/androidbuildapkwidget.cpp b/src/plugins/android/androidbuildapkwidget.cpp index 6439279c48..5396a3de3e 100644 --- a/src/plugins/android/androidbuildapkwidget.cpp +++ b/src/plugins/android/androidbuildapkwidget.cpp @@ -50,6 +50,7 @@ #include <QComboBox> #include <QGroupBox> #include <QFileDialog> +#include <QFormLayout> #include <QLabel> #include <QListView> #include <QPushButton> @@ -74,7 +75,6 @@ AndroidBuildApkWidget::AndroidBuildApkWidget(AndroidBuildApkStep *step) vbox->addWidget(createSignPackageGroup()); vbox->addWidget(createApplicationGroup()); vbox->addWidget(createAdvancedGroup()); - vbox->addWidget(createCreateTemplatesGroup()); vbox->addWidget(createAdditionalLibrariesGroup()); connect(m_step->buildConfiguration(), &BuildConfiguration::buildTypeChanged, @@ -96,7 +96,7 @@ QWidget *AndroidBuildApkWidget::createApplicationGroup() auto group = new QGroupBox(tr("Application"), this); - auto targetSDKComboBox = new QComboBox(group); + auto targetSDKComboBox = new QComboBox(); targetSDKComboBox->addItems(targets); targetSDKComboBox->setCurrentIndex(targets.indexOf(m_step->buildTargetSdk())); @@ -107,9 +107,18 @@ QWidget *AndroidBuildApkWidget::createApplicationGroup() AndroidManager::updateGradleProperties(step()->target(), QString()); // FIXME: Use real key. }); - auto hbox = new QHBoxLayout(group); - hbox->addWidget(new QLabel(tr("Android build SDK:"), group)); - hbox->addWidget(targetSDKComboBox); + auto formLayout = new QFormLayout(group); + formLayout->addRow(tr("Android build SDK:"), targetSDKComboBox); + + auto createAndroidTemplatesButton = new QPushButton(tr("Create Templates")); + createAndroidTemplatesButton->setToolTip( + tr("Create an Android package for Custom Java code, assets, and Gradle configurations.")); + connect(createAndroidTemplatesButton, &QAbstractButton::clicked, this, [this] { + CreateAndroidManifestWizard wizard(m_step->buildSystem()); + wizard.exec(); + }); + + formLayout->addRow(tr("Android customization:"), createAndroidTemplatesButton); return group; } @@ -120,7 +129,7 @@ QWidget *AndroidBuildApkWidget::createSignPackageGroup() sizePolicy.setHorizontalStretch(0); sizePolicy.setVerticalStretch(0); - auto group = new QGroupBox(tr("Sign package"), this); + auto group = new QGroupBox(tr("Application Signature"), this); auto keystoreLocationLabel = new QLabel(tr("Keystore:"), group); keystoreLocationLabel->setAlignment(Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter); @@ -242,24 +251,6 @@ QWidget *AndroidBuildApkWidget::createAdvancedGroup() return group; } -QWidget *AndroidBuildApkWidget::createCreateTemplatesGroup() -{ - auto createTemplatesGroupBox = new QGroupBox(tr("Android")); - createTemplatesGroupBox->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); - - auto createAndroidTemplatesButton = new QPushButton(tr("Create Templates")); - connect(createAndroidTemplatesButton, &QAbstractButton::clicked, this, [this] { - CreateAndroidManifestWizard wizard(m_step->buildSystem()); - wizard.exec(); - }); - - auto horizontalLayout = new QHBoxLayout(createTemplatesGroupBox); - horizontalLayout->addWidget(createAndroidTemplatesButton); - horizontalLayout->addStretch(1); - - return createTemplatesGroupBox; -} - QWidget *AndroidBuildApkWidget::createAdditionalLibrariesGroup() { auto group = new QGroupBox(tr("Additional Libraries")); diff --git a/src/plugins/android/androidbuildapkwidget.h b/src/plugins/android/androidbuildapkwidget.h index 5f6875abe2..e97ce01aae 100644 --- a/src/plugins/android/androidbuildapkwidget.h +++ b/src/plugins/android/androidbuildapkwidget.h @@ -63,7 +63,6 @@ private: QWidget *createApplicationGroup(); QWidget *createSignPackageGroup(); QWidget *createAdvancedGroup(); - QWidget *createCreateTemplatesGroup(); QWidget *createAdditionalLibrariesGroup(); private: diff --git a/src/plugins/android/androidconfigurations.cpp b/src/plugins/android/androidconfigurations.cpp index 105acc8e19..e8395e4eed 100644 --- a/src/plugins/android/androidconfigurations.cpp +++ b/src/plugins/android/androidconfigurations.cpp @@ -39,6 +39,7 @@ #include <projectexplorer/kitinformation.h> #include <projectexplorer/kitmanager.h> #include <projectexplorer/project.h> +#include <projectexplorer/projectexplorerconstants.h> #include <projectexplorer/session.h> #include <projectexplorer/toolchainmanager.h> @@ -1284,7 +1285,12 @@ void AndroidConfigurations::removeUnusedDebuggers() static bool containsAllAbis(const QStringList &abis) { - QStringList supportedAbis{"armeabi-v7a", "arm64-v8a", "x86", "x86_64"}; + QStringList supportedAbis{ + ProjectExplorer::Constants::ANDROID_ABI_ARMEABI_V7A, + ProjectExplorer::Constants::ANDROID_ABI_ARM64_V8A, + ProjectExplorer::Constants::ANDROID_ABI_X86, + ProjectExplorer::Constants::ANDROID_ABI_X86_64, + }; for (const QString &abi : abis) if (supportedAbis.contains(abi)) supportedAbis.removeOne(abi); @@ -1524,6 +1530,21 @@ AndroidConfigurations::AndroidConfigurations() AndroidConfigurations::~AndroidConfigurations() = default; +static Utils::FilePath androidStudioPath() +{ + if (Utils::HostOsInfo::isWindowsHost()) { + const QLatin1String registryKey("HKEY_LOCAL_MACHINE\\SOFTWARE\\Android Studio"); + const QLatin1String valueName("Path"); + #if defined(Q_OS_WIN) + const QSettings settings64(registryKey, QSettings::Registry64Format); + const QSettings settings32(registryKey, QSettings::Registry32Format); + return Utils::FilePath::fromUserInput( + settings64.value(valueName, settings32.value(valueName).toString()).toString()); + #endif + } + return {}; // TODO non-Windows +} + FilePath AndroidConfig::getJdkPath() { FilePath jdkHome; @@ -1563,6 +1584,16 @@ FilePath AndroidConfig::getJdkPath() break; } } + + // Nothing found yet? Let's try finding Android Studio's jdk + if (jdkHome.isEmpty()) { + const Utils::FilePath androidStudioSdkPath = androidStudioPath(); + if (!androidStudioSdkPath.isEmpty()) { + const Utils::FilePath androidStudioSdkJrePath = androidStudioSdkPath / "jre"; + if (androidStudioSdkJrePath.exists()) + jdkHome = androidStudioSdkJrePath; + } + } } else { QStringList args; if (HostOsInfo::isMacHost()) @@ -1581,7 +1612,8 @@ FilePath AndroidConfig::getJdkPath() jdkHome = FilePath::fromUtf8(jdkPath); } else { jdkPath.replace("bin/java", ""); // For OpenJDK 11 - jdkPath.replace("jre/bin/java", ""); + jdkPath.replace("jre", ""); + jdkPath.replace("//", "/"); jdkHome = FilePath::fromUtf8(jdkPath); } } diff --git a/src/plugins/android/androidconstants.h b/src/plugins/android/androidconstants.h index 8c8f638555..726a9537c8 100644 --- a/src/plugins/android/androidconstants.h +++ b/src/plugins/android/androidconstants.h @@ -64,6 +64,7 @@ const char JAVA_MIMETYPE[] = "text/x-java"; const char ANDROID_ARCHITECTURE[] = "Android.Architecture"; const char ANDROID_PACKAGE_SOURCE_DIR[] = "AndroidPackageSourceDir"; const char ANDROID_EXTRA_LIBS[] = "AndroidExtraLibs"; +const char ANDROID_ABIS[] = "ANDROID_ABIS"; const char ANDROID_PACKAGENAME[] = "Android.PackageName"; const char ANDROID_PACKAGE_INSTALLATION_STEP_ID[] diff --git a/src/plugins/android/androiddeployqtstep.cpp b/src/plugins/android/androiddeployqtstep.cpp index d82d050511..96be06a696 100644 --- a/src/plugins/android/androiddeployqtstep.cpp +++ b/src/plugins/android/androiddeployqtstep.cpp @@ -38,6 +38,7 @@ #include <coreplugin/messagemanager.h> #include <projectexplorer/buildconfiguration.h> +#include <projectexplorer/buildsystem.h> #include <projectexplorer/buildsteplist.h> #include <projectexplorer/projectexplorerconstants.h> #include <projectexplorer/project.h> @@ -145,7 +146,7 @@ AndroidDeployQtStep::AndroidDeployQtStep(BuildStepList *parent, Utils::Id id) m_uninstallPreviousPackage = qt && qt->qtVersion() < QtSupport::QtVersionNumber(5, 4, 0); //: AndroidDeployQtStep default display name - setDefaultDisplayName(tr("Deploy to Android device")); + setDefaultDisplayName(tr("Deploy to Android Device")); connect(this, &AndroidDeployQtStep::askForUninstall, this, &AndroidDeployQtStep::slotAskForUninstall, @@ -207,6 +208,18 @@ bool AndroidDeployQtStep::init() if (!info.isValid()) // aborted return false; + const QString buildKey = target()->activeBuildKey(); + auto selectedAbis = buildSystem()->extraData(buildKey, Constants::ANDROID_ABIS).toStringList(); + + if (!selectedAbis.contains(info.cpuAbi.first())) { + Core::MessageManager::write( + tr("Android: The main ABI of the deployment device (%1) is not selected! The app " + "execution or debugging might not work properly. Add it from Projects > Build > " + "Build Steps > qmake > ABIs.") + .arg(info.cpuAbi.first()), + Core::MessageManager::WithFocus); + } + m_avdName = info.avdname; m_serialNumber = info.serialNumber; qCDebug(deployStepLog) << "Selected device info:" << info; @@ -484,7 +497,8 @@ void AndroidDeployQtStep::gatherFilesToPull() QString linkerName("linker"); QString libDirName("lib"); auto preferreABI = AndroidManager::apkDevicePreferredAbi(target()); - if (preferreABI == "arm64-v8a" || preferreABI == "x86_64") { + if (preferreABI == ProjectExplorer::Constants::ANDROID_ABI_ARM64_V8A + || preferreABI == ProjectExplorer::Constants::ANDROID_ABI_X86_64) { m_filesToPull["/system/bin/app_process64"] = buildDir + "app_process"; libDirName = "lib64"; linkerName = "linker64"; diff --git a/src/plugins/android/androidmanager.cpp b/src/plugins/android/androidmanager.cpp index f42bc1d042..8ce1298f8a 100644 --- a/src/plugins/android/androidmanager.cpp +++ b/src/plugins/android/androidmanager.cpp @@ -44,6 +44,7 @@ #include <projectexplorer/project.h> #include <projectexplorer/projectnodes.h> #include <projectexplorer/projectexplorer.h> +#include <projectexplorer/projectexplorerconstants.h> #include <projectexplorer/session.h> #include <projectexplorer/target.h> @@ -262,11 +263,11 @@ QStringList AndroidManager::applicationAbis(const Target *target) QString AndroidManager::archTriplet(const QString &abi) { - if (abi == "x86") { + if (abi == ProjectExplorer::Constants::ANDROID_ABI_X86) { return {"i686-linux-android"}; - } else if (abi == "x86_64") { + } else if (abi == ProjectExplorer::Constants::ANDROID_ABI_X86_64) { return {"x86_64-linux-android"}; - } else if (abi == "arm64-v8a") { + } else if (abi == ProjectExplorer::Constants::ANDROID_ABI_ARM64_V8A) { return {"aarch64-linux-android"}; } return {"arm-linux-androideabi"}; @@ -361,25 +362,25 @@ QString AndroidManager::devicePreferredAbi(const QStringList &deviceAbis, const Abi AndroidManager::androidAbi2Abi(const QString &androidAbi) { - if (androidAbi == "arm64-v8a") { + if (androidAbi == ProjectExplorer::Constants::ANDROID_ABI_ARM64_V8A) { return Abi{Abi::Architecture::ArmArchitecture, Abi::OS::LinuxOS, Abi::OSFlavor::AndroidLinuxFlavor, Abi::BinaryFormat::ElfFormat, 64, androidAbi}; - } else if (androidAbi == "armeabi-v7a") { + } else if (androidAbi == ProjectExplorer::Constants::ANDROID_ABI_ARMEABI_V7A) { return Abi{Abi::Architecture::ArmArchitecture, Abi::OS::LinuxOS, Abi::OSFlavor::AndroidLinuxFlavor, Abi::BinaryFormat::ElfFormat, 32, androidAbi}; - } else if (androidAbi == "x86_64") { + } else if (androidAbi == ProjectExplorer::Constants::ANDROID_ABI_X86_64) { return Abi{Abi::Architecture::X86Architecture, Abi::OS::LinuxOS, Abi::OSFlavor::AndroidLinuxFlavor, Abi::BinaryFormat::ElfFormat, 64, androidAbi}; - } else if (androidAbi == "x86") { + } else if (androidAbi == ProjectExplorer::Constants::ANDROID_ABI_X86) { return Abi{Abi::Architecture::X86Architecture, Abi::OS::LinuxOS, Abi::OSFlavor::AndroidLinuxFlavor, diff --git a/src/plugins/android/androidmanifesteditoriconcontainerwidget.h b/src/plugins/android/androidmanifesteditoriconcontainerwidget.h index b155dc80af..2e657d017a 100644 --- a/src/plugins/android/androidmanifesteditoriconcontainerwidget.h +++ b/src/plugins/android/androidmanifesteditoriconcontainerwidget.h @@ -29,6 +29,8 @@ #include <QVector> #include <QWidget> +#include <QCoreApplication> + namespace TextEditor { class TextEditorWidget; } @@ -40,6 +42,8 @@ class AndroidManifestEditorIconWidget; class AndroidManifestEditorIconContainerWidget : public QWidget { + Q_DECLARE_TR_FUNCTIONS(Android::Internal::AndroidManifestEditorIconContainerWidget) + public: explicit AndroidManifestEditorIconContainerWidget(QWidget *parent, TextEditor::TextEditorWidget *textEditorWidget); diff --git a/src/plugins/android/androidmanifesteditorwidget.cpp b/src/plugins/android/androidmanifesteditorwidget.cpp index 6efa02e98e..a235e431cb 100644 --- a/src/plugins/android/androidmanifesteditorwidget.cpp +++ b/src/plugins/android/androidmanifesteditorwidget.cpp @@ -64,7 +64,6 @@ #include <QFileDialog> #include <QFileInfo> #include <QFormLayout> -#include <QGroupBox> #include <QHBoxLayout> #include <QImage> #include <QLabel> @@ -134,338 +133,351 @@ AndroidManifestEditorWidget::AndroidManifestEditorWidget() this, &AndroidManifestEditorWidget::updateAfterFileLoad); } -void AndroidManifestEditorWidget::initializePage() +QGroupBox *AndroidManifestEditorWidget::createPermissionsGroupBox(QWidget *parent) { - QWidget *mainWidget = new QWidget; // different name + auto permissionsGroupBox = new QGroupBox(parent); + permissionsGroupBox->setTitle(tr("Permissions")); + auto layout = new QGridLayout(permissionsGroupBox); + + m_defaultPermissonsCheckBox = new QCheckBox(this); + m_defaultPermissonsCheckBox->setText(tr("Include default permissions for Qt modules.")); + layout->addWidget(m_defaultPermissonsCheckBox, 0, 0); + + m_defaultFeaturesCheckBox = new QCheckBox(this); + m_defaultFeaturesCheckBox->setText(tr("Include default features for Qt modules.")); + layout->addWidget(m_defaultFeaturesCheckBox, 1, 0); + + m_permissionsComboBox = new QComboBox(permissionsGroupBox); + m_permissionsComboBox->insertItems(0, QStringList() + << QLatin1String("android.permission.ACCESS_CHECKIN_PROPERTIES") + << QLatin1String("android.permission.ACCESS_COARSE_LOCATION") + << QLatin1String("android.permission.ACCESS_FINE_LOCATION") + << QLatin1String("android.permission.ACCESS_LOCATION_EXTRA_COMMANDS") + << QLatin1String("android.permission.ACCESS_MOCK_LOCATION") + << QLatin1String("android.permission.ACCESS_NETWORK_STATE") + << QLatin1String("android.permission.ACCESS_SURFACE_FLINGER") + << QLatin1String("android.permission.ACCESS_WIFI_STATE") + << QLatin1String("android.permission.ACCOUNT_MANAGER") + << QLatin1String("com.android.voicemail.permission.ADD_VOICEMAIL") + << QLatin1String("android.permission.AUTHENTICATE_ACCOUNTS") + << QLatin1String("android.permission.BATTERY_STATS") + << QLatin1String("android.permission.BIND_ACCESSIBILITY_SERVICE") + << QLatin1String("android.permission.BIND_APPWIDGET") + << QLatin1String("android.permission.BIND_DEVICE_ADMIN") + << QLatin1String("android.permission.BIND_INPUT_METHOD") + << QLatin1String("android.permission.BIND_REMOTEVIEWS") + << QLatin1String("android.permission.BIND_TEXT_SERVICE") + << QLatin1String("android.permission.BIND_VPN_SERVICE") + << QLatin1String("android.permission.BIND_WALLPAPER") + << QLatin1String("android.permission.BLUETOOTH") + << QLatin1String("android.permission.BLUETOOTH_ADMIN") + << QLatin1String("android.permission.BRICK") + << QLatin1String("android.permission.BROADCAST_PACKAGE_REMOVED") + << QLatin1String("android.permission.BROADCAST_SMS") + << QLatin1String("android.permission.BROADCAST_STICKY") + << QLatin1String("android.permission.BROADCAST_WAP_PUSH") + << QLatin1String("android.permission.CALL_PHONE") + << QLatin1String("android.permission.CALL_PRIVILEGED") + << QLatin1String("android.permission.CAMERA") + << QLatin1String("android.permission.CHANGE_COMPONENT_ENABLED_STATE") + << QLatin1String("android.permission.CHANGE_CONFIGURATION") + << QLatin1String("android.permission.CHANGE_NETWORK_STATE") + << QLatin1String("android.permission.CHANGE_WIFI_MULTICAST_STATE") + << QLatin1String("android.permission.CHANGE_WIFI_STATE") + << QLatin1String("android.permission.CLEAR_APP_CACHE") + << QLatin1String("android.permission.CLEAR_APP_USER_DATA") + << QLatin1String("android.permission.CONTROL_LOCATION_UPDATES") + << QLatin1String("android.permission.DELETE_CACHE_FILES") + << QLatin1String("android.permission.DELETE_PACKAGES") + << QLatin1String("android.permission.DEVICE_POWER") + << QLatin1String("android.permission.DIAGNOSTIC") + << QLatin1String("android.permission.DISABLE_KEYGUARD") + << QLatin1String("android.permission.DUMP") + << QLatin1String("android.permission.EXPAND_STATUS_BAR") + << QLatin1String("android.permission.FACTORY_TEST") + << QLatin1String("android.permission.FLASHLIGHT") + << QLatin1String("android.permission.FORCE_BACK") + << QLatin1String("android.permission.GET_ACCOUNTS") + << QLatin1String("android.permission.GET_PACKAGE_SIZE") + << QLatin1String("android.permission.GET_TASKS") + << QLatin1String("android.permission.GLOBAL_SEARCH") + << QLatin1String("android.permission.HARDWARE_TEST") + << QLatin1String("android.permission.INJECT_EVENTS") + << QLatin1String("android.permission.INSTALL_LOCATION_PROVIDER") + << QLatin1String("android.permission.INSTALL_PACKAGES") + << QLatin1String("android.permission.INTERNAL_SYSTEM_WINDOW") + << QLatin1String("android.permission.INTERNET") + << QLatin1String("android.permission.KILL_BACKGROUND_PROCESSES") + << QLatin1String("android.permission.MANAGE_ACCOUNTS") + << QLatin1String("android.permission.MANAGE_APP_TOKENS") + << QLatin1String("android.permission.MASTER_CLEAR") + << QLatin1String("android.permission.MODIFY_AUDIO_SETTINGS") + << QLatin1String("android.permission.MODIFY_PHONE_STATE") + << QLatin1String("android.permission.MOUNT_FORMAT_FILESYSTEMS") + << QLatin1String("android.permission.MOUNT_UNMOUNT_FILESYSTEMS") + << QLatin1String("android.permission.NFC") + << QLatin1String("android.permission.PERSISTENT_ACTIVITY") + << QLatin1String("android.permission.PROCESS_OUTGOING_CALLS") + << QLatin1String("android.permission.READ_CALENDAR") + << QLatin1String("android.permission.READ_CALL_LOG") + << QLatin1String("android.permission.READ_CONTACTS") + << QLatin1String("android.permission.READ_EXTERNAL_STORAGE") + << QLatin1String("android.permission.READ_FRAME_BUFFER") + << QLatin1String("com.android.browser.permission.READ_HISTORY_BOOKMARKS") + << QLatin1String("android.permission.READ_INPUT_STATE") + << QLatin1String("android.permission.READ_LOGS") + << QLatin1String("android.permission.READ_PHONE_STATE") + << QLatin1String("android.permission.READ_PROFILE") + << QLatin1String("android.permission.READ_SMS") + << QLatin1String("android.permission.READ_SOCIAL_STREAM") + << QLatin1String("android.permission.READ_SYNC_SETTINGS") + << QLatin1String("android.permission.READ_SYNC_STATS") + << QLatin1String("android.permission.READ_USER_DICTIONARY") + << QLatin1String("android.permission.REBOOT") + << QLatin1String("android.permission.RECEIVE_BOOT_COMPLETED") + << QLatin1String("android.permission.RECEIVE_MMS") + << QLatin1String("android.permission.RECEIVE_SMS") + << QLatin1String("android.permission.RECEIVE_WAP_PUSH") + << QLatin1String("android.permission.RECORD_AUDIO") + << QLatin1String("android.permission.REORDER_TASKS") + << QLatin1String("android.permission.RESTART_PACKAGES") + << QLatin1String("android.permission.SEND_SMS") + << QLatin1String("android.permission.SET_ACTIVITY_WATCHER") + << QLatin1String("com.android.alarm.permission.SET_ALARM") + << QLatin1String("android.permission.SET_ALWAYS_FINISH") + << QLatin1String("android.permission.SET_ANIMATION_SCALE") + << QLatin1String("android.permission.SET_DEBUG_APP") + << QLatin1String("android.permission.SET_ORIENTATION") + << QLatin1String("android.permission.SET_POINTER_SPEED") + << QLatin1String("android.permission.SET_PREFERRED_APPLICATIONS") + << QLatin1String("android.permission.SET_PROCESS_LIMIT") + << QLatin1String("android.permission.SET_TIME") + << QLatin1String("android.permission.SET_TIME_ZONE") + << QLatin1String("android.permission.SET_WALLPAPER") + << QLatin1String("android.permission.SET_WALLPAPER_HINTS") + << QLatin1String("android.permission.SIGNAL_PERSISTENT_PROCESSES") + << QLatin1String("android.permission.STATUS_BAR") + << QLatin1String("android.permission.SUBSCRIBED_FEEDS_READ") + << QLatin1String("android.permission.SUBSCRIBED_FEEDS_WRITE") + << QLatin1String("android.permission.SYSTEM_ALERT_WINDOW") + << QLatin1String("android.permission.UPDATE_DEVICE_STATS") + << QLatin1String("android.permission.USE_CREDENTIALS") + << QLatin1String("android.permission.USE_SIP") + << QLatin1String("android.permission.VIBRATE") + << QLatin1String("android.permission.WAKE_LOCK") + << QLatin1String("android.permission.WRITE_APN_SETTINGS") + << QLatin1String("android.permission.WRITE_CALENDAR") + << QLatin1String("android.permission.WRITE_CALL_LOG") + << QLatin1String("android.permission.WRITE_CONTACTS") + << QLatin1String("android.permission.WRITE_EXTERNAL_STORAGE") + << QLatin1String("android.permission.WRITE_GSERVICES") + << QLatin1String("com.android.browser.permission.WRITE_HISTORY_BOOKMARKS") + << QLatin1String("android.permission.WRITE_PROFILE") + << QLatin1String("android.permission.WRITE_SECURE_SETTINGS") + << QLatin1String("android.permission.WRITE_SETTINGS") + << QLatin1String("android.permission.WRITE_SMS") + << QLatin1String("android.permission.WRITE_SOCIAL_STREAM") + << QLatin1String("android.permission.WRITE_SYNC_SETTINGS") + << QLatin1String("android.permission.WRITE_USER_DICTIONARY") + ); + m_permissionsComboBox->setEditable(true); + layout->addWidget(m_permissionsComboBox, 2, 0); + + m_addPermissionButton = new QPushButton(permissionsGroupBox); + m_addPermissionButton->setText(tr("Add")); + layout->addWidget(m_addPermissionButton, 2, 1); + + m_permissionsModel = new PermissionsModel(this); + + m_permissionsListView = new QListView(permissionsGroupBox); + m_permissionsListView->setModel(m_permissionsModel); + layout->addWidget(m_permissionsListView, 3, 0, 3, 1); + + m_removePermissionButton = new QPushButton(permissionsGroupBox); + m_removePermissionButton->setText(tr("Remove")); + layout->addWidget(m_removePermissionButton, 3, 1); + + permissionsGroupBox->setLayout(layout); + + connect(m_defaultPermissonsCheckBox, &QCheckBox::stateChanged, + this, &AndroidManifestEditorWidget::defaultPermissionOrFeatureCheckBoxClicked); + connect(m_defaultFeaturesCheckBox, &QCheckBox::stateChanged, + this, &AndroidManifestEditorWidget::defaultPermissionOrFeatureCheckBoxClicked); - auto topLayout = new QVBoxLayout(mainWidget); + connect(m_addPermissionButton, &QAbstractButton::clicked, + this, &AndroidManifestEditorWidget::addPermission); + connect(m_removePermissionButton, &QAbstractButton::clicked, + this, &AndroidManifestEditorWidget::removePermission); + connect(m_permissionsComboBox, &QComboBox::currentTextChanged, + this, &AndroidManifestEditorWidget::updateAddRemovePermissionButtons); - auto packageGroupBox = new QGroupBox(mainWidget); - topLayout->addWidget(packageGroupBox); + return permissionsGroupBox; +} - auto setDirtyFunc = [this] { setDirty(); }; +QGroupBox *AndroidManifestEditorWidget::createPackageFormLayout(QWidget *parent) +{ + auto packageGroupBox = new QGroupBox(parent); packageGroupBox->setTitle(tr("Package")); - { - auto formLayout = new QFormLayout(); - - m_packageNameLineEdit = new QLineEdit(packageGroupBox); - m_packageNameLineEdit->setToolTip(tr( - "<p align=\"justify\">Please choose a valid package name " - "for your application (for example, \"org.example.myapplication\").</p>" - "<p align=\"justify\">Packages are usually defined using a hierarchical naming pattern, " - "with levels in the hierarchy separated by periods (.) (pronounced \"dot\").</p>" - "<p align=\"justify\">In general, a package name begins with the top level domain name" - " of the organization and then the organization's domain and then any subdomains listed" - " in reverse order. The organization can then choose a specific name for their package." - " Package names should be all lowercase characters whenever possible.</p>" - "<p align=\"justify\">Complete conventions for disambiguating package names and rules for" - " naming packages when the Internet domain name cannot be directly used as a package name" - " are described in section 7.7 of the Java Language Specification.</p>")); - formLayout->addRow(tr("Package name:"), m_packageNameLineEdit); - - m_packageNameWarning = new QLabel; - m_packageNameWarning->setText(tr("The package name is not valid.")); - m_packageNameWarning->setVisible(false); - - m_packageNameWarningIcon = new QLabel; - m_packageNameWarningIcon->setPixmap(Utils::Icons::WARNING.pixmap()); - m_packageNameWarningIcon->setVisible(false); - m_packageNameWarningIcon->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); - - auto warningRow = new QHBoxLayout; - warningRow->setContentsMargins(0, 0, 0, 0); - warningRow->addWidget(m_packageNameWarningIcon); - warningRow->addWidget(m_packageNameWarning); - - formLayout->addRow(QString(), warningRow); - - m_versionCodeLineEdit = new QLineEdit(packageGroupBox); - formLayout->addRow(tr("Version code:"), m_versionCodeLineEdit); - - m_versionNameLinedit = new QLineEdit(packageGroupBox); - formLayout->addRow(tr("Version name:"), m_versionNameLinedit); - - m_androidMinSdkVersion = new QComboBox(packageGroupBox); - m_androidMinSdkVersion->setToolTip( - tr("Sets the minimum required version on which this application can be run.")); - m_androidMinSdkVersion->addItem(tr("Not set"), 0); - - formLayout->addRow(tr("Minimum required SDK:"), m_androidMinSdkVersion); - - m_androidTargetSdkVersion = new QComboBox(packageGroupBox); - m_androidTargetSdkVersion->setToolTip( - tr("Sets the target SDK. Set this to the highest tested version. " - "This disables compatibility behavior of the system for your application.")); - m_androidTargetSdkVersion->addItem(tr("Not set"), 0); - - formLayout->addRow(tr("Target SDK:"), m_androidTargetSdkVersion); - - packageGroupBox->setLayout(formLayout); - - updateSdkVersions(); - - connect(m_packageNameLineEdit, &QLineEdit::textEdited, - this, &AndroidManifestEditorWidget::setPackageName); - connect(m_versionCodeLineEdit, &QLineEdit::textEdited, - this, setDirtyFunc); - connect(m_versionNameLinedit, &QLineEdit::textEdited, - this, setDirtyFunc); - connect(m_androidMinSdkVersion, - QOverload<int>::of(&QComboBox::currentIndexChanged), - this, setDirtyFunc); - connect(m_androidTargetSdkVersion, - QOverload<int>::of(&QComboBox::currentIndexChanged), - this, setDirtyFunc); + auto formLayout = new QFormLayout(); + + m_packageNameLineEdit = new QLineEdit(packageGroupBox); + m_packageNameLineEdit->setToolTip(tr( + "<p align=\"justify\">Please choose a valid package name for your application (for " + "example, \"org.example.myapplication\").</p><p align=\"justify\">Packages are usually " + "defined using a hierarchical naming pattern, with levels in the hierarchy separated " + "by periods (.) (pronounced \"dot\").</p><p align=\"justify\">In general, a package " + "name begins with the top level domain name of the organization and then the " + "organization's domain and then any subdomains listed in reverse order. The " + "organization can then choose a specific name for their package. Package names should " + "be all lowercase characters whenever possible.</p><p align=\"justify\">Complete " + "conventions for disambiguating package names and rules for naming packages when the " + "Internet domain name cannot be directly used as a package name are described in " + "section 7.7 of the Java Language Specification.</p>")); + formLayout->addRow(tr("Package name:"), m_packageNameLineEdit); + + m_packageNameWarning = new QLabel; + m_packageNameWarning->setText(tr("The package name is not valid.")); + m_packageNameWarning->setVisible(false); + + m_packageNameWarningIcon = new QLabel; + m_packageNameWarningIcon->setPixmap(Utils::Icons::WARNING.pixmap()); + m_packageNameWarningIcon->setVisible(false); + m_packageNameWarningIcon->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); + + auto warningRow = new QHBoxLayout; + warningRow->setContentsMargins(0, 0, 0, 0); + warningRow->addWidget(m_packageNameWarningIcon); + warningRow->addWidget(m_packageNameWarning); + + formLayout->addRow(QString(), warningRow); + + m_versionCodeLineEdit = new QLineEdit(packageGroupBox); + formLayout->addRow(tr("Version code:"), m_versionCodeLineEdit); + + m_versionNameLinedit = new QLineEdit(packageGroupBox); + formLayout->addRow(tr("Version name:"), m_versionNameLinedit); + + m_androidMinSdkVersion = new QComboBox(packageGroupBox); + m_androidMinSdkVersion->setToolTip( + tr("Sets the minimum required version on which this application can be run.")); + m_androidMinSdkVersion->addItem(tr("Not set"), 0); + + formLayout->addRow(tr("Minimum required SDK:"), m_androidMinSdkVersion); + + m_androidTargetSdkVersion = new QComboBox(packageGroupBox); + m_androidTargetSdkVersion->setToolTip( + tr("Sets the target SDK. Set this to the highest tested version. " + "This disables compatibility behavior of the system for your application.")); + m_androidTargetSdkVersion->addItem(tr("Not set"), 0); + + formLayout->addRow(tr("Target SDK:"), m_androidTargetSdkVersion); + + packageGroupBox->setLayout(formLayout); + + updateSdkVersions(); + + connect(m_packageNameLineEdit, &QLineEdit::textEdited, + this, &AndroidManifestEditorWidget::setPackageName); + connect(m_versionCodeLineEdit, &QLineEdit::textEdited, + this, [this]() { setDirty(); }); + connect(m_versionNameLinedit, &QLineEdit::textEdited, + this, [this]() { setDirty(); }); + connect(m_androidMinSdkVersion, + QOverload<int>::of(&QComboBox::currentIndexChanged), + this, [this]() { setDirty(); }); + connect(m_androidTargetSdkVersion, + QOverload<int>::of(&QComboBox::currentIndexChanged), + this, [this]() { setDirty(); }); + + return packageGroupBox; +} +QGroupBox *Android::Internal::AndroidManifestEditorWidget::createApplicationGroupBox(QWidget *parent) +{ + auto applicationGroupBox = new QGroupBox(parent); + applicationGroupBox->setTitle(tr("Application")); + auto formLayout = new QFormLayout(); + + m_appNameLineEdit = new QLineEdit(applicationGroupBox); + formLayout->addRow(tr("Application name:"), m_appNameLineEdit); + + m_activityNameLineEdit = new QLineEdit(applicationGroupBox); + formLayout->addRow(tr("Activity name:"), m_activityNameLineEdit); + + m_targetLineEdit = new QComboBox(applicationGroupBox); + m_targetLineEdit->setEditable(true); + m_targetLineEdit->setDuplicatesEnabled(true); + m_targetLineEdit->installEventFilter(this); + formLayout->addRow(tr("Run:"), m_targetLineEdit); + + m_styleExtractMethod = new QComboBox(applicationGroupBox); + formLayout->addRow(tr("Style extraction:"), m_styleExtractMethod); + const QList<QStringList> styleMethodsMap = { + {"default", + "In most cases this will be the same as \"full\", but it can also be something else " + "if needed, e.g. for compatibility reasons."}, + {"full", "Useful for Qt Widgets & Qt Quick Controls 1 apps."}, + {"minimal", "Useful for Qt Quick Controls 2 apps, it is much faster than \"full\"."}, + {"none", "Useful for apps that don't use Qt Widgets, Qt Quick Controls 1 or Qt Quick Controls 2."}}; + for (int i = 0; i <styleMethodsMap.size(); ++i) { + m_styleExtractMethod->addItem(styleMethodsMap.at(i).first()); + m_styleExtractMethod->setItemData(i, styleMethodsMap.at(i).at(1), Qt::ToolTipRole); } + applicationGroupBox->setLayout(formLayout); + + connect(m_appNameLineEdit, &QLineEdit::textEdited, + this, [this]() { setDirty(); }); + connect(m_activityNameLineEdit, &QLineEdit::textEdited, + this, [this]() { setDirty(); }); + connect(m_targetLineEdit, &QComboBox::currentTextChanged, + this, [this]() { setDirty(); }); + connect(m_styleExtractMethod, + QOverload<int>::of(&QComboBox::currentIndexChanged), + this, [this]() { setDirty(); }); + + return applicationGroupBox; +} - // Application - auto applicationGroupBox = new QGroupBox(mainWidget); - topLayout->addWidget(applicationGroupBox); +QGroupBox *AndroidManifestEditorWidget::createAdvancedGroupBox(QWidget *parent) +{ + auto otherGroupBox = new QGroupBox(parent); + otherGroupBox->setTitle(tr("Advanced")); + m_advanvedTabWidget = new QTabWidget(otherGroupBox); + auto formLayout = new QFormLayout(); - applicationGroupBox->setTitle(tr("Application")); - { - auto formLayout = new QFormLayout(); - - m_appNameLineEdit = new QLineEdit(applicationGroupBox); - formLayout->addRow(tr("Application name:"), m_appNameLineEdit); - - m_activityNameLineEdit = new QLineEdit(applicationGroupBox); - formLayout->addRow(tr("Activity name:"), m_activityNameLineEdit); - - m_targetLineEdit = new QComboBox(applicationGroupBox); - m_targetLineEdit->setEditable(true); - m_targetLineEdit->setDuplicatesEnabled(true); - m_targetLineEdit->installEventFilter(this); - formLayout->addRow(tr("Run:"), m_targetLineEdit); - - m_styleExtractMethod = new QComboBox(applicationGroupBox); - formLayout->addRow(tr("Style extraction:"), m_styleExtractMethod); - const QList<QStringList> styleMethodsMap = { - {"default", "In most cases this will be the same as \"full\", but it can also be something else if needed, e.g. for compatibility reasons."}, - {"full", "Useful for Qt Widgets & Qt Quick Controls 1 apps."}, - {"minimal", "Useful for Qt Quick Controls 2 apps, it is much faster than \"full\"."}, - {"none", "Useful for apps that don't use Qt Widgets, Qt Quick Controls 1 or Qt Quick Controls 2."}}; - for (int i = 0; i <styleMethodsMap.size(); ++i) { - m_styleExtractMethod->addItem(styleMethodsMap.at(i).first()); - m_styleExtractMethod->setItemData(i, styleMethodsMap.at(i).at(1), Qt::ToolTipRole); - } + m_iconButtons = new AndroidManifestEditorIconContainerWidget(otherGroupBox, m_textEditorWidget); + m_advanvedTabWidget->addTab(m_iconButtons, tr("Application icon")); - m_iconButtons = new AndroidManifestEditorIconContainerWidget(applicationGroupBox, m_textEditorWidget); - formLayout->addRow(tr("Application icon:"), new QLabel()); - formLayout->addRow(QString(), m_iconButtons); - - m_splashButtons = new SplashIconContainerWidget(applicationGroupBox, m_textEditorWidget); - formLayout->addRow(tr("Splash screen:"), new QLabel()); - formLayout->addRow(QString(), m_splashButtons); - - m_services = new AndroidServiceWidget(this); - formLayout->addRow(tr("Android services:"), m_services); - - applicationGroupBox->setLayout(formLayout); - - connect(m_appNameLineEdit, &QLineEdit::textEdited, - this, setDirtyFunc); - connect(m_activityNameLineEdit, &QLineEdit::textEdited, - this, setDirtyFunc); - connect(m_targetLineEdit, &QComboBox::currentTextChanged, - this, setDirtyFunc); - connect(m_styleExtractMethod, - QOverload<int>::of(&QComboBox::currentIndexChanged), - this, setDirtyFunc); - connect(m_services, &AndroidServiceWidget::servicesModified, - this, setDirtyFunc); - connect(m_splashButtons, &SplashIconContainerWidget::splashScreensModified, - this, setDirtyFunc); - connect(m_services, &AndroidServiceWidget::servicesModified, - this, &AndroidManifestEditorWidget::clearInvalidServiceInfo); - connect(m_services, &AndroidServiceWidget::servicesInvalid, - this, &AndroidManifestEditorWidget::setInvalidServiceInfo); - } + m_services = new AndroidServiceWidget(otherGroupBox); + m_advanvedTabWidget->addTab(m_services, tr("Android services")); + m_splashButtons = new SplashIconContainerWidget(otherGroupBox, m_textEditorWidget); + m_advanvedTabWidget->addTab(m_splashButtons, tr("Splash screen")); - // Permissions - auto permissionsGroupBox = new QGroupBox(mainWidget); - topLayout->addWidget(permissionsGroupBox); + connect(m_services, &AndroidServiceWidget::servicesModified, this, [this]() { setDirty(); }); + connect(m_services, &AndroidServiceWidget::servicesModified, + this, &AndroidManifestEditorWidget::clearInvalidServiceInfo); + connect(m_services, &AndroidServiceWidget::servicesInvalid, + this, &AndroidManifestEditorWidget::setInvalidServiceInfo); + connect(m_splashButtons, &SplashIconContainerWidget::splashScreensModified, + this, [this]() { setDirty(); }); - permissionsGroupBox->setTitle(tr("Permissions")); - { - auto layout = new QGridLayout(permissionsGroupBox); - - m_defaultPermissonsCheckBox = new QCheckBox(this); - m_defaultPermissonsCheckBox->setText(tr("Include default permissions for Qt modules.")); - layout->addWidget(m_defaultPermissonsCheckBox, 0, 0); - - m_defaultFeaturesCheckBox = new QCheckBox(this); - m_defaultFeaturesCheckBox->setText(tr("Include default features for Qt modules.")); - layout->addWidget(m_defaultFeaturesCheckBox, 1, 0); - - m_permissionsComboBox = new QComboBox(permissionsGroupBox); - m_permissionsComboBox->insertItems(0, QStringList() - << QLatin1String("android.permission.ACCESS_CHECKIN_PROPERTIES") - << QLatin1String("android.permission.ACCESS_COARSE_LOCATION") - << QLatin1String("android.permission.ACCESS_FINE_LOCATION") - << QLatin1String("android.permission.ACCESS_LOCATION_EXTRA_COMMANDS") - << QLatin1String("android.permission.ACCESS_MOCK_LOCATION") - << QLatin1String("android.permission.ACCESS_NETWORK_STATE") - << QLatin1String("android.permission.ACCESS_SURFACE_FLINGER") - << QLatin1String("android.permission.ACCESS_WIFI_STATE") - << QLatin1String("android.permission.ACCOUNT_MANAGER") - << QLatin1String("com.android.voicemail.permission.ADD_VOICEMAIL") - << QLatin1String("android.permission.AUTHENTICATE_ACCOUNTS") - << QLatin1String("android.permission.BATTERY_STATS") - << QLatin1String("android.permission.BIND_ACCESSIBILITY_SERVICE") - << QLatin1String("android.permission.BIND_APPWIDGET") - << QLatin1String("android.permission.BIND_DEVICE_ADMIN") - << QLatin1String("android.permission.BIND_INPUT_METHOD") - << QLatin1String("android.permission.BIND_REMOTEVIEWS") - << QLatin1String("android.permission.BIND_TEXT_SERVICE") - << QLatin1String("android.permission.BIND_VPN_SERVICE") - << QLatin1String("android.permission.BIND_WALLPAPER") - << QLatin1String("android.permission.BLUETOOTH") - << QLatin1String("android.permission.BLUETOOTH_ADMIN") - << QLatin1String("android.permission.BRICK") - << QLatin1String("android.permission.BROADCAST_PACKAGE_REMOVED") - << QLatin1String("android.permission.BROADCAST_SMS") - << QLatin1String("android.permission.BROADCAST_STICKY") - << QLatin1String("android.permission.BROADCAST_WAP_PUSH") - << QLatin1String("android.permission.CALL_PHONE") - << QLatin1String("android.permission.CALL_PRIVILEGED") - << QLatin1String("android.permission.CAMERA") - << QLatin1String("android.permission.CHANGE_COMPONENT_ENABLED_STATE") - << QLatin1String("android.permission.CHANGE_CONFIGURATION") - << QLatin1String("android.permission.CHANGE_NETWORK_STATE") - << QLatin1String("android.permission.CHANGE_WIFI_MULTICAST_STATE") - << QLatin1String("android.permission.CHANGE_WIFI_STATE") - << QLatin1String("android.permission.CLEAR_APP_CACHE") - << QLatin1String("android.permission.CLEAR_APP_USER_DATA") - << QLatin1String("android.permission.CONTROL_LOCATION_UPDATES") - << QLatin1String("android.permission.DELETE_CACHE_FILES") - << QLatin1String("android.permission.DELETE_PACKAGES") - << QLatin1String("android.permission.DEVICE_POWER") - << QLatin1String("android.permission.DIAGNOSTIC") - << QLatin1String("android.permission.DISABLE_KEYGUARD") - << QLatin1String("android.permission.DUMP") - << QLatin1String("android.permission.EXPAND_STATUS_BAR") - << QLatin1String("android.permission.FACTORY_TEST") - << QLatin1String("android.permission.FLASHLIGHT") - << QLatin1String("android.permission.FORCE_BACK") - << QLatin1String("android.permission.GET_ACCOUNTS") - << QLatin1String("android.permission.GET_PACKAGE_SIZE") - << QLatin1String("android.permission.GET_TASKS") - << QLatin1String("android.permission.GLOBAL_SEARCH") - << QLatin1String("android.permission.HARDWARE_TEST") - << QLatin1String("android.permission.INJECT_EVENTS") - << QLatin1String("android.permission.INSTALL_LOCATION_PROVIDER") - << QLatin1String("android.permission.INSTALL_PACKAGES") - << QLatin1String("android.permission.INTERNAL_SYSTEM_WINDOW") - << QLatin1String("android.permission.INTERNET") - << QLatin1String("android.permission.KILL_BACKGROUND_PROCESSES") - << QLatin1String("android.permission.MANAGE_ACCOUNTS") - << QLatin1String("android.permission.MANAGE_APP_TOKENS") - << QLatin1String("android.permission.MASTER_CLEAR") - << QLatin1String("android.permission.MODIFY_AUDIO_SETTINGS") - << QLatin1String("android.permission.MODIFY_PHONE_STATE") - << QLatin1String("android.permission.MOUNT_FORMAT_FILESYSTEMS") - << QLatin1String("android.permission.MOUNT_UNMOUNT_FILESYSTEMS") - << QLatin1String("android.permission.NFC") - << QLatin1String("android.permission.PERSISTENT_ACTIVITY") - << QLatin1String("android.permission.PROCESS_OUTGOING_CALLS") - << QLatin1String("android.permission.READ_CALENDAR") - << QLatin1String("android.permission.READ_CALL_LOG") - << QLatin1String("android.permission.READ_CONTACTS") - << QLatin1String("android.permission.READ_EXTERNAL_STORAGE") - << QLatin1String("android.permission.READ_FRAME_BUFFER") - << QLatin1String("com.android.browser.permission.READ_HISTORY_BOOKMARKS") - << QLatin1String("android.permission.READ_INPUT_STATE") - << QLatin1String("android.permission.READ_LOGS") - << QLatin1String("android.permission.READ_PHONE_STATE") - << QLatin1String("android.permission.READ_PROFILE") - << QLatin1String("android.permission.READ_SMS") - << QLatin1String("android.permission.READ_SOCIAL_STREAM") - << QLatin1String("android.permission.READ_SYNC_SETTINGS") - << QLatin1String("android.permission.READ_SYNC_STATS") - << QLatin1String("android.permission.READ_USER_DICTIONARY") - << QLatin1String("android.permission.REBOOT") - << QLatin1String("android.permission.RECEIVE_BOOT_COMPLETED") - << QLatin1String("android.permission.RECEIVE_MMS") - << QLatin1String("android.permission.RECEIVE_SMS") - << QLatin1String("android.permission.RECEIVE_WAP_PUSH") - << QLatin1String("android.permission.RECORD_AUDIO") - << QLatin1String("android.permission.REORDER_TASKS") - << QLatin1String("android.permission.RESTART_PACKAGES") - << QLatin1String("android.permission.SEND_SMS") - << QLatin1String("android.permission.SET_ACTIVITY_WATCHER") - << QLatin1String("com.android.alarm.permission.SET_ALARM") - << QLatin1String("android.permission.SET_ALWAYS_FINISH") - << QLatin1String("android.permission.SET_ANIMATION_SCALE") - << QLatin1String("android.permission.SET_DEBUG_APP") - << QLatin1String("android.permission.SET_ORIENTATION") - << QLatin1String("android.permission.SET_POINTER_SPEED") - << QLatin1String("android.permission.SET_PREFERRED_APPLICATIONS") - << QLatin1String("android.permission.SET_PROCESS_LIMIT") - << QLatin1String("android.permission.SET_TIME") - << QLatin1String("android.permission.SET_TIME_ZONE") - << QLatin1String("android.permission.SET_WALLPAPER") - << QLatin1String("android.permission.SET_WALLPAPER_HINTS") - << QLatin1String("android.permission.SIGNAL_PERSISTENT_PROCESSES") - << QLatin1String("android.permission.STATUS_BAR") - << QLatin1String("android.permission.SUBSCRIBED_FEEDS_READ") - << QLatin1String("android.permission.SUBSCRIBED_FEEDS_WRITE") - << QLatin1String("android.permission.SYSTEM_ALERT_WINDOW") - << QLatin1String("android.permission.UPDATE_DEVICE_STATS") - << QLatin1String("android.permission.USE_CREDENTIALS") - << QLatin1String("android.permission.USE_SIP") - << QLatin1String("android.permission.VIBRATE") - << QLatin1String("android.permission.WAKE_LOCK") - << QLatin1String("android.permission.WRITE_APN_SETTINGS") - << QLatin1String("android.permission.WRITE_CALENDAR") - << QLatin1String("android.permission.WRITE_CALL_LOG") - << QLatin1String("android.permission.WRITE_CONTACTS") - << QLatin1String("android.permission.WRITE_EXTERNAL_STORAGE") - << QLatin1String("android.permission.WRITE_GSERVICES") - << QLatin1String("com.android.browser.permission.WRITE_HISTORY_BOOKMARKS") - << QLatin1String("android.permission.WRITE_PROFILE") - << QLatin1String("android.permission.WRITE_SECURE_SETTINGS") - << QLatin1String("android.permission.WRITE_SETTINGS") - << QLatin1String("android.permission.WRITE_SMS") - << QLatin1String("android.permission.WRITE_SOCIAL_STREAM") - << QLatin1String("android.permission.WRITE_SYNC_SETTINGS") - << QLatin1String("android.permission.WRITE_USER_DICTIONARY") - ); - m_permissionsComboBox->setEditable(true); - layout->addWidget(m_permissionsComboBox, 2, 0); - - m_addPermissionButton = new QPushButton(permissionsGroupBox); - m_addPermissionButton->setText(tr("Add")); - layout->addWidget(m_addPermissionButton, 2, 1); - - m_permissionsModel = new PermissionsModel(this); - - m_permissionsListView = new QListView(permissionsGroupBox); - m_permissionsListView->setModel(m_permissionsModel); - layout->addWidget(m_permissionsListView, 3, 0, 3, 1); - - m_removePermissionButton = new QPushButton(permissionsGroupBox); - m_removePermissionButton->setText(tr("Remove")); - layout->addWidget(m_removePermissionButton, 3, 1); - - permissionsGroupBox->setLayout(layout); - - connect(m_defaultPermissonsCheckBox, &QCheckBox::stateChanged, - this, &AndroidManifestEditorWidget::defaultPermissionOrFeatureCheckBoxClicked); - connect(m_defaultFeaturesCheckBox, &QCheckBox::stateChanged, - this, &AndroidManifestEditorWidget::defaultPermissionOrFeatureCheckBoxClicked); - - connect(m_addPermissionButton, &QAbstractButton::clicked, - this, &AndroidManifestEditorWidget::addPermission); - connect(m_removePermissionButton, &QAbstractButton::clicked, - this, &AndroidManifestEditorWidget::removePermission); - connect(m_permissionsComboBox, &QComboBox::currentTextChanged, - this, &AndroidManifestEditorWidget::updateAddRemovePermissionButtons); - } + formLayout->addRow(m_advanvedTabWidget); + otherGroupBox->setLayout(formLayout); + + return otherGroupBox; +} + +void AndroidManifestEditorWidget::initializePage() +{ + QWidget *mainWidget = new QWidget(); // different name + auto topLayout = new QGridLayout(mainWidget); - topLayout->addSpacerItem(new QSpacerItem(0, 0, QSizePolicy::Fixed, QSizePolicy::MinimumExpanding)); + topLayout->addWidget(createPackageFormLayout(mainWidget), 0, 0); + topLayout->addWidget(createApplicationGroupBox(mainWidget), 0, 1); + topLayout->addWidget(createPermissionsGroupBox(mainWidget), 1, 0, 1, 2); + topLayout->addWidget(createAdvancedGroupBox(mainWidget), 2, 0, 1, 2); + topLayout->addItem(new QSpacerItem(0, 0, QSizePolicy::Fixed, QSizePolicy::MinimumExpanding), 3, 0); auto mainWidgetScrollArea = new QScrollArea; mainWidgetScrollArea->setWidgetResizable(true); @@ -575,6 +587,7 @@ bool AndroidManifestEditorWidget::setActivePage(EditorPage page) if (!servicesValid(m_services->services())) { QMessageBox::critical(nullptr, tr("Service Definition Invalid"), tr("Cannot switch to source when there are invalid services.")); + m_advanvedTabWidget->setCurrentIndex(1); return false; } syncToEditor(); diff --git a/src/plugins/android/androidmanifesteditorwidget.h b/src/plugins/android/androidmanifesteditorwidget.h index 7a69ac49ad..95da8c3312 100644 --- a/src/plugins/android/androidmanifesteditorwidget.h +++ b/src/plugins/android/androidmanifesteditorwidget.h @@ -28,6 +28,9 @@ #include <texteditor/texteditor.h> #include <QAbstractListModel> +#include <QGroupBox> +#include <QGridLayout> +#include <QTabWidget> #include <QStackedWidget> #include <QTimer> @@ -156,6 +159,11 @@ private: QString parseComment(QXmlStreamReader &reader, QXmlStreamWriter &writer); void parseUnknownElement(QXmlStreamReader &reader, QXmlStreamWriter &writer, bool ignore=false); + QGroupBox *createPermissionsGroupBox(QWidget *parent); + QGroupBox *createPackageFormLayout(QWidget *parent); + QGroupBox *createApplicationGroupBox(QWidget *parent); + QGroupBox *createAdvancedGroupBox(QWidget *parent); + bool m_dirty; // indicates that we need to call syncToEditor() bool m_stayClean; int m_errorLine; @@ -192,6 +200,7 @@ private: TextEditor::TextEditorWidget *m_textEditorWidget; AndroidManifestEditor *m_editor; QString m_androidNdkPlatform; + QTabWidget *m_advanvedTabWidget = nullptr; }; } // namespace Internal } // namespace Android diff --git a/src/plugins/android/androidplugin.cpp b/src/plugins/android/androidplugin.cpp index 187146a636..b1616ce56b 100644 --- a/src/plugins/android/androidplugin.cpp +++ b/src/plugins/android/androidplugin.cpp @@ -77,7 +77,7 @@ public: setConfigBaseId("Qt4ProjectManager.AndroidDeployConfiguration2"); addSupportedTargetDeviceType(Constants::ANDROID_DEVICE_TYPE); setDefaultDisplayName(QCoreApplication::translate("Android::Internal", - "Deploy to Android device")); + "Deploy to Android Device")); addInitialStep(AndroidDeployQtStep::stepId()); } }; diff --git a/src/plugins/android/androidqtversion.cpp b/src/plugins/android/androidqtversion.cpp index 0a3f80e75f..568df99429 100644 --- a/src/plugins/android/androidqtversion.cpp +++ b/src/plugins/android/androidqtversion.cpp @@ -35,6 +35,7 @@ #include <qtsupport/qtsupportconstants.h> #include <qtsupport/qtversionmanager.h> +#include <projectexplorer/projectexplorerconstants.h> #include <projectexplorer/target.h> #include <projectexplorer/kit.h> #include <projectexplorer/project.h> @@ -86,25 +87,25 @@ QString AndroidQtVersion::invalidReason() const Abis AndroidQtVersion::detectQtAbis() const { auto androidAbi2Abi = [](const QString &androidAbi) { - if (androidAbi == "arm64-v8a") { + if (androidAbi == ProjectExplorer::Constants::ANDROID_ABI_ARM64_V8A) { return Abi{Abi::Architecture::ArmArchitecture, Abi::OS::LinuxOS, Abi::OSFlavor::AndroidLinuxFlavor, Abi::BinaryFormat::ElfFormat, 64, androidAbi}; - } else if (androidAbi == "armeabi-v7a") { + } else if (androidAbi == ProjectExplorer::Constants::ANDROID_ABI_ARMEABI_V7A) { return Abi{Abi::Architecture::ArmArchitecture, Abi::OS::LinuxOS, Abi::OSFlavor::AndroidLinuxFlavor, Abi::BinaryFormat::ElfFormat, 32, androidAbi}; - } else if (androidAbi == "x86_64") { + } else if (androidAbi == ProjectExplorer::Constants::ANDROID_ABI_X86_64) { return Abi{Abi::Architecture::X86Architecture, Abi::OS::LinuxOS, Abi::OSFlavor::AndroidLinuxFlavor, Abi::BinaryFormat::ElfFormat, 64, androidAbi}; - } else if (androidAbi == "x86") { + } else if (androidAbi == ProjectExplorer::Constants::ANDROID_ABI_X86) { return Abi{Abi::Architecture::X86Architecture, Abi::OS::LinuxOS, Abi::OSFlavor::AndroidLinuxFlavor, diff --git a/src/plugins/android/androidrunnerworker.cpp b/src/plugins/android/androidrunnerworker.cpp index b076ceada5..0f31535b05 100644 --- a/src/plugins/android/androidrunnerworker.cpp +++ b/src/plugins/android/androidrunnerworker.cpp @@ -33,6 +33,7 @@ #include <debugger/debuggerkitinformation.h> #include <debugger/debuggerrunconfigurationaspect.h> +#include <projectexplorer/projectexplorerconstants.h> #include <projectexplorer/environmentaspect.h> #include <projectexplorer/runconfigurationaspects.h> #include <projectexplorer/runcontrol.h> @@ -127,21 +128,23 @@ static void findProcessPID(QFutureInterface<qint64> &fi, QStringList selector, if (packageName.isEmpty()) return; + QStringList args = {selector}; + FilePath adbPath = AndroidConfigurations::currentConfig().adbToolPath(); + args.append("shell"); + args.append(preNougat ? pidScriptPreNougat : pidScript.arg(packageName)); + qint64 processPID = -1; chrono::high_resolution_clock::time_point start = chrono::high_resolution_clock::now(); do { QThread::msleep(200); - FilePath adbPath = AndroidConfigurations::currentConfig().adbToolPath(); - selector.append("shell"); - selector.append(preNougat ? pidScriptPreNougat : pidScript.arg(packageName)); - const auto out = SynchronousProcess().runBlocking({adbPath, selector}).allRawOutput(); + const auto out = SynchronousProcess().runBlocking({adbPath, args}).allRawOutput(); if (preNougat) { processPID = extractPID(out, packageName); } else { if (!out.isEmpty()) processPID = out.trimmed().toLongLong(); } - } while (processPID == -1 && !isTimedOut(start) && !fi.isCanceled()); + } while ((processPID == -1 || processPID == 0) && !isTimedOut(start) && !fi.isCanceled()); qCDebug(androidRunWorkerLog) << "PID found:" << processPID << ", PreNougat:" << preNougat; if (!fi.isCanceled()) @@ -162,32 +165,32 @@ static void deleter(QProcess *p) static QString gdbServerArch(const QString &androidAbi) { - if (androidAbi == "arm64-v8a") + if (androidAbi == ProjectExplorer::Constants::ANDROID_ABI_ARM64_V8A) return QString("arm64"); - if (androidAbi == "armeabi-v7a") + if (androidAbi == ProjectExplorer::Constants::ANDROID_ABI_ARMEABI_V7A) return QString("arm"); - // That's correct for "x86_64" and "x86", and best guess at anything that will evolve: + // That's correct for x86_64 and x86, and best guess at anything that will evolve: return androidAbi; } static QString lldbServerArch(const QString &androidAbi) { - if (androidAbi == "armeabi-v7a") - return QString("armeabi"); - // Correct for arm64-v8a "x86_64" and "x86", and best guess at anything that will evolve: + if (androidAbi == ProjectExplorer::Constants::ANDROID_ABI_ARMEABI_V7A) + return {ProjectExplorer::Constants::ANDROID_ABI_ARMEABI}; + // Correct for arm64-v8a, x86 and x86_64, and best guess at anything that will evolve: return androidAbi; // arm64-v8a, x86, x86_64 } static QString lldbServerArch2(const QString &androidAbi) { - if (androidAbi == "armeabi-v7a") + if (androidAbi == ProjectExplorer::Constants::ANDROID_ABI_ARMEABI_V7A) return {"arm"}; - if (androidAbi == "x86") + if (androidAbi == ProjectExplorer::Constants::ANDROID_ABI_X86) return {"i386"}; - if (androidAbi == "arm64-v8a") + if (androidAbi == ProjectExplorer::Constants::ANDROID_ABI_ARM64_V8A) return {"aarch64"}; - // Correct for "x86_64" a and best guess at anything that will evolve: - return androidAbi; // arm64-v8a + // Correct for x86_64 and best guess at anything that will evolve: + return androidAbi; // x86_64 } static FilePath debugServer(bool useLldb, const Target *target) diff --git a/src/plugins/android/androidsettingswidget.cpp b/src/plugins/android/androidsettingswidget.cpp index 68efdbd0b4..440ed329b5 100644 --- a/src/plugins/android/androidsettingswidget.cpp +++ b/src/plugins/android/androidsettingswidget.cpp @@ -56,6 +56,7 @@ #include <QLoggingCategory> #include <QMessageBox> #include <QModelIndex> +#include <QScrollArea> #include <QSettings> #include <QStandardPaths> #include <QString> @@ -368,7 +369,14 @@ AndroidSettingsWidget::AndroidSettingsWidget() m_ui.managerTabWidget->tabBar()->setEnabled(true); }); connect(m_sdkManagerWidget, &AndroidSdkManagerWidget::licenseWorkflowStarted, [this] { - m_ui.scrollArea->ensureWidgetVisible(m_ui.managerTabWidget); + QObject *parentWidget = parent(); + while (parentWidget) { + if (auto scrollArea = qobject_cast<QScrollArea *>(parentWidget)) { + scrollArea->ensureWidgetVisible(m_ui.managerTabWidget); + break; + } + parentWidget = parentWidget->parent(); + }; }); QMap<int, QString> javaValidationPoints; @@ -405,42 +413,49 @@ AndroidSettingsWidget::AndroidSettingsWidget() connect(m_ui.OpenJDKLocationPathChooser, &PathChooser::rawPathChanged, this, &AndroidSettingsWidget::validateJdk); - FilePath currentJdkPath = m_androidConfig.openJDKLocation(); - if (currentJdkPath.isEmpty()) - currentJdkPath = AndroidConfig::getJdkPath(); - m_ui.OpenJDKLocationPathChooser->setFilePath(currentJdkPath); + if (m_androidConfig.openJDKLocation().isEmpty()) + m_androidConfig.setOpenJDKLocation(AndroidConfig::getJdkPath()); + m_ui.OpenJDKLocationPathChooser->setFilePath(m_androidConfig.openJDKLocation()); m_ui.OpenJDKLocationPathChooser->setPromptDialogTitle(tr("Select JDK Path")); - FilePath currentSDKPath = m_androidConfig.sdkLocation(); - if (currentSDKPath.isEmpty()) - currentSDKPath = AndroidConfig::defaultSdkPath(); - - m_ui.SDKLocationPathChooser->setFilePath(currentSDKPath); + if (m_androidConfig.sdkLocation().isEmpty()) + m_androidConfig.setSdkLocation(AndroidConfig::defaultSdkPath()); + m_ui.SDKLocationPathChooser->setFilePath(m_androidConfig.sdkLocation()); m_ui.SDKLocationPathChooser->setPromptDialogTitle(tr("Select Android SDK Folder")); m_ui.openSslPathChooser->setPromptDialogTitle(tr("Select OpenSSL Include Project File")); - FilePath currentOpenSslPath = m_androidConfig.openSslLocation(); - if (currentOpenSslPath.isEmpty()) - currentOpenSslPath = currentSDKPath.pathAppended("android_openssl"); - m_ui.openSslPathChooser->setFilePath(currentOpenSslPath); + if (m_androidConfig.openSslLocation().isEmpty()) + m_androidConfig.setOpenSslLocation(m_androidConfig.sdkLocation() / ("android_openssl")); + m_ui.openSslPathChooser->setFilePath(m_androidConfig.openSslLocation()); m_ui.DataPartitionSizeSpinBox->setValue(m_androidConfig.partitionSize()); m_ui.CreateKitCheckBox->setChecked(m_androidConfig.automaticKitCreation()); m_ui.AVDTableView->setModel(&m_AVDModel); m_ui.AVDTableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); - m_ui.AVDTableView->horizontalHeader()->setSectionResizeMode(1, QHeaderView::ResizeToContents); + for (int column : {1, 2, 5}) + m_ui.AVDTableView->horizontalHeader()->setSectionResizeMode( + column, QHeaderView::ResizeToContents); const QIcon downloadIcon = Icons::ONLINE.icon(); m_ui.downloadSDKToolButton->setIcon(downloadIcon); m_ui.downloadNDKToolButton->setIcon(downloadIcon); m_ui.downloadOpenJDKToolButton->setIcon(downloadIcon); - m_ui.sdkToolsAutoDownloadButton->setToolTip(tr( - "Automatically download Android SDK Tools to selected location.\n\n" - "If the selected path contains no valid SDK Tools, the SDK Tools package " - "is downloaded from %1, and extracted to the selected path.\n" - "After the SDK Tools are properly set up, you are prompted to install " - "any essential packages required for Qt to build for Android.") - .arg(m_androidConfig.sdkToolsUrl().toString())); + m_ui.sdkToolsAutoDownloadButton->setToolTip( + tr("Automatically download Android SDK Tools to selected location.\n\n" + "If the selected path contains no valid SDK Tools, the SDK Tools package is downloaded\n" + "from %1,\n" + "and extracted to the selected path.\n" + "After the SDK Tools are properly set up, you are prompted to install any essential\n" + "packages required for Qt to build for Android.") + .arg(m_androidConfig.sdkToolsUrl().toString())); + + m_ui.downloadOpenSSLPrebuiltLibs->setToolTip( + tr("Automatically download OpenSSL prebuilt libraries.\n\n" + "These libraries can be shipped with your application if any SSL operations\n" + "are performed. Find the checkbox under \"Projects > Build > Build Steps >\n" + "Build Android APK > Additional Libraries\".\n" + "If the automatic download fails, Qt Creator proposes to open the download URL\n" + "in the system's browser for manual download.")); connect(m_ui.SDKLocationPathChooser, &PathChooser::rawPathChanged, this, &AndroidSettingsWidget::onSdkPathChanged); @@ -700,7 +715,7 @@ void AndroidSettingsWidget::downloadOpenSslRepo(const bool silent) QMessageBox msgBox; msgBox.setText(tr("OpenSSL prebuilt libraries cloning failed. ") + msgSuffix + tr("Opening OpenSSL URL for manual download.")); - msgBox.addButton(tr("OK"), QMessageBox::YesRole); + msgBox.addButton(tr("Cancel"), QMessageBox::RejectRole); QAbstractButton *openButton = msgBox.addButton(tr("Open Download URL"), QMessageBox::ActionRole); msgBox.exec(); @@ -849,13 +864,7 @@ AndroidSettingsPage::AndroidSettingsPage() setId(Constants::ANDROID_SETTINGS_ID); setDisplayName(AndroidSettingsWidget::tr("Android")); setCategory(ProjectExplorer::Constants::DEVICE_SETTINGS_CATEGORY); - setWidgetCreator([] { - auto widget = new AndroidSettingsWidget; - QPalette pal = widget->palette(); - pal.setColor(QPalette::Window, Utils::creatorTheme()->color(Theme::BackgroundColorNormal)); - widget->setPalette(pal); - return widget; - }); + setWidgetCreator([] { return new AndroidSettingsWidget; }); } } // namespace Internal diff --git a/src/plugins/android/androidsettingswidget.ui b/src/plugins/android/androidsettingswidget.ui index b4542e8d4c..d29a6073cf 100644 --- a/src/plugins/android/androidsettingswidget.ui +++ b/src/plugins/android/androidsettingswidget.ui @@ -2,57 +2,278 @@ <ui version="4.0"> <class>AndroidSettingsWidget</class> <widget class="QWidget" name="AndroidSettingsWidget"> - <property name="geometry"> - <rect> - <x>0</x> - <y>0</y> - <width>1131</width> - <height>826</height> - </rect> - </property> <property name="windowTitle"> <string>Android Configuration</string> </property> <layout class="QVBoxLayout" name="verticalLayout"> - <property name="leftMargin"> - <number>4</number> - </property> - <property name="topMargin"> - <number>4</number> - </property> - <property name="rightMargin"> - <number>4</number> - </property> - <property name="bottomMargin"> - <number>4</number> - </property> <item> - <widget class="QScrollArea" name="scrollArea"> - <property name="frameShape"> - <enum>QFrame::NoFrame</enum> + <widget class="QGroupBox" name="javaSettingsGroupBox"> + <property name="minimumSize"> + <size> + <width>0</width> + <height>0</height> + </size> </property> - <property name="frameShadow"> - <enum>QFrame::Plain</enum> + <property name="title"> + <string>Java Settings</string> </property> - <property name="lineWidth"> - <number>0</number> + <layout class="QGridLayout" name="gridLayout"> + <item row="0" column="1"> + <widget class="Utils::PathChooser" name="OpenJDKLocationPathChooser" native="true"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Expanding" vsizetype="Preferred"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + </widget> + </item> + <item row="0" column="2"> + <widget class="QToolButton" name="downloadOpenJDKToolButton"> + <property name="toolTip"> + <string>Open JDK download URL in the system's browser.</string> + </property> + </widget> + </item> + <item row="0" column="0"> + <widget class="QLabel" name="OpenJDKLocationLabel"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Preferred" vsizetype="Preferred"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>JDK location:</string> + </property> + <property name="alignment"> + <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> + </property> + </widget> + </item> + <item row="1" column="0" colspan="3"> + <widget class="Utils::DetailsWidget" name="javaDetailsWidget" native="true"> + <property name="minimumSize"> + <size> + <width>0</width> + <height>0</height> + </size> + </property> + </widget> + </item> + </layout> + </widget> + </item> + <item> + <widget class="QGroupBox" name="androidSettingsGroupBox"> + <property name="title"> + <string>Android Settings</string> + </property> + <layout class="QGridLayout" name="gridLayout_3"> + <item row="2" column="1" rowspan="3"> + <widget class="QListWidget" name="ndkListWidget"> + <property name="sizeAdjustPolicy"> + <enum>QAbstractScrollArea::AdjustToContents</enum> + </property> + <property name="iconSize"> + <size> + <width>16</width> + <height>16</height> + </size> + </property> + <property name="resizeMode"> + <enum>QListView::Adjust</enum> + </property> + <property name="modelColumn"> + <number>0</number> + </property> + <property name="sortingEnabled"> + <bool>false</bool> + </property> + </widget> + </item> + <item row="2" column="2" rowspan="3" colspan="4"> + <layout class="QVBoxLayout" name="verticalLayout_3"> + <item> + <widget class="QPushButton" name="addCustomNdkButton"> + <property name="enabled"> + <bool>true</bool> + </property> + <property name="sizePolicy"> + <sizepolicy hsizetype="Maximum" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="toolTip"> + <string>Add the selected custom NDK. The toolchains and debuggers will be created automatically.</string> + </property> + <property name="text"> + <string>Add...</string> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="removeCustomNdkButton"> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="sizePolicy"> + <sizepolicy hsizetype="Maximum" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="toolTip"> + <string>Remove the selected NDK if it has been added manually.</string> + </property> + <property name="text"> + <string>Remove</string> + </property> + </widget> + </item> + <item> + <spacer name="verticalSpacer_3"> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>40</height> + </size> + </property> + </spacer> + </item> + </layout> + </item> + <item row="5" column="0" colspan="7"> + <widget class="Utils::DetailsWidget" name="androidDetailsWidget" native="true"/> + </item> + <item row="2" column="0"> + <widget class="QLabel" name="ndkComboBoxLabel"> + <property name="text"> + <string>Android NDK list:</string> + </property> + </widget> + </item> + <item row="0" column="6"> + <widget class="QToolButton" name="downloadSDKToolButton"> + <property name="toolTip"> + <string>Open Android SDK download URL in the system's browser.</string> + </property> + </widget> + </item> + <item row="0" column="0"> + <widget class="QLabel" name="SDKLocationLabel"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Fixed" vsizetype="Preferred"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>Android SDK location:</string> + </property> + <property name="alignment"> + <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> + </property> + </widget> + </item> + <item row="2" column="6"> + <widget class="QToolButton" name="downloadNDKToolButton"> + <property name="toolTip"> + <string>Open Android NDK download URL in the system's browser.</string> + </property> + <property name="text"> + <string/> + </property> + </widget> + </item> + <item row="0" column="1"> + <widget class="Utils::PathChooser" name="SDKLocationPathChooser" native="true"/> + </item> + <item row="0" column="2" colspan="4"> + <widget class="QPushButton" name="sdkToolsAutoDownloadButton"> + <property name="text"> + <string>Set Up SDK</string> + </property> + </widget> + </item> + </layout> + </widget> + </item> + <item> + <widget class="QGroupBox" name="androidOpenSSLSettingsGroupBox"> + <property name="title"> + <string>Android OpenSSL settings (Optional)</string> + </property> + <layout class="QGridLayout" name="gridLayout_2"> + <item row="0" column="0"> + <widget class="QLabel" name="label"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Maximum" vsizetype="Preferred"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>OpenSSL binaries location:</string> + </property> + </widget> + </item> + <item row="1" column="0" colspan="4"> + <widget class="Utils::DetailsWidget" name="openSslDetailsWidget" native="true"/> + </item> + <item row="0" column="3"> + <widget class="QPushButton" name="downloadOpenSSLPrebuiltLibs"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>Download OpenSSL</string> + </property> + </widget> + </item> + <item row="0" column="1" colspan="2"> + <widget class="Utils::PathChooser" name="openSslPathChooser" native="true"> + <property name="toolTip"> + <string>Select the path of the prebuilt OpenSSL binaries.</string> + </property> + </widget> + </item> + </layout> + </widget> + </item> + <item> + <widget class="QCheckBox" name="CreateKitCheckBox"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Expanding" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>Automatically create kits for Android tool chains</string> </property> - <property name="widgetResizable"> + <property name="checked"> <bool>true</bool> </property> - <widget class="QWidget" name="scrollAreaWidgetContents_2"> - <property name="geometry"> - <rect> - <x>0</x> - <y>0</y> - <width>1123</width> - <height>818</height> - </rect> - </property> - <property name="autoFillBackground"> - <bool>false</bool> - </property> - <layout class="QVBoxLayout" name="verticalLayout_4"> + </widget> + </item> + <item> + <widget class="QTabWidget" name="managerTabWidget"> + <property name="currentIndex"> + <number>0</number> + </property> + <widget class="QWidget" name="avdManagerTab"> + <attribute name="title"> + <string>AVD Manager</string> + </attribute> + <layout class="QHBoxLayout" name="horizontalLayout"> <property name="leftMargin"> <number>0</number> </property> @@ -66,435 +287,148 @@ <number>0</number> </property> <item> - <widget class="QGroupBox" name="javaSettingsGroupBox"> - <property name="minimumSize"> - <size> - <width>0</width> - <height>0</height> - </size> - </property> - <property name="title"> - <string>Java Settings</string> - </property> - <layout class="QGridLayout" name="gridLayout"> - <item row="0" column="1"> - <widget class="Utils::PathChooser" name="OpenJDKLocationPathChooser" native="true"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Expanding" vsizetype="Preferred"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - </widget> - </item> - <item row="0" column="2"> - <widget class="QToolButton" name="downloadOpenJDKToolButton"> - <property name="toolTip"> - <string>Open JDK download URL in the system's browser.</string> - </property> - </widget> - </item> - <item row="0" column="0"> - <widget class="QLabel" name="OpenJDKLocationLabel"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Preferred" vsizetype="Preferred"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="text"> - <string>JDK location:</string> - </property> - <property name="alignment"> - <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> - </property> - </widget> - </item> - <item row="1" column="0" colspan="3"> - <widget class="Utils::DetailsWidget" name="javaDetailsWidget" native="true"> - <property name="minimumSize"> - <size> - <width>0</width> - <height>0</height> - </size> - </property> - </widget> - </item> - </layout> - </widget> - </item> - <item> - <widget class="QGroupBox" name="androidSettingsGroupBox"> - <property name="title"> - <string>Android Settings</string> - </property> - <layout class="QGridLayout" name="gridLayout_3"> - <item row="2" column="1" rowspan="3"> - <widget class="QListWidget" name="ndkListWidget"> - <property name="sizeAdjustPolicy"> - <enum>QAbstractScrollArea::AdjustToContents</enum> - </property> - <property name="iconSize"> - <size> - <width>16</width> - <height>16</height> - </size> - </property> - <property name="resizeMode"> - <enum>QListView::Adjust</enum> - </property> - <property name="modelColumn"> - <number>0</number> - </property> - <property name="sortingEnabled"> - <bool>false</bool> - </property> - </widget> - </item> - <item row="2" column="2" rowspan="3" colspan="4"> - <layout class="QVBoxLayout" name="verticalLayout_3"> - <item> - <widget class="QPushButton" name="addCustomNdkButton"> - <property name="enabled"> - <bool>true</bool> - </property> - <property name="sizePolicy"> - <sizepolicy hsizetype="Maximum" vsizetype="Fixed"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="toolTip"> - <string>Add the selected custom NDK. The toolchains and debuggers will be created automatically.</string> - </property> - <property name="text"> - <string>Add...</string> - </property> - </widget> - </item> - <item> - <widget class="QPushButton" name="removeCustomNdkButton"> - <property name="enabled"> - <bool>false</bool> - </property> - <property name="sizePolicy"> - <sizepolicy hsizetype="Maximum" vsizetype="Fixed"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="toolTip"> - <string>Remove the selected NDK if it has been added manually.</string> - </property> - <property name="text"> - <string>Remove</string> - </property> - </widget> - </item> - <item> - <spacer name="verticalSpacer_3"> - <property name="orientation"> - <enum>Qt::Vertical</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>20</width> - <height>40</height> - </size> - </property> - </spacer> - </item> - </layout> - </item> - <item row="5" column="0" colspan="7"> - <widget class="Utils::DetailsWidget" name="androidDetailsWidget" native="true"/> - </item> - <item row="2" column="0"> - <widget class="QLabel" name="ndkComboBoxLabel"> - <property name="text"> - <string>Android NDK list:</string> - </property> - </widget> - </item> - <item row="0" column="6"> - <widget class="QToolButton" name="downloadSDKToolButton"> - <property name="toolTip"> - <string>Open Android SDK download URL in the system's browser.</string> - </property> - </widget> - </item> - <item row="0" column="0"> - <widget class="QLabel" name="SDKLocationLabel"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Fixed" vsizetype="Preferred"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="text"> - <string>Android SDK location:</string> - </property> - <property name="alignment"> - <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> - </property> - </widget> - </item> - <item row="2" column="6"> - <widget class="QToolButton" name="downloadNDKToolButton"> - <property name="toolTip"> - <string>Open Android NDK download URL in the system's browser.</string> - </property> - <property name="text"> - <string/> - </property> - </widget> - </item> - <item row="0" column="1"> - <widget class="Utils::PathChooser" name="SDKLocationPathChooser" native="true"/> - </item> - <item row="0" column="2" colspan="4"> - <widget class="QPushButton" name="sdkToolsAutoDownloadButton"> - <property name="text"> - <string>Set Up SDK</string> - </property> - </widget> - </item> - </layout> - </widget> - </item> - <item> - <widget class="QGroupBox" name="androidOpenSSLSettingsGroupBox"> - <property name="title"> - <string>Android OpenSSL settings (Optional)</string> - </property> - <layout class="QGridLayout" name="gridLayout_2"> - <item row="0" column="0"> - <widget class="QLabel" name="label"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Maximum" vsizetype="Preferred"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="text"> - <string>OpenSSL binaries location:</string> - </property> - </widget> - </item> - <item row="1" column="0" colspan="4"> - <widget class="Utils::DetailsWidget" name="openSslDetailsWidget" native="true"/> - </item> - <item row="0" column="3"> - <widget class="QPushButton" name="downloadOpenSSLPrebuiltLibs"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="toolTip"> - <string>Automatically download OpenSSL prebuilt libraries. If the automatic download fails, Qt Creator proposes to open the download URL in the system's browser for manual download.</string> - </property> - <property name="text"> - <string>Download OpenSSL</string> - </property> - </widget> - </item> - <item row="0" column="1" colspan="2"> - <widget class="Utils::PathChooser" name="openSslPathChooser" native="true"> - <property name="toolTip"> - <string>Select the path of the prebuilt OpenSSL binaries.</string> - </property> - </widget> - </item> - </layout> - </widget> - </item> - <item> - <widget class="QCheckBox" name="CreateKitCheckBox"> + <widget class="QTableView" name="AVDTableView"> <property name="sizePolicy"> - <sizepolicy hsizetype="Expanding" vsizetype="Fixed"> + <sizepolicy hsizetype="Expanding" vsizetype="Expanding"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> - <property name="text"> - <string>Automatically create kits for Android tool chains</string> + <property name="selectionMode"> + <enum>QAbstractItemView::SingleSelection</enum> + </property> + <property name="selectionBehavior"> + <enum>QAbstractItemView::SelectRows</enum> </property> - <property name="checked"> - <bool>true</bool> + <property name="textElideMode"> + <enum>Qt::ElideMiddle</enum> </property> + <attribute name="horizontalHeaderHighlightSections"> + <bool>false</bool> + </attribute> + <attribute name="verticalHeaderVisible"> + <bool>false</bool> + </attribute> </widget> </item> <item> - <widget class="QTabWidget" name="managerTabWidget"> - <property name="currentIndex"> - <number>0</number> - </property> - <widget class="QWidget" name="avdManagerTab"> - <attribute name="title"> - <string>AVD Manager</string> - </attribute> - <layout class="QHBoxLayout" name="horizontalLayout"> - <property name="leftMargin"> - <number>0</number> + <layout class="QVBoxLayout" name="verticalLayout_2"> + <item> + <widget class="QLabel" name="DataPartitionSizeLable"> + <property name="text"> + <string>System/data partition size:</string> </property> - <property name="topMargin"> - <number>0</number> + </widget> + </item> + <item> + <widget class="QSpinBox" name="DataPartitionSizeSpinBox"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Preferred" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> </property> - <property name="rightMargin"> - <number>0</number> + <property name="suffix"> + <string> Mb</string> </property> - <property name="bottomMargin"> - <number>0</number> + <property name="maximum"> + <number>99999</number> </property> - <item> - <widget class="QTableView" name="AVDTableView"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Expanding" vsizetype="Expanding"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="selectionMode"> - <enum>QAbstractItemView::SingleSelection</enum> - </property> - <property name="selectionBehavior"> - <enum>QAbstractItemView::SelectRows</enum> - </property> - <property name="textElideMode"> - <enum>Qt::ElideMiddle</enum> - </property> - <attribute name="horizontalHeaderHighlightSections"> - <bool>false</bool> - </attribute> - <attribute name="verticalHeaderVisible"> - <bool>false</bool> - </attribute> - </widget> - </item> - <item> - <layout class="QVBoxLayout" name="verticalLayout_2"> - <item> - <widget class="QLabel" name="DataPartitionSizeLable"> - <property name="text"> - <string>System/data partition size:</string> - </property> - </widget> - </item> - <item> - <widget class="QSpinBox" name="DataPartitionSizeSpinBox"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Preferred" vsizetype="Fixed"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="suffix"> - <string> Mb</string> - </property> - <property name="maximum"> - <number>99999</number> - </property> - <property name="value"> - <number>1024</number> - </property> - </widget> - </item> - <item> - <widget class="QPushButton" name="AVDStartPushButton"> - <property name="enabled"> - <bool>false</bool> - </property> - <property name="sizePolicy"> - <sizepolicy hsizetype="Preferred" vsizetype="Fixed"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="text"> - <string>Start...</string> - </property> - </widget> - </item> - <item> - <widget class="QPushButton" name="AVDRefreshPushButton"> - <property name="text"> - <string>Refresh List</string> - </property> - </widget> - </item> - <item> - <spacer name="verticalSpacer_2"> - <property name="orientation"> - <enum>Qt::Vertical</enum> - </property> - <property name="sizeType"> - <enum>QSizePolicy::Fixed</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>0</width> - <height>8</height> - </size> - </property> - </spacer> - </item> - <item> - <widget class="QPushButton" name="AVDAddPushButton"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Preferred" vsizetype="Fixed"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="text"> - <string>Add...</string> - </property> - </widget> - </item> - <item> - <widget class="QPushButton" name="AVDRemovePushButton"> - <property name="enabled"> - <bool>false</bool> - </property> - <property name="sizePolicy"> - <sizepolicy hsizetype="Preferred" vsizetype="Fixed"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="text"> - <string>Remove</string> - </property> - </widget> - </item> - <item> - <spacer name="verticalSpacer"> - <property name="orientation"> - <enum>Qt::Vertical</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>20</width> - <height>40</height> - </size> - </property> - </spacer> - </item> - </layout> - </item> - </layout> - </widget> - <widget class="QWidget" name="sdkManagerTab"> - <attribute name="title"> - <string>SDK Manager</string> - </attribute> - </widget> - </widget> + <property name="value"> + <number>1024</number> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="AVDStartPushButton"> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="sizePolicy"> + <sizepolicy hsizetype="Preferred" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>Start...</string> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="AVDRefreshPushButton"> + <property name="text"> + <string>Refresh List</string> + </property> + </widget> + </item> + <item> + <spacer name="verticalSpacer_2"> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeType"> + <enum>QSizePolicy::Fixed</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>0</width> + <height>8</height> + </size> + </property> + </spacer> + </item> + <item> + <widget class="QPushButton" name="AVDAddPushButton"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Preferred" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>Add...</string> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="AVDRemovePushButton"> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="sizePolicy"> + <sizepolicy hsizetype="Preferred" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>Remove</string> + </property> + </widget> + </item> + <item> + <spacer name="verticalSpacer"> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>40</height> + </size> + </property> + </spacer> + </item> + </layout> </item> </layout> </widget> + <widget class="QWidget" name="sdkManagerTab"> + <attribute name="title"> + <string>SDK Manager</string> + </attribute> + </widget> </widget> </item> </layout> diff --git a/src/plugins/android/avddialog.cpp b/src/plugins/android/avddialog.cpp index 878ccad276..ded445e2cb 100644 --- a/src/plugins/android/avddialog.cpp +++ b/src/plugins/android/avddialog.cpp @@ -27,6 +27,7 @@ #include "androidsdkmanager.h" #include "androidavdmanager.h" +#include <projectexplorer/projectexplorerconstants.h> #include <utils/algorithm.h> #include <utils/tooltip/tooltip.h> #include <utils/utilsicons.h> @@ -58,8 +59,12 @@ AvdDialog::AvdDialog(int minApiLevel, AndroidSdkManager *sdkManager, const QStri m_hideTipTimer.setSingleShot(true); if (abis.isEmpty()) { - m_avdDialog.abiComboBox->addItems(QStringList({"x86", "x86_64", "armeabi-v7a", - "armeabi", "arm64-v8a"})); + m_avdDialog.abiComboBox->addItems(QStringList({ + ProjectExplorer::Constants::ANDROID_ABI_X86, + ProjectExplorer::Constants::ANDROID_ABI_X86_64, + ProjectExplorer::Constants::ANDROID_ABI_ARMEABI_V7A, + ProjectExplorer::Constants::ANDROID_ABI_ARMEABI, + ProjectExplorer::Constants::ANDROID_ABI_ARM64_V8A})); } else { m_avdDialog.abiComboBox->addItems(abis); } diff --git a/src/plugins/android/createandroidmanifestwizard.cpp b/src/plugins/android/createandroidmanifestwizard.cpp index 097828ce38..953f96a9e2 100644 --- a/src/plugins/android/createandroidmanifestwizard.cpp +++ b/src/plugins/android/createandroidmanifestwizard.cpp @@ -182,7 +182,7 @@ ChooseDirectoryPage::ChooseDirectoryPage(CreateAndroidManifestWizard *wizard) if (wizard->copyGradle()) { auto checkBox = new QCheckBox(this); - checkBox->setChecked(true); + checkBox->setChecked(false); connect(checkBox, &QCheckBox::toggled, wizard, &CreateAndroidManifestWizard::setCopyGradle); checkBox->setText(tr("Copy the Gradle files to Android directory")); checkBox->setToolTip(tr("It is highly recommended if you are planning to extend the Java part of your Qt application.")); @@ -245,7 +245,7 @@ void ChooseDirectoryPage::initializePage() // CreateAndroidManifestWizard // CreateAndroidManifestWizard::CreateAndroidManifestWizard(BuildSystem *buildSystem) - : m_buildSystem(buildSystem), m_copyState(Ask) + : m_buildSystem(buildSystem) { setWindowTitle(tr("Create Android Template Files Wizard")); @@ -290,70 +290,12 @@ void CreateAndroidManifestWizard::setCopyGradle(bool copy) m_copyGradle = copy; } -bool CreateAndroidManifestWizard::copy(const QFileInfo &src, const QFileInfo &dst, QStringList * addedFiles) -{ - bool copyFile = true; - if (dst.exists()) { - switch (m_copyState) { - case Ask: - { - int res = QMessageBox::question(this, - tr("Overwrite %1 file").arg(dst.fileName()), - tr("Overwrite existing \"%1\"?") - .arg(QDir(m_directory).relativeFilePath(dst.absoluteFilePath())), - QMessageBox::Yes | QMessageBox::YesToAll | - QMessageBox::No | QMessageBox::NoToAll | - QMessageBox::Cancel); - switch (res) { - case QMessageBox::YesToAll: - m_copyState = OverwriteAll; - break; - - case QMessageBox::Yes: - break; - - case QMessageBox::NoToAll: - m_copyState = SkipAll; - copyFile = false; - break; - - case QMessageBox::No: - copyFile = false; - break; - default: - return false; - } - } - break; - case SkipAll: - copyFile = false; - break; - default: - break; - } - if (copyFile) - QFile::remove(dst.filePath()); - } - - if (!dst.absoluteDir().exists()) - dst.absoluteDir().mkpath(dst.absolutePath()); - - if (copyFile && !QFile::copy(src.filePath(), dst.filePath())) { - QMessageBox::warning(this, tr("File Creation Error"), - tr("Could not copy file \"%1\" to \"%2\".") - .arg(src.filePath()).arg(dst.filePath())); - return false; - } - addedFiles->append(dst.absoluteFilePath()); - return true; -} - void CreateAndroidManifestWizard::createAndroidTemplateFiles() { if (m_directory.isEmpty()) return; - QStringList addedFiles; + FileUtils::CopyAskingForOverwrite copy(this); Target *target = m_buildSystem->target(); QtSupport::BaseQtVersion *version = QtSupport::QtKitAspect::qtVersion(target->kit()); if (!version) @@ -361,21 +303,23 @@ void CreateAndroidManifestWizard::createAndroidTemplateFiles() if (version->qtVersion() < QtSupport::QtVersionNumber(5, 4, 0)) { const QString src = version->prefix().toString() + "/src/android/java/AndroidManifest.xml"; FileUtils::copyRecursively(FilePath::fromString(src), - FilePath::fromString(m_directory + QLatin1String("/AndroidManifest.xml")), - nullptr, [this, &addedFiles](QFileInfo src, QFileInfo dst, QString *){return copy(src, dst, &addedFiles);}); + FilePath::fromString(m_directory + + QLatin1String("/AndroidManifest.xml")), + nullptr, + copy); } else { const QString src = version->prefix().toString() + "/src/android/templates"; FileUtils::copyRecursively(FilePath::fromString(src), FilePath::fromString(m_directory), - nullptr, [this, &addedFiles](QFileInfo src, QFileInfo dst, QString *){return copy(src, dst, &addedFiles);}); + nullptr, + copy); if (m_copyGradle) { FilePath gradlePath = version->prefix().pathAppended("src/3rdparty/gradle"); if (!gradlePath.exists()) gradlePath = AndroidConfigurations::currentConfig().sdkLocation().pathAppended("/tools/templates/gradle/wrapper"); - FileUtils::copyRecursively(gradlePath, FilePath::fromString(m_directory), - nullptr, [this, &addedFiles](QFileInfo src, QFileInfo dst, QString *){return copy(src, dst, &addedFiles);}); + FileUtils::copyRecursively(gradlePath, FilePath::fromString(m_directory), nullptr, copy); } AndroidManager::updateGradleProperties(target, m_buildKey); @@ -385,7 +329,7 @@ void CreateAndroidManifestWizard::createAndroidTemplateFiles() QString androidPackageDir; ProjectNode *node = target->project()->findNodeForBuildKey(m_buildKey); if (node) { - node->addFiles(addedFiles); + node->addFiles(copy.files()); androidPackageDir = node->data(Android::Constants::AndroidPackageSourceDir).toString(); if (androidPackageDir.isEmpty()) { diff --git a/src/plugins/android/createandroidmanifestwizard.h b/src/plugins/android/createandroidmanifestwizard.h index eee030ff33..694e4b8cb7 100644 --- a/src/plugins/android/createandroidmanifestwizard.h +++ b/src/plugins/android/createandroidmanifestwizard.h @@ -54,19 +54,11 @@ public: ProjectExplorer::BuildSystem *buildSystem() const; private: - enum CopyState { - Ask, - OverwriteAll, - SkipAll - }; - bool copy(const QFileInfo &src, const QFileInfo &dst, QStringList *addedFiles); - void createAndroidManifestFile(); void createAndroidTemplateFiles(); ProjectExplorer::BuildSystem *m_buildSystem; QString m_buildKey; QString m_directory; - CopyState m_copyState; bool m_copyGradle; }; diff --git a/src/plugins/autotest/CMakeLists.txt b/src/plugins/autotest/CMakeLists.txt index 1ee331dc5f..18521d7608 100644 --- a/src/plugins/autotest/CMakeLists.txt +++ b/src/plugins/autotest/CMakeLists.txt @@ -40,6 +40,7 @@ add_qtc_plugin(AutoTest gtest/gtesttreeitem.cpp gtest/gtesttreeitem.h gtest/gtestvisitors.cpp gtest/gtestvisitors.h iframeworksettings.h + itemdatacache.h itestframework.cpp itestframework.h itestparser.cpp itestparser.h projectsettingswidget.cpp projectsettingswidget.h diff --git a/src/plugins/autotest/autotest.pro b/src/plugins/autotest/autotest.pro index 5d1db25e3a..a751723017 100644 --- a/src/plugins/autotest/autotest.pro +++ b/src/plugins/autotest/autotest.pro @@ -79,6 +79,7 @@ HEADERS += \ autotesticons.h \ autotestplugin.h \ iframeworksettings.h \ + itemdatacache.h \ itestframework.h \ itestparser.h \ projectsettingswidget.h \ diff --git a/src/plugins/autotest/autotest.qbs b/src/plugins/autotest/autotest.qbs index ea014bc06d..92d6853b1a 100644 --- a/src/plugins/autotest/autotest.qbs +++ b/src/plugins/autotest/autotest.qbs @@ -37,6 +37,7 @@ QtcPlugin { "autotestconstants.h", "autotestplugin.cpp", "autotestplugin.h", + "itemdatacache.h", "projectsettingswidget.cpp", "projectsettingswidget.h", "testcodeparser.cpp", diff --git a/src/plugins/autotest/catch/catchtreeitem.cpp b/src/plugins/autotest/catch/catchtreeitem.cpp index cdd48d8536..e62cbe0da7 100644 --- a/src/plugins/autotest/catch/catchtreeitem.cpp +++ b/src/plugins/autotest/catch/catchtreeitem.cpp @@ -27,6 +27,7 @@ #include "catchconfiguration.h" #include "catchframework.h" +#include <projectexplorer/project.h> #include <projectexplorer/session.h> #include <utils/qtcassert.h> @@ -38,14 +39,26 @@ QString CatchTreeItem::testCasesString() const return m_state & CatchTreeItem::Parameterized ? QString(name() + " -*") : name(); } -QVariant CatchTreeItem::data(int column, int role) const +static QString nonRootDisplayName(const CatchTreeItem *it) { + if (it->type() != TestTreeItem::TestSuite) + return it->name(); + ProjectExplorer::Project *project = ProjectExplorer::SessionManager::startupProject(); + if (!project) + return it->name(); + TestTreeItem *parent = it->parentItem(); + int baseDirSize = (parent->type() == TestTreeItem::GroupNode) + ? parent->filePath().size() : project->projectDirectory().toString().size(); + return it->name().mid(baseDirSize + 1); +} +QVariant CatchTreeItem::data(int column, int role) const +{ switch (role) { case Qt::DisplayRole: if (type() == Root) break; - return QString(name() + stateSuffix()); + return QString(nonRootDisplayName(this) + stateSuffix()); case Qt::CheckStateRole: switch (type()) { case Root: diff --git a/src/plugins/autotest/itemdatacache.h b/src/plugins/autotest/itemdatacache.h new file mode 100644 index 0000000000..ae5569075b --- /dev/null +++ b/src/plugins/autotest/itemdatacache.h @@ -0,0 +1,87 @@ +/**************************************************************************** +** +** Copyright (C) 2020 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qt Creator. +** +** 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 General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** 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-3.0.html. +** +****************************************************************************/ + +#pragma once + +#include "testtreeitem.h" + +#include <utils/optional.h> + +#include <QVariantHash> + +namespace Autotest { +namespace Internal { + +template<class T> +class ItemDataCache +{ +public: + void insert(TestTreeItem *item, const T &value) { m_cache[item->cacheName()] = {0, value}; } + void evolve() + { + auto it = m_cache.begin(), end = m_cache.end(); + while (it != end) + it = it->generation++ >= maxGen ? m_cache.erase(it) : ++it; + } + + Utils::optional<T> get(TestTreeItem *item) + { + auto entry = m_cache.find(item->cacheName()); + if (entry == m_cache.end()) + return Utils::nullopt; + entry->generation = 0; + return Utils::make_optional(entry->value); + }; + + void clear() { m_cache.clear(); } + bool isEmpty() const { return m_cache.isEmpty(); } + + QVariantHash toSettings() const + { + QVariantHash result; + for (auto it = m_cache.cbegin(), end = m_cache.cend(); it != end; ++it) + result.insert(it.key(), QVariant::fromValue(it.value().value)); + return result; + } + + void fromSettings(const QVariantHash &stored) + { + m_cache.clear(); + for (auto it = stored.cbegin(), end = stored.cend(); it != end; ++it) + m_cache[it.key()] = {0, qvariant_cast<T>(it.value())}; + } + +private: + static constexpr int maxGen = 10; + struct Entry + { + int generation = 0; + T value; + }; + QHash<QString, Entry> m_cache; +}; + +} // namespace Internal +} // namespace Autotest diff --git a/src/plugins/autotest/testconfiguration.cpp b/src/plugins/autotest/testconfiguration.cpp index c5ff920260..10709e38a6 100644 --- a/src/plugins/autotest/testconfiguration.cpp +++ b/src/plugins/autotest/testconfiguration.cpp @@ -151,7 +151,8 @@ void TestConfiguration::completeTestInformation(TestRunMode runMode) if (buildTargets.size() > 1 ) // there are multiple executables with the same build target return; // let the user decide which one to run - const BuildTargetInfo targetInfo = buildTargets.first(); + const BuildTargetInfo targetInfo = buildTargets.size() ? buildTargets.first() + : BuildTargetInfo(); // we might end up with an empty targetFilePath - e.g. when having a library we just link to // there would be no BuildTargetInfo that could match diff --git a/src/plugins/autotest/testnavigationwidget.h b/src/plugins/autotest/testnavigationwidget.h index 454f893c6b..f01bb6c3d5 100644 --- a/src/plugins/autotest/testnavigationwidget.h +++ b/src/plugins/autotest/testnavigationwidget.h @@ -25,10 +25,9 @@ #pragma once +#include "itemdatacache.h" #include "testrunner.h" -#include "testtreemodel.h" - #include <coreplugin/inavigationwidgetfactory.h> #include <utils/navigationtreeview.h> @@ -49,8 +48,12 @@ class ProgressIndicator; } namespace Autotest { + +class TestTreeModel; + namespace Internal { +class TestTreeSortFilterModel; class TestTreeView; class TestNavigationWidget : public QWidget diff --git a/src/plugins/autotest/testprojectsettings.cpp b/src/plugins/autotest/testprojectsettings.cpp index 2726bf9566..cfb3b60e31 100644 --- a/src/plugins/autotest/testprojectsettings.cpp +++ b/src/plugins/autotest/testprojectsettings.cpp @@ -35,6 +35,7 @@ namespace Internal { static const char SK_ACTIVE_FRAMEWORKS[] = "AutoTest.ActiveFrameworks"; static const char SK_RUN_AFTER_BUILD[] = "AutoTest.RunAfterBuild"; +static const char SK_CHECK_STATES[] = "AutoTest.CheckStates"; static Q_LOGGING_CATEGORY(LOG, "qtc.autotest.frameworkmanager", QtWarningMsg) @@ -93,6 +94,7 @@ void TestProjectSettings::load() const QVariant runAfterBuild = m_project->namedSettings(SK_RUN_AFTER_BUILD); m_runAfterBuild = runAfterBuild.isValid() ? RunAfterBuildMode(runAfterBuild.toInt()) : RunAfterBuildMode::None; + m_checkStateCache.fromSettings(m_project->namedSettings(SK_CHECK_STATES).toHash()); } void TestProjectSettings::save() @@ -104,6 +106,8 @@ void TestProjectSettings::save() activeFrameworks.insert(it.key()->id().toString(), it.value()); m_project->setNamedSettings(SK_ACTIVE_FRAMEWORKS, activeFrameworks); m_project->setNamedSettings(SK_RUN_AFTER_BUILD, int(m_runAfterBuild)); + if (!m_checkStateCache.isEmpty()) + m_project->setNamedSettings(SK_CHECK_STATES, m_checkStateCache.toSettings()); } } // namespace Internal diff --git a/src/plugins/autotest/testprojectsettings.h b/src/plugins/autotest/testprojectsettings.h index a4ce6b34fc..7f7332197e 100644 --- a/src/plugins/autotest/testprojectsettings.h +++ b/src/plugins/autotest/testprojectsettings.h @@ -26,6 +26,7 @@ #pragma once #include "testsettings.h" +#include "testtreemodel.h" #include <projectexplorer/project.h> @@ -50,6 +51,7 @@ public: { m_activeTestFrameworks = enabledFrameworks; } QMap<ITestFramework *, bool> activeFrameworks() const { return m_activeTestFrameworks; } void activateFramework(const Utils::Id &id, bool activate); + Internal::ItemDataCache<Qt::CheckState> *checkStateCache() { return &m_checkStateCache; } private: void load(); void save(); @@ -58,6 +60,7 @@ private: bool m_useGlobalSettings = true; RunAfterBuildMode m_runAfterBuild = RunAfterBuildMode::None; QMap<ITestFramework *, bool> m_activeTestFrameworks; + Internal::ItemDataCache<Qt::CheckState> m_checkStateCache; }; } // namespace Internal diff --git a/src/plugins/autotest/testresultmodel.cpp b/src/plugins/autotest/testresultmodel.cpp index f91bda8ac0..7ea5f7d9d8 100644 --- a/src/plugins/autotest/testresultmodel.cpp +++ b/src/plugins/autotest/testresultmodel.cpp @@ -289,8 +289,11 @@ void TestResultModel::addTestResult(const TestResultPtr &testResult, bool autoEx addFileName(testResult->fileName()); // ensure we calculate the results pane correctly if (parentItem) { parentItem->appendChild(newItem); - if (autoExpand) + if (autoExpand) { parentItem->expand(); + newItem->expand(); + newItem->forAllChildren([](Utils::TreeItem *it) { it->expand(); }); + } updateParent(newItem); } else { if (lastRow >= 0) { diff --git a/src/plugins/autotest/testtreemodel.cpp b/src/plugins/autotest/testtreemodel.cpp index 95330d5fc9..b42e031148 100644 --- a/src/plugins/autotest/testtreemodel.cpp +++ b/src/plugins/autotest/testtreemodel.cpp @@ -91,7 +91,8 @@ void TestTreeModel::setupParsingConnections() connect(sm, &SessionManager::startupProjectChanged, [this](Project *project) { synchronizeTestFrameworks(); // we might have project settings m_parser->onStartupProjectChanged(project); - m_checkStateCache.clear(); // TODO persist to project settings? + m_checkStateCache = project ? AutotestPlugin::projectSettings(project)->checkStateCache() + : nullptr; }); CppTools::CppModelManager *cppMM = CppTools::CppModelManager::instance(); @@ -294,12 +295,12 @@ void TestTreeModel::rebuild(const QList<Utils::Id> &frameworkIds) void TestTreeModel::updateCheckStateCache() { - m_checkStateCache.evolve(); + m_checkStateCache->evolve(); for (Utils::TreeItem *rootNode : *rootItem()) { rootNode->forAllChildren([this](Utils::TreeItem *child) { auto childItem = static_cast<TestTreeItem *>(child); - m_checkStateCache.insert(childItem, childItem->checked()); + m_checkStateCache->insert(childItem, childItem->checked()); }); } } @@ -425,7 +426,7 @@ void TestTreeModel::insertItemInParent(TestTreeItem *item, TestTreeItem *root, b delete item; } else { // restore former check state if available - Utils::optional<Qt::CheckState> cached = m_checkStateCache.get(item); + Utils::optional<Qt::CheckState> cached = m_checkStateCache->get(item); if (cached.has_value()) item->setData(0, cached.value(), Qt::CheckStateRole); else @@ -515,7 +516,7 @@ void TestTreeModel::handleParseResult(const TestParseResult *result, TestTreeIte // restore former check state if available newItem->forAllChildren([this](Utils::TreeItem *child) { auto childItem = static_cast<TestTreeItem *>(child); - Utils::optional<Qt::CheckState> cached = m_checkStateCache.get(childItem); + Utils::optional<Qt::CheckState> cached = m_checkStateCache->get(childItem); if (cached.has_value()) childItem->setData(0, cached.value(), Qt::CheckStateRole); }); diff --git a/src/plugins/autotest/testtreemodel.h b/src/plugins/autotest/testtreemodel.h index 4ca3cb27b4..34f51cf7bb 100644 --- a/src/plugins/autotest/testtreemodel.h +++ b/src/plugins/autotest/testtreemodel.h @@ -27,6 +27,7 @@ #include "autotest_global.h" +#include "itemdatacache.h" #include "testconfiguration.h" #include "testtreeitem.h" @@ -39,40 +40,6 @@ namespace Autotest { namespace Internal { class AutotestPluginPrivate; class TestCodeParser; - -template<class T> -class ItemDataCache -{ -public: - void insert(TestTreeItem *item, const T &value) { m_cache[item->cacheName()] = {0, value}; } - void evolve() - { - auto it = m_cache.begin(), end = m_cache.end(); - while (it != end) - it = it->generation++ >= maxGen ? m_cache.erase(it) : ++it; - } - - Utils::optional<T> get(TestTreeItem *item) - { - auto entry = m_cache.find(item->cacheName()); - if (entry == m_cache.end()) - return Utils::nullopt; - entry->generation = 0; - return Utils::make_optional(entry->value); - }; - - void clear() { m_cache.clear(); } - -private: - static constexpr int maxGen = 10; - struct Entry - { - int generation = 0; - T value; - }; - QHash<QString, Entry> m_cache; -}; - } // namespace Internal class TestParseResult; @@ -139,7 +106,7 @@ private: QList<TestTreeItem *> testItemsByName(TestTreeItem *root, const QString &testName); Internal::TestCodeParser *m_parser = nullptr; - Internal::ItemDataCache<Qt::CheckState> m_checkStateCache; + Internal::ItemDataCache<Qt::CheckState> *m_checkStateCache = nullptr; // not owned }; namespace Internal { diff --git a/src/plugins/baremetal/debugservers/uvsc/jlinkuvscserverprovider.cpp b/src/plugins/baremetal/debugservers/uvsc/jlinkuvscserverprovider.cpp index 697577ae38..1a269dcc7f 100644 --- a/src/plugins/baremetal/debugservers/uvsc/jlinkuvscserverprovider.cpp +++ b/src/plugins/baremetal/debugservers/uvsc/jlinkuvscserverprovider.cpp @@ -177,7 +177,7 @@ bool JLinkUvscAdapterOptions::operator==(const JLinkUvscAdapterOptions &other) c JLinkUvscServerProvider::JLinkUvscServerProvider() : UvscServerProvider(Constants::UVSC_JLINK_PROVIDER_ID) { - setTypeDisplayName(tr("uVision JLink")); + setTypeDisplayName(UvscServerProvider::tr("uVision JLink")); setConfigurationWidgetCreator([this] { return new JLinkUvscServerProviderConfigWidget(this); }); setSupportedDrivers({"Segger\\JL2CM3.dll"}); } diff --git a/src/plugins/clangcodemodel/clangeditordocumentprocessor.cpp b/src/plugins/clangcodemodel/clangeditordocumentprocessor.cpp index ed9917a773..789ba940d2 100644 --- a/src/plugins/clangcodemodel/clangeditordocumentprocessor.cpp +++ b/src/plugins/clangcodemodel/clangeditordocumentprocessor.cpp @@ -139,8 +139,13 @@ void ClangEditorDocumentProcessor::recalculateSemanticInfoDetached(bool force) void ClangEditorDocumentProcessor::semanticRehighlight() { - m_semanticHighlighter.updateFormatMapFromFontSettings(); + const auto matchesEditor = [this](const Core::IEditor *editor) { + return editor->document()->filePath() == m_document.filePath(); + }; + if (!Utils::contains(Core::EditorManager::visibleEditors(), matchesEditor)) + return; + m_semanticHighlighter.updateFormatMapFromFontSettings(); if (m_projectPart) requestAnnotationsFromBackend(); } diff --git a/src/plugins/clangcodemodel/clangmodelmanagersupport.cpp b/src/plugins/clangcodemodel/clangmodelmanagersupport.cpp index 3f441fc54d..9e56b54b91 100644 --- a/src/plugins/clangcodemodel/clangmodelmanagersupport.cpp +++ b/src/plugins/clangcodemodel/clangmodelmanagersupport.cpp @@ -155,8 +155,10 @@ void ClangModelManagerSupport::onCurrentEditorChanged(Core::IEditor *editor) return; const ::Utils::FilePath filePath = editor->document()->filePath(); - if (auto processor = ClangEditorDocumentProcessor::get(filePath.toString())) + if (auto processor = ClangEditorDocumentProcessor::get(filePath.toString())) { + processor->semanticRehighlight(); processor->generateTaskHubIssues(); + } } void ClangModelManagerSupport::connectTextDocumentToTranslationUnit(TextEditor::TextDocument *textDocument) diff --git a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp index 5f4d2a5fc4..4548958c67 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp +++ b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp @@ -154,10 +154,11 @@ CMakeBuildConfiguration::CMakeBuildConfiguration(Target *target, Utils::Id id) auto androidAbis = bs->data(Android::Constants::AndroidABIs).toStringList(); QString preferredAbi; - if (androidAbis.contains("armeabi-v7a")) { - preferredAbi = "armeabi-v7a"; - } else if (androidAbis.isEmpty() || androidAbis.contains("arm64-v8a")) { - preferredAbi = "arm64-v8a"; + if (androidAbis.contains(ProjectExplorer::Constants::ANDROID_ABI_ARMEABI_V7A)) { + preferredAbi = ProjectExplorer::Constants::ANDROID_ABI_ARMEABI_V7A; + } else if (androidAbis.isEmpty() + || androidAbis.contains(ProjectExplorer::Constants::ANDROID_ABI_ARM64_V8A)) { + preferredAbi = ProjectExplorer::Constants::ANDROID_ABI_ARM64_V8A; } else { preferredAbi = androidAbis.first(); } diff --git a/src/plugins/cmakeprojectmanager/cmakebuildstep.cpp b/src/plugins/cmakeprojectmanager/cmakebuildstep.cpp index fab9b57b07..5f0aed9011 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildstep.cpp +++ b/src/plugins/cmakeprojectmanager/cmakebuildstep.cpp @@ -47,6 +47,7 @@ #include <QFormLayout> #include <QLineEdit> #include <QListWidget> +#include <QRegularExpression> using namespace ProjectExplorer; @@ -59,6 +60,53 @@ const char TOOL_ARGUMENTS_KEY[] = "CMakeProjectManager.MakeStep.AdditionalArgume const char ADD_RUNCONFIGURATION_ARGUMENT_KEY[] = "CMakeProjectManager.MakeStep.AddRunConfigurationArgument"; const char ADD_RUNCONFIGURATION_TEXT[] = "Current executable"; +class CmakeProgressParser : public Utils::OutputLineParser +{ + Q_OBJECT + +signals: + void progress(int percentage); + +private: + Result handleLine(const QString &line, Utils::OutputFormat format) override + { + if (format != Utils::StdOutFormat) + return Status::NotHandled; + + static const QRegularExpression percentProgress("^\\[\\s*(\\d*)%\\]"); + static const QRegularExpression ninjaProgress("^\\[\\s*(\\d*)/\\s*(\\d*)"); + + QRegularExpressionMatch match = percentProgress.match(line); + if (match.hasMatch()) { + bool ok = false; + const int percent = match.captured(1).toInt(&ok); + if (ok) + emit progress(percent); + return Status::Done; + } + match = ninjaProgress.match(line); + if (match.hasMatch()) { + m_useNinja = true; + bool ok = false; + const int done = match.captured(1).toInt(&ok); + if (ok) { + const int all = match.captured(2).toInt(&ok); + if (ok && all != 0) { + const int percent = static_cast<int>(100.0 * done / all); + emit progress(percent); + } + } + return Status::Done; + } + return Status::NotHandled; + } + bool hasDetectedRedirection() const override { return m_useNinja; } + + // TODO: Shouldn't we know the backend in advance? Then we could merge this class + // with CmakeParser. + bool m_useNinja = false; +}; + class CMakeBuildStepConfigWidget : public BuildStepConfigWidget { Q_DECLARE_TR_FUNCTIONS(CMakeProjectManager::Internal::CMakeBuildStepConfigWidget) @@ -88,8 +136,6 @@ static bool isCurrentExecutableTarget(const QString &target) CMakeBuildStep::CMakeBuildStep(BuildStepList *bsl, Utils::Id id) : AbstractProcessStep(bsl, id) { - m_percentProgress = QRegularExpression("^\\[\\s*(\\d*)%\\]"); - m_ninjaProgress = QRegularExpression("^\\[\\s*(\\d*)/\\s*(\\d*)"); m_ninjaProgressString = "[%f/%t "; // ninja: [33/100 //: Default display name for the cmake make step. setDefaultDisplayName(tr("CMake Build")); @@ -211,9 +257,18 @@ bool CMakeBuildStep::init() void CMakeBuildStep::setupOutputFormatter(Utils::OutputFormatter *formatter) { CMakeParser *cmakeParser = new CMakeParser; + CmakeProgressParser * const progressParser = new CmakeProgressParser; + connect(progressParser, &CmakeProgressParser::progress, this, [this](int percent) { + emit progress(percent, {}); + }); + formatter->addLineParser(progressParser); cmakeParser->setSourceDirectory(project()->projectDirectory().toString()); formatter->addLineParsers({cmakeParser, new GnuMakeParser}); - formatter->addLineParsers(target()->kit()->createOutputParsers()); + const QList<Utils::OutputLineParser *> additionalParsers + = target()->kit()->createOutputParsers(); + for (Utils::OutputLineParser * const p : additionalParsers) + p->setRedirectionDetector(progressParser); + formatter->addLineParsers(additionalParsers); formatter->addSearchDir(processParameters()->effectiveWorkingDirectory()); AbstractProcessStep::setupOutputFormatter(formatter); } @@ -276,51 +331,6 @@ QString CMakeBuildStep::defaultBuildTarget() const return allTarget(); } -void CMakeBuildStep::stdOutput(const QString &output) -{ - int offset = 0; - while (offset != -1) { - const int newlinePos = output.indexOf('\n', offset); - QString line; - if (newlinePos == -1) { - line = output.mid(offset); - offset = -1; - } else { - line = output.mid(offset, newlinePos - offset + 1); - offset = newlinePos + 1; - } - QRegularExpressionMatch match = m_percentProgress.match(line); - if (match.hasMatch()) { - AbstractProcessStep::stdOutput(line); - bool ok = false; - int percent = match.captured(1).toInt(&ok); - if (ok) - emit progress(percent, QString()); - continue; - } else { - match = m_ninjaProgress.match(line); - if (match.hasMatch()) { - AbstractProcessStep::stdOutput(line); - m_useNinja = true; - bool ok = false; - int done = match.captured(1).toInt(&ok); - if (ok) { - int all = match.captured(2).toInt(&ok); - if (ok && all != 0) { - const int percent = static_cast<int>(100.0 * done/all); - emit progress(percent, QString()); - } - } - continue; - } - } - if (m_useNinja) - AbstractProcessStep::stdError(line); - else - AbstractProcessStep::stdOutput(line); - } -} - QStringList CMakeBuildStep::buildTargets() const { return m_buildTargets; @@ -577,12 +587,6 @@ CMakeBuildStepFactory::CMakeBuildStepFactory() setSupportedProjectType(Constants::CMAKE_PROJECT_ID); } -void CMakeBuildStep::processStarted() -{ - m_useNinja = false; - AbstractProcessStep::processStarted(); -} - void CMakeBuildStep::processFinished(int exitCode, QProcess::ExitStatus status) { AbstractProcessStep::processFinished(exitCode, status); @@ -591,3 +595,5 @@ void CMakeBuildStep::processFinished(int exitCode, QProcess::ExitStatus status) } // Internal } // CMakeProjectManager + +#include <cmakebuildstep.moc> diff --git a/src/plugins/cmakeprojectmanager/cmakebuildstep.h b/src/plugins/cmakeprojectmanager/cmakebuildstep.h index 4b20ef5895..a2e12aee1b 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildstep.h +++ b/src/plugins/cmakeprojectmanager/cmakebuildstep.h @@ -75,14 +75,10 @@ signals: void buildTargetsChanged(); protected: - void processStarted() override; void processFinished(int exitCode, QProcess::ExitStatus status) override; bool fromMap(const QVariantMap &map) override; - // For parsing [ 76%] - void stdOutput(const QString &output) override; - private: void ctor(ProjectExplorer::BuildStepList *bsl); @@ -100,13 +96,10 @@ private: QMetaObject::Connection m_runTrigger; - QRegularExpression m_percentProgress; - QRegularExpression m_ninjaProgress; QString m_ninjaProgressString; QStringList m_buildTargets; QString m_cmakeArguments; QString m_toolArguments; - bool m_useNinja = false; bool m_waiting = false; }; diff --git a/src/plugins/coreplugin/outputwindow.cpp b/src/plugins/coreplugin/outputwindow.cpp index 7c05ee6630..9d58bae06a 100644 --- a/src/plugins/coreplugin/outputwindow.cpp +++ b/src/plugins/coreplugin/outputwindow.cpp @@ -408,10 +408,14 @@ void OutputWindow::handleOutputChunk(const QString &output, OutputFormat format) { QString out = output; if (out.size() > d->maxCharCount) { - // Current line alone exceeds limit, we need to cut it. - out.truncate(d->maxCharCount); - out.append("[...]"); - setMaximumBlockCount(1); + // Current chunk alone exceeds limit, we need to cut it. + const int elided = out.size() - d->maxCharCount; + out = out.left(d->maxCharCount / 2) + + "[[[... " + + tr("Elided %n characters due to Application Output settings", nullptr, elided) + + " ...]]]" + + out.right(d->maxCharCount / 2); + setMaximumBlockCount(out.count('\n') + 1); } else { int plannedChars = document()->characterCount() + out.size(); if (plannedChars > d->maxCharCount) { diff --git a/src/plugins/coreplugin/statusbarmanager.cpp b/src/plugins/coreplugin/statusbarmanager.cpp index 5d9116379f..182375b264 100644 --- a/src/plugins/coreplugin/statusbarmanager.cpp +++ b/src/plugins/coreplugin/statusbarmanager.cpp @@ -143,12 +143,11 @@ void StatusBarManager::addStatusBarWidget(QWidget *widget, void StatusBarManager::destroyStatusBarWidget(QWidget *widget) { QTC_ASSERT(widget, return); - for (const QPointer<IContext> &context : m_contexts) { - if (context->widget() == widget) { - m_contexts.removeAll(context); - delete context; - break; - } + const auto it = std::find_if(m_contexts.begin(), m_contexts.end(), + [widget](const auto &context) { return context->widget() == widget; }); + if (it != m_contexts.end()) { + delete *it; + m_contexts.erase(it); } widget->setParent(nullptr); delete widget; diff --git a/src/plugins/coreplugin/vcsmanager.cpp b/src/plugins/coreplugin/vcsmanager.cpp index db06547cba..23c1bc792b 100644 --- a/src/plugins/coreplugin/vcsmanager.cpp +++ b/src/plugins/coreplugin/vcsmanager.cpp @@ -348,8 +348,8 @@ bool VcsManager::promptToDelete(IVersionControl *vc, const QString &fileName) if (!vc->supportsOperation(IVersionControl::DeleteOperation)) return true; const QString title = tr("Version Control"); - const QString msg = tr("Would you like to remove this file from the version control system (%1)?\n" - "Note: This might remove the local file.").arg(vc->displayName()); + const QString msg = tr("Would you like to remove\n\t%1\nfrom the version control system (%2)?\n" + "Note: This might remove the local file.").arg(fileName, vc->displayName()); const QMessageBox::StandardButton button = QMessageBox::question(ICore::dialogParent(), title, msg, QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes); if (button != QMessageBox::Yes) diff --git a/src/plugins/cpaster/dpastedotcomprotocol.cpp b/src/plugins/cpaster/dpastedotcomprotocol.cpp index 1a0d9c6194..c5927c58f3 100644 --- a/src/plugins/cpaster/dpastedotcomprotocol.cpp +++ b/src/plugins/cpaster/dpastedotcomprotocol.cpp @@ -46,20 +46,42 @@ void DPasteDotComProtocol::fetch(const QString &id) { QNetworkReply * const reply = httpGet(baseUrl() + '/' + id + ".txt"); connect(reply, &QNetworkReply::finished, this, [this, id, reply] { - QString title; - QString content; - const bool error = reply->error(); - if (error) { - content = reply->errorString(); - } else { - title = name() + ": " + id; - content = QString::fromUtf8(reply->readAll()); - } - reply->deleteLater(); - emit fetchDone(title, content, error); + fetchFinished(id, reply, false); }); } +void DPasteDotComProtocol::fetchFinished(const QString &id, QNetworkReply * const reply, + bool alreadyRedirected) +{ + const int status = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); + if (status >= 300 && status <= 308 && status != 306) { + if (!alreadyRedirected) { + const QString location = QString::fromUtf8(reply->rawHeader("Location")); + if (status == 301 || status == 308) { + const QString m = QString("HTTP redirect (%1) to \"%2\"").arg(status).arg(location); + Core::MessageManager::write(m, Core::MessageManager::ModeSwitch); + } + QNetworkReply * const newRep = httpGet(location); + connect(newRep, &QNetworkReply::finished, this, [this, id, newRep] { + fetchFinished(id, newRep, true); + }); + reply->deleteLater(); + return; + } + } + QString title; + QString content; + const bool error = reply->error(); + if (error) { + content = reply->errorString(); + } else { + title = name() + ": " + id; + content = QString::fromUtf8(reply->readAll()); + } + reply->deleteLater(); + emit fetchDone(title, content, error); +} + static QByteArray typeToString(Protocol::ContentType type) { switch (type) { diff --git a/src/plugins/cpaster/dpastedotcomprotocol.h b/src/plugins/cpaster/dpastedotcomprotocol.h index 6f01649578..9b39052d8c 100644 --- a/src/plugins/cpaster/dpastedotcomprotocol.h +++ b/src/plugins/cpaster/dpastedotcomprotocol.h @@ -40,6 +40,7 @@ private: bool hasSettings() const override { return false; } unsigned capabilities() const override; void fetch(const QString &id) override; + void fetchFinished(const QString &id, QNetworkReply * const reply, bool alreadyRedirected); void paste(const QString &text, ContentType ct = Text, int expiryDays = 1, diff --git a/src/plugins/cpptools/cpptoolsconstants.h b/src/plugins/cpptools/cpptoolsconstants.h index 667780bae1..4cee205b94 100644 --- a/src/plugins/cpptools/cpptoolsconstants.h +++ b/src/plugins/cpptools/cpptoolsconstants.h @@ -99,7 +99,7 @@ const char SYMBOLS_FIND_FILTER_DISPLAY_NAME[] = QT_TRANSLATE_NOOP("CppTools", "C // CLANG_VERSION here because it might denote a version that was not yet // released (e.g. 6.0.1, but only 6.0.0 was released). constexpr const char TIDY_DOCUMENTATION_URL_TEMPLATE[] - = "https://releases.llvm.org/8.0.1/tools/clang/tools/extra/docs/clang-tidy/checks/%1.html"; + = "https://releases.llvm.org/10.0.0/tools/clang/tools/extra/docs/clang-tidy/checks/%1.html"; constexpr const char CLANG_STATIC_ANALYZER_DOCUMENTATION_URL[] = "https://clang-analyzer.llvm.org/available_checks.html"; diff --git a/src/plugins/cpptools/cpptoolsjsextension.cpp b/src/plugins/cpptools/cpptoolsjsextension.cpp index 03a0d3df99..fec4885465 100644 --- a/src/plugins/cpptools/cpptoolsjsextension.cpp +++ b/src/plugins/cpptools/cpptoolsjsextension.cpp @@ -121,7 +121,7 @@ QString CppToolsJsExtension::closeNamespaces(const QString &klass) const QString CppToolsJsExtension::includeStatement( const QString &fullyQualifiedClassName, const QString &suffix, - const QString &specialClasses, + const QStringList &specialClasses, const QString &pathOfIncludingFile ) { diff --git a/src/plugins/cpptools/cpptoolsjsextension.h b/src/plugins/cpptools/cpptoolsjsextension.h index 065e0ca8d5..b026465b0c 100644 --- a/src/plugins/cpptools/cpptoolsjsextension.h +++ b/src/plugins/cpptools/cpptoolsjsextension.h @@ -60,7 +60,7 @@ public: Q_INVOKABLE QString includeStatement( const QString &fullyQualifiedClassName, const QString &suffix, - const QString &specialClasses, + const QStringList &specialClasses, const QString &pathOfIncludingFile ); }; diff --git a/src/plugins/debugger/CMakeLists.txt b/src/plugins/debugger/CMakeLists.txt index 025125a1a5..bc05b7dbb1 100644 --- a/src/plugins/debugger/CMakeLists.txt +++ b/src/plugins/debugger/CMakeLists.txt @@ -58,10 +58,6 @@ add_qtc_plugin(Debugger logwindow.cpp logwindow.h memoryagent.cpp memoryagent.h moduleshandler.cpp moduleshandler.h - namedemangler/demanglerexceptions.h - namedemangler/globalparsestate.cpp namedemangler/globalparsestate.h - namedemangler/namedemangler.cpp namedemangler/namedemangler.h - namedemangler/parsetreenodes.cpp namedemangler/parsetreenodes.h outputcollector.cpp outputcollector.h pdb/pdbengine.cpp pdb/pdbengine.h peripheralregisterhandler.cpp peripheralregisterhandler.h diff --git a/src/plugins/debugger/cdb/cdbengine.cpp b/src/plugins/debugger/cdb/cdbengine.cpp index a0689e4307..37373bab9e 100644 --- a/src/plugins/debugger/cdb/cdbengine.cpp +++ b/src/plugins/debugger/cdb/cdbengine.cpp @@ -730,8 +730,7 @@ bool CdbEngine::hasCapability(unsigned cap) const | CreateFullBacktraceCapability | OperateByInstructionCapability | RunToLineCapability - | MemoryAddressCapability - | AdditionalQmlStackCapability); + | MemoryAddressCapability); } void CdbEngine::executeStepIn(bool byInstruction) diff --git a/src/plugins/debugger/console/consoleview.cpp b/src/plugins/debugger/console/consoleview.cpp index 823e37ae6b..13115cb43b 100644 --- a/src/plugins/debugger/console/consoleview.cpp +++ b/src/plugins/debugger/console/consoleview.cpp @@ -48,35 +48,6 @@ namespace Debugger { namespace Internal { -class ConsoleViewStyle : public ManhattanStyle -{ -public: - ConsoleViewStyle(const QString &baseStyleName) : ManhattanStyle(baseStyleName) {} - - void drawPrimitive(PrimitiveElement element, const QStyleOption *option, QPainter *painter, - const QWidget *widget = nullptr) const final - { - if (element != QStyle::PE_PanelItemViewRow) - ManhattanStyle::drawPrimitive(element, option, painter, widget); - } - - int styleHint(StyleHint hint, const QStyleOption *option = nullptr, - const QWidget *widget = nullptr, - QStyleHintReturn *returnData = nullptr) const final - { - if (hint == SH_ItemView_ShowDecorationSelected) - return 0; - else - return ManhattanStyle::styleHint(hint, option, widget, returnData); - } -}; - -/////////////////////////////////////////////////////////////////////// -// -// ConsoleView -// -/////////////////////////////////////////////////////////////////////// - ConsoleView::ConsoleView(ConsoleItemModel *model, QWidget *parent) : Utils::TreeView(parent), m_model(model) { @@ -102,17 +73,6 @@ ConsoleView::ConsoleView(ConsoleItemModel *model, QWidget *parent) : "border-image: none;" "image: none; }"); - QString baseName = QApplication::style()->objectName(); - if (Utils::HostOsInfo::isAnyUnixHost() && !Utils::HostOsInfo::isMacHost() - && baseName == "windows") { - // Sometimes we get the standard windows 95 style as a fallback - if (QStyleFactory::keys().contains("Fusion")) { - baseName = "fusion"; // Qt5 - } - } - auto style = new ConsoleViewStyle(baseName); - setStyle(style); - style->setParent(this); setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn); setVerticalScrollMode(QAbstractItemView::ScrollPerPixel); diff --git a/src/plugins/debugger/debugger.pro b/src/plugins/debugger/debugger.pro index 916eb69330..6c38efaca8 100644 --- a/src/plugins/debugger/debugger.pro +++ b/src/plugins/debugger/debugger.pro @@ -133,7 +133,6 @@ include(pdb/pdb.pri) include(lldb/lldb.pri) include(uvsc/uvsc.pri) include(qml/qml.pri) -include(namedemangler/namedemangler.pri) include(console/console.pri) include(analyzer/analyzer.pri) diff --git a/src/plugins/debugger/debugger.qbs b/src/plugins/debugger/debugger.qbs index 2c624a3479..a50a2b48cf 100644 --- a/src/plugins/debugger/debugger.qbs +++ b/src/plugins/debugger/debugger.qbs @@ -139,17 +139,6 @@ Project { } Group { - name: "Name Demangler" - prefix: "namedemangler/" - files: [ - "demanglerexceptions.h", - "globalparsestate.cpp", "globalparsestate.h", - "namedemangler.cpp", "namedemangler.h", - "parsetreenodes.cpp", "parsetreenodes.h", - ] - } - - Group { name: "QML Debugger" prefix: "qml/" files: [ diff --git a/src/plugins/debugger/debuggerdialogs.cpp b/src/plugins/debugger/debuggerdialogs.cpp index 016697549a..45a79b4155 100644 --- a/src/plugins/debugger/debuggerdialogs.cpp +++ b/src/plugins/debugger/debuggerdialogs.cpp @@ -462,7 +462,8 @@ void StartApplicationDialog::run(bool attachRemote) debugger->setCommandsAfterConnect(newParameters.serverInitCommands); debugger->setCommandsForReset(newParameters.serverResetCommands); debugger->setUseTerminal(newParameters.runInTerminal); - debugger->setSysRoot(newParameters.sysRoot); + if (!newParameters.sysRoot.isEmpty()) + debugger->setSysRoot(newParameters.sysRoot); bool isLocal = !dev || (dev->type() == ProjectExplorer::Constants::DESKTOP_DEVICE_TYPE); if (isLocal) { diff --git a/src/plugins/debugger/namedemangler/demanglerexceptions.h b/src/plugins/debugger/namedemangler/demanglerexceptions.h deleted file mode 100644 index aa03d80e4f..0000000000 --- a/src/plugins/debugger/namedemangler/demanglerexceptions.h +++ /dev/null @@ -1,75 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt Creator. -** -** 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 General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** 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-3.0.html. -** -****************************************************************************/ - -#pragma once - -#include <QtGlobal> -#include <QSharedPointer> -#include <QString> - -namespace Debugger { -namespace Internal { - -class ParseTreeNode; - -class ParseException -{ -public: - ParseException(const QString &error) : error(error) {} - - const QString error; -}; - -class InternalDemanglerException -{ -public: - InternalDemanglerException(const QString &func, const QString &file, int line) - : func(func), file(file), line(line) {} - - QString func; - QString file; - int line; -}; - -#define DEMANGLER_ASSERT(cond) \ - do { \ - if (!(cond)) { \ - throw InternalDemanglerException(Q_FUNC_INFO, __FILE__, __LINE__); \ - } \ - } while (0) - -template <typename T> QSharedPointer<T> demanglerCast(const QSharedPointer<ParseTreeNode> &node, - const QString &func, const QString &file, int line) -{ - const QSharedPointer<T> out = node.dynamicCast<T>(); - if (!out) - throw InternalDemanglerException(func, file, line); - return out; -} - -#define DEMANGLER_CAST(type, input) demanglerCast<type>(input, Q_FUNC_INFO, __FILE__, __LINE__) - -} // namespace Internal -} // namespace Debugger diff --git a/src/plugins/debugger/namedemangler/globalparsestate.cpp b/src/plugins/debugger/namedemangler/globalparsestate.cpp deleted file mode 100644 index 25e019816a..0000000000 --- a/src/plugins/debugger/namedemangler/globalparsestate.cpp +++ /dev/null @@ -1,69 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt Creator. -** -** 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 General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** 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-3.0.html. -** -****************************************************************************/ - -#include "globalparsestate.h" - -#include "demanglerexceptions.h" -#include "parsetreenodes.h" - -namespace Debugger { -namespace Internal { - -char GlobalParseState::peek(int ahead) -{ - Q_ASSERT(m_pos >= 0); - if (m_pos + ahead < m_mangledName.size()) - return m_mangledName[m_pos + ahead]; - return eoi; -} - -char GlobalParseState::advance(int steps) -{ - Q_ASSERT(steps > 0); - if (m_pos + steps > m_mangledName.size()) - throw ParseException("Unexpected end of input"); - - const char c = m_mangledName[m_pos]; - m_pos += steps; - return c; -} - -QByteArray GlobalParseState::readAhead(int charCount) const -{ - QByteArray str; - if (m_pos + charCount <= m_mangledName.size()) - str = m_mangledName.mid(m_pos, charCount); - else - str.fill(eoi, charCount); - return str; -} - -void GlobalParseState::addSubstitution(const QSharedPointer<ParseTreeNode> &node) -{ - m_substitutions << node->clone(); -} - -} // namespace Internal -} // namespace Debugger diff --git a/src/plugins/debugger/namedemangler/globalparsestate.h b/src/plugins/debugger/namedemangler/globalparsestate.h deleted file mode 100644 index 2544c78d73..0000000000 --- a/src/plugins/debugger/namedemangler/globalparsestate.h +++ /dev/null @@ -1,69 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt Creator. -** -** 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 General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** 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-3.0.html. -** -****************************************************************************/ - -#pragma once - -#include <QByteArray> -#include <QSharedPointer> -#include <QStack> - -namespace Debugger { -namespace Internal { -class NameDemanglerPrivate; -class ParseTreeNode; - -class GlobalParseState -{ - friend class NameDemanglerPrivate; -public: - char peek(int ahead = 0); - char advance(int steps = 1); - QByteArray readAhead(int charCount) const; - - int stackElementCount() const { return m_parseStack.count(); } - QSharedPointer<ParseTreeNode> stackTop() const { return m_parseStack.top(); } - QSharedPointer<ParseTreeNode> stackElementAt(int index) const { return m_parseStack.at(index); } - void pushToStack(const QSharedPointer<ParseTreeNode> &node) { m_parseStack.push(node); } - QSharedPointer<ParseTreeNode> popFromStack() { return m_parseStack.pop(); } - - int substitutionCount() const { return m_substitutions.count(); } - QSharedPointer<ParseTreeNode> substitutionAt(int index) const { return m_substitutions.at(index); } - void addSubstitution(const QSharedPointer<ParseTreeNode> &node); - - int templateParamCount() const { return m_templateParams.count(); } - QSharedPointer<ParseTreeNode> templateParamAt(int index) const { return m_templateParams.at(index); } - void addTemplateParam(const QSharedPointer<ParseTreeNode> &node) { m_templateParams << node; } -private: - int m_pos = 0; - QByteArray m_mangledName; - QList<QSharedPointer<ParseTreeNode> > m_substitutions; - QList<QSharedPointer<ParseTreeNode> > m_templateParams; - QStack<QSharedPointer<ParseTreeNode> > m_parseStack; - - static const char eoi = '$'; -}; - -} // namespace Internal -} // namespace Debugger diff --git a/src/plugins/debugger/namedemangler/namedemangler.cpp b/src/plugins/debugger/namedemangler/namedemangler.cpp deleted file mode 100644 index 9041543fd0..0000000000 --- a/src/plugins/debugger/namedemangler/namedemangler.cpp +++ /dev/null @@ -1,116 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt Creator. -** -** 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 General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** 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-3.0.html. -** -****************************************************************************/ - -#include "namedemangler.h" - -#include "demanglerexceptions.h" -#include "parsetreenodes.h" - -#include <limits> - -namespace Debugger { -namespace Internal { - -class NameDemanglerPrivate -{ -public: - bool demangle(const QString &mangledName); - const QString &errorString() const { return m_errorString; } - const QString &demangledName() const { return m_demangledName; } - -private: - GlobalParseState m_parseState; - QString m_errorString; - QString m_demangledName; -}; - - -bool NameDemanglerPrivate::demangle(const QString &mangledName) -{ - bool success; - try { - m_parseState.m_mangledName = mangledName.toLatin1(); - m_parseState.m_pos = 0; - m_demangledName.clear(); - - if (!MangledNameRule::mangledRepresentationStartsWith(m_parseState.peek())) { - m_demangledName = QLatin1String(m_parseState.m_mangledName); - return true; - } - - MangledNameRule::parse(&m_parseState, ParseTreeNode::Ptr()); - if (m_parseState.m_pos != m_parseState.m_mangledName.size()) - throw ParseException("Unconsumed input"); - if (m_parseState.m_parseStack.count() != 1) { - throw ParseException(QString::fromLatin1("There are %1 elements on the parse stack; " - "expected one.").arg(m_parseState.m_parseStack.count())); - } - - // Uncomment for debugging. - //m_parseState.stackTop()->print(0); - - m_demangledName = QLatin1String(m_parseState.stackTop()->toByteArray()); - success = true; - } catch (const ParseException &p) { - m_errorString = QString::fromLatin1("Parse error at index %1 of mangled name \"%2\": %3.") - .arg(m_parseState.m_pos).arg(mangledName, p.error); - success = false; - } catch (const InternalDemanglerException &e) { - m_errorString = QString::fromLatin1("Internal demangler error at function %1, file %2, " - "line %3").arg(e.func, e.file).arg(e.line); - success = false; - } - - m_parseState.m_parseStack.clear(); - m_parseState.m_substitutions.clear(); - m_parseState.m_templateParams.clear(); - return success; -} - - -NameDemangler::NameDemangler() : d(new NameDemanglerPrivate) { } - -NameDemangler::~NameDemangler() -{ - delete d; -} - -bool NameDemangler::demangle(const QString &mangledName) -{ - return d->demangle(mangledName); -} - -QString NameDemangler::errorString() const -{ - return d->errorString(); -} - -QString NameDemangler::demangledName() const -{ - return d->demangledName(); -} - -} // namespace Internal -} // namespace Debugger diff --git a/src/plugins/debugger/namedemangler/namedemangler.h b/src/plugins/debugger/namedemangler/namedemangler.h deleted file mode 100644 index 9e57e5fba9..0000000000 --- a/src/plugins/debugger/namedemangler/namedemangler.h +++ /dev/null @@ -1,71 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt Creator. -** -** 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 General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** 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-3.0.html. -** -****************************************************************************/ - -#pragma once - -#include <QtGlobal> - -QT_BEGIN_NAMESPACE -class QString; -QT_END_NAMESPACE - -namespace Debugger { -namespace Internal { - -class NameDemanglerPrivate; - -class NameDemangler -{ -public: - NameDemangler(); - ~NameDemangler(); - - /* - * Demangles a mangled name. Also accepts a non-demangled name, - * in which case it is not transformed. - * Returns true <=> the name is not mangled or it is mangled correctly - * according to the specification. - */ - bool demangle(const QString &mangledName); - - /* - * A textual description of the error encountered, if there was one. - * Only valid if demangle() returned false. - */ - QString errorString() const; - - /* - * The demangled name. If the original name was not mangled, this - * is identical to the input. - * Only valid if demangle() returned true. - */ - QString demangledName() const; - -private: - NameDemanglerPrivate *d; -}; - -} // namespace Internal -} // namespace Debugger diff --git a/src/plugins/debugger/namedemangler/namedemangler.pri b/src/plugins/debugger/namedemangler/namedemangler.pri deleted file mode 100644 index 92083e8214..0000000000 --- a/src/plugins/debugger/namedemangler/namedemangler.pri +++ /dev/null @@ -1,10 +0,0 @@ -HEADERS += \ - $$PWD/namedemangler.h \ - $$PWD/parsetreenodes.h \ - $$PWD/demanglerexceptions.h \ - $$PWD/globalparsestate.h - -SOURCES += \ - $$PWD/namedemangler.cpp \ - $$PWD/parsetreenodes.cpp \ - $$PWD/globalparsestate.cpp diff --git a/src/plugins/debugger/namedemangler/parsetreenodes.cpp b/src/plugins/debugger/namedemangler/parsetreenodes.cpp deleted file mode 100644 index a84c136164..0000000000 --- a/src/plugins/debugger/namedemangler/parsetreenodes.cpp +++ /dev/null @@ -1,3138 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt Creator. -** -** 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 General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** 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-3.0.html. -** -****************************************************************************/ - -#include "parsetreenodes.h" - -#include "demanglerexceptions.h" - -#include <iostream> -#include <cctype> -#include <cstring> - -#define PEEK() (parseState()->peek()) -#define ADVANCE() (parseState()->advance()) - -#define PARSE_RULE_AND_ADD_RESULT_AS_CHILD_TO_NODE(NodeType, parseState, parentNode) \ - do { \ - ParseTreeNode::parseRule<NodeType>(parseState); \ - DEMANGLER_ASSERT(parseState->stackElementCount() > 0); \ - DEMANGLER_ASSERT(parseState->stackTop().dynamicCast<NodeType>()); \ - if (parentNode) \ - (parentNode)->addChild(parseState->popFromStack()); \ - } while (0) - -#define PARSE_RULE_AND_ADD_RESULT_AS_CHILD_TO_THIS(NodeType, parseState) \ - do { \ - ParseTreeNode::parseRule<NodeType>(parseState); \ - DEMANGLER_ASSERT(parseState->stackElementCount() > 0); \ - DEMANGLER_ASSERT(parseState->stackTop().dynamicCast<NodeType>()); \ - addChild(parseState->popFromStack()); \ - } while (0) - - -#define PARSE_RULE_AND_ADD_RESULT_AS_CHILD(nodeType) \ - PARSE_RULE_AND_ADD_RESULT_AS_CHILD_TO_THIS(nodeType, parseState()) -#define CHILD_AT(obj, index) obj->childAt(index, Q_FUNC_INFO, __FILE__, __LINE__) -#define MY_CHILD_AT(index) CHILD_AT(this, index) -#define CHILD_TO_BYTEARRAY(index) MY_CHILD_AT(index)->toByteArray() - -namespace Debugger { -namespace Internal { - -template<int base> static int getNonNegativeNumber(GlobalParseState *parseState) -{ - ParseTreeNode::parseRule<NonNegativeNumberNode<base> >(parseState); - const typename NonNegativeNumberNode<base>::Ptr numberNode - = DEMANGLER_CAST(NonNegativeNumberNode<base>, parseState->popFromStack()); - const int value = static_cast<int>(numberNode->number()); - return value; -} - -ParseTreeNode::ParseTreeNode(const ParseTreeNode &other) : m_parseState(other.m_parseState) -{ - for (const ParseTreeNode::Ptr &child : other.m_children) - addChild(child->clone()); -} - -ParseTreeNode::~ParseTreeNode() = default; - -ParseTreeNode::Ptr ParseTreeNode::childAt(int i, const QString &func, const QString &file, - int line) const -{ - if (i < 0 || i >= m_children.count()) - throw InternalDemanglerException(func, file, line); - return m_children.at(i); -} - -QByteArray ParseTreeNode::pasteAllChildren() const -{ - QByteArray repr; - for (const ParseTreeNode::Ptr &node : m_children) - repr += node->toByteArray(); - return repr; -} - -void ParseTreeNode::print(int indentation) const -{ - for (int i = 0; i < indentation; ++i) - std::cerr << ' '; - std::cerr << description().constData() << std::endl; - for (const ParseTreeNode::Ptr &n : m_children) - n->print(indentation + 2); -} - -QByteArray ParseTreeNode::bool2String(bool b) const -{ - return b ? "true" : "false"; -} - -bool ArrayTypeNode::mangledRepresentationStartsWith(char c) -{ - return c == 'A'; -} - -/* - * <array-type> ::= A <number> _ <type> - * ::= A [<expression>] _ <type> - * Note that <expression> can also start with a number, so we have to do a non-constant look-ahead. - */ -void ArrayTypeNode::parse() -{ - if (!ArrayTypeNode::mangledRepresentationStartsWith(ADVANCE())) - throw ParseException(QString::fromLatin1("Invalid array-type")); - - bool isNumber = NonNegativeNumberNode<10>::mangledRepresentationStartsWith(PEEK()); - int i = 1; - while (isNumber) { - const char next = parseState()->peek(i); - if (next == '_') - break; - if (!std::isdigit(parseState()->peek(i))) - isNumber = false; - ++i; - } - if (isNumber) - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(NonNegativeNumberNode<10>); - else if (ExpressionNode::mangledRepresentationStartsWith(PEEK())) - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(ExpressionNode); - - if (ADVANCE() != '_') - throw ParseException(QString::fromLatin1("Invalid array-type")); - - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(TypeNode); -} - -QByteArray ArrayTypeNode::toByteArray() const -{ - // Note: This is not used for things like "reference to array", which need to - // combine the child nodes in a different way at a higher level. - return CHILD_TO_BYTEARRAY(1) + '[' + CHILD_TO_BYTEARRAY(0) + ']'; -} - - -BareFunctionTypeNode::BareFunctionTypeNode(GlobalParseState *parseState) - : ParseTreeNode(parseState) -{ -} - -BareFunctionTypeNode::BareFunctionTypeNode(const BareFunctionTypeNode &other) - : ParseTreeNode(other), m_hasReturnType(other.hasReturnType()) -{ -} - -bool BareFunctionTypeNode::mangledRepresentationStartsWith(char c) -{ - return TypeNode::mangledRepresentationStartsWith(c); -} - -/* <bare-function-type> ::= <type>+ */ -void BareFunctionTypeNode::parse() -{ - /* - * The following is verbatim from the spec: - * Whether the mangling of a function type includes the return type depends on the context - * and the nature of the function. The rules for deciding whether the return type is included - * are: - * (1) Template functions (names or types) have return types encoded, with the exceptions - * listed below. - * (2) Function types not appearing as part of a function name mangling, e.g. parameters, - * pointer types, etc., have return type encoded, with the exceptions listed below. - * (3) Non-template function names do not have return types encoded. - * The exceptions mentioned in (1) and (2) above, for which the return type is never included, - * are constructors, destructors and conversion operator functions, e.g. operator int. - */ - const EncodingNode::Ptr encodingNode = parseState()->stackElementAt(parseState() - ->stackElementCount() - 2).dynamicCast<EncodingNode>(); - if (encodingNode) { // Case 1: Function name. - const NameNode::Ptr nameNode = DEMANGLER_CAST(NameNode, CHILD_AT(encodingNode, 0)); - m_hasReturnType = nameNode->isTemplate() - && !nameNode->isConstructorOrDestructorOrConversionOperator(); - } else { // Case 2: function type. - // TODO: What do the exceptions look like for this case? - m_hasReturnType = true; - } - - do - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(TypeNode); - while (TypeNode::mangledRepresentationStartsWith(PEEK())); -} - -QByteArray BareFunctionTypeNode::description() const -{ - QByteArray desc = "BareFunctionType"; - if (m_hasReturnType) - desc += "[with return type]"; - else - desc += "[without return type]"; - return desc; -} - -QByteArray BareFunctionTypeNode::toByteArray() const -{ - // This is only the parameter list, including parentheses. Where the return type is placed - // must be decided at a higher level. - QByteArray repr = "("; - for (int i = m_hasReturnType ? 1 : 0; i < childCount(); ++i) { - const QByteArray paramRepr = CHILD_TO_BYTEARRAY(i); - if (paramRepr != "void") - repr += paramRepr; - if (i < childCount() - 1) - repr += ", "; - } - return repr += ')'; -} - - -BuiltinTypeNode::BuiltinTypeNode(const BuiltinTypeNode &other) - : ParseTreeNode(other), m_type(other.type()) -{ -} - -bool BuiltinTypeNode::mangledRepresentationStartsWith(char c) -{ - return std::strchr("vwbcahstijlmxynofgedzDu", c); -} - -/* - * <builtin-type> ::= v # void - * ::= w # wchar_t - * ::= b # bool - * ::= c # char - * ::= a # signed char - * ::= h # unsigned char - * ::= s # short - * ::= t # unsigned short - * ::= i # int - * ::= j # unsigned int - * ::= l # long - * ::= m # unsigned long - * ::= x # long long, __int64 - * ::= y # unsigned long long, __int64 - * ::= n # __int128 - * ::= o # unsigned __int128 - * ::= f # float - * ::= d # double - * ::= e # long double, __float80 - * ::= g # __float128 - * ::= z # ellipsis - * ::= Dd # IEEE 754r decimal floating point (64 bits) - * ::= De # IEEE 754r decimal floating point (128 bits) - * ::= Df # IEEE 754r decimal floating point (32 bits) - * ::= Dh # IEEE 754r half-precision floating point (16 bits) - * ::= Di # char32_t - * ::= Ds # char16_t - * ::= Da # auto (in dependent new-expressions) - * ::= Dn # std::nullptr_t (i.e., decltype(nullptr)) - * ::= u <source-name> # vendor extended type - */ -void BuiltinTypeNode::parse() -{ - const char next = ADVANCE(); - if (next == 'u') { - m_type = VendorType; - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(SourceNameNode); - parseState()->addSubstitution(parseState()->stackTop()); - return; - } - - switch (next) { - case 'v': m_type = VoidType; break; - case 'w': m_type = WCharType; break; - case 'b': m_type = BoolType; break; - case 'c': m_type = PlainCharType; break; - case 'a': m_type = SignedCharType; break; - case 'h': m_type = UnsignedCharType; break; - case 's': m_type = SignedShortType; break; - case 't': m_type = UnsignedShortType; break; - case 'i': m_type = SignedIntType; break; - case 'j': m_type = UnsignedIntType; break; - case 'l': m_type = SignedLongType; break; - case 'm': m_type = UnsignedLongType; break; - case 'x': m_type = SignedLongLongType; break; - case 'y': m_type = UnsignedLongLongType; break; - case 'n': m_type = SignedInt128Type; break; - case 'o': m_type = UnsignedInt128Type; break; - case 'f': m_type = FloatType; break; - case 'd': m_type = DoubleType; break; - case 'e': m_type = LongDoubleType; break; - case 'g': m_type = Float128Type; break; - case 'z': m_type = EllipsisType; break; - case 'D': - switch (ADVANCE()) { - case 'd': - m_type = DecimalFloatingType64; - break; - case 'e': - m_type = DecimalFloatingType128; - break; - case 'f': - m_type = DecimalFloatingType32; - break; - case 'h': - m_type = DecimalFloatingType16; break; - case 'i': m_type = Char32Type; break; - case 's': m_type = Char16Type; break; - case 'a': m_type = AutoType; break; - case 'n': m_type = NullPtrType; break; - default: throw ParseException(QString::fromLatin1("Invalid built-in type")); - } - break; - default: - DEMANGLER_ASSERT(false); - } -} - -QByteArray BuiltinTypeNode::description() const -{ - return "BuiltinType[" + toByteArray() + ']'; -} - -QByteArray BuiltinTypeNode::toByteArray() const -{ - switch (m_type) { - case VoidType: return "void"; - case WCharType: return "wchar_t"; - case BoolType: return "bool"; - case PlainCharType: return "char"; - case SignedCharType: return "signed char"; - case UnsignedCharType: return "unsigned char"; - case SignedShortType: return "signed short"; - case UnsignedShortType: return "unsigned short"; - case SignedIntType: return "int"; - case UnsignedIntType: return "unsigned int"; - case SignedLongType: return "long"; - case UnsignedLongType: return "unsigned long"; - case SignedLongLongType: return "long long"; - case UnsignedLongLongType: return "unsigned long long"; - case SignedInt128Type: return "__int128"; - case UnsignedInt128Type: return "unsigned __int128"; - case FloatType: return "float"; - case DoubleType: return "double"; - case LongDoubleType: return "long double"; - case Float128Type: return "__float128"; - case EllipsisType: return "..."; - case DecimalFloatingType16: return "[IEEE 754r half-precision floating point]"; - case DecimalFloatingType32: return "[IEEE 754r decimal floating point (32 bits)]"; - case DecimalFloatingType64: return "[IEEE 754r decimal floating point (64 bits)]"; - case DecimalFloatingType128: return "[IEEE 754r decimal floating point (128 bits)]"; - case Char32Type: return "char32_t"; - case Char16Type: return "char16_t"; - case AutoType: return "auto"; - case NullPtrType: return "std::nullptr_t"; - case VendorType: return CHILD_TO_BYTEARRAY(0); - } - - DEMANGLER_ASSERT(false); - return QByteArray(); -} - - -bool CallOffsetRule::mangledRepresentationStartsWith(char c) -{ - return c == 'h' || c == 'v'; -} - -/* - * <call-offset> ::= h <nv-offset> _ - * ::= v <v-offset> _ - */ -void CallOffsetRule::parse(GlobalParseState *parseState) -{ - const ParseTreeNode::Ptr parentNode = parseState->stackTop(); - switch (parseState->advance()) { - case 'h': PARSE_RULE_AND_ADD_RESULT_AS_CHILD_TO_NODE(NvOffsetNode, parseState, parentNode); break; - case 'v': PARSE_RULE_AND_ADD_RESULT_AS_CHILD_TO_NODE(VOffsetNode, parseState, parentNode); break; - default: DEMANGLER_ASSERT(false); - } - if (parseState->advance() != '_') - throw ParseException(QString::fromLatin1("Invalid call-offset")); -} - -bool ClassEnumTypeRule::mangledRepresentationStartsWith(char c) -{ - /* - * The first set of <class-enum-type> is much smaller than - * the grammar claims. - * firstSetClassEnumType = firstSetName; - */ - return NonNegativeNumberNode<10>::mangledRepresentationStartsWith(c) - || c == 'N' || c == 'D' || c == 'Z'; -} - -/* <class-enum-type> ::= <name> */ -void ClassEnumTypeRule::parse(GlobalParseState *parseState) -{ - PARSE_RULE_AND_ADD_RESULT_AS_CHILD_TO_NODE(NameNode, parseState, parseState->stackTop()); -} - - -bool DiscriminatorRule::mangledRepresentationStartsWith(char c) -{ - return c == '_'; -} - -/* - * - * <discriminator> := _ <non-negative number> # when number < 10 - * := __ <non-negative number> _ # when number >= 10 - */ -void DiscriminatorRule::parse(GlobalParseState *parseState) -{ - if (parseState->advance() != '_') - throw ParseException(QString::fromLatin1("Invalid discriminator")); - bool ge10 = false; - if (parseState->peek() == '_') { - ge10 = true; - parseState->advance(); - } - const ParseTreeNode::Ptr parentNode = parseState->stackTop(); - PARSE_RULE_AND_ADD_RESULT_AS_CHILD_TO_NODE(NonNegativeNumberNode<10>, parseState, parentNode); - const NonNegativeNumberNode<10>::Ptr number - = DEMANGLER_CAST(NonNegativeNumberNode<10>, CHILD_AT(parentNode, parentNode->childCount() - 1)); - if ((ge10 && number->number() < 10) || (!ge10 && number->number() >= 10)) - throw ParseException(QString::fromLatin1("Invalid discriminator")); - if (ge10 && parseState->advance() != '_') - throw ParseException(QString::fromLatin1("Invalid discriminator")); -} - - -CtorDtorNameNode::CtorDtorNameNode(const CtorDtorNameNode &other) = default; - -bool CtorDtorNameNode::mangledRepresentationStartsWith(char c) -{ - return c == 'C' || c == 'D'; -} - -/* - * <ctor-dtor-name> ::= C1 # complete object constructor - * ::= C2 # base object constructor - * ::= C3 # complete object allocating constructor - * ::= D0 # deleting destructor - * ::= D1 # complete object destructor - * ::= D2 # base object destructor - */ -void CtorDtorNameNode::parse() -{ - switch (ADVANCE()) { - case 'C': - switch (ADVANCE()) { - case '1': case '2': case '3': m_isDestructor = false; break; - default: throw ParseException(QString::fromLatin1("Invalid ctor-dtor-name")); - } - break; - case 'D': - switch (ADVANCE()) { - case '0': case '1': case '2': m_isDestructor = true; break; - default: throw ParseException(QString::fromLatin1("Invalid ctor-dtor-name")); - } - break; - default: - throw ParseException(QString::fromLatin1("Invalid ctor-dtor-name")); - } - - m_representation = parseState()->substitutionAt(parseState()->substitutionCount() - 1)->toByteArray(); -} - -QByteArray CtorDtorNameNode::description() const -{ - return "CtorDtor[isDestructor:" + bool2String(m_isDestructor) - + ";repr=" + m_representation + ']'; -} - -QByteArray CtorDtorNameNode::toByteArray() const -{ - QByteArray repr = m_representation; - const int templateArgStart = repr.indexOf('<'); - if (templateArgStart != -1) - repr.truncate(templateArgStart); - const int prefixEnd = repr.lastIndexOf("::"); - if (prefixEnd != -1) - repr.remove(0, prefixEnd + 2); - if (m_isDestructor) - repr.prepend('~'); - return repr; -} - - -CvQualifiersNode::CvQualifiersNode(GlobalParseState *parseState) - : ParseTreeNode(parseState) -{ -} - -CvQualifiersNode::CvQualifiersNode(const CvQualifiersNode &other) = default; - -bool CvQualifiersNode::mangledRepresentationStartsWith(char c) -{ - return c == 'K' || c == 'V' || c == 'r'; -} - -/* <CV-qualifiers> ::= [r] [V] [K] # restrict (C99), volatile, const */ -void CvQualifiersNode::parse() -{ - while (true) { - if (PEEK() == 'V') { - if (hasQualifiers()) - throw ParseException("Invalid qualifiers: unexpected 'volatile'"); - m_hasVolatile = true; - ADVANCE(); - } else if (PEEK() == 'K') { - if (m_hasConst) - throw ParseException("Invalid qualifiers: 'const' appears twice"); - m_hasConst = true; - ADVANCE(); - } else { - break; - } - } -} - -QByteArray CvQualifiersNode::toByteArray() const -{ - QByteArray repr; - if (m_hasConst) - repr = "const"; - if (m_hasVolatile) { - if (m_hasConst) - repr +=' '; - repr += "volatile"; - } - return repr; -} - - -bool EncodingNode::mangledRepresentationStartsWith(char c) -{ - return NameNode::mangledRepresentationStartsWith(c) - || SpecialNameNode::mangledRepresentationStartsWith(c); -} - -/* - * <encoding> ::= <name> <bare-function-type> - * ::= <name> - * ::= <special-name> - */ -void EncodingNode::parse() -{ - const char next = PEEK(); - if (NameNode::mangledRepresentationStartsWith(next)) { - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(NameNode); - if (BareFunctionTypeNode::mangledRepresentationStartsWith(PEEK())) - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(BareFunctionTypeNode); - parseState()->addSubstitution(parseState()->stackTop()); - } else if (SpecialNameNode::mangledRepresentationStartsWith(next)) { - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(SpecialNameNode); - } else { - throw ParseException(QString::fromLatin1("Invalid encoding")); - } -} - -QByteArray EncodingNode::toByteArray() const -{ - if (childCount() == 1) - return CHILD_TO_BYTEARRAY(0); - - const ParseTreeNode::Ptr firstChild = MY_CHILD_AT(0); - const NameNode::Ptr nameNode = firstChild.dynamicCast<NameNode>(); - const CvQualifiersNode::Ptr cvQualifiersNode - = nameNode ? nameNode->cvQualifiers() : CvQualifiersNode::Ptr(); - - QByteArray repr; - const BareFunctionTypeNode::Ptr funcNode = DEMANGLER_CAST(BareFunctionTypeNode, MY_CHILD_AT(1)); - if (funcNode->hasReturnType()) - repr = CHILD_AT(funcNode, 0)->toByteArray() + ' '; - if (cvQualifiersNode && cvQualifiersNode->hasQualifiers()) { - return repr + firstChild->toByteArray() + funcNode->toByteArray() + ' ' - + cvQualifiersNode->toByteArray(); - } - return repr + firstChild->toByteArray() + funcNode->toByteArray(); -} - - -ExpressionNode::ExpressionNode(GlobalParseState *parseState) - : ParseTreeNode(parseState), m_type(OtherType) -{ -} - -ExpressionNode::ExpressionNode(const ExpressionNode &other) = default; - -bool ExpressionNode::mangledRepresentationStartsWith(char c) -{ - return OperatorNameNode::mangledRepresentationStartsWith(c) - || TemplateParamNode::mangledRepresentationStartsWith(c) - || FunctionParamNode::mangledRepresentationStartsWith(c) - || ExprPrimaryNode::mangledRepresentationStartsWith(c) - || UnresolvedNameNode::mangledRepresentationStartsWith(c) - || c == 'c' || c == 's' || c == 'a' || c == 'd' || c == 't'; -} - -/* - * <expression> ::= <operator-name> <expression> - * ::= <operator-name> <expression> <expression> - * ::= <operator-name> <expression> <expression> <expression> - * ::= cl <expression>+ E # call - * ::= cv <type> expression # conversion with one argument - * ::= cv <type> _ <expression>* E # conversion with a different number of arguments - * ::= [gs] nw <expression>* _ <type> E # new (expr-list) type - * ::= [gs] nw <expression>* _ <type> <initializer> # new (expr-list) type (init) - * ::= [gs] na <expression>* _ <type> E # new[] (expr-list) type - * ::= [gs] na <expression>* _ <type> <initializer> # new[] (expr-list) type (init) - * ::= [gs] dl <expression> # delete expression - * ::= [gs] da <expression> # delete[] expression - * ::= pp_ <expression> # prefix ++ - * ::= mm_ <expression> # prefix -- - * ::= ti <type> # typeid (type) - * ::= te <expression> # typeid (expression) - * ::= dc <type> <expression> # dynamic_cast<type> (expression) - * ::= sc <type> <expression> # static_cast<type> (expression) - * ::= cc <type> <expression> # const_cast<type> (expression) - * ::= rc <type> <expression> # reinterpret_cast<type> (expression) - * ::= st <type> # sizeof (a type) - * ::= at <type> # alignof (a type) - * ::= <template-param> - * ::= <function-param> - * ::= dt <expression> <unresolved-name> # expr.name - * ::= pt <expression> <unresolved-name> # expr->name - * ::= ds <expression> <expression> # expr.*expr - * ::= sZ <template-param> # size of a parameter pack - * ::= sp <expression> # pack expansion - * ::= sZ <function-param> # size of a function parameter pack - * ::= tw <expression> # throw expression - * ::= tr # throw with no operand (rethrow) - * ::= <unresolved-name> # f(p), N::f(p), ::f(p), - * # freestanding dependent name (e.g., T::x), - * ::= <expr-primary> - */ -void ExpressionNode::parse() -{ - /* - * Some of the terminals in the productions of <expression> - * also appear in the productions of <operator-name>. The direct - * productions have higher precedence and are checked first to prevent - * erroneous parsing by the operator rule. - */ - QByteArray str = parseState()->readAhead(2); - if (str == "cl") { - parseState()->advance(2); - do - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(ExpressionNode); - while (ExpressionNode::mangledRepresentationStartsWith(PEEK())); - if (ADVANCE() != 'E') - throw ParseException(QString::fromLatin1("Invalid expression")); - } else if (str == "cv") { - m_type = ConversionType; - parseState()->advance(2); - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(TypeNode); - if (PEEK() == '_') { - ADVANCE(); - while (ExpressionNode::mangledRepresentationStartsWith(PEEK())) - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(ExpressionNode); - if (ADVANCE() != 'E') - throw ParseException(QString::fromLatin1("Invalid expression")); - } else { - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(ExpressionNode); - } - } else if (str == "nw" || str == "na" - || parseState()->readAhead(4) == "gsnw" || parseState()->readAhead(4) == "gsna") { - if (str == "gs") { - m_globalNamespace = true; - parseState()->advance(2); - } - m_type = parseState()->readAhead(2) == "nw" ? NewType : ArrayNewType; - parseState()->advance(2); - while (ExpressionNode::mangledRepresentationStartsWith(PEEK())) - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(ExpressionNode); - if (ADVANCE() != '_') - throw ParseException("Invalid expression"); - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(TypeNode); - if (PEEK() == 'E') - ADVANCE(); - else - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(InitializerNode); - } else if (str == "dl" || str == "da" || parseState()->readAhead(4) == "gsdl" - || parseState()->readAhead(4) == "gsda") { - if (str == "gs") { - m_globalNamespace = true; - parseState()->advance(2); - } - m_type = parseState()->readAhead(2) == "dl" ? DeleteType : ArrayDeleteType; - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(ExpressionNode); - } else if (parseState()->readAhead(3) == "pp_") { - m_type = PrefixIncrementType; - parseState()->advance(3); - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(ExpressionNode); - } else if (parseState()->readAhead(3) == "mm_") { - m_type = PrefixDecrementType; - parseState()->advance(3); - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(ExpressionNode); - } else if (str == "ti") { - m_type = TypeIdTypeType; - parseState()->advance(2); - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(TypeNode); - } else if (str == "te") { - m_type = TypeIdExpressionType; - parseState()->advance(2); - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(ExpressionNode); - } else if (str == "dc" || str == "sc" || str == "cc" || str == "rc") { - m_type = str == "dc" ? DynamicCastType : str == "sc" ? StaticCastType : str == "cc" - ? ConstCastType : ReinterpretCastType; - parseState()->advance(2); - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(TypeNode); - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(ExpressionNode); - } else if (str == "st") { - m_type = SizeofType; - parseState()->advance(2); - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(TypeNode); - } else if (str == "at") { - m_type = AlignofType; - parseState()->advance(2); - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(TypeNode); - } else if (str == "sZ") { - m_type = ParameterPackSizeType; - parseState()->advance(2); - if (TemplateParamNode::mangledRepresentationStartsWith(PEEK())) - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(TemplateParamNode); - else - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(FunctionParamNode); - } else if (str == "dt") { - m_type = MemberAccessType; - parseState()->advance(2); - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(ExpressionNode); - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(UnresolvedNameNode); - } else if (str == "pt") { - m_type = PointerMemberAccessType; - parseState()->advance(2); - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(ExpressionNode); - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(UnresolvedNameNode); - } else if (str == "ds") { - m_type = MemberDerefType; - parseState()->advance(2); - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(ExpressionNode); - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(ExpressionNode); - } else if (str == "ps") { - m_type = PackExpansionType; - parseState()->advance(2); - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(ExpressionNode); - } else if (str == "tw") { - m_type = ThrowType; - parseState()->advance(2); - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(ExpressionNode); - } else if (str == "tr") { - m_type = RethrowType; - } else { - const char next = PEEK(); - if (OperatorNameNode::mangledRepresentationStartsWith(next) && str != "dn" && str != "on" - && str != "gs" && str != "sr") { - m_type = OperatorType; - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(OperatorNameNode); - const OperatorNameNode::Ptr opNode - = DEMANGLER_CAST(OperatorNameNode, MY_CHILD_AT(childCount() - 1)); - - int expressionCount; - switch (opNode->type()) { - case OperatorNameNode::TernaryType: - expressionCount = 3; - break; - case OperatorNameNode::ArrayNewType: case OperatorNameNode::BinaryPlusType: - case OperatorNameNode::BinaryMinusType: case OperatorNameNode::MultType: - case OperatorNameNode::DivType: case OperatorNameNode::ModuloType: - case OperatorNameNode::BitwiseAndType: case OperatorNameNode::BitwiseOrType: - case OperatorNameNode::XorType: case OperatorNameNode::AssignType: - case OperatorNameNode::IncrementAndAssignType: - case OperatorNameNode::DecrementAndAssignType: - case OperatorNameNode::MultAndAssignType: case OperatorNameNode::DivAndAssignType: - case OperatorNameNode::ModuloAndAssignType: - case OperatorNameNode::BitwiseAndAndAssignType: - case OperatorNameNode::BitwiseOrAndAssignType: - case OperatorNameNode::XorAndAssignType: case OperatorNameNode::LeftShiftType: - case OperatorNameNode::RightShiftType: case OperatorNameNode::LeftShiftAndAssignType: - case OperatorNameNode::RightShiftAndAssignType: case OperatorNameNode::EqualsType: - case OperatorNameNode::NotEqualsType: case OperatorNameNode::LessType: - case OperatorNameNode::GreaterType: case OperatorNameNode::LessEqualType: - case OperatorNameNode::GreaterEqualType: case OperatorNameNode::LogicalAndType: - case OperatorNameNode::LogicalOrType: case OperatorNameNode::CommaType: - case OperatorNameNode::ArrowStarType: case OperatorNameNode::ArrowType: - case OperatorNameNode::IndexType: - expressionCount = 2; - break; - default: - expressionCount = 1; - } - - for (int i = 0; i < expressionCount; ++i) - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(ExpressionNode); - } else if (TemplateParamNode::mangledRepresentationStartsWith(next)) { - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(TemplateParamNode); - } else if (FunctionParamNode::mangledRepresentationStartsWith(next)) { - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(FunctionParamNode); - } else if (ExprPrimaryNode::mangledRepresentationStartsWith(next)) { - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(ExprPrimaryNode); - } else if (UnresolvedNameNode::mangledRepresentationStartsWith(next)) { - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(UnresolvedNameNode); - } else { - throw ParseException(QString::fromLatin1("Invalid expression")); - } - } -} - -QByteArray ExpressionNode::description() const -{ - return "Expression[global:" + bool2String(m_globalNamespace) - + ";type:" + QByteArray::number(m_type) + ']'; -} - -QByteArray ExpressionNode::toByteArray() const -{ - QByteArray repr; - - switch (m_type) { - case ConversionType: - repr = CHILD_TO_BYTEARRAY(0) + '('; - for (int i = 1; i < childCount(); ++i) - repr += CHILD_TO_BYTEARRAY(i); - repr += ')'; - break; - case NewType: case ArrayNewType: { - if (m_globalNamespace) - repr += "::"; - repr += "new"; - if (m_type == ArrayNewType) - repr += "[]"; - repr += ' '; - - // TODO: I don't understand what the first expression list means. Putting it into - // parentheses for now. - QByteArray exprList; - int i = 0; - for (; i < childCount(); ++i) { - if (!MY_CHILD_AT(i).dynamicCast<ExpressionNode>()) - break; - if (i > 0) - repr += ", "; - repr += CHILD_TO_BYTEARRAY(i); - } - if (i > 0) - repr.append('(').append(exprList).append(')'); - - repr += CHILD_TO_BYTEARRAY(i++); // <type> - if (i < childCount()) - repr += CHILD_TO_BYTEARRAY(i); // <initializer> - break; - } - case DeleteType: case ArrayDeleteType: - if (m_globalNamespace) - repr += "::"; - repr += "delete"; - if (m_type == ArrayDeleteType) - repr += "[]"; - repr.append(' ').append(CHILD_TO_BYTEARRAY(0)); - break; - case PrefixIncrementType: - repr.append("++").append(CHILD_TO_BYTEARRAY(0)); - break; - case PrefixDecrementType: - repr.append("--").append(CHILD_TO_BYTEARRAY(0)); - break; - case TypeIdTypeType: case TypeIdExpressionType: - repr.append("typeid(").append(CHILD_TO_BYTEARRAY(0)).append(')'); - break; - case DynamicCastType: case StaticCastType: case ConstCastType: case ReinterpretCastType: - if (m_type == DynamicCastType) - repr += "dynamic"; - else if (m_type == StaticCastType) - repr += "static"; - else if (m_type == ConstCastType) - repr += "const"; - else - repr += "reinterpret"; - repr.append("_cast<").append(CHILD_TO_BYTEARRAY(0)).append(">(") - .append(CHILD_TO_BYTEARRAY(1)).append(')'); - break; - case SizeofType: - repr = "sizeof(" + CHILD_TO_BYTEARRAY(0) + ')'; - break; - case AlignofType: - repr = "alignof(" + CHILD_TO_BYTEARRAY(0) + ')'; - break; - case MemberAccessType: - repr.append(CHILD_TO_BYTEARRAY(0)).append('.').append(CHILD_TO_BYTEARRAY(1)); - break; - case PointerMemberAccessType: - repr.append(CHILD_TO_BYTEARRAY(0)).append("->").append(CHILD_TO_BYTEARRAY(1)); - break; - case MemberDerefType: - repr.append(CHILD_TO_BYTEARRAY(0)).append(".*").append(CHILD_TO_BYTEARRAY(1)); - break; - case ParameterPackSizeType: - repr = "sizeof...(" + CHILD_TO_BYTEARRAY(0) + ')'; - break; - case PackExpansionType: - repr = CHILD_TO_BYTEARRAY(0) + "..."; - break; - case ThrowType: - repr.append("throw ").append(CHILD_TO_BYTEARRAY(0)); - break; - case RethrowType: - repr.append("throw"); - break; - case OperatorType: { - const OperatorNameNode::Ptr opNode = DEMANGLER_CAST(OperatorNameNode, MY_CHILD_AT(0)); - switch (opNode->type()) { - case OperatorNameNode::CallType: - repr = CHILD_TO_BYTEARRAY(1) + opNode->toByteArray(); - break; - case OperatorNameNode::SizeofExprType: case OperatorNameNode::AlignofExprType: - repr = opNode->toByteArray() + '(' + CHILD_TO_BYTEARRAY(1) + ')'; - break; - case OperatorNameNode::ArrayNewType: - repr = "new " + CHILD_TO_BYTEARRAY(1) + '[' + CHILD_TO_BYTEARRAY(2) + ']'; - break; - case OperatorNameNode::IndexType: - repr = CHILD_TO_BYTEARRAY(1) + '[' + CHILD_TO_BYTEARRAY(2) + ']'; - break; - case OperatorNameNode::TernaryType: - repr = CHILD_TO_BYTEARRAY(1) + " ? " + CHILD_TO_BYTEARRAY(2) + " : " + CHILD_TO_BYTEARRAY(3); - break; - case OperatorNameNode::ArrowStarType: case OperatorNameNode::ArrowType: - repr = CHILD_TO_BYTEARRAY(1) + opNode->toByteArray() + CHILD_TO_BYTEARRAY(2); - break; - case OperatorNameNode::BinaryPlusType: - case OperatorNameNode::BinaryMinusType: - case OperatorNameNode::MultType: - case OperatorNameNode::DivType: - case OperatorNameNode::ModuloType: - case OperatorNameNode::BitwiseAndType: - case OperatorNameNode::BitwiseOrType: - case OperatorNameNode::XorType: - case OperatorNameNode::AssignType: - case OperatorNameNode::IncrementAndAssignType: - case OperatorNameNode::DecrementAndAssignType: - case OperatorNameNode::MultAndAssignType: - case OperatorNameNode::DivAndAssignType: - case OperatorNameNode::ModuloAndAssignType: - case OperatorNameNode::BitwiseAndAndAssignType: - case OperatorNameNode::BitwiseOrAndAssignType: - case OperatorNameNode::XorAndAssignType: - case OperatorNameNode::LeftShiftType: - case OperatorNameNode::RightShiftType: - case OperatorNameNode::LeftShiftAndAssignType: - case OperatorNameNode::RightShiftAndAssignType: - case OperatorNameNode::EqualsType: - case OperatorNameNode::NotEqualsType: - case OperatorNameNode::LessType: - case OperatorNameNode::GreaterType: - case OperatorNameNode::LessEqualType: - case OperatorNameNode::GreaterEqualType: - case OperatorNameNode::LogicalAndType: - case OperatorNameNode::LogicalOrType: - case OperatorNameNode::CommaType: - repr = CHILD_TO_BYTEARRAY(1) + ' ' + opNode->toByteArray() + ' ' + CHILD_TO_BYTEARRAY(2); - break; - case OperatorNameNode::NewType: - case OperatorNameNode::DeleteType: - case OperatorNameNode::ArrayDeleteType: - repr = opNode->toByteArray() + ' ' + CHILD_TO_BYTEARRAY(1); - break; - default: // Other unary Operators; - repr = opNode->toByteArray() + CHILD_TO_BYTEARRAY(1); - } - break; - } - case OtherType: - repr = pasteAllChildren(); - } - - return repr; -} - - -OperatorNameNode::OperatorNameNode(const OperatorNameNode &other) = default; - -bool OperatorNameNode::mangledRepresentationStartsWith(char c) -{ - return strchr("ndpacmroelgiqsv", c); -} - -/* - * <operator-name> ::= nw # new - * ::= na # new[] - * ::= dl # delete - * ::= da # delete[] - * ::= ps # + (unary) - * ::= ng # - (unary) - * ::= ad # & (unary) - * ::= de # * (unary) - * ::= co # ~ - * ::= pl # + - * ::= mi # - - * ::= ml # * - * ::= dv # / - * ::= rm # % - * ::= an # & - * ::= or # | - * ::= eo # ^ - * ::= aS # = - * ::= pL # += - * ::= mI # -= - * ::= mL # *= - * ::= dV # /= - * ::= rM # %= - * ::= aN # &= - * ::= oR # |= - * ::= eO # ^= - * ::= ls # << - * ::= rs # >> - * ::= lS # <<= - * ::= rS # >>= - * ::= eq # == - * ::= ne # != - * ::= lt # < - * ::= gt # > - * ::= le # <= - * ::= ge # >= - * ::= nt # ! - * ::= aa # && - * ::= oo # || - * ::= pp # ++ - * ::= mm # -- - * ::= cm # , - * ::= pm # ->* - * ::= pt # -> - * ::= cl # () - * ::= ix # [] - * ::= qu # ? - * ::= st # sizeof (a type) - * ::= sz # sizeof (an expression) - * ::= at # alignof (a type) - * ::= az # alignof (an expression) - * ::= cv <type> # (cast) - * ::= v <digit> <source-name> # vendor extended operator - */ -void OperatorNameNode::parse() -{ - if (PEEK() == 'v') { - m_type = VendorType; - ADVANCE(); - const int digit = ADVANCE(); - if (!std::isdigit(digit)) - throw ParseException(QString::fromLatin1("Invalid digit")); - // Throw away digit for now; we don't know what to do with it anyway. - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(SourceNameNode); - } else { - const QByteArray id = parseState()->readAhead(2); - parseState()->advance(2); - if (id == "cv") { - m_type = CastType; - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(TypeNode); - } else if (id == "nw") { - m_type = NewType; - } else if (id == "na") { - m_type = ArrayNewType; - } else if (id == "dl") { - m_type = DeleteType; - } else if (id == "da") { - m_type = ArrayDeleteType; - } else if (id == "ps") { - m_type = UnaryPlusType; - } else if (id == "ng") { - m_type = UnaryMinusType; - } else if (id == "ad") { - m_type = UnaryAmpersandType; - } else if (id == "de") { - m_type = UnaryStarType; - } else if (id == "co") { - m_type = BitwiseNotType; - } else if (id == "pl") { - m_type = BinaryPlusType; - } else if (id == "mi") { - m_type = BinaryMinusType; - } else if (id == "ml") { - m_type = MultType; - } else if (id == "dv") { - m_type = DivType; - } else if (id == "rm") { - m_type = ModuloType; - } else if (id == "an") { - m_type = BitwiseAndType; - } else if (id == "or") { - m_type = BitwiseOrType; - } else if (id == "eo") { - m_type = XorType; - } else if (id == "aS") { - m_type = AssignType; - } else if (id == "pL") { - m_type = IncrementAndAssignType; - } else if (id == "mI") { - m_type = DecrementAndAssignType; - } else if (id == "mL") { - m_type = MultAndAssignType; - } else if (id == "dV") { - m_type = DivAndAssignType; - } else if (id == "rM") { - m_type = ModuloAndAssignType; - } else if (id == "aN") { - m_type = BitwiseAndAndAssignType; - } else if (id == "oR") { - m_type = BitwiseOrAndAssignType; - } else if (id == "eO") { - m_type = XorAndAssignType; - } else if (id == "ls") { - m_type = LeftShiftType; - } else if (id == "rs") { - m_type = RightShiftType; - } else if (id == "lS") { - m_type = LeftShiftAndAssignType; - } else if (id == "rS") { - m_type = RightShiftAndAssignType; - } else if (id == "eq") { - m_type = EqualsType; - } else if (id == "ne") { - m_type = NotEqualsType; - } else if (id == "lt") { - m_type = LessType; - } else if (id == "gt") { - m_type = GreaterType; - } else if (id == "le") { - m_type = LessEqualType; - } else if (id == "ge") { - m_type = GreaterEqualType; - } else if (id == "nt") { - m_type = LogicalNotType; - } else if (id == "aa") { - m_type = LogicalAndType; - } else if (id == "oo") { - m_type = LogicalOrType; - } else if (id == "pp") { - m_type = IncrementType; - } else if (id == "mm") { - m_type = DecrementType; - } else if (id == "cm") { - m_type = CommaType; - } else if (id == "pm") { - m_type = ArrowStarType; - } else if (id == "pt") { - m_type = ArrowType; - } else if (id == "cl") { - m_type = CallType; - } else if (id == "ix") { - m_type = IndexType; - } else if (id == "qu") { - m_type = TernaryType; - } else if (id == "st") { - m_type = SizeofTypeType; - } else if (id == "sz") { - m_type = SizeofExprType; - } else if (id == "at") { - m_type = AlignofTypeType; - } else if (id == "az") { - m_type = AlignofExprType; - } else { - throw ParseException(QString::fromLatin1("Invalid operator encoding \"%1\"") - .arg(QString::fromLocal8Bit(id))); - } - } -} - -QByteArray OperatorNameNode::description() const -{ - return "OperatorName[type:" + toByteArray() + ']'; -} - -QByteArray OperatorNameNode::toByteArray() const -{ - switch (m_type) { - case NewType: return "new"; - case ArrayNewType: return "new[]"; - case DeleteType: return "delete"; - case ArrayDeleteType: return "delete[]"; - case UnaryPlusType: case BinaryPlusType: return "+"; - case UnaryMinusType: case BinaryMinusType: return "-"; - case UnaryAmpersandType: case BitwiseAndType: return "&"; - case UnaryStarType: case MultType: return "*"; - case BitwiseNotType: return "~"; - case DivType: return "/"; - case ModuloType: return "%"; - case BitwiseOrType: return "|"; - case XorType: return "^"; - case AssignType: return "="; - case IncrementAndAssignType: return "+="; - case DecrementAndAssignType: return "-="; - case MultAndAssignType: return "*="; - case DivAndAssignType: return "/="; - case ModuloAndAssignType: return "%="; - case BitwiseAndAndAssignType: return "&="; - case BitwiseOrAndAssignType: return "|="; - case XorAndAssignType: return "^="; - case LeftShiftType: return "<<"; - case RightShiftType: return ">>"; - case LeftShiftAndAssignType: return "<<="; - case RightShiftAndAssignType: return ">>="; - case EqualsType: return "=="; - case NotEqualsType: return "!="; - case LessType: return "<"; - case GreaterType: return ">"; - case LessEqualType: return "<="; - case GreaterEqualType: return ">="; - case LogicalNotType: return "!"; - case LogicalAndType: return "&&"; - case LogicalOrType: return "||"; - case IncrementType: return "++"; - case DecrementType: return "--"; - case CommaType: return ","; - case ArrowStarType: return "->*"; - case ArrowType: return "->"; - case CallType: return "()"; - case IndexType: return "[]"; - case TernaryType: return "?"; - case SizeofTypeType: case SizeofExprType: return "sizeof"; - case AlignofTypeType: case AlignofExprType: return "alignof"; - case CastType: return ' ' + CHILD_TO_BYTEARRAY(0); - case VendorType: return "[vendor extended operator]"; - } - - DEMANGLER_ASSERT(false); - return QByteArray(); -} - - -ExprPrimaryNode::ExprPrimaryNode(GlobalParseState *parseState) - : ParseTreeNode(parseState) -{ -} - -ExprPrimaryNode::ExprPrimaryNode(const ExprPrimaryNode &other) = default; - -bool ExprPrimaryNode::mangledRepresentationStartsWith(char c) -{ - return c == 'L'; -} - -/* - * <expr-primary> ::= L <type> <number> E # integer literal - * ::= L <type> <float> E # floating literal - * ::= L <string type> # string literal - * ::= L <nullptr type> E # nullptr literal (i.e., "LDnE") - * ::= L <type> <real-part float> _ <imag-part float> E # complex floating point literal (C 2000) - * ::= L <mangled-name> E # external name - * Note that we ignore C 2000 features. - */ -void ExprPrimaryNode::parse() -{ - if (!ExprPrimaryNode::mangledRepresentationStartsWith(ADVANCE())) - throw ParseException(QString::fromLatin1("Invalid primary expression")); - bool needsSuffix = true; - const char next = PEEK(); - if (TypeNode::mangledRepresentationStartsWith(next)) { - const ParseTreeNode::Ptr topLevelTypeNode = parseRule<TypeNode>(parseState()); - const BuiltinTypeNode::Ptr typeNode = topLevelTypeNode->childCount() == 0 - ? BuiltinTypeNode::Ptr() - : CHILD_AT(topLevelTypeNode, 0).dynamicCast<BuiltinTypeNode>(); - if (!typeNode) - throw ParseException("Invalid type in expr-primary"); - - switch (typeNode->type()) { - case BuiltinTypeNode::UnsignedShortType: - case BuiltinTypeNode::UnsignedIntType: - m_suffix = "U"; - Q_FALLTHROUGH(); - case BuiltinTypeNode::SignedShortType: - case BuiltinTypeNode::SignedIntType: - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(NumberNode); - break; - case BuiltinTypeNode::UnsignedLongType: - m_suffix = "U"; - Q_FALLTHROUGH(); - case BuiltinTypeNode::SignedLongType: - m_suffix = "L"; - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(NumberNode); - break; - case BuiltinTypeNode::UnsignedLongLongType: - m_suffix = "U"; - Q_FALLTHROUGH(); - case BuiltinTypeNode::SignedLongLongType: - m_suffix = "LL"; - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(NumberNode); - break; - case BuiltinTypeNode::FloatType: - m_suffix = "f"; - Q_FALLTHROUGH(); - case BuiltinTypeNode::DoubleType: - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(FloatValueNode); - break; - case BuiltinTypeNode::NullPtrType: - m_isNullPtr = true; - break; - case BuiltinTypeNode::PlainCharType: case BuiltinTypeNode::WCharType: - case BuiltinTypeNode::Char16Type: case BuiltinTypeNode::Char32Type: - needsSuffix = false; - break; // string type - default: - throw ParseException(QString::fromLatin1("Invalid type in expr-primary")); - } - parseState()->popFromStack(); // No need to keep the type node in the tree. - } else if (MangledNameRule::mangledRepresentationStartsWith(next)) { - MangledNameRule::parse(parseState(), parseState()->stackTop()); - } else { - throw ParseException(QString::fromLatin1("Invalid expr-primary")); - } - if (needsSuffix && ADVANCE() != 'E') - throw ParseException(QString::fromLatin1("Invalid expr-primary")); -} - -QByteArray ExprPrimaryNode::description() const -{ - return "ExprPrimary[m_suffix:" + m_suffix + ";m_isNullPtr:" + bool2String(m_isNullPtr) + ']'; -} - -QByteArray ExprPrimaryNode::toByteArray() const -{ - if (m_isNullPtr) - return "nullptr"; - return CHILD_TO_BYTEARRAY(0) + m_suffix; -} - - -FunctionTypeNode::FunctionTypeNode(GlobalParseState *parseState) - : ParseTreeNode(parseState) -{ -} - -FunctionTypeNode::FunctionTypeNode(const FunctionTypeNode &other) - : ParseTreeNode(other), m_isExternC(other.isExternC()) -{ -} - -bool FunctionTypeNode::mangledRepresentationStartsWith(char c) -{ - return c == 'F'; -} - -/* <function-type> ::= F [Y] <bare-function-type> E */ -void FunctionTypeNode::parse() -{ - if (!mangledRepresentationStartsWith(ADVANCE())) - throw ParseException(QString::fromLatin1("Invalid function type")); - - if (PEEK() == 'Y') { - ADVANCE(); - m_isExternC = true; - } - - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(BareFunctionTypeNode); - if (ADVANCE() != 'E') - throw ParseException(QString::fromLatin1("Invalid function type")); -} - -QByteArray FunctionTypeNode::description() const -{ - return "FunctionType[isExternC:" + bool2String(m_isExternC) + ']'; -} - -QByteArray FunctionTypeNode::toByteArray() const -{ - return QByteArray(); // Not enough knowledge here to generate a string representation. -} - - -LocalNameNode::LocalNameNode(GlobalParseState *parseState) - : ParseTreeNode(parseState) -{ -} - -LocalNameNode::LocalNameNode(const LocalNameNode &other) = default; - -bool LocalNameNode::mangledRepresentationStartsWith(char c) -{ - return c == 'Z'; -} - -/* - * <local-name> := Z <encoding> E <name> [<discriminator>] - * := Z <encoding> E s [<discriminator>] - * := Z <encoding> Ed [ <non-negative number> ] _ <name> - * - * Note that <name> can start with 's', so we need to do read-ahead. - * Also, <name> can start with 'd' (via <operator-name>). - * The last rule is for member functions with default closure type arguments. - */ -void LocalNameNode::parse() -{ - if (!mangledRepresentationStartsWith(ADVANCE())) - throw ParseException(QString::fromLatin1("Invalid local-name")); - - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(EncodingNode); - - if (ADVANCE() != 'E') - throw ParseException(QString::fromLatin1("Invalid local-name")); - - QByteArray str = parseState()->readAhead(2); - const char next = PEEK(); - if (next == 'd' && str != "dl" && str != "da" && str != "de" && str != "dv" && str != "dV") { - m_isDefaultArg = true; - ADVANCE(); - if (NonNegativeNumberNode<10>::mangledRepresentationStartsWith(PEEK())) - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(NonNegativeNumberNode<10>); - if (ADVANCE() != '_') - throw ParseException(QString::fromLatin1("Invalid local-name")); - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(NameNode); - } else if (str == "sp" || str == "sr" || str == "st" || str == "sz" || str == "sZ" - || (next != 's' && NameNode::mangledRepresentationStartsWith(next))) { - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(NameNode); - } else if (next == 's') { - m_isStringLiteral = true; - ADVANCE(); - } else { - throw ParseException(QString::fromLatin1("Invalid local-name")); - } - if (DiscriminatorRule::mangledRepresentationStartsWith(PEEK())) - DiscriminatorRule::parse(parseState()); -} - -QByteArray LocalNameNode::description() const -{ - return "LocalName[isStringLiteral:" + bool2String(m_isStringLiteral) + ";isDefaultArg:" - + bool2String(m_isDefaultArg) + ']'; -} - -QByteArray LocalNameNode::toByteArray() const -{ - QByteArray name; - bool hasDiscriminator; - if (m_isDefaultArg) { - const ParseTreeNode::Ptr encodingNode = MY_CHILD_AT(0); - const BareFunctionTypeNode::Ptr funcNode - = DEMANGLER_CAST(BareFunctionTypeNode, CHILD_AT(encodingNode, 1)); - const int functionParamCount - = funcNode->hasReturnType() ? funcNode->childCount() - 1 : funcNode->childCount(); - const NonNegativeNumberNode<10>::Ptr numberNode - = MY_CHILD_AT(1).dynamicCast<NonNegativeNumberNode<10> >(); - - // "_" means last argument, "n" means (n+1)th to last. - // Note that c++filt in binutils 2.22 does this wrong. - const int argNumber = functionParamCount - (numberNode ? numberNode->number() + 1 : 0); - - name = encodingNode->toByteArray(); - name.append("::{default arg#").append(QByteArray::number(argNumber)).append("}::") - .append(MY_CHILD_AT(childCount() - 1)->toByteArray()); - hasDiscriminator = false; - } else if (m_isStringLiteral) { - name = CHILD_TO_BYTEARRAY(0) + "::{string literal}"; - hasDiscriminator = childCount() == 2; - } else { - name = CHILD_TO_BYTEARRAY(0) + "::" + CHILD_TO_BYTEARRAY(1); - hasDiscriminator = childCount() == 3; - } - if (hasDiscriminator) { - // TODO: Does this information serve any purpose? Names seem to demangle fine without printing anything here. -// const QByteArray discriminator = MY_CHILD_AT(childCount() - 1)->toByteArray(); -// const int rawDiscriminatorValue = discriminator.toInt(); -// name += " (occurrence number " + QByteArray::number(rawDiscriminatorValue - 2) + ')'; - } - return name; -} - -bool LocalNameNode::isTemplate() const -{ - if (childCount() == 1 || MY_CHILD_AT(1).dynamicCast<NonNegativeNumberNode<10> >()) - return false; - return DEMANGLER_CAST(NameNode, MY_CHILD_AT(1))->isTemplate(); -} - -bool LocalNameNode::isConstructorOrDestructorOrConversionOperator() const -{ - if (childCount() == 1 || MY_CHILD_AT(1).dynamicCast<NonNegativeNumberNode<10> >()) - return false; - return DEMANGLER_CAST(NameNode, MY_CHILD_AT(1))->isConstructorOrDestructorOrConversionOperator(); -} - -CvQualifiersNode::Ptr LocalNameNode::cvQualifiers() const -{ - if (m_isDefaultArg) - return DEMANGLER_CAST(NameNode, MY_CHILD_AT(childCount() - 1))->cvQualifiers(); - if (childCount() == 1 || MY_CHILD_AT(1).dynamicCast<NonNegativeNumberNode<10> >()) - return CvQualifiersNode::Ptr(); - return DEMANGLER_CAST(NameNode, MY_CHILD_AT(1))->cvQualifiers(); -} - - -bool MangledNameRule::mangledRepresentationStartsWith(char c) -{ - return c == '_'; -} - -/* - * Grammar: http://www.codesourcery.com/public/cxx-abi/abi.html#mangling - * The grammar as given there is not LL(k), so a number of transformations - * were necessary, which we will document at the respective parsing function. - * <mangled-name> ::= _Z <encoding> - */ -void MangledNameRule::parse(GlobalParseState *parseState, const ParseTreeNode::Ptr &parentNode) -{ - parseState->advance(2); - PARSE_RULE_AND_ADD_RESULT_AS_CHILD_TO_NODE(EncodingNode, parseState, parentNode); -} - - -SourceNameNode::SourceNameNode(const SourceNameNode &other) = default; - -bool SourceNameNode::mangledRepresentationStartsWith(char c) -{ - return strchr("123456789", c); -} - -/* <source-name> ::= <number> <identifier> */ -void SourceNameNode::parse() -{ - const int idLen = getNonNegativeNumber<10>(parseState()); - m_name = parseState()->readAhead(idLen); - parseState()->advance(idLen); -} - -QByteArray SourceNameNode::description() const -{ - return "SourceName[name:" + m_name + ']'; -} - - -bool UnqualifiedNameNode::mangledRepresentationStartsWith(char c) -{ - return OperatorNameNode::mangledRepresentationStartsWith(c) - || CtorDtorNameNode::mangledRepresentationStartsWith(c) - || SourceNameNode::mangledRepresentationStartsWith(c) - || UnnamedTypeNameNode::mangledRepresentationStartsWith(c); -} - -QByteArray UnqualifiedNameNode::toByteArray() const -{ - QByteArray repr; - if (MY_CHILD_AT(0).dynamicCast<OperatorNameNode>()) - repr = "operator"; - return repr += CHILD_TO_BYTEARRAY(0); -} - -bool UnqualifiedNameNode::isConstructorOrDestructorOrConversionOperator() const -{ - if (MY_CHILD_AT(0).dynamicCast<CtorDtorNameNode>()) - return true; - const OperatorNameNode::Ptr opNode = MY_CHILD_AT(0).dynamicCast<OperatorNameNode>(); - return opNode && opNode->type() == OperatorNameNode::CastType; -} - -/* - * <unqualified-name> ::= <operator-name> - * ::= <ctor-dtor-name> - * ::= <source-name> - * ::= <unnamed-type-name> - */ -void UnqualifiedNameNode::parse() -{ - const char next = PEEK(); - if (OperatorNameNode::mangledRepresentationStartsWith(next)) - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(OperatorNameNode); - else if (CtorDtorNameNode::mangledRepresentationStartsWith(next)) - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(CtorDtorNameNode); - else if (SourceNameNode::mangledRepresentationStartsWith(next)) - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(SourceNameNode); - else if (UnnamedTypeNameNode::mangledRepresentationStartsWith(next)) - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(UnnamedTypeNameNode); - else - throw ParseException(QString::fromLatin1("Invalid unqualified-name")); -} - - -UnscopedNameNode::UnscopedNameNode(GlobalParseState *parseState) - : ParseTreeNode(parseState) -{ -} - -UnscopedNameNode::UnscopedNameNode(const UnscopedNameNode &other) = default; - -bool UnscopedNameNode::mangledRepresentationStartsWith(char c) -{ - return UnqualifiedNameNode::mangledRepresentationStartsWith(c) || c == 'S'; -} - -QByteArray UnscopedNameNode::toByteArray() const -{ - QByteArray name = CHILD_TO_BYTEARRAY(0); - if (m_inStdNamespace) - name.prepend("std::"); - return name; -} - -bool UnscopedNameNode::isConstructorOrDestructorOrConversionOperator() const -{ - const UnqualifiedNameNode::Ptr childNode = DEMANGLER_CAST(UnqualifiedNameNode, MY_CHILD_AT(0)); - return childNode->isConstructorOrDestructorOrConversionOperator(); -} - -/* - * <unscoped-name> ::= <unqualified-name> - * ::= St <unqualified-name> # ::std:: - */ -void UnscopedNameNode::parse() -{ - if (parseState()->readAhead(2) == "St") { - m_inStdNamespace = true; - parseState()->advance(2); - } - - if (!UnqualifiedNameNode::mangledRepresentationStartsWith(PEEK())) - throw ParseException(QString::fromLatin1("Invalid unscoped-name")); - - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(UnqualifiedNameNode); -} - -QByteArray UnscopedNameNode::description() const -{ - return "UnscopedName[isInStdNamespace:" + bool2String(m_inStdNamespace) + ']'; -} - - -bool NestedNameNode::mangledRepresentationStartsWith(char c) -{ - return c == 'N'; -} - -QByteArray NestedNameNode::toByteArray() const -{ - // cv-qualifiers are not encoded here, since they only make sense at a higher level. - if (MY_CHILD_AT(0).dynamicCast<CvQualifiersNode>()) - return CHILD_TO_BYTEARRAY(1); - return CHILD_TO_BYTEARRAY(0); -} - -bool NestedNameNode::isTemplate() const -{ - const PrefixNode::Ptr childNode = DEMANGLER_CAST(PrefixNode, MY_CHILD_AT(childCount() - 1)); - return childNode->isTemplate(); -} - -bool NestedNameNode::isConstructorOrDestructorOrConversionOperator() const -{ - const PrefixNode::Ptr childNode = DEMANGLER_CAST(PrefixNode, MY_CHILD_AT(childCount() - 1)); - return childNode->isConstructorOrDestructorOrConversionOperator(); -} - -CvQualifiersNode::Ptr NestedNameNode::cvQualifiers() const -{ - return MY_CHILD_AT(0).dynamicCast<CvQualifiersNode>(); -} - -/* - * <nested-name> ::= N [<CV-qualifiers>] <prefix> <unqualified-name> E - * ::= N [<CV-qualifiers>] <template-prefix> <template-args> E - * <template-prefix> ::= <prefix> <unqualified-name> - * ::= <template-param> - * ::= <substitution> - * - * The <template-prefix> rule leads to an indirect recursion with <prefix>, so - * we integrate it into <nested-name>: - * <nested-name> ::= N [<CV-qualifiers>] <prefix> <unqualified-name> - * [<template-args>] E - * ::= N [<CV-qualifiers>] <template-param> <template-args> E - * ::= N [<CV-qualifiers>] <substitution> <template-args> E - * - * The occurrence of <prefix> in the first expansion makes this rule - * completely unmanageable, because <prefix>'s first and follow sets are - * not distinct and it also shares elements of its first set with - * <template-param> and <substitution>. However, <prefix> can expand - * to both the non-terminals it is followed by as well as the two competing - * non-terminal sequences in the other rules, so we can just write: - * <nested-name> ::= N [<CV-qualifiers>] <prefix> E - * - * That's not all, though: Both <operator-name> and <cv-qualifiers> can start - * with an 'r', so we have to do a two-character-look-ahead for that case. - */ -void NestedNameNode::parse() -{ - if (!mangledRepresentationStartsWith(ADVANCE())) - throw ParseException(QString::fromLatin1("Invalid nested-name")); - - if (CvQualifiersNode::mangledRepresentationStartsWith(PEEK()) && parseState()->peek(1) != 'm' - && parseState()->peek(1) != 'M' && parseState()->peek(1) != 's' - && parseState()->peek(1) != 'S') { - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(CvQualifiersNode); - } - - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(PrefixNode); - - if (ADVANCE() != 'E') - throw ParseException(QString::fromLatin1("Invalid nested-name")); -} - - -SubstitutionNode::SubstitutionNode(const SubstitutionNode &other) - : ParseTreeNode(other), m_type(other.type()) -{ -} - -bool SubstitutionNode::mangledRepresentationStartsWith(char c) -{ - return c == 'S'; -} - -/* - * <substitution> ::= S <seq-id> _ # 36-bit number - * ::= S_ - * ::= St # ::std:: - * ::= Sa # ::std::allocator - * ::= Sb # ::std::basic_string - * ::= Ss # ::std::basic_string < char, - * ::std::char_traits<char>, - * ::std::allocator<char> > - * ::= Si # ::std::basic_istream<char, std::char_traits<char> > - * ::= So # ::std::basic_ostream<char, std::char_traits<char> > - * ::= Sd # ::std::basic_iostream<char, std::char_traits<char> > - * ::= St <unqualified-name> # ::std:: - */ -void SubstitutionNode::parse() -{ - if (!mangledRepresentationStartsWith(ADVANCE())) - throw ParseException(QString::fromLatin1("Invalid substitution")); - - if (NonNegativeNumberNode<36>::mangledRepresentationStartsWith(PEEK())) { - const int substIndex = getNonNegativeNumber<36>(parseState()) + 1; - if (substIndex >= parseState()->substitutionCount()) { - throw ParseException(QString::fromLatin1("Invalid substitution: substitution %1 " - "was requested, but there are only %2"). - arg(substIndex + 1).arg(parseState()->substitutionCount())); - } - m_type = ActualSubstitutionType; - addChild(parseState()->substitutionAt(substIndex)); - if (ADVANCE() != '_') - throw ParseException(QString::fromLatin1("Invalid substitution")); - } else { - switch (ADVANCE()) { - case '_': - if (parseState()->substitutionCount() == 0) - throw ParseException(QString::fromLatin1("Invalid substitution: " - "There are no substitutions")); - m_type = ActualSubstitutionType; - addChild(parseState()->substitutionAt(0)); - break; - case 't': - m_type = StdType; - if (UnqualifiedNameNode::mangledRepresentationStartsWith(PEEK())) { - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(UnqualifiedNameNode); - parseState()->addSubstitution(parseState()->stackTop()); - } - break; - case 'a': m_type = StdAllocType; break; - case 'b': m_type = StdBasicStringType; break; - case 's': m_type = FullStdBasicStringType; break; - case 'i': m_type = StdBasicIStreamType; break; - case 'o': m_type = StdBasicOStreamType; break; - case 'd': m_type = StdBasicIoStreamType; break; - default: throw ParseException(QString::fromLatin1("Invalid substitution")); - } - } -} - -QByteArray SubstitutionNode::description() const -{ - return "Substitution[type:" + QByteArray::number(m_type) + ']'; -} - -QByteArray SubstitutionNode::toByteArray() const -{ - switch (m_type) { - case ActualSubstitutionType: return CHILD_TO_BYTEARRAY(0); - case StdType: { - QByteArray repr = "std"; - if (childCount() > 0) - repr.append("::").append(CHILD_TO_BYTEARRAY(0)); - return repr; - } - case StdAllocType: return "std::allocator"; - case StdBasicStringType: return "std::basic_string"; - case FullStdBasicStringType: return "std::basic_string<char, std::char_traits<char>, " - "std::allocator<char> >"; - case StdBasicIStreamType: return "std::basic_istream<char, std::char_traits<char> >"; - case StdBasicOStreamType: return "std::basic_ostream<char, std::char_traits<char> >"; - case StdBasicIoStreamType: return "std::basic_iostream<char, std::char_traits<char> >"; - } - - DEMANGLER_ASSERT(false); - return QByteArray(); -} - - -bool PointerToMemberTypeNode::mangledRepresentationStartsWith(char c) -{ - return c == 'M'; -} - -/* <pointer-to-member-type> ::= M <type> <type> */ -void PointerToMemberTypeNode::parse() -{ - if (!mangledRepresentationStartsWith(ADVANCE())) - throw ParseException(QString::fromLatin1("Invalid pointer-to-member-type")); - - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(TypeNode); // Class type. - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(TypeNode); // Member type. -} - -QByteArray PointerToMemberTypeNode::toByteArray() const -{ - // Gather all qualifiers first, because we have to move them to the end en bloc. - QByteArray qualRepr; - TypeNode::Ptr memberTypeNode = DEMANGLER_CAST(TypeNode, MY_CHILD_AT(1)); - while (memberTypeNode->type() == TypeNode::QualifiedType) { - const CvQualifiersNode::Ptr cvNode - = DEMANGLER_CAST(CvQualifiersNode, CHILD_AT(memberTypeNode, 0)); - if (cvNode->hasQualifiers()) { - if (!qualRepr.isEmpty()) - qualRepr += ' '; - qualRepr += cvNode->toByteArray(); - } - memberTypeNode = DEMANGLER_CAST(TypeNode, CHILD_AT(memberTypeNode, 1)); - } - - QByteArray repr; - const QByteArray classTypeRepr = CHILD_TO_BYTEARRAY(0); - const FunctionTypeNode::Ptr functionNode - = CHILD_AT(memberTypeNode, 0).dynamicCast<FunctionTypeNode>(); - if (functionNode) { - const BareFunctionTypeNode::Ptr bareFunctionNode - = DEMANGLER_CAST(BareFunctionTypeNode, CHILD_AT(functionNode, 0)); - if (functionNode->isExternC()) - repr += "extern \"C\" "; - if (bareFunctionNode->hasReturnType()) - repr += CHILD_AT(bareFunctionNode, 0)->toByteArray() + ' '; - repr += '(' + classTypeRepr + "::*)" + bareFunctionNode->toByteArray(); - if (!qualRepr.isEmpty()) - repr += ' ' + qualRepr; - } else { - repr = memberTypeNode->toByteArray() + ' ' + classTypeRepr + "::"; - if (!qualRepr.isEmpty()) - repr += qualRepr + ' '; - repr += '*'; - } - return repr; -} - - -TemplateParamNode::TemplateParamNode(const TemplateParamNode &other) - : ParseTreeNode(other), m_index(other.index()) -{ -} - -bool TemplateParamNode::mangledRepresentationStartsWith(char c) -{ - return c == 'T'; -} - -/* - * <template-param> ::= T_ # first template parameter - * ::= T <non-negative-number> _ - */ -void TemplateParamNode::parse() -{ - if (!mangledRepresentationStartsWith(ADVANCE())) - throw ParseException(QString::fromLatin1("Invalid template-param")); - - if (PEEK() == '_') - m_index = 0; - else - m_index = getNonNegativeNumber<10>(parseState()) + 1; - if (ADVANCE() != '_') - throw ParseException(QString::fromLatin1("Invalid template-param")); - if (m_index >= parseState()->templateParamCount()) { - bool isConversionOperator = false; - for (int i = parseState()->stackElementCount() - 1; i >= 0; --i) { - const OperatorNameNode::Ptr opNode - = parseState()->stackElementAt(i).dynamicCast<OperatorNameNode>(); - if (opNode && opNode->type() == OperatorNameNode::CastType) { - isConversionOperator = true; - break; - } - } - if (!isConversionOperator) { - throw ParseException(QString::fromLatin1("Invalid template parameter index %1") - .arg(m_index)); - } - } else { - addChild(parseState()->templateParamAt(m_index)); - } -} - -QByteArray TemplateParamNode::description() const -{ - return "TemplateParam[index:" + QByteArray::number(m_index) + ']'; -} - -QByteArray TemplateParamNode::toByteArray() const -{ - return CHILD_TO_BYTEARRAY(0); -} - - -bool TemplateArgsNode::mangledRepresentationStartsWith(char c) -{ - return c == 'I'; -} - -/* - * <template-args> ::= I <template-arg>+ E - */ -void TemplateArgsNode::parse() -{ - if (!mangledRepresentationStartsWith(ADVANCE())) - throw ParseException(QString::fromLatin1("Invalid template args")); - - do - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(TemplateArgNode); - while (TemplateArgNode::mangledRepresentationStartsWith(PEEK())); - - if (ADVANCE() != 'E') - throw ParseException(QString::fromLatin1("Invalid template args")); -} - -QByteArray TemplateArgsNode::toByteArray() const -{ - QByteArray repr = "<"; - for (int i = 0; i < childCount(); ++i) { - repr += CHILD_TO_BYTEARRAY(i); - if (i < childCount() - 1) - repr += ", "; - } - return repr += '>'; -} - - -SpecialNameNode::SpecialNameNode(const SpecialNameNode &other) = default; - -bool SpecialNameNode::mangledRepresentationStartsWith(char c) -{ - return c == 'T' || c == 'G'; -} - -/* - * <special-name> ::= TV <type> # virtual table - * ::= TT <type> # VTT structure (construction vtable index) - * ::= TI <type> # typeinfo structure - * ::= TS <type> # typeinfo name (null-terminated byte string) - * ::= GV <name> # Guard variable for one-time initialization - * ::= T <call-offset> <encoding> - * ::= Tc <call-offset> <call-offset> <encoding> - * # base is the nominal target function of thunk - * # first call-offset is 'this' adjustment - * # second call-offset is result adjustment - */ -void SpecialNameNode::parse() -{ - QByteArray str = parseState()->readAhead(2); - if (str == "TV") { - m_type = VirtualTableType; - parseState()->advance(2); - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(TypeNode); - } else if (str == "TT") { - m_type = VttStructType; - parseState()->advance(2); - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(TypeNode); - } else if (str == "TI") { - m_type = TypeInfoType; - parseState()->advance(2); - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(TypeNode); - } else if (str == "TS") { - m_type = TypeInfoNameType; - parseState()->advance(2); - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(TypeNode); - } else if (str == "GV") { - m_type = GuardVarType; - parseState()->advance(2); - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(NameNode); - } else if (str == "Tc") { - m_type = DoubleCallOffsetType; - parseState()->advance(2); - CallOffsetRule::parse(parseState()); - CallOffsetRule::parse(parseState()); - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(EncodingNode); - } else if (ADVANCE() == 'T') { - m_type = SingleCallOffsetType; - CallOffsetRule::parse(parseState()); - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(EncodingNode); - } else { - throw ParseException(QString::fromLatin1("Invalid special-name")); - } -} - -QByteArray SpecialNameNode::description() const -{ - return "SpecialName[type:" + QByteArray::number(m_type) + ']'; -} - -QByteArray SpecialNameNode::toByteArray() const -{ - switch (m_type) { - case VirtualTableType: - return "[virtual table of " + CHILD_TO_BYTEARRAY(0) + ']'; - case VttStructType: - return "[VTT struct of " + CHILD_TO_BYTEARRAY(0) + ']'; - case TypeInfoType: - return "typeid(" + CHILD_TO_BYTEARRAY(0) + ')'; - case TypeInfoNameType: - return "typeid(" + CHILD_TO_BYTEARRAY(0) + ").name()"; - case GuardVarType: - return "[guard variable of " + CHILD_TO_BYTEARRAY(0) + ']'; - case SingleCallOffsetType: - return "[offset:" + CHILD_TO_BYTEARRAY(0) + ']' + CHILD_TO_BYTEARRAY(1); - case DoubleCallOffsetType: - return "[this-adjustment:" + CHILD_TO_BYTEARRAY(0) + "][result-adjustment:" - + CHILD_TO_BYTEARRAY(1) + ']' + CHILD_TO_BYTEARRAY(2); - } - - DEMANGLER_ASSERT(false); - return QByteArray(); -} - - -NumberNode::NumberNode(GlobalParseState *parseState) - : ParseTreeNode(parseState) -{ -} - -NumberNode::NumberNode(const NumberNode &other) = default; - -bool NumberNode::mangledRepresentationStartsWith(char c) -{ - return NonNegativeNumberNode<10>::mangledRepresentationStartsWith(c) || c == 'n'; -} - -/* <number> ::= [n] <non-negative decimal integer> */ -void NumberNode::parse() -{ - const char next = PEEK(); - if (!mangledRepresentationStartsWith(next)) - throw ParseException("Invalid number"); - - if (next == 'n') { - m_isNegative = true; - ADVANCE(); - } - - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(NonNegativeNumberNode<10>); -} - -QByteArray NumberNode::description() const -{ - return "Number[isNegative:" + bool2String(m_isNegative) + ']'; -} - -QByteArray NumberNode::toByteArray() const -{ - QByteArray repr = CHILD_TO_BYTEARRAY(0); - if (m_isNegative) - repr.prepend('-'); - return repr; -} - - -template<int base> NonNegativeNumberNode<base>::NonNegativeNumberNode(const NonNegativeNumberNode<base> &other) - : ParseTreeNode(other), m_number(other.m_number) -{ -} - -template<int base> void NonNegativeNumberNode<base>::parse() -{ - QByteArray numberRepr; - while (mangledRepresentationStartsWith(PEEK())) - numberRepr += ADVANCE(); - if (numberRepr.count() == 0) - throw ParseException(QString::fromLatin1("Invalid non-negative number")); - m_number = numberRepr.toULongLong(nullptr, base); -} - -template<int base> QByteArray NonNegativeNumberNode<base>::description() const -{ - return "NonNegativeNumber[base:" + QByteArray::number(base) + ";number:" - + QByteArray::number(m_number) + ']'; -} - -template<int base> QByteArray NonNegativeNumberNode<base>::toByteArray() const -{ - return QByteArray::number(m_number); -} - - -bool NameNode::mangledRepresentationStartsWith(char c) -{ - return NestedNameNode::mangledRepresentationStartsWith(c) - || UnscopedNameNode::mangledRepresentationStartsWith(c) - || SubstitutionNode::mangledRepresentationStartsWith(c) - || LocalNameNode::mangledRepresentationStartsWith(c); -} - -QByteArray NameNode::toByteArray() const -{ - return pasteAllChildren(); -} - -bool NameNode::isTemplate() const -{ - if (childCount() > 1 && MY_CHILD_AT(1).dynamicCast<TemplateArgsNode>()) - return true; - const NestedNameNode::Ptr nestedNameNode = MY_CHILD_AT(0).dynamicCast<NestedNameNode>(); - if (nestedNameNode) - return nestedNameNode->isTemplate(); - const LocalNameNode::Ptr localNameNode = MY_CHILD_AT(0).dynamicCast<LocalNameNode>(); - if (localNameNode) - return localNameNode->isTemplate(); - - return false; -} - -bool NameNode::isConstructorOrDestructorOrConversionOperator() const -{ - NestedNameNode::Ptr nestedNameNode = MY_CHILD_AT(0).dynamicCast<NestedNameNode>(); - if (nestedNameNode) - return nestedNameNode->isConstructorOrDestructorOrConversionOperator(); - const LocalNameNode::Ptr localNameNode = MY_CHILD_AT(0).dynamicCast<LocalNameNode>(); - if (localNameNode) - return localNameNode->isConstructorOrDestructorOrConversionOperator(); - - return false; -} - -CvQualifiersNode::Ptr NameNode::cvQualifiers() const -{ - const NestedNameNode::Ptr nestedNameNode = MY_CHILD_AT(0).dynamicCast<NestedNameNode>(); - if (nestedNameNode) - return nestedNameNode->cvQualifiers(); - const LocalNameNode::Ptr localNameNode = MY_CHILD_AT(0).dynamicCast<LocalNameNode>(); - if (localNameNode) - return localNameNode->cvQualifiers(); - return CvQualifiersNode::Ptr(); -} - -/* - * <name> ::= <nested-name> - * ::= <unscoped-name> - * ::= <unscoped-template-name> <template-args> - * ::= <local-name> # See Scope Encoding below - * - * We can't use this rule directly, because <unscoped-template-name> - * can expand to <unscoped-name>. We therefore integrate it directly - * into the production for <name>: - * <name> ::= <unscoped-name> [<template-args>] - * ::= <substitution> <template-args> - * - * Secondly, <substitution> shares an expansion ("St") with <unscoped-name>, - * so we have to look further ahead to see which one matches. - */ -void NameNode::parse() -{ - if ((parseState()->readAhead(2) == "St" - && UnqualifiedNameNode::mangledRepresentationStartsWith(parseState()->peek(2))) - || UnscopedNameNode::mangledRepresentationStartsWith(PEEK())) { - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(UnscopedNameNode); - if (TemplateArgsNode::mangledRepresentationStartsWith(PEEK())) { - parseState()->addSubstitution(parseState()->stackTop()); - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(TemplateArgsNode); - } - } else { - const char next = PEEK(); - if (NestedNameNode::mangledRepresentationStartsWith(next)) { - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(NestedNameNode); - } else if (SubstitutionNode::mangledRepresentationStartsWith(next)) { - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(SubstitutionNode); - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(TemplateArgsNode); - } else if (LocalNameNode::mangledRepresentationStartsWith(next)) { - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(LocalNameNode); - } else { - throw ParseException(QString::fromLatin1("Invalid name")); - } - } -} - - -TemplateArgNode::TemplateArgNode(GlobalParseState *parseState) - : ParseTreeNode(parseState) -{ -} - -TemplateArgNode::TemplateArgNode(const TemplateArgNode &other) = default; - -bool TemplateArgNode::mangledRepresentationStartsWith(char c) -{ - return TypeNode::mangledRepresentationStartsWith(c) - || ExprPrimaryNode::mangledRepresentationStartsWith(c) - || c == 'X' || c == 'J'; -} - -/* - * <template-arg> ::= <type> # type or template - * ::= X <expression> E # expression - * ::= <expr-primary> # simple expressions - * ::= J <template-arg>* E # argument pack - */ -void TemplateArgNode::parse() -{ - const char next = PEEK(); - if (TypeNode::mangledRepresentationStartsWith(next)) { - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(TypeNode); - } else if (ExprPrimaryNode::mangledRepresentationStartsWith(next)) { - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(ExprPrimaryNode); - } else if (next == 'X') { - ADVANCE(); - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(ExpressionNode); - if (ADVANCE() != 'E') - throw ParseException(QString::fromLatin1("Invalid template-arg")); - } else if (next == 'J') { - m_isTemplateArgumentPack = true; - ADVANCE(); - while (TemplateArgNode::mangledRepresentationStartsWith(PEEK())) - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(TemplateArgNode); - if (ADVANCE() != 'E') - throw ParseException(QString::fromLatin1("Invalid template-arg")); - } else { - throw ParseException(QString::fromLatin1("Invalid template-arg")); - } - - parseState()->addTemplateParam(parseState()->stackTop()); -} - -QByteArray TemplateArgNode::description() const -{ - return "TemplateArg[isPack:" + bool2String(m_isTemplateArgumentPack) + ']'; -} - -QByteArray TemplateArgNode::toByteArray() const -{ - if (m_isTemplateArgumentPack) { - QByteArray repr; - for (int i = 0; i < childCount(); ++i) - repr.append(CHILD_TO_BYTEARRAY(i)).append(", "); - return repr += "typename..."; - } - return CHILD_TO_BYTEARRAY(0); -} - - -bool PrefixNode::mangledRepresentationStartsWith(char c) -{ - return TemplateParamNode::mangledRepresentationStartsWith(c) - || SubstitutionNode::mangledRepresentationStartsWith(c) - || UnqualifiedNameNode::mangledRepresentationStartsWith(c) - || SourceNameNode::mangledRepresentationStartsWith(c) - || DeclTypeNode::mangledRepresentationStartsWith(c); -} - -bool PrefixNode::isTemplate() const -{ - return childCount() > 0 && MY_CHILD_AT(childCount() - 1).dynamicCast<TemplateArgsNode>(); -} - -bool PrefixNode::isConstructorOrDestructorOrConversionOperator() const -{ - for (int i = childCount() - 1; i >= 0; --i) { - const UnqualifiedNameNode::Ptr n = MY_CHILD_AT(i).dynamicCast<UnqualifiedNameNode>(); - if (n) - return n->isConstructorOrDestructorOrConversionOperator(); - } - return false; -} - -/* - * <prefix> ::= <prefix> <unqualified-name> - * ::= <template-prefix> <template-args> - * ::= <template-param> - * ::= <decltype> - * ::= # empty - * ::= <substitution> - * ::= <prefix> <data-member-prefix> - * <template-prefix> ::= <prefix> <unqualified-name> - * ::= <template-param> - * ::= <substitution> - * <data-member-prefix> := <source-name> M - * - * We have to eliminate the left-recursion and the template-prefix rule - * and end up with this: - * <prefix> ::= <template-param> [<template-args>] <prefix-2> - * ::= <substitution> [<template-args>] <prefix-2> - * ::= <decltype> [<template-args>] <prefix-2> - * ::= <prefix-2> - * <prefix-2> ::= <unqualified-name> [<template-args>] <prefix-2> - * ::= <data-member-prefix> <prefix2> - * ::= # empty - * <data-member-prefix> has overlap in its rhs with <unqualified-name>, so we cannot make it - * a node of its own. Instead, we just check whether a source name is followed by 'M' and - * remember that. - */ -void PrefixNode::parse() -{ - const char next = PEEK(); - bool canAddSubstitution = false; - if (TemplateParamNode::mangledRepresentationStartsWith(next)) { - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(TemplateParamNode); - if (TemplateArgsNode::mangledRepresentationStartsWith(PEEK())) { - parseState()->addSubstitution(parseState()->stackTop()); - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(TemplateArgsNode); - } - canAddSubstitution = true; - } else if (SubstitutionNode::mangledRepresentationStartsWith(next)) { - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(SubstitutionNode); - if (TemplateArgsNode::mangledRepresentationStartsWith(PEEK())) { - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(TemplateArgsNode); - canAddSubstitution = true; - } - } else if (DeclTypeNode::mangledRepresentationStartsWith(next)) { - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(SubstitutionNode); - if (TemplateArgsNode::mangledRepresentationStartsWith(PEEK())) { - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(TemplateArgsNode); - canAddSubstitution = true; - } - } - - while (UnqualifiedNameNode::mangledRepresentationStartsWith(PEEK())) { - if (canAddSubstitution) - parseState()->addSubstitution(parseState()->stackTop()); - else - canAddSubstitution = true; - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(UnqualifiedNameNode); - const bool isDataMember = CHILD_AT(MY_CHILD_AT(childCount() - 1), 0) - .dynamicCast<SourceNameNode>() && PEEK() == 'M'; - if (isDataMember) { - // TODO: Being a data member is apparently relevant for initializers, but what does - // this mean for the demangled string? - ADVANCE(); - continue; - } - if (TemplateArgsNode::mangledRepresentationStartsWith(PEEK())) { - parseState()->addSubstitution(parseState()->stackTop()); - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(TemplateArgsNode); - } - } -} - -QByteArray PrefixNode::toByteArray() const -{ - if (childCount() == 0) - return QByteArray(); - QByteArray repr = CHILD_TO_BYTEARRAY(0); - for (int i = 1; i < childCount(); ++i) { - if (!MY_CHILD_AT(i).dynamicCast<TemplateArgsNode>()) - repr += "::"; - repr += CHILD_TO_BYTEARRAY(i); - } - return repr; -} - - -TypeNode::TypeNode(const TypeNode &other) - : ParseTreeNode(other), m_type(other.type()) -{ -} - -bool TypeNode::mangledRepresentationStartsWith(char c) -{ - return BuiltinTypeNode::mangledRepresentationStartsWith(c) - || FunctionTypeNode::mangledRepresentationStartsWith(c) - || ClassEnumTypeRule::mangledRepresentationStartsWith(c) - || ArrayTypeNode::mangledRepresentationStartsWith(c) - || PointerToMemberTypeNode::mangledRepresentationStartsWith(c) - || TemplateParamNode::mangledRepresentationStartsWith(c) - || SubstitutionNode::mangledRepresentationStartsWith(c) - || CvQualifiersNode::mangledRepresentationStartsWith(c) - || DeclTypeNode::mangledRepresentationStartsWith(c) - || strchr("PROCGUD", c); - -} - -/* - * <type> ::= <builtin-type> - * ::= <function-type> - * ::= <class-enum-type> - * ::= <array-type> - * ::= <pointer-to-member-type> - * ::= <template-param> - * ::= <template-template-param> <template-args> - * ::= <decltype> - * ::= <substitution> # See Compression below - * ::= <CV-qualifiers> <type> - * ::= P <type> # pointer-to - * ::= R <type> # reference-to - * ::= O <type> # rvalue reference-to (C++0x) - * ::= C <type> # complex pair (C 2000) - * ::= G <type> # imaginary (C 2000) - * ::= U <source-name> <type> # vendor extended type qualifier - * ::= Dp <type> # pack expansion of (C++0x) - * - * Because <template-template-param> can expand to <template-param>, we have to - * do a slight transformation: We get rid of <template-template-param> and - * integrate its rhs into <type>'s rhs. This leads to the following - * identical prefixes: - * <type> ::= <template-param> - * ::= <template-param> <template-args> - * ::= <substitution> - * ::= <substitution> <template-args> - * - * Also, the first set of <builtin-type> has some overlap with - * direct productions of <type>, so these have to be worked around as well. - */ -void TypeNode::parse() -{ - QByteArray str = parseState()->readAhead(2); - if (str == "Dp") { - m_type = PackExpansionType; - parseState()->advance(2); - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(TypeNode); - } else { - const char next = PEEK(); - if (str == "Dt" || str == "DT") { - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(DeclTypeNode); - } else if (str == "Dd" || str == "De" || str == "Df" || str == "Dh" || str == "Di" || str == "Ds" - || (next != 'D' && BuiltinTypeNode::mangledRepresentationStartsWith(next))) { - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(BuiltinTypeNode); - } else if (FunctionTypeNode::mangledRepresentationStartsWith(next)) { - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(FunctionTypeNode); - parseState()->addSubstitution(parseState()->stackTop()); - } else if (ClassEnumTypeRule::mangledRepresentationStartsWith(next)) { - ClassEnumTypeRule::parse(parseState()); - parseState()->addSubstitution(parseState()->stackTop()); - } else if (ArrayTypeNode::mangledRepresentationStartsWith(next)) { - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(ArrayTypeNode); - parseState()->addSubstitution(parseState()->stackTop()); - } else if (PointerToMemberTypeNode::mangledRepresentationStartsWith(next)) { - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(PointerToMemberTypeNode); - parseState()->addSubstitution(parseState()->stackTop()); - } else if (TemplateParamNode::mangledRepresentationStartsWith(next)) { - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(TemplateParamNode); - // The type is now a substitution candidate, but the child node may contain a forward - // reference, so we delay the substitution until it is resolved. - // TODO: Check whether this is really safe, i.e. whether the following parse function - // might indirectly expect this substitution to already exist. - - if (TemplateArgsNode::mangledRepresentationStartsWith(PEEK())) { - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(TemplateArgsNode); - // Substitution delayed, see above. - } - - // Resolve forward reference, if necessary. - const TemplateParamNode::Ptr templateParamNode - = DEMANGLER_CAST(TemplateParamNode, MY_CHILD_AT(0)); - if (templateParamNode->childCount() == 0) { - if (templateParamNode->index() >= parseState()->templateParamCount()) { - throw ParseException(QString::fromLatin1("Invalid template parameter " - "index %1 in forwarding").arg(templateParamNode->index())); - } - templateParamNode->addChild(parseState() - ->templateParamAt(templateParamNode->index())); - } - - // Delayed substitutions from above. - parseState()->addSubstitution(templateParamNode); - if (childCount() > 1) - parseState()->addSubstitution(parseState()->stackTop()); - } else if (SubstitutionNode::mangledRepresentationStartsWith(next)) { - m_type = SubstitutionType; - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(SubstitutionNode); - if (TemplateArgsNode::mangledRepresentationStartsWith(PEEK())) { - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(TemplateArgsNode); - parseState()->addSubstitution(parseState()->stackTop()); - } - } else if (CvQualifiersNode::mangledRepresentationStartsWith(next)) { - m_type = QualifiedType; - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(CvQualifiersNode); - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(TypeNode); - const CvQualifiersNode::Ptr cvNode = DEMANGLER_CAST(CvQualifiersNode, MY_CHILD_AT(0)); - if (cvNode->hasQualifiers()) - parseState()->addSubstitution(parseState()->stackTop()); - } else if (next == 'P') { - m_type = PointerType; - ADVANCE(); - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(TypeNode); - parseState()->addSubstitution(parseState()->stackTop()); - } else if (next == 'R') { - m_type = ReferenceType; - ADVANCE(); - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(TypeNode); - parseState()->addSubstitution(parseState()->stackTop()); - } else if (next == 'O') { - m_type = RValueType; - ADVANCE(); - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(TypeNode); - parseState()->addSubstitution(parseState()->stackTop()); - } else if (next == 'C') { - ADVANCE(); - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(TypeNode); - parseState()->addSubstitution(parseState()->stackTop()); - } else if (next == 'G') { - ADVANCE(); - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(TypeNode); - parseState()->addSubstitution(parseState()->stackTop()); - } else if (next == 'U') { - m_type = VendorType; - ADVANCE(); - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(SourceNameNode); - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(TypeNode); - } else { - throw ParseException(QString::fromLatin1("Invalid type")); - } - } -} - -QByteArray TypeNode::description() const -{ - return "Type[type:" + QByteArray::number(m_type) + ']'; -} - -QByteArray TypeNode::toByteArray() const -{ - // A pure top-down approach is not possible to due to the weird function pointer syntax, - // e.g. things like (* const &)(int) etc. - // Instead, we have to gather all successive qualifiers, pointers and references first - // and then apply them as a whole to whatever follows. - // Note that "qualifier to function" is not possible here, since that is handled by - // PointerToMemberType. - QList<const ParseTreeNode *> qualPtrRefList; - const TypeNode *currentNode = this; - bool leafType = false; - Type lastType = TypeNode::OtherType; - while (!leafType) { - Type currentType = currentNode->m_type; - switch (currentType) { - case QualifiedType: { - const CvQualifiersNode::Ptr cvNode - = DEMANGLER_CAST(CvQualifiersNode, CHILD_AT(currentNode, 0)); - if (cvNode->hasQualifiers()) - qualPtrRefList << cvNode.data(); - currentNode = DEMANGLER_CAST(TypeNode, CHILD_AT(currentNode, 1)).data(); - break; - } - case PointerType: case ReferenceType: case RValueType: - /* - * The Standard says (8.3.2/6) that nested references collapse according - * to the following rules: - * (1) Reference to reference -> reference - * (2) Reference to rvalue -> reference - * (3) Rvalue to reference -> reference - * (4) Rvalue to Rvalue -> Rvalue - */ - if (currentType == ReferenceType - && (lastType == ReferenceType || lastType == RValueType)) { // (1) and (3) - qualPtrRefList.removeLast(); - qualPtrRefList << currentNode; - } else if (currentType == RValueType - && (lastType == ReferenceType || lastType == RValueType)) { // (2) and (4) - // Ignore current element. - currentType = lastType; - } else { - qualPtrRefList << currentNode; - } - currentNode = DEMANGLER_CAST(TypeNode, CHILD_AT(currentNode, 0)).data(); - break; - default: { - ParseTreeNode::Ptr childNode = CHILD_AT(currentNode, 0); - while (true) { - if (childCount() != 1) - break; - SubstitutionNode::Ptr substNode = childNode.dynamicCast<SubstitutionNode>(); - if (substNode && substNode->type() == SubstitutionNode::ActualSubstitutionType) { - childNode = CHILD_AT(childNode, 0); - } else if (childNode.dynamicCast<TemplateParamNode>()) { - childNode = CHILD_AT(childNode, 0); - if (childNode.dynamicCast<TemplateArgNode>()) - childNode = CHILD_AT(childNode, 0); - } else { - break; - } - } - if (childNode != CHILD_AT(currentNode, 0)) { - const TypeNode::Ptr nextCurrent = childNode.dynamicCast<TypeNode>(); - if (nextCurrent) { - currentNode = nextCurrent.data(); - continue; - } - } - - leafType = true; - break; - } - } - lastType = currentType; - } - - if (qualPtrRefList.isEmpty()) { - switch (currentNode->m_type) { - case PackExpansionType: return CHILD_TO_BYTEARRAY(0) + "..."; - case VendorType: return pasteAllChildren(); - case OtherType: return pasteAllChildren(); - - // Can happen if qualifier node does not actually have qualifiers, e.g. in <function-param>. - default: return pasteAllChildren(); - } - } - - return toByteArrayQualPointerRef(currentNode, qualPtrRefListToByteArray(qualPtrRefList)); -} - -QByteArray TypeNode::toByteArrayQualPointerRef(const TypeNode *typeNode, - const QByteArray &qualPtrRef) const -{ - const FunctionTypeNode::Ptr functionNode - = CHILD_AT(typeNode, 0).dynamicCast<FunctionTypeNode>(); - if (functionNode) { - const BareFunctionTypeNode::Ptr bareFunctionNode - = DEMANGLER_CAST(BareFunctionTypeNode, CHILD_AT(functionNode, 0)); - QByteArray repr; - if (functionNode->isExternC()) - repr += "extern \"C\" "; - if (bareFunctionNode->hasReturnType()) - repr += CHILD_AT(bareFunctionNode, 0)->toByteArray() + ' '; - return repr += '(' + qualPtrRef + ')' + bareFunctionNode->toByteArray(); - } - - const ArrayTypeNode::Ptr arrayNode = CHILD_AT(typeNode, 0).dynamicCast<ArrayTypeNode>(); - if (arrayNode) { - return CHILD_AT(arrayNode, 1)->toByteArray() + " (" + qualPtrRef + ")[" - + CHILD_AT(arrayNode, 0)->toByteArray() + ']'; - } - - if (CHILD_AT(typeNode, 0).dynamicCast<PointerToMemberTypeNode>()) - return typeNode->toByteArray() + qualPtrRef; - - return typeNode->toByteArray() + ' ' + qualPtrRef; -} - -QByteArray TypeNode::qualPtrRefListToByteArray(const QList<const ParseTreeNode *> &nodeList) const -{ - QByteArray repr; - for (const ParseTreeNode * const n : nodeList) { - const auto typeNode = dynamic_cast<const TypeNode*>(n); - if (typeNode) { - switch (typeNode->m_type) { - case PointerType: - if (!repr.isEmpty() && !repr.startsWith('*')) - repr.prepend(' '); - repr.prepend('*'); - break; - case ReferenceType: - if (!repr.isEmpty()) - repr.prepend(' '); - repr.prepend('&'); - break; - case RValueType: - if (!repr.isEmpty()) - repr.prepend(' '); - repr.prepend("&&"); - break; - default: - DEMANGLER_ASSERT(false); - } - } else { - if (!repr.isEmpty()) - repr.prepend(' '); - repr.prepend(n->toByteArray()); - } - } - - return repr; -} - - -FloatValueNode::FloatValueNode(const FloatValueNode &other) = default; - -bool FloatValueNode::mangledRepresentationStartsWith(char c) -{ - return strchr("0123456789abcdef", c); -} - -/* - * Floating-point literals are encoded using a fixed-length lowercase - * hexadecimal string corresponding to the internal representation - * (IEEE on Itanium), high-order bytes first, without leading zeroes. - * For example: "Lf bf800000 E" is -1.0f on Itanium. - */ -void FloatValueNode::parse() -{ - m_value = 0; - while (mangledRepresentationStartsWith(PEEK())) { - // TODO: Construct value; - ADVANCE(); - } -} - -QByteArray FloatValueNode::description() const -{ - return "FloatValue[value:" + QByteArray::number(m_value) + ']'; -} - -QByteArray FloatValueNode::toByteArray() const -{ - return QByteArray::number(m_value); -} - - -/* <nv-offset> ::= <number> # non-virtual base override */ -void NvOffsetNode::parse() -{ - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(NumberNode); -} - -/* - * <v-offset> ::= <number> _ <number> - * # virtual base override, with vcall offset - */ -void VOffsetNode::parse() -{ - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(NumberNode); - if (ADVANCE() != '_') - throw ParseException(QString::fromLatin1("Invalid v-offset")); - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(NumberNode); -} - - -bool LambdaSigNode::mangledRepresentationStartsWith(char c) -{ - return TypeNode::mangledRepresentationStartsWith(c); -} - -// <lambda-sig> ::= <type>+ # Parameter types or "v" if the lambda has no parameters -void LambdaSigNode::parse() -{ - do - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(TypeNode); - while (TypeNode::mangledRepresentationStartsWith(PEEK())); -} - -QByteArray LambdaSigNode::toByteArray() const -{ - QByteArray repr = "lambda("; - for (int i = 0; i < childCount(); ++i) { - const QByteArray paramRepr = CHILD_TO_BYTEARRAY(i); - if (paramRepr != "void") - repr += paramRepr; - if (i < childCount() - 1) - repr += ", "; - } - return repr += ')'; -} - - -// <closure-type-name> ::= Ul <lambda-sig> E [ <nonnegative number> ] _ -void ClosureTypeNameNode::parse() -{ - if (parseState()->readAhead(2) != "Ul") - throw ParseException("Invalid closure-type-name"); - parseState()->advance(2); - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(LambdaSigNode); - if (ADVANCE() != 'E') - throw ParseException("invalid closure-type-name"); - if (NonNegativeNumberNode<10>::mangledRepresentationStartsWith(PEEK())) - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(NonNegativeNumberNode<10>); - if (ADVANCE() != '_') - throw ParseException("Invalid closure-type-name"); -} - -QByteArray ClosureTypeNameNode::toByteArray() const -{ - QByteArray repr = CHILD_TO_BYTEARRAY(0) + '#'; - quint64 number; - if (childCount() == 2) { - const NonNegativeNumberNode<10>::Ptr numberNode - = DEMANGLER_CAST(NonNegativeNumberNode<10>, MY_CHILD_AT(1)); - number = numberNode->number() + 2; - } else { - number = 1; - } - return repr += QByteArray::number(number); -} - - -bool UnnamedTypeNameNode::mangledRepresentationStartsWith(char c) -{ - return c == 'U'; -} - -/* - * <unnamed-type-name> ::= Ut [ <nonnegative number> ] _ - * ::= <closure-type-name> - */ -void UnnamedTypeNameNode::parse() -{ - if (parseState()->readAhead(2) == "Ut") { - parseState()->advance(2); - if (NonNegativeNumberNode<10>::mangledRepresentationStartsWith(PEEK())) - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(NonNegativeNumberNode<10>); - if (ADVANCE() != '_') - throw ParseException("Invalid unnamed-type-node"); - } else { - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(ClosureTypeNameNode); - } -} - -QByteArray UnnamedTypeNameNode::toByteArray() const -{ - QByteArray repr(1, '{'); - if (childCount() == 0) { - repr += "unnamed type#1"; - } else { - const NonNegativeNumberNode<10>::Ptr numberNode - = MY_CHILD_AT(0).dynamicCast<NonNegativeNumberNode<10> >(); - if (numberNode) - repr += "unnamed type#" + QByteArray::number(numberNode->number() + 2); - else - repr += CHILD_TO_BYTEARRAY(0); - } - return repr += '}'; -} - - -bool DeclTypeNode::mangledRepresentationStartsWith(char c) -{ - return c == 'D'; -} - -/* - * <decltype> ::= Dt <expression> E # decltype of an id-expression or class member access (C++0x) - * ::= DT <expression> E # decltype of an expression (C++0x) - */ -void DeclTypeNode::parse() -{ - const QByteArray start = parseState()->readAhead(2); - if (start != "DT" && start != "Dt") - throw ParseException("Invalid decltype"); - parseState()->advance(2); - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(ExpressionNode); - if (ADVANCE() != 'E') - throw ParseException(QString::fromLatin1("Invalid type")); -} - -QByteArray DeclTypeNode::toByteArray() const -{ - return "decltype(" + CHILD_TO_BYTEARRAY(0) + ')'; -} - - -bool UnresolvedTypeRule::mangledRepresentationStartsWith(char c) -{ - return TemplateParamNode::mangledRepresentationStartsWith(c) - || DeclTypeNode::mangledRepresentationStartsWith(c) - || SubstitutionNode::mangledRepresentationStartsWith(c); -} - -/* - * <unresolved-type> ::= <template-param> - * ::= <decltype> - * ::= <substitution> - */ -void UnresolvedTypeRule::parse(GlobalParseState *parseState) -{ - const char next = parseState->peek(); - const ParseTreeNode::Ptr parentNode = parseState->stackTop(); - if (TemplateParamNode::mangledRepresentationStartsWith(next)) - PARSE_RULE_AND_ADD_RESULT_AS_CHILD_TO_NODE(TemplateParamNode, parseState, parentNode); - else if (DeclTypeNode::mangledRepresentationStartsWith(next)) - PARSE_RULE_AND_ADD_RESULT_AS_CHILD_TO_NODE(DeclTypeNode, parseState, parentNode); - else if (SubstitutionNode::mangledRepresentationStartsWith(next)) - PARSE_RULE_AND_ADD_RESULT_AS_CHILD_TO_NODE(SubstitutionNode, parseState, parentNode); - else - throw ParseException("Invalid unresolved-type"); -} - - -bool SimpleIdNode::mangledRepresentationStartsWith(char c) -{ - return SourceNameNode::mangledRepresentationStartsWith(c); -} - -// <simple-id> ::= <source-name> [ <template-args> ] -void SimpleIdNode::parse() -{ - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(SourceNameNode); - if (TemplateArgsNode::mangledRepresentationStartsWith(PEEK())) - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(TemplateArgsNode); -} - -QByteArray SimpleIdNode::toByteArray() const -{ - return pasteAllChildren(); -} - - -bool DestructorNameNode::mangledRepresentationStartsWith(char c) -{ - return UnresolvedTypeRule::mangledRepresentationStartsWith(c) - || SimpleIdNode::mangledRepresentationStartsWith(c); -} - -/* - * <destructor-name> ::= <unresolved-type> # e.g., ~T or ~decltype(f()) - * ::= <simple-id> # e.g., ~A<2*N> - */ -void DestructorNameNode::parse() -{ - const char next = PEEK(); - if (UnresolvedTypeRule::mangledRepresentationStartsWith(next)) - UnresolvedTypeRule::parse(parseState()); - else if (SimpleIdNode::mangledRepresentationStartsWith(next)) - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(SimpleIdNode); - else - throw ParseException("Invalid destructor-name"); -} - -QByteArray DestructorNameNode::toByteArray() const -{ - return '~' + CHILD_TO_BYTEARRAY(0); -} - - -bool UnresolvedQualifierLevelRule::mangledRepresentationStartsWith(char c) -{ - return SimpleIdNode::mangledRepresentationStartsWith(c); -} - -// <unresolved-qualifier-level> ::= <simple-id> - void UnresolvedQualifierLevelRule::parse(GlobalParseState *parseState) -{ - PARSE_RULE_AND_ADD_RESULT_AS_CHILD_TO_NODE(SimpleIdNode, parseState, parseState->stackTop()); -} - - -BaseUnresolvedNameNode::BaseUnresolvedNameNode(GlobalParseState *parseState) - : ParseTreeNode(parseState) -{ -} - -BaseUnresolvedNameNode::BaseUnresolvedNameNode(const BaseUnresolvedNameNode &other) = default; - -bool BaseUnresolvedNameNode::mangledRepresentationStartsWith(char c) -{ - return SimpleIdNode::mangledRepresentationStartsWith(c) || c == 'o' || c == 'd'; -} - -/* - * <base-unresolved-name> ::= <simple-id> # unresolved name - * ::= on <operator-name> # unresolved operator-function-id - * ::= on <operator-name> <template-args> # unresolved operator template-id - * ::= dn <destructor-name> # destructor or pseudo-destructor; - * # e.g. ~X or ~X<N-1> - */ -void BaseUnresolvedNameNode::parse() -{ - if (SimpleIdNode::mangledRepresentationStartsWith(PEEK())) { - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(SimpleIdNode); - } else if (parseState()->readAhead(2) == "on") { - m_isOperator = true; - parseState()->advance(2); - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(OperatorNameNode); - if (TemplateArgsNode::mangledRepresentationStartsWith(PEEK())) - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(TemplateArgsNode); - } else if (parseState()->readAhead(2) == "dn") { - parseState()->advance(2); - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(DestructorNameNode); - } else { - throw ParseException("Invalid <base-unresolved-name>"); - } -} - -QByteArray BaseUnresolvedNameNode::description() const -{ - return "BaseUnresolvedName[isOperator:" + bool2String(m_isOperator) + ']'; -} - -QByteArray BaseUnresolvedNameNode::toByteArray() const -{ - QByteArray repr; - if (m_isOperator) - repr += "operator"; - return repr += pasteAllChildren(); -} - - -bool InitializerNode::mangledRepresentationStartsWith(char c) -{ - return c == 'p'; -} - -// <initializer> ::= pi <expression>* E # parenthesized initialization -void InitializerNode::parse() -{ - if (parseState()->readAhead(2) != "pi") - throw ParseException("Invalid initializer"); - parseState()->advance(2); - while (ExpressionNode::mangledRepresentationStartsWith(PEEK())) - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(ExpressionNode); - if (ADVANCE() != 'E') - throw ParseException("Invalid initializer"); -} - -QByteArray InitializerNode::toByteArray() const -{ - QByteArray repr = "("; - for (int i = 0; i < childCount(); ++i) { - repr += CHILD_TO_BYTEARRAY(i); - if (i < childCount() - 1) - repr += ", "; - } - return repr += ')'; -} - - -UnresolvedNameNode::UnresolvedNameNode(const UnresolvedNameNode &other) = default; - -bool UnresolvedNameNode::mangledRepresentationStartsWith(char c) -{ - return BaseUnresolvedNameNode::mangledRepresentationStartsWith(c) || c == 'g' || c == 's'; -} - -/* - * <unresolved-name> ::= [gs] <base-unresolved-name> # x or (with "gs") ::x - * ::= sr <unresolved-type> <base-unresolved-name> # T::x / decltype(p)::x - * ::= srN <unresolved-type> <unresolved-qualifier-level>+ E <base-unresolved-name> - * # T::N::x /decltype(p)::N::x - * ::= [gs] sr <unresolved-qualifier-level>+ E <base-unresolved-name> - * # A::x, N::y, A<T>::z; "gs" means leading "::" - */ -void UnresolvedNameNode::parse() -{ - if (parseState()->readAhead(2) == "gs") { - m_globalNamespace = true; - parseState()->advance(2); - } else { - m_globalNamespace = false; - } - if (parseState()->readAhead(2) == "sr") { - parseState()->advance(2); - if (PEEK() == 'N') { - ADVANCE(); - UnresolvedTypeRule::parse(parseState()); - do - UnresolvedQualifierLevelRule::parse(parseState()); - while (UnresolvedQualifierLevelRule::mangledRepresentationStartsWith(PEEK())); - if (ADVANCE() != 'E') - throw ParseException("Invalid unresolved-name"); - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(BaseUnresolvedNameNode); - } else if (UnresolvedTypeRule::mangledRepresentationStartsWith(PEEK())) { - if (m_globalNamespace) - throw ParseException("Invalid unresolved-name"); - UnresolvedTypeRule::parse(parseState()); - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(BaseUnresolvedNameNode); - } else { - if (!UnresolvedQualifierLevelRule::mangledRepresentationStartsWith(PEEK())) - throw ParseException("Invalid unresolved-name"); - while (UnresolvedQualifierLevelRule::mangledRepresentationStartsWith(PEEK())) - UnresolvedQualifierLevelRule::parse(parseState()); - if (ADVANCE() != 'E') - throw ParseException("Invalid unresolved-name"); - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(BaseUnresolvedNameNode); - } - } else { - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(BaseUnresolvedNameNode); - } -} - -QByteArray UnresolvedNameNode::description() const -{ - return "UnresolvedName[globalNamespace:" + bool2String(m_globalNamespace) + ']'; -} - -QByteArray UnresolvedNameNode::toByteArray() const -{ - QByteArray repr; - if (m_globalNamespace) - repr += "::"; - for (int i = 0; i < childCount(); ++i) { - repr += CHILD_TO_BYTEARRAY(i); - if (i < childCount() - 1) - repr += "::"; - } - return repr; -} - - -bool FunctionParamNode::mangledRepresentationStartsWith(char c) -{ - return c == 'f'; -} - -/* - * <function-param> ::= fp <top-level CV-qualifiers> _ # L == 0, first parameter - * ::= fp <top-level CV-qualifiers> <parameter-2 non-negative number> _ # L == 0, second and later parameters - * ::= fL <L-1 non-negative number> p <top-level CV-qualifiers> _ # L > 0, first parameter - * ::= fL <L-1 non-negative number> p <top-level CV-qualifiers> <parameter-2 non-negative number> _ # L > 0, second and later parameters - */ -void FunctionParamNode::parse() -{ - if (parseState()->readAhead(2) == "fp") { - parseState()->advance(2); - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(CvQualifiersNode); - if (NonNegativeNumberNode<10>::mangledRepresentationStartsWith(PEEK())) - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(NonNegativeNumberNode<10>); - if (ADVANCE() != '_') - throw ParseException("Invalid function-param"); - } else if (parseState()->readAhead(2) == "fL") { - parseState()->advance(2); - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(NonNegativeNumberNode<10>); - if (ADVANCE() != 'p') - throw ParseException("Invalid function-param"); - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(CvQualifiersNode); - if (NonNegativeNumberNode<10>::mangledRepresentationStartsWith(PEEK())) - PARSE_RULE_AND_ADD_RESULT_AS_CHILD(NonNegativeNumberNode<10>); - if (ADVANCE() != '_') - throw ParseException("Invalid function-param"); - } else { - throw ParseException("Invalid function-param"); - } -} - -QByteArray FunctionParamNode::toByteArray() const -{ - // We ignore L for now. - const NonNegativeNumberNode<10>::Ptr numberNode - = MY_CHILD_AT(childCount() - 1).dynamicCast<NonNegativeNumberNode<10> >(); - const int paramNumber = numberNode ? numberNode->number() + 2 : 1; - const int cvIndex = MY_CHILD_AT(0).dynamicCast<CvQualifiersNode>() ? 0 : 1; - const CvQualifiersNode::Ptr cvNode = DEMANGLER_CAST(CvQualifiersNode, MY_CHILD_AT(cvIndex)); - QByteArray repr = "{param#" + QByteArray::number(paramNumber); - if (cvNode->hasQualifiers()) - repr.append(' ').append(cvNode->toByteArray()); - repr += '}'; - return repr; -} - -} // namespace Internal -} // namespace Debugger diff --git a/src/plugins/debugger/namedemangler/parsetreenodes.h b/src/plugins/debugger/namedemangler/parsetreenodes.h deleted file mode 100644 index fb746fc271..0000000000 --- a/src/plugins/debugger/namedemangler/parsetreenodes.h +++ /dev/null @@ -1,830 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt Creator. -** -** 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 General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** 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-3.0.html. -** -****************************************************************************/ - -#pragma once - -#include "globalparsestate.h" - -namespace Debugger { -namespace Internal { - -class ParseTreeNode -{ -public: - using Ptr = QSharedPointer<ParseTreeNode>; - - virtual ~ParseTreeNode(); - virtual QByteArray toByteArray() const = 0; - virtual ParseTreeNode::Ptr clone() const = 0; - - int childCount() const { return m_children.count(); } - void addChild(ParseTreeNode::Ptr childNode) { m_children << childNode; } - ParseTreeNode::Ptr childAt(int i, const QString &func, const QString &file, int line) const; - QByteArray pasteAllChildren() const; - - void print(int indentation) const; // For debugging. - - template <typename T> static Ptr parseRule(GlobalParseState *parseState) - { - const Ptr node = Ptr(new T(parseState)); - parseState->pushToStack(node); - parseState->stackTop()->parse(); - return node; - } - -protected: - ParseTreeNode(GlobalParseState *parseState) : m_parseState(parseState) {} - ParseTreeNode(const ParseTreeNode &other); - QByteArray bool2String(bool b) const; - - GlobalParseState *parseState() const { return m_parseState; } - -private: - virtual void parse() = 0; - virtual QByteArray description() const = 0; // For debugging. - - QList<ParseTreeNode::Ptr > m_children; // Convention: Children are inserted in parse order. - GlobalParseState * const m_parseState; -}; - -class ArrayTypeNode : public ParseTreeNode -{ -public: - ArrayTypeNode(GlobalParseState *parseState) : ParseTreeNode(parseState) {} - - static bool mangledRepresentationStartsWith(char c); - - QByteArray toByteArray() const override; - -private: - ArrayTypeNode(const ArrayTypeNode &other) = default; - ParseTreeNode::Ptr clone() const override { return Ptr(new ArrayTypeNode(*this)); } - - void parse() override; - QByteArray description() const override { return "ArrayType"; } -}; - -class BareFunctionTypeNode : public ParseTreeNode -{ -public: - using Ptr = QSharedPointer<BareFunctionTypeNode>; - BareFunctionTypeNode(GlobalParseState *parseState); - static bool mangledRepresentationStartsWith(char c); - bool hasReturnType() const { return m_hasReturnType; } - QByteArray toByteArray() const override; - -private: - BareFunctionTypeNode(const BareFunctionTypeNode &other); - ParseTreeNode::Ptr clone() const override { return Ptr(new BareFunctionTypeNode(*this)); } - void parse() override; - QByteArray description() const override; - - bool m_hasReturnType = false; -}; - -class BuiltinTypeNode : public ParseTreeNode -{ -public: - using Ptr = QSharedPointer<BuiltinTypeNode>; - BuiltinTypeNode(GlobalParseState *parseState) : ParseTreeNode(parseState) {} - static bool mangledRepresentationStartsWith(char c); - QByteArray toByteArray() const override; - - enum Type { - VoidType, WCharType, BoolType, - PlainCharType, SignedCharType, UnsignedCharType, SignedShortType, UnsignedShortType, - SignedIntType, UnsignedIntType, SignedLongType, UnsignedLongType, - SignedLongLongType, UnsignedLongLongType, SignedInt128Type, UnsignedInt128Type, - FloatType, DoubleType, LongDoubleType, Float128Type, EllipsisType, - DecimalFloatingType64, DecimalFloatingType128, DecimalFloatingType32, - DecimalFloatingType16, Char32Type, Char16Type, AutoType, NullPtrType, VendorType - }; - Type type() const { return m_type; } - -private: - BuiltinTypeNode(const BuiltinTypeNode &other); - ParseTreeNode::Ptr clone() const override { return Ptr(new BuiltinTypeNode(*this)); } - void parse() override; - QByteArray description() const override; - - Type m_type; // TODO: define? -}; - -class CallOffsetRule -{ -public: - static bool mangledRepresentationStartsWith(char c); - static void parse(GlobalParseState *parseState); - -private: - CallOffsetRule(); -}; - -class NvOffsetNode : public ParseTreeNode -{ -public: - NvOffsetNode(GlobalParseState *parseState) : ParseTreeNode(parseState) {} - QByteArray toByteArray() const override { return QByteArray(); } // TODO: How to encode this? - -private: - NvOffsetNode(const NvOffsetNode &other) = default; - ParseTreeNode::Ptr clone() const override { return Ptr(new NvOffsetNode(*this)); } - void parse() override; - QByteArray description() const override { return "NvOffset"; } -}; - -class VOffsetNode : public ParseTreeNode -{ -public: - VOffsetNode(GlobalParseState *parseState) : ParseTreeNode(parseState) {} - QByteArray toByteArray() const override { return QByteArray(); } // TODO: How to encode this? - -private: - VOffsetNode(const VOffsetNode &other) = default; - ParseTreeNode::Ptr clone() const override { return Ptr(new VOffsetNode(*this)); } - void parse() override; - QByteArray description() const override { return "VOffset"; } -}; - -class ClassEnumTypeRule -{ -public: - static bool mangledRepresentationStartsWith(char c); - static void parse(GlobalParseState *parseState); - -private: - ClassEnumTypeRule(); -}; - -class DiscriminatorRule -{ -public: - static bool mangledRepresentationStartsWith(char c); - static void parse(GlobalParseState *parseState); - -private: - DiscriminatorRule(); -}; - -class CtorDtorNameNode : public ParseTreeNode -{ -public: - CtorDtorNameNode(GlobalParseState *parseState) : ParseTreeNode(parseState) {} - static bool mangledRepresentationStartsWith(char c); - QByteArray toByteArray() const override; - -private: - CtorDtorNameNode(const CtorDtorNameNode &other); - ParseTreeNode::Ptr clone() const override { return Ptr(new CtorDtorNameNode(*this)); } - void parse() override; - QByteArray description() const override; - - bool m_isDestructor; // TODO: define? - QByteArray m_representation; -}; - -class CvQualifiersNode : public ParseTreeNode -{ -public: - using Ptr = QSharedPointer<CvQualifiersNode>; - CvQualifiersNode(GlobalParseState *parseState); - static bool mangledRepresentationStartsWith(char c); - bool hasQualifiers() const { return m_hasConst || m_hasVolatile; } - QByteArray toByteArray() const override; -private: - CvQualifiersNode(const CvQualifiersNode &other); - ParseTreeNode::Ptr clone() const override { return Ptr(new CvQualifiersNode(*this)); } - void parse() override; - QByteArray description() const override { return "CvQualifiers[" + toByteArray() + ']'; } - - bool m_hasConst = false; - bool m_hasVolatile = false; -}; - -class EncodingNode : public ParseTreeNode -{ -public: - EncodingNode(GlobalParseState *parseState) : ParseTreeNode(parseState) {} - static bool mangledRepresentationStartsWith(char c); - QByteArray toByteArray() const override; - -private: - EncodingNode(const EncodingNode &other) = default; - ParseTreeNode::Ptr clone() const override { return Ptr(new EncodingNode(*this)); } - void parse() override; - QByteArray description() const override { return "Encoding"; } -}; - -class ExpressionNode : public ParseTreeNode -{ -public: - ExpressionNode(GlobalParseState *parseState); - static bool mangledRepresentationStartsWith(char c); - QByteArray toByteArray() const override; - -private: - ExpressionNode(const ExpressionNode &other); - ParseTreeNode::Ptr clone() const override { return Ptr(new ExpressionNode(*this)); } - void parse() override; - QByteArray description() const override; - - enum Type { - ConversionType, SizeofType, AlignofType, OperatorType, ParameterPackSizeType, - NewType, ArrayNewType, DeleteType, ArrayDeleteType, PrefixIncrementType, - PrefixDecrementType, TypeIdTypeType, TypeIdExpressionType, DynamicCastType, - StaticCastType, ConstCastType, ReinterpretCastType, MemberAccessType, - PointerMemberAccessType, MemberDerefType, PackExpansionType, ThrowType, - RethrowType, OtherType - } m_type; // TODO: define? - bool m_globalNamespace = false; -}; - -class OperatorNameNode : public ParseTreeNode -{ -public: - using Ptr = QSharedPointer<OperatorNameNode>; - OperatorNameNode(GlobalParseState *parseState) : ParseTreeNode(parseState) {} - static bool mangledRepresentationStartsWith(char c); - - enum Type { - NewType, ArrayNewType, DeleteType, ArrayDeleteType, UnaryPlusType, UnaryMinusType, - UnaryAmpersandType, UnaryStarType, BitwiseNotType, BinaryPlusType, BinaryMinusType, - MultType, DivType, ModuloType, BitwiseAndType, BitwiseOrType, XorType, AssignType, - IncrementAndAssignType, DecrementAndAssignType, MultAndAssignType, DivAndAssignType, - ModuloAndAssignType, BitwiseAndAndAssignType, BitwiseOrAndAssignType, XorAndAssignType, - LeftShiftType, RightShiftType, LeftShiftAndAssignType, RightShiftAndAssignType, EqualsType, - NotEqualsType, LessType, GreaterType, LessEqualType, GreaterEqualType, LogicalNotType, - LogicalAndType, LogicalOrType, IncrementType, DecrementType, CommaType, ArrowStarType, - ArrowType, CallType, IndexType, TernaryType, SizeofTypeType, SizeofExprType, - AlignofTypeType, AlignofExprType, CastType, VendorType - }; - Type type() const { return m_type; } - - QByteArray toByteArray() const override; - -private: - OperatorNameNode(const OperatorNameNode &other); - ParseTreeNode::Ptr clone() const override { return Ptr(new OperatorNameNode(*this)); } - void parse() override; - QByteArray description() const override; - - Type m_type = VendorType; -}; - -class ExprPrimaryNode : public ParseTreeNode -{ -public: - ExprPrimaryNode(GlobalParseState *parseState); - static bool mangledRepresentationStartsWith(char c); - - QByteArray toByteArray() const override; - -private: - ExprPrimaryNode(const ExprPrimaryNode &other); - ParseTreeNode::Ptr clone() const override { return Ptr(new ExprPrimaryNode(*this)); } - void parse() override; - QByteArray description() const override; - - QByteArray m_suffix; - bool m_isNullPtr = false; -}; - -class FunctionTypeNode : public ParseTreeNode -{ -public: - using Ptr = QSharedPointer<FunctionTypeNode>; - FunctionTypeNode(GlobalParseState *parseState); - static bool mangledRepresentationStartsWith(char c); - bool isExternC() const { return m_isExternC; } - QByteArray toByteArray() const override; - -private: - FunctionTypeNode(const FunctionTypeNode &other); - ParseTreeNode::Ptr clone() const override { return Ptr(new FunctionTypeNode(*this)); } - void parse() override; - QByteArray description() const override; - - bool m_isExternC = false; -}; - -class LocalNameNode : public ParseTreeNode -{ -public: - using Ptr = QSharedPointer<LocalNameNode>; - LocalNameNode(GlobalParseState *parseState); - static bool mangledRepresentationStartsWith(char c); - QByteArray toByteArray() const override; - bool isTemplate() const; - bool isConstructorOrDestructorOrConversionOperator() const; - CvQualifiersNode::Ptr cvQualifiers() const; - -private: - LocalNameNode(const LocalNameNode &other); - ParseTreeNode::Ptr clone() const override { return Ptr(new LocalNameNode(*this)); } - void parse() override; - QByteArray description() const override; - - bool m_isStringLiteral = false; - bool m_isDefaultArg = false; -}; - -class MangledNameRule -{ -public: - static bool mangledRepresentationStartsWith(char c); - static void parse(GlobalParseState *parseState, const ParseTreeNode::Ptr &parentNode); - -private: - MangledNameRule(); -}; - -class NumberNode : public ParseTreeNode -{ -public: - NumberNode(GlobalParseState *parseState); - static bool mangledRepresentationStartsWith(char c); - QByteArray toByteArray() const override; - -private: - NumberNode(const NumberNode &other); - ParseTreeNode::Ptr clone() const override { return Ptr(new NumberNode(*this)); } - void parse() override; - QByteArray description() const override; - - bool m_isNegative = false; -}; - -class SourceNameNode : public ParseTreeNode -{ -public: - SourceNameNode(GlobalParseState *parseState) : ParseTreeNode(parseState) {} - static bool mangledRepresentationStartsWith(char c); - QByteArray toByteArray() const override { return m_name; } - -private: - SourceNameNode(const SourceNameNode &other); - ParseTreeNode::Ptr clone() const override { return Ptr(new SourceNameNode(*this)); } - void parse() override; - QByteArray description() const override; - - QByteArray m_name; -}; - -class UnqualifiedNameNode : public ParseTreeNode -{ -public: - using Ptr = QSharedPointer<UnqualifiedNameNode>; - UnqualifiedNameNode(GlobalParseState *parseState) : ParseTreeNode(parseState) {} - static bool mangledRepresentationStartsWith(char c); - bool isConstructorOrDestructorOrConversionOperator() const; - QByteArray toByteArray() const override; - -private: - UnqualifiedNameNode(const UnqualifiedNameNode &other) = default; - ParseTreeNode::Ptr clone() const override { return Ptr(new UnqualifiedNameNode(*this)); } - void parse() override; - QByteArray description() const override { return "UnqualifiedName"; } -}; - -class UnscopedNameNode : public ParseTreeNode -{ -public: - UnscopedNameNode(GlobalParseState *parseState); - static bool mangledRepresentationStartsWith(char c); - bool isConstructorOrDestructorOrConversionOperator() const; - QByteArray toByteArray() const override; - -private: - UnscopedNameNode(const UnscopedNameNode &other); - ParseTreeNode::Ptr clone() const override { return Ptr(new UnscopedNameNode(*this)); } - void parse() override; - QByteArray description() const override; - - bool m_inStdNamespace = false; -}; - -class NestedNameNode : public ParseTreeNode -{ -public: - using Ptr = QSharedPointer<NestedNameNode>; - NestedNameNode(GlobalParseState *parseState) : ParseTreeNode(parseState ){} - - static bool mangledRepresentationStartsWith(char c); - - bool isTemplate() const; - bool isConstructorOrDestructorOrConversionOperator() const; - CvQualifiersNode::Ptr cvQualifiers() const; - - QByteArray toByteArray() const override; - -private: - NestedNameNode(const NestedNameNode &other) = default; - ParseTreeNode::Ptr clone() const override { return Ptr(new NestedNameNode(*this)); } - void parse() override; - QByteArray description() const override { return "NestedName"; } -}; - -class SubstitutionNode : public ParseTreeNode -{ -public: - using Ptr = QSharedPointer<SubstitutionNode>; - SubstitutionNode(GlobalParseState *parseState) : ParseTreeNode(parseState) {} - static bool mangledRepresentationStartsWith(char c); - QByteArray toByteArray() const override; - - enum Type { - ActualSubstitutionType, StdType, StdAllocType, StdBasicStringType, FullStdBasicStringType, - StdBasicIStreamType, StdBasicOStreamType, StdBasicIoStreamType - }; - Type type() const { return m_type; } - -private: - SubstitutionNode(const SubstitutionNode &other); - ParseTreeNode::Ptr clone() const override { return Ptr(new SubstitutionNode(*this)); } - void parse() override; - QByteArray description() const override; - - Type m_type; // TODO: define? -}; - -class PointerToMemberTypeNode : public ParseTreeNode -{ -public: - PointerToMemberTypeNode(GlobalParseState *parseState) : ParseTreeNode(parseState) {} - static bool mangledRepresentationStartsWith(char c); - QByteArray toByteArray() const override; - -private: - PointerToMemberTypeNode(const PointerToMemberTypeNode &other) = default; - ParseTreeNode::Ptr clone() const override { return Ptr(new PointerToMemberTypeNode(*this)); } - void parse() override; - QByteArray description() const override { return "PointerToMember"; } -}; - -class TemplateParamNode : public ParseTreeNode -{ -public: - using Ptr = QSharedPointer<TemplateParamNode>; - - TemplateParamNode(GlobalParseState *parseState) : ParseTreeNode(parseState) {} - - static bool mangledRepresentationStartsWith(char c); - - int index() const { return m_index; } - - QByteArray toByteArray() const override; - -private: - TemplateParamNode(const TemplateParamNode &other); - ParseTreeNode::Ptr clone() const override { return Ptr(new TemplateParamNode(*this)); } - void parse() override; - QByteArray description() const override; - - int m_index; // TODO: define? -}; - -class TemplateArgsNode : public ParseTreeNode -{ -public: - TemplateArgsNode(GlobalParseState *parseState) : ParseTreeNode(parseState) {} - static bool mangledRepresentationStartsWith(char c); - QByteArray toByteArray() const override; - -private: - TemplateArgsNode(const TemplateArgsNode &other) = default; - ParseTreeNode::Ptr clone() const override { return Ptr(new TemplateArgsNode(*this)); } - void parse() override; - QByteArray description() const override { return "TemplateArgs"; } -}; - -class SpecialNameNode : public ParseTreeNode -{ -public: - SpecialNameNode(GlobalParseState *parseState) : ParseTreeNode(parseState) {} - static bool mangledRepresentationStartsWith(char c); - QByteArray toByteArray() const override; - -private: - SpecialNameNode(const SpecialNameNode &other); - ParseTreeNode::Ptr clone() const override { return Ptr(new SpecialNameNode(*this)); } - void parse() override; - QByteArray description() const override; - - enum Type { - VirtualTableType, VttStructType, TypeInfoType, TypeInfoNameType, GuardVarType, - SingleCallOffsetType, DoubleCallOffsetType - } m_type; // TODO: define? -}; - -template<int base> class NonNegativeNumberNode : public ParseTreeNode -{ -public: - using Ptr = QSharedPointer<NonNegativeNumberNode<base> >; - NonNegativeNumberNode(GlobalParseState *parseState) : ParseTreeNode(parseState) {} - static bool mangledRepresentationStartsWith(char c) { - // Base can only be 10 or 36. - return (c >= '0' && c <= '9') || (base == 36 && c >= 'A' && c <= 'Z'); - } - quint64 number() const { return m_number; } - QByteArray toByteArray() const override; - -private: - NonNegativeNumberNode(const NonNegativeNumberNode &other); - ParseTreeNode::Ptr clone() const override { return Ptr(new NonNegativeNumberNode<base>(*this)); } - void parse() override; - QByteArray description() const override; - - quint64 m_number; // TODO: define? -}; - -class NameNode : public ParseTreeNode -{ -public: - using Ptr = QSharedPointer<NameNode>; - - NameNode(GlobalParseState *parseState) : ParseTreeNode(parseState) {} - - static bool mangledRepresentationStartsWith(char c); - - bool isTemplate() const; - bool isConstructorOrDestructorOrConversionOperator() const; - CvQualifiersNode::Ptr cvQualifiers() const; - - QByteArray toByteArray() const override; - -private: - NameNode(const NameNode &other) = default; - ParseTreeNode::Ptr clone() const override { return Ptr(new NameNode(*this)); } - void parse() override; - QByteArray description() const override { return "Name"; } -}; - -class TemplateArgNode : public ParseTreeNode -{ -public: - TemplateArgNode(GlobalParseState *parseState); - static bool mangledRepresentationStartsWith(char c); - QByteArray toByteArray() const override; - -private: - TemplateArgNode(const TemplateArgNode &other); - ParseTreeNode::Ptr clone() const override { return Ptr(new TemplateArgNode(*this)); } - void parse() override; - QByteArray description() const override; - - bool m_isTemplateArgumentPack = false; -}; - -class PrefixNode : public ParseTreeNode -{ -public: - using Ptr = QSharedPointer<PrefixNode>; - PrefixNode(GlobalParseState *parseState) : ParseTreeNode(parseState) {} - - static bool mangledRepresentationStartsWith(char c); - - bool isTemplate() const; - bool isConstructorOrDestructorOrConversionOperator() const; - - QByteArray toByteArray() const override; - -private: - PrefixNode(const PrefixNode &other) = default; - ParseTreeNode::Ptr clone() const override { return Ptr(new PrefixNode(*this)); } - void parse() override; - QByteArray description() const override { return "Prefix"; } -}; - -class TypeNode : public ParseTreeNode -{ -public: - using Ptr = QSharedPointer<TypeNode>; - - TypeNode(GlobalParseState *parseState) : ParseTreeNode(parseState) {} - - static bool mangledRepresentationStartsWith(char c); - - enum Type { - QualifiedType, PointerType, ReferenceType, RValueType, VendorType, PackExpansionType, - SubstitutionType, OtherType - }; - Type type() const { return m_type; } - - QByteArray toByteArray() const override; - -private: - TypeNode(const TypeNode &other); - ParseTreeNode::Ptr clone() const override { return Ptr(new TypeNode(*this)); } - void parse() override; - QByteArray description() const override; - - QByteArray toByteArrayQualPointerRef(const TypeNode *typeNode, - const QByteArray &qualPtrRef) const; - QByteArray qualPtrRefListToByteArray(const QList<const ParseTreeNode *> &nodeList) const; - - Type m_type = OtherType; -}; - -class FloatValueNode : public ParseTreeNode -{ -public: - FloatValueNode(GlobalParseState *parseState) : ParseTreeNode(parseState) {} - static bool mangledRepresentationStartsWith(char c); - QByteArray toByteArray() const override; - -private: - FloatValueNode(const FloatValueNode &other); - ParseTreeNode::Ptr clone() const override { return Ptr(new FloatValueNode(*this)); } - void parse() override; - QByteArray description() const override; - - double m_value; // TODO: define? -}; - -class LambdaSigNode : public ParseTreeNode -{ -public: - LambdaSigNode(GlobalParseState *parseState) : ParseTreeNode(parseState) {} - static bool mangledRepresentationStartsWith(char c); - QByteArray toByteArray() const override; - -private: - LambdaSigNode(const LambdaSigNode &other) = default; - ParseTreeNode::Ptr clone() const override { return Ptr(new LambdaSigNode(*this)); } - void parse() override; - QByteArray description() const override { return "LambdaSig"; } -}; - -class ClosureTypeNameNode : public ParseTreeNode -{ -public: - ClosureTypeNameNode(GlobalParseState *parseState) : ParseTreeNode(parseState) {} - QByteArray toByteArray() const override; - -private: - ClosureTypeNameNode(const ClosureTypeNameNode &other) = default; - ParseTreeNode::Ptr clone() const override { return Ptr(new ClosureTypeNameNode(*this)); } - void parse() override; - QByteArray description() const override { return "ClosureType"; } -}; - -class UnnamedTypeNameNode : public ParseTreeNode -{ -public: - UnnamedTypeNameNode(GlobalParseState *parseState) : ParseTreeNode(parseState) {} - static bool mangledRepresentationStartsWith(char c); - QByteArray toByteArray() const override; - -private: - UnnamedTypeNameNode(const UnnamedTypeNameNode &other) = default; - ParseTreeNode::Ptr clone() const override { return Ptr(new UnnamedTypeNameNode(*this)); } - void parse() override; - QByteArray description() const override { return "UnnnamedType"; } -}; - -class DeclTypeNode : public ParseTreeNode -{ -public: - DeclTypeNode(GlobalParseState *parseState) : ParseTreeNode(parseState) {} - static bool mangledRepresentationStartsWith(char c); - QByteArray toByteArray() const override; - -private: - DeclTypeNode(const DeclTypeNode &other) = default; - ParseTreeNode::Ptr clone() const override { return Ptr(new DeclTypeNode(*this)); } - void parse() override; - QByteArray description() const override { return "DeclType"; } -}; - -class UnresolvedTypeRule -{ -public: - static bool mangledRepresentationStartsWith(char c); - static void parse(GlobalParseState *parseState); - -private: - UnresolvedTypeRule(); -}; - -class SimpleIdNode : public ParseTreeNode -{ -public: - SimpleIdNode(GlobalParseState *parseState) : ParseTreeNode(parseState) {} - static bool mangledRepresentationStartsWith(char c); - QByteArray toByteArray() const override; - -private: - SimpleIdNode(const SimpleIdNode &other) = default; - ParseTreeNode::Ptr clone() const override { return Ptr(new SimpleIdNode(*this)); } - void parse() override; - QByteArray description() const override { return "SimpleId"; } -}; - -class DestructorNameNode : public ParseTreeNode -{ -public: - DestructorNameNode(GlobalParseState *parseState) : ParseTreeNode(parseState) {} - static bool mangledRepresentationStartsWith(char c); - QByteArray toByteArray() const override; - -private: - DestructorNameNode(const DestructorNameNode &other) = default; - ParseTreeNode::Ptr clone() const override { return Ptr(new DestructorNameNode(*this)); } - void parse() override; - QByteArray description() const override { return "DesctuctorName"; } -}; - -class UnresolvedQualifierLevelRule -{ -public: - static bool mangledRepresentationStartsWith(char c); - static void parse(GlobalParseState *parseState); - -private: - UnresolvedQualifierLevelRule(); -}; - -class BaseUnresolvedNameNode : public ParseTreeNode -{ -public: - BaseUnresolvedNameNode(GlobalParseState *parseState); - static bool mangledRepresentationStartsWith(char c); - QByteArray toByteArray() const override; - -private: - BaseUnresolvedNameNode(const BaseUnresolvedNameNode &other); - ParseTreeNode::Ptr clone() const override { return Ptr(new BaseUnresolvedNameNode(*this)); } - void parse() override; - QByteArray description() const override; - - bool m_isOperator = false; -}; - -class InitializerNode : public ParseTreeNode -{ -public: - InitializerNode(GlobalParseState *parseState) : ParseTreeNode(parseState) {} - static bool mangledRepresentationStartsWith(char c); - QByteArray toByteArray() const override; - -private: - InitializerNode(const InitializerNode &other) = default; - ParseTreeNode::Ptr clone() const override { return Ptr(new InitializerNode(*this)); } - void parse() override; - QByteArray description() const override { return "Initializer"; } -}; - -class UnresolvedNameNode : public ParseTreeNode -{ -public: - UnresolvedNameNode(GlobalParseState *parseState) : ParseTreeNode(parseState) {} - static bool mangledRepresentationStartsWith(char c); - QByteArray toByteArray() const override; - -private: - UnresolvedNameNode(const UnresolvedNameNode &other); - ParseTreeNode::Ptr clone() const override { return Ptr(new UnresolvedNameNode(*this)); } - void parse() override; - QByteArray description() const override; - - bool m_globalNamespace; // TODO: define? -}; - -class FunctionParamNode : public ParseTreeNode -{ -public: - FunctionParamNode(GlobalParseState *parseState) : ParseTreeNode(parseState) {} - static bool mangledRepresentationStartsWith(char c); - QByteArray toByteArray() const override; - -private: - FunctionParamNode(const FunctionParamNode &other) = default; - ParseTreeNode::Ptr clone() const override { return Ptr(new FunctionParamNode(*this)); } - void parse() override; - QByteArray description() const override { return "FunctionParam"; } -}; - -} // namespace Internal -} // namespace Debugger diff --git a/src/plugins/debugger/qml/qmlengine.cpp b/src/plugins/debugger/qml/qmlengine.cpp index a3d2fa9098..cf6e067a6c 100644 --- a/src/plugins/debugger/qml/qmlengine.cpp +++ b/src/plugins/debugger/qml/qmlengine.cpp @@ -570,7 +570,6 @@ void QmlEngine::shutdownEngine() stopApplicationLauncher(); notifyEngineShutdownFinished(); - showMessage(QString(), StatusBar); } void QmlEngine::setupEngine() diff --git a/src/plugins/fakevim/fakevimhandler.cpp b/src/plugins/fakevim/fakevimhandler.cpp index 66ebe44a46..0af3938b79 100644 --- a/src/plugins/fakevim/fakevimhandler.cpp +++ b/src/plugins/fakevim/fakevimhandler.cpp @@ -278,6 +278,23 @@ QDebug operator<<(QDebug ts, const CursorPosition &pos) return ts << "(line: " << pos.line << ", column: " << pos.column << ")"; } +// vi style configuration +static QVariant config(int code) +{ + return theFakeVimSetting(code)->value(); +} + +static bool hasConfig(int code) +{ + return config(code).toBool(); +} + +static bool hasConfig(int code, const QString &value) +{ + return config(code).toString().contains(value); +} + + class Mark { public: @@ -387,7 +404,7 @@ static bool eatString(const QString &prefix, QString *str) return true; } -static QRegularExpression vimPatternToQtPattern(QString needle, bool ignoreCaseOption, bool smartCaseOption) +static QRegularExpression vimPatternToQtPattern(const QString &needle) { /* Transformations (Vim regexp -> QRegularExpression): * \a -> [A-Za-z] @@ -418,9 +435,15 @@ static QRegularExpression vimPatternToQtPattern(QString needle, bool ignoreCaseO * \c - set ignorecase for rest * \C - set noignorecase for rest */ + // FIXME: Option smartcase should be used only if search was typed by user. - bool ignorecase = ignoreCaseOption + const bool ignoreCaseOption = hasConfig(ConfigIgnoreCase); + const bool smartCaseOption = hasConfig(ConfigSmartCase); + const bool initialIgnoreCase = ignoreCaseOption && !(smartCaseOption && needle.contains(QRegularExpression("[A-Z]"))); + + bool ignorecase = initialIgnoreCase; + QString pattern; pattern.reserve(2 * needle.size()); @@ -429,7 +452,7 @@ static QRegularExpression vimPatternToQtPattern(QString needle, bool ignoreCaseO bool embraced = false; bool range = false; bool curly = false; - foreach (const QChar &c, needle) { + for (const QChar &c : needle) { if (brace) { brace = false; if (c == ']') { @@ -530,7 +553,8 @@ static QRegularExpression vimPatternToQtPattern(QString needle, bool ignoreCaseO else if (brace) pattern.append('['); - return QRegularExpression(pattern); + return QRegularExpression(pattern, initialIgnoreCase ? QRegularExpression::CaseInsensitiveOption + : QRegularExpression::NoPatternOption); } static bool afterEndOfLine(const QTextDocument *doc, int position) @@ -544,17 +568,21 @@ static void searchForward(QTextCursor *tc, const QRegularExpression &needleExp, const QTextDocument *doc = tc->document(); const int startPos = tc->position(); + QTextDocument::FindFlags flags = {}; + if (!(needleExp.patternOptions() & QRegularExpression::CaseInsensitiveOption)) + flags |= QTextDocument::FindCaseSensitively; + // Search from beginning of line so that matched text is the same. tc->movePosition(StartOfLine); // forward to current position - *tc = doc->find(needleExp, *tc); + *tc = doc->find(needleExp, *tc, flags); while (!tc->isNull() && tc->anchor() < startPos) { if (!tc->hasSelection()) tc->movePosition(Right); if (tc->atBlockEnd()) tc->movePosition(NextBlock); - *tc = doc->find(needleExp, *tc); + *tc = doc->find(needleExp, *tc, flags); } if (tc->isNull()) @@ -567,7 +595,7 @@ static void searchForward(QTextCursor *tc, const QRegularExpression &needleExp, tc->movePosition(Right); if (tc->atBlockEnd()) tc->movePosition(NextBlock); - *tc = doc->find(needleExp, *tc); + *tc = doc->find(needleExp, *tc, flags); if (tc->isNull()) return; --*repeat; @@ -2117,12 +2145,6 @@ public: CursorPosition markLessPosition() const { return mark('<').position(document()); } CursorPosition markGreaterPosition() const { return mark('>').position(document()); } - // vi style configuration - QVariant config(int code) const { return theFakeVimSetting(code)->value(); } - bool hasConfig(int code) const { return config(code).toBool(); } - bool hasConfig(int code, const QString &value) const - { return config(code).toString().contains(value); } - int m_targetColumn; // -1 if past end of line int m_visualTargetColumn; // 'l' can move past eol in visual mode only int m_targetColumnWrapped; // column in current part of wrapped line @@ -5559,9 +5581,7 @@ bool FakeVimHandler::Private::handleExSubstituteCommand(const ExCommand &cmd) if (g.lastSubstituteFlags.contains('i')) needle.prepend("\\c"); - const QRegularExpression pattern = vimPatternToQtPattern(needle, - hasConfig(ConfigIgnoreCase), - hasConfig(ConfigSmartCase)); + const QRegularExpression pattern = vimPatternToQtPattern(needle); QTextBlock lastBlock; QTextBlock firstBlock; @@ -6355,9 +6375,8 @@ void FakeVimHandler::Private::searchBalanced(bool forward, QChar needle, QChar o QTextCursor FakeVimHandler::Private::search(const SearchData &sd, int startPos, int count, bool showMessages) { - const QRegularExpression needleExp = vimPatternToQtPattern(sd.needle, - hasConfig(ConfigIgnoreCase), - hasConfig(ConfigSmartCase)); + const QRegularExpression needleExp = vimPatternToQtPattern(sd.needle); + if (!needleExp.isValid()) { if (showMessages) { QString error = needleExp.errorString(); diff --git a/src/plugins/git/gitclient.cpp b/src/plugins/git/gitclient.cpp index 08168b5cba..4773e148df 100644 --- a/src/plugins/git/gitclient.cpp +++ b/src/plugins/git/gitclient.cpp @@ -1448,10 +1448,13 @@ bool GitClient::synchronousLog(const QString &workingDirectory, const QStringLis } } -bool GitClient::synchronousAdd(const QString &workingDirectory, const QStringList &files) +bool GitClient::synchronousAdd(const QString &workingDirectory, + const QStringList &files, + const QStringList &extraOptions) { - return vcsFullySynchronousExec(workingDirectory, QStringList({"add"}) + files).result - == SynchronousProcessResponse::Finished; + QStringList args{"add"}; + args += extraOptions + files; + return vcsFullySynchronousExec(workingDirectory, args).result == SynchronousProcessResponse::Finished; } bool GitClient::synchronousDelete(const QString &workingDirectory, @@ -2899,7 +2902,7 @@ bool GitClient::addAndCommit(const QString &repositoryDirectory, filesToReset.removeAll(file); filesToAdd.append(file); } else if (state == AddedFile && checked) { - QTC_ASSERT(false, continue); // these should be untracked! + filesToAdd.append(file); } else if (state == DeletedFile && checked) { filesToReset.removeAll(file); filesToRemove.append(file); @@ -3598,7 +3601,7 @@ void GitClient::StashInfo::stashPrompt(const QString &command, const QString &st QString *errorMessage) { QMessageBox msgBox(QMessageBox::Question, tr("Uncommitted Changes Found"), - tr("What would you like to do with local changes in:") + "\n\n" + tr("What would you like to do with local changes in:") + "\n\n\"" + QDir::toNativeSeparators(m_workingDir) + '\"', QMessageBox::NoButton, ICore::dialogParent()); diff --git a/src/plugins/git/gitclient.h b/src/plugins/git/gitclient.h index b35e11e678..293f6f4a27 100644 --- a/src/plugins/git/gitclient.h +++ b/src/plugins/git/gitclient.h @@ -185,7 +185,8 @@ public: bool synchronousLog(const QString &workingDirectory, const QStringList &arguments, QString *output, QString *errorMessage = nullptr, unsigned flags = 0); - bool synchronousAdd(const QString &workingDirectory, const QStringList &files); + bool synchronousAdd(const QString &workingDirectory, const QStringList &files, + const QStringList &extraOptions = {}); bool synchronousDelete(const QString &workingDirectory, bool force, const QStringList &files); diff --git a/src/plugins/git/gitplugin.cpp b/src/plugins/git/gitplugin.cpp index 434c4ca3e1..9da466b6dc 100644 --- a/src/plugins/git/gitplugin.cpp +++ b/src/plugins/git/gitplugin.cpp @@ -1872,7 +1872,7 @@ bool GitPluginPrivate::vcsOpen(const QString & /*fileName*/) bool GitPluginPrivate::vcsAdd(const QString &fileName) { const QFileInfo fi(fileName); - return m_gitClient.synchronousAdd(fi.absolutePath(), {fi.fileName()}); + return m_gitClient.synchronousAdd(fi.absolutePath(), {fi.fileName()}, {"--intent-to-add"}); } bool GitPluginPrivate::vcsDelete(const QString &fileName) diff --git a/src/plugins/help/docsettingspage.cpp b/src/plugins/help/docsettingspage.cpp index 447f17fca3..b4299e6df8 100644 --- a/src/plugins/help/docsettingspage.cpp +++ b/src/plugins/help/docsettingspage.cpp @@ -55,7 +55,7 @@ public: QString nameSpace; }; -static bool operator<(const DocEntry &d1, const DocEntry &d2) +bool operator<(const DocEntry &d1, const DocEntry &d2) { return d1.name < d2.name; } class DocModel : public QAbstractListModel diff --git a/src/plugins/ios/iosdevice.cpp b/src/plugins/ios/iosdevice.cpp index d6a6cb2274..d53550c2e4 100644 --- a/src/plugins/ios/iosdevice.cpp +++ b/src/plugins/ios/iosdevice.cpp @@ -24,18 +24,21 @@ ****************************************************************************/ #include "iosdevice.h" -#include "iossimulator.h" -#include "iosconstants.h" #include "iosconfigurations.h" +#include "iosconstants.h" +#include "iossimulator.h" #include "iostoolhandler.h" +#include <coreplugin/helpmanager.h> #include <projectexplorer/devicesupport/devicemanager.h> +#include <projectexplorer/devicesupport/idevicewidget.h> #include <projectexplorer/kitinformation.h> -#include <coreplugin/helpmanager.h> #include <utils/portlist.h> +#include <QFormLayout> +#include <QLabel> +#include <QMessageBox> #include <QVariant> #include <QVariantMap> -#include <QMessageBox> #ifdef Q_OS_MAC #include <IOKit/IOKitLib.h> @@ -57,6 +60,9 @@ using namespace ProjectExplorer; +static const char kDeviceName[] = "deviceName"; +static const char kUniqueDeviceId[] = "uniqueDeviceId"; + namespace { static Q_LOGGING_CATEGORY(detectLog, "qtc.ios.deviceDetect", QtWarningMsg) } @@ -87,6 +93,14 @@ static QString CFStringRef2QString(CFStringRef s) namespace Ios { namespace Internal { +class IosDeviceInfoWidget : public IDeviceWidget +{ +public: + IosDeviceInfoWidget(const ProjectExplorer::IDevice::Ptr &device); + + void updateDeviceFromUi() {} +}; + IosDevice::IosDevice(CtorHelper) : m_lastPort(Constants::IOS_DEVICE_PORT_START) { @@ -128,7 +142,7 @@ IDevice::DeviceInfo IosDevice::deviceInformation() const IDeviceWidget *IosDevice::createWidget() { - return nullptr; + return new IosDeviceInfoWidget(sharedFromThis()); } DeviceProcessSignalOperation::Ptr IosDevice::signalOperation() const @@ -156,11 +170,21 @@ QVariantMap IosDevice::toMap() const return res; } +QString IosDevice::deviceName() const +{ + return m_extraInfo.value(kDeviceName); +} + QString IosDevice::uniqueDeviceID() const { return id().suffixAfter(Utils::Id(Constants::IOS_DEVICE_ID)); } +QString IosDevice::uniqueInternalDeviceId() const +{ + return m_extraInfo.value(kUniqueDeviceId); +} + QString IosDevice::name() { return QCoreApplication::translate("Ios::Internal::IosDevice", "iOS Device"); @@ -171,6 +195,11 @@ QString IosDevice::osVersion() const return m_extraInfo.value(QLatin1String("osVersion")); } +QString IosDevice::cpuArchitecture() const +{ + return m_extraInfo.value("cpuArchitecture"); +} + Utils::Port IosDevice::nextPort() const { // use qrand instead? @@ -193,7 +222,7 @@ IosDeviceManager::TranslationMap IosDeviceManager::translationMap() if (translationMap) return *translationMap; TranslationMap &tMap = *new TranslationMap; - tMap[QLatin1String("deviceName")] = tr("Device name"); + tMap[kDeviceName] = tr("Device name"); //: Whether the device is in developer mode. tMap[QLatin1String("developerStatus")] = tr("Developer status"); tMap[QLatin1String("deviceConnected")] = tr("Connected"); @@ -243,7 +272,7 @@ void IosDeviceManager::deviceDisconnected(const QString &uid) } else { auto iosDev = static_cast<const IosDevice *>(dev.data()); if (iosDev->m_extraInfo.isEmpty() - || iosDev->m_extraInfo.value(QLatin1String("deviceName")) == QLatin1String("*unknown*")) { + || iosDev->m_extraInfo.value(kDeviceName) == QLatin1String("*unknown*")) { devManager->removeDevice(iosDev->id()); } else if (iosDev->deviceState() != IDevice::DeviceDisconnected) { qCDebug(detectLog) << "disconnecting device " << iosDev->uniqueDeviceID(); @@ -285,9 +314,8 @@ void IosDeviceManager::deviceInfo(IosToolHandler *, const QString &uid, newDev = new IosDevice(uid); } if (!skipUpdate) { - QString devNameKey = QLatin1String("deviceName"); - if (info.contains(devNameKey)) - newDev->setDisplayName(info.value(devNameKey)); + if (info.contains(kDeviceName)) + newDev->setDisplayName(info.value(kDeviceName)); newDev->m_extraInfo = info; qCDebug(detectLog) << "updated info of ios device " << uid; dev = IDevice::ConstPtr(newDev); @@ -546,11 +574,24 @@ IosDeviceFactory::IosDeviceFactory() bool IosDeviceFactory::canRestore(const QVariantMap &map) const { QVariantMap vMap = map.value(QLatin1String(Constants::EXTRA_INFO_KEY)).toMap(); - if (vMap.isEmpty() - || vMap.value(QLatin1String("deviceName")).toString() == QLatin1String("*unknown*")) + if (vMap.isEmpty() || vMap.value(kDeviceName).toString() == QLatin1String("*unknown*")) return false; // transient device (probably generated during an activation) return true; } +IosDeviceInfoWidget::IosDeviceInfoWidget(const IDevice::Ptr &device) + : IDeviceWidget(device) +{ + const auto iosDevice = qSharedPointerCast<IosDevice>(device); + const auto formLayout = new QFormLayout(this); + formLayout->setContentsMargins(0, 0, 0, 0); + setLayout(formLayout); + formLayout->setFieldGrowthPolicy(QFormLayout::ExpandingFieldsGrow); + formLayout->addRow(IosDevice::tr("Device name:"), new QLabel(iosDevice->deviceName())); + formLayout->addRow(IosDevice::tr("Identifier:"), new QLabel(iosDevice->uniqueInternalDeviceId())); + formLayout->addRow(IosDevice::tr("OS Version:"), new QLabel(iosDevice->osVersion())); + formLayout->addRow(IosDevice::tr("CPU Architecture:"), new QLabel(iosDevice->cpuArchitecture())); +} + } // namespace Internal } // namespace Ios diff --git a/src/plugins/ios/iosdevice.h b/src/plugins/ios/iosdevice.h index 533a319f32..80674de526 100644 --- a/src/plugins/ios/iosdevice.h +++ b/src/plugins/ios/iosdevice.h @@ -57,8 +57,11 @@ public: void fromMap(const QVariantMap &map) override; QVariantMap toMap() const override; + QString deviceName() const; QString uniqueDeviceID() const; + QString uniqueInternalDeviceId() const; QString osVersion() const; + QString cpuArchitecture() const; Utils::Port nextPort() const; bool canAutoDetectPorts() const override; diff --git a/src/plugins/ios/iosrunner.cpp b/src/plugins/ios/iosrunner.cpp index b422723a95..e7fcf05d0f 100644 --- a/src/plugins/ios/iosrunner.cpp +++ b/src/plugins/ios/iosrunner.cpp @@ -436,28 +436,26 @@ void IosDebugSupport::start() IosDevice::ConstPtr dev = device().dynamicCast<const IosDevice>(); setStartMode(AttachToRemoteProcess); setIosPlatform("remote-ios"); - QString osVersion = dev->osVersion(); - FilePath deviceSdk1 = FilePath::fromString(QDir::homePath() - + "/Library/Developer/Xcode/iOS DeviceSupport/" - + osVersion + "/Symbols"); - QString deviceSdk; - if (deviceSdk1.isDir()) { - deviceSdk = deviceSdk1.toString(); - } else { - const FilePath deviceSdk2 = IosConfigurations::developerPath() - .pathAppended("Platforms/iPhoneOS.platform/DeviceSupport/" - + osVersion + "/Symbols"); - if (deviceSdk2.isDir()) { - deviceSdk = deviceSdk2.toString(); - } else { - TaskHub::addTask(DeploymentTask(Task::Warning, tr( - "Could not find device specific debug symbols at %1. " - "Debugging initialization will be slow until you open the Organizer window of " - "Xcode with the device connected to have the symbols generated.") - .arg(deviceSdk1.toUserOutput()))); - } + const QString osVersion = dev->osVersion(); + const QString cpuArchitecture = dev->cpuArchitecture(); + const FilePaths symbolsPathCandidates = { + FilePath::fromString(QDir::homePath() + "/Library/Developer/Xcode/iOS DeviceSupport/" + + osVersion + " " + cpuArchitecture + "/Symbols"), + FilePath::fromString(QDir::homePath() + "/Library/Developer/Xcode/iOS DeviceSupport/" + + osVersion + "/Symbols"), + IosConfigurations::developerPath().pathAppended( + "Platforms/iPhoneOS.platform/DeviceSupport/" + osVersion + "/Symbols")}; + const FilePath deviceSdk = Utils::findOrDefault(symbolsPathCandidates, &FilePath::isDir); + + if (deviceSdk.isEmpty()) { + TaskHub::addTask(DeploymentTask( + Task::Warning, + tr("Could not find device specific debug symbols at %1. " + "Debugging initialization will be slow until you open the Organizer window of " + "Xcode with the device connected to have the symbols generated.") + .arg(symbolsPathCandidates.constFirst().toUserOutput()))); } - setDeviceSymbolsRoot(deviceSdk); + setDeviceSymbolsRoot(deviceSdk.toString()); } else { setStartMode(AttachExternal); setIosPlatform("ios-simulator"); diff --git a/src/plugins/languageclient/client.cpp b/src/plugins/languageclient/client.cpp index 82dc7e494e..fe6c18fa66 100644 --- a/src/plugins/languageclient/client.cpp +++ b/src/plugins/languageclient/client.cpp @@ -1149,7 +1149,7 @@ void Client::sendPostponedDocumentUpdates() sendContent(DidChangeTextDocumentNotification(params)); emit documentUpdated(document); - if (currentWidget->textDocument() == document) + if (currentWidget && currentWidget->textDocument() == document) cursorPositionChanged(currentWidget); } } diff --git a/src/plugins/languageclient/languageclientsymbolsupport.cpp b/src/plugins/languageclient/languageclientsymbolsupport.cpp index efd019c2ea..8dc5f7bd51 100644 --- a/src/plugins/languageclient/languageclientsymbolsupport.cpp +++ b/src/plugins/languageclient/languageclientsymbolsupport.cpp @@ -139,23 +139,40 @@ struct ItemData QVariant userData; }; +static QStringList getFileContents(const QString &filePath) +{ + QString fileContent; + if (TextEditor::TextDocument *document = TextEditor::TextDocument::textDocumentForFilePath( + Utils::FilePath::fromString(filePath))) { + fileContent = document->plainText(); + } else { + Utils::TextFileFormat format; + format.lineTerminationMode = Utils::TextFileFormat::LFLineTerminator; + QString error; + const QTextCodec *codec = Core::EditorManager::defaultTextCodec(); + if (Utils::TextFileFormat::readFile(filePath, codec, &fileContent, &format, &error) + != Utils::TextFileFormat::ReadSuccess) { + qDebug() << "Failed to read file" << filePath << ":" << error; + } + } + return fileContent.split("\n"); +} + QList<Core::SearchResultItem> generateSearchResultItems( const QMap<QString, QList<ItemData>> &rangesInDocument) { QList<Core::SearchResultItem> result; for (auto it = rangesInDocument.begin(); it != rangesInDocument.end(); ++it) { const QString &fileName = it.key(); - QFile file(fileName); - file.open(QFile::ReadOnly); Core::SearchResultItem item; item.path = QStringList() << fileName; item.useTextEditorFont = true; - QStringList lines = QString::fromLocal8Bit(file.readAll()).split(QChar::LineFeed); + QStringList lines = getFileContents(fileName); for (const ItemData &data : it.value()) { item.mainRange = data.range; - if (file.isOpen() && data.range.begin.line > 0 && data.range.begin.line <= lines.size()) + if (data.range.begin.line > 0 && data.range.begin.line <= lines.size()) item.text = lines[data.range.begin.line - 1]; else item.text.clear(); diff --git a/src/plugins/mesonprojectmanager/settings/general/generalsettingspage.h b/src/plugins/mesonprojectmanager/settings/general/generalsettingspage.h index 8b086e70f4..bbcbe67990 100644 --- a/src/plugins/mesonprojectmanager/settings/general/generalsettingspage.h +++ b/src/plugins/mesonprojectmanager/settings/general/generalsettingspage.h @@ -27,11 +27,15 @@ #include <coreplugin/dialogs/ioptionspage.h> +#include <QCoreApplication> + namespace MesonProjectManager { namespace Internal { class MesonTools; class GeneralSettingsPage final : public Core::IOptionsPage { + Q_DECLARE_TR_FUNCTIONS(MesonProjectManager::Internal::GeneralSettingsPage) + public: GeneralSettingsPage(); void saveAll(); diff --git a/src/plugins/mesonprojectmanager/settings/tools/kitaspect/mesontoolkitaspect.h b/src/plugins/mesonprojectmanager/settings/tools/kitaspect/mesontoolkitaspect.h index ea2bd8fc8b..a35bdc083c 100644 --- a/src/plugins/mesonprojectmanager/settings/tools/kitaspect/mesontoolkitaspect.h +++ b/src/plugins/mesonprojectmanager/settings/tools/kitaspect/mesontoolkitaspect.h @@ -33,6 +33,8 @@ namespace MesonProjectManager { namespace Internal { class MesonToolKitAspect final : public ProjectExplorer::KitAspect { + Q_DECLARE_TR_FUNCTIONS(MesonProjectManager::Internal::MesonToolKitAspect) + public: MesonToolKitAspect(); diff --git a/src/plugins/mesonprojectmanager/settings/tools/kitaspect/ninjatoolkitaspect.h b/src/plugins/mesonprojectmanager/settings/tools/kitaspect/ninjatoolkitaspect.h index 64c10c6a9b..91863212ef 100644 --- a/src/plugins/mesonprojectmanager/settings/tools/kitaspect/ninjatoolkitaspect.h +++ b/src/plugins/mesonprojectmanager/settings/tools/kitaspect/ninjatoolkitaspect.h @@ -33,6 +33,8 @@ namespace MesonProjectManager { namespace Internal { class NinjaToolKitAspect final : public ProjectExplorer::KitAspect { + Q_DECLARE_TR_FUNCTIONS(MesonProjectManager::Internal::NinjaToolKitAspect) + public: NinjaToolKitAspect(); diff --git a/src/plugins/mesonprojectmanager/settings/tools/toolssettingspage.h b/src/plugins/mesonprojectmanager/settings/tools/toolssettingspage.h index 66f2d3bf70..8550f5dbd4 100644 --- a/src/plugins/mesonprojectmanager/settings/tools/toolssettingspage.h +++ b/src/plugins/mesonprojectmanager/settings/tools/toolssettingspage.h @@ -27,11 +27,15 @@ #include <coreplugin/dialogs/ioptionspage.h> +#include <QCoreApplication> + namespace MesonProjectManager { namespace Internal { class MesonTools; class ToolsSettingsPage final : public Core::IOptionsPage { + Q_DECLARE_TR_FUNCTIONS(MesonProjectManager::Internal::ToolsSettingsPage) + public: ToolsSettingsPage(); }; diff --git a/src/plugins/projectexplorer/customparserconfigdialog.cpp b/src/plugins/projectexplorer/customparserconfigdialog.cpp index 5584ae480a..f67cd25b9d 100644 --- a/src/plugins/projectexplorer/customparserconfigdialog.cpp +++ b/src/plugins/projectexplorer/customparserconfigdialog.cpp @@ -278,7 +278,8 @@ bool CustomParserConfigDialog::checkPattern(QLineEdit *pattern, const QString &o pattern->setPalette(palette); pattern->setToolTip(rx.isValid() ? QString() : rx.errorString()); - *match = rx.match(outputText); + if (rx.isValid()) + *match = rx.match(outputText); if (rx.pattern().isEmpty() || !rx.isValid() || !match->hasMatch()) { *errorMessage = QString::fromLatin1("<font color=\"%1\">%2 ").arg( Utils::creatorTheme()->color(Utils::Theme::TextColorError).name(), diff --git a/src/plugins/projectexplorer/gccparser.cpp b/src/plugins/projectexplorer/gccparser.cpp index c4a36d1b15..3e40ed47dd 100644 --- a/src/plugins/projectexplorer/gccparser.cpp +++ b/src/plugins/projectexplorer/gccparser.cpp @@ -60,6 +60,10 @@ GccParser::GccParser() + FILE_PATTERN + "(\\d+)(:\\d+)?[,:]?$"); QTC_CHECK(m_regExpInlined.isValid()); + m_regExpCc1plus.setPattern(QLatin1Char('^') + "cc1plus.*(error|warning): ((?:" + + FILE_PATTERN + " No such file or directory)?.*)"); + QTC_CHECK(m_regExpCc1plus.isValid()); + // optional path with trailing slash // optional arm-linux-none-thingy // name of executable @@ -185,6 +189,18 @@ OutputLineParser::Result GccParser::handleLine(const QString &line, OutputFormat return {Status::InProgress, linkSpecs}; } + match = m_regExpCc1plus.match(lne); + if (match.hasMatch()) { + const Task::TaskType type = match.captured(1) == "error" ? Task::Error : Task::Warning; + const FilePath filePath = absoluteFilePath(FilePath::fromUserInput(match.captured(3))); + LinkSpecs linkSpecs; + if (!filePath.isEmpty()) + addLinkSpecForAbsoluteFilePath(linkSpecs, filePath, -1, match, 3); + createOrAmendTask(type, match.captured(2), lne, false, filePath, -1, linkSpecs); + flush(); + return {Status::Done, linkSpecs}; + } + match = m_regExp.match(lne); if (match.hasMatch()) { int lineno = match.captured(3).toInt(); @@ -233,6 +249,7 @@ bool GccParser::isContinuation(const QString &newLine) const return !m_currentTask.isNull() && (m_currentTask.details.last().endsWith(':') || m_currentTask.details.last().endsWith(',') + || m_currentTask.details.last().contains(" required from ") || newLine.contains("within this context") || newLine.contains("note:")); } @@ -1138,6 +1155,61 @@ void ProjectExplorerPlugin::testGccOutputParsers_data() " | ~~~~~~~~~~~~^~~", FilePath::fromUserInput("smallstring.h"), 465)} << QString(); + + QTest::newRow(R"("required from")") + << QString( + "In file included from qmap.h:1,\n" + " from qvariant.h:47,\n" + " from ilocatorfilter.h:33,\n" + " from helpindexfilter.h:28,\n" + " from moc_helpindexfilter.cpp:10:\n" + "qmap.h: In instantiation of ‘struct QMapNode<QString, QUrl>’:\n" + "qmap.h:606:30: required from ‘QMap<K, V>::QMap(const QMap<K, V>&) [with Key = QString; T = QUrl]’\n" + "qmap.h:1090:7: required from ‘static constexpr void (* QtPrivate::QMetaTypeForType<S>::getCopyCtr())(const QtPrivate::QMetaTypeInterface*, void*, const void*) [with T = QMultiMap<QString, QUrl>; S = QMultiMap<QString, QUrl>; QtPrivate::QMetaTypeInterface::CopyCtrFn = void (*)(const QtPrivate::QMetaTypeInterface*, void*, const void*)]’\n" + "qmetatype.h:2765:32: required from ‘QtPrivate::QMetaTypeInterface QtPrivate::QMetaTypeForType<QMultiMap<QString, QUrl> >::metaType’\n" + "qmetatype.h:2865:16: required from ‘constexpr QtPrivate::QMetaTypeInterface* QtPrivate::qTryMetaTypeInterfaceForType() [with Unique = qt_meta_stringdata_Help__Internal__HelpIndexFilter_t; T = const QMultiMap<QString, QUrl>&]’\n" + "qmetatype.h:2884:55: required from ‘QtPrivate::QMetaTypeInterface* const qt_incomplete_metaTypeArray [4]<qt_meta_stringdata_Help__Internal__HelpIndexFilter_t, void, const QMultiMap<QString, QUrl>&, const QString&, QStringList>’\n" + "moc_helpindexfilter.cpp:105:1: required from here\n" + "qmap.h:110:7: error: ‘QMapNode<Key, T>::value’ has incomplete type\n" + " 110 | T value;\n" + " | ^~~~~") + << OutputParserTester::STDERR + << QString() << QString() + << Tasks{CompileTask(Task::Error, + "‘QMapNode<Key, T>::value’ has incomplete type\n" + "In file included from qmap.h:1,\n" + " from qvariant.h:47,\n" + " from ilocatorfilter.h:33,\n" + " from helpindexfilter.h:28,\n" + " from moc_helpindexfilter.cpp:10:\n" + "qmap.h: In instantiation of ‘struct QMapNode<QString, QUrl>’:\n" + "qmap.h:606:30: required from ‘QMap<K, V>::QMap(const QMap<K, V>&) [with Key = QString; T = QUrl]’\n" + "qmap.h:1090:7: required from ‘static constexpr void (* QtPrivate::QMetaTypeForType<S>::getCopyCtr())(const QtPrivate::QMetaTypeInterface*, void*, const void*) [with T = QMultiMap<QString, QUrl>; S = QMultiMap<QString, QUrl>; QtPrivate::QMetaTypeInterface::CopyCtrFn = void (*)(const QtPrivate::QMetaTypeInterface*, void*, const void*)]’\n" + "qmetatype.h:2765:32: required from ‘QtPrivate::QMetaTypeInterface QtPrivate::QMetaTypeForType<QMultiMap<QString, QUrl> >::metaType’\n" + "qmetatype.h:2865:16: required from ‘constexpr QtPrivate::QMetaTypeInterface* QtPrivate::qTryMetaTypeInterfaceForType() [with Unique = qt_meta_stringdata_Help__Internal__HelpIndexFilter_t; T = const QMultiMap<QString, QUrl>&]’\n" + "qmetatype.h:2884:55: required from ‘QtPrivate::QMetaTypeInterface* const qt_incomplete_metaTypeArray [4]<qt_meta_stringdata_Help__Internal__HelpIndexFilter_t, void, const QMultiMap<QString, QUrl>&, const QString&, QStringList>’\n" + "moc_helpindexfilter.cpp:105:1: required from here\n" + "qmap.h:110:7: error: ‘QMapNode<Key, T>::value’ has incomplete type\n" + " 110 | T value;\n" + " | ^~~~~", + FilePath::fromUserInput("qmap.h"), 110)} + << QString(); + + QTest::newRow("cc1plus") + << QString( + "cc1plus: error: one or more PCH files were found, but they were invalid\n" + "cc1plus: error: use -Winvalid-pch for more information\n" + "cc1plus: fatal error: .pch/Qt6Core5Compat: No such file or directory\n" + "cc1plus: warning: -Wformat-security ignored without -Wformat [-Wformat-security]\n" + "compilation terminated.") + << OutputParserTester::STDERR + << QString() << QString("compilation terminated.\n") + << Tasks{ + CompileTask(Task::Error, "one or more PCH files were found, but they were invalid"), + CompileTask(Task::Error, "use -Winvalid-pch for more information"), + CompileTask(Task::Error, ".pch/Qt6Core5Compat: No such file or directory", FilePath::fromString(".pch/Qt6Core5Compat")), + CompileTask(Task::Warning, "-Wformat-security ignored without -Wformat [-Wformat-security]")} + << QString(); } void ProjectExplorerPlugin::testGccOutputParsers() diff --git a/src/plugins/projectexplorer/gccparser.h b/src/plugins/projectexplorer/gccparser.h index 4bff3a1520..1625c947f1 100644 --- a/src/plugins/projectexplorer/gccparser.h +++ b/src/plugins/projectexplorer/gccparser.h @@ -66,6 +66,7 @@ private: QRegularExpression m_regExpIncluded; QRegularExpression m_regExpInlined; QRegularExpression m_regExpGccNames; + QRegularExpression m_regExpCc1plus; Task m_currentTask; LinkSpecs m_linkSpecs; diff --git a/src/plugins/projectexplorer/projectexplorer.cpp b/src/plugins/projectexplorer/projectexplorer.cpp index 22ba895cc2..1926d931e0 100644 --- a/src/plugins/projectexplorer/projectexplorer.cpp +++ b/src/plugins/projectexplorer/projectexplorer.cpp @@ -3629,14 +3629,16 @@ void ProjectExplorerPluginPrivate::removeFile() const bool deleteFile = removeFileDialog.isDeleteFileChecked(); - const QMessageBox::StandardButton reply = QMessageBox::question( - Core::ICore::dialogParent(), tr("Remove More Files?"), - tr("Remove these files as well?\n %1") - .arg(Utils::transform<QStringList>(siblings, [](const NodeAndPath &np) { - return np.second.toFileInfo().fileName(); - }).join("\n "))); - if (reply == QMessageBox::Yes) - filesToRemove << siblings; + if (!siblings.isEmpty()) { + const QMessageBox::StandardButton reply = QMessageBox::question( + Core::ICore::dialogParent(), tr("Remove More Files?"), + tr("Remove these files as well?\n %1") + .arg(Utils::transform<QStringList>(siblings, [](const NodeAndPath &np) { + return np.second.toFileInfo().fileName(); + }).join("\n "))); + if (reply == QMessageBox::Yes) + filesToRemove << siblings; + } for (const NodeAndPath &file : filesToRemove) { // Nodes can become invalid if the project was re-parsed while the dialog was open @@ -3652,21 +3654,22 @@ void ProjectExplorerPluginPrivate::removeFile() FolderNode *folderNode = file.first->asFileNode()->parentFolderNode(); QTC_ASSERT(folderNode, return); + const Utils::FilePath ¤tFilePath = file.second; const RemovedFilesFromProject status - = folderNode->removeFiles(QStringList(file.second.toString())); + = folderNode->removeFiles(QStringList(currentFilePath.toString())); const bool success = status == RemovedFilesFromProject::Ok || (status == RemovedFilesFromProject::Wildcard && removeFileDialog.isDeleteFileChecked()); if (!success) { TaskHub::addTask(BuildSystemTask(Task::Error, tr("Could not remove file \"%1\" from project \"%2\".") - .arg(filePath.toUserOutput(), folderNode->managingProject()->displayName()), + .arg(currentFilePath.toUserOutput(), folderNode->managingProject()->displayName()), folderNode->managingProject()->filePath())); if (!deleteFile) continue; } - FileChangeBlocker changeGuard(filePath.toString()); - Core::FileUtils::removeFile(filePath.toString(), deleteFile); + FileChangeBlocker changeGuard(currentFilePath.toString()); + Core::FileUtils::removeFile(currentFilePath.toString(), deleteFile); } } diff --git a/src/plugins/projectexplorer/projectexplorerconstants.h b/src/plugins/projectexplorer/projectexplorerconstants.h index 08e8210610..3351bc039f 100644 --- a/src/plugins/projectexplorer/projectexplorerconstants.h +++ b/src/plugins/projectexplorer/projectexplorerconstants.h @@ -179,6 +179,13 @@ const char DESKTOP_DEVICE_TYPE[] = "Desktop"; const int DESKTOP_PORT_START = 30000; const int DESKTOP_PORT_END = 31000; +// Android ABIs +const char ANDROID_ABI_ARMEABI[] = "armeabi"; +const char ANDROID_ABI_ARMEABI_V7A[] = "armeabi-v7a"; +const char ANDROID_ABI_ARM64_V8A[] = "arm64-v8a"; +const char ANDROID_ABI_X86[] = "x86"; +const char ANDROID_ABI_X86_64[] = "x86_64"; + // Variable Names: const char VAR_CURRENTPROJECT_PREFIX[] = "CurrentProject"; const char VAR_CURRENTPROJECT_NAME[] = "CurrentProject:Name"; diff --git a/src/plugins/qmakeprojectmanager/profilecompletionassist.cpp b/src/plugins/qmakeprojectmanager/profilecompletionassist.cpp index 94f82eba97..ec405f67f7 100644 --- a/src/plugins/qmakeprojectmanager/profilecompletionassist.cpp +++ b/src/plugins/qmakeprojectmanager/profilecompletionassist.cpp @@ -208,6 +208,7 @@ const TextEditor::Keywords &QmakeProjectManager::Internal::qmakeKeywords() "QMAKE_RUN_CXX_IMP", "QMAKE_TARGET", "QMAKE_UIC", + "QOBJECT_REP", "QT", "QTPLUGIN", "QT_MAJOR_VERSION", @@ -216,6 +217,9 @@ const TextEditor::Keywords &QmakeProjectManager::Internal::qmakeKeywords() "QT_VERSION", "RCC_DIR", "RC_FILE", + "REPC_MERGED", + "REPC_REPLICA", + "REPC_SOURCE", "REQUIRES", "RESOURCES", "RES_FILE", diff --git a/src/plugins/qmakeprojectmanager/qmakenodes.cpp b/src/plugins/qmakeprojectmanager/qmakenodes.cpp index 06f9cb4502..ffc1942cc4 100644 --- a/src/plugins/qmakeprojectmanager/qmakenodes.cpp +++ b/src/plugins/qmakeprojectmanager/qmakenodes.cpp @@ -360,6 +360,8 @@ QStringList QmakeProFileNode::targetApplications() const QVariant QmakeProFileNode::data(Utils::Id role) const { + if (role == Android::Constants::ANDROID_ABIS) + return variableValue(Variable::AndroidAbis); if (role == Android::Constants::AndroidPackageSourceDir) return singleVariableValue(Variable::AndroidPackageSourceDir); if (role == Android::Constants::AndroidDeploySettingsFile) @@ -432,6 +434,8 @@ bool QmakeProFileNode::setData(Utils::Id role, const QVariant &value) const return pro->setProVariable("ANDROID_EXTRA_LIBS", value.toStringList(), scope, flags); if (role == Android::Constants::AndroidPackageSourceDir) return pro->setProVariable("ANDROID_PACKAGE_SOURCE_DIR", {value.toString()}, scope, flags); + if (role == Android::Constants::ANDROID_ABIS) + return pro->setProVariable("ANDROID_ABIS", {value.toStringList()}, scope, flags); return false; } diff --git a/src/plugins/qmakeprojectmanager/qmakeparsernodes.cpp b/src/plugins/qmakeprojectmanager/qmakeparsernodes.cpp index 15f2465c29..37c9103c6e 100644 --- a/src/plugins/qmakeprojectmanager/qmakeparsernodes.cpp +++ b/src/plugins/qmakeprojectmanager/qmakeparsernodes.cpp @@ -1589,6 +1589,7 @@ QmakeEvalResult *QmakeProFile::evaluate(const QmakeEvalInput &input) result->newVarValues[Variable::AndroidArch] = exactReader->values(QLatin1String("ANDROID_TARGET_ARCH")); result->newVarValues[Variable::AndroidDeploySettingsFile] = exactReader->values(QLatin1String("ANDROID_DEPLOYMENT_SETTINGS_FILE")); result->newVarValues[Variable::AndroidPackageSourceDir] = exactReader->values(QLatin1String("ANDROID_PACKAGE_SOURCE_DIR")); + result->newVarValues[Variable::AndroidAbis] = exactReader->values(QLatin1String("ANDROID_ABIS")); result->newVarValues[Variable::AndroidExtraLibs] = exactReader->values(QLatin1String("ANDROID_EXTRA_LIBS")); result->newVarValues[Variable::AppmanPackageDir] = exactReader->values(QLatin1String("AM_PACKAGE_DIR")); result->newVarValues[Variable::AppmanManifest] = exactReader->values(QLatin1String("AM_MANIFEST")); diff --git a/src/plugins/qmakeprojectmanager/qmakeparsernodes.h b/src/plugins/qmakeprojectmanager/qmakeparsernodes.h index 54331a82d7..28a92dce37 100644 --- a/src/plugins/qmakeprojectmanager/qmakeparsernodes.h +++ b/src/plugins/qmakeprojectmanager/qmakeparsernodes.h @@ -98,6 +98,7 @@ enum class Variable { ShLibExtension, AndroidArch, AndroidDeploySettingsFile, + AndroidAbis, AndroidPackageSourceDir, AndroidExtraLibs, AppmanPackageDir, diff --git a/src/plugins/qmakeprojectmanager/qmakeprojectmanagerplugin.cpp b/src/plugins/qmakeprojectmanager/qmakeprojectmanagerplugin.cpp index 7a896d4999..2659b22e9e 100644 --- a/src/plugins/qmakeprojectmanager/qmakeprojectmanagerplugin.cpp +++ b/src/plugins/qmakeprojectmanager/qmakeprojectmanagerplugin.cpp @@ -435,7 +435,7 @@ void QmakeProjectManagerPluginPrivate::runQMakeImpl(Project *p, Node *node) if (auto *profile = dynamic_cast<QmakeProFileNode *>(node)) bc->setSubNodeBuild(profile); - BuildManager::appendStep(qs, tr("QMake")); + BuildManager::appendStep(qs, QmakeProjectManagerPlugin::tr("QMake")); bc->setSubNodeBuild(nullptr); } diff --git a/src/plugins/qmakeprojectmanager/qmakestep.cpp b/src/plugins/qmakeprojectmanager/qmakestep.cpp index 376d5d81f8..66d193a3d1 100644 --- a/src/plugins/qmakeprojectmanager/qmakestep.cpp +++ b/src/plugins/qmakeprojectmanager/qmakestep.cpp @@ -34,6 +34,8 @@ #include "qmakeprojectmanagerconstants.h" #include "qmakesettings.h" +#include <android/androidconstants.h> + #include <projectexplorer/buildmanager.h> #include <projectexplorer/buildsteplist.h> #include <projectexplorer/gnumakeparser.h> @@ -664,8 +666,12 @@ void QMakeStepConfigWidget::abisChanged() break; } } - args << prefix + '"' + abis.join(' ') + '"'; + if (!abis.isEmpty()) + args << prefix + '"' + abis.join(' ') + '"'; m_step->setExtraArguments(args); + + const QString buildKey = m_step->target()->activeBuildKey(); + m_step->buildSystem()->setExtraData(buildKey, Android::Constants::ANDROID_ABIS, m_step->selectedAbis()); } updateSummaryLabel(); @@ -743,12 +749,12 @@ void QMakeStepConfigWidget::updateSummaryLabel() if (selectedAbis.isEmpty() && isAndroidKit()) { // Prefer ARM for Android, prefer 32bit. for (const Abi &abi : abis) { - if (abi.param() == "armeabi-v7a") + if (abi.param() == ProjectExplorer::Constants::ANDROID_ABI_ARMEABI_V7A) selectedAbis.append(abi.param()); } if (selectedAbis.isEmpty()) { for (const Abi &abi : abis) { - if (abi.param() == "arm64-v8a") + if (abi.param() == ProjectExplorer::Constants::ANDROID_ABI_ARM64_V8A) selectedAbis.append(abi.param()); } } diff --git a/src/plugins/qmldesigner/assetexporterplugin/filepathmodel.h b/src/plugins/qmldesigner/assetexporterplugin/filepathmodel.h index 91a800c036..0921e71864 100644 --- a/src/plugins/qmldesigner/assetexporterplugin/filepathmodel.h +++ b/src/plugins/qmldesigner/assetexporterplugin/filepathmodel.h @@ -38,6 +38,8 @@ class Project; namespace QmlDesigner { class FilePathModel : public QAbstractListModel { + Q_DECLARE_TR_FUNCTIONS(QmlDesigner::FilePathModel) + public: FilePathModel(ProjectExplorer::Project *project, QObject *parent = nullptr); ~FilePathModel() override; diff --git a/src/plugins/qmldesigner/components/componentcore/componentcore_constants.h b/src/plugins/qmldesigner/components/componentcore/componentcore_constants.h index a8db25f417..6186575e43 100644 --- a/src/plugins/qmldesigner/components/componentcore/componentcore_constants.h +++ b/src/plugins/qmldesigner/components/componentcore/componentcore_constants.h @@ -83,6 +83,7 @@ const char decreaseIndexOfStackedContainerCommandId[] = "DecreaseIndexOfStackedC const char flowAssignEffectCommandId[] = "AssignFlowEffect"; const char flowAssignCustomEffectCommandId[] = "AssignFlowCustomEffect"; const char addToGroupItemCommandId[] = "AddToGroupItem"; +const char removeGroupItemCommandId[] = "RemoveToGroupItem"; const char fitRootToScreenCommandId[] = "FitRootToScreen"; const char fitSelectionToScreenCommandId[] = "FitSelectionToScreen"; @@ -141,6 +142,8 @@ const char setFlowStartDisplayName[] = QT_TRANSLATE_NOOP("QmlDesignerContextMenu const char removeLayoutDisplayName[] = QT_TRANSLATE_NOOP("QmlDesignerContextMenu", "Remove Layout"); const char addToGroupItemDisplayName[] = QT_TRANSLATE_NOOP("QmlDesignerContextMenu", "Group in GroupItem"); +const char removeGroupItemDisplayName[] = QT_TRANSLATE_NOOP("QmlDesignerContextMenu", + "Remove GroupItem"); const char addItemToStackedContainerDisplayName[] = QT_TRANSLATE_NOOP("QmlDesignerContextMenu", "Add Item"); const char addTabBarToStackedContainerDisplayName[] = QT_TRANSLATE_NOOP("QmlDesignerContextMenu", "Add Tab Bar"); @@ -157,9 +160,6 @@ const char layoutFillHeightDisplayName[] = QT_TRANSLATE_NOOP("QmlDesignerContext const char flowAssignEffectDisplayName[] = "Assign FlowEffect "; const char flowAssignCustomEffectDisplayName[] = "Assign Custom FlowEffect "; -const char fitRootToScreenDisplayName[] = QT_TRANSLATE_NOOP("QmlDesignerContextMenu", "Fit root to screen"); -const char fitSelectionToScreenDisplayName[] = QT_TRANSLATE_NOOP("QmlDesignerContextMenu", "Fit selection to screen"); - const char raiseToolTip[] = QT_TRANSLATE_NOOP("QmlDesignerContextMenu", "Raise selected item."); const char lowerToolTip[] = QT_TRANSLATE_NOOP("QmlDesignerContextMenu", "Lower selected item."); @@ -178,9 +178,6 @@ const char decreaseIndexOfStackedContainerToolTip[] = QT_TRANSLATE_NOOP("QmlDesi const char addItemToStackedContainerToolTip[] = QT_TRANSLATE_NOOP("QmlDesignerContextMenu", "Add item to stacked container."); const char addFlowActionToolTip[] = QT_TRANSLATE_NOOP("QmlDesignerContextMenu", "Add flow action."); -const char fitRootToScreenToolTip[] = QT_TRANSLATE_NOOP("QmlDesignerContextMenu", "Fit the root element inside the available space."); -const char fitSelectionToScreenToolTip[] = QT_TRANSLATE_NOOP("QmlDesignerContextMenu", "Fit the selected elements inside the available space."); - const char editListModelDisplayName[] = QT_TRANSLATE_NOOP("QmlDesignerContextMenu", "Edit List Model..."); diff --git a/src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp b/src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp index 73abc4ea29..cbc987651a 100644 --- a/src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp +++ b/src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp @@ -660,6 +660,27 @@ bool isStackedContainerAndIndexCanBeIncreased(const SelectionContext &context) return value < maxValue; } +bool isGroup(const SelectionContext &context) +{ + if (!inBaseState(context)) + return false; + + if (!singleSelection(context)) + return false; + + ModelNode currentSelectedNode = context.currentSingleSelectedNode(); + + if (!currentSelectedNode.isValid()) + return false; + + NodeMetaInfo metaInfo = currentSelectedNode.metaInfo(); + + if (!metaInfo.isValid()) + return false; + + return metaInfo.isSubclassOf("QtQuick.Studio.Components.GroupItem"); +} + bool isLayout(const SelectionContext &context) { if (!inBaseState(context)) @@ -883,27 +904,6 @@ void DesignerActionManager::createDefaultDesignerActions() &resetSize, &selectionNotEmptyAndHasWidthOrHeightProperty)); - addDesignerAction(new ModelNodeAction( - fitRootToScreenCommandId, - fitRootToScreenDisplayName, - Utils::Icon({{":/utils/images/fittoview.png", Utils::Theme::IconsBaseColor}}).icon(), - fitRootToScreenToolTip, - genericToolBarCategory, - QKeySequence(Qt::CTRL + Qt::ALT + Qt::Key_0), - 182, - &fitRootToScreen)); - - addDesignerAction(new ModelNodeAction( - fitSelectionToScreenCommandId, - fitSelectionToScreenDisplayName, - Utils::Icon({{":/utils/images/fittoview.png", Utils::Theme::IconsBaseColor}}).icon(), - fitSelectionToScreenToolTip, - genericToolBarCategory, - QKeySequence(Qt::CTRL + Qt::ALT + Qt::Key_I), - 183, - &fitSelectionToScreen, - &selectionNotEmpty)); - addDesignerAction(new SeperatorDesignerAction(editCategory, 170)); addDesignerAction(new VisiblityModelNodeAction( @@ -958,12 +958,10 @@ void DesignerActionManager::createDefaultDesignerActions() priorityLayoutCategory, &layoutOptionVisible)); - addDesignerAction(new ActionGroup( - groupCategoryDisplayName, - groupCategory, - priorityGroupCategory, - &positionOptionVisible, - &studioComponentsAvailable)); + addDesignerAction(new ActionGroup(groupCategoryDisplayName, + groupCategory, + priorityGroupCategory, + &studioComponentsAvailable)); addDesignerAction(new ActionGroup( flowCategoryDisplayName, @@ -1106,29 +1104,34 @@ void DesignerActionManager::createDefaultDesignerActions() &isLayout, &isLayout)); - addDesignerAction(new ModelNodeContextMenuAction( - addToGroupItemCommandId, - addToGroupItemDisplayName, - {}, - groupCategory, - QKeySequence(), - 110, - &addToGroupItem, - &selectionCanBeLayouted, - &selectionCanBeLayouted)); - - - addDesignerAction(new ModelNodeFormEditorAction( - addItemToStackedContainerCommandId, - addItemToStackedContainerDisplayName, - addIcon.icon(), - addItemToStackedContainerToolTip, - stackedContainerCategory, - QKeySequence("Ctrl+Shift+a"), - 110, - &addItemToStackedContainer, - &isStackedContainer, - &isStackedContainer)); + addDesignerAction(new ModelNodeContextMenuAction(addToGroupItemCommandId, + addToGroupItemDisplayName, + {}, + groupCategory, + QKeySequence("Ctrl+Shift+g"), + 110, + &addToGroupItem, + &selectionCanBeLayouted)); + + addDesignerAction(new ModelNodeContextMenuAction(removeGroupItemCommandId, + removeGroupItemDisplayName, + {}, + groupCategory, + QKeySequence(), + 110, + &removeGroup, + &isGroup)); + + addDesignerAction(new ModelNodeFormEditorAction(addItemToStackedContainerCommandId, + addItemToStackedContainerDisplayName, + addIcon.icon(), + addItemToStackedContainerToolTip, + stackedContainerCategory, + QKeySequence("Ctrl+Shift+a"), + 110, + &addItemToStackedContainer, + &isStackedContainer, + &isStackedContainer)); addDesignerAction(new ModelNodeContextMenuAction( addTabBarToStackedContainerCommandId, diff --git a/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.cpp b/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.cpp index da77f26af7..7453807a83 100644 --- a/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.cpp +++ b/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.cpp @@ -329,23 +329,6 @@ void resetPosition(const SelectionContext &selectionState) }); } -void fitRootToScreen(const SelectionContext &selectionState) -{ - if (!selectionState.view()) - return; - - selectionState.view()->emitCustomNotification(QStringLiteral("fit root to screen")); -} - -void fitSelectionToScreen(const SelectionContext &selectionState) -{ - if (!selectionState.view()) - return; - - selectionState.view()->emitCustomNotification(QStringLiteral("fit selection to screen"), - selectionState.selectedModelNodes()); -} - void goIntoComponentOperation(const SelectionContext &selectionState) { goIntoComponent(selectionState.currentSingleSelectedNode()); @@ -1499,6 +1482,42 @@ void mergeWithTemplate(const SelectionContext &selectionContext) styleMerge(selectionContext, templateFile); } -} // namespace Mode +void removeGroup(const SelectionContext &selectionContext) +{ + if (!selectionContext.view() || !selectionContext.hasSingleSelectedModelNode()) + return; + + ModelNode group = selectionContext.currentSingleSelectedNode(); + + if (!QmlItemNode::isValidQmlItemNode(group)) + return; + + QmlItemNode groupItem(group); + + QmlItemNode parent = groupItem.instanceParentItem(); + + if (!parent.isValid()) + return; + + selectionContext.view()->executeInTransaction( + "DesignerActionManager::removeGroup", [selectionContext, &groupItem, parent]() { + for (const ModelNode &modelNode : + selectionContext.currentSingleSelectedNode().directSubModelNodes()) { + if (modelNode.isValid()) { + QmlItemNode qmlItem(modelNode); + + QPointF pos = qmlItem.instancePosition(); + pos = groupItem.instanceTransform().map(pos); + modelNode.variantProperty("x").setValue(pos.x()); + modelNode.variantProperty("y").setValue(pos.y()); + + parent.modelNode().defaultNodeListProperty().reparentHere(modelNode); + } + } + groupItem.destroy(); + }); +} + +} // namespace ModelNodeOperations } //QmlDesigner diff --git a/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.h b/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.h index 0a8e094a7e..96dedf352a 100644 --- a/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.h +++ b/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.h @@ -49,8 +49,6 @@ void setFillWidth(const SelectionContext &selectionState); void setFillHeight(const SelectionContext &selectionState); void resetSize(const SelectionContext &selectionState); void resetPosition(const SelectionContext &selectionState); -void fitRootToScreen(const SelectionContext &selectionState); -void fitSelectionToScreen(const SelectionContext &selectionState); void goIntoComponentOperation(const SelectionContext &selectionState); void setId(const SelectionContext &selectionState); void resetZ(const SelectionContext &selectionState); @@ -84,6 +82,7 @@ void setFlowStartItem(const SelectionContext &selectionContext); void addToGroupItem(const SelectionContext &selectionContext); void selectFlowEffect(const SelectionContext &selectionContext); void mergeWithTemplate(const SelectionContext &selectionContext); +void removeGroup(const SelectionContext &selectionContext); } // namespace ModelNodeOperationso } //QmlDesigner diff --git a/src/plugins/qmldesigner/components/componentcore/theme.h b/src/plugins/qmldesigner/components/componentcore/theme.h index 4cc4deb298..880a1d05ca 100644 --- a/src/plugins/qmldesigner/components/componentcore/theme.h +++ b/src/plugins/qmldesigner/components/componentcore/theme.h @@ -66,19 +66,21 @@ public: alignRight, alignTo, alignTop, - assign, anchorBaseline, anchorBottom, anchorFill, anchorLeft, anchorRight, anchorTop, + animatedProperty, annotationBubble, annotationDecal, + assign, centerHorizontal, centerVertical, - curveEditor, closeCross, + curveDesigner, + curveEditor, decisionNode, deleteColumn, deleteRow, @@ -101,6 +103,8 @@ public: fontStyleItalic, fontStyleStrikethrough, fontStyleUnderline, + idAliasOff, + idAliasOn, mergeCells, redo, splitColumns, @@ -121,7 +125,11 @@ public: undo, upDownIcon, upDownSquare2, - wildcard + wildcard, + zoomAll, + zoomIn, + zoomOut, + zoomSelection }; static Theme *instance(); diff --git a/src/plugins/qmldesigner/components/componentcore/zoomaction.cpp b/src/plugins/qmldesigner/components/componentcore/zoomaction.cpp index 4f1d1c3da9..c59c1ffe83 100644 --- a/src/plugins/qmldesigner/components/componentcore/zoomaction.cpp +++ b/src/plugins/qmldesigner/components/componentcore/zoomaction.cpp @@ -47,14 +47,14 @@ float ZoomAction::zoomLevel() const void ZoomAction::zoomIn() { - if (m_currentComboBoxIndex > 0) - emit indexChanged(m_currentComboBoxIndex - 1); + if (m_currentComboBoxIndex < (m_comboBoxModel->rowCount() - 1)) + emit indexChanged(m_currentComboBoxIndex + 1); } void ZoomAction::zoomOut() { - if (m_currentComboBoxIndex < (m_comboBoxModel->rowCount() - 1)) - emit indexChanged(m_currentComboBoxIndex + 1); + if (m_currentComboBoxIndex > 0) + emit indexChanged(m_currentComboBoxIndex - 1); } void ZoomAction::resetZoomLevel() diff --git a/src/plugins/qmldesigner/components/connectioneditor/connectionmodel.cpp b/src/plugins/qmldesigner/components/connectioneditor/connectionmodel.cpp index 2a17c2ec6d..4bafa04647 100644 --- a/src/plugins/qmldesigner/components/connectioneditor/connectionmodel.cpp +++ b/src/plugins/qmldesigner/components/connectioneditor/connectionmodel.cpp @@ -34,6 +34,8 @@ #include <exception.h> #include <nodemetainfo.h> #include <nodelistproperty.h> +#include <rewriterview.h> +#include <nodemetainfo.h> #include <QStandardItemModel> #include <QMessageBox> @@ -209,10 +211,27 @@ void ConnectionModel::updateTargetNode(int rowNumber) ModelNode connectionNode = signalHandlerProperty.parentModelNode(); const bool isAlias = newTarget.contains("."); + bool isSingleton = false; + + if (RewriterView* rv = connectionView()->rewriterView()) { + for (const QmlTypeData &data : rv->getQMLTypes()) { + if (!data.typeName.isEmpty()) { + if (data.typeName == newTarget) { + if (connectionView()->model()->metaInfo(data.typeName.toUtf8()).isValid()) { + isSingleton = true; + break; + } + } + } + } + } if (!newTarget.isEmpty()) { - //if it's an alias, then let's reparent connections to alias property owner: - const ModelNode parent = connectionView()->modelNodeForId(isAlias + //if it's a singleton, then let's reparent connections to rootNode, + //if it's an alias, then reparent to alias property owner: + const ModelNode parent = connectionView()->modelNodeForId(isSingleton + ? connectionView()->rootModelNode().id() + : isAlias ? newTarget.split(".").constFirst() : newTarget); @@ -430,6 +449,28 @@ QStringList ConnectionModel::getPossibleSignalsForConnection(const ModelNode &co QStringList stringList; if (connection.isValid()) { + + //separate check for singletons + if (connection.hasBindingProperty("target")) { + BindingProperty bp = connection.bindingProperty("target"); + + if (bp.isValid()) { + if (RewriterView *rv = connectionView()->rewriterView()) { + for (const QmlTypeData &data : rv->getQMLTypes()) { + if (!data.typeName.isEmpty()) { + if (data.typeName == bp.expression()) { + NodeMetaInfo metaInfo = connectionView()->model()->metaInfo(data.typeName.toUtf8()); + if (metaInfo.isValid()) { + stringList.append(propertyNameListToStringList(metaInfo.signalNames())); + return stringList; + } + } + } + } + } + } + } + ModelNode targetNode = getTargetNodeForConnection(connection); if (targetNode.isValid() && targetNode.metaInfo().isValid()) { stringList.append(propertyNameListToStringList(targetNode.metaInfo().signalNames())); diff --git a/src/plugins/qmldesigner/components/connectioneditor/delegates.cpp b/src/plugins/qmldesigner/components/connectioneditor/delegates.cpp index 37232d202e..864404047e 100644 --- a/src/plugins/qmldesigner/components/connectioneditor/delegates.cpp +++ b/src/plugins/qmldesigner/components/connectioneditor/delegates.cpp @@ -30,6 +30,7 @@ #include "bindingmodel.h" #include "dynamicpropertiesmodel.h" #include "connectionview.h" +#include "nodemetainfo.h" #include <bindingproperty.h> @@ -152,11 +153,13 @@ QWidget *BindingDelegate::createEditor(QWidget *parent, const QStyleOptionViewIt bindingComboBox->addItems(model->possibleTargetProperties(bindingProperty)); } break; case BindingModel::SourceModelNodeRow: { + //common items for (const ModelNode &modelNode : model->connectionView()->allModelNodes()) { if (!modelNode.id().isEmpty()) { bindingComboBox->addItem(modelNode.id()); } } + //singletons: if (RewriterView* rv = model->connectionView()->rewriterView()) { for (const QmlTypeData &data : rv->getQMLTypes()) { if (!data.typeName.isEmpty()) { @@ -164,6 +167,7 @@ QWidget *BindingDelegate::createEditor(QWidget *parent, const QStyleOptionViewIt } } } + //parent: if (!bindingProperty.parentModelNode().isRootNode()) bindingComboBox->addItem(QLatin1String("parent")); } break; @@ -306,6 +310,26 @@ QWidget *ConnectionDelegate::createEditor(QWidget *parent, const QStyleOptionVie } } } + //singletons: + if (RewriterView* rv = connectionModel->connectionView()->rewriterView()) { + for (const QmlTypeData &data : rv->getQMLTypes()) { + if (!data.typeName.isEmpty()) { + connectionComboBox->addItem(data.typeName); + + NodeMetaInfo metaInfo = connectionModel->connectionView()->model()->metaInfo(data.typeName.toUtf8()); + + if (metaInfo.isValid()) { + for (const PropertyName &propertyName : metaInfo.propertyNames()) { + if (metaInfo.propertyTypeName(propertyName) == "alias") { + connectionComboBox->addItem(data.typeName + + "." + + QString::fromUtf8(propertyName)); + } + } + } + } + } + } } break; case ConnectionModel::TargetPropertyNameRow: { connectionComboBox->addItems(prependOnForSignalHandler(connectionModel->getSignalsForRow(index.row()))); diff --git a/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp b/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp index f64b45f351..6eec3f933c 100644 --- a/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp +++ b/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp @@ -384,6 +384,11 @@ void FormEditorView::selectedNodesChanged(const QList<ModelNode> &selectedNodeLi m_currentTool->setItems(scene()->itemsForQmlItemNodes(toQmlItemNodeListKeppInvalid(selectedNodeList))); m_scene->update(); + + if (selectedNodeList.empty()) + m_formEditorWidget->zoomSelectionAction()->setEnabled(false); + else + m_formEditorWidget->zoomSelectionAction()->setEnabled(true); } void FormEditorView::variantPropertiesChanged(const QList<VariantProperty> &propertyList, @@ -448,7 +453,7 @@ void FormEditorView::customNotification(const AbstractView * /*view*/, const QSt m_dragTool->clearMoveDelay(); if (identifier == QLatin1String("reset QmlPuppet")) temporaryBlockView(); - if (identifier == QLatin1String("fit root to screen")) { + if (identifier == QLatin1String("zoom all")) { if (QmlItemNode(rootModelNode()).isFlowView()) { QRectF boundingRect; for (QGraphicsItem *item : scene()->items()) { @@ -469,7 +474,7 @@ void FormEditorView::customNotification(const AbstractView * /*view*/, const QSt float zoomLevel = ZoomAction::getClosestZoomLevel(scaleFactor); m_formEditorWidget->zoomAction()->forceZoomLevel(zoomLevel); } - if (identifier == QLatin1String("fit selection to screen")) { + if (identifier == QLatin1String("zoom selection")) { if (nodeList.isEmpty()) return; @@ -485,6 +490,10 @@ void FormEditorView::customNotification(const AbstractView * /*view*/, const QSt float zoomLevel = ZoomAction::getClosestZoomLevel(scaleFactor); m_formEditorWidget->zoomAction()->forceZoomLevel(zoomLevel); } + if (identifier == QLatin1String("zoom in")) + m_formEditorWidget->zoomAction()->zoomIn(); + if (identifier == QLatin1String("zoom out")) + m_formEditorWidget->zoomAction()->zoomOut(); } AbstractFormEditorTool *FormEditorView::currentTool() const diff --git a/src/plugins/qmldesigner/components/formeditor/formeditorwidget.cpp b/src/plugins/qmldesigner/components/formeditor/formeditorwidget.cpp index 0380db2b08..74fa9d3b73 100644 --- a/src/plugins/qmldesigner/components/formeditor/formeditorwidget.cpp +++ b/src/plugins/qmldesigner/components/formeditor/formeditorwidget.cpp @@ -48,6 +48,7 @@ #include <utils/fileutils.h> #include <utils/utilsicons.h> +#include <utils/stylehelper.h> #include <QActionGroup> #include <QFileDialog> @@ -144,6 +145,58 @@ FormEditorWidget::FormEditorWidget(FormEditorView *view) : upperActions.append(m_backgroundAction.data()); m_toolBox->addRightSideAction(m_backgroundAction.data()); + // Zoom actions + const QString fontName = "qtds_propertyIconFont.ttf"; + const QColor textColorNormal(Theme::getColor(Theme::MenuItemTextColorNormal)); + const QColor textColorDisabled(Theme::getColor(Theme::MenuBarItemTextColorDisabled)); + const QIcon zoomAllIcon = Utils::StyleHelper::getIconFromIconFont(fontName, + Theme::getIconUnicode(Theme::Icon::zoomAll), + 28, 28, textColorNormal); + + const QString zoomSelectionUnicode = Theme::getIconUnicode(Theme::Icon::zoomSelection); + const auto zoomSelectionNormal = Utils::StyleHelper::IconFontHelper(zoomSelectionUnicode, + textColorNormal, + QSize(28, 28), + QIcon::Normal); + const auto zoomSelectionDisabeld = Utils::StyleHelper::IconFontHelper(zoomSelectionUnicode, + textColorDisabled, + QSize(28, 28), + QIcon::Disabled); + + const QIcon zoomSelectionIcon = Utils::StyleHelper::getIconFromIconFont(fontName, + {zoomSelectionNormal, + zoomSelectionDisabeld}); + const QIcon zoomInIcon = Utils::StyleHelper::getIconFromIconFont(fontName, + Theme::getIconUnicode(Theme::Icon::zoomIn), + 28, 28, textColorNormal); + const QIcon zoomOutIcon = Utils::StyleHelper::getIconFromIconFont(fontName, + Theme::getIconUnicode(Theme::Icon::zoomOut), + 28, 28, textColorNormal); + + m_zoomInAction = new QAction(zoomInIcon, tr("Zoom in"), this); + m_zoomInAction->setShortcut(QKeySequence(Qt::CTRL + Qt::ALT + Qt::Key_Plus)); + connect(m_zoomInAction.data(), &QAction::triggered, this, [this] { + if (!m_formEditorView) + return; + + m_formEditorView->emitCustomNotification(QStringLiteral("zoom in")); + }); + addAction(m_zoomInAction.data()); + upperActions.append(m_zoomInAction.data()); + m_toolBox->addRightSideAction(m_zoomInAction.data()); + + m_zoomOutAction = new QAction(zoomOutIcon, tr("Zoom out"), this); + m_zoomOutAction->setShortcut(QKeySequence(Qt::CTRL + Qt::ALT + Qt::Key_Minus)); + connect(m_zoomOutAction.data(), &QAction::triggered, this, [this] { + if (!m_formEditorView) + return; + + m_formEditorView->emitCustomNotification(QStringLiteral("zoom out")); + }); + addAction(m_zoomOutAction.data()); + upperActions.append(m_zoomOutAction.data()); + m_toolBox->addRightSideAction(m_zoomOutAction.data()); + m_zoomAction = new ZoomAction(m_toolActionGroup.data()); connect(m_zoomAction.data(), &ZoomAction::zoomLevelChanged, this, &FormEditorWidget::setZoomLevel); @@ -151,6 +204,31 @@ FormEditorWidget::FormEditorWidget(FormEditorView *view) : upperActions.append(m_zoomAction.data()); m_toolBox->addRightSideAction(m_zoomAction.data()); + m_zoomAllAction = new QAction(zoomAllIcon, tr("Zoom screen to fit all content"), this); + m_zoomAllAction->setShortcut(QKeySequence(Qt::CTRL + Qt::ALT + Qt::Key_0)); + connect(m_zoomAllAction.data(), &QAction::triggered, this, [this] { + if (!m_formEditorView) + return; + + m_formEditorView->emitCustomNotification(QStringLiteral("zoom all")); + }); + addAction(m_zoomAllAction.data()); + upperActions.append(m_zoomAllAction.data()); + m_toolBox->addRightSideAction(m_zoomAllAction.data()); + + m_zoomSelectionAction = new QAction(zoomSelectionIcon, tr("Zoom screen to fit current selection"), this); + m_zoomSelectionAction->setShortcut(QKeySequence(Qt::CTRL + Qt::ALT + Qt::Key_I)); + connect(m_zoomSelectionAction.data(), &QAction::triggered, this, [this] { + if (!m_formEditorView) + return; + + m_formEditorView->emitCustomNotification(QStringLiteral("zoom selection"), + m_formEditorView->selectedModelNodes()); + }); + addAction(m_zoomSelectionAction.data()); + upperActions.append(m_zoomSelectionAction.data()); + m_toolBox->addRightSideAction(m_zoomSelectionAction.data()); + m_resetAction = new QAction(Utils::Icons::RESET_TOOLBAR.icon(), tr("Reset View"), this); registerActionAsCommand(m_resetAction, Constants::FORMEDITOR_REFRESH, QKeySequence(Qt::Key_R)); @@ -218,9 +296,9 @@ void FormEditorWidget::wheelEvent(QWheelEvent *event) { if (event->modifiers().testFlag(Qt::ControlModifier)) { if (event->angleDelta().y() > 0) - zoomAction()->zoomOut(); - else zoomAction()->zoomIn(); + else + zoomAction()->zoomOut(); event->accept(); } else { @@ -304,6 +382,11 @@ ZoomAction *FormEditorWidget::zoomAction() const return m_zoomAction.data(); } +QAction *FormEditorWidget::zoomSelectionAction() const +{ + return m_zoomSelectionAction.data(); +} + QAction *FormEditorWidget::resetAction() const { return m_resetAction.data(); diff --git a/src/plugins/qmldesigner/components/formeditor/formeditorwidget.h b/src/plugins/qmldesigner/components/formeditor/formeditorwidget.h index eb01611682..b2f50de6c0 100644 --- a/src/plugins/qmldesigner/components/formeditor/formeditorwidget.h +++ b/src/plugins/qmldesigner/components/formeditor/formeditorwidget.h @@ -53,6 +53,7 @@ public: FormEditorWidget(FormEditorView *view); ZoomAction *zoomAction() const; + QAction *zoomSelectionAction() const; QAction *showBoundingRectAction() const; QAction *snappingAction() const; QAction *snappingAndAnchoringAction() const; @@ -112,6 +113,10 @@ private: QPointer<LineEditAction> m_rootHeightAction; QPointer<BackgroundAction> m_backgroundAction; QPointer<QAction> m_resetAction; + QPointer<QAction> m_zoomAllAction; + QPointer<QAction> m_zoomSelectionAction; + QPointer<QAction> m_zoomInAction; + QPointer<QAction> m_zoomOutAction; QPointer<DocumentWarningWidget> m_documentErrorWidget; Core::IContext *m_context = nullptr; }; diff --git a/src/plugins/qmldesigner/components/importmanager/importswidget.cpp b/src/plugins/qmldesigner/components/importmanager/importswidget.cpp index d3aaf3c9b1..650033a42d 100644 --- a/src/plugins/qmldesigner/components/importmanager/importswidget.cpp +++ b/src/plugins/qmldesigner/components/importmanager/importswidget.cpp @@ -122,8 +122,15 @@ void ImportsWidget::removePossibleImports() void ImportsWidget::setUsedImports(const QList<Import> &usedImports) { + const QStringList excludeList = {"SimulinkConnector"}; + + // exclude imports in the excludeList from being readonly (i.e. always enable their x button) + QList<Import> filteredImports = Utils::filtered(usedImports, [excludeList](const Import &import) { + return !excludeList.contains(import.url()); + }); + foreach (ImportLabel *importLabel, m_importLabels) - importLabel->setReadOnly(usedImports.contains(importLabel->import())); + importLabel->setReadOnly(filteredImports.contains(importLabel->import())); } void ImportsWidget::removeUsedImports() diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryview.cpp b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryview.cpp index cad7189698..ea2e472f43 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryview.cpp +++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryview.cpp @@ -29,6 +29,10 @@ #include <importmanagerview.h> #include <qmlitemnode.h> #include <rewriterview.h> +#include <bindingproperty.h> +#include <nodelistproperty.h> +#include <utils/algorithm.h> +#include "metainfo.h" namespace QmlDesigner { @@ -82,9 +86,35 @@ void ItemLibraryView::modelAboutToBeDetached(Model *model) m_widget->setModel(nullptr); } -void ItemLibraryView::importsChanged(const QList<Import> &/*addedImports*/, const QList<Import> &/*removedImports*/) +void ItemLibraryView::importsChanged(const QList<Import> &addedImports, const QList<Import> &removedImports) { updateImports(); + + // TODO: generalize the logic below to allow adding/removing any Qml component when its import is added/removed + bool simulinkImportAdded = std::any_of(addedImports.cbegin(), addedImports.cend(), [](const Import &import) { + return import.url() == "SimulinkConnector"; + }); + if (simulinkImportAdded) { + // add SLConnector component when SimulinkConnector import is added + ModelNode node = createModelNode("SLConnector", 1, 0); + node.bindingProperty("root").setExpression(rootModelNode().validId()); + rootModelNode().defaultNodeListProperty().reparentHere(node); + } else { + bool simulinkImportRemoved = std::any_of(removedImports.cbegin(), removedImports.cend(), [](const Import &import) { + return import.url() == "SimulinkConnector"; + }); + + if (simulinkImportRemoved) { + // remove SLConnector component when SimulinkConnector import is removed + const QList<ModelNode> slConnectors = Utils::filtered(rootModelNode().directSubModelNodes(), + [](const ModelNode &node) { + return node.type() == "SLConnector" || node.type() == "SimulinkConnector.SLConnector"; + }); + + for (ModelNode node : slConnectors) + node.destroy(); + } + } } void ItemLibraryView::setResourcePath(const QString &resourcePath) diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp index 6dee5a6d3a..ea81fb4fcf 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp +++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp @@ -110,6 +110,7 @@ ItemLibraryWidget::ItemLibraryWidget(QWidget *parent) : {{"highlightColor"}, Utils::StyleHelper::notTooBrightHighlightColor()} } ); + m_itemViewQuickWidget->setClearColor(Theme::getColor(Theme::Color::QmlDesigner_BackgroundColorDarkAlternate)); /* create Resources view and its model */ m_resourcesFileSystemModel = new CustomFileSystemModel(this); diff --git a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorcontextobject.cpp b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorcontextobject.cpp index a479dfeba0..5f17ca77ff 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorcontextobject.cpp +++ b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorcontextobject.cpp @@ -40,6 +40,7 @@ #include <QApplication> #include <QCursor> #include <QFontDatabase> +#include <QMessageBox> #include <QQmlContext> #include <coreplugin/icore.h> @@ -180,7 +181,6 @@ void PropertyEditorContextObject::toogleExportAlias() void PropertyEditorContextObject::changeTypeName(const QString &typeName) { - QTC_ASSERT(m_model && m_model->rewriterView(), return); /* Ideally we should not missuse the rewriterView @@ -189,19 +189,97 @@ void PropertyEditorContextObject::changeTypeName(const QString &typeName) QTC_ASSERT(!rewriterView->selectedModelNodes().isEmpty(), return); - rewriterView->executeInTransaction("PropertyEditorContextObject:changeTypeName", [this, rewriterView, typeName](){ + try { + auto transaction = RewriterTransaction(rewriterView, "PropertyEditorContextObject:changeTypeName"); + ModelNode selectedNode = rewriterView->selectedModelNodes().constFirst(); + // Check if the requested type is the same as already set + if (selectedNode.simplifiedTypeName() == typeName) + return; + NodeMetaInfo metaInfo = m_model->metaInfo(typeName.toLatin1()); if (!metaInfo.isValid()) { - Core::AsynchronousMessageBox::warning(tr("Invalid Type"), tr("%1 is an invalid type.").arg(typeName)); + Core::AsynchronousMessageBox::warning(tr("Invalid Type"), tr("%1 is an invalid type.").arg(typeName)); return; } + + // Create a list of properties available for the new type + QList<PropertyName> propertiesAndSignals(metaInfo.propertyNames()); + // Add signals to the list + for (const auto &signal : metaInfo.signalNames()) { + if (signal.isEmpty()) + continue; + + PropertyName name = signal; + QChar firstChar = QChar(signal.at(0)).toUpper().toLatin1(); + name[0] = firstChar.toLatin1(); + name.prepend("on"); + propertiesAndSignals.append(name); + } + + // Add dynamic properties and respective change signals + for (const auto &property : selectedNode.properties()) { + if (!property.isDynamic()) + continue; + + // Add dynamic property + propertiesAndSignals.append(property.name()); + // Add its change signal + PropertyName name = property.name(); + QChar firstChar = QChar(property.name().at(0)).toUpper().toLatin1(); + name[0] = firstChar.toLatin1(); + name.prepend("on"); + name.append("Changed"); + propertiesAndSignals.append(name); + } + + // Compare current properties and signals with the once available for change type + QList<PropertyName> incompatibleProperties; + for (const auto &property : selectedNode.properties()) { + if (!propertiesAndSignals.contains(property.name())) + incompatibleProperties.append(property.name()); + } + + Utils::sort(incompatibleProperties); + + // Create a dialog showing incompatible properties and signals + if (!incompatibleProperties.empty()) { + QString detailedText = QString("<b>Incompatible properties:</b><br>"); + + for (const auto &p : incompatibleProperties) + detailedText.append("- " + QString::fromUtf8(p) + "<br>"); + + detailedText.chop(QString("<br>").size()); + + QMessageBox msgBox; + msgBox.setTextFormat(Qt::RichText); + msgBox.setIcon(QMessageBox::Question); + msgBox.setWindowTitle("Change Type"); + msgBox.setText(QString("Changing the type from %1 to %2 can't be done without removing incompatible properties.<br><br>%3") + .arg(selectedNode.simplifiedTypeName()) + .arg(typeName) + .arg(detailedText)); + msgBox.setInformativeText("Do you want to continue by removing incompatible properties?"); + msgBox.setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel); + msgBox.setDefaultButton(QMessageBox::Ok); + + if (msgBox.exec() == QMessageBox::Cancel) + return; + + for (auto p : incompatibleProperties) + selectedNode.removeProperty(p); + } + if (selectedNode.isRootNode()) rewriterView->changeRootNodeType(metaInfo.typeName(), metaInfo.majorVersion(), metaInfo.minorVersion()); else selectedNode.changeType(metaInfo.typeName(), metaInfo.majorVersion(), metaInfo.minorVersion()); - }); + + transaction.commit(); + } catch (const Exception &e) { + e.showException(); + } } void PropertyEditorContextObject::insertKeyframe(const QString &propertyName) diff --git a/src/plugins/qmldesigner/components/resources/dockwidgets.css b/src/plugins/qmldesigner/components/resources/dockwidgets.css index 0aac817fbc..3eb3c5a045 100644 --- a/src/plugins/qmldesigner/components/resources/dockwidgets.css +++ b/src/plugins/qmldesigner/components/resources/dockwidgets.css @@ -148,7 +148,7 @@ ADS--DockWidgetTab[focused="true"] > #tabCloseButton:pressed { } ADS--DockWidgetTab[focused="true"] QLabel { - color: palette(creatorTheme.QmlDesigner_TabDark); + color: palette(creatorTheme.DStextColor); } ADS--DockAreaTitleBar { diff --git a/src/plugins/qmldesigner/components/transitioneditor/transitioneditorview.cpp b/src/plugins/qmldesigner/components/transitioneditor/transitioneditorview.cpp index a7ead0afd2..71f6c3ed88 100644 --- a/src/plugins/qmldesigner/components/transitioneditor/transitioneditorview.cpp +++ b/src/plugins/qmldesigner/components/transitioneditor/transitioneditorview.cpp @@ -272,6 +272,16 @@ ModelNode TransitionEditorView::addNewTransition() } } }); + } else { + QString properties; + for (const PropertyName &property : validProperties) + properties.append(QString::fromUtf8(property) + ", "); + if (!properties.isEmpty()) + properties.chop(2); + Core::AsynchronousMessageBox::warning( + tr("No properties to animate found."), + tr("To add transitions, first change the properties that you want to animate in states (%1).") + .arg(properties)); } if (m_transitionEditorWidget) @@ -285,9 +295,6 @@ TransitionEditorWidget *TransitionEditorView::createWidget() if (!m_transitionEditorWidget) m_transitionEditorWidget = new TransitionEditorWidget(this); - //auto *timelineContext = new TimelineContext(m_timelineWidget); - //Core::ICore::addContextObject(timelineContext); - return m_transitionEditorWidget; } diff --git a/src/plugins/qmldesigner/designercore/include/itemlibraryinfo.h b/src/plugins/qmldesigner/designercore/include/itemlibraryinfo.h index 58d2413787..7cfa0ae1ab 100644 --- a/src/plugins/qmldesigner/designercore/include/itemlibraryinfo.h +++ b/src/plugins/qmldesigner/designercore/include/itemlibraryinfo.h @@ -98,7 +98,6 @@ public: QList<ItemLibraryEntry> entries() const; QList<ItemLibraryEntry> entriesForType(const QByteArray &typeName, int majorVersion, int minorVersion) const; - ItemLibraryEntry entry(const QString &name) const; void addEntries(const QList<ItemLibraryEntry> &entries, bool overwriteDuplicate = false); bool containsEntry(const ItemLibraryEntry &entry); diff --git a/src/plugins/qmldesigner/designercore/metainfo/itemlibraryinfo.cpp b/src/plugins/qmldesigner/designercore/metainfo/itemlibraryinfo.cpp index e76fe609f0..1464084b67 100644 --- a/src/plugins/qmldesigner/designercore/metainfo/itemlibraryinfo.cpp +++ b/src/plugins/qmldesigner/designercore/metainfo/itemlibraryinfo.cpp @@ -272,17 +272,6 @@ QList<ItemLibraryEntry> ItemLibraryInfo::entriesForType(const QByteArray &typeNa return entries; } -ItemLibraryEntry ItemLibraryInfo::entry(const QString &name) const -{ - if (m_nameToEntryHash.contains(name)) - return m_nameToEntryHash.value(name); - - if (m_baseInfo) - return m_baseInfo->entry(name); - - return ItemLibraryEntry(); -} - QList<ItemLibraryEntry> ItemLibraryInfo::entries() const { QList<ItemLibraryEntry> list = m_nameToEntryHash.values(); diff --git a/src/plugins/qmldesigner/designmodewidget.cpp b/src/plugins/qmldesigner/designmodewidget.cpp index c6b4af7054..d17bf5a10c 100644 --- a/src/plugins/qmldesigner/designmodewidget.cpp +++ b/src/plugins/qmldesigner/designmodewidget.cpp @@ -238,19 +238,32 @@ void DesignModeWidget::setup() m_dockManager->setStyleSheet(Theme::replaceCssColors(sheet)); // Setup icons - QColor buttonColor(Theme::getColor(Theme::QmlDesigner_TabLight)); // TODO Use correct color roles - QColor tabColor(Theme::getColor(Theme::QmlDesigner_TabDark)); + const QColor buttonColor(Theme::getColor(Theme::QmlDesigner_TabLight)); // TODO Use correct color roles + const QColor tabColor(Theme::getColor(Theme::QmlDesigner_TabDark)); const QString closeUnicode = Theme::getIconUnicode(Theme::Icon::adsClose); const QString menuUnicode = Theme::getIconUnicode(Theme::Icon::adsDropDown); const QString undockUnicode = Theme::getIconUnicode(Theme::Icon::adsDetach); const QString fontName = "qtds_propertyIconFont.ttf"; - const QIcon tabsCloseIcon = Utils::StyleHelper::getIconFromIconFont(fontName, closeUnicode, 28, 28, tabColor); const QIcon menuIcon = Utils::StyleHelper::getIconFromIconFont(fontName, menuUnicode, 28, 28, buttonColor); const QIcon undockIcon = Utils::StyleHelper::getIconFromIconFont(fontName, undockUnicode, 28, 28, buttonColor); const QIcon closeIcon = Utils::StyleHelper::getIconFromIconFont(fontName, closeUnicode, 28, 28, buttonColor); + auto closeIconNormal = Utils::StyleHelper::IconFontHelper(closeUnicode, + tabColor, + QSize(28, 28), + QIcon::Normal, + QIcon::Off); + + auto closeIconFocused = Utils::StyleHelper::IconFontHelper(closeUnicode, + Theme::getColor(Theme::DStextColor), + QSize(28, 28), + QIcon::Normal, + QIcon::On); + + const QIcon tabsCloseIcon = Utils::StyleHelper::getIconFromIconFont(fontName, {closeIconNormal, closeIconFocused}); + m_dockManager->iconProvider().registerCustomIcon(ADS::TabCloseIcon, tabsCloseIcon); m_dockManager->iconProvider().registerCustomIcon(ADS::DockAreaMenuIcon, menuIcon); m_dockManager->iconProvider().registerCustomIcon(ADS::DockAreaUndockIcon, undockIcon); @@ -326,6 +339,9 @@ void DesignModeWidget::setup() dockWidget->setWindowTitle(title); m_dockManager->addDockWidget(ADS::NoDockWidgetArea, dockWidget); + // Set unique id as object name + navigationView.widget->setObjectName(uniqueId); + // Create menu action auto command = Core::ActionManager::registerAction(dockWidget->toggleViewAction(), actionToggle.withSuffix(uniqueId + "Widget"), @@ -346,6 +362,9 @@ void DesignModeWidget::setup() // Add to view widgets m_viewWidgets.append(widgetInfo.widget); + // Set unique id as object name + widgetInfo.widget->setObjectName(widgetInfo.uniqueId); + // Create menu action auto command = Core::ActionManager::registerAction(dockWidget->toggleViewAction(), actionToggle.withSuffix(widgetInfo.uniqueId + "Widget"), @@ -356,11 +375,16 @@ void DesignModeWidget::setup() // Finally the output pane { + const QString uniqueId = "OutputPane"; auto outputPanePlaceholder = new Core::OutputPanePlaceHolder(Core::Constants::MODE_DESIGN); - m_outputPaneDockWidget = new ADS::DockWidget("OutputPane"); + m_outputPaneDockWidget = new ADS::DockWidget(uniqueId); m_outputPaneDockWidget->setWidget(outputPanePlaceholder); m_outputPaneDockWidget->setWindowTitle("Output Pane"); m_dockManager->addDockWidget(ADS::NoDockWidgetArea, m_outputPaneDockWidget); + + // Set unique id as object name + outputPanePlaceholder->setObjectName(uniqueId); + // Create menu action auto command = Core::ActionManager::registerAction(m_outputPaneDockWidget->toggleViewAction(), actionToggle.withSuffix("OutputPaneWidget"), diff --git a/src/plugins/qmljseditor/qmljscompletionassist.cpp b/src/plugins/qmljseditor/qmljscompletionassist.cpp index 5cfa28c609..0f7fdf0a88 100644 --- a/src/plugins/qmljseditor/qmljscompletionassist.cpp +++ b/src/plugins/qmljseditor/qmljscompletionassist.cpp @@ -355,7 +355,7 @@ QStringList qmlJSAutoComplete(QTextDocument *textDocument, } for (int i = 0; i < model->size(); ++i) - list.append(proposal->model()->text(i)); + list.append(proposal->model()->text(i).trimmed()); list.append(prefix); } diff --git a/src/plugins/qmljstools/qmljstools_test.cpp b/src/plugins/qmljstools/qmljstools_test.cpp index ab8a09abae..a2c35efa00 100644 --- a/src/plugins/qmljstools/qmljstools_test.cpp +++ b/src/plugins/qmljstools/qmljstools_test.cpp @@ -55,7 +55,7 @@ void QmlJSToolsPlugin::test_basic() QVERIFY(context); const CppComponentValue *rectangleValue = context->valueOwner()->cppQmlTypes().objectByQualifiedName( - QLatin1String("QtQuick"), QLatin1String("QDeclarativeRectangle"), LanguageUtils::ComponentVersion(2, 1)); + QLatin1String("QtQuick"), QLatin1String("QDeclarativeRectangle"), LanguageUtils::ComponentVersion(2, 15)); QVERIFY(rectangleValue); QVERIFY(!rectangleValue->isWritable(QLatin1String("border"))); QVERIFY(rectangleValue->hasProperty(QLatin1String("border"))); diff --git a/src/plugins/qtsupport/qtcreator_tutorials.xml b/src/plugins/qtsupport/qtcreator_tutorials.xml index a694d4cd6f..422ddce483 100644 --- a/src/plugins/qtsupport/qtcreator_tutorials.xml +++ b/src/plugins/qtsupport/qtcreator_tutorials.xml @@ -180,5 +180,9 @@ <description><![CDATA[Running Qt Quick apps on webOS.]]></description> <tags>qt quick,ui,webos,talk,2019</tags> </tutorial> + <tutorial imageUrl=":qtsupport/images/icons/videotutorialicon.png" difficulty="" projectPath="" name="Talk: How to build your first 'Qt for MCUs' application" isVideo="true" videoUrl="https://youtu.be/BkgjJfxYN20" videoLength="21:54"> + <description><![CDATA[Building your first application for the NXP IMXRT1050 device.]]></description> + <tags>qtformcus,mcus,qt,talk,NXP IMXRT1050-EVKB,2020</tags> + </tutorial> </tutorials> </instructionals> diff --git a/src/plugins/texteditor/fontsettingspage.cpp b/src/plugins/texteditor/fontsettingspage.cpp index 4b60642372..56ecb8f023 100644 --- a/src/plugins/texteditor/fontsettingspage.cpp +++ b/src/plugins/texteditor/fontsettingspage.cpp @@ -279,7 +279,9 @@ FormatDescription::FormatDescription(TextStyle id, QColor FormatDescription::defaultForeground(TextStyle id) { - if (id == C_LINE_NUMBER) { + if (id == C_TEXT) { + return Qt::black; + } else if (id == C_LINE_NUMBER) { const QPalette palette = Utils::Theme::initialPalette(); const QColor bg = palette.window().color(); if (bg.value() < 128) diff --git a/src/plugins/texteditor/texteditorsettings.cpp b/src/plugins/texteditor/texteditorsettings.cpp index 49a44639a9..e9a49cbc8a 100644 --- a/src/plugins/texteditor/texteditorsettings.cpp +++ b/src/plugins/texteditor/texteditorsettings.cpp @@ -90,7 +90,7 @@ FormatDescriptions TextEditorSettingsPrivate::initialFormats() formatDescr.emplace_back(C_TEXT, tr("Text"), tr("Generic text and punctuation tokens.\n" "Applied to text that matched no other rule."), - Format{QColor{}, Qt::white}); + Format{Qt::black, Qt::white}); // Special categories const QPalette p = QApplication::palette(); diff --git a/src/shared/qbs b/src/shared/qbs -Subproject 53c8000f034b68fae41d3f071be9ab5fe875827 +Subproject 2ebe1e5bf9c8cc2f4b97a1cf8a1edc97257de15 diff --git a/src/tools/iostool/iosdevicemanager.cpp b/src/tools/iostool/iosdevicemanager.cpp index fe339ddec9..f3f1c444c6 100644 --- a/src/tools/iostool/iosdevicemanager.cpp +++ b/src/tools/iostool/iosdevicemanager.cpp @@ -452,6 +452,10 @@ public: void deviceCallbackReturned(); QString commandName(); + QString getStringValue(AMDevice *device, + CFStringRef domain, + CFStringRef key, + const QString &fallback = QString()); }; class AppOpSession: public CommandSession { @@ -1585,69 +1589,52 @@ QString DevInfoSession::commandName() return QString::fromLatin1("DevInfoSession(%1, %2)").arg(deviceId); } +QString DevInfoSession::getStringValue(AMDevice *device, + CFStringRef domain, + CFStringRef key, + const QString &fallback) +{ + QString value = fallback; + CFPropertyListRef cfValue = lib()->deviceCopyValue(device, domain, key); + if (cfValue) { + if (CFGetTypeID(cfValue) == CFStringGetTypeID()) + value = QString::fromCFString(reinterpret_cast<CFStringRef>(cfValue)); + CFRelease(cfValue); + } + return value; +} + void DevInfoSession::deviceCallbackReturned() { if (debugAll) qDebug() << "device available"; QMap<QString,QString> res; - QString deviceNameKey = QLatin1String("deviceName"); - QString developerStatusKey = QLatin1String("developerStatus"); - QString deviceConnectedKey = QLatin1String("deviceConnected"); - QString osVersionKey = QLatin1String("osVersion"); + const QString deviceNameKey = "deviceName"; + const QString developerStatusKey = "developerStatus"; + const QString deviceConnectedKey = "deviceConnected"; + const QString osVersionKey = "osVersion"; + const QString cpuArchitectureKey = "cpuArchitecture"; + const QString uniqueDeviceId = "uniqueDeviceId"; bool failure = !device; if (!failure) { failure = !connectDevice(); if (!failure) { res[deviceConnectedKey] = QLatin1String("YES"); - CFPropertyListRef cfDeviceName = lib()->deviceCopyValue(device, 0, - CFSTR("DeviceName")); - // CFShow(cfDeviceName); - if (cfDeviceName) { - if (CFGetTypeID(cfDeviceName) == CFStringGetTypeID()) - res[deviceNameKey] = QString::fromCFString(reinterpret_cast<CFStringRef>(cfDeviceName)); - CFRelease(cfDeviceName); - } - if (!res.contains(deviceNameKey)) - res[deviceNameKey] = QString(); - } - if (!failure) { - CFPropertyListRef cfDevStatus = lib()->deviceCopyValue(device, - CFSTR("com.apple.xcode.developerdomain"), - CFSTR("DeveloperStatus")); - // CFShow(cfDevStatus); - if (cfDevStatus) { - if (CFGetTypeID(cfDevStatus) == CFStringGetTypeID()) - res[developerStatusKey] = QString::fromCFString(reinterpret_cast<CFStringRef>(cfDevStatus)); - CFRelease(cfDevStatus); - } - if (!res.contains(developerStatusKey)) - res[developerStatusKey] = QLatin1String("*off*"); - } - if (!failure) { - CFPropertyListRef cfProductVersion = lib()->deviceCopyValue(device, - 0, - CFSTR("ProductVersion")); - //CFShow(cfProductVersion); - CFPropertyListRef cfBuildVersion = lib()->deviceCopyValue(device, - 0, - CFSTR("BuildVersion")); - //CFShow(cfBuildVersion); - QString versionString; - if (cfProductVersion) { - if (CFGetTypeID(cfProductVersion) == CFStringGetTypeID()) - versionString = QString::fromCFString(reinterpret_cast<CFStringRef>(cfProductVersion)); - CFRelease(cfProductVersion); - } - if (cfBuildVersion) { - if (!versionString.isEmpty() && CFGetTypeID(cfBuildVersion) == CFStringGetTypeID()) - versionString += QString::fromLatin1(" (%1)").arg( - QString::fromCFString(reinterpret_cast<CFStringRef>(cfBuildVersion))); - CFRelease(cfBuildVersion); - } - if (!versionString.isEmpty()) - res[osVersionKey] = versionString; + res[deviceNameKey] = getStringValue(device, nullptr, CFSTR("DeviceName")); + res[developerStatusKey] = getStringValue(device, + CFSTR("com.apple.xcode.developerdomain"), + CFSTR("DeveloperStatus"), + "*off*"); + res[cpuArchitectureKey] = getStringValue(device, nullptr, CFSTR("CPUArchitecture")); + res[uniqueDeviceId] = getStringValue(device, nullptr, CFSTR("UniqueDeviceID")); + const QString productVersion = getStringValue(device, nullptr, CFSTR("ProductVersion")); + const QString buildVersion = getStringValue(device, nullptr, CFSTR("BuildVersion")); + if (!productVersion.isEmpty() && !buildVersion.isEmpty()) + res[osVersionKey] = QString("%1 (%2)").arg(productVersion, buildVersion); + else if (!productVersion.isEmpty()) + res[osVersionKey] = productVersion; else - res[osVersionKey] = QLatin1String("*unknown*"); + res[osVersionKey] = "*unknown*"; } disconnectDevice(); } diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index b8038a9282..71bf9613a5 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -1,4 +1,4 @@ add_subdirectory(auto) add_subdirectory(manual) # add_subdirectory(tools) -# add_subdirectory(unit) +add_subdirectory(unit) diff --git a/tests/auto/debugger/CMakeLists.txt b/tests/auto/debugger/CMakeLists.txt index 794c43bdc6..66900623c3 100644 --- a/tests/auto/debugger/CMakeLists.txt +++ b/tests/auto/debugger/CMakeLists.txt @@ -32,15 +32,6 @@ add_qtc_test(tst_debugger_gdb "${DEBUGGERDIR}/debuggerprotocol.cpp" "${DEBUGGERDIR}/debuggerprotocol.h" ) -add_qtc_test(tst_debugger_namedemangler - INCLUDES "${DEBUGGERDIR}" - SOURCES - tst_namedemangler.cpp - "${DEBUGGERDIR}/namedemangler/globalparsestate.cpp" "${DEBUGGERDIR}/namedemangler/globalparsestate.h" - "${DEBUGGERDIR}/namedemangler/namedemangler.cpp" "${DEBUGGERDIR}/namedemangler/namedemangler.h" - "${DEBUGGERDIR}/namedemangler/parsetreenodes.cpp" "${DEBUGGERDIR}/namedemangler/parsetreenodes.h" -) - add_qtc_test(tst_debugger_offsets DEPENDS Qt5::CorePrivate INCLUDES "${DEBUGGERDIR}" diff --git a/tests/auto/debugger/debugger.pro b/tests/auto/debugger/debugger.pro index 12a115c919..284db38b0c 100644 --- a/tests/auto/debugger/debugger.pro +++ b/tests/auto/debugger/debugger.pro @@ -10,7 +10,5 @@ CONFIG += ordered SUBDIRS += gdb.pro SUBDIRS += simplifytypes.pro SUBDIRS += dumpers.pro -SUBDIRS += namedemangler.pro SUBDIRS += disassembler.pro SUBDIRS += offsets.pro - diff --git a/tests/auto/debugger/debugger.qbs b/tests/auto/debugger/debugger.qbs index 5f3fffecaf..456c604b26 100644 --- a/tests/auto/debugger/debugger.qbs +++ b/tests/auto/debugger/debugger.qbs @@ -7,7 +7,6 @@ Project { "disassembler.qbs", "dumpers.qbs", "gdb.qbs", - "namedemangler.qbs", "offsets.qbs", "simplifytypes.qbs", ] diff --git a/tests/auto/debugger/namedemangler.pro b/tests/auto/debugger/namedemangler.pro deleted file mode 100644 index 241e1e2759..0000000000 --- a/tests/auto/debugger/namedemangler.pro +++ /dev/null @@ -1,10 +0,0 @@ -QT -= gui - -include(../qttest.pri) - -DEBUGGERDIR = $$IDE_SOURCE_TREE/src/plugins/debugger -INCLUDEPATH += $$DEBUGGERDIR - -SOURCES = tst_namedemangler.cpp -include($$DEBUGGERDIR/namedemangler/namedemangler.pri) - diff --git a/tests/auto/debugger/namedemangler.qbs b/tests/auto/debugger/namedemangler.qbs deleted file mode 100644 index d6356728d6..0000000000 --- a/tests/auto/debugger/namedemangler.qbs +++ /dev/null @@ -1,18 +0,0 @@ -import qbs - -QtcAutotest { - name: "Name demangler autotest" - - cpp.enableExceptions: true - - Group { - name: "Sources from Debugger plugin" - prefix: project.debuggerDir + "namedemangler/" - files: ["*.h", "*.cpp"] - } - Group { - name: "Test sources" - files: "tst_namedemangler.cpp" - } - cpp.includePaths: base.concat([project.debuggerDir]) -} diff --git a/tests/auto/debugger/tst_namedemangler.cpp b/tests/auto/debugger/tst_namedemangler.cpp deleted file mode 100644 index 187d0312e2..0000000000 --- a/tests/auto/debugger/tst_namedemangler.cpp +++ /dev/null @@ -1,616 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt Creator. -** -** 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 General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** 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-3.0.html. -** -****************************************************************************/ - -#include <namedemangler/namedemangler.h> -#include <namedemangler/parsetreenodes.h> - -#include <QObject> -#include <QDebug> -#include <QTest> - -#include <cctype> - -const QByteArray toString(char c) { return QByteArray("'") + c + "'"; } - -using namespace Debugger::Internal; -using namespace QTest; - -class NameDemanglerAutoTest : public QObject -{ - Q_OBJECT -private slots: - void testUnmangledName(); - void testDisjunctFirstSets(); - void testCorrectlyMangledNames(); - void testCorrectlyMangledNames_data(); - void testIncorrectlyMangledNames(); - -private: - void testIncorrectlyMangledName(const QString &mangledName); - NameDemangler demangler; -}; - -void NameDemanglerAutoTest::testUnmangledName() -{ - QVERIFY(demangler.demangle(QLatin1String("f")) - && demangler.demangledName() == QLatin1String("f")); -} - -void NameDemanglerAutoTest::testCorrectlyMangledNames() -{ - QFETCH(QString, demangled); - QString mangled = QString::fromLatin1(currentDataTag()); - - QVERIFY2(demangler.demangle(mangled), qPrintable(demangler.errorString())); - QCOMPARE(demangler.demangledName(), demangled); -} - -void NameDemanglerAutoTest::testCorrectlyMangledNames_data() -{ - addColumn<QString>("demangled"); - - newRow("_Z1fv") - << "f()"; - newRow("_Z1fi") - << "f(int)"; -#ifdef Q_OS_LINUX - newRow("_Z3foo3bar") - << "foo(bar)"; - newRow("_Zrm1XS_") - << "operator%(X, X)"; - newRow("_ZplR1XS0_") - << "operator+(X &, X &)"; - newRow("_ZlsRK1XS1_") - << "operator<<(X const &, X const &)"; - newRow("_ZN3FooIA4_iE3barE") - << "Foo<int[4]>::bar"; - newRow("_Z5firstI3DuoEvS0_") - << "void first<Duo>(Duo)"; - newRow("_Z5firstI3DuoEvT_") - << "void first<Duo>(Duo)"; - newRow("_Z3fooIiPFidEiEvv") - << "void foo<int, int (*)(double), int>()"; - newRow("_ZN1N1fE") - << "N::f"; - newRow("_ZN6System5Sound4beepEv") - << "System::Sound::beep()"; - newRow("_ZN5Arena5levelE") - << "Arena::level"; - newRow("_ZN5StackIiiE5levelE") - << "Stack<int, int>::level"; - newRow("_Z1fI1XEvPVN1AIT_E1TE") - << "void f<X>(A<X>::T volatile *)"; - newRow("_ZngILi42EEvN1AIXplT_Li2EEE1TE") - << "void operator-<42>(A<42 + 2>::T)"; - newRow("_Z4makeI7FactoryiET_IT0_Ev") - << "Factory<int> make<Factory, int>()"; - newRow("_Z3foo5Hello5WorldS0_S_") - << "foo(Hello, World, World, Hello)"; - newRow("_Z3fooPM2ABi") - << "foo(int AB::**)"; - newRow("_ZlsRSoRKSs") - << "operator<<(std::basic_ostream<char, std::char_traits<char> > &, " - "std::basic_string<char, std::char_traits<char>, " - "std::allocator<char> > const &)"; - newRow("_ZTI7a_class") - << "typeid(a_class)"; - newRow("_ZZN1A3fooEiE1B") - << "A::foo(int)::B"; - newRow("_ZZ3foovEN1C1DE") - << "foo()::C::D"; - newRow("_ZZZ3foovEN1C3barEvEN1E3bazEv") - << "foo()::C::bar()::E::baz()"; - newRow("_ZZN1N1fEiE1p") - << "N::f(int)::p"; - newRow("_ZZN1N1fEiEs") - << "N::f(int)::{string literal}"; - newRow("_Z41__static_initialization_and_destruction_0ii") - << "__static_initialization_and_destruction_0(int, int)"; - newRow("_ZN20NameDemanglerPrivate3eoiE") - << "NameDemanglerPrivate::eoi"; - newRow("_ZZN20NameDemanglerPrivate15parseIdentifierEiE8__func__") - << "NameDemanglerPrivate::parseIdentifier(int)::__func__"; - newRow("_ZN4QSetI5QCharED1Ev") - << "QSet<QChar>::~QSet()"; - newRow("_Zne5QCharS_") - << "operator!=(QChar, QChar)"; - newRow("_ZN20NameDemanglerPrivate17parseFunctionTypeEv") - << "NameDemanglerPrivate::parseFunctionType()"; - newRow("_ZNK20NameDemanglerPrivate16ArrayNewOperator8makeExprERK11QStringList") - << "NameDemanglerPrivate::ArrayNewOperator::makeExpr(QStringList const &) const"; - newRow("_ZN13QLatin1StringC1EPKc") - << "QLatin1String::QLatin1String(char const *)"; - newRow("_ZN15QtSharedPointer16ExternalRefCountIN20NameDemanglerPrivate8OperatorEE12internalCopyIS2_EEvRKNS0_IT_EE") - << "void QtSharedPointer::ExternalRefCount<NameDemanglerPrivate::Operator>" - "::internalCopy<NameDemanglerPrivate::Operator>(QtSharedPointer" - "::ExternalRefCount<NameDemanglerPrivate::Operator> const &)"; - newRow("_ZN15QtSharedPointer16ExternalRefCountIN20NameDemanglerPrivate8OperatorEE11internalSetEPNS_20ExternalRefCountDataEPS2_") - << "QtSharedPointer::ExternalRefCount<NameDemanglerPrivate::Operator>" - "::internalSet(QtSharedPointer::ExternalRefCountData *, NameDemanglerPrivate::Operator *)"; - newRow("_ZN20NameDemanglerPrivate17parseUnscopedNameEv") - << "NameDemanglerPrivate::parseUnscopedName()"; - newRow("_ZNK7QString3argExiiRK5QChar") - << "QString::arg(long long, int, int, QChar const &) const"; - newRow("_ZN20NameDemanglerPrivate8OperatorC2ERK7QStringS3_") - << "NameDemanglerPrivate::Operator::Operator(QString const &, QString const &)"; - newRow("_ZN15QtSharedPointer16ExternalRefCountIN20NameDemanglerPrivate8OperatorEEC2EN2Qt14InitializationE") - << "QtSharedPointer::ExternalRefCount<NameDemanglerPrivate::Operator>::ExternalRefCount(Qt::Initialization)"; - newRow("_ZN7QString5clearEv") - << "QString::clear()"; - newRow("_ZNK5QListI7QStringE2atEi") - << "QList<QString>::at(int) const"; - newRow("_ZNK7QString10startsWithERKS_N2Qt15CaseSensitivityE") - << "QString::startsWith(QString const &, Qt::CaseSensitivity) const"; - newRow("_ZNK4QSetI5QCharE8constEndEv") - << "QSet<QChar>::constEnd() const"; - newRow("_Z11qt_assert_xPKcS0_S0_i") - << "qt_assert_x(char const *, char const *, char const *, int)"; - newRow("_ZN9QHashData8willGrowEv") - << "QHashData::willGrow()"; - newRow("_ZNK5QHashI5QChar15QHashDummyValueE14const_iteratorneERKS3_") - << "QHash<QChar, QHashDummyValue>::const_iterator::operator!=" - "(QHash<QChar, QHashDummyValue>::const_iterator const &) const"; - newRow("_ZNK13NameDemangler11errorStringEv") - << "NameDemangler::errorString() const"; - newRow("_ZN7QString7replaceERK7QRegExpRKS_") - << "QString::replace(QRegExp const &, QString const &)"; - newRow("_ZN7QString4freeEPNS_4DataE") - << "QString::free(QString::Data *)"; - newRow("_ZTSN20NameDemanglerPrivate19ArrayAccessOperatorE") - << "typeid(NameDemanglerPrivate::ArrayAccessOperator).name()"; - newRow("_ZN3ns11fERKPFPKiS1_RKhE") - << "ns1::f(int const * (* const &)(int const *, unsigned char const &))"; - newRow("_Z9test_funcMN3ns11cImEEKFPKvPiRlmE") - << "test_func(void const * (ns1::c<unsigned long>::*)(int *, long &, unsigned long) const)"; - newRow("_ZN3ns11fEPKPFPKiS1_RKhE") - << "ns1::f(int const * (* const *)(int const *, unsigned char const &))"; - newRow("_ZNK1CcviEv") - << "C::operator int() const"; - newRow("_ZN1CppEv") - << "C::operator++()"; - newRow("_ZN1CmmEv") - << "C::operator--()"; - newRow("_ZN1CppEi") - << "C::operator++(int)"; - newRow("_ZN1CmmEi") - << "C::operator--(int)"; - newRow("_ZNK1CcvT_IPKcEEv") - << "C::operator char const *<char const *>() const"; - newRow("_Z9weirdfuncIiEvT_KPFS0_S0_E") - << "void weirdfunc<int>(int, int (* const)(int))"; - newRow("_Z9weirdfuncIiEvT_PFS0_DtfL1p_EE") - << "void weirdfunc<int>(int, int (*)(decltype({param#1})))"; - newRow("_Z9weirdfuncIiEvT_S0_") - << "void weirdfunc<int>(int, int)"; - newRow("_Z9weirdfuncIiEvT_DtfL0p_E") - << "void weirdfunc<int>(int, decltype({param#1}))"; - newRow("_Z9weirdfuncIiEvT_S0_S0_") - << "void weirdfunc<int>(int, int, int)"; - newRow("_Z9weirdfuncIiEvT_S0_DtfL0p0_E") - << "void weirdfunc<int>(int, int, decltype({param#2}))"; - newRow("_Z8toStringIiESsT_") - << "std::basic_string<char, std::char_traits<char>, std::allocator<char> > toString<int>(int)"; - - newRow("_Z4funcIRA5_iEvOT_") - << "void func<int (&)[5]>(int (&)[5])"; - newRow("_ZSt9make_pairIiRA5_KcESt4pairINSt17__decay_and_stripIT_E6__typeENS4_IT0_E6__typeEEOS5_OS8_") - << "std::pair<std::__decay_and_strip<int>::__type, " - "std::__decay_and_strip<char const (&)[5]>::__type> " - "std::make_pair<int, char const (&)[5]>(int &&, char const (&)[5])"; - - // All examples from the ABI spec. - newRow("_ZN1S1xE") - << "S::x"; - newRow("_Z1fM1AKFvvE") - << "f(void (A::*)() const)"; - newRow("_Z1fIiEvT_") - << "void f<int>(int)"; - newRow("_Z3fooc") - << "foo(char)"; - newRow("_Z2CBIL_Z3foocEE") - << "CB<foo(char)>"; - newRow("_Z2CBIL_Z7IsEmptyEE") - << "CB<IsEmpty>"; - newRow("_ZZ1giEN1S1fE_2i") - << "g(int)::S::f(int)"; - newRow("_ZZ1gvEN1SC1Ev") - << "g()::S::S()"; - newRow("_ZZZ1gvEN1SC1EvEs") - << "g()::S::S()::{string literal}"; - newRow("_ZZ1gvE5str4a") - << "g()::str4a"; - newRow("_ZZ1gvEs_1") - << "g()::{string literal}"; - newRow("_ZZ1gvE5str4b") - << "g()::str4b"; - newRow("_Z1fPFvvEM1SFvvE") - << "f(void (*)(), void (S::*)())"; - newRow("_ZN1N1TIiiE2mfES0_IddE") - << "N::T<int, int>::mf(N::T<double, double>)"; - newRow("_ZSt5state") - << "std::state"; - newRow("_ZNSt3_In4wardE") - << "std::_In::ward"; - newRow("_Z1fN1SUt_E") - << "f(S::{unnamed type#1})"; - newRow("_ZZZ1giEN1S1fE_2iEUt1_") - << "g(int)::S::f(int)::{unnamed type#3}"; - newRow("_ZZZ1giEN1S1fE_2iENUt1_2fxEv") - << "g(int)::S::f(int)::{unnamed type#3}::fx()"; - newRow("_Z1AIcfE") - << "A<char, float>"; - newRow("_Z1fIiEvT_PDtfL0pK_E") - << "void f<int>(int, decltype({param#1 const}) *)"; - newRow("_Z1AILln42EE") - << "A<-42L>"; - newRow("_Z2f1I1QEDTpldtfp_1xdtL_Z1qE1xET_") - << "decltype({param#1}.x + q.x) f1<Q>(Q)"; - newRow("_Z2f2I1QEDTpldtfp_1xsrS0_1xET_") - << "decltype({param#1}.x + Q::x) f2<Q>(Q)"; - newRow("_Z2f3IiEDTplfp_dtL_Z1dEsr1B1XIT_EE1xES1_") - << "decltype({param#1} + d.B::X<int>::x) f3<int>(int)"; - newRow("_Z3fooILi2EEvRAplT_Li1E_i") - << "void foo<2>(int (&)[2 + 1])"; - newRow("_ZZ1giENKUlvE_clEv") - << "g(int)::{lambda()#1}::operator()() const"; - newRow("_ZZ1giENKUlvE0_clEv") - << "g(int)::{lambda()#2}::operator()() const"; - newRow("_ZNK1SIiE1xMUlvE_clEv") - << "S<int>::x::{lambda()#1}::operator()() const"; - newRow("_ZN1S4funcEii") - << "S::func(int, int)"; - - // Note: c++filt from binutils 2.22 demangles these wrong (counts default arguments from first instead of from last) - newRow("_ZZN1S1fEiiEd0_NKUlvE_clEv") - << "S::f(int, int)::{default arg#1}::{lambda()#1}::operator()() const"; - newRow("_ZZN1S1fEiiEd0_NKUlvE0_clEv") - << "S::f(int, int)::{default arg#1}::{lambda()#2}::operator()() const"; - newRow("_ZZN1S1fEiiEd_NKUlvE_clEv") - << "S::f(int, int)::{default arg#2}::{lambda()#1}::operator()() const"; - - // Note: gcc 4.6.3 encodes this as "_Z2f4I7OpClassEDTadsrT_miES1_". - newRow("_Z2f4I7OpClassEDTadsrT_onmiES0_") - << "decltype(&OpClass::operator-) f4<OpClass>(OpClass)"; -#else - qDebug("Most tests disabled outside Linux"); -#endif -} - -void NameDemanglerAutoTest::testIncorrectlyMangledNames() -{ -} - -void NameDemanglerAutoTest::testDisjunctFirstSets() -{ - for (char c = 0x20; c < 0x7e; ++c) { - - // <encoding> - QVERIFY(!NameNode::mangledRepresentationStartsWith(c) - || !SpecialNameNode::mangledRepresentationStartsWith(c)); - - // <name> - QVERIFY(!NestedNameNode::mangledRepresentationStartsWith(c) - || !UnscopedNameNode::mangledRepresentationStartsWith(c)); - QVERIFY(!NestedNameNode::mangledRepresentationStartsWith(c) - || !SubstitutionNode::mangledRepresentationStartsWith(c)); - QVERIFY(!NestedNameNode::mangledRepresentationStartsWith(c) - || !LocalNameNode::mangledRepresentationStartsWith(c)); - QVERIFY(!UnscopedNameNode::mangledRepresentationStartsWith(c) - || !SubstitutionNode::mangledRepresentationStartsWith(c) || c == 'S'); - QVERIFY(!UnscopedNameNode::mangledRepresentationStartsWith(c) - || !LocalNameNode::mangledRepresentationStartsWith(c)); - QVERIFY(!SubstitutionNode::mangledRepresentationStartsWith(c) - || !LocalNameNode::mangledRepresentationStartsWith(c)); - - // <nested-name> - QVERIFY(!CvQualifiersNode::mangledRepresentationStartsWith(c) - || !PrefixNode::mangledRepresentationStartsWith(c) || c == 'r'); - - // <prefix> - QVERIFY(!TemplateParamNode::mangledRepresentationStartsWith(c) - || !SubstitutionNode::mangledRepresentationStartsWith(c)); - QVERIFY(!TemplateArgsNode::mangledRepresentationStartsWith(c) - || !UnqualifiedNameNode::mangledRepresentationStartsWith(c)); - QVERIFY(!TemplateParamNode::mangledRepresentationStartsWith(c) - || !UnqualifiedNameNode::mangledRepresentationStartsWith(c)); - QVERIFY(!SubstitutionNode::mangledRepresentationStartsWith(c) - || !UnqualifiedNameNode::mangledRepresentationStartsWith(c)); - - // <template-arg> - QVERIFY(!TypeNode::mangledRepresentationStartsWith(c) - || !ExprPrimaryNode::mangledRepresentationStartsWith(c)); - - // <expression> - QVERIFY(!OperatorNameNode::mangledRepresentationStartsWith(c) - || !TemplateParamNode::mangledRepresentationStartsWith(c)); - QVERIFY(!OperatorNameNode::mangledRepresentationStartsWith(c) - || !FunctionParamNode::mangledRepresentationStartsWith(c)); - QVERIFY2(!OperatorNameNode::mangledRepresentationStartsWith(c) - || !UnresolvedNameNode::mangledRepresentationStartsWith(c) - || c == 'd' || c == 'g' || c == 'o' || c == 's', toString(c).constData()); - QVERIFY(!OperatorNameNode::mangledRepresentationStartsWith(c) - || !ExprPrimaryNode::mangledRepresentationStartsWith(c)); - QVERIFY(!TemplateParamNode::mangledRepresentationStartsWith(c) - || !FunctionParamNode::mangledRepresentationStartsWith(c)); - QVERIFY(!TemplateParamNode::mangledRepresentationStartsWith(c) - || !ExprPrimaryNode::mangledRepresentationStartsWith(c)); - QVERIFY(!TemplateParamNode::mangledRepresentationStartsWith(c) - || !FunctionParamNode::mangledRepresentationStartsWith(c)); - QVERIFY(!TemplateParamNode::mangledRepresentationStartsWith(c) - || !UnresolvedNameNode::mangledRepresentationStartsWith(c)); - QVERIFY(!FunctionParamNode::mangledRepresentationStartsWith(c) - || !UnresolvedNameNode::mangledRepresentationStartsWith(c)); - QVERIFY(!FunctionParamNode::mangledRepresentationStartsWith(c) - || !ExprPrimaryNode::mangledRepresentationStartsWith(c)); - - // <expr-primary> - QVERIFY(!TypeNode::mangledRepresentationStartsWith(c) - || !MangledNameRule::mangledRepresentationStartsWith(c)); - - // <type> - QVERIFY(!BuiltinTypeNode::mangledRepresentationStartsWith(c) - || !FunctionTypeNode::mangledRepresentationStartsWith(c)); - QVERIFY2(!BuiltinTypeNode::mangledRepresentationStartsWith(c) - || !ClassEnumTypeRule::mangledRepresentationStartsWith(c) || c == 'D', toString(c).constData()); - QVERIFY(!BuiltinTypeNode::mangledRepresentationStartsWith(c) - || !ArrayTypeNode::mangledRepresentationStartsWith(c)); - QVERIFY(!BuiltinTypeNode::mangledRepresentationStartsWith(c) - || !PointerToMemberTypeNode::mangledRepresentationStartsWith(c)); - QVERIFY(!BuiltinTypeNode::mangledRepresentationStartsWith(c) - || !TemplateParamNode::mangledRepresentationStartsWith(c)); - QVERIFY(!BuiltinTypeNode::mangledRepresentationStartsWith(c) - || !SubstitutionNode::mangledRepresentationStartsWith(c)); - QVERIFY(!BuiltinTypeNode::mangledRepresentationStartsWith(c) - || !CvQualifiersNode::mangledRepresentationStartsWith(c)); - QVERIFY(!BuiltinTypeNode::mangledRepresentationStartsWith(c) - || !DeclTypeNode::mangledRepresentationStartsWith(c) || c == 'D'); - QVERIFY(!FunctionTypeNode::mangledRepresentationStartsWith(c) - || !ClassEnumTypeRule::mangledRepresentationStartsWith(c)); - QVERIFY(!FunctionTypeNode::mangledRepresentationStartsWith(c) - || !ArrayTypeNode::mangledRepresentationStartsWith(c)); - QVERIFY(!FunctionTypeNode::mangledRepresentationStartsWith(c) - || !PointerToMemberTypeNode::mangledRepresentationStartsWith(c)); - QVERIFY(!FunctionTypeNode::mangledRepresentationStartsWith(c) - || !TemplateParamNode::mangledRepresentationStartsWith(c)); - QVERIFY(!FunctionTypeNode::mangledRepresentationStartsWith(c) - || !SubstitutionNode::mangledRepresentationStartsWith(c)); - QVERIFY(!FunctionTypeNode::mangledRepresentationStartsWith(c) - || !CvQualifiersNode::mangledRepresentationStartsWith(c)); - QVERIFY(!FunctionTypeNode::mangledRepresentationStartsWith(c) - || !DeclTypeNode::mangledRepresentationStartsWith(c)); - QVERIFY(!ClassEnumTypeRule::mangledRepresentationStartsWith(c) - || !ArrayTypeNode::mangledRepresentationStartsWith(c)); - QVERIFY(!ClassEnumTypeRule::mangledRepresentationStartsWith(c) - || !PointerToMemberTypeNode::mangledRepresentationStartsWith(c)); - QVERIFY(!ClassEnumTypeRule::mangledRepresentationStartsWith(c) - || !TemplateParamNode::mangledRepresentationStartsWith(c)); - QVERIFY(!ClassEnumTypeRule::mangledRepresentationStartsWith(c) - || !SubstitutionNode::mangledRepresentationStartsWith(c)); - QVERIFY(!ClassEnumTypeRule::mangledRepresentationStartsWith(c) - || !CvQualifiersNode::mangledRepresentationStartsWith(c)); - QVERIFY(!ClassEnumTypeRule::mangledRepresentationStartsWith(c) - || !DeclTypeNode::mangledRepresentationStartsWith(c) || c == 'D'); - QVERIFY(!ArrayTypeNode::mangledRepresentationStartsWith(c) - || !PointerToMemberTypeNode::mangledRepresentationStartsWith(c)); - QVERIFY(!ArrayTypeNode::mangledRepresentationStartsWith(c) - || !TemplateParamNode::mangledRepresentationStartsWith(c)); - QVERIFY(!ArrayTypeNode::mangledRepresentationStartsWith(c) - || !SubstitutionNode::mangledRepresentationStartsWith(c)); - QVERIFY(!ArrayTypeNode::mangledRepresentationStartsWith(c) - || !CvQualifiersNode::mangledRepresentationStartsWith(c)); - QVERIFY(!ArrayTypeNode::mangledRepresentationStartsWith(c) - || !DeclTypeNode::mangledRepresentationStartsWith(c)); - QVERIFY(!PointerToMemberTypeNode::mangledRepresentationStartsWith(c) - || !TemplateParamNode::mangledRepresentationStartsWith(c)); - QVERIFY(!PointerToMemberTypeNode::mangledRepresentationStartsWith(c) - || !SubstitutionNode::mangledRepresentationStartsWith(c)); - QVERIFY(!PointerToMemberTypeNode::mangledRepresentationStartsWith(c) - || !CvQualifiersNode::mangledRepresentationStartsWith(c)); - QVERIFY(!PointerToMemberTypeNode::mangledRepresentationStartsWith(c) - || !DeclTypeNode::mangledRepresentationStartsWith(c)); - QVERIFY(!TemplateParamNode::mangledRepresentationStartsWith(c) - || !SubstitutionNode::mangledRepresentationStartsWith(c)); - QVERIFY(!TemplateParamNode::mangledRepresentationStartsWith(c) - || !CvQualifiersNode::mangledRepresentationStartsWith(c)); - QVERIFY(!TemplateParamNode::mangledRepresentationStartsWith(c) - || !DeclTypeNode::mangledRepresentationStartsWith(c)); - QVERIFY(!SubstitutionNode::mangledRepresentationStartsWith(c) - || !CvQualifiersNode::mangledRepresentationStartsWith(c)); - QVERIFY(!SubstitutionNode::mangledRepresentationStartsWith(c) - || !DeclTypeNode::mangledRepresentationStartsWith(c)); - QVERIFY(!CvQualifiersNode::mangledRepresentationStartsWith(c) - || !DeclTypeNode::mangledRepresentationStartsWith(c)); - - // <unqualified-name> - QVERIFY(!OperatorNameNode::mangledRepresentationStartsWith(c) - || !CtorDtorNameNode::mangledRepresentationStartsWith(c)); - QVERIFY(!OperatorNameNode::mangledRepresentationStartsWith(c) - || !SourceNameNode::mangledRepresentationStartsWith(c)); - QVERIFY(!OperatorNameNode::mangledRepresentationStartsWith(c) - || !UnnamedTypeNameNode::mangledRepresentationStartsWith(c)); - QVERIFY(!CtorDtorNameNode::mangledRepresentationStartsWith(c) - || !SourceNameNode::mangledRepresentationStartsWith(c)); - QVERIFY(!CtorDtorNameNode::mangledRepresentationStartsWith(c) - || !UnnamedTypeNameNode::mangledRepresentationStartsWith(c)); - QVERIFY(!SourceNameNode::mangledRepresentationStartsWith(c) - || !UnnamedTypeNameNode::mangledRepresentationStartsWith(c)); - - // <array-type> - QVERIFY(!NonNegativeNumberNode<10>::mangledRepresentationStartsWith(c) - || !ExpressionNode::mangledRepresentationStartsWith(c) || std::isdigit(c)); - - // <unresolved-type> - QVERIFY(!TemplateParamNode::mangledRepresentationStartsWith(c) - || !DeclTypeNode::mangledRepresentationStartsWith(c)); - QVERIFY(!TemplateParamNode::mangledRepresentationStartsWith(c) - || !SubstitutionNode::mangledRepresentationStartsWith(c)); - QVERIFY(!DeclTypeNode::mangledRepresentationStartsWith(c) - || !SubstitutionNode::mangledRepresentationStartsWith(c)); - - // <desctructor-name> - QVERIFY(!UnresolvedTypeRule::mangledRepresentationStartsWith(c) - || !SimpleIdNode::mangledRepresentationStartsWith(c)); - } - - // <template-args>, <template-arg> - QVERIFY(!TemplateArgNode::mangledRepresentationStartsWith('E')); - - // <template-arg> - QVERIFY(!TypeNode::mangledRepresentationStartsWith('X') - && !TypeNode::mangledRepresentationStartsWith('J') - /* && !TypeNode::mangledRepresentationStartsWith('s') */); - QVERIFY(!ExprPrimaryNode::mangledRepresentationStartsWith('X') - && !ExprPrimaryNode::mangledRepresentationStartsWith('J') - && !ExprPrimaryNode::mangledRepresentationStartsWith('s')); - - // <expression> - QVERIFY(!TemplateParamNode::mangledRepresentationStartsWith('c') - && !TemplateParamNode::mangledRepresentationStartsWith('s') - && !TemplateParamNode::mangledRepresentationStartsWith('a')); - QVERIFY(!FunctionParamNode::mangledRepresentationStartsWith('c') - && !FunctionParamNode::mangledRepresentationStartsWith('c') - && !FunctionParamNode::mangledRepresentationStartsWith('c')); - QVERIFY(!ExprPrimaryNode::mangledRepresentationStartsWith('c') - && !ExprPrimaryNode::mangledRepresentationStartsWith('s') - && !ExprPrimaryNode::mangledRepresentationStartsWith('a')); - QVERIFY(!ExpressionNode::mangledRepresentationStartsWith('E')); - QVERIFY(!ExpressionNode::mangledRepresentationStartsWith('_')); - QVERIFY(!InitializerNode::mangledRepresentationStartsWith('E')); - - // <type> - QVERIFY(!BuiltinTypeNode::mangledRepresentationStartsWith('P') - && !BuiltinTypeNode::mangledRepresentationStartsWith('R') - && !BuiltinTypeNode::mangledRepresentationStartsWith('O') - && !BuiltinTypeNode::mangledRepresentationStartsWith('C') - && !BuiltinTypeNode::mangledRepresentationStartsWith('G') - && !BuiltinTypeNode::mangledRepresentationStartsWith('U')); - QVERIFY(!FunctionTypeNode::mangledRepresentationStartsWith('P') - && !FunctionTypeNode::mangledRepresentationStartsWith('R') - && !FunctionTypeNode::mangledRepresentationStartsWith('O') - && !FunctionTypeNode::mangledRepresentationStartsWith('C') - && !FunctionTypeNode::mangledRepresentationStartsWith('G') - && !FunctionTypeNode::mangledRepresentationStartsWith('U') - && !FunctionTypeNode::mangledRepresentationStartsWith('D')); - QVERIFY(!ClassEnumTypeRule::mangledRepresentationStartsWith('P') - && !ClassEnumTypeRule::mangledRepresentationStartsWith('R') - && !ClassEnumTypeRule::mangledRepresentationStartsWith('O') - && !ClassEnumTypeRule::mangledRepresentationStartsWith('C') - && !ClassEnumTypeRule::mangledRepresentationStartsWith('G') - && !ClassEnumTypeRule::mangledRepresentationStartsWith('U') - /* && !firstSetClassEnumType.contains('D') */); - QVERIFY(!ArrayTypeNode::mangledRepresentationStartsWith('P') - && !ArrayTypeNode::mangledRepresentationStartsWith('R') - && !ArrayTypeNode::mangledRepresentationStartsWith('O') - && !ArrayTypeNode::mangledRepresentationStartsWith('C') - && !ArrayTypeNode::mangledRepresentationStartsWith('G') - && !ArrayTypeNode::mangledRepresentationStartsWith('U') - && !ArrayTypeNode::mangledRepresentationStartsWith('D')); - QVERIFY(!PointerToMemberTypeNode::mangledRepresentationStartsWith('P') - && !PointerToMemberTypeNode::mangledRepresentationStartsWith('R') - && !PointerToMemberTypeNode::mangledRepresentationStartsWith('O') - && !PointerToMemberTypeNode::mangledRepresentationStartsWith('C') - && !PointerToMemberTypeNode::mangledRepresentationStartsWith('G') - && !PointerToMemberTypeNode::mangledRepresentationStartsWith('U') - && !PointerToMemberTypeNode::mangledRepresentationStartsWith('D')); - QVERIFY(!TemplateParamNode::mangledRepresentationStartsWith('P') - && !TemplateParamNode::mangledRepresentationStartsWith('R') - && !TemplateParamNode::mangledRepresentationStartsWith('O') - && !TemplateParamNode::mangledRepresentationStartsWith('C') - && !TemplateParamNode::mangledRepresentationStartsWith('G') - && !TemplateParamNode::mangledRepresentationStartsWith('U') - && !TemplateParamNode::mangledRepresentationStartsWith('D')); - QVERIFY(!SubstitutionNode::mangledRepresentationStartsWith('P') - && !SubstitutionNode::mangledRepresentationStartsWith('R') - && !SubstitutionNode::mangledRepresentationStartsWith('O') - && !SubstitutionNode::mangledRepresentationStartsWith('C') - && !SubstitutionNode::mangledRepresentationStartsWith('G') - && !SubstitutionNode::mangledRepresentationStartsWith('U') - && !SubstitutionNode::mangledRepresentationStartsWith('D')); - QVERIFY(!CvQualifiersNode::mangledRepresentationStartsWith('P') - && !CvQualifiersNode::mangledRepresentationStartsWith('R') - && !CvQualifiersNode::mangledRepresentationStartsWith('O') - && !CvQualifiersNode::mangledRepresentationStartsWith('C') - && !CvQualifiersNode::mangledRepresentationStartsWith('G') - && !CvQualifiersNode::mangledRepresentationStartsWith('U') - && !CvQualifiersNode::mangledRepresentationStartsWith('D')); - QVERIFY(!DeclTypeNode::mangledRepresentationStartsWith('P') - && !DeclTypeNode::mangledRepresentationStartsWith('R') - && !DeclTypeNode::mangledRepresentationStartsWith('O') - && !DeclTypeNode::mangledRepresentationStartsWith('C') - && !DeclTypeNode::mangledRepresentationStartsWith('G') - && !DeclTypeNode::mangledRepresentationStartsWith('U')); - - // <array-type> - QVERIFY(!NonNegativeNumberNode<10>::mangledRepresentationStartsWith('_')); - QVERIFY(!ExpressionNode::mangledRepresentationStartsWith('_')); - - // <substitution> - QVERIFY(!NonNegativeNumberNode<36>::mangledRepresentationStartsWith('_') - && !NonNegativeNumberNode<36>::mangledRepresentationStartsWith('t') - && !NonNegativeNumberNode<36>::mangledRepresentationStartsWith('a') - && !NonNegativeNumberNode<36>::mangledRepresentationStartsWith('b') - && !NonNegativeNumberNode<36>::mangledRepresentationStartsWith('s') - && !NonNegativeNumberNode<36>::mangledRepresentationStartsWith('i') - && !NonNegativeNumberNode<36>::mangledRepresentationStartsWith('o') - && !NonNegativeNumberNode<36>::mangledRepresentationStartsWith('d')); - - // <special-name> - QVERIFY(!CallOffsetRule::mangledRepresentationStartsWith('V') - && !CallOffsetRule::mangledRepresentationStartsWith('T') - && !CallOffsetRule::mangledRepresentationStartsWith('I') - && !CallOffsetRule::mangledRepresentationStartsWith('S') - && !CallOffsetRule::mangledRepresentationStartsWith('c')); - - // <unscoped-name> - QVERIFY(!UnqualifiedNameNode::mangledRepresentationStartsWith('S')); - - // <prefix> - QVERIFY(!TemplateArgsNode::mangledRepresentationStartsWith('M')); - QVERIFY(!UnqualifiedNameNode::mangledRepresentationStartsWith('M')); - - // <base-unresolved-name> - QVERIFY(!SimpleIdNode::mangledRepresentationStartsWith('o')); - QVERIFY(!SimpleIdNode::mangledRepresentationStartsWith('d')); - - // <initializer> - QVERIFY(!ExpressionNode::mangledRepresentationStartsWith('E')); - - // <unresolved-name-node> - QVERIFY(!BaseUnresolvedNameNode::mangledRepresentationStartsWith('g')); - QVERIFY(!BaseUnresolvedNameNode::mangledRepresentationStartsWith('s')); - QVERIFY(!UnresolvedTypeRule::mangledRepresentationStartsWith('N')); - QVERIFY(!UnresolvedQualifierLevelRule::mangledRepresentationStartsWith('N')); - QVERIFY(!UnresolvedQualifierLevelRule::mangledRepresentationStartsWith('E')); -} - -void NameDemanglerAutoTest::testIncorrectlyMangledName( - const QString &mangledName) -{ - QVERIFY(!demangler.demangle(mangledName)); -} - -QTEST_MAIN(NameDemanglerAutoTest) - -#include "tst_namedemangler.moc" diff --git a/tests/auto/extensionsystem/pluginmanager/tst_pluginmanager.cpp b/tests/auto/extensionsystem/pluginmanager/tst_pluginmanager.cpp index c3c144a16c..7d47a6496a 100644 --- a/tests/auto/extensionsystem/pluginmanager/tst_pluginmanager.cpp +++ b/tests/auto/extensionsystem/pluginmanager/tst_pluginmanager.cpp @@ -77,6 +77,7 @@ static QString pluginFolder(const QLatin1String &folder) void tst_PluginManager::init() { m_pm = new PluginManager; + m_pm->setSettings(new QSettings); m_pm->setPluginIID(QLatin1String("plugin")); m_objectAdded = new QSignalSpy(m_pm, SIGNAL(objectAdded(QObject*))); m_aboutToRemoveObject = new QSignalSpy(m_pm, SIGNAL(aboutToRemoveObject(QObject*))); diff --git a/tests/auto/qml/codemodel/check/RequiredListProperties.qml b/tests/auto/qml/codemodel/check/RequiredListProperties.qml new file mode 100644 index 0000000000..38c604e463 --- /dev/null +++ b/tests/auto/qml/codemodel/check/RequiredListProperties.qml @@ -0,0 +1,6 @@ +import QtQuick 2.15 + +Item { + required property list<Item> listA + default required property list<Rectangle> listDefault +} diff --git a/tests/auto/qml/codemodel/check/RequiredListPropertiesUser.qml b/tests/auto/qml/codemodel/check/RequiredListPropertiesUser.qml new file mode 100644 index 0000000000..d8ac85d27c --- /dev/null +++ b/tests/auto/qml/codemodel/check/RequiredListPropertiesUser.qml @@ -0,0 +1,7 @@ +import QtQuick 2.15 + +RequiredListProperties { + Rectangle {} + Rectangle {} + listA: [Item {}, Item {}] +} diff --git a/tests/auto/qml/codemodel/check/case-fallthrough.qml b/tests/auto/qml/codemodel/check/case-fallthrough.qml index a1851da564..186d58df4b 100644 --- a/tests/auto/qml/codemodel/check/case-fallthrough.qml +++ b/tests/auto/qml/codemodel/check/case-fallthrough.qml @@ -2,7 +2,7 @@ import QtQuick 2.0 Item { x: { - switch (a) { + switch (a) { // 108 17 17 case 1: case 2: x = 1 @@ -21,7 +21,7 @@ Item { break case 9: } - switch (a) { + switch (a) { // 108 17 17 case 1: case 2: // 20 9 12 x = 1 diff --git a/tests/auto/qml/codemodel/check/equality-checks.qml b/tests/auto/qml/codemodel/check/equality-checks.qml index e92b1c4cc1..1e815e7148 100644 --- a/tests/auto/qml/codemodel/check/equality-checks.qml +++ b/tests/auto/qml/codemodel/check/equality-checks.qml @@ -1,4 +1,4 @@ -import Qt 4.7 +import QtQuick 1.0 Rectangle { function foo(k) { @@ -10,54 +10,54 @@ Rectangle { var b = true var o = {} - if (s == s) {} + if (s == s) {} // -1 15 16 # false positive if (s == n) {} // 126 15 16 - if (s == N) {} // ### should warn: always false - if (s == u) {} // ### should warn: always false + if (s == N) {} // -2 15 16 # wrong warning (always false) + if (s == u) {} // -2 15 16 # wrong warning (always false) if (s == b) {} // 126 15 16 if (s == o) {} // 126 15 16 if (s == k) {} // 126 15 16 if (n == s) {} // 126 15 16 - if (n == n) {} - if (n == N) {} // ### should warn: always false - if (n == u) {} // ### should warn: always false + if (n == n) {} // -1 15 16 # false positive + if (n == N) {} // -2 15 16 # wrong warning (always false) + if (n == u) {} // -2 15 16 # wrong warning (always false) if (n == b) {} // 126 15 16 if (n == o) {} // 126 15 16 if (n == k) {} // 126 15 16 - if (N == s) {} // ### should warn: always false - if (N == n) {} // ### should warn: always false - if (N == N) {} - if (N == u) {} // ### should warn: always true - // ### should warn: always false - if (N == b) {} // 126 15 16 - if (N == o) {} // ### should warn: always false + if (N == s) {} // -2 15 16 # wrong warning (always false) + if (N == n) {} // -2 15 16 # wrong warning (always false) + if (N == N) {} // -1 15 16 # false positive + if (N == u) {} // -2 15 16 # wrong warning (always true) + + if (N == b) {} // -2 15 16 # wrong warning (always false) + if (N == o) {} // -2 15 16 # wrong warning (always false) if (N == k) {} // 126 15 16 - if (u == s) {} // ### should warn: always false - if (u == n) {} // ### should warn: always false - if (u == N) {} // ### should warn: always true - if (u == u) {} // ### should warn: always true - if (u == b) {} // ### should warn: always false - if (u == o) {} // ### should warn: always false + if (u == s) {} // -2 15 16 # wrong warning (always false) + if (u == n) {} // -2 15 16 # wrong warning (always false) + if (u == N) {} // -2 15 16 # wrong warning (always true) + if (u == u) {} // -2 15 16 # wrong warning (always true) + if (u == b) {} // -2 15 16 # wrong warning (always false) + if (u == o) {} // -2 15 16 # wrong warning (always false) if (u == k) {} // 126 15 16 if (b == s) {} // 126 15 16 if (b == n) {} // 126 15 16 - // ### should warn: always false - if (b == N) {} // 126 15 16 - if (b == u) {} // ### should warn: always false - if (b == b) {} + + if (b == N) {} // -2 15 16 # wrong warning (always false) + if (b == u) {} // -2 15 16 # wrong warning (always false) + if (b == b) {} // -1 15 16 # false positive if (b == o) {} // 126 15 16 if (b == k) {} // 126 15 16 if (o == s) {} // 126 15 16 if (o == n) {} // 126 15 16 - if (o == N) {} // ### should warn: always false - if (o == u) {} // ### should warn: always false + if (o == N) {} // -2 15 16 # wrong warning (always false) + if (o == u) {} // -2 15 16 # wrong warning (always false) if (o == b) {} // 126 15 16 - if (o == o) {} + if (o == o) {} // -1 15 16 # false positive if (o == k) {} // 126 15 16 if (k == s) {} // 126 15 16 diff --git a/tests/auto/qml/codemodel/check/tst_check.cpp b/tests/auto/qml/codemodel/check/tst_check.cpp index 38342f6267..ca5c6a5e86 100644 --- a/tests/auto/qml/codemodel/check/tst_check.cpp +++ b/tests/auto/qml/codemodel/check/tst_check.cpp @@ -131,9 +131,10 @@ void tst_Check::test() QList<Message> messages = checker(); std::sort(messages.begin(), messages.end(), &offsetComparator); - const QRegularExpression messagePattern(" (\\d+) (\\d+) (\\d+)"); + const QRegularExpression messagePattern(" (-?\\d+) (\\d+) (\\d+)\\s*(# false positive|# wrong warning.*)?"); QList<Message> expectedMessages; + QHash<int, QString> xfails; for (const SourceLocation &comment : doc->engine()->comments()) { const QString text = doc->source().mid(comment.begin(), comment.end() - comment.begin()); const QRegularExpressionMatch match = messagePattern.match(text); @@ -151,6 +152,9 @@ void tst_Check::test() columnStart), message.type = static_cast<QmlJS::StaticAnalysis::Type>(type); expectedMessages += message; + + if (messagePattern.captureCount() == 4 && !match.captured(4).isEmpty()) + xfails.insert(expectedMessages.size() - 1, match.captured(4)); } for (int i = 0; i < messages.size(); ++i) { @@ -160,6 +164,9 @@ void tst_Check::test() Message expected = expectedMessages.at(i); bool fail = false; fail |= !QCOMPARE_NOEXIT(actual.location.startLine, expected.location.startLine); + auto xFail = xfails.find(i); + if (xFail != xfails.end()) + QEXPECT_FAIL(path.toUtf8(), xFail.value().toUtf8(), Continue); fail |= !QCOMPARE_NOEXIT((int)actual.type, (int)expected.type); if (fail) return; @@ -176,7 +183,10 @@ void tst_Check::test() Message missingMessage = expectedMessages.at(i); qDebug() << "expected message of type" << missingMessage.type << "on line" << missingMessage.location.startLine; } - QFAIL("more messages expected"); + if (path.endsWith("avoid-var.qml")) + QEXPECT_FAIL(path.toUtf8(), "currently broken", Continue); + + QVERIFY2(false, "more messages expected"); } if (expectedMessages.size() < messages.size()) { for (int i = expectedMessages.size(); i < messages.size(); ++i) { diff --git a/tests/system/shared/editor_utils.py b/tests/system/shared/editor_utils.py index 52430e7021..db59353883 100644 --- a/tests/system/shared/editor_utils.py +++ b/tests/system/shared/editor_utils.py @@ -73,8 +73,10 @@ def menuVisibleAtEditor(editor, menuInList): menu = waitForObject("{type='QMenu' unnamed='1' visible='1'}", 500) topLeft = menu.mapToGlobal(QPoint(0, 0)) bottomLeft = menu.mapToGlobal(QPoint(0, menu.height)) + center = menu.mapToGlobal(QPoint(menu.width / 2, menu.height / 2)) success = menu.visible and (widgetContainsPoint(editor, topLeft) - or widgetContainsPoint(editor, bottomLeft)) + or widgetContainsPoint(editor, bottomLeft) + or widgetContainsPoint(editor, center)) if success: menuInList[0] = menu return success diff --git a/tests/system/suite_CSUP/tst_CSUP01/test.py b/tests/system/suite_CSUP/tst_CSUP01/test.py index 7c77bf6966..2580ed0655 100644 --- a/tests/system/suite_CSUP/tst_CSUP01/test.py +++ b/tests/system/suite_CSUP/tst_CSUP01/test.py @@ -111,7 +111,7 @@ def main(): proposal = "return" if useClang: # clang adds a whitespace because the function needs to return a value - proposal += " " + proposal += " ;" waitForObjectItem(":popupFrame_Proposal_QListView", proposal) except: test.fail("Could not find proposal popup.") diff --git a/tests/unit/unittest/CMakeLists.txt b/tests/unit/unittest/CMakeLists.txt index 9ae0b9c9a9..b9206c5cbb 100644 --- a/tests/unit/unittest/CMakeLists.txt +++ b/tests/unit/unittest/CMakeLists.txt @@ -15,12 +15,13 @@ endif() add_qtc_test(unittest GTEST INCLUDES BEFORE "../mockup" + BEFORE "../mockup/qmldesigner/designercore/include" DEPENDS Qt5::Core Qt5::Network Qt5::Widgets Qt5::Xml Qt5::Concurrent Qt5::Qml Qt5::Gui Googletest clangrefactoringbackend_lib clangbackend_lib clangpchmanagerbackend_lib - CPlusPlus Utils + CPlusPlus Utils QmlDesigner DEFINES QT_NO_CAST_TO_ASCII QT_RESTRICTED_CAST_FROM_ASCII diff --git a/tests/unit/unittest/clang_dependency.pri b/tests/unit/unittest/clang_dependency.pri index ef67eac528..100bda296d 100644 --- a/tests/unit/unittest/clang_dependency.pri +++ b/tests/unit/unittest/clang_dependency.pri @@ -18,7 +18,7 @@ include(../../../src/shared/clang/clang_defines.pri) LIBS += $$ALL_CLANG_LIBS - !contains(QMAKE_DEFAULT_LIBDIRS, $$LLVM_LIBDIR): QMAKE_RPATHDIR += $$LLVM_LIBDIR + !contains(QMAKE_DEFAULT_LIBDIRS, $$re_escape($$LLVM_LIBDIR)): QMAKE_RPATHDIR += $$LLVM_LIBDIR LLVM_CXXFLAGS ~= s,-g\d?, QMAKE_CXXFLAGS_WARN_ON *= $$LLVM_CXXFLAGS_WARNINGS diff --git a/tests/unit/unittest/compilationdatabaseutils-test.cpp b/tests/unit/unittest/compilationdatabaseutils-test.cpp index cae74fa807..3cbb8ac8eb 100644 --- a/tests/unit/unittest/compilationdatabaseutils-test.cpp +++ b/tests/unit/unittest/compilationdatabaseutils-test.cpp @@ -90,7 +90,6 @@ TEST_F(CompilationDatabaseUtils, FilterArguments) "-DUNICODE", "-DRELATIVE_PLUGIN_PATH=\"../lib/qtcreator/plugins\"", "-DQT_CREATOR", - "-fPIC", "-I", QString::fromUtf8(HostOsInfo::isWindowsHost() ? winPath1 : otherPath1), "-I", diff --git a/tests/unit/unittest/refactoringclient-test.cpp b/tests/unit/unittest/refactoringclient-test.cpp index 81036feba0..a07f7cea14 100644 --- a/tests/unit/unittest/refactoringclient-test.cpp +++ b/tests/unit/unittest/refactoringclient-test.cpp @@ -199,7 +199,7 @@ TEST_F(RefactoringClient, ResultCounterIsZeroAfterSettingExpectedResultCount) TEST_F(RefactoringClient, XXX) { - const Core::Search::TextRange textRange{{1,0,1},{1,0,1}}; + const Core::Search::TextRange textRange{{1,0},{1,0}}; const ClangBackEnd::SourceRangeWithTextContainer sourceRange{1, 1, 1, 1, 1, 1, 1, "function"}; EXPECT_CALL(mockSearchHandle, addResult(QString("/path/to/file"), QString("function"), textRange)) diff --git a/tests/unit/unittest/unittest.qbs b/tests/unit/unittest/unittest.qbs index 73bfa92ac0..c2e21f767f 100644 --- a/tests/unit/unittest/unittest.qbs +++ b/tests/unit/unittest/unittest.qbs @@ -28,6 +28,7 @@ QtcProduct { Depends { name: "gtest"; required: false } Depends { name: "gmock"; required: false } + pluginjson.useVcsData: false sqlite_sources.buildSharedLib: false cpp.defines: { |