23#include <boost/asio/post.hpp>
24#include <llvm/Support/JSON.h>
28using namespace llvm::json;
29using namespace lspserver;
32 Callback<std::vector<CodeAction>> Reply) {
33 using CheckTy = std::vector<CodeAction>;
35 Range Range = Params.
range;
36 auto Action = [Reply = std::move(Reply),
File, Range,
this]()
mutable {
37 return Reply([&]() -> llvm::Expected<CheckTy> {
40 const auto &Diagnostics = TU->diagnostics();
41 auto Actions = std::vector<CodeAction>();
42 Actions.reserve(Diagnostics.size());
45 for (
const nixf::Diagnostic &D : Diagnostics) {
46 auto DRange =
toLSPRange(TU->src(), D.range());
51 bool IsPreferred =
false;
53 case nixf::Diagnostic::DK_UnusedDefLet:
61 for (
const nixf::Fix &F : D.fixes()) {
62 std::vector<TextEdit> Edits;
63 Edits.reserve(F.edits().size());
64 for (
const nixf::TextEdit &TE : F.edits()) {
65 Edits.emplace_back(TextEdit{
67 .newText = std::string(TE.newText()),
70 using Changes = std::map<std::string, std::vector<TextEdit>>;
71 WorkspaceEdit WE{.changes = Changes{
72 {FileURI, std::move(Edits)},
74 Actions.emplace_back(CodeAction{
77 .isPreferred = IsPreferred,
78 .edit = std::move(WE),
84 if (TU->ast() && TU->parentMap()) {
86 if (
const nixf::Node *N = TU->ast()->descend(NixfRange)) {
100 if (TU->variableLookup()) {
102 FileURI, TU->src(), Actions);
105 if (TU->variableLookup()) {
107 FileURI, TU->src(), Actions);
110 if (TU->variableLookup()) {
112 FileURI, TU->src(), Actions);
123 boost::asio::post(Pool, std::move(Action));
128 auto Action = [Reply = std::move(Reply), Params,
this]()
mutable {
131 const auto *DataObj = Params.
data->getAsObject();
133 auto NoogleUrl = DataObj->getString(
"noogleUrl");
136 ShowDocumentParams ShowParams;
141 ShowParams, [](llvm::Expected<ShowDocumentResult> Result) {
155 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).
void addToFormalsAction(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 add undefined variable to lambda formals.
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.