diff --git a/share/qtcreator/debugger/lldbbridge.py b/share/qtcreator/debugger/lldbbridge.py index 7bba95dd394..e121ece7da5 100644 --- a/share/qtcreator/debugger/lldbbridge.py +++ b/share/qtcreator/debugger/lldbbridge.py @@ -472,6 +472,8 @@ class Dumper(DumperBase): tdata.code = TypeCode.Void elif typeName == 'wchar_t': tdata.code = TypeCode.Integral + elif typeName in ("char16_t", "char32_t", "char8_t"): + tdata.code = TypeCode.Integral else: self.warn('UNKNOWN TYPE KEY: %s: %s' % (typeName, code)) elif code == lldb.eTypeClassEnumeration: diff --git a/share/qtcreator/debugger/stdtypes.py b/share/qtcreator/debugger/stdtypes.py index 0bc5c1e5ffe..1f4386607d7 100644 --- a/share/qtcreator/debugger/stdtypes.py +++ b/share/qtcreator/debugger/stdtypes.py @@ -643,7 +643,7 @@ def qdump__std____1__map(d, value): with Children(d, size, maxNumChild=1000): for (i, pair) in zip(d.childRange(), in_order_traversal(head)): - d.putPairItem(i, pair, 'key', 'value') + d.putPairItem(i, pair) def qform__std____1__multimap(): @@ -1293,9 +1293,9 @@ def qform__std____cxx11__wstring(): def qdump__std____1__basic_string(d, value): innerType = value.type[0].name - if innerType == "char": + if innerType in ("char", "char8_t", "char16_t"): qdump__std____1__string(d, value) - elif innerType == "wchar_t": + elif innerType in ("wchar_t", "char32_t"): qdump__std____1__wstring(d, value) else: d.warn("UNKNOWN INNER TYPE %s" % innerType) diff --git a/src/plugins/studiowelcome/studiowelcomeplugin.cpp b/src/plugins/studiowelcome/studiowelcomeplugin.cpp index dfbb488a3a5..f692cbc6297 100644 --- a/src/plugins/studiowelcome/studiowelcomeplugin.cpp +++ b/src/plugins/studiowelcome/studiowelcomeplugin.cpp @@ -670,6 +670,11 @@ WelcomeMode::WelcomeMode() m_modeWidget->engine()->setOutputWarningsToStandardError(false); + connect(Core::ModeManager::instance(), &Core::ModeManager::currentModeChanged, this, [this](Utils::Id mode){ + bool active = (mode == Core::Constants::MODE_WELCOME); + m_modeWidget->rootObject()->setProperty("active", active); + }); + if (!useNewWelcomePage()) { #ifdef QT_DEBUG diff --git a/tests/auto/debugger/tst_dumpers.cpp b/tests/auto/debugger/tst_dumpers.cpp index 4c6c9919d0c..2046b948ee4 100644 --- a/tests/auto/debugger/tst_dumpers.cpp +++ b/tests/auto/debugger/tst_dumpers.cpp @@ -5301,7 +5301,9 @@ void tst_Dumpers::dumper_data() << Data("#include \n" "#include \n" "template\n" - "class myallocator : public std::allocator {};\n", + "class myallocator : public std::allocator {\n" + "using std::allocator::allocator;\n" + "};\n", "std::vector v0, v1;\n" "v1.push_back(1);\n" diff --git a/tests/system/README b/tests/system/README index 890dc3caa6c..9e1a5d4264a 100644 --- a/tests/system/README +++ b/tests/system/README @@ -63,10 +63,7 @@ Fifth - you'll have to make sure that some needed tools are available (no matter * wget or curl, capable of HTTPS Normally it should be okay to just install them as usual and add their executables' path(s) to the PATH variable. -Sixth - Qt Creator must be built on a Qt without Qt WebEngine or Qt WebKit. Its ClangCodeModel -plugin should be linked to LLVM/Clang 7.0.0 or later. How to do so, see QTCREATOR_REPO/README.md. -With a lower version, the tests for the ClangCodeModel might fail. Without the plugin, the tests for -the ClangCodeModel will be skipped but will not cause failures. +Sixth - Qt Creator must be built on a Qt without Qt WebEngine or Qt WebKit. On macOS make sure you are using the correct keyboard layout to avoid problems when using keyboard interaction. Tested and known to be working would be 'U.S. International - PC', while pure 'U.S.' had problems. diff --git a/tests/system/objects.map b/tests/system/objects.map index aa80ec7c2d0..81120f94964 100644 --- a/tests/system/objects.map +++ b/tests/system/objects.map @@ -167,7 +167,6 @@ :Qt Creator_Utils::BuildDirectoryLineEdit {name='LineEdit' type='Utils::FancyLineEdit' visible='1' window=':Qt Creator_Core::Internal::MainWindow'} :Qt Creator_Utils::NavigationTreeView {type='Utils::NavigationTreeView' unnamed='1' visible='1' window=':Qt Creator_Core::Internal::MainWindow'} :Qt Creator_Utils::NavigationTreeView::QExpandingLineEdit {container=':Qt Creator_Utils::NavigationTreeView' type='QExpandingLineEdit' unnamed='1' visible='1'} -:QtSupport__Internal__QtVersionManager.QLabel {container=':qt_tabwidget_stackedwidget_QScrollArea' text?='Qt version *' type='QLabel' unnamed='1' visible='1'} :QtSupport__Internal__QtVersionManager.errorLabel.QLabel {container=':qt_tabwidget_stackedwidget.QtSupport__Internal__QtVersionManager_QtSupport::Internal::QtOptionsPageWidget' name='errorLabel' type='QLabel' visible='1'} :QtSupport__Internal__QtVersionManager.qmake_QLabel {container=':qt_tabwidget_stackedwidget.QtSupport__Internal__QtVersionManager_QtSupport::Internal::QtOptionsPageWidget' name='qmakePath' type='QLabel' visible='1'} :QtVersionLabel_KitPage {container=':qt_tabwidget_stackedwidget_QWidget' text='Qt version:' type='QLabel' unnamed='1' visible='1'} diff --git a/tests/system/shared/utils.py b/tests/system/shared/utils.py index 79e4dffe1cd..8c1e15e1c71 100644 --- a/tests/system/shared/utils.py +++ b/tests/system/shared/utils.py @@ -1,6 +1,6 @@ ############################################################################ # -# Copyright (C) 2016 The Qt Company Ltd. +# Copyright (C) 2022 The Qt Company Ltd. # Contact: https://www.qt.io/licensing/ # # This file is part of Qt Creator. @@ -347,10 +347,6 @@ def __checkParentAccess__(filePath): # options dialog and returns a dict holding the kits as keys # and a list of information of its configured Qt def getConfiguredKits(): - def __retrieveQtVersionName__(target, version): - treeView = waitForObject(":qtdirList_QTreeView") - return str(treeView.currentIndex().data().toString()) - # end of internal function for iterateQtVersions def __setQtVersionForKit__(kit, kitName, kitsQtVersionName): mouseClick(waitForObjectItem(":BuildAndRun_QTreeView", kit)) qtVersionStr = str(waitForObjectExists(":Kits_QtVersion_QComboBox").currentText) @@ -361,18 +357,15 @@ def getConfiguredKits(): # end of internal function for iterate kits kitsWithQtVersionName = {} - result = {} + result = [] # collect kits and their Qt versions - targetsQtVersions, qtVersionNames = iterateQtVersions(True, False, __retrieveQtVersionName__) + qtVersionNames = iterateQtVersions() # update collected Qt versions with their configured device and version - iterateKits(True, True, __setQtVersionForKit__, kitsWithQtVersionName) + iterateKits(False, True, __setQtVersionForKit__, kitsWithQtVersionName) # merge defined target names with their configured Qt versions and devices for kit, qtVersion in kitsWithQtVersionName.iteritems(): - if kit in ('Fremantle', 'Harmattan', 'Qt Simulator'): - test.verify(qtVersion == 'None', - "The outdated kit '%s' should not have a Qt version" % kit) - elif qtVersion in qtVersionNames: - result[kit] = targetsQtVersions[qtVersionNames.index(qtVersion)].items()[0] + if qtVersion in qtVersionNames: + result.append(kit) else: test.fail("Qt version '%s' for kit '%s' can't be found in qtVersionNames." % (qtVersion, kit)) @@ -400,35 +393,14 @@ def regexVerify(text, expectedTexts): return True return False + # function that opens Options Dialog and parses the configured Qt versions -# param keepOptionsOpen set to True if the Options dialog should stay open when -# leaving this function -# param alreadyOnOptionsDialog set to True if you already have opened the Options Dialog -# (if False this function will open it via the MenuBar -> Tools -> Options...) -# param additionalFunction pass a function or name of a defined function to execute -# for each correctly configured item on the list of Qt versions -# (Qt versions having no assigned toolchain, failing qmake,... will be skipped) -# this function must take at least 2 parameters - the first is the target name -# and the second the version of the current selected Qt version item -# param argsForAdditionalFunc you can specify as much parameters as you want to pass -# to additionalFunction from the outside -# the function returns a list of dict holding target-version mappings if used without -# additionalFunction -# WATCH OUT! if you're using the additionalFunction parameter - this function will -# return the list mentioned above as well as the returned value(s) from -# additionalFunction. You MUST call this function like -# result, additionalResult = _iterateQtVersions(...) -# where additionalResult is the result of all executions of additionalFunction which -# means it is a list of results. -def iterateQtVersions(keepOptionsOpen=False, alreadyOnOptionsDialog=False, - additionalFunction=None, *argsForAdditionalFunc): - result = [] - additionalResult = [] - if not alreadyOnOptionsDialog: - invokeMenuItem("Tools", "Options...") +# the function returns a list of the found Qt versions +def iterateQtVersions(): + qtVersionNames = [] + invokeMenuItem("Tools", "Options...") mouseClick(waitForObjectItem(":Options_QListView", "Kits")) clickOnTab(":Options.qt_tabwidget_tabbar_QTabBar", "Qt Versions") - pattern = re.compile("Qt version (?P.*?) for (?P.*)") treeView = waitForObject(":qtdirList_QTreeView") model = treeView.model() for rootIndex in dumpIndices(model): @@ -436,52 +408,29 @@ def iterateQtVersions(keepOptionsOpen=False, alreadyOnOptionsDialog=False, for subIndex in dumpIndices(model, rootIndex): subChildText = str(subIndex.data()).replace(".", "\\.").replace("_", "\\_") treeView.scrollTo(subIndex) - mouseClick(waitForObjectItem(treeView, ".".join([rootChildText,subChildText]))) - currentText = str(waitForObject(":QtSupport__Internal__QtVersionManager.QLabel").text) - matches = pattern.match(currentText) - if matches: - target = matches.group("target").strip() - version = matches.group("version").strip() - result.append({target:version}) - if additionalFunction: - try: - if isString(additionalFunction): - currResult = globals()[additionalFunction](target, version, *argsForAdditionalFunc) - else: - currResult = additionalFunction(target, version, *argsForAdditionalFunc) - except: - t,v,_ = sys.exc_info() - currResult = None - test.fatal("Function to additionally execute on Options Dialog could not be found or " - "an exception occurred while executing it.", "%s(%s)" % (str(t), str(v))) - additionalResult.append(currResult) - if not keepOptionsOpen: - clickButton(waitForObject(":Options.Cancel_QPushButton")) - if additionalFunction: - return result, additionalResult - else: - return result + mouseClick(waitForObjectItem(treeView, ".".join([rootChildText, subChildText]))) + qtVersionNames.append(str(treeView.currentIndex().data().toString())) + return qtVersionNames + # function that opens Options Dialog (if necessary) and parses the configured Kits -# param keepOptionsOpen set to True if the Options dialog should stay open when -# leaving this function +# param clickOkWhenDone set to True if the Options dialog should be closed by clicking the +# "OK" button. If False, the dialog will stay open # param alreadyOnOptionsDialog set to True if you already have opened the Options Dialog -# (if False this functions will open it via the MenuBar -> Tools -> Options...) +# (if False this function will open it via the MenuBar -> Tools -> Options...) # param additionalFunction pass a function or name of a defined function to execute # for each configured item on the list of Kits -# this function must take at least 2 parameters - the first is the item (QModelIndex) -# of the current Kit (if you need to click on it) and the second the Kit name itself -# param argsForAdditionalFunc you can specify as much parameters as you want to pass +# this function must take at least 2 parameters - the first is the full string +# of the kit which can be used in waitForObjectItem(), the second the Kit name itself +# param argsForAdditionalFunc you can specify as many parameters as you want to pass # to additionalFunction from the outside -# the function returns a list of Kit names if used without an additional function -# WATCH OUT! if you're using the additionalFunction parameter - this function will -# return the list mentioned above as well as the returned value(s) from +# this function will return a list of Kit names as well as the returned value(s) from # additionalFunction. You MUST call this function like -# result, additionalResult = _iterateQtVersions(...) +# result, additionalResult = iterateKits(...) # where additionalResult is the result of all executions of additionalFunction which # means it is a list of results. -def iterateKits(keepOptionsOpen=False, alreadyOnOptionsDialog=False, - additionalFunction=None, *argsForAdditionalFunc): +def iterateKits(clickOkWhenDone, alreadyOnOptionsDialog, + additionalFunction, *argsForAdditionalFunc): result = [] additionalResult = [] if not alreadyOnOptionsDialog: @@ -498,31 +447,22 @@ def iterateKits(keepOptionsOpen=False, alreadyOnOptionsDialog=False, test.compare(manual.data().toString(), "Manual", "Verifying label for target section") for section in [autoDetected, manual]: for currentItem in dumpItems(model, section): - kitName = currentItem - if (kitName.endswith(" (default)")): - kitName = kitName.rsplit(" (default)", 1)[0] + kitName = currentItem.rsplit(" (default)", 1)[0] result.append(kitName) - item = ".".join([str(section.data().toString()), - currentItem.replace(".", "\\.")]) - if additionalFunction: - try: - if isString(additionalFunction): - currResult = globals()[additionalFunction](item, kitName, *argsForAdditionalFunc) - else: - currResult = additionalFunction(item, kitName, *argsForAdditionalFunc) - except: - t,v,_ = sys.exc_info() - currResult = None - test.fatal("Function to additionally execute on Options Dialog could not be " - "found or an exception occurred while executing it.", "%s(%s)" % - (str(t), str(v))) - additionalResult.append(currResult) - if not keepOptionsOpen: - clickButton(waitForObject(":Options.Cancel_QPushButton")) - if additionalFunction: - return result, additionalResult - else: - return result + try: + item = ".".join([str(section.data().toString()), + currentItem.replace(".", "\\.")]) + currResult = additionalFunction(item, kitName, *argsForAdditionalFunc) + except: + t, v, _ = sys.exc_info() + currResult = None + test.fatal("Function to additionally execute on Options Dialog could not be " + "found or an exception occurred while executing it.", "%s(%s)" % + (str(t), str(v))) + additionalResult.append(currResult) + if clickOkWhenDone: + clickButton(waitForObject(":Options.OK_QPushButton")) + return result, additionalResult # set a help viewer that will always be used, regardless of Creator's width diff --git a/tests/system/suite_general/tst_create_proj_wizard/test.py b/tests/system/suite_general/tst_create_proj_wizard/test.py index a8ef4782fc5..38550a96aff 100644 --- a/tests/system/suite_general/tst_create_proj_wizard/test.py +++ b/tests/system/suite_general/tst_create_proj_wizard/test.py @@ -93,7 +93,7 @@ def main(): def verifyKitCheckboxes(kits, displayedPlatforms): waitForObject("{type='QLabel' unnamed='1' visible='1' text='Kit Selection'}") - availableCheckboxes = frozenset(filter(enabledCheckBoxExists, kits.keys())) + availableCheckboxes = frozenset(filter(enabledCheckBoxExists, kits)) # verification whether expected, found and configured match expectedShownKits = availableCheckboxes.intersection(displayedPlatforms) diff --git a/tests/system/suite_general/tst_remove_kits/test.py b/tests/system/suite_general/tst_remove_kits/test.py index 8549d285cad..01af0b07476 100644 --- a/tests/system/suite_general/tst_remove_kits/test.py +++ b/tests/system/suite_general/tst_remove_kits/test.py @@ -1,6 +1,6 @@ ############################################################################ # -# Copyright (C) 2017 The Qt Company Ltd. +# Copyright (C) 2022 The Qt Company Ltd. # Contact: https://www.qt.io/licensing/ # # This file is part of Qt Creator. @@ -41,7 +41,8 @@ def verifyProjectsMode(expectedKits): kitNameTemplate = "Manual.%s" -def __removeKit__(kit, kitName): + +def __removeKit__(_, kitName): global kitNameTemplate if kitName == Targets.getStringForTarget(Targets.getDefaultKit()): # The following kits will be the default kit at that time @@ -58,6 +59,5 @@ def main(): switchViewTo(ViewConstants.PROJECTS) verifyProjectsMode(Targets.getTargetsAsStrings(Targets.availableTargetClasses(True))) iterateKits(True, False, __removeKit__) - clickButton(waitForObject(":Options.OK_QPushButton")) verifyProjectsMode([]) invokeMenuItem("File", "Exit") diff --git a/tests/system/tools/findUnusedObjects.py b/tests/system/tools/findUnusedObjects.py index 258674a4aa6..8bf044dba60 100755 --- a/tests/system/tools/findUnusedObjects.py +++ b/tests/system/tools/findUnusedObjects.py @@ -2,7 +2,7 @@ ############################################################################ # -# Copyright (C) 2019 The Qt Company Ltd. +# Copyright (C) 2022 The Qt Company Ltd. # Contact: https://www.qt.io/licensing/ # # This file is part of Qt Creator. @@ -189,7 +189,7 @@ def printResult(): def deleteRemovable(): global useCounts, objMap - deletable = filter(lambda x: useCounts[x] == 0, useCounts) + deletable = list(filter(lambda x: useCounts[x] == 0, useCounts)) if len(deletable) == 0: print("Nothing to delete - leaving objects.map untouched") return