22#include <boost/asio/post.hpp>
23#include <llvm/Support/JSON.h>
27using namespace llvm::json;
28using namespace lspserver;
31 Callback<std::vector<CodeAction>> Reply) {
32 using CheckTy = std::vector<CodeAction>;
34 Range Range = Params.
range;
35 auto Action = [Reply = std::move(Reply),
File, Range,
this]()
mutable {
36 return Reply([&]() -> llvm::Expected<CheckTy> {
39 const auto &Diagnostics = TU->diagnostics();
40 auto Actions = std::vector<CodeAction>();
41 Actions.reserve(Diagnostics.size());
44 for (
const nixf::Diagnostic &D : Diagnostics) {
45 auto DRange =
toLSPRange(TU->src(), D.range());
50 for (
const nixf::Fix &F : D.fixes()) {
51 std::vector<TextEdit> Edits;
52 Edits.reserve(F.edits().size());
53 for (
const nixf::TextEdit &TE : F.edits()) {
54 Edits.emplace_back(TextEdit{
56 .newText = std::string(TE.newText()),
59 using Changes = std::map<std::string, std::vector<TextEdit>>;
60 WorkspaceEdit WE{.changes = Changes{
61 {FileURI, std::move(Edits)},
63 Actions.emplace_back(CodeAction{
66 .edit = std::move(WE),
72 if (TU->ast() && TU->parentMap()) {
74 if (
const nixf::Node *N = TU->ast()->descend(NixfRange)) {
88 if (TU->variableLookup()) {
90 FileURI, TU->src(), Actions);
93 if (TU->variableLookup()) {
95 FileURI, TU->src(), Actions);
106 boost::asio::post(Pool, std::move(Action));
111 auto Action = [Reply = std::move(Reply), Params,
this]()
mutable {
114 const auto *DataObj = Params.
data->getAsObject();
116 auto NoogleUrl = DataObj->getString(
"noogleUrl");
119 ShowDocumentParams ShowParams;
124 ShowParams, [](llvm::Expected<ShowDocumentResult> Result) {
138 boost::asio::post(Pool, std::move(Action));
Code action for quoting/unquoting attribute names.
#define CheckDefault(x)
Variant of CheckReturn, but returns default constructed CheckTy.
Code action for converting bindings to inherit syntax.
Convert between LSP and nixf types.
Code action for flattening nested attribute sets.
Code action for converting inherit to explicit binding.
Code action for converting JSON to Nix expressions.
Code action for opening noogle.dev documentation.
Code action for packing dotted attribute paths into nested sets.
Code action for converting between string literal syntaxes.
Code action for converting with expressions to let/inherit.
llvm::unique_function< void(llvm::Expected< T >)> Callback
void elog(const char *Fmt, Ts &&...Vals)
void addJsonToNixAction(llvm::StringRef Src, const lspserver::Range &Range, const std::string &FileURI, std::vector< lspserver::CodeAction > &Actions)
Add JSON to Nix conversion action for selected JSON text.
void addRewriteStringAction(const nixf::Node &N, const nixf::ParentMapAnalysis &PM, const std::string &FileURI, llvm::StringRef Src, std::vector< lspserver::CodeAction > &Actions)
Add rewrite action for string literal syntax conversion.
nixf::PositionRange toNixfRange(const lspserver::Range &P)
void addPackAttrsAction(const nixf::Node &N, const nixf::ParentMapAnalysis &PM, const std::string &FileURI, llvm::StringRef Src, std::vector< lspserver::CodeAction > &Actions)
Add pack action for dotted attribute paths.
void addConvertToInheritAction(const nixf::Node &N, const nixf::ParentMapAnalysis &PM, const std::string &FileURI, llvm::StringRef Src, std::vector< lspserver::CodeAction > &Actions)
Add code action to convert binding to inherit syntax.
void addWithToLetAction(const nixf::Node &N, const nixf::ParentMapAnalysis &PM, const nixf::VariableLookupAnalysis &VLA, const std::string &FileURI, llvm::StringRef Src, std::vector< lspserver::CodeAction > &Actions)
Add code action to convert with expression to let/inherit.
void addFlattenAttrsAction(const nixf::Node &N, const nixf::ParentMapAnalysis &PM, const std::string &FileURI, llvm::StringRef Src, std::vector< lspserver::CodeAction > &Actions)
Add flatten action for nested attribute sets.
void addInheritToBindingAction(const nixf::Node &N, const nixf::ParentMapAnalysis &PM, const std::string &FileURI, llvm::StringRef Src, std::vector< lspserver::CodeAction > &Actions)
Add code action to convert inherit to explicit binding.
void addExtractToFileAction(const nixf::Node &N, const nixf::ParentMapAnalysis &PM, const nixf::VariableLookupAnalysis &VLA, const std::string &FileURI, llvm::StringRef Src, std::vector< lspserver::CodeAction > &Actions)
Add extract-to-file action for selected expressions.
void addAttrNameActions(const nixf::Node &N, const nixf::ParentMapAnalysis &PM, const std::string &FileURI, llvm::StringRef Src, std::vector< lspserver::CodeAction > &Actions)
Add refactoring code actions for attribute names (quote/unquote).
lspserver::Range toLSPRange(llvm::StringRef Code, const nixf::LexerCursorRange &R)
void addNoogleDocAction(const nixf::Node &N, const nixf::ParentMapAnalysis &PM, std::vector< lspserver::CodeAction > &Actions)
Add a code action to open noogle.dev documentation for lib.* functions.
Range range
The range for which the command was invoked.
TextDocumentIdentifier textDocument
The document in which the command was invoked.
std::optional< llvm::json::Value > data
static const llvm::StringLiteral QUICKFIX_KIND
bool overlap(const Range &RHS) const
std::optional< std::string > externalUri
std::optional< bool > external
URIForFile uri
The text document's URI.
static URIForFile canonicalize(llvm::StringRef AbsPath, llvm::StringRef TUPath)
llvm::StringRef file() const
Retrieves absolute path to the file.