From fbbdfc197348f90f5c06ed5dd53d9e6dac115781 Mon Sep 17 00:00:00 2001 From: Matthew Toohey Date: Tue, 7 Jun 2022 21:57:53 -0400 Subject: [PATCH 1/6] feat: improved reformat edits --- Cargo.lock | 19 +++++++++++++------ Cargo.toml | 3 ++- src/main.rs | 41 ++++++++++++++++++++++++++++++++++------- 3 files changed, 49 insertions(+), 14 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 83c1d95..8be76c5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -357,14 +357,14 @@ dependencies = [ ] [[package]] -name = "nixpkgs-fmt-rnix" +name = "nixpkgs-fmt" version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38cd28a1c98361571955f6ddd71a27631671b025c49f4a5885cf4305ea82ba60" +source = "git+https://github.com/mtoohey31/nixpkgs-fmt?branch=feat/reformat-edits#80e18e670cd0a84785cbd0ba728ad8846e8e0e22" dependencies = [ "clap", "crossbeam-channel 0.3.9", "ignore", + "libc", "rnix", "rowan", "serde_json", @@ -471,12 +471,13 @@ dependencies = [ "lsp-server", "lsp-types", "maplit", - "nixpkgs-fmt-rnix", + "nixpkgs-fmt", "regex", "rnix", "serde", "serde_json", "stoppable_thread", + "textedit-merge", ] [[package]] @@ -618,6 +619,12 @@ dependencies = [ "serde", ] +[[package]] +name = "textedit-merge" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9bb566d3c513aaadef8a4b2e805d75c5714e21b0a689c930365762ff0f2fc03" + [[package]] name = "textwrap" version = "0.11.0" @@ -679,9 +686,9 @@ checksum = "099b7128301d285f79ddd55b9a83d5e6b9e97c92e0ea0daebee7263e932de992" [[package]] name = "unicode-ident" -version = "1.0.1" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bd2fe26506023ed7b5e1e315add59d6f584c621d037f9368fea9cfb988f368c" +checksum = "d22af068fba1eb5edcb4aea19d382b2a3deb4c8f9d475c589b6ada9e0fd493ee" [[package]] name = "unicode-normalization" diff --git a/Cargo.toml b/Cargo.toml index 39d5233..cab8408 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -23,7 +23,8 @@ regex = "1.5.6" rnix = "0.10.2" serde = "1.0.138" serde_json = "1.0.82" -nixpkgs-fmt-rnix = "1.2.0" +nixpkgs-fmt = { git = "https://github.com/mtoohey31/nixpkgs-fmt", branch = "feat/reformat-edits" } +textedit-merge = "0.2.1" [dev-dependencies] stoppable_thread = "0.2.1" diff --git a/src/main.rs b/src/main.rs index 6f92189..57898a6 100644 --- a/src/main.rs +++ b/src/main.rs @@ -210,11 +210,38 @@ impl App { self.reply(Response::new_ok(id, document_links)); } else if let Some((id, params)) = cast::(&mut req) { let changes = if let Some((ast, code, _)) = self.files.get(¶ms.text_document.uri) { - let fmt = nixpkgs_fmt::reformat_node(&ast.node()); - vec![TextEdit { - range: utils::range(&code, TextRange::up_to(ast.node().text().len())), - new_text: fmt.text().to_string(), - }] + let (edits1, edits2) = nixpkgs_fmt::reformat_edits(&ast.node()); + warn!("edits1: {:?}\nedits2: {:?}", edits1, edits2); + let merged = textedit_merge::merge( + &edits1 + .into_iter() + .map(|(r, s)| { + let r: std::ops::Range = r.start().into()..r.end().into(); + (r, s) + }) + .collect::, String)>>(), + &edits2 + .into_iter() + .map(|(r, s)| { + let r: std::ops::Range = r.start().into()..r.end().into(); + (r, s) + }) + .collect::, String)>>(), + ); + warn!("merged: {:?}", merged); + merged + .into_iter() + .map(|edit| TextEdit { + range: utils::range( + &code, + TextRange::new( + TextSize::from(edit.0.start as u32), + TextSize::from(edit.0.end as u32), + ), + ), + new_text: edit.1, + }) + .collect::>() } else { Vec::new() }; @@ -353,7 +380,7 @@ impl App { let start: usize = range.start().into(); let end: usize = range.end().into(); if start <= offset && offset < end { - return None + return None; } let (_definition_ast, definition_content, _) = self.files.get(&var.file)?; @@ -378,7 +405,7 @@ impl App { let start: usize = range.start().into(); let end: usize = range.end().into(); if start <= offset && offset < end { - return None + return None; } let def_path = def.scope.root_path()?; From 9f515dbe96e433b547291aa2259e03954d57a3d8 Mon Sep 17 00:00:00 2001 From: Matthew Toohey Date: Sun, 12 Jun 2022 13:47:32 -0400 Subject: [PATCH 2/6] refactor: bump nixpkgs-fmt version and clean up edit conversion --- Cargo.lock | 2 +- src/main.rs | 42 ++++++++++------------------ src/utils.rs | 79 +++++++++++++++++++++++++++++++++++++++------------- 3 files changed, 74 insertions(+), 49 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 8be76c5..041040c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -359,7 +359,7 @@ dependencies = [ [[package]] name = "nixpkgs-fmt" version = "1.2.0" -source = "git+https://github.com/mtoohey31/nixpkgs-fmt?branch=feat/reformat-edits#80e18e670cd0a84785cbd0ba728ad8846e8e0e22" +source = "git+https://github.com/mtoohey31/nixpkgs-fmt?branch=feat/reformat-edits#07ee0d8b538e3134c0b8bb4463e3caedb3501cb1" dependencies = [ "clap", "crossbeam-channel 0.3.9", diff --git a/src/main.rs b/src/main.rs index 57898a6..acf2d05 100644 --- a/src/main.rs +++ b/src/main.rs @@ -59,7 +59,10 @@ use std::{ str::FromStr, }; -use crate::error::AppError; +use crate::{ + error::AppError, + utils::{atom_edit_to_tuple, tuple_to_text_edit}, +}; type Error = Box; @@ -210,37 +213,20 @@ impl App { self.reply(Response::new_ok(id, document_links)); } else if let Some((id, params)) = cast::(&mut req) { let changes = if let Some((ast, code, _)) = self.files.get(¶ms.text_document.uri) { - let (edits1, edits2) = nixpkgs_fmt::reformat_edits(&ast.node()); - warn!("edits1: {:?}\nedits2: {:?}", edits1, edits2); - let merged = textedit_merge::merge( - &edits1 + let (spacing_edits, indent_edits) = nixpkgs_fmt::reformat_edits(&ast.node()); + let merged_edits = textedit_merge::merge( + &spacing_edits .into_iter() - .map(|(r, s)| { - let r: std::ops::Range = r.start().into()..r.end().into(); - (r, s) - }) - .collect::, String)>>(), - &edits2 + .map(atom_edit_to_tuple) + .collect::, _)>>(), + &indent_edits .into_iter() - .map(|(r, s)| { - let r: std::ops::Range = r.start().into()..r.end().into(); - (r, s) - }) - .collect::, String)>>(), + .map(atom_edit_to_tuple) + .collect::, _)>>(), ); - warn!("merged: {:?}", merged); - merged + merged_edits .into_iter() - .map(|edit| TextEdit { - range: utils::range( - &code, - TextRange::new( - TextSize::from(edit.0.start as u32), - TextSize::from(edit.0.end as u32), - ), - ), - new_text: edit.1, - }) + .map(|t| tuple_to_text_edit(t, &code)) .collect::>() } else { Vec::new() diff --git a/src/utils.rs b/src/utils.rs index a1651b8..d681037 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -1,9 +1,11 @@ use lsp_types::*; +use nixpkgs_fmt::AtomEdit; use rnix::{types::*, SyntaxNode, TextRange, TextSize, TokenAtOffset}; use std::{ collections::HashMap, convert::TryFrom, fmt::{Debug, Display, Formatter, Result}, + ops, path::PathBuf, rc::Rc, }; @@ -323,6 +325,24 @@ pub fn selection_ranges(root: &SyntaxNode, content: &str, pos: Position) -> Opti root.map(|b| *b) } +pub fn atom_edit_to_tuple(atom_edit: AtomEdit) -> (ops::Range, String) { + let r: std::ops::Range = atom_edit.delete.start().into()..atom_edit.delete.end().into(); + (r, atom_edit.insert.to_string()) +} + +pub fn tuple_to_text_edit(tup: (ops::Range, String), code: &str) -> TextEdit { + TextEdit { + range: range( + code, + TextRange::new( + TextSize::from(tup.0.start as u32), + TextSize::from(tup.0.end as u32), + ), + ), + new_text: tup.1, + } +} + #[cfg(test)] mod tests { use super::*; @@ -336,10 +356,7 @@ mod tests { assert_eq!(0, start.start.character); assert_eq!(1, start.end.character); - let actual_pos = range(expr, TextRange::new( - TextSize::from(15), - TextSize::from(20) - )); + let actual_pos = range(expr, TextRange::new(TextSize::from(15), TextSize::from(20))); assert_eq!(1, actual_pos.start.line); assert_eq!(1, actual_pos.end.line); @@ -368,10 +385,13 @@ mod tests { #[test] fn test_lookup_pos_in_expr() { let expr = "let a = 1;\nbuiltins.trace a 23"; - let pos = lookup_pos(expr, Position { - line: 0, - character: 0, - }); + let pos = lookup_pos( + expr, + Position { + line: 0, + character: 0, + }, + ); assert_eq!(0, pos.expect("expected position to be not None!")); } @@ -379,17 +399,29 @@ mod tests { #[test] fn test_lookup_pos_out_of_range() { let expr = "let a = 1;\na"; - let pos_wrong_line = lookup_pos(expr, Position { - line: 5, - character: 23, - }); + let pos_wrong_line = lookup_pos( + expr, + Position { + line: 5, + character: 23, + }, + ); assert!(pos_wrong_line.is_none()); // if the character is greater than the length of a line, the offset of the last // char of the line is returned. - let pos_char_out_of_range = lookup_pos(expr, Position { line: 0, character: 100, }); - assert_eq!(10, pos_char_out_of_range.expect("expected position to be not None!")); + let pos_char_out_of_range = lookup_pos( + expr, + Position { + line: 0, + character: 100, + }, + ); + assert_eq!( + 10, + pos_char_out_of_range.expect("expected position to be not None!") + ); } #[test] @@ -398,21 +430,26 @@ mod tests { let root = rnix::parse(expr).node(); let scope = scope_for( &Rc::new(Url::parse("file:///default.nix").unwrap()), - root.children().next().unwrap() + root.children().next().unwrap(), ); assert!(scope.is_some()); let scope_entries = scope.unwrap(); assert_eq!(5, scope_entries.keys().len()); - assert!(scope_entries.values().into_iter().all(|x| x.datatype == Datatype::Lambda)); - assert!(vec!["n", "a", "b", "c", "d"].into_iter().all(|x| scope_entries.contains_key(x))); + assert!(scope_entries + .values() + .into_iter() + .all(|x| x.datatype == Datatype::Lambda)); + assert!(vec!["n", "a", "b", "c", "d"] + .into_iter() + .all(|x| scope_entries.contains_key(x))); let mut iter = root.children().next().unwrap().children(); iter.next(); let scope_let = scope_for( &Rc::new(Url::parse("file:///default.nix").unwrap()), - iter.next().unwrap() + iter.next().unwrap(), ); assert!(scope_let.is_some()); @@ -427,14 +464,16 @@ mod tests { let root = rnix::parse(expr).node(); let scope = scope_for( &Rc::new(Url::parse("file:///default.nix").unwrap()), - root.children().next().unwrap() + root.children().next().unwrap(), ); assert!(scope.is_some()); let scope_entries = scope.unwrap(); assert_eq!(2, scope_entries.keys().len()); - assert!(vec!["a", "body"].into_iter().all(|x| scope_entries.contains_key(x))); + assert!(vec!["a", "body"] + .into_iter() + .all(|x| scope_entries.contains_key(x))); } #[test] From 78a08000e197adabe10fc4ed975079ea5dbc7806 Mon Sep 17 00:00:00 2001 From: Matthew Toohey Date: Sun, 12 Jun 2022 15:17:43 -0400 Subject: [PATCH 3/6] style: revert unnecessary reformatting --- src/main.rs | 4 ++-- src/utils.rs | 59 ++++++++++++++++++---------------------------------- 2 files changed, 22 insertions(+), 41 deletions(-) diff --git a/src/main.rs b/src/main.rs index acf2d05..6118f5f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -366,7 +366,7 @@ impl App { let start: usize = range.start().into(); let end: usize = range.end().into(); if start <= offset && offset < end { - return None; + return None } let (_definition_ast, definition_content, _) = self.files.get(&var.file)?; @@ -391,7 +391,7 @@ impl App { let start: usize = range.start().into(); let end: usize = range.end().into(); if start <= offset && offset < end { - return None; + return None } let def_path = def.scope.root_path()?; diff --git a/src/utils.rs b/src/utils.rs index d681037..78ccb3a 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -356,7 +356,10 @@ mod tests { assert_eq!(0, start.start.character); assert_eq!(1, start.end.character); - let actual_pos = range(expr, TextRange::new(TextSize::from(15), TextSize::from(20))); + let actual_pos = range(expr, TextRange::new( + TextSize::from(15), + TextSize::from(20) + )); assert_eq!(1, actual_pos.start.line); assert_eq!(1, actual_pos.end.line); @@ -385,13 +388,10 @@ mod tests { #[test] fn test_lookup_pos_in_expr() { let expr = "let a = 1;\nbuiltins.trace a 23"; - let pos = lookup_pos( - expr, - Position { - line: 0, - character: 0, - }, - ); + let pos = lookup_pos(expr, Position { + line: 0, + character: 0, + }); assert_eq!(0, pos.expect("expected position to be not None!")); } @@ -399,29 +399,17 @@ mod tests { #[test] fn test_lookup_pos_out_of_range() { let expr = "let a = 1;\na"; - let pos_wrong_line = lookup_pos( - expr, - Position { - line: 5, - character: 23, - }, - ); + let pos_wrong_line = lookup_pos(expr, Position { + line: 5, + character: 23, + }); assert!(pos_wrong_line.is_none()); // if the character is greater than the length of a line, the offset of the last // char of the line is returned. - let pos_char_out_of_range = lookup_pos( - expr, - Position { - line: 0, - character: 100, - }, - ); - assert_eq!( - 10, - pos_char_out_of_range.expect("expected position to be not None!") - ); + let pos_char_out_of_range = lookup_pos(expr, Position { line: 0, character: 100, }); + assert_eq!(10, pos_char_out_of_range.expect("expected position to be not None!")); } #[test] @@ -430,26 +418,21 @@ mod tests { let root = rnix::parse(expr).node(); let scope = scope_for( &Rc::new(Url::parse("file:///default.nix").unwrap()), - root.children().next().unwrap(), + root.children().next().unwrap() ); assert!(scope.is_some()); let scope_entries = scope.unwrap(); assert_eq!(5, scope_entries.keys().len()); - assert!(scope_entries - .values() - .into_iter() - .all(|x| x.datatype == Datatype::Lambda)); - assert!(vec!["n", "a", "b", "c", "d"] - .into_iter() - .all(|x| scope_entries.contains_key(x))); + assert!(scope_entries.values().into_iter().all(|x| x.datatype == Datatype::Lambda)); + assert!(vec!["n", "a", "b", "c", "d"].into_iter().all(|x| scope_entries.contains_key(x))); let mut iter = root.children().next().unwrap().children(); iter.next(); let scope_let = scope_for( &Rc::new(Url::parse("file:///default.nix").unwrap()), - iter.next().unwrap(), + iter.next().unwrap() ); assert!(scope_let.is_some()); @@ -464,16 +447,14 @@ mod tests { let root = rnix::parse(expr).node(); let scope = scope_for( &Rc::new(Url::parse("file:///default.nix").unwrap()), - root.children().next().unwrap(), + root.children().next().unwrap() ); assert!(scope.is_some()); let scope_entries = scope.unwrap(); assert_eq!(2, scope_entries.keys().len()); - assert!(vec!["a", "body"] - .into_iter() - .all(|x| scope_entries.contains_key(x))); + assert!(vec!["a", "body"].into_iter().all(|x| scope_entries.contains_key(x))); } #[test] From 67d48402602a5366b72855b7c7638d264a9cadad Mon Sep 17 00:00:00 2001 From: Matthew Toohey Date: Tue, 5 Jul 2022 21:32:07 -0400 Subject: [PATCH 4/6] docs, test: document and add tests for `atom_edit_to_tuple` --- Cargo.lock | 1 + Cargo.toml | 1 + src/utils.rs | 33 +++++++++++++++++++++++++++++++++ 3 files changed, 35 insertions(+) diff --git a/Cargo.lock b/Cargo.lock index 041040c..9943428 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -476,6 +476,7 @@ dependencies = [ "rnix", "serde", "serde_json", + "smol_str", "stoppable_thread", "textedit-merge", ] diff --git a/Cargo.toml b/Cargo.toml index cab8408..105d73b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -24,6 +24,7 @@ rnix = "0.10.2" serde = "1.0.138" serde_json = "1.0.82" nixpkgs-fmt = { git = "https://github.com/mtoohey31/nixpkgs-fmt", branch = "feat/reformat-edits" } +smol_str = "0.1.17" textedit-merge = "0.2.1" [dev-dependencies] diff --git a/src/utils.rs b/src/utils.rs index 78ccb3a..1706f2e 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -325,6 +325,8 @@ pub fn selection_ranges(root: &SyntaxNode, content: &str, pos: Position) -> Opti root.map(|b| *b) } +/// Convert an AtomEdit to a tuple whose first element is `atom_edit`'s delete range, and whose +/// second element is a String with the same contents as `atom_edit`'s insert value. pub fn atom_edit_to_tuple(atom_edit: AtomEdit) -> (ops::Range, String) { let r: std::ops::Range = atom_edit.delete.start().into()..atom_edit.delete.end().into(); (r, atom_edit.insert.to_string()) @@ -346,6 +348,7 @@ pub fn tuple_to_text_edit(tup: (ops::Range, String), code: &str) -> TextE #[cfg(test)] mod tests { use super::*; + use smol_str::SmolStr; #[test] fn test_get_offset_from_nix_expr() { @@ -487,4 +490,34 @@ mod tests { let ident_ = ident.unwrap(); assert_eq!(vec!["a"], ident_.path); } + + #[test] + fn test_atom_edit_to_tuple() { + let atom_edits = vec![ + AtomEdit { + delete: TextRange::new(TextSize::from(5), TextSize::from(9)), + insert: SmolStr::from("hello world"), + }, + AtomEdit { + delete: TextRange::new(TextSize::from(11), TextSize::from(11)), + insert: SmolStr::from("the quick brown fox"), + }, + AtomEdit { + delete: TextRange::new(TextSize::from(115698), TextSize::from(126498)), + insert: SmolStr::from("a string"), + }, + ]; + let expected = vec![ + (5..9, String::from("hello world")), + (11..11, String::from("the quick brown fox")), + (115698..126498, String::from("a string")), + ]; + assert_eq!( + atom_edits + .into_iter() + .map(atom_edit_to_tuple) + .collect::, String)>>(), + expected + ); + } } From 51a812829ea67921a1ce69adea7f4995eb27a061 Mon Sep 17 00:00:00 2001 From: Matthew Toohey Date: Tue, 5 Jul 2022 22:03:38 -0400 Subject: [PATCH 5/6] test: add `test_reformat_integration` --- src/tests.rs | 132 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 132 insertions(+) diff --git a/src/tests.rs b/src/tests.rs index 84b887c..7a2a2e1 100644 --- a/src/tests.rs +++ b/src/tests.rs @@ -263,6 +263,138 @@ fn test_rename() { handle.stop().join().expect("Failed to gracefully terminate LSP worker thread!"); } +#[test] +fn test_reformat_integration() { + let urlpath = "file:///code/default.nix"; + let input = r#"{ + f = { x + , y + }: body; + + testAllTrue = expr: {inherit expr;expected=map (x: true) expr; }; +} +"#; + let (client, handle) = prepare_integration_test(input, urlpath); + + let r = Request { + id: RequestId::from(23), + method: String::from("textDocument/formatting"), + params: json!({ + "textDocument": { + "uri": "file:///code/default.nix", + }, + "options": { + // Tab size isn't respected yet + "tabSize": 37, + "insertSpaces": true + } + }) + }; + client.sender.send(r.into()).expect("Cannot send reformat request!"); + + expect_diagnostics(&client); + + let msg = recv_msg(&client); + let hover_json = coerce_response(msg).result.expect("Expected reformat response!"); + let edits = hover_json; + let expected = json!([ + { + "newText": "\n ", + "range": { + "start": { + "character": 5, + "line": 1 + }, + "end": { + "character": 6, + "line": 1 + } + } + }, + { + "newText": "\n ", + "range": { + "start": { + "character": 9, + "line": 1 + }, + "end": { + "character": 2, + "line": 2 + } + } + }, + { + "newText": "\n ", + "range": { + "start": { + "character": 5, + "line": 2 + }, + "end": { + "character": 6, + "line": 3 + } + } + }, + { + "newText": " ", + "range": { + "start": { + "character": 23, + "line": 5 + }, + "end": { + "character": 23, + "line": 5 + } + } + }, + { + "newText": " ", + "range": { + "start": { + "character": 36, + "line": 5 + }, + "end": { + "character": 36, + "line": 5 + } + } + }, + { + "newText": " ", + "range": { + "start": { + "character": 44, + "line": 5 + }, + "end": { + "character": 44, + "line": 5 + } + } + }, + { + "newText": " ", + "range": { + "start": { + "character": 45, + "line": 5 + }, + "end": { + "character": 45, + "line": 5 + } + } + } + ]); + assert_eq!(edits, expected); + + handle.stop().join().expect("Failed to gracefully terminate LSP worker thread!"); +} + #[test] fn attrs_simple() { let code = "{ x = 1; y = 2; }.x"; From d79a37227c550b2d40b115da9eb44f5452df60c4 Mon Sep 17 00:00:00 2001 From: Matthew Toohey Date: Wed, 13 Jul 2022 21:08:45 -0400 Subject: [PATCH 6/6] chore: switch nixpkgs-fmt to nix-community/main --- Cargo.lock | 24 ++++++++++++++++-------- Cargo.toml | 2 +- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 9943428..a43f1c1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -96,11 +96,12 @@ checksum = "328b822bdcba4d4e402be8d9adb6eebf269f969f8eadef977a553ff3c4fbcb58" [[package]] name = "crossbeam-channel" -version = "0.3.9" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8ec7fcd21571dc78f96cc96243cab8d8f035247c3efd16c687be154c3fa9efa" +checksum = "b153fe7cbef478c567df0f972e02e6d736db11affe43dfc9c56a9374d1adfb87" dependencies = [ - "crossbeam-utils 0.6.6", + "crossbeam-utils 0.7.2", + "maybe-uninit", ] [[package]] @@ -115,10 +116,11 @@ dependencies = [ [[package]] name = "crossbeam-utils" -version = "0.6.6" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04973fa96e96579258a5091af6003abde64af786b860f18622b82e026cca60e6" +checksum = "c3c7c73a2d1e9fc0886a08b93e98eb643461230d5f1925e4036204d5f2e261a8" dependencies = [ + "autocfg", "cfg-if 0.1.10", "lazy_static", ] @@ -341,6 +343,12 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" +[[package]] +name = "maybe-uninit" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00" + [[package]] name = "memchr" version = "2.5.0" @@ -358,11 +366,11 @@ dependencies = [ [[package]] name = "nixpkgs-fmt" -version = "1.2.0" -source = "git+https://github.com/mtoohey31/nixpkgs-fmt?branch=feat/reformat-edits#07ee0d8b538e3134c0b8bb4463e3caedb3501cb1" +version = "1.3.0" +source = "git+https://github.com/nix-community/nixpkgs-fmt#3c4addcc0aa9a6eb9fb64d9206733110d1153a52" dependencies = [ "clap", - "crossbeam-channel 0.3.9", + "crossbeam-channel 0.4.4", "ignore", "libc", "rnix", diff --git a/Cargo.toml b/Cargo.toml index 105d73b..07478a7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -23,7 +23,7 @@ regex = "1.5.6" rnix = "0.10.2" serde = "1.0.138" serde_json = "1.0.82" -nixpkgs-fmt = { git = "https://github.com/mtoohey31/nixpkgs-fmt", branch = "feat/reformat-edits" } +nixpkgs-fmt = { git = "https://github.com/nix-community/nixpkgs-fmt" } smol_str = "0.1.17" textedit-merge = "0.2.1"