diff --git a/nixd/lib/Controller/AST.cpp b/nixd/lib/Controller/AST.cpp index 061bc87cb..c37032b80 100644 --- a/nixd/lib/Controller/AST.cpp +++ b/nixd/lib/Controller/AST.cpp @@ -313,6 +313,16 @@ nixd::FindAttrPathResult nixd::findAttrPath(const nixf::Node &N, } } + if (const Node *ExprAttrs = PM.upTo(N, Node::NK_ExprAttrs)) { + try { + getValueAttrPath(*ExprAttrs, PM, Path); + Path.emplace_back(""); + return R::OK; + } catch (AttrPathHasDynamicError &E) { + return R::WithDynamic; + } + } + return R::NotAttrPath; } diff --git a/nixd/lib/Controller/Completion.cpp b/nixd/lib/Controller/Completion.cpp index 0e5e08621..983a71877 100644 --- a/nixd/lib/Controller/Completion.cpp +++ b/nixd/lib/Controller/Completion.cpp @@ -31,7 +31,7 @@ namespace { /// Set max completion size to this value, we don't want to send large lists /// because of slow IO. /// Items exceed this size should be marked "incomplete" and recomputed. -constexpr int MaxCompletionSize = 30; +constexpr int MaxCompletionSize = 1000; CompletionItemKind OptionKind = CompletionItemKind::Constructor; CompletionItemKind OptionAttrKind = CompletionItemKind::Class; @@ -278,7 +278,7 @@ void completeAttrPath(const Node &N, const ParentMapAnalysis &PM, auto R = findAttrPathForOptions(N, PM, Scope); if (R == PathResult::OK) { // Construct request. - std::string Prefix = Scope.back(); + std::string Prefix = ""; Scope.pop_back(); { std::lock_guard _(OptionsLock); @@ -384,13 +384,14 @@ void Controller::onCompletion(const CompletionParams &Params, return Reply([&]() -> llvm::Expected { const auto TU = CheckDefault(getTU(File)); const auto AST = CheckDefault(getAST(*TU)); - const auto *Desc = AST->descend({Pos, Pos}); - CheckDefault(Desc && Desc->children().empty()); + CheckDefault(Desc); const auto &N = *Desc; const auto &PM = *TU->parentMap(); const auto &UpExpr = *CheckDefault(PM.upExpr(N)); + CheckDefault(Desc->children().empty() || + UpExpr.kind() == Node::NK_ExprAttrs); return [&]() { CompletionList List; diff --git a/nixd/lib/Eval/AttrSetProvider.cpp b/nixd/lib/Eval/AttrSetProvider.cpp index 41ac27f25..e0e356cb8 100644 --- a/nixd/lib/Eval/AttrSetProvider.cpp +++ b/nixd/lib/Eval/AttrSetProvider.cpp @@ -14,7 +14,7 @@ using namespace lspserver; namespace { -constexpr int MaxItems = 30; +constexpr int MaxItems = 1000; void fillString(nix::EvalState &State, nix::Value &V, const std::vector &AttrPath, diff --git a/nixd/tools/nixd/test/completion/comment.md b/nixd/tools/nixd/test/completion/comment.md index a7c78609c..2a46e6d95 100644 --- a/nixd/tools/nixd/test/completion/comment.md +++ b/nixd/tools/nixd/test/completion/comment.md @@ -52,7 +52,15 @@ CHECK-NEXT: "jsonrpc": "2.0", CHECK-NEXT: "result": { CHECK-NEXT: "isIncomplete": false, -CHECK-NEXT: "items": [] +CHECK-NEXT: "items": [ +CHECK-NEXT: { +CHECK-NEXT: "data": "", +CHECK-NEXT: "detail": "nixos", +CHECK-NEXT: "kind": 7, +CHECK-NEXT: "label": "foo", +CHECK-NEXT: "score": 0 +CHECK-NEXT: } +CHECK-NEXT: ] CHECK-NEXT: } ```