2017-12-21 00:06:05 +08:00
|
|
|
//===-- XRefsTests.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
|
2017-12-21 00:06:05 +08:00
|
|
|
//
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "Annotations.h"
|
|
|
|
#include "ClangdUnit.h"
|
2018-02-14 01:47:16 +08:00
|
|
|
#include "Compiler.h"
|
2017-12-21 00:06:05 +08:00
|
|
|
#include "Matchers.h"
|
2019-05-28 18:29:58 +08:00
|
|
|
#include "Protocol.h"
|
2018-02-15 21:15:47 +08:00
|
|
|
#include "SyncAPI.h"
|
2018-01-29 23:37:46 +08:00
|
|
|
#include "TestFS.h"
|
2019-07-10 01:59:50 +08:00
|
|
|
#include "TestIndex.h"
|
[clangd] Extract scoring/ranking logic, and shave yaks.
Summary:
Code completion scoring was embedded in CodeComplete.cpp, which is bad:
- awkward to test. The mechanisms (extracting info from index/sema) can be
unit-tested well, the policy (scoring) should be quantitatively measured.
Neither was easily possible, and debugging was hard.
The intermediate signal struct makes this easier.
- hard to reuse. This is a bug in workspaceSymbols: it just presents the
results in the index order, which is not sorted in practice, it needs to rank
them!
Also, index implementations care about scoring (both query-dependent and
independent) in order to truncate result lists appropriately.
The main yak shaved here is the build() function that had 3 variants across
unit tests is unified in TestTU.h (rather than adding a 4th variant).
Reviewers: ilya-biryukov
Subscribers: klimek, mgorny, ioeric, MaskRay, jkorous, mgrang, cfe-commits
Differential Revision: https://reviews.llvm.org/D46524
llvm-svn: 332378
2018-05-16 01:43:27 +08:00
|
|
|
#include "TestTU.h"
|
2017-12-21 00:06:05 +08:00
|
|
|
#include "XRefs.h"
|
2018-04-30 23:24:17 +08:00
|
|
|
#include "index/FileIndex.h"
|
2019-07-10 01:59:50 +08:00
|
|
|
#include "index/MemIndex.h"
|
2018-04-30 23:24:17 +08:00
|
|
|
#include "index/SymbolCollector.h"
|
|
|
|
#include "clang/Index/IndexingAction.h"
|
2019-05-28 18:29:58 +08:00
|
|
|
#include "llvm/ADT/None.h"
|
2017-12-21 00:06:05 +08:00
|
|
|
#include "llvm/Support/Path.h"
|
[clangd] Implement textDocument/declaration from LSP 3.14
Summary:
LSP now reflects the declaration/definition distinction.
Language server changes:
- textDocument/definition now returns a definition if one is found, otherwise
the declaration. It no longer returns declaration + definition if they are
distinct.
- textDocument/declaration returns the best declaration we can find.
- For macros, the active macro definition is returned for both methods.
- For include directive, the top of the target file is returned for both.
There doesn't appear to be a discovery mechanism (we can't return everything to
clients that only know about definition), so this changes existing behavior.
In practice, it should greatly reduce the fraction of the time we need to show
the user a menu of options.
C++ API changes:
- findDefinitions is replaced by locateSymbolAt, which returns a
vector<LocatedSymbol> - one for each symbol under the cursor.
- this contains the preferred declaration, the definition (if found), and
the symbol name
This API enables some potentially-neat extensions, like swapping between decl
and def, and exposing the symbol name to the UI in the case of multiple symbols.
Reviewers: hokein
Subscribers: ilya-biryukov, javed.absar, ioeric, MaskRay, jkorous, arphaman, kadircet, cfe-commits
Differential Revision: https://reviews.llvm.org/D57388
llvm-svn: 352864
2019-02-01 19:26:13 +08:00
|
|
|
#include "llvm/Support/ScopedPrinter.h"
|
[clangd] Extract scoring/ranking logic, and shave yaks.
Summary:
Code completion scoring was embedded in CodeComplete.cpp, which is bad:
- awkward to test. The mechanisms (extracting info from index/sema) can be
unit-tested well, the policy (scoring) should be quantitatively measured.
Neither was easily possible, and debugging was hard.
The intermediate signal struct makes this easier.
- hard to reuse. This is a bug in workspaceSymbols: it just presents the
results in the index order, which is not sorted in practice, it needs to rank
them!
Also, index implementations care about scoring (both query-dependent and
independent) in order to truncate result lists appropriately.
The main yak shaved here is the build() function that had 3 variants across
unit tests is unified in TestTU.h (rather than adding a 4th variant).
Reviewers: ilya-biryukov
Subscribers: klimek, mgorny, ioeric, MaskRay, jkorous, mgrang, cfe-commits
Differential Revision: https://reviews.llvm.org/D46524
llvm-svn: 332378
2018-05-16 01:43:27 +08:00
|
|
|
#include "gmock/gmock.h"
|
2017-12-21 00:06:05 +08:00
|
|
|
#include "gtest/gtest.h"
|
2019-06-13 16:51:44 +08:00
|
|
|
#include <string>
|
2017-12-21 00:06:05 +08:00
|
|
|
|
|
|
|
namespace clang {
|
|
|
|
namespace clangd {
|
|
|
|
namespace {
|
2018-10-20 23:30:37 +08:00
|
|
|
|
2019-05-06 18:08:47 +08:00
|
|
|
using ::testing::ElementsAre;
|
|
|
|
using ::testing::IsEmpty;
|
|
|
|
using ::testing::Matcher;
|
|
|
|
using ::testing::UnorderedElementsAreArray;
|
2017-12-21 00:06:05 +08:00
|
|
|
|
2018-02-14 01:47:16 +08:00
|
|
|
class IgnoreDiagnostics : public DiagnosticsConsumer {
|
2018-03-12 23:28:22 +08:00
|
|
|
void onDiagnosticsReady(PathRef File,
|
2018-03-13 07:22:35 +08:00
|
|
|
std::vector<Diag> Diagnostics) override {}
|
2018-02-14 01:47:16 +08:00
|
|
|
};
|
|
|
|
|
2018-11-28 18:30:42 +08:00
|
|
|
MATCHER_P2(FileRange, File, Range, "") {
|
|
|
|
return Location{URIForFile::canonicalize(File, testRoot()), Range} == arg;
|
|
|
|
}
|
|
|
|
|
2017-12-21 00:06:05 +08:00
|
|
|
// Extracts ranges from an annotated example, and constructs a matcher for a
|
|
|
|
// highlight set. Ranges should be named $read/$write as appropriate.
|
|
|
|
Matcher<const std::vector<DocumentHighlight> &>
|
|
|
|
HighlightsFrom(const Annotations &Test) {
|
|
|
|
std::vector<DocumentHighlight> Expected;
|
|
|
|
auto Add = [&](const Range &R, DocumentHighlightKind K) {
|
|
|
|
Expected.emplace_back();
|
|
|
|
Expected.back().range = R;
|
|
|
|
Expected.back().kind = K;
|
|
|
|
};
|
|
|
|
for (const auto &Range : Test.ranges())
|
|
|
|
Add(Range, DocumentHighlightKind::Text);
|
|
|
|
for (const auto &Range : Test.ranges("read"))
|
|
|
|
Add(Range, DocumentHighlightKind::Read);
|
|
|
|
for (const auto &Range : Test.ranges("write"))
|
|
|
|
Add(Range, DocumentHighlightKind::Write);
|
|
|
|
return UnorderedElementsAreArray(Expected);
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST(HighlightsTest, All) {
|
|
|
|
const char *Tests[] = {
|
|
|
|
R"cpp(// Local variable
|
|
|
|
int main() {
|
|
|
|
int [[bonjour]];
|
|
|
|
$write[[^bonjour]] = 2;
|
|
|
|
int test1 = $read[[bonjour]];
|
|
|
|
}
|
|
|
|
)cpp",
|
|
|
|
|
|
|
|
R"cpp(// Struct
|
|
|
|
namespace ns1 {
|
|
|
|
struct [[MyClass]] {
|
|
|
|
static void foo([[MyClass]]*) {}
|
|
|
|
};
|
|
|
|
} // namespace ns1
|
|
|
|
int main() {
|
|
|
|
ns1::[[My^Class]]* Params;
|
|
|
|
}
|
|
|
|
)cpp",
|
|
|
|
|
|
|
|
R"cpp(// Function
|
|
|
|
int [[^foo]](int) {}
|
|
|
|
int main() {
|
|
|
|
[[foo]]([[foo]](42));
|
|
|
|
auto *X = &[[foo]];
|
|
|
|
}
|
|
|
|
)cpp",
|
2019-02-11 21:03:08 +08:00
|
|
|
|
|
|
|
R"cpp(// Function parameter in decl
|
|
|
|
void foo(int [[^bar]]);
|
|
|
|
)cpp",
|
2017-12-21 00:06:05 +08:00
|
|
|
};
|
|
|
|
for (const char *Test : Tests) {
|
|
|
|
Annotations T(Test);
|
[clangd] Extract scoring/ranking logic, and shave yaks.
Summary:
Code completion scoring was embedded in CodeComplete.cpp, which is bad:
- awkward to test. The mechanisms (extracting info from index/sema) can be
unit-tested well, the policy (scoring) should be quantitatively measured.
Neither was easily possible, and debugging was hard.
The intermediate signal struct makes this easier.
- hard to reuse. This is a bug in workspaceSymbols: it just presents the
results in the index order, which is not sorted in practice, it needs to rank
them!
Also, index implementations care about scoring (both query-dependent and
independent) in order to truncate result lists appropriately.
The main yak shaved here is the build() function that had 3 variants across
unit tests is unified in TestTU.h (rather than adding a 4th variant).
Reviewers: ilya-biryukov
Subscribers: klimek, mgorny, ioeric, MaskRay, jkorous, mgrang, cfe-commits
Differential Revision: https://reviews.llvm.org/D46524
llvm-svn: 332378
2018-05-16 01:43:27 +08:00
|
|
|
auto AST = TestTU::withCode(T.code()).build();
|
[clangd] Pass Context implicitly using TLS.
Summary:
Instead of passing Context explicitly around, we now have a thread-local
Context object `Context::current()` which is an implicit argument to
every function.
Most manipulation of this should use the WithContextValue helper, which
augments the current Context to add a single KV pair, and restores the
old context on destruction.
Advantages are:
- less boilerplate in functions that just propagate contexts
- reading most code doesn't require understanding context at all, and
using context as values in fewer places still
- fewer options to pass the "wrong" context when it changes within a
scope (e.g. when using Span)
- contexts pass through interfaces we can't modify, such as VFS
- propagating contexts across threads was slightly tricky (e.g.
copy vs move, no move-init in lambdas), and is now encapsulated in
the threadpool
Disadvantages are all the usual TLS stuff - hidden magic, and
potential for higher memory usage on threads that don't use the
context. (In practice, it's just one pointer)
Reviewers: ilya-biryukov
Subscribers: klimek, jkorous-apple, ioeric, cfe-commits
Differential Revision: https://reviews.llvm.org/D42517
llvm-svn: 323872
2018-01-31 21:40:48 +08:00
|
|
|
EXPECT_THAT(findDocumentHighlights(AST, T.point()), HighlightsFrom(T))
|
2017-12-21 00:06:05 +08:00
|
|
|
<< Test;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
[clangd] Implement textDocument/declaration from LSP 3.14
Summary:
LSP now reflects the declaration/definition distinction.
Language server changes:
- textDocument/definition now returns a definition if one is found, otherwise
the declaration. It no longer returns declaration + definition if they are
distinct.
- textDocument/declaration returns the best declaration we can find.
- For macros, the active macro definition is returned for both methods.
- For include directive, the top of the target file is returned for both.
There doesn't appear to be a discovery mechanism (we can't return everything to
clients that only know about definition), so this changes existing behavior.
In practice, it should greatly reduce the fraction of the time we need to show
the user a menu of options.
C++ API changes:
- findDefinitions is replaced by locateSymbolAt, which returns a
vector<LocatedSymbol> - one for each symbol under the cursor.
- this contains the preferred declaration, the definition (if found), and
the symbol name
This API enables some potentially-neat extensions, like swapping between decl
and def, and exposing the symbol name to the UI in the case of multiple symbols.
Reviewers: hokein
Subscribers: ilya-biryukov, javed.absar, ioeric, MaskRay, jkorous, arphaman, kadircet, cfe-commits
Differential Revision: https://reviews.llvm.org/D57388
llvm-svn: 352864
2019-02-01 19:26:13 +08:00
|
|
|
MATCHER_P3(Sym, Name, Decl, DefOrNone, "") {
|
|
|
|
llvm::Optional<Range> Def = DefOrNone;
|
|
|
|
if (Name != arg.Name) {
|
|
|
|
*result_listener << "Name is " << arg.Name;
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
if (Decl != arg.PreferredDeclaration.range) {
|
|
|
|
*result_listener << "Declaration is "
|
|
|
|
<< llvm::to_string(arg.PreferredDeclaration);
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
if (Def && !arg.Definition) {
|
|
|
|
*result_listener << "Has no definition";
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
if (Def && arg.Definition->range != *Def) {
|
|
|
|
*result_listener << "Definition is " << llvm::to_string(arg.Definition);
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
}
|
2019-05-06 18:08:47 +08:00
|
|
|
::testing::Matcher<LocatedSymbol> Sym(std::string Name, Range Decl) {
|
[clangd] Implement textDocument/declaration from LSP 3.14
Summary:
LSP now reflects the declaration/definition distinction.
Language server changes:
- textDocument/definition now returns a definition if one is found, otherwise
the declaration. It no longer returns declaration + definition if they are
distinct.
- textDocument/declaration returns the best declaration we can find.
- For macros, the active macro definition is returned for both methods.
- For include directive, the top of the target file is returned for both.
There doesn't appear to be a discovery mechanism (we can't return everything to
clients that only know about definition), so this changes existing behavior.
In practice, it should greatly reduce the fraction of the time we need to show
the user a menu of options.
C++ API changes:
- findDefinitions is replaced by locateSymbolAt, which returns a
vector<LocatedSymbol> - one for each symbol under the cursor.
- this contains the preferred declaration, the definition (if found), and
the symbol name
This API enables some potentially-neat extensions, like swapping between decl
and def, and exposing the symbol name to the UI in the case of multiple symbols.
Reviewers: hokein
Subscribers: ilya-biryukov, javed.absar, ioeric, MaskRay, jkorous, arphaman, kadircet, cfe-commits
Differential Revision: https://reviews.llvm.org/D57388
llvm-svn: 352864
2019-02-01 19:26:13 +08:00
|
|
|
return Sym(Name, Decl, llvm::None);
|
|
|
|
}
|
|
|
|
MATCHER_P(Sym, Name, "") { return arg.Name == Name; }
|
|
|
|
|
2017-12-21 00:06:05 +08:00
|
|
|
MATCHER_P(RangeIs, R, "") { return arg.range == R; }
|
|
|
|
|
[clangd] Implement textDocument/declaration from LSP 3.14
Summary:
LSP now reflects the declaration/definition distinction.
Language server changes:
- textDocument/definition now returns a definition if one is found, otherwise
the declaration. It no longer returns declaration + definition if they are
distinct.
- textDocument/declaration returns the best declaration we can find.
- For macros, the active macro definition is returned for both methods.
- For include directive, the top of the target file is returned for both.
There doesn't appear to be a discovery mechanism (we can't return everything to
clients that only know about definition), so this changes existing behavior.
In practice, it should greatly reduce the fraction of the time we need to show
the user a menu of options.
C++ API changes:
- findDefinitions is replaced by locateSymbolAt, which returns a
vector<LocatedSymbol> - one for each symbol under the cursor.
- this contains the preferred declaration, the definition (if found), and
the symbol name
This API enables some potentially-neat extensions, like swapping between decl
and def, and exposing the symbol name to the UI in the case of multiple symbols.
Reviewers: hokein
Subscribers: ilya-biryukov, javed.absar, ioeric, MaskRay, jkorous, arphaman, kadircet, cfe-commits
Differential Revision: https://reviews.llvm.org/D57388
llvm-svn: 352864
2019-02-01 19:26:13 +08:00
|
|
|
TEST(LocateSymbol, WithIndex) {
|
2018-04-30 23:24:17 +08:00
|
|
|
Annotations SymbolHeader(R"cpp(
|
|
|
|
class $forward[[Forward]];
|
|
|
|
class $foo[[Foo]] {};
|
|
|
|
|
|
|
|
void $f1[[f1]]();
|
|
|
|
|
|
|
|
inline void $f2[[f2]]() {}
|
|
|
|
)cpp");
|
|
|
|
Annotations SymbolCpp(R"cpp(
|
|
|
|
class $forward[[forward]] {};
|
|
|
|
void $f1[[f1]]() {}
|
|
|
|
)cpp");
|
|
|
|
|
[clangd] Extract scoring/ranking logic, and shave yaks.
Summary:
Code completion scoring was embedded in CodeComplete.cpp, which is bad:
- awkward to test. The mechanisms (extracting info from index/sema) can be
unit-tested well, the policy (scoring) should be quantitatively measured.
Neither was easily possible, and debugging was hard.
The intermediate signal struct makes this easier.
- hard to reuse. This is a bug in workspaceSymbols: it just presents the
results in the index order, which is not sorted in practice, it needs to rank
them!
Also, index implementations care about scoring (both query-dependent and
independent) in order to truncate result lists appropriately.
The main yak shaved here is the build() function that had 3 variants across
unit tests is unified in TestTU.h (rather than adding a 4th variant).
Reviewers: ilya-biryukov
Subscribers: klimek, mgorny, ioeric, MaskRay, jkorous, mgrang, cfe-commits
Differential Revision: https://reviews.llvm.org/D46524
llvm-svn: 332378
2018-05-16 01:43:27 +08:00
|
|
|
TestTU TU;
|
|
|
|
TU.Code = SymbolCpp.code();
|
|
|
|
TU.HeaderCode = SymbolHeader.code();
|
|
|
|
auto Index = TU.index();
|
[clangd] Implement textDocument/declaration from LSP 3.14
Summary:
LSP now reflects the declaration/definition distinction.
Language server changes:
- textDocument/definition now returns a definition if one is found, otherwise
the declaration. It no longer returns declaration + definition if they are
distinct.
- textDocument/declaration returns the best declaration we can find.
- For macros, the active macro definition is returned for both methods.
- For include directive, the top of the target file is returned for both.
There doesn't appear to be a discovery mechanism (we can't return everything to
clients that only know about definition), so this changes existing behavior.
In practice, it should greatly reduce the fraction of the time we need to show
the user a menu of options.
C++ API changes:
- findDefinitions is replaced by locateSymbolAt, which returns a
vector<LocatedSymbol> - one for each symbol under the cursor.
- this contains the preferred declaration, the definition (if found), and
the symbol name
This API enables some potentially-neat extensions, like swapping between decl
and def, and exposing the symbol name to the UI in the case of multiple symbols.
Reviewers: hokein
Subscribers: ilya-biryukov, javed.absar, ioeric, MaskRay, jkorous, arphaman, kadircet, cfe-commits
Differential Revision: https://reviews.llvm.org/D57388
llvm-svn: 352864
2019-02-01 19:26:13 +08:00
|
|
|
auto LocateWithIndex = [&Index](const Annotations &Main) {
|
[clangd] Extract scoring/ranking logic, and shave yaks.
Summary:
Code completion scoring was embedded in CodeComplete.cpp, which is bad:
- awkward to test. The mechanisms (extracting info from index/sema) can be
unit-tested well, the policy (scoring) should be quantitatively measured.
Neither was easily possible, and debugging was hard.
The intermediate signal struct makes this easier.
- hard to reuse. This is a bug in workspaceSymbols: it just presents the
results in the index order, which is not sorted in practice, it needs to rank
them!
Also, index implementations care about scoring (both query-dependent and
independent) in order to truncate result lists appropriately.
The main yak shaved here is the build() function that had 3 variants across
unit tests is unified in TestTU.h (rather than adding a 4th variant).
Reviewers: ilya-biryukov
Subscribers: klimek, mgorny, ioeric, MaskRay, jkorous, mgrang, cfe-commits
Differential Revision: https://reviews.llvm.org/D46524
llvm-svn: 332378
2018-05-16 01:43:27 +08:00
|
|
|
auto AST = TestTU::withCode(Main.code()).build();
|
[clangd] Implement textDocument/declaration from LSP 3.14
Summary:
LSP now reflects the declaration/definition distinction.
Language server changes:
- textDocument/definition now returns a definition if one is found, otherwise
the declaration. It no longer returns declaration + definition if they are
distinct.
- textDocument/declaration returns the best declaration we can find.
- For macros, the active macro definition is returned for both methods.
- For include directive, the top of the target file is returned for both.
There doesn't appear to be a discovery mechanism (we can't return everything to
clients that only know about definition), so this changes existing behavior.
In practice, it should greatly reduce the fraction of the time we need to show
the user a menu of options.
C++ API changes:
- findDefinitions is replaced by locateSymbolAt, which returns a
vector<LocatedSymbol> - one for each symbol under the cursor.
- this contains the preferred declaration, the definition (if found), and
the symbol name
This API enables some potentially-neat extensions, like swapping between decl
and def, and exposing the symbol name to the UI in the case of multiple symbols.
Reviewers: hokein
Subscribers: ilya-biryukov, javed.absar, ioeric, MaskRay, jkorous, arphaman, kadircet, cfe-commits
Differential Revision: https://reviews.llvm.org/D57388
llvm-svn: 352864
2019-02-01 19:26:13 +08:00
|
|
|
return clangd::locateSymbolAt(AST, Main.point(), Index.get());
|
2018-04-30 23:24:17 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
Annotations Test(R"cpp(// only declaration in AST.
|
|
|
|
void [[f1]]();
|
|
|
|
int main() {
|
|
|
|
^f1();
|
|
|
|
}
|
|
|
|
)cpp");
|
[clangd] Implement textDocument/declaration from LSP 3.14
Summary:
LSP now reflects the declaration/definition distinction.
Language server changes:
- textDocument/definition now returns a definition if one is found, otherwise
the declaration. It no longer returns declaration + definition if they are
distinct.
- textDocument/declaration returns the best declaration we can find.
- For macros, the active macro definition is returned for both methods.
- For include directive, the top of the target file is returned for both.
There doesn't appear to be a discovery mechanism (we can't return everything to
clients that only know about definition), so this changes existing behavior.
In practice, it should greatly reduce the fraction of the time we need to show
the user a menu of options.
C++ API changes:
- findDefinitions is replaced by locateSymbolAt, which returns a
vector<LocatedSymbol> - one for each symbol under the cursor.
- this contains the preferred declaration, the definition (if found), and
the symbol name
This API enables some potentially-neat extensions, like swapping between decl
and def, and exposing the symbol name to the UI in the case of multiple symbols.
Reviewers: hokein
Subscribers: ilya-biryukov, javed.absar, ioeric, MaskRay, jkorous, arphaman, kadircet, cfe-commits
Differential Revision: https://reviews.llvm.org/D57388
llvm-svn: 352864
2019-02-01 19:26:13 +08:00
|
|
|
EXPECT_THAT(LocateWithIndex(Test),
|
|
|
|
ElementsAre(Sym("f1", Test.range(), SymbolCpp.range("f1"))));
|
2018-04-30 23:24:17 +08:00
|
|
|
|
|
|
|
Test = Annotations(R"cpp(// definition in AST.
|
|
|
|
void [[f1]]() {}
|
|
|
|
int main() {
|
|
|
|
^f1();
|
|
|
|
}
|
|
|
|
)cpp");
|
[clangd] Implement textDocument/declaration from LSP 3.14
Summary:
LSP now reflects the declaration/definition distinction.
Language server changes:
- textDocument/definition now returns a definition if one is found, otherwise
the declaration. It no longer returns declaration + definition if they are
distinct.
- textDocument/declaration returns the best declaration we can find.
- For macros, the active macro definition is returned for both methods.
- For include directive, the top of the target file is returned for both.
There doesn't appear to be a discovery mechanism (we can't return everything to
clients that only know about definition), so this changes existing behavior.
In practice, it should greatly reduce the fraction of the time we need to show
the user a menu of options.
C++ API changes:
- findDefinitions is replaced by locateSymbolAt, which returns a
vector<LocatedSymbol> - one for each symbol under the cursor.
- this contains the preferred declaration, the definition (if found), and
the symbol name
This API enables some potentially-neat extensions, like swapping between decl
and def, and exposing the symbol name to the UI in the case of multiple symbols.
Reviewers: hokein
Subscribers: ilya-biryukov, javed.absar, ioeric, MaskRay, jkorous, arphaman, kadircet, cfe-commits
Differential Revision: https://reviews.llvm.org/D57388
llvm-svn: 352864
2019-02-01 19:26:13 +08:00
|
|
|
EXPECT_THAT(LocateWithIndex(Test),
|
|
|
|
ElementsAre(Sym("f1", SymbolHeader.range("f1"), Test.range())));
|
2018-04-30 23:24:17 +08:00
|
|
|
|
|
|
|
Test = Annotations(R"cpp(// forward declaration in AST.
|
|
|
|
class [[Foo]];
|
|
|
|
F^oo* create();
|
|
|
|
)cpp");
|
[clangd] Implement textDocument/declaration from LSP 3.14
Summary:
LSP now reflects the declaration/definition distinction.
Language server changes:
- textDocument/definition now returns a definition if one is found, otherwise
the declaration. It no longer returns declaration + definition if they are
distinct.
- textDocument/declaration returns the best declaration we can find.
- For macros, the active macro definition is returned for both methods.
- For include directive, the top of the target file is returned for both.
There doesn't appear to be a discovery mechanism (we can't return everything to
clients that only know about definition), so this changes existing behavior.
In practice, it should greatly reduce the fraction of the time we need to show
the user a menu of options.
C++ API changes:
- findDefinitions is replaced by locateSymbolAt, which returns a
vector<LocatedSymbol> - one for each symbol under the cursor.
- this contains the preferred declaration, the definition (if found), and
the symbol name
This API enables some potentially-neat extensions, like swapping between decl
and def, and exposing the symbol name to the UI in the case of multiple symbols.
Reviewers: hokein
Subscribers: ilya-biryukov, javed.absar, ioeric, MaskRay, jkorous, arphaman, kadircet, cfe-commits
Differential Revision: https://reviews.llvm.org/D57388
llvm-svn: 352864
2019-02-01 19:26:13 +08:00
|
|
|
EXPECT_THAT(LocateWithIndex(Test),
|
|
|
|
ElementsAre(Sym("Foo", Test.range(), SymbolHeader.range("foo"))));
|
2018-04-30 23:24:17 +08:00
|
|
|
|
|
|
|
Test = Annotations(R"cpp(// defintion in AST.
|
|
|
|
class [[Forward]] {};
|
|
|
|
F^orward create();
|
|
|
|
)cpp");
|
[clangd] Implement textDocument/declaration from LSP 3.14
Summary:
LSP now reflects the declaration/definition distinction.
Language server changes:
- textDocument/definition now returns a definition if one is found, otherwise
the declaration. It no longer returns declaration + definition if they are
distinct.
- textDocument/declaration returns the best declaration we can find.
- For macros, the active macro definition is returned for both methods.
- For include directive, the top of the target file is returned for both.
There doesn't appear to be a discovery mechanism (we can't return everything to
clients that only know about definition), so this changes existing behavior.
In practice, it should greatly reduce the fraction of the time we need to show
the user a menu of options.
C++ API changes:
- findDefinitions is replaced by locateSymbolAt, which returns a
vector<LocatedSymbol> - one for each symbol under the cursor.
- this contains the preferred declaration, the definition (if found), and
the symbol name
This API enables some potentially-neat extensions, like swapping between decl
and def, and exposing the symbol name to the UI in the case of multiple symbols.
Reviewers: hokein
Subscribers: ilya-biryukov, javed.absar, ioeric, MaskRay, jkorous, arphaman, kadircet, cfe-commits
Differential Revision: https://reviews.llvm.org/D57388
llvm-svn: 352864
2019-02-01 19:26:13 +08:00
|
|
|
EXPECT_THAT(
|
|
|
|
LocateWithIndex(Test),
|
|
|
|
ElementsAre(Sym("Forward", SymbolHeader.range("forward"), Test.range())));
|
2018-04-30 23:24:17 +08:00
|
|
|
}
|
|
|
|
|
2019-02-11 23:05:29 +08:00
|
|
|
TEST(LocateSymbol, WithIndexPreferredLocation) {
|
|
|
|
Annotations SymbolHeader(R"cpp(
|
2019-05-03 20:11:14 +08:00
|
|
|
class $p[[Proto]] {};
|
|
|
|
void $f[[func]]() {};
|
2019-02-11 23:05:29 +08:00
|
|
|
)cpp");
|
|
|
|
TestTU TU;
|
|
|
|
TU.HeaderCode = SymbolHeader.code();
|
|
|
|
TU.HeaderFilename = "x.proto"; // Prefer locations in codegen files.
|
|
|
|
auto Index = TU.index();
|
|
|
|
|
|
|
|
Annotations Test(R"cpp(// only declaration in AST.
|
|
|
|
// Shift to make range different.
|
2019-05-03 20:11:14 +08:00
|
|
|
class Proto;
|
|
|
|
void func() {}
|
|
|
|
P$p^roto* create() {
|
|
|
|
fu$f^nc();
|
|
|
|
return nullptr;
|
|
|
|
}
|
2019-02-11 23:05:29 +08:00
|
|
|
)cpp");
|
|
|
|
|
|
|
|
auto AST = TestTU::withCode(Test.code()).build();
|
2019-05-03 20:11:14 +08:00
|
|
|
{
|
|
|
|
auto Locs = clangd::locateSymbolAt(AST, Test.point("p"), Index.get());
|
|
|
|
auto CodeGenLoc = SymbolHeader.range("p");
|
|
|
|
EXPECT_THAT(Locs, ElementsAre(Sym("Proto", CodeGenLoc, CodeGenLoc)));
|
|
|
|
}
|
|
|
|
{
|
|
|
|
auto Locs = clangd::locateSymbolAt(AST, Test.point("f"), Index.get());
|
|
|
|
auto CodeGenLoc = SymbolHeader.range("f");
|
|
|
|
EXPECT_THAT(Locs, ElementsAre(Sym("func", CodeGenLoc, CodeGenLoc)));
|
|
|
|
}
|
2019-02-11 23:05:29 +08:00
|
|
|
}
|
|
|
|
|
[clangd] Implement textDocument/declaration from LSP 3.14
Summary:
LSP now reflects the declaration/definition distinction.
Language server changes:
- textDocument/definition now returns a definition if one is found, otherwise
the declaration. It no longer returns declaration + definition if they are
distinct.
- textDocument/declaration returns the best declaration we can find.
- For macros, the active macro definition is returned for both methods.
- For include directive, the top of the target file is returned for both.
There doesn't appear to be a discovery mechanism (we can't return everything to
clients that only know about definition), so this changes existing behavior.
In practice, it should greatly reduce the fraction of the time we need to show
the user a menu of options.
C++ API changes:
- findDefinitions is replaced by locateSymbolAt, which returns a
vector<LocatedSymbol> - one for each symbol under the cursor.
- this contains the preferred declaration, the definition (if found), and
the symbol name
This API enables some potentially-neat extensions, like swapping between decl
and def, and exposing the symbol name to the UI in the case of multiple symbols.
Reviewers: hokein
Subscribers: ilya-biryukov, javed.absar, ioeric, MaskRay, jkorous, arphaman, kadircet, cfe-commits
Differential Revision: https://reviews.llvm.org/D57388
llvm-svn: 352864
2019-02-01 19:26:13 +08:00
|
|
|
TEST(LocateSymbol, All) {
|
|
|
|
// Ranges in tests:
|
|
|
|
// $decl is the declaration location (if absent, no symbol is located)
|
|
|
|
// $def is the definition location (if absent, symbol has no definition)
|
|
|
|
// unnamed range becomes both $decl and $def.
|
2017-12-21 00:06:05 +08:00
|
|
|
const char *Tests[] = {
|
|
|
|
R"cpp(// Local variable
|
|
|
|
int main() {
|
2018-03-09 22:00:34 +08:00
|
|
|
int [[bonjour]];
|
2017-12-21 00:06:05 +08:00
|
|
|
^bonjour = 2;
|
|
|
|
int test1 = bonjour;
|
|
|
|
}
|
|
|
|
)cpp",
|
|
|
|
|
|
|
|
R"cpp(// Struct
|
|
|
|
namespace ns1 {
|
2018-03-09 22:00:34 +08:00
|
|
|
struct [[MyClass]] {};
|
2017-12-21 00:06:05 +08:00
|
|
|
} // namespace ns1
|
|
|
|
int main() {
|
|
|
|
ns1::My^Class* Params;
|
|
|
|
}
|
|
|
|
)cpp",
|
|
|
|
|
|
|
|
R"cpp(// Function definition via pointer
|
2018-03-09 22:00:34 +08:00
|
|
|
int [[foo]](int) {}
|
2017-12-21 00:06:05 +08:00
|
|
|
int main() {
|
|
|
|
auto *X = &^foo;
|
|
|
|
}
|
|
|
|
)cpp",
|
|
|
|
|
|
|
|
R"cpp(// Function declaration via call
|
[clangd] Implement textDocument/declaration from LSP 3.14
Summary:
LSP now reflects the declaration/definition distinction.
Language server changes:
- textDocument/definition now returns a definition if one is found, otherwise
the declaration. It no longer returns declaration + definition if they are
distinct.
- textDocument/declaration returns the best declaration we can find.
- For macros, the active macro definition is returned for both methods.
- For include directive, the top of the target file is returned for both.
There doesn't appear to be a discovery mechanism (we can't return everything to
clients that only know about definition), so this changes existing behavior.
In practice, it should greatly reduce the fraction of the time we need to show
the user a menu of options.
C++ API changes:
- findDefinitions is replaced by locateSymbolAt, which returns a
vector<LocatedSymbol> - one for each symbol under the cursor.
- this contains the preferred declaration, the definition (if found), and
the symbol name
This API enables some potentially-neat extensions, like swapping between decl
and def, and exposing the symbol name to the UI in the case of multiple symbols.
Reviewers: hokein
Subscribers: ilya-biryukov, javed.absar, ioeric, MaskRay, jkorous, arphaman, kadircet, cfe-commits
Differential Revision: https://reviews.llvm.org/D57388
llvm-svn: 352864
2019-02-01 19:26:13 +08:00
|
|
|
int $decl[[foo]](int);
|
2017-12-21 00:06:05 +08:00
|
|
|
int main() {
|
|
|
|
return ^foo(42);
|
|
|
|
}
|
|
|
|
)cpp",
|
|
|
|
|
|
|
|
R"cpp(// Field
|
2018-03-09 22:00:34 +08:00
|
|
|
struct Foo { int [[x]]; };
|
2017-12-21 00:06:05 +08:00
|
|
|
int main() {
|
|
|
|
Foo bar;
|
|
|
|
bar.^x;
|
|
|
|
}
|
|
|
|
)cpp",
|
|
|
|
|
|
|
|
R"cpp(// Field, member initializer
|
|
|
|
struct Foo {
|
2018-03-09 22:00:34 +08:00
|
|
|
int [[x]];
|
2017-12-21 00:06:05 +08:00
|
|
|
Foo() : ^x(0) {}
|
|
|
|
};
|
|
|
|
)cpp",
|
|
|
|
|
|
|
|
R"cpp(// Field, GNU old-style field designator
|
2018-03-09 22:00:34 +08:00
|
|
|
struct Foo { int [[x]]; };
|
2017-12-21 00:06:05 +08:00
|
|
|
int main() {
|
|
|
|
Foo bar = { ^x : 1 };
|
|
|
|
}
|
|
|
|
)cpp",
|
|
|
|
|
|
|
|
R"cpp(// Field, field designator
|
2018-03-09 22:00:34 +08:00
|
|
|
struct Foo { int [[x]]; };
|
2017-12-21 00:06:05 +08:00
|
|
|
int main() {
|
|
|
|
Foo bar = { .^x = 2 };
|
|
|
|
}
|
|
|
|
)cpp",
|
|
|
|
|
|
|
|
R"cpp(// Method call
|
[clangd] Implement textDocument/declaration from LSP 3.14
Summary:
LSP now reflects the declaration/definition distinction.
Language server changes:
- textDocument/definition now returns a definition if one is found, otherwise
the declaration. It no longer returns declaration + definition if they are
distinct.
- textDocument/declaration returns the best declaration we can find.
- For macros, the active macro definition is returned for both methods.
- For include directive, the top of the target file is returned for both.
There doesn't appear to be a discovery mechanism (we can't return everything to
clients that only know about definition), so this changes existing behavior.
In practice, it should greatly reduce the fraction of the time we need to show
the user a menu of options.
C++ API changes:
- findDefinitions is replaced by locateSymbolAt, which returns a
vector<LocatedSymbol> - one for each symbol under the cursor.
- this contains the preferred declaration, the definition (if found), and
the symbol name
This API enables some potentially-neat extensions, like swapping between decl
and def, and exposing the symbol name to the UI in the case of multiple symbols.
Reviewers: hokein
Subscribers: ilya-biryukov, javed.absar, ioeric, MaskRay, jkorous, arphaman, kadircet, cfe-commits
Differential Revision: https://reviews.llvm.org/D57388
llvm-svn: 352864
2019-02-01 19:26:13 +08:00
|
|
|
struct Foo { int $decl[[x]](); };
|
2017-12-21 00:06:05 +08:00
|
|
|
int main() {
|
|
|
|
Foo bar;
|
|
|
|
bar.^x();
|
|
|
|
}
|
|
|
|
)cpp",
|
|
|
|
|
|
|
|
R"cpp(// Typedef
|
[clangd] Implement textDocument/declaration from LSP 3.14
Summary:
LSP now reflects the declaration/definition distinction.
Language server changes:
- textDocument/definition now returns a definition if one is found, otherwise
the declaration. It no longer returns declaration + definition if they are
distinct.
- textDocument/declaration returns the best declaration we can find.
- For macros, the active macro definition is returned for both methods.
- For include directive, the top of the target file is returned for both.
There doesn't appear to be a discovery mechanism (we can't return everything to
clients that only know about definition), so this changes existing behavior.
In practice, it should greatly reduce the fraction of the time we need to show
the user a menu of options.
C++ API changes:
- findDefinitions is replaced by locateSymbolAt, which returns a
vector<LocatedSymbol> - one for each symbol under the cursor.
- this contains the preferred declaration, the definition (if found), and
the symbol name
This API enables some potentially-neat extensions, like swapping between decl
and def, and exposing the symbol name to the UI in the case of multiple symbols.
Reviewers: hokein
Subscribers: ilya-biryukov, javed.absar, ioeric, MaskRay, jkorous, arphaman, kadircet, cfe-commits
Differential Revision: https://reviews.llvm.org/D57388
llvm-svn: 352864
2019-02-01 19:26:13 +08:00
|
|
|
typedef int $decl[[Foo]];
|
2017-12-21 00:06:05 +08:00
|
|
|
int main() {
|
|
|
|
^Foo bar;
|
|
|
|
}
|
|
|
|
)cpp",
|
|
|
|
|
|
|
|
R"cpp(// Template type parameter
|
2019-02-21 17:55:00 +08:00
|
|
|
template <typename [[T]]>
|
2017-12-21 00:06:05 +08:00
|
|
|
void foo() { ^T t; }
|
2019-02-21 17:55:00 +08:00
|
|
|
)cpp",
|
|
|
|
|
|
|
|
R"cpp(// Template template type parameter
|
|
|
|
template <template<typename> class [[T]]>
|
|
|
|
void foo() { ^T<int> t; }
|
|
|
|
)cpp",
|
2017-12-21 00:06:05 +08:00
|
|
|
|
|
|
|
R"cpp(// Namespace
|
[clangd] Implement textDocument/declaration from LSP 3.14
Summary:
LSP now reflects the declaration/definition distinction.
Language server changes:
- textDocument/definition now returns a definition if one is found, otherwise
the declaration. It no longer returns declaration + definition if they are
distinct.
- textDocument/declaration returns the best declaration we can find.
- For macros, the active macro definition is returned for both methods.
- For include directive, the top of the target file is returned for both.
There doesn't appear to be a discovery mechanism (we can't return everything to
clients that only know about definition), so this changes existing behavior.
In practice, it should greatly reduce the fraction of the time we need to show
the user a menu of options.
C++ API changes:
- findDefinitions is replaced by locateSymbolAt, which returns a
vector<LocatedSymbol> - one for each symbol under the cursor.
- this contains the preferred declaration, the definition (if found), and
the symbol name
This API enables some potentially-neat extensions, like swapping between decl
and def, and exposing the symbol name to the UI in the case of multiple symbols.
Reviewers: hokein
Subscribers: ilya-biryukov, javed.absar, ioeric, MaskRay, jkorous, arphaman, kadircet, cfe-commits
Differential Revision: https://reviews.llvm.org/D57388
llvm-svn: 352864
2019-02-01 19:26:13 +08:00
|
|
|
namespace $decl[[ns]] {
|
2017-12-21 00:06:05 +08:00
|
|
|
struct Foo { static void bar(); }
|
2018-03-09 22:00:34 +08:00
|
|
|
} // namespace ns
|
2017-12-21 00:06:05 +08:00
|
|
|
int main() { ^ns::Foo::bar(); }
|
|
|
|
)cpp",
|
|
|
|
|
|
|
|
R"cpp(// Macro
|
|
|
|
#define MACRO 0
|
2018-03-13 22:31:31 +08:00
|
|
|
#define [[MACRO]] 1
|
2017-12-21 00:06:05 +08:00
|
|
|
int main() { return ^MACRO; }
|
|
|
|
#define MACRO 2
|
|
|
|
#undef macro
|
|
|
|
)cpp",
|
2018-01-12 22:21:10 +08:00
|
|
|
|
2018-03-13 20:30:59 +08:00
|
|
|
R"cpp(// Macro
|
|
|
|
class TTT { public: int a; };
|
2018-03-13 22:31:31 +08:00
|
|
|
#define [[FF]](S) if (int b = S.a) {}
|
2018-03-13 20:30:59 +08:00
|
|
|
void f() {
|
|
|
|
TTT t;
|
|
|
|
F^F(t);
|
|
|
|
}
|
|
|
|
)cpp",
|
|
|
|
|
2018-04-09 22:28:52 +08:00
|
|
|
R"cpp(// Macro argument
|
|
|
|
int [[i]];
|
|
|
|
#define ADDRESSOF(X) &X;
|
|
|
|
int *j = ADDRESSOF(^i);
|
|
|
|
)cpp",
|
|
|
|
|
|
|
|
R"cpp(// Symbol concatenated inside macro (not supported)
|
|
|
|
int *pi;
|
|
|
|
#define POINTER(X) p # X;
|
|
|
|
int i = *POINTER(^i);
|
|
|
|
)cpp",
|
|
|
|
|
2018-01-12 22:21:10 +08:00
|
|
|
R"cpp(// Forward class declaration
|
|
|
|
class Foo;
|
2018-03-09 22:00:34 +08:00
|
|
|
class [[Foo]] {};
|
2018-01-12 22:21:10 +08:00
|
|
|
F^oo* foo();
|
|
|
|
)cpp",
|
|
|
|
|
|
|
|
R"cpp(// Function declaration
|
|
|
|
void foo();
|
|
|
|
void g() { f^oo(); }
|
2018-03-09 22:00:34 +08:00
|
|
|
void [[foo]]() {}
|
|
|
|
)cpp",
|
|
|
|
|
|
|
|
R"cpp(
|
|
|
|
#define FF(name) class name##_Test {};
|
|
|
|
[[FF]](my);
|
|
|
|
void f() { my^_Test a; }
|
|
|
|
)cpp",
|
|
|
|
|
|
|
|
R"cpp(
|
|
|
|
#define FF() class [[Test]] {};
|
|
|
|
FF();
|
|
|
|
void f() { T^est a; }
|
2018-01-12 22:21:10 +08:00
|
|
|
)cpp",
|
2019-02-18 22:23:19 +08:00
|
|
|
|
|
|
|
R"cpp(// explicit template specialization
|
|
|
|
template <typename T>
|
|
|
|
struct Foo { void bar() {} };
|
|
|
|
|
|
|
|
template <>
|
|
|
|
struct [[Foo]]<int> { void bar() {} };
|
|
|
|
|
|
|
|
void foo() {
|
|
|
|
Foo<char> abc;
|
|
|
|
Fo^o<int> b;
|
|
|
|
}
|
|
|
|
)cpp",
|
|
|
|
|
|
|
|
R"cpp(// implicit template specialization
|
|
|
|
template <typename T>
|
|
|
|
struct [[Foo]] { void bar() {} };
|
|
|
|
template <>
|
|
|
|
struct Foo<int> { void bar() {} };
|
|
|
|
void foo() {
|
|
|
|
Fo^o<char> abc;
|
|
|
|
Foo<int> b;
|
|
|
|
}
|
|
|
|
)cpp",
|
|
|
|
|
|
|
|
R"cpp(// partial template specialization
|
|
|
|
template <typename T>
|
|
|
|
struct Foo { void bar() {} };
|
|
|
|
template <typename T>
|
|
|
|
struct [[Foo]]<T*> { void bar() {} };
|
|
|
|
^Foo<int*> x;
|
|
|
|
)cpp",
|
|
|
|
|
|
|
|
R"cpp(// function template specializations
|
|
|
|
template <class T>
|
|
|
|
void foo(T) {}
|
|
|
|
template <>
|
|
|
|
void [[foo]](int) {}
|
|
|
|
void bar() {
|
|
|
|
fo^o(10);
|
|
|
|
}
|
|
|
|
)cpp",
|
|
|
|
|
|
|
|
R"cpp(// variable template decls
|
|
|
|
template <class T>
|
|
|
|
T var = T();
|
|
|
|
|
|
|
|
template <>
|
|
|
|
double [[var]]<int> = 10;
|
|
|
|
|
|
|
|
double y = va^r<int>;
|
|
|
|
)cpp",
|
2019-02-21 22:48:33 +08:00
|
|
|
|
|
|
|
R"cpp(// No implicit constructors
|
|
|
|
class X {
|
|
|
|
X(X&& x) = default;
|
|
|
|
};
|
|
|
|
X [[makeX]]() {}
|
|
|
|
void foo() {
|
|
|
|
auto x = m^akeX();
|
|
|
|
}
|
|
|
|
)cpp",
|
2017-12-21 00:06:05 +08:00
|
|
|
};
|
|
|
|
for (const char *Test : Tests) {
|
|
|
|
Annotations T(Test);
|
[clangd] Implement textDocument/declaration from LSP 3.14
Summary:
LSP now reflects the declaration/definition distinction.
Language server changes:
- textDocument/definition now returns a definition if one is found, otherwise
the declaration. It no longer returns declaration + definition if they are
distinct.
- textDocument/declaration returns the best declaration we can find.
- For macros, the active macro definition is returned for both methods.
- For include directive, the top of the target file is returned for both.
There doesn't appear to be a discovery mechanism (we can't return everything to
clients that only know about definition), so this changes existing behavior.
In practice, it should greatly reduce the fraction of the time we need to show
the user a menu of options.
C++ API changes:
- findDefinitions is replaced by locateSymbolAt, which returns a
vector<LocatedSymbol> - one for each symbol under the cursor.
- this contains the preferred declaration, the definition (if found), and
the symbol name
This API enables some potentially-neat extensions, like swapping between decl
and def, and exposing the symbol name to the UI in the case of multiple symbols.
Reviewers: hokein
Subscribers: ilya-biryukov, javed.absar, ioeric, MaskRay, jkorous, arphaman, kadircet, cfe-commits
Differential Revision: https://reviews.llvm.org/D57388
llvm-svn: 352864
2019-02-01 19:26:13 +08:00
|
|
|
llvm::Optional<Range> WantDecl;
|
|
|
|
llvm::Optional<Range> WantDef;
|
|
|
|
if (!T.ranges().empty())
|
|
|
|
WantDecl = WantDef = T.range();
|
|
|
|
if (!T.ranges("decl").empty())
|
|
|
|
WantDecl = T.range("decl");
|
|
|
|
if (!T.ranges("def").empty())
|
|
|
|
WantDef = T.range("def");
|
|
|
|
|
[clangd] Extract scoring/ranking logic, and shave yaks.
Summary:
Code completion scoring was embedded in CodeComplete.cpp, which is bad:
- awkward to test. The mechanisms (extracting info from index/sema) can be
unit-tested well, the policy (scoring) should be quantitatively measured.
Neither was easily possible, and debugging was hard.
The intermediate signal struct makes this easier.
- hard to reuse. This is a bug in workspaceSymbols: it just presents the
results in the index order, which is not sorted in practice, it needs to rank
them!
Also, index implementations care about scoring (both query-dependent and
independent) in order to truncate result lists appropriately.
The main yak shaved here is the build() function that had 3 variants across
unit tests is unified in TestTU.h (rather than adding a 4th variant).
Reviewers: ilya-biryukov
Subscribers: klimek, mgorny, ioeric, MaskRay, jkorous, mgrang, cfe-commits
Differential Revision: https://reviews.llvm.org/D46524
llvm-svn: 332378
2018-05-16 01:43:27 +08:00
|
|
|
auto AST = TestTU::withCode(T.code()).build();
|
[clangd] Implement textDocument/declaration from LSP 3.14
Summary:
LSP now reflects the declaration/definition distinction.
Language server changes:
- textDocument/definition now returns a definition if one is found, otherwise
the declaration. It no longer returns declaration + definition if they are
distinct.
- textDocument/declaration returns the best declaration we can find.
- For macros, the active macro definition is returned for both methods.
- For include directive, the top of the target file is returned for both.
There doesn't appear to be a discovery mechanism (we can't return everything to
clients that only know about definition), so this changes existing behavior.
In practice, it should greatly reduce the fraction of the time we need to show
the user a menu of options.
C++ API changes:
- findDefinitions is replaced by locateSymbolAt, which returns a
vector<LocatedSymbol> - one for each symbol under the cursor.
- this contains the preferred declaration, the definition (if found), and
the symbol name
This API enables some potentially-neat extensions, like swapping between decl
and def, and exposing the symbol name to the UI in the case of multiple symbols.
Reviewers: hokein
Subscribers: ilya-biryukov, javed.absar, ioeric, MaskRay, jkorous, arphaman, kadircet, cfe-commits
Differential Revision: https://reviews.llvm.org/D57388
llvm-svn: 352864
2019-02-01 19:26:13 +08:00
|
|
|
auto Results = locateSymbolAt(AST, T.point());
|
|
|
|
|
|
|
|
if (!WantDecl) {
|
|
|
|
EXPECT_THAT(Results, IsEmpty()) << Test;
|
|
|
|
} else {
|
|
|
|
ASSERT_THAT(Results, ::testing::SizeIs(1)) << Test;
|
|
|
|
EXPECT_EQ(Results[0].PreferredDeclaration.range, *WantDecl) << Test;
|
|
|
|
llvm::Optional<Range> GotDef;
|
|
|
|
if (Results[0].Definition)
|
|
|
|
GotDef = Results[0].Definition->range;
|
|
|
|
EXPECT_EQ(WantDef, GotDef) << Test;
|
|
|
|
}
|
2017-12-21 00:06:05 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
[clangd] Implement textDocument/declaration from LSP 3.14
Summary:
LSP now reflects the declaration/definition distinction.
Language server changes:
- textDocument/definition now returns a definition if one is found, otherwise
the declaration. It no longer returns declaration + definition if they are
distinct.
- textDocument/declaration returns the best declaration we can find.
- For macros, the active macro definition is returned for both methods.
- For include directive, the top of the target file is returned for both.
There doesn't appear to be a discovery mechanism (we can't return everything to
clients that only know about definition), so this changes existing behavior.
In practice, it should greatly reduce the fraction of the time we need to show
the user a menu of options.
C++ API changes:
- findDefinitions is replaced by locateSymbolAt, which returns a
vector<LocatedSymbol> - one for each symbol under the cursor.
- this contains the preferred declaration, the definition (if found), and
the symbol name
This API enables some potentially-neat extensions, like swapping between decl
and def, and exposing the symbol name to the UI in the case of multiple symbols.
Reviewers: hokein
Subscribers: ilya-biryukov, javed.absar, ioeric, MaskRay, jkorous, arphaman, kadircet, cfe-commits
Differential Revision: https://reviews.llvm.org/D57388
llvm-svn: 352864
2019-02-01 19:26:13 +08:00
|
|
|
TEST(LocateSymbol, Ambiguous) {
|
2018-09-05 20:00:15 +08:00
|
|
|
auto T = Annotations(R"cpp(
|
[clangd] Implement textDocument/declaration from LSP 3.14
Summary:
LSP now reflects the declaration/definition distinction.
Language server changes:
- textDocument/definition now returns a definition if one is found, otherwise
the declaration. It no longer returns declaration + definition if they are
distinct.
- textDocument/declaration returns the best declaration we can find.
- For macros, the active macro definition is returned for both methods.
- For include directive, the top of the target file is returned for both.
There doesn't appear to be a discovery mechanism (we can't return everything to
clients that only know about definition), so this changes existing behavior.
In practice, it should greatly reduce the fraction of the time we need to show
the user a menu of options.
C++ API changes:
- findDefinitions is replaced by locateSymbolAt, which returns a
vector<LocatedSymbol> - one for each symbol under the cursor.
- this contains the preferred declaration, the definition (if found), and
the symbol name
This API enables some potentially-neat extensions, like swapping between decl
and def, and exposing the symbol name to the UI in the case of multiple symbols.
Reviewers: hokein
Subscribers: ilya-biryukov, javed.absar, ioeric, MaskRay, jkorous, arphaman, kadircet, cfe-commits
Differential Revision: https://reviews.llvm.org/D57388
llvm-svn: 352864
2019-02-01 19:26:13 +08:00
|
|
|
struct Foo {
|
|
|
|
Foo();
|
|
|
|
Foo(Foo&&);
|
|
|
|
Foo(const char*);
|
2018-09-05 20:00:15 +08:00
|
|
|
};
|
|
|
|
|
[clangd] Implement textDocument/declaration from LSP 3.14
Summary:
LSP now reflects the declaration/definition distinction.
Language server changes:
- textDocument/definition now returns a definition if one is found, otherwise
the declaration. It no longer returns declaration + definition if they are
distinct.
- textDocument/declaration returns the best declaration we can find.
- For macros, the active macro definition is returned for both methods.
- For include directive, the top of the target file is returned for both.
There doesn't appear to be a discovery mechanism (we can't return everything to
clients that only know about definition), so this changes existing behavior.
In practice, it should greatly reduce the fraction of the time we need to show
the user a menu of options.
C++ API changes:
- findDefinitions is replaced by locateSymbolAt, which returns a
vector<LocatedSymbol> - one for each symbol under the cursor.
- this contains the preferred declaration, the definition (if found), and
the symbol name
This API enables some potentially-neat extensions, like swapping between decl
and def, and exposing the symbol name to the UI in the case of multiple symbols.
Reviewers: hokein
Subscribers: ilya-biryukov, javed.absar, ioeric, MaskRay, jkorous, arphaman, kadircet, cfe-commits
Differential Revision: https://reviews.llvm.org/D57388
llvm-svn: 352864
2019-02-01 19:26:13 +08:00
|
|
|
Foo f();
|
2018-09-05 20:00:15 +08:00
|
|
|
|
[clangd] Implement textDocument/declaration from LSP 3.14
Summary:
LSP now reflects the declaration/definition distinction.
Language server changes:
- textDocument/definition now returns a definition if one is found, otherwise
the declaration. It no longer returns declaration + definition if they are
distinct.
- textDocument/declaration returns the best declaration we can find.
- For macros, the active macro definition is returned for both methods.
- For include directive, the top of the target file is returned for both.
There doesn't appear to be a discovery mechanism (we can't return everything to
clients that only know about definition), so this changes existing behavior.
In practice, it should greatly reduce the fraction of the time we need to show
the user a menu of options.
C++ API changes:
- findDefinitions is replaced by locateSymbolAt, which returns a
vector<LocatedSymbol> - one for each symbol under the cursor.
- this contains the preferred declaration, the definition (if found), and
the symbol name
This API enables some potentially-neat extensions, like swapping between decl
and def, and exposing the symbol name to the UI in the case of multiple symbols.
Reviewers: hokein
Subscribers: ilya-biryukov, javed.absar, ioeric, MaskRay, jkorous, arphaman, kadircet, cfe-commits
Differential Revision: https://reviews.llvm.org/D57388
llvm-svn: 352864
2019-02-01 19:26:13 +08:00
|
|
|
void g(Foo foo);
|
2018-09-05 20:00:15 +08:00
|
|
|
|
|
|
|
void call() {
|
[clangd] Implement textDocument/declaration from LSP 3.14
Summary:
LSP now reflects the declaration/definition distinction.
Language server changes:
- textDocument/definition now returns a definition if one is found, otherwise
the declaration. It no longer returns declaration + definition if they are
distinct.
- textDocument/declaration returns the best declaration we can find.
- For macros, the active macro definition is returned for both methods.
- For include directive, the top of the target file is returned for both.
There doesn't appear to be a discovery mechanism (we can't return everything to
clients that only know about definition), so this changes existing behavior.
In practice, it should greatly reduce the fraction of the time we need to show
the user a menu of options.
C++ API changes:
- findDefinitions is replaced by locateSymbolAt, which returns a
vector<LocatedSymbol> - one for each symbol under the cursor.
- this contains the preferred declaration, the definition (if found), and
the symbol name
This API enables some potentially-neat extensions, like swapping between decl
and def, and exposing the symbol name to the UI in the case of multiple symbols.
Reviewers: hokein
Subscribers: ilya-biryukov, javed.absar, ioeric, MaskRay, jkorous, arphaman, kadircet, cfe-commits
Differential Revision: https://reviews.llvm.org/D57388
llvm-svn: 352864
2019-02-01 19:26:13 +08:00
|
|
|
const char* str = "123";
|
2018-09-05 20:00:15 +08:00
|
|
|
Foo a = $1^str;
|
|
|
|
Foo b = Foo($2^str);
|
|
|
|
Foo c = $3^f();
|
|
|
|
$4^g($5^f());
|
|
|
|
g($6^str);
|
2019-02-21 22:48:33 +08:00
|
|
|
Foo ab$7^c;
|
|
|
|
Foo ab$8^cd("asdf");
|
|
|
|
Foo foox = Fo$9^o("asdf");
|
2018-09-05 20:00:15 +08:00
|
|
|
}
|
|
|
|
)cpp");
|
|
|
|
auto AST = TestTU::withCode(T.code()).build();
|
[clangd] Implement textDocument/declaration from LSP 3.14
Summary:
LSP now reflects the declaration/definition distinction.
Language server changes:
- textDocument/definition now returns a definition if one is found, otherwise
the declaration. It no longer returns declaration + definition if they are
distinct.
- textDocument/declaration returns the best declaration we can find.
- For macros, the active macro definition is returned for both methods.
- For include directive, the top of the target file is returned for both.
There doesn't appear to be a discovery mechanism (we can't return everything to
clients that only know about definition), so this changes existing behavior.
In practice, it should greatly reduce the fraction of the time we need to show
the user a menu of options.
C++ API changes:
- findDefinitions is replaced by locateSymbolAt, which returns a
vector<LocatedSymbol> - one for each symbol under the cursor.
- this contains the preferred declaration, the definition (if found), and
the symbol name
This API enables some potentially-neat extensions, like swapping between decl
and def, and exposing the symbol name to the UI in the case of multiple symbols.
Reviewers: hokein
Subscribers: ilya-biryukov, javed.absar, ioeric, MaskRay, jkorous, arphaman, kadircet, cfe-commits
Differential Revision: https://reviews.llvm.org/D57388
llvm-svn: 352864
2019-02-01 19:26:13 +08:00
|
|
|
// Ordered assertions are deliberate: we expect a predictable order.
|
2019-02-21 22:48:33 +08:00
|
|
|
EXPECT_THAT(locateSymbolAt(AST, T.point("1")), ElementsAre(Sym("str")));
|
[clangd] Implement textDocument/declaration from LSP 3.14
Summary:
LSP now reflects the declaration/definition distinction.
Language server changes:
- textDocument/definition now returns a definition if one is found, otherwise
the declaration. It no longer returns declaration + definition if they are
distinct.
- textDocument/declaration returns the best declaration we can find.
- For macros, the active macro definition is returned for both methods.
- For include directive, the top of the target file is returned for both.
There doesn't appear to be a discovery mechanism (we can't return everything to
clients that only know about definition), so this changes existing behavior.
In practice, it should greatly reduce the fraction of the time we need to show
the user a menu of options.
C++ API changes:
- findDefinitions is replaced by locateSymbolAt, which returns a
vector<LocatedSymbol> - one for each symbol under the cursor.
- this contains the preferred declaration, the definition (if found), and
the symbol name
This API enables some potentially-neat extensions, like swapping between decl
and def, and exposing the symbol name to the UI in the case of multiple symbols.
Reviewers: hokein
Subscribers: ilya-biryukov, javed.absar, ioeric, MaskRay, jkorous, arphaman, kadircet, cfe-commits
Differential Revision: https://reviews.llvm.org/D57388
llvm-svn: 352864
2019-02-01 19:26:13 +08:00
|
|
|
EXPECT_THAT(locateSymbolAt(AST, T.point("2")), ElementsAre(Sym("str")));
|
2019-02-21 22:48:33 +08:00
|
|
|
EXPECT_THAT(locateSymbolAt(AST, T.point("3")), ElementsAre(Sym("f")));
|
[clangd] Implement textDocument/declaration from LSP 3.14
Summary:
LSP now reflects the declaration/definition distinction.
Language server changes:
- textDocument/definition now returns a definition if one is found, otherwise
the declaration. It no longer returns declaration + definition if they are
distinct.
- textDocument/declaration returns the best declaration we can find.
- For macros, the active macro definition is returned for both methods.
- For include directive, the top of the target file is returned for both.
There doesn't appear to be a discovery mechanism (we can't return everything to
clients that only know about definition), so this changes existing behavior.
In practice, it should greatly reduce the fraction of the time we need to show
the user a menu of options.
C++ API changes:
- findDefinitions is replaced by locateSymbolAt, which returns a
vector<LocatedSymbol> - one for each symbol under the cursor.
- this contains the preferred declaration, the definition (if found), and
the symbol name
This API enables some potentially-neat extensions, like swapping between decl
and def, and exposing the symbol name to the UI in the case of multiple symbols.
Reviewers: hokein
Subscribers: ilya-biryukov, javed.absar, ioeric, MaskRay, jkorous, arphaman, kadircet, cfe-commits
Differential Revision: https://reviews.llvm.org/D57388
llvm-svn: 352864
2019-02-01 19:26:13 +08:00
|
|
|
EXPECT_THAT(locateSymbolAt(AST, T.point("4")), ElementsAre(Sym("g")));
|
2019-02-21 22:48:33 +08:00
|
|
|
EXPECT_THAT(locateSymbolAt(AST, T.point("5")), ElementsAre(Sym("f")));
|
|
|
|
EXPECT_THAT(locateSymbolAt(AST, T.point("6")), ElementsAre(Sym("str")));
|
|
|
|
EXPECT_THAT(locateSymbolAt(AST, T.point("7")), ElementsAre(Sym("abc")));
|
|
|
|
EXPECT_THAT(locateSymbolAt(AST, T.point("8")),
|
|
|
|
ElementsAre(Sym("Foo"), Sym("abcd")));
|
|
|
|
EXPECT_THAT(locateSymbolAt(AST, T.point("9")),
|
|
|
|
// First one is class definition, second is the constructor.
|
|
|
|
ElementsAre(Sym("Foo"), Sym("Foo")));
|
2018-09-05 20:00:15 +08:00
|
|
|
}
|
|
|
|
|
2019-05-24 00:48:47 +08:00
|
|
|
TEST(LocateSymbol, TemplateTypedefs) {
|
|
|
|
auto T = Annotations(R"cpp(
|
|
|
|
template <class T> struct function {};
|
|
|
|
template <class T> using callback = function<T()>;
|
|
|
|
|
|
|
|
c^allback<int> foo;
|
|
|
|
)cpp");
|
|
|
|
auto AST = TestTU::withCode(T.code()).build();
|
|
|
|
EXPECT_THAT(locateSymbolAt(AST, T.point()), ElementsAre(Sym("callback")));
|
|
|
|
}
|
|
|
|
|
[clangd] Implement textDocument/declaration from LSP 3.14
Summary:
LSP now reflects the declaration/definition distinction.
Language server changes:
- textDocument/definition now returns a definition if one is found, otherwise
the declaration. It no longer returns declaration + definition if they are
distinct.
- textDocument/declaration returns the best declaration we can find.
- For macros, the active macro definition is returned for both methods.
- For include directive, the top of the target file is returned for both.
There doesn't appear to be a discovery mechanism (we can't return everything to
clients that only know about definition), so this changes existing behavior.
In practice, it should greatly reduce the fraction of the time we need to show
the user a menu of options.
C++ API changes:
- findDefinitions is replaced by locateSymbolAt, which returns a
vector<LocatedSymbol> - one for each symbol under the cursor.
- this contains the preferred declaration, the definition (if found), and
the symbol name
This API enables some potentially-neat extensions, like swapping between decl
and def, and exposing the symbol name to the UI in the case of multiple symbols.
Reviewers: hokein
Subscribers: ilya-biryukov, javed.absar, ioeric, MaskRay, jkorous, arphaman, kadircet, cfe-commits
Differential Revision: https://reviews.llvm.org/D57388
llvm-svn: 352864
2019-02-01 19:26:13 +08:00
|
|
|
TEST(LocateSymbol, RelPathsInCompileCommand) {
|
[clangd] Avoid duplicates in findDefinitions response
Summary:
When compile_commands.json contains some source files expressed as
relative paths, we can get duplicate responses to findDefinitions. The
responses only differ by the URI, which are different versions of the
same file:
"result": [
{
...
"uri": "file:///home/emaisin/src/ls-interact/cpp-test/build/../src/first.h"
},
{
...
"uri": "file:///home/emaisin/src/ls-interact/cpp-test/src/first.h"
}
]
In getAbsoluteFilePath, we try to obtain the realpath of the FileEntry
by calling tryGetRealPathName. However, this can fail and return an
empty string. It may be bug a bug in clang, but in any case we should
fall back to computing it ourselves if it happens.
I changed getAbsoluteFilePath so that if tryGetRealPathName succeeds, we
return right away (a real path is always absolute). Otherwise, we try
to build an absolute path, as we did before, but we also call
VFS->getRealPath to make sure to get the canonical path (e.g. without
any ".." in it).
Reviewers: malaperle
Subscribers: hokein, ilya-biryukov, ioeric, MaskRay, jkorous, cfe-commits
Differential Revision: https://reviews.llvm.org/D48687
llvm-svn: 339483
2018-08-11 06:27:53 +08:00
|
|
|
// The source is in "/clangd-test/src".
|
|
|
|
// We build in "/clangd-test/build".
|
|
|
|
|
2018-02-14 01:47:16 +08:00
|
|
|
Annotations SourceAnnotations(R"cpp(
|
[clangd] Avoid duplicates in findDefinitions response
Summary:
When compile_commands.json contains some source files expressed as
relative paths, we can get duplicate responses to findDefinitions. The
responses only differ by the URI, which are different versions of the
same file:
"result": [
{
...
"uri": "file:///home/emaisin/src/ls-interact/cpp-test/build/../src/first.h"
},
{
...
"uri": "file:///home/emaisin/src/ls-interact/cpp-test/src/first.h"
}
]
In getAbsoluteFilePath, we try to obtain the realpath of the FileEntry
by calling tryGetRealPathName. However, this can fail and return an
empty string. It may be bug a bug in clang, but in any case we should
fall back to computing it ourselves if it happens.
I changed getAbsoluteFilePath so that if tryGetRealPathName succeeds, we
return right away (a real path is always absolute). Otherwise, we try
to build an absolute path, as we did before, but we also call
VFS->getRealPath to make sure to get the canonical path (e.g. without
any ".." in it).
Reviewers: malaperle
Subscribers: hokein, ilya-biryukov, ioeric, MaskRay, jkorous, cfe-commits
Differential Revision: https://reviews.llvm.org/D48687
llvm-svn: 339483
2018-08-11 06:27:53 +08:00
|
|
|
#include "header_in_preamble.h"
|
2018-03-09 22:00:34 +08:00
|
|
|
int [[foo]];
|
[clangd] Avoid duplicates in findDefinitions response
Summary:
When compile_commands.json contains some source files expressed as
relative paths, we can get duplicate responses to findDefinitions. The
responses only differ by the URI, which are different versions of the
same file:
"result": [
{
...
"uri": "file:///home/emaisin/src/ls-interact/cpp-test/build/../src/first.h"
},
{
...
"uri": "file:///home/emaisin/src/ls-interact/cpp-test/src/first.h"
}
]
In getAbsoluteFilePath, we try to obtain the realpath of the FileEntry
by calling tryGetRealPathName. However, this can fail and return an
empty string. It may be bug a bug in clang, but in any case we should
fall back to computing it ourselves if it happens.
I changed getAbsoluteFilePath so that if tryGetRealPathName succeeds, we
return right away (a real path is always absolute). Otherwise, we try
to build an absolute path, as we did before, but we also call
VFS->getRealPath to make sure to get the canonical path (e.g. without
any ".." in it).
Reviewers: malaperle
Subscribers: hokein, ilya-biryukov, ioeric, MaskRay, jkorous, cfe-commits
Differential Revision: https://reviews.llvm.org/D48687
llvm-svn: 339483
2018-08-11 06:27:53 +08:00
|
|
|
#include "header_not_in_preamble.h"
|
|
|
|
int baz = f$p1^oo + bar_pre$p2^amble + bar_not_pre$p3^amble;
|
|
|
|
)cpp");
|
|
|
|
|
|
|
|
Annotations HeaderInPreambleAnnotations(R"cpp(
|
|
|
|
int [[bar_preamble]];
|
2018-02-14 01:47:16 +08:00
|
|
|
)cpp");
|
|
|
|
|
[clangd] Avoid duplicates in findDefinitions response
Summary:
When compile_commands.json contains some source files expressed as
relative paths, we can get duplicate responses to findDefinitions. The
responses only differ by the URI, which are different versions of the
same file:
"result": [
{
...
"uri": "file:///home/emaisin/src/ls-interact/cpp-test/build/../src/first.h"
},
{
...
"uri": "file:///home/emaisin/src/ls-interact/cpp-test/src/first.h"
}
]
In getAbsoluteFilePath, we try to obtain the realpath of the FileEntry
by calling tryGetRealPathName. However, this can fail and return an
empty string. It may be bug a bug in clang, but in any case we should
fall back to computing it ourselves if it happens.
I changed getAbsoluteFilePath so that if tryGetRealPathName succeeds, we
return right away (a real path is always absolute). Otherwise, we try
to build an absolute path, as we did before, but we also call
VFS->getRealPath to make sure to get the canonical path (e.g. without
any ".." in it).
Reviewers: malaperle
Subscribers: hokein, ilya-biryukov, ioeric, MaskRay, jkorous, cfe-commits
Differential Revision: https://reviews.llvm.org/D48687
llvm-svn: 339483
2018-08-11 06:27:53 +08:00
|
|
|
Annotations HeaderNotInPreambleAnnotations(R"cpp(
|
|
|
|
int [[bar_not_preamble]];
|
|
|
|
)cpp");
|
|
|
|
|
|
|
|
// Make the compilation paths appear as ../src/foo.cpp in the compile
|
|
|
|
// commands.
|
|
|
|
SmallString<32> RelPathPrefix("..");
|
2019-01-07 23:45:19 +08:00
|
|
|
llvm::sys::path::append(RelPathPrefix, "src");
|
[clangd] Avoid duplicates in findDefinitions response
Summary:
When compile_commands.json contains some source files expressed as
relative paths, we can get duplicate responses to findDefinitions. The
responses only differ by the URI, which are different versions of the
same file:
"result": [
{
...
"uri": "file:///home/emaisin/src/ls-interact/cpp-test/build/../src/first.h"
},
{
...
"uri": "file:///home/emaisin/src/ls-interact/cpp-test/src/first.h"
}
]
In getAbsoluteFilePath, we try to obtain the realpath of the FileEntry
by calling tryGetRealPathName. However, this can fail and return an
empty string. It may be bug a bug in clang, but in any case we should
fall back to computing it ourselves if it happens.
I changed getAbsoluteFilePath so that if tryGetRealPathName succeeds, we
return right away (a real path is always absolute). Otherwise, we try
to build an absolute path, as we did before, but we also call
VFS->getRealPath to make sure to get the canonical path (e.g. without
any ".." in it).
Reviewers: malaperle
Subscribers: hokein, ilya-biryukov, ioeric, MaskRay, jkorous, cfe-commits
Differential Revision: https://reviews.llvm.org/D48687
llvm-svn: 339483
2018-08-11 06:27:53 +08:00
|
|
|
std::string BuildDir = testPath("build");
|
|
|
|
MockCompilationDatabase CDB(BuildDir, RelPathPrefix);
|
|
|
|
|
2018-02-14 01:47:16 +08:00
|
|
|
IgnoreDiagnostics DiagConsumer;
|
|
|
|
MockFSProvider FS;
|
2018-03-06 01:28:54 +08:00
|
|
|
ClangdServer Server(CDB, FS, DiagConsumer, ClangdServer::optsForTest());
|
2018-02-14 01:47:16 +08:00
|
|
|
|
[clangd] Avoid duplicates in findDefinitions response
Summary:
When compile_commands.json contains some source files expressed as
relative paths, we can get duplicate responses to findDefinitions. The
responses only differ by the URI, which are different versions of the
same file:
"result": [
{
...
"uri": "file:///home/emaisin/src/ls-interact/cpp-test/build/../src/first.h"
},
{
...
"uri": "file:///home/emaisin/src/ls-interact/cpp-test/src/first.h"
}
]
In getAbsoluteFilePath, we try to obtain the realpath of the FileEntry
by calling tryGetRealPathName. However, this can fail and return an
empty string. It may be bug a bug in clang, but in any case we should
fall back to computing it ourselves if it happens.
I changed getAbsoluteFilePath so that if tryGetRealPathName succeeds, we
return right away (a real path is always absolute). Otherwise, we try
to build an absolute path, as we did before, but we also call
VFS->getRealPath to make sure to get the canonical path (e.g. without
any ".." in it).
Reviewers: malaperle
Subscribers: hokein, ilya-biryukov, ioeric, MaskRay, jkorous, cfe-commits
Differential Revision: https://reviews.llvm.org/D48687
llvm-svn: 339483
2018-08-11 06:27:53 +08:00
|
|
|
// Fill the filesystem.
|
|
|
|
auto FooCpp = testPath("src/foo.cpp");
|
2018-02-14 01:47:16 +08:00
|
|
|
FS.Files[FooCpp] = "";
|
[clangd] Avoid duplicates in findDefinitions response
Summary:
When compile_commands.json contains some source files expressed as
relative paths, we can get duplicate responses to findDefinitions. The
responses only differ by the URI, which are different versions of the
same file:
"result": [
{
...
"uri": "file:///home/emaisin/src/ls-interact/cpp-test/build/../src/first.h"
},
{
...
"uri": "file:///home/emaisin/src/ls-interact/cpp-test/src/first.h"
}
]
In getAbsoluteFilePath, we try to obtain the realpath of the FileEntry
by calling tryGetRealPathName. However, this can fail and return an
empty string. It may be bug a bug in clang, but in any case we should
fall back to computing it ourselves if it happens.
I changed getAbsoluteFilePath so that if tryGetRealPathName succeeds, we
return right away (a real path is always absolute). Otherwise, we try
to build an absolute path, as we did before, but we also call
VFS->getRealPath to make sure to get the canonical path (e.g. without
any ".." in it).
Reviewers: malaperle
Subscribers: hokein, ilya-biryukov, ioeric, MaskRay, jkorous, cfe-commits
Differential Revision: https://reviews.llvm.org/D48687
llvm-svn: 339483
2018-08-11 06:27:53 +08:00
|
|
|
auto HeaderInPreambleH = testPath("src/header_in_preamble.h");
|
|
|
|
FS.Files[HeaderInPreambleH] = HeaderInPreambleAnnotations.code();
|
|
|
|
auto HeaderNotInPreambleH = testPath("src/header_not_in_preamble.h");
|
|
|
|
FS.Files[HeaderNotInPreambleH] = HeaderNotInPreambleAnnotations.code();
|
2018-02-14 01:47:16 +08:00
|
|
|
|
2018-03-06 01:28:54 +08:00
|
|
|
runAddDocument(Server, FooCpp, SourceAnnotations.code());
|
[clangd] Avoid duplicates in findDefinitions response
Summary:
When compile_commands.json contains some source files expressed as
relative paths, we can get duplicate responses to findDefinitions. The
responses only differ by the URI, which are different versions of the
same file:
"result": [
{
...
"uri": "file:///home/emaisin/src/ls-interact/cpp-test/build/../src/first.h"
},
{
...
"uri": "file:///home/emaisin/src/ls-interact/cpp-test/src/first.h"
}
]
In getAbsoluteFilePath, we try to obtain the realpath of the FileEntry
by calling tryGetRealPathName. However, this can fail and return an
empty string. It may be bug a bug in clang, but in any case we should
fall back to computing it ourselves if it happens.
I changed getAbsoluteFilePath so that if tryGetRealPathName succeeds, we
return right away (a real path is always absolute). Otherwise, we try
to build an absolute path, as we did before, but we also call
VFS->getRealPath to make sure to get the canonical path (e.g. without
any ".." in it).
Reviewers: malaperle
Subscribers: hokein, ilya-biryukov, ioeric, MaskRay, jkorous, cfe-commits
Differential Revision: https://reviews.llvm.org/D48687
llvm-svn: 339483
2018-08-11 06:27:53 +08:00
|
|
|
|
|
|
|
// Go to a definition in main source file.
|
2018-02-15 21:15:47 +08:00
|
|
|
auto Locations =
|
[clangd] Implement textDocument/declaration from LSP 3.14
Summary:
LSP now reflects the declaration/definition distinction.
Language server changes:
- textDocument/definition now returns a definition if one is found, otherwise
the declaration. It no longer returns declaration + definition if they are
distinct.
- textDocument/declaration returns the best declaration we can find.
- For macros, the active macro definition is returned for both methods.
- For include directive, the top of the target file is returned for both.
There doesn't appear to be a discovery mechanism (we can't return everything to
clients that only know about definition), so this changes existing behavior.
In practice, it should greatly reduce the fraction of the time we need to show
the user a menu of options.
C++ API changes:
- findDefinitions is replaced by locateSymbolAt, which returns a
vector<LocatedSymbol> - one for each symbol under the cursor.
- this contains the preferred declaration, the definition (if found), and
the symbol name
This API enables some potentially-neat extensions, like swapping between decl
and def, and exposing the symbol name to the UI in the case of multiple symbols.
Reviewers: hokein
Subscribers: ilya-biryukov, javed.absar, ioeric, MaskRay, jkorous, arphaman, kadircet, cfe-commits
Differential Revision: https://reviews.llvm.org/D57388
llvm-svn: 352864
2019-02-01 19:26:13 +08:00
|
|
|
runLocateSymbolAt(Server, FooCpp, SourceAnnotations.point("p1"));
|
2018-02-14 01:47:16 +08:00
|
|
|
EXPECT_TRUE(bool(Locations)) << "findDefinitions returned an error";
|
[clangd] Implement textDocument/declaration from LSP 3.14
Summary:
LSP now reflects the declaration/definition distinction.
Language server changes:
- textDocument/definition now returns a definition if one is found, otherwise
the declaration. It no longer returns declaration + definition if they are
distinct.
- textDocument/declaration returns the best declaration we can find.
- For macros, the active macro definition is returned for both methods.
- For include directive, the top of the target file is returned for both.
There doesn't appear to be a discovery mechanism (we can't return everything to
clients that only know about definition), so this changes existing behavior.
In practice, it should greatly reduce the fraction of the time we need to show
the user a menu of options.
C++ API changes:
- findDefinitions is replaced by locateSymbolAt, which returns a
vector<LocatedSymbol> - one for each symbol under the cursor.
- this contains the preferred declaration, the definition (if found), and
the symbol name
This API enables some potentially-neat extensions, like swapping between decl
and def, and exposing the symbol name to the UI in the case of multiple symbols.
Reviewers: hokein
Subscribers: ilya-biryukov, javed.absar, ioeric, MaskRay, jkorous, arphaman, kadircet, cfe-commits
Differential Revision: https://reviews.llvm.org/D57388
llvm-svn: 352864
2019-02-01 19:26:13 +08:00
|
|
|
EXPECT_THAT(*Locations, ElementsAre(Sym("foo", SourceAnnotations.range())));
|
[clangd] Avoid duplicates in findDefinitions response
Summary:
When compile_commands.json contains some source files expressed as
relative paths, we can get duplicate responses to findDefinitions. The
responses only differ by the URI, which are different versions of the
same file:
"result": [
{
...
"uri": "file:///home/emaisin/src/ls-interact/cpp-test/build/../src/first.h"
},
{
...
"uri": "file:///home/emaisin/src/ls-interact/cpp-test/src/first.h"
}
]
In getAbsoluteFilePath, we try to obtain the realpath of the FileEntry
by calling tryGetRealPathName. However, this can fail and return an
empty string. It may be bug a bug in clang, but in any case we should
fall back to computing it ourselves if it happens.
I changed getAbsoluteFilePath so that if tryGetRealPathName succeeds, we
return right away (a real path is always absolute). Otherwise, we try
to build an absolute path, as we did before, but we also call
VFS->getRealPath to make sure to get the canonical path (e.g. without
any ".." in it).
Reviewers: malaperle
Subscribers: hokein, ilya-biryukov, ioeric, MaskRay, jkorous, cfe-commits
Differential Revision: https://reviews.llvm.org/D48687
llvm-svn: 339483
2018-08-11 06:27:53 +08:00
|
|
|
|
|
|
|
// Go to a definition in header_in_preamble.h.
|
[clangd] Implement textDocument/declaration from LSP 3.14
Summary:
LSP now reflects the declaration/definition distinction.
Language server changes:
- textDocument/definition now returns a definition if one is found, otherwise
the declaration. It no longer returns declaration + definition if they are
distinct.
- textDocument/declaration returns the best declaration we can find.
- For macros, the active macro definition is returned for both methods.
- For include directive, the top of the target file is returned for both.
There doesn't appear to be a discovery mechanism (we can't return everything to
clients that only know about definition), so this changes existing behavior.
In practice, it should greatly reduce the fraction of the time we need to show
the user a menu of options.
C++ API changes:
- findDefinitions is replaced by locateSymbolAt, which returns a
vector<LocatedSymbol> - one for each symbol under the cursor.
- this contains the preferred declaration, the definition (if found), and
the symbol name
This API enables some potentially-neat extensions, like swapping between decl
and def, and exposing the symbol name to the UI in the case of multiple symbols.
Reviewers: hokein
Subscribers: ilya-biryukov, javed.absar, ioeric, MaskRay, jkorous, arphaman, kadircet, cfe-commits
Differential Revision: https://reviews.llvm.org/D57388
llvm-svn: 352864
2019-02-01 19:26:13 +08:00
|
|
|
Locations = runLocateSymbolAt(Server, FooCpp, SourceAnnotations.point("p2"));
|
[clangd] Avoid duplicates in findDefinitions response
Summary:
When compile_commands.json contains some source files expressed as
relative paths, we can get duplicate responses to findDefinitions. The
responses only differ by the URI, which are different versions of the
same file:
"result": [
{
...
"uri": "file:///home/emaisin/src/ls-interact/cpp-test/build/../src/first.h"
},
{
...
"uri": "file:///home/emaisin/src/ls-interact/cpp-test/src/first.h"
}
]
In getAbsoluteFilePath, we try to obtain the realpath of the FileEntry
by calling tryGetRealPathName. However, this can fail and return an
empty string. It may be bug a bug in clang, but in any case we should
fall back to computing it ourselves if it happens.
I changed getAbsoluteFilePath so that if tryGetRealPathName succeeds, we
return right away (a real path is always absolute). Otherwise, we try
to build an absolute path, as we did before, but we also call
VFS->getRealPath to make sure to get the canonical path (e.g. without
any ".." in it).
Reviewers: malaperle
Subscribers: hokein, ilya-biryukov, ioeric, MaskRay, jkorous, cfe-commits
Differential Revision: https://reviews.llvm.org/D48687
llvm-svn: 339483
2018-08-11 06:27:53 +08:00
|
|
|
EXPECT_TRUE(bool(Locations)) << "findDefinitions returned an error";
|
[clangd] Implement textDocument/declaration from LSP 3.14
Summary:
LSP now reflects the declaration/definition distinction.
Language server changes:
- textDocument/definition now returns a definition if one is found, otherwise
the declaration. It no longer returns declaration + definition if they are
distinct.
- textDocument/declaration returns the best declaration we can find.
- For macros, the active macro definition is returned for both methods.
- For include directive, the top of the target file is returned for both.
There doesn't appear to be a discovery mechanism (we can't return everything to
clients that only know about definition), so this changes existing behavior.
In practice, it should greatly reduce the fraction of the time we need to show
the user a menu of options.
C++ API changes:
- findDefinitions is replaced by locateSymbolAt, which returns a
vector<LocatedSymbol> - one for each symbol under the cursor.
- this contains the preferred declaration, the definition (if found), and
the symbol name
This API enables some potentially-neat extensions, like swapping between decl
and def, and exposing the symbol name to the UI in the case of multiple symbols.
Reviewers: hokein
Subscribers: ilya-biryukov, javed.absar, ioeric, MaskRay, jkorous, arphaman, kadircet, cfe-commits
Differential Revision: https://reviews.llvm.org/D57388
llvm-svn: 352864
2019-02-01 19:26:13 +08:00
|
|
|
EXPECT_THAT(
|
|
|
|
*Locations,
|
|
|
|
ElementsAre(Sym("bar_preamble", HeaderInPreambleAnnotations.range())));
|
[clangd] Avoid duplicates in findDefinitions response
Summary:
When compile_commands.json contains some source files expressed as
relative paths, we can get duplicate responses to findDefinitions. The
responses only differ by the URI, which are different versions of the
same file:
"result": [
{
...
"uri": "file:///home/emaisin/src/ls-interact/cpp-test/build/../src/first.h"
},
{
...
"uri": "file:///home/emaisin/src/ls-interact/cpp-test/src/first.h"
}
]
In getAbsoluteFilePath, we try to obtain the realpath of the FileEntry
by calling tryGetRealPathName. However, this can fail and return an
empty string. It may be bug a bug in clang, but in any case we should
fall back to computing it ourselves if it happens.
I changed getAbsoluteFilePath so that if tryGetRealPathName succeeds, we
return right away (a real path is always absolute). Otherwise, we try
to build an absolute path, as we did before, but we also call
VFS->getRealPath to make sure to get the canonical path (e.g. without
any ".." in it).
Reviewers: malaperle
Subscribers: hokein, ilya-biryukov, ioeric, MaskRay, jkorous, cfe-commits
Differential Revision: https://reviews.llvm.org/D48687
llvm-svn: 339483
2018-08-11 06:27:53 +08:00
|
|
|
|
|
|
|
// Go to a definition in header_not_in_preamble.h.
|
[clangd] Implement textDocument/declaration from LSP 3.14
Summary:
LSP now reflects the declaration/definition distinction.
Language server changes:
- textDocument/definition now returns a definition if one is found, otherwise
the declaration. It no longer returns declaration + definition if they are
distinct.
- textDocument/declaration returns the best declaration we can find.
- For macros, the active macro definition is returned for both methods.
- For include directive, the top of the target file is returned for both.
There doesn't appear to be a discovery mechanism (we can't return everything to
clients that only know about definition), so this changes existing behavior.
In practice, it should greatly reduce the fraction of the time we need to show
the user a menu of options.
C++ API changes:
- findDefinitions is replaced by locateSymbolAt, which returns a
vector<LocatedSymbol> - one for each symbol under the cursor.
- this contains the preferred declaration, the definition (if found), and
the symbol name
This API enables some potentially-neat extensions, like swapping between decl
and def, and exposing the symbol name to the UI in the case of multiple symbols.
Reviewers: hokein
Subscribers: ilya-biryukov, javed.absar, ioeric, MaskRay, jkorous, arphaman, kadircet, cfe-commits
Differential Revision: https://reviews.llvm.org/D57388
llvm-svn: 352864
2019-02-01 19:26:13 +08:00
|
|
|
Locations = runLocateSymbolAt(Server, FooCpp, SourceAnnotations.point("p3"));
|
[clangd] Avoid duplicates in findDefinitions response
Summary:
When compile_commands.json contains some source files expressed as
relative paths, we can get duplicate responses to findDefinitions. The
responses only differ by the URI, which are different versions of the
same file:
"result": [
{
...
"uri": "file:///home/emaisin/src/ls-interact/cpp-test/build/../src/first.h"
},
{
...
"uri": "file:///home/emaisin/src/ls-interact/cpp-test/src/first.h"
}
]
In getAbsoluteFilePath, we try to obtain the realpath of the FileEntry
by calling tryGetRealPathName. However, this can fail and return an
empty string. It may be bug a bug in clang, but in any case we should
fall back to computing it ourselves if it happens.
I changed getAbsoluteFilePath so that if tryGetRealPathName succeeds, we
return right away (a real path is always absolute). Otherwise, we try
to build an absolute path, as we did before, but we also call
VFS->getRealPath to make sure to get the canonical path (e.g. without
any ".." in it).
Reviewers: malaperle
Subscribers: hokein, ilya-biryukov, ioeric, MaskRay, jkorous, cfe-commits
Differential Revision: https://reviews.llvm.org/D48687
llvm-svn: 339483
2018-08-11 06:27:53 +08:00
|
|
|
EXPECT_TRUE(bool(Locations)) << "findDefinitions returned an error";
|
|
|
|
EXPECT_THAT(*Locations,
|
[clangd] Implement textDocument/declaration from LSP 3.14
Summary:
LSP now reflects the declaration/definition distinction.
Language server changes:
- textDocument/definition now returns a definition if one is found, otherwise
the declaration. It no longer returns declaration + definition if they are
distinct.
- textDocument/declaration returns the best declaration we can find.
- For macros, the active macro definition is returned for both methods.
- For include directive, the top of the target file is returned for both.
There doesn't appear to be a discovery mechanism (we can't return everything to
clients that only know about definition), so this changes existing behavior.
In practice, it should greatly reduce the fraction of the time we need to show
the user a menu of options.
C++ API changes:
- findDefinitions is replaced by locateSymbolAt, which returns a
vector<LocatedSymbol> - one for each symbol under the cursor.
- this contains the preferred declaration, the definition (if found), and
the symbol name
This API enables some potentially-neat extensions, like swapping between decl
and def, and exposing the symbol name to the UI in the case of multiple symbols.
Reviewers: hokein
Subscribers: ilya-biryukov, javed.absar, ioeric, MaskRay, jkorous, arphaman, kadircet, cfe-commits
Differential Revision: https://reviews.llvm.org/D57388
llvm-svn: 352864
2019-02-01 19:26:13 +08:00
|
|
|
ElementsAre(Sym("bar_not_preamble",
|
|
|
|
HeaderNotInPreambleAnnotations.range())));
|
2018-02-14 01:47:16 +08:00
|
|
|
}
|
|
|
|
|
2019-05-28 18:29:58 +08:00
|
|
|
TEST(Hover, Structured) {
|
|
|
|
struct {
|
|
|
|
const char *const Code;
|
|
|
|
const std::function<void(HoverInfo &)> ExpectedBuilder;
|
|
|
|
} Cases[] = {
|
|
|
|
// Global scope.
|
|
|
|
{R"cpp(
|
|
|
|
// Best foo ever.
|
|
|
|
void [[fo^o]]() {}
|
|
|
|
)cpp",
|
|
|
|
[](HoverInfo &HI) {
|
|
|
|
HI.NamespaceScope = "";
|
|
|
|
HI.Name = "foo";
|
|
|
|
HI.Kind = SymbolKind::Function;
|
|
|
|
HI.Documentation = "Best foo ever.";
|
|
|
|
HI.Definition = "void foo()";
|
|
|
|
HI.ReturnType = "void";
|
2019-06-13 16:51:44 +08:00
|
|
|
HI.Type = "void ()";
|
2019-05-28 18:29:58 +08:00
|
|
|
HI.Parameters.emplace();
|
|
|
|
}},
|
|
|
|
// Inside namespace
|
|
|
|
{R"cpp(
|
|
|
|
namespace ns1 { namespace ns2 {
|
|
|
|
/// Best foo ever.
|
|
|
|
void [[fo^o]]() {}
|
|
|
|
}}
|
|
|
|
)cpp",
|
|
|
|
[](HoverInfo &HI) {
|
|
|
|
HI.NamespaceScope = "ns1::ns2::";
|
|
|
|
HI.Name = "foo";
|
|
|
|
HI.Kind = SymbolKind::Function;
|
|
|
|
HI.Documentation = "Best foo ever.";
|
|
|
|
HI.Definition = "void foo()";
|
|
|
|
HI.ReturnType = "void";
|
2019-06-13 16:51:44 +08:00
|
|
|
HI.Type = "void ()";
|
2019-05-28 18:29:58 +08:00
|
|
|
HI.Parameters.emplace();
|
|
|
|
}},
|
|
|
|
// Field
|
|
|
|
{R"cpp(
|
|
|
|
namespace ns1 { namespace ns2 {
|
|
|
|
struct Foo {
|
|
|
|
int [[b^ar]];
|
|
|
|
};
|
|
|
|
}}
|
|
|
|
)cpp",
|
|
|
|
[](HoverInfo &HI) {
|
|
|
|
HI.NamespaceScope = "ns1::ns2::";
|
|
|
|
HI.LocalScope = "Foo::";
|
|
|
|
HI.Name = "bar";
|
|
|
|
HI.Kind = SymbolKind::Field;
|
|
|
|
HI.Definition = "int bar";
|
|
|
|
HI.Type = "int";
|
|
|
|
}},
|
|
|
|
// Local to class method.
|
|
|
|
{R"cpp(
|
|
|
|
namespace ns1 { namespace ns2 {
|
|
|
|
struct Foo {
|
|
|
|
void foo() {
|
|
|
|
int [[b^ar]];
|
|
|
|
}
|
|
|
|
};
|
|
|
|
}}
|
|
|
|
)cpp",
|
|
|
|
[](HoverInfo &HI) {
|
|
|
|
HI.NamespaceScope = "ns1::ns2::";
|
|
|
|
HI.LocalScope = "Foo::foo::";
|
|
|
|
HI.Name = "bar";
|
|
|
|
HI.Kind = SymbolKind::Variable;
|
|
|
|
HI.Definition = "int bar";
|
|
|
|
HI.Type = "int";
|
|
|
|
}},
|
|
|
|
// Anon namespace and local scope.
|
|
|
|
{R"cpp(
|
|
|
|
namespace ns1 { namespace {
|
|
|
|
struct {
|
|
|
|
int [[b^ar]];
|
|
|
|
} T;
|
|
|
|
}}
|
|
|
|
)cpp",
|
|
|
|
[](HoverInfo &HI) {
|
|
|
|
HI.NamespaceScope = "ns1::(anonymous)::";
|
|
|
|
HI.LocalScope = "(anonymous struct)::";
|
|
|
|
HI.Name = "bar";
|
|
|
|
HI.Kind = SymbolKind::Field;
|
|
|
|
HI.Definition = "int bar";
|
|
|
|
HI.Type = "int";
|
|
|
|
}},
|
|
|
|
// Variable with template type
|
|
|
|
{R"cpp(
|
2019-06-26 16:00:24 +08:00
|
|
|
template <typename T, class... Ts> class Foo { public: Foo(int); };
|
|
|
|
Foo<int, char, bool> [[fo^o]] = Foo<int, char, bool>(5);
|
2019-05-28 18:29:58 +08:00
|
|
|
)cpp",
|
|
|
|
[](HoverInfo &HI) {
|
|
|
|
HI.NamespaceScope = "";
|
|
|
|
HI.Name = "foo";
|
|
|
|
HI.Kind = SymbolKind::Variable;
|
2019-06-26 16:00:24 +08:00
|
|
|
HI.Definition = "Foo<int, char, bool> foo = Foo<int, char, bool>(5)";
|
2019-05-28 18:29:58 +08:00
|
|
|
HI.Type = "Foo<int, char, bool>";
|
|
|
|
}},
|
|
|
|
// Implicit template instantiation
|
|
|
|
{R"cpp(
|
|
|
|
template <typename T> class vector{};
|
|
|
|
[[vec^tor]]<int> foo;
|
|
|
|
)cpp",
|
|
|
|
[](HoverInfo &HI) {
|
|
|
|
HI.NamespaceScope = "";
|
|
|
|
HI.Name = "vector";
|
|
|
|
HI.Kind = SymbolKind::Class;
|
|
|
|
HI.Definition = "template <typename T> class vector {}";
|
|
|
|
HI.TemplateParameters = {
|
|
|
|
{std::string("typename"), std::string("T"), llvm::None},
|
|
|
|
};
|
|
|
|
}},
|
|
|
|
// Class template
|
|
|
|
{R"cpp(
|
|
|
|
template <template<typename, bool...> class C,
|
|
|
|
typename = char,
|
|
|
|
int = 0,
|
|
|
|
bool Q = false,
|
|
|
|
class... Ts> class Foo {};
|
|
|
|
template <template<typename, bool...> class T>
|
|
|
|
[[F^oo]]<T> foo;
|
|
|
|
)cpp",
|
|
|
|
[](HoverInfo &HI) {
|
|
|
|
HI.NamespaceScope = "";
|
|
|
|
HI.Name = "Foo";
|
|
|
|
HI.Kind = SymbolKind::Class;
|
|
|
|
HI.Definition =
|
|
|
|
R"cpp(template <template <typename, bool...> class C, typename = char, int = 0,
|
|
|
|
bool Q = false, class... Ts>
|
|
|
|
class Foo {})cpp";
|
|
|
|
HI.TemplateParameters = {
|
|
|
|
{std::string("template <typename, bool...> class"),
|
|
|
|
std::string("C"), llvm::None},
|
|
|
|
{std::string("typename"), llvm::None, std::string("char")},
|
|
|
|
{std::string("int"), llvm::None, std::string("0")},
|
|
|
|
{std::string("bool"), std::string("Q"), std::string("false")},
|
|
|
|
{std::string("class..."), std::string("Ts"), llvm::None},
|
|
|
|
};
|
|
|
|
}},
|
|
|
|
// Function template
|
|
|
|
{R"cpp(
|
|
|
|
template <template<typename, bool...> class C,
|
|
|
|
typename = char,
|
|
|
|
int = 0,
|
|
|
|
bool Q = false,
|
|
|
|
class... Ts> void foo();
|
|
|
|
template<typename, bool...> class Foo;
|
|
|
|
|
|
|
|
void bar() {
|
|
|
|
[[fo^o]]<Foo>();
|
|
|
|
}
|
|
|
|
)cpp",
|
|
|
|
[](HoverInfo &HI) {
|
|
|
|
HI.NamespaceScope = "";
|
|
|
|
HI.Name = "foo";
|
|
|
|
HI.Kind = SymbolKind::Function;
|
|
|
|
HI.Definition =
|
|
|
|
R"cpp(template <template <typename, bool...> class C, typename = char, int = 0,
|
|
|
|
bool Q = false, class... Ts>
|
|
|
|
void foo())cpp";
|
|
|
|
HI.ReturnType = "void";
|
2019-06-13 16:51:44 +08:00
|
|
|
HI.Type = "void ()";
|
2019-05-28 18:29:58 +08:00
|
|
|
HI.Parameters.emplace();
|
|
|
|
HI.TemplateParameters = {
|
|
|
|
{std::string("template <typename, bool...> class"),
|
|
|
|
std::string("C"), llvm::None},
|
|
|
|
{std::string("typename"), llvm::None, std::string("char")},
|
|
|
|
{std::string("int"), llvm::None, std::string("0")},
|
|
|
|
{std::string("bool"), std::string("Q"), std::string("false")},
|
|
|
|
{std::string("class..."), std::string("Ts"), llvm::None},
|
|
|
|
};
|
|
|
|
}},
|
|
|
|
// Function decl
|
|
|
|
{R"cpp(
|
|
|
|
template<typename, bool...> class Foo {};
|
|
|
|
Foo<bool, true, false> foo(int, bool T = false);
|
|
|
|
|
|
|
|
void bar() {
|
|
|
|
[[fo^o]](3);
|
|
|
|
}
|
|
|
|
)cpp",
|
|
|
|
[](HoverInfo &HI) {
|
|
|
|
HI.NamespaceScope = "";
|
|
|
|
HI.Name = "foo";
|
|
|
|
HI.Kind = SymbolKind::Function;
|
|
|
|
HI.Definition = "Foo<bool, true, false> foo(int, bool T = false)";
|
|
|
|
HI.ReturnType = "Foo<bool, true, false>";
|
2019-06-13 16:51:44 +08:00
|
|
|
HI.Type = "Foo<bool, true, false> (int, bool)";
|
2019-05-28 18:29:58 +08:00
|
|
|
HI.Parameters = {
|
|
|
|
{std::string("int"), llvm::None, llvm::None},
|
|
|
|
{std::string("bool"), std::string("T"), std::string("false")},
|
|
|
|
};
|
|
|
|
}},
|
2019-06-13 16:51:44 +08:00
|
|
|
// Pointers to lambdas
|
|
|
|
{R"cpp(
|
|
|
|
void foo() {
|
|
|
|
auto lamb = [](int T, bool B) -> bool { return T && B; };
|
|
|
|
auto *b = &lamb;
|
|
|
|
auto *[[^c]] = &b;
|
|
|
|
}
|
|
|
|
)cpp",
|
|
|
|
[](HoverInfo &HI) {
|
|
|
|
HI.NamespaceScope = "";
|
|
|
|
HI.LocalScope = "foo::";
|
|
|
|
HI.Name = "c";
|
|
|
|
HI.Kind = SymbolKind::Variable;
|
|
|
|
HI.Definition = "auto *c = &b";
|
|
|
|
HI.Type = "class (lambda) **";
|
|
|
|
HI.ReturnType = "bool";
|
|
|
|
HI.Parameters = {
|
|
|
|
{std::string("int"), std::string("T"), llvm::None},
|
|
|
|
{std::string("bool"), std::string("B"), llvm::None},
|
|
|
|
};
|
|
|
|
return HI;
|
|
|
|
}},
|
|
|
|
// Lambda parameter with decltype reference
|
|
|
|
{R"cpp(
|
|
|
|
auto lamb = [](int T, bool B) -> bool { return T && B; };
|
|
|
|
void foo(decltype(lamb)& bar) {
|
|
|
|
[[ba^r]](0, false);
|
|
|
|
}
|
|
|
|
)cpp",
|
|
|
|
[](HoverInfo &HI) {
|
|
|
|
HI.NamespaceScope = "";
|
|
|
|
HI.LocalScope = "foo::";
|
|
|
|
HI.Name = "bar";
|
|
|
|
HI.Kind = SymbolKind::Variable;
|
|
|
|
HI.Definition = "decltype(lamb) &bar";
|
|
|
|
HI.Type = "decltype(lamb) &";
|
|
|
|
HI.ReturnType = "bool";
|
|
|
|
HI.Parameters = {
|
|
|
|
{std::string("int"), std::string("T"), llvm::None},
|
|
|
|
{std::string("bool"), std::string("B"), llvm::None},
|
|
|
|
};
|
|
|
|
return HI;
|
|
|
|
}},
|
|
|
|
// Lambda parameter with decltype
|
|
|
|
{R"cpp(
|
|
|
|
auto lamb = [](int T, bool B) -> bool { return T && B; };
|
|
|
|
void foo(decltype(lamb) bar) {
|
|
|
|
[[ba^r]](0, false);
|
|
|
|
}
|
|
|
|
)cpp",
|
|
|
|
[](HoverInfo &HI) {
|
|
|
|
HI.NamespaceScope = "";
|
|
|
|
HI.LocalScope = "foo::";
|
|
|
|
HI.Name = "bar";
|
|
|
|
HI.Kind = SymbolKind::Variable;
|
|
|
|
HI.Definition = "decltype(lamb) bar";
|
|
|
|
HI.Type = "class (lambda)";
|
|
|
|
HI.ReturnType = "bool";
|
|
|
|
HI.Parameters = {
|
|
|
|
{std::string("int"), std::string("T"), llvm::None},
|
|
|
|
{std::string("bool"), std::string("B"), llvm::None},
|
|
|
|
};
|
|
|
|
return HI;
|
|
|
|
}},
|
2019-05-28 18:29:58 +08:00
|
|
|
// Lambda variable
|
|
|
|
{R"cpp(
|
|
|
|
void foo() {
|
|
|
|
int bar = 5;
|
|
|
|
auto lamb = [&bar](int T, bool B) -> bool { return T && B && bar; };
|
|
|
|
bool res = [[lam^b]](bar, false);
|
|
|
|
}
|
|
|
|
)cpp",
|
|
|
|
[](HoverInfo &HI) {
|
|
|
|
HI.NamespaceScope = "";
|
|
|
|
HI.LocalScope = "foo::";
|
|
|
|
HI.Name = "lamb";
|
|
|
|
HI.Kind = SymbolKind::Variable;
|
|
|
|
HI.Definition = "auto lamb = [&bar](int T, bool B) -> bool {}";
|
2019-06-13 16:51:44 +08:00
|
|
|
HI.Type = "class (lambda)";
|
|
|
|
HI.ReturnType = "bool";
|
|
|
|
HI.Parameters = {
|
|
|
|
{std::string("int"), std::string("T"), llvm::None},
|
|
|
|
{std::string("bool"), std::string("B"), llvm::None},
|
|
|
|
};
|
2019-05-28 18:29:58 +08:00
|
|
|
return HI;
|
|
|
|
}},
|
|
|
|
// Local variable in lambda
|
|
|
|
{R"cpp(
|
|
|
|
void foo() {
|
|
|
|
auto lamb = []{int [[te^st]];};
|
|
|
|
}
|
|
|
|
)cpp",
|
|
|
|
[](HoverInfo &HI) {
|
|
|
|
HI.NamespaceScope = "";
|
|
|
|
HI.LocalScope = "foo::(anonymous class)::operator()::";
|
|
|
|
HI.Name = "test";
|
|
|
|
HI.Kind = SymbolKind::Variable;
|
|
|
|
HI.Definition = "int test";
|
|
|
|
HI.Type = "int";
|
|
|
|
}},
|
|
|
|
|
|
|
|
// auto on lambda
|
|
|
|
{R"cpp(
|
|
|
|
void foo() {
|
|
|
|
[[au^to]] lamb = []{};
|
|
|
|
}
|
|
|
|
)cpp",
|
|
|
|
[](HoverInfo &HI) {
|
|
|
|
HI.Name = "class (lambda)";
|
|
|
|
HI.Kind = SymbolKind::Variable;
|
|
|
|
}},
|
|
|
|
// auto on template instantiation
|
|
|
|
{R"cpp(
|
|
|
|
template<typename T> class Foo{};
|
|
|
|
void foo() {
|
|
|
|
[[au^to]] x = Foo<int>();
|
|
|
|
}
|
|
|
|
)cpp",
|
|
|
|
[](HoverInfo &HI) {
|
|
|
|
HI.Name = "class Foo<int>";
|
|
|
|
HI.Kind = SymbolKind::Variable;
|
|
|
|
}},
|
|
|
|
// auto on specialized template
|
|
|
|
{R"cpp(
|
|
|
|
template<typename T> class Foo{};
|
|
|
|
template<> class Foo<int>{};
|
|
|
|
void foo() {
|
|
|
|
[[au^to]] x = Foo<int>();
|
|
|
|
}
|
|
|
|
)cpp",
|
|
|
|
[](HoverInfo &HI) {
|
|
|
|
HI.Name = "class Foo<int>";
|
|
|
|
HI.Kind = SymbolKind::Variable;
|
|
|
|
}},
|
|
|
|
|
|
|
|
// macro
|
|
|
|
{R"cpp(
|
|
|
|
// Best MACRO ever.
|
|
|
|
#define MACRO(x,y,z) void foo(x, y, z);
|
|
|
|
[[MAC^RO]](int, double d, bool z = false);
|
|
|
|
)cpp",
|
|
|
|
[](HoverInfo &HI) {
|
|
|
|
HI.Name = "MACRO", HI.Kind = SymbolKind::String,
|
|
|
|
HI.Definition = "#define MACRO(x, y, z) void foo(x, y, z);";
|
|
|
|
}},
|
2019-06-26 16:00:24 +08:00
|
|
|
|
|
|
|
// constexprs
|
|
|
|
{R"cpp(
|
|
|
|
constexpr int add(int a, int b) { return a + b; }
|
|
|
|
int [[b^ar]] = add(1, 2);
|
|
|
|
)cpp",
|
|
|
|
[](HoverInfo &HI) {
|
|
|
|
HI.Name = "bar";
|
|
|
|
HI.Definition = "int bar = add(1, 2)";
|
|
|
|
HI.Kind = SymbolKind::Variable;
|
|
|
|
HI.Type = "int";
|
|
|
|
HI.NamespaceScope = "";
|
|
|
|
HI.Value = "3";
|
|
|
|
}},
|
|
|
|
{R"cpp(
|
|
|
|
int [[b^ar]] = sizeof(char);
|
|
|
|
)cpp",
|
|
|
|
[](HoverInfo &HI) {
|
|
|
|
HI.Name = "bar";
|
|
|
|
HI.Definition = "int bar = sizeof(char)";
|
|
|
|
HI.Kind = SymbolKind::Variable;
|
|
|
|
HI.Type = "int";
|
|
|
|
HI.NamespaceScope = "";
|
|
|
|
HI.Value = "1";
|
|
|
|
}},
|
|
|
|
{R"cpp(
|
|
|
|
template<int a, int b> struct Add {
|
|
|
|
static constexpr int result = a + b;
|
|
|
|
};
|
|
|
|
int [[ba^r]] = Add<1, 2>::result;
|
|
|
|
)cpp",
|
|
|
|
[](HoverInfo &HI) {
|
|
|
|
HI.Name = "bar";
|
|
|
|
HI.Definition = "int bar = Add<1, 2>::result";
|
|
|
|
HI.Kind = SymbolKind::Variable;
|
|
|
|
HI.Type = "int";
|
|
|
|
HI.NamespaceScope = "";
|
|
|
|
HI.Value = "3";
|
|
|
|
}},
|
|
|
|
// FIXME: We should use the Decl referenced, even if it comes from an
|
|
|
|
// implicit instantiation.
|
|
|
|
{R"cpp(
|
|
|
|
template<int a, int b> struct Add {
|
|
|
|
static constexpr int result = a + b;
|
|
|
|
};
|
|
|
|
int bar = Add<1, 2>::[[resu^lt]];
|
|
|
|
)cpp",
|
|
|
|
[](HoverInfo &HI) {
|
|
|
|
HI.Name = "result";
|
|
|
|
HI.Definition = "static constexpr int result = a + b";
|
|
|
|
HI.Kind = SymbolKind::Property;
|
|
|
|
HI.Type = "const int";
|
|
|
|
HI.NamespaceScope = "";
|
|
|
|
HI.LocalScope = "Add::";
|
|
|
|
}},
|
|
|
|
{R"cpp(
|
|
|
|
const char *[[ba^r]] = "1234";
|
|
|
|
)cpp",
|
|
|
|
[](HoverInfo &HI) {
|
|
|
|
HI.Name = "bar";
|
|
|
|
HI.Definition = "const char *bar = \"1234\"";
|
|
|
|
HI.Kind = SymbolKind::Variable;
|
|
|
|
HI.Type = "const char *";
|
|
|
|
HI.NamespaceScope = "";
|
|
|
|
HI.Value = "&\"1234\"[0]";
|
|
|
|
}},
|
2019-05-28 18:29:58 +08:00
|
|
|
};
|
|
|
|
for (const auto &Case : Cases) {
|
|
|
|
SCOPED_TRACE(Case.Code);
|
|
|
|
|
|
|
|
Annotations T(Case.Code);
|
|
|
|
TestTU TU = TestTU::withCode(T.code());
|
|
|
|
TU.ExtraArgs.push_back("-std=c++17");
|
|
|
|
auto AST = TU.build();
|
|
|
|
ASSERT_TRUE(AST.getDiagnostics().empty());
|
|
|
|
|
2019-07-10 01:59:50 +08:00
|
|
|
auto H = getHover(AST, T.point(), format::getLLVMStyle(), nullptr);
|
2019-05-28 18:29:58 +08:00
|
|
|
ASSERT_TRUE(H);
|
|
|
|
HoverInfo Expected;
|
|
|
|
Expected.SymRange = T.range();
|
|
|
|
Case.ExpectedBuilder(Expected);
|
|
|
|
|
|
|
|
EXPECT_EQ(H->NamespaceScope, Expected.NamespaceScope);
|
|
|
|
EXPECT_EQ(H->LocalScope, Expected.LocalScope);
|
|
|
|
EXPECT_EQ(H->Name, Expected.Name);
|
|
|
|
EXPECT_EQ(H->Kind, Expected.Kind);
|
|
|
|
EXPECT_EQ(H->Documentation, Expected.Documentation);
|
|
|
|
EXPECT_EQ(H->Definition, Expected.Definition);
|
|
|
|
EXPECT_EQ(H->Type, Expected.Type);
|
|
|
|
EXPECT_EQ(H->ReturnType, Expected.ReturnType);
|
|
|
|
EXPECT_EQ(H->Parameters, Expected.Parameters);
|
|
|
|
EXPECT_EQ(H->TemplateParameters, Expected.TemplateParameters);
|
|
|
|
EXPECT_EQ(H->SymRange, Expected.SymRange);
|
2019-06-26 16:00:24 +08:00
|
|
|
EXPECT_EQ(H->Value, Expected.Value);
|
2019-05-28 18:29:58 +08:00
|
|
|
}
|
|
|
|
} // namespace clang
|
|
|
|
|
[clangd] Implement textDocument/hover
Summary: Implemention of textDocument/hover as described in LSP definition.
This patch adds a basic Hover implementation. When hovering a variable,
function, method or namespace, clangd will return a text containing the
declaration's scope, as well as the declaration of the hovered entity.
For example, for a variable:
Declared in class Foo::Bar
int hello = 2
For macros, the macro definition is returned.
This patch doesn't include:
- markdown support (the client I use doesn't support it yet)
- range support (optional in the Hover response)
- comments associated to variables/functions/classes
They are kept as future work to keep this patch simpler.
I added tests in XRefsTests.cpp. hover.test contains one simple
smoketest to make sure the feature works from a black box perspective.
Reviewers: malaperle, krasimir, bkramer, ilya-biryukov
Subscribers: sammccall, mgrang, klimek, rwols, ilya-biryukov, arphaman, cfe-commits
Differential Revision: https://reviews.llvm.org/D35894
Signed-off-by: Simon Marchi <simon.marchi@ericsson.com>
Signed-off-by: William Enright <william.enright@polymtl.ca>
llvm-svn: 325395
2018-02-17 05:38:15 +08:00
|
|
|
TEST(Hover, All) {
|
|
|
|
struct OneTest {
|
|
|
|
StringRef Input;
|
|
|
|
StringRef ExpectedHover;
|
|
|
|
};
|
|
|
|
|
|
|
|
OneTest Tests[] = {
|
2018-07-03 00:28:34 +08:00
|
|
|
{
|
|
|
|
R"cpp(// No hover
|
|
|
|
^int main() {
|
|
|
|
}
|
|
|
|
)cpp",
|
|
|
|
"",
|
|
|
|
},
|
[clangd] Implement textDocument/hover
Summary: Implemention of textDocument/hover as described in LSP definition.
This patch adds a basic Hover implementation. When hovering a variable,
function, method or namespace, clangd will return a text containing the
declaration's scope, as well as the declaration of the hovered entity.
For example, for a variable:
Declared in class Foo::Bar
int hello = 2
For macros, the macro definition is returned.
This patch doesn't include:
- markdown support (the client I use doesn't support it yet)
- range support (optional in the Hover response)
- comments associated to variables/functions/classes
They are kept as future work to keep this patch simpler.
I added tests in XRefsTests.cpp. hover.test contains one simple
smoketest to make sure the feature works from a black box perspective.
Reviewers: malaperle, krasimir, bkramer, ilya-biryukov
Subscribers: sammccall, mgrang, klimek, rwols, ilya-biryukov, arphaman, cfe-commits
Differential Revision: https://reviews.llvm.org/D35894
Signed-off-by: Simon Marchi <simon.marchi@ericsson.com>
Signed-off-by: William Enright <william.enright@polymtl.ca>
llvm-svn: 325395
2018-02-17 05:38:15 +08:00
|
|
|
{
|
|
|
|
R"cpp(// Local variable
|
|
|
|
int main() {
|
|
|
|
int bonjour;
|
|
|
|
^bonjour = 2;
|
|
|
|
int test1 = bonjour;
|
|
|
|
}
|
|
|
|
)cpp",
|
2019-05-29 18:01:00 +08:00
|
|
|
"text[Declared in]code[main]\n"
|
|
|
|
"codeblock(cpp) [\n"
|
|
|
|
"int bonjour\n"
|
|
|
|
"]",
|
[clangd] Implement textDocument/hover
Summary: Implemention of textDocument/hover as described in LSP definition.
This patch adds a basic Hover implementation. When hovering a variable,
function, method or namespace, clangd will return a text containing the
declaration's scope, as well as the declaration of the hovered entity.
For example, for a variable:
Declared in class Foo::Bar
int hello = 2
For macros, the macro definition is returned.
This patch doesn't include:
- markdown support (the client I use doesn't support it yet)
- range support (optional in the Hover response)
- comments associated to variables/functions/classes
They are kept as future work to keep this patch simpler.
I added tests in XRefsTests.cpp. hover.test contains one simple
smoketest to make sure the feature works from a black box perspective.
Reviewers: malaperle, krasimir, bkramer, ilya-biryukov
Subscribers: sammccall, mgrang, klimek, rwols, ilya-biryukov, arphaman, cfe-commits
Differential Revision: https://reviews.llvm.org/D35894
Signed-off-by: Simon Marchi <simon.marchi@ericsson.com>
Signed-off-by: William Enright <william.enright@polymtl.ca>
llvm-svn: 325395
2018-02-17 05:38:15 +08:00
|
|
|
},
|
|
|
|
{
|
|
|
|
R"cpp(// Local variable in method
|
|
|
|
struct s {
|
|
|
|
void method() {
|
|
|
|
int bonjour;
|
|
|
|
^bonjour = 2;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
)cpp",
|
2019-05-29 18:01:00 +08:00
|
|
|
"text[Declared in]code[s::method]\n"
|
|
|
|
"codeblock(cpp) [\n"
|
|
|
|
"int bonjour\n"
|
|
|
|
"]",
|
[clangd] Implement textDocument/hover
Summary: Implemention of textDocument/hover as described in LSP definition.
This patch adds a basic Hover implementation. When hovering a variable,
function, method or namespace, clangd will return a text containing the
declaration's scope, as well as the declaration of the hovered entity.
For example, for a variable:
Declared in class Foo::Bar
int hello = 2
For macros, the macro definition is returned.
This patch doesn't include:
- markdown support (the client I use doesn't support it yet)
- range support (optional in the Hover response)
- comments associated to variables/functions/classes
They are kept as future work to keep this patch simpler.
I added tests in XRefsTests.cpp. hover.test contains one simple
smoketest to make sure the feature works from a black box perspective.
Reviewers: malaperle, krasimir, bkramer, ilya-biryukov
Subscribers: sammccall, mgrang, klimek, rwols, ilya-biryukov, arphaman, cfe-commits
Differential Revision: https://reviews.llvm.org/D35894
Signed-off-by: Simon Marchi <simon.marchi@ericsson.com>
Signed-off-by: William Enright <william.enright@polymtl.ca>
llvm-svn: 325395
2018-02-17 05:38:15 +08:00
|
|
|
},
|
|
|
|
{
|
|
|
|
R"cpp(// Struct
|
|
|
|
namespace ns1 {
|
|
|
|
struct MyClass {};
|
|
|
|
} // namespace ns1
|
|
|
|
int main() {
|
|
|
|
ns1::My^Class* Params;
|
|
|
|
}
|
|
|
|
)cpp",
|
2019-05-29 18:01:00 +08:00
|
|
|
"text[Declared in]code[ns1]\n"
|
|
|
|
"codeblock(cpp) [\n"
|
|
|
|
"struct MyClass {}\n"
|
|
|
|
"]",
|
[clangd] Implement textDocument/hover
Summary: Implemention of textDocument/hover as described in LSP definition.
This patch adds a basic Hover implementation. When hovering a variable,
function, method or namespace, clangd will return a text containing the
declaration's scope, as well as the declaration of the hovered entity.
For example, for a variable:
Declared in class Foo::Bar
int hello = 2
For macros, the macro definition is returned.
This patch doesn't include:
- markdown support (the client I use doesn't support it yet)
- range support (optional in the Hover response)
- comments associated to variables/functions/classes
They are kept as future work to keep this patch simpler.
I added tests in XRefsTests.cpp. hover.test contains one simple
smoketest to make sure the feature works from a black box perspective.
Reviewers: malaperle, krasimir, bkramer, ilya-biryukov
Subscribers: sammccall, mgrang, klimek, rwols, ilya-biryukov, arphaman, cfe-commits
Differential Revision: https://reviews.llvm.org/D35894
Signed-off-by: Simon Marchi <simon.marchi@ericsson.com>
Signed-off-by: William Enright <william.enright@polymtl.ca>
llvm-svn: 325395
2018-02-17 05:38:15 +08:00
|
|
|
},
|
|
|
|
{
|
|
|
|
R"cpp(// Class
|
|
|
|
namespace ns1 {
|
|
|
|
class MyClass {};
|
|
|
|
} // namespace ns1
|
|
|
|
int main() {
|
|
|
|
ns1::My^Class* Params;
|
|
|
|
}
|
|
|
|
)cpp",
|
2019-05-29 18:01:00 +08:00
|
|
|
"text[Declared in]code[ns1]\n"
|
|
|
|
"codeblock(cpp) [\n"
|
|
|
|
"class MyClass {}\n"
|
|
|
|
"]",
|
[clangd] Implement textDocument/hover
Summary: Implemention of textDocument/hover as described in LSP definition.
This patch adds a basic Hover implementation. When hovering a variable,
function, method or namespace, clangd will return a text containing the
declaration's scope, as well as the declaration of the hovered entity.
For example, for a variable:
Declared in class Foo::Bar
int hello = 2
For macros, the macro definition is returned.
This patch doesn't include:
- markdown support (the client I use doesn't support it yet)
- range support (optional in the Hover response)
- comments associated to variables/functions/classes
They are kept as future work to keep this patch simpler.
I added tests in XRefsTests.cpp. hover.test contains one simple
smoketest to make sure the feature works from a black box perspective.
Reviewers: malaperle, krasimir, bkramer, ilya-biryukov
Subscribers: sammccall, mgrang, klimek, rwols, ilya-biryukov, arphaman, cfe-commits
Differential Revision: https://reviews.llvm.org/D35894
Signed-off-by: Simon Marchi <simon.marchi@ericsson.com>
Signed-off-by: William Enright <william.enright@polymtl.ca>
llvm-svn: 325395
2018-02-17 05:38:15 +08:00
|
|
|
},
|
|
|
|
{
|
|
|
|
R"cpp(// Union
|
|
|
|
namespace ns1 {
|
|
|
|
union MyUnion { int x; int y; };
|
|
|
|
} // namespace ns1
|
|
|
|
int main() {
|
|
|
|
ns1::My^Union Params;
|
|
|
|
}
|
|
|
|
)cpp",
|
2019-05-29 18:01:00 +08:00
|
|
|
"text[Declared in]code[ns1]\n"
|
|
|
|
"codeblock(cpp) [\n"
|
|
|
|
"union MyUnion {}\n"
|
|
|
|
"]",
|
[clangd] Implement textDocument/hover
Summary: Implemention of textDocument/hover as described in LSP definition.
This patch adds a basic Hover implementation. When hovering a variable,
function, method or namespace, clangd will return a text containing the
declaration's scope, as well as the declaration of the hovered entity.
For example, for a variable:
Declared in class Foo::Bar
int hello = 2
For macros, the macro definition is returned.
This patch doesn't include:
- markdown support (the client I use doesn't support it yet)
- range support (optional in the Hover response)
- comments associated to variables/functions/classes
They are kept as future work to keep this patch simpler.
I added tests in XRefsTests.cpp. hover.test contains one simple
smoketest to make sure the feature works from a black box perspective.
Reviewers: malaperle, krasimir, bkramer, ilya-biryukov
Subscribers: sammccall, mgrang, klimek, rwols, ilya-biryukov, arphaman, cfe-commits
Differential Revision: https://reviews.llvm.org/D35894
Signed-off-by: Simon Marchi <simon.marchi@ericsson.com>
Signed-off-by: William Enright <william.enright@polymtl.ca>
llvm-svn: 325395
2018-02-17 05:38:15 +08:00
|
|
|
},
|
|
|
|
{
|
|
|
|
R"cpp(// Function definition via pointer
|
|
|
|
int foo(int) {}
|
|
|
|
int main() {
|
|
|
|
auto *X = &^foo;
|
|
|
|
}
|
|
|
|
)cpp",
|
2019-05-29 18:01:00 +08:00
|
|
|
"text[Declared in]code[global namespace]\n"
|
|
|
|
"codeblock(cpp) [\n"
|
|
|
|
"int foo(int)\n"
|
2019-07-10 01:59:50 +08:00
|
|
|
"]\n"
|
|
|
|
"text[Function definition via pointer]",
|
[clangd] Implement textDocument/hover
Summary: Implemention of textDocument/hover as described in LSP definition.
This patch adds a basic Hover implementation. When hovering a variable,
function, method or namespace, clangd will return a text containing the
declaration's scope, as well as the declaration of the hovered entity.
For example, for a variable:
Declared in class Foo::Bar
int hello = 2
For macros, the macro definition is returned.
This patch doesn't include:
- markdown support (the client I use doesn't support it yet)
- range support (optional in the Hover response)
- comments associated to variables/functions/classes
They are kept as future work to keep this patch simpler.
I added tests in XRefsTests.cpp. hover.test contains one simple
smoketest to make sure the feature works from a black box perspective.
Reviewers: malaperle, krasimir, bkramer, ilya-biryukov
Subscribers: sammccall, mgrang, klimek, rwols, ilya-biryukov, arphaman, cfe-commits
Differential Revision: https://reviews.llvm.org/D35894
Signed-off-by: Simon Marchi <simon.marchi@ericsson.com>
Signed-off-by: William Enright <william.enright@polymtl.ca>
llvm-svn: 325395
2018-02-17 05:38:15 +08:00
|
|
|
},
|
|
|
|
{
|
|
|
|
R"cpp(// Function declaration via call
|
|
|
|
int foo(int);
|
|
|
|
int main() {
|
|
|
|
return ^foo(42);
|
|
|
|
}
|
|
|
|
)cpp",
|
2019-05-29 18:01:00 +08:00
|
|
|
"text[Declared in]code[global namespace]\n"
|
|
|
|
"codeblock(cpp) [\n"
|
|
|
|
"int foo(int)\n"
|
2019-07-10 01:59:50 +08:00
|
|
|
"]\n"
|
|
|
|
"text[Function declaration via call]",
|
[clangd] Implement textDocument/hover
Summary: Implemention of textDocument/hover as described in LSP definition.
This patch adds a basic Hover implementation. When hovering a variable,
function, method or namespace, clangd will return a text containing the
declaration's scope, as well as the declaration of the hovered entity.
For example, for a variable:
Declared in class Foo::Bar
int hello = 2
For macros, the macro definition is returned.
This patch doesn't include:
- markdown support (the client I use doesn't support it yet)
- range support (optional in the Hover response)
- comments associated to variables/functions/classes
They are kept as future work to keep this patch simpler.
I added tests in XRefsTests.cpp. hover.test contains one simple
smoketest to make sure the feature works from a black box perspective.
Reviewers: malaperle, krasimir, bkramer, ilya-biryukov
Subscribers: sammccall, mgrang, klimek, rwols, ilya-biryukov, arphaman, cfe-commits
Differential Revision: https://reviews.llvm.org/D35894
Signed-off-by: Simon Marchi <simon.marchi@ericsson.com>
Signed-off-by: William Enright <william.enright@polymtl.ca>
llvm-svn: 325395
2018-02-17 05:38:15 +08:00
|
|
|
},
|
|
|
|
{
|
|
|
|
R"cpp(// Field
|
|
|
|
struct Foo { int x; };
|
|
|
|
int main() {
|
|
|
|
Foo bar;
|
|
|
|
bar.^x;
|
|
|
|
}
|
|
|
|
)cpp",
|
2019-05-29 18:01:00 +08:00
|
|
|
"text[Declared in]code[Foo]\n"
|
|
|
|
"codeblock(cpp) [\n"
|
|
|
|
"int x\n"
|
|
|
|
"]",
|
[clangd] Implement textDocument/hover
Summary: Implemention of textDocument/hover as described in LSP definition.
This patch adds a basic Hover implementation. When hovering a variable,
function, method or namespace, clangd will return a text containing the
declaration's scope, as well as the declaration of the hovered entity.
For example, for a variable:
Declared in class Foo::Bar
int hello = 2
For macros, the macro definition is returned.
This patch doesn't include:
- markdown support (the client I use doesn't support it yet)
- range support (optional in the Hover response)
- comments associated to variables/functions/classes
They are kept as future work to keep this patch simpler.
I added tests in XRefsTests.cpp. hover.test contains one simple
smoketest to make sure the feature works from a black box perspective.
Reviewers: malaperle, krasimir, bkramer, ilya-biryukov
Subscribers: sammccall, mgrang, klimek, rwols, ilya-biryukov, arphaman, cfe-commits
Differential Revision: https://reviews.llvm.org/D35894
Signed-off-by: Simon Marchi <simon.marchi@ericsson.com>
Signed-off-by: William Enright <william.enright@polymtl.ca>
llvm-svn: 325395
2018-02-17 05:38:15 +08:00
|
|
|
},
|
|
|
|
{
|
|
|
|
R"cpp(// Field with initialization
|
|
|
|
struct Foo { int x = 5; };
|
|
|
|
int main() {
|
|
|
|
Foo bar;
|
|
|
|
bar.^x;
|
|
|
|
}
|
|
|
|
)cpp",
|
2019-05-29 18:01:00 +08:00
|
|
|
"text[Declared in]code[Foo]\n"
|
|
|
|
"codeblock(cpp) [\n"
|
|
|
|
"int x = 5\n"
|
|
|
|
"]",
|
[clangd] Implement textDocument/hover
Summary: Implemention of textDocument/hover as described in LSP definition.
This patch adds a basic Hover implementation. When hovering a variable,
function, method or namespace, clangd will return a text containing the
declaration's scope, as well as the declaration of the hovered entity.
For example, for a variable:
Declared in class Foo::Bar
int hello = 2
For macros, the macro definition is returned.
This patch doesn't include:
- markdown support (the client I use doesn't support it yet)
- range support (optional in the Hover response)
- comments associated to variables/functions/classes
They are kept as future work to keep this patch simpler.
I added tests in XRefsTests.cpp. hover.test contains one simple
smoketest to make sure the feature works from a black box perspective.
Reviewers: malaperle, krasimir, bkramer, ilya-biryukov
Subscribers: sammccall, mgrang, klimek, rwols, ilya-biryukov, arphaman, cfe-commits
Differential Revision: https://reviews.llvm.org/D35894
Signed-off-by: Simon Marchi <simon.marchi@ericsson.com>
Signed-off-by: William Enright <william.enright@polymtl.ca>
llvm-svn: 325395
2018-02-17 05:38:15 +08:00
|
|
|
},
|
|
|
|
{
|
|
|
|
R"cpp(// Static field
|
|
|
|
struct Foo { static int x; };
|
|
|
|
int main() {
|
|
|
|
Foo::^x;
|
|
|
|
}
|
|
|
|
)cpp",
|
2019-05-29 18:01:00 +08:00
|
|
|
"text[Declared in]code[Foo]\n"
|
|
|
|
"codeblock(cpp) [\n"
|
|
|
|
"static int x\n"
|
|
|
|
"]",
|
[clangd] Implement textDocument/hover
Summary: Implemention of textDocument/hover as described in LSP definition.
This patch adds a basic Hover implementation. When hovering a variable,
function, method or namespace, clangd will return a text containing the
declaration's scope, as well as the declaration of the hovered entity.
For example, for a variable:
Declared in class Foo::Bar
int hello = 2
For macros, the macro definition is returned.
This patch doesn't include:
- markdown support (the client I use doesn't support it yet)
- range support (optional in the Hover response)
- comments associated to variables/functions/classes
They are kept as future work to keep this patch simpler.
I added tests in XRefsTests.cpp. hover.test contains one simple
smoketest to make sure the feature works from a black box perspective.
Reviewers: malaperle, krasimir, bkramer, ilya-biryukov
Subscribers: sammccall, mgrang, klimek, rwols, ilya-biryukov, arphaman, cfe-commits
Differential Revision: https://reviews.llvm.org/D35894
Signed-off-by: Simon Marchi <simon.marchi@ericsson.com>
Signed-off-by: William Enright <william.enright@polymtl.ca>
llvm-svn: 325395
2018-02-17 05:38:15 +08:00
|
|
|
},
|
|
|
|
{
|
|
|
|
R"cpp(// Field, member initializer
|
|
|
|
struct Foo {
|
|
|
|
int x;
|
|
|
|
Foo() : ^x(0) {}
|
|
|
|
};
|
|
|
|
)cpp",
|
2019-05-29 18:01:00 +08:00
|
|
|
"text[Declared in]code[Foo]\n"
|
|
|
|
"codeblock(cpp) [\n"
|
|
|
|
"int x\n"
|
|
|
|
"]",
|
[clangd] Implement textDocument/hover
Summary: Implemention of textDocument/hover as described in LSP definition.
This patch adds a basic Hover implementation. When hovering a variable,
function, method or namespace, clangd will return a text containing the
declaration's scope, as well as the declaration of the hovered entity.
For example, for a variable:
Declared in class Foo::Bar
int hello = 2
For macros, the macro definition is returned.
This patch doesn't include:
- markdown support (the client I use doesn't support it yet)
- range support (optional in the Hover response)
- comments associated to variables/functions/classes
They are kept as future work to keep this patch simpler.
I added tests in XRefsTests.cpp. hover.test contains one simple
smoketest to make sure the feature works from a black box perspective.
Reviewers: malaperle, krasimir, bkramer, ilya-biryukov
Subscribers: sammccall, mgrang, klimek, rwols, ilya-biryukov, arphaman, cfe-commits
Differential Revision: https://reviews.llvm.org/D35894
Signed-off-by: Simon Marchi <simon.marchi@ericsson.com>
Signed-off-by: William Enright <william.enright@polymtl.ca>
llvm-svn: 325395
2018-02-17 05:38:15 +08:00
|
|
|
},
|
|
|
|
{
|
|
|
|
R"cpp(// Field, GNU old-style field designator
|
|
|
|
struct Foo { int x; };
|
|
|
|
int main() {
|
|
|
|
Foo bar = { ^x : 1 };
|
|
|
|
}
|
|
|
|
)cpp",
|
2019-05-29 18:01:00 +08:00
|
|
|
"text[Declared in]code[Foo]\n"
|
|
|
|
"codeblock(cpp) [\n"
|
|
|
|
"int x\n"
|
|
|
|
"]",
|
[clangd] Implement textDocument/hover
Summary: Implemention of textDocument/hover as described in LSP definition.
This patch adds a basic Hover implementation. When hovering a variable,
function, method or namespace, clangd will return a text containing the
declaration's scope, as well as the declaration of the hovered entity.
For example, for a variable:
Declared in class Foo::Bar
int hello = 2
For macros, the macro definition is returned.
This patch doesn't include:
- markdown support (the client I use doesn't support it yet)
- range support (optional in the Hover response)
- comments associated to variables/functions/classes
They are kept as future work to keep this patch simpler.
I added tests in XRefsTests.cpp. hover.test contains one simple
smoketest to make sure the feature works from a black box perspective.
Reviewers: malaperle, krasimir, bkramer, ilya-biryukov
Subscribers: sammccall, mgrang, klimek, rwols, ilya-biryukov, arphaman, cfe-commits
Differential Revision: https://reviews.llvm.org/D35894
Signed-off-by: Simon Marchi <simon.marchi@ericsson.com>
Signed-off-by: William Enright <william.enright@polymtl.ca>
llvm-svn: 325395
2018-02-17 05:38:15 +08:00
|
|
|
},
|
|
|
|
{
|
|
|
|
R"cpp(// Field, field designator
|
|
|
|
struct Foo { int x; };
|
|
|
|
int main() {
|
|
|
|
Foo bar = { .^x = 2 };
|
|
|
|
}
|
|
|
|
)cpp",
|
2019-05-29 18:01:00 +08:00
|
|
|
"text[Declared in]code[Foo]\n"
|
|
|
|
"codeblock(cpp) [\n"
|
|
|
|
"int x\n"
|
|
|
|
"]",
|
[clangd] Implement textDocument/hover
Summary: Implemention of textDocument/hover as described in LSP definition.
This patch adds a basic Hover implementation. When hovering a variable,
function, method or namespace, clangd will return a text containing the
declaration's scope, as well as the declaration of the hovered entity.
For example, for a variable:
Declared in class Foo::Bar
int hello = 2
For macros, the macro definition is returned.
This patch doesn't include:
- markdown support (the client I use doesn't support it yet)
- range support (optional in the Hover response)
- comments associated to variables/functions/classes
They are kept as future work to keep this patch simpler.
I added tests in XRefsTests.cpp. hover.test contains one simple
smoketest to make sure the feature works from a black box perspective.
Reviewers: malaperle, krasimir, bkramer, ilya-biryukov
Subscribers: sammccall, mgrang, klimek, rwols, ilya-biryukov, arphaman, cfe-commits
Differential Revision: https://reviews.llvm.org/D35894
Signed-off-by: Simon Marchi <simon.marchi@ericsson.com>
Signed-off-by: William Enright <william.enright@polymtl.ca>
llvm-svn: 325395
2018-02-17 05:38:15 +08:00
|
|
|
},
|
|
|
|
{
|
|
|
|
R"cpp(// Method call
|
|
|
|
struct Foo { int x(); };
|
|
|
|
int main() {
|
|
|
|
Foo bar;
|
|
|
|
bar.^x();
|
|
|
|
}
|
|
|
|
)cpp",
|
2019-05-29 18:01:00 +08:00
|
|
|
"text[Declared in]code[Foo]\n"
|
|
|
|
"codeblock(cpp) [\n"
|
|
|
|
"int x()\n"
|
|
|
|
"]",
|
[clangd] Implement textDocument/hover
Summary: Implemention of textDocument/hover as described in LSP definition.
This patch adds a basic Hover implementation. When hovering a variable,
function, method or namespace, clangd will return a text containing the
declaration's scope, as well as the declaration of the hovered entity.
For example, for a variable:
Declared in class Foo::Bar
int hello = 2
For macros, the macro definition is returned.
This patch doesn't include:
- markdown support (the client I use doesn't support it yet)
- range support (optional in the Hover response)
- comments associated to variables/functions/classes
They are kept as future work to keep this patch simpler.
I added tests in XRefsTests.cpp. hover.test contains one simple
smoketest to make sure the feature works from a black box perspective.
Reviewers: malaperle, krasimir, bkramer, ilya-biryukov
Subscribers: sammccall, mgrang, klimek, rwols, ilya-biryukov, arphaman, cfe-commits
Differential Revision: https://reviews.llvm.org/D35894
Signed-off-by: Simon Marchi <simon.marchi@ericsson.com>
Signed-off-by: William Enright <william.enright@polymtl.ca>
llvm-svn: 325395
2018-02-17 05:38:15 +08:00
|
|
|
},
|
|
|
|
{
|
|
|
|
R"cpp(// Static method call
|
|
|
|
struct Foo { static int x(); };
|
|
|
|
int main() {
|
|
|
|
Foo::^x();
|
|
|
|
}
|
|
|
|
)cpp",
|
2019-05-29 18:01:00 +08:00
|
|
|
"text[Declared in]code[Foo]\n"
|
|
|
|
"codeblock(cpp) [\n"
|
|
|
|
"static int x()\n"
|
|
|
|
"]",
|
[clangd] Implement textDocument/hover
Summary: Implemention of textDocument/hover as described in LSP definition.
This patch adds a basic Hover implementation. When hovering a variable,
function, method or namespace, clangd will return a text containing the
declaration's scope, as well as the declaration of the hovered entity.
For example, for a variable:
Declared in class Foo::Bar
int hello = 2
For macros, the macro definition is returned.
This patch doesn't include:
- markdown support (the client I use doesn't support it yet)
- range support (optional in the Hover response)
- comments associated to variables/functions/classes
They are kept as future work to keep this patch simpler.
I added tests in XRefsTests.cpp. hover.test contains one simple
smoketest to make sure the feature works from a black box perspective.
Reviewers: malaperle, krasimir, bkramer, ilya-biryukov
Subscribers: sammccall, mgrang, klimek, rwols, ilya-biryukov, arphaman, cfe-commits
Differential Revision: https://reviews.llvm.org/D35894
Signed-off-by: Simon Marchi <simon.marchi@ericsson.com>
Signed-off-by: William Enright <william.enright@polymtl.ca>
llvm-svn: 325395
2018-02-17 05:38:15 +08:00
|
|
|
},
|
|
|
|
{
|
|
|
|
R"cpp(// Typedef
|
|
|
|
typedef int Foo;
|
|
|
|
int main() {
|
|
|
|
^Foo bar;
|
|
|
|
}
|
|
|
|
)cpp",
|
2019-05-29 18:01:00 +08:00
|
|
|
"text[Declared in]code[global namespace]\n"
|
|
|
|
"codeblock(cpp) [\n"
|
|
|
|
"typedef int Foo\n"
|
2019-07-10 01:59:50 +08:00
|
|
|
"]\n"
|
|
|
|
"text[Typedef]",
|
[clangd] Implement textDocument/hover
Summary: Implemention of textDocument/hover as described in LSP definition.
This patch adds a basic Hover implementation. When hovering a variable,
function, method or namespace, clangd will return a text containing the
declaration's scope, as well as the declaration of the hovered entity.
For example, for a variable:
Declared in class Foo::Bar
int hello = 2
For macros, the macro definition is returned.
This patch doesn't include:
- markdown support (the client I use doesn't support it yet)
- range support (optional in the Hover response)
- comments associated to variables/functions/classes
They are kept as future work to keep this patch simpler.
I added tests in XRefsTests.cpp. hover.test contains one simple
smoketest to make sure the feature works from a black box perspective.
Reviewers: malaperle, krasimir, bkramer, ilya-biryukov
Subscribers: sammccall, mgrang, klimek, rwols, ilya-biryukov, arphaman, cfe-commits
Differential Revision: https://reviews.llvm.org/D35894
Signed-off-by: Simon Marchi <simon.marchi@ericsson.com>
Signed-off-by: William Enright <william.enright@polymtl.ca>
llvm-svn: 325395
2018-02-17 05:38:15 +08:00
|
|
|
},
|
|
|
|
{
|
|
|
|
R"cpp(// Namespace
|
|
|
|
namespace ns {
|
|
|
|
struct Foo { static void bar(); }
|
|
|
|
} // namespace ns
|
|
|
|
int main() { ^ns::Foo::bar(); }
|
|
|
|
)cpp",
|
2019-05-29 18:01:00 +08:00
|
|
|
"text[Declared in]code[global namespace]\n"
|
|
|
|
"codeblock(cpp) [\n"
|
|
|
|
"namespace ns {}\n"
|
|
|
|
"]",
|
[clangd] Implement textDocument/hover
Summary: Implemention of textDocument/hover as described in LSP definition.
This patch adds a basic Hover implementation. When hovering a variable,
function, method or namespace, clangd will return a text containing the
declaration's scope, as well as the declaration of the hovered entity.
For example, for a variable:
Declared in class Foo::Bar
int hello = 2
For macros, the macro definition is returned.
This patch doesn't include:
- markdown support (the client I use doesn't support it yet)
- range support (optional in the Hover response)
- comments associated to variables/functions/classes
They are kept as future work to keep this patch simpler.
I added tests in XRefsTests.cpp. hover.test contains one simple
smoketest to make sure the feature works from a black box perspective.
Reviewers: malaperle, krasimir, bkramer, ilya-biryukov
Subscribers: sammccall, mgrang, klimek, rwols, ilya-biryukov, arphaman, cfe-commits
Differential Revision: https://reviews.llvm.org/D35894
Signed-off-by: Simon Marchi <simon.marchi@ericsson.com>
Signed-off-by: William Enright <william.enright@polymtl.ca>
llvm-svn: 325395
2018-02-17 05:38:15 +08:00
|
|
|
},
|
|
|
|
{
|
|
|
|
R"cpp(// Anonymous namespace
|
|
|
|
namespace ns {
|
|
|
|
namespace {
|
|
|
|
int foo;
|
|
|
|
} // anonymous namespace
|
|
|
|
} // namespace ns
|
|
|
|
int main() { ns::f^oo++; }
|
|
|
|
)cpp",
|
2019-05-29 18:01:00 +08:00
|
|
|
"text[Declared in]code[ns::(anonymous)]\n"
|
|
|
|
"codeblock(cpp) [\n"
|
|
|
|
"int foo\n"
|
|
|
|
"]",
|
[clangd] Implement textDocument/hover
Summary: Implemention of textDocument/hover as described in LSP definition.
This patch adds a basic Hover implementation. When hovering a variable,
function, method or namespace, clangd will return a text containing the
declaration's scope, as well as the declaration of the hovered entity.
For example, for a variable:
Declared in class Foo::Bar
int hello = 2
For macros, the macro definition is returned.
This patch doesn't include:
- markdown support (the client I use doesn't support it yet)
- range support (optional in the Hover response)
- comments associated to variables/functions/classes
They are kept as future work to keep this patch simpler.
I added tests in XRefsTests.cpp. hover.test contains one simple
smoketest to make sure the feature works from a black box perspective.
Reviewers: malaperle, krasimir, bkramer, ilya-biryukov
Subscribers: sammccall, mgrang, klimek, rwols, ilya-biryukov, arphaman, cfe-commits
Differential Revision: https://reviews.llvm.org/D35894
Signed-off-by: Simon Marchi <simon.marchi@ericsson.com>
Signed-off-by: William Enright <william.enright@polymtl.ca>
llvm-svn: 325395
2018-02-17 05:38:15 +08:00
|
|
|
},
|
|
|
|
{
|
|
|
|
R"cpp(// Macro
|
|
|
|
#define MACRO 0
|
|
|
|
#define MACRO 1
|
|
|
|
int main() { return ^MACRO; }
|
|
|
|
#define MACRO 2
|
|
|
|
#undef macro
|
|
|
|
)cpp",
|
2019-05-29 18:01:00 +08:00
|
|
|
"codeblock(cpp) [\n"
|
|
|
|
"#define MACRO 1\n"
|
|
|
|
"]",
|
[clangd] Enhance macro hover to see full definition
Summary: Signed-off-by: Marc-Andre Laperle <malaperle@gmail.com>
Reviewers: simark, ilya-biryukov, sammccall, ioeric, hokein
Reviewed By: ilya-biryukov
Subscribers: ilya-biryukov, ioeric, MaskRay, jkorous, arphaman, kadircet, cfe-commits
Tags: #clang
Differential Revision: https://reviews.llvm.org/D55250
llvm-svn: 354761
2019-02-25 07:47:03 +08:00
|
|
|
},
|
|
|
|
{
|
|
|
|
R"cpp(// Macro
|
|
|
|
#define MACRO 0
|
|
|
|
#define MACRO2 ^MACRO
|
|
|
|
)cpp",
|
2019-05-29 18:01:00 +08:00
|
|
|
"codeblock(cpp) [\n"
|
|
|
|
"#define MACRO 0\n"
|
|
|
|
"]",
|
[clangd] Enhance macro hover to see full definition
Summary: Signed-off-by: Marc-Andre Laperle <malaperle@gmail.com>
Reviewers: simark, ilya-biryukov, sammccall, ioeric, hokein
Reviewed By: ilya-biryukov
Subscribers: ilya-biryukov, ioeric, MaskRay, jkorous, arphaman, kadircet, cfe-commits
Tags: #clang
Differential Revision: https://reviews.llvm.org/D55250
llvm-svn: 354761
2019-02-25 07:47:03 +08:00
|
|
|
},
|
|
|
|
{
|
|
|
|
R"cpp(// Macro
|
|
|
|
#define MACRO {\
|
|
|
|
return 0;\
|
|
|
|
}
|
|
|
|
int main() ^MACRO
|
|
|
|
)cpp",
|
2019-05-29 18:01:00 +08:00
|
|
|
R"cpp(codeblock(cpp) [
|
|
|
|
#define MACRO \
|
|
|
|
{ return 0; }
|
|
|
|
])cpp",
|
[clangd] Implement textDocument/hover
Summary: Implemention of textDocument/hover as described in LSP definition.
This patch adds a basic Hover implementation. When hovering a variable,
function, method or namespace, clangd will return a text containing the
declaration's scope, as well as the declaration of the hovered entity.
For example, for a variable:
Declared in class Foo::Bar
int hello = 2
For macros, the macro definition is returned.
This patch doesn't include:
- markdown support (the client I use doesn't support it yet)
- range support (optional in the Hover response)
- comments associated to variables/functions/classes
They are kept as future work to keep this patch simpler.
I added tests in XRefsTests.cpp. hover.test contains one simple
smoketest to make sure the feature works from a black box perspective.
Reviewers: malaperle, krasimir, bkramer, ilya-biryukov
Subscribers: sammccall, mgrang, klimek, rwols, ilya-biryukov, arphaman, cfe-commits
Differential Revision: https://reviews.llvm.org/D35894
Signed-off-by: Simon Marchi <simon.marchi@ericsson.com>
Signed-off-by: William Enright <william.enright@polymtl.ca>
llvm-svn: 325395
2018-02-17 05:38:15 +08:00
|
|
|
},
|
|
|
|
{
|
|
|
|
R"cpp(// Forward class declaration
|
|
|
|
class Foo;
|
|
|
|
class Foo {};
|
|
|
|
F^oo* foo();
|
|
|
|
)cpp",
|
2019-05-29 18:01:00 +08:00
|
|
|
"text[Declared in]code[global namespace]\n"
|
|
|
|
"codeblock(cpp) [\n"
|
|
|
|
"class Foo {}\n"
|
2019-07-10 01:59:50 +08:00
|
|
|
"]\n"
|
|
|
|
"text[Forward class declaration]",
|
[clangd] Implement textDocument/hover
Summary: Implemention of textDocument/hover as described in LSP definition.
This patch adds a basic Hover implementation. When hovering a variable,
function, method or namespace, clangd will return a text containing the
declaration's scope, as well as the declaration of the hovered entity.
For example, for a variable:
Declared in class Foo::Bar
int hello = 2
For macros, the macro definition is returned.
This patch doesn't include:
- markdown support (the client I use doesn't support it yet)
- range support (optional in the Hover response)
- comments associated to variables/functions/classes
They are kept as future work to keep this patch simpler.
I added tests in XRefsTests.cpp. hover.test contains one simple
smoketest to make sure the feature works from a black box perspective.
Reviewers: malaperle, krasimir, bkramer, ilya-biryukov
Subscribers: sammccall, mgrang, klimek, rwols, ilya-biryukov, arphaman, cfe-commits
Differential Revision: https://reviews.llvm.org/D35894
Signed-off-by: Simon Marchi <simon.marchi@ericsson.com>
Signed-off-by: William Enright <william.enright@polymtl.ca>
llvm-svn: 325395
2018-02-17 05:38:15 +08:00
|
|
|
},
|
|
|
|
{
|
|
|
|
R"cpp(// Function declaration
|
|
|
|
void foo();
|
|
|
|
void g() { f^oo(); }
|
|
|
|
void foo() {}
|
|
|
|
)cpp",
|
2019-05-29 18:01:00 +08:00
|
|
|
"text[Declared in]code[global namespace]\n"
|
|
|
|
"codeblock(cpp) [\n"
|
|
|
|
"void foo()\n"
|
2019-07-10 01:59:50 +08:00
|
|
|
"]\n"
|
|
|
|
"text[Function declaration]",
|
[clangd] Implement textDocument/hover
Summary: Implemention of textDocument/hover as described in LSP definition.
This patch adds a basic Hover implementation. When hovering a variable,
function, method or namespace, clangd will return a text containing the
declaration's scope, as well as the declaration of the hovered entity.
For example, for a variable:
Declared in class Foo::Bar
int hello = 2
For macros, the macro definition is returned.
This patch doesn't include:
- markdown support (the client I use doesn't support it yet)
- range support (optional in the Hover response)
- comments associated to variables/functions/classes
They are kept as future work to keep this patch simpler.
I added tests in XRefsTests.cpp. hover.test contains one simple
smoketest to make sure the feature works from a black box perspective.
Reviewers: malaperle, krasimir, bkramer, ilya-biryukov
Subscribers: sammccall, mgrang, klimek, rwols, ilya-biryukov, arphaman, cfe-commits
Differential Revision: https://reviews.llvm.org/D35894
Signed-off-by: Simon Marchi <simon.marchi@ericsson.com>
Signed-off-by: William Enright <william.enright@polymtl.ca>
llvm-svn: 325395
2018-02-17 05:38:15 +08:00
|
|
|
},
|
|
|
|
{
|
|
|
|
R"cpp(// Enum declaration
|
|
|
|
enum Hello {
|
|
|
|
ONE, TWO, THREE,
|
|
|
|
};
|
|
|
|
void foo() {
|
|
|
|
Hel^lo hello = ONE;
|
|
|
|
}
|
|
|
|
)cpp",
|
2019-05-29 18:01:00 +08:00
|
|
|
"text[Declared in]code[global namespace]\n"
|
|
|
|
"codeblock(cpp) [\n"
|
|
|
|
"enum Hello {}\n"
|
2019-07-10 01:59:50 +08:00
|
|
|
"]\n"
|
|
|
|
"text[Enum declaration]",
|
[clangd] Implement textDocument/hover
Summary: Implemention of textDocument/hover as described in LSP definition.
This patch adds a basic Hover implementation. When hovering a variable,
function, method or namespace, clangd will return a text containing the
declaration's scope, as well as the declaration of the hovered entity.
For example, for a variable:
Declared in class Foo::Bar
int hello = 2
For macros, the macro definition is returned.
This patch doesn't include:
- markdown support (the client I use doesn't support it yet)
- range support (optional in the Hover response)
- comments associated to variables/functions/classes
They are kept as future work to keep this patch simpler.
I added tests in XRefsTests.cpp. hover.test contains one simple
smoketest to make sure the feature works from a black box perspective.
Reviewers: malaperle, krasimir, bkramer, ilya-biryukov
Subscribers: sammccall, mgrang, klimek, rwols, ilya-biryukov, arphaman, cfe-commits
Differential Revision: https://reviews.llvm.org/D35894
Signed-off-by: Simon Marchi <simon.marchi@ericsson.com>
Signed-off-by: William Enright <william.enright@polymtl.ca>
llvm-svn: 325395
2018-02-17 05:38:15 +08:00
|
|
|
},
|
|
|
|
{
|
|
|
|
R"cpp(// Enumerator
|
|
|
|
enum Hello {
|
|
|
|
ONE, TWO, THREE,
|
|
|
|
};
|
|
|
|
void foo() {
|
|
|
|
Hello hello = O^NE;
|
|
|
|
}
|
|
|
|
)cpp",
|
2019-05-29 18:01:00 +08:00
|
|
|
"text[Declared in]code[Hello]\n"
|
|
|
|
"codeblock(cpp) [\n"
|
|
|
|
"ONE\n"
|
|
|
|
"]",
|
[clangd] Implement textDocument/hover
Summary: Implemention of textDocument/hover as described in LSP definition.
This patch adds a basic Hover implementation. When hovering a variable,
function, method or namespace, clangd will return a text containing the
declaration's scope, as well as the declaration of the hovered entity.
For example, for a variable:
Declared in class Foo::Bar
int hello = 2
For macros, the macro definition is returned.
This patch doesn't include:
- markdown support (the client I use doesn't support it yet)
- range support (optional in the Hover response)
- comments associated to variables/functions/classes
They are kept as future work to keep this patch simpler.
I added tests in XRefsTests.cpp. hover.test contains one simple
smoketest to make sure the feature works from a black box perspective.
Reviewers: malaperle, krasimir, bkramer, ilya-biryukov
Subscribers: sammccall, mgrang, klimek, rwols, ilya-biryukov, arphaman, cfe-commits
Differential Revision: https://reviews.llvm.org/D35894
Signed-off-by: Simon Marchi <simon.marchi@ericsson.com>
Signed-off-by: William Enright <william.enright@polymtl.ca>
llvm-svn: 325395
2018-02-17 05:38:15 +08:00
|
|
|
},
|
|
|
|
{
|
|
|
|
R"cpp(// Enumerator in anonymous enum
|
|
|
|
enum {
|
|
|
|
ONE, TWO, THREE,
|
|
|
|
};
|
|
|
|
void foo() {
|
|
|
|
int hello = O^NE;
|
|
|
|
}
|
|
|
|
)cpp",
|
2019-05-29 18:01:00 +08:00
|
|
|
"text[Declared in]code[global namespace]\n"
|
|
|
|
"codeblock(cpp) [\n"
|
|
|
|
"ONE\n"
|
|
|
|
"]",
|
[clangd] Implement textDocument/hover
Summary: Implemention of textDocument/hover as described in LSP definition.
This patch adds a basic Hover implementation. When hovering a variable,
function, method or namespace, clangd will return a text containing the
declaration's scope, as well as the declaration of the hovered entity.
For example, for a variable:
Declared in class Foo::Bar
int hello = 2
For macros, the macro definition is returned.
This patch doesn't include:
- markdown support (the client I use doesn't support it yet)
- range support (optional in the Hover response)
- comments associated to variables/functions/classes
They are kept as future work to keep this patch simpler.
I added tests in XRefsTests.cpp. hover.test contains one simple
smoketest to make sure the feature works from a black box perspective.
Reviewers: malaperle, krasimir, bkramer, ilya-biryukov
Subscribers: sammccall, mgrang, klimek, rwols, ilya-biryukov, arphaman, cfe-commits
Differential Revision: https://reviews.llvm.org/D35894
Signed-off-by: Simon Marchi <simon.marchi@ericsson.com>
Signed-off-by: William Enright <william.enright@polymtl.ca>
llvm-svn: 325395
2018-02-17 05:38:15 +08:00
|
|
|
},
|
|
|
|
{
|
|
|
|
R"cpp(// Global variable
|
|
|
|
static int hey = 10;
|
|
|
|
void foo() {
|
|
|
|
he^y++;
|
|
|
|
}
|
|
|
|
)cpp",
|
2019-05-29 18:01:00 +08:00
|
|
|
"text[Declared in]code[global namespace]\n"
|
|
|
|
"codeblock(cpp) [\n"
|
|
|
|
"static int hey = 10\n"
|
2019-07-10 01:59:50 +08:00
|
|
|
"]\n"
|
|
|
|
"text[Global variable]",
|
[clangd] Implement textDocument/hover
Summary: Implemention of textDocument/hover as described in LSP definition.
This patch adds a basic Hover implementation. When hovering a variable,
function, method or namespace, clangd will return a text containing the
declaration's scope, as well as the declaration of the hovered entity.
For example, for a variable:
Declared in class Foo::Bar
int hello = 2
For macros, the macro definition is returned.
This patch doesn't include:
- markdown support (the client I use doesn't support it yet)
- range support (optional in the Hover response)
- comments associated to variables/functions/classes
They are kept as future work to keep this patch simpler.
I added tests in XRefsTests.cpp. hover.test contains one simple
smoketest to make sure the feature works from a black box perspective.
Reviewers: malaperle, krasimir, bkramer, ilya-biryukov
Subscribers: sammccall, mgrang, klimek, rwols, ilya-biryukov, arphaman, cfe-commits
Differential Revision: https://reviews.llvm.org/D35894
Signed-off-by: Simon Marchi <simon.marchi@ericsson.com>
Signed-off-by: William Enright <william.enright@polymtl.ca>
llvm-svn: 325395
2018-02-17 05:38:15 +08:00
|
|
|
},
|
|
|
|
{
|
|
|
|
R"cpp(// Global variable in namespace
|
|
|
|
namespace ns1 {
|
|
|
|
static int hey = 10;
|
|
|
|
}
|
|
|
|
void foo() {
|
|
|
|
ns1::he^y++;
|
|
|
|
}
|
|
|
|
)cpp",
|
2019-05-29 18:01:00 +08:00
|
|
|
"text[Declared in]code[ns1]\n"
|
|
|
|
"codeblock(cpp) [\n"
|
|
|
|
"static int hey = 10\n"
|
|
|
|
"]",
|
[clangd] Implement textDocument/hover
Summary: Implemention of textDocument/hover as described in LSP definition.
This patch adds a basic Hover implementation. When hovering a variable,
function, method or namespace, clangd will return a text containing the
declaration's scope, as well as the declaration of the hovered entity.
For example, for a variable:
Declared in class Foo::Bar
int hello = 2
For macros, the macro definition is returned.
This patch doesn't include:
- markdown support (the client I use doesn't support it yet)
- range support (optional in the Hover response)
- comments associated to variables/functions/classes
They are kept as future work to keep this patch simpler.
I added tests in XRefsTests.cpp. hover.test contains one simple
smoketest to make sure the feature works from a black box perspective.
Reviewers: malaperle, krasimir, bkramer, ilya-biryukov
Subscribers: sammccall, mgrang, klimek, rwols, ilya-biryukov, arphaman, cfe-commits
Differential Revision: https://reviews.llvm.org/D35894
Signed-off-by: Simon Marchi <simon.marchi@ericsson.com>
Signed-off-by: William Enright <william.enright@polymtl.ca>
llvm-svn: 325395
2018-02-17 05:38:15 +08:00
|
|
|
},
|
|
|
|
{
|
|
|
|
R"cpp(// Field in anonymous struct
|
|
|
|
static struct {
|
|
|
|
int hello;
|
|
|
|
} s;
|
|
|
|
void foo() {
|
|
|
|
s.he^llo++;
|
|
|
|
}
|
|
|
|
)cpp",
|
2019-05-29 18:01:00 +08:00
|
|
|
"text[Declared in]code[(anonymous struct)]\n"
|
|
|
|
"codeblock(cpp) [\n"
|
|
|
|
"int hello\n"
|
|
|
|
"]",
|
[clangd] Implement textDocument/hover
Summary: Implemention of textDocument/hover as described in LSP definition.
This patch adds a basic Hover implementation. When hovering a variable,
function, method or namespace, clangd will return a text containing the
declaration's scope, as well as the declaration of the hovered entity.
For example, for a variable:
Declared in class Foo::Bar
int hello = 2
For macros, the macro definition is returned.
This patch doesn't include:
- markdown support (the client I use doesn't support it yet)
- range support (optional in the Hover response)
- comments associated to variables/functions/classes
They are kept as future work to keep this patch simpler.
I added tests in XRefsTests.cpp. hover.test contains one simple
smoketest to make sure the feature works from a black box perspective.
Reviewers: malaperle, krasimir, bkramer, ilya-biryukov
Subscribers: sammccall, mgrang, klimek, rwols, ilya-biryukov, arphaman, cfe-commits
Differential Revision: https://reviews.llvm.org/D35894
Signed-off-by: Simon Marchi <simon.marchi@ericsson.com>
Signed-off-by: William Enright <william.enright@polymtl.ca>
llvm-svn: 325395
2018-02-17 05:38:15 +08:00
|
|
|
},
|
|
|
|
{
|
|
|
|
R"cpp(// Templated function
|
|
|
|
template <typename T>
|
|
|
|
T foo() {
|
|
|
|
return 17;
|
|
|
|
}
|
|
|
|
void g() { auto x = f^oo<int>(); }
|
|
|
|
)cpp",
|
2019-05-29 18:01:00 +08:00
|
|
|
"text[Declared in]code[global namespace]\n"
|
|
|
|
"codeblock(cpp) [\n"
|
|
|
|
"template <typename T> T foo()\n"
|
2019-07-10 01:59:50 +08:00
|
|
|
"]\n"
|
|
|
|
"text[Templated function]",
|
[clangd] Implement textDocument/hover
Summary: Implemention of textDocument/hover as described in LSP definition.
This patch adds a basic Hover implementation. When hovering a variable,
function, method or namespace, clangd will return a text containing the
declaration's scope, as well as the declaration of the hovered entity.
For example, for a variable:
Declared in class Foo::Bar
int hello = 2
For macros, the macro definition is returned.
This patch doesn't include:
- markdown support (the client I use doesn't support it yet)
- range support (optional in the Hover response)
- comments associated to variables/functions/classes
They are kept as future work to keep this patch simpler.
I added tests in XRefsTests.cpp. hover.test contains one simple
smoketest to make sure the feature works from a black box perspective.
Reviewers: malaperle, krasimir, bkramer, ilya-biryukov
Subscribers: sammccall, mgrang, klimek, rwols, ilya-biryukov, arphaman, cfe-commits
Differential Revision: https://reviews.llvm.org/D35894
Signed-off-by: Simon Marchi <simon.marchi@ericsson.com>
Signed-off-by: William Enright <william.enright@polymtl.ca>
llvm-svn: 325395
2018-02-17 05:38:15 +08:00
|
|
|
},
|
|
|
|
{
|
|
|
|
R"cpp(// Anonymous union
|
|
|
|
struct outer {
|
|
|
|
union {
|
|
|
|
int abc, def;
|
|
|
|
} v;
|
|
|
|
};
|
|
|
|
void g() { struct outer o; o.v.d^ef++; }
|
|
|
|
)cpp",
|
2019-05-29 18:01:00 +08:00
|
|
|
"text[Declared in]code[outer::(anonymous union)]\n"
|
|
|
|
"codeblock(cpp) [\n"
|
|
|
|
"int def\n"
|
|
|
|
"]",
|
[clangd] Implement textDocument/hover
Summary: Implemention of textDocument/hover as described in LSP definition.
This patch adds a basic Hover implementation. When hovering a variable,
function, method or namespace, clangd will return a text containing the
declaration's scope, as well as the declaration of the hovered entity.
For example, for a variable:
Declared in class Foo::Bar
int hello = 2
For macros, the macro definition is returned.
This patch doesn't include:
- markdown support (the client I use doesn't support it yet)
- range support (optional in the Hover response)
- comments associated to variables/functions/classes
They are kept as future work to keep this patch simpler.
I added tests in XRefsTests.cpp. hover.test contains one simple
smoketest to make sure the feature works from a black box perspective.
Reviewers: malaperle, krasimir, bkramer, ilya-biryukov
Subscribers: sammccall, mgrang, klimek, rwols, ilya-biryukov, arphaman, cfe-commits
Differential Revision: https://reviews.llvm.org/D35894
Signed-off-by: Simon Marchi <simon.marchi@ericsson.com>
Signed-off-by: William Enright <william.enright@polymtl.ca>
llvm-svn: 325395
2018-02-17 05:38:15 +08:00
|
|
|
},
|
2019-07-10 01:59:50 +08:00
|
|
|
{
|
|
|
|
R"cpp(// documentation from index
|
|
|
|
int nextSymbolIsAForwardDeclFromIndexWithNoLocalDocs;
|
|
|
|
void indexSymbol();
|
|
|
|
void g() { ind^exSymbol(); }
|
|
|
|
)cpp",
|
|
|
|
"text[Declared in]code[global namespace]\n"
|
|
|
|
"codeblock(cpp) [\n"
|
|
|
|
"void indexSymbol()\n"
|
|
|
|
"]\n"
|
|
|
|
"text[comment from index]",
|
|
|
|
},
|
2018-06-04 18:37:16 +08:00
|
|
|
{
|
|
|
|
R"cpp(// Nothing
|
|
|
|
void foo() {
|
|
|
|
^
|
|
|
|
}
|
|
|
|
)cpp",
|
|
|
|
"",
|
|
|
|
},
|
2018-07-03 00:28:34 +08:00
|
|
|
{
|
|
|
|
R"cpp(// Simple initialization with auto
|
|
|
|
void foo() {
|
|
|
|
^auto i = 1;
|
|
|
|
}
|
|
|
|
)cpp",
|
2019-05-29 18:01:00 +08:00
|
|
|
"codeblock(cpp) [\n"
|
|
|
|
"int\n"
|
|
|
|
"]",
|
2018-07-03 00:28:34 +08:00
|
|
|
},
|
|
|
|
{
|
|
|
|
R"cpp(// Simple initialization with const auto
|
|
|
|
void foo() {
|
|
|
|
const ^auto i = 1;
|
|
|
|
}
|
|
|
|
)cpp",
|
2019-05-29 18:01:00 +08:00
|
|
|
"codeblock(cpp) [\n"
|
|
|
|
"int\n"
|
|
|
|
"]",
|
2018-07-03 00:28:34 +08:00
|
|
|
},
|
|
|
|
{
|
|
|
|
R"cpp(// Simple initialization with const auto&
|
|
|
|
void foo() {
|
|
|
|
const ^auto& i = 1;
|
|
|
|
}
|
|
|
|
)cpp",
|
2019-05-29 18:01:00 +08:00
|
|
|
"codeblock(cpp) [\n"
|
|
|
|
"int\n"
|
|
|
|
"]",
|
2018-07-03 00:28:34 +08:00
|
|
|
},
|
|
|
|
{
|
|
|
|
R"cpp(// Simple initialization with auto&
|
|
|
|
void foo() {
|
|
|
|
^auto& i = 1;
|
|
|
|
}
|
|
|
|
)cpp",
|
2019-05-29 18:01:00 +08:00
|
|
|
"codeblock(cpp) [\n"
|
|
|
|
"int\n"
|
|
|
|
"]",
|
2018-07-03 00:28:34 +08:00
|
|
|
},
|
2018-10-12 18:11:02 +08:00
|
|
|
{
|
|
|
|
R"cpp(// Simple initialization with auto*
|
|
|
|
void foo() {
|
|
|
|
int a = 1;
|
|
|
|
^auto* i = &a;
|
|
|
|
}
|
|
|
|
)cpp",
|
2019-05-29 18:01:00 +08:00
|
|
|
"codeblock(cpp) [\n"
|
|
|
|
"int\n"
|
|
|
|
"]",
|
2018-10-12 18:11:02 +08:00
|
|
|
},
|
2018-07-03 00:28:34 +08:00
|
|
|
{
|
|
|
|
R"cpp(// Auto with initializer list.
|
|
|
|
namespace std
|
|
|
|
{
|
|
|
|
template<class _E>
|
|
|
|
class initializer_list {};
|
|
|
|
}
|
|
|
|
void foo() {
|
|
|
|
^auto i = {1,2};
|
|
|
|
}
|
|
|
|
)cpp",
|
2019-05-29 18:01:00 +08:00
|
|
|
"codeblock(cpp) [\n"
|
|
|
|
"class std::initializer_list<int>\n"
|
|
|
|
"]",
|
2018-07-03 00:28:34 +08:00
|
|
|
},
|
|
|
|
{
|
|
|
|
R"cpp(// User defined conversion to auto
|
|
|
|
struct Bar {
|
|
|
|
operator ^auto() const { return 10; }
|
|
|
|
};
|
|
|
|
)cpp",
|
2019-05-29 18:01:00 +08:00
|
|
|
"codeblock(cpp) [\n"
|
|
|
|
"int\n"
|
|
|
|
"]",
|
2018-07-03 00:28:34 +08:00
|
|
|
},
|
|
|
|
{
|
|
|
|
R"cpp(// Simple initialization with decltype(auto)
|
|
|
|
void foo() {
|
|
|
|
^decltype(auto) i = 1;
|
|
|
|
}
|
|
|
|
)cpp",
|
2019-05-29 18:01:00 +08:00
|
|
|
"codeblock(cpp) [\n"
|
|
|
|
"int\n"
|
|
|
|
"]",
|
2018-07-03 00:28:34 +08:00
|
|
|
},
|
|
|
|
{
|
|
|
|
R"cpp(// Simple initialization with const decltype(auto)
|
|
|
|
void foo() {
|
|
|
|
const int j = 0;
|
|
|
|
^decltype(auto) i = j;
|
|
|
|
}
|
|
|
|
)cpp",
|
2019-05-29 18:01:00 +08:00
|
|
|
"codeblock(cpp) [\n"
|
|
|
|
"const int\n"
|
|
|
|
"]",
|
2018-07-03 00:28:34 +08:00
|
|
|
},
|
|
|
|
{
|
|
|
|
R"cpp(// Simple initialization with const& decltype(auto)
|
|
|
|
void foo() {
|
|
|
|
int k = 0;
|
|
|
|
const int& j = k;
|
|
|
|
^decltype(auto) i = j;
|
|
|
|
}
|
|
|
|
)cpp",
|
2019-05-29 18:01:00 +08:00
|
|
|
"codeblock(cpp) [\n"
|
|
|
|
"const int &\n"
|
|
|
|
"]",
|
2018-07-03 00:28:34 +08:00
|
|
|
},
|
|
|
|
{
|
|
|
|
R"cpp(// Simple initialization with & decltype(auto)
|
|
|
|
void foo() {
|
|
|
|
int k = 0;
|
|
|
|
int& j = k;
|
|
|
|
^decltype(auto) i = j;
|
|
|
|
}
|
|
|
|
)cpp",
|
2019-05-29 18:01:00 +08:00
|
|
|
"codeblock(cpp) [\n"
|
|
|
|
"int &\n"
|
|
|
|
"]",
|
2018-07-03 00:28:34 +08:00
|
|
|
},
|
|
|
|
{
|
|
|
|
R"cpp(// decltype with initializer list: nothing
|
|
|
|
namespace std
|
|
|
|
{
|
|
|
|
template<class _E>
|
|
|
|
class initializer_list {};
|
|
|
|
}
|
|
|
|
void foo() {
|
|
|
|
^decltype(auto) i = {1,2};
|
|
|
|
}
|
|
|
|
)cpp",
|
|
|
|
"",
|
|
|
|
},
|
2018-11-17 08:41:14 +08:00
|
|
|
{
|
|
|
|
R"cpp(// simple trailing return type
|
|
|
|
^auto main() -> int {
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
)cpp",
|
2019-05-29 18:01:00 +08:00
|
|
|
"codeblock(cpp) [\n"
|
|
|
|
"int\n"
|
|
|
|
"]",
|
2018-11-17 08:41:14 +08:00
|
|
|
},
|
2018-07-03 00:28:34 +08:00
|
|
|
{
|
|
|
|
R"cpp(// auto function return with trailing type
|
|
|
|
struct Bar {};
|
|
|
|
^auto test() -> decltype(Bar()) {
|
|
|
|
return Bar();
|
|
|
|
}
|
|
|
|
)cpp",
|
2019-05-29 18:01:00 +08:00
|
|
|
"codeblock(cpp) [\n"
|
|
|
|
"struct Bar\n"
|
|
|
|
"]",
|
2018-07-03 00:28:34 +08:00
|
|
|
},
|
|
|
|
{
|
|
|
|
R"cpp(// trailing return type
|
|
|
|
struct Bar {};
|
|
|
|
auto test() -> ^decltype(Bar()) {
|
|
|
|
return Bar();
|
|
|
|
}
|
|
|
|
)cpp",
|
2019-05-29 18:01:00 +08:00
|
|
|
"codeblock(cpp) [\n"
|
|
|
|
"struct Bar\n"
|
|
|
|
"]",
|
2018-07-03 00:28:34 +08:00
|
|
|
},
|
|
|
|
{
|
|
|
|
R"cpp(// auto in function return
|
|
|
|
struct Bar {};
|
|
|
|
^auto test() {
|
|
|
|
return Bar();
|
|
|
|
}
|
|
|
|
)cpp",
|
2019-05-29 18:01:00 +08:00
|
|
|
"codeblock(cpp) [\n"
|
|
|
|
"struct Bar\n"
|
|
|
|
"]",
|
2018-07-03 00:28:34 +08:00
|
|
|
},
|
|
|
|
{
|
|
|
|
R"cpp(// auto& in function return
|
|
|
|
struct Bar {};
|
|
|
|
^auto& test() {
|
|
|
|
return Bar();
|
|
|
|
}
|
|
|
|
)cpp",
|
2019-05-29 18:01:00 +08:00
|
|
|
"codeblock(cpp) [\n"
|
|
|
|
"struct Bar\n"
|
|
|
|
"]",
|
2018-07-03 00:28:34 +08:00
|
|
|
},
|
2018-10-12 18:11:02 +08:00
|
|
|
{
|
|
|
|
R"cpp(// auto* in function return
|
|
|
|
struct Bar {};
|
|
|
|
^auto* test() {
|
|
|
|
Bar* bar;
|
|
|
|
return bar;
|
|
|
|
}
|
|
|
|
)cpp",
|
2019-05-29 18:01:00 +08:00
|
|
|
"codeblock(cpp) [\n"
|
|
|
|
"struct Bar\n"
|
|
|
|
"]",
|
2018-10-12 18:11:02 +08:00
|
|
|
},
|
2018-07-03 00:28:34 +08:00
|
|
|
{
|
|
|
|
R"cpp(// const auto& in function return
|
|
|
|
struct Bar {};
|
|
|
|
const ^auto& test() {
|
|
|
|
return Bar();
|
|
|
|
}
|
|
|
|
)cpp",
|
2019-05-29 18:01:00 +08:00
|
|
|
"codeblock(cpp) [\n"
|
|
|
|
"struct Bar\n"
|
|
|
|
"]",
|
2018-07-03 00:28:34 +08:00
|
|
|
},
|
|
|
|
{
|
|
|
|
R"cpp(// decltype(auto) in function return
|
|
|
|
struct Bar {};
|
|
|
|
^decltype(auto) test() {
|
|
|
|
return Bar();
|
|
|
|
}
|
|
|
|
)cpp",
|
2019-05-29 18:01:00 +08:00
|
|
|
"codeblock(cpp) [\n"
|
|
|
|
"struct Bar\n"
|
|
|
|
"]",
|
2018-07-03 00:28:34 +08:00
|
|
|
},
|
|
|
|
{
|
|
|
|
R"cpp(// decltype(auto) reference in function return
|
|
|
|
struct Bar {};
|
|
|
|
^decltype(auto) test() {
|
|
|
|
int a;
|
|
|
|
return (a);
|
|
|
|
}
|
|
|
|
)cpp",
|
2019-05-29 18:01:00 +08:00
|
|
|
"codeblock(cpp) [\n"
|
|
|
|
"int &\n"
|
|
|
|
"]",
|
2018-07-03 00:28:34 +08:00
|
|
|
},
|
|
|
|
{
|
|
|
|
R"cpp(// decltype lvalue reference
|
|
|
|
void foo() {
|
|
|
|
int I = 0;
|
|
|
|
^decltype(I) J = I;
|
|
|
|
}
|
|
|
|
)cpp",
|
2019-05-29 18:01:00 +08:00
|
|
|
"codeblock(cpp) [\n"
|
|
|
|
"int\n"
|
|
|
|
"]",
|
2018-07-03 00:28:34 +08:00
|
|
|
},
|
|
|
|
{
|
|
|
|
R"cpp(// decltype lvalue reference
|
|
|
|
void foo() {
|
|
|
|
int I= 0;
|
|
|
|
int &K = I;
|
|
|
|
^decltype(K) J = I;
|
|
|
|
}
|
|
|
|
)cpp",
|
2019-05-29 18:01:00 +08:00
|
|
|
"codeblock(cpp) [\n"
|
|
|
|
"int &\n"
|
|
|
|
"]",
|
2018-07-03 00:28:34 +08:00
|
|
|
},
|
|
|
|
{
|
|
|
|
R"cpp(// decltype lvalue reference parenthesis
|
|
|
|
void foo() {
|
|
|
|
int I = 0;
|
|
|
|
^decltype((I)) J = I;
|
|
|
|
}
|
|
|
|
)cpp",
|
2019-05-29 18:01:00 +08:00
|
|
|
"codeblock(cpp) [\n"
|
|
|
|
"int &\n"
|
|
|
|
"]",
|
2018-07-03 00:28:34 +08:00
|
|
|
},
|
|
|
|
{
|
|
|
|
R"cpp(// decltype rvalue reference
|
|
|
|
void foo() {
|
|
|
|
int I = 0;
|
|
|
|
^decltype(static_cast<int&&>(I)) J = static_cast<int&&>(I);
|
|
|
|
}
|
|
|
|
)cpp",
|
2019-05-29 18:01:00 +08:00
|
|
|
"codeblock(cpp) [\n"
|
|
|
|
"int &&\n"
|
|
|
|
"]",
|
2018-07-03 00:28:34 +08:00
|
|
|
},
|
|
|
|
{
|
|
|
|
R"cpp(// decltype rvalue reference function call
|
|
|
|
int && bar();
|
|
|
|
void foo() {
|
|
|
|
int I = 0;
|
|
|
|
^decltype(bar()) J = bar();
|
|
|
|
}
|
|
|
|
)cpp",
|
2019-05-29 18:01:00 +08:00
|
|
|
"codeblock(cpp) [\n"
|
|
|
|
"int &&\n"
|
|
|
|
"]",
|
2018-07-03 00:28:34 +08:00
|
|
|
},
|
|
|
|
{
|
|
|
|
R"cpp(// decltype of function with trailing return type.
|
|
|
|
struct Bar {};
|
|
|
|
auto test() -> decltype(Bar()) {
|
|
|
|
return Bar();
|
|
|
|
}
|
|
|
|
void foo() {
|
|
|
|
^decltype(test()) i = test();
|
|
|
|
}
|
|
|
|
)cpp",
|
2019-05-29 18:01:00 +08:00
|
|
|
"codeblock(cpp) [\n"
|
|
|
|
"struct Bar\n"
|
|
|
|
"]",
|
2018-07-03 00:28:34 +08:00
|
|
|
},
|
|
|
|
{
|
|
|
|
R"cpp(// decltype of var with decltype.
|
|
|
|
void foo() {
|
|
|
|
int I = 0;
|
|
|
|
decltype(I) J = I;
|
|
|
|
^decltype(J) K = J;
|
|
|
|
}
|
|
|
|
)cpp",
|
2019-05-29 18:01:00 +08:00
|
|
|
"codeblock(cpp) [\n"
|
|
|
|
"int\n"
|
|
|
|
"]",
|
2018-07-03 00:28:34 +08:00
|
|
|
},
|
|
|
|
{
|
|
|
|
R"cpp(// structured binding. Not supported yet
|
|
|
|
struct Bar {};
|
|
|
|
void foo() {
|
|
|
|
Bar a[2];
|
|
|
|
^auto [x,y] = a;
|
|
|
|
}
|
|
|
|
)cpp",
|
|
|
|
"",
|
|
|
|
},
|
|
|
|
{
|
|
|
|
R"cpp(// Template auto parameter. Nothing (Not useful).
|
|
|
|
template<^auto T>
|
|
|
|
void func() {
|
|
|
|
}
|
|
|
|
void foo() {
|
|
|
|
func<1>();
|
|
|
|
}
|
|
|
|
)cpp",
|
|
|
|
"",
|
|
|
|
},
|
2018-10-24 18:09:34 +08:00
|
|
|
{
|
|
|
|
R"cpp(// More compilcated structured types.
|
|
|
|
int bar();
|
|
|
|
^auto (*foo)() = bar;
|
|
|
|
)cpp",
|
2019-05-29 18:01:00 +08:00
|
|
|
"codeblock(cpp) [\n"
|
|
|
|
"int\n"
|
|
|
|
"]",
|
2018-10-24 18:09:34 +08:00
|
|
|
},
|
[clangd] Implement textDocument/hover
Summary: Implemention of textDocument/hover as described in LSP definition.
This patch adds a basic Hover implementation. When hovering a variable,
function, method or namespace, clangd will return a text containing the
declaration's scope, as well as the declaration of the hovered entity.
For example, for a variable:
Declared in class Foo::Bar
int hello = 2
For macros, the macro definition is returned.
This patch doesn't include:
- markdown support (the client I use doesn't support it yet)
- range support (optional in the Hover response)
- comments associated to variables/functions/classes
They are kept as future work to keep this patch simpler.
I added tests in XRefsTests.cpp. hover.test contains one simple
smoketest to make sure the feature works from a black box perspective.
Reviewers: malaperle, krasimir, bkramer, ilya-biryukov
Subscribers: sammccall, mgrang, klimek, rwols, ilya-biryukov, arphaman, cfe-commits
Differential Revision: https://reviews.llvm.org/D35894
Signed-off-by: Simon Marchi <simon.marchi@ericsson.com>
Signed-off-by: William Enright <william.enright@polymtl.ca>
llvm-svn: 325395
2018-02-17 05:38:15 +08:00
|
|
|
};
|
|
|
|
|
2019-07-10 01:59:50 +08:00
|
|
|
// Create a tiny index, so tests above can verify documentation is fetched.
|
|
|
|
Symbol IndexSym = func("indexSymbol");
|
|
|
|
IndexSym.Documentation = "comment from index";
|
|
|
|
SymbolSlab::Builder Symbols;
|
|
|
|
Symbols.insert(IndexSym);
|
|
|
|
auto Index =
|
|
|
|
MemIndex::build(std::move(Symbols).build(), RefSlab(), RelationSlab());
|
|
|
|
|
[clangd] Implement textDocument/hover
Summary: Implemention of textDocument/hover as described in LSP definition.
This patch adds a basic Hover implementation. When hovering a variable,
function, method or namespace, clangd will return a text containing the
declaration's scope, as well as the declaration of the hovered entity.
For example, for a variable:
Declared in class Foo::Bar
int hello = 2
For macros, the macro definition is returned.
This patch doesn't include:
- markdown support (the client I use doesn't support it yet)
- range support (optional in the Hover response)
- comments associated to variables/functions/classes
They are kept as future work to keep this patch simpler.
I added tests in XRefsTests.cpp. hover.test contains one simple
smoketest to make sure the feature works from a black box perspective.
Reviewers: malaperle, krasimir, bkramer, ilya-biryukov
Subscribers: sammccall, mgrang, klimek, rwols, ilya-biryukov, arphaman, cfe-commits
Differential Revision: https://reviews.llvm.org/D35894
Signed-off-by: Simon Marchi <simon.marchi@ericsson.com>
Signed-off-by: William Enright <william.enright@polymtl.ca>
llvm-svn: 325395
2018-02-17 05:38:15 +08:00
|
|
|
for (const OneTest &Test : Tests) {
|
|
|
|
Annotations T(Test.Input);
|
2018-07-03 00:28:34 +08:00
|
|
|
TestTU TU = TestTU::withCode(T.code());
|
|
|
|
TU.ExtraArgs.push_back("-std=c++17");
|
|
|
|
auto AST = TU.build();
|
2019-07-10 01:59:50 +08:00
|
|
|
if (auto H =
|
|
|
|
getHover(AST, T.point(), format::getLLVMStyle(), Index.get())) {
|
2018-06-04 21:28:17 +08:00
|
|
|
EXPECT_NE("", Test.ExpectedHover) << Test.Input;
|
2019-05-29 18:01:00 +08:00
|
|
|
EXPECT_EQ(H->present().renderForTests(), Test.ExpectedHover.str())
|
|
|
|
<< Test.Input;
|
2018-06-04 18:37:16 +08:00
|
|
|
} else
|
2018-07-03 00:28:34 +08:00
|
|
|
EXPECT_EQ("", Test.ExpectedHover.str()) << Test.Input;
|
[clangd] Implement textDocument/hover
Summary: Implemention of textDocument/hover as described in LSP definition.
This patch adds a basic Hover implementation. When hovering a variable,
function, method or namespace, clangd will return a text containing the
declaration's scope, as well as the declaration of the hovered entity.
For example, for a variable:
Declared in class Foo::Bar
int hello = 2
For macros, the macro definition is returned.
This patch doesn't include:
- markdown support (the client I use doesn't support it yet)
- range support (optional in the Hover response)
- comments associated to variables/functions/classes
They are kept as future work to keep this patch simpler.
I added tests in XRefsTests.cpp. hover.test contains one simple
smoketest to make sure the feature works from a black box perspective.
Reviewers: malaperle, krasimir, bkramer, ilya-biryukov
Subscribers: sammccall, mgrang, klimek, rwols, ilya-biryukov, arphaman, cfe-commits
Differential Revision: https://reviews.llvm.org/D35894
Signed-off-by: Simon Marchi <simon.marchi@ericsson.com>
Signed-off-by: William Enright <william.enright@polymtl.ca>
llvm-svn: 325395
2018-02-17 05:38:15 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-02-21 10:39:08 +08:00
|
|
|
TEST(GoToInclude, All) {
|
|
|
|
MockFSProvider FS;
|
|
|
|
IgnoreDiagnostics DiagConsumer;
|
|
|
|
MockCompilationDatabase CDB;
|
2018-03-06 01:28:54 +08:00
|
|
|
ClangdServer Server(CDB, FS, DiagConsumer, ClangdServer::optsForTest());
|
2018-02-21 10:39:08 +08:00
|
|
|
|
|
|
|
auto FooCpp = testPath("foo.cpp");
|
|
|
|
const char *SourceContents = R"cpp(
|
|
|
|
#include ^"$2^foo.h$3^"
|
|
|
|
#include "$4^invalid.h"
|
|
|
|
int b = a;
|
|
|
|
// test
|
|
|
|
int foo;
|
|
|
|
#in$5^clude "$6^foo.h"$7^
|
|
|
|
)cpp";
|
|
|
|
Annotations SourceAnnotations(SourceContents);
|
|
|
|
FS.Files[FooCpp] = SourceAnnotations.code();
|
|
|
|
auto FooH = testPath("foo.h");
|
|
|
|
|
2018-03-13 00:49:24 +08:00
|
|
|
const char *HeaderContents = R"cpp([[]]#pragma once
|
|
|
|
int a;
|
|
|
|
)cpp";
|
2018-02-21 10:39:08 +08:00
|
|
|
Annotations HeaderAnnotations(HeaderContents);
|
|
|
|
FS.Files[FooH] = HeaderAnnotations.code();
|
|
|
|
|
|
|
|
Server.addDocument(FooH, HeaderAnnotations.code());
|
|
|
|
Server.addDocument(FooCpp, SourceAnnotations.code());
|
|
|
|
|
|
|
|
// Test include in preamble.
|
[clangd] Implement textDocument/declaration from LSP 3.14
Summary:
LSP now reflects the declaration/definition distinction.
Language server changes:
- textDocument/definition now returns a definition if one is found, otherwise
the declaration. It no longer returns declaration + definition if they are
distinct.
- textDocument/declaration returns the best declaration we can find.
- For macros, the active macro definition is returned for both methods.
- For include directive, the top of the target file is returned for both.
There doesn't appear to be a discovery mechanism (we can't return everything to
clients that only know about definition), so this changes existing behavior.
In practice, it should greatly reduce the fraction of the time we need to show
the user a menu of options.
C++ API changes:
- findDefinitions is replaced by locateSymbolAt, which returns a
vector<LocatedSymbol> - one for each symbol under the cursor.
- this contains the preferred declaration, the definition (if found), and
the symbol name
This API enables some potentially-neat extensions, like swapping between decl
and def, and exposing the symbol name to the UI in the case of multiple symbols.
Reviewers: hokein
Subscribers: ilya-biryukov, javed.absar, ioeric, MaskRay, jkorous, arphaman, kadircet, cfe-commits
Differential Revision: https://reviews.llvm.org/D57388
llvm-svn: 352864
2019-02-01 19:26:13 +08:00
|
|
|
auto Locations = runLocateSymbolAt(Server, FooCpp, SourceAnnotations.point());
|
|
|
|
ASSERT_TRUE(bool(Locations)) << "locateSymbolAt returned an error";
|
|
|
|
EXPECT_THAT(*Locations, ElementsAre(Sym("foo.h", HeaderAnnotations.range())));
|
2018-02-21 10:39:08 +08:00
|
|
|
|
|
|
|
// Test include in preamble, last char.
|
[clangd] Implement textDocument/declaration from LSP 3.14
Summary:
LSP now reflects the declaration/definition distinction.
Language server changes:
- textDocument/definition now returns a definition if one is found, otherwise
the declaration. It no longer returns declaration + definition if they are
distinct.
- textDocument/declaration returns the best declaration we can find.
- For macros, the active macro definition is returned for both methods.
- For include directive, the top of the target file is returned for both.
There doesn't appear to be a discovery mechanism (we can't return everything to
clients that only know about definition), so this changes existing behavior.
In practice, it should greatly reduce the fraction of the time we need to show
the user a menu of options.
C++ API changes:
- findDefinitions is replaced by locateSymbolAt, which returns a
vector<LocatedSymbol> - one for each symbol under the cursor.
- this contains the preferred declaration, the definition (if found), and
the symbol name
This API enables some potentially-neat extensions, like swapping between decl
and def, and exposing the symbol name to the UI in the case of multiple symbols.
Reviewers: hokein
Subscribers: ilya-biryukov, javed.absar, ioeric, MaskRay, jkorous, arphaman, kadircet, cfe-commits
Differential Revision: https://reviews.llvm.org/D57388
llvm-svn: 352864
2019-02-01 19:26:13 +08:00
|
|
|
Locations = runLocateSymbolAt(Server, FooCpp, SourceAnnotations.point("2"));
|
|
|
|
ASSERT_TRUE(bool(Locations)) << "locateSymbolAt returned an error";
|
|
|
|
EXPECT_THAT(*Locations, ElementsAre(Sym("foo.h", HeaderAnnotations.range())));
|
2018-02-21 10:39:08 +08:00
|
|
|
|
[clangd] Implement textDocument/declaration from LSP 3.14
Summary:
LSP now reflects the declaration/definition distinction.
Language server changes:
- textDocument/definition now returns a definition if one is found, otherwise
the declaration. It no longer returns declaration + definition if they are
distinct.
- textDocument/declaration returns the best declaration we can find.
- For macros, the active macro definition is returned for both methods.
- For include directive, the top of the target file is returned for both.
There doesn't appear to be a discovery mechanism (we can't return everything to
clients that only know about definition), so this changes existing behavior.
In practice, it should greatly reduce the fraction of the time we need to show
the user a menu of options.
C++ API changes:
- findDefinitions is replaced by locateSymbolAt, which returns a
vector<LocatedSymbol> - one for each symbol under the cursor.
- this contains the preferred declaration, the definition (if found), and
the symbol name
This API enables some potentially-neat extensions, like swapping between decl
and def, and exposing the symbol name to the UI in the case of multiple symbols.
Reviewers: hokein
Subscribers: ilya-biryukov, javed.absar, ioeric, MaskRay, jkorous, arphaman, kadircet, cfe-commits
Differential Revision: https://reviews.llvm.org/D57388
llvm-svn: 352864
2019-02-01 19:26:13 +08:00
|
|
|
Locations = runLocateSymbolAt(Server, FooCpp, SourceAnnotations.point("3"));
|
|
|
|
ASSERT_TRUE(bool(Locations)) << "locateSymbolAt returned an error";
|
|
|
|
EXPECT_THAT(*Locations, ElementsAre(Sym("foo.h", HeaderAnnotations.range())));
|
2018-02-21 10:39:08 +08:00
|
|
|
|
|
|
|
// Test include outside of preamble.
|
[clangd] Implement textDocument/declaration from LSP 3.14
Summary:
LSP now reflects the declaration/definition distinction.
Language server changes:
- textDocument/definition now returns a definition if one is found, otherwise
the declaration. It no longer returns declaration + definition if they are
distinct.
- textDocument/declaration returns the best declaration we can find.
- For macros, the active macro definition is returned for both methods.
- For include directive, the top of the target file is returned for both.
There doesn't appear to be a discovery mechanism (we can't return everything to
clients that only know about definition), so this changes existing behavior.
In practice, it should greatly reduce the fraction of the time we need to show
the user a menu of options.
C++ API changes:
- findDefinitions is replaced by locateSymbolAt, which returns a
vector<LocatedSymbol> - one for each symbol under the cursor.
- this contains the preferred declaration, the definition (if found), and
the symbol name
This API enables some potentially-neat extensions, like swapping between decl
and def, and exposing the symbol name to the UI in the case of multiple symbols.
Reviewers: hokein
Subscribers: ilya-biryukov, javed.absar, ioeric, MaskRay, jkorous, arphaman, kadircet, cfe-commits
Differential Revision: https://reviews.llvm.org/D57388
llvm-svn: 352864
2019-02-01 19:26:13 +08:00
|
|
|
Locations = runLocateSymbolAt(Server, FooCpp, SourceAnnotations.point("6"));
|
|
|
|
ASSERT_TRUE(bool(Locations)) << "locateSymbolAt returned an error";
|
|
|
|
EXPECT_THAT(*Locations, ElementsAre(Sym("foo.h", HeaderAnnotations.range())));
|
2018-02-21 10:39:08 +08:00
|
|
|
|
|
|
|
// Test a few positions that do not result in Locations.
|
[clangd] Implement textDocument/declaration from LSP 3.14
Summary:
LSP now reflects the declaration/definition distinction.
Language server changes:
- textDocument/definition now returns a definition if one is found, otherwise
the declaration. It no longer returns declaration + definition if they are
distinct.
- textDocument/declaration returns the best declaration we can find.
- For macros, the active macro definition is returned for both methods.
- For include directive, the top of the target file is returned for both.
There doesn't appear to be a discovery mechanism (we can't return everything to
clients that only know about definition), so this changes existing behavior.
In practice, it should greatly reduce the fraction of the time we need to show
the user a menu of options.
C++ API changes:
- findDefinitions is replaced by locateSymbolAt, which returns a
vector<LocatedSymbol> - one for each symbol under the cursor.
- this contains the preferred declaration, the definition (if found), and
the symbol name
This API enables some potentially-neat extensions, like swapping between decl
and def, and exposing the symbol name to the UI in the case of multiple symbols.
Reviewers: hokein
Subscribers: ilya-biryukov, javed.absar, ioeric, MaskRay, jkorous, arphaman, kadircet, cfe-commits
Differential Revision: https://reviews.llvm.org/D57388
llvm-svn: 352864
2019-02-01 19:26:13 +08:00
|
|
|
Locations = runLocateSymbolAt(Server, FooCpp, SourceAnnotations.point("4"));
|
|
|
|
ASSERT_TRUE(bool(Locations)) << "locateSymbolAt returned an error";
|
2018-03-13 07:22:35 +08:00
|
|
|
EXPECT_THAT(*Locations, IsEmpty());
|
2018-02-21 10:39:08 +08:00
|
|
|
|
[clangd] Implement textDocument/declaration from LSP 3.14
Summary:
LSP now reflects the declaration/definition distinction.
Language server changes:
- textDocument/definition now returns a definition if one is found, otherwise
the declaration. It no longer returns declaration + definition if they are
distinct.
- textDocument/declaration returns the best declaration we can find.
- For macros, the active macro definition is returned for both methods.
- For include directive, the top of the target file is returned for both.
There doesn't appear to be a discovery mechanism (we can't return everything to
clients that only know about definition), so this changes existing behavior.
In practice, it should greatly reduce the fraction of the time we need to show
the user a menu of options.
C++ API changes:
- findDefinitions is replaced by locateSymbolAt, which returns a
vector<LocatedSymbol> - one for each symbol under the cursor.
- this contains the preferred declaration, the definition (if found), and
the symbol name
This API enables some potentially-neat extensions, like swapping between decl
and def, and exposing the symbol name to the UI in the case of multiple symbols.
Reviewers: hokein
Subscribers: ilya-biryukov, javed.absar, ioeric, MaskRay, jkorous, arphaman, kadircet, cfe-commits
Differential Revision: https://reviews.llvm.org/D57388
llvm-svn: 352864
2019-02-01 19:26:13 +08:00
|
|
|
Locations = runLocateSymbolAt(Server, FooCpp, SourceAnnotations.point("5"));
|
|
|
|
ASSERT_TRUE(bool(Locations)) << "locateSymbolAt returned an error";
|
|
|
|
EXPECT_THAT(*Locations, ElementsAre(Sym("foo.h", HeaderAnnotations.range())));
|
2018-02-21 10:39:08 +08:00
|
|
|
|
[clangd] Implement textDocument/declaration from LSP 3.14
Summary:
LSP now reflects the declaration/definition distinction.
Language server changes:
- textDocument/definition now returns a definition if one is found, otherwise
the declaration. It no longer returns declaration + definition if they are
distinct.
- textDocument/declaration returns the best declaration we can find.
- For macros, the active macro definition is returned for both methods.
- For include directive, the top of the target file is returned for both.
There doesn't appear to be a discovery mechanism (we can't return everything to
clients that only know about definition), so this changes existing behavior.
In practice, it should greatly reduce the fraction of the time we need to show
the user a menu of options.
C++ API changes:
- findDefinitions is replaced by locateSymbolAt, which returns a
vector<LocatedSymbol> - one for each symbol under the cursor.
- this contains the preferred declaration, the definition (if found), and
the symbol name
This API enables some potentially-neat extensions, like swapping between decl
and def, and exposing the symbol name to the UI in the case of multiple symbols.
Reviewers: hokein
Subscribers: ilya-biryukov, javed.absar, ioeric, MaskRay, jkorous, arphaman, kadircet, cfe-commits
Differential Revision: https://reviews.llvm.org/D57388
llvm-svn: 352864
2019-02-01 19:26:13 +08:00
|
|
|
Locations = runLocateSymbolAt(Server, FooCpp, SourceAnnotations.point("7"));
|
|
|
|
ASSERT_TRUE(bool(Locations)) << "locateSymbolAt returned an error";
|
2019-04-04 21:09:02 +08:00
|
|
|
EXPECT_THAT(*Locations, ElementsAre(Sym("foo.h", HeaderAnnotations.range())));
|
|
|
|
|
|
|
|
// Objective C #import directive.
|
|
|
|
Annotations ObjC(R"objc(
|
|
|
|
#import "^foo.h"
|
|
|
|
)objc");
|
|
|
|
auto FooM = testPath("foo.m");
|
|
|
|
FS.Files[FooM] = ObjC.code();
|
|
|
|
|
|
|
|
Server.addDocument(FooM, ObjC.code());
|
|
|
|
Locations = runLocateSymbolAt(Server, FooM, ObjC.point());
|
|
|
|
ASSERT_TRUE(bool(Locations)) << "locateSymbolAt returned an error";
|
[clangd] Implement textDocument/declaration from LSP 3.14
Summary:
LSP now reflects the declaration/definition distinction.
Language server changes:
- textDocument/definition now returns a definition if one is found, otherwise
the declaration. It no longer returns declaration + definition if they are
distinct.
- textDocument/declaration returns the best declaration we can find.
- For macros, the active macro definition is returned for both methods.
- For include directive, the top of the target file is returned for both.
There doesn't appear to be a discovery mechanism (we can't return everything to
clients that only know about definition), so this changes existing behavior.
In practice, it should greatly reduce the fraction of the time we need to show
the user a menu of options.
C++ API changes:
- findDefinitions is replaced by locateSymbolAt, which returns a
vector<LocatedSymbol> - one for each symbol under the cursor.
- this contains the preferred declaration, the definition (if found), and
the symbol name
This API enables some potentially-neat extensions, like swapping between decl
and def, and exposing the symbol name to the UI in the case of multiple symbols.
Reviewers: hokein
Subscribers: ilya-biryukov, javed.absar, ioeric, MaskRay, jkorous, arphaman, kadircet, cfe-commits
Differential Revision: https://reviews.llvm.org/D57388
llvm-svn: 352864
2019-02-01 19:26:13 +08:00
|
|
|
EXPECT_THAT(*Locations, ElementsAre(Sym("foo.h", HeaderAnnotations.range())));
|
2018-02-21 10:39:08 +08:00
|
|
|
}
|
|
|
|
|
[clangd] Implement textDocument/declaration from LSP 3.14
Summary:
LSP now reflects the declaration/definition distinction.
Language server changes:
- textDocument/definition now returns a definition if one is found, otherwise
the declaration. It no longer returns declaration + definition if they are
distinct.
- textDocument/declaration returns the best declaration we can find.
- For macros, the active macro definition is returned for both methods.
- For include directive, the top of the target file is returned for both.
There doesn't appear to be a discovery mechanism (we can't return everything to
clients that only know about definition), so this changes existing behavior.
In practice, it should greatly reduce the fraction of the time we need to show
the user a menu of options.
C++ API changes:
- findDefinitions is replaced by locateSymbolAt, which returns a
vector<LocatedSymbol> - one for each symbol under the cursor.
- this contains the preferred declaration, the definition (if found), and
the symbol name
This API enables some potentially-neat extensions, like swapping between decl
and def, and exposing the symbol name to the UI in the case of multiple symbols.
Reviewers: hokein
Subscribers: ilya-biryukov, javed.absar, ioeric, MaskRay, jkorous, arphaman, kadircet, cfe-commits
Differential Revision: https://reviews.llvm.org/D57388
llvm-svn: 352864
2019-02-01 19:26:13 +08:00
|
|
|
TEST(LocateSymbol, WithPreamble) {
|
2018-08-17 16:15:22 +08:00
|
|
|
// Test stragety: AST should always use the latest preamble instead of last
|
|
|
|
// good preamble.
|
|
|
|
MockFSProvider FS;
|
|
|
|
IgnoreDiagnostics DiagConsumer;
|
|
|
|
MockCompilationDatabase CDB;
|
|
|
|
ClangdServer Server(CDB, FS, DiagConsumer, ClangdServer::optsForTest());
|
|
|
|
|
|
|
|
auto FooCpp = testPath("foo.cpp");
|
|
|
|
// The trigger locations must be the same.
|
|
|
|
Annotations FooWithHeader(R"cpp(#include "fo^o.h")cpp");
|
|
|
|
Annotations FooWithoutHeader(R"cpp(double [[fo^o]]();)cpp");
|
|
|
|
|
|
|
|
FS.Files[FooCpp] = FooWithHeader.code();
|
|
|
|
|
|
|
|
auto FooH = testPath("foo.h");
|
|
|
|
Annotations FooHeader(R"cpp([[]])cpp");
|
|
|
|
FS.Files[FooH] = FooHeader.code();
|
|
|
|
|
|
|
|
runAddDocument(Server, FooCpp, FooWithHeader.code());
|
[clangd] Implement textDocument/declaration from LSP 3.14
Summary:
LSP now reflects the declaration/definition distinction.
Language server changes:
- textDocument/definition now returns a definition if one is found, otherwise
the declaration. It no longer returns declaration + definition if they are
distinct.
- textDocument/declaration returns the best declaration we can find.
- For macros, the active macro definition is returned for both methods.
- For include directive, the top of the target file is returned for both.
There doesn't appear to be a discovery mechanism (we can't return everything to
clients that only know about definition), so this changes existing behavior.
In practice, it should greatly reduce the fraction of the time we need to show
the user a menu of options.
C++ API changes:
- findDefinitions is replaced by locateSymbolAt, which returns a
vector<LocatedSymbol> - one for each symbol under the cursor.
- this contains the preferred declaration, the definition (if found), and
the symbol name
This API enables some potentially-neat extensions, like swapping between decl
and def, and exposing the symbol name to the UI in the case of multiple symbols.
Reviewers: hokein
Subscribers: ilya-biryukov, javed.absar, ioeric, MaskRay, jkorous, arphaman, kadircet, cfe-commits
Differential Revision: https://reviews.llvm.org/D57388
llvm-svn: 352864
2019-02-01 19:26:13 +08:00
|
|
|
// LocateSymbol goes to a #include file: the result comes from the preamble.
|
2018-08-17 16:15:22 +08:00
|
|
|
EXPECT_THAT(
|
[clangd] Implement textDocument/declaration from LSP 3.14
Summary:
LSP now reflects the declaration/definition distinction.
Language server changes:
- textDocument/definition now returns a definition if one is found, otherwise
the declaration. It no longer returns declaration + definition if they are
distinct.
- textDocument/declaration returns the best declaration we can find.
- For macros, the active macro definition is returned for both methods.
- For include directive, the top of the target file is returned for both.
There doesn't appear to be a discovery mechanism (we can't return everything to
clients that only know about definition), so this changes existing behavior.
In practice, it should greatly reduce the fraction of the time we need to show
the user a menu of options.
C++ API changes:
- findDefinitions is replaced by locateSymbolAt, which returns a
vector<LocatedSymbol> - one for each symbol under the cursor.
- this contains the preferred declaration, the definition (if found), and
the symbol name
This API enables some potentially-neat extensions, like swapping between decl
and def, and exposing the symbol name to the UI in the case of multiple symbols.
Reviewers: hokein
Subscribers: ilya-biryukov, javed.absar, ioeric, MaskRay, jkorous, arphaman, kadircet, cfe-commits
Differential Revision: https://reviews.llvm.org/D57388
llvm-svn: 352864
2019-02-01 19:26:13 +08:00
|
|
|
cantFail(runLocateSymbolAt(Server, FooCpp, FooWithHeader.point())),
|
|
|
|
ElementsAre(Sym("foo.h", FooHeader.range())));
|
2018-08-17 16:15:22 +08:00
|
|
|
|
|
|
|
// Only preamble is built, and no AST is built in this request.
|
|
|
|
Server.addDocument(FooCpp, FooWithoutHeader.code(), WantDiagnostics::No);
|
|
|
|
// We build AST here, and it should use the latest preamble rather than the
|
|
|
|
// stale one.
|
|
|
|
EXPECT_THAT(
|
[clangd] Implement textDocument/declaration from LSP 3.14
Summary:
LSP now reflects the declaration/definition distinction.
Language server changes:
- textDocument/definition now returns a definition if one is found, otherwise
the declaration. It no longer returns declaration + definition if they are
distinct.
- textDocument/declaration returns the best declaration we can find.
- For macros, the active macro definition is returned for both methods.
- For include directive, the top of the target file is returned for both.
There doesn't appear to be a discovery mechanism (we can't return everything to
clients that only know about definition), so this changes existing behavior.
In practice, it should greatly reduce the fraction of the time we need to show
the user a menu of options.
C++ API changes:
- findDefinitions is replaced by locateSymbolAt, which returns a
vector<LocatedSymbol> - one for each symbol under the cursor.
- this contains the preferred declaration, the definition (if found), and
the symbol name
This API enables some potentially-neat extensions, like swapping between decl
and def, and exposing the symbol name to the UI in the case of multiple symbols.
Reviewers: hokein
Subscribers: ilya-biryukov, javed.absar, ioeric, MaskRay, jkorous, arphaman, kadircet, cfe-commits
Differential Revision: https://reviews.llvm.org/D57388
llvm-svn: 352864
2019-02-01 19:26:13 +08:00
|
|
|
cantFail(runLocateSymbolAt(Server, FooCpp, FooWithoutHeader.point())),
|
|
|
|
ElementsAre(Sym("foo", FooWithoutHeader.range())));
|
2018-08-17 16:15:22 +08:00
|
|
|
|
|
|
|
// Reset test environment.
|
|
|
|
runAddDocument(Server, FooCpp, FooWithHeader.code());
|
|
|
|
// Both preamble and AST are built in this request.
|
|
|
|
Server.addDocument(FooCpp, FooWithoutHeader.code(), WantDiagnostics::Yes);
|
|
|
|
// Use the AST being built in above request.
|
|
|
|
EXPECT_THAT(
|
[clangd] Implement textDocument/declaration from LSP 3.14
Summary:
LSP now reflects the declaration/definition distinction.
Language server changes:
- textDocument/definition now returns a definition if one is found, otherwise
the declaration. It no longer returns declaration + definition if they are
distinct.
- textDocument/declaration returns the best declaration we can find.
- For macros, the active macro definition is returned for both methods.
- For include directive, the top of the target file is returned for both.
There doesn't appear to be a discovery mechanism (we can't return everything to
clients that only know about definition), so this changes existing behavior.
In practice, it should greatly reduce the fraction of the time we need to show
the user a menu of options.
C++ API changes:
- findDefinitions is replaced by locateSymbolAt, which returns a
vector<LocatedSymbol> - one for each symbol under the cursor.
- this contains the preferred declaration, the definition (if found), and
the symbol name
This API enables some potentially-neat extensions, like swapping between decl
and def, and exposing the symbol name to the UI in the case of multiple symbols.
Reviewers: hokein
Subscribers: ilya-biryukov, javed.absar, ioeric, MaskRay, jkorous, arphaman, kadircet, cfe-commits
Differential Revision: https://reviews.llvm.org/D57388
llvm-svn: 352864
2019-02-01 19:26:13 +08:00
|
|
|
cantFail(runLocateSymbolAt(Server, FooCpp, FooWithoutHeader.point())),
|
|
|
|
ElementsAre(Sym("foo", FooWithoutHeader.range())));
|
2018-08-17 16:15:22 +08:00
|
|
|
}
|
|
|
|
|
2018-09-05 18:33:36 +08:00
|
|
|
TEST(FindReferences, WithinAST) {
|
|
|
|
const char *Tests[] = {
|
|
|
|
R"cpp(// Local variable
|
|
|
|
int main() {
|
2018-10-04 17:56:08 +08:00
|
|
|
int [[foo]];
|
|
|
|
[[^foo]] = 2;
|
|
|
|
int test1 = [[foo]];
|
2018-09-05 18:33:36 +08:00
|
|
|
}
|
|
|
|
)cpp",
|
|
|
|
|
|
|
|
R"cpp(// Struct
|
|
|
|
namespace ns1 {
|
2018-10-04 17:56:08 +08:00
|
|
|
struct [[Foo]] {};
|
2018-09-05 18:33:36 +08:00
|
|
|
} // namespace ns1
|
|
|
|
int main() {
|
2018-10-04 17:56:08 +08:00
|
|
|
ns1::[[Fo^o]]* Params;
|
|
|
|
}
|
|
|
|
)cpp",
|
|
|
|
|
|
|
|
R"cpp(// Forward declaration
|
|
|
|
class [[Foo]];
|
|
|
|
class [[Foo]] {}
|
|
|
|
int main() {
|
|
|
|
[[Fo^o]] foo;
|
2018-09-05 18:33:36 +08:00
|
|
|
}
|
|
|
|
)cpp",
|
|
|
|
|
|
|
|
R"cpp(// Function
|
2018-10-04 17:56:08 +08:00
|
|
|
int [[foo]](int) {}
|
2018-09-05 18:33:36 +08:00
|
|
|
int main() {
|
2018-10-04 17:56:08 +08:00
|
|
|
auto *X = &[[^foo]];
|
|
|
|
[[foo]](42)
|
2018-09-05 18:33:36 +08:00
|
|
|
}
|
|
|
|
)cpp",
|
|
|
|
|
|
|
|
R"cpp(// Field
|
|
|
|
struct Foo {
|
2018-10-04 17:56:08 +08:00
|
|
|
int [[foo]];
|
|
|
|
Foo() : [[foo]](0) {}
|
2018-09-05 18:33:36 +08:00
|
|
|
};
|
|
|
|
int main() {
|
|
|
|
Foo f;
|
2018-10-04 17:56:08 +08:00
|
|
|
f.[[f^oo]] = 1;
|
2018-09-05 18:33:36 +08:00
|
|
|
}
|
|
|
|
)cpp",
|
|
|
|
|
|
|
|
R"cpp(// Method call
|
|
|
|
struct Foo { int [[foo]](); };
|
|
|
|
int Foo::[[foo]]() {}
|
|
|
|
int main() {
|
|
|
|
Foo f;
|
2018-10-04 17:56:08 +08:00
|
|
|
f.[[^foo]]();
|
2018-09-05 18:33:36 +08:00
|
|
|
}
|
|
|
|
)cpp",
|
2019-03-08 17:54:37 +08:00
|
|
|
|
|
|
|
R"cpp(// Constructor
|
|
|
|
struct Foo {
|
|
|
|
[[F^oo]](int);
|
|
|
|
};
|
|
|
|
void foo() {
|
|
|
|
Foo f = [[Foo]](42);
|
|
|
|
}
|
|
|
|
)cpp",
|
2018-09-05 18:33:36 +08:00
|
|
|
|
|
|
|
R"cpp(// Typedef
|
2018-10-04 17:56:08 +08:00
|
|
|
typedef int [[Foo]];
|
2018-09-05 18:33:36 +08:00
|
|
|
int main() {
|
2018-10-04 17:56:08 +08:00
|
|
|
[[^Foo]] bar;
|
2018-09-05 18:33:36 +08:00
|
|
|
}
|
|
|
|
)cpp",
|
|
|
|
|
|
|
|
R"cpp(// Namespace
|
2018-10-04 17:56:08 +08:00
|
|
|
namespace [[ns]] {
|
2018-09-05 18:33:36 +08:00
|
|
|
struct Foo {};
|
|
|
|
} // namespace ns
|
2018-10-04 17:56:08 +08:00
|
|
|
int main() { [[^ns]]::Foo foo; }
|
2018-09-05 18:33:36 +08:00
|
|
|
)cpp",
|
|
|
|
};
|
|
|
|
for (const char *Test : Tests) {
|
|
|
|
Annotations T(Test);
|
|
|
|
auto AST = TestTU::withCode(T.code()).build();
|
|
|
|
std::vector<Matcher<Location>> ExpectedLocations;
|
2018-10-04 17:56:08 +08:00
|
|
|
for (const auto &R : T.ranges())
|
2018-09-05 18:33:36 +08:00
|
|
|
ExpectedLocations.push_back(RangeIs(R));
|
2019-01-15 02:11:09 +08:00
|
|
|
EXPECT_THAT(findReferences(AST, T.point(), 0),
|
2018-09-05 18:33:36 +08:00
|
|
|
ElementsAreArray(ExpectedLocations))
|
|
|
|
<< Test;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-12-13 21:17:04 +08:00
|
|
|
TEST(FindReferences, ExplicitSymbols) {
|
|
|
|
const char *Tests[] = {
|
|
|
|
R"cpp(
|
|
|
|
struct Foo { Foo* [self]() const; };
|
|
|
|
void f() {
|
|
|
|
if (Foo* T = foo.[^self]()) {} // Foo member call expr.
|
|
|
|
}
|
|
|
|
)cpp",
|
|
|
|
|
|
|
|
R"cpp(
|
|
|
|
struct Foo { Foo(int); };
|
|
|
|
Foo f() {
|
|
|
|
int [b];
|
|
|
|
return [^b]; // Foo constructor expr.
|
|
|
|
}
|
|
|
|
)cpp",
|
|
|
|
|
|
|
|
R"cpp(
|
|
|
|
struct Foo {};
|
|
|
|
void g(Foo);
|
|
|
|
Foo [f]();
|
|
|
|
void call() {
|
|
|
|
g([^f]()); // Foo constructor expr.
|
|
|
|
}
|
|
|
|
)cpp",
|
|
|
|
|
|
|
|
R"cpp(
|
|
|
|
void [foo](int);
|
|
|
|
void [foo](double);
|
|
|
|
|
|
|
|
namespace ns {
|
|
|
|
using ::[fo^o];
|
|
|
|
}
|
|
|
|
)cpp",
|
|
|
|
};
|
|
|
|
for (const char *Test : Tests) {
|
|
|
|
Annotations T(Test);
|
|
|
|
auto AST = TestTU::withCode(T.code()).build();
|
|
|
|
std::vector<Matcher<Location>> ExpectedLocations;
|
|
|
|
for (const auto &R : T.ranges())
|
|
|
|
ExpectedLocations.push_back(RangeIs(R));
|
2019-01-15 02:11:09 +08:00
|
|
|
EXPECT_THAT(findReferences(AST, T.point(), 0),
|
2018-12-13 21:17:04 +08:00
|
|
|
ElementsAreArray(ExpectedLocations))
|
|
|
|
<< Test;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-09-05 18:33:36 +08:00
|
|
|
TEST(FindReferences, NeedsIndex) {
|
|
|
|
const char *Header = "int foo();";
|
|
|
|
Annotations Main("int main() { [[f^oo]](); }");
|
|
|
|
TestTU TU;
|
|
|
|
TU.Code = Main.code();
|
|
|
|
TU.HeaderCode = Header;
|
|
|
|
auto AST = TU.build();
|
|
|
|
|
|
|
|
// References in main file are returned without index.
|
2019-01-15 02:11:09 +08:00
|
|
|
EXPECT_THAT(findReferences(AST, Main.point(), 0, /*Index=*/nullptr),
|
2018-09-05 18:33:36 +08:00
|
|
|
ElementsAre(RangeIs(Main.range())));
|
|
|
|
Annotations IndexedMain(R"cpp(
|
|
|
|
int main() { [[f^oo]](); }
|
|
|
|
)cpp");
|
|
|
|
|
|
|
|
// References from indexed files are included.
|
|
|
|
TestTU IndexedTU;
|
|
|
|
IndexedTU.Code = IndexedMain.code();
|
|
|
|
IndexedTU.Filename = "Indexed.cpp";
|
|
|
|
IndexedTU.HeaderCode = Header;
|
2019-01-15 02:11:09 +08:00
|
|
|
EXPECT_THAT(findReferences(AST, Main.point(), 0, IndexedTU.index().get()),
|
2018-09-05 18:33:36 +08:00
|
|
|
ElementsAre(RangeIs(Main.range()), RangeIs(IndexedMain.range())));
|
|
|
|
|
2019-01-15 02:11:09 +08:00
|
|
|
EXPECT_EQ(1u, findReferences(AST, Main.point(), /*Limit*/ 1,
|
|
|
|
IndexedTU.index().get())
|
|
|
|
.size());
|
|
|
|
|
2018-09-05 18:33:36 +08:00
|
|
|
// If the main file is in the index, we don't return duplicates.
|
|
|
|
// (even if the references are in a different location)
|
|
|
|
TU.Code = ("\n\n" + Main.code()).str();
|
2019-01-15 02:11:09 +08:00
|
|
|
EXPECT_THAT(findReferences(AST, Main.point(), 0, TU.index().get()),
|
2018-09-05 18:33:36 +08:00
|
|
|
ElementsAre(RangeIs(Main.range())));
|
2018-09-11 21:01:49 +08:00
|
|
|
}
|
2018-09-05 18:33:36 +08:00
|
|
|
|
|
|
|
TEST(FindReferences, NoQueryForLocalSymbols) {
|
|
|
|
struct RecordingIndex : public MemIndex {
|
2019-01-07 23:45:19 +08:00
|
|
|
mutable Optional<llvm::DenseSet<SymbolID>> RefIDs;
|
2018-09-05 18:33:36 +08:00
|
|
|
void refs(const RefsRequest &Req,
|
2019-01-07 23:45:19 +08:00
|
|
|
llvm::function_ref<void(const Ref &)>) const override {
|
2018-09-05 18:33:36 +08:00
|
|
|
RefIDs = Req.IDs;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
struct Test {
|
|
|
|
StringRef AnnotatedCode;
|
|
|
|
bool WantQuery;
|
|
|
|
} Tests[] = {
|
|
|
|
{"int ^x;", true},
|
|
|
|
// For now we don't assume header structure which would allow skipping.
|
|
|
|
{"namespace { int ^x; }", true},
|
|
|
|
{"static int ^x;", true},
|
|
|
|
// Anything in a function certainly can't be referenced though.
|
|
|
|
{"void foo() { int ^x; }", false},
|
|
|
|
{"void foo() { struct ^x{}; }", false},
|
|
|
|
{"auto lambda = []{ int ^x; };", false},
|
|
|
|
};
|
|
|
|
for (Test T : Tests) {
|
|
|
|
Annotations File(T.AnnotatedCode);
|
|
|
|
RecordingIndex Rec;
|
|
|
|
auto AST = TestTU::withCode(File.code()).build();
|
2019-01-15 02:11:09 +08:00
|
|
|
findReferences(AST, File.point(), 0, &Rec);
|
2018-09-05 18:33:36 +08:00
|
|
|
if (T.WantQuery)
|
2018-10-20 23:30:37 +08:00
|
|
|
EXPECT_NE(Rec.RefIDs, None) << T.AnnotatedCode;
|
2018-09-05 18:33:36 +08:00
|
|
|
else
|
2018-10-20 23:30:37 +08:00
|
|
|
EXPECT_EQ(Rec.RefIDs, None) << T.AnnotatedCode;
|
2018-09-05 18:33:36 +08:00
|
|
|
}
|
2018-09-11 21:01:49 +08:00
|
|
|
}
|
2018-09-05 18:33:36 +08:00
|
|
|
|
2019-07-12 00:04:18 +08:00
|
|
|
TEST(GetDeducedType, KwAutoExpansion) {
|
|
|
|
struct Test {
|
|
|
|
StringRef AnnotatedCode;
|
|
|
|
const char *DeducedType;
|
|
|
|
} Tests[] = {
|
|
|
|
{"^auto i = 0;", "int"},
|
|
|
|
{"^auto f(){ return 1;};", "int"}
|
|
|
|
};
|
|
|
|
for (Test T : Tests) {
|
|
|
|
Annotations File(T.AnnotatedCode);
|
|
|
|
auto AST = TestTU::withCode(File.code()).build();
|
2019-07-12 00:22:50 +08:00
|
|
|
ASSERT_TRUE(AST.getDiagnostics().empty())
|
|
|
|
<< AST.getDiagnostics().begin()->Message;
|
2019-07-12 00:04:18 +08:00
|
|
|
SourceManagerForFile SM("foo.cpp", File.code());
|
|
|
|
|
|
|
|
for (Position Pos : File.points()) {
|
|
|
|
auto Location = sourceLocationInMainFile(SM.get(), Pos);
|
2019-07-12 00:22:50 +08:00
|
|
|
ASSERT_TRUE(!!Location) << llvm::toString(Location.takeError());
|
2019-07-12 00:04:18 +08:00
|
|
|
auto DeducedType = getDeducedType(AST, *Location);
|
|
|
|
EXPECT_EQ(DeducedType->getAsString(), T.DeducedType);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-12-21 00:06:05 +08:00
|
|
|
} // namespace
|
|
|
|
} // namespace clangd
|
|
|
|
} // namespace clang
|