Merge remote-tracking branch 'origin/4.4'

Conflicts:
	qbs/modules/qtc/qtc.qbs
	qtcreator.pri
	src/plugins/qbsprojectmanager/qbsproject.h

Change-Id: I6b9cdf704be95ade02488c8b19582b6621282fb8
This commit is contained in:
Eike Ziller
2017-07-28 15:24:14 +02:00
106 changed files with 7908 additions and 7461 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.7 KiB

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.7 KiB

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

View File

@@ -1,6 +1,6 @@
/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Copyright (C) 2017 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the Qt Creator documentation.
@@ -131,6 +131,9 @@
\endlist
\QC creates the test in the specified project directory.
For more information about creating Google tests, see the
\l{https://github.com/google/googletest/blob/master/googletest/docs/Primer.md}
{Google Test Primer}.
\section1 Setting Up the Google C++ Testing Framework
@@ -175,6 +178,87 @@
\li \c {LIBS += -lgmock -L<path_to_gmock_lib>}
\endlist
\section1 Building and Running Tests
To build and run tests:
\list 1
\li Open a project that contains tests.
\li In the \uicontrol Tests view, select the tests to run.
\li In the \uicontrol {Test Results} output pane, select
\inlineimage run_small.png
(\uicontrol {Run All Tests}) to run all test or
\inlineimage qtcreator-run-selected-tests.png
(\uicontrol {Run Selected Tests}) to run the selected tests.
\note By default, \QC builds a project before deploying and running
it.
\endlist
If a test takes more than a minute to execute, the default timeout might
stop the test execution. To increase the timeout, select \uicontrol Tools >
\uicontrol Options > \uicontrol {Test Settings} > \uicontrol General.
\section2 Selecting Tests to Run
The \uicontrol Tests view shows all the tests found for the currently active
test frameworks in the current project. Select the test cases to run.
\image qtcreator-tests-view.png
If a Qt Quick test case does not have a name, it is marked
\uicontrol Unnamed in the list. Unnamed test cases are executed when you
select \uicontrol {Run All Tests}. You cannot select or deselect them.
\QC scans the project for tests when you open the project and updates the
test list for the currently active test frameworks when you edit tests.
To refresh the view, select \uicontrol {Rescan Tests} in the context menu.
You can add filters to specify the directories within the current project
to scan for tests. Select \uicontrol Tools > \uicontrol Options >
\uicontrol {Test Settings} > \uicontrol General > \uicontrol Add, and
specify paths to the directories to scan for tests. Wildcards are not
supported in the filter expressions.
\image qtcreator-autotests-options.png
To show or hide init and cleanup or data functions in the \uicontrol Tests
view, select \inlineimage filtericon.png
(\uicontrol {Filter Test Tree}), and then select \uicontrol {Show Init and
Cleanup Functions} or \uicontrol {Show Data Functions}. Double-click a
function in the list to open its source code in the code editor.
The test cases are listed in alphabetic order. To list them in the order in
which they are defined in the source code, select \inlineimage leafsort.png
(\uicontrol {Sort Naturally}).
\section2 Specifying Settings for Running Qt Tests
The code inside a benchmark test is measured, and possibly also repeated
several times in order to get an accurate measurement. This depends on the
measurement back-end that you can select in the
\uicontrol {Benchmark Metrics} group in \uicontrol Tools >
\uicontrol Options > \uicontrol {Test Settings} > \uicontrol {Qt Test}:
walltime, CPU tick counter, event counter, Valgrind Callgrind, and Linux
Perf. For more information, see \l{Creating a Benchmark}.
\image qtcreator-autotests-options-qt.png
To receive verbose output when running benchmarks, select the
\uicontrol {Verbose benchmarks} check box.
To allow the debugger to interrupt Qt tests on assertions, select the
\uicontrol {Disable crash handler while debugging} check box.
To record information about signals and slots in the test log, select the
\uicontrol {Log signals and slots} check box.
\section2 Specifying Settings for Running Google Tests
To specify settings for running Google tests, select \uicontrol Tools >
\uicontrol Options > \uicontrol {Test Settings} > \uicontrol {Google Test}.
@@ -193,58 +277,23 @@
failures into C++ exceptions, select the \uicontrol {Throw on failure} check
box.
For more information about creating Google tests, see the
\l{https://github.com/google/googletest/blob/master/googletest/docs/Primer.md}
{Google Test Primer}.
\section1 Building and Running Tests
To build and run tests:
\list 1
\li Open a project that contains tests.
\li In the \uicontrol {Test Results} output pane, select
\inlineimage run_small.png
(\uicontrol {Run All Tests}) to run all test or
\inlineimage qtcreator-run-selected-tests.png
(\uicontrol {Run Selected Tests}) to run the selected tests.
You can select the tests to run in the \uicontrol Tests view in the
\uicontrol Projects pane. For more information, see
\l{Viewing Tests}.
\note By default, \QC builds a project before deploying and running
it.
\endlist
If a test takes more than a minute to execute, the default timeout might
stop the test execution. To increase the timeout, select \uicontrol Tools >
\uicontrol Options > \uicontrol {Test Settings} > \uicontrol General.
\image qtcreator-autotests-options.png
\QC scans the project for tests when you open the project and updates the
test list for the currently active test frameworks when you edit tests.
The code inside a benchmark test is measured, and possibly also repeated
several times in order to get an accurate measurement. This depends on the
measurement back-end that you can select in the
\uicontrol {Benchmark Metrics} group in \uicontrol Tools >
\uicontrol Options > \uicontrol {Test Settings} > \uicontrol {Qt Test}:
walltime, CPU tick counter, event counter, Valgrind Callgrind, and Linux
Perf. For more information, see \l{Creating a Benchmark}.
\image qtcreator-autotests-options-qt.png
To allow the debugger to interrupt Qt tests on assertions, select the
\uicontrol {Disable crash handler while debugging} check box.
\section1 Viewing Test Output
The test results are displayed in the \uicontrol {Test Results} output pane.
The test results are displayed in the \uicontrol {Test Results} output pane
in XML format. XML can be parsed more easily and reliably than plain text.
However, if a Qt test crashes, it might not produce complete XML code that
can be parsed, which might lead to information loss. The lost information
might be retrievable when viewing the results as plain text.
To view the results of Qt tests as plain text, select \uicontrol Tools >
\uicontrol Options > \uicontrol {Test Settings} > \uicontrol {Qt Test}, and
then deselect the \uicontrol {Use XML output} check box. Then select the
\inlineimage text.png
(\uicontrol {Switch Between Visual and Text Display}) button in the
\uicontrol {Test Results} output pane to switch to the text display.
The following table lists the messages that the \uicontrol {Test Results}
output pane displays:
\table
\header
@@ -272,6 +321,13 @@
\row
\li FAIL
\li Test case failed. Double-click the line for more information.
\row
\li FATAL
\li A fatal error occurred that stops the test case from being run,
for example.
\row
\li INFO
\li Informative message.
\row
\li INTERNAL
\li Internal message.
@@ -281,6 +337,9 @@
\row
\li SKIP
\li Test case was skipped.
\row
\li SYSTEM
\li An error message received from or influenced by the OS.
\row
\li XPASS
\li Test case passed even though it was expected to fail.
@@ -294,7 +353,14 @@
(\uicontrol {Filter Test Results}), and then select the types of messages to
show.
To hide internal messages and run configuration warnings, select
\uicontrol Tools > \uicontrol Options > \uicontrol {Test Settings} >
\uicontrol General.
By default, test result output is limited to 100,000 characters. The output
pane is automatically scrolled down when new results are added. To display
full results, select \uicontrol Tools > \uicontrol Options >
\uicontrol {Test Settings} > \uicontrol General, and then deselect the
\uicontrol {Limit result output} check box. To disable automatic scrolling,
deselect the \uicontrol {Automatically scroll results} check box.
Internal messages and run configuration warnings for guessed configurations
are omitted by default. To view them, deselect the \uicontrol {Omit internal
messages} and \uicontrol {Omit run configuration warnings} check boxes.
*/

View File

@@ -1,6 +1,6 @@
/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Copyright (C) 2017 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the Qt Creator documentation.
@@ -141,6 +141,7 @@
hierarchy of a QML file.
\li \uicontrol Tests lists autotests and Qt Quick tests in the project.
For more information, see \l {Running Autotests}.
\li \uicontrol {Type Hierarchy} shows the base classes of a class.
@@ -303,28 +304,6 @@
\endlist
\section2 Viewing Tests
The \uicontrol Tests view shows the autotests and Qt Quick tests in the
current project. Select the test cases to run. If a Qt
Quick test case does not have a name, it is marked \uicontrol Unnamed in the
list. Unnamed test cases are always executed when the application that
contains them is run, and therefore you cannot select or deselect them.
To show or hide init and cleanup or data functions, select
\uicontrol {Filter Test Tree} > \uicontrol {Show Init and Cleanup Functions}
or \uicontrol {Show Data Functions}. Double-click a function in the list
to open its source code in the code editor.
The test cases are listed in alphabetic order. To list them in the order in
which they are defined in the source code, select \inlineimage leafsort.png
(\uicontrol {Sort Naturally}).
To run tests, select \uicontrol {Run All Tests} or
\uicontrol {Run Selected Tests} in the context menu.
To refresh the view, select \uicontrol {Rescan Tests} in the context menu.
\section2 Viewing Type Hierarchy
To view the base classes of a class, right-click the class and select
@@ -375,8 +354,7 @@
To open the \uicontrol{General Messages} and \l{Using Version Control Systems}
{Version Control} panes, select
\uicontrol {Window > Output Panes}. To display the \uicontrol {To-Do Entries} pane,
enable the Todo plugin and to display the \l{Running Autotests}
{Test Results} pane, enable the Auto Tests plugin.
enable the Todo plugin.
\section2 Issues

View File

@@ -57,17 +57,16 @@ def parse_arguments():
source_include_patterns = [
# directories
r"^scripts/.*$", # everything under scripts/
r"^doc/.*$", # everything under doc/
r"^(?!(share|tests)/.*$)(.*/)?$", # look into all directories except under share/ and tests/
r"^share/(qtcreator/(qml/(qmlpuppet/(.*/)?)?)?)?$", # for shared headers for qt quick designer plugins
r"^src/(.*/)?$", # all directories under src/
r"^plugins/(.*/)?$", # all directories under plugins/ (if this is run on extra plugin repositories)
# files
r"^HACKING$",
r"^LICENSE.*$",
r"^README.md$",
r"^.*\.pri$",
r"^.*\.h$",
r"^scripts/.*$", # include everything under scripts/
r"^doc/.*$", # include everything under doc/
r"^.*\.pri$", # .pri files in all directories that are looked into
r"^.*\.h$", # .h files in all directories that are looked into
]
build_include_patterns = [

View File

@@ -20,9 +20,11 @@ win32 {
# We need the version in two separate formats for the .rc file
# RC_VERSION=4,3,82,0 (quadruple)
# RC_VERSION_STRING="4.4.0-beta1" (free text)
# Also, we need to replace space with \x20 to be able to work with both rc and windres
COPYRIGHT = "2008-$${QTCREATOR_COPYRIGHT_YEAR} The Qt Company Ltd"
DEFINES += RC_VERSION=$$replace(QTCREATOR_VERSION, "\\.", ","),0 \
RC_VERSION_STRING=\\\"$${QTCREATOR_DISPLAY_VERSION}\\\" \
RC_COPYRIGHT='"\\\"2008-$${QTCREATOR_COPYRIGHT_YEAR} The Qt Company Ltd\\\""'
RC_VERSION_STRING=\"$${QTCREATOR_DISPLAY_VERSION}\" \
RC_COPYRIGHT=\"$$replace(COPYRIGHT, " ", "\\x20")\"
RC_FILE = qtcreator.rc
} else:macx {
LIBS += -framework CoreFoundation

View File

@@ -54,9 +54,11 @@ QtcProduct {
// We need the version in two separate formats for the .rc file
// RC_VERSION=4,3,82,0 (quadruple)
// RC_VERSION_STRING="4.4.0-beta1" (free text)
// Also, we need to replace space with \x20 to be able to work with both rc and windres
cpp.defines: outer.concat(["RC_VERSION=" + qtc.qtcreator_version.replace(/\./g, ",") + ",0",
"RC_VERSION_STRING=\"" + qtc.qtcreator_display_version + "\"",
"RC_COPYRIGHT=\"2008-" + qtc.qtcreator_copyright_year + " The Qt Company Ltd\""])
"RC_VERSION_STRING=" + qtc.qtcreator_display_version,
"RC_COPYRIGHT=2008-" + qtc.qtcreator_copyright_year
+ " The Qt Company Ltd".replace(/ /g, "\\x20")])
files: "qtcreator.rc"
}

View File

@@ -1,5 +1,8 @@
#include <windows.h>
#define STRINGIFY1(x) #x
#define STRINGIFY(x) STRINGIFY1(x)
IDI_ICON1 ICON DISCARDABLE "qtcreator.ico"
IDI_ICON2 ICON DISCARDABLE "winicons/c.ico"
IDI_ICON3 ICON DISCARDABLE "winicons/cpp.ico"
@@ -19,10 +22,10 @@ VS_VERSION_INFO VERSIONINFO
BLOCK "040904E4"
{
VALUE "FileDescription", "Qt Creator"
VALUE "FileVersion", RC_VERSION_STRING
VALUE "FileVersion", STRINGIFY(RC_VERSION_STRING)
VALUE "ProductName", "Qt Creator"
VALUE "ProductVersion", RC_VERSION_STRING
VALUE "LegalCopyright", RC_COPYRIGHT
VALUE "ProductVersion", STRINGIFY(RC_VERSION_STRING)
VALUE "LegalCopyright", STRINGIFY(RC_COPYRIGHT)
}
}
BLOCK "VarFileInfo"

View File

@@ -1,2 +0,0 @@
#include "ASTPatternBuilder.h"

View File

@@ -1,3 +1,22 @@
// Copyright (c) 2008 Roberto Raggi <roberto.raggi@gmail.com>
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
#include "Lexer.h"
#include "Token.h"

View File

@@ -1,3 +1,22 @@
// Copyright (c) 2008 Roberto Raggi <roberto.raggi@gmail.com>
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
#include "ObjectiveCTypeQualifiers.h"

View File

@@ -1,9 +1,27 @@
#ifndef CPLUSPLUS_OBJC_TYPEQUALIFIERS_H
#define CPLUSPLUS_OBJC_TYPEQUALIFIERS_H
// Copyright (c) 2008 Roberto Raggi <roberto.raggi@gmail.com>
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
#pragma once
#include "CPlusPlusForwardDeclarations.h"
namespace CPlusPlus {
enum {
@@ -27,6 +45,3 @@ enum {
CPLUSPLUS_EXPORT int classifyObjectiveCContextKeyword(const char *s, int n);
} // namespace CPlusPlus
#endif // CPLUSPLUS_OBJC_TYPEQUALIFIERS_H

View File

@@ -1,3 +1,22 @@
// Copyright (c) 2008 Roberto Raggi <roberto.raggi@gmail.com>
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
#include "QtContextKeywords.h"

View File

@@ -1,3 +1,22 @@
// Copyright (c) 2008 Roberto Raggi <roberto.raggi@gmail.com>
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
#pragma once

View File

@@ -23,8 +23,7 @@
**
****************************************************************************/
#ifndef CPLUSPLUS_SAFETYPEMATCHER_H
#define CPLUSPLUS_SAFETYPEMATCHER_H
#pragma once
#include "Matcher.h"
@@ -56,5 +55,3 @@ private:
};
} // CPlusPlus namespace
#endif // CPLUSPLUS_SAFETYPEMATCHER_H

View File

@@ -40,7 +40,6 @@ SOURCES += \
$$PWD/ASTMatch0.cpp \
$$PWD/ASTVisitor.cpp \
$$PWD/ASTClone.cpp \
$$PWD/ASTPatternBuilder.cpp \
$$PWD/ASTMatcher.cpp \
$$PWD/Matcher.cpp \
$$PWD/Control.cpp \

View File

@@ -30,7 +30,6 @@ Project {
"ASTMatch0.cpp",
"ASTMatcher.cpp",
"ASTMatcher.h",
"ASTPatternBuilder.cpp",
"ASTPatternBuilder.h",
"ASTVisit.cpp",
"ASTVisitor.cpp",

View File

@@ -32,6 +32,7 @@
#include <utils/algorithm.h>
#include <utils/qtcassert.h>
#include <utils/stringutils.h>
#include <QCoreApplication>
#include <QDebug>
@@ -631,26 +632,6 @@ static inline QString msgInvalidFormat(const char *key, const QString &content)
.arg(QLatin1String(key), content);
}
bool PluginSpec::readMultiLineString(const QJsonValue &value, QString *out)
{
QTC_ASSERT(out, return false);
if (value.isString()) {
*out = value.toString();
} else if (value.isArray()) {
QJsonArray array = value.toArray();
QStringList lines;
foreach (const QJsonValue &v, array) {
if (!v.isString())
return false;
lines.append(v.toString());
}
*out = lines.join(QLatin1Char('\n'));
} else {
return false;
}
return true;
}
/*!
\internal
*/
@@ -735,7 +716,7 @@ bool PluginSpecPrivate::readMetaData(const QJsonObject &pluginMetaData)
copyright = value.toString();
value = metaData.value(QLatin1String(DESCRIPTION));
if (!value.isUndefined() && !PluginSpec::readMultiLineString(value, &description))
if (!value.isUndefined() && !Utils::readMultiLineString(value, &description))
return reportError(msgValueIsNotAString(DESCRIPTION));
value = metaData.value(QLatin1String(URL));
@@ -749,7 +730,7 @@ bool PluginSpecPrivate::readMetaData(const QJsonObject &pluginMetaData)
category = value.toString();
value = metaData.value(QLatin1String(LICENSE));
if (!value.isUndefined() && !PluginSpec::readMultiLineString(value, &license))
if (!value.isUndefined() && !Utils::readMultiLineString(value, &license))
return reportError(msgValueIsNotAMultilineString(LICENSE));
value = metaData.value(QLatin1String(PLATFORM));
@@ -799,7 +780,7 @@ bool PluginSpecPrivate::readMetaData(const QJsonObject &pluginMetaData)
} else if (typeValue.toLower() == QLatin1String(DEPENDENCY_TYPE_TEST)) {
dep.type = PluginDependency::Test;
} else {
return reportError(tr("Dependency: \"%1\" must be \"%2\" or \"%3\" (is \"%4\")")
return reportError(tr("Dependency: \"%1\" must be \"%2\" or \"%3\" (is \"%4\").")
.arg(QLatin1String(DEPENDENCY_TYPE),
QLatin1String(DEPENDENCY_TYPE_HARD),
QLatin1String(DEPENDENCY_TYPE_SOFT),

View File

@@ -131,8 +131,6 @@ public:
bool hasError() const;
QString errorString() const;
static bool readMultiLineString(const QJsonValue &value, QString *out);
private:
PluginSpec();

View File

@@ -758,6 +758,13 @@ void ModelController::moveObject(MPackage *newOwner, MObject *object)
QMT_ASSERT(object, return);
QMT_ASSERT(object != m_rootPackage, return);
// verify that newOwner is not a child of object
MObject *newOwnerObject = newOwner;
while (newOwnerObject && newOwnerObject != object)
newOwnerObject = newOwnerObject->owner();
if (newOwnerObject == object)
return;
if (newOwner != object->owner()) {
int formerRow = 0;
MObject *formerOwner = object->owner();

View File

@@ -2,6 +2,8 @@ import qbs
import qbs.Environment
import qbs.File
import qbs.FileInfo
import qbs.Process
import qbs.Utilities
QtcLibrary {
condition: qbs.toolchain.contains("msvc") && cdbPath
@@ -45,11 +47,98 @@ QtcLibrary {
}
return undefined;
}
cpp.includePaths: [FileInfo.joinPaths(cdbPath, "inc")]
cpp.dynamicLibraries: [
"user32.lib",
FileInfo.joinPaths(cdbLibPath, "dbgeng.lib")
property string pythonInstallDir: Environment.getEnv("PYTHON_INSTALL_DIR")
Probe {
id: pythonDllProbe
condition: product.condition
property string pythonDir: pythonInstallDir // Input
property string buildVariant: qbs.buildVariant // Input
property string fileNamePrefix // Output
configure: {
function printWarning(msg) {
console.warn(msg + " The python dumpers for cdb will not be available.");
}
if (!pythonDir) {
printWarning("PYTHON_INSTALL_DIR not set.");
return;
}
if (!File.exists(pythonDir)) {
printWarning("The provided python installation directory '" + pythonDir
+ "' does not exist.");
return;
}
var p = new Process();
try {
var pythonFilePath = FileInfo.joinPaths(pythonDir, "python.exe");
p.exec(pythonFilePath, ["--version"], true);
var output = p.readStdOut().trim();
var magicPrefix = "Python ";
if (!output.startsWith(magicPrefix)) {
printWarning("Unexpected python output when checking for version: '"
+ output + "'");
return;
}
var versionNumberString = output.slice(magicPrefix.length);
var versionNumbers = versionNumberString.split('.');
if (versionNumbers.length < 2) {
printWarning("Unexpected python output when checking for version: '"
+ output + "'");
return;
}
if (Utilities.versionCompare(versionNumberString, "3.5") < 0) {
printWarning("The python installation at '" + pythonDir
+ "' has version " + versionNumberString + ", but 3.5 or higher "
+ "is required.");
return;
}
found = true;
fileNamePrefix = "python" + versionNumbers[0] + versionNumbers[1];
if (buildVariant === "debug")
fileNamePrefix += "_d"
} finally {
p.close();
}
}
}
Group {
name: "pythonDumper"
condition: pythonDllProbe.found
files: [
"pycdbextmodule.cpp",
"pycdbextmodule.h",
"pyfield.cpp",
"pyfield.h",
"pystdoutredirect.cpp",
"pystdoutredirect.h",
"pytype.cpp",
"pytype.h",
"pyvalue.cpp",
"pyvalue.h",
]
}
Properties {
condition: pythonDllProbe.found
cpp.defines: ["WITH_PYTHON=1"]
}
cpp.includePaths: {
var paths = [FileInfo.joinPaths(cdbPath, "inc")];
if (pythonDllProbe.found)
paths.push(FileInfo.joinPaths(pythonInstallDir, "include"));
return paths;
}
cpp.dynamicLibraries: {
var libs = [ "user32.lib", FileInfo.joinPaths(cdbLibPath, "dbgeng.lib") ];
if (pythonDllProbe.found)
libs.push(FileInfo.joinPaths(pythonInstallDir, "libs",
pythonDllProbe.fileNamePrefix + ".lib"));
return libs;
}
cpp.linkerFlags: ["/DEF:" + FileInfo.toWindowsSeparators(
FileInfo.joinPaths(product.sourceDirectory,
"qtcreatorcdbext.def"))]
@@ -61,6 +150,16 @@ QtcLibrary {
dirName += "32";
return FileInfo.joinPaths(qtc.libDirName, dirName);
}
Group {
condition: pythonDllProbe.found
files: [FileInfo.joinPaths(pythonInstallDir, pythonDllProbe.fileNamePrefix + ".dll")]
qbs.install: true
qbs.installDir: installDir
}
useNonGuiPchFile: false
files: [
"common.cpp",
"common.h",

View File

@@ -0,0 +1,305 @@
/****************************************************************************
**
** Copyright (C) 2017 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of Qt Creator.
**
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 3 as published by the Free Software
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
**
****************************************************************************/
#include "highlightingitemdelegate.h"
#include <QApplication>
#include <QModelIndex>
#include <QPainter>
const int kMinimumLineNumberDigits = 6;
namespace Utils {
HighlightingItemDelegate::HighlightingItemDelegate(int tabWidth, QObject *parent)
: QItemDelegate(parent)
{
setTabWidth(tabWidth);
}
void HighlightingItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option,
const QModelIndex &index) const
{
static const int iconSize = 16;
painter->save();
const QStyleOptionViewItem opt = setOptions(index, option);
painter->setFont(opt.font);
QItemDelegate::drawBackground(painter, opt, index);
// ---- do the layout
QRect checkRect;
QRect pixmapRect;
QRect textRect;
// check mark
const bool checkable = (index.model()->flags(index) & Qt::ItemIsUserCheckable);
Qt::CheckState checkState = Qt::Unchecked;
if (checkable) {
QVariant checkStateData = index.data(Qt::CheckStateRole);
checkState = static_cast<Qt::CheckState>(checkStateData.toInt());
checkRect = doCheck(opt, opt.rect, checkStateData);
}
// icon
const QIcon icon = index.model()->data(index, Qt::DecorationRole).value<QIcon>();
if (!icon.isNull()) {
const QSize size = icon.actualSize(QSize(iconSize, iconSize));
pixmapRect = QRect(0, 0, size.width(), size.height());
}
// text
textRect = opt.rect.adjusted(0, 0, checkRect.width() + pixmapRect.width(), 0);
// do layout
doLayout(opt, &checkRect, &pixmapRect, &textRect, false);
// ---- draw the items
// icon
if (!icon.isNull())
icon.paint(painter, pixmapRect, option.decorationAlignment);
// line numbers
const int lineNumberAreaWidth = drawLineNumber(painter, opt, textRect, index);
textRect.adjust(lineNumberAreaWidth, 0, 0, 0);
// text and focus/selection
drawText(painter, opt, textRect, index);
QItemDelegate::drawFocus(painter, opt, opt.rect);
// check mark
if (checkable)
QItemDelegate::drawCheck(painter, opt, checkRect, checkState);
painter->restore();
}
void HighlightingItemDelegate::setTabWidth(int width)
{
m_tabString = QString(width, ' ');
}
// returns the width of the line number area
int HighlightingItemDelegate::drawLineNumber(QPainter *painter, const QStyleOptionViewItem &option,
const QRect &rect,
const QModelIndex &index) const
{
static const int lineNumberAreaHorizontalPadding = 4;
const int lineNumber = index.model()->data(index, int(HighlightingItemRole::LineNumber)).toInt();
if (lineNumber < 1)
return 0;
const bool isSelected = option.state & QStyle::State_Selected;
const QString lineText = QString::number(lineNumber);
const int minimumLineNumberDigits = qMax(kMinimumLineNumberDigits, lineText.count());
const int fontWidth = painter->fontMetrics().width(QString(minimumLineNumberDigits, '0'));
const int lineNumberAreaWidth = lineNumberAreaHorizontalPadding + fontWidth
+ lineNumberAreaHorizontalPadding;
QRect lineNumberAreaRect(rect);
lineNumberAreaRect.setWidth(lineNumberAreaWidth);
QPalette::ColorGroup cg = QPalette::Normal;
if (!(option.state & QStyle::State_Active))
cg = QPalette::Inactive;
else if (!(option.state & QStyle::State_Enabled))
cg = QPalette::Disabled;
painter->fillRect(lineNumberAreaRect, QBrush(isSelected ?
option.palette.brush(cg, QPalette::Highlight) :
option.palette.color(cg, QPalette::Base).darker(111)));
QStyleOptionViewItem opt = option;
opt.displayAlignment = Qt::AlignRight | Qt::AlignVCenter;
opt.palette.setColor(cg, QPalette::Text, Qt::darkGray);
const QStyle *style = QApplication::style();
const int textMargin = style->pixelMetric(QStyle::PM_FocusFrameHMargin, 0, 0) + 1;
const QRect rowRect
= lineNumberAreaRect.adjusted(-textMargin, 0,
textMargin - lineNumberAreaHorizontalPadding, 0);
QItemDelegate::drawDisplay(painter, opt, rowRect, lineText);
return lineNumberAreaWidth;
}
void HighlightingItemDelegate::drawText(QPainter *painter,
const QStyleOptionViewItem &option,
const QRect &rect,
const QModelIndex &index) const
{
QString text = index.model()->data(index, Qt::DisplayRole).toString();
// show number of subresults in displayString
if (index.model()->hasChildren(index))
text += " (" + QString::number(index.model()->rowCount(index)) + ')';
int searchTermStart = index.model()->data(index, int(HighlightingItemRole::StartColumn)).toInt();
int searchTermLength = index.model()->data(index, int(HighlightingItemRole::Length)).toInt();
if (searchTermStart < 0 || searchTermStart >= text.length() || searchTermLength < 1) {
drawDisplay(painter, option, rect, text.replace('\t', m_tabString), {});
return;
}
// replace tabs with searchTerm bookkeeping
int searchTermEnd = searchTermStart + searchTermLength;
const int tabDiff = m_tabString.size() - 1;
for (int i = 0; i < text.length(); i++) {
if (text.at(i) == '\t') {
text.replace(i, 1, m_tabString);
if (i < searchTermStart) {
searchTermStart += tabDiff;
searchTermEnd += tabDiff;
} else if (i < searchTermEnd) {
searchTermEnd += tabDiff;
searchTermLength += tabDiff;
}
i += tabDiff;
}
}
const QColor highlightForeground =
index.model()->data(index, int(HighlightingItemRole::Foreground)).value<QColor>();
const QColor highlightBackground =
index.model()->data(index, int(HighlightingItemRole::Background)).value<QColor>();
QTextCharFormat highlightFormat;
highlightFormat.setForeground(highlightForeground);
highlightFormat.setBackground(highlightBackground);
drawDisplay(painter, option, rect, text, {{searchTermStart, searchTermLength, highlightFormat}});
}
// copied from QItemDelegate for drawDisplay
static QString replaceNewLine(QString text)
{
static const QChar nl = '\n';
for (int i = 0; i < text.count(); ++i)
if (text.at(i) == nl)
text[i] = QChar::LineSeparator;
return text;
}
// copied from QItemDelegate for drawDisplay
QSizeF doTextLayout(QTextLayout *textLayout, int lineWidth)
{
qreal height = 0;
qreal widthUsed = 0;
textLayout->beginLayout();
while (true) {
QTextLine line = textLayout->createLine();
if (!line.isValid())
break;
line.setLineWidth(lineWidth);
line.setPosition(QPointF(0, height));
height += line.height();
widthUsed = qMax(widthUsed, line.naturalTextWidth());
}
textLayout->endLayout();
return QSizeF(widthUsed, height);
}
// copied from QItemDelegate to be able to add the 'format' parameter
void HighlightingItemDelegate::drawDisplay(QPainter *painter,
const QStyleOptionViewItem &option,
const QRect &rect, const QString &text,
const QVector<QTextLayout::FormatRange> &format) const
{
QPalette::ColorGroup cg = option.state & QStyle::State_Enabled
? QPalette::Normal : QPalette::Disabled;
if (cg == QPalette::Normal && !(option.state & QStyle::State_Active))
cg = QPalette::Inactive;
if (option.state & QStyle::State_Selected) {
painter->fillRect(rect, option.palette.brush(cg, QPalette::Highlight));
painter->setPen(option.palette.color(cg, QPalette::HighlightedText));
} else {
painter->setPen(option.palette.color(cg, QPalette::Text));
}
if (text.isEmpty())
return;
if (option.state & QStyle::State_Editing) {
painter->save();
painter->setPen(option.palette.color(cg, QPalette::Text));
painter->drawRect(rect.adjusted(0, 0, -1, -1));
painter->restore();
}
const QStyleOptionViewItem opt = option;
const QWidget *widget = option.widget;
QStyle *style = widget ? widget->style() : QApplication::style();
const int textMargin = style->pixelMetric(QStyle::PM_FocusFrameHMargin, 0, widget) + 1;
QRect textRect = rect.adjusted(textMargin, 0, -textMargin, 0); // remove width padding
const bool wrapText = opt.features & QStyleOptionViewItem::WrapText;
QTextOption textOption;
textOption.setWrapMode(wrapText ? QTextOption::WordWrap : QTextOption::ManualWrap);
textOption.setTextDirection(option.direction);
textOption.setAlignment(QStyle::visualAlignment(option.direction, option.displayAlignment));
QTextLayout textLayout;
textLayout.setTextOption(textOption);
textLayout.setFont(option.font);
textLayout.setText(replaceNewLine(text));
QSizeF textLayoutSize = doTextLayout(&textLayout, textRect.width());
if (textRect.width() < textLayoutSize.width()
|| textRect.height() < textLayoutSize.height()) {
QString elided;
int start = 0;
int end = text.indexOf(QChar::LineSeparator, start);
if (end == -1) {
elided += option.fontMetrics.elidedText(text, option.textElideMode, textRect.width());
} else {
while (end != -1) {
elided += option.fontMetrics.elidedText(text.mid(start, end - start),
option.textElideMode, textRect.width());
elided += QChar::LineSeparator;
start = end + 1;
end = text.indexOf(QChar::LineSeparator, start);
}
// let's add the last line (after the last QChar::LineSeparator)
elided += option.fontMetrics.elidedText(text.mid(start),
option.textElideMode, textRect.width());
}
textLayout.setText(elided);
textLayoutSize = doTextLayout(&textLayout, textRect.width());
}
const QSize layoutSize(textRect.width(), int(textLayoutSize.height()));
const QRect layoutRect = QStyle::alignedRect(option.direction, option.displayAlignment,
layoutSize, textRect);
// if we still overflow even after eliding the text, enable clipping
if (!hasClipping() && (textRect.width() < textLayoutSize.width()
|| textRect.height() < textLayoutSize.height())) {
painter->save();
painter->setClipRect(layoutRect);
textLayout.draw(painter, layoutRect.topLeft(), format, layoutRect);
painter->restore();
} else {
textLayout.draw(painter, layoutRect.topLeft(), format, layoutRect);
}
}
} // namespace Utils

View File

@@ -1,6 +1,6 @@
/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Copyright (C) 2017 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of Qt Creator.
@@ -25,28 +25,37 @@
#pragma once
#include <texteditor/codeassist/completionassistprovider.h>
#include "utils_global.h"
#include <QStringList>
#include <QItemDelegate>
#include <QTextLayout>
namespace Android {
namespace Internal {
namespace Utils {
class JavaCompletionAssistProvider : public TextEditor::CompletionAssistProvider
{
Q_OBJECT
public:
JavaCompletionAssistProvider();
~JavaCompletionAssistProvider();
void init() const;
TextEditor::IAssistProcessor *createProcessor() const;
private:
mutable QStringList m_keywords;
enum class HighlightingItemRole {
LineNumber = Qt::UserRole,
StartColumn,
Length,
Foreground,
Background,
User
};
} // namespace Internal
} // namespace Android
class QTCREATOR_UTILS_EXPORT HighlightingItemDelegate : public QItemDelegate
{
public:
HighlightingItemDelegate(int tabWidth, QObject *parent = 0);
void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const;
void setTabWidth(int width);
private:
int drawLineNumber(QPainter *painter, const QStyleOptionViewItem &option, const QRect &rect, const QModelIndex &index) const;
void drawText(QPainter *painter, const QStyleOptionViewItem &option,
const QRect &rect, const QModelIndex &index) const;
using QItemDelegate::drawDisplay;
void drawDisplay(QPainter *painter, const QStyleOptionViewItem &option, const QRect &rect,
const QString &text, const QVector<QTextLayout::FormatRange> &format) const;
QString m_tabString;
};
} // namespace Utils

View File

@@ -36,6 +36,7 @@
#include <QPainter>
#include <QPaintEngine>
#include <QWidget>
#include <QDebug>
namespace Utils {
@@ -67,7 +68,12 @@ static MasksAndColors masksAndColors(const Icon &icon, int dpr)
const QColor color = creatorTheme()->color(i.second);
const QString dprFileName = StyleHelper::availableImageResolutions(i.first).contains(dpr) ?
StyleHelper::imageFileWithResolution(fileName, dpr) : fileName;
result.append(qMakePair(QPixmap(dprFileName), color));
QPixmap pixmap;
if (!pixmap.load(dprFileName)) {
pixmap = QPixmap(1, 1);
qWarning() << "Could not load image: " << dprFileName;
}
result.append({pixmap, color});
}
return result;
}

View File

@@ -28,8 +28,11 @@
#include "hostosinfo.h"
#include <utils/algorithm.h>
#include <utils/qtcassert.h>
#include <QDir>
#include <QJsonArray>
#include <QJsonValue>
#include <QRegularExpression>
#include <QSet>
@@ -246,4 +249,24 @@ QTCREATOR_UTILS_EXPORT QString stripAccelerator(const QString &text)
return res;
}
QTCREATOR_UTILS_EXPORT bool readMultiLineString(const QJsonValue &value, QString *out)
{
QTC_ASSERT(out, return false);
if (value.isString()) {
*out = value.toString();
} else if (value.isArray()) {
QJsonArray array = value.toArray();
QStringList lines;
foreach (const QJsonValue &v, array) {
if (!v.isString())
return false;
lines.append(v.toString());
}
*out = lines.join(QLatin1Char('\n'));
} else {
return false;
}
return true;
}
} // namespace Utils

View File

@@ -28,6 +28,7 @@
#include "utils_global.h"
QT_BEGIN_NAMESPACE
class QJsonValue;
class QStringList;
QT_END_NAMESPACE
@@ -53,6 +54,8 @@ QTCREATOR_UTILS_EXPORT QString withTildeHomePath(const QString &path);
// Removes first unescaped ampersand in text
QTCREATOR_UTILS_EXPORT QString stripAccelerator(const QString &text);
QTCREATOR_UTILS_EXPORT bool readMultiLineString(const QJsonValue &value, QString *out);
class QTCREATOR_UTILS_EXPORT AbstractMacroExpander
{
public:

View File

@@ -113,7 +113,8 @@ SOURCES += $$PWD/environment.cpp \
$$PWD/port.cpp \
$$PWD/runextensions.cpp \
$$PWD/utilsicons.cpp \
$$PWD/guard.cpp
$$PWD/guard.cpp \
$$PWD/highlightingitemdelegate.cpp
win32:SOURCES += $$PWD/consoleprocess_win.cpp
else:SOURCES += $$PWD/consoleprocess_unix.cpp
@@ -239,8 +240,9 @@ HEADERS += \
$$PWD/asconst.h \
$$PWD/smallstringfwd.h \
$$PWD/optional.h \
$$PWD/../3rdparty/optional/optional.hpp \
$$PWD/qtcfallthrough.h \
$$PWD/../3rdparty/optional/optional.hpp
$$PWD/highlightingitemdelegate.cpp
FORMS += $$PWD/filewizardpage.ui \
$$PWD/projectintropage.ui \

View File

@@ -117,6 +117,8 @@ Project {
"functiontraits.h",
"guard.cpp",
"guard.h",
"highlightingitemdelegate.cpp",
"highlightingitemdelegate.h",
"historycompleter.cpp",
"historycompleter.h",
"hostosinfo.h",

View File

@@ -41,7 +41,6 @@ HEADERS += \
androidsignaloperation.h \
javaeditor.h \
javaindenter.h \
javacompletionassistprovider.h \
avddialog.h \
android_global.h \
androidbuildapkstep.h \
@@ -86,7 +85,6 @@ SOURCES += \
androidsignaloperation.cpp \
javaeditor.cpp \
javaindenter.cpp \
javacompletionassistprovider.cpp \
avddialog.cpp \
androidbuildapkstep.cpp \
androidbuildapkwidget.cpp \

View File

@@ -107,8 +107,6 @@ Project {
"avddialog.h",
"certificatesmodel.cpp",
"certificatesmodel.h",
"javacompletionassistprovider.cpp",
"javacompletionassistprovider.h",
"javaeditor.cpp",
"javaeditor.h",
"javaindenter.cpp",

View File

@@ -42,7 +42,6 @@
#include "androidruncontrol.h"
#include "androidsettingspage.h"
#include "androidtoolchain.h"
#include "javacompletionassistprovider.h"
#include "javaeditor.h"
#ifdef HAVE_QBS

View File

@@ -78,7 +78,7 @@
<item row="2" column="2">
<widget class="QLabel" name="label_3">
<property name="text">
<string>Conflicting "am start" options might result in the app startup failure.</string>
<string>If the "am start" options conflict, the application might not start.</string>
</property>
</widget>
</item>

View File

@@ -1,113 +0,0 @@
/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of Qt Creator.
**
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 3 as published by the Free Software
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
**
****************************************************************************/
#include "javacompletionassistprovider.h"
#include "androidconstants.h"
#include <texteditor/codeassist/assistinterface.h>
#include <texteditor/codeassist/keywordscompletionassist.h>
#include <coreplugin/id.h>
using namespace Android;
using namespace Android::Internal;
static const char *const keywords[] = {
"abstract",
"continue",
"for",
"new",
"switch",
"assert",
"default",
"goto",
"package",
"synchronized",
"boolean",
"do",
"if",
"private",
"this",
"break",
"double",
"implements",
"protected",
"throw",
"byte",
"else",
"import",
"public",
"throws",
"case",
"enum",
"instanceof",
"return",
"transient",
"catch",
"extends",
"int",
"short",
"try",
"char",
"final",
"interface",
"static",
"void",
"class",
"finally",
"long",
"strictfp",
"volatile",
"const",
"float",
"native",
"super",
"while",
0
};
JavaCompletionAssistProvider::JavaCompletionAssistProvider()
{
}
JavaCompletionAssistProvider::~JavaCompletionAssistProvider()
{
}
void JavaCompletionAssistProvider::init() const
{
for (uint i = 0; i < sizeof keywords / sizeof keywords[0] - 1; i++)
m_keywords.append(QLatin1String(keywords[i]));
}
TextEditor::IAssistProcessor *JavaCompletionAssistProvider::createProcessor() const
{
if (m_keywords.isEmpty())
init();
TextEditor::Keywords keywords = TextEditor::Keywords(m_keywords,
QStringList(),
QMap<QString, QStringList>());
return new TextEditor::KeywordsCompletionAssistProcessor(keywords);
}

View File

@@ -26,8 +26,8 @@
#include "javaeditor.h"
#include "javaindenter.h"
#include "androidconstants.h"
#include "javacompletionassistprovider.h"
#include <texteditor/codeassist/keywordscompletionassist.h>
#include <coreplugin/editormanager/ieditorfactory.h>
#include <texteditor/normalindenter.h>
#include <texteditor/textdocument.h>
@@ -59,6 +59,14 @@ static TextEditor::TextDocument *createJavaDocument()
JavaEditorFactory::JavaEditorFactory()
{
static QStringList keywords = {
"abstract", "assert", "boolean", "break", "byte", "case", "catch", "char", "class", "const",
"continue", "default", "do", "double", "else", "enum", "extends", "final", "finally",
"float", "for", "goto", "if", "implements", "import", "instanceof", "int", "interface",
"long", "native", "new", "package", "private", "protected", "public", "return", "short",
"static", "strictfp", "super", "switch", "synchronized", "this", "throw", "throws",
"transient", "try", "void", "volatile", "while"
};
setId(Constants::JAVA_EDITOR_ID);
setDisplayName(tr("Java Editor"));
addMimeType(Constants::JAVA_MIMETYPE);
@@ -67,8 +75,8 @@ JavaEditorFactory::JavaEditorFactory()
setUseGenericHighlighter(true);
setCommentDefinition(Utils::CommentDefinition::CppStyle);
setEditorActionHandlers(TextEditor::TextEditorActionHandler::UnCommentSelection);
setCompletionAssistProvider(new JavaCompletionAssistProvider);
setMarksVisible(true);
setCompletionAssistProvider(new TextEditor::KeywordsCompletionAssistProvider(keywords));
}
} // namespace Internal

View File

@@ -47,6 +47,7 @@
#include <cpptools/editordocumenthandle.h>
#include <texteditor/convenience.h>
#include <texteditor/displaysettings.h>
#include <texteditor/fontsettings.h>
#include <texteditor/texteditor.h>
#include <texteditor/texteditorconstants.h>
@@ -274,6 +275,9 @@ void ClangEditorDocumentProcessor::addDiagnosticToolTipToLayout(uint line,
= m_diagnosticManager.diagnosticsAt(line, column);
target->addWidget(ClangDiagnosticWidget::create(diagnostics, ClangDiagnosticWidget::ToolTip));
auto link = TextEditor::DisplaySettings::createAnnotationSettingsLink();
target->addWidget(link);
target->setAlignment(link, Qt::AlignRight);
}
void ClangEditorDocumentProcessor::editorDocumentTimerRestarted()

View File

@@ -39,7 +39,7 @@ VersionSelector::VersionSelector(const QString &fileName, const QString &message
{
ui->setupUi(this);
ui->headerLabel->setText(ui->headerLabel->text().arg(fileName));
ui->loadedText->setHtml(tr("<html><head/><body><p><b>NOTE: You will not be able to check in "
ui->loadedText->setHtml(tr("<html><head/><body><p><b>Note: You will not be able to check in "
"this file without merging the changes (not supported by the "
"plugin)</b></p></body></html>"));
m_stream = new QTextStream(message.toLocal8Bit(), QIODevice::ReadOnly | QIODevice::Text);

View File

@@ -17,7 +17,7 @@
<item>
<widget class="QLabel" name="headerLabel">
<property name="text">
<string>There are multiple versions of '%1' which can be considered for checkout. Please select version to checkout:</string>
<string>Multiple versions of "%1" can be checked out. Select the version to check out:</string>
</property>
<property name="wordWrap">
<bool>true</bool>
@@ -32,7 +32,7 @@
<item row="0" column="0">
<widget class="QRadioButton" name="loadedRadioButton">
<property name="text">
<string>&amp;Loaded Version</string>
<string>&amp;Loaded version</string>
</property>
<property name="checked">
<bool>true</bool>

View File

@@ -132,7 +132,7 @@ bool CorePlugin::initialize(const QStringList &arguments, QString *errorMessage)
const QJsonObject metaData = plugin->metaData();
const QJsonValue mimetypes = metaData.value("Mimetypes");
QString mimetypeString;
if (ExtensionSystem::PluginSpec::readMultiLineString(mimetypes, &mimetypeString))
if (Utils::readMultiLineString(mimetypes, &mimetypeString))
Utils::addMimeTypes(plugin->name() + ".mimetypes", mimetypeString.trimmed().toUtf8());
}

View File

@@ -79,12 +79,7 @@ public:
};
SearchResultWidget::SearchResultWidget(QWidget *parent) :
QWidget(parent),
m_count(0),
m_preserveCaseSupported(true),
m_isShowingReplaceUI(false),
m_searchAgainSupported(false),
m_replaceSupported(false)
QWidget(parent)
{
QVBoxLayout *layout = new QVBoxLayout(this);
layout->setMargin(0);
@@ -295,8 +290,6 @@ void SearchResultWidget::addResults(const QList<SearchResultItem> &items, Search
}
}
int SearchResultWidget::count() const
{
return m_count;
@@ -309,7 +302,6 @@ void SearchResultWidget::setSupportsReplace(bool replaceSupported, const QString
m_dontAskAgainGroup = group;
}
void SearchResultWidget::setTextToReplace(const QString &textToReplace)
{
m_replaceTextEdit->setText(textToReplace);

View File

@@ -119,28 +119,28 @@ private:
QList<SearchResultItem> checkedItems() const;
void updateMatchesFoundLabel();
SearchResultTreeView *m_searchResultTreeView;
int m_count;
SearchResultTreeView *m_searchResultTreeView = nullptr;
int m_count = 0;
QString m_dontAskAgainGroup;
QFrame *m_messageWidget;
QFrame *m_messageWidget = nullptr;
InfoBar m_infoBar;
InfoBarDisplay m_infoBarDisplay;
QWidget *m_topReplaceWidget;
QLabel *m_replaceLabel;
QLineEdit *m_replaceTextEdit;
QToolButton *m_replaceButton;
QToolButton *m_searchAgainButton;
QCheckBox *m_preserveCaseCheck;
QWidget *m_topReplaceWidget = nullptr;
QLabel *m_replaceLabel = nullptr;
QLineEdit *m_replaceTextEdit = nullptr;
QToolButton *m_replaceButton = nullptr;
QToolButton *m_searchAgainButton = nullptr;
QCheckBox *m_preserveCaseCheck = nullptr;
QCheckBox *m_renameFilesCheckBox = nullptr;
QWidget *m_descriptionContainer;
QLabel *m_label;
QLabel *m_searchTerm;
QToolButton *m_cancelButton;
QLabel *m_matchesFoundLabel;
bool m_preserveCaseSupported;
bool m_isShowingReplaceUI;
bool m_searchAgainSupported;
bool m_replaceSupported;
QWidget *m_descriptionContainer = nullptr;
QLabel *m_label = nullptr;
QLabel *m_searchTerm = nullptr;
QToolButton *m_cancelButton = nullptr;
QLabel *m_matchesFoundLabel = nullptr;
bool m_preserveCaseSupported = true;
bool m_isShowingReplaceUI = false;
bool m_searchAgainSupported = false;
bool m_replaceSupported = false;
};
} // Internal

View File

@@ -33,14 +33,13 @@
#include <coreplugin/modemanager.h>
#include <coreplugin/actionmanager/actionmanager.h>
#include <coreplugin/fileiconprovider.h>
#include <coreplugin/find/searchresulttreeitemdelegate.h>
#include <coreplugin/find/searchresulttreeitemroles.h>
#include <coreplugin/icontext.h>
#include <coreplugin/mainwindow.h>
#include <utils/algorithm.h>
#include <utils/appmainwindow.h>
#include <utils/asconst.h>
#include <utils/fancylineedit.h>
#include <utils/highlightingitemdelegate.h>
#include <utils/hostosinfo.h>
#include <utils/itemviews.h>
#include <utils/progressindicator.h>
@@ -67,6 +66,10 @@
Q_DECLARE_METATYPE(Core::LocatorFilterEntry)
using namespace Utils;
const int LocatorEntryRole = int(HighlightingItemRole::User);
namespace Core {
namespace Internal {
@@ -99,7 +102,7 @@ private:
QColor mBackgroundColor;
};
class CompletionDelegate : public SearchResultTreeItemDelegate
class CompletionDelegate : public HighlightingItemDelegate
{
public:
CompletionDelegate(QObject *parent);
@@ -193,7 +196,6 @@ QVariant LocatorModel::data(const QModelIndex &index, int role) const
+ QLatin1String("\n\n") + mEntries.at(index.row()).extraInfo);
break;
case Qt::DecorationRole:
case ItemDataRoles::ResultIconRole:
if (index.column() == DisplayNameColumn) {
LocatorFilterEntry &entry = mEntries[index.row()];
if (!entry.displayIcon && !entry.fileName.isEmpty())
@@ -205,21 +207,21 @@ QVariant LocatorModel::data(const QModelIndex &index, int role) const
if (index.column() == ExtraInfoColumn)
return QColor(Qt::darkGray);
break;
case ItemDataRoles::ResultItemRole:
case LocatorEntryRole:
return qVariantFromValue(mEntries.at(index.row()));
case ItemDataRoles::ResultBeginColumnNumberRole:
case ItemDataRoles::SearchTermLengthRole: {
case int(HighlightingItemRole::StartColumn):
case int(HighlightingItemRole::Length): {
LocatorFilterEntry &entry = mEntries[index.row()];
const int highlightColumn = entry.highlightInfo.dataType == LocatorFilterEntry::HighlightInfo::DisplayName
? DisplayNameColumn
: ExtraInfoColumn;
if (highlightColumn == index.column()) {
const bool startIndexRole = role == ItemDataRoles::ResultBeginColumnNumberRole;
const bool startIndexRole = role == int(HighlightingItemRole::StartColumn);
return startIndexRole ? entry.highlightInfo.startIndex : entry.highlightInfo.length;
}
break;
}
case ItemDataRoles::ResultHighlightBackgroundColor:
case int(HighlightingItemRole::Background):
return mBackgroundColor;
}
@@ -843,7 +845,7 @@ void LocatorWidget::acceptEntry(int row)
const QModelIndex index = m_locatorModel->index(row, 0);
if (!index.isValid())
return;
const LocatorFilterEntry entry = m_locatorModel->data(index, ItemDataRoles::ResultItemRole).value<LocatorFilterEntry>();
const LocatorFilterEntry entry = m_locatorModel->data(index, LocatorEntryRole).value<LocatorFilterEntry>();
Q_ASSERT(entry.filter != nullptr);
QString newText;
int selectionStart = -1;
@@ -926,13 +928,13 @@ LocatorPopup *createLocatorPopup(Locator *locator, QWidget *parent)
}
CompletionDelegate::CompletionDelegate(QObject *parent)
: SearchResultTreeItemDelegate(0, parent)
: HighlightingItemDelegate(0, parent)
{
}
QSize CompletionDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const
{
return SearchResultTreeItemDelegate::sizeHint(option, index) + QSize(0, 2);
return HighlightingItemDelegate::sizeHint(option, index) + QSize(0, 2);
}
} // namespace Internal

View File

@@ -312,6 +312,15 @@ void NavigationWidget::resizeEvent(QResizeEvent *re)
MiniSplitter::resizeEvent(re);
}
static QIcon closeIconForSide(Side side, int itemCount)
{
if (itemCount > 1)
return Utils::Icons::CLOSE_SPLIT_TOP.icon();
return side == Side::Left
? Utils::Icons::CLOSE_SPLIT_LEFT.icon()
: Utils::Icons::CLOSE_SPLIT_RIGHT.icon();
}
Internal::NavigationSubWidget *NavigationWidget::insertSubItem(int position, int factoryIndex)
{
for (int pos = position + 1; pos < d->m_subWidgets.size(); ++pos) {
@@ -331,9 +340,7 @@ Internal::NavigationSubWidget *NavigationWidget::insertSubItem(int position, int
insertWidget(position, nsw);
d->m_subWidgets.insert(position, nsw);
d->m_subWidgets.at(0)->setCloseIcon(d->m_subWidgets.size() == 1
? Utils::Icons::CLOSE_SPLIT_LEFT.icon()
: Utils::Icons::CLOSE_SPLIT_TOP.icon());
d->m_subWidgets.at(0)->setCloseIcon(closeIconForSide(d->m_side, d->m_subWidgets.size()));
NavigationWidgetPrivate::updateActivationsMap(nsw->factory()->id(), {d->m_side, position});
return nsw;
}
@@ -386,10 +393,8 @@ void NavigationWidget::closeSubWidget()
subWidget->hide();
subWidget->deleteLater();
// update close button of top item
if (d->m_subWidgets.size() == 1)
d->m_subWidgets.at(0)->setCloseIcon(d->m_subWidgets.size() == 1
? Utils::Icons::CLOSE_SPLIT_LEFT.icon()
: Utils::Icons::CLOSE_SPLIT_TOP.icon());
if (!d->m_subWidgets.isEmpty())
d->m_subWidgets.at(0)->setCloseIcon(closeIconForSide(d->m_side, d->m_subWidgets.size()));
} else {
setShown(false);
}

View File

@@ -25,6 +25,7 @@
#include "cppfindreferences.h"
#include "cppfilesettingspage.h"
#include "cpptoolsconstants.h"
#include "cppmodelmanager.h"
#include "cppworkingcopy.h"
@@ -384,6 +385,11 @@ void CppFindReferences::findAll_helper(SearchResult *search, Symbol *symbol,
connect(progress, &FutureProgress::clicked, search, &SearchResult::popup);
}
static bool isAllLowerCase(const QString &text)
{
return text.toLower() == text;
}
void CppFindReferences::onReplaceButtonClicked(const QString &text,
const QList<SearchResultItem> &items,
bool preserveCase)
@@ -405,21 +411,40 @@ void CppFindReferences::onReplaceButtonClicked(const QString &text,
if (!renameFilesCheckBox || !renameFilesCheckBox->isChecked())
return;
CppFileSettings settings;
settings.fromSettings(Core::ICore::settings());
const QStringList newPaths =
Utils::transform<QList>(parameters.filesToRename,
[&parameters, text](const Node *node) -> QString {
[&parameters, text, &settings](const Node *node) -> QString {
const QFileInfo fi = node->filePath().toFileInfo();
const QString fileName = fi.fileName();
QString newName = fileName;
newName.replace(parameters.prettySymbolName, text, Qt::CaseInsensitive);
const QString oldSymbolName = parameters.prettySymbolName;
const QString oldBaseName = fi.baseName();
const QString newSymbolName = text;
QString newBaseName = newSymbolName;
if (newName != fileName) {
newName = Utils::matchCaseReplacement(fileName, newName);
// 1) new symbol lowercase: new base name lowercase
if (isAllLowerCase(newSymbolName)) {
newBaseName = newSymbolName;
return fi.absolutePath() + "/" + newName;
// 2) old base name mixed case: new base name is verbatim symbol name
} else if (!isAllLowerCase(oldBaseName)) {
newBaseName = newSymbolName;
// 3) old base name lowercase, old symbol mixed case: new base name lowercase
} else if (!isAllLowerCase(oldSymbolName)) {
newBaseName = newSymbolName.toLower();
// 4) old base name lowercase, old symbol lowercase, new symbol mixed case:
// use the preferences setting for new base name case
} else if (settings.lowerCaseFiles) {
newBaseName = newSymbolName.toLower();
}
if (newBaseName == oldBaseName)
return QString();
return fi.absolutePath() + "/" + newBaseName + '.' + fi.completeSuffix();
});
for (int i = 0; i < parameters.filesToRename.size(); ++i) {

View File

@@ -2030,7 +2030,11 @@ void DebuggerEngine::checkState(DebuggerState state, const char *file, int line)
bool DebuggerEngine::isNativeMixedEnabled() const
{
return runParameters().nativeMixedEnabled && (runParameters().languages & QmlLanguage);
if (DebuggerRunTool *rt = runTool()) {
const DebuggerRunParameters &runParams = rt->runParameters();
return runParams.nativeMixedEnabled && (runParams.languages & QmlLanguage);
}
return false;
}
bool DebuggerEngine::isNativeMixedActive() const

View File

@@ -4034,7 +4034,10 @@ void GdbEngine::reloadDebuggingHelpers()
void GdbEngine::handleGdbError(QProcess::ProcessError error)
{
QString program = runParameters().debugger.executable;
QString program;
// avoid accessing invalid memory if the process crashed
if (runTool())
program = runParameters().debugger.executable;
QString msg = RunWorker::userMessageForProcessError(error, program);
QString errorString = m_gdbProc.errorString();
if (!errorString.isEmpty())

View File

@@ -1065,7 +1065,7 @@ bool GitClient::synchronousReset(const QString &workingDirectory,
if (files.isEmpty()) {
msgCannotRun(arguments, workingDirectory, resp.stdErr(), errorMessage);
} else {
msgCannotRun(tr("Cannot reset %n file(s) in \"%1\": %2", 0, files.size())
msgCannotRun(tr("Cannot reset %n files in \"%1\": %2", 0, files.size())
.arg(QDir::toNativeSeparators(workingDirectory), resp.stdErr()),
errorMessage);
}
@@ -2468,9 +2468,9 @@ bool GitClient::getCommitData(const QString &workingDirectory,
static inline QString msgCommitted(const QString &amendSHA1, int fileCount)
{
if (amendSHA1.isEmpty())
return GitClient::tr("Committed %n file(s).", 0, fileCount) + '\n';
return GitClient::tr("Committed %n files.", 0, fileCount) + '\n';
if (fileCount)
return GitClient::tr("Amended \"%1\" (%n file(s)).", 0, fileCount).arg(amendSHA1) + '\n';
return GitClient::tr("Amended \"%1\" (%n files).", 0, fileCount).arg(amendSHA1) + '\n';
return GitClient::tr("Amended \"%1\".").arg(amendSHA1);
}
@@ -2561,7 +2561,7 @@ bool GitClient::addAndCommit(const QString &repositoryDirectory,
VcsOutputWindow::appendError(stdErr);
return true;
} else {
VcsOutputWindow::appendError(tr("Cannot commit %n file(s): %1\n", 0, commitCount).arg(stdErr));
VcsOutputWindow::appendError(tr("Cannot commit %n files: %1\n", 0, commitCount).arg(stdErr));
return false;
}
}

View File

@@ -716,9 +716,11 @@ void GitPlugin::blameFile()
cursor.setPosition(selectionStart);
const int startBlock = cursor.blockNumber();
cursor.setPosition(selectionEnd);
const int endBlock = cursor.blockNumber();
int endBlock = cursor.blockNumber();
if (startBlock != endBlock) {
firstLine = startBlock + 1;
if (cursor.atBlockStart())
--endBlock;
if (auto widget = qobject_cast<VcsBaseEditorWidget *>(textEditor->widget())) {
const int previousFirstLine = widget->firstLineNumber();
if (previousFirstLine > 0)

View File

@@ -145,10 +145,6 @@ void HelpIndexFilter::accept(LocatorFilterEntry selection,
Q_UNUSED(selectionLength)
const QString &key = selection.displayName;
const QMap<QString, QUrl> &links = HelpManager::linksForKeyword(key);
if (links.size() == 1)
emit linkActivated(links.begin().value());
else
emit linksActivated(links, key);
}

View File

@@ -52,7 +52,6 @@ public:
Q_INVOKABLE QSet<QString> searchMatches(const QString &databaseFilePath,
const QString &term, int limit);
signals:
void linkActivated(const QUrl &link) const;
void linksActivated(const QMap<QString, QUrl> &links, const QString &key) const;
private:

View File

@@ -236,10 +236,8 @@ bool HelpPlugin::initialize(const QStringList &arguments, QString *error)
auto helpIndexFilter = new HelpIndexFilter();
addAutoReleasedObject(helpIndexFilter);
connect(helpIndexFilter, &HelpIndexFilter::linkActivated,
this, &HelpPlugin::showLinkInHelpMode);
connect(helpIndexFilter, &HelpIndexFilter::linksActivated,
this, &HelpPlugin::showLinksInHelpMode);
this, &HelpPlugin::showLinksInCurrentViewer);
RemoteHelpFilter *remoteHelpFilter = new RemoteHelpFilter();
addAutoReleasedObject(remoteHelpFilter);
@@ -430,11 +428,12 @@ void HelpPlugin::showLinkInHelpMode(const QUrl &source)
showInHelpViewer(source, helpModeHelpViewer());
}
void HelpPlugin::showLinksInHelpMode(const QMap<QString, QUrl> &links, const QString &key)
void HelpPlugin::showLinksInCurrentViewer(const QMap<QString, QUrl> &links, const QString &key)
{
activateHelpMode();
ICore::raiseWindow(m_mode->widget());
m_centralWidget->showTopicChooser(links, key);
if (links.size() < 1)
return;
HelpWidget *widget = helpWidgetForWindow(QApplication::activeWindow());
widget->showLinks(links, key);
}
void HelpPlugin::slotHideRightPane()
@@ -499,6 +498,14 @@ HelpViewer *HelpPlugin::helpModeHelpViewer()
return viewer;
}
HelpWidget *HelpPlugin::helpWidgetForWindow(QWidget *window)
{
if (m_externalWindow && m_externalWindow->window() == window->window())
return m_externalWindow;
activateHelpMode();
return m_centralWidget;
}
HelpViewer *HelpPlugin::viewerForHelpViewerLocation(HelpManager::HelpViewerLocation location)
{
HelpManager::HelpViewerLocation actualLocation = location;

View File

@@ -89,7 +89,7 @@ private:
void saveExternalWindowSettings();
void showLinkInHelpMode(const QUrl &source);
void showLinksInHelpMode(const QMap<QString, QUrl> &links, const QString &key);
void showLinksInCurrentViewer(const QMap<QString, QUrl> &links, const QString &key);
void slotHideRightPane();
void updateSideBarSource(const QUrl &newUrl);
@@ -109,6 +109,7 @@ private:
void createRightPaneContextViewer();
HelpViewer *externalHelpViewer();
HelpViewer *helpModeHelpViewer();
HelpWidget *helpWidgetForWindow(QWidget *window);
void doSetupIfNeeded();

View File

@@ -354,10 +354,8 @@ void HelpWidget::addSideBar()
auto indexItem = new Core::SideBarItem(indexWindow, Constants::HELP_INDEX);
indexWindow->setOpenInNewPageActionVisible(supportsNewPages);
indexWindow->setWindowTitle(HelpPlugin::tr(Constants::SB_INDEX));
connect(indexWindow, &IndexWindow::linkActivated,
this, &HelpWidget::open);
connect(indexWindow, &IndexWindow::linksActivated,
this, &HelpWidget::showTopicChooser);
this, &HelpWidget::showLinks);
m_indexAction = new QAction(HelpPlugin::tr(Constants::SB_INDEX), this);
cmd = Core::ActionManager::registerAction(m_indexAction, Constants::HELP_INDEX, m_context->context());
cmd->setDefaultKeySequence(QKeySequence(Core::UseMacShortcuts ? tr("Meta+I")
@@ -535,13 +533,19 @@ void HelpWidget::open(const QUrl &url, bool newPage)
setSource(url);
}
void HelpWidget::showTopicChooser(const QMap<QString, QUrl> &links,
void HelpWidget::showLinks(const QMap<QString, QUrl> &links,
const QString &keyword, bool newPage)
{
if (links.size() < 1)
return;
if (links.size() == 1) {
open(links.first(), newPage);
} else {
TopicChooser tc(this, keyword, links);
if (tc.exec() == QDialog::Accepted)
open(tc.link(), newPage);
}
}
void HelpWidget::activateSideBarItem(const QString &id)
{

View File

@@ -74,7 +74,7 @@ public:
void open(const QUrl &url, bool newPage = false);
void openFromSearch(const QUrl &url, const QStringList &searchTerms, bool newPage = false);
void showTopicChooser(const QMap<QString, QUrl> &links, const QString &key,
void showLinks(const QMap<QString, QUrl> &links, const QString &key,
bool newPage = false);
void activateSideBarItem(const QString &id);

View File

@@ -289,7 +289,10 @@ void IosConfigurations::updateAutomaticKitList()
continue;
}
Core::Id pDeviceType = deviceId(sdk.directoryName);
QTC_ASSERT(pDeviceType.isValid(), continue);
if (!pDeviceType.isValid()) {
qCDebug(kitSetupLog) << "Unsupported/Invalid device type" << sdk.directoryName;
continue;
}
for (BaseQtVersion *qtVersion : qtVersions) {
qCDebug(kitSetupLog) << " - Qt version:" << qtVersion->displayName();

View File

@@ -218,6 +218,8 @@ void IosSettingsWidget::onRename()
const SimulatorInfo &simInfo = simulatorInfoList.at(0);
const QString newName = QInputDialog::getText(this, tr("Rename %1").arg(simInfo.name),
tr("Enter new name:"));
if (newName.isEmpty())
return;
QPointer<SimulatorOperationDialog> statusDialog = new SimulatorOperationDialog(this);
statusDialog->setAttribute(Qt::WA_DeleteOnClose);

View File

@@ -396,7 +396,7 @@ void IosToolHandlerPrivate::toolExited(int code)
void IosDeviceToolHandlerPrivate::subprocessError(QProcess::ProcessError error)
{
if (state != Stopped)
errorMsg(IosToolHandler::tr("iOS tool Error %1").arg(error));
errorMsg(IosToolHandler::tr("iOS tool error %1").arg(error));
stop(-1);
if (error == QProcess::FailedToStart) {
qCDebug(toolHandlerLog) << "IosToolHandler::finished(" << this << ")";
@@ -837,7 +837,7 @@ void IosSimulatorToolHandlerPrivate::requestTransferApp(const QString &appBundle
if (response.success) {
installAppOnSimulator();
} else {
errorMsg(IosToolHandler::tr("Application install on Simulator failed. Simulator not running."));
errorMsg(IosToolHandler::tr("Application install on simulator failed. Simulator not running."));
didTransferApp(m_bundlePath, m_deviceId, IosToolHandler::Failure);
emit q->finished(q);
}
@@ -862,7 +862,7 @@ void IosSimulatorToolHandlerPrivate::requestRunApp(const QString &appBundlePath,
Utils::FileName appBundle = Utils::FileName::fromString(m_bundlePath);
if (!appBundle.exists()) {
errorMsg(IosToolHandler::tr("Application launch on Simulator failed. Invalid Bundle path %1")
errorMsg(IosToolHandler::tr("Application launch on simulator failed. Invalid bundle path %1")
.arg(m_bundlePath));
didStartApp(m_bundlePath, m_deviceId, Ios::IosToolHandler::Failure);
return;
@@ -874,7 +874,7 @@ void IosSimulatorToolHandlerPrivate::requestRunApp(const QString &appBundlePath,
if (response.success) {
launchAppOnSimulator(extraArgs);
} else {
errorMsg(IosToolHandler::tr("Application launch on Simulator failed. Simulator not running."));
errorMsg(IosToolHandler::tr("Application launch on simulator failed. Simulator not running."));
didStartApp(m_bundlePath, m_deviceId, Ios::IosToolHandler::Failure);
}
};
@@ -926,7 +926,7 @@ void IosSimulatorToolHandlerPrivate::installAppOnSimulator()
isTransferringApp(m_bundlePath, m_deviceId, 100, 100, "");
didTransferApp(m_bundlePath, m_deviceId, IosToolHandler::Success);
} else {
errorMsg(IosToolHandler::tr("Application install on Simulator failed. %1")
errorMsg(IosToolHandler::tr("Application install on simulator failed. %1")
.arg(QString::fromLocal8Bit(response.commandOutput)));
didTransferApp(m_bundlePath, m_deviceId, IosToolHandler::Failure);
}
@@ -990,7 +990,7 @@ void IosSimulatorToolHandlerPrivate::launchAppOnSimulator(const QStringList &ext
stderrFile);
} else {
m_pid = -1;
errorMsg(IosToolHandler::tr("Application launch on Simulator failed. %1")
errorMsg(IosToolHandler::tr("Application launch on simulator failed. %1")
.arg(QString::fromLocal8Bit(response.commandOutput)));
didStartApp(m_bundlePath, m_deviceId, Ios::IosToolHandler::Failure);
stop(-1);

View File

@@ -82,7 +82,7 @@ bool FieldPageFactory::validateData(Core::Id typeId, const QVariant &data, QStri
QList<QVariant> list = JsonWizardFactory::objectOrList(data, errorMessage);
if (list.isEmpty()) {
*errorMessage = QCoreApplication::translate("ProjectExplorer::JsonWizard",
"When parsing fields of page '%1': %2")
"When parsing fields of page \"%1\": %2")
.arg(typeId.toString()).arg(*errorMessage);
return false;
}

View File

@@ -29,6 +29,7 @@
#include "projectexplorerconstants.h"
#include <utils/algorithm.h>
#include <utils/qtcfallthrough.h>
#include <utils/synchronousprocess.h>
#include <utils/winutils.h>
#include <utils/qtcassert.h>
@@ -102,7 +103,7 @@ static bool hostSupportsPlatform(MsvcToolChain::Platform platform)
if (platform == MsvcToolChain::amd64 || platform == MsvcToolChain::amd64_arm
|| platform == MsvcToolChain::amd64_x86)
return true;
// fall through (all x86 toolchains are also working on an amd64 host)
Q_FALLTHROUGH(); // all x86 toolchains are also working on an amd64 host
case Utils::HostOsInfo::HostArchitectureX86:
return platform == MsvcToolChain::x86 || platform == MsvcToolChain::x86_amd64
|| platform == MsvcToolChain::x86_ia64 || platform == MsvcToolChain::x86_arm;

View File

@@ -1488,7 +1488,7 @@ bool ProjectExplorerPlugin::initialize(const QStringList &arguments, QString *er
});
expander->registerFileVariables("CurrentRun:Executable",
tr("The currently active run configuration's executable (if applicable)"),
tr("The currently active run configuration's executable (if applicable)."),
[this]() -> QString {
if (Target *target = activeTarget()) {
if (RunConfiguration *rc = target->activeRunConfiguration()) {
@@ -1847,7 +1847,7 @@ ProjectExplorerPlugin::OpenProjectResult ProjectExplorerPlugin::openProjects(con
if (ProjectManager::canOpenProjectForMimeType(mt)) {
if (!QFileInfo(filePath).isFile()) {
appendError(errorString,
tr("Failed opening project \"%1\": Project is not a file").arg(fileName));
tr("Failed opening project \"%1\": Project is not a file.").arg(fileName));
} else if (Project *pro = ProjectManager::openProject(mt, Utils::FileName::fromString(filePath))) {
QObject::connect(pro, &Project::parsingFinished, [pro]() {
emit SessionManager::instance()->projectFinishedParsing(pro);

View File

@@ -936,7 +936,7 @@ void RunControlPrivate::onWorkerStarted(RunWorker *worker)
continueStart();
return;
}
showError(tr("Unexpected run control state %1 when worker %2 started")
showError(tr("Unexpected run control state %1 when worker %2 started.")
.arg(stateName(state))
.arg(worker->d->id));
}
@@ -1467,11 +1467,11 @@ bool RunWorkerPrivate::canStart() const
void RunWorkerPrivate::timerEvent(QTimerEvent *ev)
{
if (ev->timerId() == startWatchdogTimerId) {
q->reportFailure(tr("Worker start timed out"));
q->reportFailure(tr("Worker start timed out."));
return;
}
if (ev->timerId() == stopWatchdogTimerId) {
q->reportFailure(tr("Worker stop timed out"));
q->reportFailure(tr("Worker stop timed out."));
return;
}
}
@@ -1610,7 +1610,7 @@ QString RunWorker::userMessageForProcessError(QProcess::ProcessError error, cons
"permissions to invoke the program.").arg(program);
break;
case QProcess::Crashed:
msg = tr("The process was ended forcefully");
msg = tr("The process was ended forcefully.");
break;
case QProcess::Timedout:
// "The last waitFor...() function timed out. "

View File

@@ -59,18 +59,19 @@ static Core::Id categoryForType(Task::TaskType type)
class TaskMark : public TextEditor::TextMark
{
public:
TaskMark(unsigned int id, const QString &fileName, int lineNumber,
Task::TaskType type, bool visible) :
TextMark(fileName, lineNumber, categoryForType(type)),
m_id(id)
TaskMark(const Task &task) :
TextMark(task.file.toString(), task.line, categoryForType(task.type)),
m_id(task.taskId)
{
setColor(type == Task::Error ? Utils::Theme::ProjectExplorer_TaskError_TextMarkColor
setColor(task.type == Task::Error ? Utils::Theme::ProjectExplorer_TaskError_TextMarkColor
: Utils::Theme::ProjectExplorer_TaskWarn_TextMarkColor);
setDefaultToolTip(type == Task::Error ? QApplication::translate("TaskHub", "Error")
setDefaultToolTip(task.type == Task::Error ? QApplication::translate("TaskHub", "Error")
: QApplication::translate("TaskHub", "Warning"));
setPriority(type == Task::Error ? TextEditor::TextMark::NormalPriority
setPriority(task.type == Task::Error ? TextEditor::TextMark::NormalPriority
: TextEditor::TextMark::LowPriority);
setVisible(visible);
setToolTip(task.description);
setIcon(task.icon);
setVisible(!task.icon.isNull());
}
bool isClickable() const;
@@ -151,12 +152,8 @@ void TaskHub::addTask(Task task)
task.line = -1;
task.movedLine = task.line;
if (task.line != -1) {
auto mark = new TaskMark(task.taskId, task.file.toString(), task.line, task.type, !task.icon.isNull());
mark->setToolTip(task.description);
mark->setIcon(task.icon);
task.setMark(mark);
}
if (task.line != -1)
task.setMark(new TaskMark(task));
emit m_instance->taskAdded(task);
}

View File

@@ -210,7 +210,7 @@ void QbsBuildStep::cancel()
QVariantMap QbsBuildStep::qbsConfiguration(VariableHandling variableHandling) const
{
QVariantMap config = m_qbsConfiguration;
config.insert(QLatin1String(Constants::QBS_FORCE_PROBES_KEY), m_forceProbes);
config.insert(Constants::QBS_FORCE_PROBES_KEY, m_forceProbes);
if (variableHandling == ExpandVariables) {
const Utils::MacroExpander *expander = Utils::globalMacroExpander();
for (auto it = config.begin(), end = config.end(); it != end; ++it) {
@@ -227,9 +227,9 @@ void QbsBuildStep::setQbsConfiguration(const QVariantMap &config)
QbsProject *pro = static_cast<QbsProject *>(project());
QVariantMap tmp = config;
tmp.insert(QLatin1String(Constants::QBS_CONFIG_PROFILE_KEY), pro->profileForTarget(target()));
if (!tmp.contains(QLatin1String(Constants::QBS_CONFIG_VARIANT_KEY)))
tmp.insert(QLatin1String(Constants::QBS_CONFIG_VARIANT_KEY),
tmp.insert(Constants::QBS_CONFIG_PROFILE_KEY, pro->profileForTarget(target()));
if (!tmp.contains(Constants::QBS_CONFIG_VARIANT_KEY))
tmp.insert(Constants::QBS_CONFIG_VARIANT_KEY,
QString::fromLatin1(Constants::QBS_VARIANT_DEBUG));
if (tmp == m_qbsConfiguration)
@@ -263,13 +263,13 @@ bool QbsBuildStep::cleanInstallRoot() const
bool QbsBuildStep::hasCustomInstallRoot() const
{
return m_qbsConfiguration.contains(QLatin1String(Constants::QBS_INSTALL_ROOT_KEY));
return m_qbsConfiguration.contains(Constants::QBS_INSTALL_ROOT_KEY);
}
Utils::FileName QbsBuildStep::installRoot() const
{
Utils::FileName root = Utils::FileName::fromString(m_qbsConfiguration
.value(QLatin1String(Constants::QBS_INSTALL_ROOT_KEY)).toString());
.value(Constants::QBS_INSTALL_ROOT_KEY).toString());
if (root.isNull()) {
const QbsBuildConfiguration * const bc
= static_cast<QbsBuildConfiguration *>(buildConfiguration());
@@ -293,15 +293,15 @@ bool QbsBuildStep::fromMap(const QVariantMap &map)
if (!ProjectExplorer::BuildStep::fromMap(map))
return false;
setQbsConfiguration(map.value(QLatin1String(QBS_CONFIG)).toMap());
m_qbsBuildOptions.setDryRun(map.value(QLatin1String(QBS_DRY_RUN)).toBool());
m_qbsBuildOptions.setKeepGoing(map.value(QLatin1String(QBS_KEEP_GOING)).toBool());
m_qbsBuildOptions.setMaxJobCount(map.value(QLatin1String(QBS_MAXJOBCOUNT)).toInt());
const bool showCommandLines = map.value(QLatin1String(QBS_SHOWCOMMANDLINES)).toBool();
setQbsConfiguration(map.value(QBS_CONFIG).toMap());
m_qbsBuildOptions.setDryRun(map.value(QBS_DRY_RUN).toBool());
m_qbsBuildOptions.setKeepGoing(map.value(QBS_KEEP_GOING).toBool());
m_qbsBuildOptions.setMaxJobCount(map.value(QBS_MAXJOBCOUNT).toInt());
const bool showCommandLines = map.value(QBS_SHOWCOMMANDLINES).toBool();
m_qbsBuildOptions.setEchoMode(showCommandLines ? qbs::CommandEchoModeCommandLine
: qbs::CommandEchoModeSummary);
m_qbsBuildOptions.setInstall(map.value(QLatin1String(QBS_INSTALL), true).toBool());
m_qbsBuildOptions.setRemoveExistingInstallation(map.value(QLatin1String(QBS_CLEAN_INSTALL_ROOT))
m_qbsBuildOptions.setInstall(map.value(QBS_INSTALL, true).toBool());
m_qbsBuildOptions.setRemoveExistingInstallation(map.value(QBS_CLEAN_INSTALL_ROOT)
.toBool());
m_forceProbes = map.value(forceProbesKey()).toBool();
return true;
@@ -310,14 +310,14 @@ bool QbsBuildStep::fromMap(const QVariantMap &map)
QVariantMap QbsBuildStep::toMap() const
{
QVariantMap map = ProjectExplorer::BuildStep::toMap();
map.insert(QLatin1String(QBS_CONFIG), m_qbsConfiguration);
map.insert(QLatin1String(QBS_DRY_RUN), m_qbsBuildOptions.dryRun());
map.insert(QLatin1String(QBS_KEEP_GOING), m_qbsBuildOptions.keepGoing());
map.insert(QLatin1String(QBS_MAXJOBCOUNT), m_qbsBuildOptions.maxJobCount());
map.insert(QLatin1String(QBS_SHOWCOMMANDLINES),
map.insert(QBS_CONFIG, m_qbsConfiguration);
map.insert(QBS_DRY_RUN, m_qbsBuildOptions.dryRun());
map.insert(QBS_KEEP_GOING, m_qbsBuildOptions.keepGoing());
map.insert(QBS_MAXJOBCOUNT, m_qbsBuildOptions.maxJobCount());
map.insert(QBS_SHOWCOMMANDLINES,
m_qbsBuildOptions.echoMode() == qbs::CommandEchoModeCommandLine);
map.insert(QLatin1String(QBS_INSTALL), m_qbsBuildOptions.install());
map.insert(QLatin1String(QBS_CLEAN_INSTALL_ROOT),
map.insert(QBS_INSTALL, m_qbsBuildOptions.install());
map.insert(QBS_CLEAN_INSTALL_ROOT,
m_qbsBuildOptions.removeExistingInstallation());
map.insert(forceProbesKey(), m_forceProbes);
return map;
@@ -389,7 +389,7 @@ void QbsBuildStep::handleProcessResultReport(const qbs::ProcessResult &result)
m_parser->setWorkingDirectory(result.workingDirectory());
QString commandline = result.executableFilePath() + QLatin1Char(' ')
QString commandline = result.executableFilePath() + ' '
+ Utils::QtcProcess::joinArgs(result.arguments());
addOutput(commandline, OutputFormat::Stdout);
@@ -422,15 +422,15 @@ QString QbsBuildStep::buildVariant() const
bool QbsBuildStep::isQmlDebuggingEnabled() const
{
QVariantMap data = qbsConfiguration(PreserveVariables);
return data.value(QLatin1String(Constants::QBS_CONFIG_DECLARATIVE_DEBUG_KEY), false).toBool()
|| data.value(QLatin1String(Constants::QBS_CONFIG_QUICK_DEBUG_KEY), false).toBool();
return data.value(Constants::QBS_CONFIG_DECLARATIVE_DEBUG_KEY, false).toBool()
|| data.value(Constants::QBS_CONFIG_QUICK_DEBUG_KEY, false).toBool();
}
void QbsBuildStep::setBuildVariant(const QString &variant)
{
if (m_qbsConfiguration.value(QLatin1String(Constants::QBS_CONFIG_VARIANT_KEY)).toString() == variant)
if (m_qbsConfiguration.value(Constants::QBS_CONFIG_VARIANT_KEY).toString() == variant)
return;
m_qbsConfiguration.insert(QLatin1String(Constants::QBS_CONFIG_VARIANT_KEY), variant);
m_qbsConfiguration.insert(Constants::QBS_CONFIG_VARIANT_KEY, variant);
emit qbsConfigurationChanged();
QbsBuildConfiguration *bc = static_cast<QbsBuildConfiguration *>(buildConfiguration());
if (bc)
@@ -629,18 +629,17 @@ void QbsBuildStepConfigWidget::updateState()
updateQmlDebuggingOption();
const QString buildVariant = m_step->buildVariant();
const int idx = (buildVariant == QLatin1String(Constants::QBS_VARIANT_DEBUG)) ? 0 : 1;
const int idx = (buildVariant == Constants::QBS_VARIANT_DEBUG) ? 0 : 1;
m_ui->buildVariantComboBox->setCurrentIndex(idx);
QString command = static_cast<QbsBuildConfiguration *>(m_step->buildConfiguration())
->equivalentCommandLine(m_step);
for (int i = 0; i < m_propertyCache.count(); ++i) {
command += QLatin1Char(' ') + m_propertyCache.at(i).name
+ QLatin1Char(':') + m_propertyCache.at(i).effectiveValue;
command += ' ' + m_propertyCache.at(i).name + ':' + m_propertyCache.at(i).effectiveValue;
}
if (m_step->isQmlDebuggingEnabled())
command += QLatin1String(" Qt.declarative.qmlDebugging:true Qt.quick.qmlDebugging:true");
command += " Qt.declarative.qmlDebugging:true Qt.quick.qmlDebugging:true";
m_ui->commandLineTextEdit->setPlainText(command);
QString summary = tr("<b>Qbs:</b> %1").arg(command);
@@ -670,16 +669,16 @@ void QbsBuildStepConfigWidget::updatePropertyEdit(const QVariantMap &data)
QVariantMap editable = data;
// remove data that is edited with special UIs:
editable.remove(QLatin1String(Constants::QBS_CONFIG_PROFILE_KEY));
editable.remove(QLatin1String(Constants::QBS_CONFIG_VARIANT_KEY));
editable.remove(QLatin1String(Constants::QBS_CONFIG_DECLARATIVE_DEBUG_KEY));
editable.remove(QLatin1String(Constants::QBS_CONFIG_QUICK_DEBUG_KEY));
editable.remove(QLatin1String(Constants::QBS_FORCE_PROBES_KEY));
editable.remove(QLatin1String(Constants::QBS_INSTALL_ROOT_KEY));
editable.remove(Constants::QBS_CONFIG_PROFILE_KEY);
editable.remove(Constants::QBS_CONFIG_VARIANT_KEY);
editable.remove(Constants::QBS_CONFIG_DECLARATIVE_DEBUG_KEY);
editable.remove(Constants::QBS_CONFIG_QUICK_DEBUG_KEY);
editable.remove(Constants::QBS_FORCE_PROBES_KEY);
editable.remove(Constants::QBS_INSTALL_ROOT_KEY);
QStringList propertyList;
for (QVariantMap::const_iterator i = editable.constBegin(); i != editable.constEnd(); ++i)
propertyList.append(i.key() + QLatin1Char(':') + i.value().toString());
propertyList.append(i.key() + ':' + i.value().toString());
m_ui->propertyEdit->setText(Utils::QtcProcess::joinArgs(propertyList));
}
@@ -688,9 +687,9 @@ void QbsBuildStepConfigWidget::changeBuildVariant(int idx)
{
QString variant;
if (idx == 1)
variant = QLatin1String(Constants::QBS_VARIANT_RELEASE);
variant = Constants::QBS_VARIANT_RELEASE;
else
variant = QLatin1String(Constants::QBS_VARIANT_DEBUG);
variant = Constants::QBS_VARIANT_DEBUG;
m_ignoreChange = true;
m_step->setBuildVariant(variant);
m_ignoreChange = false;
@@ -768,16 +767,16 @@ void QbsBuildStepConfigWidget::applyCachedProperties()
const QVariantMap tmp = m_step->qbsConfiguration(QbsBuildStep::PreserveVariables);
// Insert values set up with special UIs:
data.insert(QLatin1String(Constants::QBS_CONFIG_PROFILE_KEY),
tmp.value(QLatin1String(Constants::QBS_CONFIG_PROFILE_KEY)));
data.insert(QLatin1String(Constants::QBS_CONFIG_VARIANT_KEY),
tmp.value(QLatin1String(Constants::QBS_CONFIG_VARIANT_KEY)));
if (tmp.contains(QLatin1String(Constants::QBS_CONFIG_DECLARATIVE_DEBUG_KEY)))
data.insert(QLatin1String(Constants::QBS_CONFIG_DECLARATIVE_DEBUG_KEY),
tmp.value(QLatin1String(Constants::QBS_CONFIG_DECLARATIVE_DEBUG_KEY)));
if (tmp.contains(QLatin1String(Constants::QBS_CONFIG_QUICK_DEBUG_KEY)))
data.insert(QLatin1String(Constants::QBS_CONFIG_QUICK_DEBUG_KEY),
tmp.value(QLatin1String(Constants::QBS_CONFIG_QUICK_DEBUG_KEY)));
data.insert(Constants::QBS_CONFIG_PROFILE_KEY,
tmp.value(Constants::QBS_CONFIG_PROFILE_KEY));
data.insert(Constants::QBS_CONFIG_VARIANT_KEY,
tmp.value(Constants::QBS_CONFIG_VARIANT_KEY));
if (tmp.contains(Constants::QBS_CONFIG_DECLARATIVE_DEBUG_KEY))
data.insert(Constants::QBS_CONFIG_DECLARATIVE_DEBUG_KEY,
tmp.value(Constants::QBS_CONFIG_DECLARATIVE_DEBUG_KEY));
if (tmp.contains(Constants::QBS_CONFIG_QUICK_DEBUG_KEY))
data.insert(Constants::QBS_CONFIG_QUICK_DEBUG_KEY,
tmp.value(Constants::QBS_CONFIG_QUICK_DEBUG_KEY));
for (int i = 0; i < m_propertyCache.count(); ++i) {
const Property &property = m_propertyCache.at(i);
@@ -793,11 +792,11 @@ void QbsBuildStepConfigWidget::linkQmlDebuggingLibraryChecked(bool checked)
{
QVariantMap data = m_step->qbsConfiguration(QbsBuildStep::PreserveVariables);
if (checked) {
data.insert(QLatin1String(Constants::QBS_CONFIG_DECLARATIVE_DEBUG_KEY), checked);
data.insert(QLatin1String(Constants::QBS_CONFIG_QUICK_DEBUG_KEY), checked);
data.insert(Constants::QBS_CONFIG_DECLARATIVE_DEBUG_KEY, checked);
data.insert(Constants::QBS_CONFIG_QUICK_DEBUG_KEY, checked);
} else {
data.remove(QLatin1String(Constants::QBS_CONFIG_DECLARATIVE_DEBUG_KEY));
data.remove(QLatin1String(Constants::QBS_CONFIG_QUICK_DEBUG_KEY));
data.remove(Constants::QBS_CONFIG_DECLARATIVE_DEBUG_KEY);
data.remove(Constants::QBS_CONFIG_QUICK_DEBUG_KEY);
}
m_ignoreChange = true;
@@ -819,7 +818,7 @@ bool QbsBuildStepConfigWidget::validateProperties(Utils::FancyLineEdit *edit, QS
QList<Property> properties;
const Utils::MacroExpander *expander = Utils::globalMacroExpander();
foreach (const QString &rawArg, argList) {
int pos = rawArg.indexOf(QLatin1Char(':'));
int pos = rawArg.indexOf(':');
if (pos > 0) {
const QString rawValue = rawArg.mid(pos + 1);
Property property(rawArg.left(pos), rawValue, expander->expand(rawValue));

View File

@@ -46,6 +46,7 @@
#include <cpptools/cppprojectupdater.h>
#include <extensionsystem/pluginmanager.h>
#include <projectexplorer/buildenvironmentwidget.h>
#include <projectexplorer/buildinfo.h>
#include <projectexplorer/buildmanager.h>
#include <projectexplorer/buildtargetinfo.h>
#include <projectexplorer/deploymentdata.h>
@@ -688,6 +689,30 @@ QString QbsProject::uniqueProductName(const qbs::ProductData &product)
return product.name() + QLatin1Char('.') + product.profile();
}
void QbsProject::configureAsExampleProject(const QSet<Id> &platforms)
{
QList<const BuildInfo *> infoList;
QList<Kit *> kits = KitManager::kits();
const auto qtVersionMatchesPlatform = [platforms](const QtSupport::BaseQtVersion *version) {
return platforms.isEmpty() || platforms.intersects(version->targetDeviceTypes());
};
foreach (Kit *k, kits) {
const QtSupport::BaseQtVersion * const qtVersion
= QtSupport::QtKitInformation::qtVersion(k);
if (!qtVersion || !qtVersionMatchesPlatform(qtVersion))
continue;
const IBuildConfigurationFactory * const factory
= IBuildConfigurationFactory::find(k, projectFilePath().toString());
if (!factory)
continue;
for (BuildInfo * const info : factory->availableSetups(k, projectFilePath().toString()))
infoList << info;
}
setup(infoList);
qDeleteAll(infoList);
prepareForParsing();
}
void QbsProject::parse(const QVariantMap &config, const Environment &env, const QString &dir,
const QString &configName)
{

View File

@@ -108,6 +108,8 @@ public:
const qbs::ProductData &product);
static QString uniqueProductName(const qbs::ProductData &product);
void configureAsExampleProject(const QSet<Core::Id> &platforms) final;
void invalidate();
void delayParsing();

View File

@@ -60,19 +60,19 @@ const char QBS_CLEANSTEP_ID[] = "Qbs.CleanStep";
const char QBS_INSTALLSTEP_ID[] = "Qbs.InstallStep";
// QBS strings:
static const char QBS_VARIANT_DEBUG[] = "debug";
static const char QBS_VARIANT_RELEASE[] = "release";
const char QBS_VARIANT_DEBUG[] = "debug";
const char QBS_VARIANT_RELEASE[] = "release";
static const char QBS_CONFIG_VARIANT_KEY[] = "qbs.buildVariant";
static const char QBS_CONFIG_PROFILE_KEY[] = "qbs.profile";
static const char QBS_INSTALL_ROOT_KEY[] = "qbs.installRoot";
static const char QBS_CONFIG_DECLARATIVE_DEBUG_KEY[] = "Qt.declarative.qmlDebugging";
static const char QBS_CONFIG_QUICK_DEBUG_KEY[] = "Qt.quick.qmlDebugging";
const char QBS_CONFIG_VARIANT_KEY[] = "qbs.buildVariant";
const char QBS_CONFIG_PROFILE_KEY[] = "qbs.profile";
const char QBS_INSTALL_ROOT_KEY[] = "qbs.installRoot";
const char QBS_CONFIG_DECLARATIVE_DEBUG_KEY[] = "Qt.declarative.qmlDebugging";
const char QBS_CONFIG_QUICK_DEBUG_KEY[] = "Qt.quick.qmlDebugging";
const char QBS_FORCE_PROBES_KEY[] = "qbspm.forceProbes";
// Icons:
static const char QBS_GROUP_ICON[] = ":/qbsprojectmanager/images/groups.png";
static const char QBS_PRODUCT_OVERLAY_ICON[] = ":/qbsprojectmanager/images/productgear.png";
const char QBS_GROUP_ICON[] = ":/qbsprojectmanager/images/groups.png";
const char QBS_PRODUCT_OVERLAY_ICON[] = ":/qbsprojectmanager/images/productgear.png";
// Toolchain related settings:
const char QBS_TARGETOS[] = "qbs.targetOS";

View File

@@ -244,7 +244,6 @@ void MakeFileParse::parseAssignments(QList<QMakeAssignment> *assignments)
static FileName findQMakeBinaryFromMakefile(const QString &makefile)
{
bool debugAdding = false;
QFile fi(makefile);
if (fi.exists() && fi.open(QFile::ReadOnly)) {
QTextStream ts(&fi);
@@ -252,8 +251,6 @@ static FileName findQMakeBinaryFromMakefile(const QString &makefile)
while (!ts.atEnd()) {
QString line = ts.readLine();
if (r1.exactMatch(line)) {
if (debugAdding)
qDebug()<<"#~~ QMAKE is:"<<r1.cap(1).trimmed();
QFileInfo qmake(r1.cap(1).trimmed());
QString qmakePath = qmake.filePath();
if (!QString::fromLatin1(QTC_HOST_EXE_SUFFIX).isEmpty()

View File

@@ -24,19 +24,13 @@
****************************************************************************/
#include "profilecompletionassist.h"
#include "qmakeprojectmanagerconstants.h"
#include <texteditor/codeassist/assistinterface.h>
#include <texteditor/codeassist/keywordscompletionassist.h>
#include <texteditor/texteditorconstants.h>
#include "texteditor/codeassist/keywordscompletionassist.h"
#include <coreplugin/id.h>
using namespace QmakeProjectManager::Internal;
using namespace TextEditor;
static const char *const variableKeywords[] = {
const TextEditor::Keywords &QmakeProjectManager::Internal::qmakeKeywords()
{
static TextEditor::Keywords keywords(
QStringList{ // variables
"CCFLAG",
"CLEAN_DEPS",
"CONFIG",
@@ -233,11 +227,8 @@ static const char *const variableKeywords[] = {
"YACCOBJECTS",
"YACCSOURCES",
"_PRO_FILE_",
"_PRO_FILE_PWD_",
0
};
static const char *const functionKeywords[] = {
"_PRO_FILE_PWD_"},
QStringList{ // functions
"CONFIG",
"absolute_path",
"basename",
@@ -309,45 +300,6 @@ static const char *const functionKeywords[] = {
"upper",
"val_escape",
"warning",
"write_file",
0
};
// -------------------------------
// ProFileCompletionAssistProvider
// -------------------------------
void ProFileCompletionAssistProvider::init()
{
for (uint i = 0; i < sizeof variableKeywords / sizeof variableKeywords[0] - 1; i++)
m_variables.append(QLatin1String(variableKeywords[i]));
for (uint i = 0; i < sizeof functionKeywords / sizeof functionKeywords[0] - 1; i++)
m_functions.append(QLatin1String(functionKeywords[i]));
}
ProFileCompletionAssistProvider::~ProFileCompletionAssistProvider()
{
}
IAssistProcessor *ProFileCompletionAssistProvider::createProcessor() const
{
if (m_variables.isEmpty())
const_cast<ProFileCompletionAssistProvider *>(this)->init();
TextEditor::Keywords keywords = TextEditor::Keywords(m_variables, m_functions, QMap<QString, QStringList>());
auto processor = new KeywordsCompletionAssistProcessor(keywords);
processor->setSnippetGroup(TextEditor::Constants::TEXT_SNIPPET_GROUP_ID);
return processor;
}
QStringList ProFileCompletionAssistProvider::variables() const
{
if (m_variables.isEmpty())
const_cast<ProFileCompletionAssistProvider *>(this)->init();
return m_variables;
}
QStringList ProFileCompletionAssistProvider::functions() const
{
if (m_functions.isEmpty())
const_cast<ProFileCompletionAssistProvider *>(this)->init();
return m_functions;
"write_file"});
return keywords;
}

View File

@@ -25,29 +25,11 @@
#pragma once
#include <texteditor/codeassist/completionassistprovider.h>
#include <QStringList>
namespace TextEditor { class Keywords; }
namespace QmakeProjectManager {
namespace Internal {
class ProFileCompletionAssistProvider : public TextEditor::CompletionAssistProvider
{
Q_OBJECT
public:
void init();
~ProFileCompletionAssistProvider();
TextEditor::IAssistProcessor *createProcessor() const override;
QStringList variables() const;
QStringList functions() const;
private:
QStringList m_variables;
QStringList m_functions;
};
const TextEditor::Keywords &qmakeKeywords();
} // namespace Internal
} // namespace QmakeProjectManager

View File

@@ -182,16 +182,14 @@ ProFileEditorFactory::ProFileEditorFactory()
setDocumentCreator(createProFileDocument);
setEditorWidgetCreator([]() { return new ProFileEditorWidget; });
ProFileCompletionAssistProvider *pcap = new ProFileCompletionAssistProvider;
setCompletionAssistProvider(pcap);
setCompletionAssistProvider(new KeywordsCompletionAssistProvider(qmakeKeywords()));
setCommentDefinition(Utils::CommentDefinition::HashStyle);
setEditorActionHandlers(TextEditorActionHandler::UnCommentSelection
| TextEditorActionHandler::JumpToFileUnderCursor);
Keywords keywords(pcap->variables(), pcap->functions(), QMap<QString, QStringList>());
addHoverHandler(new ProFileHoverHandler(keywords));
setSyntaxHighlighterCreator([keywords]() { return new ProFileHighlighter(keywords); });
addHoverHandler(new ProFileHoverHandler);
setSyntaxHighlighterCreator([]() { return new ProFileHighlighter; });
const QString defaultOverlay = QLatin1String(ProjectExplorer::Constants::FILEOVERLAY_QT);
Core::FileIconProvider::registerIconOverlayForSuffix(

View File

@@ -52,8 +52,8 @@ static TextStyle styleForFormat(int format)
return C_TEXT;
}
ProFileHighlighter::ProFileHighlighter(const Keywords &keywords)
: m_keywords(keywords)
ProFileHighlighter::ProFileHighlighter()
: m_keywords(qmakeKeywords())
{
setTextFormatCategories(NumProfileFormats, styleForFormat);
}

View File

@@ -42,7 +42,7 @@ public:
NumProfileFormats
};
explicit ProFileHighlighter(const TextEditor::Keywords &keywords);
ProFileHighlighter();
void highlightBlock(const QString &text);
private:

View File

@@ -39,8 +39,8 @@ using namespace Core;
namespace QmakeProjectManager {
namespace Internal {
ProFileHoverHandler::ProFileHoverHandler(const TextEditor::Keywords &keywords)
: m_keywords(keywords)
ProFileHoverHandler::ProFileHoverHandler()
: m_keywords(qmakeKeywords())
{
}

View File

@@ -38,7 +38,7 @@ namespace Internal {
class ProFileHoverHandler : public TextEditor::BaseHoverHandler
{
public:
explicit ProFileHoverHandler(const TextEditor::Keywords &keywords);
ProFileHoverHandler();
private:
void identifyMatch(TextEditor::TextEditorWidget *editorWidget, int pos) override;

View File

@@ -140,9 +140,9 @@ void SelectionTool::hoverMoveEvent(const QList<QGraphicsItem*> &itemList,
}
if ((topSelectedItemIsMovable(itemList) && !view()->hasSingleSelectedModelNode())
|| selectedItemCursorInMovableArea(event->scenePos())
|| (selectedItemCursorInMovableArea(event->scenePos())
&& !event->modifiers().testFlag(Qt::ControlModifier)
&& !event->modifiers().testFlag(Qt::ShiftModifier)) {
&& !event->modifiers().testFlag(Qt::ShiftModifier))) {
view()->changeToMoveTool();
return;
}

View File

@@ -23,8 +23,7 @@
**
****************************************************************************/
#ifndef DesignDocument_h
#define DesignDocument_h
#pragma once
#include <model.h>
#include <rewriterview.h>
@@ -155,6 +154,3 @@ private: // variables
};
} // namespace QmlDesigner
#endif // DesignDocument_h

View File

@@ -23,8 +23,7 @@
**
****************************************************************************/
#ifndef StackedUtilityPanelController_h
#define StackedUtilityPanelController_h
#pragma once
#include "utilitypanelcontroller.h"
@@ -55,5 +54,3 @@ private:
};
} // namespace QmlDesigner
#endif // StackedUtilityPanelController_h

View File

@@ -23,8 +23,7 @@
**
****************************************************************************/
#ifndef UtilityPanelController_h
#define UtilityPanelController_h
#pragma once
#include <QObject>
@@ -47,5 +46,3 @@ protected:
};
} // namespace QmlDesigner
#endif // UtilityPanelController_h

View File

@@ -23,8 +23,7 @@
**
****************************************************************************/
#ifndef QmlAnchorBindingProxy_h
#define QmlAnchorBindingProxy_h
#pragma once
#include <QObject>
#include <modelnode.h>
@@ -248,6 +247,3 @@ private:
} // namespace Internal
} // namespace QmlDesigner
#endif //QmlAnchorBindingProxy

View File

@@ -95,7 +95,7 @@ void MetaInfoReader::elementStart(const QString &name)
case ParsingHints:
case Finished:
case Undefined: setParserState(Error);
addError(tr("Illegal state while parsing"), currentSourceLocation());
addError(tr("Illegal state while parsing."), currentSourceLocation());
case Error:
default: return;
}
@@ -113,7 +113,7 @@ void MetaInfoReader::elementEnd()
case ParsingDocument:
case Finished:
case Undefined: setParserState(Error);
addError(tr("Illegal state while parsing"), currentSourceLocation());
addError(tr("Illegal state while parsing."), currentSourceLocation());
case Error:
default: return;
}
@@ -126,12 +126,12 @@ void MetaInfoReader::propertyDefinition(const QString &name, const QVariant &val
case ParsingItemLibrary: readItemLibraryEntryProperty(name, value); break;
case ParsingProperty: readPropertyProperty(name, value); break;
case ParsingQmlSource: readQmlSourceProperty(name, value); break;
case ParsingMetaInfo: addError(tr("No property definition allowed"), currentSourceLocation()); break;
case ParsingMetaInfo: addError(tr("No property definition allowed."), currentSourceLocation()); break;
case ParsingDocument:
case ParsingHints: readHint(name, value); break;
case Finished:
case Undefined: setParserState(Error);
addError(tr("Illegal state while parsing"), currentSourceLocation());
addError(tr("Illegal state while parsing."), currentSourceLocation());
case Error:
default: return;
}

View File

@@ -66,7 +66,7 @@ static IWidgetPlugin *instance(WidgetPluginData &p)
p.failed = true;
p.errorMessage = QCoreApplication::translate("WidgetPluginManager",
"Failed to create instance of file "
"'%1': %2").arg(p.path).arg(p.errorMessage);
"\"%1\": %2").arg(p.path).arg(p.errorMessage);
qWarning() << p.errorMessage;
return 0;
}
@@ -74,7 +74,7 @@ static IWidgetPlugin *instance(WidgetPluginData &p)
if (!object) {
p.failed = true;
p.errorMessage = QCoreApplication::translate("WidgetPluginManager",
"Failed to create instance of file '%1'."
"Failed to create instance of file \"%1\"."
).arg(p.path);
qWarning() << p.errorMessage;
return 0;
@@ -83,7 +83,7 @@ static IWidgetPlugin *instance(WidgetPluginData &p)
if (!iplugin) {
p.failed = true;
p.errorMessage = QCoreApplication::translate("WidgetPluginManager",
"File '%1' is not a QmlDesigner plugin."
"File \"%1\" is not a Qt Quick Designer plugin."
).arg(p.path);
qWarning() << p.errorMessage;
delete object;

View File

@@ -397,6 +397,7 @@ Project {
"componentcore/selectioncontext.h",
"componentcore/qmldesignericonprovider.cpp",
"componentcore/qmldesignericonprovider.h",
"componentcore/componentcore.qrc",
"texteditor/texteditorstatusbar.cpp",
"texteditor/texteditorstatusbar.h",
"componentcore/changestyleaction.cpp",

View File

@@ -146,7 +146,7 @@ FindInFilesSilverSearcher::FindInFilesSilverSearcher()
if (!isEnabled()) {
auto layout = new QHBoxLayout(m_widget);
layout->setMargin(0);
QLabel *label = new QLabel(tr("SilverSearcher is not available on system"));
QLabel *label = new QLabel(tr("Silver Searcher is not available on the system."));
label->setStyleSheet("QLabel { color : red; }");
layout->addWidget(label);
}

View File

@@ -589,7 +589,7 @@ CountingLabel::CountingLabel()
void CountingLabel::updateCount(int count)
{
setText(BaseFileFind::tr("%n found", nullptr, count));
setText(BaseFileFind::tr("%n found.", nullptr, count));
}
} // namespace Internal

View File

@@ -31,6 +31,7 @@
#include <texteditor/codeassist/genericproposalmodel.h>
#include <texteditor/completionsettings.h>
#include <texteditor/texteditorsettings.h>
#include <texteditor/texteditorconstants.h>
#include <texteditor/texteditor.h>
#include <utils/algorithm.h>
@@ -243,4 +244,22 @@ KeywordsCompletionAssistProcessor::generateProposalList(const QStringList &words
});
}
KeywordsCompletionAssistProvider::KeywordsCompletionAssistProvider(const Keywords &keyWords,
const QString &snippetGroup)
: m_keyWords(keyWords)
, m_snippetGroup(snippetGroup)
{ }
IAssistProvider::RunType KeywordsCompletionAssistProvider::runType() const
{
return Synchronous;
}
IAssistProcessor *KeywordsCompletionAssistProvider::createProcessor() const
{
auto processor = new KeywordsCompletionAssistProcessor(m_keyWords);
processor->setSnippetGroup(m_snippetGroup);
return processor;
}
} // namespace TextEditor

View File

@@ -28,8 +28,11 @@
#include "iassistprocessor.h"
#include "assistproposalitem.h"
#include "ifunctionhintproposalmodel.h"
#include "completionassistprovider.h"
#include "../snippets/snippetassistcollector.h"
#include "texteditor/texteditorconstants.h"
namespace TextEditor {
class AssistInterface;
@@ -38,8 +41,8 @@ class TEXTEDITOR_EXPORT Keywords
{
public:
Keywords() = default;
Keywords(const QStringList &variables, const QStringList &functions,
const QMap<QString, QStringList> &functionArgs);
Keywords(const QStringList &variables, const QStringList &functions = QStringList(),
const QMap<QString, QStringList> &functionArgs = QMap<QString, QStringList>());
bool isVariable(const QString &word) const;
bool isFunction(const QString &word) const;
@@ -79,6 +82,21 @@ private:
QStringList m_functionSymbols;
};
class TEXTEDITOR_EXPORT KeywordsCompletionAssistProvider : public CompletionAssistProvider
{
public:
KeywordsCompletionAssistProvider(const Keywords &keyWords = Keywords(),
const QString &snippetGroup = QString(Constants::TEXT_SNIPPET_GROUP_ID));
// IAssistProvider interface
RunType runType() const override;
IAssistProcessor *createProcessor() const override;
private:
Keywords m_keyWords;
QString m_snippetGroup;
};
class TEXTEDITOR_EXPORT KeywordsCompletionAssistProcessor : public IAssistProcessor
{
public:

View File

@@ -25,6 +25,12 @@
#include "displaysettings.h"
#include "texteditorconstants.h"
#include <coreplugin/icore.h>
#include <utils/tooltip/tooltip.h>
#include <QLabel>
#include <QSettings>
#include <QString>
@@ -134,4 +140,14 @@ bool DisplaySettings::equals(const DisplaySettings &ds) const
;
}
QLabel *DisplaySettings::createAnnotationSettingsLink()
{
auto *label = new QLabel("<i><a href>Annotation Settings</a></i>", Core::ICore::mainWindow());
QObject::connect(label, &QLabel::linkActivated, []() {
Utils::ToolTip::hideImmediately();
Core::ICore::showOptionsDialog(Constants::TEXT_EDITOR_DISPLAY_SETTINGS);
});
return label;
}
} // namespace TextEditor

View File

@@ -31,6 +31,7 @@
QT_BEGIN_NAMESPACE
class QSettings;
class QLabel;
QT_END_NAMESPACE
namespace TextEditor {
@@ -72,6 +73,8 @@ public:
int m_minimalAnnotationContent = 15;
bool equals(const DisplaySettings &ds) const;
static QLabel *createAnnotationSettingsLink();
};
inline bool operator==(const DisplaySettings &t1, const DisplaySettings &t2) { return t1.equals(t2); }

View File

@@ -46,6 +46,7 @@
#include "tabsettings.h"
#include "textdocument.h"
#include "textdocumentlayout.h"
#include "texteditorconstants.h"
#include "texteditoroverlay.h"
#include "refactoroverlay.h"
#include "texteditorsettings.h"
@@ -56,6 +57,7 @@
#include <texteditor/codeassist/assistinterface.h>
#include <texteditor/codeassist/codeassistant.h>
#include <texteditor/codeassist/completionassistprovider.h>
#include <texteditor/codeassist/keywordscompletionassist.h>
#include <texteditor/generichighlighter/context.h>
#include <texteditor/generichighlighter/highlightdefinition.h>
#include <texteditor/generichighlighter/highlighter.h>
@@ -3291,7 +3293,9 @@ bool TextEditorWidgetPrivate::processAnnotaionTooltipRequest(const QTextBlock &b
return false;
for (const AnnotationRect &annotationRect : m_annotationRects[block.blockNumber()]) {
if (annotationRect.rect.contains(pos)) {
if (!annotationRect.rect.contains(pos))
continue;
auto layout = new QGridLayout;
layout->setContentsMargins(0, 0, 0, 0);
layout->setSpacing(2);
@@ -3300,9 +3304,8 @@ bool TextEditorWidgetPrivate::processAnnotaionTooltipRequest(const QTextBlock &b
if (marks.size() > 1) {
QFrame* separator = new QFrame();
separator->setFrameShape(QFrame::HLine);
layout->addWidget(separator, 2, 0, 1, layout->columnCount());
layout->addWidget(new QLabel(tr("Other annotations:")), 3, 0, 1,
layout->columnCount());
layout->addWidget(separator, layout->rowCount(), 0, 1, -1);
layout->addWidget(new QLabel(tr("Other annotations:")), layout->rowCount(), 0, 1, -1);
Utils::sort(marks, [](const TextMark* mark1, const TextMark* mark2){
return mark1->priority() > mark2->priority();
@@ -3312,10 +3315,11 @@ bool TextEditorWidgetPrivate::processAnnotaionTooltipRequest(const QTextBlock &b
mark->addToToolTipLayout(layout);
}
}
layout->addWidget(DisplaySettings::createAnnotationSettingsLink(),
layout->rowCount(), 0, 1, -1, Qt::AlignRight);
ToolTip::show(q->mapToGlobal(pos), layout, q);
return true;
}
}
return false;
}
@@ -8136,13 +8140,7 @@ public:
TextEditorFactoryPrivate(TextEditorFactory *parent) :
q(parent),
m_widgetCreator([]() { return new TextEditorWidget; }),
m_editorCreator([]() { return new BaseTextEditor; }),
m_completionAssistProvider(0),
m_useGenericHighlighter(false),
m_duplicatedSupported(true),
m_codeFoldingSupported(false),
m_paranthesesMatchinEnabled(false),
m_marksVisible(false)
m_editorCreator([]() { return new BaseTextEditor; })
{}
BaseTextEditor *duplicateTextEditor(BaseTextEditor *other)
@@ -8163,12 +8161,12 @@ public:
TextEditorFactory::SyntaxHighLighterCreator m_syntaxHighlighterCreator;
CommentDefinition m_commentDefinition;
QList<BaseHoverHandler *> m_hoverHandlers; // owned
CompletionAssistProvider * m_completionAssistProvider; // owned
bool m_useGenericHighlighter;
bool m_duplicatedSupported;
bool m_codeFoldingSupported;
bool m_paranthesesMatchinEnabled;
bool m_marksVisible;
CompletionAssistProvider * m_completionAssistProvider = nullptr; // owned
bool m_useGenericHighlighter = false;
bool m_duplicatedSupported = true;
bool m_codeFoldingSupported = false;
bool m_paranthesesMatchinEnabled = false;
bool m_marksVisible = false;
};
} /// namespace Internal
@@ -8266,6 +8264,7 @@ void TextEditorFactory::setParenthesesMatchingEnabled(bool on)
IEditor *TextEditorFactory::createEditor()
{
static KeywordsCompletionAssistProvider basicSnippetProvider;
TextDocumentPtr doc(d->m_documentCreator());
if (d->m_indenterCreator)
@@ -8274,7 +8273,8 @@ IEditor *TextEditorFactory::createEditor()
if (d->m_syntaxHighlighterCreator)
doc->setSyntaxHighlighter(d->m_syntaxHighlighterCreator());
doc->setCompletionAssistProvider(d->m_completionAssistProvider);
doc->setCompletionAssistProvider(d->m_completionAssistProvider ? d->m_completionAssistProvider
: &basicSnippetProvider);
return d->createEditorHelper(doc);
}

View File

@@ -1,36 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE language SYSTEM "language.dtd">
<!--
This file is part of KDE's kate project.
copyright : (C) 2004 by Dominik Haumann
email : dhdev at gmx dot de
**********************************************************************
* This library is free software; you can redistribute it and/or *
* modify it under the terms of the GNU Library General Public *
* License as published by the Free Software Foundation; either *
* version 2 of the License, or (at your option) any later version. *
* *
* This library is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
* Library General Public License for more details. *
* *
* You should have received a copy of the GNU Library General Public *
* License along with this library; if not, write to the *
* Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, *
* Boston, MA 02110-1301, USA. *
**********************************************************************
This file is included in every file that highlights the "alerts" keywords.
That's why extensions and mimetype are empty.
Changes by Alex Turbov:
Introduce 3 alert levels and sort keywords according importance.
Few more keywords has been added.
-->
<language version="3" kateversion="3.1" name="Alerts" section="Other" extensions="" mimetype="" author="Dominik Haumann (dhdev@gmx.de)" license="LGPLv2+" hidden="true">
<language version="5" kateversion="3.1" name="Alerts" section="Other" extensions="" mimetype="" author="Dominik Haumann (dhaumann@kde.org)" license="MIT" hidden="true">
<highlighting>
<list name="alerts_hi">
<item>ALERT</item>
@@ -61,8 +31,8 @@
<context attribute="Normal Text" lineEndContext="#pop" name="Normal Text" >
<StringDetect attribute="Region Marker" context="#stay" String="{{{" beginRegion="AlertRegion1" />
<StringDetect attribute="Region Marker" context="#stay" String="}}}" endRegion="AlertRegion1" />
<StringDetect attribute="Region Marker" context="#stay" String="BEGIN" beginRegion="AlertRegion2" />
<StringDetect attribute="Region Marker" context="#stay" String="END" endRegion="AlertRegion2" />
<WordDetect attribute="Region Marker" context="#stay" String="BEGIN" beginRegion="AlertRegion2" />
<WordDetect attribute="Region Marker" context="#stay" String="END" endRegion="AlertRegion2" />
<keyword attribute="Alert Level 1" context="#stay" String="alerts_hi" />
<keyword attribute="Alert Level 2" context="#stay" String="alerts_mid" />
<keyword attribute="Alert Level 3" context="#stay" String="alerts_lo" />

View File

@@ -8,7 +8,7 @@
<!ENTITY noword "(?![\w$+-])"> <!-- no word, $, + or - following -->
<!ENTITY pathpart "([\w_@.&#37;*?+-]|\\ )"> <!-- valid character in a file name -->
]>
<language name="Bash" version="3" kateversion="5.0" section="Scripts" extensions="*.sh;*.bash;*.ebuild;*.eclass;*.nix;.bashrc;.bash_profile;.bash_login;.profile" mimetype="application/x-shellscript" casesensitive="1" author="Wilbert Berendsen (wilbert@kde.nl)" license="LGPL">
<language name="Bash" version="4" kateversion="5.0" section="Scripts" extensions="*.sh;*.bash;*.ebuild;*.eclass;*.nix;.bashrc;.bash_profile;.bash_login;.profile" mimetype="application/x-shellscript" casesensitive="1" author="Wilbert Berendsen (wilbert@kde.nl)" license="LGPL">
<!-- (c) 2004 by Wilbert Berendsen (wilbert@kde.nl)
Changes by Matthew Woehlke (mw_triad@users.sourceforge.net)
@@ -587,7 +587,8 @@
<RegExpr attribute="Redirection" context="#stay" String="([0-9]*(&gt;{1,2}|&lt;)(&amp;[0-9]+-?)?|&amp;&gt;|&gt;&amp;|[0-9]*&lt;&gt;)" />
<!-- handle &, &&, | and || -->
<RegExpr attribute="Control" context="#pop" String="([|&amp;;])\1?" />
<RegExpr attribute="Option" context="#stay" String="-?-[a-z][A-Za-z0-9_-]*" />
<RegExpr attribute="Normal Text" context="#stay" String="[a-zA-Z_]+-[A-Za-z0-9_-]*" />
<RegExpr attribute="Option" context="#stay" String="-?-[a-zA-Z_][A-Za-z0-9_-]*" />
<keyword attribute="Option" context="#stay" String="keywords" />
<AnyChar String=")}" context="#pop" lookAhead="true"/>
</context>

View File

@@ -3,39 +3,14 @@
[
<!ENTITY wordsep "([][,?;()]|\.$|\.?\s)"> <!-- things that end a TagWord -->
]>
<!--
This file is part of KDE's kate project.
Copyright 2004 Dominik Haumann (dhdev@gmx.de)
Copyright 2007 Matthew Woehlke (mw_triad@users.sourceforge.net)
Copyright 2009-2013 Alex Turbov (I.zaufi@gmail.com)
**********************************************************************
* This library is free software; you can redistribute it and/or *
* modify it under the terms of the GNU Lesser General Public *
* License as published by the Free Software Foundation; either *
* version 2 of the License, or (at your option) any later version. *
* *
* This library is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
* Lesser General Public License for more details. *
* *
* You should have received a copy of the GNU Lesser General Public *
* License along with this library; if not, write to the *
* Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, *
* Boston, MA 02110-1301, USA. *
**********************************************************************
-->
<language name="Doxygen"
version="3"
version="4"
kateversion="5.0"
section="Markup"
extensions="*.dox;*.doxygen"
mimetype="text/x-doxygen"
author="Dominik Haumann (dhdev@gmx.de)"
license="LGPLv2+"
author="Dominik Haumann (dhaumann@kde.org)"
license="MIT"
priority="9">
<highlighting>
<!-- NOTE: all tags may begin with a \ or @ char

View File

@@ -39,7 +39,7 @@
Enhance tr/// and y/// support.
-->
<language name="Perl" version="3" kateversion="2.4" section="Scripts" extensions="*.pl;*.PL;*.pm" mimetype="application/x-perl;text/x-perl" priority="5" author="Anders Lund (anders@alweb.dk)" license="LGPLv2">
<language name="Perl" version="4" kateversion="2.4" section="Scripts" extensions="*.pl;*.PL;*.pm" mimetype="application/x-perl;text/x-perl" priority="5" author="Anders Lund (anders@alweb.dk)" license="LGPLv2">
<highlighting>
<list name="keywords">
<item>if</item>
@@ -744,14 +744,14 @@
<RegExpr attribute="Keyword" context="here_document_dumb" String="\s*'([^']+)'\s*;?" />
</context>
<context name="here_document" attribute="String (interpolated)" lineEndContext="#stay" dynamic="true">
<DetectSpaces />
<RegExpr attribute="Keyword" context="#pop#pop" String="^%1\b" column="0" dynamic="true" endRegion="HereDocument"/>
<RegExpr attribute="Keyword" context="#pop#pop" String="%1\b" column="0" dynamic="true" endRegion="HereDocument"/>
<RegExpr attribute="Keyword" context="here_document" String="\=\s*&lt;&lt;\s*[&quot;']?([A-Z0-9_\-]+)[&quot;']?" beginRegion="HEREDoc" />
<IncludeRules context="ipstring_internal" />
<DetectSpaces />
</context>
<context name="here_document_dumb" attribute="Normal Text" lineEndContext="#stay" dynamic="true">
<DetectSpaces />
<RegExpr attribute="Keyword" context="#pop#pop" String="%1" column="0" dynamic="true" endRegion="HereDocument"/>
<DetectSpaces />
<DetectIdentifier />
</context>

View File

@@ -31,7 +31,7 @@
<!-- Hold the "language" opening tag on a single line, as mentioned in "language.dtd". -->
<language name="Ruby" section="Scripts"
version="3" kateversion="3.3"
version="4" kateversion="3.3"
extensions="*.rb;*.rjs;*.rxml;*.xml.erb;*.js.erb;*.rake;Rakefile;Gemfile;*.gemspec;Vagrantfile"
mimetype="application/x-ruby"
style="ruby" indenter="ruby"
@@ -204,14 +204,14 @@
<RegExpr attribute="Keyword" String="\;\s*(while|until)\b(?!.*\bdo\b)" context="#stay" beginRegion="def block"/>
<RegExpr attribute="Keyword" String="(if|unless)\b" context="#stay" beginRegion="def block" firstNonSpace="true"/>
<RegExpr attribute="Keyword" String="\;\s*(if|unless)\b" context="#stay" beginRegion="def block"/>
<RegExpr attribute="Keyword" String="\bclass\b" context="#stay" beginRegion="def block"/>
<RegExpr attribute="Keyword" String="\bmodule\b" context="#stay" beginRegion="def block"/>
<RegExpr attribute="Keyword" String="\bbegin\b" context="#stay" beginRegion="def block"/>
<WordDetect attribute="Keyword" String="class" context="#stay" beginRegion="def block"/>
<WordDetect attribute="Keyword" String="module" context="#stay" beginRegion="def block"/>
<WordDetect attribute="Keyword" String="begin" context="#stay" beginRegion="def block"/>
<RegExpr attribute="Keyword" String="\bfor\b(?!.*\bdo\b)" context="#stay" beginRegion="def block"/>
<RegExpr attribute="Keyword" String="\bcase\b" context="#stay" beginRegion="def block"/>
<RegExpr attribute="Keyword" String="\bdo\b" context="#stay" beginRegion="def block"/>
<RegExpr attribute="Keyword" String="\bdef\b" context="#stay" beginRegion="def block"/>
<RegExpr attribute="Keyword" String="\bend\b" context="#stay" endRegion="def block"/>
<WordDetect attribute="Keyword" String="case" context="#stay" beginRegion="def block"/>
<WordDetect attribute="Keyword" String="do" context="#stay" beginRegion="def block"/>
<WordDetect attribute="Keyword" String="def" context="#stay" beginRegion="def block"/>
<WordDetect attribute="Keyword" String="end" context="#stay" endRegion="def block"/>
<!-- elsif/else close the current block and start a new one -->
<RegExpr attribute="Keyword" String="\b(else|elsif|rescue|ensure)\b" context="#stay" endRegion="def block" beginRegion="def block"/>

View File

@@ -6,7 +6,7 @@
<!ENTITY name "(?![0-9])[\w_:][\w.:_-]*">
<!ENTITY entref "&amp;(#[0-9]+|#[xX][0-9A-Fa-f]+|&name;);">
]>
<language name="XML" version="5" kateversion="3.4" section="Markup" extensions="*.docbook;*.xml;*.rc;*.daml;*.rdf;*.rss;*.xspf;*.xsd;*.svg;*.ui;*.kcfg;*.qrc;*.wsdl;*.scxml" mimetype="text/xml;text/book;text/daml;text/rdf;application/rss+xml;application/xspf+xml;image/svg+xml;application/x-designer;application/xml;application/scxml+xml" casesensitive="1" author="Wilbert Berendsen (wilbert@kde.nl)" license="LGPL">
<language name="XML" version="6" kateversion="3.4" section="Markup" extensions="*.docbook;*.xml;*.rc;*.daml;*.rdf;*.rss;*.xspf;*.xsd;*.svg;*.ui;*.kcfg;*.qrc;*.wsdl;*.scxml;*.xbel" mimetype="text/xml;text/book;text/daml;text/rdf;application/rss+xml;application/xspf+xml;image/svg+xml;application/x-designer;application/x-xbel;application/xml;application/scxml+xml" casesensitive="1" author="Wilbert Berendsen (wilbert@kde.nl)" license="LGPL">
<highlighting>
<contexts>

View File

@@ -198,13 +198,8 @@ void IndexWindow::open(const QModelIndex &index, bool newPage)
{
QString keyword = m_filteredIndexModel->data(index, Qt::DisplayRole).toString();
QMap<QString, QUrl> links = LocalHelpManager::helpEngine().indexModel()->linksForKeyword(keyword);
if (links.size() == 1) {
emit linkActivated(links.first(), newPage);
} else if (links.size() > 1) {
emit linksActivated(links, keyword, newPage);
}
}
Qt::DropActions IndexFilterModel::supportedDragActions() const
{

View File

@@ -88,7 +88,6 @@ public:
void setOpenInNewPageActionVisible(bool visible);
signals:
void linkActivated(const QUrl &link, bool newPage);
void linksActivated(const QMap<QString, QUrl> &links,
const QString &keyword, bool newPage);

View File

@@ -494,7 +494,7 @@ TEST_F(Cursor, HasOutputValues)
auto outputArgumentLocations = callExpressionCursor.outputArgumentRanges();
ASSERT_THAT(outputArgumentLocations.size(), 2);
ASSERT_THAT(outputArgumentLocations.size(), 1);
ASSERT_THAT(outputArgumentLocations[0], outputArgumentExpectedSourceLocation);
}
@@ -749,13 +749,13 @@ TEST_F(Cursor, PointerIsNotRefencingConstant)
ASSERT_FALSE(argument.isReferencingConstant());
}
TEST_F(Cursor, PointerIsOutputArgument)
TEST_F(Cursor, PointerIsNotOutputArgument)
{
auto callExpressionCursor = translationUnit.cursorAt(127, 13);
auto argument = callExpressionCursor.type().argument(0);
ASSERT_TRUE(argument.isOutputArgument());
ASSERT_FALSE(argument.isOutputArgument());
}
TEST_F(Cursor, ConstantReferenceIsNotOutputArgument)
@@ -782,7 +782,7 @@ TEST_F(Cursor, ConstantPointerIsNotOutputArgument)
auto argument = callExpressionCursor.type().argument(0);
ASSERT_TRUE(argument.isOutputArgument());
ASSERT_FALSE(argument.isOutputArgument());
}
TEST_F(Cursor, ReferenceIsOutputArgument)

Some files were not shown because too many files have changed in this diff Show More