Merge remote-tracking branch 'origin/14.0'
Change-Id: I240ecca23ec82e54699fcf11ba1d801d0a8c09f0
2
.github/workflows/build_cmake.yml
vendored
@@ -9,7 +9,7 @@ on:
|
||||
env:
|
||||
QT_VERSION: 6.7.1
|
||||
MACOS_DEPLOYMENT_TARGET: 11.0
|
||||
CLANG_VERSION: 18.1.5
|
||||
CLANG_VERSION: 18.1.7
|
||||
ELFUTILS_VERSION: 0.175
|
||||
CMAKE_VERSION: 3.21.1
|
||||
NINJA_VERSION: 1.10.2
|
||||
|
@@ -1129,7 +1129,7 @@ function (add_qtc_lua_plugin name)
|
||||
|
||||
qtc_copy_to_builddir(${name}
|
||||
FILES ${_arg_SOURCES}
|
||||
DESTINATION ${IDE_PLUGIN_PATH}/lua-plugins
|
||||
DESTINATION ${IDE_PLUGIN_PATH}
|
||||
)
|
||||
|
||||
if (NOT _arg_EXCLUDE_FROM_INSTALL)
|
||||
@@ -1138,7 +1138,7 @@ function (add_qtc_lua_plugin name)
|
||||
|
||||
install(
|
||||
FILES ${CMAKE_CURRENT_SOURCE_DIR}/${SOURCE}
|
||||
DESTINATION ${IDE_PLUGIN_PATH}/lua-plugins/${SOURCE_DIR}
|
||||
DESTINATION ${IDE_PLUGIN_PATH}/${SOURCE_DIR}
|
||||
)
|
||||
endforeach()
|
||||
endif()
|
||||
|
@@ -7,7 +7,7 @@ instructions:
|
||||
variableValue: "RelWithDebInfo"
|
||||
- type: EnvironmentVariable
|
||||
variableName: LLVM_BASE_URL
|
||||
variableValue: https://ci-files02-hki.ci.qt.io/packages/jenkins/qtcreator_libclang/libclang-release_18.1.5-based
|
||||
variableValue: https://ci-files02-hki.ci.qt.io/packages/jenkins/qtcreator_libclang/libclang-release_18.1.7-based
|
||||
- type: EnvironmentVariable
|
||||
variableName: QTC_QT_BASE_URL
|
||||
variableValue: "https://ci-files02-hki.ci.qt.io/packages/jenkins/archive/qt/6.7/6.7.1-released/Qt"
|
||||
|
17
dist/changelog/changes-14.0.0.md
vendored
@@ -13,6 +13,8 @@ the public Git repository. For example:
|
||||
General
|
||||
-------
|
||||
|
||||
* Started work on supporting Lua based plugins (registering language servers,
|
||||
actions, preferences, and wizards)
|
||||
* Added `Clear` and `Save Contents` to context menus of all output views
|
||||
* Locator
|
||||
* Added the option to show results relative to project root
|
||||
@@ -54,17 +56,22 @@ Editing
|
||||
([QTCREATORBUG-10279](https://bugreports.qt.io/browse/QTCREATORBUG-10279))
|
||||
* Clangd
|
||||
* Increased the minimum version to LLVM 17
|
||||
* Added an option for the index location
|
||||
* Added the `Per-project index location` and `Per-session index location`
|
||||
options in `Preferences` > `C++` > `Clangd` for setting the index location
|
||||
for a project or session
|
||||
([QTCREATORBUG-27346](https://bugreports.qt.io/browse/QTCREATORBUG-27346))
|
||||
* Made reparsing source files while editing header files optional
|
||||
* Added the `Update dependent sources` option to make re-parsing source files
|
||||
while editing header files optional
|
||||
([QTCREATORBUG-29943](https://bugreports.qt.io/browse/QTCREATORBUG-29943))
|
||||
* Fixed the handling of system headers
|
||||
([QTCREATORBUG-30474](https://bugreports.qt.io/browse/QTCREATORBUG-30474))
|
||||
* Built-in
|
||||
* Added the option to disable the built-in indexer
|
||||
* Added the `Enable indexing` option in `Preferences` > `C++` > `Code Model`
|
||||
to turn off the built-in indexer
|
||||
([QTCREATORBUG-29147](https://bugreports.qt.io/browse/QTCREATORBUG-29147))
|
||||
* Added an option for "statement macros" that are interpreted by the indenter
|
||||
as complete statements that don't require a semicolon at the end
|
||||
* Added the `Statement Macros` field in `Preferences` > `C++` > `Code Style`
|
||||
for macros that the indenter interprets as complete statements that don't
|
||||
require a semicolon at the end
|
||||
([QTCREATORBUG-13640](https://bugreports.qt.io/browse/QTCREATORBUG-13640),
|
||||
[QTCREATORBUG-15069](https://bugreports.qt.io/browse/QTCREATORBUG-15069),
|
||||
[QTCREATORBUG-18789](https://bugreports.qt.io/browse/QTCREATORBUG-18789))
|
||||
|
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 13 KiB |
BIN
doc/qtcreator/images/qtcreator-move-class-to-separate-files.webp
Normal file
After Width: | Height: | Size: 4.3 KiB |
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 3.8 KiB After Width: | Height: | Size: 4.1 KiB |
Before Width: | Height: | Size: 8.8 KiB After Width: | Height: | Size: 9.9 KiB |
@@ -162,7 +162,7 @@
|
||||
|
||||
\title Code Model
|
||||
|
||||
\brief Sets global preferences for the code model.
|
||||
\brief Sets global preferences for the C++ code model.
|
||||
|
||||
The code model offers services such as code completion, syntactic and
|
||||
semantic highlighting, and diagnostics.
|
||||
@@ -189,6 +189,10 @@
|
||||
\li \uicontrol {Use built-in preprocessor to show pre-processed files}
|
||||
\li Uses the built-in preprocessor to show the
|
||||
pre-processed source file in the editor.
|
||||
\row
|
||||
\li \uicontrol {Enable indexing}
|
||||
\li Turns on the built-in indexer. Clearing this checkbox severely limits
|
||||
the capabilities of the code model.
|
||||
\row
|
||||
\li \uicontrol {Do not index files greater than}
|
||||
\li To avoid out-of-memory crashes caused by indexing huge source files
|
||||
@@ -243,9 +247,14 @@
|
||||
version 14, or later.
|
||||
\li In the \uicontrol {Background indexing} field, select \uicontrol Off
|
||||
to use a faster, but less accurate built-in indexer than the one used
|
||||
by default. You can set the indexing priority depending on whether
|
||||
by default. Set the indexing priority depending on whether
|
||||
the accuracy of results or speed is more important to you during
|
||||
global symbol searches.
|
||||
\li In \uicontrol {Per-project index location}, select the folder to
|
||||
store the index files for each project. The \c {compile-commands.json}
|
||||
file is also stored in this folder.
|
||||
\li In \uicontrol {Per-session index location}, select the folder to
|
||||
store the index files for each session.
|
||||
\li In \uicontrol {Header/source switch mode}, select the C/C++
|
||||
backend for switching between header and source files. While the
|
||||
clangd implementation has more capabilities than the built-in
|
||||
@@ -254,6 +263,13 @@
|
||||
\li By default, clangd attempts to use all unused cores. You can set a
|
||||
fixed number of cores to use in \uicontrol {Worker thread count}.
|
||||
Background indexing also uses this many worker threads.
|
||||
\li Select \uicontrol {Insert header files on completion} to insert
|
||||
header files when completing symbols.
|
||||
\li Select \uicontrol {Update dependent sources} to re-parse all source
|
||||
files that include a header file when editing the header file. This
|
||||
can cause a heavy CPU load if the header file is included in many
|
||||
source files. Clear this option to only re-parse the source files
|
||||
when saving the header file.
|
||||
\li Set the number of \uicontrol {Completion results} if you regularly
|
||||
miss important results during code completion. Set it to 0 to remove
|
||||
the limit on the number of completion results. Setting this to 0 or a
|
||||
|
@@ -103,15 +103,182 @@
|
||||
\li Create function declarations and definitions
|
||||
\endlist
|
||||
|
||||
The following table summarizes the quick fixes for C++ code. The
|
||||
fix is available when the cursor is in the position described in the
|
||||
Activation column.
|
||||
The following tables summarize the quick fixes available for C++ code,
|
||||
according to the cursor position.
|
||||
|
||||
\section1 Block of Code Selected
|
||||
|
||||
\table
|
||||
\header
|
||||
\li Quick Fix
|
||||
\li Description
|
||||
\row
|
||||
\li Assign to Local Variable
|
||||
\li Adds a local variable which stores the return value of a
|
||||
function call or a new expression. For example, rewrites:
|
||||
|
||||
\code
|
||||
QString s;
|
||||
s.toLatin1();
|
||||
\endcode
|
||||
|
||||
as
|
||||
|
||||
\code
|
||||
QString s;
|
||||
QByteArray latin1 = s.toLatin1();
|
||||
\endcode
|
||||
|
||||
and
|
||||
|
||||
\code
|
||||
new Foo;
|
||||
\endcode
|
||||
|
||||
as
|
||||
|
||||
\code
|
||||
Foo * localFoo = new Foo;
|
||||
\endcode
|
||||
|
||||
By default, \QC uses the \c auto variable type when creating the
|
||||
variable. To label the variable with its actual type, select
|
||||
\preferences > \uicontrol C++ > \uicontrol {Quick Fixes} and
|
||||
clear \uicontrol {Use type "auto" when creating new variables}.
|
||||
|
||||
Also available for a function call.
|
||||
\row
|
||||
\li Extract Function
|
||||
\li Moves the selected code to a new function and replaces the block
|
||||
of code with a call to the new function. Enter a name for the
|
||||
function in the \uicontrol {Extract Function Refactoring}
|
||||
dialog.
|
||||
\row
|
||||
\li Extract Constant as Function Parameter
|
||||
\li Replaces the selected literal and all its occurrences with the
|
||||
function parameter \c{newParameter}, which has the original
|
||||
literal as the default value.
|
||||
\endtable
|
||||
|
||||
\section1 Class
|
||||
|
||||
The following quick fixes are available when the cursor is on the definition
|
||||
of a class.
|
||||
|
||||
\table
|
||||
\header
|
||||
\li Quick Fix
|
||||
\li Description
|
||||
\row
|
||||
\li Create Implementations for Member Functions
|
||||
\li Creates implementations for all member functions in one go.
|
||||
In the \uicontrol {Member Function Implementations} dialog,
|
||||
specify whether the member functions are generated
|
||||
inline or outside the class.
|
||||
\row
|
||||
\li Generate Constructor
|
||||
\li Creates a constructor for a class.
|
||||
\row
|
||||
\li Generate Missing Q_PROPERTY Members
|
||||
\li Adds missing members to a \c Q_PROPERTY:
|
||||
\list
|
||||
\li \c read function
|
||||
\li \c write function, if there is a WRITE
|
||||
\li \c {onChanged} signal, if there is a NOTIFY
|
||||
\li data member with the name \c {m_<propertyName>}
|
||||
\endlist
|
||||
\row
|
||||
\li Insert Virtual Functions of Base Classes
|
||||
\li Inserts declarations and the corresponding definitions inside or
|
||||
outside the class or in an implementation file (if it exists).
|
||||
For more information, see \l{Insert virtual functions}.
|
||||
\row
|
||||
\li Move All Function Definitions
|
||||
\li Moves all function definitions to the implementation file or
|
||||
outside the class. For example, rewrites:
|
||||
\code
|
||||
class Foo
|
||||
{
|
||||
void bar()
|
||||
{
|
||||
// do stuff here
|
||||
}
|
||||
void baz()
|
||||
{
|
||||
// do stuff here
|
||||
}
|
||||
};
|
||||
\endcode
|
||||
|
||||
as
|
||||
|
||||
\code
|
||||
class Foo
|
||||
{
|
||||
void bar();
|
||||
void baz();
|
||||
};
|
||||
|
||||
void Foo::bar() {
|
||||
// do stuff here
|
||||
}
|
||||
|
||||
void Foo::baz() {
|
||||
// do stuff here
|
||||
}
|
||||
\endcode
|
||||
\row
|
||||
\li Move Class to a Dedicated Set of Source Files
|
||||
\li Moves a class to separate header and source files. For more
|
||||
information, see \l{Move classes to separate files}.
|
||||
\row
|
||||
\li Re-order Member Function Definitions According to Declaration Order
|
||||
\li Re-orders method definitions in a .cpp file to follow the order of
|
||||
method declarations in the corresponding .h file.
|
||||
\endtable
|
||||
|
||||
\section1 Class Member
|
||||
|
||||
The following quick fixes are available when the cursor is on a member
|
||||
variable in a class definition.
|
||||
|
||||
\table
|
||||
\header
|
||||
\li Quick Fix
|
||||
\li Description
|
||||
\row
|
||||
\li Generate Constant Q_PROPERTY and Missing Members
|
||||
\li Generates a constant Q_PROPERTY and adds missing members
|
||||
to it.
|
||||
\row
|
||||
\li Generate Getter
|
||||
\li Creates a getter member function for a member variable.
|
||||
\row
|
||||
\li Generate Getter and Setter
|
||||
\li Creates getter and setter member functions for a member
|
||||
variable.
|
||||
\row
|
||||
\li Create Getter and Setter Member Functions
|
||||
\li Creates either both getter and setter member functions for
|
||||
member variables or only a getter or setter.
|
||||
\row
|
||||
\li Generate Q_PROPERTY and Missing Members
|
||||
\li Generates a Q_PROPERTY and adds missing members to it.
|
||||
\row
|
||||
\li Generate Q_PROPERTY and Missing Members with Reset Function
|
||||
\li Generates a Q_PROPERTY and adds missing members to it, with an
|
||||
additional \c reset function.
|
||||
\row
|
||||
\li Generate Setter
|
||||
\li Creates a setter member function for a member variable.
|
||||
\endtable
|
||||
|
||||
\section1 Control Statement
|
||||
|
||||
\table
|
||||
\header
|
||||
\li Quick Fix
|
||||
\li Description
|
||||
\li Activation
|
||||
\row
|
||||
\li Add Curly Braces
|
||||
\li Adds curly braces to an if statement that does not have a
|
||||
@@ -129,7 +296,10 @@
|
||||
b;
|
||||
}
|
||||
\endcode
|
||||
\li \c if
|
||||
\row
|
||||
\li Complete Switch Statement
|
||||
\li Adds all possible cases to a switch statement of the type
|
||||
\c enum.
|
||||
\row
|
||||
\li Move Declaration out of Condition
|
||||
\li Moves a declaration out of an if or while condition to simplify
|
||||
@@ -145,7 +315,192 @@
|
||||
Type name = foo;
|
||||
if (name) {}
|
||||
\endcode
|
||||
\li Name of the introduced variable
|
||||
\row
|
||||
\li Optimize for-Loop
|
||||
\li Rewrites post-increment operators as pre-increment operators and
|
||||
post-decrement operators as pre-decrement operators. It also
|
||||
moves other than string or numeric literals and id expressions
|
||||
from the condition of a for loop to its initializer. For
|
||||
example, rewrites:
|
||||
|
||||
\code
|
||||
for (int i = 0; i < 3 * 2; i++)
|
||||
\endcode
|
||||
|
||||
as
|
||||
|
||||
\code
|
||||
for (int i = 0, total = 3 * 2; i < total; ++i)
|
||||
\endcode
|
||||
\endtable
|
||||
|
||||
\section1 Function Declaration or Definition
|
||||
|
||||
\table
|
||||
\header
|
||||
\li Quick Fix
|
||||
\li Description
|
||||
\row
|
||||
\li Add Definition ...
|
||||
\li Inserts a definition stub for a function declaration either in
|
||||
the header file (inside or outside the class) or in the
|
||||
implementation file. For free functions, inserts the definition
|
||||
after the declaration of the function or in the implementation
|
||||
file. Qualified names are minimized when possible, instead of
|
||||
always being fully expanded.
|
||||
|
||||
For example, rewrites
|
||||
|
||||
\code
|
||||
Class Foo {
|
||||
void bar();
|
||||
};
|
||||
\endcode
|
||||
|
||||
as (inside class)
|
||||
|
||||
\code
|
||||
Class Foo {
|
||||
void bar() {
|
||||
|
||||
}
|
||||
};
|
||||
\endcode
|
||||
|
||||
as (outside class)
|
||||
|
||||
\code
|
||||
Class Foo {
|
||||
void bar();
|
||||
};
|
||||
|
||||
void Foo::bar()
|
||||
{
|
||||
|
||||
}
|
||||
\endcode
|
||||
|
||||
as (in implementation file)
|
||||
|
||||
\code
|
||||
// Header file
|
||||
Class Foo {
|
||||
void bar();
|
||||
};
|
||||
|
||||
// Implementation file
|
||||
void Foo::bar()
|
||||
{
|
||||
|
||||
}
|
||||
\endcode
|
||||
\row
|
||||
\li Add \c Function Declaration
|
||||
\li Inserts the member function declaration that matches the member
|
||||
function definition into the class declaration. The function can
|
||||
be \c {public}, \c {protected}, \c {private}, \c {public slot},
|
||||
\c {protected slot}, or \c {private slot}.
|
||||
\row
|
||||
\li Apply Changes
|
||||
\li Keeps function declarations and definitions synchronized by
|
||||
checking for the matching declaration or definition when you
|
||||
edit a function signature and by applying the changes to the
|
||||
matching code.
|
||||
|
||||
When this fix is available, a light bulb icon appears:
|
||||
\inlineimage icons/refactormarker.png
|
||||
\row
|
||||
\li Convert Function Call to Qt Meta-Method Invocation
|
||||
\li Converts a normal function call into a meta method invocation, if
|
||||
the function is marked as invokable.
|
||||
\row
|
||||
\li Move Definition Here
|
||||
\li Moves an existing function definition to its declaration.
|
||||
\row
|
||||
\li Move Function Definition
|
||||
\li Moves a function definition to the implementation file, outside
|
||||
the class or back to its declaration. For example, rewrites:
|
||||
\code
|
||||
class Foo
|
||||
{
|
||||
void bar()
|
||||
{
|
||||
// do stuff here
|
||||
}
|
||||
};
|
||||
\endcode
|
||||
|
||||
as
|
||||
\code
|
||||
class Foo
|
||||
{
|
||||
void bar();
|
||||
};
|
||||
|
||||
void Foo::bar() {
|
||||
// do stuff here
|
||||
}
|
||||
\endcode
|
||||
\row
|
||||
\li Move Function Documentation to Declaration/Definition
|
||||
\li Moves the documentation comment for a function between its
|
||||
declaration and definition.
|
||||
\endtable
|
||||
|
||||
\section1 Identifier
|
||||
|
||||
\table
|
||||
\header
|
||||
\li Quick Fix
|
||||
\li Description
|
||||
\row
|
||||
\li Add #include for undeclared or forward declared identifier
|
||||
\li Adds an \c {#include} directive to the current file to make the
|
||||
definition of a symbol available.
|
||||
\row
|
||||
\li Add Class Member
|
||||
\li Adds a member declaration for the class member being
|
||||
initialized if it is not yet declared. If \QC cannot
|
||||
automatically detect the data type of the member, you
|
||||
must add it.
|
||||
\row
|
||||
\li Add Forward Declaration
|
||||
\li Adds a forward declaration for an undeclared identifier
|
||||
operation.
|
||||
\row
|
||||
\li Convert to Camel Case
|
||||
\li Converts a symbol name to camel case, where elements of the name
|
||||
are joined without delimiter characters and the initial
|
||||
character of each element is capitalized. For example, rewrites
|
||||
\c an_example_symbol as \c anExampleSymbol and
|
||||
\c AN_EXAMPLE_SYMBOL as \c AnExampleSymbol
|
||||
\endtable
|
||||
|
||||
\section1 Numeric Literal
|
||||
|
||||
\table
|
||||
\header
|
||||
\li Quick Fix
|
||||
\li Description
|
||||
\row
|
||||
\li Convert to Decimal
|
||||
\li Converts an integer literal to decimal representation
|
||||
\row
|
||||
\li Convert to Hexadecimal
|
||||
\li Converts an integer literal to hexadecimal representation
|
||||
\row
|
||||
\li Convert to Octal
|
||||
\li Converts an integer literal to octal representation
|
||||
\endtable
|
||||
|
||||
\section1 Operator
|
||||
|
||||
\table
|
||||
\header
|
||||
\li Quick Fix
|
||||
\li Description
|
||||
\li Operator
|
||||
|
||||
\row
|
||||
\li Rewrite Condition Using ||
|
||||
\li Rewrites the expression according to De Morgan's laws. For
|
||||
@@ -200,21 +555,6 @@
|
||||
\endlist
|
||||
|
||||
\li \c {<=}, \c {<}, \c {>}, \c {>=}, \c {==} or \c {!=}
|
||||
\row
|
||||
\li Split Declaration
|
||||
\li Splits a simple declaration into several declarations. For
|
||||
example, rewrites:
|
||||
\code
|
||||
int *a, b;
|
||||
\endcode
|
||||
|
||||
as
|
||||
|
||||
\code
|
||||
int *a;
|
||||
int b;
|
||||
\endcode
|
||||
\li Type name or variable name
|
||||
\row
|
||||
\li Split if Statement
|
||||
\li Splits an if statement into several statements. For example,
|
||||
@@ -265,18 +605,14 @@
|
||||
\endcode
|
||||
\li \c {<=}, \c {<}, \c {>}, \c {>=}, \c {==}, \c {!=}, \c {&&}
|
||||
or \c {||}
|
||||
\row
|
||||
\li Convert to Decimal
|
||||
\li Converts an integer literal to decimal representation
|
||||
\li Numeric literal
|
||||
\row
|
||||
\li Convert to Hexadecimal
|
||||
\li Converts an integer literal to hexadecimal representation
|
||||
\li Numeric literal
|
||||
\row
|
||||
\li Convert to Octal
|
||||
\li Converts an integer literal to octal representation
|
||||
\li Numeric literal
|
||||
\endtable
|
||||
|
||||
\section1 String Literal
|
||||
|
||||
\table
|
||||
\header
|
||||
\li Quick Fix
|
||||
\li Description
|
||||
\row
|
||||
\li Convert to Objective-C String Literal
|
||||
\li Converts a string literal to an Objective-C string literal if
|
||||
@@ -294,7 +630,18 @@
|
||||
\code
|
||||
@"abcd"
|
||||
\endcode
|
||||
\li String literal
|
||||
\row
|
||||
\li Enclose in QByteArrayLiteral()
|
||||
\li Converts a string to a byte array. For example, rewrites
|
||||
\code
|
||||
"abcd"
|
||||
\endcode
|
||||
|
||||
as
|
||||
|
||||
\code
|
||||
QByteArrayLiteral("abcd")
|
||||
\endcode
|
||||
\row
|
||||
\li Enclose in QLatin1Char()
|
||||
\li Sets the encoding for a character to Latin-1, unless the
|
||||
@@ -311,7 +658,6 @@
|
||||
\code
|
||||
QLatin1Char('a')
|
||||
\endcode
|
||||
\li String literal
|
||||
\row
|
||||
\li Enclose in QLatin1String()
|
||||
\li Sets the encoding for a string to Latin-1, unless the string is
|
||||
@@ -326,22 +672,10 @@
|
||||
\code
|
||||
QLatin1String("abcd")
|
||||
\endcode
|
||||
|
||||
\li String literal
|
||||
\row
|
||||
\li Enclose in QByteArrayLiteral()
|
||||
\li Converts a string to a byte array. For example, rewrites
|
||||
\code
|
||||
"abcd"
|
||||
\endcode
|
||||
|
||||
as
|
||||
|
||||
\code
|
||||
QByteArrayLiteral("abcd")
|
||||
\endcode
|
||||
|
||||
\li String literal
|
||||
\li Escape String Literal as UTF-8
|
||||
\li Escapes non-ASCII characters in a string literal to hexadecimal
|
||||
escape sequences. String Literals are handled as UTF-8.
|
||||
\row
|
||||
\li Mark as Translatable
|
||||
\li Marks a string translatable. For example, rewrites \c "abcd"
|
||||
@@ -353,104 +687,37 @@
|
||||
QCoreApplication::translate("CONTEXT", "abcd")
|
||||
QT_TRANSLATE_NOOP("GLOBAL", "abcd")
|
||||
\endcode
|
||||
|
||||
\li String literal
|
||||
|
||||
\row
|
||||
\li Add Definition in ...
|
||||
\li Inserts a definition stub for a function declaration either in
|
||||
the header file (inside or outside the class) or in the
|
||||
implementation file. For free functions, inserts the definition
|
||||
after the declaration of the function or in the implementation
|
||||
file. Qualified names are minimized when possible, instead of
|
||||
always being fully expanded.
|
||||
\li Unescape String Literal as UTF-8
|
||||
\li Unescapes octal or hexadecimal escape sequences in a string
|
||||
literal. String Literals are handled as UTF-8.
|
||||
\endtable
|
||||
|
||||
For example, rewrites
|
||||
\section1 \c using directive
|
||||
|
||||
\code
|
||||
Class Foo {
|
||||
void bar();
|
||||
};
|
||||
\endcode
|
||||
|
||||
as (inside class)
|
||||
|
||||
\code
|
||||
Class Foo {
|
||||
void bar() {
|
||||
|
||||
}
|
||||
};
|
||||
\endcode
|
||||
|
||||
as (outside class)
|
||||
|
||||
\code
|
||||
Class Foo {
|
||||
void bar();
|
||||
};
|
||||
|
||||
void Foo::bar()
|
||||
{
|
||||
|
||||
}
|
||||
\endcode
|
||||
|
||||
as (in implementation file)
|
||||
|
||||
\code
|
||||
// Header file
|
||||
Class Foo {
|
||||
void bar();
|
||||
};
|
||||
|
||||
// Implementation file
|
||||
void Foo::bar()
|
||||
{
|
||||
|
||||
}
|
||||
\endcode
|
||||
|
||||
\li Function name
|
||||
\table
|
||||
\header
|
||||
\li Quick Fix
|
||||
\li Description
|
||||
\row
|
||||
\li Remove All Occurrences of \c {using namespace} in Global Scope
|
||||
and Adjust Type Names Accordingly
|
||||
\li Remove all occurrences of \c {using namespace} in the global
|
||||
scope and adjust type names accordingly.
|
||||
\row
|
||||
\li Add \c Function Declaration
|
||||
\li Inserts the member function declaration that matches the member
|
||||
function definition into the class declaration. The function can
|
||||
be \c {public}, \c {protected}, \c {private}, \c {public slot},
|
||||
\c {protected slot}, or \c {private slot}.
|
||||
\li Function name
|
||||
\row
|
||||
\li Add Class Member
|
||||
\li Adds a member declaration for the class member being
|
||||
initialized if it is not yet declared. If \QC cannot
|
||||
automatically detect the data type of the member, you
|
||||
must add it.
|
||||
\li Identifier
|
||||
\row
|
||||
\li Create Implementations for Member Functions
|
||||
\li Creates implementations for all member functions in one go.
|
||||
In the \uicontrol {Member Function Implementations} dialog,
|
||||
specify whether the member functions are generated
|
||||
inline or outside the class.
|
||||
\li Function name
|
||||
\row
|
||||
\li Switch with Next/Previous Parameter
|
||||
\li Moves a parameter down or up one position in a parameter list.
|
||||
\li Parameter in the declaration or definition of a function
|
||||
\row
|
||||
\li Extract Function
|
||||
\li Moves the selected code to a new function and replaces the block
|
||||
of code with a call to the new function. Enter a name for the
|
||||
function in the \uicontrol {Extract Function Refactoring}
|
||||
dialog.
|
||||
\li Block of code selected
|
||||
\row
|
||||
\li Extract Constant as Function Parameter
|
||||
\li Replaces the selected literal and all its occurrences with the
|
||||
function parameter \c{newParameter}. The parameter
|
||||
\c{newParameter} will have the original literal as the default
|
||||
value.
|
||||
\li Block of code selected
|
||||
\li Remove \c {using namespace} and Adjust Type Names Accordingly
|
||||
\li Remove occurrences of \c {using namespace} in the local scope
|
||||
and adjust type names accordingly.
|
||||
\endtable
|
||||
|
||||
|
||||
\section1 Miscellaneous
|
||||
|
||||
\table
|
||||
\header
|
||||
\li Quick Fix
|
||||
\li Description
|
||||
\li Activation
|
||||
\row
|
||||
\li Add Local Declaration
|
||||
\li Adds the type of an assignee, if the type of the right-hand
|
||||
@@ -469,63 +736,59 @@
|
||||
where Type is the return type of \c {foo()}
|
||||
|
||||
\li Assignee
|
||||
\row
|
||||
\li Convert connect() to Qt 5 Style
|
||||
\li Converts a Qt 4 QObject::connect() to Qt 5 style.
|
||||
\li QObject::connect() (Qt 4 style)
|
||||
\row
|
||||
\li Convert Comment to C/C++ Style
|
||||
\li Converts C-style comments into C++-style comments, and vice
|
||||
versa. Tries to preserve \e pretty layout and takes Doxygen and
|
||||
qdoc formatting into consideration, but you might need to clean
|
||||
up the results.
|
||||
\li Code comment
|
||||
\row
|
||||
\li Convert to Pointer
|
||||
\li Converts the selected stack variable to a pointer. For example,
|
||||
rewrites:
|
||||
|
||||
\code
|
||||
QByteArray foo = "foo";
|
||||
foo.append("bar");
|
||||
\endcode
|
||||
|
||||
as
|
||||
|
||||
\code
|
||||
QByteArray *foo = new QByteArray("foo");
|
||||
foo->append("bar");
|
||||
\endcode
|
||||
|
||||
This operation is limited to work only within function scope.
|
||||
Also, the coding style for pointers and references is not
|
||||
respected yet.
|
||||
\li Stack Variable
|
||||
\row
|
||||
\li Convert to Camel Case
|
||||
\li Converts a symbol name to camel case, where elements of the name
|
||||
are joined without delimiter characters and the initial
|
||||
character of each element is capitalized. For example, rewrites
|
||||
\c an_example_symbol as \c anExampleSymbol and
|
||||
\c AN_EXAMPLE_SYMBOL as \c AnExampleSymbol
|
||||
\li Identifier
|
||||
\row
|
||||
\li Complete Switch Statement
|
||||
\li Adds all possible cases to a switch statement of the type
|
||||
\c enum
|
||||
\li \c switch
|
||||
\row
|
||||
\li Generate Missing Q_PROPERTY Members
|
||||
\li Adds missing members to a \c Q_PROPERTY:
|
||||
\list
|
||||
\li \c read function
|
||||
\li \c write function, if there is a WRITE
|
||||
\li \c {onChanged} signal, if there is a NOTIFY
|
||||
\li data member with the name \c {m_<propertyName>}
|
||||
\endlist
|
||||
\li \c Q_PROPERTY
|
||||
\row
|
||||
\li Generate Q_PROPERTY and Missing Members
|
||||
\li Generates a Q_PROPERTY and adds missing members to it, as
|
||||
described above.
|
||||
\li Class member
|
||||
\row
|
||||
\li Generate Constant Q_PROPERTY and Missing Members
|
||||
\li Generates a constant Q_PROPERTY and adds missing members
|
||||
to it, as described above.
|
||||
\li Class member
|
||||
\row
|
||||
\li Generate Q_PROPERTY and Missing Members with Reset Function
|
||||
\li Generates a Q_PROPERTY and adds missing members to it, as
|
||||
described above, but with an additional \c reset function.
|
||||
\li Class member
|
||||
\row
|
||||
\li Apply Changes
|
||||
\li Keeps function declarations and definitions synchronized by
|
||||
checking for the matching declaration or definition when you
|
||||
edit a function signature and by applying the changes to the
|
||||
matching code.
|
||||
\li Function signature. When this fix is available, a light bulb
|
||||
icon appears: \inlineimage icons/refactormarker.png
|
||||
\row
|
||||
\li Add #include for undeclared or forward declared identifier
|
||||
\li Adds an \c {#include} directive to the current file to make the
|
||||
definition of a symbol available.
|
||||
\li Undeclared identifier
|
||||
\row
|
||||
\li Add Forward Declaration
|
||||
\li Adds a forward declaration for an undeclared identifier
|
||||
operation.
|
||||
\li Undeclared identifier
|
||||
\li Convert to Stack Variable
|
||||
\li Converts the selected pointer to a stack variable. For example,
|
||||
rewrites:
|
||||
|
||||
\code
|
||||
QByteArray *foo = new QByteArray("foo");
|
||||
foo->append("bar");
|
||||
\endcode
|
||||
|
||||
as
|
||||
|
||||
\code
|
||||
QByteArray foo("foo");
|
||||
foo.append("bar");
|
||||
\endcode
|
||||
|
||||
This operation is limited to work only within function scope.
|
||||
Also, the coding style for pointers and references is not
|
||||
respected yet.
|
||||
\li Pointer Variable
|
||||
\row
|
||||
\li Reformat Pointers or References
|
||||
\li Reformats declarations with pointers or references according
|
||||
@@ -551,239 +814,24 @@
|
||||
\li Declarations with pointers or references and selections
|
||||
that have such declarations
|
||||
\row
|
||||
\li Create Getter and Setter Member Functions
|
||||
\li Creates either both getter and setter member functions for
|
||||
member variables or only a getter or setter.
|
||||
\li Member variable in class definition
|
||||
\row
|
||||
\li Generate Getter and Setter
|
||||
\li Creates getter and setter member functions for a member
|
||||
variable.
|
||||
\li Member variable in class definition
|
||||
\row
|
||||
\li Generate Getter
|
||||
\li Creates a getter member function for a member variable.
|
||||
\li Member variable in class definition
|
||||
\row
|
||||
\li Generate Setter
|
||||
\li Creates a setter member function for a member variable.
|
||||
\li Member variable in class definition
|
||||
\row
|
||||
\li Generate Constructor
|
||||
\li Creates a constructor for a class.
|
||||
\li Class definition
|
||||
\row
|
||||
\li Move Function Definition
|
||||
\li Moves a function definition to the implementation file, outside
|
||||
the class or back to its declaration. For example, rewrites:
|
||||
\code
|
||||
class Foo
|
||||
{
|
||||
void bar()
|
||||
{
|
||||
// do stuff here
|
||||
}
|
||||
};
|
||||
\endcode
|
||||
|
||||
as
|
||||
\code
|
||||
class Foo
|
||||
{
|
||||
void bar();
|
||||
};
|
||||
|
||||
void Foo::bar() {
|
||||
// do stuff here
|
||||
}
|
||||
\endcode
|
||||
|
||||
\li Function signature
|
||||
\row
|
||||
\li Move All Function Definitions
|
||||
\li Moves all function definitions to the implementation file or
|
||||
outside the class. For example, rewrites:
|
||||
\code
|
||||
class Foo
|
||||
{
|
||||
void bar()
|
||||
{
|
||||
// do stuff here
|
||||
}
|
||||
void baz()
|
||||
{
|
||||
// do stuff here
|
||||
}
|
||||
};
|
||||
\endcode
|
||||
|
||||
as
|
||||
|
||||
\code
|
||||
class Foo
|
||||
{
|
||||
void bar();
|
||||
void baz();
|
||||
};
|
||||
|
||||
void Foo::bar() {
|
||||
// do stuff here
|
||||
}
|
||||
|
||||
void Foo::baz() {
|
||||
// do stuff here
|
||||
}
|
||||
\endcode
|
||||
|
||||
\li Class name
|
||||
\row
|
||||
\li Move Definition Here
|
||||
\li Moves an existing function definition to its declaration.
|
||||
\li Function declaration
|
||||
\row
|
||||
\li Assign to Local Variable
|
||||
\li Adds a local variable which stores the return value of a
|
||||
function call or a new expression. For example, rewrites:
|
||||
|
||||
\code
|
||||
QString s;
|
||||
s.toLatin1();
|
||||
\endcode
|
||||
|
||||
as
|
||||
|
||||
\code
|
||||
QString s;
|
||||
QByteArray latin1 = s.toLatin1();
|
||||
\endcode
|
||||
|
||||
and
|
||||
|
||||
\code
|
||||
new Foo;
|
||||
\endcode
|
||||
|
||||
as
|
||||
|
||||
\code
|
||||
Foo * localFoo = new Foo;
|
||||
\endcode
|
||||
|
||||
By default, \QC uses the \c auto variable type when creating the
|
||||
variable. To label the variable with its actual type, select
|
||||
\preferences > \uicontrol C++ >
|
||||
\uicontrol {Quick Fixes}, and then deselect the
|
||||
\uicontrol {Use type "auto" when creating new variables} check
|
||||
box.
|
||||
|
||||
\li Function call or class name
|
||||
\row
|
||||
\li Insert Virtual Functions of Base Classes
|
||||
\li Inserts declarations and the corresponding definitions inside or
|
||||
outside the class or in an implementation file (if it exists).
|
||||
For more information, see \l{Insert virtual functions}.
|
||||
\li Class or base class name
|
||||
\row
|
||||
\li Optimize for-Loop
|
||||
\li Rewrites post increment operators as pre increment operators and
|
||||
post decrement operators as pre decrement operators. It also
|
||||
moves other than string or numeric literals and id expressions
|
||||
from the condition of a for loop to its initializer. For
|
||||
\li Split Declaration
|
||||
\li Splits a simple declaration into several declarations. For
|
||||
example, rewrites:
|
||||
|
||||
\code
|
||||
for (int i = 0; i < 3 * 2; i++)
|
||||
int *a, b;
|
||||
\endcode
|
||||
|
||||
as
|
||||
|
||||
\code
|
||||
for (int i = 0, total = 3 * 2; i < total; ++i)
|
||||
int *a;
|
||||
int b;
|
||||
\endcode
|
||||
\li \c for
|
||||
|
||||
\li Type name or variable name
|
||||
\row
|
||||
\li Escape String Literal as UTF-8
|
||||
\li Escapes non-ASCII characters in a string literal to hexadecimal
|
||||
escape sequences. String Literals are handled as UTF-8.
|
||||
\li String literal
|
||||
|
||||
\row
|
||||
\li Unescape String Literal as UTF-8
|
||||
\li Unescapes octal or hexadecimal escape sequences in a string
|
||||
literal. String Literals are handled as UTF-8.
|
||||
\li String literal
|
||||
|
||||
\row
|
||||
\li Convert to Stack Variable
|
||||
\li Converts the selected pointer to a stack variable. For example,
|
||||
rewrites:
|
||||
|
||||
\code
|
||||
QByteArray *foo = new QByteArray("foo");
|
||||
foo->append("bar");
|
||||
\endcode
|
||||
|
||||
as
|
||||
|
||||
\code
|
||||
QByteArray foo("foo");
|
||||
foo.append("bar");
|
||||
\endcode
|
||||
|
||||
This operation is limited to work only within function scope.
|
||||
Also, the coding style for pointers and references is not
|
||||
respected yet.
|
||||
\li Pointer Variable
|
||||
|
||||
\row
|
||||
\li Convert to Pointer
|
||||
\li Converts the selected stack variable to a pointer. For example,
|
||||
rewrites:
|
||||
|
||||
\code
|
||||
QByteArray foo = "foo";
|
||||
foo.append("bar");
|
||||
\endcode
|
||||
|
||||
as
|
||||
|
||||
\code
|
||||
QByteArray *foo = new QByteArray("foo");
|
||||
foo->append("bar");
|
||||
\endcode
|
||||
|
||||
This operation is limited to work only within function scope.
|
||||
Also, the coding style for pointers and references is not
|
||||
respected yet.
|
||||
\li Stack Variable
|
||||
\row
|
||||
\li Remove \c {using namespace} and Adjust Type Names Accordingly
|
||||
\li Remove occurrences of \c {using namespace} in the local scope
|
||||
and adjust type names accordingly.
|
||||
\li \c using directive
|
||||
\row
|
||||
\li Remove All Occurrences of \c {using namespace} in Global Scope
|
||||
and Adjust Type Names Accordingly
|
||||
\li Remove all occurrences of \c {using namespace} in the global
|
||||
scope and adjust type names accordingly.
|
||||
\li \c using directive
|
||||
\row
|
||||
\li Convert connect() to Qt 5 Style
|
||||
\li Converts a Qt 4 QObject::connect() to Qt 5 style.
|
||||
\li QObject::connect() (Qt 4 style)
|
||||
\row
|
||||
\li Convert Comment to C/C++ Style
|
||||
\li Converts C-style comments into C++-style comments, and vice
|
||||
versa. Tries to preserve \e pretty layout and takes Doxygen and
|
||||
qdoc formatting into consideration, but you might need to clean
|
||||
up the results.
|
||||
\li Code comment
|
||||
\row
|
||||
\li Move Function Documentation to Declaration/Definition
|
||||
\li Moves the documentation comment for a function between its
|
||||
declaration and definition.
|
||||
\li Documentation comment for a function
|
||||
\li Switch with Next/Previous Parameter
|
||||
\li Moves a parameter down or up one position in a parameter list.
|
||||
\li Parameter in the declaration or definition of a function
|
||||
\endtable
|
||||
|
||||
\sa {Apply quick fixes}, {Find symbols}, {Rename symbols},
|
||||
|
@@ -54,6 +54,8 @@
|
||||
|
||||
\list
|
||||
\li Interpret the \key Tab and \key Backspace key presses.
|
||||
\li Add macros that the indenter interprets as complete statements that
|
||||
don't require a semicolon at the end.
|
||||
\li Indent the contents of classes, functions, blocks, and namespaces.
|
||||
\li Indent braces in classes, namespaces, enums, functions, and blocks.
|
||||
\li Control switch statements and their contents.
|
||||
|
@@ -38,7 +38,7 @@
|
||||
|
||||
By default, the refactored files are saved automatically. To turn off
|
||||
this feature, go to \preferences > \uicontrol Environment >
|
||||
\uicontrol System and select \uicontrol {Auto-save files after refactoring}.
|
||||
\uicontrol System and clear \uicontrol {Auto-save files after refactoring}.
|
||||
|
||||
\if defined(qtcreator)
|
||||
\section1 Create functions
|
||||
@@ -94,6 +94,17 @@
|
||||
{C++ Quick Fixes}
|
||||
\endif
|
||||
|
||||
\section1 Move classes to separate files
|
||||
|
||||
Apply the \uicontrol {Move Class to a Dedicated Set of Source Files} quick
|
||||
fix to move a class to a separate set of header and implementation files.
|
||||
|
||||
\image qtcreator-move-class-to-separate-files.webp {Give names to header and implementation files}
|
||||
|
||||
Specify paths and file names for the header and implementation file.
|
||||
|
||||
To omit the implementation file, select \uicontrol {Header file only}.
|
||||
|
||||
\sa {Rename symbols}, {QML Quick Fixes}
|
||||
*/
|
||||
|
||||
|
@@ -91,7 +91,7 @@
|
||||
For more information about the project file settings, see
|
||||
\l{Declaring Other Libraries}{qmake Manual: Declaring Other Libraries}.
|
||||
|
||||
\sa {Adding an Internal Library to a qmake Project}{Tutorial: Adding an Internal Library to a qmake Project},
|
||||
\sa {Using an Internal Library in a qmake Project}{Tutorial: Using an Internal Library in a qmake Project},
|
||||
{Add subprojects to projects}, {Add libraries to CMake projects},
|
||||
{Use project wizards}, {Creating Projects}
|
||||
*/
|
||||
@@ -103,7 +103,7 @@
|
||||
|
||||
\ingroup creator-tutorials
|
||||
|
||||
\title Adding an Internal Library to a qmake Project
|
||||
\title Using an Internal Library in a qmake Project
|
||||
|
||||
\brief How to create your own library and link your application against it
|
||||
when using qmake as the build system.
|
||||
|
275
doc/qtcreatordev/src/lua-extensions.qdoc
Normal file
@@ -0,0 +1,275 @@
|
||||
// Copyright (C) 2024 The Qt Company Ltd.
|
||||
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
|
||||
|
||||
/*!
|
||||
\page lua-extensions.html
|
||||
\title Extending \QC with Lua
|
||||
|
||||
\QC can be extended with Lua scripts. The included Lua engine is based on Lua 5.4.6.
|
||||
|
||||
\section1 Writing Lua Extensions
|
||||
|
||||
To create a new Lua extension, choose \uicontrol {File} > \uicontrol {New Project} >
|
||||
\uicontrol {Library} > \uicontrol {\QC Lua Plugin}.
|
||||
|
||||
To test your new extension, start your project. Your \uicontrol {Application Output}
|
||||
should show \e {Hello from Lua!}.
|
||||
|
||||
\section1 Lua Extension Specification
|
||||
|
||||
A Lua extension consists of a Lua script with the same name as the folder it is in.
|
||||
This is necessary for the extension to be loaded.
|
||||
|
||||
This script defines the specification of the extension, such as its display name, vendor, copyright.
|
||||
|
||||
\code
|
||||
--- MyExtension.lua
|
||||
return {
|
||||
Name = "MyExtension",
|
||||
Version = "1.0.0",
|
||||
CompatVersion = "1.0.0",
|
||||
Vendor = "My Company",
|
||||
Category = "Tests",
|
||||
Description = "Describe what your extension does in a sentence.",
|
||||
LongDescription = [[
|
||||
Tell users more about your extension.
|
||||
]],
|
||||
Dependencies = {
|
||||
{ Name = "Core", Version = "13.0.82", Required = true },
|
||||
{ Name = "Lua", Version = "13.0.82", Required = true }
|
||||
},
|
||||
setup = function() print("Hello from Lua!") end,
|
||||
printToOutputPane = true,
|
||||
} --[[@as QtcPlugin]]
|
||||
\endcode
|
||||
|
||||
\section1 The Setup Function
|
||||
|
||||
The setup function is called when the extension is loaded. This is where you can set up the
|
||||
functionality of your extension. Since the specification file is parsed with very limited
|
||||
permissions, you need to require a module where you implement the actual functionality.
|
||||
|
||||
\code
|
||||
--- MyExtension.lua
|
||||
return {
|
||||
Name = "MyExtension",
|
||||
Version = "1.0.0",
|
||||
...,
|
||||
--- This is the setup function that is called when the extension is loaded.
|
||||
--- It requires the 'init' module and calls the setup function from the returned table.
|
||||
setup = function() require 'init'.setup() end,
|
||||
}
|
||||
\endcode
|
||||
|
||||
\code
|
||||
--- init.lua
|
||||
function setup()
|
||||
print("Hello from Lua!")
|
||||
end
|
||||
|
||||
-- Returns a table with a single field 'setup' that points to the setup function.
|
||||
return {
|
||||
setup = setup
|
||||
}
|
||||
\endcode
|
||||
|
||||
|
||||
\section1 Asynchronous Operations
|
||||
|
||||
Some of the built-in operations work asynchronously. To handle this, use the Async module.
|
||||
|
||||
\code
|
||||
local a = require 'async'
|
||||
local u = require 'Utils'
|
||||
|
||||
a.sync(function()
|
||||
print("Lets wait for 5 seconds ...")
|
||||
a.wait(u.waitms(5000))
|
||||
print("... done!")
|
||||
end)
|
||||
\endcode
|
||||
|
||||
\section1 Interactive Help
|
||||
|
||||
When you open a .lua file in the editor the first time, you are asked to download the Lua
|
||||
Language Server. This is extremely useful as it gives you context sensitive help and
|
||||
auto-completion.
|
||||
|
||||
\section1 \QC API
|
||||
|
||||
The \QC API is available to Lua extensions via a number of modules that you can import
|
||||
using the \c {require} function. C++ extensions may provide additional modules. One example of that
|
||||
is the LanguageServer Extension that provides a module for creating Language Server clients.
|
||||
|
||||
You can find the API documentation files for the Lua modules in your \QC installation.
|
||||
On \macos you can find them in \c{Qt Creator.app/Contents/Resources/lua/meta}.
|
||||
|
||||
\annotatedlist lua-modules
|
||||
|
||||
\section1 Extending the Lua API with C++
|
||||
|
||||
To add functionality to the Lua Interface, you need to register a new module with the Lua Engine.
|
||||
|
||||
\code
|
||||
#include <lua/luaengine.h>
|
||||
|
||||
class MyCppExtension final : public ExtensionSystem::IPlugin
|
||||
{
|
||||
Q_OBJECT
|
||||
Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QtCreatorPlugin" FILE "MyCppExtension.json")
|
||||
|
||||
public:
|
||||
MyCppExtension() {}
|
||||
|
||||
private:
|
||||
void initialize() final {
|
||||
// The registered function will be called when the Lua module 'MyCppExtension' is required.
|
||||
// The returned table will be returned from the require call in Lua.
|
||||
::Lua::LuaEngine::registerProvider("MyCppExtension", [](sol::state_view lua) -> sol::object {
|
||||
sol::table result = lua.create_table();
|
||||
result["myFunction"] = [](int a, int b) { return a + b; };
|
||||
return result;
|
||||
});
|
||||
}
|
||||
};
|
||||
\endcode
|
||||
|
||||
You can then access \c{MyCppExtension.myFunction} from your Lua scripts like this:
|
||||
|
||||
\code
|
||||
local MyCppExtension = require 'MyCppExtension'
|
||||
--- MyCppExtension is now a table with a single field 'myFunction', as it is returned from the
|
||||
--- C++ function registered via 'LuaEngine::registerProvider(...)'.
|
||||
print(MyCppExtension.myFunction(1, 2))
|
||||
\endcode
|
||||
|
||||
For more information on how to register C++ functionality, see
|
||||
\l {https://sol2.readthedocs.io/en/latest/index.html} {sol2}.
|
||||
|
||||
\section1 Examples
|
||||
|
||||
\section2 Language Server
|
||||
|
||||
The \QC LuaLanguageClient Plugin provides support for registering your own Language Server
|
||||
clients. You can find an example of how to use this in the \QC Extension "Lua Language Server"
|
||||
and "Rust Language Server".
|
||||
*/
|
||||
|
||||
/*!
|
||||
\page lua-extension-meta-core
|
||||
\ingroup lua-modules
|
||||
\title Core.lua
|
||||
\brief Access and interact with the core functionality of \QC.
|
||||
|
||||
\quotefile ../../../src/plugins/lua/meta/core.lua
|
||||
*/
|
||||
|
||||
/*!
|
||||
\page lua-extension-meta-action
|
||||
\ingroup lua-modules
|
||||
\title action.lua
|
||||
\brief Create user interface actions in \QC.
|
||||
|
||||
\quotefile ../../../src/plugins/lua/meta/action.lua
|
||||
*/
|
||||
|
||||
/*!
|
||||
\page lua-extension-meta-async
|
||||
\ingroup lua-modules
|
||||
\title async.lua
|
||||
\brief Handle asynchronouse operations with the async/await Lua API.
|
||||
|
||||
\quotefile ../../../src/plugins/lua/meta/async.lua
|
||||
*/
|
||||
|
||||
/*!
|
||||
\page lua-extension-meta-fetch
|
||||
\ingroup lua-modules
|
||||
\title fetch.lua
|
||||
\brief Fetch data from the internet.
|
||||
|
||||
\quotefile ../../../src/plugins/lua/meta/fetch.lua
|
||||
*/
|
||||
|
||||
/*!
|
||||
\page lua-extension-meta-gui
|
||||
\ingroup lua-modules
|
||||
\title gui.lua
|
||||
\brief Create user interfaces.
|
||||
|
||||
\quotefile ../../../src/plugins/lua/meta/gui.lua
|
||||
*/
|
||||
|
||||
/*!
|
||||
\page lua-extension-meta-lsp
|
||||
\ingroup lua-modules
|
||||
\title lsp.lua
|
||||
\brief Register Language Server clients.
|
||||
|
||||
\quotefile ../../../src/plugins/lua/meta/lsp.lua
|
||||
*/
|
||||
|
||||
/*!
|
||||
\page lua-extension-meta-messagemanager
|
||||
\ingroup lua-modules
|
||||
\title messagemanager.lua
|
||||
\brief Display messages to the user.
|
||||
|
||||
\quotefile ../../../src/plugins/lua/meta/messagemanager.lua
|
||||
*/
|
||||
|
||||
/*!
|
||||
\page lua-extension-meta-process
|
||||
\ingroup lua-modules
|
||||
\title process.lua
|
||||
\brief Run external processes.
|
||||
|
||||
\quotefile ../../../src/plugins/lua/meta/process.lua
|
||||
*/
|
||||
|
||||
/*!
|
||||
\page lua-extension-meta-qt
|
||||
\ingroup lua-modules
|
||||
\title qt.lua
|
||||
\brief Access Qt functionality.
|
||||
|
||||
\quotefile ../../../src/plugins/lua/meta/qt.lua
|
||||
*/
|
||||
|
||||
/*!
|
||||
\page lua-extension-meta-qtc
|
||||
\ingroup lua-modules
|
||||
\title qtc.lua
|
||||
\brief Access and extend \QC.
|
||||
|
||||
\quotefile ../../../src/plugins/lua/meta/qtc.lua
|
||||
*/
|
||||
|
||||
/*!
|
||||
\page lua-extension-meta-settings
|
||||
\ingroup lua-modules
|
||||
\title settings.lua
|
||||
\brief Read and write settings.
|
||||
|
||||
\quotefile ../../../src/plugins/lua/meta/settings.lua
|
||||
*/
|
||||
|
||||
/*!
|
||||
\page lua-extension-meta-simpletypes
|
||||
\ingroup lua-modules
|
||||
\title simpletypes.lua
|
||||
\brief Access simple types.
|
||||
|
||||
\quotefile ../../../src/plugins/lua/meta/simpletypes.lua
|
||||
*/
|
||||
|
||||
/*!
|
||||
\page lua-extension-meta-utils
|
||||
\ingroup lua-modules
|
||||
\title utils.lua
|
||||
\brief Common utility functions and classes.
|
||||
|
||||
\quotefile ../../../src/plugins/lua/meta/utils.lua
|
||||
*/
|
||||
|
||||
|
@@ -214,7 +214,16 @@
|
||||
\li \l{Options Pages}
|
||||
\li \l{Editors}
|
||||
\endomit
|
||||
\endlist
|
||||
\endlist
|
||||
|
||||
\section1 Lua Extensions
|
||||
|
||||
If you have more specific needs that are not covered by the above methods but don't need
|
||||
a full-blown plugin, you can extend \QC with Lua Extensions.
|
||||
|
||||
\list
|
||||
\li \l{Extending \QC with Lua}
|
||||
\endlist
|
||||
|
||||
\section1 All Topics
|
||||
|
||||
|
@@ -7,6 +7,6 @@ Product {
|
||||
prefix: sourceDirectory + '/' + product.name + '/'
|
||||
files: luafiles
|
||||
qbs.install: true
|
||||
qbs.installDir: qtc.ide_plugin_path + '/lua-plugins/' + product.name
|
||||
qbs.installDir: qtc.ide_plugin_path + '/' + product.name
|
||||
}
|
||||
}
|
||||
|
@@ -331,8 +331,7 @@ class Dumper(DumperBase):
|
||||
self.qtNamespace = lambda: namespace
|
||||
return namespace
|
||||
|
||||
def qtVersion(self):
|
||||
qtVersion = None
|
||||
def extractQtVersion(self):
|
||||
try:
|
||||
qtVersion = self.parseAndEvaluate(
|
||||
'((void**)&%s)[2]' % self.qtHookDataSymbolName()).integer()
|
||||
@@ -344,10 +343,7 @@ class Dumper(DumperBase):
|
||||
(major, minor, patch) = version.decode('latin1').split('.')
|
||||
qtVersion = 0x10000 * int(major) + 0x100 * int(minor) + int(patch)
|
||||
except:
|
||||
pass
|
||||
if qtVersion is None:
|
||||
qtVersion = self.fallbackQtVersion
|
||||
self.qtVersion = lambda: qtVersion
|
||||
return None
|
||||
return qtVersion
|
||||
|
||||
def putVtableItem(self, address):
|
||||
|
@@ -559,18 +559,17 @@ QString PluginSpec::errorString() const
|
||||
}
|
||||
|
||||
/*!
|
||||
Returns whether this plugin can be used to fill in a dependency of the given
|
||||
\a pluginName and \a pluginVersion.
|
||||
Returns whether the plugin \a spec can be used to fill the \a dependency of this plugin.
|
||||
|
||||
\sa PluginSpec::dependencies()
|
||||
\sa PluginSpec::dependencies()
|
||||
*/
|
||||
bool PluginSpec::provides(const QString &pluginName, const QString &pluginVersion) const
|
||||
bool PluginSpec::provides(PluginSpec *spec, const PluginDependency &dependency) const
|
||||
{
|
||||
if (QString::compare(pluginName, name(), Qt::CaseInsensitive) != 0)
|
||||
if (QString::compare(dependency.name, spec->name(), Qt::CaseInsensitive) != 0)
|
||||
return false;
|
||||
|
||||
return (versionCompare(version(), pluginVersion) >= 0)
|
||||
&& (versionCompare(compatVersion(), pluginVersion) <= 0);
|
||||
return (versionCompare(spec->version(), dependency.version) >= 0)
|
||||
&& (versionCompare(spec->compatVersion(), dependency.version) <= 0);
|
||||
}
|
||||
|
||||
/*!
|
||||
@@ -1075,8 +1074,8 @@ bool PluginSpec::resolveDependencies(const PluginSpecs &specs)
|
||||
|
||||
QHash<PluginDependency, PluginSpec *> resolvedDependencies;
|
||||
for (const PluginDependency &dependency : d->dependencies) {
|
||||
PluginSpec *const found = findOrDefault(specs, [&dependency](PluginSpec *spec) {
|
||||
return spec->provides(dependency.name, dependency.version);
|
||||
PluginSpec *const found = findOrDefault(specs, [this, &dependency](PluginSpec *spec) {
|
||||
return provides(spec, dependency);
|
||||
});
|
||||
if (!found) {
|
||||
if (dependency.type == PluginDependency::Required) {
|
||||
|
@@ -36,13 +36,14 @@ class PluginView;
|
||||
|
||||
struct EXTENSIONSYSTEM_EXPORT PluginDependency
|
||||
{
|
||||
enum Type {
|
||||
Required,
|
||||
Optional,
|
||||
Test
|
||||
};
|
||||
enum Type { Required, Optional, Test };
|
||||
|
||||
PluginDependency() : type(Required) {}
|
||||
PluginDependency(const QString &name, const QString &version, Type type = Required)
|
||||
: name(name)
|
||||
, version(version)
|
||||
, type(type)
|
||||
{}
|
||||
|
||||
QString name;
|
||||
QString version;
|
||||
@@ -130,7 +131,7 @@ public:
|
||||
virtual void addArgument(const QString &argument);
|
||||
virtual QHash<PluginDependency, PluginSpec *> dependencySpecs() const;
|
||||
|
||||
virtual bool provides(const QString &pluginName, const QString &pluginVersion) const;
|
||||
virtual bool provides(PluginSpec *spec, const PluginDependency &dependency) const;
|
||||
virtual bool requiresAny(const QSet<PluginSpec *> &plugins) const;
|
||||
virtual PluginSpecs enableDependenciesIndirectly(bool enableTestDependencies);
|
||||
virtual bool resolveDependencies(const PluginSpecs &pluginSpecs);
|
||||
|
@@ -153,7 +153,7 @@ StaticAnalysisMessages::StaticAnalysisMessages()
|
||||
Tr::tr("Invalid property type \"%1\"."), 1);
|
||||
newMsg(WarnEqualityTypeCoercion, Error,
|
||||
Tr::tr("== and != perform type coercion, use === or !== to avoid it."));
|
||||
newMsg(WarnExpectedNewWithUppercaseFunction, Error,
|
||||
newMsg(WarnExpectedNewWithUppercaseFunction, Warning,
|
||||
Tr::tr("Calls of functions that start with an uppercase letter should use 'new'."));
|
||||
newMsg(WarnNewWithLowercaseFunction, Error,
|
||||
Tr::tr("Use 'new' only with functions that start with an uppercase letter."));
|
||||
|
@@ -1291,6 +1291,12 @@ const void *Loop::valuePtr() const
|
||||
|
||||
using StoragePtr = void *;
|
||||
|
||||
static QString s_activeStorageWarning =
|
||||
"The referenced storage is not reachable in the running tree. "
|
||||
"A nullptr will be returned which might lead to a crash in the calling code. "
|
||||
"It is possible that no storage was added to the tree, "
|
||||
"or the storage is not reachable from where it is referenced.";
|
||||
|
||||
class StorageThreadData
|
||||
{
|
||||
Q_DISABLE_COPY_MOVE(StorageThreadData)
|
||||
@@ -1299,7 +1305,7 @@ public:
|
||||
StorageThreadData() = default;
|
||||
void pushStorage(StoragePtr storagePtr)
|
||||
{
|
||||
m_activeStorageStack.push_back(storagePtr);
|
||||
m_activeStorageStack.push_back({storagePtr, activeTaskTree()});
|
||||
}
|
||||
void popStorage()
|
||||
{
|
||||
@@ -1308,16 +1314,16 @@ public:
|
||||
}
|
||||
StoragePtr activeStorage() const
|
||||
{
|
||||
QT_ASSERT(m_activeStorageStack.size(), qWarning(
|
||||
"The referenced storage is not reachable in the running tree. "
|
||||
"A nullptr will be returned which might lead to a crash in the calling code. "
|
||||
"It is possible that no storage was added to the tree, "
|
||||
"or the storage is not reachable from where it is referenced."); return nullptr);
|
||||
return m_activeStorageStack.last();
|
||||
QT_ASSERT(m_activeStorageStack.size(),
|
||||
qWarning().noquote() << s_activeStorageWarning; return nullptr);
|
||||
const QPair<StoragePtr, TaskTree *> &top = m_activeStorageStack.last();
|
||||
QT_ASSERT(top.second == activeTaskTree(),
|
||||
qWarning().noquote() << s_activeStorageWarning; return nullptr);
|
||||
return top.first;
|
||||
}
|
||||
|
||||
private:
|
||||
QList<StoragePtr> m_activeStorageStack;
|
||||
QList<QPair<StoragePtr, TaskTree *>> m_activeStorageStack;
|
||||
};
|
||||
|
||||
class StorageData
|
||||
|
@@ -210,11 +210,10 @@ QIcon Icon::sideBarIcon(const Icon &classic, const Icon &flat)
|
||||
return result;
|
||||
}
|
||||
|
||||
QIcon Icon::modeIcon(const Icon &classic, const Icon &flat, const Icon &flatActive)
|
||||
QIcon Icon::modeIcon(const Icon &classic, const Icon &flat,
|
||||
[[__maybe_unused__]] const Icon &flatActive)
|
||||
{
|
||||
QIcon result = sideBarIcon(classic, flat);
|
||||
if (creatorTheme()->flag(Theme::FlatSideBarIcons))
|
||||
result.addPixmap(flatActive.pixmap(), QIcon::Active);
|
||||
return result;
|
||||
}
|
||||
|
||||
|
Before Width: | Height: | Size: 158 B After Width: | Height: | Size: 166 B |
Before Width: | Height: | Size: 175 B After Width: | Height: | Size: 171 B |
@@ -49,7 +49,8 @@ void StartProcessPacket::doSerialize(QDataStream &stream) const
|
||||
<< unixTerminalDisabled
|
||||
<< useCtrlCStub
|
||||
<< reaperTimeout
|
||||
<< createConsoleOnWindows;
|
||||
<< createConsoleOnWindows
|
||||
<< forceDefaultErrorMode;
|
||||
}
|
||||
|
||||
void StartProcessPacket::doDeserialize(QDataStream &stream)
|
||||
@@ -70,7 +71,8 @@ void StartProcessPacket::doDeserialize(QDataStream &stream)
|
||||
>> unixTerminalDisabled
|
||||
>> useCtrlCStub
|
||||
>> reaperTimeout
|
||||
>> createConsoleOnWindows;
|
||||
>> createConsoleOnWindows
|
||||
>> forceDefaultErrorMode;
|
||||
processMode = Utils::ProcessMode(processModeInt);
|
||||
processChannelMode = QProcess::ProcessChannelMode(processChannelModeInt);
|
||||
}
|
||||
|
@@ -99,6 +99,7 @@ public:
|
||||
bool useCtrlCStub = false;
|
||||
int reaperTimeout = 500;
|
||||
bool createConsoleOnWindows = false;
|
||||
bool forceDefaultErrorMode = false;
|
||||
|
||||
private:
|
||||
void doSerialize(QDataStream &stream) const override;
|
||||
|
@@ -260,6 +260,7 @@ void CallerHandle::start(const QString &program, const QStringList &arguments)
|
||||
p.useCtrlCStub = m_setup->m_useCtrlCStub;
|
||||
p.reaperTimeout = m_setup->m_reaperTimeout.count();
|
||||
p.createConsoleOnWindows = m_setup->m_createConsoleOnWindows;
|
||||
p.forceDefaultErrorMode = m_setup->m_forceDefaultErrorMode;
|
||||
sendPacket(p);
|
||||
}
|
||||
|
||||
|
@@ -55,12 +55,13 @@ void ProcessStartHandler::setNativeArguments(const QString &arguments)
|
||||
#endif // Q_OS_WIN
|
||||
}
|
||||
|
||||
void ProcessStartHandler::setWindowsSpecificStartupFlags(bool belowNormalPriority,
|
||||
bool createConsoleWindow)
|
||||
void ProcessStartHandler::setWindowsSpecificStartupFlags(
|
||||
bool belowNormalPriority, bool createConsoleWindow, bool forceDefaultErrorMode)
|
||||
{
|
||||
#ifdef Q_OS_WIN
|
||||
m_process->setCreateProcessArgumentsModifier(
|
||||
[belowNormalPriority, createConsoleWindow](QProcess::CreateProcessArguments *args) {
|
||||
[belowNormalPriority, createConsoleWindow, forceDefaultErrorMode](
|
||||
QProcess::CreateProcessArguments *args) {
|
||||
if (createConsoleWindow) {
|
||||
args->flags |= CREATE_NEW_CONSOLE;
|
||||
args->startupInfo->dwFlags &= ~STARTF_USESTDHANDLES;
|
||||
@@ -69,11 +70,13 @@ void ProcessStartHandler::setWindowsSpecificStartupFlags(bool belowNormalPriorit
|
||||
if (belowNormalPriority)
|
||||
args->flags |= BELOW_NORMAL_PRIORITY_CLASS;
|
||||
|
||||
args->flags |= CREATE_DEFAULT_ERROR_MODE;
|
||||
if (forceDefaultErrorMode)
|
||||
args->flags |= CREATE_DEFAULT_ERROR_MODE;
|
||||
});
|
||||
#else // Q_OS_WIN
|
||||
Q_UNUSED(belowNormalPriority)
|
||||
Q_UNUSED(createConsoleWindow)
|
||||
Q_UNUSED(forceDefaultErrorMode)
|
||||
#endif
|
||||
}
|
||||
|
||||
|
@@ -20,7 +20,8 @@ public:
|
||||
void handleProcessStart();
|
||||
void handleProcessStarted();
|
||||
void setNativeArguments(const QString &arguments);
|
||||
void setWindowsSpecificStartupFlags(bool belowNormalPriority, bool createConsoleWindow);
|
||||
void setWindowsSpecificStartupFlags(
|
||||
bool belowNormalPriority, bool createConsoleWindow, bool forceDefaultErrorMode);
|
||||
|
||||
private:
|
||||
ProcessMode m_processMode = ProcessMode::Reader;
|
||||
|
@@ -94,6 +94,7 @@ public:
|
||||
bool m_useCtrlCStub = false;
|
||||
bool m_belowNormalPriority = false; // internal, dependent on other fields and specific code path
|
||||
bool m_createConsoleOnWindows = false;
|
||||
bool m_forceDefaultErrorMode = false;
|
||||
};
|
||||
|
||||
class QTCREATOR_UTILS_EXPORT ProcessResultData
|
||||
|
@@ -511,7 +511,8 @@ private:
|
||||
handler->setWriteData(m_setup.m_writeData);
|
||||
handler->setNativeArguments(m_setup.m_nativeArguments);
|
||||
handler->setWindowsSpecificStartupFlags(m_setup.m_belowNormalPriority,
|
||||
m_setup.m_createConsoleOnWindows);
|
||||
m_setup.m_createConsoleOnWindows,
|
||||
m_setup.m_forceDefaultErrorMode);
|
||||
|
||||
const QProcessEnvironment penv = m_setup.m_environment.toProcessEnvironment();
|
||||
if (!penv.isEmpty())
|
||||
@@ -1383,6 +1384,16 @@ bool Process::createConsoleOnWindows() const
|
||||
return d->m_setup.m_createConsoleOnWindows;
|
||||
}
|
||||
|
||||
void Process::setForceDefaultErrorModeOnWindows(bool force)
|
||||
{
|
||||
d->m_setup.m_forceDefaultErrorMode = force;
|
||||
}
|
||||
|
||||
bool Process::forceDefaultErrorModeOnWindows() const
|
||||
{
|
||||
return d->m_setup.m_forceDefaultErrorMode;
|
||||
}
|
||||
|
||||
void Process::setExtraData(const QString &key, const QVariant &value)
|
||||
{
|
||||
d->m_setup.m_extraData.insert(key, value);
|
||||
|
@@ -187,6 +187,9 @@ public:
|
||||
void setCreateConsoleOnWindows(bool create);
|
||||
bool createConsoleOnWindows() const;
|
||||
|
||||
void setForceDefaultErrorModeOnWindows(bool force);
|
||||
bool forceDefaultErrorModeOnWindows() const;
|
||||
|
||||
signals:
|
||||
void starting(); // On NotRunning -> Starting state transition
|
||||
void started(); // On Starting -> Running state transition
|
||||
|
@@ -16,8 +16,19 @@
|
||||
#endif
|
||||
|
||||
#ifdef Q_OS_WIN
|
||||
#include <windows.h>
|
||||
#include <psapi.h>
|
||||
#include <windows.h>
|
||||
#endif
|
||||
|
||||
#ifdef Q_OS_MACOS
|
||||
#include <sys/types.h>
|
||||
#include <sys/proc_info.h>
|
||||
#include <sys/sysctl.h>
|
||||
|
||||
#include <chrono>
|
||||
#include <unistd.h>
|
||||
#include <libproc.h>
|
||||
#include <mach/mach_time.h>
|
||||
#endif
|
||||
|
||||
using namespace Utils;
|
||||
@@ -258,9 +269,63 @@ public:
|
||||
: IDataProvider(pid, parent)
|
||||
{}
|
||||
|
||||
double getMemoryConsumption() { return 0; }
|
||||
double getCpuConsumption()
|
||||
{
|
||||
proc_taskallinfo taskAllInfo = {};
|
||||
|
||||
double getCpuConsumption() { return 0; }
|
||||
const int result
|
||||
= proc_pidinfo(m_pid, PROC_PIDTASKALLINFO, 0, &taskAllInfo, sizeof(taskAllInfo));
|
||||
if (result == -1) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
mach_timebase_info_data_t sTimebase;
|
||||
mach_timebase_info(&sTimebase);
|
||||
double timebase_to_ns = (double) sTimebase.numer / (double) sTimebase.denom;
|
||||
|
||||
const double currentTotalCpuTime = ((double) taskAllInfo.ptinfo.pti_total_user
|
||||
+ (double) taskAllInfo.ptinfo.pti_total_system)
|
||||
* timebase_to_ns / 1e9;
|
||||
|
||||
const double cpuUsageDelta = currentTotalCpuTime - m_prevCpuUsage;
|
||||
|
||||
const auto elapsedTime = std::chrono::steady_clock::now() - m_prevTime;
|
||||
const double elapsedTimeSeconds
|
||||
= std::chrono::duration_cast<std::chrono::milliseconds>(elapsedTime).count() / 1000.0;
|
||||
|
||||
m_prevCpuUsage = currentTotalCpuTime;
|
||||
m_prevTime = std::chrono::steady_clock::now();
|
||||
|
||||
return (cpuUsageDelta / elapsedTimeSeconds) * 100.0;
|
||||
}
|
||||
|
||||
double getTotalPhysicalMemory()
|
||||
{
|
||||
int mib[2];
|
||||
size_t length;
|
||||
long long physicalMemory;
|
||||
|
||||
mib[0] = CTL_HW;
|
||||
mib[1] = HW_MEMSIZE;
|
||||
length = sizeof(physicalMemory);
|
||||
sysctl(mib, 2, &physicalMemory, &length, NULL, 0);
|
||||
|
||||
return physicalMemory;
|
||||
}
|
||||
|
||||
double getMemoryConsumption()
|
||||
{
|
||||
proc_taskinfo taskInfo;
|
||||
int result = proc_pidinfo(m_pid, PROC_PIDTASKINFO, 0, &taskInfo, sizeof(taskInfo));
|
||||
if (result == -1)
|
||||
return 0;
|
||||
|
||||
return (taskInfo.pti_resident_size / getTotalPhysicalMemory()) * 100.0;
|
||||
}
|
||||
|
||||
private:
|
||||
std::chrono::steady_clock::time_point m_prevTime = std::chrono::steady_clock::now();
|
||||
double m_prevCpuUsage = 0;
|
||||
};
|
||||
#endif
|
||||
|
||||
|
@@ -328,12 +328,11 @@ Toolchain::MacroInspectionRunner IarToolchain::createMacroInspectionRunner() con
|
||||
|
||||
return [env, compiler, extraArgs, macrosCache, languageId]
|
||||
(const QStringList &flags) {
|
||||
Q_UNUSED(flags)
|
||||
|
||||
Macros macros = dumpPredefinedMacros(compiler, extraArgs, languageId, env);
|
||||
Macros macros = dumpPredefinedMacros(compiler, extraArgs + flags, languageId, env);
|
||||
macros.append({"__intrinsic", "", MacroType::Define});
|
||||
macros.append({"__nounwind", "", MacroType::Define});
|
||||
macros.append({"__noreturn", "", MacroType::Define});
|
||||
macros.append({"__no_init", "", MacroType::Define});
|
||||
macros.append({"__packed", "", MacroType::Define});
|
||||
macros.append({"__spec_string", "", MacroType::Define});
|
||||
macros.append({"__constrange(__a,__b)", "", MacroType::Define});
|
||||
|
@@ -145,7 +145,8 @@ const char G_HELP[] = "QtCreator.Group.Help";
|
||||
// File menu groups
|
||||
const char G_FILE_NEW[] = "QtCreator.Group.File.New";
|
||||
const char G_FILE_OPEN[] = "QtCreator.Group.File.Open";
|
||||
const char G_FILE_SESSION[] = "QtCreator.Group.File.Recent";
|
||||
const char G_FILE_RECENT[] = "QtCreator.Group.File.Recent";
|
||||
const char G_FILE_SESSION[] = "QtCreator.Group.File.Session";
|
||||
const char G_FILE_PROJECT[] = "QtCreator.Group.File.Project";
|
||||
const char G_FILE_SAVE[] = "QtCreator.Group.File.Save";
|
||||
const char G_FILE_EXPORT[] = "QtCreator.Group.File.Export";
|
||||
|
@@ -790,7 +790,7 @@ bool SettingsDialog::execDialog()
|
||||
ICore::settings()->setValueWithDefault(kPreferenceDialogSize, size(), initialSize);
|
||||
// make sure that the current "single" instance is deleted
|
||||
// we can't delete right away, since we still access the m_applied member
|
||||
deleteLater();
|
||||
QMetaObject::invokeMethod(this, [this] { deleteLater(); }, Qt::QueuedConnection);
|
||||
});
|
||||
}
|
||||
|
||||
|
@@ -1629,6 +1629,7 @@ void ICorePrivate::registerDefaultContainers()
|
||||
filemenu->menu()->setTitle(Tr::tr("&File"));
|
||||
filemenu->appendGroup(Constants::G_FILE_NEW);
|
||||
filemenu->appendGroup(Constants::G_FILE_OPEN);
|
||||
filemenu->appendGroup(Constants::G_FILE_RECENT);
|
||||
filemenu->appendGroup(Constants::G_FILE_SESSION);
|
||||
filemenu->appendGroup(Constants::G_FILE_PROJECT);
|
||||
filemenu->appendGroup(Constants::G_FILE_SAVE);
|
||||
@@ -1785,7 +1786,7 @@ void ICorePrivate::registerDefaultActions()
|
||||
|
||||
// File->Recent Files Menu
|
||||
ActionContainer *ac = ActionManager::createMenu(Constants::M_FILE_RECENTFILES);
|
||||
mfile->addMenu(ac, Constants::G_FILE_OPEN);
|
||||
mfile->addMenu(ac, Constants::G_FILE_RECENT);
|
||||
ac->menu()->setTitle(Tr::tr("Recent &Files"));
|
||||
ac->setOnAllDisabledBehavior(ActionContainer::Show);
|
||||
|
||||
|
Before Width: | Height: | Size: 218 B After Width: | Height: | Size: 287 B |
Before Width: | Height: | Size: 362 B After Width: | Height: | Size: 538 B |
Before Width: | Height: | Size: 110 B After Width: | Height: | Size: 111 B |
Before Width: | Height: | Size: 117 B After Width: | Height: | Size: 149 B |
@@ -162,7 +162,7 @@ void checkContents(QPromise<ArchiveIssue> &promise, const FilePath &tempDir)
|
||||
[coreplugin](const PluginDependency &d) { return d.name == coreplugin->name(); });
|
||||
if (found == dependencies.constEnd())
|
||||
return;
|
||||
if (coreplugin->provides(found->name, found->version))
|
||||
if ((*spec)->provides(coreplugin, *found))
|
||||
return;
|
||||
promise.addResult(
|
||||
ArchiveIssue{Tr::tr("Plugin requires an incompatible version of %1 (%2).")
|
||||
|
@@ -744,6 +744,8 @@ void setupCppFileSettings(ExtensionSystem::IPlugin &plugin)
|
||||
|
||||
#ifdef WITH_TESTS
|
||||
plugin.addTestCreator([] { return new CppFileSettingsTest; });
|
||||
#else
|
||||
Q_UNUSED(plugin)
|
||||
#endif
|
||||
}
|
||||
|
||||
|
@@ -1,5 +1,5 @@
|
||||
#ifndef PROJECT_INTERNAL_THECLASS_H
|
||||
#define PROJECT_INTERNAL_THECLASS_H
|
||||
#ifndef THECLASS_H
|
||||
#define THECLASS_H
|
||||
|
||||
namespace Project {
|
||||
namespace Internal {
|
||||
@@ -26,4 +26,4 @@ template<typename T> T TheClass::defaultValue() const { return T(); }
|
||||
} // namespace Internal
|
||||
} // namespace Project
|
||||
|
||||
#endif // PROJECT_INTERNAL_THECLASS_H
|
||||
#endif // THECLASS_H
|
||||
|
@@ -33,6 +33,7 @@ add_qtc_plugin(Debugger
|
||||
dap/dapclient.cpp dap/dapclient.h
|
||||
dap/dapengine.cpp dap/dapengine.h
|
||||
dap/gdbdapengine.cpp dap/gdbdapengine.h
|
||||
dap/lldbdapengine.cpp dap/lldbdapengine.h
|
||||
dap/pydapengine.cpp dap/pydapengine.h
|
||||
debugger.qrc
|
||||
debugger_global.h
|
||||
|
@@ -6,6 +6,7 @@
|
||||
#include "cmakedapengine.h"
|
||||
#include "dapclient.h"
|
||||
#include "gdbdapengine.h"
|
||||
#include "lldbdapengine.h"
|
||||
#include "pydapengine.h"
|
||||
|
||||
#include <debugger/breakhandler.h>
|
||||
@@ -1058,6 +1059,8 @@ DebuggerEngine *createDapEngine(Utils::Id runMode)
|
||||
return new CMakeDapEngine;
|
||||
if (runMode == ProjectExplorer::Constants::DAP_GDB_DEBUG_RUN_MODE)
|
||||
return new GdbDapEngine;
|
||||
if (runMode == ProjectExplorer::Constants::DAP_LLDB_DEBUG_RUN_MODE)
|
||||
return new LldbDapEngine;
|
||||
if (runMode == ProjectExplorer::Constants::DAP_PY_DEBUG_RUN_MODE)
|
||||
return new PyDapEngine;
|
||||
|
||||
|
176
src/plugins/debugger/dap/lldbdapengine.cpp
Normal file
@@ -0,0 +1,176 @@
|
||||
// Copyright (C) 2024 The Qt Company Ltd.
|
||||
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0
|
||||
|
||||
#include "lldbdapengine.h"
|
||||
|
||||
#include "dapclient.h"
|
||||
|
||||
#include <coreplugin/messagemanager.h>
|
||||
|
||||
#include <debugger/debuggermainwindow.h>
|
||||
|
||||
#include <utils/mimeconstants.h>
|
||||
#include <utils/mimeutils.h>
|
||||
#include <utils/temporarydirectory.h>
|
||||
|
||||
#include <projectexplorer/buildconfiguration.h>
|
||||
#include <projectexplorer/buildsystem.h>
|
||||
#include <projectexplorer/projecttree.h>
|
||||
|
||||
#include <QDebug>
|
||||
#include <QLocalSocket>
|
||||
#include <QVersionNumber>
|
||||
|
||||
using namespace Core;
|
||||
using namespace Utils;
|
||||
|
||||
namespace Debugger::Internal {
|
||||
|
||||
// TODO: Same class as in gdbdapengine.cpp. Refactor into one place.
|
||||
class ProcessDataProvider : public IDataProvider
|
||||
{
|
||||
public:
|
||||
ProcessDataProvider(const DebuggerRunParameters &rp,
|
||||
const CommandLine &cmd,
|
||||
QObject *parent = nullptr)
|
||||
: IDataProvider(parent)
|
||||
, m_runParameters(rp)
|
||||
, m_cmd(cmd)
|
||||
{
|
||||
connect(&m_proc, &Process::started, this, &IDataProvider::started);
|
||||
connect(&m_proc, &Process::done, this, &IDataProvider::done);
|
||||
connect(&m_proc,
|
||||
&Process::readyReadStandardOutput,
|
||||
this,
|
||||
&IDataProvider::readyReadStandardOutput);
|
||||
connect(&m_proc,
|
||||
&Process::readyReadStandardError,
|
||||
this,
|
||||
&IDataProvider::readyReadStandardError);
|
||||
}
|
||||
|
||||
~ProcessDataProvider()
|
||||
{
|
||||
m_proc.kill();
|
||||
m_proc.waitForFinished();
|
||||
}
|
||||
|
||||
void start() override
|
||||
{
|
||||
m_proc.setProcessMode(ProcessMode::Writer);
|
||||
if (m_runParameters.debugger.workingDirectory.isDir())
|
||||
m_proc.setWorkingDirectory(m_runParameters.debugger.workingDirectory);
|
||||
m_proc.setEnvironment(m_runParameters.debugger.environment);
|
||||
m_proc.setCommand(m_cmd);
|
||||
m_proc.start();
|
||||
}
|
||||
|
||||
bool isRunning() const override { return m_proc.isRunning(); }
|
||||
void writeRaw(const QByteArray &data) override
|
||||
{
|
||||
if (m_proc.state() == QProcess::Running)
|
||||
m_proc.writeRaw(data);
|
||||
}
|
||||
void kill() override { m_proc.kill(); }
|
||||
QByteArray readAllStandardOutput() override { return m_proc.readAllStandardOutput().toUtf8(); }
|
||||
QString readAllStandardError() override { return m_proc.readAllStandardError(); }
|
||||
int exitCode() const override { return m_proc.exitCode(); }
|
||||
QString executable() const override { return m_proc.commandLine().executable().toUserOutput(); }
|
||||
|
||||
QProcess::ExitStatus exitStatus() const override { return m_proc.exitStatus(); }
|
||||
QProcess::ProcessError error() const override { return m_proc.error(); }
|
||||
Utils::ProcessResult result() const override { return m_proc.result(); }
|
||||
QString exitMessage() const override { return m_proc.exitMessage(); };
|
||||
|
||||
private:
|
||||
Utils::Process m_proc;
|
||||
const DebuggerRunParameters m_runParameters;
|
||||
const CommandLine m_cmd;
|
||||
};
|
||||
|
||||
class LldbDapClient : public DapClient
|
||||
{
|
||||
public:
|
||||
LldbDapClient(IDataProvider *provider, QObject *parent = nullptr)
|
||||
: DapClient(provider, parent)
|
||||
{}
|
||||
|
||||
private:
|
||||
const QLoggingCategory &logCategory() override
|
||||
{
|
||||
static const QLoggingCategory logCategory = QLoggingCategory("qtc.dbg.dapengine.lldb",
|
||||
QtWarningMsg);
|
||||
return logCategory;
|
||||
}
|
||||
};
|
||||
|
||||
LldbDapEngine::LldbDapEngine()
|
||||
: DapEngine()
|
||||
{
|
||||
setObjectName("LldbDapEngine");
|
||||
setDebuggerName("LLDB");
|
||||
setDebuggerType("DAP");
|
||||
}
|
||||
|
||||
void LldbDapEngine::handleDapInitialize()
|
||||
{
|
||||
if (!isLocalAttachEngine()) {
|
||||
DapEngine::handleDapInitialize();
|
||||
return;
|
||||
}
|
||||
|
||||
QTC_ASSERT(state() == EngineRunRequested, qCDebug(logCategory()) << state());
|
||||
m_dapClient->postRequest("attach", QJsonObject{{"__restart", ""}});
|
||||
qCDebug(logCategory()) << "handleDapAttach";
|
||||
}
|
||||
|
||||
bool LldbDapEngine::isLocalAttachEngine() const
|
||||
{
|
||||
return runParameters().startMode == AttachToLocalProcess;
|
||||
}
|
||||
|
||||
void LldbDapEngine::handleDapConfigurationDone()
|
||||
{
|
||||
if (!isLocalAttachEngine()) {
|
||||
DapEngine::handleDapConfigurationDone();
|
||||
return;
|
||||
}
|
||||
|
||||
notifyEngineRunAndInferiorStopOk();
|
||||
}
|
||||
|
||||
void LldbDapEngine::setupEngine()
|
||||
{
|
||||
QTC_ASSERT(state() == EngineSetupRequested, qCDebug(logCategory()) << state());
|
||||
|
||||
const DebuggerRunParameters &rp = runParameters();
|
||||
CommandLine cmd{rp.debugger.command.executable()};
|
||||
|
||||
if (isLocalAttachEngine())
|
||||
cmd.addArgs({"--debugger-pid", QString::number(rp.attachPID.pid())});
|
||||
|
||||
IDataProvider *dataProvider = new ProcessDataProvider(rp, cmd, this);
|
||||
m_dapClient = new LldbDapClient(dataProvider, this);
|
||||
|
||||
connectDataGeneratorSignals();
|
||||
m_dapClient->dataProvider()->start();
|
||||
}
|
||||
|
||||
bool LldbDapEngine::acceptsBreakpoint(const BreakpointParameters &bp) const
|
||||
{
|
||||
const auto mimeType = Utils::mimeTypeForFile(bp.fileName);
|
||||
return mimeType.matchesName(Utils::Constants::C_HEADER_MIMETYPE)
|
||||
|| mimeType.matchesName(Utils::Constants::C_SOURCE_MIMETYPE)
|
||||
|| mimeType.matchesName(Utils::Constants::CPP_HEADER_MIMETYPE)
|
||||
|| mimeType.matchesName(Utils::Constants::CPP_SOURCE_MIMETYPE)
|
||||
|| bp.type == BreakpointByFunction;
|
||||
}
|
||||
|
||||
const QLoggingCategory &LldbDapEngine::logCategory()
|
||||
{
|
||||
static const QLoggingCategory logCategory = QLoggingCategory("qtc.dbg.dapengine.lldb",
|
||||
QtWarningMsg);
|
||||
return logCategory;
|
||||
}
|
||||
|
||||
} // namespace Debugger::Internal
|
26
src/plugins/debugger/dap/lldbdapengine.h
Normal file
@@ -0,0 +1,26 @@
|
||||
// Copyright (C) 2024 The Qt Company Ltd.
|
||||
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "dapengine.h"
|
||||
|
||||
namespace Debugger::Internal {
|
||||
|
||||
class LldbDapEngine : public DapEngine
|
||||
{
|
||||
public:
|
||||
LldbDapEngine();
|
||||
|
||||
private:
|
||||
void setupEngine() override;
|
||||
|
||||
void handleDapInitialize() override;
|
||||
void handleDapConfigurationDone() override;
|
||||
|
||||
bool isLocalAttachEngine() const;
|
||||
bool acceptsBreakpoint(const BreakpointParameters &bp) const override;
|
||||
const QLoggingCategory &logCategory() override;
|
||||
};
|
||||
|
||||
} // Debugger::Internal
|
@@ -123,6 +123,7 @@ QtcPlugin {
|
||||
"dapclient.cpp", "dapclient.h",
|
||||
"dapengine.cpp", "dapengine.h",
|
||||
"gdbdapengine.cpp", "gdbdapengine.h",
|
||||
"lldbdapengine.cpp", "lldbdapengine.h",
|
||||
"pydapengine.cpp", "pydapengine.h",
|
||||
]
|
||||
}
|
||||
|
@@ -147,27 +147,16 @@ void DebuggerItem::reinitializeFromFile(QString *error, Utils::Environment *cust
|
||||
|
||||
Environment env = customEnv ? *customEnv : m_command.deviceEnvironment();
|
||||
|
||||
// Prevent calling lldb on Windows because the lldb from the llvm package is linked against
|
||||
// python but does not contain a python dll.
|
||||
const bool isAndroidNdkLldb = DebuggerItem::addAndroidLldbPythonEnv(m_command, env);
|
||||
const FilePath qtcreatorLldb = Core::ICore::lldbExecutable(CLANG_BINDIR);
|
||||
if (HostOsInfo::isWindowsHost() && m_command.fileName().startsWith("lldb") && !isAndroidNdkLldb
|
||||
&& qtcreatorLldb != m_command) {
|
||||
QString errorMessage;
|
||||
m_version = winGetDLLVersion(WinDLLFileVersion,
|
||||
m_command.absoluteFilePath().path(),
|
||||
&errorMessage);
|
||||
m_engineType = LldbEngineType;
|
||||
m_abis = Abi::abisOfBinary(m_command);
|
||||
return;
|
||||
}
|
||||
|
||||
// QNX gdb unconditionally checks whether the QNX_TARGET env variable is
|
||||
// set and bails otherwise, even when it is not used by the specific
|
||||
// codepath triggered by the --version and --configuration arguments. The
|
||||
// hack below tricks it into giving us the information we want.
|
||||
env.set("QNX_TARGET", QString());
|
||||
|
||||
// On Windows, we need to prevent the Windows Error Reporting dialog from
|
||||
// popping up when a candidate is missing required DLLs.
|
||||
WindowsCrashDialogBlocker blocker;
|
||||
|
||||
Process proc;
|
||||
proc.setEnvironment(env);
|
||||
proc.setCommand({m_command, {version}});
|
||||
|
@@ -1224,6 +1224,7 @@ void DebuggerPluginPrivate::createDapDebuggerPerspective(QWidget *globalLogWindo
|
||||
ProjectExplorer::Constants::DAP_CMAKE_DEBUG_RUN_MODE,
|
||||
/*forceSkipDeploy=*/true},
|
||||
DapPerspective{Tr::tr("GDB Preset"), ProjectExplorer::Constants::DAP_GDB_DEBUG_RUN_MODE},
|
||||
DapPerspective{Tr::tr("LLDB Preset"), ProjectExplorer::Constants::DAP_LLDB_DEBUG_RUN_MODE},
|
||||
DapPerspective{Tr::tr("Python Preset"), ProjectExplorer::Constants::DAP_PY_DEBUG_RUN_MODE},
|
||||
};
|
||||
|
||||
|
@@ -1096,6 +1096,7 @@ DebuggerRunWorkerFactory::DebuggerRunWorkerFactory()
|
||||
addSupportedRunMode(ProjectExplorer::Constants::DEBUG_RUN_MODE);
|
||||
addSupportedRunMode(ProjectExplorer::Constants::DAP_CMAKE_DEBUG_RUN_MODE);
|
||||
addSupportedRunMode(ProjectExplorer::Constants::DAP_GDB_DEBUG_RUN_MODE);
|
||||
addSupportedRunMode(ProjectExplorer::Constants::DAP_LLDB_DEBUG_RUN_MODE);
|
||||
addSupportedDeviceType(ProjectExplorer::Constants::DESKTOP_DEVICE_TYPE);
|
||||
addSupportedDeviceType("DockerDeviceType");
|
||||
|
||||
|
Before Width: | Height: | Size: 97 B After Width: | Height: | Size: 124 B |
Before Width: | Height: | Size: 101 B After Width: | Height: | Size: 166 B |
Before Width: | Height: | Size: 157 B After Width: | Height: | Size: 163 B |
Before Width: | Height: | Size: 202 B After Width: | Height: | Size: 278 B |
Before Width: | Height: | Size: 100 B After Width: | Height: | Size: 126 B |
Before Width: | Height: | Size: 105 B After Width: | Height: | Size: 173 B |
Before Width: | Height: | Size: 100 B After Width: | Height: | Size: 122 B |
Before Width: | Height: | Size: 104 B After Width: | Height: | Size: 167 B |
Before Width: | Height: | Size: 282 B After Width: | Height: | Size: 238 B |
Before Width: | Height: | Size: 531 B After Width: | Height: | Size: 453 B |
@@ -1502,7 +1502,7 @@ void FakeVimPlugin::editorOpened(IEditor *editor)
|
||||
|
||||
handler->modeChanged.set([tew, this, editor](bool insertMode) {
|
||||
HandlerAndData &handlerAndData = m_editorToHandler[editor];
|
||||
if (!handlerAndData.handler->inFakeVimMode())
|
||||
if (!handlerAndData.handler || !handlerAndData.handler->inFakeVimMode())
|
||||
return;
|
||||
|
||||
// We don't want to show suggestions unless we are in insert mode.
|
||||
@@ -1651,11 +1651,13 @@ void FakeVimPlugin::editorOpened(IEditor *editor)
|
||||
keepOnlyWindow();
|
||||
else if (key == "P" || key == "<C-P>")
|
||||
triggerAction(Core::Constants::GOTO_PREV_SPLIT);
|
||||
else if (key == "S" || key == "<C-S>")
|
||||
else if (key == "S" || key == "<C-S>") {
|
||||
triggerAction(Core::Constants::SPLIT);
|
||||
else if (key == "V" || key == "<C-V>")
|
||||
updateAllHightLights();
|
||||
} else if (key == "V" || key == "<C-V>") {
|
||||
triggerAction(Core::Constants::SPLIT_SIDE_BY_SIDE);
|
||||
else if (key == "W" || key == "<C-W>")
|
||||
updateAllHightLights();
|
||||
} else if (key == "W" || key == "<C-W>")
|
||||
triggerAction(Core::Constants::GOTO_NEXT_SPLIT);
|
||||
else if (key.contains("RIGHT") || key == "L" || key == "<S-L>" || key == "<C-L>")
|
||||
moveSomewhere(handler, &moveRightWeight, key == "<S-L>" ? -1 : count);
|
||||
|
Before Width: | Height: | Size: 312 B After Width: | Height: | Size: 353 B |
Before Width: | Height: | Size: 614 B After Width: | Height: | Size: 748 B |
@@ -73,6 +73,7 @@ expected_str<QMap<QString, QString>> parseDeviceInfo(const QByteArray &rawOutput
|
||||
info[kOsVersion] = QLatin1String("%1 (%2)")
|
||||
.arg(device["deviceProperties"]["osVersionNumber"].toString(),
|
||||
device["deviceProperties"]["osBuildUpdate"].toString());
|
||||
info[kProductType] = device["hardwareProperties"]["productType"].toString();
|
||||
info[kCpuArchitecture] = device["hardwareProperties"]["cpuType"]["name"].toString();
|
||||
info[kUniqueDeviceId] = udid;
|
||||
return info;
|
||||
|
@@ -13,6 +13,7 @@ const char kDeviceName[] = "deviceName";
|
||||
const char kDeveloperStatus[] = "developerStatus";
|
||||
const char kDeviceConnected[] = "deviceConnected";
|
||||
const char kOsVersion[] = "osVersion";
|
||||
const char kProductType[] = "productType";
|
||||
const char kCpuArchitecture[] = "cpuArchitecture";
|
||||
const char kUniqueDeviceId[] = "uniqueDeviceId";
|
||||
const char vOff[] = "*off*";
|
||||
|
@@ -92,8 +92,9 @@ public:
|
||||
Form {
|
||||
Tr::tr("Device name:"), iosDevice->deviceName(), br,
|
||||
Tr::tr("Identifier:"), iosDevice->uniqueInternalDeviceId(), br,
|
||||
Tr::tr("Product type:"), iosDevice->productType(), br,
|
||||
Tr::tr("CPU Architecture:"), iosDevice->cpuArchitecture(), br,
|
||||
Tr::tr("OS Version:"), iosDevice->osVersion(), br,
|
||||
Tr::tr("CPU Architecture:"), iosDevice->cpuArchitecture(),
|
||||
noMargin
|
||||
}.attachTo(this);
|
||||
// clang-format on
|
||||
@@ -193,6 +194,11 @@ QString IosDevice::osVersion() const
|
||||
return m_extraInfo.value(kOsVersion);
|
||||
}
|
||||
|
||||
QString IosDevice::productType() const
|
||||
{
|
||||
return m_extraInfo.value(kProductType);
|
||||
}
|
||||
|
||||
QString IosDevice::cpuArchitecture() const
|
||||
{
|
||||
return m_extraInfo.value(kCpuArchitecture);
|
||||
@@ -227,6 +233,7 @@ IosDeviceManager::TranslationMap IosDeviceManager::translationMap()
|
||||
tMap[QLatin1String("NO")] = Tr::tr("no");
|
||||
tMap[QLatin1String("*unknown*")] = Tr::tr("unknown");
|
||||
tMap[kOsVersion] = Tr::tr("OS version");
|
||||
tMap[kProductType] = Tr::tr("Product type");
|
||||
translationMap = &tMap;
|
||||
return tMap;
|
||||
}
|
||||
|
@@ -37,6 +37,7 @@ public:
|
||||
QString uniqueDeviceID() const;
|
||||
QString uniqueInternalDeviceId() const;
|
||||
QString osVersion() const;
|
||||
QString productType() const;
|
||||
QString cpuArchitecture() const;
|
||||
Utils::Port nextPort() const;
|
||||
Handler handler() const;
|
||||
|
@@ -813,14 +813,17 @@ void IosDebugSupport::start()
|
||||
setStartMode(AttachToRemoteProcess);
|
||||
setIosPlatform("remote-ios");
|
||||
const QString osVersion = dev->osVersion();
|
||||
const QString productType = dev->productType();
|
||||
const QString cpuArchitecture = dev->cpuArchitecture();
|
||||
const FilePaths symbolsPathCandidates = {
|
||||
FilePath::fromString(QDir::homePath() + "/Library/Developer/Xcode/iOS DeviceSupport/"
|
||||
+ osVersion + " " + cpuArchitecture + "/Symbols"),
|
||||
FilePath::fromString(QDir::homePath() + "/Library/Developer/Xcode/iOS DeviceSupport/"
|
||||
+ osVersion + "/Symbols"),
|
||||
IosConfigurations::developerPath().pathAppended(
|
||||
"Platforms/iPhoneOS.platform/DeviceSupport/" + osVersion + "/Symbols")};
|
||||
const FilePath home = FilePath::fromString(QDir::homePath());
|
||||
const FilePaths symbolsPathCandidates
|
||||
= {home / "Library/Developer/Xcode/iOS DeviceSupport" / (productType + " " + osVersion)
|
||||
/ "Symbols",
|
||||
home / "Library/Developer/Xcode/iOS DeviceSupport"
|
||||
/ (osVersion + " " + cpuArchitecture) / "Symbols",
|
||||
home / "Library/Developer/Xcode/iOS DeviceSupport" / osVersion / "Symbols",
|
||||
IosConfigurations::developerPath() / "Platforms/iPhoneOS.platform/DeviceSupport"
|
||||
/ osVersion / "Symbols"};
|
||||
const FilePath deviceSdk = Utils::findOrDefault(symbolsPathCandidates, &FilePath::isDir);
|
||||
|
||||
if (deviceSdk.isEmpty()) {
|
||||
|
@@ -6,7 +6,7 @@ The Lua plugin provides support for writing plugins using the Lua scripting lang
|
||||
|
||||
## Usage
|
||||
|
||||
The plugin scans the folder `lua-plugins` folder inside the normal plugin folder of Qt Creator
|
||||
The plugin scans the normal plugin folders of Qt Creator
|
||||
`ExtensionSystem::PluginManager::pluginPaths()`. It loads scripts from any folder that contains
|
||||
a .lua script named the same as the folder.
|
||||
Whether or not the script is enabled is determined by the `disabledByDefault` field in the plugin
|
||||
@@ -17,7 +17,7 @@ table and the settings configured via the "About Plugins" dialog in Qt Creator.
|
||||
A Lua script needs to provide the following table to be considered a plugin:
|
||||
|
||||
```lua
|
||||
-- lua-plugins/myluaplugin/myluaplugin.lua
|
||||
-- myluaplugin/myluaplugin.lua
|
||||
return {
|
||||
name = "MyLuaPlugin",
|
||||
version = "1.0.0",
|
||||
@@ -40,7 +40,7 @@ Can contain newlines.
|
||||
disabledByDefault = false,
|
||||
|
||||
dependencies = {
|
||||
{ name="Core", version = "12.0.0" }
|
||||
{ name="Core", version = "14.0.0" }
|
||||
},
|
||||
} --[[@as QtcPlugin]]
|
||||
```
|
||||
@@ -50,13 +50,13 @@ It must only return the plugin specification table and not execute or require an
|
||||
Use `require` to load other files from within the setup function.
|
||||
|
||||
```lua
|
||||
-- lua-plugins/myluaplugin/myluaplugin.lua
|
||||
-- myluaplugin/myluaplugin.lua
|
||||
return {
|
||||
-- ... required fields omitted ..
|
||||
setup = function() require 'init'.setup() end,
|
||||
} --[[@as QtcPlugin]]
|
||||
|
||||
-- lua-plugins/myluaplugin/init.lua
|
||||
-- myluaplugin/init.lua
|
||||
local function setup()
|
||||
print("Hello from Lua!")
|
||||
end
|
||||
|
@@ -49,24 +49,6 @@ public:
|
||||
}
|
||||
};
|
||||
|
||||
struct Arguments
|
||||
{
|
||||
std::optional<FilePath> loadPlugin;
|
||||
};
|
||||
|
||||
Arguments parseArguments(const QStringList &arguments)
|
||||
{
|
||||
Arguments args;
|
||||
for (int i = 0; i < arguments.size() - 1; ++i) {
|
||||
if (arguments.at(i) == QLatin1String("-loadluaplugin")) {
|
||||
const QString path(arguments.at(i + 1));
|
||||
args.loadPlugin = FilePath::fromUserInput(path);
|
||||
i++; // skip the argument
|
||||
}
|
||||
}
|
||||
return args;
|
||||
}
|
||||
|
||||
class LuaPlugin : public IPlugin
|
||||
{
|
||||
Q_OBJECT
|
||||
@@ -74,18 +56,15 @@ class LuaPlugin : public IPlugin
|
||||
|
||||
private:
|
||||
std::unique_ptr<LuaEngine> m_luaEngine;
|
||||
Arguments m_arguments;
|
||||
|
||||
public:
|
||||
LuaPlugin() {}
|
||||
~LuaPlugin() override = default;
|
||||
|
||||
bool initialize(const QStringList &arguments, QString *) final
|
||||
void initialize() final
|
||||
{
|
||||
m_luaEngine.reset(new LuaEngine());
|
||||
|
||||
m_arguments = parseArguments(arguments);
|
||||
|
||||
addAsyncModule();
|
||||
addFetchModule();
|
||||
addActionModule();
|
||||
@@ -100,27 +79,25 @@ public:
|
||||
addInstallModule();
|
||||
|
||||
Core::JsExpander::registerGlobalObject("Lua", [] { return new LuaJsExtension(); });
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool delayedInitialize() final
|
||||
{
|
||||
scanForPlugins(transform(PluginManager::pluginPaths(), [](const FilePath &path) {
|
||||
return path / "lua-plugins";
|
||||
}));
|
||||
|
||||
scanForPlugins(PluginManager::pluginPaths());
|
||||
return true;
|
||||
}
|
||||
|
||||
void scanForPlugins(const FilePaths &paths)
|
||||
void scanForPlugins(const FilePaths &pluginPaths)
|
||||
{
|
||||
QSet<PluginSpec *> plugins;
|
||||
for (const FilePath &path : paths) {
|
||||
for (const FilePath &path : pluginPaths) {
|
||||
FilePaths folders = path.dirEntries(FileFilter({}, QDir::Dirs | QDir::NoDotAndDotDot));
|
||||
|
||||
for (const FilePath &folder : folders) {
|
||||
const FilePath script = folder / (folder.baseName() + ".lua");
|
||||
if (!script.exists())
|
||||
continue;
|
||||
|
||||
const expected_str<LuaPluginSpec *> result = m_luaEngine->loadPlugin(script);
|
||||
|
||||
if (!result) {
|
||||
@@ -135,23 +112,6 @@ public:
|
||||
}
|
||||
}
|
||||
|
||||
if (m_arguments.loadPlugin) {
|
||||
const FilePath folder = *m_arguments.loadPlugin;
|
||||
const FilePath script = folder / (folder.baseName() + ".lua");
|
||||
const expected_str<LuaPluginSpec *> result = m_luaEngine->loadPlugin(script);
|
||||
|
||||
if (!result) {
|
||||
qWarning() << "Failed to load plugin" << script << ":" << result.error();
|
||||
MessageManager::writeFlashing(tr("Failed to load plugin %1: %2")
|
||||
.arg(script.toUserOutput())
|
||||
.arg(result.error()));
|
||||
|
||||
} else {
|
||||
(*result)->setEnabledBySettings(true);
|
||||
plugins.insert(*result);
|
||||
}
|
||||
}
|
||||
|
||||
PluginManager::addPlugins({plugins.begin(), plugins.end()});
|
||||
PluginManager::loadPluginsAtRuntime(plugins);
|
||||
}
|
||||
|
@@ -9,6 +9,7 @@
|
||||
#include <extensionsystem/extensionsystemtr.h>
|
||||
|
||||
#include <utils/algorithm.h>
|
||||
#include <utils/appinfo.h>
|
||||
#include <utils/expected.h>
|
||||
|
||||
#include <QJsonDocument>
|
||||
@@ -76,6 +77,19 @@ ExtensionSystem::IPlugin *LuaPluginSpec::plugin() const
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
bool LuaPluginSpec::provides(PluginSpec *spec, const PluginDependency &dependency) const
|
||||
{
|
||||
if (QString::compare(dependency.name, spec->name(), Qt::CaseInsensitive) != 0)
|
||||
return false;
|
||||
|
||||
// Since we first released the lua support with Qt Creator 14.0.0, but the internal version
|
||||
// number was still 13.0.82, we needed to special case this version.
|
||||
if (versionCompare(dependency.version, "14.0.0") <= 0)
|
||||
return true;
|
||||
|
||||
return (versionCompare(spec->version(), dependency.version) >= 0);
|
||||
}
|
||||
|
||||
// LuaPluginSpec::For internal use {}
|
||||
bool LuaPluginSpec::loadLibrary()
|
||||
{
|
||||
|
@@ -44,6 +44,9 @@ public:
|
||||
|
||||
ExtensionSystem::IPlugin *plugin() const override;
|
||||
|
||||
bool provides(
|
||||
PluginSpec *spec, const ExtensionSystem::PluginDependency &dependency) const override;
|
||||
|
||||
// For internal use only
|
||||
bool loadLibrary() override;
|
||||
bool initializePlugin() override;
|
||||
|
@@ -4,30 +4,30 @@ local action = {}
|
||||
|
||||
---@enum CommandAttributes
|
||||
action.CommandAttribute = {
|
||||
---Hide the command from the menu
|
||||
---Hide the command from the menu.
|
||||
CA_Hide = 1,
|
||||
---Update the text of the command
|
||||
---Update the text of the command.
|
||||
CA_UpdateText = 2,
|
||||
---Update the icon of the command
|
||||
---Update the icon of the command.
|
||||
CA_UpdateIcon = 4,
|
||||
---The command cannot be configured
|
||||
---The command cannot be configured.
|
||||
CA_NonConfigurable = 8,
|
||||
}
|
||||
|
||||
---@class ActionOptions
|
||||
---@field context? string The context in which the action is available
|
||||
---@field text? string The text to display for the action
|
||||
---@field iconText? string The icon text to display for the action
|
||||
---@field toolTip? string The tooltip to display for the action
|
||||
---@field onTrigger? function The callback to call when the action is triggered
|
||||
---@field commandAttributes? CommandAttributes The attributes of the action
|
||||
---@field commandDescription? string The description of the command
|
||||
---@field defaultKeySequence? string The default key sequence for the action
|
||||
---@field defaultKeySequences? string[] The default key sequences for the action
|
||||
---@field context? string The context in which the action is available.
|
||||
---@field text? string The text to display for the action.
|
||||
---@field iconText? string The icon text to display for the action.
|
||||
---@field toolTip? string The tooltip to display for the action.
|
||||
---@field onTrigger? function The callback to call when the action is triggered.
|
||||
---@field commandAttributes? CommandAttributes The attributes of the action.
|
||||
---@field commandDescription? string The description of the command.
|
||||
---@field defaultKeySequence? string The default key sequence for the action.
|
||||
---@field defaultKeySequences? string[] The default key sequences for the action.
|
||||
local ActionOptions = {}
|
||||
|
||||
---Creates a new Action
|
||||
---@param id string The id of the action
|
||||
---Creates a new Action.
|
||||
---@param id string The id of the action.
|
||||
---@param options ActionOptions
|
||||
function action.create(id, options) end
|
||||
|
||||
|
@@ -20,7 +20,7 @@ local async = {}
|
||||
function async.sync(func) end
|
||||
|
||||
---@async
|
||||
---Calls an async function and waits for it to finish. **Must** be called from async.sync()
|
||||
---Calls an async function and waits for it to finish. **Must** be called from async.sync().
|
||||
---
|
||||
--- Example:
|
||||
--- ```lua
|
||||
@@ -39,7 +39,7 @@ function async.sync(func) end
|
||||
function async.wait(func) end
|
||||
|
||||
---@async
|
||||
---Calls multiple async functions and waits for all of them to finish. **Must** be called from async.sync()
|
||||
---Calls multiple async functions and waits for all of them to finish. **Must** be called from async.sync().
|
||||
---
|
||||
--- Example:
|
||||
--- ```lua
|
||||
|
@@ -16,10 +16,10 @@ Core.GeneratedFile.Attribute = {
|
||||
---@field filePath FilePath
|
||||
---@field contents string
|
||||
---@field isBinary boolean
|
||||
---@field attributes Attribute A combination of Attribute
|
||||
---@field attributes Attribute A combination of Attribute.
|
||||
Core.GeneratedFile = {}
|
||||
|
||||
---Create a new GeneratedFile
|
||||
---Create a new GeneratedFile.
|
||||
---@return GeneratedFile
|
||||
function Core.GeneratedFile.new() end
|
||||
|
||||
|
@@ -1,12 +1,12 @@
|
||||
---@meta Fetch
|
||||
local Fetch = {}
|
||||
|
||||
---A network reply from fetch
|
||||
---A network reply from fetch.
|
||||
---@class QNetworkReply
|
||||
---@field error integer The error code of the reply or 0 if no error
|
||||
---@field error integer The error code of the reply or 0 if no error.
|
||||
local QNetworkReply = {}
|
||||
|
||||
---Returns the data of the reply
|
||||
---Returns the data of the reply.
|
||||
---@return string
|
||||
function QNetworkReply:readAll() end
|
||||
|
||||
@@ -16,15 +16,15 @@ function QNetworkReply:readAll() end
|
||||
function Fetch.fetch(options) end
|
||||
|
||||
--@param options FetchOptions
|
||||
--@param callback function The callback to call when the fetch is done
|
||||
--@param callback function The callback to call when the fetch is done.
|
||||
function Fetch.fetch_cb(options, callback) end
|
||||
|
||||
---@class FetchOptions
|
||||
---@field url string The url to fetch
|
||||
---@field method? string The method to use (GET, POST, ...), default is GET
|
||||
---@field headers? table The headers to send
|
||||
---@field body? string The body to send
|
||||
---@field convertToTable? boolean If true, the resulting data will expect JSON and converted it to a table
|
||||
---@field url string The url to fetch.
|
||||
---@field method? string The method to use (GET, POST, ...), default is GET.
|
||||
---@field headers? table The headers to send.
|
||||
---@field body? string The body to send.
|
||||
---@field convertToTable? boolean If true, the resulting data will expect JSON and converted it to a table.
|
||||
local FetchOptions = {}
|
||||
|
||||
return Fetch
|
||||
|
@@ -2,11 +2,11 @@
|
||||
|
||||
local gui = {}
|
||||
|
||||
---The base class of all ui related classes
|
||||
---The base class of all ui related classes.
|
||||
---@class Object
|
||||
gui.Object = {}
|
||||
|
||||
---The base class of all gui layout classes
|
||||
---The base class of all gui layout classes.
|
||||
---@class Layout : Object
|
||||
gui.Layout = {}
|
||||
|
||||
@@ -26,14 +26,14 @@ local column = {}
|
||||
---@return Column
|
||||
function gui.Column(children) end
|
||||
|
||||
---A group box with a title
|
||||
---A group box with a title.
|
||||
---@class Group : Widget
|
||||
local group = {}
|
||||
|
||||
---@return Group
|
||||
function gui.Group(children) end
|
||||
|
||||
---Row layout
|
||||
---Row layout.
|
||||
---@class Row : Layout
|
||||
local row = {}
|
||||
|
||||
@@ -41,7 +41,7 @@ local row = {}
|
||||
---@return Row
|
||||
function gui.Row(children) end
|
||||
|
||||
---Flow layout
|
||||
---Flow layout.
|
||||
---@class Flow : Layout
|
||||
local flow = {}
|
||||
|
||||
@@ -49,7 +49,7 @@ local flow = {}
|
||||
---@return Flow
|
||||
function gui.Flow(children) end
|
||||
|
||||
---Grid layout
|
||||
---Grid layout.
|
||||
---@class Grid : Layout
|
||||
local grid = {}
|
||||
|
||||
@@ -57,7 +57,7 @@ local grid = {}
|
||||
---@return Grid
|
||||
function gui.Grid(children) end
|
||||
|
||||
---Form layout
|
||||
---Form layout.
|
||||
---@class Form : Layout
|
||||
local form = {}
|
||||
|
||||
@@ -66,7 +66,7 @@ local form = {}
|
||||
function gui.Form(children) end
|
||||
|
||||
|
||||
---A stack of multiple widgets
|
||||
---A stack of multiple widgets.
|
||||
---@class Stack : Widget
|
||||
local stack = {}
|
||||
|
||||
@@ -74,7 +74,7 @@ local stack = {}
|
||||
---@return Stack
|
||||
function gui.Stack(children) end
|
||||
|
||||
---A Tab widget
|
||||
---A Tab widget.
|
||||
---@class Tab : Widget
|
||||
local tab = {}
|
||||
|
||||
@@ -82,7 +82,7 @@ local tab = {}
|
||||
---@return Tab
|
||||
function gui.Tab(children) end
|
||||
|
||||
---A Multiline text edit
|
||||
---A Multiline text edit.
|
||||
---@class TextEdit : Widget
|
||||
local textEdit = {}
|
||||
|
||||
@@ -90,7 +90,6 @@ local textEdit = {}
|
||||
---@return TextEdit
|
||||
function gui.TextEdit(children) end
|
||||
|
||||
---A PushButton
|
||||
---@class PushButton : Widget
|
||||
local pushButton = {}
|
||||
|
||||
@@ -98,7 +97,6 @@ local pushButton = {}
|
||||
---@return PushButton
|
||||
function gui.PushButton(children) end
|
||||
|
||||
---A Label
|
||||
---@class Label : LayoutItem
|
||||
local label = {}
|
||||
|
||||
@@ -106,7 +104,6 @@ local label = {}
|
||||
---@return Label
|
||||
function gui.Label(children) end
|
||||
|
||||
---A SpinBox
|
||||
---@class SpinBox : Widget
|
||||
local spinBox = {}
|
||||
|
||||
@@ -114,7 +111,6 @@ local spinBox = {}
|
||||
---@return SpinBox
|
||||
function gui.SpinBox(children) end
|
||||
|
||||
---A Splitter
|
||||
---@class Splitter : Widget
|
||||
local splitter = {}
|
||||
|
||||
@@ -122,7 +118,6 @@ local splitter = {}
|
||||
---@return Splitter
|
||||
function gui.Splitter(children) end
|
||||
|
||||
---A Toolbar
|
||||
---@class ToolBar : Widget
|
||||
local toolBar = {}
|
||||
|
||||
@@ -130,7 +125,6 @@ local toolBar = {}
|
||||
---@return ToolBar
|
||||
function gui.ToolBar(children) end
|
||||
|
||||
---A TabWidget
|
||||
---@class TabWidget : Widget
|
||||
local tabWidget = {}
|
||||
|
||||
@@ -142,40 +136,40 @@ function gui.TabWidget(children) end
|
||||
---@param child Layout|string|BaseAspect|function
|
||||
---@return TabWidget
|
||||
function gui.TabWidget(name, child) end
|
||||
---A "Line break" in the gui
|
||||
---A "Line break" in the gui.
|
||||
function gui.br() end
|
||||
|
||||
---A "Stretch" in the layout
|
||||
---A "Stretch" in the layout.
|
||||
function gui.st() end
|
||||
|
||||
---An empty grid cell in a grid layout
|
||||
---An empty grid cell in a grid layout.
|
||||
function gui.empty() end
|
||||
|
||||
---A horizontal line in the layout
|
||||
---A horizontal line in the layout.
|
||||
function gui.hr() end
|
||||
|
||||
---Clears the margin of the layout
|
||||
---Clears the margin of the layout.
|
||||
function gui.noMargin() end
|
||||
|
||||
---Sets the margin of the layout to the default value
|
||||
---Sets the margin of the layout to the default value.
|
||||
function gui.normalMargin() end
|
||||
|
||||
---Sets the alignment of a Grid layout according to the Form layout rules
|
||||
---Sets the alignment of a Grid layout according to the Form layout rules.
|
||||
function gui.withFormAlignment() end
|
||||
|
||||
---Sets the size of the parent object if possible
|
||||
---Sets the size of the parent object if possible.
|
||||
function gui.resize(width, height) end
|
||||
|
||||
---Sets the spacing of the gui
|
||||
---Sets the spacing of the gui.
|
||||
function gui.spacing(spacing) end
|
||||
|
||||
---Sets the field growth policy of the gui
|
||||
---Sets the field growth policy of the gui.
|
||||
function gui.fieldGrowthPolicy(policy) end
|
||||
|
||||
---Sets the onClicked handler of the parent object if possible
|
||||
---Sets the onClicked handler of the parent object if possible.
|
||||
function gui.onClicked(f) end
|
||||
|
||||
---Sets the onTextChanged handler of the parent object if possible
|
||||
---Sets the onTextChanged handler of the parent object if possible.
|
||||
function gui.onTextChanged(f) end
|
||||
|
||||
return gui
|
||||
|
@@ -3,26 +3,26 @@
|
||||
local Install = {}
|
||||
|
||||
---@class PackageInfo
|
||||
---@field name string The name of the package
|
||||
---@field version string The version of the package
|
||||
---@field path FilePath The path to the package
|
||||
---@field name string The name of the package.
|
||||
---@field version string The version of the package.
|
||||
---@field path FilePath The path to the package.
|
||||
|
||||
local PackageInfo = {}
|
||||
---@class InstallOptions
|
||||
---@field name string The name of the package to install
|
||||
---@field url string The url to fetch the package from
|
||||
---@field version string The version of the package to install
|
||||
---@field name string The name of the package to install.
|
||||
---@field url string The url to fetch the package from.
|
||||
---@field version string The version of the package to install.
|
||||
local InstallOptions = {}
|
||||
|
||||
---Install something
|
||||
---@param msg string The message to display to the user asking for permission to install
|
||||
---@param options InstallOptions|[InstallOptions] The options to install
|
||||
---@return boolean Result Whether the installation was successful
|
||||
---@param msg string The message to display to the user asking for permission to install.
|
||||
---@param options InstallOptions|[InstallOptions] The options to install.
|
||||
---@return boolean Result Whether the installation was successful.
|
||||
---@return string Error The error message if the installation failed.
|
||||
function Install.install(msg, options) end
|
||||
|
||||
---Get the package info
|
||||
---@param name any The name of the package
|
||||
---@param name any The name of the package.
|
||||
---@return PackageInfo
|
||||
function Install.packageInfo(name) end
|
||||
|
||||
|
@@ -1,38 +1,38 @@
|
||||
---@meta LSP
|
||||
---@meta LSP.
|
||||
|
||||
local lsp = {}
|
||||
|
||||
---@class ClientOptions
|
||||
---@field name string The name under which to register the language server.
|
||||
---@field cmd function|string[] The command to start the language server, or a function returning a string[].
|
||||
---@field transport? "stdio"|"localsocket" Defaults to stdio
|
||||
---@field serverName? string The socket path when transport == "localsocket"
|
||||
---@field languageFilter LanguageFilter The language filter deciding which files to open with the language server
|
||||
---@field transport? "stdio"|"localsocket" Defaults to stdio.
|
||||
---@field serverName? string The socket path when transport == "localsocket".
|
||||
---@field languageFilter LanguageFilter The language filter deciding which files to open with the language server.
|
||||
---@field startBehavior? "AlwaysOn"|"RequiresFile"|"RequiresProject"
|
||||
---@field initializationOptions? table|string The initialization options to pass to the language server, either a json string, or a table
|
||||
---@field initializationOptions? table|string The initialization options to pass to the language server, either a JSON string, or a table.
|
||||
---@field settings? AspectContainer
|
||||
---@field onStartFailed? function This callback is called when client failed to start.
|
||||
local ClientOptions = {}
|
||||
|
||||
---@class LanguageFilter
|
||||
---@field patterns? string[] The file patterns supported by the language server
|
||||
---@field mimeTypes? string[] The mime types supported by the language server
|
||||
---@field patterns? string[] The file patterns supported by the language server.
|
||||
---@field mimeTypes? string[] The mime types supported by the language server.
|
||||
local LanguageFilter = {}
|
||||
|
||||
---@class Client
|
||||
---@field on_instance_start function The callback to call when a language client starts
|
||||
---@field on_instance_start function The callback to call when a language client starts.
|
||||
lsp.Client = {}
|
||||
|
||||
---@param msg string The name of the message to handle
|
||||
---@param callback function The callback to call when the message is received
|
||||
---Registers a message handler for the message named 'msg'
|
||||
---@param msg string The name of the message to handle.
|
||||
---@param callback function The callback to call when the message is received.
|
||||
---Registers a message handler for the message named 'msg'.
|
||||
function lsp.Client:registerMessage(msg, callback) end
|
||||
|
||||
---@param msg table the message to send
|
||||
---Sends a message to the language server
|
||||
---@param msg table the message to send.
|
||||
---Sends a message to the language server.
|
||||
function lsp.Client:sendMessage(msg, callback) end
|
||||
|
||||
---Creates a new Language Client
|
||||
---Creates a new Language Client.
|
||||
---@param options ClientOptions
|
||||
---@return Client
|
||||
function lsp.Client.create(options) end
|
||||
|
@@ -2,15 +2,15 @@
|
||||
|
||||
local messagemanager = {}
|
||||
|
||||
---Writes a message to the Output pane
|
||||
---Writes a message to the Output pane.
|
||||
---@param ... any
|
||||
function messagemanager.writeSilently(...) end
|
||||
|
||||
---Writes a message to the Output pane and flashes the pane if its not open
|
||||
---Writes a message to the Output pane and flashes the pane if its not open.
|
||||
---@param ... any
|
||||
function messagemanager.writeFlashing(...) end
|
||||
|
||||
---Writes a message to the Output pane and opens the pane if its not open
|
||||
---Writes a message to the Output pane and opens the pane if its not open.
|
||||
---@param ... any
|
||||
function messagemanager.writeDisrupting(...) end
|
||||
|
||||
|
@@ -4,14 +4,14 @@ local process = {}
|
||||
|
||||
---@async
|
||||
---Runs a command in a terminal, has to be called from a coroutine!
|
||||
---@param cmd string The command to run
|
||||
---@return number The exit code of the command
|
||||
---@param cmd string The command to run.
|
||||
---@return number exitCode The exit code of the command.
|
||||
function process.runInTerminal(cmd) end
|
||||
|
||||
---@async
|
||||
---Runs a command and returns the output!
|
||||
---@param cmd string The command to run
|
||||
---@return string The output of the command
|
||||
---@param cmd string The command to run.
|
||||
---@return string output The output of the command.
|
||||
function process.commandOutput(cmd) end
|
||||
|
||||
return process
|
||||
|
@@ -29,7 +29,7 @@ QtcPlugin = {}
|
||||
---@class QtcPluginDependency
|
||||
---@field Name string The name of the dependency.
|
||||
---@field Version string The version of the dependency. (`major.minor.patch`)
|
||||
---@field Required boolean Whether the dependency is required or not.
|
||||
---@field Required? "required"|"optional"|"test" Whether the dependency is required or not. (Default: "required")
|
||||
QtcPluginDependency = {}
|
||||
|
||||
|
||||
|
@@ -8,48 +8,48 @@ local settings = {}
|
||||
---@class BaseAspect
|
||||
settings.BaseAspect = {}
|
||||
|
||||
---Applies the changes from its volatileValue to its value
|
||||
---Applies the changes from its volatileValue to its value.
|
||||
function settings.BaseAspect:apply() end
|
||||
|
||||
---@class AspectCreate
|
||||
---@field settingsKey? string The settings key of the aspect
|
||||
---@field displayName? string The display name of the aspect
|
||||
---@field labelText? string The label text of the aspect
|
||||
---@field toolTip? string The tool tip of the aspect
|
||||
---@field enabler? BoolAspect Enable / Disable this aspect based on the state of the `enabler`
|
||||
---@field onValueChanged? function () Called when the value of the aspect changes
|
||||
---@field onVolatileValueChanged? function () Called when the volatile value of the aspect changes
|
||||
---@field settingsKey? string The settings key of the aspect.
|
||||
---@field displayName? string The display name of the aspect.
|
||||
---@field labelText? string The label text of the aspect.
|
||||
---@field toolTip? string The tool tip of the aspect.
|
||||
---@field enabler? BoolAspect Enable / Disable this aspect based on the state of the `enabler`.
|
||||
---@field onValueChanged? function () Called when the value of the aspect changes.
|
||||
---@field onVolatileValueChanged? function () Called when the volatile value of the aspect changes.
|
||||
local AspectCreate = {}
|
||||
|
||||
---The base class of most typed aspects
|
||||
---The base class of most typed aspects.
|
||||
---@generic T
|
||||
---@class TypedAspect<T> : BaseAspect
|
||||
---@field value `T` The value of the aspect
|
||||
---@field volatileValue `T` The temporary value of the aspect
|
||||
---@field defaultValue `T` The default value of the aspect
|
||||
---@field value `T` The value of the aspect.
|
||||
---@field volatileValue `T` The temporary value of the aspect.
|
||||
---@field defaultValue `T` The default value of the aspect.
|
||||
local TypedAspect = {}
|
||||
|
||||
---@generic T
|
||||
---@class TypedAspectCreate<T> : AspectCreate
|
||||
---@field defaultValue `T` The default value of the aspect
|
||||
---@field defaultValue `T` The default value of the aspect.
|
||||
local TypedAspectCreate = {}
|
||||
|
||||
---A container for aspects
|
||||
---A container for aspects.
|
||||
---@class AspectContainer : BaseAspect
|
||||
settings.AspectContainer = {}
|
||||
|
||||
---Options for creating an AspectContainer
|
||||
---Options for creating an AspectContainer.
|
||||
---@class AspectContainerCreate
|
||||
---@field autoApply? boolean Whether the aspects should be applied automatically or not
|
||||
---@field autoApply? boolean Whether the aspects should be applied automatically or not.
|
||||
AspectContainerCreate = {}
|
||||
|
||||
|
||||
---Create a new AspectContainer
|
||||
---Create a new AspectContainer.
|
||||
---@param options AspectContainerCreate
|
||||
---@return AspectContainer
|
||||
function settings.AspectContainer.create(options) end
|
||||
|
||||
---A aspect containing a boolean value
|
||||
---A aspect containing a boolean value.
|
||||
---@class BoolAspect : TypedAspect<boolean>
|
||||
settings.BoolAspect = {}
|
||||
|
||||
@@ -63,7 +63,7 @@ settings.LabelPlacement = {
|
||||
---@field labelPlacement? LabelPlacement:
|
||||
BoolAspectCreate = {}
|
||||
|
||||
---Create a new BoolAspect
|
||||
---Create a new BoolAspect.
|
||||
---@param options BoolAspectCreate
|
||||
---@return BoolAspect
|
||||
function settings.BoolAspect.create(options) end
|
||||
@@ -86,15 +86,15 @@ settings.StringDisplayStyle = {
|
||||
};
|
||||
|
||||
---@class StringAspectCreate : TypedAspectCreate<string>
|
||||
---@field displayStyle? StringDisplayStyle The display type of the aspect
|
||||
---@field historyId? string The history id of the aspect
|
||||
---@field displayStyle? StringDisplayStyle The display type of the aspect.
|
||||
---@field historyId? string The history id of the aspect.
|
||||
---@field valueAcceptor? function string (oldvalue: string, newValue: string)
|
||||
---@field showToolTipOnLabel? boolean
|
||||
---@field displayFilter? function string (value: string)
|
||||
---@field placeHolderText? string
|
||||
---@field acceptRichText? boolean
|
||||
---@field autoApplyOnEditingFinished? boolean
|
||||
---@field elideMode? Qt.TextElideMode The elide mode of the aspect
|
||||
---@field elideMode? Qt.TextElideMode The elide mode of the aspect.
|
||||
StringAspectCreate = {}
|
||||
|
||||
---@class StringAspect : TypedAspect<string>
|
||||
@@ -116,9 +116,9 @@ settings.Kind = {
|
||||
};
|
||||
|
||||
---@class FilePathAspectCreate
|
||||
---@field expectedKind? Kind The kind of path we want to select
|
||||
---@field historyId? string The history id of the aspect
|
||||
---@field defaultPath? FilePath The default path of the aspect
|
||||
---@field expectedKind? Kind The kind of path we want to select.
|
||||
---@field historyId? string The history id of the aspect.
|
||||
---@field defaultPath? FilePath The default path of the aspect.
|
||||
---@field promptDialogFilter? string
|
||||
---@field promptDialogTitle? string
|
||||
---@field commandVersionArguments? string[]
|
||||
@@ -136,8 +136,8 @@ settings.Kind = {
|
||||
FilePathAspectCreate = {}
|
||||
|
||||
---@class FilePathAspect
|
||||
---@field expandedValue FilePath The expanded value of the aspect
|
||||
---@field defaultPath FilePath The default path of the aspect
|
||||
---@field expandedValue FilePath The expanded value of the aspect.
|
||||
---@field defaultPath FilePath The default path of the aspect.
|
||||
settings.FilePathAspect = {}
|
||||
|
||||
---Create a new FilePathAspect
|
||||
@@ -146,7 +146,7 @@ settings.FilePathAspect = {}
|
||||
function settings.FilePathAspect.create(options) end
|
||||
|
||||
---Set the value of the aspect
|
||||
---@param value string|FilePath The value to set
|
||||
---@param value string|FilePath The value to set.
|
||||
function settings.FilePathAspect:setValue(value) end
|
||||
|
||||
settings.IntegerAspect = {}
|
||||
@@ -179,7 +179,7 @@ settings.OptionsPage = {}
|
||||
---@field aspectContainer AspectContainer
|
||||
OptionsPageCreate = {}
|
||||
|
||||
---Creates a new OptionsPage
|
||||
---Creates a new OptionsPage.
|
||||
---@param options OptionsPageCreate
|
||||
---@return OptionsPage
|
||||
function settings.OptionsPage.create(options) end
|
||||
|
@@ -1,36 +1,36 @@
|
||||
---@meta
|
||||
|
||||
---@class QRect
|
||||
---@field x integer The x position of the rectangle
|
||||
---@field y integer The y position of the rectangle
|
||||
---@field width integer The width of the rectangle
|
||||
---@field height integer The height of the rectangle
|
||||
---@field x integer The x position of the rectangle.
|
||||
---@field y integer The y position of the rectangle.
|
||||
---@field width integer The width of the rectangle.
|
||||
---@field height integer The height of the rectangle.
|
||||
QRect = {}
|
||||
|
||||
---@class QSize
|
||||
---@field width integer The width of the size
|
||||
---@field height integer The height of the size
|
||||
---@field width integer The width of the size.
|
||||
---@field height integer The height of the size.
|
||||
QSize = {}
|
||||
|
||||
---@class QPoint
|
||||
---@field x integer The x position of the point
|
||||
---@field y integer The y position of the point
|
||||
---@field x integer The x position of the point.
|
||||
---@field y integer The y position of the point.
|
||||
QPoint = {}
|
||||
|
||||
|
||||
---@class QPointF
|
||||
---@field x number The x position of the floating point
|
||||
---@field y number The y position of the floating point
|
||||
---@field x number The x position of the floating point.
|
||||
---@field y number The y position of the floating point.
|
||||
QPointF = {}
|
||||
|
||||
---@class QSizeF
|
||||
---@field width number The width of the floating point size
|
||||
---@field height number The height of the floating point size
|
||||
---@field width number The width of the floating point size.
|
||||
---@field height number The height of the floating point size.
|
||||
QSizeF = {}
|
||||
|
||||
---@class QRectF
|
||||
---@field x number The x position of the floating point rectangle
|
||||
---@field y number The y position of the floating point rectangle
|
||||
---@field width number The width of the floating point rectangle
|
||||
---@field height number The height of the floating point rectangle
|
||||
---@field x number The x position of the floating point rectangle.
|
||||
---@field y number The y position of the floating point rectangle.
|
||||
---@field width number The width of the floating point rectangle.
|
||||
---@field height number The height of the floating point rectangle.
|
||||
QRectF = {}
|
||||
|
@@ -3,99 +3,99 @@
|
||||
local utils = {}
|
||||
|
||||
---Suspends the current coroutine for the given amount of milliseconds. Call `a.wait` on the returned value to get the result.
|
||||
---@param ms number The amount of milliseconds to wait
|
||||
---@param ms number The amount of milliseconds to wait.
|
||||
function utils.waitms(ms) end
|
||||
|
||||
---Calls the callback after the given amount of milliseconds
|
||||
---@param ms number The amount of milliseconds to wait
|
||||
---@param callback function The callback to call
|
||||
---Calls the callback after the given amount of milliseconds.
|
||||
---@param ms number The amount of milliseconds to wait.
|
||||
---@param callback function The callback to call.
|
||||
function utils.waitms_cb(ms, callback) end
|
||||
|
||||
---@class FilePath
|
||||
utils.FilePath = {}
|
||||
|
||||
---@param path string The path to convert
|
||||
---@return FilePath The converted path
|
||||
---Convert and clean a path, returning a FilePath object
|
||||
---@param path string The path to convert.
|
||||
---@return FilePath The converted path.
|
||||
---Convert and clean a path, returning a FilePath object.
|
||||
function utils.FilePath.fromUserInput(path) end
|
||||
|
||||
---@return FilePath The new absolute path
|
||||
---@return FilePath The new absolute path.
|
||||
---Searches for the path inside the PATH environment variable. Call `a.wait` on the returned value to get the result.
|
||||
function utils.FilePath:searchInPath() end
|
||||
|
||||
---@class (exact) DirEntriesOptions
|
||||
---@field nameFilters? string[] The name filters to use (e.g. "*.lua"), defaults to all files
|
||||
---@field fileFilters? integer The filters to use (combination of QDir.Filters.*), defaults to QDir.Filters.NoFilter
|
||||
---@field flags? integer The iterator flags (combination of QDirIterator.Flags.*), defaults to QDirIterator.Flags.NoIteratorFlags
|
||||
---@field nameFilters? string[] The name filters to use (e.g. "*.lua"), defaults to all files.
|
||||
---@field fileFilters? integer The filters to use (combination of QDir.Filters.*), defaults to QDir.Filters.NoFilter.
|
||||
---@field flags? integer The iterator flags (combination of QDirIterator.Flags.*), defaults to QDirIterator.Flags.NoIteratorFlags.
|
||||
|
||||
---Returns all entries in the directory. Call `a.wait` on the returned value to get the result.
|
||||
---@param options DirEntriesOptions
|
||||
---@return FilePath[]
|
||||
function utils.FilePath:dirEntries(options) end
|
||||
|
||||
---Returns the FilePath as it should be displayed to the user
|
||||
---Returns the FilePath as it should be displayed to the user.
|
||||
---@return string
|
||||
function utils.FilePath:toUserOutput() end
|
||||
|
||||
---Returns whether the target exists
|
||||
---Returns whether the target exists.
|
||||
---@return boolean
|
||||
function utils.FilePath:exists() end
|
||||
|
||||
---Returns whether the target is a file and executable
|
||||
---Returns whether the target is a file and executable.
|
||||
---@return boolean
|
||||
function utils.FilePath:isExecutableFile() end
|
||||
|
||||
---Returns the path portion of FilePath as a string in the hosts native format
|
||||
---Returns the path portion of FilePath as a string in the hosts native format.
|
||||
---@return string
|
||||
function utils.FilePath:nativePath() end
|
||||
|
||||
---Returns the last part of the path
|
||||
---Returns the last part of the path.
|
||||
---@return string
|
||||
function utils.FilePath:fileName() end
|
||||
|
||||
---Returns the current working path of Qt Creator
|
||||
---Returns the current working path of Qt Creator.
|
||||
---@return FilePath
|
||||
function utils.FilePath.currentWorkingPath() end
|
||||
|
||||
---Returns a new FilePath with the given tail appended
|
||||
---@param tail string|FilePath The tail to append
|
||||
---Returns a new FilePath with the given tail appended.
|
||||
---@param tail string|FilePath The tail to append.
|
||||
---@return FilePath
|
||||
function utils.FilePath:resolvePath(tail) end
|
||||
|
||||
---Returns the parent directory of the path
|
||||
---Returns the parent directory of the path.
|
||||
---@return FilePath
|
||||
function utils.FilePath:parentDir() end
|
||||
|
||||
---If the path targets a symlink, this function returns the target of the symlink
|
||||
---@return FilePath The resolved path
|
||||
---If the path targets a symlink, this function returns the target of the symlink.
|
||||
---@return FilePath resolvedPath The resolved path.
|
||||
function utils.FilePath:resolveSymlinks() end
|
||||
|
||||
---Returns the suffix of the path (e.g. "test.ui.qml" -> ".qml")
|
||||
---Returns the suffix of the paths (e.g. "test.ui.qml" -> ".qml").
|
||||
---@return string
|
||||
function utils.FilePath:suffix() end
|
||||
|
||||
---Returns the complete suffix of the path (e.g. "test.ui.qml" -> "ui.qml")
|
||||
---Returns the complete suffix of the paths (e.g. "test.ui.qml" -> "ui.qml").
|
||||
---@return string
|
||||
function utils.FilePath:completeSuffix() end
|
||||
|
||||
---Returns whether the path is absolute
|
||||
---Returns whether the path is absolute.
|
||||
---@return boolean
|
||||
function utils.FilePath:isAbsolutePath() end
|
||||
|
||||
---@class HostOsInfo
|
||||
---@field os "mac"|"windows"|"linux" The current host operating system
|
||||
---@field architecture "unknown"|"x86"|"x86_64"|"itanium"|"arm"|"arm64" The current host architecture
|
||||
---@field os "mac"|"windows"|"linux" The current host operating system.
|
||||
---@field architecture "unknown"|"x86"|"x86_64"|"itanium"|"arm"|"arm64" The current host architecture.
|
||||
utils.HostOsInfo = {}
|
||||
|
||||
---Returns whether the host operating system is windows
|
||||
---Returns whether the host operating system is windows.
|
||||
---@return boolean
|
||||
function utils.HostOsInfo.isWindowsHost() end
|
||||
|
||||
---Returns whether the host operating system is mac
|
||||
---Returns whether the host operating system is mac.
|
||||
---@return boolean
|
||||
function utils.HostOsInfo.isMacHost() end
|
||||
|
||||
---Returns whether the host operating system is linux
|
||||
---Returns whether the host operating system is linux.
|
||||
---@return boolean
|
||||
function utils.HostOsInfo.isLinuxHost() end
|
||||
|
||||
|
@@ -15,8 +15,7 @@ This plugin provides some functionality.
|
||||
You can describe it more here.
|
||||
]],
|
||||
Dependencies = {
|
||||
{ Name = "Core", Version = "%{JS: Util.qtCreatorIdeVersion()}", Required = true },
|
||||
{ Name = "Lua", Version = "%{JS: Util.qtCreatorIdeVersion()}", Required = true },
|
||||
{ Name = "Lua", Version = "%{JS: Util.qtCreatorIdeVersion()}" },
|
||||
},
|
||||
setup = function()
|
||||
require 'init'.setup()
|
||||
|
@@ -9,7 +9,7 @@
|
||||
"-tcs",
|
||||
"-load",
|
||||
"Lua",
|
||||
"-loadluaplugin",
|
||||
"-pluginpath",
|
||||
"%\{ActiveProject:ProjectDirectory\}"
|
||||
]
|
||||
}
|
||||
|
@@ -19,10 +19,6 @@
|
||||
"key": "ProjectFile",
|
||||
"value": "%{ProjectDirectory}/.qtcreator/project.json"
|
||||
},
|
||||
{
|
||||
"key": "PluginNameLower",
|
||||
"value": "%{JS: value('PluginName').toLowerCase()}"
|
||||
},
|
||||
{
|
||||
"key": "PluginSpecFile",
|
||||
"value": "%{JS: Util.fileName(value('PluginName').toLowerCase(), Util.preferredSuffix('text/x-lua'))}"
|
||||
@@ -147,14 +143,14 @@
|
||||
},
|
||||
{
|
||||
"source": "init.lua.tpl",
|
||||
"target": "%{SrcFileName}"
|
||||
"target": "%{PluginName}/%{SrcFileName}"
|
||||
},
|
||||
{
|
||||
"source": ".luarc.json"
|
||||
},
|
||||
{
|
||||
"source": "plugin.lua.tpl",
|
||||
"target": "%{PluginSpecFile}",
|
||||
"target": "%{PluginName}/%{PluginSpecFile}",
|
||||
"openInEditor": true
|
||||
}
|
||||
]
|
||||
|
@@ -14,9 +14,8 @@ This plugin provides the Lua Language Server.
|
||||
It will try to install it if it is not found.
|
||||
]],
|
||||
Dependencies = {
|
||||
{ Name = "Core", Version = "13.0.82", Required = true },
|
||||
{ Name = "Lua", Version = "13.0.82", Required = true },
|
||||
{ Name = "LuaLanguageClient", Version = "13.0.82", Required = true }
|
||||
{ Name = "Lua", Version = "14.0.0" },
|
||||
{ Name = "LuaLanguageClient", Version = "14.0.0" }
|
||||
},
|
||||
setup = function()
|
||||
require 'init'.setup()
|
||||
|
@@ -13,8 +13,7 @@ return {
|
||||
It has tests for (almost) all functionality exposed by the API.
|
||||
]],
|
||||
Dependencies = {
|
||||
{ Name = "Core", Version = "13.0.82", Required = true },
|
||||
{ Name = "Lua", Version = "13.0.82", Required = true }
|
||||
{ Name = "Lua", Version = "14.0.0" }
|
||||
},
|
||||
setup = function() require 'tests'.setup() end,
|
||||
printToOutputPane = true,
|
||||
|
@@ -75,6 +75,7 @@ using ProjectExplorer::ToolchainManager;
|
||||
|
||||
using testing::_;
|
||||
using testing::Return;
|
||||
using testing::Between;
|
||||
|
||||
namespace {
|
||||
const char empty[]{""};
|
||||
@@ -506,6 +507,7 @@ void McuSupportTest::init()
|
||||
|
||||
void McuSupportTest::cleanup()
|
||||
{
|
||||
QVERIFY(settingsMockPtr.get());
|
||||
QVERIFY(testing::Mock::VerifyAndClearExpectations(settingsMockPtr.get()));
|
||||
QVERIFY(testing::Mock::VerifyAndClearExpectations(freeRtosPackage));
|
||||
QVERIFY(testing::Mock::VerifyAndClearExpectations(sdkPackage));
|
||||
@@ -854,7 +856,7 @@ void McuSupportTest::test_useFallbackPathForToolchainWhenPathFromSettingsIsNotAv
|
||||
McuTargetDescription::Toolchain toolchainDescription{armGcc, {}, compilerDescription, {}};
|
||||
|
||||
EXPECT_CALL(*settingsMockPtr, getPath(Key{armGccDirectorySetting}, _, FilePath{fallbackDir}))
|
||||
.Times(2)
|
||||
.Times(Between(2,3))
|
||||
.WillRepeatedly(Return(FilePath{fallbackDir}));
|
||||
|
||||
McuToolchainPackage *toolchain = targetFactory.createToolchain(toolchainDescription);
|
||||
@@ -1559,7 +1561,7 @@ void McuSupportTest::test_legacy_createThirdPartyPackage()
|
||||
QFETCH(QString, detectionPath);
|
||||
|
||||
EXPECT_CALL(*settingsMockPtr, getPath(Key{setting}, _, _))
|
||||
.Times(2)
|
||||
.Times(Between(2,3))
|
||||
.WillRepeatedly(Return(FilePath::fromUserInput(defaultPath)));
|
||||
|
||||
McuPackagePtr thirdPartyPackage{creator()};
|
||||
@@ -1644,7 +1646,7 @@ void McuSupportTest::test_createThirdPartyPackage()
|
||||
.WillOnce(Return(FilePath::fromUserInput(defaultPath)));
|
||||
|
||||
EXPECT_CALL(*settingsMockPtr, getPath(Key{setting}, QSettings::UserScope, _))
|
||||
.Times(testing::AtMost(1))
|
||||
.Times(testing::AtMost(2))
|
||||
.WillOnce(Return(FilePath::fromUserInput(path)));
|
||||
|
||||
auto [targets, packages] = targetFactory.createTargets(targetDescription, sdkPackagePtr);
|
||||
@@ -1668,7 +1670,7 @@ void McuSupportTest::test_createThirdPartyPackage()
|
||||
void McuSupportTest::test_legacy_createCypressProgrammer3rdPartyPackage()
|
||||
{
|
||||
EXPECT_CALL(*settingsMockPtr, getPath(Key{cypressProgrammerSetting}, _, _))
|
||||
.Times(2)
|
||||
.Times(Between(2,3))
|
||||
.WillRepeatedly(Return(FilePath::fromUserInput(defaultToolPath)));
|
||||
|
||||
McuPackagePtr thirdPartyPackage{Legacy::createCypressProgrammerPackage(settingsMockPtr)};
|
||||
@@ -1692,7 +1694,7 @@ void McuSupportTest::test_createJLink3rdPartyPackage()
|
||||
.WillOnce(Return(FilePath::fromUserInput(jlinkPath)));
|
||||
|
||||
EXPECT_CALL(*settingsMockPtr, getPath(Key{jlinkSetting}, QSettings::UserScope, _))
|
||||
.Times(testing::AtMost(1))
|
||||
.Times(testing::AtMost(2))
|
||||
.WillOnce(Return(FilePath::fromUserInput(jlinkPath)));
|
||||
|
||||
auto [targets, packages] = targetFactory.createTargets(targetDescription, sdkPackagePtr);
|
||||
|
BIN
src/plugins/projectexplorer/images/build_hammer_mask.png
Normal file
After Width: | Height: | Size: 294 B |
BIN
src/plugins/projectexplorer/images/build_hammer_mask@2x.png
Normal file
After Width: | Height: | Size: 611 B |
Before Width: | Height: | Size: 173 B |
Before Width: | Height: | Size: 258 B |
Before Width: | Height: | Size: 183 B |
Before Width: | Height: | Size: 246 B |