...
 
Commits (26)
......@@ -37,13 +37,17 @@ foreach(version ${KNOWN_VERSIONS})
break()
endif ()
if (${Clang_FIND_REQUIRED})
find_package(LLVM ${version} REQUIRED)
else ()
find_package(LLVM ${version})
endif ()
find_package(LLVM ${version})
endforeach()
if (${Clang_FIND_REQUIRED})
if(NOT DEFINED Clang_FIND_VERSION)
message(SEND_ERROR "Could not find Clang.")
else()
message("Found version ${Clang_FIND_VERSION}")
endif()
endif()
set(CLANG_FOUND FALSE)
if (LLVM_FOUND AND LLVM_LIBRARY_DIRS)
......
......@@ -69,6 +69,7 @@ public:
, features(TopDUContext::VisibleDeclarationsAndContexts)
, parsePriority(0)
, sequentialProcessingFlags(ParseJob::IgnoresSequentialProcessing)
, maximumFileSize(5 * 1024 * 1024) // 5 MB
{
}
......@@ -95,6 +96,7 @@ public:
int parsePriority;
ParseJob::SequentialProcessingFlags sequentialProcessingFlags;
qint64 maximumFileSize;
};
ParseJob::ParseJob(const IndexedString& url, KDevelop::ILanguageSupport* languageSupport)
......@@ -145,6 +147,16 @@ void ParseJob::setSequentialProcessingFlags(SequentialProcessingFlags flags)
d->sequentialProcessingFlags = flags;
}
qint64 ParseJob::maximumFileSize() const
{
return d->maximumFileSize;
}
void ParseJob::setMaximumFileSize(qint64 value)
{
d->maximumFileSize = value;
}
IndexedString ParseJob::document() const
{
return d->url;
......@@ -270,38 +282,19 @@ KDevelop::ProblemPointer ParseJob::readContents()
if (!hadTracker) {
// We have to load the file from disk
static const int maximumFileSize = 5 * 1024 * 1024; // 5 MB
if (fileInfo.size() > maximumFileSize) {
QStringList paths =
QStandardPaths::standardLocations(QStandardPaths::StandardLocation::GenericDataLocation);
bool internalFile = false;
QString internalFilePath = fileInfo.canonicalPath();
foreach (const QString path, paths) {
QDir dataPath = QDir(path);
if (internalFilePath.startsWith(dataPath.canonicalPath() + QStringLiteral("/kdev"))) {
qCDebug(LANGUAGE) << "Found internal file " << fileInfo.absoluteFilePath() << " in " << path <<
". Ignoring file size limit!";
internalFile = true;
break;
}
}
if (fileInfo.size() > d->maximumFileSize) {
KFormat f;
if (!internalFile) {
KFormat f;
KDevelop::ProblemPointer p(new Problem());
p->setSource(IProblem::Disk);
p->setDescription(i18nc("%1: filename", "Skipped file that is too large: '%1'", localFile));
p->setExplanation(i18nc("%1: file size, %2: limit file size",
"The file is %1 and exceeds the limit of %2.",
f.formatByteSize(fileInfo.size()),
f.formatByteSize(maximumFileSize)));
p->setFinalLocation(DocumentRange(document(), KTextEditor::Range::invalid()));
qCWarning(LANGUAGE) << p->description() << p->explanation();
return p;
}
KDevelop::ProblemPointer p(new Problem());
p->setSource(IProblem::Disk);
p->setDescription(i18nc("%1: filename", "Skipped file that is too large: '%1'", localFile));
p->setExplanation(i18nc("%1: file size, %2: limit file size",
"The file is %1 and exceeds the limit of %2.",
f.formatByteSize(fileInfo.size()),
f.formatByteSize(d->maximumFileSize)));
p->setFinalLocation(DocumentRange(document(), KTextEditor::Range::invalid()));
qCWarning(LANGUAGE) << p->description() << p->explanation();
return p;
}
QFile file(localFile);
......
......@@ -128,6 +128,16 @@ public:
void setSequentialProcessingFlags(SequentialProcessingFlags flags);
/**
* Files greater than this size will not be parsed.
*
* Plugins can use the setMaximumFileSize method to override the default value of 5 MB for internal files
* they might require to be parsed.
**/
qint64 maximumFileSize() const;
void setMaximumFileSize(qint64 value);
/// \returns the indexed url of the document to be parsed.
KDevelop::IndexedString document() const;
......
......@@ -45,6 +45,7 @@ QString UsesNavigationContext::name() const
QString UsesNavigationContext::html(bool shorten)
{
Q_UNUSED(shorten);
clear();
modifyHtml() += QLatin1String("<html><body><p>");
......
......@@ -505,6 +505,10 @@ void UiController::showSettingsDialog()
new ProjectPreferences(&cfgDlg),
new EnvironmentPreferences(QString(), &cfgDlg),
templateConfig,
documentationPreferences,
analyzersPreferences,
runtimesPreferences,
languageConfigPage,
editorConfigPage
};
......@@ -512,6 +516,8 @@ void UiController::showSettingsDialog()
cfgDlg.appendConfigPage(page);
}
cfgDlg.appendSubConfigPage(languageConfigPage, new BGPreferences(&cfgDlg));
auto addPluginPages = [&](IPlugin* plugin) {
for (int i = 0, numPages = plugin->configPages(); i < numPages; ++i) {
auto page = plugin->configPage(i, &cfgDlg);
......@@ -532,14 +538,10 @@ void UiController::showSettingsDialog()
}
};
cfgDlg.insertConfigPage(templateConfig, documentationPreferences);
cfgDlg.insertConfigPage(documentationPreferences, analyzersPreferences);
cfgDlg.insertConfigPage(analyzersPreferences, runtimesPreferences);
cfgDlg.insertConfigPage(runtimesPreferences, languageConfigPage);
cfgDlg.appendSubConfigPage(languageConfigPage, new BGPreferences(&cfgDlg));
auto plugins = ICore::self()->pluginController()->loadedPlugins();
std::sort(plugins.begin(), plugins.end());
foreach (IPlugin* plugin, ICore::self()->pluginController()->loadedPlugins()) {
foreach (IPlugin* plugin, plugins) {
addPluginPages(plugin);
}
......
......@@ -30,6 +30,7 @@
#include <language/duchain/duchain.h>
#include <language/backgroundparser/backgroundparser.h>
#include <interfaces/icore.h>
#include <interfaces/idocumentcontroller.h>
#include <interfaces/ilanguagecontroller.h>
#include <project/projectmodel.h>
......@@ -123,6 +124,14 @@ TestFile::TestFile(const QString& contents, const QString& fileExtension, const
TestFile::~TestFile()
{
if (auto* document = ICore::self()->documentController()->documentForUrl(d->url.toUrl())) {
document->close(KDevelop::IDocument::Discard);
}
auto backgroundParser = ICore::self()->languageController()->backgroundParser();
backgroundParser->removeDocument(d->url, this);
QTRY_VERIFY(!backgroundParser->parseJobForDocument(d->url));
if (d->topContext && !d->keepDUChainData) {
DUChainWriteLocker lock;
DUChain::self()->removeDocumentChain(d->topContext.data());
......
......@@ -138,7 +138,7 @@ static QString generatePathOrUrl(bool onlyPath, bool isLocalFile, const QVector<
// more or less a copy of QtPrivate::QStringList_join
const int size = data.size();
if (size == 0) {
if (size == 0 || data.at(0).isEmpty()) {
return QString();
}
......
......@@ -2,6 +2,11 @@ add_definitions(-DTRANSLATION_DOMAIN=\"kdevclang\")
add_definitions(${LLVM_CFLAGS})
include_directories(${CLANG_INCLUDE_DIRS})
set(CMAKE_REQUIRED_LIBRARIES ${CMAKE_DL_LIBS})
check_cxx_source_compiles(
"#include <dlfcn.h>\nint main() { Dl_info info; return dladdr(nullptr, &info); }"
HAVE_DLFCN)
configure_file(
"${CMAKE_CURRENT_SOURCE_DIR}/libclang_include_path.h.cmake"
"${CMAKE_CURRENT_BINARY_DIR}/libclang_include_path.h"
......@@ -116,6 +121,10 @@ LINK_PUBLIC
Clang::clang
)
if (HAVE_DLFCN)
target_link_libraries(KDevClangPrivate LINK_PRIVATE ${CMAKE_DL_LIBS})
endif()
install(DIRECTORY duchain/wrappedQtHeaders DESTINATION ${KDE_INSTALL_DATADIR}/kdevclangsupport
DIRECTORY_PERMISSIONS
OWNER_READ OWNER_WRITE OWNER_EXECUTE
......
......@@ -237,6 +237,7 @@ void ClangParseJob::run(ThreadWeaver::JobPointer /*self*/, ThreadWeaver::Thread*
m_environment.addIncludes(IDefinesAndIncludesManager::manager()->includesInBackground(tuUrlStr));
m_environment.addFrameworkDirectories(IDefinesAndIncludesManager::manager()->frameworkDirectoriesInBackground(tuUrlStr));
m_environment.addDefines(IDefinesAndIncludesManager::manager()->definesInBackground(tuUrlStr));
m_environment.addParserArguments(IDefinesAndIncludesManager::manager()->parserArgumentsInBackground(tuUrlStr));
m_environment.setPchInclude(userDefinedPchIncludeForFile(tuUrlStr));
}
......
......@@ -44,6 +44,10 @@
#include <algorithm>
#if HAVE_DLFCN
#include <dlfcn.h>
#endif
using namespace KDevelop;
namespace {
......@@ -408,6 +412,20 @@ QString ClangHelpers::clangBuiltinIncludePath()
}
#endif
#if HAVE_DLFCN
// maybe the location of clang changed, try to use the library path instead
// we find it by pass any symbol in libclang to dladdr
Dl_info info;
if (dladdr(reinterpret_cast<void*>(&clang_getClangVersion), &info)) {
dir = QDir::cleanPath(QStringLiteral("%1/../clang/%2/include")
.arg(QString::fromUtf8(info.dli_fname), clangVersion()));
if (isValidClangBuiltingIncludePath(dir)) {
clangDebug() << "Using builtin dir:" << dir;
return dir;
}
}
#endif
clangDebug() << "Using builtin dir:" << KDEV_CLANG_BUILTIN_DIR;
return QString::fromUtf8(KDEV_CLANG_BUILTIN_DIR);
}();
......
......@@ -167,3 +167,9 @@ ParserSettings ClangParsingEnvironment::parserSettings() const
{
return m_parserSettings;
}
void ClangParsingEnvironment::addParserArguments(const QString& parserArguments)
{
m_parserSettings.parserOptions += QLatin1Char(' ') + parserArguments;
}
......@@ -100,6 +100,7 @@ public:
void setParserSettings(const ParserSettings& arguments);
ParserSettings parserSettings() const;
void addParserArguments(const QString &parserArguments);
/**
* Hash all contents of this environment and return the result.
......
......@@ -44,6 +44,7 @@ QString MacroNavigationContext::name() const
QString MacroNavigationContext::html(bool shorten)
{
Q_UNUSED(shorten);
clear();
modifyHtml() += QLatin1String("<html><body><p>");
......
......@@ -63,6 +63,7 @@
<comment xml:lang="ca">Capçalera en C per a CUDA de NVIDIA</comment>
<comment xml:lang="ca@valencia">Capçalera en C per a CUDA de NVIDIA</comment>
<comment xml:lang="cs">Hlavičkový soubor NVIDIA CUDA C</comment>
<comment xml:lang="en_GB">NVIDIA CUDA C header</comment>
<comment xml:lang="es">Cabecera de NVIDIA CUDA C</comment>
<comment xml:lang="fr">En-tête C CUDA NVIDIA</comment>
<comment xml:lang="gl">Cabeceira en C de NVIDIA CUDA</comment>
......@@ -73,6 +74,7 @@
<comment xml:lang="pt_BR">Cabeçalho C da NVIDIA CUDA</comment>
<comment xml:lang="sv">NVIDIA CUDA C-deklarationsfil</comment>
<comment xml:lang="uk">файл заголовків C NVIDIA CUDA</comment>
<comment xml:lang="zh_CN">NVIDIA CUDA C 头文件</comment>
<sub-class-of type="text/x-c++hdr"/>
<glob pattern="*.cuh"/>
</mime-type>
......
......@@ -20,3 +20,5 @@
*/
#define KDEV_CLANG_BUILTIN_DIR "@CLANG_BUILTIN_DIR@"
#cmakedefine01 HAVE_DLFCN
......@@ -99,6 +99,7 @@ LINK_LIBRARIES
Qt5::Core
KDev::Language
KDev::Tests
KDev::DefinesAndIncludesManager
)
if(NOT COMPILER_OPTIMIZATIONS_DISABLED)
......
......@@ -53,9 +53,9 @@ void someFunc(int a, int f) { }
void someFunc(int a) { }
// Pointer-to-member functions
/// "type" : { "toString" : "void ()*" }
/// "type" : { "toString" : "function void ()*" }
void (Base::*f1)();
/// "type" : { "toString" : "void (int, int)*" }
/// "type" : { "toString" : "function void (int, int)*" }
void (Base::*f2)(int a, int b);
#define STDCALL __stdcall
......
/// "useCount" : 1
void foo()
{
/// "useCount": 2
auto l1 = []() {
foo();
};
/// "useCount": 1
auto l2 = [l1] {
l1();
};
/// "useCount": 0
auto l3 = [lambda = l2]() {
lambda();
};
}
......@@ -52,7 +52,7 @@
#include "duchain/clangparsingenvironment.h"
#include "duchain/parsesession.h"
#include <custom-definesandincludes/idefinesandincludesmanager.h>
#include "testprovider.h"
#include <KConfigGroup>
......@@ -65,34 +65,6 @@ QTEST_MAIN(TestDUChain)
using namespace KDevelop;
class TestEnvironmentProvider final : public IDefinesAndIncludesManager::BackgroundProvider
{
public:
~TestEnvironmentProvider() override = default;
QHash< QString, QString > definesInBackground(const QString& /*path*/) const override
{
return defines;
}
Path::List includesInBackground(const QString& /*path*/) const override
{
return includes;
}
Path::List frameworkDirectoriesInBackground(const QString&) const override
{
return {};
}
IDefinesAndIncludesManager::Type type() const override
{
return IDefinesAndIncludesManager::UserDefined;
}
QHash<QString, QString> defines;
Path::List includes;
};
TestDUChain::~TestDUChain() = default;
void TestDUChain::initTestCase()
......
......@@ -29,6 +29,7 @@
#include <tests/json/declarationvalidator.h>
#include "testfilepaths.h"
#include "testprovider.h"
//Include all used json tests, otherwise "Test not found"
#include <tests/json/jsondeclarationtests.h>
......@@ -55,13 +56,22 @@ void TestFiles::initTestCase()
DUChain::self()->disablePersistentStorage();
Core::self()->languageController()->backgroundParser()->setDelay(0);
CodeRepresentation::setDiskChangesForbidden(true);
m_provider = new TestEnvironmentProvider;
IDefinesAndIncludesManager::manager()->registerBackgroundProvider(m_provider);
}
void TestFiles::cleanupTestCase()
{
delete m_provider;
TestCore::shutdown();
}
void TestFiles::cleanup()
{
m_provider->clear();
}
void TestFiles::testFiles_data()
{
QTest::addColumn<QString>("fileName");
......@@ -75,6 +85,11 @@ void TestFiles::testFiles_data()
void TestFiles::testFiles()
{
QFETCH(QString, fileName);
if (QTest::currentDataTag() == QLatin1String("lambdas.cpp")) {
m_provider->parserArguments += "-std=c++14";
}
const IndexedString indexedFileName(fileName);
ReferencedTopDUContext top =
DUChain::self()->waitForUpdate(indexedFileName, TopDUContext::AllDeclarationsContextsAndUses);
......@@ -88,12 +103,14 @@ void TestFiles::testFiles()
DUChainReadLocker lock;
DeclarationValidator validator;
top->visit(validator);
QVERIFY(validator.testsPassed());
foreach(auto problem, top->problems()) {
qDebug() << problem;
}
QEXPECT_FAIL("lambdas.cpp", "capture with identifier and initializer aren't visited apparently", Abort);
QVERIFY(validator.testsPassed());
if (!QTest::currentDataTag() || strcmp("invalid.cpp", QTest::currentDataTag()) != 0) {
QVERIFY(top->problems().isEmpty());
}
......
......@@ -22,14 +22,19 @@
#include <QObject>
class TestEnvironmentProvider;
class TestFiles : public QObject
{
Q_OBJECT
private Q_SLOTS:
void initTestCase();
void cleanupTestCase();
void cleanup();
void testFiles_data();
void testFiles();
private:
TestEnvironmentProvider *m_provider;
};
#endif // TEST_FILES_H
#ifndef KDEV_CLANG_TEST_PROVIDER_H
#define KDEV_CLANG_TEST_PROVIDER_H
#include <custom-definesandincludes/idefinesandincludesmanager.h>
#include <QHash>
class TestEnvironmentProvider final : public KDevelop::IDefinesAndIncludesManager::BackgroundProvider
{
public:
~TestEnvironmentProvider() override = default;
QHash<QString, QString> definesInBackground(const QString& /*path*/) const override
{
return defines;
}
KDevelop::Path::List includesInBackground(const QString& /*path*/) const override
{
return includes;
}
KDevelop::Path::List frameworkDirectoriesInBackground(const QString&) const override
{
return {};
}
KDevelop::IDefinesAndIncludesManager::Type type() const override
{
return KDevelop::IDefinesAndIncludesManager::UserDefined;
}
QString parserArgumentsInBackground(const QString&) const override
{
return parserArguments;
}
void clear()
{
defines.clear();
includes.clear();
parserArguments.clear();
}
QHash<QString, QString> defines;
KDevelop::Path::List includes;
QString parserArguments;
};
#endif // KDEV_CLANG_TEST_PROVIDER_H
......@@ -57,6 +57,7 @@
"Description[es]": "Clang-Tidy proporciona una infraestructura extensible para diagnosticar y corregir errores típicos de programación, como violaciones de estilo, mal uso de la interfaz o fallos que se pueden deducir mediante análisis estáticos. http://clang.llvm.org/extra/clang-tidy/",
"Description[fr]": "clang-tidy offre une infrastructure extensible pour le diagnostic et la correction des erreurs de programmation fréquentes : violations de normes de code, mauvaise utilisation des interfaces ou bogues pouvant être identifiés grâce à l'analyse statique. http://clang.llvm.org/extra/clang-tidy/",
"Description[gl]": "clang-tidy fornece unha infraestrutura extensíbel para diagnosticar e solucionar erros de programación típicos, como violacións das regras de estilo, ou fallos que poden deducirse mediante a análise sintáctica. http://clang.llvm.org/extra/clang-tidy/",
"Description[it]": "clang-tidy fornisce un'infrastruttura estensibile per diagnosticare e correggere dei classici errori di programmazione, che includono violazioni di stile, uso incorretto delle interfacce o errori che possono essere dedotti tramite analisi statica. http://clang.llvm.org/extra/clang-tidy/",
"Description[nl]": "clang-tidy biedt een uitbreidbaar framework voor diagnose en repareren van typische programmeringsfouten, zoals ingaan tegen de stijl, misbruik van interface of bugs die afgeleid worden via statische analyse. http://clang.llvm.org/extra/clang-tidy/",
"Description[pl]": "clang-tidy dostarcza szkielet do diagnostyki i naprawiania powszechnych błędów programistycznych, takich jak łamanie zasad, nadużycia w interfejsie, lub błędy, które można wykryć poprzez analizę statyczną. http://clang.llvm.org/extra/clang-tidy/",
"Description[pt]": "O 'clang-tidy' oferece uma plataforma extensível para diagnosticar e corrigir erros de programação típicos, como as violações do estilo, mau uso das interfaces ou erros que possam ser deduzidos por análise estática. http://clang.llvm.org/extra/clang-tidy/",
......
......@@ -691,15 +691,15 @@ QString defaultGenerator()
return defGen;
}
QVector<Test> importTestSuites(const Path &buildDir)
QVector<Test> importTestSuites(const Path &buildDir, const QString &cmakeTestFileName)
{
const auto contents = CMakeListsParser::readCMakeFile(buildDir.toLocalFile() + QLatin1String("/CTestTestfile.cmake"));
const auto cmakeTestFile = Path(buildDir, cmakeTestFileName).toLocalFile() ;
const auto contents = CMakeListsParser::readCMakeFile(cmakeTestFile);
QVector<Test> tests;
for (const auto& entry: contents) {
if (entry.name == QLatin1String("add_test")) {
auto args = entry.arguments;
Test test;
test.name = args.takeFirst().value;
test.executable = args.takeFirst().value;
......@@ -707,6 +707,9 @@ QVector<Test> importTestSuites(const Path &buildDir)
tests += test;
} else if (entry.name == QLatin1String("subdirs")) {
tests += importTestSuites(Path(buildDir, entry.arguments.first().value));
} else if (entry.name == QLatin1String("include")) {
// Include directive points directly to a .cmake file hosting the tests
tests += importTestSuites(Path(buildDir, entry.arguments.first().value), QString());
} else if (entry.name == QLatin1String("set_tests_properties")) {
if(entry.arguments.count() < 4 || entry.arguments.count() % 2) {
qCWarning(CMAKE) << "found set_tests_properties() with unexpected number of arguments:"
......@@ -732,4 +735,8 @@ QVector<Test> importTestSuites(const Path &buildDir)
return tests;
}
QVector<Test> importTestSuites(const Path &buildDir) {
return importTestSuites(buildDir, QStringLiteral("CTestTestfile.cmake"));
}
}
......@@ -188,6 +188,7 @@ bool CMakeListsParser::readCMakeFunction(cmListFileLexer *lexer, CMakeFunctionDe
func.arguments << CMakeFunctionArgument( QString::fromLocal8Bit(token->text, token->length), false, token->line, token->column );
break;
case cmListFileLexer_Token_Identifier:
case cmListFileLexer_Token_ArgumentBracket:
case cmListFileLexer_Token_ArgumentUnquoted:
func.arguments << CMakeFunctionArgument( QString::fromLocal8Bit(token->text, token->length), false, token->line, token->column );
break;
......
......@@ -197,6 +197,7 @@ KDevelop::ConfigPage* CustomBuildSystem::perProjectConfigPage(int number, const
KDevelop::Path CustomBuildSystem::compiler(KDevelop::ProjectTargetItem* item) const
{
Q_UNUSED(item);
return {};
}
......
......@@ -374,6 +374,16 @@ QString DefinesAndIncludesManager::parserArguments(const QString& path) const
return argumentsForPath(path, args);
}
QString DefinesAndIncludesManager::parserArgumentsInBackground(const QString& path) const
{
QString ret;
for (auto provider: m_backgroundProviders) {
ret += provider->parserArgumentsInBackground(path) + QLatin1Char(' ');
}
return ret;
}
int DefinesAndIncludesManager::perProjectConfigPages() const
{
return 1;
......
......@@ -68,6 +68,7 @@ public:
QString parserArguments(KDevelop::ProjectBaseItem* item) const override;
QString parserArguments(const QString& path) const override;
QString parserArgumentsInBackground(const QString& path) const override;
void openConfigurationDialog( const QString& pathToFile ) override;
int perProjectConfigPages() const override;
......
......@@ -96,6 +96,8 @@ public:
virtual Defines definesInBackground( const QString& path ) const = 0;
virtual QString parserArgumentsInBackground(const QString& path) const = 0;
/// @return the type of i/d this provider provides
virtual Type type() const = 0;
};
......@@ -168,6 +170,7 @@ public:
virtual QString parserArguments(ProjectBaseItem* item) const = 0;
virtual QString parserArguments(const QString& path) const = 0;
virtual QString parserArgumentsInBackground(const QString& path) const = 0;
///@return the instance of the plugin.
inline static IDefinesAndIncludesManager* manager();
......
......@@ -84,6 +84,11 @@ public:
return resolvePathInBackground(path, true);
}
QString parserArgumentsInBackground(const QString& /*path*/) const override
{
return {};
}
IDefinesAndIncludesManager::Type type() const override
{
return IDefinesAndIncludesManager::ProjectSpecific;
......@@ -326,6 +331,7 @@ void CustomMakeManager::unload()
KDevelop::Path CustomMakeManager::compiler(KDevelop::ProjectTargetItem* item) const
{
Q_UNUSED(item);
return {};
}
......
......@@ -10,7 +10,7 @@
"Description[en_GB]": "Imports and edits custom make projects",
"Description[es]": "Importa y edita proyectos Make personalizados",
"Description[fi]": "Tuo ja muokkaa räätälöityjä make-projekteja",
"Description[fr]": "Importe et édite des projet make personnalisés",
"Description[fr]": "Importe et édite des projets make personnalisés",
"Description[gl]": "Importa e edita proxectos que usen un sistema make personalizado.",
"Description[it]": "Importa e modifica i progetti personalizzati di Make",
"Description[nl]": "Importeert en bewerkt eigen make-projecten",
......
......@@ -219,7 +219,7 @@ Path FlatpakRuntime::pathInRuntime(const KDevelop::Path& localPath) const
const auto relpath = m_sdkPath.relativePath(localPath);
ret = Path(Path(QStringLiteral("/usr")), relpath);
} else {
const Path bdfiles(m_buildDirectory, QStringLiteral("/active/flies"));
const Path bdfiles(m_buildDirectory, QStringLiteral("/active/files"));
if (bdfiles.isParentOf(localPath)) {
const auto relpath = bdfiles.relativePath(localPath);
ret = Path(Path(QStringLiteral("/app")), relpath);
......
......@@ -4,7 +4,9 @@
"Description": "Imports and edits Meson projects",
"Description[ca@valencia]": "Importa i edita projectes del Meson",
"Description[ca]": "Importa i edita projectes del Meson",
"Description[en_GB]": "Imports and edits Meson projects",
"Description[es]": "Importa y edita proyectos Meson",
"Description[fr]": "Importe et édite des projets Meson",
"Description[gl]": "Importa e edita proxectos Meson",
"Description[it]": "Importa e modifica i progetti Meson",
"Description[nl]": "Importeert en bewerkt Meson-projecten",
......@@ -13,12 +15,15 @@
"Description[sv]": "Importerar och redigerar Meson-projekt",
"Description[uk]": "Імпортує і дає змогу редагувати проекти Meson",
"Description[x-test]": "xxImports and edits Meson projectsxx",
"Description[zh_CN]": "倒入并编辑 Meson 工程",
"Icon": "meson",
"Id": "KDevMesonManager",
"Name": "Meson Project Manager",
"Name[ca@valencia]": "Gestor de projectes Meson",
"Name[ca]": "Gestor de projectes Meson",
"Name[en_GB]": "Meson Project Manager",
"Name[es]": "Gestor de proyectos Meson",
"Name[fr]": "Gestionnaire de projet Meson",
"Name[gl]": "Xestor de proxectos Meson",
"Name[it]": "Gestore progetto Meson",
"Name[nl]": "Meson projectbeheerder",
......@@ -27,6 +32,7 @@
"Name[sv]": "Meson projekthanterare",
"Name[uk]": "Керування проектами Meson",
"Name[x-test]": "xxMeson Project Managerxx",
"Name[zh_CN]": "Meson 工程管理器",
"ServiceTypes": [
"KDevelop/Plugin"
]
......
......@@ -20,6 +20,7 @@
#pragma once
#include <QString>
#include <QStringList>
#include <QVector>
#include <memory>
......
......@@ -9,7 +9,7 @@
"Description[en_GB]": "Imports and edits QMake projects",
"Description[es]": "Importa y edita proyectos QMake",
"Description[fi]": "Tuo ja muokkaa QMake-projekteja",
"Description[fr]": "Importe et édite des projet QMake",
"Description[fr]": "Importe et édite des projets QMake",
"Description[gl]": "Importa e edita proxectos QMake.",
"Description[it]": "Importa e modifica i progetti QMake",
"Description[nl]": "Importeert en bewerkt QMake-projecten",
......
......@@ -512,6 +512,7 @@ void QMakeProjectManager::slotRunQMake()
KDevelop::Path QMakeProjectManager::compiler(KDevelop::ProjectTargetItem* p) const
{
Q_UNUSED(p);
return {};
}
......
......@@ -3,8 +3,11 @@
"Description": "Scratchpad lets you quickly run and experiment with code without a full project, and even store todos.",
"Description[ca@valencia]": "L'Scratchpad permet executar i experimentar ràpidament amb el codi sense un projecte complet, i inclús emmagatzemar tasques pendents.",
"Description[ca]": "L'Scratchpad permet executar i experimentar ràpidament amb el codi sense un projecte complet, i inclús emmagatzemar tasques pendents.",
"Description[en_GB]": "Scratchpad lets you quickly run and experiment with code without a full project, and even store to-dos.",
"Description[es]": "Scratchpad le permite ejecutar y experimentar con código rápidamente con código sin un proyecto completo, e incluso guardar listas de cosas por hacer.",
"Description[fr]": "Le brouillon vous permet de lancer et d'essayer rapidement du code sans créer un projet complet, vous pouvez même vous en servir pour stocker des listes de tâches.",
"Description[gl]": "O caderno de notas permítelle executar e experimentar con código rapidamente sen un proxecto completo, e mesmo pode gardar listas de tarefas.",
"Description[it]": "Il blocco note ti permette di sperimentare ed eseguire rapidamente il codice senza un progetto completo, ed anche memorizzare un elenco di cose da fare.",
"Description[nl]": "Kladblol laat u snel code uitvoeren en mee experimenteren zonder een volledig project en zelfs to-do's opslaan.",
"Description[pl]": "Bazgroszyt umożliwia szybkie wykonanie kodu, a także wykonywanie na nim prób bez pełnego projektu. Umożliwia także zapisywanie sobie zadań do zrobienia.",
"Description[pt]": "A Área de Rascunhos permite-lhe executar e experimentar rapidamente código sem ter um projecto completo ou mesmo guardar listas de tarefas.",
......@@ -17,7 +20,9 @@
"Name": "Scratchpad",
"Name[ca@valencia]": "Scratchpad",
"Name[ca]": "Scratchpad",
"Name[en_GB]": "Scratchpad",
"Name[es]": "Scratchpad",
"Name[fr]": "Brouillon",
"Name[gl]": "Caderno de notas",
"Name[it]": "Blocco note",
"Name[nl]": "Kladblok",
......