aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/compilationdatabaseprojectmanager
diff options
context:
space:
mode:
authorIvan Donchevskii <ivan.donchevskii@qt.io>2019-04-15 13:44:01 +0200
committerIvan Donchevskii <ivan.donchevskii@qt.io>2019-04-16 09:52:59 +0000
commita5ee354b193f7e7bcf91907ccc156ef080d82456 (patch)
treedbce99ea39ba11e1991ef9ae88b22a7cc105f92b /src/plugins/compilationdatabaseprojectmanager
parente76efa69d53daa3725483835739c569bf97c928f (diff)
CompilationDatabase: Force QString implicit sharing
Most of the flags in compilation database are the same, let's share them by inserting them all into the temporary QSet of QString-s. Change-Id: I7d9b410b4b0bee40247434b49371bd37214d4c59 Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
Diffstat (limited to 'src/plugins/compilationdatabaseprojectmanager')
-rw-r--r--src/plugins/compilationdatabaseprojectmanager/compilationdatabaseproject.cpp15
-rw-r--r--src/plugins/compilationdatabaseprojectmanager/compilationdatabaseutils.cpp20
-rw-r--r--src/plugins/compilationdatabaseprojectmanager/compilationdatabaseutils.h2
3 files changed, 24 insertions, 13 deletions
diff --git a/src/plugins/compilationdatabaseprojectmanager/compilationdatabaseproject.cpp b/src/plugins/compilationdatabaseprojectmanager/compilationdatabaseproject.cpp
index 351917f019c..650b3ad7ef2 100644
--- a/src/plugins/compilationdatabaseprojectmanager/compilationdatabaseproject.cpp
+++ b/src/plugins/compilationdatabaseprojectmanager/compilationdatabaseproject.cpp
@@ -64,16 +64,18 @@ namespace Internal {
namespace {
-QStringList jsonObjectFlags(const QJsonObject &object)
+QStringList jsonObjectFlags(const QJsonObject &object, QSet<QString> &flagsCache)
{
QStringList flags;
const QJsonArray arguments = object["arguments"].toArray();
if (arguments.isEmpty()) {
- flags = splitCommandLine(object["command"].toString());
+ flags = splitCommandLine(object["command"].toString(), flagsCache);
} else {
flags.reserve(arguments.size());
- for (const QJsonValue &arg : arguments)
- flags.append(arg.toString());
+ for (const QJsonValue &arg : arguments) {
+ auto flagIt = flagsCache.insert(arg.toString());
+ flags.append(*flagIt);
+ }
}
return flags;
@@ -339,6 +341,7 @@ std::vector<Entry> readJsonObjects(const QString &filePath)
int objectStart = contents.indexOf('{');
int objectEnd = contents.indexOf('}', objectStart + 1);
+ QSet<QString> flagsCache;
while (objectStart >= 0 && objectEnd >= 0) {
const QJsonDocument document = QJsonDocument::fromJson(
contents.mid(objectStart, objectEnd - objectStart + 1));
@@ -350,8 +353,8 @@ std::vector<Entry> readJsonObjects(const QString &filePath)
const QJsonObject object = document.object();
const Utils::FileName fileName = jsonObjectFilename(object);
- const QStringList flags
- = filterFromFileName(jsonObjectFlags(object), fileName.toFileInfo().baseName());
+ const QStringList flags = filterFromFileName(jsonObjectFlags(object, flagsCache),
+ fileName.toFileInfo().baseName());
result.push_back({flags, fileName, object["directory"].toString()});
objectStart = contents.indexOf('{', objectEnd + 1);
diff --git a/src/plugins/compilationdatabaseprojectmanager/compilationdatabaseutils.cpp b/src/plugins/compilationdatabaseprojectmanager/compilationdatabaseutils.cpp
index 1884aa1c6d3..8f4f2212b6d 100644
--- a/src/plugins/compilationdatabaseprojectmanager/compilationdatabaseutils.cpp
+++ b/src/plugins/compilationdatabaseprojectmanager/compilationdatabaseutils.cpp
@@ -33,6 +33,7 @@
#include <QDir>
#include <QRegularExpression>
+#include <QSet>
using namespace ProjectExplorer;
@@ -205,7 +206,7 @@ void filteredFlags(const QString &fileName,
flags = filtered;
}
-QStringList splitCommandLine(QString commandLine)
+QStringList splitCommandLine(QString commandLine, QSet<QString> &flagsCache)
{
QStringList result;
bool insideQuotes = false;
@@ -215,12 +216,19 @@ QStringList splitCommandLine(QString commandLine)
for (const QString &part : commandLine.split(QRegularExpression("\""))) {
if (insideQuotes) {
const QString quotedPart = "\"" + part + "\"";
- if (result.last().endsWith("="))
- result.last().append(quotedPart);
- else
- result.append(quotedPart);
+ if (result.last().endsWith("=")) {
+ auto flagIt = flagsCache.insert(result.last() + quotedPart);
+ result.last() = *flagIt;
+ } else {
+ auto flagIt = flagsCache.insert(quotedPart);
+ result.append(*flagIt);
+ }
} else { // If 's' is outside quotes ...
- result.append(part.split(QRegularExpression("\\s+"), QString::SkipEmptyParts));
+ for (const QString &flag :
+ part.split(QRegularExpression("\\s+"), QString::SkipEmptyParts)) {
+ auto flagIt = flagsCache.insert(flag);
+ result.append(*flagIt);
+ }
}
insideQuotes = !insideQuotes;
}
diff --git a/src/plugins/compilationdatabaseprojectmanager/compilationdatabaseutils.h b/src/plugins/compilationdatabaseprojectmanager/compilationdatabaseutils.h
index e465b6ba23c..52b251723a9 100644
--- a/src/plugins/compilationdatabaseprojectmanager/compilationdatabaseutils.h
+++ b/src/plugins/compilationdatabaseprojectmanager/compilationdatabaseutils.h
@@ -47,6 +47,6 @@ void filteredFlags(const QString &fileName,
QVector<ProjectExplorer::Macro> &macros,
CppTools::ProjectFile::Kind &fileKind);
-QStringList splitCommandLine(QString commandLine);
+QStringList splitCommandLine(QString commandLine, QSet<QString> &flagsCache);
} // namespace CompilationDatabaseProjectManager