nixd
Toggle main menu visibility
Loading...
Searching...
No Matches
nixd
lib
Controller
FindReferences.cpp
Go to the documentation of this file.
1
/// \file
2
/// \brief This implements [Find References].
3
/// [Find References]:
4
/// https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#textDocument_references
5
6
#include "
CheckReturn.h
"
7
#include "
Convert.h
"
8
#include "
Definition.h
"
9
10
#include "
nixd/Controller/Controller.h
"
11
12
#include <boost/asio/post.hpp>
13
#include <
lspserver/Protocol.h
>
14
#include <
nixf/Sema/ParentMap.h
>
15
#include <
nixf/Sema/VariableLookup.h
>
16
17
using namespace
lspserver
;
18
using namespace
nixd
;
19
using namespace
llvm
;
20
using namespace
nixf
;
21
22
namespace
{
23
24
std::vector<Location> findReferences(
const
nixf::Node
&Desc,
25
const
ParentMapAnalysis
&PMA,
26
const
VariableLookupAnalysis
&VLA,
27
const
URIForFile
&
URI
,
28
llvm::StringRef Src) {
29
30
// Two steps.
31
// 1. Find some "definition" for this node.
32
// 2. Find all "uses", and construct the vector.
33
34
// Find "definition"
35
auto
Def =
findDefinition
(Desc, PMA, VLA);
36
std::vector<Location>
Locations
;
37
// OK, iterate all uses.
38
for
(
const
auto
*Use : Def.uses()) {
39
assert(Use);
40
Locations
.emplace_back(
Location
{
41
.uri =
URI
,
42
.range =
toLSPRange
(Src, Use->range()),
43
});
44
}
45
return
Locations
;
46
}
47
48
}
// namespace
49
50
void
Controller::onReferences(
const
TextDocumentPositionParams
&Params,
51
Callback
<std::vector<Location>> Reply) {
52
using
CheckTy = std::vector<Location>;
53
auto
Action = [Reply = std::move(Reply), URI = Params.
textDocument
.
uri
,
54
Pos =
toNixfPosition
(Params.
position
),
this
]()
mutable
{
55
std::string
File
(URI.
file
());
56
return
Reply([&]() -> llvm::Expected<CheckTy> {
57
const
auto
TU =
CheckDefault
(getTU(
File
));
58
const
auto
AST =
CheckDefault
(getAST(*TU));
59
const
auto
&Desc =
CheckDefault
(AST->descend({Pos, Pos}));
60
const
auto
&PM = *TU->parentMap();
61
const
auto
&VLA = *TU->variableLookup();
62
try
{
63
return
findReferences(*Desc, PM, VLA, URI, TU->src());
64
}
catch
(std::exception &E) {
65
return
error
(
"references: {0}"
, E.what());
66
}
67
}());
68
};
69
boost::asio::post(Pool, std::move(Action));
70
}
CheckReturn.h
CheckDefault
#define CheckDefault(x)
Variant of CheckReturn, but returns default constructed CheckTy.
Definition
CheckReturn.h:16
Controller.h
Convert.h
Convert between LSP and nixf types.
Locations
std::vector< Location > Locations
Definition
Definition.cpp:40
Definition.h
ParentMap.h
ParentMap analysis.
VariableLookup.h
Lookup variable names, from it's parent scope.
lspserver::URI
Definition
URI.h:18
nixf::Node
Definition
Basic.h:12
nixf::ParentMapAnalysis
Definition
ParentMap.h:15
nixf::VariableLookupAnalysis
Definition
VariableLookup.h:112
Protocol.h
llvm
Definition
lspserver/include/lspserver/Protocol.h:2034
lspserver
Whether current platform treats paths case insensitively.
Definition
Connection.h:11
lspserver::Callback
llvm::unique_function< void(llvm::Expected< T >)> Callback
Definition
Function.h:14
lspserver::error
llvm::Error error(std::error_code EC, const char *Fmt, Ts &&...Vals)
Definition
Logger.h:70
lspserver::CompletionItemKind::File
@ File
Definition
lspserver/include/lspserver/Protocol.h:413
nixd
Definition
CommandLine/Configuration.h:9
nixd::toNixfPosition
nixf::Position toNixfPosition(const lspserver::Position &P)
Definition
Convert.cpp:32
nixd::findDefinition
const nixf::Definition & findDefinition(const nixf::Node &N, const nixf::ParentMapAnalysis &PMA, const nixf::VariableLookupAnalysis &VLA)
Heuristically find definition on some node.
Definition
Definition.cpp:366
nixd::toLSPRange
lspserver::Range toLSPRange(llvm::StringRef Code, const nixf::LexerCursorRange &R)
Definition
Convert.cpp:40
nixf
Definition
Diagnostic.h:19
lspserver::Location
Definition
lspserver/include/lspserver/Protocol.h:193
lspserver::TextDocumentIdentifier::uri
URIForFile uri
The text document's URI.
Definition
lspserver/include/lspserver/Protocol.h:106
lspserver::TextDocumentPositionParams
Definition
lspserver/include/lspserver/Protocol.h:1279
lspserver::TextDocumentPositionParams::position
Position position
The position inside the text document.
Definition
lspserver/include/lspserver/Protocol.h:1284
lspserver::TextDocumentPositionParams::textDocument
TextDocumentIdentifier textDocument
The text document.
Definition
lspserver/include/lspserver/Protocol.h:1281
lspserver::URIForFile
Definition
lspserver/include/lspserver/Protocol.h:57
lspserver::URIForFile::file
llvm::StringRef file() const
Retrieves absolute path to the file.
Definition
lspserver/include/lspserver/Protocol.h:77
Generated by
1.17.0