CompilationDatabaseProjectManager: Be more careful with filtering

Do not blindly remove all flags that contain the file's base name.

Fixes: QTCREATORBUG-27990
Change-Id: Ib51b65a8694e82ec22af859176b0db0e5d86b5f0
Reviewed-by: Christian Stenger <christian.stenger@qt.io>
Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
This commit is contained in:
Christian Kandeler
2022-08-01 14:37:30 +02:00
parent b52177119f
commit 98a39401db
3 changed files with 26 additions and 14 deletions

View File

@@ -136,7 +136,7 @@ void CompilationDatabaseTests::testFilterEmptyFlags()
void CompilationDatabaseTests::testFilterFromFilename() void CompilationDatabaseTests::testFilterFromFilename()
{ {
QCOMPARE(filterFromFileName(QStringList{"-o", "foo.o"}, "foo"), QStringList{"-o"}); QCOMPARE(filterFromFileName(QStringList{"-o", "foo.o"}, "foo.c"), QStringList());
} }
void CompilationDatabaseTests::testFilterArguments() void CompilationDatabaseTests::testFilterArguments()
@@ -169,8 +169,10 @@ void CompilationDatabaseTests::testFilterArguments()
"c++", "c++",
QString("--sysroot=") + (HostOsInfo::isWindowsHost() QString("--sysroot=") + (HostOsInfo::isWindowsHost()
? "C:\\sysroot\\embedded" : "/opt/sysroot/embedded"), ? "C:\\sysroot\\embedded" : "/opt/sysroot/embedded"),
"C:\\qt-creator\\src\\plugins\\cpptools\\compileroptionsbuilder.cpp"}, QLatin1String(HostOsInfo::isWindowsHost()
"compileroptionsbuilder"); ? "C:\\qt-creator\\src\\plugins\\cpptools\\compileroptionsbuilder.cpp"
: "/opt/qt-creator/src/plugins/cpptools/compileroptionsbuilder.cpp")},
"compileroptionsbuilder.cpp");
testData.getFilteredFlags(); testData.getFilteredFlags();
@@ -241,7 +243,7 @@ void CompilationDatabaseTests::testFilterCommand()
testData.fileName = "SemaCodeComplete.cpp"; testData.fileName = "SemaCodeComplete.cpp";
testData.workingDir = "C:/build-qt_llvm-msvc2017_64bit-Debug"; testData.workingDir = "C:/build-qt_llvm-msvc2017_64bit-Debug";
testData.flags = filterFromFileName(testData.getSplitCommandLine(kCmakeCommand), testData.flags = filterFromFileName(testData.getSplitCommandLine(kCmakeCommand),
"SemaCodeComplete"); "SemaCodeComplete.cpp");
testData.getFilteredFlags(); testData.getFilteredFlags();
if (Utils::HostOsInfo::isWindowsHost()) { if (Utils::HostOsInfo::isWindowsHost()) {
@@ -278,7 +280,7 @@ void CompilationDatabaseTests::testFileKindDifferentFromExtension2()
void CompilationDatabaseTests::testSkipOutputFiles() void CompilationDatabaseTests::testSkipOutputFiles()
{ {
CompilationDatabaseUtilsTestData testData; CompilationDatabaseUtilsTestData testData;
testData.flags = filterFromFileName(QStringList{"-o", "foo.o"}, "foo"); testData.flags = filterFromFileName(QStringList{"-o", "foo.o"}, "foo.cpp");
QVERIFY(testData.getFilteredFlags().isEmpty()); QVERIFY(testData.getFilteredFlags().isEmpty());
} }

View File

@@ -84,14 +84,24 @@ static CppEditor::ProjectFile::Kind fileKindFromString(QString flag)
return ProjectFile::Unclassified; 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; QStringList result;
result.reserve(flags.size()); result.reserve(flags.size());
for (const QString &flag : flags) { bool skipNext = false;
if (!flag.contains(baseName)) for (int i = 0; i < flags.size(); ++i) {
result.push_back(flag); 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; return result;

View File

@@ -177,7 +177,7 @@ static QStringList jsonObjectFlags(const QJsonObject &object, QSet<QString> &fla
return flags; return flags;
} }
static FilePath jsonObjectFilename(const QJsonObject &object) static FilePath jsonObjectFilePath(const QJsonObject &object)
{ {
const QString workingDir = QDir::cleanPath(object["directory"].toString()); const QString workingDir = QDir::cleanPath(object["directory"].toString());
FilePath fileName = FilePath::fromString(QDir::cleanPath(object["file"].toString())); FilePath fileName = FilePath::fromString(QDir::cleanPath(object["file"].toString()));
@@ -204,10 +204,10 @@ std::vector<DbEntry> CompilationDbParser::readJsonObjects() const
} }
const QJsonObject object = document.object(); const QJsonObject object = document.object();
const Utils::FilePath fileName = jsonObjectFilename(object); const Utils::FilePath filePath = jsonObjectFilePath(object);
const QStringList flags = filterFromFileName(jsonObjectFlags(object, flagsCache), const QStringList flags = filterFromFileName(jsonObjectFlags(object, flagsCache),
fileName.baseName()); filePath.fileName());
result.push_back({flags, fileName, object["directory"].toString()}); result.push_back({flags, filePath, object["directory"].toString()});
objectStart = m_projectFileContents.indexOf('{', objectEnd + 1); objectStart = m_projectFileContents.indexOf('{', objectEnd + 1);
objectEnd = m_projectFileContents.indexOf('}', objectStart + 1); objectEnd = m_projectFileContents.indexOf('}', objectStart + 1);