Skip to content
This repository was archived by the owner on Jan 25, 2024. It is now read-only.

Commit 936ae39

Browse files
committed
feat: format via alejandra when feature is set
Signed-off-by: Roman Volosatovs <rvolosatovs@riseup.net>
1 parent 95d4067 commit 936ae39

File tree

3 files changed

+72
-11
lines changed

3 files changed

+72
-11
lines changed

Cargo.lock

Lines changed: 36 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,11 @@ log = "0.4.17"
2020
lsp-server = "0.6.0"
2121
lsp-types = { version = "0.93.0", features = ["proposed"] }
2222
regex = "1.5.6"
23+
alejandra = { version = "1.5.0", optional = true }
2324
rnix = "0.10.2"
2425
serde = "1.0.138"
2526
serde_json = "1.0.82"
26-
nixpkgs-fmt-rnix = "1.2.0"
27+
nixpkgs-fmt-rnix = { version = "1.2.0", optional = true }
2728

2829
[dev-dependencies]
2930
stoppable_thread = "0.2.1"
@@ -32,7 +33,7 @@ maplit = "1"
3233
[features]
3334

3435
# Set this to ["verbose"] when debugging
35-
default = []
36+
default = [ "nixpkgs-fmt-rnix" ]
3637

3738
# Enable showing internal errors via editor UI, such as via hover popups.
3839
# This can be helpful for debugging, but we don't want the evaluator to

src/main.rs

Lines changed: 33 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -209,16 +209,40 @@ impl App {
209209
let document_links = self.document_links(&params).unwrap_or_default();
210210
self.reply(Response::new_ok(id, document_links));
211211
} else if let Some((id, params)) = cast::<Formatting>(&mut req) {
212-
let changes = if let Some((ast, code, _)) = self.files.get(&params.text_document.uri) {
213-
let fmt = nixpkgs_fmt::reformat_node(&ast.node());
214-
vec![TextEdit {
215-
range: utils::range(&code, TextRange::up_to(ast.node().text().len())),
216-
new_text: fmt.text().to_string(),
217-
}]
212+
if let Some((ast, code, _)) = self.files.get(&params.text_document.uri) {
213+
let node = ast.node();
214+
let range = utils::range(&code, TextRange::up_to(node.text().len()));
215+
if cfg!(feature = "alejandra") {
216+
#[cfg(feature = "alejandra")]
217+
match alejandra::format::in_memory(
218+
params.text_document.uri.to_string(),
219+
code.to_string(),
220+
) {
221+
(alejandra::format::Status::Changed(true), new_text) => {
222+
self.reply(Response::new_ok(id, vec![TextEdit { range, new_text }]))
223+
}
224+
(alejandra::format::Status::Changed(false), _) => {
225+
self.reply(Response::new_ok(id, ()))
226+
}
227+
(alejandra::format::Status::Error(e), _) => {
228+
self.reply(Response::new_err(id, ErrorCode::InternalError as i32, e))
229+
}
230+
}
231+
} else if cfg!(feature = "nixpkgs-fmt-rnix") {
232+
#[cfg(feature = "nixpkgs-fmt-rnix")]
233+
self.reply(Response::new_ok(
234+
id,
235+
vec![TextEdit {
236+
range,
237+
new_text: nixpkgs_fmt::reformat_node(&node).text().to_string(),
238+
}],
239+
));
240+
} else {
241+
self.reply(Response::new_ok(id, ()))
242+
}
218243
} else {
219-
Vec::new()
220-
};
221-
self.reply(Response::new_ok(id, changes));
244+
self.reply(Response::new_ok(id, ()))
245+
}
222246
} else if let Some((id, params)) = cast::<HoverRequest>(&mut req) {
223247
if let Some((range, markdown)) = self.hover(params) {
224248
self.reply(Response::new_ok(

0 commit comments

Comments
 (0)