diff --git a/src/plugins/compilationdatabaseprojectmanager/compilationdatabasetests.cpp b/src/plugins/compilationdatabaseprojectmanager/compilationdatabasetests.cpp index 15651214bdc..d5fdc2dd172 100644 --- a/src/plugins/compilationdatabaseprojectmanager/compilationdatabasetests.cpp +++ b/src/plugins/compilationdatabaseprojectmanager/compilationdatabasetests.cpp @@ -136,7 +136,7 @@ void CompilationDatabaseTests::testFilterEmptyFlags() void CompilationDatabaseTests::testFilterFromFilename() { - QCOMPARE(filterFromFileName(QStringList{"-o", "foo.o"}, "foo"), QStringList{"-o"}); + QCOMPARE(filterFromFileName(QStringList{"-o", "foo.o"}, "foo.c"), QStringList()); } void CompilationDatabaseTests::testFilterArguments() @@ -169,8 +169,10 @@ void CompilationDatabaseTests::testFilterArguments() "c++", QString("--sysroot=") + (HostOsInfo::isWindowsHost() ? "C:\\sysroot\\embedded" : "/opt/sysroot/embedded"), - "C:\\qt-creator\\src\\plugins\\cpptools\\compileroptionsbuilder.cpp"}, - "compileroptionsbuilder"); + QLatin1String(HostOsInfo::isWindowsHost() + ? "C:\\qt-creator\\src\\plugins\\cpptools\\compileroptionsbuilder.cpp" + : "/opt/qt-creator/src/plugins/cpptools/compileroptionsbuilder.cpp")}, + "compileroptionsbuilder.cpp"); testData.getFilteredFlags(); @@ -241,7 +243,7 @@ void CompilationDatabaseTests::testFilterCommand() testData.fileName = "SemaCodeComplete.cpp"; testData.workingDir = "C:/build-qt_llvm-msvc2017_64bit-Debug"; testData.flags = filterFromFileName(testData.getSplitCommandLine(kCmakeCommand), - "SemaCodeComplete"); + "SemaCodeComplete.cpp"); testData.getFilteredFlags(); if (Utils::HostOsInfo::isWindowsHost()) { @@ -278,7 +280,7 @@ void CompilationDatabaseTests::testFileKindDifferentFromExtension2() void CompilationDatabaseTests::testSkipOutputFiles() { CompilationDatabaseUtilsTestData testData; - testData.flags = filterFromFileName(QStringList{"-o", "foo.o"}, "foo"); + testData.flags = filterFromFileName(QStringList{"-o", "foo.o"}, "foo.cpp"); QVERIFY(testData.getFilteredFlags().isEmpty()); } diff --git a/src/plugins/compilationdatabaseprojectmanager/compilationdatabaseutils.cpp b/src/plugins/compilationdatabaseprojectmanager/compilationdatabaseutils.cpp index a60d2ed9141..03b5d590792 100644 --- a/src/plugins/compilationdatabaseprojectmanager/compilationdatabaseutils.cpp +++ b/src/plugins/compilationdatabaseprojectmanager/compilationdatabaseutils.cpp @@ -84,14 +84,24 @@ static CppEditor::ProjectFile::Kind fileKindFromString(QString flag) return ProjectFile::Unclassified; } -QStringList filterFromFileName(const QStringList &flags, QString baseName) +QStringList filterFromFileName(const QStringList &flags, QString fileName) { - baseName.append('.'); // to match name.c, name.o, etc. QStringList result; result.reserve(flags.size()); - for (const QString &flag : flags) { - if (!flag.contains(baseName)) - result.push_back(flag); + bool skipNext = false; + for (int i = 0; i < flags.size(); ++i) { + const QString &flag = flags.at(i); + if (skipNext) { + skipNext = false; + continue; + } + if (FilePath::fromUserInput(flag).fileName() == fileName) + continue; + if (flag == "-o" || flag.startsWith("/Fo")) { + skipNext = true; + continue; + } + result.push_back(flag); } return result; diff --git a/src/plugins/compilationdatabaseprojectmanager/compilationdbparser.cpp b/src/plugins/compilationdatabaseprojectmanager/compilationdbparser.cpp index 21605c321c6..c244eebb2b9 100644 --- a/src/plugins/compilationdatabaseprojectmanager/compilationdbparser.cpp +++ b/src/plugins/compilationdatabaseprojectmanager/compilationdbparser.cpp @@ -177,7 +177,7 @@ static QStringList jsonObjectFlags(const QJsonObject &object, QSet &fla return flags; } -static FilePath jsonObjectFilename(const QJsonObject &object) +static FilePath jsonObjectFilePath(const QJsonObject &object) { const QString workingDir = QDir::cleanPath(object["directory"].toString()); FilePath fileName = FilePath::fromString(QDir::cleanPath(object["file"].toString())); @@ -204,10 +204,10 @@ std::vector CompilationDbParser::readJsonObjects() const } const QJsonObject object = document.object(); - const Utils::FilePath fileName = jsonObjectFilename(object); + const Utils::FilePath filePath = jsonObjectFilePath(object); const QStringList flags = filterFromFileName(jsonObjectFlags(object, flagsCache), - fileName.baseName()); - result.push_back({flags, fileName, object["directory"].toString()}); + filePath.fileName()); + result.push_back({flags, filePath, object["directory"].toString()}); objectStart = m_projectFileContents.indexOf('{', objectEnd + 1); objectEnd = m_projectFileContents.indexOf('}', objectStart + 1);