mirror of
https://github.com/RGBCube/alejandra
synced 2025-08-01 04:57:44 +00:00
perf: twice as fast
- Was refactoring a little bit the code and seems that moving the path to the build_ct makes the code much more faster
This commit is contained in:
parent
dee5de12d6
commit
aa3364b606
5 changed files with 63 additions and 65 deletions
10
README.md
10
README.md
|
@ -41,11 +41,11 @@
|
||||||
|
|
||||||
| Cores | Seconds |
|
| Cores | Seconds |
|
||||||
| :---: | :-----: |
|
| :---: | :-----: |
|
||||||
| 1 | 40 |
|
| 1 | 24 |
|
||||||
| 2 | 21 |
|
| 2 | 12 |
|
||||||
| 4 | 15 |
|
| 4 | 7 |
|
||||||
| 8 | 11 |
|
| 8 | 6 |
|
||||||
| 16 | 10 |
|
| 16 | 7 |
|
||||||
|
|
||||||
- ✔️ **Powerful**
|
- ✔️ **Powerful**
|
||||||
|
|
||||||
|
|
|
@ -18,16 +18,18 @@ pub struct BuildCtx {
|
||||||
pub indentation: usize,
|
pub indentation: usize,
|
||||||
pub pos_new: crate::position::Position,
|
pub pos_new: crate::position::Position,
|
||||||
pub pos_old: crate::position::Position,
|
pub pos_old: crate::position::Position,
|
||||||
|
pub path: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl BuildCtx {
|
impl BuildCtx {
|
||||||
pub fn new(
|
pub fn new(
|
||||||
config: crate::config::Config,
|
config: crate::config::Config,
|
||||||
force_wide: bool,
|
force_wide: bool,
|
||||||
|
path: String,
|
||||||
pos_new: crate::position::Position,
|
pos_new: crate::position::Position,
|
||||||
pos_old: crate::position::Position,
|
pos_old: crate::position::Position,
|
||||||
) -> BuildCtx {
|
) -> BuildCtx {
|
||||||
BuildCtx { config, force_wide, indentation: 0, pos_new, pos_old }
|
BuildCtx { config, force_wide, indentation: 0, path, pos_new, pos_old }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -35,12 +37,13 @@ pub fn build(
|
||||||
config: &crate::config::Config,
|
config: &crate::config::Config,
|
||||||
element: rnix::SyntaxElement,
|
element: rnix::SyntaxElement,
|
||||||
force_wide: bool,
|
force_wide: bool,
|
||||||
path: &str,
|
path: String,
|
||||||
) -> Option<rowan::GreenNode> {
|
) -> Option<rowan::GreenNode> {
|
||||||
let mut builder = rowan::GreenNodeBuilder::new();
|
let mut builder = rowan::GreenNodeBuilder::new();
|
||||||
let mut build_ctx = BuildCtx::new(
|
let mut build_ctx = BuildCtx::new(
|
||||||
config.clone(),
|
config.clone(),
|
||||||
force_wide,
|
force_wide,
|
||||||
|
path,
|
||||||
crate::position::Position::new(),
|
crate::position::Position::new(),
|
||||||
crate::position::Position::new(),
|
crate::position::Position::new(),
|
||||||
);
|
);
|
||||||
|
@ -48,7 +51,6 @@ pub fn build(
|
||||||
build_step(
|
build_step(
|
||||||
&mut builder,
|
&mut builder,
|
||||||
&mut build_ctx,
|
&mut build_ctx,
|
||||||
path,
|
|
||||||
&crate::builder::Step::Format(element),
|
&crate::builder::Step::Format(element),
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -62,7 +64,7 @@ pub fn build(
|
||||||
fn build_step(
|
fn build_step(
|
||||||
builder: &mut rowan::GreenNodeBuilder,
|
builder: &mut rowan::GreenNodeBuilder,
|
||||||
build_ctx: &mut BuildCtx,
|
build_ctx: &mut BuildCtx,
|
||||||
path: &str,
|
|
||||||
step: &crate::builder::Step,
|
step: &crate::builder::Step,
|
||||||
) {
|
) {
|
||||||
if build_ctx.force_wide && build_ctx.pos_new.line > 1 {
|
if build_ctx.force_wide && build_ctx.pos_new.line > 1 {
|
||||||
|
@ -102,10 +104,10 @@ fn build_step(
|
||||||
build_ctx.indentation -= 1;
|
build_ctx.indentation -= 1;
|
||||||
}
|
}
|
||||||
crate::builder::Step::Format(element) => {
|
crate::builder::Step::Format(element) => {
|
||||||
format(builder, build_ctx, element, path);
|
format(builder, build_ctx, element);
|
||||||
}
|
}
|
||||||
crate::builder::Step::FormatWider(element) => {
|
crate::builder::Step::FormatWider(element) => {
|
||||||
format_wider(builder, build_ctx, element, path);
|
format_wider(builder, build_ctx, element);
|
||||||
}
|
}
|
||||||
crate::builder::Step::Indent => {
|
crate::builder::Step::Indent => {
|
||||||
build_ctx.indentation += 1;
|
build_ctx.indentation += 1;
|
||||||
|
@ -156,7 +158,6 @@ fn format(
|
||||||
builder: &mut rowan::GreenNodeBuilder,
|
builder: &mut rowan::GreenNodeBuilder,
|
||||||
build_ctx: &mut BuildCtx,
|
build_ctx: &mut BuildCtx,
|
||||||
element: &rnix::SyntaxElement,
|
element: &rnix::SyntaxElement,
|
||||||
path: &str,
|
|
||||||
) {
|
) {
|
||||||
let kind = element.kind();
|
let kind = element.kind();
|
||||||
|
|
||||||
|
@ -177,7 +178,10 @@ fn format(
|
||||||
rnix::SyntaxKind::NODE_DYNAMIC => crate::rules::dynamic::rule,
|
rnix::SyntaxKind::NODE_DYNAMIC => crate::rules::dynamic::rule,
|
||||||
// implementation detail of rnix-parser
|
// implementation detail of rnix-parser
|
||||||
rnix::SyntaxKind::NODE_ERROR => {
|
rnix::SyntaxKind::NODE_ERROR => {
|
||||||
eprintln!("Warning: found an error node at: {}", path);
|
eprintln!(
|
||||||
|
"Warning: found an error node at: {}",
|
||||||
|
build_ctx.path
|
||||||
|
);
|
||||||
crate::rules::default
|
crate::rules::default
|
||||||
}
|
}
|
||||||
// $identifier
|
// $identifier
|
||||||
|
@ -207,7 +211,7 @@ fn format(
|
||||||
rnix::SyntaxKind::NODE_LEGACY_LET => {
|
rnix::SyntaxKind::NODE_LEGACY_LET => {
|
||||||
eprintln!(
|
eprintln!(
|
||||||
"Warning: found a `legacy let` expression at: {}",
|
"Warning: found a `legacy let` expression at: {}",
|
||||||
path
|
build_ctx.path
|
||||||
);
|
);
|
||||||
crate::rules::default
|
crate::rules::default
|
||||||
}
|
}
|
||||||
|
@ -244,12 +248,15 @@ fn format(
|
||||||
// with a; b
|
// with a; b
|
||||||
rnix::SyntaxKind::NODE_WITH => crate::rules::with::rule,
|
rnix::SyntaxKind::NODE_WITH => crate::rules::with::rule,
|
||||||
kind => {
|
kind => {
|
||||||
panic!("Missing rule for {:?} at: {}", kind, path);
|
panic!(
|
||||||
|
"Missing rule for {:?} at: {}",
|
||||||
|
kind, build_ctx.path
|
||||||
|
);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
for step in rule(build_ctx, node) {
|
for step in rule(build_ctx, node) {
|
||||||
build_step(builder, build_ctx, path, &step);
|
build_step(builder, build_ctx, &step);
|
||||||
}
|
}
|
||||||
|
|
||||||
builder.finish_node();
|
builder.finish_node();
|
||||||
|
@ -265,37 +272,41 @@ fn format_wider(
|
||||||
builder: &mut rowan::GreenNodeBuilder,
|
builder: &mut rowan::GreenNodeBuilder,
|
||||||
build_ctx: &mut BuildCtx,
|
build_ctx: &mut BuildCtx,
|
||||||
element: &rnix::SyntaxElement,
|
element: &rnix::SyntaxElement,
|
||||||
path: &str,
|
|
||||||
) {
|
) {
|
||||||
match element {
|
match element {
|
||||||
rnix::SyntaxElement::Node(node) => {
|
rnix::SyntaxElement::Node(node) => {
|
||||||
let maybe_green_node = build(
|
let layout = if fits_in_single_line(build_ctx, node) {
|
||||||
&build_ctx.config.with_layout(crate::config::Layout::Wide),
|
crate::config::Layout::Wide
|
||||||
node.clone().into(),
|
} else {
|
||||||
true,
|
crate::config::Layout::Tall
|
||||||
path,
|
|
||||||
);
|
|
||||||
|
|
||||||
let layout = match maybe_green_node {
|
|
||||||
Some(finished) => {
|
|
||||||
if build_ctx.pos_new.column
|
|
||||||
+ finished.to_string().chars().count()
|
|
||||||
> build_ctx.config.max_width()
|
|
||||||
{
|
|
||||||
crate::config::Layout::Tall
|
|
||||||
} else {
|
|
||||||
crate::config::Layout::Wide
|
|
||||||
}
|
|
||||||
}
|
|
||||||
None => crate::config::Layout::Tall,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
let mut build_ctx_clone = build_ctx.clone();
|
let mut build_ctx_clone = build_ctx.clone();
|
||||||
build_ctx_clone.config = build_ctx.config.with_layout(layout);
|
build_ctx_clone.config = build_ctx.config.with_layout(layout);
|
||||||
format(builder, &mut build_ctx_clone, element, path);
|
format(builder, &mut build_ctx_clone, element);
|
||||||
}
|
}
|
||||||
rnix::SyntaxElement::Token(_) => {
|
rnix::SyntaxElement::Token(_) => {
|
||||||
format(builder, build_ctx, element, path);
|
format(builder, build_ctx, element);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn fits_in_single_line(
|
||||||
|
build_ctx: &crate::builder::BuildCtx,
|
||||||
|
node: &rnix::SyntaxNode,
|
||||||
|
) -> bool {
|
||||||
|
let maybe_green_node = build(
|
||||||
|
&build_ctx.config.with_layout(crate::config::Layout::Wide),
|
||||||
|
node.clone().into(),
|
||||||
|
true,
|
||||||
|
build_ctx.path.clone(),
|
||||||
|
);
|
||||||
|
|
||||||
|
match maybe_green_node {
|
||||||
|
Some(finished) => {
|
||||||
|
build_ctx.pos_new.column + finished.to_string().chars().count()
|
||||||
|
<= build_ctx.config.max_width()
|
||||||
|
}
|
||||||
|
None => false,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
pub fn string(
|
pub fn string(
|
||||||
config: &crate::config::Config,
|
config: &crate::config::Config,
|
||||||
path: &str,
|
path: String,
|
||||||
string: String,
|
string: String,
|
||||||
) -> String {
|
) -> String {
|
||||||
let tokens = rnix::tokenizer::Tokenizer::new(&string);
|
let tokens = rnix::tokenizer::Tokenizer::new(&string);
|
||||||
|
@ -21,11 +21,14 @@ pub fn string(
|
||||||
green_node.to_string()
|
green_node.to_string()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn file(config: &crate::config::Config, path: &str) -> std::io::Result<()> {
|
pub fn file(
|
||||||
|
config: &crate::config::Config,
|
||||||
|
path: String,
|
||||||
|
) -> std::io::Result<()> {
|
||||||
use std::io::Write;
|
use std::io::Write;
|
||||||
|
|
||||||
let input = std::fs::read_to_string(path)?;
|
let input = std::fs::read_to_string(&path)?;
|
||||||
let output = crate::format::string(config, path, input);
|
let output = crate::format::string(config, path.clone(), input);
|
||||||
|
|
||||||
std::fs::File::create(path)?.write_all(output.as_bytes())?;
|
std::fs::File::create(path)?.write_all(output.as_bytes())?;
|
||||||
|
|
||||||
|
|
|
@ -23,7 +23,7 @@ fn main() -> std::io::Result<()> {
|
||||||
.par_iter()
|
.par_iter()
|
||||||
.map(|path| -> std::io::Result<()> {
|
.map(|path| -> std::io::Result<()> {
|
||||||
eprintln!("Formatting: {}", &path);
|
eprintln!("Formatting: {}", &path);
|
||||||
alejandra::format::file(&config, &path)?;
|
alejandra::format::file(&config, path.to_string())?;
|
||||||
Ok(())
|
Ok(())
|
||||||
})
|
})
|
||||||
.collect::<Vec<std::io::Result<()>>>()
|
.collect::<Vec<std::io::Result<()>>>()
|
||||||
|
@ -35,7 +35,10 @@ fn main() -> std::io::Result<()> {
|
||||||
eprintln!("Formatting stdin.");
|
eprintln!("Formatting stdin.");
|
||||||
let mut stdin = String::new();
|
let mut stdin = String::new();
|
||||||
std::io::stdin().read_to_string(&mut stdin).unwrap();
|
std::io::stdin().read_to_string(&mut stdin).unwrap();
|
||||||
print!("{}", alejandra::format::string(&config, "stdin", stdin));
|
print!(
|
||||||
|
"{}",
|
||||||
|
alejandra::format::string(&config, "stdin".to_string(), stdin)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
23
tests/fmt.rs
23
tests/fmt.rs
|
@ -17,7 +17,7 @@ fn cases() {
|
||||||
let path_out = format!("tests/cases/{}/out", case);
|
let path_out = format!("tests/cases/{}/out", case);
|
||||||
let content_in = std::fs::read_to_string(path_in.clone()).unwrap();
|
let content_in = std::fs::read_to_string(path_in.clone()).unwrap();
|
||||||
let content_got =
|
let content_got =
|
||||||
alejandra::format::string(&config, &path_in, content_in.clone());
|
alejandra::format::string(&config, path_in, content_in.clone());
|
||||||
|
|
||||||
if should_update {
|
if should_update {
|
||||||
std::fs::File::create(&path_out)
|
std::fs::File::create(&path_out)
|
||||||
|
@ -28,25 +28,6 @@ fn cases() {
|
||||||
|
|
||||||
let content_out = std::fs::read_to_string(path_out.clone()).unwrap();
|
let content_out = std::fs::read_to_string(path_out.clone()).unwrap();
|
||||||
|
|
||||||
assert!(
|
assert!(content_got == content_out);
|
||||||
content_got == content_out,
|
|
||||||
indoc::indoc!(
|
|
||||||
r"
|
|
||||||
|
|
||||||
|
|
||||||
input from {}:
|
|
||||||
{}
|
|
||||||
after formatting:
|
|
||||||
{}
|
|
||||||
expected from {}:
|
|
||||||
{}
|
|
||||||
"
|
|
||||||
),
|
|
||||||
path_in,
|
|
||||||
&content_in,
|
|
||||||
&content_got,
|
|
||||||
path_out,
|
|
||||||
&content_out,
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue