forked from qt-creator/qt-creator
Merge remote-tracking branch 'origin/7.0'
Change-Id: Ib2267ddbb702564a6e1c8f6b1db802bc9c45759d
This commit is contained in:
@@ -399,6 +399,7 @@ function(add_qtc_plugin target_name)
|
||||
|
||||
### Configure plugin.json file:
|
||||
if (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${name}.json.in")
|
||||
list(APPEND _arg_SOURCES ${name}.json.in)
|
||||
file(READ "${name}.json.in" plugin_json_in)
|
||||
string(REPLACE "\\\"" "\"" plugin_json_in ${plugin_json_in})
|
||||
string(REPLACE "\\'" "'" plugin_json_in ${plugin_json_in})
|
||||
|
@@ -13,7 +13,7 @@ instructions:
|
||||
maxTimeBetweenOutput: 360
|
||||
userMessageOnFailure: "Failed to extract elfutils package, check logs."
|
||||
- type: ExecuteCommand
|
||||
command: "curl --fail -L --retry 5 --retry-delay 5 -o {{.AgentWorkingDir}}/build/qt_temp/libclang.7z {{.Env.LLVM_BASE_URL}}-linux-Ubuntu18.04-gcc9.3-x86_64.7z"
|
||||
command: "curl --fail -L --retry 5 --retry-delay 5 -o {{.AgentWorkingDir}}/build/qt_temp/libclang.7z {{.Env.LLVM_BASE_URL}}-linux-Rhel8.2-gcc9.2-x86_64.7z"
|
||||
maxTimeInSeconds: 3600
|
||||
maxTimeBetweenOutput: 360
|
||||
userMessageOnFailure: "Failed to download LLVM package, check logs."
|
||||
@@ -23,7 +23,7 @@ instructions:
|
||||
maxTimeBetweenOutput: 360
|
||||
userMessageOnFailure: "Failed to extract LLVM package, check logs."
|
||||
- type: ExecuteCommand
|
||||
command: "python -u {{.AgentWorkingDir}}/qt-creator/qt-creator/scripts/build.py --build-type {{.Env.QTC_BUILD_TYPE}} --src {{.AgentWorkingDir}}/qt-creator/qt-creator --build {{.AgentWorkingDir}}/qt-creator/qt-creator_build --qt-path {{.AgentWorkingDir}}/build/qt5_install_dir --elfutils-path {{.AgentWorkingDir}}/build/qt_temp/elfutils --llvm-path {{.AgentWorkingDir}}/build/qt_temp/libclang --with-tests --no-zip --add-config=-DCMAKE_C_COMPILER_LAUNCHER=sccache --add-config=-DCMAKE_CXX_COMPILER_LAUNCHER=sccache"
|
||||
command: "python -u {{.AgentWorkingDir}}/qt-creator/qt-creator/scripts/build.py --build-type {{.Env.QTC_BUILD_TYPE}} --src {{.AgentWorkingDir}}/qt-creator/qt-creator --build {{.AgentWorkingDir}}/qt-creator/qt-creator_build --qt-path {{.AgentWorkingDir}}/build/qt_install_dir --elfutils-path {{.AgentWorkingDir}}/build/qt_temp/elfutils --llvm-path {{.AgentWorkingDir}}/build/qt_temp/libclang --with-tests --no-zip --add-config=-DCMAKE_C_COMPILER_LAUNCHER=sccache --add-config=-DCMAKE_CXX_COMPILER_LAUNCHER=sccache"
|
||||
maxTimeInSeconds: 36000
|
||||
maxTimeBetweenOutput: 3600
|
||||
userMessageOnFailure: "Failed to run build.py, check logs."
|
||||
@@ -40,7 +40,7 @@ instructions:
|
||||
- type: Group
|
||||
instructions:
|
||||
- type: ExecuteCommand
|
||||
command: "curl --fail -L --retry 5 --retry-delay 5 -o {{.AgentWorkingDir}}/build/qt_temp/libclang.7z {{.Env.LLVM_BASE_URL}}-mac.7z"
|
||||
command: "curl --fail -L --retry 5 --retry-delay 5 -o {{.AgentWorkingDir}}/build/qt_temp/libclang.7z {{.Env.LLVM_BASE_URL}}-macos-universal.7z"
|
||||
maxTimeInSeconds: 3600
|
||||
maxTimeBetweenOutput: 360
|
||||
userMessageOnFailure: "Failed to download LLVM package, check logs."
|
||||
@@ -50,7 +50,7 @@ instructions:
|
||||
maxTimeBetweenOutput: 360
|
||||
userMessageOnFailure: "Failed to extract LLVM package, check logs."
|
||||
- type: ExecuteCommand
|
||||
command: "python -u {{.AgentWorkingDir}}/qt-creator/qt-creator/scripts/build.py --build-type {{.Env.QTC_BUILD_TYPE}} --src {{.AgentWorkingDir}}/qt-creator/qt-creator --build {{.AgentWorkingDir}}/qt-creator/qt-creator_build --qt-path {{.AgentWorkingDir}}/build/qt5_install_dir --llvm-path {{.AgentWorkingDir}}/build/qt_temp/libclang --keychain-unlock-script /Users/qt/unlock-keychain.sh --with-tests --no-zip --add-config=-DCMAKE_C_COMPILER_LAUNCHER=sccache --add-config=-DCMAKE_CXX_COMPILER_LAUNCHER=sccache"
|
||||
command: "python -u {{.AgentWorkingDir}}/qt-creator/qt-creator/scripts/build.py --build-type {{.Env.QTC_BUILD_TYPE}} --src {{.AgentWorkingDir}}/qt-creator/qt-creator --build {{.AgentWorkingDir}}/qt-creator/qt-creator_build --qt-path {{.AgentWorkingDir}}/build/qt_install_dir --llvm-path {{.AgentWorkingDir}}/build/qt_temp/libclang --keychain-unlock-script /Users/qt/unlock-keychain.sh --with-tests --no-zip --add-config=-DCMAKE_C_COMPILER_LAUNCHER=sccache --add-config=-DCMAKE_CXX_COMPILER_LAUNCHER=sccache"
|
||||
maxTimeInSeconds: 36000
|
||||
maxTimeBetweenOutput: 3600
|
||||
userMessageOnFailure: "Failed to run build.py, check logs."
|
||||
@@ -92,7 +92,7 @@ instructions:
|
||||
maxTimeBetweenOutput: 360
|
||||
userMessageOnFailure: "Failed to extract LLVM package, check logs."
|
||||
- type: ExecuteCommand
|
||||
command: "python -u {{.AgentWorkingDir}}\\qt-creator\\qt-creator\\scripts\\build.py --build-type {{.Env.QTC_BUILD_TYPE}} --src {{.AgentWorkingDir}}\\qt-creator\\qt-creator --build {{.AgentWorkingDir}}\\qt-creator\\qt-creator_build --qt-path {{.AgentWorkingDir}}/build/qt5_install_dir --python-path {{.AgentWorkingDir}}\\build\\qt_temp\\python --elfutils-path {{.AgentWorkingDir}}\\buid\\qt_temp\\elfutils --llvm-path {{.AgentWorkingDir}}\\build\\qt_temp\\libclang --with-tests --no-zip --add-config=-DCMAKE_C_COMPILER_LAUNCHER=sccache --add-config=-DCMAKE_CXX_COMPILER_LAUNCHER=sccache --add-config=-DWITH_SCCACHE_SUPPORT=ON"
|
||||
command: "python -u {{.AgentWorkingDir}}\\qt-creator\\qt-creator\\scripts\\build.py --build-type {{.Env.QTC_BUILD_TYPE}} --src {{.AgentWorkingDir}}\\qt-creator\\qt-creator --build {{.AgentWorkingDir}}\\qt-creator\\qt-creator_build --qt-path {{.AgentWorkingDir}}/build/qt_install_dir --python-path {{.AgentWorkingDir}}\\build\\qt_temp\\python --elfutils-path {{.AgentWorkingDir}}\\buid\\qt_temp\\elfutils --llvm-path {{.AgentWorkingDir}}\\build\\qt_temp\\libclang --with-tests --no-zip --add-config=-DCMAKE_C_COMPILER_LAUNCHER=sccache --add-config=-DCMAKE_CXX_COMPILER_LAUNCHER=sccache --add-config=-DWITH_SCCACHE_SUPPORT=ON"
|
||||
maxTimeInSeconds: 36000
|
||||
maxTimeBetweenOutput: 3600
|
||||
userMessageOnFailure: "Failed to run build.py, check logs."
|
@@ -7,13 +7,13 @@ instructions:
|
||||
variableValue: "RelWithDebInfo"
|
||||
- type: EnvironmentVariable
|
||||
variableName: QTC_QT_BASE_URL
|
||||
variableValue: "http://ci-files02-hki.intra.qt.io/packages/jenkins/archive/qt/6.2/6.2.3-final-released/Qt6.2.3"
|
||||
variableValue: "http://ci-files02-hki.intra.qt.io/packages/jenkins/archive/qt/6.2/6.2.4-final-released/Qt6.2.4"
|
||||
- type: EnvironmentVariable
|
||||
variableName: QTC_QT_MODULES
|
||||
variableValue: "qt5compat qtbase qtdeclarative qtimageformats qtquick3d qtquickcontrols2 qtquicktimeline qtserialport qtshadertools qtsvg qttools qttranslations"
|
||||
- type: EnvironmentVariable
|
||||
variableName: LLVM_BASE_URL
|
||||
variableValue: http://master.qt.io/development_releases/prebuilt/libclang/libclang-release_120-based
|
||||
variableValue: http://master.qt.io/development_releases/prebuilt/libclang/libclang-release_140-based
|
||||
- type: EnvironmentVariable
|
||||
variableName: MACOSX_DEPLOYMENT_TARGET
|
||||
variableValue: 10.14
|
||||
|
@@ -32,7 +32,7 @@ instructions:
|
||||
property: host.os
|
||||
in_values: [MacOS, Linux, Windows]
|
||||
- type: ExecuteCommand
|
||||
command: "python -u {{.AgentWorkingDir}}/build/qtsdk/packaging-tools/install_qt.py --qt-path {{.AgentWorkingDir}}/build/qt5_install_dir --temp-path {{.AgentWorkingDir}}/build/qt_temp --base-url {{.Env.QTC_QT_BASE_URL}} --base-url-postfix=-Linux-RHEL_8_4-GCC-Linux-RHEL_8_4-X86_64.7z --icu7z http://master.qt.io/development_releases/prebuilt/icu/prebuilt/56.1/icu-linux-g++-Rhel7.2-x64.7z {{.Env.QTC_QT_MODULES}}"
|
||||
command: "python -u {{.AgentWorkingDir}}/build/qtsdk/packaging-tools/install_qt.py --qt-path {{.AgentWorkingDir}}/build/qt_install_dir --temp-path {{.AgentWorkingDir}}/build/qt_temp --base-url {{.Env.QTC_QT_BASE_URL}} --base-url-postfix=-Linux-RHEL_8_4-GCC-Linux-RHEL_8_4-X86_64.7z --icu7z http://master.qt.io/development_releases/prebuilt/icu/prebuilt/56.1/icu-linux-g++-Rhel7.2-x64.7z {{.Env.QTC_QT_MODULES}}"
|
||||
executeCommandArgumentSplitingBehavior: SplitAfterVariableSubstitution
|
||||
maxTimeInSeconds: 3600
|
||||
maxTimeBetweenOutput: 360
|
||||
@@ -42,7 +42,7 @@ instructions:
|
||||
property: host.os
|
||||
equals_value: Linux
|
||||
- type: ExecuteCommand
|
||||
command: "python -u {{.AgentWorkingDir}}/build/qtsdk/packaging-tools/install_qt.py --qt-path {{.AgentWorkingDir}}/build/qt5_install_dir --temp-path {{.AgentWorkingDir}}/build/qt_temp --base-url {{.Env.QTC_QT_BASE_URL}} --base-url-postfix=-MacOS-MacOS_12-Clang-MacOS-MacOS_12-X86_64-ARM64.7z {{.Env.QTC_QT_MODULES}}"
|
||||
command: "python -u {{.AgentWorkingDir}}/build/qtsdk/packaging-tools/install_qt.py --qt-path {{.AgentWorkingDir}}/build/qt_install_dir --temp-path {{.AgentWorkingDir}}/build/qt_temp --base-url {{.Env.QTC_QT_BASE_URL}} --base-url-postfix=-MacOS-MacOS_12-Clang-MacOS-MacOS_12-X86_64-ARM64.7z {{.Env.QTC_QT_MODULES}}"
|
||||
executeCommandArgumentSplitingBehavior: SplitAfterVariableSubstitution
|
||||
maxTimeInSeconds: 3600
|
||||
maxTimeBetweenOutput: 360
|
||||
@@ -61,7 +61,7 @@ instructions:
|
||||
property: host.os
|
||||
equals_value: Windows
|
||||
- type: ExecuteCommand
|
||||
command: "python -u {{.AgentWorkingDir}}/build/qtsdk/packaging-tools/install_qt.py --qt-path {{.AgentWorkingDir}}/build/qt5_install_dir --temp-path {{.AgentWorkingDir}}/build/qt_temp --base-url {{.Env.QTC_QT_BASE_URL}} --base-url-postfix=-Windows-Windows_10-MSVC2019-Windows-Windows_10-X86_64.7z --opengl32sw7z http://master.qt.io/development_releases/prebuilt/llvmpipe/windows/opengl32sw-64.7z --d3dcompiler7z http://master.qt.io/development_releases/prebuilt/d3dcompiler/msvc2013/d3dcompiler_47-x64.7z --openssl7z http://ci-files02-hki.intra.qt.io/packages/jenkins/openssl/openssl_1.1.1d_prebuild_x64.7z {{.Env.QTC_QT_MODULES}}"
|
||||
command: "python -u {{.AgentWorkingDir}}/build/qtsdk/packaging-tools/install_qt.py --qt-path {{.AgentWorkingDir}}/build/qt_install_dir --temp-path {{.AgentWorkingDir}}/build/qt_temp --base-url {{.Env.QTC_QT_BASE_URL}} --base-url-postfix=-Windows-Windows_10_21H2-MSVC2019-Windows-Windows_10_21H2-X86_64.7z --opengl32sw7z http://master.qt.io/development_releases/prebuilt/llvmpipe/windows/opengl32sw-64.7z --d3dcompiler7z http://master.qt.io/development_releases/prebuilt/d3dcompiler/msvc2013/d3dcompiler_47-x64.7z --openssl7z http://ci-files02-hki.intra.qt.io/packages/jenkins/openssl/openssl_1.1.1d_prebuild_x64.7z {{.Env.QTC_QT_MODULES}}"
|
||||
executeCommandArgumentSplitingBehavior: SplitAfterVariableSubstitution
|
||||
maxTimeInSeconds: 3600
|
||||
maxTimeBetweenOutput: 360
|
||||
@@ -76,5 +76,3 @@ instructions:
|
||||
property: target.arch
|
||||
equals_value: X86_64
|
||||
|
||||
- !include "{{qt-creator/qt-creator}}/make_instructions.yaml"
|
||||
|
@@ -60,7 +60,8 @@ common_environment: &common_environment
|
||||
make_instructions: &make_instructions
|
||||
type: Group
|
||||
instructions:
|
||||
- !include "{{qt-creator/qt-creator}}/qmake_module_build.yaml"
|
||||
- !include "{{qt-creator/qt-creator}}/provision.yaml"
|
||||
- !include "{{qt-creator/qt-creator}}/build.yaml"
|
||||
|
||||
|
||||
instructions:
|
||||
|
@@ -287,6 +287,7 @@ void TestRunner::scheduleNext()
|
||||
reportResult(ResultType::MessageFatal,
|
||||
tr("Failed to start test for project \"%1\".").arg(m_currentConfig->displayName())
|
||||
+ processInformation(m_currentProcess) + rcInfo(m_currentConfig));
|
||||
onProcessFinished();
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -2093,7 +2093,10 @@ void ClangdClient::findLocalUsages(TextDocument *document, const QTextCursor &cu
|
||||
const QList<AstNode> astPath = getAstPath(ast, linkPos);
|
||||
bool isVar = false;
|
||||
for (auto it = astPath.rbegin(); it != astPath.rend(); ++it) {
|
||||
if (it->role() == "declaration" && it->kind() == "Function") {
|
||||
if (it->role() == "declaration"
|
||||
&& (it->kind() == "Function" || it->kind() == "CXXMethod"
|
||||
|| it->kind() == "CXXConstructor" || it->kind() == "CXXDestructor"
|
||||
|| it->kind() == "Lambda")) {
|
||||
if (!isVar)
|
||||
break;
|
||||
|
||||
|
@@ -434,8 +434,8 @@ void ClangdTestLocalReferences::test_data()
|
||||
/* QList<Range>{{40, 7, 3}, {43, 9, 3}} */;
|
||||
QTest::newRow("instantiated template object") << 52 << 19
|
||||
<< QList<Range>{{52, 19, 3}, {53, 5, 3}};
|
||||
QTest::newRow("variable in template") << 62 << 13 << QList<Range>()
|
||||
/* QList<Range>{{62, 13, 3}, {63, 11, 3}} */;
|
||||
QTest::newRow("variable in template") << 62 << 13
|
||||
<< QList<Range>{{62, 13, 3}, {63, 11, 3}};
|
||||
QTest::newRow("member in template") << 67 << 7 << QList<Range>()
|
||||
/* QList<Range>{{64, 16, 3}, {67, 7, 3}} */;
|
||||
QTest::newRow("template type") << 58 << 19 << QList<Range>()
|
||||
|
@@ -20,6 +20,12 @@ QtcPlugin {
|
||||
&& (!qbs.targetOS.contains("windows") || libclang.llvmBuildModeMatches)
|
||||
|
||||
cpp.cxxFlags: base.concat(libclang.llvmToolingCxxFlags)
|
||||
cpp.linkerFlags: {
|
||||
var flags = base;
|
||||
if (qbs.targetOS.contains("unix") && !qbs.targetOS.contains("macos"))
|
||||
flags.push("--exclude-libs", "ALL");
|
||||
return flags;
|
||||
}
|
||||
cpp.includePaths: base.concat(libclang.llvmIncludeDir)
|
||||
cpp.libraryPaths: base.concat(libclang.llvmLibDir)
|
||||
cpp.dynamicLibraries: base.concat(libclang.llvmFormattingLibs)
|
||||
|
@@ -620,7 +620,7 @@ void CMakeBuildSettingsWidget::updateInitialCMakeArguments()
|
||||
*it = ci;
|
||||
if (ci.isUnset)
|
||||
initialList.erase(it);
|
||||
} else {
|
||||
} else if (!ci.key.isEmpty()) {
|
||||
initialList.push_back(ci);
|
||||
}
|
||||
}
|
||||
@@ -1105,7 +1105,7 @@ static CommandLine defaultInitialCMakeCommand(const Kit *k, const QString buildT
|
||||
if (ToolChain *tc = ToolChainKitAspect::cxxToolChain(k)) {
|
||||
const QString targetTriple = tc->originalTargetTriple();
|
||||
cmd.addArg("-DCMAKE_C_COMPILER_TARGET:STRING=" + targetTriple);
|
||||
cmd.addArg("-DCMAKE_CXX_COMPILER_TARGET:STRING=%1" + targetTriple);
|
||||
cmd.addArg("-DCMAKE_CXX_COMPILER_TARGET:STRING=" + targetTriple);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -1122,8 +1122,12 @@ void CMakeConfigurationKitAspect::fromStringList(Kit *k, const QStringList &in)
|
||||
|
||||
QStringList CMakeConfigurationKitAspect::toArgumentsList(const Kit *k)
|
||||
{
|
||||
return Utils::transform(CMakeConfigurationKitAspect::configuration(k).toList(),
|
||||
[](const CMakeConfigItem &i) { return i.toArgument(nullptr); });
|
||||
QStringList current = Utils::transform(CMakeConfigurationKitAspect::configuration(k).toList(),
|
||||
[](const CMakeConfigItem &i) {
|
||||
return i.toArgument(nullptr);
|
||||
});
|
||||
current = Utils::filtered(current, [](const QString &s) { return s != "-D" || s != "-U"; });
|
||||
return current;
|
||||
}
|
||||
|
||||
CMakeConfig CMakeConfigurationKitAspect::defaultConfiguration(const Kit *k)
|
||||
|
@@ -269,16 +269,23 @@ void ProgressManagerPrivate::init()
|
||||
m_summaryProgressWidget = new QWidget(m_statusBarWidget);
|
||||
m_summaryProgressWidget->setVisible(!m_progressViewPinned);
|
||||
m_summaryProgressWidget->setGraphicsEffect(m_opacityEffect);
|
||||
m_summaryProgressLayout = new QHBoxLayout(m_summaryProgressWidget);
|
||||
m_summaryProgressLayout->setContentsMargins(0, 0, 0, 2);
|
||||
m_summaryProgressLayout->setSpacing(0);
|
||||
m_summaryProgressWidget->setLayout(m_summaryProgressLayout);
|
||||
auto summaryProgressLayout = new QHBoxLayout(m_summaryProgressWidget);
|
||||
summaryProgressLayout->setContentsMargins(0, 0, 0, 2);
|
||||
summaryProgressLayout->setSpacing(0);
|
||||
m_summaryProgressWidget->setLayout(summaryProgressLayout);
|
||||
m_statusDetailsWidgetContainer = new QWidget(m_summaryProgressWidget);
|
||||
m_statusDetailsWidgetLayout = new QHBoxLayout(m_summaryProgressWidget);
|
||||
m_statusDetailsWidgetLayout->setContentsMargins(0, 0, 0, 0);
|
||||
m_statusDetailsWidgetLayout->setSpacing(0);
|
||||
m_statusDetailsWidgetLayout->addStretch(1);
|
||||
m_statusDetailsWidgetContainer->setLayout(m_statusDetailsWidgetLayout);
|
||||
summaryProgressLayout->addWidget(m_statusDetailsWidgetContainer);
|
||||
m_summaryProgressBar = new ProgressBar(m_summaryProgressWidget);
|
||||
m_summaryProgressBar->setMinimumWidth(70);
|
||||
m_summaryProgressBar->setTitleVisible(false);
|
||||
m_summaryProgressBar->setSeparatorVisible(false);
|
||||
m_summaryProgressBar->setCancelEnabled(false);
|
||||
m_summaryProgressLayout->addWidget(m_summaryProgressBar);
|
||||
summaryProgressLayout->addWidget(m_summaryProgressBar);
|
||||
layout->addWidget(m_summaryProgressWidget);
|
||||
auto toggleButton = new QToolButton(m_statusBarWidget);
|
||||
layout->addWidget(toggleButton);
|
||||
@@ -609,6 +616,8 @@ void ProgressManagerPrivate::updateVisibilityWithDelay()
|
||||
QTimer::singleShot(150, this, &ProgressManagerPrivate::updateVisibility);
|
||||
}
|
||||
|
||||
const int RASTER = 20;
|
||||
|
||||
void ProgressManagerPrivate::updateStatusDetailsWidget()
|
||||
{
|
||||
QWidget *candidateWidget = nullptr;
|
||||
@@ -636,16 +645,25 @@ void ProgressManagerPrivate::updateStatusDetailsWidget()
|
||||
}
|
||||
}
|
||||
|
||||
// make size fit on raster, to avoid flickering in status bar
|
||||
// because the output pane buttons resize, if the widget changes a lot (like it is the case for
|
||||
// the language server indexing)
|
||||
if (candidateWidget) {
|
||||
const int preferredWidth = candidateWidget->sizeHint().width();
|
||||
const int width = preferredWidth + (RASTER - preferredWidth % RASTER);
|
||||
m_statusDetailsWidgetContainer->setFixedWidth(width);
|
||||
}
|
||||
|
||||
if (candidateWidget == m_currentStatusDetailsWidget)
|
||||
return;
|
||||
|
||||
if (m_currentStatusDetailsWidget) {
|
||||
m_currentStatusDetailsWidget->hide();
|
||||
m_summaryProgressLayout->removeWidget(m_currentStatusDetailsWidget);
|
||||
m_statusDetailsWidgetLayout->removeWidget(m_currentStatusDetailsWidget);
|
||||
}
|
||||
|
||||
if (candidateWidget) {
|
||||
m_summaryProgressLayout->insertWidget(0, candidateWidget);
|
||||
m_statusDetailsWidgetLayout->addWidget(candidateWidget);
|
||||
candidateWidget->show();
|
||||
}
|
||||
|
||||
|
@@ -101,7 +101,8 @@ private:
|
||||
StatusBarWidget *m_statusBarWidgetContainer;
|
||||
QWidget *m_statusBarWidget;
|
||||
QWidget *m_summaryProgressWidget;
|
||||
QHBoxLayout *m_summaryProgressLayout;
|
||||
QWidget *m_statusDetailsWidgetContainer = nullptr;
|
||||
QHBoxLayout *m_statusDetailsWidgetLayout = nullptr;
|
||||
QWidget *m_currentStatusDetailsWidget = nullptr;
|
||||
QPointer<FutureProgress> m_currentStatusDetailsProgress;
|
||||
QLabel *m_statusDetailsLabel = nullptr;
|
||||
|
@@ -172,6 +172,7 @@ void CodeFormatter::recalculateStateAfter(const QTextBlock &block)
|
||||
case T_COLON: enter(member_init_open); enter(member_init_expected); break;
|
||||
case T_OPERATOR: enter(operator_declaration); break;
|
||||
case T_GREATER_GREATER: break;
|
||||
case T_LBRACKET: break;
|
||||
default: tryExpression(true); break;
|
||||
} break;
|
||||
|
||||
@@ -825,8 +826,11 @@ bool CodeFormatter::tryExpression(bool alsoExpression)
|
||||
break;
|
||||
}
|
||||
|
||||
if (m_currentToken.isStringLiteral())
|
||||
newState = m_currentToken.kind() == T_RAW_STRING_LITERAL ? raw_string_open : string_open;
|
||||
if (m_currentToken.isStringLiteral()) {
|
||||
newState = m_currentToken.kind() >= T_FIRST_RAW_STRING_LITERAL
|
||||
&& m_currentToken.kind() <= T_LAST_RAW_STRING_LITERAL ? raw_string_open
|
||||
: string_open;
|
||||
}
|
||||
|
||||
if (newState != -1) {
|
||||
if (alsoExpression)
|
||||
|
@@ -294,14 +294,6 @@ bool CppEditorPlugin::initialize(const QStringList & /*arguments*/, QString *err
|
||||
tr("Insert \"#pragma once\" instead of \"#ifndef\" include guards into header file"),
|
||||
[] { return usePragmaOnce() ? QString("true") : QString(); });
|
||||
|
||||
const auto clangdPanelFactory = new ProjectPanelFactory;
|
||||
clangdPanelFactory->setPriority(100);
|
||||
clangdPanelFactory->setDisplayName(tr("Clangd"));
|
||||
clangdPanelFactory->setCreateWidgetFunction([](Project *project) {
|
||||
return new ClangdProjectSettingsWidget(project);
|
||||
});
|
||||
ProjectPanelFactory::registerFactory(clangdPanelFactory);
|
||||
|
||||
const auto quickFixSettingsPanelFactory = new ProjectPanelFactory;
|
||||
quickFixSettingsPanelFactory->setPriority(100);
|
||||
quickFixSettingsPanelFactory->setId(Constants::QUICK_FIX_PROJECT_PANEL_ID);
|
||||
@@ -441,8 +433,17 @@ void CppEditorPlugin::extensionsInitialized()
|
||||
d->m_fileSettings.fromSettings(ICore::settings());
|
||||
if (!d->m_fileSettings.applySuffixesToMimeDB())
|
||||
qWarning("Unable to apply cpp suffixes to mime database (cpp mime types not found).\n");
|
||||
if (CppModelManager::instance()->isClangCodeModelActive())
|
||||
|
||||
if (CppModelManager::instance()->isClangCodeModelActive()) {
|
||||
d->m_clangdSettingsPage = new ClangdSettingsPage;
|
||||
const auto clangdPanelFactory = new ProjectPanelFactory;
|
||||
clangdPanelFactory->setPriority(100);
|
||||
clangdPanelFactory->setDisplayName(tr("Clangd"));
|
||||
clangdPanelFactory->setCreateWidgetFunction([](Project *project) {
|
||||
return new ClangdProjectSettingsWidget(project);
|
||||
});
|
||||
ProjectPanelFactory::registerFactory(clangdPanelFactory);
|
||||
}
|
||||
|
||||
// Add the hover handler factories here instead of in initialize()
|
||||
// so that the Clang Code Model has a chance to hook in.
|
||||
|
@@ -68,7 +68,13 @@ LiteHtmlHelpViewer::LiteHtmlHelpViewer(QWidget *parent)
|
||||
m_viewer->setResourceHandler([](const QUrl &url) { return getData(url); });
|
||||
m_viewer->setFrameStyle(QFrame::NoFrame);
|
||||
m_viewer->viewport()->installEventFilter(this);
|
||||
connect(m_viewer, &QLiteHtmlWidget::linkClicked, this, &LiteHtmlHelpViewer::setSource);
|
||||
connect(m_viewer, &QLiteHtmlWidget::linkClicked, this, [this](const QUrl &url) {
|
||||
const Qt::KeyboardModifiers modifiers = QGuiApplication::keyboardModifiers();
|
||||
if (modifiers == Qt::ControlModifier)
|
||||
emit newPageRequested(url);
|
||||
else
|
||||
setSource(url);
|
||||
});
|
||||
connect(m_viewer,
|
||||
&QLiteHtmlWidget::contextMenuRequested,
|
||||
this,
|
||||
|
@@ -589,10 +589,22 @@ bool LocalHelpManager::openOnlineHelp(const QUrl &url)
|
||||
|
||||
if (canOpenOnlineHelp(url)) {
|
||||
QString urlPrefix = "http://doc.qt.io/";
|
||||
if (url.authority().startsWith(unversionedLocalDomainName))
|
||||
if (url.authority().startsWith(unversionedLocalDomainName)) {
|
||||
urlPrefix.append(Core::Constants::IDE_ID);
|
||||
else
|
||||
urlPrefix.append("qt-5");
|
||||
} else {
|
||||
const auto host = url.host();
|
||||
const auto dot = host.lastIndexOf('.');
|
||||
if (dot < 0) {
|
||||
urlPrefix.append("qt-5");
|
||||
} else {
|
||||
const auto version = host.mid(dot + 1);
|
||||
if (version.startsWith('6')) {
|
||||
urlPrefix.append("qt-6");
|
||||
} else {
|
||||
urlPrefix.append("qt-5");
|
||||
}
|
||||
}
|
||||
}
|
||||
const QString address = url.toString();
|
||||
QDesktopServices::openUrl(QUrl(urlPrefix + address.mid(address.lastIndexOf(QLatin1Char('/')))));
|
||||
return true;
|
||||
|
@@ -1240,11 +1240,20 @@ BuildDeviceKitAspect::BuildDeviceKitAspect()
|
||||
this, &BuildDeviceKitAspect::kitsWereLoaded);
|
||||
}
|
||||
|
||||
QVariant BuildDeviceKitAspect::defaultValue(const Kit *k) const
|
||||
void BuildDeviceKitAspect::setup(Kit *k)
|
||||
{
|
||||
Q_UNUSED(k);
|
||||
IDevice::ConstPtr defaultDevice = DeviceManager::defaultDesktopDevice();
|
||||
return defaultDevice->id().toString();
|
||||
QTC_ASSERT(DeviceManager::instance()->isLoaded(), return );
|
||||
IDevice::ConstPtr dev = BuildDeviceKitAspect::device(k);
|
||||
if (!dev.isNull() && dev->isCompatibleWith(k))
|
||||
return;
|
||||
|
||||
dev = defaultDevice();
|
||||
setDeviceId(k, dev ? dev->id() : Id());
|
||||
}
|
||||
|
||||
IDevice::ConstPtr BuildDeviceKitAspect::defaultDevice()
|
||||
{
|
||||
return DeviceManager::defaultDesktopDevice();
|
||||
}
|
||||
|
||||
Tasks BuildDeviceKitAspect::validate(const Kit *k) const
|
||||
@@ -1314,10 +1323,8 @@ IDevice::ConstPtr BuildDeviceKitAspect::device(const Kit *k)
|
||||
{
|
||||
QTC_ASSERT(DeviceManager::instance()->isLoaded(), return IDevice::ConstPtr());
|
||||
IDevice::ConstPtr dev = DeviceManager::instance()->find(deviceId(k));
|
||||
// Use the "run" device as fallback if no build device is present.
|
||||
// FIXME: Think about whether this shouldn't be the other way round.
|
||||
if (!dev)
|
||||
dev = DeviceKitAspect::device(k);
|
||||
dev = defaultDevice();
|
||||
return dev;
|
||||
}
|
||||
|
||||
|
@@ -182,6 +182,7 @@ class PROJECTEXPLORER_EXPORT BuildDeviceKitAspect : public KitAspect
|
||||
public:
|
||||
BuildDeviceKitAspect();
|
||||
|
||||
void setup(Kit *k) override;
|
||||
Tasks validate(const Kit *k) const override;
|
||||
|
||||
KitAspectWidget *createConfigWidget(Kit *k) const override;
|
||||
@@ -199,7 +200,7 @@ public:
|
||||
static void setDeviceId(Kit *k, Utils::Id dataId);
|
||||
|
||||
private:
|
||||
QVariant defaultValue(const Kit *k) const;
|
||||
static IDevice::ConstPtr defaultDevice();
|
||||
|
||||
void kitsWereLoaded();
|
||||
void deviceUpdated(Utils::Id dataId);
|
||||
|
@@ -34,7 +34,8 @@
|
||||
#include <QPushButton>
|
||||
#include <QLayout>
|
||||
#include <QLabel>
|
||||
#include <QTreeView>
|
||||
|
||||
#include <QSplitter>
|
||||
|
||||
using namespace Utils;
|
||||
|
||||
@@ -49,36 +50,62 @@ CmakeGeneratorDialog::CmakeGeneratorDialog(const FilePath &rootDir, const FilePa
|
||||
setWindowTitle(QCoreApplication::translate("QmlDesigner::GenerateCmake",
|
||||
"Select Files to Generate"));
|
||||
|
||||
m_model = new CMakeGeneratorDialogTreeModel(rootDir, files, this);
|
||||
QLabel *mainLabel = new QLabel(QCoreApplication::translate("QmlDesigner::GenerateCmake",
|
||||
"Start CMakeFiles.txt generation"),
|
||||
this);
|
||||
mainLabel->setMargin(30);
|
||||
|
||||
QVBoxLayout *dialogLayout = new QVBoxLayout(this);
|
||||
dialogLayout->setSizeConstraint(QLayout::SetFixedSize);
|
||||
dialogLayout->addWidget(mainLabel);
|
||||
dialogLayout->addWidget(createDetailsWidget());
|
||||
dialogLayout->addWidget(createButtons());
|
||||
setLayout(dialogLayout);
|
||||
|
||||
QWidget *advancedInnerWidget = new QWidget(this);
|
||||
QVBoxLayout *advancedInnerLayout = new QVBoxLayout(advancedInnerWidget);
|
||||
advancedInnerWidget->setLayout(advancedInnerLayout);
|
||||
advancedInnerWidget->setMinimumHeight(640);
|
||||
setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
|
||||
setMaximumHeight(layout()->totalSizeHint().height());
|
||||
|
||||
refreshNotificationText();
|
||||
}
|
||||
|
||||
QTreeView* CmakeGeneratorDialog::createFileTree()
|
||||
{
|
||||
m_model = new CMakeGeneratorDialogTreeModel(m_rootDir, m_files, this);
|
||||
|
||||
QTreeView *tree = new QTreeView(this);
|
||||
tree->setModel(m_model);
|
||||
tree->expandAll();
|
||||
tree->setHeaderHidden(true);
|
||||
|
||||
return tree;
|
||||
}
|
||||
|
||||
QWidget* CmakeGeneratorDialog::createDetailsWidget()
|
||||
{
|
||||
QTreeView* tree = createFileTree();
|
||||
|
||||
m_notifications = new QTextEdit(this);
|
||||
m_warningIcon = Utils::Icons::WARNING.pixmap();
|
||||
|
||||
refreshNotificationText();
|
||||
|
||||
advancedInnerLayout->addWidget(tree, 2);
|
||||
advancedInnerLayout->addWidget(m_notifications, 1);
|
||||
QSplitter *advancedInnerWidget = new QSplitter(this);
|
||||
advancedInnerWidget->addWidget(tree);
|
||||
advancedInnerWidget->addWidget(m_notifications);
|
||||
advancedInnerWidget->setStretchFactor(0, 2);
|
||||
advancedInnerWidget->setStretchFactor(1, 1);
|
||||
advancedInnerWidget->setOrientation(Qt::Vertical);
|
||||
advancedInnerWidget->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::MinimumExpanding);
|
||||
|
||||
DetailsWidget *advancedWidget = new DetailsWidget(this);
|
||||
advancedWidget->setMinimumWidth(600);
|
||||
advancedWidget->setWidget(advancedInnerWidget);
|
||||
advancedWidget->setSummaryText(QCoreApplication::translate("QmlDesigner::GenerateCmake",
|
||||
"Advanced Options"));
|
||||
connect(advancedWidget, &DetailsWidget::expanded, this, &CmakeGeneratorDialog::advancedVisibilityChanged);
|
||||
|
||||
return advancedWidget;
|
||||
}
|
||||
|
||||
QWidget* CmakeGeneratorDialog::createButtons()
|
||||
{
|
||||
QDialogButtonBox *buttons = new QDialogButtonBox(QDialogButtonBox::Ok|QDialogButtonBox::Cancel);
|
||||
auto *okButton = buttons->button(QDialogButtonBox::Ok);
|
||||
okButton->setDefault(true);
|
||||
@@ -87,14 +114,7 @@ CmakeGeneratorDialog::CmakeGeneratorDialog(const FilePath &rootDir, const FilePa
|
||||
connect(buttons, &QDialogButtonBox::rejected, this, &QDialog::reject);
|
||||
connect(m_model, &CMakeGeneratorDialogTreeModel::checkedStateChanged, this, &CmakeGeneratorDialog::refreshNotificationText);
|
||||
|
||||
QLabel *mainLabel = new QLabel(QCoreApplication::translate("QmlDesigner::GenerateCmake",
|
||||
"Start CMakeFiles.txt generation"),
|
||||
this);
|
||||
mainLabel->setMargin(50);
|
||||
|
||||
dialogLayout->addWidget(mainLabel);
|
||||
dialogLayout->addWidget(advancedWidget);
|
||||
dialogLayout->addWidget(buttons);
|
||||
return buttons;
|
||||
}
|
||||
|
||||
FilePaths CmakeGeneratorDialog::getFilePaths()
|
||||
@@ -151,5 +171,19 @@ void CmakeGeneratorDialog::refreshNotificationText()
|
||||
}
|
||||
}
|
||||
|
||||
void CmakeGeneratorDialog::advancedVisibilityChanged(bool visible)
|
||||
{
|
||||
if (visible) {
|
||||
setMaximumHeight(QWIDGETSIZE_MAX);
|
||||
setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
|
||||
}
|
||||
else {
|
||||
setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
|
||||
int height = layout()->totalSizeHint().height();
|
||||
setMaximumHeight(height);
|
||||
resize(width(), height);
|
||||
}
|
||||
}
|
||||
|
||||
} //GenerateCmake
|
||||
} //QmlDesigner
|
||||
|
@@ -33,7 +33,8 @@
|
||||
|
||||
#include <QDialog>
|
||||
#include <QTextEdit>
|
||||
|
||||
#include <QTreeView>
|
||||
#include <QLabel>
|
||||
|
||||
namespace QmlDesigner {
|
||||
namespace GenerateCmake {
|
||||
@@ -48,6 +49,12 @@ public:
|
||||
|
||||
public slots:
|
||||
void refreshNotificationText();
|
||||
void advancedVisibilityChanged(bool visible);
|
||||
|
||||
private:
|
||||
QTreeView* createFileTree();
|
||||
QWidget* createDetailsWidget();
|
||||
QWidget* createButtons();
|
||||
|
||||
private:
|
||||
CMakeGeneratorDialogTreeModel *m_model;
|
||||
@@ -57,7 +64,7 @@ private:
|
||||
Utils::FilePaths m_files;
|
||||
};
|
||||
|
||||
}
|
||||
}
|
||||
} //GenerateCmake
|
||||
} //QmlDesigner
|
||||
|
||||
#endif // CMAKEGENERATORDIALOG_H
|
||||
|
@@ -34,6 +34,8 @@
|
||||
#include <nodeinstanceclientinterface.h>
|
||||
#include <nodeinstanceserverinterface.h>
|
||||
|
||||
#include <utils/filepath.h>
|
||||
|
||||
#include <QElapsedTimer>
|
||||
#include <QHash>
|
||||
#include <QImage>
|
||||
@@ -51,6 +53,10 @@ namespace ProjectExplorer {
|
||||
class Target;
|
||||
}
|
||||
|
||||
namespace Utils {
|
||||
class QtcProcess;
|
||||
}
|
||||
|
||||
namespace QmlDesigner {
|
||||
|
||||
class NodeInstanceServerProxy;
|
||||
@@ -229,7 +235,8 @@ private: // functions
|
||||
void updatePreviewImageForNode(const ModelNode &modelNode, const QImage &image);
|
||||
|
||||
void updateWatcher(const QString &path);
|
||||
|
||||
void handleShaderChanges();
|
||||
void handleQsbProcessExit(Utils::QtcProcess *qsbProcess, const QString &shader);
|
||||
void updateRotationBlocks();
|
||||
void maybeResetOnPropertyChange(const PropertyName &name, const ModelNode &node,
|
||||
PropertyChangeFlags flags);
|
||||
@@ -278,7 +285,11 @@ private:
|
||||
QFileSystemWatcher *m_fileSystemWatcher;
|
||||
QTimer m_resetTimer;
|
||||
QTimer m_updateWatcherTimer;
|
||||
QTimer m_generateQsbFilesTimer;
|
||||
Utils::FilePath m_qsbPath;
|
||||
QSet<QString> m_pendingUpdateDirs;
|
||||
QSet<QString> m_pendingQsbTargets;
|
||||
int m_remainingQsbTargets;
|
||||
QTimer m_rotBlockTimer;
|
||||
};
|
||||
|
||||
|
@@ -92,12 +92,18 @@
|
||||
#include <hdrimage.h>
|
||||
#endif
|
||||
|
||||
#include <coreplugin/messagemanager.h>
|
||||
|
||||
#include <projectexplorer/kit.h>
|
||||
#include <projectexplorer/target.h>
|
||||
|
||||
#include <qmlprojectmanager/qmlmultilanguageaspect.h>
|
||||
|
||||
#include <utils/algorithm.h>
|
||||
#include <utils/qtcassert.h>
|
||||
#include <utils/qtcprocess.h>
|
||||
|
||||
#include <qtsupport/qtkitinformation.h>
|
||||
|
||||
#include <QUrl>
|
||||
#include <QMultiHash>
|
||||
@@ -161,6 +167,18 @@ NodeInstanceView::NodeInstanceView(ConnectionManagerInterface &connectionManager
|
||||
m_pendingUpdateDirs.clear();
|
||||
});
|
||||
|
||||
// Since generating qsb files is asynchronous and can trigger directory changes, which in turn
|
||||
// can trigger qsb generation, compressing qsb generation is necessary to avoid a lot of
|
||||
// unnecessary generation when project with multiple shaders is opened.
|
||||
m_generateQsbFilesTimer.setSingleShot(true);
|
||||
m_generateQsbFilesTimer.setInterval(100);
|
||||
QObject::connect(&m_generateQsbFilesTimer, &QTimer::timeout, [this] {
|
||||
handleShaderChanges();
|
||||
|
||||
if (m_qsbPath.isEmpty() || m_remainingQsbTargets <= 0)
|
||||
m_resetTimer.start();
|
||||
});
|
||||
|
||||
connect(m_fileSystemWatcher, &QFileSystemWatcher::directoryChanged,
|
||||
[this](const QString &path) {
|
||||
const QSet<QString> pendingDirs = m_pendingUpdateDirs;
|
||||
@@ -177,8 +195,9 @@ NodeInstanceView::NodeInstanceView(ConnectionManagerInterface &connectionManager
|
||||
m_updateWatcherTimer.start();
|
||||
|
||||
});
|
||||
connect(m_fileSystemWatcher, &QFileSystemWatcher::fileChanged, [this] {
|
||||
m_resetTimer.start();
|
||||
connect(m_fileSystemWatcher, &QFileSystemWatcher::fileChanged, [this](const QString &path) {
|
||||
m_pendingQsbTargets.insert(path);
|
||||
m_generateQsbFilesTimer.start();
|
||||
});
|
||||
|
||||
m_rotBlockTimer.setSingleShot(true);
|
||||
@@ -1461,6 +1480,17 @@ void NodeInstanceView::setTarget(ProjectExplorer::Target *newTarget)
|
||||
{
|
||||
if (m_currentTarget != newTarget) {
|
||||
m_currentTarget = newTarget;
|
||||
if (m_currentTarget && m_currentTarget->kit()) {
|
||||
if (QtSupport::QtVersion *qtVer = QtSupport::QtKitAspect::qtVersion(m_currentTarget->kit())) {
|
||||
m_qsbPath = qtVer->binPath().pathAppended("qsb").withExecutableSuffix();
|
||||
if (!m_qsbPath.exists())
|
||||
m_qsbPath.clear();
|
||||
}
|
||||
}
|
||||
|
||||
m_generateQsbFilesTimer.stop();
|
||||
m_pendingQsbTargets.clear();
|
||||
m_remainingQsbTargets = 0;
|
||||
restartProcess();
|
||||
}
|
||||
}
|
||||
@@ -1904,9 +1934,88 @@ void NodeInstanceView::updateWatcher(const QString &path)
|
||||
m_fileSystemWatcher->removePaths(oldFiles);
|
||||
if (!newFiles.isEmpty())
|
||||
m_fileSystemWatcher->addPaths(newFiles);
|
||||
|
||||
for (const auto &newFile : qAsConst(newFiles)) {
|
||||
if (!oldFiles.contains(newFile))
|
||||
m_pendingQsbTargets.insert(newFile);
|
||||
}
|
||||
|
||||
if (!m_pendingQsbTargets.isEmpty())
|
||||
m_generateQsbFilesTimer.start();
|
||||
}
|
||||
}
|
||||
|
||||
void NodeInstanceView::handleQsbProcessExit(Utils::QtcProcess *qsbProcess, const QString &shader)
|
||||
{
|
||||
--m_remainingQsbTargets;
|
||||
|
||||
QString errStr = qsbProcess->errorString();
|
||||
QByteArray stdErrStr = qsbProcess->readAllStandardError();
|
||||
|
||||
if (!errStr.isEmpty() || !stdErrStr.isEmpty()) {
|
||||
Core::MessageManager::writeSilently(
|
||||
QCoreApplication::translate("QmlDesigner::NodeInstanceView",
|
||||
"Failed to generate QSB file for: %1")
|
||||
.arg(shader));
|
||||
if (!errStr.isEmpty())
|
||||
Core::MessageManager::writeSilently(errStr);
|
||||
if (!stdErrStr.isEmpty())
|
||||
Core::MessageManager::writeSilently(QString::fromUtf8(stdErrStr));
|
||||
}
|
||||
|
||||
if (m_remainingQsbTargets <= 0)
|
||||
m_resetTimer.start();
|
||||
|
||||
qsbProcess->deleteLater();
|
||||
}
|
||||
|
||||
void NodeInstanceView::handleShaderChanges()
|
||||
{
|
||||
m_remainingQsbTargets += m_pendingQsbTargets.size();
|
||||
|
||||
for (const auto &shader : qAsConst(m_pendingQsbTargets)) {
|
||||
// Run qsb for changed shader file
|
||||
if (!m_qsbPath.isEmpty() && !shader.isEmpty()) {
|
||||
const Utils::FilePath sourceFile = Utils::FilePath::fromString(shader);
|
||||
const Utils::FilePath srcPath = sourceFile.absolutePath();
|
||||
const Utils::FilePath outPath = Utils::FilePath::fromString(shader + ".qsb");
|
||||
|
||||
if (!sourceFile.exists() || (outPath.exists() && outPath.lastModified() > sourceFile.lastModified())) {
|
||||
--m_remainingQsbTargets;
|
||||
continue;
|
||||
}
|
||||
|
||||
// Run QSB with same parameters as Qt build does
|
||||
// TODO: Parameters should be configurable (QDS-6590)
|
||||
const QStringList args = {"-s", "--glsl", "100 es,120,150", "--hlsl", "50", "--msl", "12",
|
||||
"-o", outPath.toString(), shader};
|
||||
auto qsbProcess = new Utils::QtcProcess;
|
||||
qsbProcess->setWorkingDirectory(srcPath);
|
||||
qsbProcess->setCommand({m_qsbPath, args});
|
||||
qsbProcess->start();
|
||||
|
||||
if (!qsbProcess->waitForStarted()) {
|
||||
handleQsbProcessExit(qsbProcess, shader);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (qsbProcess->state() == QProcess::Running) {
|
||||
connect(qsbProcess, &Utils::QtcProcess::finished,
|
||||
[thisView = QPointer<NodeInstanceView>(this), qsbProcess, shader]() {
|
||||
if (thisView)
|
||||
thisView->handleQsbProcessExit(qsbProcess, shader);
|
||||
else
|
||||
qsbProcess->deleteLater();
|
||||
});
|
||||
} else {
|
||||
handleQsbProcessExit(qsbProcess, shader);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
m_pendingQsbTargets.clear();
|
||||
}
|
||||
|
||||
void NodeInstanceView::updateRotationBlocks()
|
||||
{
|
||||
if (!model())
|
||||
|
@@ -924,6 +924,10 @@ static QList<QmlDesigner::Import> generatePossibleFileImports(const QString &pat
|
||||
|
||||
std::function<void(const QString &)> checkDir;
|
||||
checkDir = [&](const QString &checkPath) {
|
||||
|
||||
if (QFileInfo(checkPath).isRoot())
|
||||
return;
|
||||
|
||||
const QStringList entries = QDir(checkPath).entryList(QDir::Dirs | QDir::NoDot | QDir::NoDotDot);
|
||||
const QString checkPathDelim = checkPath + delimeter;
|
||||
for (const QString &entry : entries) {
|
||||
@@ -1007,7 +1011,8 @@ void TextToModelMerger::setupPossibleImports(const QmlJS::Snapshot &snapshot, co
|
||||
|
||||
QList<QmlDesigner::Import> possibleImports = generatePossibleLibraryImports(filteredPossibleImportKeys);
|
||||
|
||||
possibleImports.append(generatePossibleFileImports(document()->path(), imports->all()));
|
||||
if (document()->fileName() != "<internal>")
|
||||
possibleImports.append(generatePossibleFileImports(document()->path(), imports->all()));
|
||||
|
||||
if (m_rewriterView->isAttached())
|
||||
m_rewriterView->model()->setPossibleImports(possibleImports);
|
||||
|
@@ -148,8 +148,7 @@ QStringList GenerateResource::getFileList(const QList<ResourceFile> &fileNames)
|
||||
|
||||
bool skipSuffix(const QString &fileName)
|
||||
{
|
||||
const QStringList suffixes = {".qmlproject",
|
||||
".pri",
|
||||
const QStringList suffixes = {".pri",
|
||||
".pro",
|
||||
".user",
|
||||
".qrc",
|
||||
@@ -158,7 +157,10 @@ bool skipSuffix(const QString &fileName)
|
||||
".db",
|
||||
".tmp",
|
||||
".TMP",
|
||||
".metainfo"};
|
||||
".metainfo",
|
||||
".qtds",
|
||||
".db-shm",
|
||||
".db-wal"};
|
||||
|
||||
for (const auto &suffix : suffixes)
|
||||
if (fileName.endsWith(suffix))
|
||||
|
@@ -128,6 +128,7 @@ private Q_SLOTS:
|
||||
void initializerWithinFunctionArg();
|
||||
void shiftWithinInitializer();
|
||||
void lambdaWithReturnType();
|
||||
void structuredBinding();
|
||||
};
|
||||
|
||||
struct Line {
|
||||
@@ -2209,6 +2210,17 @@ void tst_CodeFormatter::lambdaWithReturnType()
|
||||
checkIndent(data);
|
||||
}
|
||||
|
||||
void tst_CodeFormatter::structuredBinding()
|
||||
{
|
||||
QList<Line> data;
|
||||
data << Line("int main() {")
|
||||
<< Line(" auto [v1, v2] = tuple_func();")
|
||||
<< Line(" return 0;")
|
||||
<< Line("}")
|
||||
;
|
||||
checkIndent(data);
|
||||
}
|
||||
|
||||
QTEST_MAIN(tst_CodeFormatter)
|
||||
|
||||
#include "tst_codeformatter.moc"
|
||||
|
Reference in New Issue
Block a user