This fixes issues with `--` in the compile flags.
Fixes https://github.com/clangd/clangd/issues/632.
Differential Revision: https://reviews.llvm.org/D99523
#include "llvm/Support/MemoryBuffer.h"
#include "llvm/Support/Path.h"
#include "llvm/Support/Program.h"
+#include <string>
+#include <vector>
namespace clang {
namespace clangd {
Cmd = tooling::getStripPluginsAdjuster()(Cmd, "");
Cmd = tooling::getClangSyntaxOnlyAdjuster()(Cmd, "");
+ std::vector<std::string> ToAppend;
if (ResourceDir && !Has("-resource-dir"))
- Cmd.push_back(("-resource-dir=" + *ResourceDir));
+ ToAppend.push_back(("-resource-dir=" + *ResourceDir));
// Don't set `-isysroot` if it is already set or if `--sysroot` is set.
// `--sysroot` is a superset of the `-isysroot` argument.
if (Sysroot && !Has("-isysroot") && !Has("--sysroot")) {
- Cmd.push_back("-isysroot");
- Cmd.push_back(*Sysroot);
+ ToAppend.push_back("-isysroot");
+ ToAppend.push_back(*Sysroot);
+ }
+
+ if (!ToAppend.empty()) {
+ Cmd = tooling::getInsertArgumentAdjuster(
+ std::move(ToAppend), tooling::ArgumentInsertPosition::END)(Cmd, "");
}
if (!Cmd.empty()) {
Args.resize(Write);
}
-
std::string printArgv(llvm::ArrayRef<llvm::StringRef> Args) {
std::string Buf;
llvm::raw_string_ostream OS(Buf);
#include "llvm/Support/Regex.h"
#include "llvm/Support/SMLoc.h"
#include "llvm/Support/SourceMgr.h"
+#include <algorithm>
#include <string>
namespace clang {
Add.push_back(std::move(*A));
Out.Apply.push_back([Add(std::move(Add))](const Params &, Config &C) {
C.CompileFlags.Edits.push_back([Add](std::vector<std::string> &Args) {
- Args.insert(Args.end(), Add.begin(), Add.end());
+ // The point to insert at. Just append when `--` isn't present.
+ auto It = llvm::find(Args, "--");
+ Args.insert(It, Add.begin(), Add.end());
});
});
}
Mangler.ClangPath = testPath("fake/clang");
Mangler.ResourceDir = testPath("fake/resources");
Mangler.Sysroot = testPath("fake/sysroot");
- std::vector<std::string> Cmd = {"clang++", "-Xclang", "-load", "-Xclang",
- "plugin", "-MF", "dep", "foo.cc"};
+ std::vector<std::string> Cmd = {"clang++", "-Xclang", "-load",
+ "-Xclang", "plugin", "-MF",
+ "dep", "--", "foo.cc"};
Mangler.adjust(Cmd);
- EXPECT_THAT(Cmd, ElementsAre(testPath("fake/clang++"), "foo.cc",
- "-fsyntax-only",
+ EXPECT_THAT(Cmd, ElementsAre(testPath("fake/clang++"), "-fsyntax-only",
"-resource-dir=" + testPath("fake/resources"),
- "-isysroot", testPath("fake/sysroot")));
+ "-isysroot", testPath("fake/sysroot"), "--",
+ "foo.cc"));
}
TEST(CommandMangler, ResourceDir) {
} // namespace
} // namespace clangd
} // namespace clang
-
TEST_F(ConfigCompileTests, CompileCommands) {
Frag.CompileFlags.Add.emplace_back("-foo");
Frag.CompileFlags.Remove.emplace_back("--include-directory=");
- std::vector<std::string> Argv = {"clang", "-I", "bar/", "a.cc"};
+ std::vector<std::string> Argv = {"clang", "-I", "bar/", "--", "a.cc"};
EXPECT_TRUE(compileAndApply());
EXPECT_THAT(Conf.CompileFlags.Edits, SizeIs(2));
for (auto &Edit : Conf.CompileFlags.Edits)
Edit(Argv);
- EXPECT_THAT(Argv, ElementsAre("clang", "a.cc", "-foo"));
+ EXPECT_THAT(Argv, ElementsAre("clang", "-foo", "--", "a.cc"));
}
TEST_F(ConfigCompileTests, CompilationDatabase) {