diff options
author | Christian Kandeler <christian.kandeler@qt.io> | 2021-05-06 12:56:21 +0200 |
---|---|---|
committer | Christian Kandeler <christian.kandeler@qt.io> | 2021-05-07 11:03:47 +0000 |
commit | 9c3420120ea9b477a8677de667e0b3dc5375159b (patch) | |
tree | 11bd9716f5920faba2b981dbf5b77fdf3c02f1d0 | |
parent | 448446bd7ed40e1adbd1b66cdf92e50a125da5f3 (diff) |
CppTools: Parse non-project sources with default kit
This makes more sense than using the clang defaults.
Task-number: QTCREATORBUG-25562
Change-Id: I796d29bb4e81e5e257efea998dcab037efd8a717
Reviewed-by: Christian Stenger <christian.stenger@qt.io>
-rw-r--r-- | src/plugins/cpptools/cppmodelmanager.cpp | 16 | ||||
-rw-r--r-- | src/plugins/cpptools/cppprojectinfogenerator.cpp | 45 | ||||
-rw-r--r-- | src/plugins/cpptools/projectpart.cpp | 37 | ||||
-rw-r--r-- | src/plugins/cpptools/projectpart.h | 2 |
4 files changed, 57 insertions, 43 deletions
diff --git a/src/plugins/cpptools/cppmodelmanager.cpp b/src/plugins/cpptools/cppmodelmanager.cpp index 971276f70a..d4f8c96f81 100644 --- a/src/plugins/cpptools/cppmodelmanager.cpp +++ b/src/plugins/cpptools/cppmodelmanager.cpp @@ -61,6 +61,8 @@ #include <cplusplus/ASTPath.h> #include <cplusplus/TypeOfExpression.h> #include <extensionsystem/pluginmanager.h> +#include <projectexplorer/kitinformation.h> +#include <projectexplorer/kitmanager.h> #include <projectexplorer/project.h> #include <projectexplorer/projectexplorer.h> #include <projectexplorer/projectmacro.h> @@ -90,6 +92,7 @@ static const bool DumpProjectInfo = qgetenv("QTC_DUMP_PROJECT_INFO") == "1"; using namespace CppTools; using namespace CppTools::Internal; using namespace CPlusPlus; +using namespace ProjectExplorer; #ifdef QTCREATOR_WITH_DUMP_AST @@ -1276,6 +1279,19 @@ ProjectPart::Ptr CppModelManager::fallbackProjectPart() Utils::LanguageExtension::ObjectiveC); part->qtVersion = Utils::QtVersion::Qt5; + + // TODO: Use different fallback toolchain for different kinds of files + const auto * const defaultKit = KitManager::defaultKit(); + const ToolChain * const defaultTc = ToolChainKitAspect::cxxToolChain(defaultKit); + if (defaultKit && defaultTc) { + Utils::FilePath sysroot = SysRootKitAspect::sysRoot(defaultKit); + if (sysroot.isEmpty()) + sysroot = Utils::FilePath::fromString(defaultTc->sysRoot()); + Utils::Environment env = Utils::Environment::systemEnvironment(); + defaultKit->addToEnvironment(env); + ToolChainInfo tcInfo(defaultTc, sysroot.toString(), env); + part->setupToolchainProperties(tcInfo, {}); + } part->updateLanguageFeatures(); return part; diff --git a/src/plugins/cpptools/cppprojectinfogenerator.cpp b/src/plugins/cpptools/cppprojectinfogenerator.cpp index f5da863a33..cf3152163f 100644 --- a/src/plugins/cpptools/cppprojectinfogenerator.cpp +++ b/src/plugins/cpptools/cppprojectinfogenerator.cpp @@ -196,51 +196,10 @@ ProjectPart::Ptr ProjectInfoGenerator::createProjectPart( ProjectPart::Ptr part(templateProjectPart->copy()); part->displayName = partName; part->files = projectFiles; - part->toolchainType = tcInfo.type; - part->isMsvc2015Toolchain = tcInfo.isMsvc2015ToolChain; - part->toolChainWordWidth = tcInfo.wordWidth == 64 ? ProjectPart::WordWidth64Bit - : ProjectPart::WordWidth32Bit; - part->toolChainInstallDir = tcInfo.installDir; - part->toolChainTargetTriple = tcInfo.targetTriple; - part->extraCodeModelFlags = tcInfo.extraCodeModelFlags; - part->compilerFlags = flags.commandLineFlags; part->warningFlags = flags.warningFlags; - if (part->includedFiles.isEmpty()) { - // The project manager did not provide the included files, so take - // the ones we were able to detect from the toolchain's command line. - part->includedFiles = flags.includedFiles; - } part->language = language; - part->languageExtensions = flags.languageExtensions; - - // Toolchain macros and language version - if (tcInfo.macroInspectionRunner) { - auto macroInspectionReport = tcInfo.macroInspectionRunner(flags.commandLineFlags); - part->toolChainMacros = macroInspectionReport.macros; - part->languageVersion = macroInspectionReport.languageVersion; - // No compiler set in kit. - } else if (language == Language::C) { - part->languageVersion = Utils::LanguageVersion::LatestC; - } else { - part->languageVersion = Utils::LanguageVersion::LatestCxx; - } - - // Header paths - if (tcInfo.headerPathsRunner) { - const HeaderPaths builtInHeaderPaths - = tcInfo.headerPathsRunner(flags.commandLineFlags, - tcInfo.sysRootPath, - tcInfo.targetTriple); - - HeaderPaths &headerPaths = part->headerPaths; - for (const HeaderPath &header : builtInHeaderPaths) { - const HeaderPath headerPath{header.path, header.type}; - if (!headerPaths.contains(headerPath)) - headerPaths.push_back(headerPath); - } - } - - part->languageExtensions |= languageExtensions; + part->languageExtensions = flags.languageExtensions | languageExtensions; + part->setupToolchainProperties(tcInfo, flags.commandLineFlags); part->updateLanguageFeatures(); return part; diff --git a/src/plugins/cpptools/projectpart.cpp b/src/plugins/cpptools/projectpart.cpp index f88fefac82..d3d4668a81 100644 --- a/src/plugins/cpptools/projectpart.cpp +++ b/src/plugins/cpptools/projectpart.cpp @@ -31,6 +31,8 @@ #include <QDir> #include <QTextStream> +using namespace ProjectExplorer; + namespace CppTools { void ProjectPart::updateLanguageFeatures() @@ -53,6 +55,41 @@ void ProjectPart::updateLanguageFeatures() } } +void ProjectPart::setupToolchainProperties(const ToolChainInfo &tcInfo, const QStringList &flags) +{ + toolchainType = tcInfo.type; + isMsvc2015Toolchain = tcInfo.isMsvc2015ToolChain; + toolChainWordWidth = tcInfo.wordWidth == 64 ? ProjectPart::WordWidth64Bit + : ProjectPart::WordWidth32Bit; + toolChainInstallDir = tcInfo.installDir; + toolChainTargetTriple = tcInfo.targetTriple; + extraCodeModelFlags = tcInfo.extraCodeModelFlags; + compilerFlags = flags; + + // Toolchain macros and language version + if (tcInfo.macroInspectionRunner) { + const auto macroInspectionReport = tcInfo.macroInspectionRunner(compilerFlags); + toolChainMacros = macroInspectionReport.macros; + languageVersion = macroInspectionReport.languageVersion; + // No compiler set in kit. + } else if (language == Utils::Language::C) { + languageVersion = Utils::LanguageVersion::LatestC; + } else { + languageVersion = Utils::LanguageVersion::LatestCxx; + } + + // Header paths + if (tcInfo.headerPathsRunner) { + const HeaderPaths builtInHeaderPaths + = tcInfo.headerPathsRunner(compilerFlags, tcInfo.sysRootPath, tcInfo.targetTriple); + for (const HeaderPath &header : builtInHeaderPaths) { + const HeaderPath headerPath{header.path, header.type}; + if (!headerPaths.contains(headerPath)) + headerPaths.push_back(headerPath); + } + } +} + ProjectPart::Ptr ProjectPart::copy() const { return Ptr(new ProjectPart(*this)); diff --git a/src/plugins/cpptools/projectpart.h b/src/plugins/cpptools/projectpart.h index 2f38563687..010a21a312 100644 --- a/src/plugins/cpptools/projectpart.h +++ b/src/plugins/cpptools/projectpart.h @@ -65,6 +65,8 @@ public: Ptr copy() const; void updateLanguageFeatures(); + void setupToolchainProperties(const ProjectExplorer::ToolChainInfo &tcInfo, + const QStringList &flags); static QByteArray readProjectConfigFile(const Ptr &projectPart); |