diff --git a/src/plugins/compilationdatabaseprojectmanager/compilationdatabaseproject.cpp b/src/plugins/compilationdatabaseprojectmanager/compilationdatabaseproject.cpp index 48a3879d621..198cd7c62dd 100644 --- a/src/plugins/compilationdatabaseprojectmanager/compilationdatabaseproject.cpp +++ b/src/plugins/compilationdatabaseprojectmanager/compilationdatabaseproject.cpp @@ -178,7 +178,7 @@ void addDriverModeFlagIfNeeded(const ToolChain *toolchain, QStringList &flags) if (toolchain->typeId() == ProjectExplorer::Constants::CLANG_CL_TOOLCHAIN_TYPEID && !flags.empty() && !flags.front().endsWith("cl") && !flags.front().endsWith("cl.exe")) { - flags.insert(1, "--driver-mode=g++"); + flags.prepend("--driver-mode=g++"); } } diff --git a/src/plugins/compilationdatabaseprojectmanager/compilationdatabaseutils.cpp b/src/plugins/compilationdatabaseprojectmanager/compilationdatabaseutils.cpp index 30ad52160ed..2dd20dd9e5f 100644 --- a/src/plugins/compilationdatabaseprojectmanager/compilationdatabaseutils.cpp +++ b/src/plugins/compilationdatabaseprojectmanager/compilationdatabaseutils.cpp @@ -49,9 +49,12 @@ static QString updatedPathFlag(const QString &pathStr, const QString &workingDir return result; } -static CppTools::ProjectFile::Kind fileKindFromString(const QString &flag) +static CppTools::ProjectFile::Kind fileKindFromString(QString flag) { using namespace CppTools; + if (flag.startsWith("-x")) + flag = flag.mid(2); + if (flag == "c++-header") return ProjectFile::CXXHeader; if (flag == "c-header") @@ -118,8 +121,14 @@ void filteredFlags(const QString &fileName, continue; } - if (fileKindIsNext || flag == "/TC" || flag == "/TP" - || flag.startsWith("/Tc") || flag.startsWith("/Tp")) { + if (flag == "-o") { + skipNext = true; + continue; + } + + if (flag != "-x" + && (fileKindIsNext || flag == "/TC" || flag == "/TP" + || flag.startsWith("/Tc") || flag.startsWith("/Tp") || flag.startsWith("-x"))) { fileKindIsNext = false; fileKind = fileKindFromString(flag); continue; diff --git a/tests/unit/unittest/compilationdatabaseutils-test.cpp b/tests/unit/unittest/compilationdatabaseutils-test.cpp index 20a27b42354..2d528b9793a 100644 --- a/tests/unit/unittest/compilationdatabaseutils-test.cpp +++ b/tests/unit/unittest/compilationdatabaseutils-test.cpp @@ -166,4 +166,34 @@ TEST_F(CompilationDatabaseUtils, FilterCommand) ASSERT_THAT(fileKind, CppTools::ProjectFile::Kind::CXXSource); } +TEST_F(CompilationDatabaseUtils, FileKindDifferentFromExtension) +{ + fileName = "foo.c"; + flags = QStringList{"-xc++"}; + + filteredFlags(fileName, workingDir, flags, headerPaths, macros, fileKind); + + ASSERT_THAT(fileKind, CppTools::ProjectFile::Kind::CXXSource); +} + +TEST_F(CompilationDatabaseUtils, FileKindDifferentFromExtension2) +{ + fileName = "foo.cpp"; + flags = QStringList{"-x", "c"}; + + filteredFlags(fileName, workingDir, flags, headerPaths, macros, fileKind); + + ASSERT_THAT(fileKind, CppTools::ProjectFile::Kind::CSource); +} + +TEST_F(CompilationDatabaseUtils, SkipOutputFiles) +{ + fileName = "foo.cpp"; + flags = QStringList{"-o", "foo.o"}; + + filteredFlags(fileName, workingDir, flags, headerPaths, macros, fileKind); + + ASSERT_THAT(flags.isEmpty(), true); +} + }