2018-04-20 19:35:17 +08:00
|
|
|
//===-- GlobalCompilationDatabaseTests.cpp ----------------------*- C++ -*-===//
|
|
|
|
//
|
2019-01-19 16:50:56 +08:00
|
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
2018-04-20 19:35:17 +08:00
|
|
|
//
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
|
|
|
|
#include "GlobalCompilationDatabase.h"
|
|
|
|
|
2019-07-11 17:54:31 +08:00
|
|
|
#include "Path.h"
|
2018-04-20 19:35:17 +08:00
|
|
|
#include "TestFS.h"
|
2019-07-19 00:13:23 +08:00
|
|
|
#include "clang/Tooling/CompilationDatabase.h"
|
2019-07-11 17:54:31 +08:00
|
|
|
#include "llvm/ADT/Optional.h"
|
|
|
|
#include "llvm/ADT/SmallString.h"
|
2018-04-20 19:35:17 +08:00
|
|
|
#include "llvm/ADT/StringExtras.h"
|
2019-07-11 17:54:31 +08:00
|
|
|
#include "llvm/ADT/StringRef.h"
|
|
|
|
#include "llvm/Support/FileSystem.h"
|
|
|
|
#include "llvm/Support/FormatVariadic.h"
|
|
|
|
#include "llvm/Support/MemoryBuffer.h"
|
|
|
|
#include "llvm/Support/Path.h"
|
|
|
|
#include "llvm/Support/raw_ostream.h"
|
2018-04-20 19:35:17 +08:00
|
|
|
#include "gmock/gmock.h"
|
|
|
|
#include "gtest/gtest.h"
|
2019-07-11 17:54:31 +08:00
|
|
|
#include <fstream>
|
|
|
|
#include <string>
|
2018-04-20 19:35:17 +08:00
|
|
|
|
|
|
|
namespace clang {
|
|
|
|
namespace clangd {
|
|
|
|
namespace {
|
[clangd] Adjust compile commands to be applicable for tooling
Summary:
As can be seen in https://github.com/llvm-mirror/clang/blob/master/lib/Tooling/Tooling.cpp#L385
clang tool invocations adjust commands normally like this. In clangd we have
different code paths for invoking a frontend action(preamble builds, ast builds,
background index, clangd-indexer) they all work on the same GlobalCompilationDatabase
abstraction, but later on are subject to different modifications.
This patch makes sure all of the clangd actions make use of the same compile
commands before invocation.
Enables background-index to work on chromium codebase(since they had dependency
file output in their compile commands).
Reviewers: gribozavr, hokein
Subscribers: ilya-biryukov, ioeric, MaskRay, jkorous, arphaman, jdoerfert, cfe-commits
Tags: #clang
Differential Revision: https://reviews.llvm.org/D59086
llvm-svn: 355669
2019-03-08 16:38:25 +08:00
|
|
|
using ::testing::AllOf;
|
|
|
|
using ::testing::Contains;
|
2018-04-20 19:35:17 +08:00
|
|
|
using ::testing::ElementsAre;
|
2019-01-07 20:35:02 +08:00
|
|
|
using ::testing::EndsWith;
|
2019-07-19 00:13:23 +08:00
|
|
|
using ::testing::HasSubstr;
|
2019-07-11 17:54:31 +08:00
|
|
|
using ::testing::IsEmpty;
|
[clangd] Adjust compile commands to be applicable for tooling
Summary:
As can be seen in https://github.com/llvm-mirror/clang/blob/master/lib/Tooling/Tooling.cpp#L385
clang tool invocations adjust commands normally like this. In clangd we have
different code paths for invoking a frontend action(preamble builds, ast builds,
background index, clangd-indexer) they all work on the same GlobalCompilationDatabase
abstraction, but later on are subject to different modifications.
This patch makes sure all of the clangd actions make use of the same compile
commands before invocation.
Enables background-index to work on chromium codebase(since they had dependency
file output in their compile commands).
Reviewers: gribozavr, hokein
Subscribers: ilya-biryukov, ioeric, MaskRay, jkorous, arphaman, jdoerfert, cfe-commits
Tags: #clang
Differential Revision: https://reviews.llvm.org/D59086
llvm-svn: 355669
2019-03-08 16:38:25 +08:00
|
|
|
using ::testing::Not;
|
2019-06-04 21:38:36 +08:00
|
|
|
using ::testing::StartsWith;
|
2019-07-11 17:54:31 +08:00
|
|
|
using ::testing::UnorderedElementsAre;
|
2018-04-20 19:35:17 +08:00
|
|
|
|
|
|
|
TEST(GlobalCompilationDatabaseTest, FallbackCommand) {
|
2018-10-20 23:30:37 +08:00
|
|
|
DirectoryBasedGlobalCompilationDatabase DB(None);
|
2018-04-20 19:35:17 +08:00
|
|
|
auto Cmd = DB.getFallbackCommand(testPath("foo/bar.cc"));
|
|
|
|
EXPECT_EQ(Cmd.Directory, testPath("foo"));
|
[clangd] (take 2) Try harder to find a plausible `clang` as argv0, particularly on Mac.
Summary:
This was originally committed in 88bccded8fa169481fa367debf5ec615640635a1,
and reverted in 93f77617abba512d2861e2fc50ce385883f587b6.
This version is now much more testable: the "detect toolchain properties" part
is still not tested but also not active in tests.
All the command manipulation based on the detected properties is
directly tested, and also not active in other tests.
Fixes https://github.com/clangd/clangd/issues/211
Fixes https://github.com/clangd/clangd/issues/178
Reviewers: kbobyrev, ilya-biryukov
Subscribers: mgorny, ormris, cfe-commits, usaxena95, kadircet, arphaman, jkorous, MaskRay
Tags: #clang
Differential Revision: https://reviews.llvm.org/D71029
2019-11-30 02:37:48 +08:00
|
|
|
EXPECT_THAT(Cmd.CommandLine, ElementsAre("clang", testPath("foo/bar.cc")));
|
2018-04-20 19:35:17 +08:00
|
|
|
EXPECT_EQ(Cmd.Output, "");
|
|
|
|
|
|
|
|
// .h files have unknown language, so they are parsed liberally as obj-c++.
|
|
|
|
Cmd = DB.getFallbackCommand(testPath("foo/bar.h"));
|
[clangd] (take 2) Try harder to find a plausible `clang` as argv0, particularly on Mac.
Summary:
This was originally committed in 88bccded8fa169481fa367debf5ec615640635a1,
and reverted in 93f77617abba512d2861e2fc50ce385883f587b6.
This version is now much more testable: the "detect toolchain properties" part
is still not tested but also not active in tests.
All the command manipulation based on the detected properties is
directly tested, and also not active in other tests.
Fixes https://github.com/clangd/clangd/issues/211
Fixes https://github.com/clangd/clangd/issues/178
Reviewers: kbobyrev, ilya-biryukov
Subscribers: mgorny, ormris, cfe-commits, usaxena95, kadircet, arphaman, jkorous, MaskRay
Tags: #clang
Differential Revision: https://reviews.llvm.org/D71029
2019-11-30 02:37:48 +08:00
|
|
|
EXPECT_THAT(Cmd.CommandLine, ElementsAre("clang", "-xobjective-c++-header",
|
|
|
|
testPath("foo/bar.h")));
|
2019-06-18 19:54:17 +08:00
|
|
|
Cmd = DB.getFallbackCommand(testPath("foo/bar"));
|
[clangd] (take 2) Try harder to find a plausible `clang` as argv0, particularly on Mac.
Summary:
This was originally committed in 88bccded8fa169481fa367debf5ec615640635a1,
and reverted in 93f77617abba512d2861e2fc50ce385883f587b6.
This version is now much more testable: the "detect toolchain properties" part
is still not tested but also not active in tests.
All the command manipulation based on the detected properties is
directly tested, and also not active in other tests.
Fixes https://github.com/clangd/clangd/issues/211
Fixes https://github.com/clangd/clangd/issues/178
Reviewers: kbobyrev, ilya-biryukov
Subscribers: mgorny, ormris, cfe-commits, usaxena95, kadircet, arphaman, jkorous, MaskRay
Tags: #clang
Differential Revision: https://reviews.llvm.org/D71029
2019-11-30 02:37:48 +08:00
|
|
|
EXPECT_THAT(Cmd.CommandLine, ElementsAre("clang", "-xobjective-c++-header",
|
|
|
|
testPath("foo/bar")));
|
2018-04-20 19:35:17 +08:00
|
|
|
}
|
|
|
|
|
2019-01-07 23:45:19 +08:00
|
|
|
static tooling::CompileCommand cmd(llvm::StringRef File, llvm::StringRef Arg) {
|
2020-01-29 03:23:46 +08:00
|
|
|
return tooling::CompileCommand(
|
|
|
|
testRoot(), File, {"clang", std::string(Arg), std::string(File)}, "");
|
2018-11-02 21:09:36 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
class OverlayCDBTest : public ::testing::Test {
|
|
|
|
class BaseCDB : public GlobalCompilationDatabase {
|
|
|
|
public:
|
2019-01-07 23:45:19 +08:00
|
|
|
llvm::Optional<tooling::CompileCommand>
|
2019-07-11 17:54:31 +08:00
|
|
|
getCompileCommand(llvm::StringRef File) const override {
|
|
|
|
if (File == testPath("foo.cc"))
|
2018-11-02 21:09:36 +08:00
|
|
|
return cmd(File, "-DA=1");
|
|
|
|
return None;
|
|
|
|
}
|
|
|
|
|
2019-01-07 23:45:19 +08:00
|
|
|
tooling::CompileCommand
|
|
|
|
getFallbackCommand(llvm::StringRef File) const override {
|
2018-11-02 21:09:36 +08:00
|
|
|
return cmd(File, "-DA=2");
|
|
|
|
}
|
2019-07-11 17:54:31 +08:00
|
|
|
|
|
|
|
llvm::Optional<ProjectInfo> getProjectInfo(PathRef File) const override {
|
|
|
|
return ProjectInfo{testRoot()};
|
|
|
|
}
|
2018-11-02 21:09:36 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
protected:
|
2019-08-15 07:52:23 +08:00
|
|
|
OverlayCDBTest() : Base(std::make_unique<BaseCDB>()) {}
|
2018-11-02 21:09:36 +08:00
|
|
|
std::unique_ptr<GlobalCompilationDatabase> Base;
|
|
|
|
};
|
|
|
|
|
|
|
|
TEST_F(OverlayCDBTest, GetCompileCommand) {
|
[clangd] (take 2) Try harder to find a plausible `clang` as argv0, particularly on Mac.
Summary:
This was originally committed in 88bccded8fa169481fa367debf5ec615640635a1,
and reverted in 93f77617abba512d2861e2fc50ce385883f587b6.
This version is now much more testable: the "detect toolchain properties" part
is still not tested but also not active in tests.
All the command manipulation based on the detected properties is
directly tested, and also not active in other tests.
Fixes https://github.com/clangd/clangd/issues/211
Fixes https://github.com/clangd/clangd/issues/178
Reviewers: kbobyrev, ilya-biryukov
Subscribers: mgorny, ormris, cfe-commits, usaxena95, kadircet, arphaman, jkorous, MaskRay
Tags: #clang
Differential Revision: https://reviews.llvm.org/D71029
2019-11-30 02:37:48 +08:00
|
|
|
OverlayCDB CDB(Base.get());
|
[clangd] Adjust compile commands to be applicable for tooling
Summary:
As can be seen in https://github.com/llvm-mirror/clang/blob/master/lib/Tooling/Tooling.cpp#L385
clang tool invocations adjust commands normally like this. In clangd we have
different code paths for invoking a frontend action(preamble builds, ast builds,
background index, clangd-indexer) they all work on the same GlobalCompilationDatabase
abstraction, but later on are subject to different modifications.
This patch makes sure all of the clangd actions make use of the same compile
commands before invocation.
Enables background-index to work on chromium codebase(since they had dependency
file output in their compile commands).
Reviewers: gribozavr, hokein
Subscribers: ilya-biryukov, ioeric, MaskRay, jkorous, arphaman, jdoerfert, cfe-commits
Tags: #clang
Differential Revision: https://reviews.llvm.org/D59086
llvm-svn: 355669
2019-03-08 16:38:25 +08:00
|
|
|
EXPECT_THAT(CDB.getCompileCommand(testPath("foo.cc"))->CommandLine,
|
|
|
|
AllOf(Contains(testPath("foo.cc")), Contains("-DA=1")));
|
2018-11-02 21:09:36 +08:00
|
|
|
EXPECT_EQ(CDB.getCompileCommand(testPath("missing.cc")), llvm::None);
|
|
|
|
|
|
|
|
auto Override = cmd(testPath("foo.cc"), "-DA=3");
|
|
|
|
CDB.setCompileCommand(testPath("foo.cc"), Override);
|
[clangd] Adjust compile commands to be applicable for tooling
Summary:
As can be seen in https://github.com/llvm-mirror/clang/blob/master/lib/Tooling/Tooling.cpp#L385
clang tool invocations adjust commands normally like this. In clangd we have
different code paths for invoking a frontend action(preamble builds, ast builds,
background index, clangd-indexer) they all work on the same GlobalCompilationDatabase
abstraction, but later on are subject to different modifications.
This patch makes sure all of the clangd actions make use of the same compile
commands before invocation.
Enables background-index to work on chromium codebase(since they had dependency
file output in their compile commands).
Reviewers: gribozavr, hokein
Subscribers: ilya-biryukov, ioeric, MaskRay, jkorous, arphaman, jdoerfert, cfe-commits
Tags: #clang
Differential Revision: https://reviews.llvm.org/D59086
llvm-svn: 355669
2019-03-08 16:38:25 +08:00
|
|
|
EXPECT_THAT(CDB.getCompileCommand(testPath("foo.cc"))->CommandLine,
|
|
|
|
Contains("-DA=3"));
|
2018-11-02 21:09:36 +08:00
|
|
|
EXPECT_EQ(CDB.getCompileCommand(testPath("missing.cc")), llvm::None);
|
|
|
|
CDB.setCompileCommand(testPath("missing.cc"), Override);
|
[clangd] Adjust compile commands to be applicable for tooling
Summary:
As can be seen in https://github.com/llvm-mirror/clang/blob/master/lib/Tooling/Tooling.cpp#L385
clang tool invocations adjust commands normally like this. In clangd we have
different code paths for invoking a frontend action(preamble builds, ast builds,
background index, clangd-indexer) they all work on the same GlobalCompilationDatabase
abstraction, but later on are subject to different modifications.
This patch makes sure all of the clangd actions make use of the same compile
commands before invocation.
Enables background-index to work on chromium codebase(since they had dependency
file output in their compile commands).
Reviewers: gribozavr, hokein
Subscribers: ilya-biryukov, ioeric, MaskRay, jkorous, arphaman, jdoerfert, cfe-commits
Tags: #clang
Differential Revision: https://reviews.llvm.org/D59086
llvm-svn: 355669
2019-03-08 16:38:25 +08:00
|
|
|
EXPECT_THAT(CDB.getCompileCommand(testPath("missing.cc"))->CommandLine,
|
|
|
|
Contains("-DA=3"));
|
2018-11-02 21:09:36 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(OverlayCDBTest, GetFallbackCommand) {
|
|
|
|
OverlayCDB CDB(Base.get(), {"-DA=4"});
|
2019-12-03 05:12:23 +08:00
|
|
|
EXPECT_THAT(CDB.getFallbackCommand(testPath("bar.cc")).CommandLine,
|
[clangd] (take 2) Try harder to find a plausible `clang` as argv0, particularly on Mac.
Summary:
This was originally committed in 88bccded8fa169481fa367debf5ec615640635a1,
and reverted in 93f77617abba512d2861e2fc50ce385883f587b6.
This version is now much more testable: the "detect toolchain properties" part
is still not tested but also not active in tests.
All the command manipulation based on the detected properties is
directly tested, and also not active in other tests.
Fixes https://github.com/clangd/clangd/issues/211
Fixes https://github.com/clangd/clangd/issues/178
Reviewers: kbobyrev, ilya-biryukov
Subscribers: mgorny, ormris, cfe-commits, usaxena95, kadircet, arphaman, jkorous, MaskRay
Tags: #clang
Differential Revision: https://reviews.llvm.org/D71029
2019-11-30 02:37:48 +08:00
|
|
|
ElementsAre("clang", "-DA=2", testPath("bar.cc"), "-DA=4"));
|
2018-11-02 21:09:36 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(OverlayCDBTest, NoBase) {
|
[clangd] (take 2) Try harder to find a plausible `clang` as argv0, particularly on Mac.
Summary:
This was originally committed in 88bccded8fa169481fa367debf5ec615640635a1,
and reverted in 93f77617abba512d2861e2fc50ce385883f587b6.
This version is now much more testable: the "detect toolchain properties" part
is still not tested but also not active in tests.
All the command manipulation based on the detected properties is
directly tested, and also not active in other tests.
Fixes https://github.com/clangd/clangd/issues/211
Fixes https://github.com/clangd/clangd/issues/178
Reviewers: kbobyrev, ilya-biryukov
Subscribers: mgorny, ormris, cfe-commits, usaxena95, kadircet, arphaman, jkorous, MaskRay
Tags: #clang
Differential Revision: https://reviews.llvm.org/D71029
2019-11-30 02:37:48 +08:00
|
|
|
OverlayCDB CDB(nullptr, {"-DA=6"});
|
2018-11-02 21:09:36 +08:00
|
|
|
EXPECT_EQ(CDB.getCompileCommand(testPath("bar.cc")), None);
|
|
|
|
auto Override = cmd(testPath("bar.cc"), "-DA=5");
|
|
|
|
CDB.setCompileCommand(testPath("bar.cc"), Override);
|
[clangd] Adjust compile commands to be applicable for tooling
Summary:
As can be seen in https://github.com/llvm-mirror/clang/blob/master/lib/Tooling/Tooling.cpp#L385
clang tool invocations adjust commands normally like this. In clangd we have
different code paths for invoking a frontend action(preamble builds, ast builds,
background index, clangd-indexer) they all work on the same GlobalCompilationDatabase
abstraction, but later on are subject to different modifications.
This patch makes sure all of the clangd actions make use of the same compile
commands before invocation.
Enables background-index to work on chromium codebase(since they had dependency
file output in their compile commands).
Reviewers: gribozavr, hokein
Subscribers: ilya-biryukov, ioeric, MaskRay, jkorous, arphaman, jdoerfert, cfe-commits
Tags: #clang
Differential Revision: https://reviews.llvm.org/D59086
llvm-svn: 355669
2019-03-08 16:38:25 +08:00
|
|
|
EXPECT_THAT(CDB.getCompileCommand(testPath("bar.cc"))->CommandLine,
|
|
|
|
Contains("-DA=5"));
|
2018-11-02 21:09:36 +08:00
|
|
|
|
2019-12-03 05:12:23 +08:00
|
|
|
EXPECT_THAT(CDB.getFallbackCommand(testPath("foo.cc")).CommandLine,
|
[clangd] (take 2) Try harder to find a plausible `clang` as argv0, particularly on Mac.
Summary:
This was originally committed in 88bccded8fa169481fa367debf5ec615640635a1,
and reverted in 93f77617abba512d2861e2fc50ce385883f587b6.
This version is now much more testable: the "detect toolchain properties" part
is still not tested but also not active in tests.
All the command manipulation based on the detected properties is
directly tested, and also not active in other tests.
Fixes https://github.com/clangd/clangd/issues/211
Fixes https://github.com/clangd/clangd/issues/178
Reviewers: kbobyrev, ilya-biryukov
Subscribers: mgorny, ormris, cfe-commits, usaxena95, kadircet, arphaman, jkorous, MaskRay
Tags: #clang
Differential Revision: https://reviews.llvm.org/D71029
2019-11-30 02:37:48 +08:00
|
|
|
ElementsAre("clang", testPath("foo.cc"), "-DA=6"));
|
2018-11-02 21:09:36 +08:00
|
|
|
}
|
|
|
|
|
2018-11-20 18:56:03 +08:00
|
|
|
TEST_F(OverlayCDBTest, Watch) {
|
|
|
|
OverlayCDB Inner(nullptr);
|
|
|
|
OverlayCDB Outer(&Inner);
|
|
|
|
|
|
|
|
std::vector<std::vector<std::string>> Changes;
|
|
|
|
auto Sub = Outer.watch([&](const std::vector<std::string> &ChangedFiles) {
|
|
|
|
Changes.push_back(ChangedFiles);
|
|
|
|
});
|
|
|
|
|
|
|
|
Inner.setCompileCommand("A.cpp", tooling::CompileCommand());
|
|
|
|
Outer.setCompileCommand("B.cpp", tooling::CompileCommand());
|
|
|
|
Inner.setCompileCommand("A.cpp", llvm::None);
|
|
|
|
Outer.setCompileCommand("C.cpp", llvm::None);
|
|
|
|
EXPECT_THAT(Changes, ElementsAre(ElementsAre("A.cpp"), ElementsAre("B.cpp"),
|
|
|
|
ElementsAre("A.cpp"), ElementsAre("C.cpp")));
|
|
|
|
}
|
|
|
|
|
[clangd] Adjust compile commands to be applicable for tooling
Summary:
As can be seen in https://github.com/llvm-mirror/clang/blob/master/lib/Tooling/Tooling.cpp#L385
clang tool invocations adjust commands normally like this. In clangd we have
different code paths for invoking a frontend action(preamble builds, ast builds,
background index, clangd-indexer) they all work on the same GlobalCompilationDatabase
abstraction, but later on are subject to different modifications.
This patch makes sure all of the clangd actions make use of the same compile
commands before invocation.
Enables background-index to work on chromium codebase(since they had dependency
file output in their compile commands).
Reviewers: gribozavr, hokein
Subscribers: ilya-biryukov, ioeric, MaskRay, jkorous, arphaman, jdoerfert, cfe-commits
Tags: #clang
Differential Revision: https://reviews.llvm.org/D59086
llvm-svn: 355669
2019-03-08 16:38:25 +08:00
|
|
|
TEST_F(OverlayCDBTest, Adjustments) {
|
[clangd] (take 2) Try harder to find a plausible `clang` as argv0, particularly on Mac.
Summary:
This was originally committed in 88bccded8fa169481fa367debf5ec615640635a1,
and reverted in 93f77617abba512d2861e2fc50ce385883f587b6.
This version is now much more testable: the "detect toolchain properties" part
is still not tested but also not active in tests.
All the command manipulation based on the detected properties is
directly tested, and also not active in other tests.
Fixes https://github.com/clangd/clangd/issues/211
Fixes https://github.com/clangd/clangd/issues/178
Reviewers: kbobyrev, ilya-biryukov
Subscribers: mgorny, ormris, cfe-commits, usaxena95, kadircet, arphaman, jkorous, MaskRay
Tags: #clang
Differential Revision: https://reviews.llvm.org/D71029
2019-11-30 02:37:48 +08:00
|
|
|
OverlayCDB CDB(Base.get(), {"-DFallback"},
|
|
|
|
[](const std::vector<std::string> &Cmd, llvm::StringRef File) {
|
|
|
|
auto Ret = Cmd;
|
|
|
|
Ret.push_back(
|
|
|
|
("-DAdjust_" + llvm::sys::path::filename(File)).str());
|
|
|
|
return Ret;
|
|
|
|
});
|
|
|
|
// Command from underlying gets adjusted.
|
[clangd] Adjust compile commands to be applicable for tooling
Summary:
As can be seen in https://github.com/llvm-mirror/clang/blob/master/lib/Tooling/Tooling.cpp#L385
clang tool invocations adjust commands normally like this. In clangd we have
different code paths for invoking a frontend action(preamble builds, ast builds,
background index, clangd-indexer) they all work on the same GlobalCompilationDatabase
abstraction, but later on are subject to different modifications.
This patch makes sure all of the clangd actions make use of the same compile
commands before invocation.
Enables background-index to work on chromium codebase(since they had dependency
file output in their compile commands).
Reviewers: gribozavr, hokein
Subscribers: ilya-biryukov, ioeric, MaskRay, jkorous, arphaman, jdoerfert, cfe-commits
Tags: #clang
Differential Revision: https://reviews.llvm.org/D59086
llvm-svn: 355669
2019-03-08 16:38:25 +08:00
|
|
|
auto Cmd = CDB.getCompileCommand(testPath("foo.cc")).getValue();
|
[clangd] (take 2) Try harder to find a plausible `clang` as argv0, particularly on Mac.
Summary:
This was originally committed in 88bccded8fa169481fa367debf5ec615640635a1,
and reverted in 93f77617abba512d2861e2fc50ce385883f587b6.
This version is now much more testable: the "detect toolchain properties" part
is still not tested but also not active in tests.
All the command manipulation based on the detected properties is
directly tested, and also not active in other tests.
Fixes https://github.com/clangd/clangd/issues/211
Fixes https://github.com/clangd/clangd/issues/178
Reviewers: kbobyrev, ilya-biryukov
Subscribers: mgorny, ormris, cfe-commits, usaxena95, kadircet, arphaman, jkorous, MaskRay
Tags: #clang
Differential Revision: https://reviews.llvm.org/D71029
2019-11-30 02:37:48 +08:00
|
|
|
EXPECT_THAT(Cmd.CommandLine, ElementsAre("clang", "-DA=1", testPath("foo.cc"),
|
|
|
|
"-DAdjust_foo.cc"));
|
|
|
|
|
|
|
|
// Command from overlay gets adjusted.
|
|
|
|
tooling::CompileCommand BarCommand;
|
|
|
|
BarCommand.Filename = testPath("bar.cc");
|
|
|
|
BarCommand.CommandLine = {"clang++", "-DB=1", testPath("bar.cc")};
|
|
|
|
CDB.setCompileCommand(testPath("bar.cc"), BarCommand);
|
|
|
|
Cmd = CDB.getCompileCommand(testPath("bar.cc")).getValue();
|
|
|
|
EXPECT_THAT(
|
|
|
|
Cmd.CommandLine,
|
|
|
|
ElementsAre("clang++", "-DB=1", testPath("bar.cc"), "-DAdjust_bar.cc"));
|
|
|
|
|
|
|
|
// Fallback gets adjusted.
|
|
|
|
Cmd = CDB.getFallbackCommand("baz.cc");
|
|
|
|
EXPECT_THAT(Cmd.CommandLine, ElementsAre("clang", "-DA=2", "baz.cc",
|
|
|
|
"-DFallback", "-DAdjust_baz.cc"));
|
[clangd] Adjust compile commands to be applicable for tooling
Summary:
As can be seen in https://github.com/llvm-mirror/clang/blob/master/lib/Tooling/Tooling.cpp#L385
clang tool invocations adjust commands normally like this. In clangd we have
different code paths for invoking a frontend action(preamble builds, ast builds,
background index, clangd-indexer) they all work on the same GlobalCompilationDatabase
abstraction, but later on are subject to different modifications.
This patch makes sure all of the clangd actions make use of the same compile
commands before invocation.
Enables background-index to work on chromium codebase(since they had dependency
file output in their compile commands).
Reviewers: gribozavr, hokein
Subscribers: ilya-biryukov, ioeric, MaskRay, jkorous, arphaman, jdoerfert, cfe-commits
Tags: #clang
Differential Revision: https://reviews.llvm.org/D59086
llvm-svn: 355669
2019-03-08 16:38:25 +08:00
|
|
|
}
|
|
|
|
|
2019-07-11 17:54:31 +08:00
|
|
|
TEST(GlobalCompilationDatabaseTest, DiscoveryWithNestedCDBs) {
|
|
|
|
const char *const CDBOuter =
|
|
|
|
R"cdb(
|
|
|
|
[
|
|
|
|
{
|
|
|
|
"file": "a.cc",
|
|
|
|
"command": "",
|
|
|
|
"directory": "{0}",
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"file": "build/gen.cc",
|
|
|
|
"command": "",
|
|
|
|
"directory": "{0}",
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"file": "build/gen2.cc",
|
|
|
|
"command": "",
|
|
|
|
"directory": "{0}",
|
|
|
|
}
|
|
|
|
]
|
|
|
|
)cdb";
|
|
|
|
const char *const CDBInner =
|
|
|
|
R"cdb(
|
|
|
|
[
|
|
|
|
{
|
|
|
|
"file": "gen.cc",
|
|
|
|
"command": "",
|
|
|
|
"directory": "{0}/build",
|
|
|
|
}
|
|
|
|
]
|
|
|
|
)cdb";
|
|
|
|
class CleaningFS {
|
|
|
|
public:
|
|
|
|
llvm::SmallString<128> Root;
|
|
|
|
|
|
|
|
CleaningFS() {
|
|
|
|
EXPECT_FALSE(
|
|
|
|
llvm::sys::fs::createUniqueDirectory("clangd-cdb-test", Root))
|
|
|
|
<< "Failed to create unique directory";
|
|
|
|
}
|
|
|
|
|
|
|
|
~CleaningFS() {
|
|
|
|
EXPECT_FALSE(llvm::sys::fs::remove_directories(Root))
|
|
|
|
<< "Failed to cleanup " << Root;
|
|
|
|
}
|
|
|
|
|
|
|
|
void registerFile(PathRef RelativePath, llvm::StringRef Contents) {
|
|
|
|
llvm::SmallString<128> AbsPath(Root);
|
|
|
|
llvm::sys::path::append(AbsPath, RelativePath);
|
|
|
|
|
|
|
|
EXPECT_FALSE(llvm::sys::fs::create_directories(
|
|
|
|
llvm::sys::path::parent_path(AbsPath)))
|
|
|
|
<< "Failed to create directories for: " << AbsPath;
|
|
|
|
|
|
|
|
std::error_code EC;
|
|
|
|
llvm::raw_fd_ostream OS(AbsPath, EC);
|
|
|
|
EXPECT_FALSE(EC) << "Failed to open " << AbsPath << " for writing";
|
|
|
|
OS << llvm::formatv(Contents.data(),
|
|
|
|
llvm::sys::path::convert_to_slash(Root));
|
|
|
|
OS.close();
|
|
|
|
|
|
|
|
EXPECT_FALSE(OS.has_error());
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
CleaningFS FS;
|
|
|
|
FS.registerFile("compile_commands.json", CDBOuter);
|
|
|
|
FS.registerFile("build/compile_commands.json", CDBInner);
|
2019-07-11 18:41:58 +08:00
|
|
|
llvm::SmallString<128> File;
|
2019-07-11 17:54:31 +08:00
|
|
|
|
|
|
|
// Note that gen2.cc goes missing with our following model, not sure this
|
|
|
|
// happens in practice though.
|
|
|
|
{
|
|
|
|
DirectoryBasedGlobalCompilationDatabase DB(llvm::None);
|
|
|
|
std::vector<std::string> DiscoveredFiles;
|
|
|
|
auto Sub =
|
|
|
|
DB.watch([&DiscoveredFiles](const std::vector<std::string> Changes) {
|
|
|
|
DiscoveredFiles = Changes;
|
|
|
|
});
|
2019-07-11 18:41:58 +08:00
|
|
|
|
|
|
|
File = FS.Root;
|
2019-07-19 00:13:23 +08:00
|
|
|
llvm::sys::path::append(File, "build", "..", "a.cc");
|
2019-07-11 18:41:58 +08:00
|
|
|
DB.getCompileCommand(File.str());
|
2019-07-19 00:13:23 +08:00
|
|
|
EXPECT_THAT(DiscoveredFiles, UnorderedElementsAre(AllOf(
|
|
|
|
EndsWith("a.cc"), Not(HasSubstr("..")))));
|
2019-07-11 18:41:58 +08:00
|
|
|
DiscoveredFiles.clear();
|
2019-07-11 17:54:31 +08:00
|
|
|
|
2019-07-11 18:41:58 +08:00
|
|
|
File = FS.Root;
|
|
|
|
llvm::sys::path::append(File, "build", "gen.cc");
|
|
|
|
DB.getCompileCommand(File.str());
|
2019-07-11 17:54:31 +08:00
|
|
|
EXPECT_THAT(DiscoveredFiles, UnorderedElementsAre(EndsWith("gen.cc")));
|
|
|
|
}
|
|
|
|
|
|
|
|
// With a custom compile commands dir.
|
|
|
|
{
|
|
|
|
DirectoryBasedGlobalCompilationDatabase DB(FS.Root.str().str());
|
|
|
|
std::vector<std::string> DiscoveredFiles;
|
|
|
|
auto Sub =
|
|
|
|
DB.watch([&DiscoveredFiles](const std::vector<std::string> Changes) {
|
|
|
|
DiscoveredFiles = Changes;
|
|
|
|
});
|
2019-07-11 18:41:58 +08:00
|
|
|
|
|
|
|
File = FS.Root;
|
|
|
|
llvm::sys::path::append(File, "a.cc");
|
|
|
|
DB.getCompileCommand(File.str());
|
2019-07-11 17:54:31 +08:00
|
|
|
EXPECT_THAT(DiscoveredFiles,
|
|
|
|
UnorderedElementsAre(EndsWith("a.cc"), EndsWith("gen.cc"),
|
|
|
|
EndsWith("gen2.cc")));
|
|
|
|
DiscoveredFiles.clear();
|
2019-07-11 18:41:58 +08:00
|
|
|
|
|
|
|
File = FS.Root;
|
|
|
|
llvm::sys::path::append(File, "build", "gen.cc");
|
|
|
|
DB.getCompileCommand(File.str());
|
2019-07-11 17:54:31 +08:00
|
|
|
EXPECT_THAT(DiscoveredFiles, IsEmpty());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-07-19 00:13:23 +08:00
|
|
|
TEST(GlobalCompilationDatabaseTest, NonCanonicalFilenames) {
|
|
|
|
OverlayCDB DB(nullptr);
|
|
|
|
std::vector<std::string> DiscoveredFiles;
|
|
|
|
auto Sub =
|
|
|
|
DB.watch([&DiscoveredFiles](const std::vector<std::string> Changes) {
|
|
|
|
DiscoveredFiles = Changes;
|
|
|
|
});
|
|
|
|
|
|
|
|
llvm::SmallString<128> Root(testRoot());
|
|
|
|
llvm::sys::path::append(Root, "build", "..", "a.cc");
|
|
|
|
DB.setCompileCommand(Root.str(), tooling::CompileCommand());
|
|
|
|
EXPECT_THAT(DiscoveredFiles, UnorderedElementsAre(testPath("a.cc")));
|
|
|
|
DiscoveredFiles.clear();
|
|
|
|
|
|
|
|
llvm::SmallString<128> File(testRoot());
|
|
|
|
llvm::sys::path::append(File, "blabla", "..", "a.cc");
|
|
|
|
|
|
|
|
EXPECT_TRUE(DB.getCompileCommand(File));
|
|
|
|
EXPECT_TRUE(DB.getProjectInfo(File));
|
|
|
|
}
|
|
|
|
|
2018-04-20 19:35:17 +08:00
|
|
|
} // namespace
|
|
|
|
} // namespace clangd
|
|
|
|
} // namespace clang
|