forked from qt-creator/qt-creator
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:
@@ -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());
|
||||||
}
|
}
|
||||||
|
@@ -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;
|
||||||
|
@@ -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);
|
||||||
|
Reference in New Issue
Block a user