summaryrefslogtreecommitdiff
path: root/src/plugins/clangcodemodel/clangutils.cpp
diff options
context:
space:
mode:
authorIvan Donchevskii <ivan.donchevskii@qt.io>2018-07-10 15:53:51 +0200
committerIvan Donchevskii <ivan.donchevskii@qt.io>2018-08-13 13:24:12 +0000
commitf60b0352953b06d1a69e2b8b2ed117eab17135f9 (patch)
tree4d2a99c75a427d1e1a6d76cf1a16697f76ae35c8 /src/plugins/clangcodemodel/clangutils.cpp
parent934e9b2e197199522d425af55b327108c255ae61 (diff)
downloadqt-creator-f60b0352953b06d1a69e2b8b2ed117eab17135f9.tar.gz
Clang: Add button to generate compile_commands.json
Change-Id: Iaabdcfc8d1b3463c3f6e5ce47536f9c52556eac0 Reviewed-by: Marco Bubke <marco.bubke@qt.io>
Diffstat (limited to 'src/plugins/clangcodemodel/clangutils.cpp')
-rw-r--r--src/plugins/clangcodemodel/clangutils.cpp55
1 files changed, 55 insertions, 0 deletions
diff --git a/src/plugins/clangcodemodel/clangutils.cpp b/src/plugins/clangcodemodel/clangutils.cpp
index 8bd698c2d1..b58304eb2b 100644
--- a/src/plugins/clangcodemodel/clangutils.cpp
+++ b/src/plugins/clangcodemodel/clangutils.cpp
@@ -39,13 +39,19 @@
#include <cpptools/projectpart.h>
#include <cpptools/cppcodemodelsettings.h>
#include <cpptools/cpptoolsreuse.h>
+#include <projectexplorer/buildconfiguration.h>
#include <projectexplorer/projectexplorerconstants.h>
+#include <projectexplorer/target.h>
#include <utils/algorithm.h>
+#include <utils/fileutils.h>
#include <utils/qtcassert.h>
#include <QDir>
#include <QFile>
+#include <QJsonArray>
+#include <QJsonDocument>
+#include <QJsonObject>
#include <QStringList>
#include <QTextBlock>
@@ -357,5 +363,54 @@ QString diagnosticCategoryPrefixRemoved(const QString &text)
return text;
}
+static ::Utils::FileName buildDirectory(const CppTools::ProjectPart &projectPart)
+{
+ ProjectExplorer::Target *target = projectPart.project->activeTarget();
+ if (!target)
+ return ::Utils::FileName();
+
+ ProjectExplorer::BuildConfiguration *buildConfig = target->activeBuildConfiguration();
+ if (!buildConfig)
+ return ::Utils::FileName();
+
+ return buildConfig->buildDirectory();
+}
+
+static QJsonObject createFileObject(CompilerOptionsBuilder &optionsBuilder,
+ const ProjectFile &projFile,
+ const ::Utils::FileName &buildDir)
+{
+ optionsBuilder.updateLanguageOption(ProjectFile::classify(projFile.path));
+
+ QJsonObject fileObject;
+ fileObject["file"] = projFile.path;
+ QJsonArray args = QJsonArray::fromStringList(optionsBuilder.options());
+ args.append(QDir::toNativeSeparators(projFile.path));
+ fileObject["arguments"] = args;
+ fileObject["directory"] = buildDir.toString();
+ return fileObject;
+}
+
+void generateCompilationDB(::Utils::FileName projectDir, CppTools::ProjectInfo projectInfo)
+{
+ QFile compileCommandsFile(projectDir.toString() + "/compile_commands.json");
+
+ QJsonArray array;
+ for (ProjectPart::Ptr projectPart : projectInfo.projectParts()) {
+ const ::Utils::FileName buildDir = buildDirectory(*projectPart);
+
+ CompilerOptionsBuilder optionsBuilder(*projectPart);
+ optionsBuilder.build(CppTools::ProjectFile::Unclassified,
+ CppTools::CompilerOptionsBuilder::PchUsage::None);
+
+ for (const ProjectFile &projFile : projectPart->files)
+ array.push_back(createFileObject(optionsBuilder, projFile, buildDir));
+ }
+
+ compileCommandsFile.open(QIODevice::WriteOnly | QIODevice::Truncate);
+ compileCommandsFile.write(QJsonDocument(array).toJson());
+ compileCommandsFile.close();
+}
+
} // namespace Utils
} // namespace Clang