diff options
195 files changed, 3473 insertions, 2849 deletions
diff --git a/doc/src/editors/creator-clang-codemodel.qdoc b/doc/src/editors/creator-clang-codemodel.qdoc index 4b29842e96..c3e52e6a9b 100644 --- a/doc/src/editors/creator-clang-codemodel.qdoc +++ b/doc/src/editors/creator-clang-codemodel.qdoc @@ -93,6 +93,7 @@ \li Code completion \li Syntactic and semantic highlighting \li Diagnostics + \li Tooltips \endlist diff --git a/doc/src/editors/creator-editors.qdoc b/doc/src/editors/creator-editors.qdoc index 79742e736f..72023523c3 100644 --- a/doc/src/editors/creator-editors.qdoc +++ b/doc/src/editors/creator-editors.qdoc @@ -2866,6 +2866,9 @@ \li Running text editing macros that you record and save (\c {rm}). For more information, see \l{Using Text Editing Macros} + \li Executing JavaScript (\c {=}), especially useful for calculations. + For more information, see \l{Executing JavaScript}. + \li Executing shell commands (\c {!}) \li Executing version control system commands (\c {git}). For more @@ -3048,4 +3051,86 @@ \endlist + \section1 Executing JavaScript + + The locator provides access to a JavaScript interpreter, that can be used to + perform calculations. + + Beside simple mathematical operations, like ((1 + 2) * 3), the following + built-in functions exist: + + \table + \header + \li Function + \li Purpose + \row + \li abs(x) + \li Returns the absolute value of x + \row + \li acos(x) + \li Returns the arccosine of x, in radians + \row + \li asin(x) + \li Returns the arcsine of x, in radians + \row + \li atan(x) + \li Returns the arctangent of x, in radians + \row + \li atan2(x, y) + \li Returns the arctangent of the quotient of its arguments + \row + \li bin(x) + \li Returns the binary representation of x + \row + \li ceil(x) + \li Returns the value of x rounded up to the next integer + \row + \li cos(x) + \li Returns the cosine of x (x is in radians) + \row + \li exp(x) + \li Returns the value of E to the power of x + \row + \li e() + \li Returns Euler's number E (2.71828...) + \row + \li floor(x) + \li Returns the value of x rounded down to the next integer + \row + \li hex(x) + \li Returns the hexadecimal representation of x + \row + \li log(x) + \li Returns the natural logarithm (base E) of x + \row + \li max(x, y) + \li Returns the higher value of x and y + \row + \li min(x, y) + \li Returns the lower value of x and y + \row + \li oct(x) + \li Returns the octal representation of x + \row + \li pi() + \li Returns PI (3.14159...) + \row + \li pow(x, y) + \li Returns the value of x to the power of y + \row + \li random() + \li Returns a random number between 0 and 1 + \row + \li round(x) + \li Returns the value of x rounded to the next integer + \row + \li sin(x) + \li Returns the sine of x (x is in radians) + \row + \li sqrt(x) + \li Returns the square root of x + \row + \li tan(x) + \li Returns the tangent of x (x is in radians) + \endtable */ diff --git a/doc/src/howto/creator-cli.qdoc b/doc/src/howto/creator-cli.qdoc index c64d693687..8cfb2b7dc5 100644 --- a/doc/src/howto/creator-cli.qdoc +++ b/doc/src/howto/creator-cli.qdoc @@ -174,8 +174,8 @@ \li -debug <executable>[,kit=<kit>] \li Debugger plugin: launch and debug the executable with the name \c{executable}. - A \c{kit} can be specified to point to non-default debuggers - and sysroots. + A \c{kit} can be specified by ID or name to point to non-default + debuggers and sysroots. \row \li -debug [executable,]core=<corefile>[,kit=<kit>] @@ -186,8 +186,8 @@ it from the core file itself. This will fail for paths with more than about 80 characters. In such cases the \c{executable} parameter is mandatory. - A \c{kit} can be specified to point to non-default debuggers - and sysroots. + A \c{kit} can be specified by ID or name to point to non-default + debuggers and sysroots. \row \li -debug <executable>,server=<server:port>[,kit=<kit>] @@ -195,8 +195,8 @@ \c{port} on the server \c{server}. The parameter \c{executable} specifies a local copy of the executable the remote debug server is manipulating. - A \c{kit} can be specified to point to non-default debuggers and - sysroots. + A \c{kit} can be specified by ID or name to point to non-default + debuggers and sysroots. \row \li -wincrashevent <event-handle:pid> diff --git a/qbs/imports/QtcProduct.qbs b/qbs/imports/QtcProduct.qbs index ef19ce4987..fc6c2502e4 100644 --- a/qbs/imports/QtcProduct.qbs +++ b/qbs/imports/QtcProduct.qbs @@ -22,18 +22,22 @@ Product { Depends { name: product.name + " dev headers"; required: false } Depends { name: "Qt.core"; versionAtLeast: "5.6.2" } - Properties { - condition: Utilities.versionCompare(Qt.core.version, "5.7") < 0 - cpp.minimumMacosVersion: project.minimumMacosVersion - } + // TODO: Should fall back to what came from Qt.core for Qt < 5.7, but we cannot express that + // atm. Conditionally pulling in a module that sets the property is also not possible, + // because conflicting scalar values would be reported (QBS-1225 would fix that). + cpp.minimumMacosVersion: project.minimumMacosVersion Properties { condition: qbs.toolchain.contains("gcc") && !qbs.toolchain.contains("clang") cpp.cxxFlags: base.concat(["-Wno-noexcept-type"]) } + Properties { + condition: qbs.toolchain.contains("msvc") + cpp.cxxFlags: base.concat(["/w44996"]) + } cpp.cxxLanguageVersion: "c++14" cpp.defines: qtc.generalDefines - cpp.minimumWindowsVersion: qbs.architecture === "x86" ? "5.1" : "5.2" + cpp.minimumWindowsVersion: "6.1" cpp.useCxxPrecompiledHeader: useNonGuiPchFile || useGuiPchFile cpp.visibility: "minimal" diff --git a/qbs/modules/libclang/functions.js b/qbs/modules/libclang/functions.js index 3b74066562..29d093dcad 100644 --- a/qbs/modules/libclang/functions.js +++ b/qbs/modules/libclang/functions.js @@ -29,7 +29,7 @@ function isSuitableLLVMConfig(llvmConfigCandidate, qtcFunctions) return false; } -function llvmConfig(qbs, qtcFunctions) +function llvmConfig(hostOS, qtcFunctions) { var llvmInstallDirFromEnv = Environment.getEnv("LLVM_INSTALL_DIR") var llvmConfigVariants = [ @@ -37,7 +37,7 @@ function llvmConfig(qbs, qtcFunctions) ]; // Prefer llvm-config* from LLVM_INSTALL_DIR - var suffix = qbs.hostOS.contains("windows") ? ".exe" : ""; + var suffix = hostOS.contains("windows") ? ".exe" : ""; if (llvmInstallDirFromEnv) { for (var i = 0; i < llvmConfigVariants.length; ++i) { var variant = llvmInstallDirFromEnv + "/bin/" + llvmConfigVariants[i] + suffix; @@ -48,7 +48,7 @@ function llvmConfig(qbs, qtcFunctions) // Find llvm-config* in PATH var pathListString = Environment.getEnv("PATH"); - var separator = qbs.hostOS.contains("windows") ? ";" : ":"; + var separator = hostOS.contains("windows") ? ";" : ":"; var pathList = pathListString.split(separator); for (var i = 0; i < llvmConfigVariants.length; ++i) { for (var j = 0; j < pathList.length; ++j) { diff --git a/qbs/modules/libclang/libclang.qbs b/qbs/modules/libclang/libclang.qbs index e4253cc105..3b68faa0bb 100644 --- a/qbs/modules/libclang/libclang.qbs +++ b/qbs/modules/libclang/libclang.qbs @@ -9,6 +9,9 @@ Module { Probe { id: clangProbe + property stringList hostOS: qbs.hostOS + property stringList targetOS: qbs.targetOS + property string llvmConfig property string llvmVersion property string llvmIncludeDir @@ -21,12 +24,12 @@ Module { property string llvmBuildMode configure: { - llvmConfig = ClangFunctions.llvmConfig(qbs, QtcFunctions); + llvmConfig = ClangFunctions.llvmConfig(hostOS, QtcFunctions); llvmVersion = ClangFunctions.version(llvmConfig); llvmIncludeDir = ClangFunctions.includeDir(llvmConfig); llvmLibDir = ClangFunctions.libDir(llvmConfig); - llvmLibs = ClangFunctions.libraries(qbs.targetOS); - llvmToolingLibs = ClangFunctions.toolingLibs(llvmConfig, qbs.targetOS); + llvmLibs = ClangFunctions.libraries(targetOS); + llvmToolingLibs = ClangFunctions.toolingLibs(llvmConfig, targetOS); llvmBuildMode = ClangFunctions.buildMode(llvmConfig); var toolingParams = ClangFunctions.toolingParameters(llvmConfig); llvmToolingDefines = toolingParams.defines; diff --git a/qbs/modules/qbsbuildconfig/qbsbuildconfig.qbs b/qbs/modules/qbsbuildconfig/qbsbuildconfig.qbs index 492a6fe457..6c77099906 100644 --- a/qbs/modules/qbsbuildconfig/qbsbuildconfig.qbs +++ b/qbs/modules/qbsbuildconfig/qbsbuildconfig.qbs @@ -14,7 +14,7 @@ Module { ? ["@loader_path/" + FileInfo.relativePath('/' + appInstallDir, '/' + libInstallDir)] : ["$ORIGIN/..", "$ORIGIN/../" + qtc.ide_library_path] property string resourcesInstallDir: qtc.ide_data_path + "/qbs" - property string pluginsInstallDir: qtc.ide_plugin_path + property string pluginsInstallDir: qtc.ide_plugin_path + "/qbs/plugins" property string appInstallDir: qtc.ide_bin_path property string libexecInstallDir: qtc.ide_libexec_path property bool installHtml: false diff --git a/qbs/modules/qtc/qtc.qbs b/qbs/modules/qtc/qtc.qbs index 416e27e4e8..f3f3bf7827 100644 --- a/qbs/modules/qtc/qtc.qbs +++ b/qbs/modules/qtc/qtc.qbs @@ -85,6 +85,7 @@ Module { "QT_USE_FAST_OPERATOR_PLUS", "QT_USE_FAST_CONCATENATION", ].concat(testsEnabled ? ["WITH_TESTS"] : []) + .concat(qbs.toolchain.contains("msvc") ? ["_CRT_SECURE_NO_WARNINGS"] : []) Rule { condition: make_dev_package diff --git a/qtcreator.pri b/qtcreator.pri index a53b1fe9ed..de815b131e 100644 --- a/qtcreator.pri +++ b/qtcreator.pri @@ -106,7 +106,7 @@ osx { # check if IDE_BUILD_TREE is actually an existing Qt Creator.app, # for building against a binary package - exists($$IDE_BUILD_TREE/Contents/MacOS/Qt Creator): IDE_APP_BUNDLE = $$IDE_BUILD_TREE + exists($$IDE_BUILD_TREE/Contents/MacOS/$$IDE_APP_TARGET): IDE_APP_BUNDLE = $$IDE_BUILD_TREE else: IDE_APP_BUNDLE = $$IDE_APP_PATH/$${IDE_APP_TARGET}.app # set output path if not set manually diff --git a/qtcreator.pro b/qtcreator.pro index d8a95fc222..c8ea8ddd37 100644 --- a/qtcreator.pro +++ b/qtcreator.pro @@ -2,7 +2,7 @@ include(qtcreator.pri) #version check qt !minQtVersion(5, 6, 2) { - message("Cannot build Qt Creator with Qt version $${QT_VERSION}.") + message("Cannot build $$IDE_DISPLAY_NAME with Qt version $${QT_VERSION}.") error("Use at least Qt 5.6.2.") } @@ -108,11 +108,11 @@ linux { } macx { - APPBUNDLE = "$$OUT_PWD/bin/Qt Creator.app" - BINDIST_SOURCE = "$$OUT_PWD/bin/Qt Creator.app" + APPBUNDLE = "$$OUT_PWD/bin/$${IDE_APP_TARGET}.app" + BINDIST_SOURCE = "$$OUT_PWD/bin/$${IDE_APP_TARGET}.app" deployqt.commands = $$PWD/scripts/deployqtHelper_mac.sh \"$${APPBUNDLE}\" \"$$[QT_INSTALL_BINS]\" \"$$[QT_INSTALL_TRANSLATIONS]\" \"$$[QT_INSTALL_PLUGINS]\" \"$$[QT_INSTALL_IMPORTS]\" \"$$[QT_INSTALL_QML]\" codesign.commands = codesign --deep -s \"$(SIGNING_IDENTITY)\" $(SIGNING_FLAGS) \"$${APPBUNDLE}\" - dmg.commands = $$PWD/scripts/makedmg.sh $$OUT_PWD/bin $${BASENAME}.dmg + dmg.commands = python -u \"$$PWD/scripts/makedmg.py\" \"$${BASENAME}.dmg\" \"Qt Creator\" \"$$IDE_SOURCE_TREE\" \"$$OUT_PWD/bin\" #dmg.depends = deployqt QMAKE_EXTRA_TARGETS += codesign dmg } else { diff --git a/scripts/common.py b/scripts/common.py index 388ce487fd..b8f640377e 100644 --- a/scripts/common.py +++ b/scripts/common.py @@ -163,3 +163,17 @@ def fix_rpaths(path, qt_deploy_path, qt_install_info, chrpath=None): if is_unix_executable(filepath) or is_unix_library(filepath): fix_rpaths_helper(filepath) +def is_debug_file(filepath): + if is_mac_platform(): + return filepath.endswith('.dSYM') or '.dSYM/' in filepath + elif is_linux_platform(): + return filepath.endswith('.debug') + else: + return filepath.endswith('.pdb') + +def is_debug(path, filenames): + return [fn for fn in filenames if is_debug_file(os.path.join(path, fn))] + +def is_not_debug(path, filenames): + files = [fn for fn in filenames if os.path.isfile(os.path.join(path, fn))] + return [fn for fn in files if not is_debug_file(os.path.join(path, fn))] diff --git a/scripts/createDistPackage.py b/scripts/createDistPackage.py index fc6e7b7aaa..2b0c38ea5f 100755 --- a/scripts/createDistPackage.py +++ b/scripts/createDistPackage.py @@ -45,28 +45,13 @@ def parse_arguments(): parser.add_argument('source_directory', help='source directory with the Qt Creator installation') return parser.parse_args() -def is_debug_file(filepath): - if common.is_mac_platform(): - return filepath.endswith('.dSYM') or '.dSYM/' in filepath - elif common.is_linux_platform(): - return filepath.endswith('.debug') - else: - return filepath.endswith('.pdb') - -def is_debug(path, filenames): - return [fn for fn in filenames if is_debug_file(os.path.join(path, fn))] - -def is_not_debug(path, filenames): - files = [fn for fn in filenames if os.path.isfile(os.path.join(path, fn))] - return [fn for fn in files if not is_debug_file(os.path.join(path, fn))] - def main(): arguments = parse_arguments() tempdir_base = tempfile.mkdtemp() tempdir = os.path.join(tempdir_base, os.path.basename(arguments.source_directory)) try: common.copytree(arguments.source_directory, tempdir, symlinks=True, - ignore=(is_not_debug if arguments.debug else is_debug)) + ignore=(common.is_not_debug if arguments.debug else common.is_debug)) zip_source = os.path.join(tempdir, '*') if arguments.exclude_toplevel else tempdir subprocess.check_call([arguments.sevenzip, 'a', '-mx9', arguments.target_archive, zip_source]) diff --git a/scripts/makedmg.py b/scripts/makedmg.py new file mode 100755 index 0000000000..33721f90a7 --- /dev/null +++ b/scripts/makedmg.py @@ -0,0 +1,60 @@ +#!/usr/bin/env python +############################################################################ +# +# Copyright (C) 2018 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. +# +############################################################################ + +import argparse +import os +import shutil +import subprocess +import tempfile +import time + +import common + +def parse_arguments(): + parser = argparse.ArgumentParser(description='Create Qt Creator disk image, filtering out debug information files.') + parser.add_argument('target_diskimage', help='output .dmg file to create') + parser.add_argument('dmg_volumename', help='volume name to use for the disk image') + parser.add_argument('source_directory', help='directory with the Qt Creator sources') + parser.add_argument('binary_directory', help='directory that contains the Qt Creator.app') + return parser.parse_args() + +def main(): + arguments = parse_arguments() + tempdir_base = tempfile.mkdtemp() + tempdir = os.path.join(tempdir_base, os.path.basename(arguments.binary_directory)) + try: + common.copytree(arguments.binary_directory, tempdir, symlinks=True, ignore=common.is_debug) + os.symlink('/Applications', os.path.join(tempdir, 'Applications')) + shutil.copy(os.path.join(arguments.source_directory, 'LICENSE.GPL3-EXCEPT'), tempdir) + dmg_cmd = ['hdiutil', 'create', '-srcfolder', tempdir, '-volname', arguments.dmg_volumename, + '-format', 'UDBZ', arguments.target_diskimage, '-ov', '-scrub', '-size', '1g', '-verbose'] + subprocess.check_call(dmg_cmd) + # sleep a few seconds to make sure disk image is fully unmounted etc + time.sleep(5) + finally: + shutil.rmtree(tempdir_base) +if __name__ == "__main__": + main() diff --git a/scripts/makedmg.sh b/scripts/makedmg.sh deleted file mode 100755 index befdf42e88..0000000000 --- a/scripts/makedmg.sh +++ /dev/null @@ -1,45 +0,0 @@ -#!/bin/bash - -############################################################################ -# -# 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. -# -############################################################################ - -[ $# -lt 2 ] && echo "Usage: $(basename $0) <folder> <name.dmg>" && exit 2 -[ $(uname -s) != "Darwin" ] && echo "Run this script on Mac OS X" && exit 2; -sourceFolder="$1" -intermediateFolder=$(mktemp -d "/tmp/packagedir.XXXXX") -finalDMGName="$2" -title="Qt Creator" - -echo Preparing image artifacts... -cp -a "${sourceFolder}/" "${intermediateFolder}" -ln -s /Applications "${intermediateFolder}" -cp "$(dirname "${BASH_SOURCE[0]}")/../LICENSE.GPL3-EXCEPT" "${intermediateFolder}/LICENSE.GPL3-EXCEPT.txt" -echo Creating image... -hdiutil create -srcfolder "${intermediateFolder}" -volname "${title}" -format UDBZ "${finalDMGName}" -ov -scrub -size 1g -verbose -# make sure that the image is umounted etc -sleep 4 - -# clean up -rm -rf "${intermediateFolder}" diff --git a/share/qtcreator/debugger/gdbbridge.py b/share/qtcreator/debugger/gdbbridge.py index 0425641c6d..320695a750 100644 --- a/share/qtcreator/debugger/gdbbridge.py +++ b/share/qtcreator/debugger/gdbbridge.py @@ -31,6 +31,7 @@ except: import gdb import os import os.path +import re import sys import struct import tempfile @@ -995,15 +996,11 @@ class Dumper(DumperBase): def handleNewObjectFile(self, objfile): name = objfile.filename if self.isWindowsTarget(): - isQtCoreObjFile = name.find('Qt5Cored.dll') >= 0 or name.find('Qt5Core.dll') >= 0 - if not isQtCoreObjFile: - isQtCoreObjFile = name.find('QtCored.dll') >= 0 or name.find('QtCore.dll') >= 0 + qtCoreMatch = re.match('.*Qt5?Core[^/.]*d?\.dll', name) else: - isQtCoreObjFile = name.find('/libQt5Core') >= 0 - if not isQtCoreObjFile: - isQtCoreObjFile = name.find('/libQtCore') >= 0 + qtCoreMatch = re.match('.*/libQt5?Core[^/.]\.so', name) - if isQtCoreObjFile: + if qtCoreMatch is not None: self.handleQtCoreLoaded(objfile) def handleQtCoreLoaded(self, objfile): diff --git a/share/qtcreator/qml/qmlpuppet/types/enumeration.cpp b/share/qtcreator/qml/qmlpuppet/types/enumeration.cpp index 094eb5ffc0..a77f460f4f 100644 --- a/share/qtcreator/qml/qmlpuppet/types/enumeration.cpp +++ b/share/qtcreator/qml/qmlpuppet/types/enumeration.cpp @@ -54,7 +54,7 @@ Enumeration::Enumeration(const QString &scope, const QString &name) QmlDesigner::EnumerationName QmlDesigner::Enumeration::scope() const { - return m_enumerationName.split('.').first(); + return m_enumerationName.split('.').constFirst(); } EnumerationName Enumeration::name() const diff --git a/share/qtcreator/templates/wizards/projects/qtquickuiprototype/wizard.json b/share/qtcreator/templates/wizards/projects/qtquickuiprototype/wizard.json index 285631c96e..62305835df 100644 --- a/share/qtcreator/templates/wizards/projects/qtquickuiprototype/wizard.json +++ b/share/qtcreator/templates/wizards/projects/qtquickuiprototype/wizard.json @@ -93,7 +93,7 @@ }, { "name": "UseVirtualKeyboard", - "trDisplayName": "Use Qt Virtual Keyboard.", + "trDisplayName": "Use Qt Virtual Keyboard", "type": "CheckBox", "data": { diff --git a/share/qtcreator/translations/qtcreator_de.ts b/share/qtcreator/translations/qtcreator_de.ts index 56727a69ec..3ff19d57ae 100644 --- a/share/qtcreator/translations/qtcreator_de.ts +++ b/share/qtcreator/translations/qtcreator_de.ts @@ -10840,7 +10840,7 @@ Dies ist unabhängig vom Wert der Eigenschaft "visible" in QML.</trans <name>TextEditor</name> <message> <source>Text Editor</source> - <translation>Text Editor</translation> + <translation>Texteditor</translation> </message> </context> <context> @@ -43079,7 +43079,7 @@ Bitte aktualisieren Sie Ihr Kit oder wählen Sie eine mkspec für qmake, die bes </message> <message> <source>Text Editor</source> - <translation>Text Editor</translation> + <translation>Texteditor</translation> </message> </context> <context> diff --git a/src/libs/glsl/glsl.g b/src/libs/glsl/glsl.g index ccd80ae8f1..314cef0bb7 100644 --- a/src/libs/glsl/glsl.g +++ b/src/libs/glsl/glsl.g @@ -569,6 +569,8 @@ AST *Parser::parse(int startToken) action = nt_action(_stateStack[_tos], lhs[ruleno] - TERMINAL_COUNT); } else if (action == 0) { ++recoveryAttempts; + if (recoveryAttempts > 10) + break; const int line = _tokens[yyloc].line + 1; QString message = QLatin1String("Syntax error"); if (yytoken != -1) { diff --git a/src/libs/glsl/glslparser.cpp b/src/libs/glsl/glslparser.cpp index a746a6050b..f435032999 100644 --- a/src/libs/glsl/glslparser.cpp +++ b/src/libs/glsl/glslparser.cpp @@ -159,6 +159,8 @@ AST *Parser::parse(int startToken) action = nt_action(_stateStack[_tos], lhs[ruleno] - TERMINAL_COUNT); } else if (action == 0) { ++recoveryAttempts; + if (recoveryAttempts > 10) + break; const int line = _tokens[yyloc].line + 1; QString message = QLatin1String("Syntax error"); if (yytoken != -1) { @@ -225,137 +227,137 @@ AST *Parser::parse(int startToken) return 0; } -#line 641 "./glsl.g" +#line 643 "./glsl.g" void Parser::reduce(int ruleno) { switch(ruleno) { -#line 650 "./glsl.g" +#line 652 "./glsl.g" case 0: { ast(1) = makeAstNode<IdentifierExpressionAST>(string(1)); } break; -#line 657 "./glsl.g" +#line 659 "./glsl.g" case 1: { ast(1) = makeAstNode<LiteralExpressionAST>(string(1)); } break; -#line 664 "./glsl.g" +#line 666 "./glsl.g" case 2: { ast(1) = makeAstNode<LiteralExpressionAST>(_engine->identifier("true", 4)); } break; -#line 671 "./glsl.g" +#line 673 "./glsl.g" case 3: { ast(1) = makeAstNode<LiteralExpressionAST>(_engine->identifier("false", 5)); } break; -#line 678 "./glsl.g" +#line 680 "./glsl.g" case 4: { // nothing to do. } break; -#line 685 "./glsl.g" +#line 687 "./glsl.g" case 5: { ast(1) = ast(2); } break; -#line 692 "./glsl.g" +#line 694 "./glsl.g" case 6: { // nothing to do. } break; -#line 699 "./glsl.g" +#line 701 "./glsl.g" case 7: { ast(1) = makeAstNode<BinaryExpressionAST>(AST::Kind_ArrayAccess, expression(1), expression(3)); } break; -#line 706 "./glsl.g" +#line 708 "./glsl.g" case 8: { // nothing to do. } break; -#line 713 "./glsl.g" +#line 715 "./glsl.g" case 9: { ast(1) = makeAstNode<MemberAccessExpressionAST>(expression(1), string(3)); } break; -#line 720 "./glsl.g" +#line 722 "./glsl.g" case 10: { ast(1) = makeAstNode<UnaryExpressionAST>(AST::Kind_PostIncrement, expression(1)); } break; -#line 727 "./glsl.g" +#line 729 "./glsl.g" case 11: { ast(1) = makeAstNode<UnaryExpressionAST>(AST::Kind_PostDecrement, expression(1)); } break; -#line 734 "./glsl.g" +#line 736 "./glsl.g" case 12: { // nothing to do. } break; -#line 741 "./glsl.g" +#line 743 "./glsl.g" case 13: { // nothing to do. } break; -#line 748 "./glsl.g" +#line 750 "./glsl.g" case 14: { ast(1) = makeAstNode<FunctionCallExpressionAST> (sym(1).function.id, sym(1).function.arguments); } break; -#line 756 "./glsl.g" +#line 758 "./glsl.g" case 15: { ast(1) = makeAstNode<FunctionCallExpressionAST> (expression(1), sym(3).function.id, sym(3).function.arguments); } break; -#line 764 "./glsl.g" +#line 766 "./glsl.g" case 16: { // nothing to do. } break; -#line 771 "./glsl.g" +#line 773 "./glsl.g" case 17: { // nothing to do. } break; -#line 778 "./glsl.g" +#line 780 "./glsl.g" case 18: { sym(1).function.id = sym(1).function_identifier; sym(1).function.arguments = 0; } break; -#line 786 "./glsl.g" +#line 788 "./glsl.g" case 19: { sym(1).function.id = sym(1).function_identifier; sym(1).function.arguments = 0; } break; -#line 794 "./glsl.g" +#line 796 "./glsl.g" case 20: { sym(1).function.id = sym(1).function_identifier; @@ -363,7 +365,7 @@ case 20: { makeAstNode< List<ExpressionAST *> >(expression(2)); } break; -#line 803 "./glsl.g" +#line 805 "./glsl.g" case 21: { sym(1).function.arguments = @@ -371,379 +373,379 @@ case 21: { (sym(1).function.arguments, expression(3)); } break; -#line 812 "./glsl.g" +#line 814 "./glsl.g" case 22: { // nothing to do. } break; -#line 819 "./glsl.g" +#line 821 "./glsl.g" case 23: { ast(1) = makeAstNode<FunctionIdentifierAST>(type(1)); } break; -#line 826 "./glsl.g" +#line 828 "./glsl.g" case 24: { ast(1) = makeAstNode<FunctionIdentifierAST>(string(1)); } break; -#line 833 "./glsl.g" +#line 835 "./glsl.g" case 25: { // nothing to do. } break; -#line 840 "./glsl.g" +#line 842 "./glsl.g" case 26: { ast(1) = makeAstNode<UnaryExpressionAST>(AST::Kind_PreIncrement, expression(2)); } break; -#line 847 "./glsl.g" +#line 849 "./glsl.g" case 27: { ast(1) = makeAstNode<UnaryExpressionAST>(AST::Kind_PreDecrement, expression(2)); } break; -#line 854 "./glsl.g" +#line 856 "./glsl.g" case 28: { ast(1) = makeAstNode<UnaryExpressionAST>(sym(1).kind, expression(2)); } break; -#line 861 "./glsl.g" +#line 863 "./glsl.g" case 29: { sym(1).kind = AST::Kind_UnaryPlus; } break; -#line 868 "./glsl.g" +#line 870 "./glsl.g" case 30: { sym(1).kind = AST::Kind_UnaryMinus; } break; -#line 875 "./glsl.g" +#line 877 "./glsl.g" case 31: { sym(1).kind = AST::Kind_LogicalNot; } break; -#line 882 "./glsl.g" +#line 884 "./glsl.g" case 32: { sym(1).kind = AST::Kind_BitwiseNot; } break; -#line 889 "./glsl.g" +#line 891 "./glsl.g" case 33: { // nothing to do. } break; -#line 896 "./glsl.g" +#line 898 "./glsl.g" case 34: { ast(1) = makeAstNode<BinaryExpressionAST>(AST::Kind_Multiply, expression(1), expression(3)); } break; -#line 903 "./glsl.g" +#line 905 "./glsl.g" case 35: { ast(1) = makeAstNode<BinaryExpressionAST>(AST::Kind_Divide, expression(1), expression(3)); } break; -#line 910 "./glsl.g" +#line 912 "./glsl.g" case 36: { ast(1) = makeAstNode<BinaryExpressionAST>(AST::Kind_Modulus, expression(1), expression(3)); } break; -#line 917 "./glsl.g" +#line 919 "./glsl.g" case 37: { // nothing to do. } break; -#line 924 "./glsl.g" +#line 926 "./glsl.g" case 38: { ast(1) = makeAstNode<BinaryExpressionAST>(AST::Kind_Plus, expression(1), expression(3)); } break; -#line 931 "./glsl.g" +#line 933 "./glsl.g" case 39: { ast(1) = makeAstNode<BinaryExpressionAST>(AST::Kind_Minus, expression(1), expression(3)); } break; -#line 938 "./glsl.g" +#line 940 "./glsl.g" case 40: { // nothing to do. } break; -#line 945 "./glsl.g" +#line 947 "./glsl.g" case 41: { ast(1) = makeAstNode<BinaryExpressionAST>(AST::Kind_ShiftLeft, expression(1), expression(3)); } break; -#line 952 "./glsl.g" +#line 954 "./glsl.g" case 42: { ast(1) = makeAstNode<BinaryExpressionAST>(AST::Kind_ShiftRight, expression(1), expression(3)); } break; -#line 959 "./glsl.g" +#line 961 "./glsl.g" case 43: { // nothing to do. } break; -#line 966 "./glsl.g" +#line 968 "./glsl.g" case 44: { ast(1) = makeAstNode<BinaryExpressionAST>(AST::Kind_LessThan, expression(1), expression(3)); } break; -#line 973 "./glsl.g" +#line 975 "./glsl.g" case 45: { ast(1) = makeAstNode<BinaryExpressionAST>(AST::Kind_GreaterThan, expression(1), expression(3)); } break; -#line 980 "./glsl.g" +#line 982 "./glsl.g" case 46: { ast(1) = makeAstNode<BinaryExpressionAST>(AST::Kind_LessEqual, expression(1), expression(3)); } break; -#line 987 "./glsl.g" +#line 989 "./glsl.g" case 47: { ast(1) = makeAstNode<BinaryExpressionAST>(AST::Kind_GreaterEqual, expression(1), expression(3)); } break; -#line 994 "./glsl.g" +#line 996 "./glsl.g" case 48: { // nothing to do. } break; -#line 1001 "./glsl.g" +#line 1003 "./glsl.g" case 49: { ast(1) = makeAstNode<BinaryExpressionAST>(AST::Kind_Equal, expression(1), expression(3)); } break; -#line 1008 "./glsl.g" +#line 1010 "./glsl.g" case 50: { ast(1) = makeAstNode<BinaryExpressionAST>(AST::Kind_NotEqual, expression(1), expression(3)); } break; -#line 1015 "./glsl.g" +#line 1017 "./glsl.g" case 51: { // nothing to do. } break; -#line 1022 "./glsl.g" +#line 1024 "./glsl.g" case 52: { ast(1) = makeAstNode<BinaryExpressionAST>(AST::Kind_BitwiseAnd, expression(1), expression(3)); } break; -#line 1029 "./glsl.g" +#line 1031 "./glsl.g" case 53: { // nothing to do. } break; -#line 1036 "./glsl.g" +#line 1038 "./glsl.g" case 54: { ast(1) = makeAstNode<BinaryExpressionAST>(AST::Kind_BitwiseXor, expression(1), expression(3)); } break; -#line 1043 "./glsl.g" +#line 1045 "./glsl.g" case 55: { // nothing to do. } break; -#line 1050 "./glsl.g" +#line 1052 "./glsl.g" case 56: { ast(1) = makeAstNode<BinaryExpressionAST>(AST::Kind_BitwiseOr, expression(1), expression(3)); } break; -#line 1057 "./glsl.g" +#line 1059 "./glsl.g" case 57: { // nothing to do. } break; -#line 1064 "./glsl.g" +#line 1066 "./glsl.g" case 58: { ast(1) = makeAstNode<BinaryExpressionAST>(AST::Kind_LogicalAnd, expression(1), expression(3)); } break; -#line 1071 "./glsl.g" +#line 1073 "./glsl.g" case 59: { // nothing to do. } break; -#line 1078 "./glsl.g" +#line 1080 "./glsl.g" case 60: { ast(1) = makeAstNode<BinaryExpressionAST>(AST::Kind_LogicalXor, expression(1), expression(3)); } break; -#line 1085 "./glsl.g" +#line 1087 "./glsl.g" case 61: { // nothing to do. } break; -#line 1092 "./glsl.g" +#line 1094 "./glsl.g" case 62: { ast(1) = makeAstNode<BinaryExpressionAST>(AST::Kind_LogicalOr, expression(1), expression(3)); } break; -#line 1099 "./glsl.g" +#line 1101 "./glsl.g" case 63: { // nothing to do. } break; -#line 1106 "./glsl.g" +#line 1108 "./glsl.g" case 64: { ast(1) = makeAstNode<TernaryExpressionAST>(AST::Kind_Conditional, expression(1), expression(3), expression(5)); } break; -#line 1113 "./glsl.g" +#line 1115 "./glsl.g" case 65: { // nothing to do. } break; -#line 1120 "./glsl.g" +#line 1122 "./glsl.g" case 66: { ast(1) = makeAstNode<AssignmentExpressionAST>(sym(2).kind, expression(1), expression(3)); } break; -#line 1127 "./glsl.g" +#line 1129 "./glsl.g" case 67: { sym(1).kind = AST::Kind_Assign; } break; -#line 1134 "./glsl.g" +#line 1136 "./glsl.g" case 68: { sym(1).kind = AST::Kind_AssignMultiply; } break; -#line 1141 "./glsl.g" +#line 1143 "./glsl.g" case 69: { sym(1).kind = AST::Kind_AssignDivide; } break; -#line 1148 "./glsl.g" +#line 1150 "./glsl.g" case 70: { sym(1).kind = AST::Kind_AssignModulus; } break; -#line 1155 "./glsl.g" +#line 1157 "./glsl.g" case 71: { sym(1).kind = AST::Kind_AssignPlus; } break; -#line 1162 "./glsl.g" +#line 1164 "./glsl.g" case 72: { sym(1).kind = AST::Kind_AssignMinus; } break; -#line 1169 "./glsl.g" +#line 1171 "./glsl.g" case 73: { sym(1).kind = AST::Kind_AssignShiftLeft; } break; -#line 1176 "./glsl.g" +#line 1178 "./glsl.g" case 74: { sym(1).kind = AST::Kind_AssignShiftRight; } break; -#line 1183 "./glsl.g" +#line 1185 "./glsl.g" case 75: { sym(1).kind = AST::Kind_AssignAnd; } break; -#line 1190 "./glsl.g" +#line 1192 "./glsl.g" case 76: { sym(1).kind = AST::Kind_AssignXor; } break; -#line 1197 "./glsl.g" +#line 1199 "./glsl.g" case 77: { sym(1).kind = AST::Kind_AssignOr; } break; -#line 1204 "./glsl.g" +#line 1206 "./glsl.g" case 78: { // nothing to do. } break; -#line 1211 "./glsl.g" +#line 1213 "./glsl.g" case 79: { ast(1) = makeAstNode<BinaryExpressionAST>(AST::Kind_Comma, expression(1), expression(3)); } break; -#line 1218 "./glsl.g" +#line 1220 "./glsl.g" case 80: { // nothing to do. } break; -#line 1225 "./glsl.g" +#line 1227 "./glsl.g" case 81: { // nothing to do. } break; -#line 1232 "./glsl.g" +#line 1234 "./glsl.g" case 82: { ast(1) = makeAstNode<InitDeclarationAST>(sym(1).declaration_list); } break; -#line 1239 "./glsl.g" +#line 1241 "./glsl.g" case 83: { ast(1) = makeAstNode<PrecisionDeclarationAST>(sym(2).precision, type(3)); } break; -#line 1246 "./glsl.g" +#line 1248 "./glsl.g" case 84: { if (sym(1).type_qualifier.qualifier != QualifiedTypeAST::Struct) { @@ -753,7 +755,7 @@ case 84: { ast(1) = makeAstNode<TypeDeclarationAST>(type); } break; -#line 1257 "./glsl.g" +#line 1259 "./glsl.g" case 85: { if ((sym(1).type_qualifier.qualifier & QualifiedTypeAST::Struct) == 0) { @@ -771,7 +773,7 @@ case 85: { makeAstNode<VariableDeclarationAST>(qualtype, string(6))); } break; -#line 1276 "./glsl.g" +#line 1278 "./glsl.g" case 86: { if ((sym(1).type_qualifier.qualifier & QualifiedTypeAST::Struct) == 0) { @@ -790,7 +792,7 @@ case 86: { (makeAstNode<ArrayTypeAST>(qualtype), string(6))); } break; -#line 1296 "./glsl.g" +#line 1298 "./glsl.g" case 87: { if ((sym(1).type_qualifier.qualifier & QualifiedTypeAST::Struct) == 0) { @@ -809,7 +811,7 @@ case 87: { (makeAstNode<ArrayTypeAST>(qualtype, expression(8)), string(6))); } break; -#line 1316 "./glsl.g" +#line 1318 "./glsl.g" case 88: { TypeAST *type = makeAstNode<QualifiedTypeAST> @@ -818,59 +820,59 @@ case 88: { ast(1) = makeAstNode<TypeDeclarationAST>(type); } break; -#line 1326 "./glsl.g" +#line 1328 "./glsl.g" case 89: { function(1)->finishParams(); } break; -#line 1333 "./glsl.g" +#line 1335 "./glsl.g" case 90: { // nothing to do. } break; -#line 1340 "./glsl.g" +#line 1342 "./glsl.g" case 91: { // nothing to do. } break; -#line 1347 "./glsl.g" +#line 1349 "./glsl.g" case 92: { function(1)->params = makeAstNode< List<ParameterDeclarationAST *> > (sym(2).param_declaration); } break; -#line 1355 "./glsl.g" +#line 1357 "./glsl.g" case 93: { function(1)->params = makeAstNode< List<ParameterDeclarationAST *> > (function(1)->params, sym(3).param_declaration); } break; -#line 1363 "./glsl.g" +#line 1365 "./glsl.g" case 94: { function(1) = makeAstNode<FunctionDeclarationAST>(type(1), string(2)); } break; -#line 1370 "./glsl.g" +#line 1372 "./glsl.g" case 95: { sym(1).param_declarator.type = type(1); sym(1).param_declarator.name = string(2); } break; -#line 1378 "./glsl.g" +#line 1380 "./glsl.g" case 96: { sym(1).param_declarator.type = makeAstNode<ArrayTypeAST>(type(1), expression(4)); sym(1).param_declarator.name = string(2); } break; -#line 1386 "./glsl.g" +#line 1388 "./glsl.g" case 97: { ast(1) = makeAstNode<ParameterDeclarationAST> @@ -881,7 +883,7 @@ case 97: { sym(3).param_declarator.name); } break; -#line 1398 "./glsl.g" +#line 1400 "./glsl.g" case 98: { ast(1) = makeAstNode<ParameterDeclarationAST> @@ -890,7 +892,7 @@ case 98: { sym(2).param_declarator.name); } break; -#line 1408 "./glsl.g" +#line 1410 "./glsl.g" case 99: { ast(1) = makeAstNode<ParameterDeclarationAST> @@ -900,7 +902,7 @@ case 99: { (const QString *)0); } break; -#line 1419 "./glsl.g" +#line 1421 "./glsl.g" case 100: { ast(1) = makeAstNode<ParameterDeclarationAST> @@ -908,44 +910,44 @@ case 100: { (const QString *)0); } break; -#line 1428 "./glsl.g" +#line 1430 "./glsl.g" case 101: { sym(1).qualifier = ParameterDeclarationAST::In; } break; -#line 1435 "./glsl.g" +#line 1437 "./glsl.g" case 102: { sym(1).qualifier = ParameterDeclarationAST::In; } break; -#line 1442 "./glsl.g" +#line 1444 "./glsl.g" case 103: { sym(1).qualifier = ParameterDeclarationAST::Out; } break; -#line 1449 "./glsl.g" +#line 1451 "./glsl.g" case 104: { sym(1).qualifier = ParameterDeclarationAST::InOut; } break; -#line 1456 "./glsl.g" +#line 1458 "./glsl.g" case 105: { // nothing to do. } break; -#line 1463 "./glsl.g" +#line 1465 "./glsl.g" case 106: { sym(1).declaration_list = makeAstNode< List<DeclarationAST *> > (sym(1).declaration); } break; -#line 1471 "./glsl.g" +#line 1473 "./glsl.g" case 107: { TypeAST *type = VariableDeclarationAST::declarationType(sym(1).declaration_list); @@ -954,7 +956,7 @@ case 107: { (sym(1).declaration_list, decl); } break; -#line 1481 "./glsl.g" +#line 1483 "./glsl.g" case 108: { TypeAST *type = VariableDeclarationAST::declarationType(sym(1).declaration_list); @@ -964,7 +966,7 @@ case 108: { (sym(1).declaration_list, decl); } break; -#line 1492 "./glsl.g" +#line 1494 "./glsl.g" case 109: { TypeAST *type = VariableDeclarationAST::declarationType(sym(1).declaration_list); @@ -974,7 +976,7 @@ case 109: { (sym(1).declaration_list, decl); } break; -#line 1503 "./glsl.g" +#line 1505 "./glsl.g" case 110: { TypeAST *type = VariableDeclarationAST::declarationType(sym(1).declaration_list); @@ -985,7 +987,7 @@ case 110: { (sym(1).declaration_list, decl); } break; -#line 1515 "./glsl.g" +#line 1517 "./glsl.g" case 111: { TypeAST *type = VariableDeclarationAST::declarationType(sym(1).declaration_list); @@ -996,7 +998,7 @@ case 111: { (sym(1).declaration_list, decl); } break; -#line 1527 "./glsl.g" +#line 1529 "./glsl.g" case 112: { TypeAST *type = VariableDeclarationAST::declarationType(sym(1).declaration_list); @@ -1006,40 +1008,40 @@ case 112: { (sym(1).declaration_list, decl); } break; -#line 1538 "./glsl.g" +#line 1540 "./glsl.g" case 113: { ast(1) = makeAstNode<TypeDeclarationAST>(type(1)); } break; -#line 1545 "./glsl.g" +#line 1547 "./glsl.g" case 114: { ast(1) = makeAstNode<VariableDeclarationAST>(type(1), string(2)); } break; -#line 1552 "./glsl.g" +#line 1554 "./glsl.g" case 115: { ast(1) = makeAstNode<VariableDeclarationAST> (makeAstNode<ArrayTypeAST>(type(1)), string(2)); } break; -#line 1560 "./glsl.g" +#line 1562 "./glsl.g" case 116: { ast(1) = makeAstNode<VariableDeclarationAST> (makeAstNode<ArrayTypeAST>(type(1), expression(4)), string(2)); } break; -#line 1568 "./glsl.g" +#line 1570 "./glsl.g" case 117: { ast(1) = makeAstNode<VariableDeclarationAST> (makeAstNode<ArrayTypeAST>(type(1)), string(2), expression(6)); } break; -#line 1576 "./glsl.g" +#line 1578 "./glsl.g" case 118: { ast(1) = makeAstNode<VariableDeclarationAST> @@ -1047,26 +1049,26 @@ case 118: { string(2), expression(7)); } break; -#line 1585 "./glsl.g" +#line 1587 "./glsl.g" case 119: { ast(1) = makeAstNode<VariableDeclarationAST> (type(1), string(2), expression(4)); } break; -#line 1593 "./glsl.g" +#line 1595 "./glsl.g" case 120: { ast(1) = makeAstNode<InvariantDeclarationAST>(string(2)); } break; -#line 1600 "./glsl.g" +#line 1602 "./glsl.g" case 121: { ast(1) = makeAstNode<QualifiedTypeAST>(0, type(1), (List<LayoutQualifierAST *> *)0); } break; -#line 1607 "./glsl.g" +#line 1609 "./glsl.g" case 122: { ast(1) = makeAstNode<QualifiedTypeAST> @@ -1074,207 +1076,207 @@ case 122: { sym(1).type_qualifier.layout_list); } break; -#line 1616 "./glsl.g" +#line 1618 "./glsl.g" case 123: { sym(1).qualifier = QualifiedTypeAST::Invariant; } break; -#line 1623 "./glsl.g" +#line 1625 "./glsl.g" case 124: { sym(1).qualifier = QualifiedTypeAST::Smooth; } break; -#line 1630 "./glsl.g" +#line 1632 "./glsl.g" case 125: { sym(1).qualifier = QualifiedTypeAST::Flat; } break; -#line 1637 "./glsl.g" +#line 1639 "./glsl.g" case 126: { sym(1).qualifier = QualifiedTypeAST::NoPerspective; } break; -#line 1644 "./glsl.g" +#line 1646 "./glsl.g" case 127: { sym(1) = sym(3); } break; -#line 1651 "./glsl.g" +#line 1653 "./glsl.g" case 128: { sym(1).layout_list = makeAstNode< List<LayoutQualifierAST *> >(sym(1).layout); } break; -#line 1658 "./glsl.g" +#line 1660 "./glsl.g" case 129: { sym(1).layout_list = makeAstNode< List<LayoutQualifierAST *> >(sym(1).layout_list, sym(3).layout); } break; -#line 1665 "./glsl.g" +#line 1667 "./glsl.g" case 130: { sym(1).layout = makeAstNode<LayoutQualifierAST>(string(1), (const QString *)0); } break; -#line 1672 "./glsl.g" +#line 1674 "./glsl.g" case 131: { sym(1).layout = makeAstNode<LayoutQualifierAST>(string(1), string(3)); } break; -#line 1679 "./glsl.g" +#line 1681 "./glsl.g" case 132: { sym(1).qualifier = QualifiedTypeAST::Const; } break; -#line 1686 "./glsl.g" +#line 1688 "./glsl.g" case 133: { sym(1).type_qualifier.qualifier = sym(1).qualifier; sym(1).type_qualifier.layout_list = 0; } break; -#line 1694 "./glsl.g" +#line 1696 "./glsl.g" case 134: { sym(1).type_qualifier.layout_list = sym(1).layout_list; sym(1).type_qualifier.qualifier = 0; } break; -#line 1702 "./glsl.g" +#line 1704 "./glsl.g" case 135: { sym(1).type_qualifier.layout_list = sym(1).layout_list; sym(1).type_qualifier.qualifier = sym(2).qualifier; } break; -#line 1710 "./glsl.g" +#line 1712 "./glsl.g" case 136: { sym(1).type_qualifier.qualifier = sym(1).qualifier | sym(2).qualifier; sym(1).type_qualifier.layout_list = 0; } break; -#line 1718 "./glsl.g" +#line 1720 "./glsl.g" case 137: { sym(1).type_qualifier.qualifier = sym(1).qualifier; sym(1).type_qualifier.layout_list = 0; } break; -#line 1726 "./glsl.g" +#line 1728 "./glsl.g" case 138: { sym(1).type_qualifier.qualifier = sym(1).qualifier | sym(2).qualifier; sym(1).type_qualifier.layout_list = 0; } break; -#line 1734 "./glsl.g" +#line 1736 "./glsl.g" case 139: { sym(1).type_qualifier.qualifier = sym(1).qualifier | sym(2).qualifier | sym(3).qualifier; sym(1).type_qualifier.layout_list = 0; } break; -#line 1742 "./glsl.g" +#line 1744 "./glsl.g" case 140: { sym(1).type_qualifier.qualifier = QualifiedTypeAST::Invariant; sym(1).type_qualifier.layout_list = 0; } break; -#line 1750 "./glsl.g" +#line 1752 "./glsl.g" case 141: { sym(1).qualifier = QualifiedTypeAST::Const; } break; -#line 1757 "./glsl.g" +#line 1759 "./glsl.g" case 142: { sym(1).qualifier = QualifiedTypeAST::Attribute; } break; -#line 1764 "./glsl.g" +#line 1766 "./glsl.g" case 143: { sym(1).qualifier = QualifiedTypeAST::Varying; } break; -#line 1771 "./glsl.g" +#line 1773 "./glsl.g" case 144: { sym(1).qualifier = QualifiedTypeAST::CentroidVarying; } break; -#line 1778 "./glsl.g" +#line 1780 "./glsl.g" case 145: { sym(1).qualifier = QualifiedTypeAST::In; } break; -#line 1785 "./glsl.g" +#line 1787 "./glsl.g" case 146: { sym(1).qualifier = QualifiedTypeAST::Out; } break; -#line 1792 "./glsl.g" +#line 1794 "./glsl.g" case 147: { sym(1).qualifier = QualifiedTypeAST::CentroidIn; } break; -#line 1799 "./glsl.g" +#line 1801 "./glsl.g" case 148: { sym(1).qualifier = QualifiedTypeAST::CentroidOut; } break; -#line 1806 "./glsl.g" +#line 1808 "./glsl.g" case 149: { sym(1).qualifier = QualifiedTypeAST::PatchIn; } break; -#line 1813 "./glsl.g" +#line 1815 "./glsl.g" case 150: { sym(1).qualifier = QualifiedTypeAST::PatchOut; } break; -#line 1820 "./glsl.g" +#line 1822 "./glsl.g" case 151: { sym(1).qualifier = QualifiedTypeAST::SampleIn; } break; -#line 1827 "./glsl.g" +#line 1829 "./glsl.g" case 152: { sym(1).qualifier = QualifiedTypeAST::SampleOut; } break; -#line 1834 "./glsl.g" +#line 1836 "./glsl.g" case 153: { sym(1).qualifier = QualifiedTypeAST::Uniform; } break; -#line 1841 "./glsl.g" +#line 1843 "./glsl.g" case 154: { // nothing to do. } break; -#line 1848 "./glsl.g" +#line 1850 "./glsl.g" case 155: { if (!type(2)->setPrecision(sym(1).precision)) { @@ -1283,595 +1285,595 @@ case 155: { ast(1) = type(2); } break; -#line 1858 "./glsl.g" +#line 1860 "./glsl.g" case 156: { // nothing to do. } break; -#line 1865 "./glsl.g" +#line 1867 "./glsl.g" case 157: { ast(1) = makeAstNode<ArrayTypeAST>(type(1)); } break; -#line 1872 "./glsl.g" +#line 1874 "./glsl.g" case 158: { ast(1) = makeAstNode<ArrayTypeAST>(type(1), expression(3)); } break; -#line 1879 "./glsl.g" +#line 1881 "./glsl.g" case 159: { ast(1) = makeBasicType(T_VOID); } break; -#line 1886 "./glsl.g" +#line 1888 "./glsl.g" case 160: { ast(1) = makeBasicType(T_FLOAT); } break; -#line 1893 "./glsl.g" +#line 1895 "./glsl.g" case 161: { ast(1) = makeBasicType(T_DOUBLE); } break; -#line 1900 "./glsl.g" +#line 1902 "./glsl.g" case 162: { ast(1) = makeBasicType(T_INT); } break; -#line 1907 "./glsl.g" +#line 1909 "./glsl.g" case 163: { ast(1) = makeBasicType(T_UINT); } break; -#line 1914 "./glsl.g" +#line 1916 "./glsl.g" case 164: { ast(1) = makeBasicType(T_BOOL); } break; -#line 1921 "./glsl.g" +#line 1923 "./glsl.g" case 165: { ast(1) = makeBasicType(T_VEC2); } break; -#line 1928 "./glsl.g" +#line 1930 "./glsl.g" case 166: { ast(1) = makeBasicType(T_VEC3); } break; -#line 1935 "./glsl.g" +#line 1937 "./glsl.g" case 167: { ast(1) = makeBasicType(T_VEC4); } break; -#line 1942 "./glsl.g" +#line 1944 "./glsl.g" case 168: { ast(1) = makeBasicType(T_DVEC2); } break; -#line 1949 "./glsl.g" +#line 1951 "./glsl.g" case 169: { ast(1) = makeBasicType(T_DVEC3); } break; -#line 1956 "./glsl.g" +#line 1958 "./glsl.g" case 170: { ast(1) = makeBasicType(T_DVEC4); } break; -#line 1963 "./glsl.g" +#line 1965 "./glsl.g" case 171: { ast(1) = makeBasicType(T_BVEC2); } break; -#line 1970 "./glsl.g" +#line 1972 "./glsl.g" case 172: { ast(1) = makeBasicType(T_BVEC3); } break; -#line 1977 "./glsl.g" +#line 1979 "./glsl.g" case 173: { ast(1) = makeBasicType(T_BVEC4); } break; -#line 1984 "./glsl.g" +#line 1986 "./glsl.g" case 174: { ast(1) = makeBasicType(T_IVEC2); } break; -#line 1991 "./glsl.g" +#line 1993 "./glsl.g" case 175: { ast(1) = makeBasicType(T_IVEC3); } break; -#line 1998 "./glsl.g" +#line 2000 "./glsl.g" case 176: { ast(1) = makeBasicType(T_IVEC4); } break; -#line 2005 "./glsl.g" +#line 2007 "./glsl.g" case 177: { ast(1) = makeBasicType(T_UVEC2); } break; -#line 2012 "./glsl.g" +#line 2014 "./glsl.g" case 178: { ast(1) = makeBasicType(T_UVEC3); } break; -#line 2019 "./glsl.g" +#line 2021 "./glsl.g" case 179: { ast(1) = makeBasicType(T_UVEC4); } break; -#line 2026 "./glsl.g" +#line 2028 "./glsl.g" case 180: { ast(1) = makeBasicType(T_MAT2); } break; -#line 2033 "./glsl.g" +#line 2035 "./glsl.g" case 181: { ast(1) = makeBasicType(T_MAT3); } break; -#line 2040 "./glsl.g" +#line 2042 "./glsl.g" case 182: { ast(1) = makeBasicType(T_MAT4); } break; -#line 2047 "./glsl.g" +#line 2049 "./glsl.g" case 183: { ast(1) = makeBasicType(T_MAT2); } break; -#line 2054 "./glsl.g" +#line 2056 "./glsl.g" case 184: { ast(1) = makeBasicType(T_MAT2X3); } break; -#line 2061 "./glsl.g" +#line 2063 "./glsl.g" case 185: { ast(1) = makeBasicType(T_MAT2X4); } break; -#line 2068 "./glsl.g" +#line 2070 "./glsl.g" case 186: { ast(1) = makeBasicType(T_MAT3X2); } break; -#line 2075 "./glsl.g" +#line 2077 "./glsl.g" case 187: { ast(1) = makeBasicType(T_MAT3); } break; -#line 2082 "./glsl.g" +#line 2084 "./glsl.g" case 188: { ast(1) = makeBasicType(T_MAT3X4); } break; -#line 2089 "./glsl.g" +#line 2091 "./glsl.g" case 189: { ast(1) = makeBasicType(T_MAT4X2); } break; -#line 2096 "./glsl.g" +#line 2098 "./glsl.g" case 190: { ast(1) = makeBasicType(T_MAT4X3); } break; -#line 2103 "./glsl.g" +#line 2105 "./glsl.g" case 191: { ast(1) = makeBasicType(T_MAT4); } break; -#line 2110 "./glsl.g" +#line 2112 "./glsl.g" case 192: { ast(1) = makeBasicType(T_DMAT2); } break; -#line 2117 "./glsl.g" +#line 2119 "./glsl.g" case 193: { ast(1) = makeBasicType(T_DMAT3); } break; -#line 2124 "./glsl.g" +#line 2126 "./glsl.g" case 194: { ast(1) = makeBasicType(T_DMAT4); } break; -#line 2131 "./glsl.g" +#line 2133 "./glsl.g" case 195: { ast(1) = makeBasicType(T_DMAT2); } break; -#line 2138 "./glsl.g" +#line 2140 "./glsl.g" case 196: { ast(1) = makeBasicType(T_DMAT2X3); } break; -#line 2145 "./glsl.g" +#line 2147 "./glsl.g" case 197: { ast(1) = makeBasicType(T_DMAT2X4); } break; -#line 2152 "./glsl.g" +#line 2154 "./glsl.g" case 198: { ast(1) = makeBasicType(T_DMAT3X2); } break; -#line 2159 "./glsl.g" +#line 2161 "./glsl.g" case 199: { ast(1) = makeBasicType(T_DMAT3); } break; -#line 2166 "./glsl.g" +#line 2168 "./glsl.g" case 200: { ast(1) = makeBasicType(T_DMAT3X4); } break; -#line 2173 "./glsl.g" +#line 2175 "./glsl.g" case 201: { ast(1) = makeBasicType(T_DMAT4X2); } break; -#line 2180 "./glsl.g" +#line 2182 "./glsl.g" case 202: { ast(1) = makeBasicType(T_DMAT4X3); } break; -#line 2187 "./glsl.g" +#line 2189 "./glsl.g" case 203: { ast(1) = makeBasicType(T_DMAT4); } break; -#line 2194 "./glsl.g" +#line 2196 "./glsl.g" case 204: { ast(1) = makeBasicType(T_SAMPLER1D); } break; -#line 2201 "./glsl.g" +#line 2203 "./glsl.g" case 205: { ast(1) = makeBasicType(T_SAMPLER2D); } break; -#line 2208 "./glsl.g" +#line 2210 "./glsl.g" case 206: { ast(1) = makeBasicType(T_SAMPLER3D); } break; -#line 2215 "./glsl.g" +#line 2217 "./glsl.g" case 207: { ast(1) = makeBasicType(T_SAMPLERCUBE); } break; -#line 2222 "./glsl.g" +#line 2224 "./glsl.g" case 208: { ast(1) = makeBasicType(T_SAMPLER1DSHADOW); } break; -#line 2229 "./glsl.g" +#line 2231 "./glsl.g" case 209: { ast(1) = makeBasicType(T_SAMPLER2DSHADOW); } break; -#line 2236 "./glsl.g" +#line 2238 "./glsl.g" case 210: { ast(1) = makeBasicType(T_SAMPLERCUBESHADOW); } break; -#line 2243 "./glsl.g" +#line 2245 "./glsl.g" case 211: { ast(1) = makeBasicType(T_SAMPLER1DARRAY); } break; -#line 2250 "./glsl.g" +#line 2252 "./glsl.g" case 212: { ast(1) = makeBasicType(T_SAMPLER2DARRAY); } break; -#line 2257 "./glsl.g" +#line 2259 "./glsl.g" case 213: { ast(1) = makeBasicType(T_SAMPLER1DARRAYSHADOW); } break; -#line 2264 "./glsl.g" +#line 2266 "./glsl.g" case 214: { ast(1) = makeBasicType(T_SAMPLER2DARRAYSHADOW); } break; -#line 2271 "./glsl.g" +#line 2273 "./glsl.g" case 215: { ast(1) = makeBasicType(T_SAMPLERCUBEARRAY); } break; -#line 2278 "./glsl.g" +#line 2280 "./glsl.g" case 216: { ast(1) = makeBasicType(T_SAMPLERCUBEARRAYSHADOW); } break; -#line 2285 "./glsl.g" +#line 2287 "./glsl.g" case 217: { ast(1) = makeBasicType(T_ISAMPLER1D); } break; -#line 2292 "./glsl.g" +#line 2294 "./glsl.g" case 218: { ast(1) = makeBasicType(T_ISAMPLER2D); } break; -#line 2299 "./glsl.g" +#line 2301 "./glsl.g" case 219: { ast(1) = makeBasicType(T_ISAMPLER3D); } break; -#line 2306 "./glsl.g" +#line 2308 "./glsl.g" case 220: { ast(1) = makeBasicType(T_ISAMPLERCUBE); } break; -#line 2313 "./glsl.g" +#line 2315 "./glsl.g" case 221: { ast(1) = makeBasicType(T_ISAMPLER1DARRAY); } break; -#line 2320 "./glsl.g" +#line 2322 "./glsl.g" case 222: { ast(1) = makeBasicType(T_ISAMPLER2DARRAY); } break; -#line 2327 "./glsl.g" +#line 2329 "./glsl.g" case 223: { ast(1) = makeBasicType(T_ISAMPLERCUBEARRAY); } break; -#line 2334 "./glsl.g" +#line 2336 "./glsl.g" case 224: { ast(1) = makeBasicType(T_USAMPLER1D); } break; -#line 2341 "./glsl.g" +#line 2343 "./glsl.g" case 225: { ast(1) = makeBasicType(T_USAMPLER2D); } break; -#line 2348 "./glsl.g" +#line 2350 "./glsl.g" case 226: { ast(1) = makeBasicType(T_USAMPLER3D); } break; -#line 2355 "./glsl.g" +#line 2357 "./glsl.g" case 227: { ast(1) = makeBasicType(T_USAMPLERCUBE); } break; -#line 2362 "./glsl.g" +#line 2364 "./glsl.g" case 228: { ast(1) = makeBasicType(T_USAMPLER1DARRAY); } break; -#line 2369 "./glsl.g" +#line 2371 "./glsl.g" case 229: { ast(1) = makeBasicType(T_USAMPLER2DARRAY); } break; -#line 2376 "./glsl.g" +#line 2378 "./glsl.g" case 230: { ast(1) = makeBasicType(T_USAMPLERCUBEARRAY); } break; -#line 2383 "./glsl.g" +#line 2385 "./glsl.g" case 231: { ast(1) = makeBasicType(T_SAMPLER2DRECT); } break; -#line 2390 "./glsl.g" +#line 2392 "./glsl.g" case 232: { ast(1) = makeBasicType(T_SAMPLER2DRECTSHADOW); } break; -#line 2397 "./glsl.g" +#line 2399 "./glsl.g" case 233: { ast(1) = makeBasicType(T_ISAMPLER2DRECT); } break; -#line 2404 "./glsl.g" +#line 2406 "./glsl.g" case 234: { ast(1) = makeBasicType(T_USAMPLER2DRECT); } break; -#line 2411 "./glsl.g" +#line 2413 "./glsl.g" case 235: { ast(1) = makeBasicType(T_SAMPLERBUFFER); } break; -#line 2418 "./glsl.g" +#line 2420 "./glsl.g" case 236: { ast(1) = makeBasicType(T_ISAMPLERBUFFER); } break; -#line 2425 "./glsl.g" +#line 2427 "./glsl.g" case 237: { ast(1) = makeBasicType(T_USAMPLERBUFFER); } break; -#line 2432 "./glsl.g" +#line 2434 "./glsl.g" case 238: { ast(1) = makeBasicType(T_SAMPLER2DMS); } break; -#line 2439 "./glsl.g" +#line 2441 "./glsl.g" case 239: { ast(1) = makeBasicType(T_ISAMPLER2DMS); } break; -#line 2446 "./glsl.g" +#line 2448 "./glsl.g" case 240: { ast(1) = makeBasicType(T_USAMPLER2DMS); } break; -#line 2453 "./glsl.g" +#line 2455 "./glsl.g" case 241: { ast(1) = makeBasicType(T_SAMPLER2DMSARRAY); } break; -#line 2460 "./glsl.g" +#line 2462 "./glsl.g" case 242: { ast(1) = makeBasicType(T_ISAMPLER2DMSARRAY); } break; -#line 2467 "./glsl.g" +#line 2469 "./glsl.g" case 243: { ast(1) = makeBasicType(T_USAMPLER2DMSARRAY); } break; -#line 2474 "./glsl.g" +#line 2476 "./glsl.g" case 244: { // nothing to do. } break; -#line 2481 "./glsl.g" +#line 2483 "./glsl.g" case 245: { ast(1) = makeAstNode<NamedTypeAST>(string(1)); } break; -#line 2488 "./glsl.g" +#line 2490 "./glsl.g" case 246: { sym(1).precision = TypeAST::Highp; } break; -#line 2495 "./glsl.g" +#line 2497 "./glsl.g" case 247: { sym(1).precision = TypeAST::Mediump; } break; -#line 2502 "./glsl.g" +#line 2504 "./glsl.g" case 248: { sym(1).precision = TypeAST::Lowp; } break; -#line 2509 "./glsl.g" +#line 2511 "./glsl.g" case 249: { ast(1) = makeAstNode<StructTypeAST>(string(2), sym(4).field_list); } break; -#line 2516 "./glsl.g" +#line 2518 "./glsl.g" case 250: { ast(1) = makeAstNode<StructTypeAST>(sym(3).field_list); } break; -#line 2523 "./glsl.g" +#line 2525 "./glsl.g" case 251: { // nothing to do. } break; -#line 2530 "./glsl.g" +#line 2532 "./glsl.g" case 252: { sym(1).field_list = appendLists(sym(1).field_list, sym(2).field_list); } break; -#line 2537 "./glsl.g" +#line 2539 "./glsl.g" case 253: { sym(1).field_list = StructTypeAST::fixInnerTypes(type(1), sym(2).field_list); } break; -#line 2544 "./glsl.g" +#line 2546 "./glsl.g" case 254: { sym(1).field_list = StructTypeAST::fixInnerTypes @@ -1880,106 +1882,106 @@ case 254: { sym(1).type_qualifier.layout_list), sym(3).field_list); } break; -#line 2554 "./glsl.g" +#line 2556 "./glsl.g" case 255: { // nothing to do. sym(1).field_list = makeAstNode< List<StructTypeAST::Field *> >(sym(1).field); } break; -#line 2562 "./glsl.g" +#line 2564 "./glsl.g" case 256: { sym(1).field_list = makeAstNode< List<StructTypeAST::Field *> >(sym(1).field_list, sym(3).field); } break; -#line 2569 "./glsl.g" +#line 2571 "./glsl.g" case 257: { sym(1).field = makeAstNode<StructTypeAST::Field>(string(1)); } break; -#line 2576 "./glsl.g" +#line 2578 "./glsl.g" case 258: { sym(1).field = makeAstNode<StructTypeAST::Field> (string(1), makeAstNode<ArrayTypeAST>((TypeAST *)0)); } break; -#line 2584 "./glsl.g" +#line 2586 "./glsl.g" case 259: { sym(1).field = makeAstNode<StructTypeAST::Field> (string(1), makeAstNode<ArrayTypeAST>((TypeAST *)0, expression(3))); } break; -#line 2592 "./glsl.g" +#line 2594 "./glsl.g" case 260: { // nothing to do. } break; -#line 2599 "./glsl.g" +#line 2601 "./glsl.g" case 261: { ast(1) = makeAstNode<DeclarationStatementAST>(sym(1).declaration); } break; -#line 2606 "./glsl.g" +#line 2608 "./glsl.g" case 262: { // nothing to do. } break; -#line 2613 "./glsl.g" +#line 2615 "./glsl.g" case 263: { // nothing to do. } break; -#line 2620 "./glsl.g" +#line 2622 "./glsl.g" case 264: { // nothing to do. } break; -#line 2627 "./glsl.g" +#line 2629 "./glsl.g" case 265: { // nothing to do. } break; -#line 2634 "./glsl.g" +#line 2636 "./glsl.g" case 266: { // nothing to do. } break; -#line 2641 "./glsl.g" +#line 2643 "./glsl.g" case 267: { // nothing to do. } break; -#line 2648 "./glsl.g" +#line 2650 "./glsl.g" case 268: { // nothing to do. } break; -#line 2655 "./glsl.g" +#line 2657 "./glsl.g" case 269: { // nothing to do. } break; -#line 2662 "./glsl.g" +#line 2664 "./glsl.g" case 270: { // nothing to do. } break; -#line 2669 "./glsl.g" +#line 2671 "./glsl.g" case 271: { CompoundStatementAST *stmt = makeAstNode<CompoundStatementAST>(); @@ -1988,7 +1990,7 @@ case 271: { ast(1) = stmt; } break; -#line 2679 "./glsl.g" +#line 2681 "./glsl.g" case 272: { CompoundStatementAST *stmt = makeAstNode<CompoundStatementAST>(sym(2).statement_list); @@ -1997,19 +1999,19 @@ case 272: { ast(1) = stmt; } break; -#line 2689 "./glsl.g" +#line 2691 "./glsl.g" case 273: { // nothing to do. } break; -#line 2696 "./glsl.g" +#line 2698 "./glsl.g" case 274: { // nothing to do. } break; -#line 2703 "./glsl.g" +#line 2705 "./glsl.g" case 275: { CompoundStatementAST *stmt = makeAstNode<CompoundStatementAST>(); @@ -2018,7 +2020,7 @@ case 275: { ast(1) = stmt; } break; -#line 2713 "./glsl.g" +#line 2715 "./glsl.g" case 276: { CompoundStatementAST *stmt = makeAstNode<CompoundStatementAST>(sym(2).statement_list); @@ -2027,186 +2029,186 @@ case 276: { ast(1) = stmt; } break; -#line 2723 "./glsl.g" +#line 2725 "./glsl.g" case 277: { sym(1).statement_list = makeAstNode< List<StatementAST *> >(sym(1).statement); } break; -#line 2730 "./glsl.g" +#line 2732 "./glsl.g" case 278: { sym(1).statement_list = makeAstNode< List<StatementAST *> >(sym(1).statement_list, sym(2).statement); } break; -#line 2737 "./glsl.g" +#line 2739 "./glsl.g" case 279: { ast(1) = makeAstNode<CompoundStatementAST>(); // Empty statement } break; -#line 2744 "./glsl.g" +#line 2746 "./glsl.g" case 280: { ast(1) = makeAstNode<ExpressionStatementAST>(expression(1)); } break; -#line 2751 "./glsl.g" +#line 2753 "./glsl.g" case 281: { ast(1) = makeAstNode<IfStatementAST>(expression(3), sym(5).ifstmt.thenClause, sym(5).ifstmt.elseClause); } break; -#line 2758 "./glsl.g" +#line 2760 "./glsl.g" case 282: { sym(1).ifstmt.thenClause = statement(1); sym(1).ifstmt.elseClause = statement(3); } break; -#line 2766 "./glsl.g" +#line 2768 "./glsl.g" case 283: { sym(1).ifstmt.thenClause = statement(1); sym(1).ifstmt.elseClause = 0; } break; -#line 2774 "./glsl.g" +#line 2776 "./glsl.g" case 284: { // nothing to do. } break; -#line 2781 "./glsl.g" +#line 2783 "./glsl.g" case 285: { ast(1) = makeAstNode<DeclarationExpressionAST> (type(1), string(2), expression(4)); } break; -#line 2789 "./glsl.g" +#line 2791 "./glsl.g" case 286: { ast(1) = makeAstNode<SwitchStatementAST>(expression(3), statement(6)); } break; -#line 2796 "./glsl.g" +#line 2798 "./glsl.g" case 287: { ast(1) = makeAstNode<CompoundStatementAST>(); } break; -#line 2803 "./glsl.g" +#line 2805 "./glsl.g" case 288: { ast(1) = makeAstNode<CompoundStatementAST>(sym(1).statement_list); } break; -#line 2810 "./glsl.g" +#line 2812 "./glsl.g" case 289: { ast(1) = makeAstNode<CaseLabelStatementAST>(expression(2)); } break; -#line 2817 "./glsl.g" +#line 2819 "./glsl.g" case 290: { ast(1) = makeAstNode<CaseLabelStatementAST>(); } break; -#line 2824 "./glsl.g" +#line 2826 "./glsl.g" case 291: { ast(1) = makeAstNode<WhileStatementAST>(expression(3), statement(5)); } break; -#line 2831 "./glsl.g" +#line 2833 "./glsl.g" case 292: { ast(1) = makeAstNode<DoStatementAST>(statement(2), expression(5)); } break; -#line 2838 "./glsl.g" +#line 2840 "./glsl.g" case 293: { ast(1) = makeAstNode<ForStatementAST>(statement(3), sym(4).forstmt.condition, sym(4).forstmt.increment, statement(6)); } break; -#line 2845 "./glsl.g" +#line 2847 "./glsl.g" case 294: { // nothing to do. } break; -#line 2852 "./glsl.g" +#line 2854 "./glsl.g" case 295: { // nothing to do. } break; -#line 2859 "./glsl.g" +#line 2861 "./glsl.g" case 296: { // nothing to do. } break; -#line 2866 "./glsl.g" +#line 2868 "./glsl.g" case 297: { // nothing to do. } break; -#line 2873 "./glsl.g" +#line 2875 "./glsl.g" case 298: { sym(1).forstmt.condition = expression(1); sym(1).forstmt.increment = 0; } break; -#line 2881 "./glsl.g" +#line 2883 "./glsl.g" case 299: { sym(1).forstmt.condition = expression(1); sym(1).forstmt.increment = expression(3); } break; -#line 2889 "./glsl.g" +#line 2891 "./glsl.g" case 300: { ast(1) = makeAstNode<JumpStatementAST>(AST::Kind_Continue); } break; -#line 2896 "./glsl.g" +#line 2898 "./glsl.g" case 301: { ast(1) = makeAstNode<JumpStatementAST>(AST::Kind_Break); } break; -#line 2903 "./glsl.g" +#line 2905 "./glsl.g" case 302: { ast(1) = makeAstNode<ReturnStatementAST>(); } break; -#line 2910 "./glsl.g" +#line 2912 "./glsl.g" case 303: { ast(1) = makeAstNode<ReturnStatementAST>(expression(2)); } break; -#line 2917 "./glsl.g" +#line 2919 "./glsl.g" case 304: { ast(1) = makeAstNode<JumpStatementAST>(AST::Kind_Discard); } break; -#line 2924 "./glsl.g" +#line 2926 "./glsl.g" case 305: { ast(1) = makeAstNode<TranslationUnitAST>(sym(1).declaration_list); } break; -#line 2931 "./glsl.g" +#line 2933 "./glsl.g" case 306: { if (sym(1).declaration) { @@ -2217,7 +2219,7 @@ case 306: { } } break; -#line 2943 "./glsl.g" +#line 2945 "./glsl.g" case 307: { if (sym(1).declaration_list && sym(2).declaration) { @@ -2233,49 +2235,49 @@ case 307: { } } break; -#line 2960 "./glsl.g" +#line 2962 "./glsl.g" case 308: { // nothing to do. } break; -#line 2967 "./glsl.g" +#line 2969 "./glsl.g" case 309: { // nothing to do. } break; -#line 2974 "./glsl.g" +#line 2976 "./glsl.g" case 310: { ast(1) = 0; } break; -#line 2981 "./glsl.g" +#line 2983 "./glsl.g" case 311: { function(1)->body = statement(2); } break; -#line 2988 "./glsl.g" +#line 2990 "./glsl.g" case 312: { ast(1) = 0; } break; -#line 2996 "./glsl.g" +#line 2998 "./glsl.g" case 313: { ast(1) = ast(2); } break; -#line 3003 "./glsl.g" +#line 3005 "./glsl.g" case 314: { ast(1) = ast(2); } break; -#line 3009 "./glsl.g" +#line 3011 "./glsl.g" } // end switch } // end Parser::reduce() diff --git a/src/libs/glsl/glslparsertable.cpp b/src/libs/glsl/glslparsertable.cpp index 67666dba7e..55c39d1f99 100644 --- a/src/libs/glsl/glslparsertable.cpp +++ b/src/libs/glsl/glslparsertable.cpp @@ -1,26 +1,31 @@ /**************************************************************************** ** ** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the Qt Toolkit. ** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ +** $QT_BEGIN_LICENSE:LGPL21$ ** 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. +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://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. +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ ** @@ -32,1266 +37,1258 @@ QT_BEGIN_NAMESPACE const char *const GLSLParserTable::spell [] = { - "end of file", "feed GLSL", "feed expression", "+=", "&", "&=", "&&", "attribute", "!", "bool", - "break", "bvec2", "bvec3", "bvec4", "^", "case", "centroid", ":", ",", "const", - "continue", "-", "--", "default", "discard", "/=", "dmat2", "dmat2x2", "dmat2x3", "dmat2x4", - "dmat3", "dmat3x2", "dmat3x3", "dmat3x4", "dmat4", "dmat4x2", "dmat4x3", "dmat4x4", "do", ".", - "double", "dvec2", "dvec3", "dvec4", "else", "=", "==", "flat", "float", "for", - ">=", "highp", "identifier", "if", "in", "++", "inout", "int", "invariant", "isampler1D", - "isampler1DArray", "isampler2D", "isampler2DArray", "isampler2DMS", "isampler2DMSArray", "isampler2DRect", "isampler3D", "isamplerBuffer", "isamplerCube", "isamplerCubeArray", - "ivec2", "ivec3", "ivec4", "layout", "<", "<<=", "{", "[", "<<", "(", - "<=", "lowp", "mat2", "mat2x2", "mat2x3", "mat2x4", "mat3", "mat3x2", "mat3x3", "mat3x4", - "mat4", "mat4x2", "mat4x3", "mat4x4", "mediump", "%=", "*=", "!=", "noperspective", "number constant", - "|=", "||", "out", "patch", "%", "plus", "precision", "?", "return", ">", - ">>=", "}", "]", ">>", ")", "sample", "sampler1D", "sampler1DArray", "sampler1DArrayShadow", "sampler1DShadow", - "sampler2D", "sampler2DArray", "sampler2DArrayShadow", "sampler2DMS", "sampler2DMSArray", "sampler2DRect", "sampler2DRectShadow", "sampler2DShadow", "sampler3D", "samplerBuffer", - "samplerCube", "samplerCubeArray", "samplerCubeArrayShadow", "samplerCubeShadow", ";", "/", "smooth", "*", "struct", "subroutine", - "-=", "switch", "~", "type_name", "uint", "uniform", "usampler1D", "usampler1DArray", "usampler2D", "usampler2DArray", - "usampler2DMS", "usampler2DMSarray", "usampler2DRect", "usampler3D", "usamplerBuffer", "usamplerCube", "usamplerCubeArray", "uvec2", "uvec3", "uvec4", - "varying", "vec2", "vec3", "vec4", "|", "void", "while", "^=", "^^", "true", - "false", "preprocessor directive", "comment", "error", "reserved word" -}; + "end of file", "feed GLSL", "feed expression", "+=", "&", "&=", "&&", "attribute", "!", "bool", + "break", "bvec2", "bvec3", "bvec4", "^", "case", "centroid", ":", ",", "const", + "continue", "-", "--", "default", "discard", "/=", "dmat2", "dmat2x2", "dmat2x3", "dmat2x4", + "dmat3", "dmat3x2", "dmat3x3", "dmat3x4", "dmat4", "dmat4x2", "dmat4x3", "dmat4x4", "do", ".", + "double", "dvec2", "dvec3", "dvec4", "else", "=", "==", "flat", "float", "for", + ">=", "highp", "identifier", "if", "in", "++", "inout", "int", "invariant", "isampler1D", + "isampler1DArray", "isampler2D", "isampler2DArray", "isampler2DMS", "isampler2DMSArray", "isampler2DRect", "isampler3D", "isamplerBuffer", "isamplerCube", "isamplerCubeArray", + "ivec2", "ivec3", "ivec4", "layout", "<", "<<=", "{", "[", "<<", "(", + "<=", "lowp", "mat2", "mat2x2", "mat2x3", "mat2x4", "mat3", "mat3x2", "mat3x3", "mat3x4", + "mat4", "mat4x2", "mat4x3", "mat4x4", "mediump", "%=", "*=", "!=", "noperspective", "number constant", + "|=", "||", "out", "patch", "%", "plus", "precision", "?", "return", ">", + ">>=", "}", "]", ">>", ")", "sample", "sampler1D", "sampler1DArray", "sampler1DArrayShadow", "sampler1DShadow", + "sampler2D", "sampler2DArray", "sampler2DArrayShadow", "sampler2DMS", "sampler2DMSArray", "sampler2DRect", "sampler2DRectShadow", "sampler2DShadow", "sampler3D", "samplerBuffer", + "samplerCube", "samplerCubeArray", "samplerCubeArrayShadow", "samplerCubeShadow", ";", "/", "smooth", "*", "struct", "subroutine", + "-=", "switch", "~", "type_name", "uint", "uniform", "usampler1D", "usampler1DArray", "usampler2D", "usampler2DArray", + "usampler2DMS", "usampler2DMSarray", "usampler2DRect", "usampler3D", "usamplerBuffer", "usamplerCube", "usamplerCubeArray", "uvec2", "uvec3", "uvec4", + "varying", "vec2", "vec3", "vec4", "|", "void", "while", "^=", "^^", "true", + "false", "preprocessor directive", "comment", "error", "reserved word"}; const short GLSLParserTable::lhs [] = { - 176, 177, 177, 177, 177, 177, 179, 179, 179, 179, - 179, 179, 180, 181, 182, 182, 183, 183, 185, 185, - 184, 184, 186, 188, 188, 190, 190, 190, 190, 191, - 191, 191, 191, 192, 192, 192, 192, 193, 193, 193, - 194, 194, 194, 195, 195, 195, 195, 195, 196, 196, - 196, 197, 197, 198, 198, 199, 199, 200, 200, 201, - 201, 202, 202, 203, 203, 187, 187, 204, 204, 204, - 204, 204, 204, 204, 204, 204, 204, 204, 178, 178, - 205, 206, 206, 206, 206, 206, 206, 206, 206, 207, - 213, 213, 215, 215, 214, 218, 218, 216, 216, 216, - 216, 220, 220, 220, 220, 221, 208, 208, 208, 208, - 208, 208, 208, 223, 223, 223, 223, 223, 223, 223, - 223, 217, 217, 225, 226, 226, 226, 227, 228, 228, - 229, 229, 219, 211, 211, 211, 211, 211, 211, 211, - 211, 230, 230, 230, 230, 230, 230, 230, 230, 230, - 230, 230, 230, 230, 189, 189, 210, 210, 210, 231, - 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, - 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, - 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, - 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, - 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, - 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, - 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, - 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, - 231, 231, 231, 231, 231, 231, 209, 209, 209, 232, - 232, 212, 212, 233, 233, 234, 234, 235, 235, 235, - 224, 236, 237, 237, 239, 239, 239, 239, 239, 239, - 239, 238, 238, 247, 247, 248, 248, 246, 246, 240, - 240, 241, 249, 249, 250, 250, 242, 251, 251, 243, - 243, 244, 244, 244, 252, 252, 254, 254, 253, 253, - 245, 245, 245, 245, 245, 255, 256, 256, 257, 257, - 257, 258, 222, 175, 175, 259 -}; + 176, 177, 177, 177, 177, 177, 179, 179, 179, 179, + 179, 179, 180, 181, 182, 182, 183, 183, 185, 185, + 184, 184, 186, 188, 188, 190, 190, 190, 190, 191, + 191, 191, 191, 192, 192, 192, 192, 193, 193, 193, + 194, 194, 194, 195, 195, 195, 195, 195, 196, 196, + 196, 197, 197, 198, 198, 199, 199, 200, 200, 201, + 201, 202, 202, 203, 203, 187, 187, 204, 204, 204, + 204, 204, 204, 204, 204, 204, 204, 204, 178, 178, + 205, 206, 206, 206, 206, 206, 206, 206, 206, 207, + 213, 213, 215, 215, 214, 218, 218, 216, 216, 216, + 216, 220, 220, 220, 220, 221, 208, 208, 208, 208, + 208, 208, 208, 223, 223, 223, 223, 223, 223, 223, + 223, 217, 217, 225, 226, 226, 226, 227, 228, 228, + 229, 229, 219, 211, 211, 211, 211, 211, 211, 211, + 211, 230, 230, 230, 230, 230, 230, 230, 230, 230, + 230, 230, 230, 230, 189, 189, 210, 210, 210, 231, + 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, + 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, + 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, + 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, + 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, + 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, + 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, + 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, + 231, 231, 231, 231, 231, 231, 209, 209, 209, 232, + 232, 212, 212, 233, 233, 234, 234, 235, 235, 235, + 224, 236, 237, 237, 239, 239, 239, 239, 239, 239, + 239, 238, 238, 247, 247, 248, 248, 246, 246, 240, + 240, 241, 249, 249, 250, 250, 242, 251, 251, 243, + 243, 244, 244, 244, 252, 252, 254, 254, 253, 253, + 245, 245, 245, 245, 245, 255, 256, 256, 257, 257, + 257, 258, 222, 175, 175, 259}; const short GLSLParserTable::rhs [] = { - 1, 1, 1, 1, 1, 3, 1, 4, 1, 3, - 2, 2, 1, 1, 1, 3, 2, 2, 2, 1, - 2, 3, 2, 1, 1, 1, 2, 2, 2, 1, - 1, 1, 1, 1, 3, 3, 3, 1, 3, 3, - 1, 3, 3, 1, 3, 3, 3, 3, 1, 3, - 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, - 3, 1, 3, 1, 5, 1, 3, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, - 1, 2, 2, 4, 6, 7, 9, 10, 2, 2, - 1, 1, 2, 3, 3, 2, 5, 3, 2, 3, - 2, 1, 1, 1, 1, 1, 1, 3, 5, 6, - 7, 8, 5, 1, 2, 4, 5, 6, 7, 4, - 2, 1, 2, 1, 1, 1, 1, 4, 1, 3, - 1, 3, 1, 1, 1, 2, 2, 1, 2, 3, - 1, 1, 1, 1, 2, 1, 1, 2, 2, 2, - 2, 2, 2, 1, 1, 2, 1, 3, 4, 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, 5, - 4, 1, 2, 3, 4, 1, 3, 1, 3, 4, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 2, 3, 1, 1, 2, 3, 1, 2, 1, - 2, 5, 3, 1, 1, 4, 7, 1, 1, 3, - 2, 5, 7, 6, 1, 1, 1, 1, 2, 3, - 2, 2, 2, 3, 2, 1, 1, 2, 1, 1, - 1, 2, 0, 2, 2, 2 -}; + 1, 1, 1, 1, 1, 3, 1, 4, 1, 3, + 2, 2, 1, 1, 1, 3, 2, 2, 2, 1, + 2, 3, 2, 1, 1, 1, 2, 2, 2, 1, + 1, 1, 1, 1, 3, 3, 3, 1, 3, 3, + 1, 3, 3, 1, 3, 3, 3, 3, 1, 3, + 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, + 3, 1, 3, 1, 5, 1, 3, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, + 1, 2, 2, 4, 6, 7, 9, 10, 2, 2, + 1, 1, 2, 3, 3, 2, 5, 3, 2, 3, + 2, 1, 1, 1, 1, 1, 1, 3, 5, 6, + 7, 8, 5, 1, 2, 4, 5, 6, 7, 4, + 2, 1, 2, 1, 1, 1, 1, 4, 1, 3, + 1, 3, 1, 1, 1, 2, 2, 1, 2, 3, + 1, 1, 1, 1, 2, 1, 1, 2, 2, 2, + 2, 2, 2, 1, 1, 2, 1, 3, 4, 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, 5, + 4, 1, 2, 3, 4, 1, 3, 1, 3, 4, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 2, 3, 1, 1, 2, 3, 1, 2, 1, + 2, 5, 3, 1, 1, 4, 7, 1, 1, 3, + 2, 5, 7, 6, 1, 1, 1, 1, 2, 3, + 2, 2, 2, 3, 2, 1, 1, 2, 1, 1, + 1, 2, 0, 2, 2, 2}; const short GLSLParserTable::action_default [] = { - 0, 0, 0, 0, 32, 165, 172, 173, 174, 31, - 0, 193, 196, 197, 198, 194, 199, 200, 201, 195, - 202, 203, 204, 162, 169, 170, 171, 4, 161, 247, - 1, 0, 163, 218, 222, 219, 223, 240, 243, 234, - 220, 237, 221, 224, 175, 176, 177, 0, 249, 181, - 184, 185, 186, 182, 187, 188, 189, 183, 190, 191, - 192, 248, 2, 30, 205, 212, 214, 209, 206, 213, - 215, 239, 242, 232, 233, 210, 207, 236, 208, 216, - 217, 211, 0, 33, 3, 246, 164, 225, 229, 226, - 230, 241, 244, 235, 227, 238, 228, 231, 178, 179, - 180, 166, 167, 168, 160, 41, 54, 79, 66, 52, - 56, 315, 9, 15, 20, 0, 0, 14, 0, 58, - 60, 64, 62, 38, 26, 0, 7, 49, 44, 245, - 24, 155, 157, 34, 0, 5, 28, 27, 0, 0, - 6, 80, 0, 0, 0, 143, 0, 142, 126, 146, - 141, 0, 127, 147, 0, 0, 125, 154, 144, 138, - 0, 135, 134, 252, 0, 0, 0, 148, 149, 145, - 0, 131, 129, 0, 0, 132, 0, 128, 130, 150, - 151, 152, 153, 137, 0, 139, 140, 136, 250, 253, - 0, 258, 256, 0, 0, 259, 81, 0, 34, 260, - 0, 255, 257, 0, 254, 0, 251, 0, 0, 40, - 0, 0, 0, 37, 36, 35, 39, 0, 53, 0, - 0, 50, 0, 0, 0, 0, 48, 0, 0, 42, - 43, 45, 47, 46, 51, 0, 55, 160, 21, 18, - 0, 17, 22, 23, 0, 57, 0, 59, 0, 0, - 63, 0, 61, 0, 0, 65, 12, 0, 11, 0, - 10, 16, 13, 0, 8, 156, 0, 158, 0, 159, - 72, 76, 70, 68, 74, 71, 69, 78, 75, 73, - 77, 0, 67, 29, 141, 0, 311, 310, 307, 306, - 114, 0, 309, 313, 92, 0, 0, 107, 314, 0, - 122, 121, 0, 0, 84, 308, 115, 0, 0, 95, - 261, 120, 116, 0, 0, 118, 117, 0, 119, 90, - 133, 103, 105, 104, 102, 93, 0, 313, 99, 101, - 106, 96, 0, 0, 97, 0, 98, 100, 106, 313, - 94, 0, 82, 312, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 276, 280, 0, 0, 269, 263, - 262, 265, 0, 266, 0, 270, 271, 267, 264, 278, - 0, 268, 122, 302, 0, 290, 301, 291, 305, 0, - 0, 0, 0, 0, 293, 0, 296, 295, 313, 122, - 298, 0, 297, 285, 0, 0, 0, 299, 300, 0, - 274, 275, 294, 0, 0, 286, 123, 0, 0, 0, - 282, 284, 0, 283, 272, 0, 273, 279, 303, 0, - 304, 0, 0, 0, 313, 288, 289, 0, 287, 0, - 0, 0, 292, 281, 277, 0, 83, 108, 0, 0, - 113, 109, 0, 0, 111, 110, 0, 112, 0, 89, - 0, 0, 0, 0, 85, 0, 86, 0, 0, 87, - 0, 88, 316 -}; + 0, 0, 0, 0, 32, 165, 172, 173, 174, 31, + 0, 193, 196, 197, 198, 194, 199, 200, 201, 195, + 202, 203, 204, 162, 169, 170, 171, 4, 161, 247, + 1, 0, 163, 218, 222, 219, 223, 240, 243, 234, + 220, 237, 221, 224, 175, 176, 177, 0, 249, 181, + 184, 185, 186, 182, 187, 188, 189, 183, 190, 191, + 192, 248, 2, 30, 205, 212, 214, 209, 206, 213, + 215, 239, 242, 232, 233, 210, 207, 236, 208, 216, + 217, 211, 0, 33, 3, 246, 164, 225, 229, 226, + 230, 241, 244, 235, 227, 238, 228, 231, 178, 179, + 180, 166, 167, 168, 160, 41, 54, 79, 66, 52, + 56, 315, 9, 15, 20, 0, 0, 14, 0, 58, + 60, 64, 62, 38, 26, 0, 7, 49, 44, 245, + 24, 155, 157, 34, 0, 5, 28, 27, 0, 0, + 6, 80, 0, 0, 0, 143, 0, 142, 126, 146, + 141, 0, 127, 147, 0, 0, 125, 154, 144, 138, + 0, 135, 134, 252, 0, 0, 0, 148, 149, 145, + 0, 131, 129, 0, 0, 132, 0, 128, 130, 150, + 151, 152, 153, 137, 0, 139, 140, 136, 250, 253, + 0, 258, 256, 0, 0, 259, 81, 0, 34, 260, + 0, 255, 257, 0, 254, 0, 251, 0, 0, 40, + 0, 0, 0, 37, 36, 35, 39, 0, 53, 0, + 0, 50, 0, 0, 0, 0, 48, 0, 0, 42, + 43, 45, 47, 46, 51, 0, 55, 160, 21, 18, + 0, 17, 22, 23, 0, 57, 0, 59, 0, 0, + 63, 0, 61, 0, 0, 65, 12, 0, 11, 0, + 10, 16, 13, 0, 8, 156, 0, 158, 0, 159, + 72, 76, 70, 68, 74, 71, 69, 78, 75, 73, + 77, 0, 67, 29, 141, 0, 311, 310, 307, 306, + 114, 0, 309, 313, 92, 0, 0, 107, 314, 0, + 122, 121, 0, 0, 84, 308, 115, 0, 0, 95, + 261, 120, 116, 0, 0, 118, 117, 0, 119, 90, + 133, 103, 105, 104, 102, 93, 0, 313, 99, 101, + 106, 96, 0, 0, 97, 0, 98, 100, 106, 313, + 94, 0, 82, 312, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 276, 280, 0, 0, 269, 263, + 262, 265, 0, 266, 0, 270, 271, 267, 264, 278, + 0, 268, 122, 302, 0, 290, 301, 291, 305, 0, + 0, 0, 0, 0, 293, 0, 296, 295, 313, 122, + 298, 0, 297, 285, 0, 0, 0, 299, 300, 0, + 274, 275, 294, 0, 0, 286, 123, 0, 0, 0, + 282, 284, 0, 283, 272, 0, 273, 279, 303, 0, + 304, 0, 0, 0, 313, 288, 289, 0, 287, 0, + 0, 0, 292, 281, 277, 0, 83, 108, 0, 0, + 113, 109, 0, 0, 111, 110, 0, 112, 0, 89, + 0, 0, 0, 0, 85, 0, 86, 0, 0, 87, + 0, 88, 316}; const short GLSLParserTable::goto_default [] = { - 3, 135, 126, 362, 124, 263, 112, 117, 113, 116, - 115, 114, 107, 118, 130, 133, 134, 123, 105, 128, - 127, 109, 106, 110, 119, 120, 122, 121, 108, 281, - 197, 360, 364, 296, 125, 131, 299, 205, 291, 293, - 294, 325, 290, 328, 327, 326, 329, 324, 297, 311, - 160, 159, 161, 173, 172, 162, 132, 129, 163, 203, - 192, 361, 369, 359, 368, 363, 367, 371, 358, 365, - 366, 370, 402, 400, 410, 390, 427, 388, 394, 391, - 298, 289, 288, 292, 0 -}; + 3, 135, 126, 362, 124, 263, 112, 117, 113, 116, + 115, 114, 107, 118, 130, 133, 134, 123, 105, 128, + 127, 109, 106, 110, 119, 120, 122, 121, 108, 281, + 197, 360, 364, 296, 125, 131, 299, 205, 291, 293, + 294, 325, 290, 328, 327, 326, 329, 324, 297, 311, + 160, 159, 161, 173, 172, 162, 132, 129, 163, 203, + 192, 361, 369, 359, 368, 363, 367, 371, 358, 365, + 366, 370, 402, 400, 410, 390, 427, 388, 394, 391, + 298, 289, 288, 292, 0}; const short GLSLParserTable::action_index [] = { - 86, 1180, 3189, 58, -175, -175, -175, -175, -175, -175, - 1180, -175, -175, -175, -175, -175, -175, -175, -175, -175, - -175, -175, -175, -175, -175, -175, -175, -175, -175, -175, - -79, 1180, -175, -175, -175, -175, -175, -175, -175, -175, - -175, -175, -175, -175, -175, -175, -175, 1180, -175, -175, - -175, -175, -175, -175, -175, -175, -175, -175, -175, -175, - -175, -175, -175, -175, -175, -175, -175, -175, -175, -175, - -175, -175, -175, -175, -175, -175, -175, -175, -175, -175, - -175, -175, 32, -175, -175, -175, -175, -175, -175, -175, - -175, -175, -175, -175, -175, -175, -175, -175, -175, -175, - -175, -175, -175, -175, -175, 82, 61, -175, -175, 60, - 181, 45, -175, -175, 1347, -55, 87, -175, -25, -113, - -3, 6, -159, 40, 128, 515, -175, 112, 26, -175, - -175, -175, -58, 197, 1180, -175, -175, -175, 84, 1180, - -175, -175, -62, 2517, 2517, -175, 56, -175, -175, -175, - 187, -54, -175, -175, 46, 25, -175, -175, -175, 349, - 207, 349, -175, -175, 2685, 681, 10, -175, -175, -175, - 3, 11, -175, 83, -38, -175, 0, -175, -175, -175, - -175, -175, -175, -175, 349, -175, -175, -175, -175, -175, - 18, -6, -175, 79, 1514, -175, -175, -77, -175, -175, - -16, -175, -175, 76, -175, 3021, -175, 1180, 1180, 12, - 1180, 1180, 1180, -175, -175, -175, 37, 1180, 49, 1180, - 1180, 90, 1180, 1180, 1180, 1180, 15, 1180, 1180, 71, - 68, -4, 8, 7, 80, 1180, 33, -75, -175, -175, - 1180, -175, -175, -175, 1180, 181, 1180, -132, 1180, 1180, - -137, 1180, 34, 73, 1180, -175, -175, 847, -175, 1180, - -10, -175, 48, -44, -175, -175, 2349, -175, -45, -175, - -175, -175, -175, -175, -175, -175, -175, -175, -175, -175, - -175, 1180, -175, -175, 217, 72, -175, -175, -175, 3189, - -47, -107, -175, 163, -14, 22, 81, -175, -175, 1013, - -175, -175, 515, -105, -175, -175, 66, 1180, 2015, -175, - -175, -175, -21, -91, 1180, -175, -34, 1180, -175, -175, - -175, -175, -175, -175, -175, -175, 681, 63, -175, -175, - -40, -76, 1180, -78, -175, 681, -175, -175, 5, 105, - -175, 4365, -175, -175, -81, 1180, -121, -2, -114, 3861, - -56, -53, 4533, 2182, -175, -175, -57, -69, -175, -175, - -175, -175, 54, -175, -74, -175, -175, -175, -175, -175, - 4029, -175, -46, -175, 59, -175, -175, -175, -175, -128, - -49, 1180, 55, -93, -175, 3525, -175, -175, 3357, -37, - -175, -90, -175, 27, -68, -5, 681, 1180, 30, 3693, - -175, -175, -175, 4, 1180, -175, -175, 1180, 57, 3861, - -175, -1, 3861, -175, -175, 4197, -175, -175, -175, 62, - -175, 1180, 64, 20, 3861, -175, 3861, -103, -175, 3357, - -86, 3693, -175, -175, -175, -35, -175, 38, 1180, 1848, - -175, -27, -85, 1180, -175, -43, 1180, -175, -70, -175, - 2517, 2853, 29, 1, -175, 1681, -175, -84, -48, -175, - -118, -175, -175, + 86, 1180, 3189, 58, -175, -175, -175, -175, -175, -175, + 1180, -175, -175, -175, -175, -175, -175, -175, -175, -175, + -175, -175, -175, -175, -175, -175, -175, -175, -175, -175, + -79, 1180, -175, -175, -175, -175, -175, -175, -175, -175, + -175, -175, -175, -175, -175, -175, -175, 1180, -175, -175, + -175, -175, -175, -175, -175, -175, -175, -175, -175, -175, + -175, -175, -175, -175, -175, -175, -175, -175, -175, -175, + -175, -175, -175, -175, -175, -175, -175, -175, -175, -175, + -175, -175, 32, -175, -175, -175, -175, -175, -175, -175, + -175, -175, -175, -175, -175, -175, -175, -175, -175, -175, + -175, -175, -175, -175, -175, 82, 61, -175, -175, 60, + 181, 45, -175, -175, 1347, -55, 87, -175, -25, -113, + -3, 6, -159, 40, 128, 515, -175, 112, 26, -175, + -175, -175, -58, 197, 1180, -175, -175, -175, 84, 1180, + -175, -175, -62, 2517, 2517, -175, 56, -175, -175, -175, + 187, -54, -175, -175, 46, 25, -175, -175, -175, 349, + 207, 349, -175, -175, 2685, 681, 10, -175, -175, -175, + 3, 11, -175, 83, -38, -175, 0, -175, -175, -175, + -175, -175, -175, -175, 349, -175, -175, -175, -175, -175, + 18, -6, -175, 79, 1514, -175, -175, -77, -175, -175, + -16, -175, -175, 76, -175, 3021, -175, 1180, 1180, 12, + 1180, 1180, 1180, -175, -175, -175, 37, 1180, 49, 1180, + 1180, 90, 1180, 1180, 1180, 1180, 15, 1180, 1180, 71, + 68, -4, 8, 7, 80, 1180, 33, -75, -175, -175, + 1180, -175, -175, -175, 1180, 181, 1180, -132, 1180, 1180, + -137, 1180, 34, 73, 1180, -175, -175, 847, -175, 1180, + -10, -175, 48, -44, -175, -175, 2349, -175, -45, -175, + -175, -175, -175, -175, -175, -175, -175, -175, -175, -175, + -175, 1180, -175, -175, 217, 72, -175, -175, -175, 3189, + -47, -107, -175, 163, -14, 22, 81, -175, -175, 1013, + -175, -175, 515, -105, -175, -175, 66, 1180, 2015, -175, + -175, -175, -21, -91, 1180, -175, -34, 1180, -175, -175, + -175, -175, -175, -175, -175, -175, 681, 63, -175, -175, + -40, -76, 1180, -78, -175, 681, -175, -175, 5, 105, + -175, 4365, -175, -175, -81, 1180, -121, -2, -114, 3861, + -56, -53, 4533, 2182, -175, -175, -57, -69, -175, -175, + -175, -175, 54, -175, -74, -175, -175, -175, -175, -175, + 4029, -175, -46, -175, 59, -175, -175, -175, -175, -128, + -49, 1180, 55, -93, -175, 3525, -175, -175, 3357, -37, + -175, -90, -175, 27, -68, -5, 681, 1180, 30, 3693, + -175, -175, -175, 4, 1180, -175, -175, 1180, 57, 3861, + -175, -1, 3861, -175, -175, 4197, -175, -175, -175, 62, + -175, 1180, 64, 20, 3861, -175, 3861, -103, -175, 3357, + -86, 3693, -175, -175, -175, -35, -175, 38, 1180, 1848, + -175, -27, -85, 1180, -175, -43, 1180, -175, -70, -175, + 2517, 2853, 29, 1, -175, 1681, -175, -84, -48, -175, + -118, -175, -175, - -85, 11, 90, -85, -85, -85, -85, -85, -85, -85, - -3, -85, -85, -85, -85, -85, -85, -85, -85, -85, - -85, -85, -85, -85, -85, -85, -85, -85, -85, -85, - -85, -9, -85, -85, -85, -85, -85, -85, -85, -85, - -85, -85, -85, -85, -85, -85, -85, 70, -85, -85, - -85, -85, -85, -85, -85, -85, -85, -85, -85, -85, - -85, -85, -85, -85, -85, -85, -85, -85, -85, -85, - -85, -85, -85, -85, -85, -85, -85, -85, -85, -85, - -85, -85, -85, -85, -85, -85, -85, -85, -85, -85, - -85, -85, -85, -85, -85, -85, -85, -85, -85, -85, - -85, -85, -85, -85, -85, -85, -85, -85, -85, -85, - -85, -85, -85, -85, 20, -85, -85, -85, -85, -85, - -85, -85, -85, -85, -85, 3, -85, -85, -85, -85, - -85, -85, -85, -85, 9, -85, -85, -85, -85, 5, - -85, -85, -85, 56, 110, -85, -85, -85, -85, -85, - -85, -85, -85, -85, -85, -85, -85, -85, -85, -39, - 21, -21, -85, -85, 96, -7, -85, -85, -85, -85, - -85, -85, -85, -85, -85, -85, -49, -85, -85, -85, - -85, -85, -85, -85, -47, -85, -85, -85, -85, -85, - -46, -85, -85, -85, 35, -85, -85, -85, -85, -85, - -45, -85, -85, -85, -85, 109, -85, 29, 30, -85, - -4, -5, -6, -85, -85, -85, -85, 38, -85, 40, - 41, -85, 43, 78, 84, 81, -85, 80, 66, -85, - -85, -85, -85, -85, -85, 67, -85, -85, -85, -85, - -12, -85, -85, -85, 42, -85, 51, -85, 52, 27, - -85, 49, -85, -85, 24, -85, -85, 18, -85, 22, - -85, -85, -85, -85, -85, -85, 114, -85, -85, -85, - -85, -85, -85, -85, -85, -85, -85, -85, -85, -85, - -85, 6, -85, -85, -85, -11, -85, -85, -85, 129, - -85, -85, -85, -85, -85, -38, -85, -85, -85, 23, - -85, -85, -2, -85, -85, -85, -85, 19, 79, -85, - -85, -85, -85, -85, 39, -85, -85, 37, -85, -85, - -85, -85, -85, -85, -85, -85, 14, -18, -85, -85, - -85, -85, 121, -85, -85, 94, -85, -85, -85, -19, - -85, 7, -85, -85, -85, 16, -85, -85, -85, 77, - -85, -85, 87, 17, -85, -85, -85, -85, -85, -85, - -85, -85, -85, -85, -85, -85, -85, -85, -85, -85, - 65, -85, -85, -85, -85, -85, -85, -85, -85, -85, - -85, 26, -85, -85, -85, 91, -85, -85, 159, -85, - -85, -85, -85, -85, -85, -85, -13, -1, -85, 54, - -85, -85, -85, -85, 57, -85, -85, 1, -85, 69, - -85, -85, 141, -85, -85, 76, -85, -85, -85, -85, - -85, 0, -85, -85, 88, -85, 25, -85, -85, 223, - -85, 100, -85, -85, -85, -85, -85, -85, 36, 138, - -85, -85, -85, 31, -85, -85, 28, -85, -85, -85, - 97, 105, -85, -85, -85, 98, -85, -85, -85, -85, - -85, -85, -85 -}; + -85, 11, 90, -85, -85, -85, -85, -85, -85, -85, + -3, -85, -85, -85, -85, -85, -85, -85, -85, -85, + -85, -85, -85, -85, -85, -85, -85, -85, -85, -85, + -85, -9, -85, -85, -85, -85, -85, -85, -85, -85, + -85, -85, -85, -85, -85, -85, -85, 70, -85, -85, + -85, -85, -85, -85, -85, -85, -85, -85, -85, -85, + -85, -85, -85, -85, -85, -85, -85, -85, -85, -85, + -85, -85, -85, -85, -85, -85, -85, -85, -85, -85, + -85, -85, -85, -85, -85, -85, -85, -85, -85, -85, + -85, -85, -85, -85, -85, -85, -85, -85, -85, -85, + -85, -85, -85, -85, -85, -85, -85, -85, -85, -85, + -85, -85, -85, -85, 20, -85, -85, -85, -85, -85, + -85, -85, -85, -85, -85, 3, -85, -85, -85, -85, + -85, -85, -85, -85, 9, -85, -85, -85, -85, 5, + -85, -85, -85, 56, 110, -85, -85, -85, -85, -85, + -85, -85, -85, -85, -85, -85, -85, -85, -85, -39, + 21, -21, -85, -85, 96, -7, -85, -85, -85, -85, + -85, -85, -85, -85, -85, -85, -49, -85, -85, -85, + -85, -85, -85, -85, -47, -85, -85, -85, -85, -85, + -46, -85, -85, -85, 35, -85, -85, -85, -85, -85, + -45, -85, -85, -85, -85, 109, -85, 29, 30, -85, + -4, -5, -6, -85, -85, -85, -85, 38, -85, 40, + 41, -85, 43, 78, 84, 81, -85, 80, 66, -85, + -85, -85, -85, -85, -85, 67, -85, -85, -85, -85, + -12, -85, -85, -85, 42, -85, 51, -85, 52, 27, + -85, 49, -85, -85, 24, -85, -85, 18, -85, 22, + -85, -85, -85, -85, -85, -85, 114, -85, -85, -85, + -85, -85, -85, -85, -85, -85, -85, -85, -85, -85, + -85, 6, -85, -85, -85, -11, -85, -85, -85, 129, + -85, -85, -85, -85, -85, -38, -85, -85, -85, 23, + -85, -85, -2, -85, -85, -85, -85, 19, 79, -85, + -85, -85, -85, -85, 39, -85, -85, 37, -85, -85, + -85, -85, -85, -85, -85, -85, 14, -18, -85, -85, + -85, -85, 121, -85, -85, 94, -85, -85, -85, -19, + -85, 7, -85, -85, -85, 16, -85, -85, -85, 77, + -85, -85, 87, 17, -85, -85, -85, -85, -85, -85, + -85, -85, -85, -85, -85, -85, -85, -85, -85, -85, + 65, -85, -85, -85, -85, -85, -85, -85, -85, -85, + -85, 26, -85, -85, -85, 91, -85, -85, 159, -85, + -85, -85, -85, -85, -85, -85, -13, -1, -85, 54, + -85, -85, -85, -85, 57, -85, -85, 1, -85, 69, + -85, -85, 141, -85, -85, 76, -85, -85, -85, -85, + -85, 0, -85, -85, 88, -85, 25, -85, -85, 223, + -85, 100, -85, -85, -85, -85, -85, -85, 36, 138, + -85, -85, -85, 31, -85, -85, 28, -85, -85, -85, + 97, 105, -85, -85, -85, 98, -85, -85, -85, -85, + -85, -85, -85}; const short GLSLParserTable::action_info [] = { - -25, 332, 446, 246, 339, 306, 450, 319, 428, 251, - 429, 317, 331, 376, 144, 377, 461, 437, 443, 266, - 378, 316, 421, 385, 314, 170, 407, 445, 431, 304, - 381, 251, 244, -24, 334, 199, 191, 217, 380, -19, - 246, 384, -24, 412, 397, 139, 399, 403, 139, 404, - 459, 244, 171, 373, 243, 171, 174, 331, 462, 239, - 342, 175, 191, 139, 460, 217, 139, 269, 264, -25, - 191, 194, 139, 139, 227, 139, 375, 139, 455, 181, - 139, 453, 139, 438, 142, 227, 227, 2, 1, 207, - 254, 139, 207, 227, 200, 219, 424, 200, 341, 435, - 179, 176, 139, 207, 227, 240, 219, 248, 143, 228, - 167, 307, 0, 249, 0, 439, 210, 321, 0, 322, - 228, 228, 0, 29, 320, 0, 0, 182, 228, 0, - 222, 0, 0, 0, 0, 456, 0, 0, 0, 228, - 222, 210, 0, 308, 210, 309, 220, 211, 180, 212, - 256, 0, 0, 48, 223, 0, 342, 220, 168, 321, - 224, 322, 222, 454, 223, 323, 61, 257, 0, 383, - 224, 409, 211, 208, 212, 211, 208, 212, 423, 0, - 0, 0, 320, 258, 0, 0, 223, 208, 433, 225, - 0, 0, 224, 0, -124, 235, 420, 177, 140, 225, - 270, 241, 271, -124, 0, 259, -124, 323, 0, 0, - 204, 0, 0, 201, 145, 436, 169, 321, 0, 322, - 0, 225, 272, 146, -124, 0, 147, 0, 0, 0, - 0, 0, 0, -124, -124, 0, -124, 0, 0, 0, - 0, -124, 273, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 148, 0, 0, 0, 0, 0, - 0, 149, 0, 0, -124, 323, 0, 0, 0, 301, - 0, -124, 274, 0, 0, 0, 0, -91, 0, 0, - 0, 0, 0, 0, 0, -124, 0, 0, 0, -124, - -124, 0, 275, 276, 0, 0, 0, 277, 0, 0, - 0, 0, -124, 0, 0, 152, 0, 278, 0, 153, - 154, 0, 0, 0, 0, -124, 0, 0, 0, -124, - -124, 0, 155, -124, 0, 0, 0, 0, 0, 0, - 0, 0, -124, 0, 0, 0, 0, 279, 0, 0, - 0, 0, 0, 156, 0, 0, 0, -124, 0, 0, - 0, 0, 157, -124, 0, 0, 145, 0, 0, 0, - 0, 0, -124, 0, 280, 146, 0, 158, 147, 0, - 0, 0, 0, 0, 0, 0, 0, -124, 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, 149, 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, 153, 154, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 155, 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, 157, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 158, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 5, 0, 6, 7, 8, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 11, 12, 13, 14, 15, 16, 17, 18, 19, - 20, 21, 22, 0, 0, 23, 24, 25, 26, 0, - 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, - 0, 0, 32, 0, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 49, 50, 51, - 52, 53, 54, 55, 56, 57, 58, 59, 60, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 64, 65, 66, 67, 68, 69, 70, 71, 72, - 73, 74, 75, 76, 77, 78, 79, 80, 81, 0, - 0, 0, 0, 82, 0, 0, 0, 0, 85, 86, - 0, 87, 88, 89, 90, 91, 92, 93, 94, 95, - 96, 97, 98, 99, 100, 0, 101, 102, 103, 0, - 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 5, 0, 6, 7, 8, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 11, 12, 13, - 14, 15, 16, 17, 18, 19, 20, 21, 22, 0, - 0, 23, 24, 25, 26, 0, 0, 0, 0, 28, - 0, 0, 29, 0, 0, 0, 0, 0, 32, 0, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, - 43, 44, 45, 46, 0, 0, 0, 0, 0, 0, - 0, 0, 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, 58, 59, 60, 61, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 64, 65, 66, - 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, - 77, 78, 79, 80, 81, 0, 0, 0, 0, 82, - 0, 0, 0, 0, 85, 86, 0, 87, 88, 89, - 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, - 100, 0, 101, 102, 103, 0, 104, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 5, 0, 6, 7, - 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 11, 12, 13, 14, 15, 16, 17, - 18, 19, 20, 21, 22, 0, 0, 23, 24, 25, - 26, 0, 0, 0, 0, 28, 0, 0, 29, 260, - 0, 0, 0, 0, 32, 0, 33, 34, 35, 36, - 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, - 0, 0, 0, 0, 0, 0, 0, 0, 48, 49, - 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, - 60, 61, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 64, 65, 66, 67, 68, 69, 70, - 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, - 81, 0, 0, 0, 0, 82, 0, 0, 0, 0, - 85, 86, 0, 87, 88, 89, 90, 91, 92, 93, - 94, 95, 96, 97, 98, 99, 100, 0, 101, 102, - 103, 0, 104, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 5, 0, 6, 7, 8, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, - 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, - 22, 0, 0, 23, 24, 25, 26, 0, 0, 0, - 0, 28, 0, 0, 29, 448, 0, 0, 0, 0, - 32, 0, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 0, 0, 0, 0, - 0, 0, 0, 0, 48, 49, 50, 51, 52, 53, - 54, 55, 56, 57, 58, 59, 60, 61, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, - 75, 76, 77, 78, 79, 80, 81, 449, 0, 0, - 0, 82, 0, 0, 0, 0, 85, 86, 0, 87, - 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, - 98, 99, 100, 0, 101, 102, 103, 0, 104, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 4, 5, - 0, 6, 7, 8, 0, 0, 0, 0, 0, 0, - 0, 9, 10, 0, 0, 0, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 0, 0, - 23, 24, 25, 26, 0, 0, 0, 0, 28, 0, - 0, 29, 30, 0, 0, 31, 0, 32, 0, 33, - 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, - 44, 45, 46, 0, 0, 0, 0, 0, 0, 47, - 0, 48, 49, 50, 51, 52, 53, 54, 55, 56, - 57, 58, 59, 60, 61, 0, 0, 0, 0, 62, - 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 64, 65, 66, 67, - 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, - 78, 79, 80, 81, 0, 0, 0, 0, 82, 0, - 0, 0, 83, 85, 86, 0, 87, 88, 89, 90, - 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, - 0, 101, 102, 103, 0, 104, 0, 0, 0, 84, - 27, 0, 0, 0, 0, 4, 5, 0, 6, 7, - 8, 0, 0, 0, 0, 0, 0, 0, 9, 10, - 0, 0, 0, 11, 12, 13, 14, 15, 16, 17, - 18, 19, 20, 21, 22, 0, 0, 23, 24, 25, - 26, 0, 0, 0, 0, 28, 0, 0, 29, 30, - 0, 0, 31, 0, 32, 0, 33, 34, 35, 36, - 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, - 0, 0, 0, 0, 0, 0, 47, 0, 48, 49, - 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, - 60, 61, 0, 0, 0, 0, 62, 0, 0, 0, - 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 64, 65, 66, 67, 68, 69, 70, - 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, - 81, 0, 0, 0, 0, 82, 0, 0, 0, 83, - 85, 86, 0, 87, 88, 89, 90, 91, 92, 93, - 94, 95, 96, 97, 98, 99, 100, 0, 101, 102, - 103, 0, 237, 0, 0, 0, 84, 27, 0, 0, - 0, 0, 4, 5, 0, 6, 7, 8, 0, 0, - 0, 0, 0, 0, 0, 9, 10, 0, 0, 0, - 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, - 21, 22, 0, 0, 23, 24, 25, 26, 0, 0, - 0, 0, 28, 0, 0, 29, 30, 0, 0, 31, - 0, 32, 0, 33, 34, 35, 36, 37, 38, 39, - 40, 41, 42, 43, 44, 45, 46, 0, 0, 0, - 0, 0, 0, 47, 0, 48, 49, 50, 51, 52, - 53, 54, 55, 56, 57, 58, 59, 60, 61, 0, - 0, 0, 0, 62, 0, 0, 0, 0, 0, 63, - 0, 0, 0, 0, 0, 0, 195, 0, 0, 0, - 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, - 74, 75, 76, 77, 78, 79, 80, 81, 0, 0, - 0, 0, 82, 0, 0, 0, 83, 85, 86, 0, - 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, - 97, 98, 99, 100, 0, 101, 102, 103, 0, 104, - 0, 0, 0, 84, 27, 0, 0, 0, 0, 4, - 5, 0, 6, 7, 8, 0, 0, 0, 0, 0, - 0, 0, 9, 10, 0, 0, 0, 11, 12, 13, - 14, 15, 16, 17, 18, 19, 20, 21, 22, 0, - 0, 23, 24, 25, 26, 0, 0, 0, 0, 28, - 0, 0, 29, 30, 0, 0, 31, 0, 32, 0, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, - 43, 44, 45, 46, 0, 0, 0, 0, 0, 0, - 47, 0, 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, 58, 59, 60, 61, 0, 0, 0, 0, - 62, 0, 0, 0, 0, 0, 63, 0, 0, 0, - 0, 0, 0, 457, 0, 0, 0, 64, 65, 66, - 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, - 77, 78, 79, 80, 81, 0, 0, 0, 0, 82, - 0, 0, 0, 83, 85, 86, 0, 87, 88, 89, - 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, - 100, 0, 101, 102, 103, 0, 104, 0, 0, 0, - 84, 27, 0, 0, 0, 0, 4, 5, 0, 6, - 7, 8, 0, 0, 0, 0, 0, 0, 0, 9, - 10, 0, 0, 0, 11, 12, 13, 14, 15, 16, - 17, 18, 19, 20, 21, 22, 0, 0, 23, 24, - 25, 26, 0, 0, 0, 0, 28, 0, 0, 29, - 30, 0, 0, 31, 0, 32, 0, 33, 34, 35, - 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, - 46, 0, 0, 0, 0, 0, 0, 47, 0, 48, - 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, - 59, 60, 61, 0, 0, 0, 0, 62, 0, 0, - 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, - 441, 0, 0, 0, 64, 65, 66, 67, 68, 69, - 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, - 80, 81, 0, 0, 0, 0, 82, 0, 0, 0, - 83, 85, 86, 0, 87, 88, 89, 90, 91, 92, - 93, 94, 95, 96, 97, 98, 99, 100, 0, 101, - 102, 103, 0, 104, 0, 0, 0, 84, 27, 0, - 0, 0, 0, 4, 5, 0, 6, 7, 8, 0, - 0, 0, 0, 0, 0, 0, 9, 10, 0, 0, - 0, 11, 12, 13, 14, 15, 16, 17, 18, 19, - 20, 21, 22, 0, 0, 23, 24, 25, 26, 0, - 0, 0, 0, 28, 0, 0, 29, 30, 0, 0, - 31, 0, 32, 0, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 0, 0, - 0, 0, 0, 0, 47, 0, 48, 49, 50, 51, - 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, - 0, 0, 0, 0, 62, 0, 0, 0, 0, 0, - 63, 0, 0, 0, 0, 0, 0, 312, 0, 0, - 0, 64, 65, 66, 67, 68, 69, 70, 71, 72, - 73, 74, 75, 76, 77, 78, 79, 80, 81, 0, - 0, 0, 0, 82, 0, 0, 0, 83, 85, 86, - 0, 87, 88, 89, 90, 91, 92, 93, 94, 95, - 96, 97, 98, 99, 100, 0, 101, 102, 103, 0, - 104, 0, 0, 0, 84, 27, 0, 0, 0, 0, - 4, 5, 0, 6, 7, 8, 0, 0, 0, 0, - 0, 0, 0, 9, 10, 0, 0, 0, 11, 12, - 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, - 0, 0, 23, 24, 25, 26, 0, 0, 0, 0, - 28, 0, 0, 29, 30, 0, 0, 31, 0, 32, - 0, 33, 34, 35, 36, 37, 38, 39, 40, 41, - 42, 43, 44, 45, 46, 0, 0, 0, 0, 0, - 0, 47, 0, 48, 49, 50, 51, 52, 53, 54, - 55, 56, 57, 58, 59, 60, 61, 0, 0, 0, - 0, 62, 0, 0, 0, 0, 0, 63, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, - 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, - 76, 77, 78, 79, 80, 81, 418, 0, 0, 0, - 82, 0, 0, 0, 83, 85, 86, 0, 87, 88, - 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, - 99, 100, 0, 101, 102, 103, 0, 104, 0, 0, - 0, 84, 27, 0, 0, 0, 0, 4, 5, 0, - 6, 7, 8, 0, 0, 0, 0, 0, 0, 0, - 9, 10, 0, 0, 0, 11, 12, 13, 14, 15, - 16, 17, 18, 19, 20, 21, 22, 0, 0, 23, - 24, 25, 26, 0, 0, 0, 0, 28, 0, 0, - 29, 30, 0, 0, 31, 0, 32, 0, 33, 34, - 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, - 45, 46, 0, 0, 0, 0, 0, 0, 47, 0, - 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, - 58, 59, 60, 61, 0, 0, 0, 0, 62, 0, - 0, 0, 0, 0, 63, 0, 0, 0, 0, 0, - 0, 267, 0, 0, 0, 64, 65, 66, 67, 68, - 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, - 79, 80, 81, 0, 0, 0, 0, 82, 0, 0, - 0, 83, 85, 86, 0, 87, 88, 89, 90, 91, - 92, 93, 94, 95, 96, 97, 98, 99, 100, 0, - 101, 102, 103, 0, 104, 0, 0, 0, 84, 27, - 0, 0, 0, 0, 145, 0, 5, 0, 6, 7, - 8, 0, 0, 146, 0, 0, 147, 0, 0, 0, - 0, 0, 0, 11, 12, 13, 14, 15, 16, 17, - 18, 19, 20, 21, 22, 0, 0, 23, 24, 25, - 26, 0, 0, 0, 148, 28, 0, 0, 29, 0, - 0, 149, 0, 0, 32, 150, 33, 34, 35, 36, - 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, - 151, 0, 0, 0, 0, 0, 0, 0, 48, 49, - 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, - 60, 61, 0, 0, 0, 152, 0, 0, 0, 153, - 154, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 155, 64, 65, 66, 67, 68, 69, 70, - 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, - 81, 0, 0, 156, 0, 82, 0, 0, 0, 0, - 85, 86, 157, 87, 88, 89, 90, 91, 92, 93, - 94, 95, 96, 97, 98, 99, 100, 158, 101, 102, - 103, 0, 104, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 145, 0, 5, 0, 6, 7, 8, 0, - 0, 146, 0, 0, 147, 0, 0, 0, 0, 0, - 0, 11, 12, 13, 14, 15, 16, 17, 18, 19, - 20, 21, 22, 0, 0, 23, 24, 25, 26, 0, - 0, 0, 148, 28, 0, 0, 29, 0, 0, 149, - 0, 0, 32, 150, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 151, 0, - 0, 0, 0, 0, 0, 0, 48, 49, 50, 51, - 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, - 0, 0, 0, 152, 0, 0, 0, 153, 154, 0, - 0, 0, 0, 0, 0, 0, 188, 0, 0, 0, - 155, 64, 65, 66, 67, 68, 69, 70, 71, 72, - 73, 74, 75, 76, 77, 78, 79, 80, 81, 0, - 0, 156, 0, 82, 0, 0, 0, 0, 85, 86, - 157, 87, 88, 89, 90, 91, 92, 93, 94, 95, - 96, 97, 98, 99, 100, 158, 101, 102, 103, 0, - 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 145, 0, 5, 0, 6, 7, 8, 0, 0, 146, - 0, 0, 147, 0, 0, 0, 0, 0, 0, 11, - 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, - 22, 0, 0, 23, 24, 25, 26, 0, 0, 0, - 148, 28, 0, 0, 29, 0, 0, 149, 0, 0, - 32, 150, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 151, 0, 0, 0, - 0, 0, 0, 0, 48, 49, 50, 51, 52, 53, - 54, 55, 56, 57, 58, 59, 60, 61, 0, 0, - 0, 152, 0, 0, 0, 153, 154, 0, 0, 0, - 0, 0, 0, 0, 452, 0, 0, 0, 155, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, - 75, 76, 77, 78, 79, 80, 81, 0, 0, 156, - 0, 82, 0, 0, 0, 0, 85, 86, 157, 87, - 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, - 98, 99, 100, 158, 101, 102, 103, 0, 104, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 145, 0, - 5, 0, 6, 7, 8, 0, 0, 146, 0, 0, - 147, 0, 0, 0, 0, 0, 0, 11, 12, 13, - 14, 15, 16, 17, 18, 19, 20, 21, 22, 0, - 0, 23, 24, 25, 26, 0, 0, 0, 148, 28, - 0, 0, 29, 0, 0, 149, 0, 0, 32, 150, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, - 43, 44, 45, 46, 151, 0, 0, 0, 0, 0, - 0, 0, 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, 58, 59, 60, 61, 0, 0, 0, 152, - 0, 0, 0, 153, 154, 0, 0, 0, 0, 0, - 0, 0, 206, 0, 0, 0, 155, 64, 65, 66, - 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, - 77, 78, 79, 80, 81, 0, 0, 156, 0, 82, - 0, 0, 0, 0, 85, 86, 157, 87, 88, 89, - 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, - 100, 158, 101, 102, 103, 0, 104, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 145, 0, 5, 0, - 6, 7, 8, 0, 0, 146, 0, 0, 147, 0, - 0, 0, 0, 0, 0, 11, 12, 13, 14, 15, - 16, 17, 18, 19, 20, 21, 22, 0, 0, 23, - 24, 25, 26, 0, 0, 0, 148, 28, 0, 0, - 29, 0, 0, 149, 0, 0, 32, 284, 33, 34, - 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, - 45, 46, 151, 0, 0, 0, 0, 0, 0, 0, - 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, - 58, 59, 60, 61, 0, 0, 0, 152, 0, 0, - 0, 153, 154, 0, 0, 285, 0, 0, 0, 0, - 0, 0, 0, 0, 155, 64, 65, 66, 67, 68, - 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, - 79, 80, 81, 286, 0, 156, 0, 82, 0, 0, - 0, 0, 85, 86, 157, 87, 88, 89, 90, 91, - 92, 93, 94, 95, 96, 97, 98, 99, 100, 158, - 101, 102, 103, 0, 104, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 145, 4, 5, 0, 6, 7, - 8, 0, 0, 146, 0, 0, 147, 0, 9, 10, - 0, 0, 0, 11, 12, 13, 14, 15, 16, 17, - 18, 19, 20, 21, 22, 0, 0, 23, 24, 25, - 26, 0, 0, 0, 148, 28, 0, 0, 29, 30, - 0, 149, 31, 0, 32, 150, 33, 34, 35, 36, - 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, - 151, 0, 0, 0, 0, 0, 47, 0, 48, 49, - 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, - 60, 61, 0, 0, 0, 152, 62, 0, 0, 153, - 154, 0, 63, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 155, 64, 65, 66, 67, 68, 69, 70, - 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, - 81, 0, 0, 156, 0, 82, 0, 0, 0, 83, - 85, 86, 157, 87, 88, 89, 90, 91, 92, 93, - 94, 95, 96, 97, 98, 99, 100, 158, 101, 102, - 103, 0, 104, 0, 0, 0, 84, 27, 0, 0, - 0, 0, 145, 4, 5, 0, 6, 7, 8, 0, - 0, 146, 0, 0, 147, 0, 9, 10, 0, 0, - 0, 11, 12, 13, 14, 15, 16, 17, 18, 19, - 20, 21, 22, 0, 0, 23, 24, 25, 26, 0, - 0, 0, 148, 28, 0, 0, 29, 30, 0, 149, - 31, 0, 32, 284, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 151, 0, - 0, 0, 0, 0, 47, 0, 48, 49, 50, 51, - 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, - 0, 0, 0, 152, 62, 0, 0, 153, 154, 0, - 63, 285, 0, 0, 0, 0, 0, 0, 0, 0, - 155, 64, 65, 66, 67, 68, 69, 70, 71, 72, - 73, 74, 75, 76, 77, 78, 79, 80, 81, 355, - 0, 156, 0, 82, 0, 0, 0, 83, 85, 86, - 157, 87, 88, 89, 90, 91, 92, 93, 94, 95, - 96, 97, 98, 99, 100, 158, 101, 102, 103, 0, - 104, 0, 0, 0, 84, 27, 0, 0, 0, 0, - 145, 4, 5, 344, 6, 7, 8, 0, 345, 146, - 0, 0, 147, 346, 9, 10, 347, 348, 0, 11, - 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, - 22, 349, 0, 23, 24, 25, 26, 0, 0, 0, - 148, 28, 350, 0, 29, 30, 351, 149, 31, 0, - 32, 284, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 151, 0, 0, 341, - 0, 0, 47, 0, 48, 49, 50, 51, 52, 53, - 54, 55, 56, 57, 58, 59, 60, 61, 0, 0, - 0, 152, 62, 0, 0, 153, 154, 0, 63, 285, - 0, 353, 0, 0, 0, 0, 0, 0, 155, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, - 75, 76, 77, 78, 79, 80, 81, 355, 0, 156, - 0, 82, 0, 0, 356, 83, 85, 86, 157, 87, - 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, - 98, 99, 100, 158, 101, 102, 103, 0, 104, 357, - 0, 0, 84, 27, 0, 0, 0, 0, 145, 4, - 5, 344, 6, 7, 8, 0, 345, 146, 0, 0, - 147, 346, 9, 10, 347, 348, 0, 11, 12, 13, - 14, 15, 16, 17, 18, 19, 20, 21, 22, 349, - 0, 23, 24, 25, 26, 0, 0, 0, 148, 28, - 350, 0, 29, 30, 351, 149, 31, 0, 32, 284, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, - 43, 44, 45, 46, 151, 0, 0, 352, 0, 0, - 47, 0, 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, 58, 59, 60, 61, 0, 0, 0, 152, - 62, 0, 0, 153, 154, 0, 63, 285, 0, 353, - 0, 0, 0, 0, 0, 0, 155, 64, 65, 66, - 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, - 77, 78, 79, 80, 81, 355, 0, 156, 0, 82, - 0, 0, 356, 83, 85, 86, 157, 87, 88, 89, - 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, - 100, 158, 101, 102, 103, 0, 104, 357, 0, 0, - 84, 27, 0, 0, 0, 0, 145, 4, 5, 344, - 6, 7, 8, 0, 345, 146, 0, 0, 147, 346, - 9, 10, 347, 348, 0, 11, 12, 13, 14, 15, - 16, 17, 18, 19, 20, 21, 22, 349, 0, 23, - 24, 25, 26, 0, 0, 0, 148, 28, 350, 0, - 29, 30, 351, 149, 31, 0, 32, 284, 33, 34, - 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, - 45, 46, 151, 0, 0, 352, 0, 0, 47, 0, - 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, - 58, 59, 60, 61, 0, 0, 0, 152, 62, 0, - 0, 153, 154, 0, 63, 285, 0, 353, 0, 0, - 434, 0, 0, 0, 155, 64, 65, 66, 67, 68, - 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, - 79, 80, 81, 355, 0, 156, 0, 82, 0, 0, - 356, 83, 85, 86, 157, 87, 88, 89, 90, 91, - 92, 93, 94, 95, 96, 97, 98, 99, 100, 158, - 101, 102, 103, 0, 104, 357, 0, 0, 84, 27, - 0, 0, 0, 0, 145, 4, 5, 344, 6, 7, - 8, 0, 345, 146, 0, 0, 147, 346, 9, 10, - 347, 348, 0, 11, 12, 13, 14, 15, 16, 17, - 18, 19, 20, 21, 22, 349, 0, 23, 24, 25, - 26, 0, 0, 0, 148, 28, 350, 0, 29, 30, - 351, 149, 31, 0, 32, 284, 33, 34, 35, 36, - 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, - 151, 0, 0, 352, 0, 0, 47, 0, 48, 49, - 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, - 60, 61, 0, 0, 0, 152, 62, 0, 0, 153, - 154, 0, 63, 285, 0, 353, 0, 0, 416, 0, - 0, 0, 155, 64, 65, 66, 67, 68, 69, 70, - 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, - 81, 355, 0, 156, 0, 82, 0, 0, 356, 83, - 85, 86, 157, 87, 88, 89, 90, 91, 92, 93, - 94, 95, 96, 97, 98, 99, 100, 158, 101, 102, - 103, 0, 104, 357, 0, 0, 84, 27, 0, 0, - 0, 0, 145, 4, 5, 344, 6, 7, 8, 0, - 345, 146, 0, 0, 147, 346, 9, 10, 347, 348, - 0, 11, 12, 13, 14, 15, 16, 17, 18, 19, - 20, 21, 22, 349, 0, 23, 24, 25, 26, 0, - 0, 0, 148, 28, 350, 0, 29, 30, 351, 149, - 31, 0, 32, 284, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 151, 0, - 0, 352, 0, 0, 47, 0, 48, 49, 50, 51, - 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, - 0, 0, 0, 152, 62, 0, 0, 153, 154, 0, - 63, 285, 0, 353, 0, 0, 354, 0, 0, 0, - 155, 64, 65, 66, 67, 68, 69, 70, 71, 72, - 73, 74, 75, 76, 77, 78, 79, 80, 81, 355, - 0, 156, 0, 82, 0, 0, 356, 83, 85, 86, - 157, 87, 88, 89, 90, 91, 92, 93, 94, 95, - 96, 97, 98, 99, 100, 158, 101, 102, 103, 0, - 104, 357, 0, 0, 84, 27, 0, 0, 0, 0, - 145, 4, 5, 344, 6, 7, 8, 0, 345, 146, - 0, 0, 147, 346, 9, 10, 347, 348, 0, 11, - 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, - 22, 349, 0, 23, 24, 25, 26, 0, 0, 0, - 148, 28, 350, 0, 29, 30, 351, 149, 31, 0, - 32, 284, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 151, 0, 0, 352, - 0, 0, 47, 0, 48, 49, 50, 51, 52, 53, - 54, 55, 56, 57, 58, 59, 60, 61, 0, 0, - 0, 152, 62, 0, 0, 153, 154, 0, 63, 285, - 0, 353, 0, 0, 414, 0, 0, 0, 155, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, - 75, 76, 77, 78, 79, 80, 81, 355, 0, 156, - 0, 82, 0, 0, 356, 83, 85, 86, 157, 87, - 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, - 98, 99, 100, 158, 101, 102, 103, 0, 104, 357, - 0, 0, 84, 27, 0, 0, 0, 0, + -25, 332, 446, 246, 339, 306, 450, 319, 428, 251, + 429, 317, 331, 376, 144, 377, 461, 437, 443, 266, + 378, 316, 421, 385, 314, 170, 407, 445, 431, 304, + 381, 251, 244, -24, 334, 199, 191, 217, 380, -19, + 246, 384, -24, 412, 397, 139, 399, 403, 139, 404, + 459, 244, 171, 373, 243, 171, 174, 331, 462, 239, + 342, 175, 191, 139, 460, 217, 139, 269, 264, -25, + 191, 194, 139, 139, 227, 139, 375, 139, 455, 181, + 139, 453, 139, 438, 142, 227, 227, 2, 1, 207, + 254, 139, 207, 227, 200, 219, 424, 200, 341, 435, + 179, 176, 139, 207, 227, 240, 219, 248, 143, 228, + 167, 307, 0, 249, 0, 439, 210, 321, 0, 322, + 228, 228, 0, 29, 320, 0, 0, 182, 228, 0, + 222, 0, 0, 0, 0, 456, 0, 0, 0, 228, + 222, 210, 0, 308, 210, 309, 220, 211, 180, 212, + 256, 0, 0, 48, 223, 0, 342, 220, 168, 321, + 224, 322, 222, 454, 223, 323, 61, 257, 0, 383, + 224, 409, 211, 208, 212, 211, 208, 212, 423, 0, + 0, 0, 320, 258, 0, 0, 223, 208, 433, 225, + 0, 0, 224, 0, -124, 235, 420, 177, 140, 225, + 270, 241, 271, -124, 0, 259, -124, 323, 0, 0, + 204, 0, 0, 201, 145, 436, 169, 321, 0, 322, + 0, 225, 272, 146, -124, 0, 147, 0, 0, 0, + 0, 0, 0, -124, -124, 0, -124, 0, 0, 0, + 0, -124, 273, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 148, 0, 0, 0, 0, 0, + 0, 149, 0, 0, -124, 323, 0, 0, 0, 301, + 0, -124, 274, 0, 0, 0, 0, -91, 0, 0, + 0, 0, 0, 0, 0, -124, 0, 0, 0, -124, + -124, 0, 275, 276, 0, 0, 0, 277, 0, 0, + 0, 0, -124, 0, 0, 152, 0, 278, 0, 153, + 154, 0, 0, 0, 0, -124, 0, 0, 0, -124, + -124, 0, 155, -124, 0, 0, 0, 0, 0, 0, + 0, 0, -124, 0, 0, 0, 0, 279, 0, 0, + 0, 0, 0, 156, 0, 0, 0, -124, 0, 0, + 0, 0, 157, -124, 0, 0, 145, 0, 0, 0, + 0, 0, -124, 0, 280, 146, 0, 158, 147, 0, + 0, 0, 0, 0, 0, 0, 0, -124, 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, 149, 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, 153, 154, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 155, 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, 157, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 158, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 5, 0, 6, 7, 8, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 11, 12, 13, 14, 15, 16, 17, 18, 19, + 20, 21, 22, 0, 0, 23, 24, 25, 26, 0, + 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, + 0, 0, 32, 0, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, 46, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 49, 50, 51, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 0, + 0, 0, 0, 82, 0, 0, 0, 0, 85, 86, + 0, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 0, 101, 102, 103, 0, + 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 0, 6, 7, 8, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 11, 12, 13, + 14, 15, 16, 17, 18, 19, 20, 21, 22, 0, + 0, 23, 24, 25, 26, 0, 0, 0, 0, 28, + 0, 0, 29, 0, 0, 0, 0, 0, 32, 0, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 0, 0, 0, 0, 0, 0, + 0, 0, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 0, 0, 0, 0, 82, + 0, 0, 0, 0, 85, 86, 0, 87, 88, 89, + 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, + 100, 0, 101, 102, 103, 0, 104, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 5, 0, 6, 7, + 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 11, 12, 13, 14, 15, 16, 17, + 18, 19, 20, 21, 22, 0, 0, 23, 24, 25, + 26, 0, 0, 0, 0, 28, 0, 0, 29, 260, + 0, 0, 0, 0, 32, 0, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, + 0, 0, 0, 0, 0, 0, 0, 0, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, + 60, 61, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 0, 0, 0, 0, 82, 0, 0, 0, 0, + 85, 86, 0, 87, 88, 89, 90, 91, 92, 93, + 94, 95, 96, 97, 98, 99, 100, 0, 101, 102, + 103, 0, 104, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 5, 0, 6, 7, 8, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, + 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 0, 0, 23, 24, 25, 26, 0, 0, 0, + 0, 28, 0, 0, 29, 448, 0, 0, 0, 0, + 32, 0, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 0, 0, 0, 0, + 0, 0, 0, 0, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 80, 81, 449, 0, 0, + 0, 82, 0, 0, 0, 0, 85, 86, 0, 87, + 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, + 98, 99, 100, 0, 101, 102, 103, 0, 104, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 4, 5, + 0, 6, 7, 8, 0, 0, 0, 0, 0, 0, + 0, 9, 10, 0, 0, 0, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, 0, 0, + 23, 24, 25, 26, 0, 0, 0, 0, 28, 0, + 0, 29, 30, 0, 0, 31, 0, 32, 0, 33, + 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 46, 0, 0, 0, 0, 0, 0, 47, + 0, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 57, 58, 59, 60, 61, 0, 0, 0, 0, 62, + 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, + 78, 79, 80, 81, 0, 0, 0, 0, 82, 0, + 0, 0, 83, 85, 86, 0, 87, 88, 89, 90, + 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 0, 101, 102, 103, 0, 104, 0, 0, 0, 84, + 27, 0, 0, 0, 0, 4, 5, 0, 6, 7, + 8, 0, 0, 0, 0, 0, 0, 0, 9, 10, + 0, 0, 0, 11, 12, 13, 14, 15, 16, 17, + 18, 19, 20, 21, 22, 0, 0, 23, 24, 25, + 26, 0, 0, 0, 0, 28, 0, 0, 29, 30, + 0, 0, 31, 0, 32, 0, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, + 0, 0, 0, 0, 0, 0, 47, 0, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, + 60, 61, 0, 0, 0, 0, 62, 0, 0, 0, + 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 0, 0, 0, 0, 82, 0, 0, 0, 83, + 85, 86, 0, 87, 88, 89, 90, 91, 92, 93, + 94, 95, 96, 97, 98, 99, 100, 0, 101, 102, + 103, 0, 237, 0, 0, 0, 84, 27, 0, 0, + 0, 0, 4, 5, 0, 6, 7, 8, 0, 0, + 0, 0, 0, 0, 0, 9, 10, 0, 0, 0, + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, + 21, 22, 0, 0, 23, 24, 25, 26, 0, 0, + 0, 0, 28, 0, 0, 29, 30, 0, 0, 31, + 0, 32, 0, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 44, 45, 46, 0, 0, 0, + 0, 0, 0, 47, 0, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, 58, 59, 60, 61, 0, + 0, 0, 0, 62, 0, 0, 0, 0, 0, 63, + 0, 0, 0, 0, 0, 0, 195, 0, 0, 0, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 78, 79, 80, 81, 0, 0, + 0, 0, 82, 0, 0, 0, 83, 85, 86, 0, + 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, + 97, 98, 99, 100, 0, 101, 102, 103, 0, 104, + 0, 0, 0, 84, 27, 0, 0, 0, 0, 4, + 5, 0, 6, 7, 8, 0, 0, 0, 0, 0, + 0, 0, 9, 10, 0, 0, 0, 11, 12, 13, + 14, 15, 16, 17, 18, 19, 20, 21, 22, 0, + 0, 23, 24, 25, 26, 0, 0, 0, 0, 28, + 0, 0, 29, 30, 0, 0, 31, 0, 32, 0, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 0, 0, 0, 0, 0, 0, + 47, 0, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 0, 0, 0, 0, + 62, 0, 0, 0, 0, 0, 63, 0, 0, 0, + 0, 0, 0, 457, 0, 0, 0, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 0, 0, 0, 0, 82, + 0, 0, 0, 83, 85, 86, 0, 87, 88, 89, + 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, + 100, 0, 101, 102, 103, 0, 104, 0, 0, 0, + 84, 27, 0, 0, 0, 0, 4, 5, 0, 6, + 7, 8, 0, 0, 0, 0, 0, 0, 0, 9, + 10, 0, 0, 0, 11, 12, 13, 14, 15, 16, + 17, 18, 19, 20, 21, 22, 0, 0, 23, 24, + 25, 26, 0, 0, 0, 0, 28, 0, 0, 29, + 30, 0, 0, 31, 0, 32, 0, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, + 46, 0, 0, 0, 0, 0, 0, 47, 0, 48, + 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 0, 0, 0, 0, 62, 0, 0, + 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, + 441, 0, 0, 0, 64, 65, 66, 67, 68, 69, + 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 0, 0, 0, 0, 82, 0, 0, 0, + 83, 85, 86, 0, 87, 88, 89, 90, 91, 92, + 93, 94, 95, 96, 97, 98, 99, 100, 0, 101, + 102, 103, 0, 104, 0, 0, 0, 84, 27, 0, + 0, 0, 0, 4, 5, 0, 6, 7, 8, 0, + 0, 0, 0, 0, 0, 0, 9, 10, 0, 0, + 0, 11, 12, 13, 14, 15, 16, 17, 18, 19, + 20, 21, 22, 0, 0, 23, 24, 25, 26, 0, + 0, 0, 0, 28, 0, 0, 29, 30, 0, 0, + 31, 0, 32, 0, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, 46, 0, 0, + 0, 0, 0, 0, 47, 0, 48, 49, 50, 51, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 0, 0, 0, 0, 62, 0, 0, 0, 0, 0, + 63, 0, 0, 0, 0, 0, 0, 312, 0, 0, + 0, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 0, + 0, 0, 0, 82, 0, 0, 0, 83, 85, 86, + 0, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 0, 101, 102, 103, 0, + 104, 0, 0, 0, 84, 27, 0, 0, 0, 0, + 4, 5, 0, 6, 7, 8, 0, 0, 0, 0, + 0, 0, 0, 9, 10, 0, 0, 0, 11, 12, + 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, + 0, 0, 23, 24, 25, 26, 0, 0, 0, 0, + 28, 0, 0, 29, 30, 0, 0, 31, 0, 32, + 0, 33, 34, 35, 36, 37, 38, 39, 40, 41, + 42, 43, 44, 45, 46, 0, 0, 0, 0, 0, + 0, 47, 0, 48, 49, 50, 51, 52, 53, 54, + 55, 56, 57, 58, 59, 60, 61, 0, 0, 0, + 0, 62, 0, 0, 0, 0, 0, 63, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 79, 80, 81, 418, 0, 0, 0, + 82, 0, 0, 0, 83, 85, 86, 0, 87, 88, + 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, + 99, 100, 0, 101, 102, 103, 0, 104, 0, 0, + 0, 84, 27, 0, 0, 0, 0, 4, 5, 0, + 6, 7, 8, 0, 0, 0, 0, 0, 0, 0, + 9, 10, 0, 0, 0, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 0, 0, 23, + 24, 25, 26, 0, 0, 0, 0, 28, 0, 0, + 29, 30, 0, 0, 31, 0, 32, 0, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 0, 0, 0, 0, 0, 0, 47, 0, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, 0, 0, 0, 0, 62, 0, + 0, 0, 0, 0, 63, 0, 0, 0, 0, 0, + 0, 267, 0, 0, 0, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, + 79, 80, 81, 0, 0, 0, 0, 82, 0, 0, + 0, 83, 85, 86, 0, 87, 88, 89, 90, 91, + 92, 93, 94, 95, 96, 97, 98, 99, 100, 0, + 101, 102, 103, 0, 104, 0, 0, 0, 84, 27, + 0, 0, 0, 0, 145, 0, 5, 0, 6, 7, + 8, 0, 0, 146, 0, 0, 147, 0, 0, 0, + 0, 0, 0, 11, 12, 13, 14, 15, 16, 17, + 18, 19, 20, 21, 22, 0, 0, 23, 24, 25, + 26, 0, 0, 0, 148, 28, 0, 0, 29, 0, + 0, 149, 0, 0, 32, 150, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, + 151, 0, 0, 0, 0, 0, 0, 0, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, + 60, 61, 0, 0, 0, 152, 0, 0, 0, 153, + 154, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 155, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 0, 0, 156, 0, 82, 0, 0, 0, 0, + 85, 86, 157, 87, 88, 89, 90, 91, 92, 93, + 94, 95, 96, 97, 98, 99, 100, 158, 101, 102, + 103, 0, 104, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 145, 0, 5, 0, 6, 7, 8, 0, + 0, 146, 0, 0, 147, 0, 0, 0, 0, 0, + 0, 11, 12, 13, 14, 15, 16, 17, 18, 19, + 20, 21, 22, 0, 0, 23, 24, 25, 26, 0, + 0, 0, 148, 28, 0, 0, 29, 0, 0, 149, + 0, 0, 32, 150, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, 46, 151, 0, + 0, 0, 0, 0, 0, 0, 48, 49, 50, 51, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 0, 0, 0, 152, 0, 0, 0, 153, 154, 0, + 0, 0, 0, 0, 0, 0, 188, 0, 0, 0, + 155, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 0, + 0, 156, 0, 82, 0, 0, 0, 0, 85, 86, + 157, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 158, 101, 102, 103, 0, + 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 145, 0, 5, 0, 6, 7, 8, 0, 0, 146, + 0, 0, 147, 0, 0, 0, 0, 0, 0, 11, + 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 0, 0, 23, 24, 25, 26, 0, 0, 0, + 148, 28, 0, 0, 29, 0, 0, 149, 0, 0, + 32, 150, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 151, 0, 0, 0, + 0, 0, 0, 0, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 0, 0, + 0, 152, 0, 0, 0, 153, 154, 0, 0, 0, + 0, 0, 0, 0, 452, 0, 0, 0, 155, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 80, 81, 0, 0, 156, + 0, 82, 0, 0, 0, 0, 85, 86, 157, 87, + 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, + 98, 99, 100, 158, 101, 102, 103, 0, 104, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 145, 0, + 5, 0, 6, 7, 8, 0, 0, 146, 0, 0, + 147, 0, 0, 0, 0, 0, 0, 11, 12, 13, + 14, 15, 16, 17, 18, 19, 20, 21, 22, 0, + 0, 23, 24, 25, 26, 0, 0, 0, 148, 28, + 0, 0, 29, 0, 0, 149, 0, 0, 32, 150, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 151, 0, 0, 0, 0, 0, + 0, 0, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 0, 0, 0, 152, + 0, 0, 0, 153, 154, 0, 0, 0, 0, 0, + 0, 0, 206, 0, 0, 0, 155, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 0, 0, 156, 0, 82, + 0, 0, 0, 0, 85, 86, 157, 87, 88, 89, + 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, + 100, 158, 101, 102, 103, 0, 104, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 145, 0, 5, 0, + 6, 7, 8, 0, 0, 146, 0, 0, 147, 0, + 0, 0, 0, 0, 0, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 0, 0, 23, + 24, 25, 26, 0, 0, 0, 148, 28, 0, 0, + 29, 0, 0, 149, 0, 0, 32, 284, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 151, 0, 0, 0, 0, 0, 0, 0, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, 0, 0, 0, 152, 0, 0, + 0, 153, 154, 0, 0, 285, 0, 0, 0, 0, + 0, 0, 0, 0, 155, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, + 79, 80, 81, 286, 0, 156, 0, 82, 0, 0, + 0, 0, 85, 86, 157, 87, 88, 89, 90, 91, + 92, 93, 94, 95, 96, 97, 98, 99, 100, 158, + 101, 102, 103, 0, 104, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 145, 4, 5, 0, 6, 7, + 8, 0, 0, 146, 0, 0, 147, 0, 9, 10, + 0, 0, 0, 11, 12, 13, 14, 15, 16, 17, + 18, 19, 20, 21, 22, 0, 0, 23, 24, 25, + 26, 0, 0, 0, 148, 28, 0, 0, 29, 30, + 0, 149, 31, 0, 32, 150, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, + 151, 0, 0, 0, 0, 0, 47, 0, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, + 60, 61, 0, 0, 0, 152, 62, 0, 0, 153, + 154, 0, 63, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 155, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 0, 0, 156, 0, 82, 0, 0, 0, 83, + 85, 86, 157, 87, 88, 89, 90, 91, 92, 93, + 94, 95, 96, 97, 98, 99, 100, 158, 101, 102, + 103, 0, 104, 0, 0, 0, 84, 27, 0, 0, + 0, 0, 145, 4, 5, 0, 6, 7, 8, 0, + 0, 146, 0, 0, 147, 0, 9, 10, 0, 0, + 0, 11, 12, 13, 14, 15, 16, 17, 18, 19, + 20, 21, 22, 0, 0, 23, 24, 25, 26, 0, + 0, 0, 148, 28, 0, 0, 29, 30, 0, 149, + 31, 0, 32, 284, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, 46, 151, 0, + 0, 0, 0, 0, 47, 0, 48, 49, 50, 51, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 0, 0, 0, 152, 62, 0, 0, 153, 154, 0, + 63, 285, 0, 0, 0, 0, 0, 0, 0, 0, + 155, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 355, + 0, 156, 0, 82, 0, 0, 0, 83, 85, 86, + 157, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 158, 101, 102, 103, 0, + 104, 0, 0, 0, 84, 27, 0, 0, 0, 0, + 145, 4, 5, 344, 6, 7, 8, 0, 345, 146, + 0, 0, 147, 346, 9, 10, 347, 348, 0, 11, + 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 349, 0, 23, 24, 25, 26, 0, 0, 0, + 148, 28, 350, 0, 29, 30, 351, 149, 31, 0, + 32, 284, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 151, 0, 0, 341, + 0, 0, 47, 0, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 0, 0, + 0, 152, 62, 0, 0, 153, 154, 0, 63, 285, + 0, 353, 0, 0, 0, 0, 0, 0, 155, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 80, 81, 355, 0, 156, + 0, 82, 0, 0, 356, 83, 85, 86, 157, 87, + 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, + 98, 99, 100, 158, 101, 102, 103, 0, 104, 357, + 0, 0, 84, 27, 0, 0, 0, 0, 145, 4, + 5, 344, 6, 7, 8, 0, 345, 146, 0, 0, + 147, 346, 9, 10, 347, 348, 0, 11, 12, 13, + 14, 15, 16, 17, 18, 19, 20, 21, 22, 349, + 0, 23, 24, 25, 26, 0, 0, 0, 148, 28, + 350, 0, 29, 30, 351, 149, 31, 0, 32, 284, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 151, 0, 0, 352, 0, 0, + 47, 0, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 0, 0, 0, 152, + 62, 0, 0, 153, 154, 0, 63, 285, 0, 353, + 0, 0, 0, 0, 0, 0, 155, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 355, 0, 156, 0, 82, + 0, 0, 356, 83, 85, 86, 157, 87, 88, 89, + 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, + 100, 158, 101, 102, 103, 0, 104, 357, 0, 0, + 84, 27, 0, 0, 0, 0, 145, 4, 5, 344, + 6, 7, 8, 0, 345, 146, 0, 0, 147, 346, + 9, 10, 347, 348, 0, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 349, 0, 23, + 24, 25, 26, 0, 0, 0, 148, 28, 350, 0, + 29, 30, 351, 149, 31, 0, 32, 284, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 151, 0, 0, 352, 0, 0, 47, 0, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, 0, 0, 0, 152, 62, 0, + 0, 153, 154, 0, 63, 285, 0, 353, 0, 0, + 434, 0, 0, 0, 155, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, + 79, 80, 81, 355, 0, 156, 0, 82, 0, 0, + 356, 83, 85, 86, 157, 87, 88, 89, 90, 91, + 92, 93, 94, 95, 96, 97, 98, 99, 100, 158, + 101, 102, 103, 0, 104, 357, 0, 0, 84, 27, + 0, 0, 0, 0, 145, 4, 5, 344, 6, 7, + 8, 0, 345, 146, 0, 0, 147, 346, 9, 10, + 347, 348, 0, 11, 12, 13, 14, 15, 16, 17, + 18, 19, 20, 21, 22, 349, 0, 23, 24, 25, + 26, 0, 0, 0, 148, 28, 350, 0, 29, 30, + 351, 149, 31, 0, 32, 284, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, + 151, 0, 0, 352, 0, 0, 47, 0, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, + 60, 61, 0, 0, 0, 152, 62, 0, 0, 153, + 154, 0, 63, 285, 0, 353, 0, 0, 416, 0, + 0, 0, 155, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 355, 0, 156, 0, 82, 0, 0, 356, 83, + 85, 86, 157, 87, 88, 89, 90, 91, 92, 93, + 94, 95, 96, 97, 98, 99, 100, 158, 101, 102, + 103, 0, 104, 357, 0, 0, 84, 27, 0, 0, + 0, 0, 145, 4, 5, 344, 6, 7, 8, 0, + 345, 146, 0, 0, 147, 346, 9, 10, 347, 348, + 0, 11, 12, 13, 14, 15, 16, 17, 18, 19, + 20, 21, 22, 349, 0, 23, 24, 25, 26, 0, + 0, 0, 148, 28, 350, 0, 29, 30, 351, 149, + 31, 0, 32, 284, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, 46, 151, 0, + 0, 352, 0, 0, 47, 0, 48, 49, 50, 51, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 0, 0, 0, 152, 62, 0, 0, 153, 154, 0, + 63, 285, 0, 353, 0, 0, 354, 0, 0, 0, + 155, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 355, + 0, 156, 0, 82, 0, 0, 356, 83, 85, 86, + 157, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 158, 101, 102, 103, 0, + 104, 357, 0, 0, 84, 27, 0, 0, 0, 0, + 145, 4, 5, 344, 6, 7, 8, 0, 345, 146, + 0, 0, 147, 346, 9, 10, 347, 348, 0, 11, + 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 349, 0, 23, 24, 25, 26, 0, 0, 0, + 148, 28, 350, 0, 29, 30, 351, 149, 31, 0, + 32, 284, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 151, 0, 0, 352, + 0, 0, 47, 0, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 0, 0, + 0, 152, 62, 0, 0, 153, 154, 0, 63, 285, + 0, 353, 0, 0, 414, 0, 0, 0, 155, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 80, 81, 355, 0, 156, + 0, 82, 0, 0, 356, 83, 85, 86, 157, 87, + 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, + 98, 99, 100, 158, 101, 102, 103, 0, 104, 357, + 0, 0, 84, 27, 0, 0, 0, 0, - 242, 406, 398, 422, 408, 178, 137, 190, 186, 215, - 214, 213, 136, 193, 111, 202, 183, 141, 282, 374, - 419, 372, 340, 302, 283, 262, 261, 335, 330, 382, - 253, 310, 238, 303, 187, 343, 255, 406, 265, 372, - 310, 0, 0, 310, 198, 198, 209, 216, 310, 310, - 198, 310, 0, 198, 0, 198, 198, 198, 198, 218, - 221, 234, 226, 196, 198, 245, 198, 198, 372, 310, - 166, 0, 184, 138, 252, 247, 185, 447, 250, 372, - 444, 198, 198, 372, 230, 440, 318, 417, 315, 236, - 372, 372, 165, 198, 198, 198, 198, 231, 229, 198, - 233, 372, 372, 232, 300, 389, 405, 196, 338, 313, - 166, 166, 0, 198, 372, 0, 0, 0, 401, 166, - 0, 287, 295, 166, 166, 0, 196, 417, 458, 198, - 0, 411, 165, 165, 451, 425, 198, 336, 417, 379, - 337, 165, 196, 300, 268, 165, 165, 164, 0, 196, - 0, 333, 386, 198, 189, 372, 387, 0, 415, 426, - 287, 295, 393, 189, 401, 0, 196, 189, 442, 0, - 0, 0, 432, 389, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 396, 0, 0, 0, 0, - 0, 395, 0, 413, 0, 0, 392, 0, 0, 0, - 0, 305, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 393, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 389, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 396, - 0, 0, 0, 0, 0, 395, 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, 430, 0, - 0, 0, 0, 0, 0, 0, 0, 0 -}; + 242, 406, 398, 422, 408, 178, 137, 190, 186, 215, + 214, 213, 136, 193, 111, 202, 183, 141, 282, 374, + 419, 372, 340, 302, 283, 262, 261, 335, 330, 382, + 253, 310, 238, 303, 187, 343, 255, 406, 265, 372, + 310, 0, 0, 310, 198, 198, 209, 216, 310, 310, + 198, 310, 0, 198, 0, 198, 198, 198, 198, 218, + 221, 234, 226, 196, 198, 245, 198, 198, 372, 310, + 166, 0, 184, 138, 252, 247, 185, 447, 250, 372, + 444, 198, 198, 372, 230, 440, 318, 417, 315, 236, + 372, 372, 165, 198, 198, 198, 198, 231, 229, 198, + 233, 372, 372, 232, 300, 389, 405, 196, 338, 313, + 166, 166, 0, 198, 372, 0, 0, 0, 401, 166, + 0, 287, 295, 166, 166, 0, 196, 417, 458, 198, + 0, 411, 165, 165, 451, 425, 198, 336, 417, 379, + 337, 165, 196, 300, 268, 165, 165, 164, 0, 196, + 0, 333, 386, 198, 189, 372, 387, 0, 415, 426, + 287, 295, 393, 189, 401, 0, 196, 189, 442, 0, + 0, 0, 432, 389, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 396, 0, 0, 0, 0, + 0, 395, 0, 413, 0, 0, 392, 0, 0, 0, + 0, 305, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 393, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 389, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 396, + 0, 0, 0, 0, 0, 395, 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, 430, 0, + 0, 0, 0, 0, 0, 0, 0, 0}; const short GLSLParserTable::action_check [] = { - 79, 77, 45, 6, 18, 52, 76, 114, 111, 168, - 79, 45, 52, 134, 76, 17, 134, 52, 45, 77, - 134, 112, 79, 79, 45, 79, 79, 112, 114, 134, - 79, 168, 164, 79, 112, 112, 52, 4, 166, 114, - 6, 134, 79, 44, 134, 18, 114, 52, 18, 45, - 134, 164, 52, 134, 79, 52, 45, 52, 0, 114, - 134, 99, 52, 18, 112, 4, 18, 112, 112, 79, - 52, 77, 18, 18, 78, 18, 17, 18, 77, 54, - 18, 52, 18, 45, 52, 78, 78, 1, 2, 21, - 17, 18, 21, 78, 18, 46, 76, 18, 76, 18, - 54, 18, 18, 21, 78, 18, 46, 101, 76, 113, - 54, 45, -1, 107, -1, 77, 104, 54, -1, 56, - 113, 113, -1, 51, 19, -1, -1, 102, 113, -1, - 50, -1, -1, -1, -1, 134, -1, -1, -1, 113, - 50, 104, -1, 77, 104, 79, 97, 135, 102, 137, - 22, -1, -1, 81, 74, -1, 134, 97, 102, 54, - 80, 56, 50, 134, 74, 102, 94, 39, -1, 114, - 80, 114, 135, 105, 137, 135, 105, 137, 114, -1, - -1, -1, 19, 55, -1, -1, 74, 105, 134, 109, - -1, -1, 80, -1, 7, 14, 134, 114, 114, 109, - 3, 114, 5, 16, -1, 77, 19, 102, -1, -1, - 134, -1, -1, 134, 7, 134, 160, 54, -1, 56, - -1, 109, 25, 16, 7, -1, 19, -1, -1, -1, - -1, -1, -1, 16, 47, -1, 19, -1, -1, -1, - -1, 54, 45, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 47, -1, -1, -1, -1, -1, - -1, 54, -1, -1, 47, 102, -1, -1, -1, 52, - -1, 54, 75, -1, -1, -1, -1, 114, -1, -1, - -1, -1, -1, -1, -1, 98, -1, -1, -1, 102, - 103, -1, 95, 96, -1, -1, -1, 100, -1, -1, - -1, -1, 115, -1, -1, 98, -1, 110, -1, 102, - 103, -1, -1, -1, -1, 98, -1, -1, -1, 102, - 103, -1, 115, 136, -1, -1, -1, -1, -1, -1, - -1, -1, 115, -1, -1, -1, -1, 140, -1, -1, - -1, -1, -1, 136, -1, -1, -1, 160, -1, -1, - -1, -1, 145, 136, -1, -1, 7, -1, -1, -1, - -1, -1, 145, -1, 167, 16, -1, 160, 19, -1, - -1, -1, -1, -1, -1, -1, -1, 160, -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, 54, -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, 102, 103, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 115, -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, 145, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 160, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 9, -1, 11, 12, 13, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 37, -1, -1, 40, 41, 42, 43, -1, - -1, -1, -1, 48, -1, -1, -1, -1, -1, -1, - -1, -1, 57, -1, 59, 60, 61, 62, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 82, 83, 84, - 85, 86, 87, 88, 89, 90, 91, 92, 93, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 116, 117, 118, 119, 120, 121, 122, 123, 124, - 125, 126, 127, 128, 129, 130, 131, 132, 133, -1, - -1, -1, -1, 138, -1, -1, -1, -1, 143, 144, - -1, 146, 147, 148, 149, 150, 151, 152, 153, 154, - 155, 156, 157, 158, 159, -1, 161, 162, 163, -1, - 165, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 9, -1, 11, 12, 13, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 26, 27, 28, - 29, 30, 31, 32, 33, 34, 35, 36, 37, -1, - -1, 40, 41, 42, 43, -1, -1, -1, -1, 48, - -1, -1, 51, -1, -1, -1, -1, -1, 57, -1, - 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, - 69, 70, 71, 72, -1, -1, -1, -1, -1, -1, - -1, -1, 81, 82, 83, 84, 85, 86, 87, 88, - 89, 90, 91, 92, 93, 94, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 116, 117, 118, - 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, - 129, 130, 131, 132, 133, -1, -1, -1, -1, 138, - -1, -1, -1, -1, 143, 144, -1, 146, 147, 148, - 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, - 159, -1, 161, 162, 163, -1, 165, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 9, -1, 11, 12, - 13, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, -1, -1, 40, 41, 42, - 43, -1, -1, -1, -1, 48, -1, -1, 51, 52, - -1, -1, -1, -1, 57, -1, 59, 60, 61, 62, - 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, - -1, -1, -1, -1, -1, -1, -1, -1, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, - 93, 94, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 116, 117, 118, 119, 120, 121, 122, - 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, - 133, -1, -1, -1, -1, 138, -1, -1, -1, -1, - 143, 144, -1, 146, 147, 148, 149, 150, 151, 152, - 153, 154, 155, 156, 157, 158, 159, -1, 161, 162, - 163, -1, 165, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 9, -1, 11, 12, 13, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 26, - 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, - 37, -1, -1, 40, 41, 42, 43, -1, -1, -1, - -1, 48, -1, -1, 51, 52, -1, -1, -1, -1, - 57, -1, 59, 60, 61, 62, 63, 64, 65, 66, - 67, 68, 69, 70, 71, 72, -1, -1, -1, -1, - -1, -1, -1, -1, 81, 82, 83, 84, 85, 86, - 87, 88, 89, 90, 91, 92, 93, 94, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 116, - 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, - 127, 128, 129, 130, 131, 132, 133, 134, -1, -1, - -1, 138, -1, -1, -1, -1, 143, 144, -1, 146, - 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, 159, -1, 161, 162, 163, -1, 165, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 8, 9, - -1, 11, 12, 13, -1, -1, -1, -1, -1, -1, - -1, 21, 22, -1, -1, -1, 26, 27, 28, 29, - 30, 31, 32, 33, 34, 35, 36, 37, -1, -1, - 40, 41, 42, 43, -1, -1, -1, -1, 48, -1, - -1, 51, 52, -1, -1, 55, -1, 57, -1, 59, - 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, - 70, 71, 72, -1, -1, -1, -1, -1, -1, 79, - -1, 81, 82, 83, 84, 85, 86, 87, 88, 89, - 90, 91, 92, 93, 94, -1, -1, -1, -1, 99, - -1, -1, -1, -1, -1, 105, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 116, 117, 118, 119, - 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, - 130, 131, 132, 133, -1, -1, -1, -1, 138, -1, - -1, -1, 142, 143, 144, -1, 146, 147, 148, 149, - 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, - -1, 161, 162, 163, -1, 165, -1, -1, -1, 169, - 170, -1, -1, -1, -1, 8, 9, -1, 11, 12, - 13, -1, -1, -1, -1, -1, -1, -1, 21, 22, - -1, -1, -1, 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, -1, -1, 40, 41, 42, - 43, -1, -1, -1, -1, 48, -1, -1, 51, 52, - -1, -1, 55, -1, 57, -1, 59, 60, 61, 62, - 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, - -1, -1, -1, -1, -1, -1, 79, -1, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, - 93, 94, -1, -1, -1, -1, 99, -1, -1, -1, - -1, -1, 105, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 116, 117, 118, 119, 120, 121, 122, - 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, - 133, -1, -1, -1, -1, 138, -1, -1, -1, 142, - 143, 144, -1, 146, 147, 148, 149, 150, 151, 152, - 153, 154, 155, 156, 157, 158, 159, -1, 161, 162, - 163, -1, 165, -1, -1, -1, 169, 170, -1, -1, - -1, -1, 8, 9, -1, 11, 12, 13, -1, -1, - -1, -1, -1, -1, -1, 21, 22, -1, -1, -1, - 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, - 36, 37, -1, -1, 40, 41, 42, 43, -1, -1, - -1, -1, 48, -1, -1, 51, 52, -1, -1, 55, - -1, 57, -1, 59, 60, 61, 62, 63, 64, 65, - 66, 67, 68, 69, 70, 71, 72, -1, -1, -1, - -1, -1, -1, 79, -1, 81, 82, 83, 84, 85, - 86, 87, 88, 89, 90, 91, 92, 93, 94, -1, - -1, -1, -1, 99, -1, -1, -1, -1, -1, 105, - -1, -1, -1, -1, -1, -1, 112, -1, -1, -1, - 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, - 126, 127, 128, 129, 130, 131, 132, 133, -1, -1, - -1, -1, 138, -1, -1, -1, 142, 143, 144, -1, - 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, - 156, 157, 158, 159, -1, 161, 162, 163, -1, 165, - -1, -1, -1, 169, 170, -1, -1, -1, -1, 8, - 9, -1, 11, 12, 13, -1, -1, -1, -1, -1, - -1, -1, 21, 22, -1, -1, -1, 26, 27, 28, - 29, 30, 31, 32, 33, 34, 35, 36, 37, -1, - -1, 40, 41, 42, 43, -1, -1, -1, -1, 48, - -1, -1, 51, 52, -1, -1, 55, -1, 57, -1, - 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, - 69, 70, 71, 72, -1, -1, -1, -1, -1, -1, - 79, -1, 81, 82, 83, 84, 85, 86, 87, 88, - 89, 90, 91, 92, 93, 94, -1, -1, -1, -1, - 99, -1, -1, -1, -1, -1, 105, -1, -1, -1, - -1, -1, -1, 112, -1, -1, -1, 116, 117, 118, - 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, - 129, 130, 131, 132, 133, -1, -1, -1, -1, 138, - -1, -1, -1, 142, 143, 144, -1, 146, 147, 148, - 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, - 159, -1, 161, 162, 163, -1, 165, -1, -1, -1, - 169, 170, -1, -1, -1, -1, 8, 9, -1, 11, - 12, 13, -1, -1, -1, -1, -1, -1, -1, 21, - 22, -1, -1, -1, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, -1, -1, 40, 41, - 42, 43, -1, -1, -1, -1, 48, -1, -1, 51, - 52, -1, -1, 55, -1, 57, -1, 59, 60, 61, - 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, - 72, -1, -1, -1, -1, -1, -1, 79, -1, 81, - 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, - 92, 93, 94, -1, -1, -1, -1, 99, -1, -1, - -1, -1, -1, 105, -1, -1, -1, -1, -1, -1, - 112, -1, -1, -1, 116, 117, 118, 119, 120, 121, - 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, - 132, 133, -1, -1, -1, -1, 138, -1, -1, -1, - 142, 143, 144, -1, 146, 147, 148, 149, 150, 151, - 152, 153, 154, 155, 156, 157, 158, 159, -1, 161, - 162, 163, -1, 165, -1, -1, -1, 169, 170, -1, - -1, -1, -1, 8, 9, -1, 11, 12, 13, -1, - -1, -1, -1, -1, -1, -1, 21, 22, -1, -1, - -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 37, -1, -1, 40, 41, 42, 43, -1, - -1, -1, -1, 48, -1, -1, 51, 52, -1, -1, - 55, -1, 57, -1, 59, 60, 61, 62, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, -1, -1, - -1, -1, -1, -1, 79, -1, 81, 82, 83, 84, - 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - -1, -1, -1, -1, 99, -1, -1, -1, -1, -1, - 105, -1, -1, -1, -1, -1, -1, 112, -1, -1, - -1, 116, 117, 118, 119, 120, 121, 122, 123, 124, - 125, 126, 127, 128, 129, 130, 131, 132, 133, -1, - -1, -1, -1, 138, -1, -1, -1, 142, 143, 144, - -1, 146, 147, 148, 149, 150, 151, 152, 153, 154, - 155, 156, 157, 158, 159, -1, 161, 162, 163, -1, - 165, -1, -1, -1, 169, 170, -1, -1, -1, -1, - 8, 9, -1, 11, 12, 13, -1, -1, -1, -1, - -1, -1, -1, 21, 22, -1, -1, -1, 26, 27, - 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, - -1, -1, 40, 41, 42, 43, -1, -1, -1, -1, - 48, -1, -1, 51, 52, -1, -1, 55, -1, 57, - -1, 59, 60, 61, 62, 63, 64, 65, 66, 67, - 68, 69, 70, 71, 72, -1, -1, -1, -1, -1, - -1, 79, -1, 81, 82, 83, 84, 85, 86, 87, - 88, 89, 90, 91, 92, 93, 94, -1, -1, -1, - -1, 99, -1, -1, -1, -1, -1, 105, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 116, 117, - 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, - 128, 129, 130, 131, 132, 133, 134, -1, -1, -1, - 138, -1, -1, -1, 142, 143, 144, -1, 146, 147, - 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, - 158, 159, -1, 161, 162, 163, -1, 165, -1, -1, - -1, 169, 170, -1, -1, -1, -1, 8, 9, -1, - 11, 12, 13, -1, -1, -1, -1, -1, -1, -1, - 21, 22, -1, -1, -1, 26, 27, 28, 29, 30, - 31, 32, 33, 34, 35, 36, 37, -1, -1, 40, - 41, 42, 43, -1, -1, -1, -1, 48, -1, -1, - 51, 52, -1, -1, 55, -1, 57, -1, 59, 60, - 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, - 71, 72, -1, -1, -1, -1, -1, -1, 79, -1, - 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, - 91, 92, 93, 94, -1, -1, -1, -1, 99, -1, - -1, -1, -1, -1, 105, -1, -1, -1, -1, -1, - -1, 112, -1, -1, -1, 116, 117, 118, 119, 120, - 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, - 131, 132, 133, -1, -1, -1, -1, 138, -1, -1, - -1, 142, 143, 144, -1, 146, 147, 148, 149, 150, - 151, 152, 153, 154, 155, 156, 157, 158, 159, -1, - 161, 162, 163, -1, 165, -1, -1, -1, 169, 170, - -1, -1, -1, -1, 7, -1, 9, -1, 11, 12, - 13, -1, -1, 16, -1, -1, 19, -1, -1, -1, - -1, -1, -1, 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, -1, -1, 40, 41, 42, - 43, -1, -1, -1, 47, 48, -1, -1, 51, -1, - -1, 54, -1, -1, 57, 58, 59, 60, 61, 62, - 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, - 73, -1, -1, -1, -1, -1, -1, -1, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, - 93, 94, -1, -1, -1, 98, -1, -1, -1, 102, - 103, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 115, 116, 117, 118, 119, 120, 121, 122, - 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, - 133, -1, -1, 136, -1, 138, -1, -1, -1, -1, - 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, - 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, - 163, -1, 165, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 7, -1, 9, -1, 11, 12, 13, -1, - -1, 16, -1, -1, 19, -1, -1, -1, -1, -1, - -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 37, -1, -1, 40, 41, 42, 43, -1, - -1, -1, 47, 48, -1, -1, 51, -1, -1, 54, - -1, -1, 57, 58, 59, 60, 61, 62, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, -1, - -1, -1, -1, -1, -1, -1, 81, 82, 83, 84, - 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - -1, -1, -1, 98, -1, -1, -1, 102, 103, -1, - -1, -1, -1, -1, -1, -1, 111, -1, -1, -1, - 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, - 125, 126, 127, 128, 129, 130, 131, 132, 133, -1, - -1, 136, -1, 138, -1, -1, -1, -1, 143, 144, - 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, - 155, 156, 157, 158, 159, 160, 161, 162, 163, -1, - 165, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 7, -1, 9, -1, 11, 12, 13, -1, -1, 16, - -1, -1, 19, -1, -1, -1, -1, -1, -1, 26, - 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, - 37, -1, -1, 40, 41, 42, 43, -1, -1, -1, - 47, 48, -1, -1, 51, -1, -1, 54, -1, -1, - 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, - 67, 68, 69, 70, 71, 72, 73, -1, -1, -1, - -1, -1, -1, -1, 81, 82, 83, 84, 85, 86, - 87, 88, 89, 90, 91, 92, 93, 94, -1, -1, - -1, 98, -1, -1, -1, 102, 103, -1, -1, -1, - -1, -1, -1, -1, 111, -1, -1, -1, 115, 116, - 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, - 127, 128, 129, 130, 131, 132, 133, -1, -1, 136, - -1, 138, -1, -1, -1, -1, 143, 144, 145, 146, - 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, 159, 160, 161, 162, 163, -1, 165, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 7, -1, - 9, -1, 11, 12, 13, -1, -1, 16, -1, -1, - 19, -1, -1, -1, -1, -1, -1, 26, 27, 28, - 29, 30, 31, 32, 33, 34, 35, 36, 37, -1, - -1, 40, 41, 42, 43, -1, -1, -1, 47, 48, - -1, -1, 51, -1, -1, 54, -1, -1, 57, 58, - 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, - 69, 70, 71, 72, 73, -1, -1, -1, -1, -1, - -1, -1, 81, 82, 83, 84, 85, 86, 87, 88, - 89, 90, 91, 92, 93, 94, -1, -1, -1, 98, - -1, -1, -1, 102, 103, -1, -1, -1, -1, -1, - -1, -1, 111, -1, -1, -1, 115, 116, 117, 118, - 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, - 129, 130, 131, 132, 133, -1, -1, 136, -1, 138, - -1, -1, -1, -1, 143, 144, 145, 146, 147, 148, - 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, - 159, 160, 161, 162, 163, -1, 165, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 7, -1, 9, -1, - 11, 12, 13, -1, -1, 16, -1, -1, 19, -1, - -1, -1, -1, -1, -1, 26, 27, 28, 29, 30, - 31, 32, 33, 34, 35, 36, 37, -1, -1, 40, - 41, 42, 43, -1, -1, -1, 47, 48, -1, -1, - 51, -1, -1, 54, -1, -1, 57, 58, 59, 60, - 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, - 71, 72, 73, -1, -1, -1, -1, -1, -1, -1, - 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, - 91, 92, 93, 94, -1, -1, -1, 98, -1, -1, - -1, 102, 103, -1, -1, 106, -1, -1, -1, -1, - -1, -1, -1, -1, 115, 116, 117, 118, 119, 120, - 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, - 131, 132, 133, 134, -1, 136, -1, 138, -1, -1, - -1, -1, 143, 144, 145, 146, 147, 148, 149, 150, - 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, - 161, 162, 163, -1, 165, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 7, 8, 9, -1, 11, 12, - 13, -1, -1, 16, -1, -1, 19, -1, 21, 22, - -1, -1, -1, 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, -1, -1, 40, 41, 42, - 43, -1, -1, -1, 47, 48, -1, -1, 51, 52, - -1, 54, 55, -1, 57, 58, 59, 60, 61, 62, - 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, - 73, -1, -1, -1, -1, -1, 79, -1, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, - 93, 94, -1, -1, -1, 98, 99, -1, -1, 102, - 103, -1, 105, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 115, 116, 117, 118, 119, 120, 121, 122, - 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, - 133, -1, -1, 136, -1, 138, -1, -1, -1, 142, - 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, - 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, - 163, -1, 165, -1, -1, -1, 169, 170, -1, -1, - -1, -1, 7, 8, 9, -1, 11, 12, 13, -1, - -1, 16, -1, -1, 19, -1, 21, 22, -1, -1, - -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 37, -1, -1, 40, 41, 42, 43, -1, - -1, -1, 47, 48, -1, -1, 51, 52, -1, 54, - 55, -1, 57, 58, 59, 60, 61, 62, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, -1, - -1, -1, -1, -1, 79, -1, 81, 82, 83, 84, - 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - -1, -1, -1, 98, 99, -1, -1, 102, 103, -1, - 105, 106, -1, -1, -1, -1, -1, -1, -1, -1, - 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, - 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, - -1, 136, -1, 138, -1, -1, -1, 142, 143, 144, - 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, - 155, 156, 157, 158, 159, 160, 161, 162, 163, -1, - 165, -1, -1, -1, 169, 170, -1, -1, -1, -1, - 7, 8, 9, 10, 11, 12, 13, -1, 15, 16, - -1, -1, 19, 20, 21, 22, 23, 24, -1, 26, - 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, - 37, 38, -1, 40, 41, 42, 43, -1, -1, -1, - 47, 48, 49, -1, 51, 52, 53, 54, 55, -1, - 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, - 67, 68, 69, 70, 71, 72, 73, -1, -1, 76, - -1, -1, 79, -1, 81, 82, 83, 84, 85, 86, - 87, 88, 89, 90, 91, 92, 93, 94, -1, -1, - -1, 98, 99, -1, -1, 102, 103, -1, 105, 106, - -1, 108, -1, -1, -1, -1, -1, -1, 115, 116, - 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, - 127, 128, 129, 130, 131, 132, 133, 134, -1, 136, - -1, 138, -1, -1, 141, 142, 143, 144, 145, 146, - 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, 159, 160, 161, 162, 163, -1, 165, 166, - -1, -1, 169, 170, -1, -1, -1, -1, 7, 8, - 9, 10, 11, 12, 13, -1, 15, 16, -1, -1, - 19, 20, 21, 22, 23, 24, -1, 26, 27, 28, - 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, - -1, 40, 41, 42, 43, -1, -1, -1, 47, 48, - 49, -1, 51, 52, 53, 54, 55, -1, 57, 58, - 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, - 69, 70, 71, 72, 73, -1, -1, 76, -1, -1, - 79, -1, 81, 82, 83, 84, 85, 86, 87, 88, - 89, 90, 91, 92, 93, 94, -1, -1, -1, 98, - 99, -1, -1, 102, 103, -1, 105, 106, -1, 108, - -1, -1, -1, -1, -1, -1, 115, 116, 117, 118, - 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, - 129, 130, 131, 132, 133, 134, -1, 136, -1, 138, - -1, -1, 141, 142, 143, 144, 145, 146, 147, 148, - 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, - 159, 160, 161, 162, 163, -1, 165, 166, -1, -1, - 169, 170, -1, -1, -1, -1, 7, 8, 9, 10, - 11, 12, 13, -1, 15, 16, -1, -1, 19, 20, - 21, 22, 23, 24, -1, 26, 27, 28, 29, 30, - 31, 32, 33, 34, 35, 36, 37, 38, -1, 40, - 41, 42, 43, -1, -1, -1, 47, 48, 49, -1, - 51, 52, 53, 54, 55, -1, 57, 58, 59, 60, - 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, - 71, 72, 73, -1, -1, 76, -1, -1, 79, -1, - 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, - 91, 92, 93, 94, -1, -1, -1, 98, 99, -1, - -1, 102, 103, -1, 105, 106, -1, 108, -1, -1, - 111, -1, -1, -1, 115, 116, 117, 118, 119, 120, - 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, - 131, 132, 133, 134, -1, 136, -1, 138, -1, -1, - 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, - 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, - 161, 162, 163, -1, 165, 166, -1, -1, 169, 170, - -1, -1, -1, -1, 7, 8, 9, 10, 11, 12, - 13, -1, 15, 16, -1, -1, 19, 20, 21, 22, - 23, 24, -1, 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, -1, 40, 41, 42, - 43, -1, -1, -1, 47, 48, 49, -1, 51, 52, - 53, 54, 55, -1, 57, 58, 59, 60, 61, 62, - 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, - 73, -1, -1, 76, -1, -1, 79, -1, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, - 93, 94, -1, -1, -1, 98, 99, -1, -1, 102, - 103, -1, 105, 106, -1, 108, -1, -1, 111, -1, - -1, -1, 115, 116, 117, 118, 119, 120, 121, 122, - 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, - 133, 134, -1, 136, -1, 138, -1, -1, 141, 142, - 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, - 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, - 163, -1, 165, 166, -1, -1, 169, 170, -1, -1, - -1, -1, 7, 8, 9, 10, 11, 12, 13, -1, - 15, 16, -1, -1, 19, 20, 21, 22, 23, 24, - -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 37, 38, -1, 40, 41, 42, 43, -1, - -1, -1, 47, 48, 49, -1, 51, 52, 53, 54, - 55, -1, 57, 58, 59, 60, 61, 62, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, -1, - -1, 76, -1, -1, 79, -1, 81, 82, 83, 84, - 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - -1, -1, -1, 98, 99, -1, -1, 102, 103, -1, - 105, 106, -1, 108, -1, -1, 111, -1, -1, -1, - 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, - 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, - -1, 136, -1, 138, -1, -1, 141, 142, 143, 144, - 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, - 155, 156, 157, 158, 159, 160, 161, 162, 163, -1, - 165, 166, -1, -1, 169, 170, -1, -1, -1, -1, - 7, 8, 9, 10, 11, 12, 13, -1, 15, 16, - -1, -1, 19, 20, 21, 22, 23, 24, -1, 26, - 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, - 37, 38, -1, 40, 41, 42, 43, -1, -1, -1, - 47, 48, 49, -1, 51, 52, 53, 54, 55, -1, - 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, - 67, 68, 69, 70, 71, 72, 73, -1, -1, 76, - -1, -1, 79, -1, 81, 82, 83, 84, 85, 86, - 87, 88, 89, 90, 91, 92, 93, 94, -1, -1, - -1, 98, 99, -1, -1, 102, 103, -1, 105, 106, - -1, 108, -1, -1, 111, -1, -1, -1, 115, 116, - 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, - 127, 128, 129, 130, 131, 132, 133, 134, -1, 136, - -1, 138, -1, -1, 141, 142, 143, 144, 145, 146, - 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, 159, 160, 161, 162, 163, -1, 165, 166, - -1, -1, 169, 170, -1, -1, -1, -1, + 79, 77, 45, 6, 18, 52, 76, 114, 111, 168, + 79, 45, 52, 134, 76, 17, 134, 52, 45, 77, + 134, 112, 79, 79, 45, 79, 79, 112, 114, 134, + 79, 168, 164, 79, 112, 112, 52, 4, 166, 114, + 6, 134, 79, 44, 134, 18, 114, 52, 18, 45, + 134, 164, 52, 134, 79, 52, 45, 52, 0, 114, + 134, 99, 52, 18, 112, 4, 18, 112, 112, 79, + 52, 77, 18, 18, 78, 18, 17, 18, 77, 54, + 18, 52, 18, 45, 52, 78, 78, 1, 2, 21, + 17, 18, 21, 78, 18, 46, 76, 18, 76, 18, + 54, 18, 18, 21, 78, 18, 46, 101, 76, 113, + 54, 45, -1, 107, -1, 77, 104, 54, -1, 56, + 113, 113, -1, 51, 19, -1, -1, 102, 113, -1, + 50, -1, -1, -1, -1, 134, -1, -1, -1, 113, + 50, 104, -1, 77, 104, 79, 97, 135, 102, 137, + 22, -1, -1, 81, 74, -1, 134, 97, 102, 54, + 80, 56, 50, 134, 74, 102, 94, 39, -1, 114, + 80, 114, 135, 105, 137, 135, 105, 137, 114, -1, + -1, -1, 19, 55, -1, -1, 74, 105, 134, 109, + -1, -1, 80, -1, 7, 14, 134, 114, 114, 109, + 3, 114, 5, 16, -1, 77, 19, 102, -1, -1, + 134, -1, -1, 134, 7, 134, 160, 54, -1, 56, + -1, 109, 25, 16, 7, -1, 19, -1, -1, -1, + -1, -1, -1, 16, 47, -1, 19, -1, -1, -1, + -1, 54, 45, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 47, -1, -1, -1, -1, -1, + -1, 54, -1, -1, 47, 102, -1, -1, -1, 52, + -1, 54, 75, -1, -1, -1, -1, 114, -1, -1, + -1, -1, -1, -1, -1, 98, -1, -1, -1, 102, + 103, -1, 95, 96, -1, -1, -1, 100, -1, -1, + -1, -1, 115, -1, -1, 98, -1, 110, -1, 102, + 103, -1, -1, -1, -1, 98, -1, -1, -1, 102, + 103, -1, 115, 136, -1, -1, -1, -1, -1, -1, + -1, -1, 115, -1, -1, -1, -1, 140, -1, -1, + -1, -1, -1, 136, -1, -1, -1, 160, -1, -1, + -1, -1, 145, 136, -1, -1, 7, -1, -1, -1, + -1, -1, 145, -1, 167, 16, -1, 160, 19, -1, + -1, -1, -1, -1, -1, -1, -1, 160, -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, 54, -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, 102, 103, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 115, -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, 145, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 160, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 9, -1, 11, 12, 13, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, -1, -1, 40, 41, 42, 43, -1, + -1, -1, -1, 48, -1, -1, -1, -1, -1, -1, + -1, -1, 57, -1, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 82, 83, 84, + 85, 86, 87, 88, 89, 90, 91, 92, 93, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 125, 126, 127, 128, 129, 130, 131, 132, 133, -1, + -1, -1, -1, 138, -1, -1, -1, -1, 143, 144, + -1, 146, 147, 148, 149, 150, 151, 152, 153, 154, + 155, 156, 157, 158, 159, -1, 161, 162, 163, -1, + 165, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 9, -1, 11, 12, 13, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 26, 27, 28, + 29, 30, 31, 32, 33, 34, 35, 36, 37, -1, + -1, 40, 41, 42, 43, -1, -1, -1, -1, 48, + -1, -1, 51, -1, -1, -1, -1, -1, 57, -1, + 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, -1, -1, -1, -1, -1, -1, + -1, -1, 81, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 94, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 116, 117, 118, + 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, + 129, 130, 131, 132, 133, -1, -1, -1, -1, 138, + -1, -1, -1, -1, 143, 144, -1, 146, 147, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + 159, -1, 161, 162, 163, -1, 165, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 9, -1, 11, 12, + 13, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, -1, -1, 40, 41, 42, + 43, -1, -1, -1, -1, 48, -1, -1, 51, 52, + -1, -1, -1, -1, 57, -1, 59, 60, 61, 62, + 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + -1, -1, -1, -1, -1, -1, -1, -1, 81, 82, + 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, + 93, 94, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, -1, -1, -1, -1, 138, -1, -1, -1, -1, + 143, 144, -1, 146, 147, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, -1, 161, 162, + 163, -1, 165, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 9, -1, 11, 12, 13, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 26, + 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, + 37, -1, -1, 40, 41, 42, 43, -1, -1, -1, + -1, 48, -1, -1, 51, 52, -1, -1, -1, -1, + 57, -1, 59, 60, 61, 62, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, -1, -1, -1, -1, + -1, -1, -1, -1, 81, 82, 83, 84, 85, 86, + 87, 88, 89, 90, 91, 92, 93, 94, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, -1, -1, + -1, 138, -1, -1, -1, -1, 143, 144, -1, 146, + 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, -1, 161, 162, 163, -1, 165, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 8, 9, + -1, 11, 12, 13, -1, -1, -1, -1, -1, -1, + -1, 21, 22, -1, -1, -1, 26, 27, 28, 29, + 30, 31, 32, 33, 34, 35, 36, 37, -1, -1, + 40, 41, 42, 43, -1, -1, -1, -1, 48, -1, + -1, 51, 52, -1, -1, 55, -1, 57, -1, 59, + 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, + 70, 71, 72, -1, -1, -1, -1, -1, -1, 79, + -1, 81, 82, 83, 84, 85, 86, 87, 88, 89, + 90, 91, 92, 93, 94, -1, -1, -1, -1, 99, + -1, -1, -1, -1, -1, 105, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, + 130, 131, 132, 133, -1, -1, -1, -1, 138, -1, + -1, -1, 142, 143, 144, -1, 146, 147, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, + -1, 161, 162, 163, -1, 165, -1, -1, -1, 169, + 170, -1, -1, -1, -1, 8, 9, -1, 11, 12, + 13, -1, -1, -1, -1, -1, -1, -1, 21, 22, + -1, -1, -1, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, -1, -1, 40, 41, 42, + 43, -1, -1, -1, -1, 48, -1, -1, 51, 52, + -1, -1, 55, -1, 57, -1, 59, 60, 61, 62, + 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + -1, -1, -1, -1, -1, -1, 79, -1, 81, 82, + 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, + 93, 94, -1, -1, -1, -1, 99, -1, -1, -1, + -1, -1, 105, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, -1, -1, -1, -1, 138, -1, -1, -1, 142, + 143, 144, -1, 146, 147, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, -1, 161, 162, + 163, -1, 165, -1, -1, -1, 169, 170, -1, -1, + -1, -1, 8, 9, -1, 11, 12, 13, -1, -1, + -1, -1, -1, -1, -1, 21, 22, -1, -1, -1, + 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, -1, -1, 40, 41, 42, 43, -1, -1, + -1, -1, 48, -1, -1, 51, 52, -1, -1, 55, + -1, 57, -1, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, -1, -1, -1, + -1, -1, -1, 79, -1, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, 93, 94, -1, + -1, -1, -1, 99, -1, -1, -1, -1, -1, 105, + -1, -1, -1, -1, -1, -1, 112, -1, -1, -1, + 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, + 126, 127, 128, 129, 130, 131, 132, 133, -1, -1, + -1, -1, 138, -1, -1, -1, 142, 143, 144, -1, + 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, -1, 161, 162, 163, -1, 165, + -1, -1, -1, 169, 170, -1, -1, -1, -1, 8, + 9, -1, 11, 12, 13, -1, -1, -1, -1, -1, + -1, -1, 21, 22, -1, -1, -1, 26, 27, 28, + 29, 30, 31, 32, 33, 34, 35, 36, 37, -1, + -1, 40, 41, 42, 43, -1, -1, -1, -1, 48, + -1, -1, 51, 52, -1, -1, 55, -1, 57, -1, + 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, -1, -1, -1, -1, -1, -1, + 79, -1, 81, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 94, -1, -1, -1, -1, + 99, -1, -1, -1, -1, -1, 105, -1, -1, -1, + -1, -1, -1, 112, -1, -1, -1, 116, 117, 118, + 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, + 129, 130, 131, 132, 133, -1, -1, -1, -1, 138, + -1, -1, -1, 142, 143, 144, -1, 146, 147, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + 159, -1, 161, 162, 163, -1, 165, -1, -1, -1, + 169, 170, -1, -1, -1, -1, 8, 9, -1, 11, + 12, 13, -1, -1, -1, -1, -1, -1, -1, 21, + 22, -1, -1, -1, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, -1, -1, 40, 41, + 42, 43, -1, -1, -1, -1, 48, -1, -1, 51, + 52, -1, -1, 55, -1, 57, -1, 59, 60, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, + 72, -1, -1, -1, -1, -1, -1, 79, -1, 81, + 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, + 92, 93, 94, -1, -1, -1, -1, 99, -1, -1, + -1, -1, -1, 105, -1, -1, -1, -1, -1, -1, + 112, -1, -1, -1, 116, 117, 118, 119, 120, 121, + 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, + 132, 133, -1, -1, -1, -1, 138, -1, -1, -1, + 142, 143, 144, -1, 146, 147, 148, 149, 150, 151, + 152, 153, 154, 155, 156, 157, 158, 159, -1, 161, + 162, 163, -1, 165, -1, -1, -1, 169, 170, -1, + -1, -1, -1, 8, 9, -1, 11, 12, 13, -1, + -1, -1, -1, -1, -1, -1, 21, 22, -1, -1, + -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, -1, -1, 40, 41, 42, 43, -1, + -1, -1, -1, 48, -1, -1, 51, 52, -1, -1, + 55, -1, 57, -1, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, -1, -1, + -1, -1, -1, -1, 79, -1, 81, 82, 83, 84, + 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + -1, -1, -1, -1, 99, -1, -1, -1, -1, -1, + 105, -1, -1, -1, -1, -1, -1, 112, -1, -1, + -1, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 125, 126, 127, 128, 129, 130, 131, 132, 133, -1, + -1, -1, -1, 138, -1, -1, -1, 142, 143, 144, + -1, 146, 147, 148, 149, 150, 151, 152, 153, 154, + 155, 156, 157, 158, 159, -1, 161, 162, 163, -1, + 165, -1, -1, -1, 169, 170, -1, -1, -1, -1, + 8, 9, -1, 11, 12, 13, -1, -1, -1, -1, + -1, -1, -1, 21, 22, -1, -1, -1, 26, 27, + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, + -1, -1, 40, 41, 42, 43, -1, -1, -1, -1, + 48, -1, -1, 51, 52, -1, -1, 55, -1, 57, + -1, 59, 60, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, -1, -1, -1, -1, -1, + -1, 79, -1, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, -1, -1, -1, + -1, 99, -1, -1, -1, -1, -1, 105, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 116, 117, + 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, + 128, 129, 130, 131, 132, 133, 134, -1, -1, -1, + 138, -1, -1, -1, 142, 143, 144, -1, 146, 147, + 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, -1, 161, 162, 163, -1, 165, -1, -1, + -1, 169, 170, -1, -1, -1, -1, 8, 9, -1, + 11, 12, 13, -1, -1, -1, -1, -1, -1, -1, + 21, 22, -1, -1, -1, 26, 27, 28, 29, 30, + 31, 32, 33, 34, 35, 36, 37, -1, -1, 40, + 41, 42, 43, -1, -1, -1, -1, 48, -1, -1, + 51, 52, -1, -1, 55, -1, 57, -1, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, + 71, 72, -1, -1, -1, -1, -1, -1, 79, -1, + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, + 91, 92, 93, 94, -1, -1, -1, -1, 99, -1, + -1, -1, -1, -1, 105, -1, -1, -1, -1, -1, + -1, 112, -1, -1, -1, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, + 131, 132, 133, -1, -1, -1, -1, 138, -1, -1, + -1, 142, 143, 144, -1, 146, 147, 148, 149, 150, + 151, 152, 153, 154, 155, 156, 157, 158, 159, -1, + 161, 162, 163, -1, 165, -1, -1, -1, 169, 170, + -1, -1, -1, -1, 7, -1, 9, -1, 11, 12, + 13, -1, -1, 16, -1, -1, 19, -1, -1, -1, + -1, -1, -1, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, -1, -1, 40, 41, 42, + 43, -1, -1, -1, 47, 48, -1, -1, 51, -1, + -1, 54, -1, -1, 57, 58, 59, 60, 61, 62, + 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, -1, -1, -1, -1, -1, -1, -1, 81, 82, + 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, + 93, 94, -1, -1, -1, 98, -1, -1, -1, 102, + 103, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 115, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, -1, -1, 136, -1, 138, -1, -1, -1, -1, + 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, + 163, -1, 165, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 7, -1, 9, -1, 11, 12, 13, -1, + -1, 16, -1, -1, 19, -1, -1, -1, -1, -1, + -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, -1, -1, 40, 41, 42, 43, -1, + -1, -1, 47, 48, -1, -1, 51, -1, -1, 54, + -1, -1, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, -1, + -1, -1, -1, -1, -1, -1, 81, 82, 83, 84, + 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + -1, -1, -1, 98, -1, -1, -1, 102, 103, -1, + -1, -1, -1, -1, -1, -1, 111, -1, -1, -1, + 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 125, 126, 127, 128, 129, 130, 131, 132, 133, -1, + -1, 136, -1, 138, -1, -1, -1, -1, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, 162, 163, -1, + 165, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 7, -1, 9, -1, 11, 12, 13, -1, -1, 16, + -1, -1, 19, -1, -1, -1, -1, -1, -1, 26, + 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, + 37, -1, -1, 40, 41, 42, 43, -1, -1, -1, + 47, 48, -1, -1, 51, -1, -1, 54, -1, -1, + 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, -1, -1, -1, + -1, -1, -1, -1, 81, 82, 83, 84, 85, 86, + 87, 88, 89, 90, 91, 92, 93, 94, -1, -1, + -1, 98, -1, -1, -1, 102, 103, -1, -1, -1, + -1, -1, -1, -1, 111, -1, -1, -1, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, -1, -1, 136, + -1, 138, -1, -1, -1, -1, 143, 144, 145, 146, + 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, -1, 165, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 7, -1, + 9, -1, 11, 12, 13, -1, -1, 16, -1, -1, + 19, -1, -1, -1, -1, -1, -1, 26, 27, 28, + 29, 30, 31, 32, 33, 34, 35, 36, 37, -1, + -1, 40, 41, 42, 43, -1, -1, -1, 47, 48, + -1, -1, 51, -1, -1, 54, -1, -1, 57, 58, + 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, -1, -1, -1, -1, -1, + -1, -1, 81, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 94, -1, -1, -1, 98, + -1, -1, -1, 102, 103, -1, -1, -1, -1, -1, + -1, -1, 111, -1, -1, -1, 115, 116, 117, 118, + 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, + 129, 130, 131, 132, 133, -1, -1, 136, -1, 138, + -1, -1, -1, -1, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + 159, 160, 161, 162, 163, -1, 165, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 7, -1, 9, -1, + 11, 12, 13, -1, -1, 16, -1, -1, 19, -1, + -1, -1, -1, -1, -1, 26, 27, 28, 29, 30, + 31, 32, 33, 34, 35, 36, 37, -1, -1, 40, + 41, 42, 43, -1, -1, -1, 47, 48, -1, -1, + 51, -1, -1, 54, -1, -1, 57, 58, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, -1, -1, -1, -1, -1, -1, -1, + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, + 91, 92, 93, 94, -1, -1, -1, 98, -1, -1, + -1, 102, 103, -1, -1, 106, -1, -1, -1, -1, + -1, -1, -1, -1, 115, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, + 131, 132, 133, 134, -1, 136, -1, 138, -1, -1, + -1, -1, 143, 144, 145, 146, 147, 148, 149, 150, + 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, -1, 165, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 7, 8, 9, -1, 11, 12, + 13, -1, -1, 16, -1, -1, 19, -1, 21, 22, + -1, -1, -1, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, -1, -1, 40, 41, 42, + 43, -1, -1, -1, 47, 48, -1, -1, 51, 52, + -1, 54, 55, -1, 57, 58, 59, 60, 61, 62, + 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, -1, -1, -1, -1, -1, 79, -1, 81, 82, + 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, + 93, 94, -1, -1, -1, 98, 99, -1, -1, 102, + 103, -1, 105, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 115, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, -1, -1, 136, -1, 138, -1, -1, -1, 142, + 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, + 163, -1, 165, -1, -1, -1, 169, 170, -1, -1, + -1, -1, 7, 8, 9, -1, 11, 12, 13, -1, + -1, 16, -1, -1, 19, -1, 21, 22, -1, -1, + -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, -1, -1, 40, 41, 42, 43, -1, + -1, -1, 47, 48, -1, -1, 51, 52, -1, 54, + 55, -1, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, -1, + -1, -1, -1, -1, 79, -1, 81, 82, 83, 84, + 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + -1, -1, -1, 98, 99, -1, -1, 102, 103, -1, + 105, 106, -1, -1, -1, -1, -1, -1, -1, -1, + 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + -1, 136, -1, 138, -1, -1, -1, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, 162, 163, -1, + 165, -1, -1, -1, 169, 170, -1, -1, -1, -1, + 7, 8, 9, 10, 11, 12, 13, -1, 15, 16, + -1, -1, 19, 20, 21, 22, 23, 24, -1, 26, + 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, + 37, 38, -1, 40, 41, 42, 43, -1, -1, -1, + 47, 48, 49, -1, 51, 52, 53, 54, 55, -1, + 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, -1, -1, 76, + -1, -1, 79, -1, 81, 82, 83, 84, 85, 86, + 87, 88, 89, 90, 91, 92, 93, 94, -1, -1, + -1, 98, 99, -1, -1, 102, 103, -1, 105, 106, + -1, 108, -1, -1, -1, -1, -1, -1, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, -1, 136, + -1, 138, -1, -1, 141, 142, 143, 144, 145, 146, + 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, -1, 165, 166, + -1, -1, 169, 170, -1, -1, -1, -1, 7, 8, + 9, 10, 11, 12, 13, -1, 15, 16, -1, -1, + 19, 20, 21, 22, 23, 24, -1, 26, 27, 28, + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + -1, 40, 41, 42, 43, -1, -1, -1, 47, 48, + 49, -1, 51, 52, 53, 54, 55, -1, 57, 58, + 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, -1, -1, 76, -1, -1, + 79, -1, 81, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 94, -1, -1, -1, 98, + 99, -1, -1, 102, 103, -1, 105, 106, -1, 108, + -1, -1, -1, -1, -1, -1, 115, 116, 117, 118, + 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 134, -1, 136, -1, 138, + -1, -1, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + 159, 160, 161, 162, 163, -1, 165, 166, -1, -1, + 169, 170, -1, -1, -1, -1, 7, 8, 9, 10, + 11, 12, 13, -1, 15, 16, -1, -1, 19, 20, + 21, 22, 23, 24, -1, 26, 27, 28, 29, 30, + 31, 32, 33, 34, 35, 36, 37, 38, -1, 40, + 41, 42, 43, -1, -1, -1, 47, 48, 49, -1, + 51, 52, 53, 54, 55, -1, 57, 58, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, -1, -1, 76, -1, -1, 79, -1, + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, + 91, 92, 93, 94, -1, -1, -1, 98, 99, -1, + -1, 102, 103, -1, 105, 106, -1, 108, -1, -1, + 111, -1, -1, -1, 115, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, + 131, 132, 133, 134, -1, 136, -1, 138, -1, -1, + 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, + 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, -1, 165, 166, -1, -1, 169, 170, + -1, -1, -1, -1, 7, 8, 9, 10, 11, 12, + 13, -1, 15, 16, -1, -1, 19, 20, 21, 22, + 23, 24, -1, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, -1, 40, 41, 42, + 43, -1, -1, -1, 47, 48, 49, -1, 51, 52, + 53, 54, 55, -1, 57, 58, 59, 60, 61, 62, + 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, -1, -1, 76, -1, -1, 79, -1, 81, 82, + 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, + 93, 94, -1, -1, -1, 98, 99, -1, -1, 102, + 103, -1, 105, 106, -1, 108, -1, -1, 111, -1, + -1, -1, 115, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, -1, 136, -1, 138, -1, -1, 141, 142, + 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, + 163, -1, 165, 166, -1, -1, 169, 170, -1, -1, + -1, -1, 7, 8, 9, 10, 11, 12, 13, -1, + 15, 16, -1, -1, 19, 20, 21, 22, 23, 24, + -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, -1, 40, 41, 42, 43, -1, + -1, -1, 47, 48, 49, -1, 51, 52, 53, 54, + 55, -1, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, -1, + -1, 76, -1, -1, 79, -1, 81, 82, 83, 84, + 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + -1, -1, -1, 98, 99, -1, -1, 102, 103, -1, + 105, 106, -1, 108, -1, -1, 111, -1, -1, -1, + 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + -1, 136, -1, 138, -1, -1, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, 162, 163, -1, + 165, 166, -1, -1, 169, 170, -1, -1, -1, -1, + 7, 8, 9, 10, 11, 12, 13, -1, 15, 16, + -1, -1, 19, 20, 21, 22, 23, 24, -1, 26, + 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, + 37, 38, -1, 40, 41, 42, 43, -1, -1, -1, + 47, 48, 49, -1, 51, 52, 53, 54, 55, -1, + 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, -1, -1, 76, + -1, -1, 79, -1, 81, 82, 83, 84, 85, 86, + 87, 88, 89, 90, 91, 92, 93, 94, -1, -1, + -1, 98, 99, -1, -1, 102, 103, -1, 105, 106, + -1, 108, -1, -1, 111, -1, -1, -1, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, -1, 136, + -1, 138, -1, -1, 141, 142, 143, 144, 145, 146, + 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, -1, 165, 166, + -1, -1, 169, 170, -1, -1, -1, -1, - 12, 14, 3, 3, 3, 54, 15, 14, 55, 15, - 15, 15, 15, 59, 3, 60, 55, 12, 12, 3, - 3, 14, 41, 34, 15, 3, 8, 45, 14, 3, - 3, 12, 12, 35, 55, 73, 12, 14, 35, 14, - 12, -1, -1, 12, 15, 15, 17, 17, 12, 12, - 15, 12, -1, 15, -1, 15, 15, 15, 15, 21, - 20, 20, 19, 28, 15, 23, 15, 15, 14, 12, - 14, -1, 51, 3, 25, 24, 55, 49, 26, 14, - 49, 15, 15, 14, 18, 49, 49, 62, 49, 22, - 14, 14, 36, 15, 15, 15, 15, 19, 18, 15, - 19, 14, 14, 19, 14, 14, 49, 28, 14, 30, - 14, 14, -1, 15, 14, -1, -1, -1, 64, 14, - -1, 31, 32, 14, 14, -1, 28, 62, 30, 15, - -1, 62, 36, 36, 37, 47, 15, 43, 62, 62, - 46, 36, 28, 14, 30, 36, 36, 37, -1, 28, - -1, 30, 61, 15, 58, 14, 65, -1, 71, 71, - 31, 32, 3, 58, 64, -1, 28, 58, 30, -1, - -1, -1, 72, 14, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 36, -1, -1, -1, -1, - -1, 42, -1, 62, -1, -1, 47, -1, -1, -1, - -1, 82, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 3, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 14, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 36, - -1, -1, -1, -1, -1, 42, -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, 75, -1, - -1, -1, -1, -1, -1, -1, -1, -1 -}; + 12, 14, 3, 3, 3, 54, 15, 14, 55, 15, + 15, 15, 15, 59, 3, 60, 55, 12, 12, 3, + 3, 14, 41, 34, 15, 3, 8, 45, 14, 3, + 3, 12, 12, 35, 55, 73, 12, 14, 35, 14, + 12, -1, -1, 12, 15, 15, 17, 17, 12, 12, + 15, 12, -1, 15, -1, 15, 15, 15, 15, 21, + 20, 20, 19, 28, 15, 23, 15, 15, 14, 12, + 14, -1, 51, 3, 25, 24, 55, 49, 26, 14, + 49, 15, 15, 14, 18, 49, 49, 62, 49, 22, + 14, 14, 36, 15, 15, 15, 15, 19, 18, 15, + 19, 14, 14, 19, 14, 14, 49, 28, 14, 30, + 14, 14, -1, 15, 14, -1, -1, -1, 64, 14, + -1, 31, 32, 14, 14, -1, 28, 62, 30, 15, + -1, 62, 36, 36, 37, 47, 15, 43, 62, 62, + 46, 36, 28, 14, 30, 36, 36, 37, -1, 28, + -1, 30, 61, 15, 58, 14, 65, -1, 71, 71, + 31, 32, 3, 58, 64, -1, 28, 58, 30, -1, + -1, -1, 72, 14, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 36, -1, -1, -1, -1, + -1, 42, -1, 62, -1, -1, 47, -1, -1, -1, + -1, 82, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 3, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 14, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 36, + -1, -1, -1, -1, -1, 42, -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, 75, -1, + -1, -1, -1, -1, -1, -1, -1, -1}; QT_END_NAMESPACE diff --git a/src/libs/glsl/glslparsertable_p.h b/src/libs/glsl/glslparsertable_p.h index 8abd115735..7c298263cd 100644 --- a/src/libs/glsl/glslparsertable_p.h +++ b/src/libs/glsl/glslparsertable_p.h @@ -1,26 +1,31 @@ /**************************************************************************** ** ** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the Qt Toolkit. ** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ +** $QT_BEGIN_LICENSE:LGPL21$ ** 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. +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://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. +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ ** @@ -48,221 +53,221 @@ QT_BEGIN_NAMESPACE class GLSLParserTable { public: - enum VariousConstants { - EOF_SYMBOL = 0, - T_ADD_ASSIGN = 3, - T_AMPERSAND = 4, - T_AND_ASSIGN = 5, - T_AND_OP = 6, - T_ATTRIBUTE = 7, - T_BANG = 8, - T_BOOL = 9, - T_BREAK = 10, - T_BVEC2 = 11, - T_BVEC3 = 12, - T_BVEC4 = 13, - T_CARET = 14, - T_CASE = 15, - T_CENTROID = 16, - T_COLON = 17, - T_COMMA = 18, - T_COMMENT = 172, - T_CONST = 19, - T_CONTINUE = 20, - T_DASH = 21, - T_DEC_OP = 22, - T_DEFAULT = 23, - T_DISCARD = 24, - T_DIV_ASSIGN = 25, - T_DMAT2 = 26, - T_DMAT2X2 = 27, - T_DMAT2X3 = 28, - T_DMAT2X4 = 29, - T_DMAT3 = 30, - T_DMAT3X2 = 31, - T_DMAT3X3 = 32, - T_DMAT3X4 = 33, - T_DMAT4 = 34, - T_DMAT4X2 = 35, - T_DMAT4X3 = 36, - T_DMAT4X4 = 37, - T_DO = 38, - T_DOT = 39, - T_DOUBLE = 40, - T_DVEC2 = 41, - T_DVEC3 = 42, - T_DVEC4 = 43, - T_ELSE = 44, - T_EQUAL = 45, - T_EQ_OP = 46, - T_ERROR = 173, - T_FALSE = 170, - T_FEED_EXPRESSION = 2, - T_FEED_GLSL = 1, - T_FLAT = 47, - T_FLOAT = 48, - T_FOR = 49, - T_GE_OP = 50, - T_HIGHP = 51, - T_IDENTIFIER = 52, - T_IF = 53, - T_IN = 54, - T_INC_OP = 55, - T_INOUT = 56, - T_INT = 57, - T_INVARIANT = 58, - T_ISAMPLER1D = 59, - T_ISAMPLER1DARRAY = 60, - T_ISAMPLER2D = 61, - T_ISAMPLER2DARRAY = 62, - T_ISAMPLER2DMS = 63, - T_ISAMPLER2DMSARRAY = 64, - T_ISAMPLER2DRECT = 65, - T_ISAMPLER3D = 66, - T_ISAMPLERBUFFER = 67, - T_ISAMPLERCUBE = 68, - T_ISAMPLERCUBEARRAY = 69, - T_IVEC2 = 70, - T_IVEC3 = 71, - T_IVEC4 = 72, - T_LAYOUT = 73, - T_LEFT_ANGLE = 74, - T_LEFT_ASSIGN = 75, - T_LEFT_BRACE = 76, - T_LEFT_BRACKET = 77, - T_LEFT_OP = 78, - T_LEFT_PAREN = 79, - T_LE_OP = 80, - T_LOWP = 81, - T_MAT2 = 82, - T_MAT2X2 = 83, - T_MAT2X3 = 84, - T_MAT2X4 = 85, - T_MAT3 = 86, - T_MAT3X2 = 87, - T_MAT3X3 = 88, - T_MAT3X4 = 89, - T_MAT4 = 90, - T_MAT4X2 = 91, - T_MAT4X3 = 92, - T_MAT4X4 = 93, - T_MEDIUMP = 94, - T_MOD_ASSIGN = 95, - T_MUL_ASSIGN = 96, - T_NE_OP = 97, - T_NOPERSPECTIVE = 98, - T_NUMBER = 99, - T_OR_ASSIGN = 100, - T_OR_OP = 101, - T_OUT = 102, - T_PATCH = 103, - T_PERCENT = 104, - T_PLUS = 105, - T_PRECISION = 106, - T_PREPROC = 171, - T_QUESTION = 107, - T_RESERVED = 174, - T_RETURN = 108, - T_RIGHT_ANGLE = 109, - T_RIGHT_ASSIGN = 110, - T_RIGHT_BRACE = 111, - T_RIGHT_BRACKET = 112, - T_RIGHT_OP = 113, - T_RIGHT_PAREN = 114, - T_SAMPLE = 115, - T_SAMPLER1D = 116, - T_SAMPLER1DARRAY = 117, - T_SAMPLER1DARRAYSHADOW = 118, - T_SAMPLER1DSHADOW = 119, - T_SAMPLER2D = 120, - T_SAMPLER2DARRAY = 121, - T_SAMPLER2DARRAYSHADOW = 122, - T_SAMPLER2DMS = 123, - T_SAMPLER2DMSARRAY = 124, - T_SAMPLER2DRECT = 125, - T_SAMPLER2DRECTSHADOW = 126, - T_SAMPLER2DSHADOW = 127, - T_SAMPLER3D = 128, - T_SAMPLERBUFFER = 129, - T_SAMPLERCUBE = 130, - T_SAMPLERCUBEARRAY = 131, - T_SAMPLERCUBEARRAYSHADOW = 132, - T_SAMPLERCUBESHADOW = 133, - T_SEMICOLON = 134, - T_SLASH = 135, - T_SMOOTH = 136, - T_STAR = 137, - T_STRUCT = 138, - T_SUBROUTINE = 139, - T_SUB_ASSIGN = 140, - T_SWITCH = 141, - T_TILDE = 142, - T_TRUE = 169, - T_TYPE_NAME = 143, - T_UINT = 144, - T_UNIFORM = 145, - T_USAMPLER1D = 146, - T_USAMPLER1DARRAY = 147, - T_USAMPLER2D = 148, - T_USAMPLER2DARRAY = 149, - T_USAMPLER2DMS = 150, - T_USAMPLER2DMSARRAY = 151, - T_USAMPLER2DRECT = 152, - T_USAMPLER3D = 153, - T_USAMPLERBUFFER = 154, - T_USAMPLERCUBE = 155, - T_USAMPLERCUBEARRAY = 156, - T_UVEC2 = 157, - T_UVEC3 = 158, - T_UVEC4 = 159, - T_VARYING = 160, - T_VEC2 = 161, - T_VEC3 = 162, - T_VEC4 = 163, - T_VERTICAL_BAR = 164, - T_VOID = 165, - T_WHILE = 166, - T_XOR_ASSIGN = 167, - T_XOR_OP = 168, + enum VariousConstants { + EOF_SYMBOL = 0, + T_ADD_ASSIGN = 3, + T_AMPERSAND = 4, + T_AND_ASSIGN = 5, + T_AND_OP = 6, + T_ATTRIBUTE = 7, + T_BANG = 8, + T_BOOL = 9, + T_BREAK = 10, + T_BVEC2 = 11, + T_BVEC3 = 12, + T_BVEC4 = 13, + T_CARET = 14, + T_CASE = 15, + T_CENTROID = 16, + T_COLON = 17, + T_COMMA = 18, + T_COMMENT = 172, + T_CONST = 19, + T_CONTINUE = 20, + T_DASH = 21, + T_DEC_OP = 22, + T_DEFAULT = 23, + T_DISCARD = 24, + T_DIV_ASSIGN = 25, + T_DMAT2 = 26, + T_DMAT2X2 = 27, + T_DMAT2X3 = 28, + T_DMAT2X4 = 29, + T_DMAT3 = 30, + T_DMAT3X2 = 31, + T_DMAT3X3 = 32, + T_DMAT3X4 = 33, + T_DMAT4 = 34, + T_DMAT4X2 = 35, + T_DMAT4X3 = 36, + T_DMAT4X4 = 37, + T_DO = 38, + T_DOT = 39, + T_DOUBLE = 40, + T_DVEC2 = 41, + T_DVEC3 = 42, + T_DVEC4 = 43, + T_ELSE = 44, + T_EQUAL = 45, + T_EQ_OP = 46, + T_ERROR = 173, + T_FALSE = 170, + T_FEED_EXPRESSION = 2, + T_FEED_GLSL = 1, + T_FLAT = 47, + T_FLOAT = 48, + T_FOR = 49, + T_GE_OP = 50, + T_HIGHP = 51, + T_IDENTIFIER = 52, + T_IF = 53, + T_IN = 54, + T_INC_OP = 55, + T_INOUT = 56, + T_INT = 57, + T_INVARIANT = 58, + T_ISAMPLER1D = 59, + T_ISAMPLER1DARRAY = 60, + T_ISAMPLER2D = 61, + T_ISAMPLER2DARRAY = 62, + T_ISAMPLER2DMS = 63, + T_ISAMPLER2DMSARRAY = 64, + T_ISAMPLER2DRECT = 65, + T_ISAMPLER3D = 66, + T_ISAMPLERBUFFER = 67, + T_ISAMPLERCUBE = 68, + T_ISAMPLERCUBEARRAY = 69, + T_IVEC2 = 70, + T_IVEC3 = 71, + T_IVEC4 = 72, + T_LAYOUT = 73, + T_LEFT_ANGLE = 74, + T_LEFT_ASSIGN = 75, + T_LEFT_BRACE = 76, + T_LEFT_BRACKET = 77, + T_LEFT_OP = 78, + T_LEFT_PAREN = 79, + T_LE_OP = 80, + T_LOWP = 81, + T_MAT2 = 82, + T_MAT2X2 = 83, + T_MAT2X3 = 84, + T_MAT2X4 = 85, + T_MAT3 = 86, + T_MAT3X2 = 87, + T_MAT3X3 = 88, + T_MAT3X4 = 89, + T_MAT4 = 90, + T_MAT4X2 = 91, + T_MAT4X3 = 92, + T_MAT4X4 = 93, + T_MEDIUMP = 94, + T_MOD_ASSIGN = 95, + T_MUL_ASSIGN = 96, + T_NE_OP = 97, + T_NOPERSPECTIVE = 98, + T_NUMBER = 99, + T_OR_ASSIGN = 100, + T_OR_OP = 101, + T_OUT = 102, + T_PATCH = 103, + T_PERCENT = 104, + T_PLUS = 105, + T_PRECISION = 106, + T_PREPROC = 171, + T_QUESTION = 107, + T_RESERVED = 174, + T_RETURN = 108, + T_RIGHT_ANGLE = 109, + T_RIGHT_ASSIGN = 110, + T_RIGHT_BRACE = 111, + T_RIGHT_BRACKET = 112, + T_RIGHT_OP = 113, + T_RIGHT_PAREN = 114, + T_SAMPLE = 115, + T_SAMPLER1D = 116, + T_SAMPLER1DARRAY = 117, + T_SAMPLER1DARRAYSHADOW = 118, + T_SAMPLER1DSHADOW = 119, + T_SAMPLER2D = 120, + T_SAMPLER2DARRAY = 121, + T_SAMPLER2DARRAYSHADOW = 122, + T_SAMPLER2DMS = 123, + T_SAMPLER2DMSARRAY = 124, + T_SAMPLER2DRECT = 125, + T_SAMPLER2DRECTSHADOW = 126, + T_SAMPLER2DSHADOW = 127, + T_SAMPLER3D = 128, + T_SAMPLERBUFFER = 129, + T_SAMPLERCUBE = 130, + T_SAMPLERCUBEARRAY = 131, + T_SAMPLERCUBEARRAYSHADOW = 132, + T_SAMPLERCUBESHADOW = 133, + T_SEMICOLON = 134, + T_SLASH = 135, + T_SMOOTH = 136, + T_STAR = 137, + T_STRUCT = 138, + T_SUBROUTINE = 139, + T_SUB_ASSIGN = 140, + T_SWITCH = 141, + T_TILDE = 142, + T_TRUE = 169, + T_TYPE_NAME = 143, + T_UINT = 144, + T_UNIFORM = 145, + T_USAMPLER1D = 146, + T_USAMPLER1DARRAY = 147, + T_USAMPLER2D = 148, + T_USAMPLER2DARRAY = 149, + T_USAMPLER2DMS = 150, + T_USAMPLER2DMSARRAY = 151, + T_USAMPLER2DRECT = 152, + T_USAMPLER3D = 153, + T_USAMPLERBUFFER = 154, + T_USAMPLERCUBE = 155, + T_USAMPLERCUBEARRAY = 156, + T_UVEC2 = 157, + T_UVEC3 = 158, + T_UVEC4 = 159, + T_VARYING = 160, + T_VEC2 = 161, + T_VEC3 = 162, + T_VEC4 = 163, + T_VERTICAL_BAR = 164, + T_VOID = 165, + T_WHILE = 166, + T_XOR_ASSIGN = 167, + T_XOR_OP = 168, - ACCEPT_STATE = 462, - RULE_COUNT = 316, - STATE_COUNT = 463, - TERMINAL_COUNT = 175, - NON_TERMINAL_COUNT = 85, + ACCEPT_STATE = 462, + RULE_COUNT = 316, + STATE_COUNT = 463, + TERMINAL_COUNT = 175, + NON_TERMINAL_COUNT = 85, - GOTO_INDEX_OFFSET = 463, - GOTO_INFO_OFFSET = 4708, - GOTO_CHECK_OFFSET = 4708 - }; + GOTO_INDEX_OFFSET = 463, + GOTO_INFO_OFFSET = 4708, + GOTO_CHECK_OFFSET = 4708 + }; - static const char *const spell[]; - static const short lhs[]; - static const short rhs[]; - static const short goto_default[]; - static const short action_default[]; - static const short action_index[]; - static const short action_info[]; - static const short action_check[]; + static const char *const spell []; + static const short lhs []; + static const short rhs []; + static const short goto_default []; + static const short action_default []; + static const short action_index []; + static const short action_info []; + static const short action_check []; - static inline int nt_action (int state, int nt) - { - const int yyn = action_index [GOTO_INDEX_OFFSET + state] + nt; - if (yyn < 0 || action_check [GOTO_CHECK_OFFSET + yyn] != nt) - return goto_default [nt]; + static inline int nt_action (int state, int nt) + { + const int yyn = action_index [GOTO_INDEX_OFFSET + state] + nt; + if (yyn < 0 || action_check [GOTO_CHECK_OFFSET + yyn] != nt) + return goto_default [nt]; - return action_info [GOTO_INFO_OFFSET + yyn]; - } + return action_info [GOTO_INFO_OFFSET + yyn]; + } - static inline int t_action (int state, int token) - { - const int yyn = action_index [state] + token; + static inline int t_action (int state, int token) + { + const int yyn = action_index [state] + token; - if (yyn < 0 || action_check [yyn] != token) - return - action_default [state]; + if (yyn < 0 || action_check [yyn] != token) + return - action_default [state]; - return action_info [yyn]; - } + return action_info [yyn]; + } }; diff --git a/src/plugins/android/androidbuildapkstep.cpp b/src/plugins/android/androidbuildapkstep.cpp index 9cf5aa76e0..d9c4e50f0e 100644 --- a/src/plugins/android/androidbuildapkstep.cpp +++ b/src/plugins/android/androidbuildapkstep.cpp @@ -132,7 +132,7 @@ bool AndroidBuildApkStep::init(QList<const BuildStep *> &earlierSteps) return false; } } else if (version->qtVersion() < QtSupport::QtVersionNumber(5, 4, 0)) { - emit addOutput(tr("The minimum Qt version required for Gradle build to work is %2. " + emit addOutput(tr("The minimum Qt version required for Gradle build to work is %1. " "It is recommended to install the latest Qt version.") .arg("5.4.0"), OutputFormat::Stderr); return false; diff --git a/src/plugins/clangcodemodel/clangbackendreceiver.cpp b/src/plugins/clangcodemodel/clangbackendreceiver.cpp index f2606d74cc..3794eb0b6b 100644 --- a/src/plugins/clangcodemodel/clangbackendreceiver.cpp +++ b/src/plugins/clangcodemodel/clangbackendreceiver.cpp @@ -151,7 +151,7 @@ void BackendReceiver::reset() qDeleteAll(m_assistProcessorsTable.begin(), m_assistProcessorsTable.end()); m_assistProcessorsTable.clear(); - // Clean up futures for references + // Clean up futures for references; TODO: Remove duplication for (ReferencesEntry &entry : m_referencesTable) { entry.futureInterface.cancel(); entry.futureInterface.reportFinished(); @@ -162,6 +162,11 @@ void BackendReceiver::reset() futureInterface.reportFinished(); } m_followTable.clear(); + for (QFutureInterface<CppTools::ToolTipInfo> &futureInterface : m_toolTipsTable) { + futureInterface.cancel(); + futureInterface.reportFinished(); + } + m_toolTipsTable.clear(); } void BackendReceiver::alive() diff --git a/src/plugins/clangcodemodel/clangcompletionassistprocessor.h b/src/plugins/clangcodemodel/clangcompletionassistprocessor.h index 0f23b1a0fe..3e20caa37b 100644 --- a/src/plugins/clangcodemodel/clangcompletionassistprocessor.h +++ b/src/plugins/clangcodemodel/clangcompletionassistprocessor.h @@ -46,7 +46,7 @@ class ClangCompletionAssistProcessor : public CppTools::CppCompletionAssistProce public: ClangCompletionAssistProcessor(); - ~ClangCompletionAssistProcessor(); + ~ClangCompletionAssistProcessor() override; TextEditor::IAssistProposal *perform(const TextEditor::AssistInterface *interface) override; diff --git a/src/plugins/clangcodemodel/clangeditordocumentprocessor.cpp b/src/plugins/clangcodemodel/clangeditordocumentprocessor.cpp index 924257cc63..2a405da1f7 100644 --- a/src/plugins/clangcodemodel/clangeditordocumentprocessor.cpp +++ b/src/plugins/clangcodemodel/clangeditordocumentprocessor.cpp @@ -101,10 +101,8 @@ ClangEditorDocumentProcessor::~ClangEditorDocumentProcessor() m_parserWatcher.cancel(); m_parserWatcher.waitForFinished(); - if (m_projectPart) { - m_communicator.unregisterTranslationUnitsForEditor( - {ClangBackEnd::FileContainer(filePath(), m_projectPart->id())}); - } + if (m_projectPart) + unregisterTranslationUnitForEditor(); } void ClangEditorDocumentProcessor::runImpl( @@ -384,11 +382,6 @@ QFuture<CppTools::ToolTipInfo> ClangEditorDocumentProcessor::toolTipInfo(const Q static_cast<quint32>(column)); } -ClangBackEnd::FileContainer ClangEditorDocumentProcessor::fileContainerWithArguments() const -{ - return fileContainerWithArguments(m_projectPart.data()); -} - void ClangEditorDocumentProcessor::clearDiagnosticsWithFixIts() { m_diagnosticManager.clearDiagnosticsWithFixIts(); @@ -442,7 +435,6 @@ void ClangEditorDocumentProcessor::registerTranslationUnitForEditor(CppTools::Pr if (m_projectPart) { if (projectPart->id() == m_projectPart->id()) return; - m_communicator.unregisterTranslationUnitsForEditor({fileContainerWithArguments()}); } m_communicator.registerTranslationUnitsForEditor( @@ -450,6 +442,13 @@ void ClangEditorDocumentProcessor::registerTranslationUnitForEditor(CppTools::Pr ClangCodeModel::Utils::setLastSentDocumentRevision(filePath(), revision()); } +void ClangEditorDocumentProcessor::unregisterTranslationUnitForEditor() +{ + QTC_ASSERT(m_projectPart, return); + m_communicator.unregisterTranslationUnitsForEditor( + {ClangBackEnd::FileContainer(filePath(), m_projectPart->id())}); +} + void ClangEditorDocumentProcessor::updateTranslationUnitIfProjectPartExists() { if (m_projectPart) { @@ -627,17 +626,6 @@ static QStringList fileArguments(const QString &filePath, CppTools::ProjectPart } ClangBackEnd::FileContainer -ClangEditorDocumentProcessor::fileContainerWithArguments(CppTools::ProjectPart *projectPart) const -{ - const auto projectPartId = projectPart - ? Utf8String::fromString(projectPart->id()) - : Utf8String(); - const QStringList theFileArguments = fileArguments(filePath(), projectPart); - - return {filePath(), projectPartId, Utf8StringVector(theFileArguments), revision()}; -} - -ClangBackEnd::FileContainer ClangEditorDocumentProcessor::fileContainerWithArgumentsAndDocumentContent( CppTools::ProjectPart *projectPart) const { diff --git a/src/plugins/clangcodemodel/clangeditordocumentprocessor.h b/src/plugins/clangcodemodel/clangeditordocumentprocessor.h index 67745b582c..27c4b355dc 100644 --- a/src/plugins/clangcodemodel/clangeditordocumentprocessor.h +++ b/src/plugins/clangcodemodel/clangeditordocumentprocessor.h @@ -52,7 +52,7 @@ class ClangEditorDocumentProcessor : public CppTools::BaseEditorDocumentProcesso public: ClangEditorDocumentProcessor(BackendCommunicator &communicator, TextEditor::TextDocument *document); - ~ClangEditorDocumentProcessor(); + ~ClangEditorDocumentProcessor() override; // BaseEditorDocumentProcessor interface void runImpl(const CppTools::BaseEditorDocumentParser::UpdateParams &updateParams) override; @@ -92,7 +92,7 @@ public: int line, int column) override; - ClangBackEnd::FileContainer fileContainerWithArguments() const; + void unregisterTranslationUnitForEditor(); void clearDiagnosticsWithFixIts(); @@ -110,7 +110,6 @@ private: HeaderErrorDiagnosticWidgetCreator creatorForHeaderErrorDiagnosticWidget( const ClangBackEnd::DiagnosticContainer &firstHeaderErrorDiagnostic); ClangBackEnd::FileContainer simpleFileContainer(const QByteArray &codecName = QByteArray()) const; - ClangBackEnd::FileContainer fileContainerWithArguments(CppTools::ProjectPart *projectPart) const; ClangBackEnd::FileContainer fileContainerWithArgumentsAndDocumentContent( CppTools::ProjectPart *projectPart) const; ClangBackEnd::FileContainer fileContainerWithDocumentContent(const QString &projectpartId) const; diff --git a/src/plugins/clangcodemodel/clanghoverhandler.cpp b/src/plugins/clangcodemodel/clanghoverhandler.cpp index 6610b555c2..5903b18246 100644 --- a/src/plugins/clangcodemodel/clanghoverhandler.cpp +++ b/src/plugins/clangcodemodel/clanghoverhandler.cpp @@ -102,17 +102,16 @@ static QFuture<CppTools::ToolTipInfo> editorDocumentHandlesToolTipInfo( ClangHoverHandler::ClangHoverHandler() { - setIsAsyncHandler(true); } ClangHoverHandler::~ClangHoverHandler() { - cancelAsyncCheck(); + abort(); } -void ClangHoverHandler::identifyMatchAsync(TextEditorWidget *editorWidget, - int pos, - BaseHoverHandler::ReportPriority report) +void ClangHoverHandler::identifyMatch(TextEditorWidget *editorWidget, + int pos, + BaseHoverHandler::ReportPriority report) { // Reset m_futureWatcher.reset(); @@ -143,10 +142,12 @@ void ClangHoverHandler::identifyMatchAsync(TextEditorWidget *editorWidget, report(Priority_None); // Ops, something went wrong. } -void ClangHoverHandler::cancelAsyncCheck() +void ClangHoverHandler::abort() { - if (m_futureWatcher) + if (m_futureWatcher) { m_futureWatcher->cancel(); + m_futureWatcher.reset(); + } } #define RETURN_TEXT_FOR_CASE(enumValue) case TextEditor::HelpItem::enumValue: return #enumValue diff --git a/src/plugins/clangcodemodel/clanghoverhandler.h b/src/plugins/clangcodemodel/clanghoverhandler.h index 85b7999f94..e6e262ecd0 100644 --- a/src/plugins/clangcodemodel/clanghoverhandler.h +++ b/src/plugins/clangcodemodel/clanghoverhandler.h @@ -40,14 +40,14 @@ public: ClangHoverHandler(); ~ClangHoverHandler() override; - void identifyMatchAsync(TextEditor::TextEditorWidget *editorWidget, - int pos, - ReportPriority report) override; + void identifyMatch(TextEditor::TextEditorWidget *editorWidget, + int pos, + ReportPriority report) override; void decorateToolTip() override; void operateTooltip(TextEditor::TextEditorWidget *editorWidget, const QPoint &point) override; private: - void cancelAsyncCheck() override; + void abort() override; void processToolTipInfo(const CppTools::ToolTipInfo &info); private: diff --git a/src/plugins/clangcodemodel/clangmodelmanagersupport.cpp b/src/plugins/clangcodemodel/clangmodelmanagersupport.cpp index 9495e6d5eb..4de96c5a0e 100644 --- a/src/plugins/clangcodemodel/clangmodelmanagersupport.cpp +++ b/src/plugins/clangcodemodel/clangmodelmanagersupport.cpp @@ -376,7 +376,7 @@ void ModelManagerSupportClang::unregisterTranslationUnitsWithProjectParts( { const auto processors = clangProcessorsWithProjectParts(projectPartIds); foreach (ClangEditorDocumentProcessor *processor, processors) { - m_communicator.unregisterTranslationUnitsForEditor({processor->fileContainerWithArguments()}); + processor->unregisterTranslationUnitForEditor(); processor->clearProjectPart(); processor->run(); } diff --git a/src/plugins/clangcodemodel/clangmodelmanagersupport.h b/src/plugins/clangcodemodel/clangmodelmanagersupport.h index 92f253c5a8..3744905b42 100644 --- a/src/plugins/clangcodemodel/clangmodelmanagersupport.h +++ b/src/plugins/clangcodemodel/clangmodelmanagersupport.h @@ -58,7 +58,7 @@ class ModelManagerSupportClang: public: ModelManagerSupportClang(); - ~ModelManagerSupportClang(); + ~ModelManagerSupportClang() override; CppTools::CppCompletionAssistProvider *completionAssistProvider() override; TextEditor::BaseHoverHandler *createHoverHandler() override; diff --git a/src/plugins/clangrefactoring/clangqueryhoverhandler.cpp b/src/plugins/clangrefactoring/clangqueryhoverhandler.cpp index e8ce90c297..11a29f1db1 100644 --- a/src/plugins/clangrefactoring/clangqueryhoverhandler.cpp +++ b/src/plugins/clangrefactoring/clangqueryhoverhandler.cpp @@ -30,6 +30,7 @@ #include <dynamicastmatcherdiagnosticmessagecontainer.h> #include <texteditor/texteditor.h> +#include <utils/executeondestruction.h> namespace ClangRefactoring { @@ -38,8 +39,12 @@ ClangQueryHoverHandler::ClangQueryHoverHandler(ClangQueryHighlighter *highligher { } -void ClangQueryHoverHandler::identifyMatch(TextEditor::TextEditorWidget *editorWidget, int position) +void ClangQueryHoverHandler::identifyMatch(TextEditor::TextEditorWidget *editorWidget, + int position, + ReportPriority report) { + Utils::ExecuteOnDestruction reportPriority([this, report](){ report(priority()); }); + using Messages = ClangBackEnd::DynamicASTMatcherDiagnosticMessageContainers; using Contexts = ClangBackEnd::DynamicASTMatcherDiagnosticContextContainers; diff --git a/src/plugins/clangrefactoring/clangqueryhoverhandler.h b/src/plugins/clangrefactoring/clangqueryhoverhandler.h index 7a93bcbf5d..a9dfc5fe22 100644 --- a/src/plugins/clangrefactoring/clangqueryhoverhandler.h +++ b/src/plugins/clangrefactoring/clangqueryhoverhandler.h @@ -37,7 +37,9 @@ public: ClangQueryHoverHandler(ClangQueryHighlighter *highligher); protected: - void identifyMatch(TextEditor::TextEditorWidget *editorWidget, int position) override; + void identifyMatch(TextEditor::TextEditorWidget *editorWidget, + int position, + ReportPriority report) override; private: ClangQueryHighlighter *m_highligher; diff --git a/src/plugins/cmakeprojectmanager/servermodereader.cpp b/src/plugins/cmakeprojectmanager/servermodereader.cpp index 3e656d44c7..f4a6235e76 100644 --- a/src/plugins/cmakeprojectmanager/servermodereader.cpp +++ b/src/plugins/cmakeprojectmanager/servermodereader.cpp @@ -813,7 +813,7 @@ void ServerModeReader::addTargets(const QHash<Utils::FileName, ProjectExplorer:: if (cr->type != CrossReference::TARGET) { if (path == targetPath) { if (bt->line >= 0) - dn = tr("%1 in line %3").arg(btName).arg(bt->line); + dn = tr("%1 in line %2").arg(btName).arg(bt->line); else dn = tr("%1").arg(btName); } else { diff --git a/src/plugins/coreplugin/locator/javascriptfilter.cpp b/src/plugins/coreplugin/locator/javascriptfilter.cpp index 02803ecf72..6255101dca 100644 --- a/src/plugins/coreplugin/locator/javascriptfilter.cpp +++ b/src/plugins/coreplugin/locator/javascriptfilter.cpp @@ -32,6 +32,11 @@ namespace Core { namespace Internal { +enum JavaScriptAction +{ + ResetEngine = QVariant::UserType + 1 +}; + JavaScriptFilter::JavaScriptFilter() { setId("JavaScriptFilter"); @@ -48,7 +53,8 @@ void JavaScriptFilter::prepareSearch(const QString &entry) { Q_UNUSED(entry); - setupEngine(); + if (!m_engine) + setupEngine(); } QList<LocatorFilterEntry> JavaScriptFilter::matchesFor( @@ -56,13 +62,17 @@ QList<LocatorFilterEntry> JavaScriptFilter::matchesFor( { Q_UNUSED(future); - const QString result = m_engine->evaluate(entry).toString(); - const QString expression = entry + " = " + result; - QList<LocatorFilterEntry> entries; - entries.append({this, expression, QVariant()}); - entries.append({this, tr("Copy to clipboard: %1").arg(result), result}); - entries.append({this, tr("Copy to clipboard: %1").arg(expression), expression}); + if (entry.trimmed().isEmpty()) { + entries.append({this, tr("Reset Engine"), QVariant(ResetEngine, nullptr)}); + } else { + const QString result = m_engine->evaluate(entry).toString(); + const QString expression = entry + " = " + result; + + entries.append({this, expression, QVariant()}); + entries.append({this, tr("Copy to clipboard: %1").arg(result), result}); + entries.append({this, tr("Copy to clipboard: %1").arg(expression), expression}); + } return entries; } @@ -77,6 +87,11 @@ void JavaScriptFilter::accept(Core::LocatorFilterEntry selection, QString *newTe if (selection.internalData.isNull()) return; + if (selection.internalData.userType() == ResetEngine) { + m_engine.reset(); + return; + } + QClipboard *clipboard = QGuiApplication::clipboard(); clipboard->setText(selection.internalData.toString()); } @@ -89,10 +104,7 @@ void JavaScriptFilter::refresh(QFutureInterface<void> &future) void JavaScriptFilter::setupEngine() { - if (m_engine) - return; - - m_engine = new QJSEngine(this); + m_engine.reset(new QJSEngine); m_engine->evaluate( "function abs(x) { return Math.abs(x); }\n" "function acos(x) { return Math.acos(x); }\n" diff --git a/src/plugins/coreplugin/locator/javascriptfilter.h b/src/plugins/coreplugin/locator/javascriptfilter.h index 50f5e85c3b..9bf3ac5194 100644 --- a/src/plugins/coreplugin/locator/javascriptfilter.h +++ b/src/plugins/coreplugin/locator/javascriptfilter.h @@ -27,6 +27,8 @@ #include <coreplugin/locator/ilocatorfilter.h> +#include <memory> + QT_BEGIN_NAMESPACE class QJSEngine; QT_END_NAMESPACE @@ -51,7 +53,7 @@ public: private: void setupEngine(); - QJSEngine *m_engine = nullptr; + mutable std::unique_ptr<QJSEngine> m_engine; }; } // namespace Internal diff --git a/src/plugins/cppeditor/resourcepreviewhoverhandler.cpp b/src/plugins/cppeditor/resourcepreviewhoverhandler.cpp index 47c691760d..a657fcd6bc 100644 --- a/src/plugins/cppeditor/resourcepreviewhoverhandler.cpp +++ b/src/plugins/cppeditor/resourcepreviewhoverhandler.cpp @@ -33,6 +33,7 @@ #include <projectexplorer/projecttree.h> #include <projectexplorer/project.h> #include <texteditor/texteditor.h> +#include <utils/executeondestruction.h> #include <QPoint> #include <QTextBlock> @@ -164,8 +165,12 @@ static QString findResourceInProject(const QString &resName) return QString(); } -void ResourcePreviewHoverHandler::identifyMatch(TextEditorWidget *editorWidget, int pos) +void ResourcePreviewHoverHandler::identifyMatch(TextEditorWidget *editorWidget, + int pos, + ReportPriority report) { + Utils::ExecuteOnDestruction reportPriority([this, report](){ report(priority()); }); + if (editorWidget->extraSelectionTooltip(pos).isEmpty()) { const QTextBlock tb = editorWidget->document()->findBlock(pos); const int tbpos = pos - tb.position(); diff --git a/src/plugins/cppeditor/resourcepreviewhoverhandler.h b/src/plugins/cppeditor/resourcepreviewhoverhandler.h index 2ccb261c2a..b0977099ec 100644 --- a/src/plugins/cppeditor/resourcepreviewhoverhandler.h +++ b/src/plugins/cppeditor/resourcepreviewhoverhandler.h @@ -35,7 +35,9 @@ namespace Internal { class ResourcePreviewHoverHandler : public TextEditor::BaseHoverHandler { private: - void identifyMatch(TextEditor::TextEditorWidget *editorWidget, int pos) override; + void identifyMatch(TextEditor::TextEditorWidget *editorWidget, + int pos, + ReportPriority report) override; void operateTooltip(TextEditor::TextEditorWidget *editorWidget, const QPoint &point) override; private: diff --git a/src/plugins/cpptools/clangdiagnosticconfigsmodel.cpp b/src/plugins/cpptools/clangdiagnosticconfigsmodel.cpp index 44187b6a10..206a0d8baa 100644 --- a/src/plugins/cpptools/clangdiagnosticconfigsmodel.cpp +++ b/src/plugins/cpptools/clangdiagnosticconfigsmodel.cpp @@ -101,9 +101,7 @@ static void addBuiltinConfigs(ClangDiagnosticConfigsModel &model) ClangDiagnosticConfigsModel::ClangDiagnosticConfigsModel(const ClangDiagnosticConfigs &customConfigs) { addBuiltinConfigs(*this); - - foreach (const ClangDiagnosticConfig &config, customConfigs) - m_diagnosticConfigs.append(config); + m_diagnosticConfigs.append(customConfigs); } int ClangDiagnosticConfigsModel::size() const diff --git a/src/plugins/cpptools/cppcodemodelsettings.cpp b/src/plugins/cpptools/cppcodemodelsettings.cpp index ed860d0c4a..15ec9c9bfe 100644 --- a/src/plugins/cpptools/cppcodemodelsettings.cpp +++ b/src/plugins/cpptools/cppcodemodelsettings.cpp @@ -183,11 +183,6 @@ void CppCodeModelSettings::setPCHUsage(CppCodeModelSettings::PCHUsage pchUsage) m_pchUsage = pchUsage; } -void CppCodeModelSettings::emitChanged() -{ - emit changed(); -} - bool CppCodeModelSettings::interpretAmbigiousHeadersAsCHeaders() const { return m_interpretAmbigiousHeadersAsCHeaders; diff --git a/src/plugins/cpptools/cppcodemodelsettings.h b/src/plugins/cpptools/cppcodemodelsettings.h index edf0a6e1dc..22f5b25c6b 100644 --- a/src/plugins/cpptools/cppcodemodelsettings.h +++ b/src/plugins/cpptools/cppcodemodelsettings.h @@ -78,12 +78,8 @@ public: QString clazyChecks() const; void setClazyChecks(QString checks); -public: // for tests - void emitChanged(); - signals: void changed(); - void clangDiagnosticConfigIdChanged(); private: PCHUsage m_pchUsage = PchUse_None; diff --git a/src/plugins/cpptools/cppelementevaluator.cpp b/src/plugins/cpptools/cppelementevaluator.cpp index 3281783ef2..df9ebefa3d 100644 --- a/src/plugins/cpptools/cppelementevaluator.cpp +++ b/src/plugins/cpptools/cppelementevaluator.cpp @@ -57,6 +57,269 @@ static QStringList stripName(const QString &name) return all; } +CppElement::CppElement() : helpCategory(TextEditor::HelpItem::Unknown) +{} + +CppElement::~CppElement() +{} + +class Unknown : public CppElement +{ +public: + explicit Unknown(const QString &type) : type(type) + { + tooltip = type; + } + +public: + QString type; +}; + +class CppInclude : public CppElement +{ +public: + explicit CppInclude(const Document::Include &includeFile) + : path(QDir::toNativeSeparators(includeFile.resolvedFileName())) + , fileName(Utils::FileName::fromString(includeFile.resolvedFileName()).fileName()) + { + helpCategory = TextEditor::HelpItem::Brief; + helpIdCandidates = QStringList(fileName); + helpMark = fileName; + link = Utils::Link(path); + tooltip = path; + } + +public: + QString path; + QString fileName; +}; + +class CppMacro : public CppElement +{ +public: + explicit CppMacro(const Macro ¯o) + { + helpCategory = TextEditor::HelpItem::Macro; + const QString macroName = QString::fromUtf8(macro.name(), macro.name().size()); + helpIdCandidates = QStringList(macroName); + helpMark = macroName; + link = Utils::Link(macro.fileName(), macro.line()); + tooltip = macro.toStringWithLineBreaks(); + } +}; + +// CppDeclarableElement +CppDeclarableElement::CppDeclarableElement(Symbol *declaration) + : CppElement() + , declaration(declaration) + , icon(Icons::iconForSymbol(declaration)) +{ + Overview overview; + overview.showArgumentNames = true; + overview.showReturnTypes = true; + name = overview.prettyName(declaration->name()); + if (declaration->enclosingScope()->isClass() || + declaration->enclosingScope()->isNamespace() || + declaration->enclosingScope()->isEnum()) { + qualifiedName = overview.prettyName(LookupContext::fullyQualifiedName(declaration)); + helpIdCandidates = stripName(qualifiedName); + } else { + qualifiedName = name; + helpIdCandidates.append(name); + } + + tooltip = overview.prettyType(declaration->type(), qualifiedName); + link = CppTools::linkToSymbol(declaration); + helpMark = name; +} + +class CppNamespace : public CppDeclarableElement +{ +public: + explicit CppNamespace(Symbol *declaration) + : CppDeclarableElement(declaration) + { + helpCategory = TextEditor::HelpItem::ClassOrNamespace; + tooltip = qualifiedName; + } +}; + + +CppClass::CppClass(Symbol *declaration) : CppDeclarableElement(declaration) +{ + helpCategory = TextEditor::HelpItem::ClassOrNamespace; + tooltip = qualifiedName; +} + +bool CppClass::operator==(const CppClass &other) +{ + return this->declaration == other.declaration; +} + +void CppClass::lookupBases(Symbol *declaration, const LookupContext &context) +{ + typedef QPair<ClassOrNamespace *, CppClass *> Data; + + if (ClassOrNamespace *clazz = context.lookupType(declaration)) { + QSet<ClassOrNamespace *> visited; + + QQueue<Data> q; + q.enqueue(qMakePair(clazz, this)); + while (!q.isEmpty()) { + Data current = q.dequeue(); + clazz = current.first; + visited.insert(clazz); + const QList<ClassOrNamespace *> &bases = clazz->usings(); + foreach (ClassOrNamespace *baseClass, bases) { + const QList<Symbol *> &symbols = baseClass->symbols(); + foreach (Symbol *symbol, symbols) { + if (symbol->isClass() && ( + clazz = context.lookupType(symbol)) && + !visited.contains(clazz)) { + CppClass baseCppClass(symbol); + CppClass *cppClass = current.second; + cppClass->bases.append(baseCppClass); + q.enqueue(qMakePair(clazz, &cppClass->bases.last())); + } + } + } + } + } +} + +void CppClass::lookupDerived(Symbol *declaration, const Snapshot &snapshot) +{ + typedef QPair<CppClass *, CppTools::TypeHierarchy> Data; + + CppTools::TypeHierarchyBuilder builder(declaration, snapshot); + const CppTools::TypeHierarchy &completeHierarchy = builder.buildDerivedTypeHierarchy(); + + QQueue<Data> q; + q.enqueue(qMakePair(this, completeHierarchy)); + while (!q.isEmpty()) { + const Data ¤t = q.dequeue(); + CppClass *clazz = current.first; + const CppTools::TypeHierarchy &classHierarchy = current.second; + foreach (const CppTools::TypeHierarchy &derivedHierarchy, classHierarchy.hierarchy()) { + clazz->derived.append(CppClass(derivedHierarchy.symbol())); + q.enqueue(qMakePair(&clazz->derived.last(), derivedHierarchy)); + } + } +} + +class CppFunction : public CppDeclarableElement +{ +public: + explicit CppFunction(Symbol *declaration) + : CppDeclarableElement(declaration) + { + helpCategory = TextEditor::HelpItem::Function; + + const FullySpecifiedType &type = declaration->type(); + + // Functions marks can be found either by the main overload or signature based + // (with no argument names and no return). Help ids have no signature at all. + Overview overview; + overview.showDefaultArguments = false; + helpMark = overview.prettyType(type, name); + + overview.showFunctionSignatures = false; + helpIdCandidates.append(overview.prettyName(declaration->name())); + } +}; + +class CppEnum : public CppDeclarableElement +{ +public: + explicit CppEnum(Enum *declaration) + : CppDeclarableElement(declaration) + { + helpCategory = TextEditor::HelpItem::Enum; + tooltip = qualifiedName; + } +}; + +class CppTypedef : public CppDeclarableElement +{ +public: + explicit CppTypedef(Symbol *declaration) + : CppDeclarableElement(declaration) + { + helpCategory = TextEditor::HelpItem::Typedef; + tooltip = Overview().prettyType(declaration->type(), qualifiedName); + } +}; + +class CppVariable : public CppDeclarableElement +{ +public: + explicit CppVariable(Symbol *declaration, const LookupContext &context, Scope *scope) + : CppDeclarableElement(declaration) + { + const FullySpecifiedType &type = declaration->type(); + + const Name *typeName = 0; + if (type->isNamedType()) { + typeName = type->asNamedType()->name(); + } else if (type->isPointerType() || type->isReferenceType()) { + FullySpecifiedType associatedType; + if (type->isPointerType()) + associatedType = type->asPointerType()->elementType(); + else + associatedType = type->asReferenceType()->elementType(); + if (associatedType->isNamedType()) + typeName = associatedType->asNamedType()->name(); + } + + if (typeName) { + if (ClassOrNamespace *clazz = context.lookupType(typeName, scope)) { + if (!clazz->symbols().isEmpty()) { + Overview overview; + Symbol *symbol = clazz->symbols().at(0); + const QString &name = overview.prettyName( + LookupContext::fullyQualifiedName(symbol)); + if (!name.isEmpty()) { + tooltip = name; + helpCategory = TextEditor::HelpItem::ClassOrNamespace; + const QStringList &allNames = stripName(name); + if (!allNames.isEmpty()) { + helpMark = allNames.last(); + helpIdCandidates = allNames; + } + } + } + } + } + } +}; + +class CppEnumerator : public CppDeclarableElement +{ +public: + explicit CppEnumerator(EnumeratorDeclaration *declaration) + : CppDeclarableElement(declaration) + { + helpCategory = TextEditor::HelpItem::Enum; + + Overview overview; + + Symbol *enumSymbol = declaration->enclosingScope(); + const QString enumName = overview.prettyName(LookupContext::fullyQualifiedName(enumSymbol)); + const QString enumeratorName = overview.prettyName(declaration->name()); + QString enumeratorValue; + if (const StringLiteral *value = declaration->constantValue()) + enumeratorValue = QString::fromUtf8(value->chars(), value->size()); + + helpMark = overview.prettyName(enumSymbol->name()); + + tooltip = enumeratorName; + if (!enumName.isEmpty()) + tooltip.prepend(enumName + QLatin1Char(' ')); + if (!enumeratorValue.isEmpty()) + tooltip.append(QLatin1String(" = ") + enumeratorValue); + } +}; + CppElementEvaluator::CppElementEvaluator(TextEditor::TextEditorWidget *editor) : m_editor(editor), m_modelManager(CppTools::CppModelManager::instance()), @@ -240,234 +503,4 @@ void CppElementEvaluator::clear() m_diagnosis.clear(); } -// CppElement -CppElement::CppElement() : helpCategory(TextEditor::HelpItem::Unknown) -{} - -CppElement::~CppElement() -{} - -// Unknown -Unknown::Unknown(const QString &type) : type(type) -{ - tooltip = type; -} - - -// CppInclude - -CppInclude::CppInclude(const Document::Include &includeFile) : - path(QDir::toNativeSeparators(includeFile.resolvedFileName())), - fileName(Utils::FileName::fromString(includeFile.resolvedFileName()).fileName()) -{ - helpCategory = TextEditor::HelpItem::Brief; - helpIdCandidates = QStringList(fileName); - helpMark = fileName; - link = Utils::Link(path); - tooltip = path; -} - -// CppMacro -CppMacro::CppMacro(const Macro ¯o) -{ - helpCategory = TextEditor::HelpItem::Macro; - const QString macroName = QString::fromUtf8(macro.name(), macro.name().size()); - helpIdCandidates = QStringList(macroName); - helpMark = macroName; - link = Utils::Link(macro.fileName(), macro.line()); - tooltip = macro.toStringWithLineBreaks(); -} - -// CppDeclarableElement - -CppDeclarableElement::CppDeclarableElement(Symbol *declaration) - : CppElement() - , declaration(declaration) - , icon(Icons::iconForSymbol(declaration)) -{ - Overview overview; - overview.showArgumentNames = true; - overview.showReturnTypes = true; - name = overview.prettyName(declaration->name()); - if (declaration->enclosingScope()->isClass() || - declaration->enclosingScope()->isNamespace() || - declaration->enclosingScope()->isEnum()) { - qualifiedName = overview.prettyName(LookupContext::fullyQualifiedName(declaration)); - helpIdCandidates = stripName(qualifiedName); - } else { - qualifiedName = name; - helpIdCandidates.append(name); - } - - tooltip = overview.prettyType(declaration->type(), qualifiedName); - link = CppTools::linkToSymbol(declaration); - helpMark = name; -} - -// CppNamespace -CppNamespace::CppNamespace(Symbol *declaration) : CppDeclarableElement(declaration) -{ - helpCategory = TextEditor::HelpItem::ClassOrNamespace; - tooltip = qualifiedName; -} - -// CppClass -CppClass::CppClass(Symbol *declaration) : CppDeclarableElement(declaration) -{ - helpCategory = TextEditor::HelpItem::ClassOrNamespace; - tooltip = qualifiedName; -} - -bool CppClass::operator==(const CppClass &other) -{ - return this->declaration == other.declaration; -} - -void CppClass::lookupBases(Symbol *declaration, const LookupContext &context) -{ - typedef QPair<ClassOrNamespace *, CppClass *> Data; - - if (ClassOrNamespace *clazz = context.lookupType(declaration)) { - QSet<ClassOrNamespace *> visited; - - QQueue<Data> q; - q.enqueue(qMakePair(clazz, this)); - while (!q.isEmpty()) { - Data current = q.dequeue(); - clazz = current.first; - visited.insert(clazz); - const QList<ClassOrNamespace *> &bases = clazz->usings(); - foreach (ClassOrNamespace *baseClass, bases) { - const QList<Symbol *> &symbols = baseClass->symbols(); - foreach (Symbol *symbol, symbols) { - if (symbol->isClass() && ( - clazz = context.lookupType(symbol)) && - !visited.contains(clazz)) { - CppClass baseCppClass(symbol); - CppClass *cppClass = current.second; - cppClass->bases.append(baseCppClass); - q.enqueue(qMakePair(clazz, &cppClass->bases.last())); - } - } - } - } - } -} - -void CppClass::lookupDerived(Symbol *declaration, const Snapshot &snapshot) -{ - typedef QPair<CppClass *, CppTools::TypeHierarchy> Data; - - CppTools::TypeHierarchyBuilder builder(declaration, snapshot); - const CppTools::TypeHierarchy &completeHierarchy = builder.buildDerivedTypeHierarchy(); - - QQueue<Data> q; - q.enqueue(qMakePair(this, completeHierarchy)); - while (!q.isEmpty()) { - const Data ¤t = q.dequeue(); - CppClass *clazz = current.first; - const CppTools::TypeHierarchy &classHierarchy = current.second; - foreach (const CppTools::TypeHierarchy &derivedHierarchy, classHierarchy.hierarchy()) { - clazz->derived.append(CppClass(derivedHierarchy.symbol())); - q.enqueue(qMakePair(&clazz->derived.last(), derivedHierarchy)); - } - } -} - -// CppFunction -CppFunction::CppFunction(Symbol *declaration) - : CppDeclarableElement(declaration) -{ - helpCategory = TextEditor::HelpItem::Function; - - const FullySpecifiedType &type = declaration->type(); - - // Functions marks can be found either by the main overload or signature based - // (with no argument names and no return). Help ids have no signature at all. - Overview overview; - overview.showDefaultArguments = false; - helpMark = overview.prettyType(type, name); - - overview.showFunctionSignatures = false; - helpIdCandidates.append(overview.prettyName(declaration->name())); -} - -// CppEnum -CppEnum::CppEnum(Enum *declaration) - : CppDeclarableElement(declaration) -{ - helpCategory = TextEditor::HelpItem::Enum; - tooltip = qualifiedName; -} - -// CppTypedef -CppTypedef::CppTypedef(Symbol *declaration) : CppDeclarableElement(declaration) -{ - helpCategory = TextEditor::HelpItem::Typedef; - tooltip = Overview().prettyType(declaration->type(), qualifiedName); -} - -// CppVariable -CppVariable::CppVariable(Symbol *declaration, const LookupContext &context, Scope *scope) : - CppDeclarableElement(declaration) -{ - const FullySpecifiedType &type = declaration->type(); - - const Name *typeName = 0; - if (type->isNamedType()) { - typeName = type->asNamedType()->name(); - } else if (type->isPointerType() || type->isReferenceType()) { - FullySpecifiedType associatedType; - if (type->isPointerType()) - associatedType = type->asPointerType()->elementType(); - else - associatedType = type->asReferenceType()->elementType(); - if (associatedType->isNamedType()) - typeName = associatedType->asNamedType()->name(); - } - - if (typeName) { - if (ClassOrNamespace *clazz = context.lookupType(typeName, scope)) { - if (!clazz->symbols().isEmpty()) { - Overview overview; - Symbol *symbol = clazz->symbols().at(0); - const QString &name = - overview.prettyName(LookupContext::fullyQualifiedName(symbol)); - if (!name.isEmpty()) { - tooltip = name; - helpCategory = TextEditor::HelpItem::ClassOrNamespace; - const QStringList &allNames = stripName(name); - if (!allNames.isEmpty()) { - helpMark = allNames.last(); - helpIdCandidates = allNames; - } - } - } - } - } -} - -CppEnumerator::CppEnumerator(EnumeratorDeclaration *declaration) - : CppDeclarableElement(declaration) -{ - helpCategory = TextEditor::HelpItem::Enum; - - Overview overview; - - Symbol *enumSymbol = declaration->enclosingScope(); - const QString enumName = overview.prettyName(LookupContext::fullyQualifiedName(enumSymbol)); - const QString enumeratorName = overview.prettyName(declaration->name()); - QString enumeratorValue; - if (const StringLiteral *value = declaration->constantValue()) - enumeratorValue = QString::fromUtf8(value->chars(), value->size()); - - helpMark = overview.prettyName(enumSymbol->name()); - - tooltip = enumeratorName; - if (!enumName.isEmpty()) - tooltip.prepend(enumName + QLatin1Char(' ')); - if (!enumeratorValue.isEmpty()) - tooltip.append(QLatin1String(" = ") + enumeratorValue); -} - } // namespace CppTools diff --git a/src/plugins/cpptools/cppelementevaluator.h b/src/plugins/cpptools/cppelementevaluator.h index af994989ed..0755bd3004 100644 --- a/src/plugins/cpptools/cppelementevaluator.h +++ b/src/plugins/cpptools/cppelementevaluator.h @@ -96,31 +96,6 @@ public: QString tooltip; }; -class Unknown : public CppElement -{ -public: - explicit Unknown(const QString &type); - -public: - QString type; -}; - -class CppInclude : public CppElement -{ -public: - explicit CppInclude(const CPlusPlus::Document::Include &includeFile); - -public: - QString path; - QString fileName; -}; - -class CppMacro : public CppElement -{ -public: - explicit CppMacro(const CPlusPlus::Macro ¯o); -}; - class CppDeclarableElement : public CppElement { public: @@ -134,12 +109,6 @@ public: QIcon icon; }; -class CppNamespace : public CppDeclarableElement -{ -public: - explicit CppNamespace(CPlusPlus::Symbol *declaration); -}; - class CppClass : public CppDeclarableElement { public: @@ -156,36 +125,4 @@ public: QList<CppClass> derived; }; -class CppFunction : public CppDeclarableElement -{ -public: - explicit CppFunction(CPlusPlus::Symbol *declaration); -}; - -class CppEnum : public CppDeclarableElement -{ -public: - explicit CppEnum(CPlusPlus::Enum *declaration); -}; - -class CppTypedef : public CppDeclarableElement -{ -public: - explicit CppTypedef(CPlusPlus::Symbol *declaration); -}; - -class CppVariable : public CppDeclarableElement -{ -public: - CppVariable(CPlusPlus::Symbol *declaration, - const CPlusPlus::LookupContext &context, - CPlusPlus::Scope *scope); -}; - -class CppEnumerator : public CppDeclarableElement -{ -public: - explicit CppEnumerator(CPlusPlus::EnumeratorDeclaration *declaration); -}; - } // namespace CppTools diff --git a/src/plugins/cpptools/cpphoverhandler.cpp b/src/plugins/cpptools/cpphoverhandler.cpp index 1ff41b7fdc..3969065ff7 100644 --- a/src/plugins/cpptools/cpphoverhandler.cpp +++ b/src/plugins/cpptools/cpphoverhandler.cpp @@ -31,6 +31,7 @@ #include <texteditor/texteditor.h> #include <utils/textutils.h> +#include <utils/executeondestruction.h> #include <QTextCursor> #include <QUrl> @@ -67,8 +68,10 @@ QString CppHoverHandler::tooltipTextForHelpItem(const HelpItem &helpItem) return QString(); } -void CppHoverHandler::identifyMatch(TextEditorWidget *editorWidget, int pos) +void CppHoverHandler::identifyMatch(TextEditorWidget *editorWidget, int pos, ReportPriority report) { + Utils::ExecuteOnDestruction reportPriority([this, report](){ report(priority()); }); + QTextCursor tc(editorWidget->document()); tc.setPosition(pos); diff --git a/src/plugins/cpptools/cpphoverhandler.h b/src/plugins/cpptools/cpphoverhandler.h index edfa6901cf..75d6475537 100644 --- a/src/plugins/cpptools/cpphoverhandler.h +++ b/src/plugins/cpptools/cpphoverhandler.h @@ -37,7 +37,9 @@ public: static QString tooltipTextForHelpItem(const TextEditor::HelpItem &help); private: - void identifyMatch(TextEditor::TextEditorWidget *editorWidget, int pos) override; + void identifyMatch(TextEditor::TextEditorWidget *editorWidget, + int pos, + ReportPriority report) override; void decorateToolTip() override; }; diff --git a/src/plugins/debugger/cdb/cdbengine.cpp b/src/plugins/debugger/cdb/cdbengine.cpp index 3b3ec7d08e..31e10d0bc0 100644 --- a/src/plugins/debugger/cdb/cdbengine.cpp +++ b/src/plugins/debugger/cdb/cdbengine.cpp @@ -649,12 +649,17 @@ void CdbEngine::runEngine() // else the debugger will slow down considerably. const auto cb = [this](const DebuggerResponse &r) { handleBreakInsert(r, BreakpointModelId()); }; if (boolSetting(CdbBreakOnCrtDbgReport)) { - const QString module = msvcRunTime(runParameters().toolChainAbi.osFlavor()); - const QString debugModule = module + 'D'; - const QString wideFunc = QString::fromLatin1(CdbOptionsPage::crtDbgReport).append('W'); - runCommand({breakAtFunctionCommand(QLatin1String(CdbOptionsPage::crtDbgReport), module), BuiltinCommand, cb}); - runCommand({breakAtFunctionCommand(wideFunc, module), BuiltinCommand, cb}); - runCommand({breakAtFunctionCommand(QLatin1String(CdbOptionsPage::crtDbgReport), debugModule), BuiltinCommand, cb}); + Abi::OSFlavor flavor = runParameters().toolChainAbi.osFlavor(); + // CrtDebugReport can not be safely resolved for vc 19 + if ((flavor > Abi::WindowsMsvc2005Flavor && flavor <= Abi::WindowsMsvc2013Flavor) || + flavor > Abi::WindowsMSysFlavor || flavor <= Abi::WindowsCEFlavor) { + const QString module = msvcRunTime(flavor); + const QString debugModule = module + 'D'; + const QString wideFunc = QString::fromLatin1(CdbOptionsPage::crtDbgReport).append('W'); + runCommand({breakAtFunctionCommand(QLatin1String(CdbOptionsPage::crtDbgReport), module), BuiltinCommand, cb}); + runCommand({breakAtFunctionCommand(wideFunc, module), BuiltinCommand, cb}); + runCommand({breakAtFunctionCommand(QLatin1String(CdbOptionsPage::crtDbgReport), debugModule), BuiltinCommand, cb}); + } } // if (boolSetting(BreakOnWarning)) { // runCommand({"bm /( QtCored4!qWarning", BuiltinCommand}); // 'bm': All overloads. diff --git a/src/plugins/debugger/debuggerplugin.cpp b/src/plugins/debugger/debuggerplugin.cpp index e0fa782c39..8e46a9735e 100644 --- a/src/plugins/debugger/debuggerplugin.cpp +++ b/src/plugins/debugger/debuggerplugin.cpp @@ -1133,6 +1133,8 @@ bool DebuggerPluginPrivate::parseArgument(QStringList::const_iterator &it, } } else if (key == "kit") { kit = KitManager::kit(Id::fromString(val)); + if (!kit) + kit = KitManager::kit(Utils::equal(&Kit::displayName, val)); } else if (key == "server") { startMode = AttachToRemoteServer; remoteChannel = remoteChannel; diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp index 42a3d1e461..62837bbf42 100644 --- a/src/plugins/debugger/gdb/gdbengine.cpp +++ b/src/plugins/debugger/gdb/gdbengine.cpp @@ -4620,7 +4620,7 @@ void GdbEngine::handleFileExecAndSymbols(const DebuggerResponse &response) + ' ' + tr("This can be caused by a path length limitation " "in the core file.") + ' ' + tr("Try to specify the binary in " - "Debug > Start Debugging > Attach to Core."); + "Debug > Start Debugging > Load Core File."); notifyInferiorSetupFailedHelper(msg); } diff --git a/src/plugins/fakevim/fakevimplugin.cpp b/src/plugins/fakevim/fakevimplugin.cpp index fcdfe7066c..657a950d3e 100644 --- a/src/plugins/fakevim/fakevimplugin.cpp +++ b/src/plugins/fakevim/fakevimplugin.cpp @@ -548,10 +548,13 @@ private: ExCommandMap &exCommandMap(); ExCommandMap &defaultExCommandMap(); + ExCommandMap exCommandMapFromWidget(); FakeVimPluginPrivate *m_q; QGroupBox *m_commandBox; FancyLineEdit *m_commandEdit; + + friend class FakeVimExCommandsPage; // allow the page accessing the ExCommandMaps }; FakeVimExCommandsWidget::FakeVimExCommandsWidget(FakeVimPluginPrivate *q, QWidget *parent) @@ -601,12 +604,12 @@ public: } QWidget *widget() override; - void apply() override {} - void finish() override; + void apply() override; + void finish() override {} private: FakeVimPluginPrivate *m_q; - QPointer<QWidget> m_widget; + QPointer<FakeVimExCommandsWidget> m_widget; }; QWidget *FakeVimExCommandsPage::widget() @@ -616,9 +619,44 @@ QWidget *FakeVimExCommandsPage::widget() return m_widget; } -void FakeVimExCommandsPage::finish() +const char exCommandMapGroup[] = "FakeVimExCommand"; +const char userCommandMapGroup[] = "FakeVimUserCommand"; +const char reKey[] = "RegEx"; +const char cmdKey[] = "Cmd"; +const char idKey[] = "Command"; + +void FakeVimExCommandsPage::apply() { - delete m_widget; + if (!m_widget) // page has not been shown at all + return; + // now save the mappings if necessary + const ExCommandMap &newMapping = m_widget->exCommandMapFromWidget(); + ExCommandMap &globalCommandMapping = m_widget->exCommandMap(); + + if (newMapping != globalCommandMapping) { + const ExCommandMap &defaultMap = m_widget->defaultExCommandMap(); + QSettings *settings = ICore::settings(); + settings->beginWriteArray(exCommandMapGroup); + int count = 0; + typedef ExCommandMap::const_iterator Iterator; + const Iterator end = newMapping.constEnd(); + for (Iterator it = newMapping.constBegin(); it != end; ++it) { + const QString id = it.key(); + const QRegExp re = it.value(); + + if ((defaultMap.contains(id) && defaultMap[id] != re) + || (!defaultMap.contains(id) && !re.pattern().isEmpty())) { + settings->setArrayIndex(count); + settings->setValue(idKey, id); + settings->setValue(reKey, re.pattern()); + ++count; + } + } + settings->endArray(); + globalCommandMapping.clear(); + globalCommandMapping.unite(defaultMap); + globalCommandMapping.unite(newMapping); + } } void FakeVimExCommandsWidget::initialize() @@ -658,7 +696,7 @@ void FakeVimExCommandsWidget::initialize() setModified(item, true); } - handleCurrentCommandChanged(0); + handleCurrentCommandChanged(nullptr); } void FakeVimExCommandsWidget::handleCurrentCommandChanged(QTreeWidgetItem *current) @@ -681,10 +719,8 @@ void FakeVimExCommandsWidget::commandChanged() const QString name = current->data(0, CommandRole).toString(); const QString regex = m_commandEdit->text(); - if (current->data(0, Qt::UserRole).isValid()) { + if (current->data(0, Qt::UserRole).isValid()) current->setText(2, regex); - exCommandMap()[name] = QRegExp(regex); - } setModified(current, regex != defaultExCommandMap()[name].pattern()); } @@ -734,6 +770,8 @@ public: FakeVimUserCommandsModel(FakeVimPluginPrivate *q) : m_q(q) {} ~FakeVimUserCommandsModel() {} + void initCommandMap(const UserCommandMap &commandMap) { m_commandMap = commandMap; } + UserCommandMap commandMap() const { return m_commandMap; } int rowCount(const QModelIndex &parent) const; int columnCount(const QModelIndex &parent) const; QVariant data(const QModelIndex &index, int role) const; @@ -743,6 +781,7 @@ public: private: FakeVimPluginPrivate *m_q; + UserCommandMap m_commandMap; }; int FakeVimUserCommandsModel::rowCount(const QModelIndex &parent) const @@ -814,17 +853,19 @@ public: setCategoryIcon(Utils::Icon(SETTINGS_CATEGORY_FAKEVIM_ICON)); } - void apply(); - void finish() {} + void apply() override; + void finish() override {} QWidget *widget(); void initialize() {} UserCommandMap &userCommandMap(); UserCommandMap &defaultUserCommandMap(); + UserCommandMap currentCommandMap(); private: FakeVimPluginPrivate *m_q; QPointer<QWidget> m_widget; + FakeVimUserCommandsModel *m_model; }; QWidget *FakeVimUserCommandsPage::widget() @@ -832,10 +873,11 @@ QWidget *FakeVimUserCommandsPage::widget() if (!m_widget) { m_widget = new QWidget; - auto model = new FakeVimUserCommandsModel(m_q); + m_model = new FakeVimUserCommandsModel(m_q); + m_model->initCommandMap(userCommandMap()); auto widget = new QTreeView; - model->setParent(widget); - widget->setModel(model); + m_model->setParent(widget); + widget->setModel(m_model); widget->resizeColumnToContents(0); auto delegate = new FakeVimUserCommandsDelegate(widget); @@ -850,8 +892,37 @@ QWidget *FakeVimUserCommandsPage::widget() void FakeVimUserCommandsPage::apply() { - //m_q->writeSettings(); - delete m_widget; + if (!m_widget) // page has not been shown at all + return; + + // now save the mappings if necessary + const UserCommandMap ¤t = currentCommandMap(); + UserCommandMap &userMap = userCommandMap(); + + if (current != userMap) { + QSettings *settings = ICore::settings(); + settings->beginWriteArray(userCommandMapGroup); + int count = 0; + typedef UserCommandMap::const_iterator Iterator; + const Iterator end = current.constEnd(); + for (Iterator it = current.constBegin(); it != end; ++it) { + const int key = it.key(); + const QString cmd = it.value(); + + if ((defaultUserCommandMap().contains(key) + && defaultUserCommandMap()[key] != cmd) + || (!defaultUserCommandMap().contains(key) && !cmd.isEmpty())) { + settings->setArrayIndex(count); + settings->setValue(idKey, key); + settings->setValue(cmdKey, cmd); + ++count; + } + } + settings->endArray(); + userMap.clear(); + userMap.unite(defaultUserCommandMap()); + userMap.unite(current); + } } @@ -1122,7 +1193,7 @@ QVariant FakeVimUserCommandsModel::data(const QModelIndex &index, int role) cons case 0: // Action return Tr::tr("User command #%1").arg(index.row() + 1); case 1: // Command - return m_q->userCommandMap().value(index.row() + 1); + return m_commandMap.value(index.row() + 1); } } @@ -1134,7 +1205,7 @@ bool FakeVimUserCommandsModel::setData(const QModelIndex &index, { if (role == Qt::DisplayRole || role == Qt::EditRole) if (index.column() == 1) - m_q->userCommandMap()[index.row() + 1] = data.toString(); + m_commandMap[index.row() + 1] = data.toString(); return true; } @@ -1284,58 +1355,10 @@ void FakeVimPluginPrivate::createRelativeNumberWidget(IEditor *editor) } } -const char exCommandMapGroup[] = "FakeVimExCommand"; -const char userCommandMapGroup[] = "FakeVimUserCommand"; -const char reKey[] = "RegEx"; -const char cmdKey[] = "Cmd"; -const char idKey[] = "Command"; - void FakeVimPluginPrivate::writeSettings() { QSettings *settings = ICore::settings(); - theFakeVimSettings()->writeSettings(settings); - - { // block - settings->beginWriteArray(exCommandMapGroup); - int count = 0; - typedef ExCommandMap::const_iterator Iterator; - const Iterator end = exCommandMap().constEnd(); - for (Iterator it = exCommandMap().constBegin(); it != end; ++it) { - const QString id = it.key(); - const QRegExp re = it.value(); - - if ((defaultExCommandMap().contains(id) && defaultExCommandMap()[id] != re) - || (!defaultExCommandMap().contains(id) && !re.pattern().isEmpty())) { - settings->setArrayIndex(count); - settings->setValue(idKey, id); - settings->setValue(reKey, re.pattern()); - ++count; - } - } - settings->endArray(); - } // block - - { // block - settings->beginWriteArray(userCommandMapGroup); - int count = 0; - typedef UserCommandMap::const_iterator Iterator; - const Iterator end = userCommandMap().constEnd(); - for (Iterator it = userCommandMap().constBegin(); it != end; ++it) { - const int key = it.key(); - const QString cmd = it.value(); - - if ((defaultUserCommandMap().contains(key) - && defaultUserCommandMap()[key] != cmd) - || (!defaultUserCommandMap().contains(key) && !cmd.isEmpty())) { - settings->setArrayIndex(count); - settings->setValue(idKey, key); - settings->setValue(cmdKey, cmd); - ++count; - } - } - settings->endArray(); - } // block } void FakeVimPluginPrivate::readSettings() @@ -2191,6 +2214,26 @@ ExCommandMap &FakeVimExCommandsWidget::defaultExCommandMap() return m_q->defaultExCommandMap(); } +ExCommandMap FakeVimExCommandsWidget::exCommandMapFromWidget() +{ + ExCommandMap map; + int n = commandList()->topLevelItemCount(); + for (int i = 0; i != n; ++i) { + QTreeWidgetItem *section = commandList()->topLevelItem(i); + int m = section->childCount(); + for (int j = 0; j != m; ++j) { + QTreeWidgetItem *item = section->child(j); + const QString name = item->data(0, CommandRole).toString(); + const QString regex = item->data(2, Qt::DisplayRole).toString(); + if ((regex.isEmpty() && defaultExCommandMap().value(name).isEmpty()) + || (!regex.isEmpty() && defaultExCommandMap().value(name).pattern() == regex)) + continue; + map[name] = QRegExp(regex); + } + } + return map; +} + UserCommandMap &FakeVimUserCommandsPage::userCommandMap() { return m_q->userCommandMap(); @@ -2201,6 +2244,11 @@ UserCommandMap &FakeVimUserCommandsPage::defaultUserCommandMap() return m_q->defaultUserCommandMap(); } +UserCommandMap FakeVimUserCommandsPage::currentCommandMap() +{ + return m_model->commandMap(); +} + /////////////////////////////////////////////////////////////////////// // // FakeVimPlugin diff --git a/src/plugins/ios/iosrunner.cpp b/src/plugins/ios/iosrunner.cpp index 6681a27354..6a923be786 100644 --- a/src/plugins/ios/iosrunner.cpp +++ b/src/plugins/ios/iosrunner.cpp @@ -270,7 +270,7 @@ void IosRunner::handleGotInferiorPid(IosToolHandler *handler, const QString &bun if (prerequisiteOk) reportStarted(); else - reportFailure(tr("Could not get necessary ports the debugger connection.")); + reportFailure(tr("Could not get necessary ports for the debugger connection.")); } void IosRunner::handleAppOutput(IosToolHandler *handler, const QString &output) diff --git a/src/plugins/ios/iossettingswidget.cpp b/src/plugins/ios/iossettingswidget.cpp index 0cb54bd28b..02168a79ad 100644 --- a/src/plugins/ios/iossettingswidget.cpp +++ b/src/plugins/ios/iossettingswidget.cpp @@ -119,7 +119,7 @@ void IosSettingsWidget::onStart() QPointer<SimulatorOperationDialog> statusDialog = new SimulatorOperationDialog(this); statusDialog->setAttribute(Qt::WA_DeleteOnClose); - statusDialog->addMessage(tr("Starting simulator devices...", "", simulatorInfoList.count()), + statusDialog->addMessage(tr("Starting %n simulator device(s)...", "", simulatorInfoList.count()), Utils::NormalMessageFormat); QList<QFuture<void>> futureList; @@ -185,7 +185,7 @@ void IosSettingsWidget::onReset() const int userInput = QMessageBox::question(this, tr("Reset"), tr("Do you really want to reset the contents and settings" - " of the selected devices?", "", + " of the %n selected device(s)?", "", simulatorInfoList.count())); if (userInput == QMessageBox::No) return; @@ -242,14 +242,14 @@ void IosSettingsWidget::onDelete() return; const int userInput = QMessageBox::question(this, tr("Delete Device"), - tr("Do you really want to delete the selected " - "devices?", "", simulatorInfoList.count())); + tr("Do you really want to delete the %n selected " + "device(s)?", "", simulatorInfoList.count())); if (userInput == QMessageBox::No) return; QPointer<SimulatorOperationDialog> statusDialog = new SimulatorOperationDialog(this); statusDialog->setAttribute(Qt::WA_DeleteOnClose); - statusDialog->addMessage(tr("Deleting simulator devices...", "", simulatorInfoList.count()), + statusDialog->addMessage(tr("Deleting %n simulator device(s)...", "", simulatorInfoList.count()), Utils::NormalMessageFormat); QList<QFuture<void>> futureList; foreach (const SimulatorInfo &info, simulatorInfoList) { @@ -280,7 +280,7 @@ void IosSettingsWidget::onScreenshot() QPointer<SimulatorOperationDialog> statusDialog = new SimulatorOperationDialog(this); statusDialog->setAttribute(Qt::WA_DeleteOnClose); - statusDialog->addMessage(tr("Capturing screenshots from devices...", "", + statusDialog->addMessage(tr("Capturing screenshots from %n device(s)...", "", simulatorInfoList.count()), Utils::NormalMessageFormat); QList<QFuture<void>> futureList; foreach (const SimulatorInfo &info, simulatorInfoList) { diff --git a/src/plugins/projectexplorer/project.cpp b/src/plugins/projectexplorer/project.cpp index a291ef212b..f2704e6119 100644 --- a/src/plugins/projectexplorer/project.cpp +++ b/src/plugins/projectexplorer/project.cpp @@ -527,29 +527,33 @@ void Project::setRootProjectNode(ProjectNode *root) root = nullptr; } - ProjectTree::applyTreeManager(root); + if (root) { + ProjectTree::applyTreeManager(root); + root->setParentFolderNode(d->m_containerNode.get()); + } ProjectNode *oldNode = d->m_rootProjectNode; + d->m_rootProjectNode = root; - if (root) { - QVector<const Node *> nodeList; - root->forEachGenericNode([&nodeList](const Node *n) { + if (oldNode || root) + handleSubTreeChanged(d->m_containerNode.get()); + + delete oldNode; +} + +void Project::handleSubTreeChanged(FolderNode *node) +{ + QVector<const Node *> nodeList; + if (d->m_rootProjectNode) { + d->m_rootProjectNode->forEachGenericNode([&nodeList](const Node *n) { nodeList.append(n); }); Utils::sort(nodeList, &nodeLessThan); - d->m_sortedNodeList = nodeList; - root->setParentFolderNode(d->m_containerNode.get()); - // Only announce non-null root, null is only used when project is destroyed. - // In that case SessionManager::projectRemoved() triggers the update. - ProjectTree::emitSubtreeChanged(root); - emit fileListChanged(); - } else { - d->m_sortedNodeList.clear(); - if (oldNode != nullptr) - emit fileListChanged(); } + d->m_sortedNodeList = nodeList; - delete oldNode; + ProjectTree::emitSubtreeChanged(node); + emit fileListChanged(); } Target *Project::restoreTarget(const QVariantMap &data) diff --git a/src/plugins/projectexplorer/project.h b/src/plugins/projectexplorer/project.h index 845b3c2b42..28b5055189 100644 --- a/src/plugins/projectexplorer/project.h +++ b/src/plugins/projectexplorer/project.h @@ -48,6 +48,7 @@ namespace ProjectExplorer { class BuildInfo; class ContainerNode; class EditorConfiguration; +class FolderNode; class NamedWidget; class Node; class ProjectConfiguration; @@ -241,10 +242,12 @@ protected: virtual void projectLoaded(); // Called when the project is fully loaded. private: + void handleSubTreeChanged(FolderNode *node); void setActiveTarget(Target *target); ProjectPrivate *d; friend class Session; + friend class ContainerNode; }; } // namespace ProjectExplorer diff --git a/src/plugins/projectexplorer/projectexplorersettingspage.ui b/src/plugins/projectexplorer/projectexplorersettingspage.ui index 4a51b8b274..328a8c2caf 100644 --- a/src/plugins/projectexplorer/projectexplorersettingspage.ui +++ b/src/plugins/projectexplorer/projectexplorersettingspage.ui @@ -122,7 +122,7 @@ <item> <widget class="QLabel" name="limitBuildOutputLabel"> <property name="text"> - <string>Limit build output to </string> + <string>Limit build output to</string> </property> </widget> </item> diff --git a/src/plugins/projectexplorer/projectnodes.cpp b/src/plugins/projectexplorer/projectnodes.cpp index 25df41102d..ea4b780cab 100644 --- a/src/plugins/projectexplorer/projectnodes.cpp +++ b/src/plugins/projectexplorer/projectnodes.cpp @@ -628,7 +628,7 @@ bool FolderNode::replaceSubtree(Node *oldNode, Node *newNode) } QTimer::singleShot(0, [oldNode]() { delete oldNode; }); } - ProjectTree::emitSubtreeChanged(this); + handleSubTreeChanged(this); return true; } @@ -879,6 +879,12 @@ bool FolderNode::isEmpty() const return m_nodes.isEmpty(); } +void FolderNode::handleSubTreeChanged(FolderNode *node) +{ + if (FolderNode *parent = parentFolderNode()) + parent->handleSubTreeChanged(node); +} + ContainerNode::ContainerNode(Project *project) : FolderNode(project->projectDirectory(), NodeType::Project), m_project(project) {} @@ -915,4 +921,9 @@ void ContainerNode::removeAllChildren() m_nodes.clear(); } +void ContainerNode::handleSubTreeChanged(FolderNode *node) +{ + m_project->handleSubTreeChanged(node); +} + } // namespace ProjectExplorer diff --git a/src/plugins/projectexplorer/projectnodes.h b/src/plugins/projectexplorer/projectnodes.h index ddd828ee97..34ad086a18 100644 --- a/src/plugins/projectexplorer/projectnodes.h +++ b/src/plugins/projectexplorer/projectnodes.h @@ -294,6 +294,8 @@ public: const FolderNode *asFolderNode() const override { return this; } protected: + virtual void handleSubTreeChanged(FolderNode *node); + QList<Node *> m_nodes; QList<LocationInfo> m_locations; @@ -361,6 +363,8 @@ public: void removeAllChildren(); private: + void handleSubTreeChanged(FolderNode *node) final; + Project *m_project; }; diff --git a/src/plugins/projectexplorer/targetsettingspanel.cpp b/src/plugins/projectexplorer/targetsettingspanel.cpp index 955cedc956..c98e670eae 100644 --- a/src/plugins/projectexplorer/targetsettingspanel.cpp +++ b/src/plugins/projectexplorer/targetsettingspanel.cpp @@ -432,7 +432,7 @@ public: QPushButton *closeAnyway = box.addButton(tr("Cancel Build and Disable Kit in This Project"), QMessageBox::AcceptRole); QPushButton *cancelClose = box.addButton(tr("Do Not Remove"), QMessageBox::RejectRole); box.setDefaultButton(cancelClose); - box.setWindowTitle(tr("Disable Kit %1 in This Project?").arg(kitName)); + box.setWindowTitle(tr("Disable Kit \"%1\" in This Project?").arg(kitName)); box.setText(tr("The kit <b>%1</b> is currently being built.").arg(kitName)); box.setInformativeText(tr("Do you want to cancel the build process and remove the kit anyway?")); box.exec(); diff --git a/src/plugins/qbsprojectmanager/qbsprofilessettingspage.cpp b/src/plugins/qbsprojectmanager/qbsprofilessettingspage.cpp index 3e7ac54eb4..f0a1fb7235 100644 --- a/src/plugins/qbsprojectmanager/qbsprofilessettingspage.cpp +++ b/src/plugins/qbsprojectmanager/qbsprofilessettingspage.cpp @@ -109,7 +109,7 @@ QbsProfilesSettingsWidget::QbsProfilesSettingsWidget(QWidget *parent) m_ui.settingsDirCheckBox->setText(tr("Store profiles in %1 settings directory") .arg(Core::Constants::IDE_DISPLAY_NAME)); m_ui.settingsDirCheckBox->setChecked(QbsProjectManagerSettings::useCreatorSettingsDirForQbs()); - m_ui.versionValueLabel->setText(qbs::LanguageInfo::qbsVersion()); + m_ui.versionValueLabel->setText(qbs::LanguageInfo::qbsVersion().toString()); connect(ProjectExplorer::KitManager::instance(), &ProjectExplorer::KitManager::kitsChanged, this, &QbsProfilesSettingsWidget::refreshKitsList); connect(m_ui.settingsDirCheckBox, &QCheckBox::stateChanged, [this]() { diff --git a/src/plugins/qbsprojectmanager/qbsrunconfiguration.cpp b/src/plugins/qbsprojectmanager/qbsrunconfiguration.cpp index 3c0e2eceac..e63a28e0bd 100644 --- a/src/plugins/qbsprojectmanager/qbsrunconfiguration.cpp +++ b/src/plugins/qbsprojectmanager/qbsrunconfiguration.cpp @@ -73,6 +73,8 @@ const char QBS_RC_PREFIX[] = "Qbs.RunConfiguration:"; static QString rcNameSeparator() { return QLatin1String("---Qbs.RC.NameSeparator---"); } +static QString usingLibraryPathsKey() { return "Qbs.RunConfiguration.UsingLibraryPaths"; } + const qbs::ProductData findProduct(const qbs::ProjectData &pro, const QString &uniqeName) { foreach (const qbs::ProductData &product, pro.allProducts()) { @@ -124,6 +126,13 @@ QbsRunConfiguration::QbsRunConfiguration(Target *target) this, &QbsRunConfiguration::installStepChanged); } +QVariantMap QbsRunConfiguration::toMap() const +{ + QVariantMap map = RunConfiguration::toMap(); + map.insert(usingLibraryPathsKey(), usingLibraryPaths()); + return map; +} + bool QbsRunConfiguration::fromMap(const QVariantMap &map) { if (!RunConfiguration::fromMap(map)) @@ -137,6 +146,7 @@ bool QbsRunConfiguration::fromMap(const QVariantMap &map) } setDefaultDisplayName(defaultDisplayName()); + m_usingLibraryPaths = map.value(usingLibraryPathsKey(), true).toBool(); installStepChanged(); return true; @@ -229,6 +239,12 @@ bool QbsRunConfiguration::isConsoleApplication() const return product.properties().value(QLatin1String("consoleApplication"), false).toBool(); } +void QbsRunConfiguration::setUsingLibraryPaths(bool useLibPaths) +{ + m_usingLibraryPaths = useLibPaths; + extraAspect<LocalEnvironmentAspect>()->environmentChanged(); +} + QString QbsRunConfiguration::baseWorkingDirectory() const { const QString exe = executable(); @@ -245,8 +261,11 @@ void QbsRunConfiguration::addToBaseEnvironment(Utils::Environment &env) const if (product.isValid()) { QProcessEnvironment procEnv = env.toProcessEnvironment(); procEnv.insert(QLatin1String("QBS_RUN_FILE_PATH"), executable()); + QStringList setupRunEnvConfig; + if (!m_usingLibraryPaths) + setupRunEnvConfig << QLatin1String("ignore-lib-dependencies"); qbs::RunEnvironment qbsRunEnv = project->qbsProject().getRunEnvironment(product, - qbs::InstallOptions(), procEnv, QbsManager::settings()); + qbs::InstallOptions(), procEnv, setupRunEnvConfig, QbsManager::settings()); qbs::ErrorInfo error; procEnv = qbsRunEnv.runEnvironment(&error); if (error.hasError()) { @@ -260,10 +279,6 @@ void QbsRunConfiguration::addToBaseEnvironment(Utils::Environment &env) const } } } - - QtSupport::BaseQtVersion *qtVersion = QtSupport::QtKitInformation::qtVersion(target()->kit()); - if (qtVersion) - env.prependOrSetLibrarySearchPath(qtVersion->librarySearchPath().toString()); } QString QbsRunConfiguration::buildSystemTarget() const @@ -317,6 +332,11 @@ QbsRunConfigurationWidget::QbsRunConfigurationWidget(QbsRunConfiguration *rc) m_rc->extraAspect<WorkingDirectoryAspect>()->addToMainConfigurationWidget(this, toplayout); m_rc->extraAspect<TerminalAspect>()->addToMainConfigurationWidget(this, toplayout); + m_usingLibPathsCheckBox = new QCheckBox(tr("Add library paths to run environment")); + m_usingLibPathsCheckBox->setChecked(m_rc->usingLibraryPaths()); + connect(m_usingLibPathsCheckBox, &QCheckBox::toggled, m_rc, + &QbsRunConfiguration::setUsingLibraryPaths); + toplayout->addRow(QString(), m_usingLibPathsCheckBox); connect(m_rc, &QbsRunConfiguration::targetInformationChanged, this, &QbsRunConfigurationWidget::targetInformationHasChanged, Qt::QueuedConnection); diff --git a/src/plugins/qbsprojectmanager/qbsrunconfiguration.h b/src/plugins/qbsprojectmanager/qbsrunconfiguration.h index af1f8a3f20..9976121606 100644 --- a/src/plugins/qbsprojectmanager/qbsrunconfiguration.h +++ b/src/plugins/qbsprojectmanager/qbsrunconfiguration.h @@ -27,8 +27,9 @@ #include <projectexplorer/runnables.h> -#include <QStringList> +#include <QCheckBox> #include <QLabel> +#include <QStringList> #include <QWidget> namespace qbs { class InstallOptions; } @@ -63,12 +64,15 @@ public: QString buildSystemTarget() const final; QString uniqueProductName() const; bool isConsoleApplication() const; + bool usingLibraryPaths() const { return m_usingLibraryPaths; } + void setUsingLibraryPaths(bool useLibPaths); signals: void targetInformationChanged(); void usingDyldImageSuffixChanged(bool); private: + QVariantMap toMap() const final; bool fromMap(const QVariantMap &map) final; QString extraId() const final; @@ -83,6 +87,7 @@ private: ProjectExplorer::BuildStepList *m_currentBuildStepList = nullptr; // We do not take ownership! QString m_uniqueProductName; QString m_productDisplayName; + bool m_usingLibraryPaths = true; }; class QbsRunConfigurationWidget : public QWidget @@ -99,6 +104,7 @@ private: QbsRunConfiguration *m_rc; QLabel *m_executableLineLabel; + QCheckBox *m_usingLibPathsCheckBox; bool m_ignoreChange = false; bool m_isShown = false; }; diff --git a/src/plugins/qmakeprojectmanager/profilehoverhandler.cpp b/src/plugins/qmakeprojectmanager/profilehoverhandler.cpp index dfbee9bb66..2aa7fb94b3 100644 --- a/src/plugins/qmakeprojectmanager/profilehoverhandler.cpp +++ b/src/plugins/qmakeprojectmanager/profilehoverhandler.cpp @@ -30,6 +30,7 @@ #include <coreplugin/helpmanager.h> #include <texteditor/texteditor.h> #include <utils/htmldocextractor.h> +#include <utils/executeondestruction.h> #include <QTextBlock> #include <QUrl> @@ -44,8 +45,12 @@ ProFileHoverHandler::ProFileHoverHandler() { } -void ProFileHoverHandler::identifyMatch(TextEditor::TextEditorWidget *editorWidget, int pos) +void ProFileHoverHandler::identifyMatch(TextEditor::TextEditorWidget *editorWidget, + int pos, + ReportPriority report) { + Utils::ExecuteOnDestruction reportPriority([this, report](){ report(priority()); }); + m_docFragment.clear(); m_manualKind = UnknownManual; if (!editorWidget->extraSelectionTooltip(pos).isEmpty()) { diff --git a/src/plugins/qmakeprojectmanager/profilehoverhandler.h b/src/plugins/qmakeprojectmanager/profilehoverhandler.h index cc9f91ef02..bbcd74db7a 100644 --- a/src/plugins/qmakeprojectmanager/profilehoverhandler.h +++ b/src/plugins/qmakeprojectmanager/profilehoverhandler.h @@ -40,7 +40,9 @@ public: ProFileHoverHandler(); private: - void identifyMatch(TextEditor::TextEditorWidget *editorWidget, int pos) override; + void identifyMatch(TextEditor::TextEditorWidget *editorWidget, + int pos, + ReportPriority report) override; void identifyQMakeKeyword(const QString &text, int pos); enum ManualKind { diff --git a/src/plugins/qmldesigner/components/componentcore/componentcore_constants.h b/src/plugins/qmldesigner/components/componentcore/componentcore_constants.h index ce7952609a..0035b90fad 100644 --- a/src/plugins/qmldesigner/components/componentcore/componentcore_constants.h +++ b/src/plugins/qmldesigner/components/componentcore/componentcore_constants.h @@ -137,7 +137,7 @@ const char lowerToolTip[] = QT_TRANSLATE_NOOP("QmlDesignerContextMenu", "Lower s const char resetSizeToolTip[] = QT_TRANSLATE_NOOP("QmlDesignerContextMenu", "Reset size and use implicit size."); const char resetPositionTooltip[] = QT_TRANSLATE_NOOP("QmlDesignerContextMenu", "Reset position and use implicit position."); -const char anchorsFillToolTip[] = QT_TRANSLATE_NOOP("QmlDesignerContextMenu", "Fill selected item to parent. "); +const char anchorsFillToolTip[] = QT_TRANSLATE_NOOP("QmlDesignerContextMenu", "Fill selected item to parent."); const char anchorsResetToolTip[] = QT_TRANSLATE_NOOP("QmlDesignerContextMenu", "Reset anchors for selected item."); const char layoutColumnLayoutToolTip[] = QT_TRANSLATE_NOOP("QmlDesignerContextMenu", "Layout selected items in column layout."); diff --git a/src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp b/src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp index b19e06e45b..629f290026 100644 --- a/src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp +++ b/src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp @@ -359,7 +359,7 @@ bool selectionHasSameParentAndInBaseState(const SelectionContext &context) bool isNotInLayout(const SelectionContext &context) { if (selectionNotEmpty(context)) { - ModelNode selectedModelNode = context.selectedModelNodes().first(); + const ModelNode &selectedModelNode = context.selectedModelNodes().constFirst(); ModelNode parentModelNode; if (selectedModelNode.hasParentProperty()) diff --git a/src/plugins/qmldesigner/components/componentcore/findimplementation.cpp b/src/plugins/qmldesigner/components/componentcore/findimplementation.cpp index 1d88bf56a0..a22a72498f 100644 --- a/src/plugins/qmldesigner/components/componentcore/findimplementation.cpp +++ b/src/plugins/qmldesigner/components/componentcore/findimplementation.cpp @@ -130,7 +130,7 @@ protected: if (m_insideObject) { QStringList stringList = textAt(node->qualifiedId->firstSourceLocation(), node->qualifiedId->lastSourceLocation()).split(QLatin1String(".")); - const QString itemid = stringList.isEmpty() ? QString() : stringList.first(); + const QString itemid = stringList.isEmpty() ? QString() : stringList.constFirst(); if (itemid == m_itemId) { m_implemenations.append(node->statement->firstSourceLocation()); diff --git a/src/plugins/qmldesigner/components/componentcore/layoutingridlayout.cpp b/src/plugins/qmldesigner/components/componentcore/layoutingridlayout.cpp index 39638e3fcb..ed05faba12 100644 --- a/src/plugins/qmldesigner/components/componentcore/layoutingridlayout.cpp +++ b/src/plugins/qmldesigner/components/componentcore/layoutingridlayout.cpp @@ -57,7 +57,7 @@ static int findFirstBigger(const QVector<int> &v, int tolerance) if (v.isEmpty()) return 0; - int last = v.first(); + int last = v.constFirst(); for (int i = 0; i < v.length(); ++i) { if (v.value(i) > last + tolerance) return i; @@ -257,7 +257,7 @@ void LayoutInGridLayout::collectItemNodes() m_qmlItemNodes.append(itemNode); } } - m_parentNode = m_qmlItemNodes.first().instanceParentItem(); + m_parentNode = m_qmlItemNodes.constFirst().instanceParentItem(); } void LayoutInGridLayout::collectOffsets() @@ -287,10 +287,10 @@ void LayoutInGridLayout::sortOffsets() void LayoutInGridLayout::calculateGridOffsets() { if (!m_xTopOffsets.isEmpty()) - m_startX = m_xTopOffsets.first(); + m_startX = m_xTopOffsets.constFirst(); if (!m_yTopOffsets.isEmpty()) - m_startY = m_yTopOffsets.first(); + m_startY = m_yTopOffsets.constFirst(); const int defaultWidthTolerance = 64; const int defaultHeightTolerance = 64; diff --git a/src/plugins/qmldesigner/components/componentcore/modelnodecontextmenu_helper.cpp b/src/plugins/qmldesigner/components/componentcore/modelnodecontextmenu_helper.cpp index e70de03f74..195ce608d4 100644 --- a/src/plugins/qmldesigner/components/componentcore/modelnodecontextmenu_helper.cpp +++ b/src/plugins/qmldesigner/components/componentcore/modelnodecontextmenu_helper.cpp @@ -40,7 +40,7 @@ static inline bool itemsHaveSameParent(const QList<ModelNode> &siblingList) return false; - QmlItemNode item(siblingList.first()); + const QmlItemNode &item = siblingList.constFirst(); if (!item.isValid()) return false; diff --git a/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.cpp b/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.cpp index c3d7d9f43d..85e6774750 100644 --- a/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.cpp +++ b/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.cpp @@ -285,7 +285,7 @@ void setVisible(const SelectionContext &selectionState) return; try { - selectionState.selectedModelNodes().first().variantProperty("visible").setValue(selectionState.toggled()); + selectionState.selectedModelNodes().constFirst().variantProperty("visible").setValue(selectionState.toggled()); } catch (const RewritingException &e) { //better save then sorry e.showException(); } @@ -657,7 +657,7 @@ void addSignalHandlerOrGotoImplementation(const SelectionContext &selectionState { ModelNode modelNode; if (selectionState.singleNodeIsSelected()) - modelNode = selectionState.selectedModelNodes().first(); + modelNode = selectionState.selectedModelNodes().constFirst(); bool isModelNodeRoot = true; @@ -690,7 +690,7 @@ void addSignalHandlerOrGotoImplementation(const SelectionContext &selectionState const QString fileName = currentDesignDocument.toString(); const QString typeName = currentDesignDocument.toFileInfo().baseName(); - QStringList signalNames = cleanSignalNames(getSortedSignalNameList(selectionState.selectedModelNodes().first())); + QStringList signalNames = cleanSignalNames(getSortedSignalNameList(selectionState.selectedModelNodes().constFirst())); QList<QmlJSEditor::FindReferences::Usage> usages = QmlJSEditor::FindReferences::findUsageOfType(fileName, typeName); @@ -701,12 +701,12 @@ void addSignalHandlerOrGotoImplementation(const SelectionContext &selectionState return; } - usages = FindImplementation::run(usages.first().path, typeName, itemId); + usages = FindImplementation::run(usages.constFirst().path, typeName, itemId); Core::ModeManager::activateMode(Core::Constants::MODE_EDIT); if (usages.count() > 0 && (addAlwaysNewSlot || usages.count() < 2) && (!isModelNodeRoot || addAlwaysNewSlot)) { - Core::EditorManager::openEditorAt(usages.first().path, usages.first().line, usages.first().col); + Core::EditorManager::openEditorAt(usages.constFirst().path, usages.constFirst().line, usages.constFirst().col); if (!signalNames.isEmpty()) { AddSignalHandlerDialog *dialog = new AddSignalHandlerDialog(Core::ICore::dialogParent()); @@ -732,7 +732,7 @@ void addSignalHandlerOrGotoImplementation(const SelectionContext &selectionState //Move cursor to correct curser position const QString filePath = Core::EditorManager::currentDocument()->filePath().toString(); QList<QmlJSEditor::FindReferences::Usage> usages = FindImplementation::run(filePath, typeName, itemId); - Core::EditorManager::openEditorAt(filePath, usages.first().line, usages.first().col + 1); + Core::EditorManager::openEditorAt(filePath, usages.constFirst().line, usages.constFirst().col + 1); } ); dialog->show(); @@ -740,7 +740,7 @@ void addSignalHandlerOrGotoImplementation(const SelectionContext &selectionState return; } - Core::EditorManager::openEditorAt(usages.first().path, usages.first().line, usages.first().col + 1); + Core::EditorManager::openEditorAt(usages.constFirst().path, usages.constFirst().line, usages.constFirst().col + 1); } void removeLayout(const SelectionContext &selectionContext) @@ -794,7 +794,7 @@ void moveToComponent(const SelectionContext &selectionContext) { ModelNode modelNode; if (selectionContext.singleNodeIsSelected()) - modelNode = selectionContext.selectedModelNodes().first(); + modelNode = selectionContext.selectedModelNodes().constFirst(); if (modelNode.isValid()) selectionContext.view()->model()->rewriterView()->moveToComponent(modelNode); diff --git a/src/plugins/qmldesigner/components/debugview/debugview.cpp b/src/plugins/qmldesigner/components/debugview/debugview.cpp index 261b7ed978..59afd1172f 100644 --- a/src/plugins/qmldesigner/components/debugview/debugview.cpp +++ b/src/plugins/qmldesigner/components/debugview/debugview.cpp @@ -396,7 +396,7 @@ void DebugView::instancesChildrenChanged(const QVector<ModelNode> & nodeList) void DebugView::customNotification(const AbstractView *view, const QString &identifier, const QList<ModelNode> &nodeList, const QList<QVariant> &data) { if (identifier == "PuppetStatus" && data.count() == 1) { - m_debugViewWidget->setPuppetStatus(data.first().toString()); + m_debugViewWidget->setPuppetStatus(data.constFirst().toString()); } else if (isDebugViewEnabled()) { QTextStream message; diff --git a/src/plugins/qmldesigner/components/formeditor/abstractformeditortool.cpp b/src/plugins/qmldesigner/components/formeditor/abstractformeditortool.cpp index 2cf53f0e79..e4f76d5858 100644 --- a/src/plugins/qmldesigner/components/formeditor/abstractformeditortool.cpp +++ b/src/plugins/qmldesigner/components/formeditor/abstractformeditortool.cpp @@ -265,7 +265,7 @@ void AbstractFormEditorTool::mouseReleaseEvent(const QList<QGraphicsItem*> & ite QmlItemNode currentSelectedNode; if (view()->selectedModelNodes().count() == 1) { - currentSelectedNode = view()->selectedModelNodes().first(); + currentSelectedNode = view()->selectedModelNodes().constFirst(); if (!containsItemNode(itemList, currentSelectedNode)) { QmlItemNode selectedNode; diff --git a/src/plugins/qmldesigner/components/formeditor/anchorindicator.cpp b/src/plugins/qmldesigner/components/formeditor/anchorindicator.cpp index 6d48240b03..6cd4be56f8 100644 --- a/src/plugins/qmldesigner/components/formeditor/anchorindicator.cpp +++ b/src/plugins/qmldesigner/components/formeditor/anchorindicator.cpp @@ -89,7 +89,7 @@ void AnchorIndicator::setItems(const QList<FormEditorItem *> &itemList) clear(); if (itemList.count() == 1) { - m_formEditorItem = itemList.first(); + m_formEditorItem = itemList.constFirst(); QmlItemNode sourceQmlItemNode = m_formEditorItem->qmlItemNode(); if (!sourceQmlItemNode.modelNode().isRootNode()) { QmlAnchors qmlAnchors = sourceQmlItemNode.anchors(); diff --git a/src/plugins/qmldesigner/components/formeditor/bindingindicator.cpp b/src/plugins/qmldesigner/components/formeditor/bindingindicator.cpp index 5bd4fe7453..766458ec59 100644 --- a/src/plugins/qmldesigner/components/formeditor/bindingindicator.cpp +++ b/src/plugins/qmldesigner/components/formeditor/bindingindicator.cpp @@ -116,7 +116,7 @@ void BindingIndicator::setItems(const QList<FormEditorItem *> &itemList) clear(); if (itemList.count() == 1) { - m_formEditorItem = itemList.first(); + m_formEditorItem = itemList.constFirst(); const QmlItemNode qmlItemNode = m_formEditorItem->qmlItemNode(); if (qmlItemNode.hasBindingProperty("x")) { diff --git a/src/plugins/qmldesigner/components/formeditor/formeditorscene.cpp b/src/plugins/qmldesigner/components/formeditor/formeditorscene.cpp index be6437c898..b9cba15c9e 100644 --- a/src/plugins/qmldesigner/components/formeditor/formeditorscene.cpp +++ b/src/plugins/qmldesigner/components/formeditor/formeditorscene.cpp @@ -200,8 +200,8 @@ void FormEditorScene::dropEvent(QGraphicsSceneDragDropEvent * event) { currentTool()->dropEvent(removeLayerItems(itemsAt(event->scenePos())), event); - if (views().first()) - views().first()->setFocus(); + if (views().constFirst()) + views().constFirst()->setFocus(); } void FormEditorScene::dragEnterEvent(QGraphicsSceneDragDropEvent * event) @@ -237,7 +237,7 @@ QList<QGraphicsItem *> FormEditorScene::itemsAt(const QPointF &pos) QTransform transform; if (!views().isEmpty()) - transform = views().first()->transform(); + transform = views().constFirst()->transform(); return items(pos, Qt::IntersectsItemShape, diff --git a/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp b/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp index 1956dadb34..fad8a6817b 100644 --- a/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp +++ b/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp @@ -397,7 +397,7 @@ void FormEditorView::changeToCustomTool() int handlingRank = 0; AbstractCustomTool *selectedCustomTool = 0; - ModelNode selectedModelNode = selectedModelNodes().first(); + const ModelNode &selectedModelNode = selectedModelNodes().constFirst(); foreach (AbstractCustomTool *customTool, m_customToolList) { if (customTool->wantHandleItem(selectedModelNode) > handlingRank) { diff --git a/src/plugins/qmldesigner/components/formeditor/movemanipulator.cpp b/src/plugins/qmldesigner/components/formeditor/movemanipulator.cpp index d55f85090f..57a280d72b 100644 --- a/src/plugins/qmldesigner/components/formeditor/movemanipulator.cpp +++ b/src/plugins/qmldesigner/components/formeditor/movemanipulator.cpp @@ -75,10 +75,10 @@ void MoveManipulator::setItems(const QList<FormEditorItem*> &itemList) { m_itemList = itemList; if (!m_itemList.isEmpty()) { - if (m_itemList.first()->parentItem()) - m_snapper.setContainerFormEditorItem(m_itemList.first()->parentItem()); + if (m_itemList.constFirst()->parentItem()) + m_snapper.setContainerFormEditorItem(m_itemList.constFirst()->parentItem()); else - m_snapper.setContainerFormEditorItem(m_itemList.first()); + m_snapper.setContainerFormEditorItem(m_itemList.constFirst()); m_snapper.setTransformtionSpaceFormEditorItem(m_snapper.containerFormEditorItem()); } } @@ -105,8 +105,8 @@ void MoveManipulator::synchronizeParent(const QList<FormEditorItem*> &itemList, void MoveManipulator::synchronizeInstanceParent(const QList<FormEditorItem*> &itemList) { - if (m_view->model() && !m_itemList.isEmpty() && m_itemList.first()->qmlItemNode().hasInstanceParent()) - synchronizeParent(itemList, m_itemList.first()->qmlItemNode().instanceParent()); + if (m_view->model() && !m_itemList.isEmpty() && m_itemList.constFirst()->qmlItemNode().hasInstanceParent()) + synchronizeParent(itemList, m_itemList.constFirst()->qmlItemNode().instanceParent()); } bool MoveManipulator::itemsCanReparented() const diff --git a/src/plugins/qmldesigner/components/formeditor/movetool.cpp b/src/plugins/qmldesigner/components/formeditor/movetool.cpp index b779216d61..4978c37026 100644 --- a/src/plugins/qmldesigner/components/formeditor/movetool.cpp +++ b/src/plugins/qmldesigner/components/formeditor/movetool.cpp @@ -106,10 +106,10 @@ void MoveTool::mouseMoveEvent(const QList<QGraphicsItem*> &itemList, FormEditorItem *containerItem = containerFormEditorItem(itemList, m_movingItems); if (containerItem && view()->currentState().isBaseState()) { - if (containerItem != m_movingItems.first()->parentItem() + if (containerItem != m_movingItems.constFirst()->parentItem() && event->modifiers().testFlag(Qt::ShiftModifier)) { - FormEditorItem *movingItem = m_movingItems.first(); + const FormEditorItem *movingItem = m_movingItems.constFirst(); if (m_movingItems.count() > 1 || (movingItem->qmlItemNode().canBereparentedTo(containerItem->qmlItemNode()))) @@ -129,7 +129,7 @@ void MoveTool::hoverMoveEvent(const QList<QGraphicsItem*> &itemList, return; } - ResizeHandleItem* resizeHandle = ResizeHandleItem::fromGraphicsItem(itemList.first()); + ResizeHandleItem* resizeHandle = ResizeHandleItem::fromGraphicsItem(itemList.constFirst()); if (resizeHandle) { view()->changeToResizeTool(); return; @@ -289,7 +289,7 @@ bool MoveTool::haveSameParent(const QList<FormEditorItem*> &itemList) if (itemList.isEmpty()) return false; - QGraphicsItem *firstParent = itemList.first()->parentItem(); + QGraphicsItem *firstParent = itemList.constFirst()->parentItem(); foreach (FormEditorItem* item, itemList) { if (firstParent != item->parentItem()) diff --git a/src/plugins/qmldesigner/components/formeditor/onedimensionalcluster.cpp b/src/plugins/qmldesigner/components/formeditor/onedimensionalcluster.cpp index 864ae64b76..aee6bba6dc 100644 --- a/src/plugins/qmldesigner/components/formeditor/onedimensionalcluster.cpp +++ b/src/plugins/qmldesigner/components/formeditor/onedimensionalcluster.cpp @@ -53,17 +53,17 @@ double OneDimensionalCluster::mean() const if (m_coordinateList.size() == 1) { - return m_coordinateList.first(); + return m_coordinateList.constFirst(); } return sum(m_coordinateList) / m_coordinateList.size(); } -double OneDimensionalCluster::first() const +double OneDimensionalCluster::constFirst() const { Q_ASSERT(!m_coordinateList.isEmpty()); - return m_coordinateList.first(); + return m_coordinateList.constFirst(); } QList<OneDimensionalCluster> OneDimensionalCluster::createOneDimensionalClusterList(const QList<double> & oneDimensionalCoordinateList) @@ -136,7 +136,7 @@ QList<double> OneDimensionalCluster::reduceLines(const QList<double> & oneDimens QList<double> lineList; foreach (const OneDimensionalCluster &cluster, clusterList) - lineList.append(cluster.first()); + lineList.append(cluster.constFirst()); return lineList; } diff --git a/src/plugins/qmldesigner/components/formeditor/onedimensionalcluster.h b/src/plugins/qmldesigner/components/formeditor/onedimensionalcluster.h index 83b9397629..5c5b184288 100644 --- a/src/plugins/qmldesigner/components/formeditor/onedimensionalcluster.h +++ b/src/plugins/qmldesigner/components/formeditor/onedimensionalcluster.h @@ -39,7 +39,7 @@ private: OneDimensionalCluster(const QList<double> & coordinateList ); double mean() const; - double first() const; + double constFirst() const; static QList<OneDimensionalCluster> createOneDimensionalClusterList(const QList<double> & oneDimensionalCoordinateList); static QList<OneDimensionalCluster> reduceOneDimensionalClusterList(const QList<OneDimensionalCluster> & unreducedClusterList, double maximumDistance); diff --git a/src/plugins/qmldesigner/components/formeditor/resizetool.cpp b/src/plugins/qmldesigner/components/formeditor/resizetool.cpp index c9e8a977fd..96b960867c 100644 --- a/src/plugins/qmldesigner/components/formeditor/resizetool.cpp +++ b/src/plugins/qmldesigner/components/formeditor/resizetool.cpp @@ -58,7 +58,7 @@ void ResizeTool::mousePressEvent(const QList<QGraphicsItem*> &itemList, if (itemList.isEmpty()) return; - ResizeHandleItem *resizeHandle = ResizeHandleItem::fromGraphicsItem(itemList.first()); + ResizeHandleItem *resizeHandle = ResizeHandleItem::fromGraphicsItem(itemList.constFirst()); if (resizeHandle && resizeHandle->resizeController().isValid()) { m_resizeManipulator.setHandle(resizeHandle); m_resizeManipulator.begin(event->scenePos()); @@ -85,7 +85,7 @@ void ResizeTool::hoverMoveEvent(const QList<QGraphicsItem*> &itemList, return; } - ResizeHandleItem* resizeHandle = ResizeHandleItem::fromGraphicsItem(itemList.first()); + ResizeHandleItem* resizeHandle = ResizeHandleItem::fromGraphicsItem(itemList.constFirst()); if (resizeHandle && resizeHandle->resizeController().isValid()) { m_resizeManipulator.setHandle(resizeHandle); } else { diff --git a/src/plugins/qmldesigner/components/formeditor/selectionindicator.cpp b/src/plugins/qmldesigner/components/formeditor/selectionindicator.cpp index c1b26877ad..b9cbd74bba 100644 --- a/src/plugins/qmldesigner/components/formeditor/selectionindicator.cpp +++ b/src/plugins/qmldesigner/components/formeditor/selectionindicator.cpp @@ -82,8 +82,8 @@ static QPolygonF boundingRectInLayerItemSpaceForItem(FormEditorItem *item, QGrap static bool checkSingleSelection(const QList<FormEditorItem*> &itemList) { return !itemList.isEmpty() - && itemList.first() - && itemList.first()->qmlItemNode().view()->singleSelectedModelNode().isValid(); + && itemList.constFirst() + && itemList.constFirst()->qmlItemNode().view()->singleSelectedModelNode().isValid(); } const int labelHeight = 16; @@ -112,7 +112,7 @@ void SelectionIndicator::setItems(const QList<FormEditorItem*> &itemList) } if (checkSingleSelection(itemList)) { - FormEditorItem *selectedItem = itemList.first(); + FormEditorItem *selectedItem = itemList.constFirst(); m_labelItem.reset(new QGraphicsPolygonItem(m_layerItem.data())); QGraphicsWidget *toolbar = DesignerActionManager::instance().createFormEditorToolBar(m_labelItem.get()); @@ -161,7 +161,7 @@ void SelectionIndicator::updateItems(const QList<FormEditorItem*> &itemList) if (checkSingleSelection(itemList) && m_labelItem) { - FormEditorItem *selectedItem = itemList.first(); + FormEditorItem *selectedItem = itemList.constFirst(); QPolygonF labelPolygon = boundingRectInLayerItemSpaceForItem(selectedItem, m_layerItem.data()); QRectF labelRect = labelPolygon.boundingRect(); QPointF pos = labelRect.topLeft(); diff --git a/src/plugins/qmldesigner/components/formeditor/selectiontool.cpp b/src/plugins/qmldesigner/components/formeditor/selectiontool.cpp index 559cec498e..52bcae4ff5 100644 --- a/src/plugins/qmldesigner/components/formeditor/selectiontool.cpp +++ b/src/plugins/qmldesigner/components/formeditor/selectiontool.cpp @@ -126,7 +126,7 @@ void SelectionTool::hoverMoveEvent(const QList<QGraphicsItem*> &itemList, { if (!itemList.isEmpty()) { - ResizeHandleItem* resizeHandle = ResizeHandleItem::fromGraphicsItem(itemList.first()); + ResizeHandleItem* resizeHandle = ResizeHandleItem::fromGraphicsItem(itemList.constFirst()); if (resizeHandle) { view()->changeToResizeTool(); return; diff --git a/src/plugins/qmldesigner/components/formeditor/snapper.cpp b/src/plugins/qmldesigner/components/formeditor/snapper.cpp index 5b8e02a288..7a11b6c7e3 100644 --- a/src/plugins/qmldesigner/components/formeditor/snapper.cpp +++ b/src/plugins/qmldesigner/components/formeditor/snapper.cpp @@ -449,7 +449,7 @@ double Snapper::snappingDistance() const static QLineF mergedHorizontalLine(const QList<QLineF> &lineList) { if (lineList.count() == 1) - return lineList.first(); + return lineList.constFirst(); double minimumX = std::numeric_limits<double>::max(); double maximumX = std::numeric_limits<double>::min(); @@ -460,14 +460,14 @@ static QLineF mergedHorizontalLine(const QList<QLineF> &lineList) maximumX = qMax(maximumX, double(line.x2())); } - double y(lineList.first().y1()); + double y(lineList.constFirst().y1()); return QLineF(minimumX, y, maximumX, y); } static QLineF mergedVerticalLine(const QList<QLineF> &lineList) { if (lineList.count() == 1) - return lineList.first(); + return lineList.constFirst(); double minimumY = std::numeric_limits<double>::max(); double maximumY = std::numeric_limits<double>::min(); @@ -478,7 +478,7 @@ static QLineF mergedVerticalLine(const QList<QLineF> &lineList) maximumY = qMax(maximumY, double(line.y2())); } - double x(lineList.first().x1()); + double x(lineList.constFirst().x1()); return QLineF(x, minimumY, x, maximumY); } diff --git a/src/plugins/qmldesigner/components/integration/designdocument.cpp b/src/plugins/qmldesigner/components/integration/designdocument.cpp index 068915d13c..9a7aa73676 100644 --- a/src/plugins/qmldesigner/components/integration/designdocument.cpp +++ b/src/plugins/qmldesigner/components/integration/designdocument.cpp @@ -450,7 +450,7 @@ void DesignDocument::paste() ModelNode targetNode; if (!view.selectedModelNodes().isEmpty()) - targetNode = view.selectedModelNodes().first(); + targetNode = view.selectedModelNodes().constFirst(); //In case we copy and paste a selection we paste in the parent item if ((view.selectedModelNodes().count() == selectedNodes.count()) && targetNode.isValid() && targetNode.hasParentProperty()) @@ -495,7 +495,7 @@ void DesignDocument::paste() ModelNode targetNode; if (!view.selectedModelNodes().isEmpty()) - targetNode = view.selectedModelNodes().first(); + targetNode = view.selectedModelNodes().constFirst(); if (!targetNode.isValid()) targetNode = view.rootModelNode(); diff --git a/src/plugins/qmldesigner/components/integration/designdocumentview.cpp b/src/plugins/qmldesigner/components/integration/designdocumentview.cpp index b371fe3fe6..89d27cd5f0 100644 --- a/src/plugins/qmldesigner/components/integration/designdocumentview.cpp +++ b/src/plugins/qmldesigner/components/integration/designdocumentview.cpp @@ -219,7 +219,7 @@ void DesignDocumentView::copyModelNodes(const QList<ModelNode> &nodesToCopy) copyModel->attachView(&view); if (selectedNodes.count() == 1) { - ModelNode selectedNode(selectedNodes.first()); + const ModelNode &selectedNode = selectedNodes.constFirst(); if (!selectedNode.isValid()) return; diff --git a/src/plugins/qmldesigner/components/navigator/navigatorview.cpp b/src/plugins/qmldesigner/components/navigator/navigatorview.cpp index a90800d76f..8b81df3355 100644 --- a/src/plugins/qmldesigner/components/navigator/navigatorview.cpp +++ b/src/plugins/qmldesigner/components/navigator/navigatorview.cpp @@ -454,7 +454,7 @@ void NavigatorView::updateItemSelection() blockSelectionChangedSignal(blocked); if (!selectedModelNodes().isEmpty()) - treeWidget()->scrollTo(indexForModelNode(selectedModelNodes().first())); + treeWidget()->scrollTo(indexForModelNode(selectedModelNodes().constFirst())); // make sure selected nodes a visible foreach (const QModelIndex &selectedIndex, itemSelection.indexes()) { diff --git a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorcontextobject.cpp b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorcontextobject.cpp index 832e733872..6966bfe187 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorcontextobject.cpp +++ b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorcontextobject.cpp @@ -145,7 +145,7 @@ void PropertyEditorContextObject::toogleExportAlias() if (rewriterView->selectedModelNodes().isEmpty()) return; - ModelNode selectedNode = rewriterView->selectedModelNodes().first(); + const ModelNode &selectedNode = rewriterView->selectedModelNodes().constFirst(); if (QmlObjectNode::isValidQmlObjectNode(selectedNode)) { QmlObjectNode objectNode(selectedNode); @@ -184,7 +184,7 @@ void PropertyEditorContextObject::changeTypeName(const QString &typeName) if (rewriterView->selectedModelNodes().isEmpty()) return; - ModelNode selectedNode = rewriterView->selectedModelNodes().first(); + ModelNode selectedNode = rewriterView->selectedModelNodes().constFirst(); try { RewriterTransaction transaction = diff --git a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorqmlbackend.cpp b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorqmlbackend.cpp index a8e2b42e59..7c6435a1b8 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorqmlbackend.cpp +++ b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorqmlbackend.cpp @@ -550,12 +550,12 @@ QString PropertyEditorQmlBackend::locateQmlFile(const NodeMetaInfo &info, const //Check for qml files with versions first - const QString withoutDir = relativePath.split(QStringLiteral("/")).last(); + const QString withoutDir = relativePath.split(QStringLiteral("/")).constLast(); if (importDirVersion.exists(withoutDir)) return importDirVersion.absoluteFilePath(withoutDir); - const QString withoutDirWithVersion = relativePathWithVersion.split(QStringLiteral("/")).last(); + const QString withoutDirWithVersion = relativePathWithVersion.split(QStringLiteral("/")).constLast(); const QStringList possiblePaths = { importDir.absoluteFilePath(relativePathWithVersion), diff --git a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorview.cpp b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorview.cpp index 4cad2d08cc..63e415f1b9 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorview.cpp +++ b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorview.cpp @@ -510,8 +510,8 @@ void PropertyEditorView::selectedNodesChanged(const QList<ModelNode> &selectedNo if (selectedNodeList.isEmpty() || selectedNodeList.count() > 1) select(ModelNode()); - else if (m_selectedNode != selectedNodeList.first()) - select(selectedNodeList.first()); + else if (m_selectedNode != selectedNodeList.constFirst()) + select(selectedNodeList.constFirst()); } void PropertyEditorView::nodeAboutToBeRemoved(const ModelNode &removedNode) diff --git a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorview.h b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorview.h index b9028aad3d..316164f4c2 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorview.h +++ b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorview.h @@ -44,6 +44,7 @@ class CollapseButton; class PropertyEditorWidget; class PropertyEditorView; class PropertyEditorQmlBackend; +class ModelNode; class PropertyEditorView: public AbstractView { @@ -66,8 +67,6 @@ public: void modelAboutToBeDetached(Model *model) override; - ModelState modelState() const; - void variantPropertiesChanged(const QList<VariantProperty>& propertyList, PropertyChangeFlags propertyChange) override; void bindingPropertiesChanged(const QList<BindingProperty>& propertyList, PropertyChangeFlags propertyChange) override; diff --git a/src/plugins/qmldesigner/components/stateseditor/stateseditorimageprovider.cpp b/src/plugins/qmldesigner/components/stateseditor/stateseditorimageprovider.cpp index 36b3794fd2..ec434abb59 100644 --- a/src/plugins/qmldesigner/components/stateseditor/stateseditorimageprovider.cpp +++ b/src/plugins/qmldesigner/components/stateseditor/stateseditorimageprovider.cpp @@ -43,7 +43,7 @@ QImage StatesEditorImageProvider::requestImage(const QString &id, QSize *size, c bool nodeInstanceViewIsDetached = m_nodeInstanceView.isNull() || !m_nodeInstanceView->model(); if (!nodeInstanceViewIsDetached) { - QString imageId = id.split(QLatin1Char('-')).first(); + QString imageId = id.split(QLatin1Char('-')).constFirst(); if (imageId == QLatin1String("baseState")) { image = m_nodeInstanceView->statePreviewImage(m_nodeInstanceView->rootModelNode()); } else { diff --git a/src/plugins/qmldesigner/components/stateseditor/stateseditorwidget.h b/src/plugins/qmldesigner/components/stateseditor/stateseditorwidget.h index 231f4bfb43..8455ec6310 100644 --- a/src/plugins/qmldesigner/components/stateseditor/stateseditorwidget.h +++ b/src/plugins/qmldesigner/components/stateseditor/stateseditorwidget.h @@ -35,8 +35,6 @@ QT_END_NAMESPACE namespace QmlDesigner { -class Model; -class ModelState; class StatesEditorModel; class StatesEditorView; class NodeInstanceView; diff --git a/src/plugins/qmldesigner/components/texteditor/texteditorview.cpp b/src/plugins/qmldesigner/components/texteditor/texteditorview.cpp index 495f6762ca..a5c4441e6e 100644 --- a/src/plugins/qmldesigner/components/texteditor/texteditorview.cpp +++ b/src/plugins/qmldesigner/components/texteditor/texteditorview.cpp @@ -186,7 +186,7 @@ void TextEditorView::documentMessagesChanged(const QList<DocumentMessage> &error if (errors.isEmpty()) { m_widget->clearStatusBar(); } else { - const DocumentMessage error = errors.first(); + const DocumentMessage &error = errors.constFirst(); m_widget->setStatusText(QString("%1 (Line: %2)").arg(error.description()).arg(error.line())); } } diff --git a/src/plugins/qmldesigner/components/texteditor/texteditorwidget.cpp b/src/plugins/qmldesigner/components/texteditor/texteditorwidget.cpp index 8c0e715ba9..4cf464d4e7 100644 --- a/src/plugins/qmldesigner/components/texteditor/texteditorwidget.cpp +++ b/src/plugins/qmldesigner/components/texteditor/texteditorwidget.cpp @@ -126,7 +126,7 @@ void TextEditorWidget::jumpTextCursorToSelectedModelNode() return; if (!m_textEditorView->selectedModelNodes().isEmpty()) - selectedNode = m_textEditorView->selectedModelNodes().first(); + selectedNode = m_textEditorView->selectedModelNodes().constFirst(); if (selectedNode.isValid()) { RewriterView *rewriterView = m_textEditorView->model()->rewriterView(); diff --git a/src/plugins/qmldesigner/designercore/filemanager/qmlrefactoring.cpp b/src/plugins/qmldesigner/designercore/filemanager/qmlrefactoring.cpp index a2b4c9b3fc..809fe37ed4 100644 --- a/src/plugins/qmldesigner/designercore/filemanager/qmlrefactoring.cpp +++ b/src/plugins/qmldesigner/designercore/filemanager/qmlrefactoring.cpp @@ -66,7 +66,7 @@ bool QmlRefactoring::reparseDocument() qDebug() << "*** QML text:" << textModifier->text(); QString errorMessage = QStringLiteral("Parsing Error"); if (!tmpDocument->diagnosticMessages().isEmpty()) - errorMessage = tmpDocument->diagnosticMessages().first().message; + errorMessage = tmpDocument->diagnosticMessages().constFirst().message; qDebug() << "*** " << errorMessage; return false; diff --git a/src/plugins/qmldesigner/designercore/include/abstractproperty.h b/src/plugins/qmldesigner/designercore/include/abstractproperty.h index b3e1c16413..65f3f666be 100644 --- a/src/plugins/qmldesigner/designercore/include/abstractproperty.h +++ b/src/plugins/qmldesigner/designercore/include/abstractproperty.h @@ -108,6 +108,7 @@ protected: AbstractProperty(const PropertyName &propertyName, const Internal::InternalNodePointer &internalNode, Model* model, AbstractView *view); AbstractProperty(const Internal::InternalPropertyPointer &property, Model* model, AbstractView *view); Internal::InternalNodePointer internalNode() const; + Internal::ModelPrivate *privateModel() const; private: PropertyName m_propertyName; diff --git a/src/plugins/qmldesigner/designercore/include/forwardview.h b/src/plugins/qmldesigner/designercore/include/forwardview.h index b34cd107e9..d317bec793 100644 --- a/src/plugins/qmldesigner/designercore/include/forwardview.h +++ b/src/plugins/qmldesigner/designercore/include/forwardview.h @@ -280,7 +280,7 @@ ViewType *ForwardView<ViewType>::firstView() const if (m_targetViewList.isEmpty()) return 0; - return m_targetViewList.first().data(); + return m_targetViewList.constFirst().data(); } diff --git a/src/plugins/qmldesigner/designercore/include/model.h b/src/plugins/qmldesigner/designercore/include/model.h index b3a146b174..d5f16be0ed 100644 --- a/src/plugins/qmldesigner/designercore/include/model.h +++ b/src/plugins/qmldesigner/designercore/include/model.h @@ -40,7 +40,10 @@ QT_END_NAMESPACE namespace QmlDesigner { -namespace Internal { class ModelPrivate; } +namespace Internal { +class ModelPrivate; +class WriteLocker; +} //Internal class AnchorLine; class ModelNode; @@ -61,12 +64,10 @@ typedef QList<QPair<PropertyName, QVariant> > PropertyListType; class QMLDESIGNERCORE_EXPORT Model : public QObject { friend class QmlDesigner::ModelNode; - friend class QmlDesigner::NodeState; - friend class QmlDesigner::ModelState; - friend class QmlDesigner::NodeAnchors; friend class QmlDesigner::AbstractProperty; friend class QmlDesigner::AbstractView; friend class Internal::ModelPrivate; + friend class Internal::WriteLocker; Q_OBJECT @@ -116,7 +117,7 @@ public: protected: Model(); -public: +private: Internal::ModelPrivate *d; }; diff --git a/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp b/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp index 197c7d5064..823f966d8c 100644 --- a/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp +++ b/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp @@ -881,8 +881,8 @@ CreateSceneCommand NodeInstanceView::createCreateSceneCommand() if (versionString.contains(QStringLiteral("."))) { const QStringList splittedString = versionString.split(QStringLiteral(".")); - majorVersion = splittedString.first().toInt(); - minorVersion = splittedString.last().toInt(); + majorVersion = splittedString.constFirst().toInt(); + minorVersion = splittedString.constLast().toInt(); } bool isItem = false; diff --git a/src/plugins/qmldesigner/designercore/instances/puppetcreator.cpp b/src/plugins/qmldesigner/designercore/instances/puppetcreator.cpp index 2b9092e286..6efc88a7b8 100644 --- a/src/plugins/qmldesigner/designercore/instances/puppetcreator.cpp +++ b/src/plugins/qmldesigner/designercore/instances/puppetcreator.cpp @@ -227,7 +227,7 @@ QProcess *PuppetCreator::puppetProcess(const QString &puppetPath, #endif if (debugPuppet == puppetMode || debugPuppet == "all") { QMessageBox::information(Core::ICore::dialogParent(), - QCoreApplication::translate("PuppetCreator", "Puppet is starting ..."), + QCoreApplication::translate("PuppetCreator", "Puppet is starting..."), QCoreApplication::translate("PuppetCreator", "You can now attach your debugger to the %1 puppet with process id: %2.") .arg(puppetMode, QString::number(puppetProcess->processId()))); } diff --git a/src/plugins/qmldesigner/designercore/metainfo/metainforeader.cpp b/src/plugins/qmldesigner/designercore/metainfo/metainforeader.cpp index d2d906e665..1caff4817e 100644 --- a/src/plugins/qmldesigner/designercore/metainfo/metainforeader.cpp +++ b/src/plugins/qmldesigner/designercore/metainfo/metainforeader.cpp @@ -278,9 +278,9 @@ void MetaInfoReader::setVersion(const QString &versionNumber) int val; bool ok; if (versionNumber.contains(QLatin1Char('.'))) { - val = versionNumber.split(QLatin1Char('.')).first().toInt(&ok); + val = versionNumber.split(QLatin1Char('.')).constFirst().toInt(&ok); major = ok ? val : major; - val = versionNumber.split(QLatin1Char('.')).last().toInt(&ok); + val = versionNumber.split(QLatin1Char('.')).constLast().toInt(&ok); minor = ok ? val : minor; } else { val = versionNumber.toInt(&ok); diff --git a/src/plugins/qmldesigner/designercore/metainfo/nodehints.cpp b/src/plugins/qmldesigner/designercore/metainfo/nodehints.cpp index 209754d125..1a38b0a631 100644 --- a/src/plugins/qmldesigner/designercore/metainfo/nodehints.cpp +++ b/src/plugins/qmldesigner/designercore/metainfo/nodehints.cpp @@ -96,7 +96,7 @@ QmlDesigner::NodeHints::NodeHints(const ModelNode &node) : m_modelNode(node) modelNode().type(), modelNode().majorVersion(), modelNode().minorVersion()); if (!itemLibraryEntryList.isEmpty()) - m_hints = itemLibraryEntryList.first().hints(); + m_hints = itemLibraryEntryList.constFirst().hints(); } } diff --git a/src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp b/src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp index f5bb5d1ba6..46801cf0e0 100644 --- a/src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp +++ b/src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp @@ -709,7 +709,7 @@ NodeMetaInfoPrivate::NodeMetaInfoPrivate(Model *model, TypeName type, int maj, i } else { m_isFileComponent = true; const Imports *imports = context()->imports(document()); - ImportInfo importInfo = imports->info(lookupNameComponent().last(), context().data()); + ImportInfo importInfo = imports->info(lookupNameComponent().constLast(), context().data()); if (importInfo.isValid() && importInfo.type() == ImportType::Library) { m_majorVersion = importInfo.version().majorVersion(); m_minorVersion = importInfo.version().minorVersion(); @@ -729,7 +729,7 @@ const CppComponentValue *NodeMetaInfoPrivate::getCppComponentValue() const const QList<TypeName> nameComponents = m_qualfiedTypeName.split('.'); if (nameComponents.size() < 2) return 0; - const TypeName type = nameComponents.last(); + const TypeName &type = nameComponents.constLast(); TypeName module; for (int i = 0; i < nameComponents.size() - 1; ++i) { @@ -821,8 +821,8 @@ bool NodeMetaInfoPrivate::isPropertyWritable(const PropertyName &propertyName) c if (propertyName.contains('.')) { const PropertyNameList parts = propertyName.split('.'); - const PropertyName objectName = parts.first(); - const PropertyName rawPropertyName = parts.last(); + const PropertyName &objectName = parts.constFirst(); + const PropertyName &rawPropertyName = parts.constLast(); const TypeName objectType = propertyType(objectName); if (isValueType(objectType)) @@ -854,8 +854,8 @@ bool NodeMetaInfoPrivate::isPropertyList(const PropertyName &propertyName) const if (propertyName.contains('.')) { const PropertyNameList parts = propertyName.split('.'); - const PropertyName objectName = parts.first(); - const PropertyName rawPropertyName = parts.last(); + const PropertyName &objectName = parts.constFirst(); + const PropertyName &rawPropertyName = parts.constLast(); const TypeName objectType = propertyType(objectName); if (isValueType(objectType)) @@ -883,8 +883,8 @@ bool NodeMetaInfoPrivate::isPropertyPointer(const PropertyName &propertyName) co if (propertyName.contains('.')) { const PropertyNameList parts = propertyName.split('.'); - const PropertyName objectName = parts.first(); - const PropertyName rawPropertyName = parts.last(); + const PropertyName &objectName = parts.constFirst(); + const PropertyName &rawPropertyName = parts.constLast(); const TypeName objectType = propertyType(objectName); if (isValueType(objectType)) @@ -915,8 +915,8 @@ bool NodeMetaInfoPrivate::isPropertyEnum(const PropertyName &propertyName) const if (propertyName.contains('.')) { const PropertyNameList parts = propertyName.split('.'); - const PropertyName objectName = parts.first(); - const PropertyName rawPropertyName = parts.last(); + const PropertyName &objectName = parts.constFirst(); + const PropertyName &rawPropertyName = parts.constLast(); const TypeName objectType = propertyType(objectName); if (isValueType(objectType)) @@ -947,8 +947,8 @@ QString NodeMetaInfoPrivate::propertyEnumScope(const PropertyName &propertyName) if (propertyName.contains('.')) { const PropertyNameList parts = propertyName.split('.'); - const PropertyName objectName = parts.first(); - const PropertyName rawPropertyName = parts.last(); + const PropertyName &objectName = parts.constFirst(); + const PropertyName &rawPropertyName = parts.constLast(); const TypeName objectType = propertyType(objectName); if (isValueType(objectType)) @@ -989,7 +989,7 @@ static QByteArray getUnqualifiedName(const QByteArray &name) const QList<QByteArray> nameComponents = name.split('.'); if (nameComponents.size() < 2) return name; - return nameComponents.last(); + return nameComponents.constLast(); } static QByteArray getPackage(const QByteArray &name) @@ -1138,7 +1138,7 @@ QString NodeMetaInfoPrivate::importDirectoryPath() const if (isValid()) { const Imports *imports = context()->imports(document()); - ImportInfo importInfo = imports->info(lookupNameComponent().last(), context().data()); + ImportInfo importInfo = imports->info(lookupNameComponent().constLast(), context().data()); if (importInfo.type() == ImportType::Directory) { return importInfo.path(); diff --git a/src/plugins/qmldesigner/designercore/metainfo/subcomponentmanager.cpp b/src/plugins/qmldesigner/designercore/metainfo/subcomponentmanager.cpp index 9dfd1b3dc1..db1d9f9f27 100644 --- a/src/plugins/qmldesigner/designercore/metainfo/subcomponentmanager.cpp +++ b/src/plugins/qmldesigner/designercore/metainfo/subcomponentmanager.cpp @@ -152,7 +152,7 @@ void SubComponentManager::parseDirectories() parseDirectory(dirInfo.canonicalFilePath(), false); } - QString fullUrlVersion = path + QLatin1Char('/') + url + QLatin1Char('.') + import.version().split(".").first(); + QString fullUrlVersion = path + QLatin1Char('/') + url + QLatin1Char('.') + import.version().split(".").constFirst(); dirInfo = QFileInfo(fullUrlVersion); if (dirInfo.exists() && dirInfo.isDir()) { diff --git a/src/plugins/qmldesigner/designercore/model/abstractproperty.cpp b/src/plugins/qmldesigner/designercore/model/abstractproperty.cpp index fa5595a420..40a9d75776 100644 --- a/src/plugins/qmldesigner/designercore/model/abstractproperty.cpp +++ b/src/plugins/qmldesigner/designercore/model/abstractproperty.cpp @@ -106,6 +106,11 @@ Internal::InternalNodePointer AbstractProperty::internalNode() const return m_internalNode; } +Internal::ModelPrivate *AbstractProperty::privateModel() const +{ + return m_model ? m_model->d : nullptr; +} + Model *AbstractProperty::model() const { return m_model.data(); diff --git a/src/plugins/qmldesigner/designercore/model/abstractview.cpp b/src/plugins/qmldesigner/designercore/model/abstractview.cpp index 1649a17a4a..e245c060fa 100644 --- a/src/plugins/qmldesigner/designercore/model/abstractview.cpp +++ b/src/plugins/qmldesigner/designercore/model/abstractview.cpp @@ -437,7 +437,7 @@ QList<ModelNode> AbstractView::selectedModelNodes() const ModelNode AbstractView::firstSelectedModelNode() const { if (hasSelectedModelNodes()) - return ModelNode(model()->d->selectedNodes().first(), model(), this); + return ModelNode(model()->d->selectedNodes().constFirst(), model(), this); return ModelNode(); } @@ -445,7 +445,7 @@ ModelNode AbstractView::firstSelectedModelNode() const ModelNode AbstractView::singleSelectedModelNode() const { if (hasSingleSelectedModelNode()) - return ModelNode(model()->d->selectedNodes().first(), model(), this); + return ModelNode(model()->d->selectedNodes().constFirst(), model(), this); return ModelNode(); } @@ -725,7 +725,7 @@ static int getMinorVersionFromImport(const Model *model) if (import.isLibraryImport() && import.url() == "QtQuick") { const QString versionString = import.version(); if (versionString.contains(".")) { - const QString minorVersionString = versionString.split(".").last(); + const QString minorVersionString = versionString.split(".").constLast(); return minorVersionString.toInt(); } } @@ -740,7 +740,7 @@ static int getMajorVersionFromImport(const Model *model) if (import.isLibraryImport() && import.url() == QStringLiteral("QtQuick")) { const QString versionString = import.version(); if (versionString.contains(QStringLiteral("."))) { - const QString majorVersionString = versionString.split(QStringLiteral(".")).first(); + const QString majorVersionString = versionString.split(QStringLiteral(".")).constFirst(); return majorVersionString.toInt(); } } diff --git a/src/plugins/qmldesigner/designercore/model/bindingproperty.cpp b/src/plugins/qmldesigner/designercore/model/bindingproperty.cpp index 018075da66..fe8ebe1729 100644 --- a/src/plugins/qmldesigner/designercore/model/bindingproperty.cpp +++ b/src/plugins/qmldesigner/designercore/model/bindingproperty.cpp @@ -84,9 +84,9 @@ void BindingProperty::setExpression(const QString &expression) } if (internalNode()->hasProperty(name()) && !internalNode()->property(name())->isBindingProperty()) - model()->d->removeProperty(internalNode()->property(name())); + privateModel()->removeProperty(internalNode()->property(name())); - model()->d->setBindingProperty(internalNode(), name(), expression); + privateModel()->setBindingProperty(internalNode(), name(), expression); } QString BindingProperty::expression() const @@ -161,7 +161,7 @@ AbstractProperty BindingProperty::resolveToProperty() const ModelNode node = parentModelNode(); QString element; if (binding.contains(QLatin1Char('.'))) { - element = binding.split(QLatin1Char('.')).last(); + element = binding.split(QLatin1Char('.')).constLast(); QString nodeBinding = binding; nodeBinding.chop(element.length()); node = resolveBinding(nodeBinding, parentModelNode(), view()); @@ -239,9 +239,9 @@ void BindingProperty::setDynamicTypeNameAndExpression(const TypeName &typeName, } if (internalNode()->hasProperty(name()) && !internalNode()->property(name())->isBindingProperty()) - model()->d->removeProperty(internalNode()->property(name())); + privateModel()->removeProperty(internalNode()->property(name())); - model()->d->setDynamicBindingProperty(internalNode(), name(), typeName, expression); + privateModel()->setDynamicBindingProperty(internalNode(), name(), typeName, expression); } QDebug operator<<(QDebug debug, const BindingProperty &property) diff --git a/src/plugins/qmldesigner/designercore/model/internalnode_p.h b/src/plugins/qmldesigner/designercore/model/internalnode_p.h index 9f70fe1e94..0997c5a4ff 100644 --- a/src/plugins/qmldesigner/designercore/model/internalnode_p.h +++ b/src/plugins/qmldesigner/designercore/model/internalnode_p.h @@ -40,8 +40,6 @@ namespace QmlDesigner { -class Model; - namespace Internal { class InternalProperty; diff --git a/src/plugins/qmldesigner/designercore/model/model.cpp b/src/plugins/qmldesigner/designercore/model/model.cpp index 3b9ddf99c9..70dd0f4fd4 100644 --- a/src/plugins/qmldesigner/designercore/model/model.cpp +++ b/src/plugins/qmldesigner/designercore/model/model.cpp @@ -1882,17 +1882,17 @@ static bool compareVersions(const QString &version1, const QString &version2, bo QStringList version2List = version2.split(QLatin1Char('.')); if (version1List.count() == 2 && version2List.count() == 2) { bool ok; - int major1 = version1List.first().toInt(&ok); + int major1 = version1List.constFirst().toInt(&ok); if (!ok) return false; - int major2 = version2List.first().toInt(&ok); + int major2 = version2List.constFirst().toInt(&ok); if (!ok) return false; if (major1 >= major2) { - int minor1 = version1List.last().toInt(&ok); + int minor1 = version1List.constLast().toInt(&ok); if (!ok) return false; - int minor2 = version2List.last().toInt(&ok); + int minor2 = version2List.constLast().toInt(&ok); if (!ok) return false; if (minor1 >= minor2) diff --git a/src/plugins/qmldesigner/designercore/model/modelnode.cpp b/src/plugins/qmldesigner/designercore/model/modelnode.cpp index 641849d004..7a80390d85 100644 --- a/src/plugins/qmldesigner/designercore/model/modelnode.cpp +++ b/src/plugins/qmldesigner/designercore/model/modelnode.cpp @@ -310,7 +310,7 @@ QString ModelNode::simplifiedTypeName() const throw InvalidModelNodeException(__LINE__, __FUNCTION__, __FILE__); } - return QString::fromUtf8(type().split('.').last()); + return QString::fromUtf8(type().split('.').constLast()); } QString ModelNode::displayName() const @@ -1138,7 +1138,7 @@ bool ModelNode::isComponent() const * the default property is always implcitly a NodeListProperty. This is something that has to be fixed. */ - ModelNode componentNode = nodeListProperty("component").toModelNodeList().first(); + ModelNode componentNode = nodeListProperty("component").toModelNodeList().constFirst(); if (componentNode.nodeSourceType() == ModelNode::NodeWithComponentSource) return true; if (componentNode.metaInfo().isFileComponent()) @@ -1175,7 +1175,7 @@ QIcon ModelNode::typeIcon() const QList <ItemLibraryEntry> itemLibraryEntryList = libraryInfo->entriesForType( type(), majorVersion(), minorVersion()); if (!itemLibraryEntryList.isEmpty()) - return itemLibraryEntryList.first().typeIcon(); + return itemLibraryEntryList.constFirst().typeIcon(); else if (metaInfo().isValid()) return QIcon(QStringLiteral(":/ItemLibrary/images/item-default-icon.png")); } diff --git a/src/plugins/qmldesigner/designercore/model/modeltotextmerger.cpp b/src/plugins/qmldesigner/designercore/model/modeltotextmerger.cpp index 19b8b7c1d1..39d99accdf 100644 --- a/src/plugins/qmldesigner/designercore/model/modeltotextmerger.cpp +++ b/src/plugins/qmldesigner/designercore/model/modeltotextmerger.cpp @@ -229,7 +229,7 @@ void ModelToTextMerger::applyChanges() QString errorMessage = QStringLiteral("Error while rewriting"); if (!tmpDocument->diagnosticMessages().isEmpty()) - errorMessage = tmpDocument->diagnosticMessages().first().message; + errorMessage = tmpDocument->diagnosticMessages().constFirst().message; m_rewriterView->enterErrorState(errorMessage); return; diff --git a/src/plugins/qmldesigner/designercore/model/nodeabstractproperty.cpp b/src/plugins/qmldesigner/designercore/model/nodeabstractproperty.cpp index 488988bbeb..27b5a5c746 100644 --- a/src/plugins/qmldesigner/designercore/model/nodeabstractproperty.cpp +++ b/src/plugins/qmldesigner/designercore/model/nodeabstractproperty.cpp @@ -86,18 +86,18 @@ void NodeAbstractProperty::reparentHere(const ModelNode &modelNode, bool isNode throw InvalidReparentingException(__LINE__, __FUNCTION__, __FILE__); if (internalNode()->hasProperty(name()) && !internalNode()->property(name())->isNodeAbstractProperty()) - model()->d->removeProperty(internalNode()->property(name())); + privateModel()->removeProperty(internalNode()->property(name())); if (modelNode.hasParentProperty()) { Internal::InternalNodeAbstractProperty::Pointer oldParentProperty = modelNode.internalNode()->parentProperty(); - model()->d->reparentNode(internalNode(), name(), modelNode.internalNode(), isNodeList, dynamicTypeName); + privateModel()->reparentNode(internalNode(), name(), modelNode.internalNode(), isNodeList, dynamicTypeName); Q_ASSERT(!oldParentProperty.isNull()); } else { - model()->d->reparentNode(internalNode(), name(), modelNode.internalNode(), isNodeList, dynamicTypeName); + privateModel()->reparentNode(internalNode(), name(), modelNode.internalNode(), isNodeList, dynamicTypeName); } } diff --git a/src/plugins/qmldesigner/designercore/model/nodelistproperty.cpp b/src/plugins/qmldesigner/designercore/model/nodelistproperty.cpp index 1d03c89418..d4735160c5 100644 --- a/src/plugins/qmldesigner/designercore/model/nodelistproperty.cpp +++ b/src/plugins/qmldesigner/designercore/model/nodelistproperty.cpp @@ -99,7 +99,7 @@ void NodeListProperty::slide(int from, int to) const if (to > count() - 1) throw InvalidPropertyException(__LINE__, __FUNCTION__, __FILE__, "<invalid node list sliding>"); - model()->d->changeNodeOrder(internalNode(), name(), from, to); + privateModel()->changeNodeOrder(internalNode(), name(), from, to); } void NodeListProperty::reparentHere(const ModelNode &modelNode) diff --git a/src/plugins/qmldesigner/designercore/model/nodeproperty.cpp b/src/plugins/qmldesigner/designercore/model/nodeproperty.cpp index 6d9bcfd1de..2d262c2ab6 100644 --- a/src/plugins/qmldesigner/designercore/model/nodeproperty.cpp +++ b/src/plugins/qmldesigner/designercore/model/nodeproperty.cpp @@ -59,9 +59,9 @@ void NodeProperty::setModelNode(const ModelNode &modelNode) } if (internalNode()->hasProperty(name()) && !internalNode()->property(name())->isNodeProperty()) - model()->d->removeProperty(internalNode()->property(name())); + privateModel()->removeProperty(internalNode()->property(name())); - model()->d->reparentNode(internalNode(), name(), modelNode.internalNode(), false); //### we have to add a flag that this is not a list + privateModel()->reparentNode(internalNode(), name(), modelNode.internalNode(), false); //### we have to add a flag that this is not a list } ModelNode NodeProperty::modelNode() const diff --git a/src/plugins/qmldesigner/designercore/model/qmltextgenerator.cpp b/src/plugins/qmldesigner/designercore/model/qmltextgenerator.cpp index 5f65bea40c..08105bf2be 100644 --- a/src/plugins/qmldesigner/designercore/model/qmltextgenerator.cpp +++ b/src/plugins/qmldesigner/designercore/model/qmltextgenerator.cpp @@ -167,8 +167,8 @@ QString QmlTextGenerator::toQml(const ModelNode &node, int indentDepth) const QString url; if (type.contains('.')) { QStringList nameComponents = type.split('.'); - url = nameComponents.first(); - type = nameComponents.last(); + url = nameComponents.constFirst(); + type = nameComponents.constLast(); } QString alias; diff --git a/src/plugins/qmldesigner/designercore/model/rewriterview.cpp b/src/plugins/qmldesigner/designercore/model/rewriterview.cpp index dc1f03794d..c4cb5bf710 100644 --- a/src/plugins/qmldesigner/designercore/model/rewriterview.cpp +++ b/src/plugins/qmldesigner/designercore/model/rewriterview.cpp @@ -402,7 +402,7 @@ void RewriterView::applyChanges() try { modelToTextMerger()->applyChanges(); if (!errors().isEmpty()) - enterErrorState(errors().first().description()); + enterErrorState(errors().constFirst().description()); } catch (const Exception &e) { const QString content = textModifierContent(); qDebug().noquote() << "RewriterException:" << m_rewritingErrorMessage; @@ -417,7 +417,7 @@ void RewriterView::applyChanges() qDebug().noquote() << "RewriterException: " << m_rewritingErrorMessage; qDebug().noquote() << "Content: " << content; if (!errors().isEmpty()) - qDebug().noquote() << "Error:" << errors().first().description(); + qDebug().noquote() << "Error:" << errors().constFirst().description(); throw RewritingException(__LINE__, __FUNCTION__, __FILE__, qPrintable(m_rewritingErrorMessage), content); } } @@ -668,7 +668,7 @@ QString RewriterView::convertTypeToImportAlias(const QString &type) const if (type.contains('.')) { QStringList nameComponents = type.split('.'); url = getUrlFromType(type); - simplifiedType = nameComponents.last(); + simplifiedType = nameComponents.constLast(); } QString alias; diff --git a/src/plugins/qmldesigner/designercore/model/signalhandlerproperty.cpp b/src/plugins/qmldesigner/designercore/model/signalhandlerproperty.cpp index 21659a37e2..3ad9280e7a 100644 --- a/src/plugins/qmldesigner/designercore/model/signalhandlerproperty.cpp +++ b/src/plugins/qmldesigner/designercore/model/signalhandlerproperty.cpp @@ -71,9 +71,9 @@ void SignalHandlerProperty::setSource(const QString &source) } if (internalNode()->hasProperty(name()) && !internalNode()->property(name())->isSignalHandlerProperty()) - model()->d->removeProperty(internalNode()->property(name())); + privateModel()->removeProperty(internalNode()->property(name())); - model()->d->setSignalHandlerProperty(internalNode(), name(), source); + privateModel()->setSignalHandlerProperty(internalNode(), name(), source); } QString SignalHandlerProperty::source() const diff --git a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp index 7a624b6e08..f94cd99fb7 100644 --- a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp +++ b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp @@ -166,7 +166,7 @@ static inline bool isSignalPropertyName(const QString &signalName) // see QmlCompiler::isSignalPropertyName QStringList list = signalName.split(QLatin1String(".")); - QString pureSignalName = list.last(); + const QString &pureSignalName = list.constLast(); return pureSignalName.length() >= 3 && pureSignalName.startsWith(QStringLiteral("on")) && pureSignalName.at(2).isLetter(); } @@ -611,12 +611,12 @@ public: if (astValueList.count() == 2) { //Check for global Qt enums - if (astValueList.first() == QStringLiteral("Qt") - && globalQtEnums().contains(astValueList.last())) + if (astValueList.constFirst() == QStringLiteral("Qt") + && globalQtEnums().contains(astValueList.constLast())) return QVariant::fromValue(Enumeration(astValue)); //Check for known enum scopes used globally - if (knownEnumScopes().contains(astValueList.first())) + if (knownEnumScopes().contains(astValueList.constFirst())) return QVariant::fromValue(Enumeration(astValue)); } @@ -640,7 +640,7 @@ public: QString rhsValueName; if (AST::IdentifierExpression *idExp = AST::cast<AST::IdentifierExpression *>(eStmt->expression)) { if (!m_scopeChain.qmlScopeObjects().isEmpty()) - rhsValueObject = m_scopeChain.qmlScopeObjects().last(); + rhsValueObject = m_scopeChain.qmlScopeObjects().constLast(); if (!idExp->name.isEmpty()) rhsValueName = idExp->name.toString(); } else if (AST::FieldMemberExpression *memberExp = AST::cast<AST::FieldMemberExpression *>(eStmt->expression)) { @@ -792,8 +792,8 @@ static bool isLatestImportVersion(const ImportKey &importKey, const QHash<QStrin static bool isBlacklistImport(const ImportKey &importKey) { - QString importPathFirst = importKey.splitPath.first(); - QString importPathLast = importKey.splitPath.last(); + const QString &importPathFirst = importKey.splitPath.constFirst(); + const QString &importPathLast = importKey.splitPath.constLast(); return importPathFirst == QStringLiteral("<cpp>") || importPathFirst == QStringLiteral("QML") || importPathFirst == QStringLiteral("QtQml") @@ -1439,7 +1439,7 @@ static QString fileForFullQrcPath(const QString &string) if (stringList.isEmpty()) return QString(); - return stringList.last(); + return stringList.constLast(); } static QString removeFileFromQrcPath(const QString &string) @@ -2046,7 +2046,7 @@ void TextToModelMerger::populateQrcMapping(const QString &filePath) QMap<QString,QStringList> map = ModelManagerInterface::instance()->filesInQrcPath(path); const QStringList qrcFilePaths = map.value(fileName, {}); if (!qrcFilePaths.isEmpty()) { - QString fileSystemPath = qrcFilePaths.first(); + QString fileSystemPath = qrcFilePaths.constFirst(); fileSystemPath.remove(fileName); if (path.isEmpty()) path.prepend(QLatin1String("/")); diff --git a/src/plugins/qmldesigner/designercore/model/variantproperty.cpp b/src/plugins/qmldesigner/designercore/model/variantproperty.cpp index 259a6900ee..dbdf1bb74e 100644 --- a/src/plugins/qmldesigner/designercore/model/variantproperty.cpp +++ b/src/plugins/qmldesigner/designercore/model/variantproperty.cpp @@ -71,9 +71,9 @@ void VariantProperty::setValue(const QVariant &value) } if (internalNode()->hasProperty(name()) && !internalNode()->property(name())->isVariantProperty()) - model()->d->removeProperty(internalNode()->property(name())); + privateModel()->removeProperty(internalNode()->property(name())); - model()->d->setVariantProperty(internalNode(), name(), value); + privateModel()->setVariantProperty(internalNode(), name(), value); } QVariant VariantProperty::value() const @@ -120,9 +120,9 @@ void VariantProperty::setDynamicTypeNameAndValue(const TypeName &type, const QVa } if (internalNode()->hasProperty(name()) && !internalNode()->property(name())->isVariantProperty()) - model()->d->removeProperty(internalNode()->property(name())); + privateModel()->removeProperty(internalNode()->property(name())); - model()->d->setDynamicVariantProperty(internalNode(), name(), type, value); + privateModel()->setDynamicVariantProperty(internalNode(), name(), type, value); } void VariantProperty::setDynamicTypeNameAndEnumeration(const TypeName &type, const EnumerationName &enumerationName) diff --git a/src/plugins/qmldesigner/designmodewidget.cpp b/src/plugins/qmldesigner/designmodewidget.cpp index cacd365cad..1008a26e3a 100644 --- a/src/plugins/qmldesigner/designmodewidget.cpp +++ b/src/plugins/qmldesigner/designmodewidget.cpp @@ -441,7 +441,7 @@ static QWidget *createbottomSideBarWidget(const QList<WidgetInfo> &widgetInfos) topWidgetInfos.append(widgetInfo); } - QWidget *widget = topWidgetInfos.first().widget; + QWidget *widget = topWidgetInfos.constFirst().widget; if (topWidgetInfos.count() > 1) { QWidget *background = new QWidget(); background->setProperty("designerBackgroundColor", true); diff --git a/src/plugins/qmldesigner/documentmanager.cpp b/src/plugins/qmldesigner/documentmanager.cpp index f72939d36f..e5ec89524a 100644 --- a/src/plugins/qmldesigner/documentmanager.cpp +++ b/src/plugins/qmldesigner/documentmanager.cpp @@ -138,7 +138,7 @@ static void openComponentSourcePropertyOfLoader(const ModelNode &modelNode) * the default property is always implcitly a NodeListProperty. This is something that has to be fixed. */ - componentModelNode = modelNode.nodeListProperty("component").toModelNodeList().first(); + componentModelNode = modelNode.nodeListProperty("component").toModelNodeList().constFirst(); } Core::EditorManager::openEditor(componentModelNode.metaInfo().componentFileName(), Core::Id(), Core::EditorManager::DoNotMakeVisible); diff --git a/src/plugins/qmldesigner/documentwarningwidget.cpp b/src/plugins/qmldesigner/documentwarningwidget.cpp index a6c0303464..6afe9b2714 100644 --- a/src/plugins/qmldesigner/documentwarningwidget.cpp +++ b/src/plugins/qmldesigner/documentwarningwidget.cpp @@ -63,7 +63,8 @@ DocumentWarningWidget::DocumentWarningWidget(QWidget *parent) m_messageLabel->setForegroundRole(QPalette::ToolTipText); m_messageLabel->setWordWrap(true); - m_ignoreWarningsCheckBox->setText(tr("Ignore always these unsupported Qt Quick Designer warnings.")); + m_ignoreWarningsCheckBox->setText(tr("Always ignore these warnings about features " + "not supported by Qt Quick Designer.")); connect(m_navigateLabel, &QLabel::linkActivated, this, [=](const QString &link) { if (link == QLatin1String("goToCode")) { diff --git a/src/plugins/qmldesigner/qmldesignerextension/colortool/colortool.cpp b/src/plugins/qmldesigner/qmldesignerextension/colortool/colortool.cpp index 8e8c0b1cde..7f03543c2c 100644 --- a/src/plugins/qmldesigner/qmldesignerextension/colortool/colortool.cpp +++ b/src/plugins/qmldesigner/qmldesignerextension/colortool/colortool.cpp @@ -170,8 +170,8 @@ void ColorTool::selectedItemsChanged(const QList<FormEditorItem*> &itemList) m_formEditorItem->qmlItemNode().setVariantProperty("color", m_oldColor); if (!itemList.isEmpty() - && itemList.first()->qmlItemNode().modelNode().metaInfo().hasProperty("color")) { - m_formEditorItem = itemList.first(); + && itemList.constFirst()->qmlItemNode().modelNode().metaInfo().hasProperty("color")) { + m_formEditorItem = itemList.constFirst(); m_oldColor = m_formEditorItem->qmlItemNode().modelValue("color").value<QColor>(); if (m_colorDialog.isNull()) { diff --git a/src/plugins/qmldesigner/qmldesignerextension/connectioneditor/backendmodel.cpp b/src/plugins/qmldesigner/qmldesignerextension/connectioneditor/backendmodel.cpp index 312f2d8327..2944a195b6 100644 --- a/src/plugins/qmldesigner/qmldesignerextension/connectioneditor/backendmodel.cpp +++ b/src/plugins/qmldesigner/qmldesignerextension/connectioneditor/backendmodel.cpp @@ -232,7 +232,7 @@ void BackendModel::addNewBackend() QString typeName = dialog.type(); - Import import = Import::createLibraryImport(importSplit.first(), importSplit.last()); + Import import = Import::createLibraryImport(importSplit.constFirst(), importSplit.constLast()); try { diff --git a/src/plugins/qmldesigner/qmldesignerextension/connectioneditor/bindingmodel.cpp b/src/plugins/qmldesigner/qmldesignerextension/connectioneditor/bindingmodel.cpp index 7bc7f55dff..88bb7ffec2 100644 --- a/src/plugins/qmldesigner/qmldesignerextension/connectioneditor/bindingmodel.cpp +++ b/src/plugins/qmldesigner/qmldesignerextension/connectioneditor/bindingmodel.cpp @@ -160,7 +160,7 @@ QStringList BindingModel::possibleSourceProperties(const BindingProperty &bindin qWarning() << " BindingModel::possibleSourcePropertiesForRow no meta info for target node"; } - const QString id = stringlist.first(); + const QString &id = stringlist.constFirst(); ModelNode modelNode = getNodeByIdOrParent(id, bindingProperty.parentModelNode()); @@ -222,7 +222,7 @@ static PropertyName unusedProperty(const ModelNode &modelNode) void BindingModel::addBindingForCurrentNode() { if (connectionView()->selectedModelNodes().count() == 1) { - ModelNode modelNode = connectionView()->selectedModelNodes().first(); + const ModelNode &modelNode = connectionView()->selectedModelNodes().constFirst(); if (modelNode.isValid()) { try { modelNode.bindingProperty(unusedProperty(modelNode)).setExpression(QLatin1String("none.none")); @@ -386,7 +386,7 @@ bool BindingModel::getExpressionStrings(const BindingProperty &bindingProperty, if (true) { const QStringList stringList = expression.split(QLatin1String(".")); - *sourceNode = stringList.first(); + *sourceNode = stringList.constFirst(); QString propertyName; diff --git a/src/plugins/qmldesigner/qmldesignerextension/connectioneditor/connectionmodel.cpp b/src/plugins/qmldesigner/qmldesignerextension/connectioneditor/connectionmodel.cpp index 58af1da41c..2cde52ec61 100644 --- a/src/plugins/qmldesigner/qmldesignerextension/connectioneditor/connectionmodel.cpp +++ b/src/plugins/qmldesigner/qmldesignerextension/connectioneditor/connectionmodel.cpp @@ -270,8 +270,8 @@ void ConnectionModel::addConnection() newNode.signalHandlerProperty("onClicked").setSource(QLatin1String("print(\"clicked\")")); if (connectionView()->selectedModelNodes().count() == 1 - && !connectionView()->selectedModelNodes().first().id().isEmpty()) { - ModelNode selectedNode = connectionView()->selectedModelNodes().first(); + && !connectionView()->selectedModelNodes().constFirst().id().isEmpty()) { + const ModelNode &selectedNode = connectionView()->selectedModelNodes().constFirst(); newNode.bindingProperty("target").setExpression(selectedNode.id()); } else { newNode.bindingProperty("target").setExpression(QLatin1String("parent")); diff --git a/src/plugins/qmldesigner/qmldesignerextension/connectioneditor/connectionviewwidget.cpp b/src/plugins/qmldesigner/qmldesignerextension/connectioneditor/connectionviewwidget.cpp index 54b771bf0d..46acbeb8a6 100644 --- a/src/plugins/qmldesigner/qmldesignerextension/connectioneditor/connectionviewwidget.cpp +++ b/src/plugins/qmldesigner/qmldesignerextension/connectioneditor/connectionviewwidget.cpp @@ -139,17 +139,17 @@ QList<QToolButton *> ConnectionViewWidget::createToolBarWidgets() QList<QToolButton *> buttons; buttons << new QToolButton(); - buttons.last()->setIcon(Utils::Icons::PLUS_TOOLBAR.icon()); - buttons.last()->setToolTip(tr("Add binding or connection.")); - connect(buttons.last(), &QAbstractButton::clicked, this, &ConnectionViewWidget::addButtonClicked); - connect(this, &ConnectionViewWidget::setEnabledAddButton, buttons.last(), &QWidget::setEnabled); + buttons.constLast()->setIcon(Utils::Icons::PLUS_TOOLBAR.icon()); + buttons.constLast()->setToolTip(tr("Add binding or connection.")); + connect(buttons.constLast(), &QAbstractButton::clicked, this, &ConnectionViewWidget::addButtonClicked); + connect(this, &ConnectionViewWidget::setEnabledAddButton, buttons.constLast(), &QWidget::setEnabled); buttons << new QToolButton(); - buttons.last()->setIcon(Utils::Icons::MINUS.icon()); - buttons.last()->setToolTip(tr("Remove selected binding or connection.")); - buttons.last()->setShortcut(QKeySequence(Qt::Key_Delete)); - connect(buttons.last(), &QAbstractButton::clicked, this, &ConnectionViewWidget::removeButtonClicked); - connect(this, &ConnectionViewWidget::setEnabledRemoveButton, buttons.last(), &QWidget::setEnabled); + buttons.constLast()->setIcon(Utils::Icons::MINUS.icon()); + buttons.constLast()->setToolTip(tr("Remove selected binding or connection.")); + buttons.constLast()->setShortcut(QKeySequence(Qt::Key_Delete)); + connect(buttons.constLast(), &QAbstractButton::clicked, this, &ConnectionViewWidget::removeButtonClicked); + connect(this, &ConnectionViewWidget::setEnabledRemoveButton, buttons.constLast(), &QWidget::setEnabled); return buttons; } @@ -233,7 +233,7 @@ void ConnectionViewWidget::removeButtonClicked() if (currentTab() == ConnectionTab) { if (ui->connectionView->selectionModel()->selectedRows().isEmpty()) return; - int currentRow = ui->connectionView->selectionModel()->selectedRows().first().row(); + int currentRow = ui->connectionView->selectionModel()->selectedRows().constFirst().row(); ConnectionModel *connectionModel = qobject_cast<ConnectionModel*>(ui->connectionView->model()); if (connectionModel) { connectionModel->deleteConnectionByRow(currentRow); @@ -241,7 +241,7 @@ void ConnectionViewWidget::removeButtonClicked() } else if (currentTab() == BindingTab) { if (ui->bindingView->selectionModel()->selectedRows().isEmpty()) return; - int currentRow = ui->bindingView->selectionModel()->selectedRows().first().row(); + int currentRow = ui->bindingView->selectionModel()->selectedRows().constFirst().row(); BindingModel *bindingModel = qobject_cast<BindingModel*>(ui->bindingView->model()); if (bindingModel) { bindingModel->deleteBindindByRow(currentRow); @@ -249,12 +249,12 @@ void ConnectionViewWidget::removeButtonClicked() } else if (currentTab() == DynamicPropertiesTab) { if (ui->dynamicPropertiesView->selectionModel()->selectedRows().isEmpty()) return; - int currentRow = ui->dynamicPropertiesView->selectionModel()->selectedRows().first().row(); + int currentRow = ui->dynamicPropertiesView->selectionModel()->selectedRows().constFirst().row(); DynamicPropertiesModel *dynamicPropertiesModel = qobject_cast<DynamicPropertiesModel*>(ui->dynamicPropertiesView->model()); if (dynamicPropertiesModel) dynamicPropertiesModel->deleteDynamicPropertyByRow(currentRow); } else if (currentTab() == BackendTab) { - int currentRow = ui->backendView->selectionModel()->selectedRows().first().row(); + int currentRow = ui->backendView->selectionModel()->selectedRows().constFirst().row(); BackendModel *backendModel = qobject_cast<BackendModel*>(ui->backendView->model()); if (backendModel) backendModel->deletePropertyByRow(currentRow); diff --git a/src/plugins/qmldesigner/qmldesignerextension/connectioneditor/dynamicpropertiesmodel.cpp b/src/plugins/qmldesigner/qmldesignerextension/connectioneditor/dynamicpropertiesmodel.cpp index b9cca0f403..a6cb2d911b 100644 --- a/src/plugins/qmldesigner/qmldesignerextension/connectioneditor/dynamicpropertiesmodel.cpp +++ b/src/plugins/qmldesigner/qmldesignerextension/connectioneditor/dynamicpropertiesmodel.cpp @@ -265,7 +265,7 @@ QStringList DynamicPropertiesModel::possibleTargetProperties(const BindingProper void DynamicPropertiesModel::addDynamicPropertyForCurrentNode() { if (connectionView()->selectedModelNodes().count() == 1) { - ModelNode modelNode = connectionView()->selectedModelNodes().first(); + const ModelNode &modelNode = connectionView()->selectedModelNodes().constFirst(); if (modelNode.isValid()) { try { modelNode.variantProperty(unusedProperty(modelNode)).setDynamicTypeNameAndValue("string", QLatin1String("none.none")); @@ -292,7 +292,7 @@ QStringList DynamicPropertiesModel::possibleSourceProperties(const BindingProper qWarning() << " BindingModel::possibleSourcePropertiesForRow no meta info for target node"; } - const QString id = stringlist.first(); + const QString &id = stringlist.constFirst(); ModelNode modelNode = getNodeByIdOrParent(id, bindingProperty.parentModelNode()); @@ -617,7 +617,7 @@ bool DynamicPropertiesModel::getExpressionStrings(const BindingProperty &binding if (true) { const QStringList stringList = expression.split(QLatin1String(".")); - *sourceNode = stringList.first(); + *sourceNode = stringList.constFirst(); QString propertyName; diff --git a/src/plugins/qmldesigner/qmldesignerextension/pathtool/pathitem.cpp b/src/plugins/qmldesigner/qmldesignerextension/pathtool/pathitem.cpp index 4a1e0dba2b..8653e8a20a 100644 --- a/src/plugins/qmldesigner/qmldesignerextension/pathtool/pathitem.cpp +++ b/src/plugins/qmldesigner/qmldesignerextension/pathtool/pathitem.cpp @@ -140,8 +140,8 @@ void PathItem::writePathToProperty() pathSegment.destroy(); if (!m_cubicSegments.isEmpty()) { - pathNode.variantProperty("startX").setValue(m_cubicSegments.first().firstControlPoint().coordinate().x()); - pathNode.variantProperty("startY").setValue(m_cubicSegments.first().firstControlPoint().coordinate().y()); + pathNode.variantProperty("startX").setValue(m_cubicSegments.constFirst().firstControlPoint().coordinate().x()); + pathNode.variantProperty("startY").setValue(m_cubicSegments.constFirst().firstControlPoint().coordinate().y()); foreach (const CubicSegment &cubicSegment, m_cubicSegments) { writePathAttributes(pathNode, cubicSegment.attributes()); @@ -178,8 +178,8 @@ void PathItem::writePathAsCubicSegmentsOnly() pathSegment.destroy(); if (!m_cubicSegments.isEmpty()) { - pathNode.variantProperty("startX").setValue(m_cubicSegments.first().firstControlPoint().coordinate().x()); - pathNode.variantProperty("startY").setValue(m_cubicSegments.first().firstControlPoint().coordinate().y()); + pathNode.variantProperty("startX").setValue(m_cubicSegments.constFirst().firstControlPoint().coordinate().x()); + pathNode.variantProperty("startY").setValue(m_cubicSegments.constFirst().firstControlPoint().coordinate().y()); foreach (const CubicSegment &cubicSegment, m_cubicSegments) { @@ -239,7 +239,7 @@ static void drawCubicSegments(const QList<CubicSegment> &cubicSegments, QPainter { painter->save(); - QPainterPath curvePainterPath(cubicSegments.first().firstControlPoint().coordinate()); + QPainterPath curvePainterPath(cubicSegments.constFirst().firstControlPoint().coordinate()); foreach (const CubicSegment &cubicSegment, cubicSegments) addCubicSegmentToPainterPath(cubicSegment, curvePainterPath); @@ -547,9 +547,9 @@ void PathItem::readControlPoints() m_lastAttributes = actualAttributes; m_lastPercent = percent; - if (m_cubicSegments.first().firstControlPoint().coordinate() == m_cubicSegments.last().fourthControlPoint().coordinate()) { - CubicSegment lastCubicSegment = m_cubicSegments.last(); - lastCubicSegment.setFourthControlPoint(m_cubicSegments.first().firstControlPoint()); + if (m_cubicSegments.constFirst().firstControlPoint().coordinate() == m_cubicSegments.constLast().fourthControlPoint().coordinate()) { + CubicSegment lastCubicSegment = m_cubicSegments.constLast(); + lastCubicSegment.setFourthControlPoint(m_cubicSegments.constFirst().firstControlPoint()); lastCubicSegment.fourthControlPoint().setPathModelNode(pathNode); lastCubicSegment.fourthControlPoint().setPointType(StartAndEndPoint); } @@ -588,8 +588,8 @@ void PathItem::splitCubicSegment(CubicSegment &cubicSegment, double t) void PathItem::closePath() { if (!m_cubicSegments.isEmpty()) { - CubicSegment firstCubicSegment = m_cubicSegments.first(); - CubicSegment lastCubicSegment = m_cubicSegments.last(); + const CubicSegment &firstCubicSegment = m_cubicSegments.constFirst(); + CubicSegment lastCubicSegment = m_cubicSegments.constLast(); lastCubicSegment.setFourthControlPoint(firstCubicSegment.firstControlPoint()); writePathAsCubicSegmentsOnly(); } @@ -598,8 +598,8 @@ void PathItem::closePath() void PathItem::openPath() { if (!m_cubicSegments.isEmpty()) { - CubicSegment firstCubicSegment = m_cubicSegments.first(); - CubicSegment lastCubicSegment = m_cubicSegments.last(); + const CubicSegment &firstCubicSegment = m_cubicSegments.constFirst(); + CubicSegment lastCubicSegment = m_cubicSegments.constLast(); QPointF newEndPoint = firstCubicSegment.firstControlPoint().coordinate(); newEndPoint.setX(newEndPoint.x() + 10.); lastCubicSegment.setFourthControlPoint(ControlPoint(newEndPoint)); @@ -694,7 +694,7 @@ const QList<ControlPoint> PathItem::controlPoints() const controlPointList.reserve((m_cubicSegments.count() * 4)); if (!m_cubicSegments.isEmpty()) - controlPointList.append(m_cubicSegments.first().firstControlPoint()); + controlPointList.append(m_cubicSegments.constFirst().firstControlPoint()); foreach (const CubicSegment &cubicSegment, m_cubicSegments) { controlPointList.append(cubicSegment.secondControlPoint()); @@ -908,8 +908,8 @@ bool PathItem::isClosedPath() const if (m_cubicSegments.isEmpty()) return false; - ControlPoint firstControlPoint = m_cubicSegments.first().firstControlPoint(); - ControlPoint lastControlPoint = m_cubicSegments.last().fourthControlPoint(); + ControlPoint firstControlPoint = m_cubicSegments.constFirst().firstControlPoint(); + ControlPoint lastControlPoint = m_cubicSegments.constLast().fourthControlPoint(); return firstControlPoint == lastControlPoint; } @@ -939,7 +939,7 @@ void PathItem::removeEditPoint(const ControlPoint &controlPoint) QList<CubicSegment> cubicSegments = cubicSegmentsContainingControlPoint(controlPoint, m_cubicSegments); if (cubicSegments.count() == 1) { - m_cubicSegments.removeOne(cubicSegments.first()); + m_cubicSegments.removeOne(cubicSegments.constFirst()); } else if (cubicSegments.count() == 2){ CubicSegment mergedCubicSegment = CubicSegment::create(); CubicSegment firstCubicSegment = cubicSegments.at(0); diff --git a/src/plugins/qmldesigner/qmldesignerextension/pathtool/pathselectionmanipulator.cpp b/src/plugins/qmldesigner/qmldesignerextension/pathtool/pathselectionmanipulator.cpp index 2740078ae8..510181258e 100644 --- a/src/plugins/qmldesigner/qmldesignerextension/pathtool/pathselectionmanipulator.cpp +++ b/src/plugins/qmldesigner/qmldesignerextension/pathtool/pathselectionmanipulator.cpp @@ -80,7 +80,7 @@ static ControlPoint getControlPoint(const QList<ControlPoint> &selectedPoints, c return selectedPoints.at(offsetIndex); else if (isClosedPath) { if (offsetIndex == -1) - return selectedPoints.last(); + return selectedPoints.constLast(); else if (offsetIndex < selectedPoints.count()) return selectedPoints.at(1); } diff --git a/src/plugins/qmldesigner/qmldesignerextension/pathtool/pathtool.cpp b/src/plugins/qmldesigner/qmldesignerextension/pathtool/pathtool.cpp index a30390e345..66582f017d 100644 --- a/src/plugins/qmldesigner/qmldesignerextension/pathtool/pathtool.cpp +++ b/src/plugins/qmldesigner/qmldesignerextension/pathtool/pathtool.cpp @@ -257,8 +257,8 @@ void PathTool::selectedItemsChanged(const QList<FormEditorItem*> &itemList) m_pathItem->writePathToProperty(); delete m_pathItem.data(); - if (!itemList.isEmpty() && hasPathProperty(itemList.first())) { - FormEditorItem *formEditorItem = itemList.first(); + if (!itemList.isEmpty() && hasPathProperty(itemList.constFirst())) { + FormEditorItem *formEditorItem = itemList.constFirst(); m_pathItem = new PathItem(scene()); m_pathItem->setParentItem(scene()->manipulatorLayerItem()); m_pathItem->setFormEditorItem(formEditorItem); diff --git a/src/plugins/qmldesigner/qmldesignerextension/sourcetool/sourcetool.cpp b/src/plugins/qmldesigner/qmldesignerextension/sourcetool/sourcetool.cpp index ad87f996cb..9c7f32c1bb 100644 --- a/src/plugins/qmldesigner/qmldesignerextension/sourcetool/sourcetool.cpp +++ b/src/plugins/qmldesigner/qmldesignerextension/sourcetool/sourcetool.cpp @@ -192,7 +192,7 @@ static QString baseDirectory(const QUrl &url) void SourceTool::selectedItemsChanged(const QList<FormEditorItem*> &itemList) { if (!itemList.isEmpty()) { - m_formEditorItem = itemList.first(); + m_formEditorItem = itemList.constFirst(); m_oldFileName = m_formEditorItem->qmlItemNode().modelValue("source").toString(); QString openDirectory = baseDirectory(view()->model()->fileUrl()); diff --git a/src/plugins/qmldesigner/qmldesignerextension/texttool/texttool.cpp b/src/plugins/qmldesigner/qmldesignerextension/texttool/texttool.cpp index 20ae2ab03d..fcaaba72ce 100644 --- a/src/plugins/qmldesigner/qmldesignerextension/texttool/texttool.cpp +++ b/src/plugins/qmldesigner/qmldesignerextension/texttool/texttool.cpp @@ -209,7 +209,7 @@ void TextTool::selectedItemsChanged(const QList<FormEditorItem*> &itemList) view()->changeToSelectionTool(); } if (!itemList.isEmpty()) { - FormEditorItem *formEditorItem = itemList.first(); + FormEditorItem *formEditorItem = itemList.constFirst(); m_textItem = new TextEditItem(scene()); textItem()->setParentItem(scene()->manipulatorLayerItem()); textItem()->setFormEditorItem(formEditorItem); diff --git a/src/plugins/qmldesigner/qmldesignerplugin.cpp b/src/plugins/qmldesigner/qmldesignerplugin.cpp index 84ab7d25db..32e0940342 100644 --- a/src/plugins/qmldesigner/qmldesignerplugin.cpp +++ b/src/plugins/qmldesigner/qmldesignerplugin.cpp @@ -361,7 +361,7 @@ void QmlDesignerPlugin::jumpTextCursorToSelectedModelNode() // visual editor -> text editor ModelNode selectedNode; if (!rewriterView()->selectedModelNodes().isEmpty()) - selectedNode = rewriterView()->selectedModelNodes().first(); + selectedNode = rewriterView()->selectedModelNodes().constFirst(); if (selectedNode.isValid()) { const int nodeOffset = rewriterView()->nodeOffset(selectedNode); @@ -477,7 +477,7 @@ double QmlDesignerPlugin::formEditorDevicePixelRatio() const QList<QWindow *> topLevelWindows = QApplication::topLevelWindows(); if (topLevelWindows.isEmpty()) return 1; - return topLevelWindows.first()->screen()->devicePixelRatio(); + return topLevelWindows.constFirst()->screen()->devicePixelRatio(); } QmlDesignerPlugin *QmlDesignerPlugin::instance() diff --git a/src/plugins/qmljseditor/qmljseditor.cpp b/src/plugins/qmljseditor/qmljseditor.cpp index 01e37a3e4c..946edbd078 100644 --- a/src/plugins/qmljseditor/qmljseditor.cpp +++ b/src/plugins/qmljseditor/qmljseditor.cpp @@ -34,7 +34,6 @@ #include "qmljshighlighter.h" #include "qmljshoverhandler.h" #include "qmljsquickfixassist.h" -#include "qmljstextmark.h" #include "qmloutlinemodel.h" #include <qmljs/qmljsbind.h> @@ -203,14 +202,12 @@ static void appendExtraSelectionsForMessages( void QmlJSEditorWidget::updateCodeWarnings(Document::Ptr doc) { - cleanDiagnosticMarks(); if (doc->ast()) { setExtraSelections(CodeWarningsSelection, QList<QTextEdit::ExtraSelection>()); } else if (doc->language().isFullySupportedLanguage()) { // show parsing errors QList<QTextEdit::ExtraSelection> selections; appendExtraSelectionsForMessages(&selections, doc->diagnosticMessages(), document()); - createTextMarks(doc->diagnosticMessages()); setExtraSelections(CodeWarningsSelection, selections); } else { setExtraSelections(CodeWarningsSelection, QList<QTextEdit::ExtraSelection>()); @@ -935,8 +932,6 @@ void QmlJSEditorWidget::semanticInfoUpdated(const SemanticInfo &semanticInfo) } } - createTextMarks(semanticInfo); - updateUses(); } @@ -978,61 +973,6 @@ bool QmlJSEditorWidget::hideContextPane() return b; } -void QmlJSEditorWidget::createTextMarks(const QList<DiagnosticMessage> &diagnostics) -{ - for (const DiagnosticMessage &diagnostic : diagnostics) { - const auto onMarkRemoved = [this](QmlJSTextMark *mark) { - m_diagnosticMarks.removeAll(mark); - delete mark; - }; - - auto mark = new QmlJSTextMark(textDocument()->filePath().toString(), - diagnostic, onMarkRemoved); - m_diagnosticMarks.append(mark); - textDocument()->addMark(mark); - } -} - -static void cleanMarks(QVector<TextMark *> *marks, TextDocument *doc) -{ - for (TextEditor::TextMark *mark : *marks) { - doc->removeMark(mark); - delete mark; - } - marks->clear(); -} - -void QmlJSEditorWidget::cleanDiagnosticMarks() -{ - cleanMarks(&m_diagnosticMarks, textDocument()); -} - -void QmlJSEditorWidget::createTextMarks(const SemanticInfo &info) -{ - cleanSemanticMarks(); - const auto onMarkRemoved = [this](QmlJSTextMark *mark) { - m_semanticMarks.removeAll(mark); - delete mark; - }; - for (const DiagnosticMessage &diagnostic : info.semanticMessages) { - auto mark = new QmlJSTextMark(textDocument()->filePath().toString(), - diagnostic, onMarkRemoved); - m_semanticMarks.append(mark); - textDocument()->addMark(mark); - } - for (const QmlJS::StaticAnalysis::Message &message : info.staticAnalysisMessages) { - auto mark = new QmlJSTextMark(textDocument()->filePath().toString(), - message, onMarkRemoved); - m_semanticMarks.append(mark); - textDocument()->addMark(mark); - } -} - -void QmlJSEditorWidget::cleanSemanticMarks() -{ - cleanMarks(&m_semanticMarks, textDocument()); -} - AssistInterface *QmlJSEditorWidget::createAssistInterface( AssistKind assistKind, AssistReason reason) const diff --git a/src/plugins/qmljseditor/qmljseditor.h b/src/plugins/qmljseditor/qmljseditor.h index 7d68cf318f..3e055d69c0 100644 --- a/src/plugins/qmljseditor/qmljseditor.h +++ b/src/plugins/qmljseditor/qmljseditor.h @@ -47,8 +47,6 @@ namespace QmlJS { namespace AST { class UiObjectMember; } } -namespace TextEditor { class TextMark; } - namespace QmlJSEditor { class QmlJSEditorDocument; @@ -129,14 +127,6 @@ private: QmlJS::IContextPane *m_contextPane = nullptr; int m_oldCursorPosition = -1; - void createTextMarks(const QList<QmlJS::DiagnosticMessage> &diagnostics); - void cleanDiagnosticMarks(); - QVector<TextEditor::TextMark *> m_diagnosticMarks; - - void createTextMarks(const QmlJSTools::SemanticInfo &info); - void cleanSemanticMarks(); - QVector<TextEditor::TextMark *> m_semanticMarks; - FindReferences *m_findReferences; }; diff --git a/src/plugins/qmljseditor/qmljseditordocument.cpp b/src/plugins/qmljseditor/qmljseditordocument.cpp index 387c1d719f..66fa6da393 100644 --- a/src/plugins/qmljseditor/qmljseditordocument.cpp +++ b/src/plugins/qmljseditor/qmljseditordocument.cpp @@ -32,6 +32,7 @@ #include "qmljsquickfixassist.h" #include "qmljssemantichighlighter.h" #include "qmljssemanticinfoupdater.h" +#include "qmljstextmark.h" #include "qmloutlinemodel.h" #include <coreplugin/coreconstants.h> @@ -42,6 +43,8 @@ #include <qmljstools/qmljsmodelmanager.h> #include <qmljstools/qmljsqtstylecodeformatter.h> +#include <utils/asconst.h> + using namespace QmlJSEditor; using namespace QmlJS; using namespace QmlJS::AST; @@ -521,10 +524,13 @@ void QmlJSEditorDocumentPrivate::onDocumentUpdated(Document::Ptr doc) if (doc->editorRevision() != q->document()->revision()) return; + cleanDiagnosticMarks(); if (doc->ast()) { // got a correctly parsed (or recovered) file. m_semanticInfoDocRevision = doc->editorRevision(); m_semanticInfoUpdater->update(doc, ModelManagerInterface::instance()->snapshot()); + } else if (doc->language().isFullySupportedLanguage()) { + createTextMarks(doc->diagnosticMessages()); } emit q->updateCodeWarnings(doc); } @@ -573,6 +579,7 @@ void QmlJSEditorDocumentPrivate::acceptNewSemanticInfo(const SemanticInfo &seman } } + createTextMarks(m_semanticInfo); emit q->semanticInfoUpdated(m_semanticInfo); // calls triggerPendingUpdates as necessary } @@ -584,6 +591,61 @@ void QmlJSEditorDocumentPrivate::updateOutlineModel() m_outlineModel->update(m_semanticInfo); } +static void cleanMarks(QVector<TextEditor::TextMark *> *marks, TextEditor::TextDocument *doc) +{ + for (TextEditor::TextMark *mark : *marks) { + doc->removeMark(mark); + delete mark; + } + marks->clear(); +} + +void QmlJSEditorDocumentPrivate::createTextMarks(const QList<DiagnosticMessage> &diagnostics) +{ + for (const DiagnosticMessage &diagnostic : diagnostics) { + const auto onMarkRemoved = [this](QmlJSTextMark *mark) { + m_diagnosticMarks.removeAll(mark); + delete mark; + }; + + auto mark = new QmlJSTextMark(q->filePath().toString(), + diagnostic, onMarkRemoved); + m_diagnosticMarks.append(mark); + q->addMark(mark); + } +} + +void QmlJSEditorDocumentPrivate::cleanDiagnosticMarks() +{ + cleanMarks(&m_diagnosticMarks, q); +} + +void QmlJSEditorDocumentPrivate::createTextMarks(const SemanticInfo &info) +{ + cleanSemanticMarks(); + const auto onMarkRemoved = [this](QmlJSTextMark *mark) { + m_semanticMarks.removeAll(mark); + delete mark; + }; + for (const DiagnosticMessage &diagnostic : Utils::asConst(info.semanticMessages)) { + auto mark = new QmlJSTextMark(q->filePath().toString(), + diagnostic, onMarkRemoved); + m_semanticMarks.append(mark); + q->addMark(mark); + } + for (const QmlJS::StaticAnalysis::Message &message : Utils::asConst(info.staticAnalysisMessages)) { + auto mark = new QmlJSTextMark(q->filePath().toString(), + message, onMarkRemoved); + m_semanticMarks.append(mark); + q->addMark(mark); + } +} + +void QmlJSEditorDocumentPrivate::cleanSemanticMarks() +{ + cleanMarks(&m_semanticMarks, q); +} + } // Internal QmlJSEditorDocument::QmlJSEditorDocument() diff --git a/src/plugins/qmljseditor/qmljseditordocument_p.h b/src/plugins/qmljseditor/qmljseditordocument_p.h index 854b81519f..11d639cb59 100644 --- a/src/plugins/qmljseditor/qmljseditordocument_p.h +++ b/src/plugins/qmljseditor/qmljseditordocument_p.h @@ -32,6 +32,8 @@ #include <QTextLayout> #include <QTimer> +namespace TextEditor { class TextMark; } + namespace QmlJSEditor { class QmlJSEditorDocument; @@ -57,6 +59,11 @@ public: void acceptNewSemanticInfo(const QmlJSTools::SemanticInfo &semanticInfo); void updateOutlineModel(); + void createTextMarks(const QList<QmlJS::DiagnosticMessage> &diagnostics); + void cleanDiagnosticMarks(); + void createTextMarks(const QmlJSTools::SemanticInfo &info); + void cleanSemanticMarks(); + public: QmlJSEditorDocument *q = nullptr; QTimer m_updateDocumentTimer; // used to compress multiple document changes @@ -71,6 +78,8 @@ public: bool m_firstSementicInfo = true; QTimer m_updateOutlineModelTimer; Internal::QmlOutlineModel *m_outlineModel = nullptr; + QVector<TextEditor::TextMark *> m_diagnosticMarks; + QVector<TextEditor::TextMark *> m_semanticMarks; }; } // Internal diff --git a/src/plugins/qmljseditor/qmljshoverhandler.cpp b/src/plugins/qmljseditor/qmljshoverhandler.cpp index a767d6713b..7334ad7ecd 100644 --- a/src/plugins/qmljseditor/qmljshoverhandler.cpp +++ b/src/plugins/qmljseditor/qmljshoverhandler.cpp @@ -45,6 +45,7 @@ #include <qmljs/qmljsqrcparser.h> #include <texteditor/texteditor.h> #include <texteditor/helpitem.h> +#include <utils/executeondestruction.h> #include <utils/tooltip/tooltip.h> #include <QDir> @@ -201,8 +202,10 @@ bool QmlJSHoverHandler::setQmlTypeHelp(const ScopeChain &scopeChain, const Docum return true; } -void QmlJSHoverHandler::identifyMatch(TextEditorWidget *editorWidget, int pos) +void QmlJSHoverHandler::identifyMatch(TextEditorWidget *editorWidget, int pos, ReportPriority report) { + Utils::ExecuteOnDestruction reportPriority([this, report](){ report(priority()); }); + reset(); if (!m_modelManager) diff --git a/src/plugins/qmljseditor/qmljshoverhandler.h b/src/plugins/qmljseditor/qmljshoverhandler.h index fde05c7e4a..682d713f39 100644 --- a/src/plugins/qmljseditor/qmljshoverhandler.h +++ b/src/plugins/qmljseditor/qmljshoverhandler.h @@ -58,7 +58,9 @@ public: private: void reset(); - void identifyMatch(TextEditor::TextEditorWidget *editorWidget, int pos) override; + void identifyMatch(TextEditor::TextEditorWidget *editorWidget, + int pos, + ReportPriority report) override; void operateTooltip(TextEditor::TextEditorWidget *editorWidget, const QPoint &point) override; bool matchDiagnosticMessage(QmlJSEditorWidget *qmlEditor, int pos); diff --git a/src/plugins/scxmleditor/plugin_interface/idwarningitem.cpp b/src/plugins/scxmleditor/plugin_interface/idwarningitem.cpp index 7376192581..6422c22292 100644 --- a/src/plugins/scxmleditor/plugin_interface/idwarningitem.cpp +++ b/src/plugins/scxmleditor/plugin_interface/idwarningitem.cpp @@ -34,7 +34,7 @@ IdWarningItem::IdWarningItem(QGraphicsItem *parent) setSeverity(OutputPane::Warning::ErrorType); setTypeName(tr("State")); setDescription(tr("Each state must have a unique ID.")); - setReason(tr("Missing ID")); + setReason(tr("Missing ID.")); setX(-boundingRect().width()); } diff --git a/src/plugins/scxmleditor/plugin_interface/stateitem.cpp b/src/plugins/scxmleditor/plugin_interface/stateitem.cpp index edc2562ccf..01fd5a994b 100644 --- a/src/plugins/scxmleditor/plugin_interface/stateitem.cpp +++ b/src/plugins/scxmleditor/plugin_interface/stateitem.cpp @@ -350,7 +350,7 @@ void StateItem::selectedMenuAction(const QAction *action) break; } case TagUtils::Relayout: { - document->undoStack()->beginMacro(tr("Relayout")); + document->undoStack()->beginMacro(tr("Re-Layout")); doLayout(depth()); document->undoStack()->endMacro(); break; diff --git a/src/plugins/texteditor/basehoverhandler.cpp b/src/plugins/texteditor/basehoverhandler.cpp index 86d8eb0bbc..3b5edef2ee 100644 --- a/src/plugins/texteditor/basehoverhandler.cpp +++ b/src/plugins/texteditor/basehoverhandler.cpp @@ -26,6 +26,7 @@ #include "basehoverhandler.h" #include "texteditor.h" +#include <utils/executeondestruction.h> #include <utils/qtcassert.h> #include <utils/tooltip/tooltip.h> @@ -34,11 +35,6 @@ namespace TextEditor { BaseHoverHandler::~BaseHoverHandler() {} -bool BaseHoverHandler::isAsyncHandler() const -{ - return m_isAsyncHandler; -} - void BaseHoverHandler::showToolTip(TextEditorWidget *widget, const QPoint &point, bool decorate) { if (decorate) @@ -55,11 +51,6 @@ void BaseHoverHandler::checkPriority(TextEditorWidget *widget, process(widget, pos, report); } -void BaseHoverHandler::cancelAsyncCheck() -{ - QTC_CHECK(false && "BaseHoverHandler: Implement cancelCheck() in derived class!"); -} - int BaseHoverHandler::priority() const { if (m_priority >= 0) @@ -79,16 +70,16 @@ void BaseHoverHandler::setPriority(int priority) m_priority = priority; } -QString BaseHoverHandler::contextHelpId(TextEditorWidget *widget, int pos) +void BaseHoverHandler::contextHelpId(TextEditorWidget *widget, + int pos, + const Core::IContext::HelpIdCallback &callback) { // If the tooltip is visible and there is a help match, this match is used to update // the help id. Otherwise, let the identification process happen. if (!Utils::ToolTip::isVisible() || !lastHelpItemIdentified().isValid()) - process(widget, pos, [](int){}); - - if (lastHelpItemIdentified().isValid()) - return lastHelpItemIdentified().helpId(); - return QString(); + process(widget, pos, [this, widget, callback](int) { propagateHelpId(widget, callback); }); + else + propagateHelpId(widget, callback); } void BaseHoverHandler::setToolTip(const QString &tooltip) @@ -111,37 +102,35 @@ const HelpItem &BaseHoverHandler::lastHelpItemIdentified() const return m_lastHelpItemIdentified; } +void BaseHoverHandler::propagateHelpId(TextEditorWidget *widget, + const Core::IContext::HelpIdCallback &callback) +{ + QString id; + if (lastHelpItemIdentified().isValid()) + id = lastHelpItemIdentified().helpId(); + + widget->setContextHelpId(id); + callback(id); +} + void BaseHoverHandler::process(TextEditorWidget *widget, int pos, ReportPriority report) { m_toolTip.clear(); m_priority = -1; m_lastHelpItemIdentified = HelpItem(); - if (m_isAsyncHandler) { - identifyMatchAsync(widget, pos, report); - } else { - identifyMatch(widget, pos); - report(priority()); - } + identifyMatch(widget, pos, report); } -void BaseHoverHandler::setIsAsyncHandler(bool isAsyncHandler) +void BaseHoverHandler::identifyMatch(TextEditorWidget *editorWidget, int pos, ReportPriority report) { - m_isAsyncHandler = isAsyncHandler; -} + Utils::ExecuteOnDestruction reportPriority([this, report](){ report(priority()); }); -void BaseHoverHandler::identifyMatch(TextEditorWidget *editorWidget, int pos) -{ QString tooltip = editorWidget->extraSelectionTooltip(pos); if (!tooltip.isEmpty()) setToolTip(tooltip); } -void BaseHoverHandler::identifyMatchAsync(TextEditorWidget *, int, BaseHoverHandler::ReportPriority) -{ - QTC_CHECK(false && "BaseHoverHandler: Implement identifyMatchAsync() in derived class!"); -} - void BaseHoverHandler::decorateToolTip() { if (Qt::mightBeRichText(toolTip())) diff --git a/src/plugins/texteditor/basehoverhandler.h b/src/plugins/texteditor/basehoverhandler.h index cdd8735264..bc8d3e3e1d 100644 --- a/src/plugins/texteditor/basehoverhandler.h +++ b/src/plugins/texteditor/basehoverhandler.h @@ -28,6 +28,8 @@ #include "texteditor_global.h" #include "helpitem.h" +#include <coreplugin/icontext.h> + #include <functional> QT_BEGIN_NAMESPACE @@ -43,14 +45,13 @@ class TEXTEDITOR_EXPORT BaseHoverHandler public: virtual ~BaseHoverHandler(); - bool isAsyncHandler() const; - void setIsAsyncHandler(bool isAsyncHandler); - - QString contextHelpId(TextEditorWidget *widget, int pos); + void contextHelpId(TextEditorWidget *widget, + int pos, + const Core::IContext::HelpIdCallback &callback); using ReportPriority = std::function<void(int priority)>; void checkPriority(TextEditorWidget *widget, int pos, ReportPriority report); - virtual void cancelAsyncCheck(); + virtual void abort() {} // Implement for asynchronous priority reporter void showToolTip(TextEditorWidget *widget, const QPoint &point, bool decorate = true); @@ -70,16 +71,19 @@ protected: void setLastHelpItemIdentified(const HelpItem &help); const HelpItem &lastHelpItemIdentified() const; - virtual void identifyMatch(TextEditorWidget *editorWidget, int pos); - virtual void identifyMatchAsync(TextEditorWidget *editorWidget, int pos, ReportPriority report); + void propagateHelpId(TextEditorWidget *widget, const Core::IContext::HelpIdCallback &callback); + + // identifyMatch() is required to report a priority by using the "report" callback. + // It is recommended to use e.g. + // Utils::ExecuteOnDestruction reportPriority([this, report](){ report(priority()); }); + // at the beginning of an implementation to ensure this in any case. + virtual void identifyMatch(TextEditorWidget *editorWidget, int pos, ReportPriority report); virtual void decorateToolTip(); virtual void operateTooltip(TextEditorWidget *editorWidget, const QPoint &point); private: void process(TextEditorWidget *widget, int pos, ReportPriority report); - bool m_isAsyncHandler = false; - QString m_toolTip; HelpItem m_lastHelpItemIdentified; int m_priority = -1; diff --git a/src/plugins/texteditor/colorpreviewhoverhandler.cpp b/src/plugins/texteditor/colorpreviewhoverhandler.cpp index c6ca5947d0..6a6f4e20dd 100644 --- a/src/plugins/texteditor/colorpreviewhoverhandler.cpp +++ b/src/plugins/texteditor/colorpreviewhoverhandler.cpp @@ -27,6 +27,7 @@ #include "texteditor.h" #include <coreplugin/icore.h> +#include <utils/executeondestruction.h> #include <utils/tooltip/tooltip.h> #include <utils/qtcassert.h> @@ -355,8 +356,12 @@ static QColor colorFromFuncAndArgs(const QString &func, const QStringList &args) return colorFromArgs(args, spec); } -void ColorPreviewHoverHandler::identifyMatch(TextEditorWidget *editorWidget, int pos) +void ColorPreviewHoverHandler::identifyMatch(TextEditorWidget *editorWidget, + int pos, + ReportPriority report) { + Utils::ExecuteOnDestruction reportPriority([this, report](){ report(priority()); }); + if (editorWidget->extraSelectionTooltip(pos).isEmpty()) { const QTextBlock tb = editorWidget->document()->findBlock(pos); const int tbpos = pos - tb.position(); diff --git a/src/plugins/texteditor/colorpreviewhoverhandler.h b/src/plugins/texteditor/colorpreviewhoverhandler.h index 8677bf009a..ee8db3f93f 100644 --- a/src/plugins/texteditor/colorpreviewhoverhandler.h +++ b/src/plugins/texteditor/colorpreviewhoverhandler.h @@ -39,7 +39,7 @@ class TextEditorWidget; class TEXTEDITOR_EXPORT ColorPreviewHoverHandler : public BaseHoverHandler { private: - void identifyMatch(TextEditorWidget *editorWidget, int pos) override; + void identifyMatch(TextEditorWidget *editorWidget, int pos, ReportPriority report) override; void operateTooltip(TextEditorWidget *editorWidget, const QPoint &point) override; QColor m_colorTip; diff --git a/src/plugins/texteditor/texteditor.cpp b/src/plugins/texteditor/texteditor.cpp index 505c4325ae..a0cbd17699 100644 --- a/src/plugins/texteditor/texteditor.cpp +++ b/src/plugins/texteditor/texteditor.cpp @@ -313,11 +313,12 @@ public: return; } + if (isCheckRunning(documentRevision, position)) + return; + // Cancel currently running checks - for (BaseHoverHandler *handler : m_handlers) { - if (handler->isAsyncHandler()) - handler->cancelAsyncCheck(); - } + for (BaseHoverHandler *handler : m_handlers) + handler->abort(); // Update invocation data m_documentRevision = documentRevision; @@ -333,6 +334,13 @@ public: checkNext(); } + bool isCheckRunning(int documentRevision, int position) const + { + return m_currentHandlerIndex <= m_handlers.size() + && m_documentRevision == documentRevision + && m_position == position; + } + void checkNext() { QTC_ASSERT(m_currentHandlerIndex < m_handlers.size(), return); @@ -7927,8 +7935,9 @@ void BaseTextEditor::setContextHelpId(const QString &id) void TextEditorWidget::contextHelpId(const IContext::HelpIdCallback &callback) { if (d->m_contextHelpId.isEmpty() && !d->m_hoverHandlers.isEmpty()) - d->m_contextHelpId = d->m_hoverHandlers.first()->contextHelpId(this, textCursor().position()); - callback(d->m_contextHelpId); + d->m_hoverHandlers.first()->contextHelpId(this, textCursor().position(), callback); + else + callback(d->m_contextHelpId); } void TextEditorWidget::setContextHelpId(const QString &id) diff --git a/src/plugins/valgrind/memchecktool.cpp b/src/plugins/valgrind/memchecktool.cpp index 00c49a16d6..d007f3580f 100644 --- a/src/plugins/valgrind/memchecktool.cpp +++ b/src/plugins/valgrind/memchecktool.cpp @@ -73,6 +73,7 @@ #include <ssh/sshconnection.h> +#include <utils/checkablemessagebox.h> #include <utils/fancymainwindow.h> #include <utils/pathchooser.h> #include <utils/qtcassert.h> @@ -792,12 +793,27 @@ void MemcheckTool::heobAction() const QString heob = QString("heob%1.exe").arg(abi.wordWidth()); const QString heobPath = dialog.path() + '/' + heob; if (!QFile::exists(heobPath)) { - const QString msg = tr("Heob: Can't find %1").arg(heob); - TaskHub::addTask(Task::Error, msg, Debugger::Constants::ANALYZERTASK_ID); - TaskHub::requestPopup(); + QMessageBox::critical(Core::ICore::mainWindow(), tr("Heob"), + tr("The %1 executables must be in the appropriate location.") + .arg("<a href=\"https://github.com/ssbssa/heob/releases\">Heob</a>")); return; } + // dwarfstack + if (abi.osFlavor() == Abi::WindowsMSysFlavor) { + const QString dwarfstack = QString("dwarfstack%1.dll").arg(abi.wordWidth()); + const QString dwarfstackPath = dialog.path() + '/' + dwarfstack; + if (!QFile::exists(dwarfstackPath) + && CheckableMessageBox::doNotShowAgainInformation( + Core::ICore::mainWindow(), tr("Heob"), + tr("Heob used with MinGW projects needs the %1 DLLs for proper stacktrace resolution.") + .arg("<a href=\"https://github.com/ssbssa/dwarfstack/releases\">Dwarfstack</a>"), + ICore::settings(), "HeobDwarfstackInfo", + QDialogButtonBox::Ok | QDialogButtonBox::Cancel, + QDialogButtonBox::Ok) != QDialogButtonBox::Ok) + return; + } + // output xml file QDir wdDir(workingDirectory); const QString xmlPath = wdDir.absoluteFilePath(dialog.xmlName()); diff --git a/src/shared/qbs b/src/shared/qbs -Subproject 1ee4260129336c83d7acab1e3e675f7f507ad46 +Subproject 6655d563c3cac6dbfd61bfb3dd15ae5b9467d5a diff --git a/src/src.qbs b/src/src.qbs index 28246e5476..ff52425d5d 100644 --- a/src/src.qbs +++ b/src/src.qbs @@ -35,6 +35,7 @@ Project { qbsBaseDir + "/src/plugins/plugins.qbs", qbsBaseDir + "/share/share.qbs", qbsBaseDir + "/src/app/apps.qbs", + qbsBaseDir + "/src/shared/bundledqt/bundledqt.qbs", qbsBaseDir + "/src/shared/json/json.qbs", ] } diff --git a/src/tools/clangbackend/source/clangbackend_global.h b/src/tools/clangbackend/source/clangbackend_global.h index a7ca785958..31425c0717 100644 --- a/src/tools/clangbackend/source/clangbackend_global.h +++ b/src/tools/clangbackend/source/clangbackend_global.h @@ -36,7 +36,7 @@ enum class PreferredTranslationUnit LastUninitialized, }; -// CLANG-UPGRADE-CHECK: Remove IS_SUSPEND_SUPPORTED once we require clang >= 7.0 +// CLANG-UPGRADE-CHECK: Remove IS_PRETTY_DECL_SUPPORTED once we require clang >= 7.0 #if defined(CINDEX_VERSION_HAS_PRETTYDECL_BACKPORTED) || CINDEX_VERSION_MINOR >= 47 # define IS_PRETTY_DECL_SUPPORTED #endif diff --git a/src/tools/clangbackend/source/clangcodemodelserver.cpp b/src/tools/clangbackend/source/clangcodemodelserver.cpp index d3e873d732..185f0f8096 100644 --- a/src/tools/clangbackend/source/clangcodemodelserver.cpp +++ b/src/tools/clangbackend/source/clangcodemodelserver.cpp @@ -28,7 +28,6 @@ #include "clangdocuments.h" #include "clangdocumentsuspenderresumer.h" #include "clangfilesystemwatcher.h" -#include "clangtranslationunits.h" #include "codecompleter.h" #include "diagnosticset.h" #include "tokeninfos.h" @@ -85,21 +84,36 @@ void ClangCodeModelServer::end() QCoreApplication::exit(); } +static std::vector<Document> operator+(const std::vector<Document> &a, + const std::vector<Document> &b) +{ + std::vector<Document> result = a; + result.insert(result.end(), b.begin(), b.end()); + return result; +} + +// TODO: Rename to createOrUpdate... void ClangCodeModelServer::registerTranslationUnitsForEditor(const ClangBackEnd::RegisterTranslationUnitForEditorMessage &message) { qCDebug(serverLog) << "########## registerTranslationUnitsForEditor"; TIME_SCOPE_DURATION("ClangCodeModelServer::registerTranslationUnitsForEditor"); try { - auto createdDocuments = documents.create(message.fileContainers()); + DocumentResetInfos toReset; + QVector<FileContainer> toCreate; + categorizeFileContainers(message.fileContainers(), toCreate, toReset); + + const std::vector<Document> createdDocuments = documents.create(toCreate); for (const auto &document : createdDocuments) documentProcessors().create(document); + const std::vector<Document> resetDocuments_ = resetDocuments(toReset); + unsavedFiles.createOrUpdate(message.fileContainers()); documents.setUsedByCurrentEditor(message.currentEditorFilePath()); documents.setVisibleInEditors(message.visibleEditorFilePaths()); - processSuspendResumeJobs(documents.documents()); - processInitialJobsForDocuments(createdDocuments); + processSuspendResumeJobs(documents.documents()); + processInitialJobsForDocuments(createdDocuments + resetDocuments_); } catch (const std::exception &exception) { qWarning() << "Error in ClangCodeModelServer::registerTranslationUnitsForEditor:" << exception.what(); } @@ -148,6 +162,14 @@ void ClangCodeModelServer::unregisterTranslationUnitsForEditor(const ClangBackEn } } +static DocumentResetInfos toDocumentResetInfos(const std::vector<Document> &documents) +{ + DocumentResetInfos infos; + for (const auto &d : documents) + infos.push_back(DocumentResetInfo{d, d.fileContainer()}); + return infos; +} + void ClangCodeModelServer::registerProjectPartsForEditor(const RegisterProjectPartsForEditorMessage &message) { qCDebug(serverLog) << "########## registerProjectPartsForEditor"; @@ -157,14 +179,7 @@ void ClangCodeModelServer::registerProjectPartsForEditor(const RegisterProjectPa projects.createOrUpdate(message.projectContainers()); std::vector<Document> affectedDocuments = documents.setDocumentsDirtyIfProjectPartChanged(); - for (Document &document : affectedDocuments) { - document.setResponsivenessIncreaseNeeded(document.isResponsivenessIncreased()); - - documentProcessors().remove(document); - document.translationUnits().removeAll(); - document.translationUnits().createAndAppend(); - documentProcessors().create(document); - } + resetDocuments(toDocumentResetInfos(affectedDocuments)); processJobsForDirtyAndVisibleDocuments(); } catch (const std::exception &exception) { @@ -415,6 +430,45 @@ void ClangCodeModelServer::processSuspendResumeJobs(const std::vector<Document> } } +void ClangCodeModelServer::categorizeFileContainers(const QVector<FileContainer> &fileContainers, + QVector<FileContainer> &toCreate, + DocumentResetInfos &toReset) const +{ + for (const FileContainer &fileContainer : fileContainers) { + const std::vector<Document> matching = documents.filtered([&](const Document &document) { + return document.filePath() == fileContainer.filePath(); + }); + if (matching.empty()) + toCreate.push_back(fileContainer); + else + toReset.push_back(DocumentResetInfo{*matching.begin(), fileContainer}); + } +} + +std::vector<Document> ClangCodeModelServer::resetDocuments(const DocumentResetInfos &infos) +{ + std::vector<Document> newDocuments; + + for (const DocumentResetInfo &info : infos) { + const Document &document = info.documentToRemove; + QTC_CHECK(document.filePath() == info.fileContainer.filePath()); + + documents.remove({document.fileContainer()}); + + Document newDocument = *documents.create({info.fileContainer}).begin(); + newDocument.setDirtyIfDependencyIsMet(document.filePath()); + newDocument.setIsUsedByCurrentEditor(document.isUsedByCurrentEditor()); + newDocument.setIsVisibleInEditor(document.isVisibleInEditor(), document.visibleTimePoint()); + newDocument.setResponsivenessIncreaseNeeded(document.isResponsivenessIncreased()); + + documentProcessors().reset(document, newDocument); + + newDocuments.push_back(newDocument); + } + + return newDocuments; +} + void ClangCodeModelServer::processInitialJobsForDocuments(const std::vector<Document> &documents) { for (const auto &document : documents) { diff --git a/src/tools/clangbackend/source/clangcodemodelserver.h b/src/tools/clangbackend/source/clangcodemodelserver.h index 98508f348c..ee4ecd4847 100644 --- a/src/tools/clangbackend/source/clangcodemodelserver.h +++ b/src/tools/clangbackend/source/clangcodemodelserver.h @@ -42,6 +42,12 @@ namespace ClangBackEnd { +struct DocumentResetInfo { + Document documentToRemove; + FileContainer fileContainer; +}; +using DocumentResetInfos = QVector<DocumentResetInfo>; + class ClangCodeModelServer : public ClangCodeModelServerInterface, public IpcClientProvider<ClangCodeModelClientInterface> { @@ -79,6 +85,11 @@ private: void processTimerForVisibleButNotCurrentDocuments(); void processSuspendResumeJobs(const std::vector<Document> &documents); + void categorizeFileContainers(const QVector<FileContainer> &fileContainers, + QVector<FileContainer> &toCreate, + DocumentResetInfos &toReset) const; + std::vector<Document> resetDocuments(const DocumentResetInfos &infos); + void addAndRunUpdateJobs(std::vector<Document> documents); private: diff --git a/src/tools/clangbackend/source/clangdocument.cpp b/src/tools/clangbackend/source/clangdocument.cpp index cbbaf51b33..bef88e9cb2 100644 --- a/src/tools/clangbackend/source/clangdocument.cpp +++ b/src/tools/clangbackend/source/clangdocument.cpp @@ -155,6 +155,11 @@ bool Document::isParsed() const return d->translationUnits.areAllTranslationUnitsParsed(); } +long Document::useCount() const +{ + return d.use_count(); +} + Utf8String Document::filePath() const { checkIfNull(); @@ -175,6 +180,7 @@ FileContainer Document::fileContainer() const return FileContainer(d->filePath, d->projectPart.id(), + d->fileArguments, Utf8String(), false, d->documentRevision); diff --git a/src/tools/clangbackend/source/clangdocument.h b/src/tools/clangbackend/source/clangdocument.h index 415deefbe9..92a852c820 100644 --- a/src/tools/clangbackend/source/clangdocument.h +++ b/src/tools/clangbackend/source/clangdocument.h @@ -78,6 +78,7 @@ public: bool isNull() const; bool isIntact() const; bool isParsed() const; + long useCount() const; Utf8String filePath() const; Utf8StringVector fileArguments() const; diff --git a/src/tools/clangbackend/source/clangdocumentprocessor.cpp b/src/tools/clangbackend/source/clangdocumentprocessor.cpp index 8196e804d0..3c51db5b49 100644 --- a/src/tools/clangbackend/source/clangdocumentprocessor.cpp +++ b/src/tools/clangbackend/source/clangdocumentprocessor.cpp @@ -102,6 +102,12 @@ JobRequests DocumentProcessor::process() return d->jobs.process(); } +JobRequests DocumentProcessor::stop() +{ + d->supportiveTranslationUnitInitializer.abort(); + return d->jobs.stop(); +} + Document DocumentProcessor::document() const { return d->document; diff --git a/src/tools/clangbackend/source/clangdocumentprocessor.h b/src/tools/clangbackend/source/clangdocumentprocessor.h index 9c3fb147f9..8f4e805158 100644 --- a/src/tools/clangbackend/source/clangdocumentprocessor.h +++ b/src/tools/clangbackend/source/clangdocumentprocessor.h @@ -59,6 +59,7 @@ public: = PreferredTranslationUnit::RecentlyParsed); JobRequests process(); + JobRequests stop(); Document document() const; diff --git a/src/tools/clangbackend/source/clangdocumentprocessors.cpp b/src/tools/clangbackend/source/clangdocumentprocessors.cpp index 611611a41f..8e5a51d005 100644 --- a/src/tools/clangbackend/source/clangdocumentprocessors.cpp +++ b/src/tools/clangbackend/source/clangdocumentprocessors.cpp @@ -28,6 +28,8 @@ #include "clangexceptions.h" #include "projectpart.h" +#include <utils/algorithm.h> + namespace ClangBackEnd { DocumentProcessors::DocumentProcessors(Documents &documents, @@ -84,6 +86,37 @@ void DocumentProcessors::remove(const Document &document) throw DocumentProcessorDoesNotExist(document.filePath(), document.projectPart().id()); } +static JobRequests jobsToTakeOver(const JobRequests &jobsStillInQueue, + const Utf8String &updatedProjectPartId) +{ + JobRequests jobs = Utils::filtered(jobsStillInQueue, [](const JobRequest &job) { + return job.isTakeOverable(); + }); + + for (JobRequest &job : jobs) + job.projectPartId = updatedProjectPartId; + + return jobs; +} + +void DocumentProcessors::reset(const Document &oldDocument, const Document &newDocument) +{ + // Wait until the currently running jobs finish and remember the not yet + // processed job requests for the new processor... + const JobRequests jobsStillInQueue = processor(oldDocument).stop(); + // ...but do not take over irrelevant ones. + const JobRequests jobsForNewProcessor = jobsToTakeOver(jobsStillInQueue, + newDocument.projectPart().id()); + + // Remove current processor + remove(oldDocument); + + // Create new processor and take over not yet processed jobs. + DocumentProcessor newProcessor = create(newDocument); + for (const JobRequest &job : jobsForNewProcessor) + newProcessor.addJob(job); +} + JobRequests DocumentProcessors::process() { JobRequests jobsStarted; diff --git a/src/tools/clangbackend/source/clangdocumentprocessors.h b/src/tools/clangbackend/source/clangdocumentprocessors.h index 83e37f5276..4060fd4b47 100644 --- a/src/tools/clangbackend/source/clangdocumentprocessors.h +++ b/src/tools/clangbackend/source/clangdocumentprocessors.h @@ -54,6 +54,7 @@ public: DocumentProcessor create(const Document &document); DocumentProcessor processor(const Document &document); void remove(const Document &document); + void reset(const Document &oldDocument, const Document &newDocument); JobRequests process(); diff --git a/src/tools/clangbackend/source/clangjobrequest.cpp b/src/tools/clangbackend/source/clangjobrequest.cpp index e2c6f8f6d4..995102bcf0 100644 --- a/src/tools/clangbackend/source/clangjobrequest.cpp +++ b/src/tools/clangbackend/source/clangjobrequest.cpp @@ -168,6 +168,43 @@ static JobRequest::RunConditions conditionsForType(JobRequest::Type type) return conditions; } +bool JobRequest::isTakeOverable() const +{ + // When new project information comes in and there are unprocessed jobs + // in the queue, we need to decide what to do with them. + + switch (type) { + // Never discard these as the client side might wait for a response. + case Type::CompleteCode: + case Type::RequestReferences: + case Type::FollowSymbol: + case Type::RequestToolTip: + return true; + + // Discard this one as UpdateDocumentAnnotations will have the same effect. + case Type::RequestDocumentAnnotations: + + // Discard Suspend because the document will be cleared anyway. + // Discard Resume because a (re)parse will happen on demand. + case Type::SuspendDocument: + case Type::ResumeDocument: + + // Discard these as they are initial jobs that will be recreated on demand + // anyway. + case Type::UpdateDocumentAnnotations: + case Type::CreateInitialDocumentPreamble: + + // Discard these as they only make sense in a row. Avoid splitting them up. + case Type::ParseSupportiveTranslationUnit: + case Type::ReparseSupportiveTranslationUnit: + + case Type::Invalid: + return false; + } + + return false; +} + JobRequest::JobRequest(Type type) { static quint64 idCounter = 0; diff --git a/src/tools/clangbackend/source/clangjobrequest.h b/src/tools/clangbackend/source/clangjobrequest.h index 81c78ba9db..0447496753 100644 --- a/src/tools/clangbackend/source/clangjobrequest.h +++ b/src/tools/clangbackend/source/clangjobrequest.h @@ -96,6 +96,7 @@ public: IAsyncJob *createJob() const; void cancelJob(ClangCodeModelClientInterface &client) const; + bool isTakeOverable() const; bool operator==(const JobRequest &other) const; diff --git a/src/tools/clangbackend/source/clangjobs.cpp b/src/tools/clangbackend/source/clangjobs.cpp index 872aecd936..61f99b3985 100644 --- a/src/tools/clangbackend/source/clangjobs.cpp +++ b/src/tools/clangbackend/source/clangjobs.cpp @@ -113,6 +113,20 @@ JobRequests Jobs::process() return jobsStarted; } +JobRequests Jobs::stop() +{ + // Take the queued jobs to prevent processing them. + const JobRequests queuedJobs = queue(); + queue().clear(); + + // Wait until currently running jobs finish. + QFutureSynchronizer<void> waitForFinishedJobs; + foreach (const RunningJob &runningJob, m_running.values()) + waitForFinishedJobs.addFuture(runningJob.future); + + return queuedJobs; +} + JobRequests Jobs::runJobs(const JobRequests &jobsRequests) { JobRequests jobsStarted; @@ -166,6 +180,11 @@ void Jobs::onJobFinished(IAsyncJob *asyncJob) process(); } +Jobs::JobFinishedCallback Jobs::jobFinishedCallback() const +{ + return m_jobFinishedCallback; +} + void Jobs::setJobFinishedCallback(const JobFinishedCallback &jobFinishedCallback) { m_jobFinishedCallback = jobFinishedCallback; diff --git a/src/tools/clangbackend/source/clangjobs.h b/src/tools/clangbackend/source/clangjobs.h index c2984db4b4..dd6b5d5081 100644 --- a/src/tools/clangbackend/source/clangjobs.h +++ b/src/tools/clangbackend/source/clangjobs.h @@ -71,6 +71,7 @@ public: = PreferredTranslationUnit::RecentlyParsed); JobRequests process(); + JobRequests stop(); void setJobFinishedCallback(const JobFinishedCallback &jobFinishedCallback); @@ -80,6 +81,7 @@ public /*for tests*/: const JobRequests &queue() const; bool isJobRunningForTranslationUnit(const Utf8String &translationUnitId) const; bool isJobRunningForJobRequest(const JobRequest &jobRequest) const; + JobFinishedCallback jobFinishedCallback() const; private: JobRequests runJobs(const JobRequests &jobRequest); diff --git a/src/tools/clangbackend/source/clangsupportivetranslationunitinitializer.cpp b/src/tools/clangbackend/source/clangsupportivetranslationunitinitializer.cpp index 9c162eb8cf..b84fe43155 100644 --- a/src/tools/clangbackend/source/clangsupportivetranslationunitinitializer.cpp +++ b/src/tools/clangbackend/source/clangsupportivetranslationunitinitializer.cpp @@ -56,8 +56,7 @@ SupportiveTranslationUnitInitializer::State SupportiveTranslationUnitInitializer void SupportiveTranslationUnitInitializer::startInitializing() { - QTC_CHECK(m_state == State::NotInitialized); - if (abortIfDocumentIsClosed()) + if (!checkStateAndDocument(State::NotInitialized)) return; m_document.translationUnits().createAndAppend(); @@ -71,10 +70,15 @@ void SupportiveTranslationUnitInitializer::startInitializing() m_state = State::WaitingForParseJob; } +void SupportiveTranslationUnitInitializer::abort() +{ + m_jobs.setJobFinishedCallback(Jobs::JobFinishedCallback()); + m_state = State::Aborted; +} + void SupportiveTranslationUnitInitializer::checkIfParseJobFinished(const Jobs::RunningJob &job) { - QTC_CHECK(m_state == State::WaitingForParseJob); - if (abortIfDocumentIsClosed()) + if (!checkStateAndDocument(State::WaitingForParseJob)) return; if (job.jobRequest.type == JobRequest::Type::ParseSupportiveTranslationUnit) { @@ -90,8 +94,7 @@ void SupportiveTranslationUnitInitializer::checkIfParseJobFinished(const Jobs::R void SupportiveTranslationUnitInitializer::checkIfReparseJobFinished(const Jobs::RunningJob &job) { - QTC_CHECK(m_state == State::WaitingForReparseJob); - if (abortIfDocumentIsClosed()) + if (!checkStateAndDocument(State::WaitingForReparseJob)) return; if (job.jobRequest.type == JobRequest::Type::ReparseSupportiveTranslationUnit) { @@ -106,16 +109,20 @@ void SupportiveTranslationUnitInitializer::checkIfReparseJobFinished(const Jobs: } } -bool SupportiveTranslationUnitInitializer::abortIfDocumentIsClosed() +bool SupportiveTranslationUnitInitializer::checkStateAndDocument(State currentExpectedState) { - QTC_CHECK(m_isDocumentClosedChecker); + if (m_state != currentExpectedState) { + m_state = State::Aborted; + return false; + } + QTC_CHECK(m_isDocumentClosedChecker); if (m_isDocumentClosedChecker(m_document.filePath(), m_document.projectPart().id())) { m_state = State::Aborted; - return true; + return false; } - return false; + return true; } void SupportiveTranslationUnitInitializer::addJob(JobRequest::Type jobRequestType) diff --git a/src/tools/clangbackend/source/clangsupportivetranslationunitinitializer.h b/src/tools/clangbackend/source/clangsupportivetranslationunitinitializer.h index 18a01864dd..785e145c60 100644 --- a/src/tools/clangbackend/source/clangsupportivetranslationunitinitializer.h +++ b/src/tools/clangbackend/source/clangsupportivetranslationunitinitializer.h @@ -52,6 +52,7 @@ public: State state() const; void startInitializing(); + void abort(); public: // for tests void setState(const State &state); @@ -59,7 +60,7 @@ public: // for tests void checkIfReparseJobFinished(const Jobs::RunningJob &job); private: - bool abortIfDocumentIsClosed(); + bool checkStateAndDocument(State currentExpectedState); void addJob(JobRequest::Type jobRequestType); private: diff --git a/src/tools/clangbackend/source/clangtooltipinfocollector.cpp b/src/tools/clangbackend/source/clangtooltipinfocollector.cpp index 44dde1edbb..c9b70350a4 100644 --- a/src/tools/clangbackend/source/clangtooltipinfocollector.cpp +++ b/src/tools/clangbackend/source/clangtooltipinfocollector.cpp @@ -237,7 +237,7 @@ Utf8String ToolTipInfoCollector::text(const Cursor &cursor, const Cursor &refere if (referenced.isAnyTypeAlias()) return textForAnyTypeAlias(referenced); - if (referenced.isFunctionLike()) + if (referenced.isFunctionLike() || referenced.kind() == CXCursor_Constructor) return textForFunctionLike(referenced); if (referenced.type().canonical().isBuiltinType()) @@ -412,6 +412,14 @@ ToolTipInfo ToolTipInfoCollector::qDocInfo(const Cursor &cursor) const if (isBuiltinOrPointerToBuiltin(cursor.type())) return result; + if (cursor.kind() == CXCursor_Constructor) { + const ToolTipInfo parentInfo = qDocInfo(cursor.semanticParent()); + result.setQdocIdCandidates(parentInfo.qdocIdCandidates()); + result.setQdocMark(parentInfo.qdocMark()); + result.setQdocCategory(ToolTipInfo::Unknown); + return result; + } + result.setQdocIdCandidates(qDocIdCandidates(cursor)); result.setQdocMark(qdocMark(cursor)); result.setQdocCategory(qdocCategory(cursor)); diff --git a/src/tools/sdktool/README.md b/src/tools/sdktool/README.md index a8e9a75f6d..764fee5342 100644 --- a/src/tools/sdktool/README.md +++ b/src/tools/sdktool/README.md @@ -1,4 +1,4 @@ -The SDK tool can be used to set up Qt versions, tool chains and kits +The SDK tool can be used to set up Qt versions, tool chains, devices and kits in Qt Creator. There still is a lot of knowledge about Qt Creator internals required @@ -6,18 +6,23 @@ to use this tool! Note that some tool chains/Qt versions/kits may require settings not available via command line switches. All operations will add any parameter -followed by another parameter in the form "<TYPE>:<VALUE>" to the +followed by another parameter in the form `<TYPE>:<VALUE>` to the configuration that they create. Currently supported types are int, bool, QString, QByteArray and QVariantList. Dependencies: -The SDK tool depends on the Utils library of Qt Creator and Qt itself. -Please make sure both libraries are found by setting PATH/LD_LIBRARY_PATH. +============= + +The SDK tool depends only on Qt core library. Usage: +====== + +``` +./sdktool --help Qt Creator SDK setup tool. - Usage:./sdktool <ARGS> <OPERATION> <OPERATION_ARGS> + Usage: sdktool <ARGS> <OPERATION> <OPERATION_ARGS> ARGS: --help|-h Print this help text @@ -26,109 +31,174 @@ ARGS: OPERATION: One of: addKeys add settings to Qt Creator configuration - addKit add a Kit to Qt Creator + addCMake add a CMake tool to Qt Creator + addDebugger add a debugger to Qt Creator + addDev add a device to Qt Creator addQt add a Qt version to Qt Creator addTC add a tool chain to Qt Creator - findKey find a key in the settings of Qt Creator - find find a value in the settings of Qt Creator + addKit add a kit to Qt Creator get get settings from Qt Creator configuration + rmCMake remove a CMake tool from Qt Creator + rmKit remove a kit from Qt Creator + rmDebugger remove a debugger from Qt Creator + rmDev remove a device from Qt Creator rmKeys remove settings from Qt Creator configuration - rmKit remove a Kit from Qt Creator rmQt remove a Qt version from Qt Creator rmTC remove a tool chain from Qt Creator + findKey find a key in the settings of Qt Creator + find find a value in the settings of Qt Creator OPERATION_ARGS: use "--help <OPERATION>" to get help on the arguments required for an operation. - - -Help for individual operations can be retrieved using - - ./sdktool --help addKit - -Examples: +``` Add a tool chain: +================ + +``` ./sdktool addTC \ - --id "ProjectExplorer.ToolChain.Gcc:my_test_TC" \ - --name "Test TC" \ - --path /usr/bin/g++ \ + --id "ProjectExplorer.ToolChain.Gcc:company.product.toolchain.g++" \ + --language 2 + --name "GCC (C++, x86_64)" \ + --path /home/code/build/gcc-6.3/usr/bin/g++ \ --abi x86-linux-generic-elf-64bit \ --supportedAbis x86-linux-generic-elf-64bit,x86-linux-generic-elf-32bit \ ADDITIONAL_INTEGER_PARAMETER int:42 \ ADDITIONAL_STRING_PARAMETER "QString:some string" \ +``` Tricky parts: - - The id has to be in the form "ToolChainType:some_unique_part", where the - tool chain type must be one of (as of Qt Creator 2.6): - * ProjectExplorer.ToolChain.Msvc for Microsoft MSVC compilers + - language is one of: + * C + * Cxx + - `id` has to be in the form `ToolChainType:some_unique_part`, where the + tool chain type can be one of the following, or other toolchains that plugins provide: + * `ProjectExplorer.ToolChain.Msvc` for Microsoft MSVC compilers (Note: This one will be autodetected anyway, so there is little need to add it from the sdktool) - * ProjectExplorer.ToolChain.WinCE for Windows CE tool chain by - Microsoft (Note: This one will be autodetected anyway, so there - is little need to add it from the sdktool) - * ProjectExplorer.ToolChain.Gcc for a normal GCC (linux/mac) - * Qt4ProjectManager.ToolChain.Android for the Android tool chain - * ProjectExplorer.ToolChain.Clang for the Clang compiler - * ProjectExplorer.ToolChain.LinuxIcc for the LinuxICC compiler - * ProjectExplorer.ToolChain.Mingw for the Mingw compiler - - Check the classes derived from ProjectExplorer::ToolChain for their + * `ProjectExplorer.ToolChain.Gcc` for a normal GCC (linux/mac) + * `ProjectExplorer.ToolChain.Clang` for the Clang compiler + * `ProjectExplorer.ToolChain.LinuxIcc` for the LinuxICC compiler + * `ProjectExplorer.ToolChain.Mingw` for the Mingw compiler + * `ProjectExplorer.ToolChain.ClangCl` for the Clang/CL compiler + * `ProjectExplorer.ToolChain.Custom` for custom toolchain + * `Qt4ProjectManager.ToolChain.Android` for the Android tool chain + * `Qnx.QccToolChain` for the Qnx QCC tool chain + + Check the classes derived from `ProjectExplorer::ToolChain` for their Ids. - The some_unique_part can be anything. Creator uses GUIDs by default, + The `some_unique_part` can be anything. Qt Creator uses GUIDs by default, but any string is fine for the SDK to use. - - The ABI needs to be in a format that ProjectExplorer::Abi::fromString(...) + - `abi` needs to be in a format that `ProjectExplorer::Abi::fromString(...)` can parse. +Add a debugger: +=============== + + +``` +./sdktool addDebugger \ + --id "company.product.toolchain.gdb" \ + --name "GDB (company, product)" \ + --engine 1 \ + --binary /home/code/build/gdb-7.12/bin/gdb \ + --abis arm-linux-generic-elf-32 \ +``` + +Tricky parts: + - `id` can be any unique string. In Qt Creator this is set as the autodetection + source of the Qt version. + TODO: is it use in any special way? + + - `engine` is the integer used in the enum `Debugger::DebuggerEngineType` + + Currently these are (Qt Creator 4.6): + * 1 for gdb + * 4 for cdb + * 8 for pdb + * 256 for lldb + + - `binary` can be a absolute path, the value `auto` or an ABI. + This is used to find the appropriate debugger for MSVC toolchains + where Creator does not know the binary path itself. + Add a Qt version: +================= + +``` ./sdktool addQt \ - --id "my_test_Qt" \ - --name "Test Qt" \ - --qmake /home/code/build/qt4-4/bin/qmake \ + --id "company.product.qt" \ + --name "Custom Qt" \ + --qmake /home/code/build/qt-5.9/bin/qmake \ --type Qt4ProjectManager.QtVersion.Desktop \ +``` Tricky parts: - - The id can be any unique string. In creator this is set as the autodetection + - `id` can be any unique string. In Qt Creator this is set as the autodetection source of the Qt version. - - type must be the string returned by BaseQtVersion::type(). + - `type` must be the string returned by `BaseQtVersion::type()`. - Currently these are (Qt Creator 2.6): - * Qt4ProjectManager.QtVersion.Android for Android - * Qt4ProjectManager.QtVersion.Desktop for a desktop Qt - * RemoteLinux.EmbeddedLinuxQt for an embedded linux Qt - * Qt4ProjectManager.QtVersion.Maemo for an Maemo Qt - * Qt4ProjectManager.QtVersion.QNX.QNX for Qt on QNX - * Qt4ProjectManager.QtVersion.Simulator for Qt running in the Qt simulator - * Qt4ProjectManager.QtVersion.WinCE for Qt on WinCE + Currently these are (Qt Creator 4.6): + * `Qt4ProjectManager.QtVersion.Android` for Android + * `Qt4ProjectManager.QtVersion.Desktop` for a desktop Qt + * `Qt4ProjectManager.QtVersion.Ios` for iOS + * `Qt4ProjectManager.QtVersion.QNX.QNX` for QNX + * `RemoteLinux.EmbeddedLinuxQt` for Embedded Linux + * `WinRt.QtVersion.WindowsRuntime` for Windows RT + * `WinRt.QtVersion.WindowsPhone` for Windows RT phone -Add a Kit using the newly set up tool chain and Qt version: +Add a kit: +========== + +Using the newly set up tool chain and Qt version: + +``` ./sdktool addKit \ - --id "my_test_kit" \ - --name "Test Kit" \ - --debuggerengine 1 \ - --debugger /tmp/gdb-test \ - --devicetype Desktop \ + --id "company.product.kit" \ + --name "Qt %{Qt:Version} (company, product)" \ + --debuggerid "company.product.toolchain.gdb" \ + --devicetype GenericLinuxOsType \ --sysroot /tmp/sysroot \ - --toolchain "ProjectExplorer.ToolChain.Gcc:my_test_TC" \ - --qt "my_test_Qt" \ - --mkspec "testspec" \ + --Ctoolchain "ProjectExplorer.ToolChain.Gcc:company.product.toolchain.gcc" \ + --Cxxtoolchain "ProjectExplorer.ToolChain.Gcc:company.product.toolchain.g++" \ + --qt "company.product.qt" \ + --mkspec "devices/linux-mipsel-broadcom-97425-g++" \ +``` Tricky parts: - - debuggerengine is the integer used in the enum Debugger::DebuggerEngineType - The most important type is 1 for GDB. - - debugger can be a absolute path or the value: 'auto' + - `devicetype` is the string returned IDevice::type() + + Currently these are (Qt Creator 4.6): + * `Android.Device.Type` for Android devices + * `Desktop` for code running on the local desktop + * `Ios.Device.Type` for an iOS device + * `Ios.Simulator.Type` for an iOS simulator + * `GenericLinuxOsType` for an embedded Linux device + * `WinRt.Device.Local` for Windows RT (local) + * `WinRt.Device.Emulator` for a Windows RT emulator + * `WinRt.Device.Phone` for a Windows RT phone + + - `debuggerid` is one of the ids used when setting up toolchains with + `sdktool addDebugger`. + + - `<Lang>toolchain` is one of the ids used when setting up toolchains with + `sdktool addTC`. + + - `<Lang>` is one of (options can be extended by plugins): + * C, Cxx, Nim + + - `qt` is one of the ids used when setting up Qt versions with `sdktool addQt`. - - devicetype is the string returned IDevice::type() - Currently these are (Qt Creator 2.6): - * Android.Device.Type for Android devices - * Desktop for code running on the local desktop - * HarmattanOsType for N9/N950 devices based on Harmattan - * Maemo5OsType for N900 devices based on Maemo +Add a device: +============= - - toolchain is one of the ids used when setting up toolchains with sdktool addTC. +TODO - - qt is one of the ids used when setting up Qt versions with sdktool addQt. +Add a CMake: +============ +TODO diff --git a/tests/system/settings/mac/QtProject/qtcreator/profiles.xml b/tests/system/settings/mac/QtProject/qtcreator/profiles.xml index 3df47f6a77..a3f0a20048 100644 --- a/tests/system/settings/mac/QtProject/qtcreator/profiles.xml +++ b/tests/system/settings/mac/QtProject/qtcreator/profiles.xml @@ -49,7 +49,7 @@ <value type="QString" key="PE.Profile.Icon">:///DESKTOP///</value> <value type="QString" key="PE.Profile.Id">{fc5f34fd-e703-4f4c-85ce-ea5bf5869e6a}</value> <valuelist type="QVariantList" key="PE.Profile.MutableInfo"/> - <value type="QString" key="PE.Profile.Name">Desktop 561 default</value> + <value type="QString" key="PE.Profile.Name">Desktop 5.6.1 default</value> <value type="bool" key="PE.Profile.SDK">false</value> <valuelist type="QVariantList" key="PE.Profile.StickyInfo"/> </valuemap> @@ -75,7 +75,7 @@ <value type="QString" key="PE.Profile.Icon">:///DESKTOP///</value> <value type="QString" key="PE.Profile.Id">{1dcb5509-1670-470d-80a5-8a988f36e4e2}</value> <valuelist type="QVariantList" key="PE.Profile.MutableInfo"/> - <value type="QString" key="PE.Profile.Name">Desktop 487 default</value> + <value type="QString" key="PE.Profile.Name">Desktop 4.8.7 default</value> <value type="bool" key="PE.Profile.SDK">false</value> </valuemap> </data> @@ -101,7 +101,7 @@ <value type="QString" key="PE.Profile.Icon">:///DESKTOP///</value> <value type="QString" key="PE.Profile.Id">{a1e860d1-c241-4abf-80fe-cf0c9f0a43b3}</value> <valuelist type="QVariantList" key="PE.Profile.MutableInfo"/> - <value type="QString" key="PE.Profile.Name">Desktop 531 default</value> + <value type="QString" key="PE.Profile.Name">Desktop 5.3.1 default</value> <value type="bool" key="PE.Profile.SDK">false</value> <valuelist type="QVariantList" key="PE.Profile.StickyInfo"/> </valuemap> diff --git a/tests/system/settings/unix/QtProject/qtcreator/profiles.xml b/tests/system/settings/unix/QtProject/qtcreator/profiles.xml index 265a81a89b..1f56742fe0 100644 --- a/tests/system/settings/unix/QtProject/qtcreator/profiles.xml +++ b/tests/system/settings/unix/QtProject/qtcreator/profiles.xml @@ -44,7 +44,7 @@ <value type="QString" key="PE.Profile.Icon">:///DESKTOP///</value> <value type="QString" key="PE.Profile.Id">{1dcb5509-1670-470d-80a5-8a988f36e4e2}</value> <valuelist type="QVariantList" key="PE.Profile.MutableInfo"/> - <value type="QString" key="PE.Profile.Name">Desktop 487 default</value> + <value type="QString" key="PE.Profile.Name">Desktop 4.8.7 default</value> <value type="bool" key="PE.Profile.SDK">false</value> </valuemap> </data> @@ -66,7 +66,7 @@ <value type="QString" key="PE.Profile.Icon">:///DESKTOP///</value> <value type="QString" key="PE.Profile.Id">{e91398ba-6443-4b02-b416-782a70d9df90}</value> <valuelist type="QVariantList" key="PE.Profile.MutableInfo"/> - <value type="QString" key="PE.Profile.Name">Desktop 531 default</value> + <value type="QString" key="PE.Profile.Name">Desktop 5.3.1 default</value> <value type="bool" key="PE.Profile.SDK">false</value> <valuelist type="QVariantList" key="PE.Profile.StickyInfo"/> </valuemap> @@ -90,7 +90,7 @@ <value type="QString" key="PE.Profile.Icon">:///DESKTOP///</value> <value type="QString" key="PE.Profile.Id">{8ca91e21-c12e-4876-85b3-4b2141708acb}</value> <valuelist type="QVariantList" key="PE.Profile.MutableInfo"/> - <value type="QString" key="PE.Profile.Name">Desktop 541 GCC</value> + <value type="QString" key="PE.Profile.Name">Desktop 5.4.1 GCC</value> <value type="bool" key="PE.Profile.SDK">false</value> <valuelist type="QVariantList" key="PE.Profile.StickyInfo"/> </valuemap> @@ -114,7 +114,7 @@ <value type="QString" key="PE.Profile.Icon">:///DESKTOP///</value> <value type="QString" key="PE.Profile.Id">{542217c7-ce0f-48f7-843b-d4fad339688d}</value> <valuelist type="QVariantList" key="PE.Profile.MutableInfo"/> - <value type="QString" key="PE.Profile.Name">Desktop 561 default</value> + <value type="QString" key="PE.Profile.Name">Desktop 5.6.1 default</value> <value type="bool" key="PE.Profile.SDK">false</value> <valuelist type="QVariantList" key="PE.Profile.StickyInfo"/> </valuemap> diff --git a/tests/system/settings/windows/QtProject/qtcreator/profiles.xml b/tests/system/settings/windows/QtProject/qtcreator/profiles.xml index 8baf4c029a..70eda53be2 100644 --- a/tests/system/settings/windows/QtProject/qtcreator/profiles.xml +++ b/tests/system/settings/windows/QtProject/qtcreator/profiles.xml @@ -25,7 +25,7 @@ <value type="QString" key="PE.Profile.Icon">:///DESKTOP///</value> <value type="QString" key="PE.Profile.Id">{9b35bbe6-25a7-4cce-ba07-487c795f5265}</value> <valuelist type="QVariantList" key="PE.Profile.MutableInfo"/> - <value type="QString" key="PE.Profile.Name">Desktop 487 default</value> + <value type="QString" key="PE.Profile.Name">Desktop 4.8.7 default</value> <value type="bool" key="PE.Profile.SDK">false</value> <valuelist type="QVariantList" key="PE.Profile.StickyInfo"/> </valuemap> @@ -53,7 +53,7 @@ <value type="QString" key="PE.Profile.Icon">:///DESKTOP///</value> <value type="QString" key="PE.Profile.Id">{6a95566e-8372-4372-8286-ef73af7de191}</value> <valuelist type="QVariantList" key="PE.Profile.MutableInfo"/> - <value type="QString" key="PE.Profile.Name">Desktop 531 default</value> + <value type="QString" key="PE.Profile.Name">Desktop 5.3.1 default</value> <value type="bool" key="PE.Profile.SDK">false</value> <valuelist type="QVariantList" key="PE.Profile.StickyInfo"/> </valuemap> @@ -81,7 +81,7 @@ <value type="QString" key="PE.Profile.Icon">:///DESKTOP///</value> <value type="QString" key="PE.Profile.Id">{10cf33c5-e36d-4a49-a8c7-086f3cf59695}</value> <valuelist type="QVariantList" key="PE.Profile.MutableInfo"/> - <value type="QString" key="PE.Profile.Name">Desktop 541 GCC</value> + <value type="QString" key="PE.Profile.Name">Desktop 5.4.1 GCC</value> <value type="bool" key="PE.Profile.SDK">false</value> <valuelist type="QVariantList" key="PE.Profile.StickyInfo"/> </valuemap> @@ -109,7 +109,7 @@ <value type="QString" key="PE.Profile.Icon">:///DESKTOP///</value> <value type="QString" key="PE.Profile.Id">{f9c7858c-d167-4b78-847a-91943bd0af07}</value> <valuelist type="QVariantList" key="PE.Profile.MutableInfo"/> - <value type="QString" key="PE.Profile.Name">Desktop 561 default</value> + <value type="QString" key="PE.Profile.Name">Desktop 5.6.1 default</value> <value type="bool" key="PE.Profile.SDK">false</value> <valuelist type="QVariantList" key="PE.Profile.StickyInfo"/> </valuemap> diff --git a/tests/system/shared/classes.py b/tests/system/shared/classes.py index eb74c9ad0d..402181cfa5 100644 --- a/tests/system/shared/classes.py +++ b/tests/system/shared/classes.py @@ -30,11 +30,11 @@ import operator class Targets: ALL_TARGETS = tuple(map(lambda x: 2 ** x , range(5))) - (DESKTOP_487_DEFAULT, + (DESKTOP_4_8_7_DEFAULT, EMBEDDED_LINUX, - DESKTOP_531_DEFAULT, - DESKTOP_541_GCC, - DESKTOP_561_DEFAULT) = ALL_TARGETS + DESKTOP_5_3_1_DEFAULT, + DESKTOP_5_4_1_GCC, + DESKTOP_5_6_1_DEFAULT) = ALL_TARGETS @staticmethod def availableTargetClasses(): @@ -42,7 +42,7 @@ class Targets: if platform.system() in ('Windows', 'Microsoft'): availableTargets.remove(Targets.EMBEDDED_LINUX) elif platform.system() == 'Darwin': - availableTargets.remove(Targets.DESKTOP_541_GCC) + availableTargets.remove(Targets.DESKTOP_5_4_1_GCC) return availableTargets @staticmethod @@ -54,20 +54,20 @@ class Targets: @staticmethod def qt4Classes(): - return (Targets.DESKTOP_487_DEFAULT | Targets.EMBEDDED_LINUX) + return (Targets.DESKTOP_4_8_7_DEFAULT | Targets.EMBEDDED_LINUX) @staticmethod def getStringForTarget(target): - if target == Targets.DESKTOP_487_DEFAULT: - return "Desktop 487 default" + if target == Targets.DESKTOP_4_8_7_DEFAULT: + return "Desktop 4.8.7 default" elif target == Targets.EMBEDDED_LINUX: return "Embedded Linux" - elif target == Targets.DESKTOP_531_DEFAULT: - return "Desktop 531 default" - elif target == Targets.DESKTOP_541_GCC: - return "Desktop 541 GCC" - elif target == Targets.DESKTOP_561_DEFAULT: - return "Desktop 561 default" + elif target == Targets.DESKTOP_5_3_1_DEFAULT: + return "Desktop 5.3.1 default" + elif target == Targets.DESKTOP_5_4_1_GCC: + return "Desktop 5.4.1 GCC" + elif target == Targets.DESKTOP_5_6_1_DEFAULT: + return "Desktop 5.6.1 default" else: return None @@ -83,7 +83,7 @@ class Targets: @staticmethod def getDefaultKit(): - return Targets.DESKTOP_531_DEFAULT + return Targets.DESKTOP_5_3_1_DEFAULT # this class holds some constants for easier usage inside the Projects view class ProjectSettings: @@ -169,9 +169,9 @@ class Qt5Path: @staticmethod def getPaths(pathSpec): - qt5targets = [Targets.DESKTOP_531_DEFAULT, Targets.DESKTOP_561_DEFAULT] + qt5targets = [Targets.DESKTOP_5_3_1_DEFAULT, Targets.DESKTOP_5_6_1_DEFAULT] if platform.system() != 'Darwin': - qt5targets.append(Targets.DESKTOP_541_GCC) + qt5targets.append(Targets.DESKTOP_5_4_1_GCC) if pathSpec == Qt5Path.DOCS: return map(lambda target: Qt5Path.docsPath(target), qt5targets) elif pathSpec == Qt5Path.EXAMPLES: @@ -185,7 +185,7 @@ class Qt5Path: if target not in Targets.ALL_TARGETS: raise Exception("Unexpected target '%s'" % str(target)) - matcher = re.match("^Desktop (5\\d{2}).*$", Targets.getStringForTarget(target)) + matcher = re.match("^Desktop (5\.\\d{1,2}\.\\d{1,2}).*$", Targets.getStringForTarget(target)) if matcher is None: raise Exception("Currently this is supported for Desktop Qt5 only, got target '%s'" % str(Targets.getStringForTarget(target))) @@ -211,9 +211,18 @@ class Qt5Path: return os.path.expanduser("~/Qt5.%d.1" % qt5Minor) @staticmethod - def examplesPath(target): + def toVersionTuple(versionString): + return tuple(map(__builtin__.int, versionString.split("."))) + + @staticmethod + def getQtMinorAndPatchVersion(target): qtVersionStr = Qt5Path.__preCheckAndExtractQtVersionStr__(target) - qtMinorVersion = __builtin__.int(qtVersionStr[1]) + versionTuple = Qt5Path.toVersionTuple(qtVersionStr) + return versionTuple[1], versionTuple[2] + + @staticmethod + def examplesPath(target): + qtMinorVersion, qtPatchVersion = Qt5Path.getQtMinorAndPatchVersion(target) if qtMinorVersion == 2: path = "examples" else: @@ -223,8 +232,7 @@ class Qt5Path: @staticmethod def docsPath(target): - qtVersionStr = Qt5Path.__preCheckAndExtractQtVersionStr__(target) - qtMinorVersion = __builtin__.int(qtVersionStr[1]) + qtMinorVersion, qtPatchVersion = Qt5Path.getQtMinorAndPatchVersion(target) if qtMinorVersion == 2: path = "doc" else: diff --git a/tests/system/shared/project.py b/tests/system/shared/project.py index 06b67e18c7..1a35e81aa5 100644 --- a/tests/system/shared/project.py +++ b/tests/system/shared/project.py @@ -73,7 +73,7 @@ def openCmakeProject(projectPath, buildDir): invokeMenuItem("File", "Open File or Project...") selectFromFileDialog(projectPath) __chooseTargets__([]) # uncheck all - __chooseTargets__([Targets.DESKTOP_487_DEFAULT], additionalFunc=additionalFunction) + __chooseTargets__([Targets.DESKTOP_4_8_7_DEFAULT], additionalFunc=additionalFunction) clickButton(waitForObject(":Qt Creator.Configure Project_QPushButton")) return True @@ -190,28 +190,23 @@ def __verifyFileCreation__(path, expectedFiles): test.verify(os.path.exists(filename), "Checking if '" + filename + "' was created") def __modifyAvailableTargets__(available, requiredQt, asStrings=False): - threeDigits = re.compile("\d{3}") - requiredQtVersion = requiredQt.replace(".", "") + "0" + versionFinder = re.compile("^Desktop (\\d{1}\.\\d{1,2}\.\\d{1,2}).*$") tmp = list(available) # we need a deep copy + if Qt5Path.toVersionTuple(requiredQt) > (4,8,7): + toBeRemoved = Targets.EMBEDDED_LINUX + if asStrings: + toBeRemoved = Targets.getStringForTarget(toBeRemoved) + if toBeRemoved in available: + available.remove(toBeRemoved) for currentItem in tmp: if asStrings: item = currentItem else: item = Targets.getStringForTarget(currentItem) - found = threeDigits.search(item) + found = versionFinder.search(item) if found: - if found.group(0) < requiredQtVersion: - # Quick 1.1 supports 4.7.4 only for running, debugging is unsupported - # so the least required version is 4.8, but 4.7.4 will be still listed - if not (requiredQtVersion == "480" and found.group(0) == "474"): - available.remove(currentItem) - if requiredQtVersion > "487": - toBeRemoved = [Targets.EMBEDDED_LINUX] - if asStrings: - toBeRemoved = Targets.getTargetsAsStrings(toBeRemoved) - for t in toBeRemoved: - if t in available: - available.remove(t) + if Qt5Path.toVersionTuple(found.group(1)) < Qt5Path.toVersionTuple(requiredQt): + available.remove(currentItem) # Creates a Qt GUI project # param path specifies where to create the project @@ -320,7 +315,7 @@ def createNewQtQuickUI(workingDir, qtVersion = "5.6"): return projectName -def createNewQmlExtension(workingDir, targets=[Targets.DESKTOP_531_DEFAULT]): +def createNewQmlExtension(workingDir, targets=[Targets.DESKTOP_5_3_1_DEFAULT]): available = __createProjectOrFileSelectType__(" Library", "Qt Quick 2 Extension Plugin") if workingDir == None: workingDir = tempDir() @@ -349,7 +344,7 @@ def createEmptyQtProject(workingDir=None, projectName=None, targets=Targets.desk __createProjectHandleLastPage__() return projectName, checkedTargets -def createNewNonQtProject(workingDir=None, projectName=None, target=[Targets.DESKTOP_487_DEFAULT], +def createNewNonQtProject(workingDir=None, projectName=None, target=[Targets.DESKTOP_4_8_7_DEFAULT], plainC=False, cmake=False, qbs=False): if plainC: template = "Plain C Application" @@ -378,7 +373,7 @@ def createNewNonQtProject(workingDir=None, projectName=None, target=[Targets.DES return projectName def createNewCPPLib(projectDir = None, projectName = None, className = None, fromWelcome = False, - target = [Targets.DESKTOP_487_DEFAULT], isStatic = False, modules = ["QtCore"]): + target = [Targets.DESKTOP_4_8_7_DEFAULT], isStatic = False, modules = ["QtCore"]): available = __createProjectOrFileSelectType__(" Library", "C++ Library", fromWelcome, True) if isStatic: libType = LibType.STATIC @@ -396,7 +391,7 @@ def createNewCPPLib(projectDir = None, projectName = None, className = None, fro return checkedTargets, projectName, className def createNewQtPlugin(projectDir=None, projectName=None, className=None, fromWelcome=False, - target=[Targets.DESKTOP_487_DEFAULT], baseClass="QGenericPlugin"): + target=[Targets.DESKTOP_4_8_7_DEFAULT], baseClass="QGenericPlugin"): available = __createProjectOrFileSelectType__(" Library", "C++ Library", fromWelcome, True) if projectDir == None: projectDir = tempDir() @@ -414,7 +409,7 @@ def createNewQtPlugin(projectDir=None, projectName=None, className=None, fromWel # parameter additionalFunc function to be executed inside the detailed view of each chosen kit # if present, 'Details' button will be clicked, function will be executed, # 'Details' button will be clicked again -def __chooseTargets__(targets=[Targets.DESKTOP_487_DEFAULT], availableTargets=None, additionalFunc=None): +def __chooseTargets__(targets=[Targets.DESKTOP_4_8_7_DEFAULT], availableTargets=None, additionalFunc=None): if availableTargets != None: available = availableTargets else: @@ -645,7 +640,7 @@ def __getSupportedPlatforms__(text, templateName, getAsStrings=False): else: version = None if 'only available with Qt 5.6' in text: - result = [Targets.DESKTOP_561_DEFAULT] + result = [Targets.DESKTOP_5_6_1_DEFAULT] elif 'available with Qt 5.7 and later' in text: result = [] # FIXME we have currently no Qt5.7+ available in predefined settings elif 'Supported Platforms' in text: @@ -653,12 +648,12 @@ def __getSupportedPlatforms__(text, templateName, getAsStrings=False): result = [] if 'Desktop' in supports: if version == None or version < "5.0": - result.append(Targets.DESKTOP_487_DEFAULT) + result.append(Targets.DESKTOP_4_8_7_DEFAULT) if platform.system() in ("Linux", "Darwin"): result.append(Targets.EMBEDDED_LINUX) - result.extend([Targets.DESKTOP_531_DEFAULT, Targets.DESKTOP_561_DEFAULT]) + result.extend([Targets.DESKTOP_5_3_1_DEFAULT, Targets.DESKTOP_5_6_1_DEFAULT]) if platform.system() != 'Darwin': - result.append(Targets.DESKTOP_541_GCC) + result.append(Targets.DESKTOP_5_4_1_GCC) elif 'Platform independent' in text: result = Targets.desktopTargetClasses() else: diff --git a/tests/system/suite_APTW/tst_APTW03/test.py b/tests/system/suite_APTW/tst_APTW03/test.py index d1ef6a5f80..2ceef47b70 100644 --- a/tests/system/suite_APTW/tst_APTW03/test.py +++ b/tests/system/suite_APTW/tst_APTW03/test.py @@ -85,7 +85,7 @@ def main(): target=targets) virtualFunctionsAdded = False for kit, config in iterateBuildConfigs(len(checkedTargets), "Debug"): - is487Kit = "487" in Targets.getStringForTarget(checkedTargets[kit]) + is487Kit = checkedTargets[kit] in (Targets.DESKTOP_4_8_7_DEFAULT, Targets.EMBEDDED_LINUX) verifyBuildConfig(len(checkedTargets), kit, config, True, True) if virtualFunctionsAdded and platform.system() in ('Microsoft', 'Windows') and is487Kit: test.warning("Skipping building of Qt4.8 targets because of QTCREATORBUG-12251.") diff --git a/tests/system/suite_CCOM/tst_CCOM01/test.py b/tests/system/suite_CCOM/tst_CCOM01/test.py index 8e336c8567..6e75e634f2 100755 --- a/tests/system/suite_CCOM/tst_CCOM01/test.py +++ b/tests/system/suite_CCOM/tst_CCOM01/test.py @@ -28,7 +28,7 @@ source("../../shared/qtcreator.py") # entry of test def main(): # prepare example project - sourceExample = os.path.join(Qt5Path.examplesPath(Targets.DESKTOP_561_DEFAULT), + sourceExample = os.path.join(Qt5Path.examplesPath(Targets.DESKTOP_5_6_1_DEFAULT), "quick", "animation") proFile = "animation.pro" if not neededFilePresent(os.path.join(sourceExample, proFile)): @@ -41,7 +41,7 @@ def main(): return # open example project, supports only Qt 5 targets = Targets.desktopTargetClasses() - targets.remove(Targets.DESKTOP_487_DEFAULT) + targets.remove(Targets.DESKTOP_4_8_7_DEFAULT) checkedTargets = openQmakeProject(examplePath, targets) # build and wait until finished - on all build configurations availableConfigs = iterateBuildConfigs(len(checkedTargets)) diff --git a/tests/system/suite_CCOM/tst_CCOM02/test.py b/tests/system/suite_CCOM/tst_CCOM02/test.py index 2a59212706..f6a3232bd8 100755 --- a/tests/system/suite_CCOM/tst_CCOM02/test.py +++ b/tests/system/suite_CCOM/tst_CCOM02/test.py @@ -29,7 +29,7 @@ source("../../shared/qtcreator.py") # entry of test def main(): # prepare example project - sourceExample = os.path.join(Qt5Path.examplesPath(Targets.DESKTOP_561_DEFAULT), + sourceExample = os.path.join(Qt5Path.examplesPath(Targets.DESKTOP_5_6_1_DEFAULT), "quick", "animation") proFile = "animation.pro" if not neededFilePresent(os.path.join(sourceExample, proFile)): diff --git a/tests/system/suite_CSUP/tst_CSUP06/test.py b/tests/system/suite_CSUP/tst_CSUP06/test.py index f703669755..40d924d2c5 100644 --- a/tests/system/suite_CSUP/tst_CSUP06/test.py +++ b/tests/system/suite_CSUP/tst_CSUP06/test.py @@ -165,7 +165,7 @@ def main(): with TestSection(getCodeModelString(useClang)): if not startCreator(useClang): continue - openQmakeProject(examplePath, [Targets.DESKTOP_531_DEFAULT]) + openQmakeProject(examplePath, [Targets.DESKTOP_5_3_1_DEFAULT]) checkCodeModelSettings(useClang) if not openDocument("cplusplus-tools.Sources.main\\.cpp"): earlyExit("Failed to open main.cpp.") diff --git a/tests/system/suite_QMLS/tst_QMLS03/test.py b/tests/system/suite_QMLS/tst_QMLS03/test.py index 3682816da5..11408d700b 100644 --- a/tests/system/suite_QMLS/tst_QMLS03/test.py +++ b/tests/system/suite_QMLS/tst_QMLS03/test.py @@ -67,7 +67,7 @@ def checkUsages(resultsView, expectedResults, directory): def main(): # prepare example project - sourceExample = os.path.join(Qt5Path.examplesPath(Targets.DESKTOP_561_DEFAULT), + sourceExample = os.path.join(Qt5Path.examplesPath(Targets.DESKTOP_5_6_1_DEFAULT), "quick", "animation") proFile = "animation.pro" if not neededFilePresent(os.path.join(sourceExample, proFile)): @@ -80,7 +80,7 @@ def main(): if not startedWithoutPluginError(): return # open example project - openQmakeProject(examplePath, [Targets.DESKTOP_531_DEFAULT]) + openQmakeProject(examplePath, [Targets.DESKTOP_5_3_1_DEFAULT]) # open qml file openDocument("animation.Resources.animation\\.qrc./animation.basics.color-animation\\.qml") # get editor diff --git a/tests/system/suite_WELP/tst_WELP02/test.py b/tests/system/suite_WELP/tst_WELP02/test.py index ae7b22e934..e809a753df 100644 --- a/tests/system/suite_WELP/tst_WELP02/test.py +++ b/tests/system/suite_WELP/tst_WELP02/test.py @@ -65,7 +65,7 @@ def checkTypeAndProperties(typePropertiesDetails): def main(): # prepare example project - sourceExample = os.path.join(Qt5Path.examplesPath(Targets.DESKTOP_561_DEFAULT), + sourceExample = os.path.join(Qt5Path.examplesPath(Targets.DESKTOP_5_6_1_DEFAULT), "quick", "animation") if not neededFilePresent(sourceExample): return diff --git a/tests/system/suite_debugger/tst_cli_output_console/test.py b/tests/system/suite_debugger/tst_cli_output_console/test.py index 7acaedc0fe..1add5fe028 100644 --- a/tests/system/suite_debugger/tst_cli_output_console/test.py +++ b/tests/system/suite_debugger/tst_cli_output_console/test.py @@ -71,10 +71,10 @@ def main(): appOutput = str(waitForObject(":Qt Creator_Core::OutputWindow").plainText) verifyOutput(appOutput, outputStdOut, "std::cout", "Application Output") verifyOutput(appOutput, outputStdErr, "std::cerr", "Application Output") - if (checkedTargets[kit] == Targets.DESKTOP_541_GCC + if (checkedTargets[kit] == Targets.DESKTOP_5_4_1_GCC and platform.system() in ('Windows', 'Microsoft')): test.log("Skipping qDebug() from %s (unstable, QTCREATORBUG-15067)" - % Targets.getStringForTarget(Targets.DESKTOP_541_GCC)) + % Targets.getStringForTarget(Targets.DESKTOP_5_4_1_GCC)) else: verifyOutput(appOutput, outputQDebug, "qDebug()", "Application Output") diff --git a/tests/system/suite_debugger/tst_debug_empty_main/test.py b/tests/system/suite_debugger/tst_debug_empty_main/test.py index 524499c816..230e3793a8 100644 --- a/tests/system/suite_debugger/tst_debug_empty_main/test.py +++ b/tests/system/suite_debugger/tst_debug_empty_main/test.py @@ -61,7 +61,8 @@ def main(): for name,isC in {"C":True, "CPP":False}.items(): for singleTarget in targets: workingDir = tempDir() - qtVersion = re.search("\d{3}", Targets.getStringForTarget(singleTarget)).group() + qtVersion = re.search("\\d{1}\.\\d{1,2}\.\\d{1,2}", Targets.getStringForTarget(singleTarget)).group() + qtVersion = qtVersion.replace(".", "") projectName = createNewNonQtProject(workingDir, "Sample%s%s" % (name, qtVersion), [singleTarget], isC) if projectName == None: diff --git a/tests/system/suite_editors/tst_qml_editor/test.py b/tests/system/suite_editors/tst_qml_editor/test.py index 8854035e6a..c61b7aa43d 100644 --- a/tests/system/suite_editors/tst_qml_editor/test.py +++ b/tests/system/suite_editors/tst_qml_editor/test.py @@ -26,7 +26,7 @@ source("../../shared/qtcreator.py") def main(): - target = Targets.DESKTOP_531_DEFAULT + target = Targets.DESKTOP_5_3_1_DEFAULT sourceExample = os.path.join(Qt5Path.examplesPath(target), "declarative/keyinteraction/focus") proFile = "focus.pro" if not neededFilePresent(os.path.join(sourceExample, proFile)): diff --git a/tests/system/suite_general/tst_build_speedcrunch/test.py b/tests/system/suite_general/tst_build_speedcrunch/test.py index 34be2beafa..686943b422 100644 --- a/tests/system/suite_general/tst_build_speedcrunch/test.py +++ b/tests/system/suite_general/tst_build_speedcrunch/test.py @@ -42,7 +42,7 @@ def main(): startApplication("qtcreator" + SettingsPath) if not startedWithoutPluginError(): return - checkedTargets = openQmakeProject(SpeedCrunchPath, [Targets.DESKTOP_487_DEFAULT]) + checkedTargets = openQmakeProject(SpeedCrunchPath, [Targets.DESKTOP_4_8_7_DEFAULT]) progressBarWait(30000) fancyToolButton = waitForObject(":*Qt Creator_Core::Internal::FancyToolButton") diff --git a/tests/system/suite_general/tst_opencreator_qbs/test.py b/tests/system/suite_general/tst_opencreator_qbs/test.py index e8b17b607d..60cc0d3444 100644 --- a/tests/system/suite_general/tst_opencreator_qbs/test.py +++ b/tests/system/suite_general/tst_opencreator_qbs/test.py @@ -37,8 +37,8 @@ def main(): if not startedWithoutPluginError(): return openQbsProject(pathCreator) - if not addAndActivateKit(Targets.DESKTOP_561_DEFAULT): - test.fatal("Failed to activate '%s'" % Targets.getStringForTarget(Targets.DESKTOP_541_GCC)) + if not addAndActivateKit(Targets.DESKTOP_5_6_1_DEFAULT): + test.fatal("Failed to activate '%s'" % Targets.getStringForTarget(Targets.DESKTOP_5_4_1_GCC)) invokeMenuItem("File", "Exit") return test.log("Start parsing project") diff --git a/tests/system/suite_general/tst_openqt_creator/test.py b/tests/system/suite_general/tst_openqt_creator/test.py index b2846b5e97..6d40178470 100644 --- a/tests/system/suite_general/tst_openqt_creator/test.py +++ b/tests/system/suite_general/tst_openqt_creator/test.py @@ -36,12 +36,12 @@ def main(): return runButton = findObject(':*Qt Creator.Run_Core::Internal::FancyToolButton') - openQmakeProject(pathSpeedcrunch, [Targets.DESKTOP_487_DEFAULT]) + openQmakeProject(pathSpeedcrunch, [Targets.DESKTOP_4_8_7_DEFAULT]) # Wait for parsing to complete waitFor("runButton.enabled", 30000) # Starting before opening, because this is where Creator froze (QTCREATORBUG-10733) startopening = datetime.utcnow() - openQmakeProject(pathCreator, [Targets.DESKTOP_561_DEFAULT]) + openQmakeProject(pathCreator, [Targets.DESKTOP_5_6_1_DEFAULT]) # Wait for parsing to complete startreading = datetime.utcnow() waitFor("runButton.enabled", 300000) diff --git a/tests/system/suite_general/tst_remove_kits/test.py b/tests/system/suite_general/tst_remove_kits/test.py index 98590d674a..b5b5148741 100644 --- a/tests/system/suite_general/tst_remove_kits/test.py +++ b/tests/system/suite_general/tst_remove_kits/test.py @@ -46,7 +46,7 @@ def __removeKit__(kit, kitName): if kitName == Targets.getStringForTarget(Targets.getDefaultKit()): # The following kits will be the default kit at that time kitNameTemplate += " (default)" - item = kitNameTemplate % kitName + item = kitNameTemplate % kitName.replace(".", "\\.") waitForObjectItem(":BuildAndRun_QTreeView", item) clickItem(":BuildAndRun_QTreeView", item, 5, 5, 0, Qt.LeftButton) clickButton(waitForObject(":Remove_QPushButton")) diff --git a/tests/system/suite_general/tst_rename_file/test.py b/tests/system/suite_general/tst_rename_file/test.py index 7aa17f2e05..ee55e9c2b4 100644 --- a/tests/system/suite_general/tst_rename_file/test.py +++ b/tests/system/suite_general/tst_rename_file/test.py @@ -28,7 +28,7 @@ source("../../shared/qtcreator.py") def main(): # prepare example project projectName = "adding" - sourceExample = os.path.join(Qt5Path.examplesPath(Targets.DESKTOP_561_DEFAULT), + sourceExample = os.path.join(Qt5Path.examplesPath(Targets.DESKTOP_5_6_1_DEFAULT), "qml", "referenceexamples", "adding") proFile = projectName + ".pro" if not neededFilePresent(os.path.join(sourceExample, proFile)): diff --git a/tests/system/suite_general/tst_session_handling/test.py b/tests/system/suite_general/tst_session_handling/test.py index 754f42bd1e..673aae739a 100644 --- a/tests/system/suite_general/tst_session_handling/test.py +++ b/tests/system/suite_general/tst_session_handling/test.py @@ -39,7 +39,7 @@ def main(): "Verifying window title contains created session name.") checkWelcomePage(sessionName, True) for project in projects: - openQmakeProject(project, [Targets.DESKTOP_531_DEFAULT]) + openQmakeProject(project, [Targets.DESKTOP_5_3_1_DEFAULT]) progressBarWait(20000) checkNavigator(52, "Verifying whether all projects have been opened.") openDocument("animation.Resources.animation\\.qrc./animation.basics.animators\\.qml") @@ -66,9 +66,9 @@ def main(): invokeMenuItem("File", "Exit") def prepareTestExamples(): - examples = [os.path.join(Qt5Path.examplesPath(Targets.DESKTOP_561_DEFAULT), + examples = [os.path.join(Qt5Path.examplesPath(Targets.DESKTOP_5_6_1_DEFAULT), "quick", "animation", "animation.pro"), - os.path.join(Qt5Path.examplesPath(Targets.DESKTOP_561_DEFAULT), + os.path.join(Qt5Path.examplesPath(Targets.DESKTOP_5_6_1_DEFAULT), "quick", "keyinteraction", "keyinteraction.pro") ] projects = [] diff --git a/tests/system/suite_qtquick/tst_qml_outline/test.py b/tests/system/suite_qtquick/tst_qml_outline/test.py index 383d8296f7..f3ca4885ac 100644 --- a/tests/system/suite_qtquick/tst_qml_outline/test.py +++ b/tests/system/suite_qtquick/tst_qml_outline/test.py @@ -30,7 +30,7 @@ outline = ":Qt Creator_QmlJSEditor::Internal::QmlJSOutlineTreeView" treebase = "keyinteraction.Resources.keyinteraction\\.qrc./keyinteraction.focus." def main(): - sourceExample = os.path.join(Qt5Path.examplesPath(Targets.DESKTOP_561_DEFAULT), + sourceExample = os.path.join(Qt5Path.examplesPath(Targets.DESKTOP_5_6_1_DEFAULT), "quick", "keyinteraction") proFile = "keyinteraction.pro" if not neededFilePresent(os.path.join(sourceExample, proFile)): @@ -39,7 +39,7 @@ def main(): startApplication("qtcreator" + SettingsPath) if not startedWithoutPluginError(): return - openQmakeProject(os.path.join(templateDir, proFile), [Targets.DESKTOP_531_DEFAULT]) + openQmakeProject(os.path.join(templateDir, proFile), [Targets.DESKTOP_5_3_1_DEFAULT]) qmlFiles = [treebase + "focus\\.qml", treebase + "Core.ListMenu\\.qml"] checkOutlineFor(qmlFiles) testModify() diff --git a/tests/system/suite_qtquick/tst_qtquick_creation/test.py b/tests/system/suite_qtquick/tst_qtquick_creation/test.py index 2b767cde89..0487240ecb 100644 --- a/tests/system/suite_qtquick/tst_qtquick_creation/test.py +++ b/tests/system/suite_qtquick/tst_qtquick_creation/test.py @@ -33,7 +33,7 @@ def main(): available = [("5.6", False), ("5.6", True)] for qtVersion, controls in available: - targ = [Targets.DESKTOP_561_DEFAULT] + targ = [Targets.DESKTOP_5_6_1_DEFAULT] quick = "2.6" # using a temporary directory won't mess up a potentially existing workingDir = tempDir() diff --git a/tests/system/suite_qtquick/tst_qtquick_creation3/test.py b/tests/system/suite_qtquick/tst_qtquick_creation3/test.py index 507abffba3..b47da5d58d 100644 --- a/tests/system/suite_qtquick/tst_qtquick_creation3/test.py +++ b/tests/system/suite_qtquick/tst_qtquick_creation3/test.py @@ -35,8 +35,8 @@ def main(): # using a temporary directory won't mess up a potentially existing workingDir = tempDir() projectName = createNewQtQuickUI(workingDir, qtVersion) - kit = Targets.getStringForTarget(Targets.DESKTOP_561_DEFAULT) - if addAndActivateKit(Targets.DESKTOP_561_DEFAULT): + kit = Targets.getStringForTarget(Targets.DESKTOP_5_6_1_DEFAULT) + if addAndActivateKit(Targets.DESKTOP_5_6_1_DEFAULT): quick = "2.6" else: test.fatal("Failed to activate kit %s" % kit) diff --git a/tests/system/suite_qtquick/tst_qtquick_creation4/test.py b/tests/system/suite_qtquick/tst_qtquick_creation4/test.py index 3fc99ae0bf..a39ac6f867 100644 --- a/tests/system/suite_qtquick/tst_qtquick_creation4/test.py +++ b/tests/system/suite_qtquick/tst_qtquick_creation4/test.py @@ -29,7 +29,7 @@ def main(): startApplication("qtcreator" + SettingsPath) if not startedWithoutPluginError(): return - for target in [Targets.DESKTOP_561_DEFAULT, Targets.DESKTOP_531_DEFAULT]: + for target in [Targets.DESKTOP_5_6_1_DEFAULT, Targets.DESKTOP_5_3_1_DEFAULT]: # using a temporary directory won't mess up a potentially existing createNewQmlExtension(tempDir(), [target]) # wait for parsing to complete diff --git a/tests/unit/unittest/clangcodemodelserver-test.cpp b/tests/unit/unittest/clangcodemodelserver-test.cpp index 36efb1597a..df4afa8004 100644 --- a/tests/unit/unittest/clangcodemodelserver-test.cpp +++ b/tests/unit/unittest/clangcodemodelserver-test.cpp @@ -102,6 +102,7 @@ protected: bool waitUntilAllJobsFinished(int timeOutInMs = 10000); void registerProjectPart(); + void registerProjectPart(const Utf8String &projectPartId); void changeProjectPartArguments(); void registerProjectAndFile(const Utf8String &filePath, @@ -111,6 +112,8 @@ protected: void registerProjectAndFilesAndWaitForFinished(int expectedDocumentAnnotationsChangedMessages = 2); void registerFile(const Utf8String &filePath, int expectedDocumentAnnotationsChangedMessages = 1); + void registerFile(const Utf8String &filePath, const Utf8String &projectPartId, + int expectedDocumentAnnotationsChangedMessages = 1); void registerFiles(int expectedDocumentAnnotationsChangedMessages); void registerFileWithUnsavedContent(const Utf8String &filePath, const Utf8String &content); @@ -155,6 +158,7 @@ protected: ClangBackEnd::ClangCodeModelServer clangServer; const ClangBackEnd::Documents &documents = clangServer.documentsForTestOnly(); const Utf8String projectPartId = Utf8StringLiteral("pathToProjectPart.pro"); + const Utf8String projectPartId2 = Utf8StringLiteral("otherPathToProjectPart.pro"); const Utf8String filePathA = Utf8StringLiteral(TESTDATA_DIR"/complete_extractor_function.cpp"); const QString filePathAUnsavedVersion1 @@ -406,6 +410,30 @@ TEST_F(ClangCodeModelServerSlowTest, TranslationUnitAfterUpdateNeedsReparse) ASSERT_THAT(clangServer, HasDirtyDocument(filePathA, projectPartId, 1U, true, true)); } +TEST_F(ClangCodeModelServerSlowTest, TakeOverJobsOnProjectPartChange) +{ + registerProjectAndFileAndWaitForFinished(filePathC, 2); + updateVisibilty(filePathB, filePathB); // Disable processing jobs + requestReferences(); + + expectReferences(); + + changeProjectPartArguments(); // Here we do not want to loose the RequestReferences job + updateVisibilty(filePathC, filePathC); // Enable processing jobs +} + +TEST_F(ClangCodeModelServerSlowTest, TakeOverJobsOnProjectPartIdChange) +{ + registerProjectPart(projectPartId); + registerProjectPart(projectPartId2); + registerFile(filePathC, projectPartId, 0); + requestReferences(); + + expectReferences(); + + registerFile(filePathC, projectPartId2); // Here we do not want to loose the RequestReferences job +} + void ClangCodeModelServer::SetUp() { clangServer.setClient(&mockClangCodeModelClient); @@ -441,6 +469,13 @@ void ClangCodeModelServer::registerProjectAndFilesAndWaitForFinished( void ClangCodeModelServer::registerFile(const Utf8String &filePath, int expectedDocumentAnnotationsChangedMessages) { + registerFile(filePath, projectPartId, expectedDocumentAnnotationsChangedMessages); +} + +void ClangCodeModelServer::registerFile(const Utf8String &filePath, + const Utf8String &projectPartId, + int expectedDocumentAnnotationsChangedMessages) +{ const FileContainer fileContainer(filePath, projectPartId); const RegisterTranslationUnitForEditorMessage message({fileContainer}, filePath, {filePath}); @@ -672,6 +707,11 @@ void ClangCodeModelServer::unregisterFile(const Utf8String &filePath) void ClangCodeModelServer::registerProjectPart() { + registerProjectPart(projectPartId); +} + +void ClangCodeModelServer::registerProjectPart(const Utf8String &projectPartId) +{ RegisterProjectPartsForEditorMessage message({ProjectPartContainer(projectPartId)}); clangServer.registerProjectPartsForEditor(message); diff --git a/tests/unit/unittest/clangdocumentprocessors-test.cpp b/tests/unit/unittest/clangdocumentprocessors-test.cpp index 87990bca11..0e16ab1f4e 100644 --- a/tests/unit/unittest/clangdocumentprocessors-test.cpp +++ b/tests/unit/unittest/clangdocumentprocessors-test.cpp @@ -126,6 +126,19 @@ TEST_F(DocumentProcessors, Remove) ASSERT_TRUE(documentProcessors.processors().empty()); } +TEST_F(DocumentProcessors, ResetTakesOverJobsInQueue) +{ + documentProcessors.create(document); + documentProcessors.processor(document).addJob(JobRequest::Type::RequestReferences); + documents.remove({document.fileContainer()}); + const auto newDocument = *documents.create({document.fileContainer()}).begin(); + + documentProcessors.reset(document, newDocument); + + ASSERT_THAT(documentProcessors.processor(document).queue().first().type, + JobRequest::Type::RequestReferences); +} + TEST_F(DocumentProcessors, RemoveThrowsForNotExisting) { ASSERT_THROW(documentProcessors.remove(document), diff --git a/tests/unit/unittest/clangsupportivetranslationunitinitializer-test.cpp b/tests/unit/unittest/clangsupportivetranslationunitinitializer-test.cpp index 540fcf7fdc..65062a9d16 100644 --- a/tests/unit/unittest/clangsupportivetranslationunitinitializer-test.cpp +++ b/tests/unit/unittest/clangsupportivetranslationunitinitializer-test.cpp @@ -111,6 +111,18 @@ TEST_F(SupportiveTranslationUnitInitializerSlowTest, StartInitializingStartsJob) ASSERT_THAT(runningJob.jobRequest.type, JobRequest::Type::ParseSupportiveTranslationUnit); } +TEST_F(SupportiveTranslationUnitInitializerSlowTest, Abort) +{ + initializer.startInitializing(); + assertSingleJobRunningAndEmptyQueue(); + + initializer.abort(); + + ASSERT_THAT(initializer.state(), + Eq(ClangBackEnd::SupportiveTranslationUnitInitializer::State::Aborted)); + ASSERT_FALSE(jobs.jobFinishedCallback()); +} + TEST_F(SupportiveTranslationUnitInitializer, CheckIfParseJobFinishedAbortsIfDocumentIsClosed) { documents.remove({FileContainer(filePath, projectPartId)}); diff --git a/tests/unit/unittest/clangtooltipinfo-test.cpp b/tests/unit/unittest/clangtooltipinfo-test.cpp index acaa3e18d7..c796932092 100644 --- a/tests/unit/unittest/clangtooltipinfo-test.cpp +++ b/tests/unit/unittest/clangtooltipinfo-test.cpp @@ -614,6 +614,48 @@ TEST_F(ToolTipInfo, AutoTypeClassTemplateType) ASSERT_THAT(actual.text(), Utf8StringLiteral("Zii<int>")); } +TEST_F(ToolTipInfo, DISABLED_WITHOUT_PRETTYDECL_PATCH(Function_DefaultConstructor)) +{ + const ::ToolTipInfo actual = tooltip(193, 5); + + ASSERT_THAT(actual.text(), Utf8StringLiteral("inline constexpr Con::Con() noexcept")); +} + +TEST_F(ToolTipInfo, DISABLED_WITHOUT_PRETTYDECL_PATCH(Function_ExplicitDefaultConstructor)) +{ + const ::ToolTipInfo actual = tooltip(194, 5); + + ASSERT_THAT(actual.text(), Utf8StringLiteral("ExplicitCon::ExplicitCon() noexcept = default")); +} + +TEST_F(ToolTipInfo, DISABLED_WITHOUT_PRETTYDECL_PATCH(Function_CustomConstructor)) +{ + const ::ToolTipInfo actual = tooltip(195, 5); + + ASSERT_THAT(actual.text(), Utf8StringLiteral("ExplicitCon::ExplicitCon(int m)")); +} + +// Overloads are problematic for the help system since the data base has not +// enough information about them. At least for constructors we can improve +// the situation a bit - provide a help system query that: +// 1) will not lead to the replacement of the constructor signature as +// clang sees it with the wrong overload documentation +// (signature + main help sentence). That's the qdocCategory=Unknown +// part. +// 2) finds the documentation for the class instead of the overload, +// so F1 will go to the class documentation. +TEST_F(ToolTipInfo, Function_ConstructorQDoc) +{ + ::ToolTipInfo expected; + expected.setQdocIdCandidates({Utf8StringLiteral("Con")}); + expected.setQdocMark(Utf8StringLiteral("Con")); + expected.setQdocCategory(::ToolTipInfo::Unknown); + + const ::ToolTipInfo actual = tooltip(193, 5); + + ASSERT_THAT(actual, IsQdocToolTip(expected)); +} + std::unique_ptr<Data> ToolTipInfo::d; void ToolTipInfo::SetUpTestCase() diff --git a/tests/unit/unittest/data/tooltipinfo.cpp b/tests/unit/unittest/data/tooltipinfo.cpp index 1945577b63..266d86bc47 100644 --- a/tests/unit/unittest/data/tooltipinfo.cpp +++ b/tests/unit/unittest/data/tooltipinfo.cpp @@ -178,3 +178,19 @@ void autoTypes() auto c = Bar(); (void)c; auto d = Zii<int>(); (void)d; } + + + + +struct Con {}; +struct ExplicitCon { + ExplicitCon() = default; + ExplicitCon(int m) :member(m) {} + int member; +}; +void constructor() +{ + Con(); + ExplicitCon(); + ExplicitCon(2); +} |