CompilationDatabase: Fix opening relative file paths

Change-Id: I0d0ac8af9cd48510b8b8a80adfb20b8c526cd2e4
Fixes: QTCREATORBUG-21386
Reviewed-by: Kirill Burtsev <kirill.burtsev@qt.io>
Reviewed-by: Marco Bubke <marco.bubke@qt.io>
This commit is contained in:
Ivan Donchevskii
2018-10-26 15:06:19 +02:00
parent 9ab3a69c65
commit 8ab9b93b79

View File

@@ -148,10 +148,10 @@ static QStringList filteredFlags(const QStringList &flags, const QString &fileNa
} }
static CppTools::RawProjectPart makeRawProjectPart(const Utils::FileName &projectFile, static CppTools::RawProjectPart makeRawProjectPart(const Utils::FileName &projectFile,
const QJsonObject &object) const QJsonObject &object,
const QString &workingDir,
const Utils::FileName &fileName)
{ {
const Utils::FileName fileName = Utils::FileName::fromString(
QDir::fromNativeSeparators(object["file"].toString()));
QStringList flags; QStringList flags;
const QJsonArray arguments = object["arguments"].toArray(); const QJsonArray arguments = object["arguments"].toArray();
if (arguments.isEmpty()) { if (arguments.isEmpty()) {
@@ -161,7 +161,6 @@ static CppTools::RawProjectPart makeRawProjectPart(const Utils::FileName &projec
flags.append(arg.toString()); flags.append(arg.toString());
} }
const QString workingDir = object["directory"].toString();
flags = filteredFlags(flags, fileName.fileName(), workingDir); flags = filteredFlags(flags, fileName.fileName(), workingDir);
CppTools::RawProjectPart rpp; CppTools::RawProjectPart rpp;
@@ -221,7 +220,14 @@ CompilationDatabaseProject::CompilationDatabaseProject(const Utils::FileName &pr
CppTools::RawProjectParts rpps; CppTools::RawProjectParts rpps;
for (const QJsonValue &element : array) { for (const QJsonValue &element : array) {
const QJsonObject object = element.toObject(); const QJsonObject object = element.toObject();
const QString filePath = object["file"].toString(); const QString workingDir = object["directory"].toString();
Utils::FileName fileName = Utils::FileName::fromString(
QDir::fromNativeSeparators(object["file"].toString()));
if (!fileName.exists()) {
fileName = Utils::FileUtils::canonicalPath(
Utils::FileName::fromString(workingDir + "/" + fileName.toString()));
}
const QString filePath = fileName.toString();
const CppTools::ProjectFile::Kind kind = CppTools::ProjectFile::classify(filePath); const CppTools::ProjectFile::Kind kind = CppTools::ProjectFile::classify(filePath);
ProjectExplorer::FolderNode *parent = nullptr; ProjectExplorer::FolderNode *parent = nullptr;
ProjectExplorer::FileType type = ProjectExplorer::FileType::Unknown; ProjectExplorer::FileType type = ProjectExplorer::FileType::Unknown;
@@ -235,9 +241,9 @@ CompilationDatabaseProject::CompilationDatabaseProject(const Utils::FileName &pr
parent = root.get(); parent = root.get();
} }
parent->addNode(std::make_unique<ProjectExplorer::FileNode>( parent->addNode(std::make_unique<ProjectExplorer::FileNode>(
Utils::FileName::fromString(filePath), type, false)); fileName, type, false));
rpps.append(makeRawProjectPart(projectFile, object)); rpps.append(makeRawProjectPart(projectFile, object, workingDir, fileName));
} }
root->addNode(std::move(headers)); root->addNode(std::move(headers));