mirror of
https://github.com/RGBCube/alejandra
synced 2025-07-30 12:07:46 +00:00
feat: formatter poc
This commit is contained in:
parent
6adfbe8516
commit
8d545a62ad
77 changed files with 4210 additions and 0 deletions
3
.gitignore
vendored
Normal file
3
.gitignore
vendored
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
/result*
|
||||||
|
/target/
|
||||||
|
/tarpaulin*
|
16
Cargo.toml
Normal file
16
Cargo.toml
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
[dependencies]
|
||||||
|
clap = "3"
|
||||||
|
rnix = "0.10"
|
||||||
|
rowan = "0.15"
|
||||||
|
walkdir = "2"
|
||||||
|
|
||||||
|
[dev-dependencies]
|
||||||
|
indoc = "*"
|
||||||
|
|
||||||
|
[package]
|
||||||
|
authors = ["Kevin Amado <kamadorueda@gmail.com>"]
|
||||||
|
description = "The uncompromising Nix formatter"
|
||||||
|
edition = "2021"
|
||||||
|
name = "alejandra"
|
||||||
|
repository = "https://github.com/kamadorueda/alejandra"
|
||||||
|
version = "0.1.0"
|
81
flake.nix
Normal file
81
flake.nix
Normal file
|
@ -0,0 +1,81 @@
|
||||||
|
{
|
||||||
|
inputs =
|
||||||
|
{
|
||||||
|
flakeUtils.url = "github:numtide/flake-utils";
|
||||||
|
nixpkgs.url = "github:nixos/nixpkgs/nixpkgs-unstable";
|
||||||
|
};
|
||||||
|
outputs =
|
||||||
|
inputs:
|
||||||
|
inputs.flakeUtils.lib.eachDefaultSystem
|
||||||
|
(
|
||||||
|
system:
|
||||||
|
let
|
||||||
|
nixpkgs = import inputs.nixpkgs { inherit system; };
|
||||||
|
cargoToml = builtins.fromTOML (builtins.readFile ./Cargo.toml);
|
||||||
|
in
|
||||||
|
{
|
||||||
|
checks =
|
||||||
|
{
|
||||||
|
defaultPackage = inputs.self.defaultPackage.${ system };
|
||||||
|
inherit (inputs.self.packages.${ system }) nixpkgsFormatted;
|
||||||
|
};
|
||||||
|
defaultApp =
|
||||||
|
{
|
||||||
|
type = "app";
|
||||||
|
program =
|
||||||
|
"${ inputs.self.defaultPackage.${ system } }/bin/alejandra";
|
||||||
|
};
|
||||||
|
defaultPackage =
|
||||||
|
nixpkgs.rustPlatform.buildRustPackage
|
||||||
|
{
|
||||||
|
pname = cargoToml.package.name;
|
||||||
|
version = cargoToml.package.version;
|
||||||
|
src = inputs.self.sourceInfo;
|
||||||
|
cargoLock.lockFile = ./Cargo.lock;
|
||||||
|
NIX_BUILD_CORES = 0;
|
||||||
|
meta =
|
||||||
|
{
|
||||||
|
description = inputs.self.description;
|
||||||
|
homepage = "https://github.com/kamadorueda/alejandra";
|
||||||
|
license = nixpkgs.lib.licenses.mit;
|
||||||
|
maintainers = [ nixpkgs.lib.maintainers.kamadorueda ];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
devShell =
|
||||||
|
nixpkgs.mkShell
|
||||||
|
{
|
||||||
|
packages = [ nixpkgs.cargo-tarpaulin nixpkgs.rustup ];
|
||||||
|
shellHook =
|
||||||
|
''
|
||||||
|
rustup toolchain install nightly
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
packages =
|
||||||
|
{
|
||||||
|
nixpkgsFormatted =
|
||||||
|
nixpkgs.stdenv.mkDerivation
|
||||||
|
{
|
||||||
|
name = "nixpkgs-formatted";
|
||||||
|
builder =
|
||||||
|
builtins.toFile
|
||||||
|
"builder.sh"
|
||||||
|
''
|
||||||
|
source $stdenv/setup
|
||||||
|
|
||||||
|
cp -rT $nixpkgs $out
|
||||||
|
chmod -R +w $out
|
||||||
|
|
||||||
|
alejandra $out
|
||||||
|
|
||||||
|
git diff --no-index $nixpkgs $out > $diff || true
|
||||||
|
'';
|
||||||
|
buildInputs =
|
||||||
|
[ inputs.self.defaultPackage.${ system } nixpkgs.git ];
|
||||||
|
nixpkgs = inputs.nixpkgs.sourceInfo.outPath;
|
||||||
|
NIX_BUILD_CORES = 0;
|
||||||
|
outputs = [ "diff" "out" ];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
253
src/builder.rs
Normal file
253
src/builder.rs
Normal file
|
@ -0,0 +1,253 @@
|
||||||
|
#[derive(PartialEq)]
|
||||||
|
pub enum Step {
|
||||||
|
Comment(String),
|
||||||
|
Dedent,
|
||||||
|
Format(rnix::SyntaxElement),
|
||||||
|
FormatWider(rnix::SyntaxElement),
|
||||||
|
Indent,
|
||||||
|
NewLine,
|
||||||
|
Pad,
|
||||||
|
Token(rnix::SyntaxKind, String),
|
||||||
|
Whitespace,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Clone)]
|
||||||
|
pub struct BuildCtx {
|
||||||
|
pub config: crate::config::Config,
|
||||||
|
pub force_wide: bool,
|
||||||
|
pub indentation: usize,
|
||||||
|
pub pos_new: crate::position::Position,
|
||||||
|
pub pos_old: crate::position::Position,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl BuildCtx {
|
||||||
|
pub fn new(
|
||||||
|
config: crate::config::Config,
|
||||||
|
force_wide: bool,
|
||||||
|
pos_new: crate::position::Position,
|
||||||
|
pos_old: crate::position::Position,
|
||||||
|
) -> BuildCtx {
|
||||||
|
BuildCtx { config, force_wide, indentation: 0, pos_new, pos_old }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn build(
|
||||||
|
config: &crate::config::Config,
|
||||||
|
element: rnix::SyntaxElement,
|
||||||
|
force_wide: bool,
|
||||||
|
path: &str,
|
||||||
|
) -> Option<rowan::GreenNode> {
|
||||||
|
let mut builder = rowan::GreenNodeBuilder::new();
|
||||||
|
let mut build_ctx = BuildCtx::new(
|
||||||
|
config.clone(),
|
||||||
|
force_wide,
|
||||||
|
crate::position::Position::new(),
|
||||||
|
crate::position::Position::new(),
|
||||||
|
);
|
||||||
|
|
||||||
|
build_step(
|
||||||
|
&mut builder,
|
||||||
|
&mut build_ctx,
|
||||||
|
path,
|
||||||
|
&crate::builder::Step::Format(element),
|
||||||
|
);
|
||||||
|
|
||||||
|
if build_ctx.force_wide && build_ctx.pos_new.line > 1 {
|
||||||
|
None
|
||||||
|
} else {
|
||||||
|
Some(builder.finish())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn build_step(
|
||||||
|
builder: &mut rowan::GreenNodeBuilder,
|
||||||
|
build_ctx: &mut BuildCtx,
|
||||||
|
path: &str,
|
||||||
|
step: &crate::builder::Step,
|
||||||
|
) {
|
||||||
|
if build_ctx.force_wide && build_ctx.pos_new.line > 1 {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
match step {
|
||||||
|
crate::builder::Step::Comment(text) => {
|
||||||
|
add_token(
|
||||||
|
builder,
|
||||||
|
build_ctx,
|
||||||
|
rnix::SyntaxKind::TOKEN_COMMENT,
|
||||||
|
text,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
crate::builder::Step::Dedent => {
|
||||||
|
build_ctx.indentation -= 1;
|
||||||
|
}
|
||||||
|
crate::builder::Step::Format(element) => {
|
||||||
|
format(builder, build_ctx, element, path);
|
||||||
|
}
|
||||||
|
crate::builder::Step::FormatWider(element) => {
|
||||||
|
format_wider(builder, build_ctx, element, path);
|
||||||
|
}
|
||||||
|
crate::builder::Step::Indent => {
|
||||||
|
build_ctx.indentation += 1;
|
||||||
|
}
|
||||||
|
crate::builder::Step::NewLine => {
|
||||||
|
add_token(
|
||||||
|
builder,
|
||||||
|
build_ctx,
|
||||||
|
rnix::SyntaxKind::TOKEN_WHITESPACE,
|
||||||
|
"\n",
|
||||||
|
);
|
||||||
|
}
|
||||||
|
crate::builder::Step::Pad => {
|
||||||
|
if build_ctx.indentation > 0 {
|
||||||
|
add_token(
|
||||||
|
builder,
|
||||||
|
build_ctx,
|
||||||
|
rnix::SyntaxKind::TOKEN_COMMA,
|
||||||
|
&format!("{0:<1$}", "", 2 * build_ctx.indentation),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
crate::builder::Step::Token(kind, text) => {
|
||||||
|
add_token(builder, build_ctx, *kind, &text);
|
||||||
|
}
|
||||||
|
crate::builder::Step::Whitespace => {
|
||||||
|
add_token(
|
||||||
|
builder,
|
||||||
|
build_ctx,
|
||||||
|
rnix::SyntaxKind::TOKEN_WHITESPACE,
|
||||||
|
" ",
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn add_token(
|
||||||
|
builder: &mut rowan::GreenNodeBuilder,
|
||||||
|
build_ctx: &mut BuildCtx,
|
||||||
|
kind: rnix::SyntaxKind,
|
||||||
|
text: &str,
|
||||||
|
) {
|
||||||
|
builder.token(rowan::SyntaxKind(kind as u16), text);
|
||||||
|
build_ctx.pos_new.update(text);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn format(
|
||||||
|
builder: &mut rowan::GreenNodeBuilder,
|
||||||
|
build_ctx: &mut BuildCtx,
|
||||||
|
element: &rnix::SyntaxElement,
|
||||||
|
path: &str,
|
||||||
|
) {
|
||||||
|
let kind = element.kind();
|
||||||
|
|
||||||
|
match element {
|
||||||
|
rnix::SyntaxElement::Node(node) => {
|
||||||
|
builder.start_node(rowan::SyntaxKind(kind as u16));
|
||||||
|
|
||||||
|
let rule = match kind {
|
||||||
|
rnix::SyntaxKind::NODE_APPLY => crate::rules::apply::rule,
|
||||||
|
rnix::SyntaxKind::NODE_ASSERT => crate::rules::assert::rule,
|
||||||
|
rnix::SyntaxKind::NODE_ATTR_SET => crate::rules::attr_set::rule,
|
||||||
|
rnix::SyntaxKind::NODE_BIN_OP => crate::rules::bin_op::rule,
|
||||||
|
rnix::SyntaxKind::NODE_DYNAMIC => crate::rules::dynamic::rule,
|
||||||
|
rnix::SyntaxKind::NODE_ERROR => {
|
||||||
|
eprintln!("Warning: found an error node at: {}", path);
|
||||||
|
crate::rules::default
|
||||||
|
}
|
||||||
|
rnix::SyntaxKind::NODE_IDENT => crate::rules::default,
|
||||||
|
rnix::SyntaxKind::NODE_IF_ELSE => crate::rules::if_else::rule,
|
||||||
|
rnix::SyntaxKind::NODE_INHERIT => crate::rules::inherit::rule,
|
||||||
|
rnix::SyntaxKind::NODE_INHERIT_FROM => {
|
||||||
|
crate::rules::inherit_from::rule
|
||||||
|
}
|
||||||
|
rnix::SyntaxKind::NODE_KEY => crate::rules::default,
|
||||||
|
rnix::SyntaxKind::NODE_KEY_VALUE => {
|
||||||
|
crate::rules::key_value::rule
|
||||||
|
}
|
||||||
|
rnix::SyntaxKind::NODE_LAMBDA => crate::rules::lambda::rule,
|
||||||
|
rnix::SyntaxKind::NODE_LET_IN => crate::rules::let_in::rule,
|
||||||
|
rnix::SyntaxKind::NODE_LIST => crate::rules::list::rule,
|
||||||
|
rnix::SyntaxKind::NODE_LITERAL => crate::rules::default,
|
||||||
|
rnix::SyntaxKind::NODE_LEGACY_LET => {
|
||||||
|
eprintln!(
|
||||||
|
"Warning: found a `legacy let` expression at: {}",
|
||||||
|
path
|
||||||
|
);
|
||||||
|
crate::rules::default
|
||||||
|
}
|
||||||
|
rnix::SyntaxKind::NODE_OR_DEFAULT => {
|
||||||
|
crate::rules::or_default::rule
|
||||||
|
}
|
||||||
|
rnix::SyntaxKind::NODE_PAREN => crate::rules::paren::rule,
|
||||||
|
rnix::SyntaxKind::NODE_PAT_BIND => crate::rules::pat_bind::rule,
|
||||||
|
rnix::SyntaxKind::NODE_PATTERN => crate::rules::pattern::rule,
|
||||||
|
rnix::SyntaxKind::NODE_PAT_ENTRY => {
|
||||||
|
crate::rules::pat_entry::rule
|
||||||
|
}
|
||||||
|
rnix::SyntaxKind::NODE_PATH_WITH_INTERPOL => {
|
||||||
|
crate::rules::default
|
||||||
|
}
|
||||||
|
rnix::SyntaxKind::NODE_ROOT => crate::rules::root::rule,
|
||||||
|
rnix::SyntaxKind::NODE_SELECT => crate::rules::select::rule,
|
||||||
|
rnix::SyntaxKind::NODE_STRING => crate::rules::default,
|
||||||
|
rnix::SyntaxKind::NODE_STRING_INTERPOL => {
|
||||||
|
crate::rules::string_interpol::rule
|
||||||
|
}
|
||||||
|
rnix::SyntaxKind::NODE_UNARY_OP => crate::rules::default,
|
||||||
|
rnix::SyntaxKind::NODE_WITH => crate::rules::with::rule,
|
||||||
|
kind => {
|
||||||
|
panic!("Missing rule for {:?} at: {}", kind, path);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
for step in rule(build_ctx, node) {
|
||||||
|
build_step(builder, build_ctx, path, &step);
|
||||||
|
}
|
||||||
|
|
||||||
|
builder.finish_node();
|
||||||
|
}
|
||||||
|
rnix::SyntaxElement::Token(token) => {
|
||||||
|
add_token(builder, build_ctx, kind, token.text());
|
||||||
|
build_ctx.pos_old.update(token.text());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn format_wider(
|
||||||
|
builder: &mut rowan::GreenNodeBuilder,
|
||||||
|
build_ctx: &mut BuildCtx,
|
||||||
|
element: &rnix::SyntaxElement,
|
||||||
|
path: &str,
|
||||||
|
) {
|
||||||
|
match element {
|
||||||
|
rnix::SyntaxElement::Node(node) => {
|
||||||
|
let maybe_green_node = build(
|
||||||
|
&build_ctx.config.with_layout(crate::config::Layout::Wide),
|
||||||
|
node.clone().into(),
|
||||||
|
true,
|
||||||
|
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();
|
||||||
|
build_ctx_clone.config = build_ctx.config.with_layout(layout);
|
||||||
|
format(builder, &mut build_ctx_clone, element, path);
|
||||||
|
}
|
||||||
|
rnix::SyntaxElement::Token(_) => {
|
||||||
|
format(builder, build_ctx, element, path);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
193
src/children.rs
Normal file
193
src/children.rs
Normal file
|
@ -0,0 +1,193 @@
|
||||||
|
#[derive(Clone)]
|
||||||
|
pub struct Child {
|
||||||
|
pub element: rnix::SyntaxElement,
|
||||||
|
pub pos: crate::position::Position,
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct Children {
|
||||||
|
children: Vec<Child>,
|
||||||
|
current_index: usize,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Children {
|
||||||
|
pub fn new(
|
||||||
|
build_ctx: &crate::builder::BuildCtx,
|
||||||
|
node: &rnix::SyntaxNode,
|
||||||
|
) -> Children {
|
||||||
|
let mut children = Vec::new();
|
||||||
|
|
||||||
|
let mut pos = build_ctx.pos_old.clone();
|
||||||
|
|
||||||
|
for child in node.children_with_tokens() {
|
||||||
|
match child {
|
||||||
|
rnix::SyntaxElement::Node(_) => {
|
||||||
|
children
|
||||||
|
.push(Child { element: child, pos: pos.clone() });
|
||||||
|
}
|
||||||
|
rnix::SyntaxElement::Token(token) => {
|
||||||
|
match token.kind() {
|
||||||
|
rnix::SyntaxKind::TOKEN_WHITESPACE => {}
|
||||||
|
_ => {
|
||||||
|
children.push(Child {
|
||||||
|
element: token.clone().into(),
|
||||||
|
pos: pos.clone(),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pos.update(token.text());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Children { children, current_index: 0 }
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn count(&self) -> usize {
|
||||||
|
self.children.len()
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn current_index(&self) -> usize {
|
||||||
|
self.current_index
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn get(&mut self, index: usize) -> Option<Child> {
|
||||||
|
if index + 1 > self.children.len() {
|
||||||
|
None
|
||||||
|
} else {
|
||||||
|
Some(self.children[index].clone())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn get_next(&mut self) -> Option<Child> {
|
||||||
|
let child = self.get(self.current_index);
|
||||||
|
self.move_next();
|
||||||
|
child
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn has_next(&self) -> bool {
|
||||||
|
self.current_index < self.children.len()
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn peek_next(&mut self) -> Option<Child> {
|
||||||
|
self.get(self.current_index)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn peek_prev(&mut self) -> Option<Child> {
|
||||||
|
if self.current_index >= 1 {
|
||||||
|
self.get(self.current_index - 1)
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn move_next(&mut self) {
|
||||||
|
self.current_index += 1
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn move_prev(&mut self) {
|
||||||
|
self.current_index -= 1
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn has_comments(&self) -> bool {
|
||||||
|
self.children.iter().any(|child| {
|
||||||
|
child.element.kind() == rnix::SyntaxKind::TOKEN_COMMENT
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn drain_comment<F: FnMut(String)>(&mut self, mut callback: F) {
|
||||||
|
if let Some(child) = self.peek_next() {
|
||||||
|
match child.element.kind() {
|
||||||
|
rnix::SyntaxKind::TOKEN_COMMENT => {
|
||||||
|
callback(dedent_comment(
|
||||||
|
&child.pos,
|
||||||
|
child.element.into_token().unwrap().text(),
|
||||||
|
));
|
||||||
|
self.move_next();
|
||||||
|
}
|
||||||
|
_ => {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn drain_comments<F: FnMut(String)>(&mut self, mut callback: F) {
|
||||||
|
while let Some(child) = self.peek_next() {
|
||||||
|
match child.element.kind() {
|
||||||
|
rnix::SyntaxKind::TOKEN_COMMENT => {
|
||||||
|
callback(dedent_comment(
|
||||||
|
&child.pos,
|
||||||
|
child.element.into_token().unwrap().text(),
|
||||||
|
));
|
||||||
|
self.move_next();
|
||||||
|
}
|
||||||
|
_ => {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn dedent_comment(pos: &crate::position::Position, text: &str) -> String {
|
||||||
|
if text.starts_with("#") {
|
||||||
|
text.to_string()
|
||||||
|
} else {
|
||||||
|
let text = text[2..text.len() - 2]
|
||||||
|
.lines()
|
||||||
|
.enumerate()
|
||||||
|
.map(|(index, line)| {
|
||||||
|
if index > 0 {
|
||||||
|
line.chars()
|
||||||
|
.skip(if pos.column >= 1 { pos.column - 1 } else { 0 })
|
||||||
|
.collect::<String>()
|
||||||
|
} else {
|
||||||
|
line.to_string()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.collect::<Vec<String>>()
|
||||||
|
.join("\n");
|
||||||
|
|
||||||
|
format!("/*{}*/", text)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// fn dedent_string(
|
||||||
|
// pos: &crate::position::Position,
|
||||||
|
// node: &rnix::SyntaxNode,
|
||||||
|
// ) -> String {
|
||||||
|
// eprintln!("{}", text);
|
||||||
|
// if text.starts_with("\"") {
|
||||||
|
// text.to_string()
|
||||||
|
// } else {
|
||||||
|
// node.children_with_tokens().filter(|child| {
|
||||||
|
// child.kind() == rnix::SyntaxKind::TOKEN_STRING_CONTENT
|
||||||
|
// }).map(|child| {
|
||||||
|
// let lines = child.into_token().unwrap().lines();
|
||||||
|
// ""
|
||||||
|
// " rustup toolchain install nightly"
|
||||||
|
// " "
|
||||||
|
// ""
|
||||||
|
// " "
|
||||||
|
// });
|
||||||
|
|
||||||
|
// // let padding_to_first_char = lines
|
||||||
|
// // TOKEN_STRING_CONTENT
|
||||||
|
|
||||||
|
// let text = text[2..text.len() - 2]
|
||||||
|
// .lines()
|
||||||
|
// .enumerate()
|
||||||
|
// .map(|(index, line)| {
|
||||||
|
// if index > 0 {
|
||||||
|
// line.chars()
|
||||||
|
// .skip(if pos.column >= 1 { pos.column - 1 } else { 0 })
|
||||||
|
// .collect::<String>()
|
||||||
|
// } else {
|
||||||
|
// line.to_string()
|
||||||
|
// }
|
||||||
|
// })
|
||||||
|
// .collect::<Vec<String>>()
|
||||||
|
// .join("\n");
|
||||||
|
|
||||||
|
// format!("/*{}*/", text)
|
||||||
|
// }
|
||||||
|
// }
|
27
src/cli.rs
Normal file
27
src/cli.rs
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
pub fn parse(args: Vec<String>) -> clap::ArgMatches {
|
||||||
|
clap::App::new("alejandra")
|
||||||
|
.version("v0.1.0")
|
||||||
|
.about("The uncompromising Nix formatter.")
|
||||||
|
.arg(
|
||||||
|
clap::Arg::new("debug")
|
||||||
|
.help("Enable debug mode.")
|
||||||
|
.long("debug")
|
||||||
|
.short('d')
|
||||||
|
.takes_value(false),
|
||||||
|
)
|
||||||
|
.arg(
|
||||||
|
clap::Arg::new("max-width")
|
||||||
|
.default_value("120")
|
||||||
|
.help("How many characters per line to allow.")
|
||||||
|
.long("max-width")
|
||||||
|
.takes_value(true)
|
||||||
|
.value_name("CHARS"),
|
||||||
|
)
|
||||||
|
.arg(
|
||||||
|
clap::Arg::new("paths")
|
||||||
|
.help("Files or directories, or none to format stdin.")
|
||||||
|
.multiple_values(true),
|
||||||
|
)
|
||||||
|
.term_width(80)
|
||||||
|
.get_matches_from(args)
|
||||||
|
}
|
42
src/config.rs
Normal file
42
src/config.rs
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
#[derive(Clone)]
|
||||||
|
pub enum Layout {
|
||||||
|
Tall,
|
||||||
|
Wide,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Clone)]
|
||||||
|
pub struct Config {
|
||||||
|
debug: bool,
|
||||||
|
layout: Layout,
|
||||||
|
max_width: usize,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Config {
|
||||||
|
pub fn new() -> Config {
|
||||||
|
Config { debug: false, layout: Layout::Tall, max_width: 80 }
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn debug(&self) -> bool {
|
||||||
|
self.debug
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn layout(&self) -> &Layout {
|
||||||
|
&self.layout
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn max_width(&self) -> usize {
|
||||||
|
self.max_width
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn with_debug(&self, debug: bool) -> Config {
|
||||||
|
Config { debug, layout: self.layout.clone(), max_width: self.max_width }
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn with_layout(&self, layout: Layout) -> Config {
|
||||||
|
Config { debug: self.debug, layout, max_width: self.max_width }
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn with_max_width(&self, max_width: usize) -> Config {
|
||||||
|
Config { debug: self.debug, layout: self.layout.clone(), max_width }
|
||||||
|
}
|
||||||
|
}
|
27
src/debug.rs
Normal file
27
src/debug.rs
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
pub fn display(
|
||||||
|
element: &rowan::NodeOrToken<&rowan::GreenNodeData, &rowan::GreenTokenData>,
|
||||||
|
) {
|
||||||
|
eprintln!("AST:");
|
||||||
|
display_recursive(element, 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn display_recursive(
|
||||||
|
element: &rowan::NodeOrToken<&rowan::GreenNodeData, &rowan::GreenTokenData>,
|
||||||
|
depth: usize,
|
||||||
|
) {
|
||||||
|
let kind = unsafe {
|
||||||
|
std::mem::transmute::<u16, rnix::SyntaxKind>(element.kind().0)
|
||||||
|
};
|
||||||
|
|
||||||
|
match element {
|
||||||
|
rowan::NodeOrToken::Node(node) => {
|
||||||
|
eprintln!("{0:<1$}{2:?}", "", 2 * depth, kind);
|
||||||
|
for child in node.children() {
|
||||||
|
display_recursive(&child, depth + 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
rowan::NodeOrToken::Token(token) => {
|
||||||
|
eprintln!("{0:<1$}{2:?} {3:?}", "", 2 * depth, kind, token.text());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
29
src/find.rs
Normal file
29
src/find.rs
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
pub fn nix_files(paths: Vec<&str>) -> Vec<String> {
|
||||||
|
paths.iter().flat_map(nix_files_in_path).collect()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn nix_files_in_path(path: &&str) -> Vec<String> {
|
||||||
|
walkdir::WalkDir::new(path)
|
||||||
|
.into_iter()
|
||||||
|
.filter_entry(is_nix_file_or_dir)
|
||||||
|
.filter_map(|entry| match entry {
|
||||||
|
Ok(entry) => Some(entry),
|
||||||
|
Err(_) => None,
|
||||||
|
})
|
||||||
|
.filter(is_nix_file)
|
||||||
|
.map(to_full_path)
|
||||||
|
.collect()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn is_nix_file(entry: &walkdir::DirEntry) -> bool {
|
||||||
|
entry.file_type().is_file()
|
||||||
|
&& entry.file_name().to_str().unwrap().ends_with(".nix")
|
||||||
|
}
|
||||||
|
|
||||||
|
fn is_nix_file_or_dir(entry: &walkdir::DirEntry) -> bool {
|
||||||
|
entry.file_type().is_dir() || is_nix_file(entry)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn to_full_path(entry: walkdir::DirEntry) -> String {
|
||||||
|
entry.path().to_str().unwrap().to_string()
|
||||||
|
}
|
32
src/format.rs
Normal file
32
src/format.rs
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
pub fn string(
|
||||||
|
config: &crate::config::Config,
|
||||||
|
path: &str,
|
||||||
|
string: String,
|
||||||
|
) -> String {
|
||||||
|
let tokens = rnix::tokenizer::Tokenizer::new(&string);
|
||||||
|
let ast = rnix::parser::parse(tokens);
|
||||||
|
|
||||||
|
for error in ast.errors() {
|
||||||
|
eprintln!("Warning: parsing error: {}, at: {}", error, path);
|
||||||
|
}
|
||||||
|
|
||||||
|
let green_node =
|
||||||
|
crate::builder::build(config, ast.node().into(), false, path).unwrap();
|
||||||
|
|
||||||
|
if config.debug() {
|
||||||
|
crate::debug::display(&(&green_node).into());
|
||||||
|
}
|
||||||
|
|
||||||
|
green_node.to_string()
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn file(config: &crate::config::Config, path: &str) -> std::io::Result<()> {
|
||||||
|
use std::io::Write;
|
||||||
|
|
||||||
|
let input = std::fs::read_to_string(path)?;
|
||||||
|
let output = crate::format::string(config, path, input);
|
||||||
|
|
||||||
|
std::fs::File::create(path)?.write_all(output.as_bytes())?;
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
9
src/lib.rs
Normal file
9
src/lib.rs
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
pub mod builder;
|
||||||
|
pub mod children;
|
||||||
|
pub mod cli;
|
||||||
|
pub mod config;
|
||||||
|
pub mod debug;
|
||||||
|
pub mod find;
|
||||||
|
pub mod format;
|
||||||
|
pub mod position;
|
||||||
|
pub mod rules;
|
33
src/main.rs
Normal file
33
src/main.rs
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
use std::io::Read;
|
||||||
|
|
||||||
|
fn main() -> std::io::Result<()> {
|
||||||
|
let matches = alejandra::cli::parse(std::env::args().collect());
|
||||||
|
|
||||||
|
let debug: bool = matches.is_present("debug");
|
||||||
|
let max_width: usize =
|
||||||
|
matches.value_of("max-width").unwrap().parse().unwrap();
|
||||||
|
|
||||||
|
let config = alejandra::config::Config::new()
|
||||||
|
.with_debug(debug)
|
||||||
|
.with_max_width(max_width);
|
||||||
|
|
||||||
|
match matches.values_of("paths") {
|
||||||
|
Some(paths) => {
|
||||||
|
let paths: Vec<String> =
|
||||||
|
alejandra::find::nix_files(paths.collect());
|
||||||
|
|
||||||
|
eprintln!("Formatting {} files.", paths.len());
|
||||||
|
for path in paths {
|
||||||
|
alejandra::format::file(&config, &path)?;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
None => {
|
||||||
|
eprintln!("Formatting stdin.");
|
||||||
|
let mut stdin = String::new();
|
||||||
|
std::io::stdin().read_to_string(&mut stdin).unwrap();
|
||||||
|
print!("{}", alejandra::format::string(&config, "stdin", stdin));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
std::process::exit(0);
|
||||||
|
}
|
24
src/position.rs
Normal file
24
src/position.rs
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
#[derive(Clone, Debug)]
|
||||||
|
pub struct Position {
|
||||||
|
pub column: usize,
|
||||||
|
pub line: usize,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Position {
|
||||||
|
pub fn new() -> Position {
|
||||||
|
Position { column: 0, line: 1 }
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn update(&mut self, text: &str) {
|
||||||
|
let chars: Vec<char> = text.chars().collect();
|
||||||
|
let newlines = chars.iter().filter(|&c| *c == '\n').count();
|
||||||
|
self.line += newlines;
|
||||||
|
if newlines > 0 {
|
||||||
|
self.column = 0
|
||||||
|
}
|
||||||
|
self.column += match chars.iter().rposition(|c| *c == '\n') {
|
||||||
|
Some(pos) => chars.len() - pos,
|
||||||
|
None => chars.len(),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
57
src/rules/apply.rs
Normal file
57
src/rules/apply.rs
Normal file
|
@ -0,0 +1,57 @@
|
||||||
|
pub fn rule(
|
||||||
|
build_ctx: &crate::builder::BuildCtx,
|
||||||
|
node: &rnix::SyntaxNode,
|
||||||
|
) -> std::collections::LinkedList<crate::builder::Step> {
|
||||||
|
let mut steps = std::collections::LinkedList::new();
|
||||||
|
|
||||||
|
let mut children = crate::children::Children::new(build_ctx, node);
|
||||||
|
|
||||||
|
let layout = if children.has_comments() {
|
||||||
|
&crate::config::Layout::Tall
|
||||||
|
} else {
|
||||||
|
build_ctx.config.layout()
|
||||||
|
};
|
||||||
|
|
||||||
|
let child = children.get_next().unwrap();
|
||||||
|
match layout {
|
||||||
|
crate::config::Layout::Tall => {
|
||||||
|
match child.element.kind() {
|
||||||
|
rnix::SyntaxKind::NODE_APPLY => {
|
||||||
|
steps
|
||||||
|
.push_back(crate::builder::Step::Format(child.element));
|
||||||
|
}
|
||||||
|
_ => {
|
||||||
|
steps.push_back(crate::builder::Step::FormatWider(
|
||||||
|
child.element,
|
||||||
|
));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
steps.push_back(crate::builder::Step::Indent);
|
||||||
|
steps.push_back(crate::builder::Step::NewLine);
|
||||||
|
steps.push_back(crate::builder::Step::Pad);
|
||||||
|
}
|
||||||
|
crate::config::Layout::Wide => {
|
||||||
|
steps.push_back(crate::builder::Step::Format(child.element));
|
||||||
|
steps.push_back(crate::builder::Step::Whitespace);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
children.drain_comments(|text| {
|
||||||
|
steps.push_back(crate::builder::Step::Comment(text));
|
||||||
|
steps.push_back(crate::builder::Step::NewLine);
|
||||||
|
steps.push_back(crate::builder::Step::Pad);
|
||||||
|
});
|
||||||
|
|
||||||
|
let child = children.get_next().unwrap();
|
||||||
|
match layout {
|
||||||
|
crate::config::Layout::Tall => {
|
||||||
|
steps.push_back(crate::builder::Step::FormatWider(child.element));
|
||||||
|
steps.push_back(crate::builder::Step::Dedent);
|
||||||
|
}
|
||||||
|
crate::config::Layout::Wide => {
|
||||||
|
steps.push_back(crate::builder::Step::Format(child.element));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
steps
|
||||||
|
}
|
72
src/rules/assert.rs
Normal file
72
src/rules/assert.rs
Normal file
|
@ -0,0 +1,72 @@
|
||||||
|
pub fn rule(
|
||||||
|
build_ctx: &crate::builder::BuildCtx,
|
||||||
|
node: &rnix::SyntaxNode,
|
||||||
|
) -> std::collections::LinkedList<crate::builder::Step> {
|
||||||
|
let mut steps = std::collections::LinkedList::new();
|
||||||
|
|
||||||
|
let mut children = crate::children::Children::new(build_ctx, node);
|
||||||
|
|
||||||
|
let layout = if children.has_comments() {
|
||||||
|
&crate::config::Layout::Tall
|
||||||
|
} else {
|
||||||
|
build_ctx.config.layout()
|
||||||
|
};
|
||||||
|
|
||||||
|
// assert
|
||||||
|
let child = children.get_next().unwrap();
|
||||||
|
steps.push_back(crate::builder::Step::Format(child.element));
|
||||||
|
|
||||||
|
// /**/
|
||||||
|
children.drain_comments(|text| {
|
||||||
|
steps.push_back(crate::builder::Step::NewLine);
|
||||||
|
steps.push_back(crate::builder::Step::Pad);
|
||||||
|
steps.push_back(crate::builder::Step::Comment(text));
|
||||||
|
});
|
||||||
|
|
||||||
|
if let rnix::SyntaxKind::TOKEN_COMMENT =
|
||||||
|
children.peek_prev().unwrap().element.kind()
|
||||||
|
{
|
||||||
|
steps.push_back(crate::builder::Step::NewLine);
|
||||||
|
steps.push_back(crate::builder::Step::Pad);
|
||||||
|
} else {
|
||||||
|
steps.push_back(crate::builder::Step::Whitespace);
|
||||||
|
}
|
||||||
|
|
||||||
|
// expr
|
||||||
|
let child = children.get_next().unwrap();
|
||||||
|
match layout {
|
||||||
|
crate::config::Layout::Tall => {
|
||||||
|
steps.push_back(crate::builder::Step::FormatWider(child.element));
|
||||||
|
}
|
||||||
|
crate::config::Layout::Wide => {
|
||||||
|
steps.push_back(crate::builder::Step::Format(child.element));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ;
|
||||||
|
let child = children.get_next().unwrap();
|
||||||
|
steps.push_back(crate::builder::Step::Format(child.element));
|
||||||
|
|
||||||
|
// /**/
|
||||||
|
children.drain_comments(|text| {
|
||||||
|
steps.push_back(crate::builder::Step::NewLine);
|
||||||
|
steps.push_back(crate::builder::Step::Pad);
|
||||||
|
steps.push_back(crate::builder::Step::Comment(text));
|
||||||
|
});
|
||||||
|
|
||||||
|
// expr
|
||||||
|
let child = children.get_next().unwrap();
|
||||||
|
match layout {
|
||||||
|
crate::config::Layout::Tall => {
|
||||||
|
steps.push_back(crate::builder::Step::NewLine);
|
||||||
|
steps.push_back(crate::builder::Step::Pad);
|
||||||
|
steps.push_back(crate::builder::Step::FormatWider(child.element));
|
||||||
|
}
|
||||||
|
crate::config::Layout::Wide => {
|
||||||
|
steps.push_back(crate::builder::Step::Whitespace);
|
||||||
|
steps.push_back(crate::builder::Step::Format(child.element));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
steps
|
||||||
|
}
|
86
src/rules/attr_set.rs
Normal file
86
src/rules/attr_set.rs
Normal file
|
@ -0,0 +1,86 @@
|
||||||
|
pub fn rule(
|
||||||
|
build_ctx: &crate::builder::BuildCtx,
|
||||||
|
node: &rnix::SyntaxNode,
|
||||||
|
) -> std::collections::LinkedList<crate::builder::Step> {
|
||||||
|
let mut steps = std::collections::LinkedList::new();
|
||||||
|
|
||||||
|
let mut children = crate::children::Children::new(build_ctx, node);
|
||||||
|
|
||||||
|
let layout = if children.has_comments() {
|
||||||
|
&crate::config::Layout::Tall
|
||||||
|
} else {
|
||||||
|
build_ctx.config.layout()
|
||||||
|
};
|
||||||
|
|
||||||
|
// {
|
||||||
|
let child = children.get_next().unwrap();
|
||||||
|
steps.push_back(crate::builder::Step::Format(child.element));
|
||||||
|
match layout {
|
||||||
|
crate::config::Layout::Tall => {
|
||||||
|
steps.push_back(crate::builder::Step::Indent);
|
||||||
|
}
|
||||||
|
crate::config::Layout::Wide => {}
|
||||||
|
}
|
||||||
|
|
||||||
|
loop {
|
||||||
|
// /**/
|
||||||
|
children.drain_comments(|text| {
|
||||||
|
steps.push_back(crate::builder::Step::NewLine);
|
||||||
|
steps.push_back(crate::builder::Step::Pad);
|
||||||
|
steps.push_back(crate::builder::Step::Comment(text));
|
||||||
|
});
|
||||||
|
|
||||||
|
if let Some(child) = children.peek_next() {
|
||||||
|
let kind = child.element.kind();
|
||||||
|
|
||||||
|
if let rnix::SyntaxKind::TOKEN_COMMENT
|
||||||
|
| rnix::SyntaxKind::TOKEN_CURLY_B_CLOSE = kind
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// item
|
||||||
|
match layout {
|
||||||
|
crate::config::Layout::Tall => {
|
||||||
|
steps.push_back(crate::builder::Step::NewLine);
|
||||||
|
steps.push_back(crate::builder::Step::Pad);
|
||||||
|
steps.push_back(crate::builder::Step::FormatWider(
|
||||||
|
child.element,
|
||||||
|
));
|
||||||
|
}
|
||||||
|
crate::config::Layout::Wide => {
|
||||||
|
steps.push_back(crate::builder::Step::Whitespace);
|
||||||
|
steps
|
||||||
|
.push_back(crate::builder::Step::Format(child.element));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
children.move_next();
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// /**/
|
||||||
|
children.drain_comments(|text| {
|
||||||
|
steps.push_back(crate::builder::Step::NewLine);
|
||||||
|
steps.push_back(crate::builder::Step::Pad);
|
||||||
|
steps.push_back(crate::builder::Step::Comment(text));
|
||||||
|
});
|
||||||
|
|
||||||
|
// }
|
||||||
|
let child = children.get_next().unwrap();
|
||||||
|
match layout {
|
||||||
|
crate::config::Layout::Tall => {
|
||||||
|
steps.push_back(crate::builder::Step::Dedent);
|
||||||
|
steps.push_back(crate::builder::Step::NewLine);
|
||||||
|
steps.push_back(crate::builder::Step::Pad);
|
||||||
|
}
|
||||||
|
crate::config::Layout::Wide => {
|
||||||
|
steps.push_back(crate::builder::Step::Whitespace);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
steps.push_back(crate::builder::Step::Format(child.element));
|
||||||
|
|
||||||
|
steps
|
||||||
|
}
|
85
src/rules/bin_op.rs
Normal file
85
src/rules/bin_op.rs
Normal file
|
@ -0,0 +1,85 @@
|
||||||
|
pub fn rule(
|
||||||
|
build_ctx: &crate::builder::BuildCtx,
|
||||||
|
node: &rnix::SyntaxNode,
|
||||||
|
) -> std::collections::LinkedList<crate::builder::Step> {
|
||||||
|
let mut steps = std::collections::LinkedList::new();
|
||||||
|
|
||||||
|
let mut children = crate::children::Children::new(build_ctx, node);
|
||||||
|
|
||||||
|
let layout = if children.has_comments() {
|
||||||
|
&crate::config::Layout::Tall
|
||||||
|
} else {
|
||||||
|
build_ctx.config.layout()
|
||||||
|
};
|
||||||
|
|
||||||
|
// expr
|
||||||
|
let child = children.get_next().unwrap();
|
||||||
|
match layout {
|
||||||
|
crate::config::Layout::Tall => {
|
||||||
|
match child.element.kind() {
|
||||||
|
rnix::SyntaxKind::NODE_BIN_OP => {
|
||||||
|
steps
|
||||||
|
.push_back(crate::builder::Step::Format(child.element));
|
||||||
|
}
|
||||||
|
_ => {
|
||||||
|
steps.push_back(crate::builder::Step::FormatWider(
|
||||||
|
child.element,
|
||||||
|
));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
steps.push_back(crate::builder::Step::Indent);
|
||||||
|
steps.push_back(crate::builder::Step::NewLine);
|
||||||
|
steps.push_back(crate::builder::Step::Pad);
|
||||||
|
}
|
||||||
|
crate::config::Layout::Wide => {
|
||||||
|
steps.push_back(crate::builder::Step::Format(child.element));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// /**/
|
||||||
|
children.drain_comments(|text| {
|
||||||
|
steps.push_back(crate::builder::Step::Comment(text));
|
||||||
|
steps.push_back(crate::builder::Step::NewLine);
|
||||||
|
steps.push_back(crate::builder::Step::Pad);
|
||||||
|
});
|
||||||
|
|
||||||
|
// operator
|
||||||
|
let child = children.get_next().unwrap();
|
||||||
|
match layout {
|
||||||
|
crate::config::Layout::Tall => {}
|
||||||
|
crate::config::Layout::Wide => {
|
||||||
|
steps.push_back(crate::builder::Step::Whitespace);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
steps.push_back(crate::builder::Step::Format(child.element));
|
||||||
|
|
||||||
|
// /**/
|
||||||
|
children.drain_comments(|text| {
|
||||||
|
steps.push_back(crate::builder::Step::NewLine);
|
||||||
|
steps.push_back(crate::builder::Step::Pad);
|
||||||
|
steps.push_back(crate::builder::Step::Comment(text));
|
||||||
|
});
|
||||||
|
|
||||||
|
if let rnix::SyntaxKind::TOKEN_COMMENT =
|
||||||
|
children.peek_prev().unwrap().element.kind()
|
||||||
|
{
|
||||||
|
steps.push_back(crate::builder::Step::NewLine);
|
||||||
|
steps.push_back(crate::builder::Step::Pad);
|
||||||
|
} else {
|
||||||
|
steps.push_back(crate::builder::Step::Whitespace);
|
||||||
|
}
|
||||||
|
|
||||||
|
// expr
|
||||||
|
let child = children.get_next().unwrap();
|
||||||
|
match layout {
|
||||||
|
crate::config::Layout::Tall => {
|
||||||
|
steps.push_back(crate::builder::Step::FormatWider(child.element));
|
||||||
|
steps.push_back(crate::builder::Step::Dedent);
|
||||||
|
}
|
||||||
|
crate::config::Layout::Wide => {
|
||||||
|
steps.push_back(crate::builder::Step::Format(child.element));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
steps
|
||||||
|
}
|
69
src/rules/dynamic.rs
Normal file
69
src/rules/dynamic.rs
Normal file
|
@ -0,0 +1,69 @@
|
||||||
|
pub fn rule(
|
||||||
|
build_ctx: &crate::builder::BuildCtx,
|
||||||
|
node: &rnix::SyntaxNode,
|
||||||
|
) -> std::collections::LinkedList<crate::builder::Step> {
|
||||||
|
let mut steps = std::collections::LinkedList::new();
|
||||||
|
|
||||||
|
let mut children = crate::children::Children::new(build_ctx, node);
|
||||||
|
|
||||||
|
let layout = if children.has_comments() {
|
||||||
|
&crate::config::Layout::Tall
|
||||||
|
} else {
|
||||||
|
build_ctx.config.layout()
|
||||||
|
};
|
||||||
|
|
||||||
|
// ${
|
||||||
|
let child = children.get_next().unwrap();
|
||||||
|
steps.push_back(crate::builder::Step::Format(child.element));
|
||||||
|
match layout {
|
||||||
|
crate::config::Layout::Tall => {
|
||||||
|
steps.push_back(crate::builder::Step::Indent);
|
||||||
|
steps.push_back(crate::builder::Step::NewLine);
|
||||||
|
steps.push_back(crate::builder::Step::Pad);
|
||||||
|
}
|
||||||
|
crate::config::Layout::Wide => {
|
||||||
|
steps.push_back(crate::builder::Step::Whitespace);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// /**/
|
||||||
|
children.drain_comments(|text| {
|
||||||
|
steps.push_back(crate::builder::Step::Comment(text));
|
||||||
|
steps.push_back(crate::builder::Step::NewLine);
|
||||||
|
steps.push_back(crate::builder::Step::Pad);
|
||||||
|
});
|
||||||
|
|
||||||
|
// expr
|
||||||
|
let child = children.get_next().unwrap();
|
||||||
|
match layout {
|
||||||
|
crate::config::Layout::Tall => {
|
||||||
|
steps.push_back(crate::builder::Step::FormatWider(child.element));
|
||||||
|
}
|
||||||
|
crate::config::Layout::Wide => {
|
||||||
|
steps.push_back(crate::builder::Step::Format(child.element));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// /**/
|
||||||
|
children.drain_comments(|text| {
|
||||||
|
steps.push_back(crate::builder::Step::NewLine);
|
||||||
|
steps.push_back(crate::builder::Step::Pad);
|
||||||
|
steps.push_back(crate::builder::Step::Comment(text));
|
||||||
|
});
|
||||||
|
|
||||||
|
// }
|
||||||
|
let child = children.get_next().unwrap();
|
||||||
|
match layout {
|
||||||
|
crate::config::Layout::Tall => {
|
||||||
|
steps.push_back(crate::builder::Step::Dedent);
|
||||||
|
steps.push_back(crate::builder::Step::NewLine);
|
||||||
|
steps.push_back(crate::builder::Step::Pad);
|
||||||
|
}
|
||||||
|
crate::config::Layout::Wide => {
|
||||||
|
steps.push_back(crate::builder::Step::Whitespace);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
steps.push_back(crate::builder::Step::Format(child.element));
|
||||||
|
|
||||||
|
steps
|
||||||
|
}
|
69
src/rules/if_else.rs
Normal file
69
src/rules/if_else.rs
Normal file
|
@ -0,0 +1,69 @@
|
||||||
|
pub fn rule(
|
||||||
|
build_ctx: &crate::builder::BuildCtx,
|
||||||
|
node: &rnix::SyntaxNode,
|
||||||
|
) -> std::collections::LinkedList<crate::builder::Step> {
|
||||||
|
let mut steps = std::collections::LinkedList::new();
|
||||||
|
|
||||||
|
let mut children = crate::children::Children::new(build_ctx, node);
|
||||||
|
|
||||||
|
let layout = if children.has_comments() {
|
||||||
|
&crate::config::Layout::Tall
|
||||||
|
} else {
|
||||||
|
build_ctx.config.layout()
|
||||||
|
};
|
||||||
|
|
||||||
|
for branch in ["if", "then", "else"] {
|
||||||
|
// if/then/else
|
||||||
|
let child = children.get_next().unwrap();
|
||||||
|
steps.push_back(crate::builder::Step::Format(child.element));
|
||||||
|
match layout {
|
||||||
|
crate::config::Layout::Tall => {
|
||||||
|
steps.push_back(crate::builder::Step::Indent);
|
||||||
|
}
|
||||||
|
crate::config::Layout::Wide => {
|
||||||
|
steps.push_back(crate::builder::Step::Whitespace);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// /**/
|
||||||
|
children.drain_comments(|text| {
|
||||||
|
steps.push_back(crate::builder::Step::NewLine);
|
||||||
|
steps.push_back(crate::builder::Step::Pad);
|
||||||
|
steps.push_back(crate::builder::Step::Comment(text));
|
||||||
|
});
|
||||||
|
|
||||||
|
// expr
|
||||||
|
let child = children.get_next().unwrap();
|
||||||
|
match layout {
|
||||||
|
crate::config::Layout::Tall => {
|
||||||
|
steps.push_back(crate::builder::Step::NewLine);
|
||||||
|
steps.push_back(crate::builder::Step::Pad);
|
||||||
|
steps.push_back(crate::builder::Step::FormatWider(
|
||||||
|
child.element,
|
||||||
|
));
|
||||||
|
if branch != "else" {
|
||||||
|
steps.push_back(crate::builder::Step::NewLine);
|
||||||
|
steps.push_back(crate::builder::Step::Pad);
|
||||||
|
}
|
||||||
|
steps.push_back(crate::builder::Step::Dedent);
|
||||||
|
}
|
||||||
|
crate::config::Layout::Wide => {
|
||||||
|
steps.push_back(crate::builder::Step::Format(child.element));
|
||||||
|
if branch != "else" {
|
||||||
|
steps.push_back(crate::builder::Step::Whitespace);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if branch != "else" {
|
||||||
|
// /**/
|
||||||
|
children.drain_comments(|text| {
|
||||||
|
steps.push_back(crate::builder::Step::Comment(text));
|
||||||
|
steps.push_back(crate::builder::Step::NewLine);
|
||||||
|
steps.push_back(crate::builder::Step::Pad);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
steps
|
||||||
|
}
|
89
src/rules/inherit.rs
Normal file
89
src/rules/inherit.rs
Normal file
|
@ -0,0 +1,89 @@
|
||||||
|
pub fn rule(
|
||||||
|
build_ctx: &crate::builder::BuildCtx,
|
||||||
|
node: &rnix::SyntaxNode,
|
||||||
|
) -> std::collections::LinkedList<crate::builder::Step> {
|
||||||
|
let mut steps = std::collections::LinkedList::new();
|
||||||
|
|
||||||
|
let mut children = crate::children::Children::new(build_ctx, node);
|
||||||
|
|
||||||
|
let layout = if children.has_comments() {
|
||||||
|
&crate::config::Layout::Tall
|
||||||
|
} else {
|
||||||
|
build_ctx.config.layout()
|
||||||
|
};
|
||||||
|
|
||||||
|
// inherit
|
||||||
|
let child = children.get_next().unwrap();
|
||||||
|
steps.push_back(crate::builder::Step::Format(child.element));
|
||||||
|
match layout {
|
||||||
|
crate::config::Layout::Tall => {
|
||||||
|
steps.push_back(crate::builder::Step::Indent);
|
||||||
|
}
|
||||||
|
crate::config::Layout::Wide => {}
|
||||||
|
}
|
||||||
|
|
||||||
|
loop {
|
||||||
|
// /**/
|
||||||
|
children.drain_comments(|text| {
|
||||||
|
steps.push_back(crate::builder::Step::NewLine);
|
||||||
|
steps.push_back(crate::builder::Step::Pad);
|
||||||
|
steps.push_back(crate::builder::Step::Comment(text));
|
||||||
|
});
|
||||||
|
|
||||||
|
if let Some(child) = children.peek_next() {
|
||||||
|
let kind = child.element.kind();
|
||||||
|
|
||||||
|
if let rnix::SyntaxKind::TOKEN_COMMENT
|
||||||
|
| rnix::SyntaxKind::TOKEN_SEMICOLON = kind
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// expr
|
||||||
|
let child = children.get_next().unwrap();
|
||||||
|
match layout {
|
||||||
|
crate::config::Layout::Tall => {
|
||||||
|
steps.push_back(crate::builder::Step::NewLine);
|
||||||
|
steps.push_back(crate::builder::Step::Pad);
|
||||||
|
steps.push_back(crate::builder::Step::FormatWider(
|
||||||
|
child.element,
|
||||||
|
));
|
||||||
|
}
|
||||||
|
crate::config::Layout::Wide => {
|
||||||
|
steps.push_back(crate::builder::Step::Whitespace);
|
||||||
|
steps
|
||||||
|
.push_back(crate::builder::Step::Format(child.element));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// /**/
|
||||||
|
children.drain_comments(|text| {
|
||||||
|
steps.push_back(crate::builder::Step::NewLine);
|
||||||
|
steps.push_back(crate::builder::Step::Pad);
|
||||||
|
steps.push_back(crate::builder::Step::Comment(text));
|
||||||
|
});
|
||||||
|
|
||||||
|
if let rnix::SyntaxKind::TOKEN_COMMENT =
|
||||||
|
children.peek_prev().unwrap().element.kind()
|
||||||
|
{
|
||||||
|
steps.push_back(crate::builder::Step::NewLine);
|
||||||
|
steps.push_back(crate::builder::Step::Pad);
|
||||||
|
} else {
|
||||||
|
}
|
||||||
|
|
||||||
|
// ;
|
||||||
|
let child = children.get_next().unwrap();
|
||||||
|
match layout {
|
||||||
|
crate::config::Layout::Tall => {
|
||||||
|
steps.push_back(crate::builder::Step::Dedent);
|
||||||
|
}
|
||||||
|
crate::config::Layout::Wide => {}
|
||||||
|
}
|
||||||
|
steps.push_back(crate::builder::Step::Format(child.element));
|
||||||
|
|
||||||
|
steps
|
||||||
|
}
|
64
src/rules/inherit_from.rs
Normal file
64
src/rules/inherit_from.rs
Normal file
|
@ -0,0 +1,64 @@
|
||||||
|
pub fn rule(
|
||||||
|
build_ctx: &crate::builder::BuildCtx,
|
||||||
|
node: &rnix::SyntaxNode,
|
||||||
|
) -> std::collections::LinkedList<crate::builder::Step> {
|
||||||
|
let mut steps = std::collections::LinkedList::new();
|
||||||
|
|
||||||
|
let mut children = crate::children::Children::new(build_ctx, node);
|
||||||
|
|
||||||
|
let layout = if children.has_comments() {
|
||||||
|
&crate::config::Layout::Tall
|
||||||
|
} else {
|
||||||
|
build_ctx.config.layout()
|
||||||
|
};
|
||||||
|
|
||||||
|
let child = children.get_next().unwrap();
|
||||||
|
steps.push_back(crate::builder::Step::Format(child.element));
|
||||||
|
match layout {
|
||||||
|
crate::config::Layout::Tall => {
|
||||||
|
steps.push_back(crate::builder::Step::Indent);
|
||||||
|
steps.push_back(crate::builder::Step::NewLine);
|
||||||
|
steps.push_back(crate::builder::Step::Pad);
|
||||||
|
}
|
||||||
|
crate::config::Layout::Wide => {
|
||||||
|
steps.push_back(crate::builder::Step::Whitespace);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
children.drain_comments(|text| {
|
||||||
|
steps.push_back(crate::builder::Step::Comment(text));
|
||||||
|
steps.push_back(crate::builder::Step::NewLine);
|
||||||
|
steps.push_back(crate::builder::Step::Pad);
|
||||||
|
});
|
||||||
|
|
||||||
|
let child = children.get_next().unwrap();
|
||||||
|
match layout {
|
||||||
|
crate::config::Layout::Tall => {
|
||||||
|
steps.push_back(crate::builder::Step::FormatWider(child.element));
|
||||||
|
}
|
||||||
|
crate::config::Layout::Wide => {
|
||||||
|
steps.push_back(crate::builder::Step::Format(child.element));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
children.drain_comments(|text| {
|
||||||
|
steps.push_back(crate::builder::Step::NewLine);
|
||||||
|
steps.push_back(crate::builder::Step::Pad);
|
||||||
|
steps.push_back(crate::builder::Step::Comment(text));
|
||||||
|
});
|
||||||
|
|
||||||
|
let child = children.get_next().unwrap();
|
||||||
|
match layout {
|
||||||
|
crate::config::Layout::Tall => {
|
||||||
|
steps.push_back(crate::builder::Step::Dedent);
|
||||||
|
steps.push_back(crate::builder::Step::NewLine);
|
||||||
|
steps.push_back(crate::builder::Step::Pad);
|
||||||
|
}
|
||||||
|
crate::config::Layout::Wide => {
|
||||||
|
steps.push_back(crate::builder::Step::Whitespace);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
steps.push_back(crate::builder::Step::Format(child.element));
|
||||||
|
|
||||||
|
steps
|
||||||
|
}
|
99
src/rules/key_value.rs
Normal file
99
src/rules/key_value.rs
Normal file
|
@ -0,0 +1,99 @@
|
||||||
|
pub fn rule(
|
||||||
|
build_ctx: &crate::builder::BuildCtx,
|
||||||
|
node: &rnix::SyntaxNode,
|
||||||
|
) -> std::collections::LinkedList<crate::builder::Step> {
|
||||||
|
let mut steps = std::collections::LinkedList::new();
|
||||||
|
|
||||||
|
let mut children = crate::children::Children::new(build_ctx, node);
|
||||||
|
|
||||||
|
let layout = if children.has_comments() {
|
||||||
|
&crate::config::Layout::Tall
|
||||||
|
} else {
|
||||||
|
build_ctx.config.layout()
|
||||||
|
};
|
||||||
|
|
||||||
|
// a
|
||||||
|
let child = children.get_next().unwrap();
|
||||||
|
match layout {
|
||||||
|
crate::config::Layout::Tall => {
|
||||||
|
steps.push_back(crate::builder::Step::FormatWider(child.element));
|
||||||
|
}
|
||||||
|
crate::config::Layout::Wide => {
|
||||||
|
steps.push_back(crate::builder::Step::Format(child.element));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// /**/
|
||||||
|
children.drain_comments(|text| {
|
||||||
|
steps.push_back(crate::builder::Step::NewLine);
|
||||||
|
steps.push_back(crate::builder::Step::Pad);
|
||||||
|
steps.push_back(crate::builder::Step::Comment(text));
|
||||||
|
});
|
||||||
|
|
||||||
|
if let rnix::SyntaxKind::TOKEN_COMMENT =
|
||||||
|
children.peek_prev().unwrap().element.kind()
|
||||||
|
{
|
||||||
|
steps.push_back(crate::builder::Step::NewLine);
|
||||||
|
steps.push_back(crate::builder::Step::Pad);
|
||||||
|
} else {
|
||||||
|
steps.push_back(crate::builder::Step::Whitespace);
|
||||||
|
}
|
||||||
|
|
||||||
|
// =
|
||||||
|
let child = children.get_next().unwrap();
|
||||||
|
steps.push_back(crate::builder::Step::Format(child.element));
|
||||||
|
match layout {
|
||||||
|
crate::config::Layout::Tall => {
|
||||||
|
steps.push_back(crate::builder::Step::Indent);
|
||||||
|
steps.push_back(crate::builder::Step::NewLine);
|
||||||
|
steps.push_back(crate::builder::Step::Pad);
|
||||||
|
}
|
||||||
|
crate::config::Layout::Wide => {
|
||||||
|
steps.push_back(crate::builder::Step::Whitespace);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// /**/
|
||||||
|
children.drain_comments(|text| {
|
||||||
|
steps.push_back(crate::builder::Step::Comment(text));
|
||||||
|
steps.push_back(crate::builder::Step::NewLine);
|
||||||
|
steps.push_back(crate::builder::Step::Pad);
|
||||||
|
});
|
||||||
|
|
||||||
|
// b
|
||||||
|
let child = children.get_next().unwrap();
|
||||||
|
match layout {
|
||||||
|
crate::config::Layout::Tall => {
|
||||||
|
steps.push_back(crate::builder::Step::FormatWider(child.element));
|
||||||
|
}
|
||||||
|
crate::config::Layout::Wide => {
|
||||||
|
steps.push_back(crate::builder::Step::Format(child.element));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// /**/
|
||||||
|
children.drain_comments(|text| {
|
||||||
|
steps.push_back(crate::builder::Step::NewLine);
|
||||||
|
steps.push_back(crate::builder::Step::Pad);
|
||||||
|
steps.push_back(crate::builder::Step::Comment(text));
|
||||||
|
});
|
||||||
|
|
||||||
|
if let rnix::SyntaxKind::TOKEN_COMMENT =
|
||||||
|
children.peek_prev().unwrap().element.kind()
|
||||||
|
{
|
||||||
|
steps.push_back(crate::builder::Step::NewLine);
|
||||||
|
steps.push_back(crate::builder::Step::Pad);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ;
|
||||||
|
let child = children.get_next().unwrap();
|
||||||
|
steps.push_back(crate::builder::Step::Format(child.element));
|
||||||
|
match layout {
|
||||||
|
crate::config::Layout::Tall => {
|
||||||
|
steps.push_back(crate::builder::Step::Dedent);
|
||||||
|
}
|
||||||
|
crate::config::Layout::Wide => {}
|
||||||
|
}
|
||||||
|
|
||||||
|
steps
|
||||||
|
}
|
66
src/rules/lambda.rs
Normal file
66
src/rules/lambda.rs
Normal file
|
@ -0,0 +1,66 @@
|
||||||
|
pub fn rule(
|
||||||
|
build_ctx: &crate::builder::BuildCtx,
|
||||||
|
node: &rnix::SyntaxNode,
|
||||||
|
) -> std::collections::LinkedList<crate::builder::Step> {
|
||||||
|
let mut steps = std::collections::LinkedList::new();
|
||||||
|
|
||||||
|
let mut children = crate::children::Children::new(build_ctx, node);
|
||||||
|
|
||||||
|
let layout = if children.has_comments() {
|
||||||
|
&crate::config::Layout::Tall
|
||||||
|
} else {
|
||||||
|
build_ctx.config.layout()
|
||||||
|
};
|
||||||
|
|
||||||
|
// a
|
||||||
|
let child = children.get_next().unwrap();
|
||||||
|
steps.push_back(crate::builder::Step::Format(child.element));
|
||||||
|
|
||||||
|
if let rnix::SyntaxKind::TOKEN_COMMENT =
|
||||||
|
children.peek_next().unwrap().element.kind()
|
||||||
|
{
|
||||||
|
steps.push_back(crate::builder::Step::NewLine);
|
||||||
|
steps.push_back(crate::builder::Step::Pad);
|
||||||
|
}
|
||||||
|
|
||||||
|
// /**/
|
||||||
|
children.drain_comments(|text| {
|
||||||
|
steps.push_back(crate::builder::Step::Comment(text));
|
||||||
|
steps.push_back(crate::builder::Step::NewLine);
|
||||||
|
steps.push_back(crate::builder::Step::Pad);
|
||||||
|
});
|
||||||
|
|
||||||
|
// :
|
||||||
|
let child = children.get_next().unwrap();
|
||||||
|
match layout {
|
||||||
|
crate::config::Layout::Tall => {
|
||||||
|
steps.push_back(crate::builder::Step::FormatWider(child.element));
|
||||||
|
steps.push_back(crate::builder::Step::NewLine);
|
||||||
|
steps.push_back(crate::builder::Step::Pad);
|
||||||
|
}
|
||||||
|
crate::config::Layout::Wide => {
|
||||||
|
steps.push_back(crate::builder::Step::Format(child.element));
|
||||||
|
steps.push_back(crate::builder::Step::Whitespace);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// /**/
|
||||||
|
children.drain_comments(|text| {
|
||||||
|
steps.push_back(crate::builder::Step::Comment(text));
|
||||||
|
steps.push_back(crate::builder::Step::NewLine);
|
||||||
|
steps.push_back(crate::builder::Step::Pad);
|
||||||
|
});
|
||||||
|
|
||||||
|
// c
|
||||||
|
let child = children.get_next().unwrap();
|
||||||
|
match layout {
|
||||||
|
crate::config::Layout::Tall => {
|
||||||
|
steps.push_back(crate::builder::Step::FormatWider(child.element));
|
||||||
|
}
|
||||||
|
crate::config::Layout::Wide => {
|
||||||
|
steps.push_back(crate::builder::Step::Format(child.element));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
steps
|
||||||
|
}
|
106
src/rules/let_in.rs
Normal file
106
src/rules/let_in.rs
Normal file
|
@ -0,0 +1,106 @@
|
||||||
|
pub fn rule(
|
||||||
|
build_ctx: &crate::builder::BuildCtx,
|
||||||
|
node: &rnix::SyntaxNode,
|
||||||
|
) -> std::collections::LinkedList<crate::builder::Step> {
|
||||||
|
let mut steps = std::collections::LinkedList::new();
|
||||||
|
|
||||||
|
let mut children = crate::children::Children::new(build_ctx, node);
|
||||||
|
|
||||||
|
let layout = if children.has_comments() {
|
||||||
|
&crate::config::Layout::Tall
|
||||||
|
} else {
|
||||||
|
build_ctx.config.layout()
|
||||||
|
};
|
||||||
|
|
||||||
|
// let
|
||||||
|
let child = children.get_next().unwrap();
|
||||||
|
steps.push_back(crate::builder::Step::Format(child.element));
|
||||||
|
match layout {
|
||||||
|
crate::config::Layout::Tall => {
|
||||||
|
steps.push_back(crate::builder::Step::Indent);
|
||||||
|
}
|
||||||
|
crate::config::Layout::Wide => {}
|
||||||
|
}
|
||||||
|
|
||||||
|
loop {
|
||||||
|
// /**/
|
||||||
|
children.drain_comments(|text| {
|
||||||
|
steps.push_back(crate::builder::Step::NewLine);
|
||||||
|
steps.push_back(crate::builder::Step::Pad);
|
||||||
|
steps.push_back(crate::builder::Step::Comment(text));
|
||||||
|
});
|
||||||
|
|
||||||
|
if let Some(child) = children.peek_next() {
|
||||||
|
let kind = child.element.kind();
|
||||||
|
|
||||||
|
if let rnix::SyntaxKind::TOKEN_COMMENT
|
||||||
|
| rnix::SyntaxKind::TOKEN_IN = kind
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// expr
|
||||||
|
match layout {
|
||||||
|
crate::config::Layout::Tall => {
|
||||||
|
steps.push_back(crate::builder::Step::NewLine);
|
||||||
|
steps.push_back(crate::builder::Step::Pad);
|
||||||
|
steps.push_back(crate::builder::Step::FormatWider(
|
||||||
|
child.element,
|
||||||
|
));
|
||||||
|
}
|
||||||
|
crate::config::Layout::Wide => {
|
||||||
|
steps.push_back(crate::builder::Step::Whitespace);
|
||||||
|
steps
|
||||||
|
.push_back(crate::builder::Step::Format(child.element));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
children.move_next();
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// /**/
|
||||||
|
children.drain_comments(|text| {
|
||||||
|
steps.push_back(crate::builder::Step::NewLine);
|
||||||
|
steps.push_back(crate::builder::Step::Pad);
|
||||||
|
steps.push_back(crate::builder::Step::Comment(text));
|
||||||
|
});
|
||||||
|
|
||||||
|
// in
|
||||||
|
let child = children.get_next().unwrap();
|
||||||
|
match layout {
|
||||||
|
crate::config::Layout::Tall => {
|
||||||
|
steps.push_back(crate::builder::Step::Dedent);
|
||||||
|
steps.push_back(crate::builder::Step::NewLine);
|
||||||
|
steps.push_back(crate::builder::Step::Pad);
|
||||||
|
}
|
||||||
|
crate::config::Layout::Wide => {
|
||||||
|
steps.push_back(crate::builder::Step::Whitespace);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
steps.push_back(crate::builder::Step::Format(child.element));
|
||||||
|
|
||||||
|
// /**/
|
||||||
|
children.drain_comments(|text| {
|
||||||
|
steps.push_back(crate::builder::Step::NewLine);
|
||||||
|
steps.push_back(crate::builder::Step::Pad);
|
||||||
|
steps.push_back(crate::builder::Step::Comment(text));
|
||||||
|
});
|
||||||
|
|
||||||
|
// expr
|
||||||
|
let child = children.get_next().unwrap();
|
||||||
|
match layout {
|
||||||
|
crate::config::Layout::Tall => {
|
||||||
|
steps.push_back(crate::builder::Step::NewLine);
|
||||||
|
steps.push_back(crate::builder::Step::Pad);
|
||||||
|
}
|
||||||
|
crate::config::Layout::Wide => {
|
||||||
|
steps.push_back(crate::builder::Step::Whitespace);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
steps.push_back(crate::builder::Step::Format(child.element));
|
||||||
|
|
||||||
|
steps
|
||||||
|
}
|
86
src/rules/list.rs
Normal file
86
src/rules/list.rs
Normal file
|
@ -0,0 +1,86 @@
|
||||||
|
pub fn rule(
|
||||||
|
build_ctx: &crate::builder::BuildCtx,
|
||||||
|
node: &rnix::SyntaxNode,
|
||||||
|
) -> std::collections::LinkedList<crate::builder::Step> {
|
||||||
|
let mut steps = std::collections::LinkedList::new();
|
||||||
|
|
||||||
|
let mut children = crate::children::Children::new(build_ctx, node);
|
||||||
|
|
||||||
|
let layout = if children.has_comments() {
|
||||||
|
&crate::config::Layout::Tall
|
||||||
|
} else {
|
||||||
|
build_ctx.config.layout()
|
||||||
|
};
|
||||||
|
|
||||||
|
// [
|
||||||
|
let child = children.get_next().unwrap();
|
||||||
|
steps.push_back(crate::builder::Step::Format(child.element));
|
||||||
|
match layout {
|
||||||
|
crate::config::Layout::Tall => {
|
||||||
|
steps.push_back(crate::builder::Step::Indent);
|
||||||
|
}
|
||||||
|
crate::config::Layout::Wide => {}
|
||||||
|
}
|
||||||
|
|
||||||
|
loop {
|
||||||
|
// /**/
|
||||||
|
children.drain_comments(|text| {
|
||||||
|
steps.push_back(crate::builder::Step::NewLine);
|
||||||
|
steps.push_back(crate::builder::Step::Pad);
|
||||||
|
steps.push_back(crate::builder::Step::Comment(text));
|
||||||
|
});
|
||||||
|
|
||||||
|
if let Some(child) = children.peek_next() {
|
||||||
|
let kind = child.element.kind();
|
||||||
|
|
||||||
|
if let rnix::SyntaxKind::TOKEN_COMMENT
|
||||||
|
| rnix::SyntaxKind::TOKEN_SQUARE_B_CLOSE = kind
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// item
|
||||||
|
match layout {
|
||||||
|
crate::config::Layout::Tall => {
|
||||||
|
steps.push_back(crate::builder::Step::NewLine);
|
||||||
|
steps.push_back(crate::builder::Step::Pad);
|
||||||
|
steps.push_back(crate::builder::Step::FormatWider(
|
||||||
|
child.element,
|
||||||
|
));
|
||||||
|
}
|
||||||
|
crate::config::Layout::Wide => {
|
||||||
|
steps.push_back(crate::builder::Step::Whitespace);
|
||||||
|
steps
|
||||||
|
.push_back(crate::builder::Step::Format(child.element));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
children.move_next();
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// /**/
|
||||||
|
children.drain_comments(|text| {
|
||||||
|
steps.push_back(crate::builder::Step::NewLine);
|
||||||
|
steps.push_back(crate::builder::Step::Pad);
|
||||||
|
steps.push_back(crate::builder::Step::Comment(text));
|
||||||
|
});
|
||||||
|
|
||||||
|
// ]
|
||||||
|
let child = children.get_next().unwrap();
|
||||||
|
match layout {
|
||||||
|
crate::config::Layout::Tall => {
|
||||||
|
steps.push_back(crate::builder::Step::Dedent);
|
||||||
|
steps.push_back(crate::builder::Step::NewLine);
|
||||||
|
steps.push_back(crate::builder::Step::Pad);
|
||||||
|
}
|
||||||
|
crate::config::Layout::Wide => {
|
||||||
|
steps.push_back(crate::builder::Step::Whitespace);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
steps.push_back(crate::builder::Step::Format(child.element));
|
||||||
|
|
||||||
|
steps
|
||||||
|
}
|
43
src/rules/mod.rs
Normal file
43
src/rules/mod.rs
Normal file
|
@ -0,0 +1,43 @@
|
||||||
|
pub mod apply;
|
||||||
|
pub mod assert;
|
||||||
|
pub mod attr_set;
|
||||||
|
pub mod bin_op;
|
||||||
|
pub mod dynamic;
|
||||||
|
pub mod if_else;
|
||||||
|
pub mod inherit;
|
||||||
|
pub mod inherit_from;
|
||||||
|
pub mod key_value;
|
||||||
|
pub mod lambda;
|
||||||
|
pub mod let_in;
|
||||||
|
pub mod list;
|
||||||
|
pub mod or_default;
|
||||||
|
pub mod paren;
|
||||||
|
pub mod pat_bind;
|
||||||
|
pub mod pat_entry;
|
||||||
|
pub mod pattern;
|
||||||
|
pub mod root;
|
||||||
|
pub mod select;
|
||||||
|
pub mod string;
|
||||||
|
pub mod string_interpol;
|
||||||
|
pub mod with;
|
||||||
|
|
||||||
|
pub fn default(
|
||||||
|
build_ctx: &crate::builder::BuildCtx,
|
||||||
|
node: &rnix::SyntaxNode,
|
||||||
|
) -> std::collections::LinkedList<crate::builder::Step> {
|
||||||
|
let mut steps = std::collections::LinkedList::new();
|
||||||
|
|
||||||
|
let mut children = crate::children::Children::new(build_ctx, node);
|
||||||
|
|
||||||
|
while let Some(child) = children.get_next() {
|
||||||
|
let step = match build_ctx.config.layout() {
|
||||||
|
crate::config::Layout::Tall => {
|
||||||
|
crate::builder::Step::FormatWider(child.element)
|
||||||
|
}
|
||||||
|
_ => crate::builder::Step::Format(child.element),
|
||||||
|
};
|
||||||
|
steps.push_back(step);
|
||||||
|
}
|
||||||
|
|
||||||
|
steps
|
||||||
|
}
|
86
src/rules/or_default.rs
Normal file
86
src/rules/or_default.rs
Normal file
|
@ -0,0 +1,86 @@
|
||||||
|
pub fn rule(
|
||||||
|
build_ctx: &crate::builder::BuildCtx,
|
||||||
|
node: &rnix::SyntaxNode,
|
||||||
|
) -> std::collections::LinkedList<crate::builder::Step> {
|
||||||
|
let mut steps = std::collections::LinkedList::new();
|
||||||
|
|
||||||
|
let mut children = crate::children::Children::new(build_ctx, node);
|
||||||
|
|
||||||
|
let layout = if children.has_comments() {
|
||||||
|
&crate::config::Layout::Tall
|
||||||
|
} else {
|
||||||
|
build_ctx.config.layout()
|
||||||
|
};
|
||||||
|
|
||||||
|
// expr
|
||||||
|
let child = children.get_next().unwrap();
|
||||||
|
match layout {
|
||||||
|
crate::config::Layout::Tall => {
|
||||||
|
match child.element.kind() {
|
||||||
|
rnix::SyntaxKind::NODE_OR_DEFAULT => {
|
||||||
|
steps
|
||||||
|
.push_back(crate::builder::Step::Format(child.element));
|
||||||
|
}
|
||||||
|
_ => {
|
||||||
|
steps.push_back(crate::builder::Step::FormatWider(
|
||||||
|
child.element,
|
||||||
|
));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
steps.push_back(crate::builder::Step::Indent);
|
||||||
|
}
|
||||||
|
crate::config::Layout::Wide => {
|
||||||
|
steps.push_back(crate::builder::Step::Format(child.element));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// /**/
|
||||||
|
children.drain_comments(|text| {
|
||||||
|
steps.push_back(crate::builder::Step::NewLine);
|
||||||
|
steps.push_back(crate::builder::Step::Pad);
|
||||||
|
steps.push_back(crate::builder::Step::Comment(text));
|
||||||
|
});
|
||||||
|
|
||||||
|
if let rnix::SyntaxKind::TOKEN_COMMENT =
|
||||||
|
children.peek_prev().unwrap().element.kind()
|
||||||
|
{
|
||||||
|
steps.push_back(crate::builder::Step::NewLine);
|
||||||
|
steps.push_back(crate::builder::Step::Pad);
|
||||||
|
} else {
|
||||||
|
steps.push_back(crate::builder::Step::Whitespace);
|
||||||
|
}
|
||||||
|
|
||||||
|
// operator
|
||||||
|
let child = children.get_next().unwrap();
|
||||||
|
steps.push_back(crate::builder::Step::Format(child.element));
|
||||||
|
|
||||||
|
// /**/
|
||||||
|
children.drain_comments(|text| {
|
||||||
|
steps.push_back(crate::builder::Step::NewLine);
|
||||||
|
steps.push_back(crate::builder::Step::Pad);
|
||||||
|
steps.push_back(crate::builder::Step::Comment(text));
|
||||||
|
});
|
||||||
|
|
||||||
|
if let rnix::SyntaxKind::TOKEN_COMMENT =
|
||||||
|
children.peek_prev().unwrap().element.kind()
|
||||||
|
{
|
||||||
|
steps.push_back(crate::builder::Step::NewLine);
|
||||||
|
steps.push_back(crate::builder::Step::Pad);
|
||||||
|
} else {
|
||||||
|
steps.push_back(crate::builder::Step::Whitespace);
|
||||||
|
}
|
||||||
|
|
||||||
|
// expr
|
||||||
|
let child = children.get_next().unwrap();
|
||||||
|
match layout {
|
||||||
|
crate::config::Layout::Tall => {
|
||||||
|
steps.push_back(crate::builder::Step::FormatWider(child.element));
|
||||||
|
steps.push_back(crate::builder::Step::Dedent);
|
||||||
|
}
|
||||||
|
crate::config::Layout::Wide => {
|
||||||
|
steps.push_back(crate::builder::Step::Format(child.element));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
steps
|
||||||
|
}
|
64
src/rules/paren.rs
Normal file
64
src/rules/paren.rs
Normal file
|
@ -0,0 +1,64 @@
|
||||||
|
pub fn rule(
|
||||||
|
build_ctx: &crate::builder::BuildCtx,
|
||||||
|
node: &rnix::SyntaxNode,
|
||||||
|
) -> std::collections::LinkedList<crate::builder::Step> {
|
||||||
|
let mut steps = std::collections::LinkedList::new();
|
||||||
|
|
||||||
|
let mut children = crate::children::Children::new(build_ctx, node);
|
||||||
|
|
||||||
|
let layout = if children.has_comments() {
|
||||||
|
&crate::config::Layout::Tall
|
||||||
|
} else {
|
||||||
|
build_ctx.config.layout()
|
||||||
|
};
|
||||||
|
|
||||||
|
let child = children.get_next().unwrap();
|
||||||
|
steps.push_back(crate::builder::Step::Format(child.element));
|
||||||
|
match layout {
|
||||||
|
crate::config::Layout::Tall => {
|
||||||
|
steps.push_back(crate::builder::Step::Indent);
|
||||||
|
steps.push_back(crate::builder::Step::NewLine);
|
||||||
|
steps.push_back(crate::builder::Step::Pad);
|
||||||
|
}
|
||||||
|
crate::config::Layout::Wide => {
|
||||||
|
steps.push_back(crate::builder::Step::Whitespace);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
children.drain_comments(|text| {
|
||||||
|
steps.push_back(crate::builder::Step::Comment(text));
|
||||||
|
steps.push_back(crate::builder::Step::NewLine);
|
||||||
|
steps.push_back(crate::builder::Step::Pad);
|
||||||
|
});
|
||||||
|
|
||||||
|
let child = children.get_next().unwrap();
|
||||||
|
match layout {
|
||||||
|
crate::config::Layout::Tall => {
|
||||||
|
steps.push_back(crate::builder::Step::FormatWider(child.element));
|
||||||
|
}
|
||||||
|
crate::config::Layout::Wide => {
|
||||||
|
steps.push_back(crate::builder::Step::Format(child.element));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
children.drain_comments(|text| {
|
||||||
|
steps.push_back(crate::builder::Step::NewLine);
|
||||||
|
steps.push_back(crate::builder::Step::Pad);
|
||||||
|
steps.push_back(crate::builder::Step::Comment(text));
|
||||||
|
});
|
||||||
|
|
||||||
|
let child = children.get_next().unwrap();
|
||||||
|
match layout {
|
||||||
|
crate::config::Layout::Tall => {
|
||||||
|
steps.push_back(crate::builder::Step::Dedent);
|
||||||
|
steps.push_back(crate::builder::Step::NewLine);
|
||||||
|
steps.push_back(crate::builder::Step::Pad);
|
||||||
|
}
|
||||||
|
crate::config::Layout::Wide => {
|
||||||
|
steps.push_back(crate::builder::Step::Whitespace);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
steps.push_back(crate::builder::Step::Format(child.element));
|
||||||
|
|
||||||
|
steps
|
||||||
|
}
|
53
src/rules/pat_bind.rs
Normal file
53
src/rules/pat_bind.rs
Normal file
|
@ -0,0 +1,53 @@
|
||||||
|
pub fn rule(
|
||||||
|
build_ctx: &crate::builder::BuildCtx,
|
||||||
|
node: &rnix::SyntaxNode,
|
||||||
|
) -> std::collections::LinkedList<crate::builder::Step> {
|
||||||
|
let mut steps = std::collections::LinkedList::new();
|
||||||
|
|
||||||
|
let mut children = crate::children::Children::new(build_ctx, node);
|
||||||
|
|
||||||
|
let layout = if children.has_comments() {
|
||||||
|
&crate::config::Layout::Tall
|
||||||
|
} else {
|
||||||
|
build_ctx.config.layout()
|
||||||
|
};
|
||||||
|
|
||||||
|
let child = children.get_next().unwrap();
|
||||||
|
match layout {
|
||||||
|
crate::config::Layout::Tall => {
|
||||||
|
steps.push_back(crate::builder::Step::FormatWider(child.element));
|
||||||
|
}
|
||||||
|
crate::config::Layout::Wide => {
|
||||||
|
steps.push_back(crate::builder::Step::Format(child.element));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// /**/
|
||||||
|
children.drain_comments(|text| {
|
||||||
|
steps.push_back(crate::builder::Step::NewLine);
|
||||||
|
steps.push_back(crate::builder::Step::Pad);
|
||||||
|
steps.push_back(crate::builder::Step::Comment(text));
|
||||||
|
});
|
||||||
|
|
||||||
|
if let rnix::SyntaxKind::TOKEN_COMMENT =
|
||||||
|
children.peek_prev().unwrap().element.kind()
|
||||||
|
{
|
||||||
|
steps.push_back(crate::builder::Step::NewLine);
|
||||||
|
steps.push_back(crate::builder::Step::Pad);
|
||||||
|
} else {
|
||||||
|
steps.push_back(crate::builder::Step::Whitespace);
|
||||||
|
}
|
||||||
|
|
||||||
|
let child = children.get_next().unwrap();
|
||||||
|
match layout {
|
||||||
|
crate::config::Layout::Tall => {
|
||||||
|
steps.push_back(crate::builder::Step::FormatWider(child.element));
|
||||||
|
}
|
||||||
|
crate::config::Layout::Wide => {
|
||||||
|
steps.push_back(crate::builder::Step::Format(child.element));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
children.move_prev();
|
||||||
|
|
||||||
|
steps
|
||||||
|
}
|
90
src/rules/pat_entry.rs
Normal file
90
src/rules/pat_entry.rs
Normal file
|
@ -0,0 +1,90 @@
|
||||||
|
pub fn rule(
|
||||||
|
build_ctx: &crate::builder::BuildCtx,
|
||||||
|
node: &rnix::SyntaxNode,
|
||||||
|
) -> std::collections::LinkedList<crate::builder::Step> {
|
||||||
|
let mut steps = std::collections::LinkedList::new();
|
||||||
|
|
||||||
|
let mut children = crate::children::Children::new(build_ctx, node);
|
||||||
|
|
||||||
|
let layout = if children.has_comments() {
|
||||||
|
&crate::config::Layout::Tall
|
||||||
|
} else {
|
||||||
|
build_ctx.config.layout()
|
||||||
|
};
|
||||||
|
|
||||||
|
// expr
|
||||||
|
let child = children.get_next().unwrap();
|
||||||
|
match layout {
|
||||||
|
crate::config::Layout::Tall => {
|
||||||
|
match child.element.kind() {
|
||||||
|
rnix::SyntaxKind::NODE_OR_DEFAULT => {
|
||||||
|
steps
|
||||||
|
.push_back(crate::builder::Step::Format(child.element));
|
||||||
|
}
|
||||||
|
_ => {
|
||||||
|
steps.push_back(crate::builder::Step::FormatWider(
|
||||||
|
child.element,
|
||||||
|
));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
steps.push_back(crate::builder::Step::Indent);
|
||||||
|
}
|
||||||
|
crate::config::Layout::Wide => {
|
||||||
|
steps.push_back(crate::builder::Step::Format(child.element));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if children.has_next() {
|
||||||
|
// /**/
|
||||||
|
children.drain_comments(|text| {
|
||||||
|
steps.push_back(crate::builder::Step::NewLine);
|
||||||
|
steps.push_back(crate::builder::Step::Pad);
|
||||||
|
steps.push_back(crate::builder::Step::Comment(text));
|
||||||
|
});
|
||||||
|
|
||||||
|
if let rnix::SyntaxKind::TOKEN_COMMENT =
|
||||||
|
children.peek_prev().unwrap().element.kind()
|
||||||
|
{
|
||||||
|
steps.push_back(crate::builder::Step::NewLine);
|
||||||
|
steps.push_back(crate::builder::Step::Pad);
|
||||||
|
} else {
|
||||||
|
steps.push_back(crate::builder::Step::Whitespace);
|
||||||
|
}
|
||||||
|
|
||||||
|
// operator
|
||||||
|
let child = children.get_next().unwrap();
|
||||||
|
steps.push_back(crate::builder::Step::Format(child.element));
|
||||||
|
|
||||||
|
// /**/
|
||||||
|
children.drain_comments(|text| {
|
||||||
|
steps.push_back(crate::builder::Step::NewLine);
|
||||||
|
steps.push_back(crate::builder::Step::Pad);
|
||||||
|
steps.push_back(crate::builder::Step::Comment(text));
|
||||||
|
});
|
||||||
|
|
||||||
|
if let rnix::SyntaxKind::TOKEN_COMMENT =
|
||||||
|
children.peek_prev().unwrap().element.kind()
|
||||||
|
{
|
||||||
|
steps.push_back(crate::builder::Step::NewLine);
|
||||||
|
steps.push_back(crate::builder::Step::Pad);
|
||||||
|
} else {
|
||||||
|
steps.push_back(crate::builder::Step::Whitespace);
|
||||||
|
}
|
||||||
|
|
||||||
|
// expr
|
||||||
|
let child = children.get_next().unwrap();
|
||||||
|
match layout {
|
||||||
|
crate::config::Layout::Tall => {
|
||||||
|
steps.push_back(crate::builder::Step::FormatWider(
|
||||||
|
child.element,
|
||||||
|
));
|
||||||
|
steps.push_back(crate::builder::Step::Dedent);
|
||||||
|
}
|
||||||
|
crate::config::Layout::Wide => {
|
||||||
|
steps.push_back(crate::builder::Step::Format(child.element));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
steps
|
||||||
|
}
|
161
src/rules/pattern.rs
Normal file
161
src/rules/pattern.rs
Normal file
|
@ -0,0 +1,161 @@
|
||||||
|
pub fn rule(
|
||||||
|
build_ctx: &crate::builder::BuildCtx,
|
||||||
|
node: &rnix::SyntaxNode,
|
||||||
|
) -> std::collections::LinkedList<crate::builder::Step> {
|
||||||
|
let mut steps = std::collections::LinkedList::new();
|
||||||
|
|
||||||
|
let mut children = crate::children::Children::new(build_ctx, node);
|
||||||
|
|
||||||
|
let layout = if children.has_comments() {
|
||||||
|
&crate::config::Layout::Tall
|
||||||
|
} else {
|
||||||
|
build_ctx.config.layout()
|
||||||
|
};
|
||||||
|
|
||||||
|
// x @
|
||||||
|
let child = children.peek_next().unwrap();
|
||||||
|
if let rnix::SyntaxKind::NODE_PAT_BIND = child.element.kind() {
|
||||||
|
match layout {
|
||||||
|
crate::config::Layout::Tall => {
|
||||||
|
steps.push_back(crate::builder::Step::FormatWider(
|
||||||
|
child.element,
|
||||||
|
));
|
||||||
|
steps.push_back(crate::builder::Step::NewLine);
|
||||||
|
steps.push_back(crate::builder::Step::Pad);
|
||||||
|
}
|
||||||
|
crate::config::Layout::Wide => {
|
||||||
|
steps.push_back(crate::builder::Step::Format(child.element));
|
||||||
|
steps.push_back(crate::builder::Step::Whitespace);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
children.move_next();
|
||||||
|
}
|
||||||
|
|
||||||
|
// /**/
|
||||||
|
children.drain_comments(|text| {
|
||||||
|
steps.push_back(crate::builder::Step::Comment(text));
|
||||||
|
steps.push_back(crate::builder::Step::NewLine);
|
||||||
|
steps.push_back(crate::builder::Step::Pad);
|
||||||
|
});
|
||||||
|
|
||||||
|
// {
|
||||||
|
let child = children.get_next().unwrap();
|
||||||
|
steps.push_back(crate::builder::Step::Format(child.element));
|
||||||
|
|
||||||
|
while let Some(child) = children.peek_next() {
|
||||||
|
match child.element.kind() {
|
||||||
|
// /**/
|
||||||
|
rnix::SyntaxKind::TOKEN_COMMENT => {
|
||||||
|
let prev_kind = children.peek_prev().unwrap().element.kind();
|
||||||
|
if let rnix::SyntaxKind::TOKEN_COMMA
|
||||||
|
| rnix::SyntaxKind::TOKEN_CURLY_B_OPEN = prev_kind
|
||||||
|
{
|
||||||
|
steps.push_back(crate::builder::Step::Whitespace);
|
||||||
|
}
|
||||||
|
|
||||||
|
if let rnix::SyntaxKind::TOKEN_COMMENT
|
||||||
|
| rnix::SyntaxKind::TOKEN_ELLIPSIS
|
||||||
|
| rnix::SyntaxKind::NODE_PAT_ENTRY = prev_kind
|
||||||
|
{
|
||||||
|
steps.push_back(crate::builder::Step::NewLine);
|
||||||
|
steps.push_back(crate::builder::Step::Pad);
|
||||||
|
steps.push_back(crate::builder::Step::Whitespace);
|
||||||
|
steps.push_back(crate::builder::Step::Whitespace);
|
||||||
|
}
|
||||||
|
|
||||||
|
children.drain_comment(|text| {
|
||||||
|
steps.push_back(crate::builder::Step::Comment(text));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
// item
|
||||||
|
rnix::SyntaxKind::TOKEN_ELLIPSIS
|
||||||
|
| rnix::SyntaxKind::NODE_PAT_ENTRY => {
|
||||||
|
let prev_kind = children.peek_prev().unwrap().element.kind();
|
||||||
|
|
||||||
|
if let rnix::SyntaxKind::TOKEN_COMMA
|
||||||
|
| rnix::SyntaxKind::TOKEN_CURLY_B_OPEN = prev_kind
|
||||||
|
{
|
||||||
|
steps.push_back(crate::builder::Step::Whitespace);
|
||||||
|
}
|
||||||
|
|
||||||
|
if let rnix::SyntaxKind::TOKEN_COMMENT = prev_kind {
|
||||||
|
steps.push_back(crate::builder::Step::NewLine);
|
||||||
|
steps.push_back(crate::builder::Step::Pad);
|
||||||
|
steps.push_back(crate::builder::Step::Whitespace);
|
||||||
|
steps.push_back(crate::builder::Step::Whitespace);
|
||||||
|
}
|
||||||
|
|
||||||
|
match layout {
|
||||||
|
crate::config::Layout::Tall => {
|
||||||
|
steps.push_back(crate::builder::Step::FormatWider(
|
||||||
|
child.element,
|
||||||
|
));
|
||||||
|
}
|
||||||
|
crate::config::Layout::Wide => {
|
||||||
|
steps.push_back(crate::builder::Step::Format(
|
||||||
|
child.element,
|
||||||
|
));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
children.move_next();
|
||||||
|
}
|
||||||
|
// ,
|
||||||
|
rnix::SyntaxKind::TOKEN_COMMA => {
|
||||||
|
match layout {
|
||||||
|
crate::config::Layout::Tall => {
|
||||||
|
steps.push_back(crate::builder::Step::NewLine);
|
||||||
|
steps.push_back(crate::builder::Step::Pad);
|
||||||
|
}
|
||||||
|
crate::config::Layout::Wide => {}
|
||||||
|
};
|
||||||
|
steps.push_back(crate::builder::Step::Format(child.element));
|
||||||
|
children.move_next();
|
||||||
|
}
|
||||||
|
_ => {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// }
|
||||||
|
let child = children.get_next().unwrap();
|
||||||
|
match layout {
|
||||||
|
crate::config::Layout::Tall => {
|
||||||
|
steps.push_back(crate::builder::Step::NewLine);
|
||||||
|
steps.push_back(crate::builder::Step::Pad);
|
||||||
|
}
|
||||||
|
crate::config::Layout::Wide => {
|
||||||
|
steps.push_back(crate::builder::Step::Whitespace);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
steps.push_back(crate::builder::Step::Format(child.element));
|
||||||
|
|
||||||
|
// /**/
|
||||||
|
children.drain_comments(|text| {
|
||||||
|
steps.push_back(crate::builder::Step::NewLine);
|
||||||
|
steps.push_back(crate::builder::Step::Pad);
|
||||||
|
steps.push_back(crate::builder::Step::Comment(text));
|
||||||
|
});
|
||||||
|
|
||||||
|
// @ x
|
||||||
|
if let Some(child) = children.peek_next() {
|
||||||
|
if let rnix::SyntaxKind::NODE_PAT_BIND = child.element.kind() {
|
||||||
|
match layout {
|
||||||
|
crate::config::Layout::Tall => {
|
||||||
|
steps.push_back(crate::builder::Step::NewLine);
|
||||||
|
steps.push_back(crate::builder::Step::Pad);
|
||||||
|
steps.push_back(crate::builder::Step::FormatWider(
|
||||||
|
child.element,
|
||||||
|
));
|
||||||
|
}
|
||||||
|
crate::config::Layout::Wide => {
|
||||||
|
steps.push_back(crate::builder::Step::Whitespace);
|
||||||
|
steps
|
||||||
|
.push_back(crate::builder::Step::Format(child.element));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
steps
|
||||||
|
}
|
45
src/rules/root.rs
Normal file
45
src/rules/root.rs
Normal file
|
@ -0,0 +1,45 @@
|
||||||
|
pub fn rule(
|
||||||
|
build_ctx: &crate::builder::BuildCtx,
|
||||||
|
node: &rnix::SyntaxNode,
|
||||||
|
) -> std::collections::LinkedList<crate::builder::Step> {
|
||||||
|
let mut steps = std::collections::LinkedList::new();
|
||||||
|
|
||||||
|
let mut children = crate::children::Children::new(build_ctx, node);
|
||||||
|
|
||||||
|
let layout = if children.has_comments() {
|
||||||
|
&crate::config::Layout::Tall
|
||||||
|
} else {
|
||||||
|
build_ctx.config.layout()
|
||||||
|
};
|
||||||
|
|
||||||
|
while children.has_next() {
|
||||||
|
children.drain_comments(|text| {
|
||||||
|
steps.push_back(crate::builder::Step::Comment(text));
|
||||||
|
steps.push_back(crate::builder::Step::NewLine);
|
||||||
|
});
|
||||||
|
|
||||||
|
if let Some(child) = children.get_next() {
|
||||||
|
match layout {
|
||||||
|
crate::config::Layout::Tall => {
|
||||||
|
steps.push_back(crate::builder::Step::FormatWider(
|
||||||
|
child.element,
|
||||||
|
));
|
||||||
|
steps.push_back(crate::builder::Step::NewLine);
|
||||||
|
}
|
||||||
|
crate::config::Layout::Wide => {
|
||||||
|
steps
|
||||||
|
.push_back(crate::builder::Step::Format(child.element));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Trailing newline
|
||||||
|
if let Some(last_step) = steps.back() {
|
||||||
|
if *last_step != crate::builder::Step::NewLine {
|
||||||
|
steps.push_back(crate::builder::Step::NewLine);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
steps
|
||||||
|
}
|
77
src/rules/select.rs
Normal file
77
src/rules/select.rs
Normal file
|
@ -0,0 +1,77 @@
|
||||||
|
pub fn rule(
|
||||||
|
build_ctx: &crate::builder::BuildCtx,
|
||||||
|
node: &rnix::SyntaxNode,
|
||||||
|
) -> std::collections::LinkedList<crate::builder::Step> {
|
||||||
|
let mut steps = std::collections::LinkedList::new();
|
||||||
|
|
||||||
|
let mut children = crate::children::Children::new(build_ctx, node);
|
||||||
|
|
||||||
|
let layout = if children.has_comments() {
|
||||||
|
&crate::config::Layout::Tall
|
||||||
|
} else {
|
||||||
|
build_ctx.config.layout()
|
||||||
|
};
|
||||||
|
|
||||||
|
// expr
|
||||||
|
let child = children.get_next().unwrap();
|
||||||
|
match layout {
|
||||||
|
crate::config::Layout::Tall => match child.element.kind() {
|
||||||
|
rnix::SyntaxKind::NODE_SELECT => {
|
||||||
|
steps.push_back(crate::builder::Step::Format(child.element));
|
||||||
|
steps.push_back(crate::builder::Step::Indent);
|
||||||
|
steps.push_back(crate::builder::Step::NewLine);
|
||||||
|
steps.push_back(crate::builder::Step::Pad);
|
||||||
|
}
|
||||||
|
_ => {
|
||||||
|
steps.push_back(crate::builder::Step::Indent);
|
||||||
|
steps.push_back(crate::builder::Step::FormatWider(
|
||||||
|
child.element,
|
||||||
|
));
|
||||||
|
steps.push_back(crate::builder::Step::NewLine);
|
||||||
|
steps.push_back(crate::builder::Step::Pad);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
crate::config::Layout::Wide => {
|
||||||
|
steps.push_back(crate::builder::Step::Format(child.element));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// /**/
|
||||||
|
children.drain_comments(|text| {
|
||||||
|
steps.push_back(crate::builder::Step::Comment(text));
|
||||||
|
steps.push_back(crate::builder::Step::NewLine);
|
||||||
|
steps.push_back(crate::builder::Step::Pad);
|
||||||
|
});
|
||||||
|
|
||||||
|
// .
|
||||||
|
let child = children.get_next().unwrap();
|
||||||
|
steps.push_back(crate::builder::Step::Format(child.element));
|
||||||
|
|
||||||
|
// /**/
|
||||||
|
children.drain_comments(|text| {
|
||||||
|
steps.push_back(crate::builder::Step::NewLine);
|
||||||
|
steps.push_back(crate::builder::Step::Pad);
|
||||||
|
steps.push_back(crate::builder::Step::Comment(text));
|
||||||
|
});
|
||||||
|
|
||||||
|
if let rnix::SyntaxKind::TOKEN_COMMENT =
|
||||||
|
children.peek_prev().unwrap().element.kind()
|
||||||
|
{
|
||||||
|
steps.push_back(crate::builder::Step::NewLine);
|
||||||
|
steps.push_back(crate::builder::Step::Pad);
|
||||||
|
}
|
||||||
|
|
||||||
|
// expr
|
||||||
|
let child = children.get_next().unwrap();
|
||||||
|
match layout {
|
||||||
|
crate::config::Layout::Tall => {
|
||||||
|
steps.push_back(crate::builder::Step::FormatWider(child.element));
|
||||||
|
steps.push_back(crate::builder::Step::Dedent);
|
||||||
|
}
|
||||||
|
crate::config::Layout::Wide => {
|
||||||
|
steps.push_back(crate::builder::Step::Format(child.element));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
steps
|
||||||
|
}
|
107
src/rules/string.rs
Normal file
107
src/rules/string.rs
Normal file
|
@ -0,0 +1,107 @@
|
||||||
|
pub fn rule(
|
||||||
|
build_ctx: &crate::builder::BuildCtx,
|
||||||
|
node: &rnix::SyntaxNode,
|
||||||
|
) -> std::collections::LinkedList<crate::builder::Step> {
|
||||||
|
let mut steps = std::collections::LinkedList::new();
|
||||||
|
|
||||||
|
let mut children = crate::children::Children::new(build_ctx, node);
|
||||||
|
|
||||||
|
let child = children.get_next().unwrap();
|
||||||
|
let child_token = child.element.clone().into_token().unwrap();
|
||||||
|
let text = child_token.text();
|
||||||
|
steps.push_back(crate::builder::Step::Format(child.element));
|
||||||
|
|
||||||
|
if text == "\"" {
|
||||||
|
while let Some(child) = children.get_next() {
|
||||||
|
match build_ctx.config.layout() {
|
||||||
|
crate::config::Layout::Tall => {
|
||||||
|
steps.push_back(crate::builder::Step::FormatWider(
|
||||||
|
child.element,
|
||||||
|
));
|
||||||
|
}
|
||||||
|
crate::config::Layout::Wide => {
|
||||||
|
steps
|
||||||
|
.push_back(crate::builder::Step::Format(child.element));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
let indentation = get_double_quoted_string_indentation(&node);
|
||||||
|
|
||||||
|
while let Some(child) = children.peek_next() {
|
||||||
|
match child.element.kind() {
|
||||||
|
rnix::SyntaxKind::TOKEN_STRING_CONTENT => {
|
||||||
|
let child_token = child.element.into_token().unwrap();
|
||||||
|
let lines: Vec<&str> =
|
||||||
|
child_token.text().split('\n').collect();
|
||||||
|
|
||||||
|
children.move_next();
|
||||||
|
for (index, line) in lines.iter().enumerate() {
|
||||||
|
if index + 1 == lines.len() && line.trim().len() == 0 {
|
||||||
|
if let rnix::SyntaxKind::TOKEN_STRING_END =
|
||||||
|
children.peek_next().unwrap().element.kind()
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
steps.push_back(crate::builder::Step::Token(
|
||||||
|
rnix::SyntaxKind::TOKEN_STRING_CONTENT,
|
||||||
|
if indentation >= line.len() {
|
||||||
|
line.to_string()
|
||||||
|
} else {
|
||||||
|
line[indentation..line.len()].to_string()
|
||||||
|
},
|
||||||
|
));
|
||||||
|
|
||||||
|
if index == 0 && lines.len() > 1 {
|
||||||
|
steps.push_back(crate::builder::Step::NewLine);
|
||||||
|
steps.push_back(crate::builder::Step::Pad);
|
||||||
|
} else if index + 1 < lines.len()
|
||||||
|
&& lines[index + 1].trim().len() == 0
|
||||||
|
{
|
||||||
|
steps.push_back(crate::builder::Step::NewLine);
|
||||||
|
steps.push_back(crate::builder::Step::Pad);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
rnix::SyntaxKind::TOKEN_STRING_END => {
|
||||||
|
steps
|
||||||
|
.push_back(crate::builder::Step::Format(child.element));
|
||||||
|
children.move_next();
|
||||||
|
}
|
||||||
|
_ => {
|
||||||
|
steps.push_back(crate::builder::Step::FormatWider(
|
||||||
|
child.element,
|
||||||
|
));
|
||||||
|
children.move_next();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// steps = crate::rules::default(build_ctx, node);
|
||||||
|
steps
|
||||||
|
}
|
||||||
|
|
||||||
|
fn get_double_quoted_string_indentation(node: &rnix::SyntaxNode) -> usize {
|
||||||
|
let mut indentation: usize = usize::MAX;
|
||||||
|
|
||||||
|
let text: String = node
|
||||||
|
.children_with_tokens()
|
||||||
|
.filter(|child| child.kind() == rnix::SyntaxKind::TOKEN_STRING_CONTENT)
|
||||||
|
.map(|child| child.into_token().unwrap())
|
||||||
|
.map(|token| token.text().to_string())
|
||||||
|
.collect();
|
||||||
|
|
||||||
|
for line in text.split('\n') {
|
||||||
|
let line = line.trim_end();
|
||||||
|
|
||||||
|
if line.len() > 0 {
|
||||||
|
indentation =
|
||||||
|
usize::min(indentation, line.len() - line.trim_start().len());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if indentation == usize::MAX { 0 } else { indentation }
|
||||||
|
}
|
69
src/rules/string_interpol.rs
Normal file
69
src/rules/string_interpol.rs
Normal file
|
@ -0,0 +1,69 @@
|
||||||
|
pub fn rule(
|
||||||
|
build_ctx: &crate::builder::BuildCtx,
|
||||||
|
node: &rnix::SyntaxNode,
|
||||||
|
) -> std::collections::LinkedList<crate::builder::Step> {
|
||||||
|
let mut steps = std::collections::LinkedList::new();
|
||||||
|
|
||||||
|
let mut children = crate::children::Children::new(build_ctx, node);
|
||||||
|
|
||||||
|
let layout = if children.has_comments() {
|
||||||
|
&crate::config::Layout::Tall
|
||||||
|
} else {
|
||||||
|
build_ctx.config.layout()
|
||||||
|
};
|
||||||
|
|
||||||
|
// ${
|
||||||
|
let child = children.get_next().unwrap();
|
||||||
|
steps.push_back(crate::builder::Step::Format(child.element));
|
||||||
|
match layout {
|
||||||
|
crate::config::Layout::Tall => {
|
||||||
|
steps.push_back(crate::builder::Step::Indent);
|
||||||
|
steps.push_back(crate::builder::Step::NewLine);
|
||||||
|
steps.push_back(crate::builder::Step::Pad);
|
||||||
|
}
|
||||||
|
crate::config::Layout::Wide => {
|
||||||
|
steps.push_back(crate::builder::Step::Whitespace);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// /**/
|
||||||
|
children.drain_comments(|text| {
|
||||||
|
steps.push_back(crate::builder::Step::Comment(text));
|
||||||
|
steps.push_back(crate::builder::Step::NewLine);
|
||||||
|
steps.push_back(crate::builder::Step::Pad);
|
||||||
|
});
|
||||||
|
|
||||||
|
// expr
|
||||||
|
let child = children.get_next().unwrap();
|
||||||
|
match layout {
|
||||||
|
crate::config::Layout::Tall => {
|
||||||
|
steps.push_back(crate::builder::Step::FormatWider(child.element));
|
||||||
|
}
|
||||||
|
crate::config::Layout::Wide => {
|
||||||
|
steps.push_back(crate::builder::Step::Format(child.element));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// /**/
|
||||||
|
children.drain_comments(|text| {
|
||||||
|
steps.push_back(crate::builder::Step::NewLine);
|
||||||
|
steps.push_back(crate::builder::Step::Pad);
|
||||||
|
steps.push_back(crate::builder::Step::Comment(text));
|
||||||
|
});
|
||||||
|
|
||||||
|
// }
|
||||||
|
let child = children.get_next().unwrap();
|
||||||
|
match layout {
|
||||||
|
crate::config::Layout::Tall => {
|
||||||
|
steps.push_back(crate::builder::Step::Dedent);
|
||||||
|
steps.push_back(crate::builder::Step::NewLine);
|
||||||
|
steps.push_back(crate::builder::Step::Pad);
|
||||||
|
}
|
||||||
|
crate::config::Layout::Wide => {
|
||||||
|
steps.push_back(crate::builder::Step::Whitespace);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
steps.push_back(crate::builder::Step::Format(child.element));
|
||||||
|
|
||||||
|
steps
|
||||||
|
}
|
72
src/rules/with.rs
Normal file
72
src/rules/with.rs
Normal file
|
@ -0,0 +1,72 @@
|
||||||
|
pub fn rule(
|
||||||
|
build_ctx: &crate::builder::BuildCtx,
|
||||||
|
node: &rnix::SyntaxNode,
|
||||||
|
) -> std::collections::LinkedList<crate::builder::Step> {
|
||||||
|
let mut steps = std::collections::LinkedList::new();
|
||||||
|
|
||||||
|
let mut children = crate::children::Children::new(build_ctx, node);
|
||||||
|
|
||||||
|
let layout = if children.has_comments() {
|
||||||
|
&crate::config::Layout::Tall
|
||||||
|
} else {
|
||||||
|
build_ctx.config.layout()
|
||||||
|
};
|
||||||
|
|
||||||
|
// with
|
||||||
|
let child = children.get_next().unwrap();
|
||||||
|
steps.push_back(crate::builder::Step::Format(child.element));
|
||||||
|
|
||||||
|
// /**/
|
||||||
|
children.drain_comments(|text| {
|
||||||
|
steps.push_back(crate::builder::Step::NewLine);
|
||||||
|
steps.push_back(crate::builder::Step::Pad);
|
||||||
|
steps.push_back(crate::builder::Step::Comment(text));
|
||||||
|
});
|
||||||
|
|
||||||
|
if let rnix::SyntaxKind::TOKEN_COMMENT =
|
||||||
|
children.peek_prev().unwrap().element.kind()
|
||||||
|
{
|
||||||
|
steps.push_back(crate::builder::Step::NewLine);
|
||||||
|
steps.push_back(crate::builder::Step::Pad);
|
||||||
|
} else {
|
||||||
|
steps.push_back(crate::builder::Step::Whitespace);
|
||||||
|
}
|
||||||
|
|
||||||
|
// expr
|
||||||
|
let child = children.get_next().unwrap();
|
||||||
|
match layout {
|
||||||
|
crate::config::Layout::Tall => {
|
||||||
|
steps.push_back(crate::builder::Step::FormatWider(child.element));
|
||||||
|
}
|
||||||
|
crate::config::Layout::Wide => {
|
||||||
|
steps.push_back(crate::builder::Step::Format(child.element));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ;
|
||||||
|
let child = children.get_next().unwrap();
|
||||||
|
steps.push_back(crate::builder::Step::Format(child.element));
|
||||||
|
|
||||||
|
// /**/
|
||||||
|
children.drain_comments(|text| {
|
||||||
|
steps.push_back(crate::builder::Step::NewLine);
|
||||||
|
steps.push_back(crate::builder::Step::Pad);
|
||||||
|
steps.push_back(crate::builder::Step::Comment(text));
|
||||||
|
});
|
||||||
|
|
||||||
|
// expr
|
||||||
|
let child = children.get_next().unwrap();
|
||||||
|
match layout {
|
||||||
|
crate::config::Layout::Tall => {
|
||||||
|
steps.push_back(crate::builder::Step::NewLine);
|
||||||
|
steps.push_back(crate::builder::Step::Pad);
|
||||||
|
steps.push_back(crate::builder::Step::FormatWider(child.element));
|
||||||
|
}
|
||||||
|
crate::config::Layout::Wide => {
|
||||||
|
steps.push_back(crate::builder::Step::Whitespace);
|
||||||
|
steps.push_back(crate::builder::Step::Format(child.element));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
steps
|
||||||
|
}
|
4
tests/cases/apply/in
Normal file
4
tests/cases/apply/in
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
(a b)
|
||||||
|
(a b)
|
||||||
|
(a /*b*/ c)
|
||||||
|
(/*a*/ b /*c*/ d /*e*/)
|
14
tests/cases/apply/out
Normal file
14
tests/cases/apply/out
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
( a b )
|
||||||
|
( a b )
|
||||||
|
(
|
||||||
|
a
|
||||||
|
/*b*/
|
||||||
|
c
|
||||||
|
)
|
||||||
|
(
|
||||||
|
/*a*/
|
||||||
|
b
|
||||||
|
/*c*/
|
||||||
|
d
|
||||||
|
/*e*/
|
||||||
|
)
|
8
tests/cases/assert/in
Normal file
8
tests/cases/assert/in
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
[
|
||||||
|
(assert b; c)
|
||||||
|
(assert b; /*b*/ c)
|
||||||
|
(assert /*a*/ b; c)
|
||||||
|
(assert /*a*/ b; /*b*/ c)
|
||||||
|
( assert b; cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc )
|
||||||
|
( assert b; cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc )
|
||||||
|
]
|
28
tests/cases/assert/out
Normal file
28
tests/cases/assert/out
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
[
|
||||||
|
( assert b; c )
|
||||||
|
(
|
||||||
|
assert b;
|
||||||
|
/*b*/
|
||||||
|
c
|
||||||
|
)
|
||||||
|
(
|
||||||
|
assert
|
||||||
|
/*a*/
|
||||||
|
b;
|
||||||
|
c
|
||||||
|
)
|
||||||
|
(
|
||||||
|
assert
|
||||||
|
/*a*/
|
||||||
|
b;
|
||||||
|
/*b*/
|
||||||
|
c
|
||||||
|
)
|
||||||
|
(
|
||||||
|
assert b; cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
|
||||||
|
)
|
||||||
|
(
|
||||||
|
assert b;
|
||||||
|
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
|
||||||
|
)
|
||||||
|
]
|
7
tests/cases/attr_set/in
Normal file
7
tests/cases/attr_set/in
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
[
|
||||||
|
{}
|
||||||
|
{/*a*/}
|
||||||
|
{a=1;}
|
||||||
|
{/*a*/b=1;/*c*/}
|
||||||
|
{a={a={a={a={a={a={a={a={a={a={};};};};};};};};};};}
|
||||||
|
]
|
24
tests/cases/attr_set/out
Normal file
24
tests/cases/attr_set/out
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
[
|
||||||
|
{ }
|
||||||
|
{
|
||||||
|
/*a*/
|
||||||
|
}
|
||||||
|
{ a = 1; }
|
||||||
|
{
|
||||||
|
/*a*/
|
||||||
|
b = 1;
|
||||||
|
/*c*/
|
||||||
|
}
|
||||||
|
{
|
||||||
|
a =
|
||||||
|
{
|
||||||
|
a =
|
||||||
|
{
|
||||||
|
a =
|
||||||
|
{
|
||||||
|
a = { a = { a = { a = { a = { a = { a = { }; }; }; }; }; }; };
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
|
]
|
9
tests/cases/bin_op/in
Normal file
9
tests/cases/bin_op/in
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
[
|
||||||
|
(1 + 1)
|
||||||
|
(1 +/**/1)
|
||||||
|
(1/**/+ 1)
|
||||||
|
(1/**/+/**/1)
|
||||||
|
(1/**/+/**/(1/**/+/**/(1/**/+/**/1)))
|
||||||
|
( 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 )
|
||||||
|
( 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1)
|
||||||
|
]
|
63
tests/cases/bin_op/out
Normal file
63
tests/cases/bin_op/out
Normal file
|
@ -0,0 +1,63 @@
|
||||||
|
[
|
||||||
|
( 1 + 1 )
|
||||||
|
(
|
||||||
|
1
|
||||||
|
+
|
||||||
|
/**/
|
||||||
|
1
|
||||||
|
)
|
||||||
|
(
|
||||||
|
1
|
||||||
|
/**/
|
||||||
|
+ 1
|
||||||
|
)
|
||||||
|
(
|
||||||
|
1
|
||||||
|
/**/
|
||||||
|
+
|
||||||
|
/**/
|
||||||
|
1
|
||||||
|
)
|
||||||
|
(
|
||||||
|
1
|
||||||
|
/**/
|
||||||
|
+
|
||||||
|
/**/
|
||||||
|
(
|
||||||
|
1
|
||||||
|
/**/
|
||||||
|
+
|
||||||
|
/**/
|
||||||
|
(
|
||||||
|
1
|
||||||
|
/**/
|
||||||
|
+
|
||||||
|
/**/
|
||||||
|
1
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
( 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 )
|
||||||
|
(
|
||||||
|
1
|
||||||
|
+ 1
|
||||||
|
+ 1
|
||||||
|
+ 1
|
||||||
|
+ 1
|
||||||
|
+ 1
|
||||||
|
+ 1
|
||||||
|
+ 1
|
||||||
|
+ 1
|
||||||
|
+ 1
|
||||||
|
+ 1
|
||||||
|
+ 1
|
||||||
|
+ 1
|
||||||
|
+ 1
|
||||||
|
+ 1
|
||||||
|
+ 1
|
||||||
|
+ 1
|
||||||
|
+ 1
|
||||||
|
+ 1
|
||||||
|
+ 1
|
||||||
|
)
|
||||||
|
]
|
1
tests/cases/dynamic/in
Normal file
1
tests/cases/dynamic/in
Normal file
|
@ -0,0 +1 @@
|
||||||
|
a.${/*b*/c.${/*d*/e.${f}}/*g*/}
|
10
tests/cases/dynamic/out
Normal file
10
tests/cases/dynamic/out
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
a
|
||||||
|
.${
|
||||||
|
/*b*/
|
||||||
|
c
|
||||||
|
.${
|
||||||
|
/*d*/
|
||||||
|
e.${ f }
|
||||||
|
}
|
||||||
|
/*g*/
|
||||||
|
}
|
4
tests/cases/if_else/in
Normal file
4
tests/cases/if_else/in
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
[
|
||||||
|
(if a then b else c)
|
||||||
|
(if /**/ a /**/ then /**/ b /**/ else /**/ c)
|
||||||
|
]
|
16
tests/cases/if_else/out
Normal file
16
tests/cases/if_else/out
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
[
|
||||||
|
( if a then b else c )
|
||||||
|
(
|
||||||
|
if
|
||||||
|
/**/
|
||||||
|
a
|
||||||
|
/**/
|
||||||
|
then
|
||||||
|
/**/
|
||||||
|
b
|
||||||
|
/**/
|
||||||
|
else
|
||||||
|
/**/
|
||||||
|
c
|
||||||
|
)
|
||||||
|
]
|
12
tests/cases/inherit/in
Normal file
12
tests/cases/inherit/in
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
[
|
||||||
|
{ inherit aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa; }
|
||||||
|
{ inherit aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa; }
|
||||||
|
{ inherit b d ; }
|
||||||
|
{ inherit b d /*e*/ ; }
|
||||||
|
{ inherit b /*c*/ d ; }
|
||||||
|
{ inherit b /*c*/ d /*e*/ ; }
|
||||||
|
{ inherit /*a*/ b d ; }
|
||||||
|
{ inherit /*a*/ b d /*e*/ ; }
|
||||||
|
{ inherit /*a*/ b /*c*/ d ; }
|
||||||
|
{ inherit /*a*/ b /*c*/ d /*e*/ ; }
|
||||||
|
]
|
61
tests/cases/inherit/out
Normal file
61
tests/cases/inherit/out
Normal file
|
@ -0,0 +1,61 @@
|
||||||
|
[
|
||||||
|
{
|
||||||
|
inherit aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;
|
||||||
|
}
|
||||||
|
{
|
||||||
|
inherit
|
||||||
|
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;
|
||||||
|
}
|
||||||
|
{ inherit b d; }
|
||||||
|
{
|
||||||
|
inherit
|
||||||
|
b
|
||||||
|
d
|
||||||
|
/*e*/
|
||||||
|
;
|
||||||
|
}
|
||||||
|
{
|
||||||
|
inherit
|
||||||
|
b
|
||||||
|
/*c*/
|
||||||
|
d;
|
||||||
|
}
|
||||||
|
{
|
||||||
|
inherit
|
||||||
|
b
|
||||||
|
/*c*/
|
||||||
|
d
|
||||||
|
/*e*/
|
||||||
|
;
|
||||||
|
}
|
||||||
|
{
|
||||||
|
inherit
|
||||||
|
/*a*/
|
||||||
|
b
|
||||||
|
d;
|
||||||
|
}
|
||||||
|
{
|
||||||
|
inherit
|
||||||
|
/*a*/
|
||||||
|
b
|
||||||
|
d
|
||||||
|
/*e*/
|
||||||
|
;
|
||||||
|
}
|
||||||
|
{
|
||||||
|
inherit
|
||||||
|
/*a*/
|
||||||
|
b
|
||||||
|
/*c*/
|
||||||
|
d;
|
||||||
|
}
|
||||||
|
{
|
||||||
|
inherit
|
||||||
|
/*a*/
|
||||||
|
b
|
||||||
|
/*c*/
|
||||||
|
d
|
||||||
|
/*e*/
|
||||||
|
;
|
||||||
|
}
|
||||||
|
]
|
6
tests/cases/inherit_from/in
Normal file
6
tests/cases/inherit_from/in
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
[
|
||||||
|
{ inherit ( b ) d; }
|
||||||
|
{ inherit ( b /*c*/) d; }
|
||||||
|
{ inherit (/*a*/ b ) d; }
|
||||||
|
{ inherit (/*a*/ b /*c*/) d; }
|
||||||
|
]
|
28
tests/cases/inherit_from/out
Normal file
28
tests/cases/inherit_from/out
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
[
|
||||||
|
{ inherit ( b ) d; }
|
||||||
|
{
|
||||||
|
inherit
|
||||||
|
(
|
||||||
|
b
|
||||||
|
/*c*/
|
||||||
|
)
|
||||||
|
d;
|
||||||
|
}
|
||||||
|
{
|
||||||
|
inherit
|
||||||
|
(
|
||||||
|
/*a*/
|
||||||
|
b
|
||||||
|
)
|
||||||
|
d;
|
||||||
|
}
|
||||||
|
{
|
||||||
|
inherit
|
||||||
|
(
|
||||||
|
/*a*/
|
||||||
|
b
|
||||||
|
/*c*/
|
||||||
|
)
|
||||||
|
d;
|
||||||
|
}
|
||||||
|
]
|
10
tests/cases/key_value/in
Normal file
10
tests/cases/key_value/in
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
{
|
||||||
|
a = {a = 1 ;};
|
||||||
|
b = {a = 1/*d*/;};
|
||||||
|
c = {a =/*c*/1 ;};
|
||||||
|
d = {a =/*c*/1/*d*/;};
|
||||||
|
e = {a/*b*/= 1 ;};
|
||||||
|
f = {a/*b*/= 1/*d*/;};
|
||||||
|
h = {a/*b*/=/*c*/1 ;};
|
||||||
|
i = {a/*b*/=/*c*/1/*d*/;};
|
||||||
|
}
|
58
tests/cases/key_value/out
Normal file
58
tests/cases/key_value/out
Normal file
|
@ -0,0 +1,58 @@
|
||||||
|
{
|
||||||
|
a = { a = 1; };
|
||||||
|
b =
|
||||||
|
{
|
||||||
|
a =
|
||||||
|
1
|
||||||
|
/*d*/
|
||||||
|
;
|
||||||
|
};
|
||||||
|
c =
|
||||||
|
{
|
||||||
|
a =
|
||||||
|
/*c*/
|
||||||
|
1;
|
||||||
|
};
|
||||||
|
d =
|
||||||
|
{
|
||||||
|
a =
|
||||||
|
/*c*/
|
||||||
|
1
|
||||||
|
/*d*/
|
||||||
|
;
|
||||||
|
};
|
||||||
|
e =
|
||||||
|
{
|
||||||
|
a
|
||||||
|
/*b*/
|
||||||
|
=
|
||||||
|
1;
|
||||||
|
};
|
||||||
|
f =
|
||||||
|
{
|
||||||
|
a
|
||||||
|
/*b*/
|
||||||
|
=
|
||||||
|
1
|
||||||
|
/*d*/
|
||||||
|
;
|
||||||
|
};
|
||||||
|
h =
|
||||||
|
{
|
||||||
|
a
|
||||||
|
/*b*/
|
||||||
|
=
|
||||||
|
/*c*/
|
||||||
|
1;
|
||||||
|
};
|
||||||
|
i =
|
||||||
|
{
|
||||||
|
a
|
||||||
|
/*b*/
|
||||||
|
=
|
||||||
|
/*c*/
|
||||||
|
1
|
||||||
|
/*d*/
|
||||||
|
;
|
||||||
|
};
|
||||||
|
}
|
10
tests/cases/lambda/in
Normal file
10
tests/cases/lambda/in
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
[
|
||||||
|
(a : d)
|
||||||
|
(a : /*c*/ d)
|
||||||
|
(a /*b*/ : d)
|
||||||
|
(a /*b*/ : /*c*/ d)
|
||||||
|
(
|
||||||
|
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
|
||||||
|
)
|
||||||
|
( aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa )
|
||||||
|
]
|
28
tests/cases/lambda/out
Normal file
28
tests/cases/lambda/out
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
[
|
||||||
|
( a: d )
|
||||||
|
(
|
||||||
|
a:
|
||||||
|
/*c*/
|
||||||
|
d
|
||||||
|
)
|
||||||
|
(
|
||||||
|
a
|
||||||
|
/*b*/
|
||||||
|
:
|
||||||
|
d
|
||||||
|
)
|
||||||
|
(
|
||||||
|
a
|
||||||
|
/*b*/
|
||||||
|
:
|
||||||
|
/*c*/
|
||||||
|
d
|
||||||
|
)
|
||||||
|
(
|
||||||
|
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
|
||||||
|
)
|
||||||
|
(
|
||||||
|
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:
|
||||||
|
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
|
||||||
|
)
|
||||||
|
]
|
21
tests/cases/let_in/in
Normal file
21
tests/cases/let_in/in
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
let
|
||||||
|
/**/
|
||||||
|
a = let c=1; in f;
|
||||||
|
/**/
|
||||||
|
a = let c=1; in /*e*/ f;
|
||||||
|
/**/
|
||||||
|
a = let c=1; /*d*/ in f;
|
||||||
|
/**/
|
||||||
|
a = let c=1; /*d*/ in /*e*/ f;
|
||||||
|
/**/
|
||||||
|
a = let /*b*/ c=1; in f;
|
||||||
|
/**/
|
||||||
|
a = let /*b*/ c=1; in /*e*/ f;
|
||||||
|
/**/
|
||||||
|
a = let /*b*/ c=1; /*d*/ in f;
|
||||||
|
/**/
|
||||||
|
a = let /*b*/ c=1; /*d*/ in /*e*/ f;
|
||||||
|
/**/
|
||||||
|
in
|
||||||
|
/**/
|
||||||
|
a
|
61
tests/cases/let_in/out
Normal file
61
tests/cases/let_in/out
Normal file
|
@ -0,0 +1,61 @@
|
||||||
|
let
|
||||||
|
/**/
|
||||||
|
a = let c = 1; in f;
|
||||||
|
/**/
|
||||||
|
a =
|
||||||
|
let
|
||||||
|
c = 1;
|
||||||
|
in
|
||||||
|
/*e*/
|
||||||
|
f;
|
||||||
|
/**/
|
||||||
|
a =
|
||||||
|
let
|
||||||
|
c = 1;
|
||||||
|
/*d*/
|
||||||
|
in
|
||||||
|
f;
|
||||||
|
/**/
|
||||||
|
a =
|
||||||
|
let
|
||||||
|
c = 1;
|
||||||
|
/*d*/
|
||||||
|
in
|
||||||
|
/*e*/
|
||||||
|
f;
|
||||||
|
/**/
|
||||||
|
a =
|
||||||
|
let
|
||||||
|
/*b*/
|
||||||
|
c = 1;
|
||||||
|
in
|
||||||
|
f;
|
||||||
|
/**/
|
||||||
|
a =
|
||||||
|
let
|
||||||
|
/*b*/
|
||||||
|
c = 1;
|
||||||
|
in
|
||||||
|
/*e*/
|
||||||
|
f;
|
||||||
|
/**/
|
||||||
|
a =
|
||||||
|
let
|
||||||
|
/*b*/
|
||||||
|
c = 1;
|
||||||
|
/*d*/
|
||||||
|
in
|
||||||
|
f;
|
||||||
|
/**/
|
||||||
|
a =
|
||||||
|
let
|
||||||
|
/*b*/
|
||||||
|
c = 1;
|
||||||
|
/*d*/
|
||||||
|
in
|
||||||
|
/*e*/
|
||||||
|
f;
|
||||||
|
/**/
|
||||||
|
in
|
||||||
|
/**/
|
||||||
|
a
|
9
tests/cases/or_default/in
Normal file
9
tests/cases/or_default/in
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
[
|
||||||
|
(a ? a)
|
||||||
|
(a ?/**/a)
|
||||||
|
(a/**/? a)
|
||||||
|
(a/**/?/**/a)
|
||||||
|
(a/**/?/**/(a/**/?/**/(a/**/?/**/a)))
|
||||||
|
( a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a )
|
||||||
|
( a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a)
|
||||||
|
]
|
63
tests/cases/or_default/out
Normal file
63
tests/cases/or_default/out
Normal file
|
@ -0,0 +1,63 @@
|
||||||
|
[
|
||||||
|
( a ? a )
|
||||||
|
(
|
||||||
|
a
|
||||||
|
?
|
||||||
|
/**/
|
||||||
|
a
|
||||||
|
)
|
||||||
|
(
|
||||||
|
a
|
||||||
|
/**/
|
||||||
|
? a
|
||||||
|
)
|
||||||
|
(
|
||||||
|
a
|
||||||
|
/**/
|
||||||
|
?
|
||||||
|
/**/
|
||||||
|
a
|
||||||
|
)
|
||||||
|
(
|
||||||
|
a
|
||||||
|
/**/
|
||||||
|
?
|
||||||
|
/**/
|
||||||
|
(
|
||||||
|
a
|
||||||
|
/**/
|
||||||
|
?
|
||||||
|
/**/
|
||||||
|
(
|
||||||
|
a
|
||||||
|
/**/
|
||||||
|
?
|
||||||
|
/**/
|
||||||
|
a
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
( a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a ? a )
|
||||||
|
(
|
||||||
|
a
|
||||||
|
? a
|
||||||
|
? a
|
||||||
|
? a
|
||||||
|
? a
|
||||||
|
? a
|
||||||
|
? a
|
||||||
|
? a
|
||||||
|
? a
|
||||||
|
? a
|
||||||
|
? a
|
||||||
|
? a
|
||||||
|
? a
|
||||||
|
? a
|
||||||
|
? a
|
||||||
|
? a
|
||||||
|
? a
|
||||||
|
? a
|
||||||
|
? a
|
||||||
|
? a
|
||||||
|
)
|
||||||
|
]
|
1
tests/cases/paren/in
Normal file
1
tests/cases/paren/in
Normal file
|
@ -0,0 +1 @@
|
||||||
|
(/*a*/(/*b*/(c))/*d*/)
|
8
tests/cases/paren/out
Normal file
8
tests/cases/paren/out
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
(
|
||||||
|
/*a*/
|
||||||
|
(
|
||||||
|
/*b*/
|
||||||
|
( c )
|
||||||
|
)
|
||||||
|
/*d*/
|
||||||
|
)
|
11
tests/cases/pat_bind/in
Normal file
11
tests/cases/pat_bind/in
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
[
|
||||||
|
({} @ a: _)
|
||||||
|
({} @ /**/ a: _)
|
||||||
|
({} /**/ @ a: _)
|
||||||
|
({} /**/ @ /**/ a: _)
|
||||||
|
|
||||||
|
(a @ {}: _)
|
||||||
|
(a @ /**/ {}: _)
|
||||||
|
(a /**/ @ {}: _)
|
||||||
|
(a /**/ @ /**/ {}: _)
|
||||||
|
]
|
52
tests/cases/pat_bind/out
Normal file
52
tests/cases/pat_bind/out
Normal file
|
@ -0,0 +1,52 @@
|
||||||
|
[
|
||||||
|
( { } @ a: _ )
|
||||||
|
(
|
||||||
|
{
|
||||||
|
}
|
||||||
|
@
|
||||||
|
/**/
|
||||||
|
a:
|
||||||
|
_
|
||||||
|
)
|
||||||
|
(
|
||||||
|
{
|
||||||
|
}
|
||||||
|
/**/
|
||||||
|
@ a:
|
||||||
|
_
|
||||||
|
)
|
||||||
|
(
|
||||||
|
{
|
||||||
|
}
|
||||||
|
/**/
|
||||||
|
@
|
||||||
|
/**/
|
||||||
|
a:
|
||||||
|
_
|
||||||
|
)
|
||||||
|
( a @ { }: _ )
|
||||||
|
(
|
||||||
|
a @
|
||||||
|
/**/
|
||||||
|
{
|
||||||
|
}:
|
||||||
|
_
|
||||||
|
)
|
||||||
|
(
|
||||||
|
a
|
||||||
|
/**/
|
||||||
|
@
|
||||||
|
{
|
||||||
|
}:
|
||||||
|
_
|
||||||
|
)
|
||||||
|
(
|
||||||
|
a
|
||||||
|
/**/
|
||||||
|
@
|
||||||
|
/**/
|
||||||
|
{
|
||||||
|
}:
|
||||||
|
_
|
||||||
|
)
|
||||||
|
]
|
73
tests/cases/pattern/in
Normal file
73
tests/cases/pattern/in
Normal file
|
@ -0,0 +1,73 @@
|
||||||
|
[
|
||||||
|
({}: _)
|
||||||
|
({ /**/ }: _)
|
||||||
|
({ ... }: _)
|
||||||
|
({ ... /**/}: _)
|
||||||
|
({ /**/ ... }: _)
|
||||||
|
({ /**/ ... /**/}: _)
|
||||||
|
|
||||||
|
({ b , e , ... }: _)
|
||||||
|
({ b , e , ... /*h*/ }: _)
|
||||||
|
({ b , e , /*g*/ ... }: _)
|
||||||
|
({ b , e , /*g*/ ... /*h*/ }: _)
|
||||||
|
({ b , e /*f*/ , ... }: _)
|
||||||
|
({ b , e /*f*/ , ... /*h*/ }: _)
|
||||||
|
({ b , e /*f*/ , /*g*/ ... }: _)
|
||||||
|
({ b , e /*f*/ , /*g*/ ... /*h*/ }: _)
|
||||||
|
({ b , /*d*/ e , ... }: _)
|
||||||
|
({ b , /*d*/ e , ... /*h*/ }: _)
|
||||||
|
({ b , /*d*/ e , /*g*/ ... }: _)
|
||||||
|
({ b , /*d*/ e , /*g*/ ... /*h*/ }: _)
|
||||||
|
({ b , /*d*/ e /*f*/ , ... }: _)
|
||||||
|
({ b , /*d*/ e /*f*/ , ... /*h*/ }: _)
|
||||||
|
({ b , /*d*/ e /*f*/ , /*g*/ ... }: _)
|
||||||
|
({ b , /*d*/ e /*f*/ , /*g*/ ... /*h*/ }: _)
|
||||||
|
({ b /*c*/ , e , ... }: _)
|
||||||
|
({ b /*c*/ , e , ... /*h*/ }: _)
|
||||||
|
({ b /*c*/ , e , /*g*/ ... }: _)
|
||||||
|
({ b /*c*/ , e , /*g*/ ... /*h*/ }: _)
|
||||||
|
({ b /*c*/ , e /*f*/ , ... }: _)
|
||||||
|
({ b /*c*/ , e /*f*/ , ... /*h*/ }: _)
|
||||||
|
({ b /*c*/ , e /*f*/ , /*g*/ ... }: _)
|
||||||
|
({ b /*c*/ , e /*f*/ , /*g*/ ... /*h*/ }: _)
|
||||||
|
({ b /*c*/ , /*d*/ e , ... }: _)
|
||||||
|
({ b /*c*/ , /*d*/ e , ... /*h*/ }: _)
|
||||||
|
({ b /*c*/ , /*d*/ e , /*g*/ ... }: _)
|
||||||
|
({ b /*c*/ , /*d*/ e , /*g*/ ... /*h*/ }: _)
|
||||||
|
({ b /*c*/ , /*d*/ e /*f*/ , ... }: _)
|
||||||
|
({ b /*c*/ , /*d*/ e /*f*/ , ... /*h*/ }: _)
|
||||||
|
({ b /*c*/ , /*d*/ e /*f*/ , /*g*/ ... }: _)
|
||||||
|
({ b /*c*/ , /*d*/ e /*f*/ , /*g*/ ... /*h*/ }: _)
|
||||||
|
({ /*a*/ b , e , ... }: _)
|
||||||
|
({ /*a*/ b , e , ... /*h*/ }: _)
|
||||||
|
({ /*a*/ b , e , /*g*/ ... }: _)
|
||||||
|
({ /*a*/ b , e , /*g*/ ... /*h*/ }: _)
|
||||||
|
({ /*a*/ b , e /*f*/ , ... }: _)
|
||||||
|
({ /*a*/ b , e /*f*/ , ... /*h*/ }: _)
|
||||||
|
({ /*a*/ b , e /*f*/ , /*g*/ ... }: _)
|
||||||
|
({ /*a*/ b , e /*f*/ , /*g*/ ... /*h*/ }: _)
|
||||||
|
({ /*a*/ b , /*d*/ e , ... }: _)
|
||||||
|
({ /*a*/ b , /*d*/ e , ... /*h*/ }: _)
|
||||||
|
({ /*a*/ b , /*d*/ e , /*g*/ ... }: _)
|
||||||
|
({ /*a*/ b , /*d*/ e , /*g*/ ... /*h*/ }: _)
|
||||||
|
({ /*a*/ b , /*d*/ e /*f*/ , ... }: _)
|
||||||
|
({ /*a*/ b , /*d*/ e /*f*/ , ... /*h*/ }: _)
|
||||||
|
({ /*a*/ b , /*d*/ e /*f*/ , /*g*/ ... }: _)
|
||||||
|
({ /*a*/ b , /*d*/ e /*f*/ , /*g*/ ... /*h*/ }: _)
|
||||||
|
({ /*a*/ b /*c*/ , e , ... }: _)
|
||||||
|
({ /*a*/ b /*c*/ , e , ... /*h*/ }: _)
|
||||||
|
({ /*a*/ b /*c*/ , e , /*g*/ ... }: _)
|
||||||
|
({ /*a*/ b /*c*/ , e , /*g*/ ... /*h*/ }: _)
|
||||||
|
({ /*a*/ b /*c*/ , e /*f*/ , ... }: _)
|
||||||
|
({ /*a*/ b /*c*/ , e /*f*/ , ... /*h*/ }: _)
|
||||||
|
({ /*a*/ b /*c*/ , e /*f*/ , /*g*/ ... }: _)
|
||||||
|
({ /*a*/ b /*c*/ , e /*f*/ , /*g*/ ... /*h*/ }: _)
|
||||||
|
({ /*a*/ b /*c*/ , /*d*/ e , ... }: _)
|
||||||
|
({ /*a*/ b /*c*/ , /*d*/ e , ... /*h*/ }: _)
|
||||||
|
({ /*a*/ b /*c*/ , /*d*/ e , /*g*/ ... }: _)
|
||||||
|
({ /*a*/ b /*c*/ , /*d*/ e , /*g*/ ... /*h*/ }: _)
|
||||||
|
({ /*a*/ b /*c*/ , /*d*/ e /*f*/ , ... }: _)
|
||||||
|
({ /*a*/ b /*c*/ , /*d*/ e /*f*/ , ... /*h*/ }: _)
|
||||||
|
({ /*a*/ b /*c*/ , /*d*/ e /*f*/ , /*g*/ ... }: _)
|
||||||
|
({ /*a*/ b /*c*/ , /*d*/ e /*f*/ , /*g*/ ... /*h*/ }: _)
|
||||||
|
]
|
662
tests/cases/pattern/out
Normal file
662
tests/cases/pattern/out
Normal file
|
@ -0,0 +1,662 @@
|
||||||
|
[
|
||||||
|
( { }: _ )
|
||||||
|
(
|
||||||
|
{ /**/
|
||||||
|
}:
|
||||||
|
_
|
||||||
|
)
|
||||||
|
( { ... }: _ )
|
||||||
|
(
|
||||||
|
{ ...
|
||||||
|
/**/
|
||||||
|
}:
|
||||||
|
_
|
||||||
|
)
|
||||||
|
(
|
||||||
|
{ /**/
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
_
|
||||||
|
)
|
||||||
|
(
|
||||||
|
{ /**/
|
||||||
|
...
|
||||||
|
/**/
|
||||||
|
}:
|
||||||
|
_
|
||||||
|
)
|
||||||
|
( { b, e, ... }: _ )
|
||||||
|
(
|
||||||
|
{ b
|
||||||
|
, e
|
||||||
|
, ...
|
||||||
|
/*h*/
|
||||||
|
}:
|
||||||
|
_
|
||||||
|
)
|
||||||
|
(
|
||||||
|
{ b
|
||||||
|
, e
|
||||||
|
, /*g*/
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
_
|
||||||
|
)
|
||||||
|
(
|
||||||
|
{ b
|
||||||
|
, e
|
||||||
|
, /*g*/
|
||||||
|
...
|
||||||
|
/*h*/
|
||||||
|
}:
|
||||||
|
_
|
||||||
|
)
|
||||||
|
(
|
||||||
|
{ b
|
||||||
|
, e
|
||||||
|
/*f*/
|
||||||
|
, ...
|
||||||
|
}:
|
||||||
|
_
|
||||||
|
)
|
||||||
|
(
|
||||||
|
{ b
|
||||||
|
, e
|
||||||
|
/*f*/
|
||||||
|
, ...
|
||||||
|
/*h*/
|
||||||
|
}:
|
||||||
|
_
|
||||||
|
)
|
||||||
|
(
|
||||||
|
{ b
|
||||||
|
, e
|
||||||
|
/*f*/
|
||||||
|
, /*g*/
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
_
|
||||||
|
)
|
||||||
|
(
|
||||||
|
{ b
|
||||||
|
, e
|
||||||
|
/*f*/
|
||||||
|
, /*g*/
|
||||||
|
...
|
||||||
|
/*h*/
|
||||||
|
}:
|
||||||
|
_
|
||||||
|
)
|
||||||
|
(
|
||||||
|
{ b
|
||||||
|
, /*d*/
|
||||||
|
e
|
||||||
|
, ...
|
||||||
|
}:
|
||||||
|
_
|
||||||
|
)
|
||||||
|
(
|
||||||
|
{ b
|
||||||
|
, /*d*/
|
||||||
|
e
|
||||||
|
, ...
|
||||||
|
/*h*/
|
||||||
|
}:
|
||||||
|
_
|
||||||
|
)
|
||||||
|
(
|
||||||
|
{ b
|
||||||
|
, /*d*/
|
||||||
|
e
|
||||||
|
, /*g*/
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
_
|
||||||
|
)
|
||||||
|
(
|
||||||
|
{ b
|
||||||
|
, /*d*/
|
||||||
|
e
|
||||||
|
, /*g*/
|
||||||
|
...
|
||||||
|
/*h*/
|
||||||
|
}:
|
||||||
|
_
|
||||||
|
)
|
||||||
|
(
|
||||||
|
{ b
|
||||||
|
, /*d*/
|
||||||
|
e
|
||||||
|
/*f*/
|
||||||
|
, ...
|
||||||
|
}:
|
||||||
|
_
|
||||||
|
)
|
||||||
|
(
|
||||||
|
{ b
|
||||||
|
, /*d*/
|
||||||
|
e
|
||||||
|
/*f*/
|
||||||
|
, ...
|
||||||
|
/*h*/
|
||||||
|
}:
|
||||||
|
_
|
||||||
|
)
|
||||||
|
(
|
||||||
|
{ b
|
||||||
|
, /*d*/
|
||||||
|
e
|
||||||
|
/*f*/
|
||||||
|
, /*g*/
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
_
|
||||||
|
)
|
||||||
|
(
|
||||||
|
{ b
|
||||||
|
, /*d*/
|
||||||
|
e
|
||||||
|
/*f*/
|
||||||
|
, /*g*/
|
||||||
|
...
|
||||||
|
/*h*/
|
||||||
|
}:
|
||||||
|
_
|
||||||
|
)
|
||||||
|
(
|
||||||
|
{ b
|
||||||
|
/*c*/
|
||||||
|
, e
|
||||||
|
, ...
|
||||||
|
}:
|
||||||
|
_
|
||||||
|
)
|
||||||
|
(
|
||||||
|
{ b
|
||||||
|
/*c*/
|
||||||
|
, e
|
||||||
|
, ...
|
||||||
|
/*h*/
|
||||||
|
}:
|
||||||
|
_
|
||||||
|
)
|
||||||
|
(
|
||||||
|
{ b
|
||||||
|
/*c*/
|
||||||
|
, e
|
||||||
|
, /*g*/
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
_
|
||||||
|
)
|
||||||
|
(
|
||||||
|
{ b
|
||||||
|
/*c*/
|
||||||
|
, e
|
||||||
|
, /*g*/
|
||||||
|
...
|
||||||
|
/*h*/
|
||||||
|
}:
|
||||||
|
_
|
||||||
|
)
|
||||||
|
(
|
||||||
|
{ b
|
||||||
|
/*c*/
|
||||||
|
, e
|
||||||
|
/*f*/
|
||||||
|
, ...
|
||||||
|
}:
|
||||||
|
_
|
||||||
|
)
|
||||||
|
(
|
||||||
|
{ b
|
||||||
|
/*c*/
|
||||||
|
, e
|
||||||
|
/*f*/
|
||||||
|
, ...
|
||||||
|
/*h*/
|
||||||
|
}:
|
||||||
|
_
|
||||||
|
)
|
||||||
|
(
|
||||||
|
{ b
|
||||||
|
/*c*/
|
||||||
|
, e
|
||||||
|
/*f*/
|
||||||
|
, /*g*/
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
_
|
||||||
|
)
|
||||||
|
(
|
||||||
|
{ b
|
||||||
|
/*c*/
|
||||||
|
, e
|
||||||
|
/*f*/
|
||||||
|
, /*g*/
|
||||||
|
...
|
||||||
|
/*h*/
|
||||||
|
}:
|
||||||
|
_
|
||||||
|
)
|
||||||
|
(
|
||||||
|
{ b
|
||||||
|
/*c*/
|
||||||
|
, /*d*/
|
||||||
|
e
|
||||||
|
, ...
|
||||||
|
}:
|
||||||
|
_
|
||||||
|
)
|
||||||
|
(
|
||||||
|
{ b
|
||||||
|
/*c*/
|
||||||
|
, /*d*/
|
||||||
|
e
|
||||||
|
, ...
|
||||||
|
/*h*/
|
||||||
|
}:
|
||||||
|
_
|
||||||
|
)
|
||||||
|
(
|
||||||
|
{ b
|
||||||
|
/*c*/
|
||||||
|
, /*d*/
|
||||||
|
e
|
||||||
|
, /*g*/
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
_
|
||||||
|
)
|
||||||
|
(
|
||||||
|
{ b
|
||||||
|
/*c*/
|
||||||
|
, /*d*/
|
||||||
|
e
|
||||||
|
, /*g*/
|
||||||
|
...
|
||||||
|
/*h*/
|
||||||
|
}:
|
||||||
|
_
|
||||||
|
)
|
||||||
|
(
|
||||||
|
{ b
|
||||||
|
/*c*/
|
||||||
|
, /*d*/
|
||||||
|
e
|
||||||
|
/*f*/
|
||||||
|
, ...
|
||||||
|
}:
|
||||||
|
_
|
||||||
|
)
|
||||||
|
(
|
||||||
|
{ b
|
||||||
|
/*c*/
|
||||||
|
, /*d*/
|
||||||
|
e
|
||||||
|
/*f*/
|
||||||
|
, ...
|
||||||
|
/*h*/
|
||||||
|
}:
|
||||||
|
_
|
||||||
|
)
|
||||||
|
(
|
||||||
|
{ b
|
||||||
|
/*c*/
|
||||||
|
, /*d*/
|
||||||
|
e
|
||||||
|
/*f*/
|
||||||
|
, /*g*/
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
_
|
||||||
|
)
|
||||||
|
(
|
||||||
|
{ b
|
||||||
|
/*c*/
|
||||||
|
, /*d*/
|
||||||
|
e
|
||||||
|
/*f*/
|
||||||
|
, /*g*/
|
||||||
|
...
|
||||||
|
/*h*/
|
||||||
|
}:
|
||||||
|
_
|
||||||
|
)
|
||||||
|
(
|
||||||
|
{ /*a*/
|
||||||
|
b
|
||||||
|
, e
|
||||||
|
, ...
|
||||||
|
}:
|
||||||
|
_
|
||||||
|
)
|
||||||
|
(
|
||||||
|
{ /*a*/
|
||||||
|
b
|
||||||
|
, e
|
||||||
|
, ...
|
||||||
|
/*h*/
|
||||||
|
}:
|
||||||
|
_
|
||||||
|
)
|
||||||
|
(
|
||||||
|
{ /*a*/
|
||||||
|
b
|
||||||
|
, e
|
||||||
|
, /*g*/
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
_
|
||||||
|
)
|
||||||
|
(
|
||||||
|
{ /*a*/
|
||||||
|
b
|
||||||
|
, e
|
||||||
|
, /*g*/
|
||||||
|
...
|
||||||
|
/*h*/
|
||||||
|
}:
|
||||||
|
_
|
||||||
|
)
|
||||||
|
(
|
||||||
|
{ /*a*/
|
||||||
|
b
|
||||||
|
, e
|
||||||
|
/*f*/
|
||||||
|
, ...
|
||||||
|
}:
|
||||||
|
_
|
||||||
|
)
|
||||||
|
(
|
||||||
|
{ /*a*/
|
||||||
|
b
|
||||||
|
, e
|
||||||
|
/*f*/
|
||||||
|
, ...
|
||||||
|
/*h*/
|
||||||
|
}:
|
||||||
|
_
|
||||||
|
)
|
||||||
|
(
|
||||||
|
{ /*a*/
|
||||||
|
b
|
||||||
|
, e
|
||||||
|
/*f*/
|
||||||
|
, /*g*/
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
_
|
||||||
|
)
|
||||||
|
(
|
||||||
|
{ /*a*/
|
||||||
|
b
|
||||||
|
, e
|
||||||
|
/*f*/
|
||||||
|
, /*g*/
|
||||||
|
...
|
||||||
|
/*h*/
|
||||||
|
}:
|
||||||
|
_
|
||||||
|
)
|
||||||
|
(
|
||||||
|
{ /*a*/
|
||||||
|
b
|
||||||
|
, /*d*/
|
||||||
|
e
|
||||||
|
, ...
|
||||||
|
}:
|
||||||
|
_
|
||||||
|
)
|
||||||
|
(
|
||||||
|
{ /*a*/
|
||||||
|
b
|
||||||
|
, /*d*/
|
||||||
|
e
|
||||||
|
, ...
|
||||||
|
/*h*/
|
||||||
|
}:
|
||||||
|
_
|
||||||
|
)
|
||||||
|
(
|
||||||
|
{ /*a*/
|
||||||
|
b
|
||||||
|
, /*d*/
|
||||||
|
e
|
||||||
|
, /*g*/
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
_
|
||||||
|
)
|
||||||
|
(
|
||||||
|
{ /*a*/
|
||||||
|
b
|
||||||
|
, /*d*/
|
||||||
|
e
|
||||||
|
, /*g*/
|
||||||
|
...
|
||||||
|
/*h*/
|
||||||
|
}:
|
||||||
|
_
|
||||||
|
)
|
||||||
|
(
|
||||||
|
{ /*a*/
|
||||||
|
b
|
||||||
|
, /*d*/
|
||||||
|
e
|
||||||
|
/*f*/
|
||||||
|
, ...
|
||||||
|
}:
|
||||||
|
_
|
||||||
|
)
|
||||||
|
(
|
||||||
|
{ /*a*/
|
||||||
|
b
|
||||||
|
, /*d*/
|
||||||
|
e
|
||||||
|
/*f*/
|
||||||
|
, ...
|
||||||
|
/*h*/
|
||||||
|
}:
|
||||||
|
_
|
||||||
|
)
|
||||||
|
(
|
||||||
|
{ /*a*/
|
||||||
|
b
|
||||||
|
, /*d*/
|
||||||
|
e
|
||||||
|
/*f*/
|
||||||
|
, /*g*/
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
_
|
||||||
|
)
|
||||||
|
(
|
||||||
|
{ /*a*/
|
||||||
|
b
|
||||||
|
, /*d*/
|
||||||
|
e
|
||||||
|
/*f*/
|
||||||
|
, /*g*/
|
||||||
|
...
|
||||||
|
/*h*/
|
||||||
|
}:
|
||||||
|
_
|
||||||
|
)
|
||||||
|
(
|
||||||
|
{ /*a*/
|
||||||
|
b
|
||||||
|
/*c*/
|
||||||
|
, e
|
||||||
|
, ...
|
||||||
|
}:
|
||||||
|
_
|
||||||
|
)
|
||||||
|
(
|
||||||
|
{ /*a*/
|
||||||
|
b
|
||||||
|
/*c*/
|
||||||
|
, e
|
||||||
|
, ...
|
||||||
|
/*h*/
|
||||||
|
}:
|
||||||
|
_
|
||||||
|
)
|
||||||
|
(
|
||||||
|
{ /*a*/
|
||||||
|
b
|
||||||
|
/*c*/
|
||||||
|
, e
|
||||||
|
, /*g*/
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
_
|
||||||
|
)
|
||||||
|
(
|
||||||
|
{ /*a*/
|
||||||
|
b
|
||||||
|
/*c*/
|
||||||
|
, e
|
||||||
|
, /*g*/
|
||||||
|
...
|
||||||
|
/*h*/
|
||||||
|
}:
|
||||||
|
_
|
||||||
|
)
|
||||||
|
(
|
||||||
|
{ /*a*/
|
||||||
|
b
|
||||||
|
/*c*/
|
||||||
|
, e
|
||||||
|
/*f*/
|
||||||
|
, ...
|
||||||
|
}:
|
||||||
|
_
|
||||||
|
)
|
||||||
|
(
|
||||||
|
{ /*a*/
|
||||||
|
b
|
||||||
|
/*c*/
|
||||||
|
, e
|
||||||
|
/*f*/
|
||||||
|
, ...
|
||||||
|
/*h*/
|
||||||
|
}:
|
||||||
|
_
|
||||||
|
)
|
||||||
|
(
|
||||||
|
{ /*a*/
|
||||||
|
b
|
||||||
|
/*c*/
|
||||||
|
, e
|
||||||
|
/*f*/
|
||||||
|
, /*g*/
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
_
|
||||||
|
)
|
||||||
|
(
|
||||||
|
{ /*a*/
|
||||||
|
b
|
||||||
|
/*c*/
|
||||||
|
, e
|
||||||
|
/*f*/
|
||||||
|
, /*g*/
|
||||||
|
...
|
||||||
|
/*h*/
|
||||||
|
}:
|
||||||
|
_
|
||||||
|
)
|
||||||
|
(
|
||||||
|
{ /*a*/
|
||||||
|
b
|
||||||
|
/*c*/
|
||||||
|
, /*d*/
|
||||||
|
e
|
||||||
|
, ...
|
||||||
|
}:
|
||||||
|
_
|
||||||
|
)
|
||||||
|
(
|
||||||
|
{ /*a*/
|
||||||
|
b
|
||||||
|
/*c*/
|
||||||
|
, /*d*/
|
||||||
|
e
|
||||||
|
, ...
|
||||||
|
/*h*/
|
||||||
|
}:
|
||||||
|
_
|
||||||
|
)
|
||||||
|
(
|
||||||
|
{ /*a*/
|
||||||
|
b
|
||||||
|
/*c*/
|
||||||
|
, /*d*/
|
||||||
|
e
|
||||||
|
, /*g*/
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
_
|
||||||
|
)
|
||||||
|
(
|
||||||
|
{ /*a*/
|
||||||
|
b
|
||||||
|
/*c*/
|
||||||
|
, /*d*/
|
||||||
|
e
|
||||||
|
, /*g*/
|
||||||
|
...
|
||||||
|
/*h*/
|
||||||
|
}:
|
||||||
|
_
|
||||||
|
)
|
||||||
|
(
|
||||||
|
{ /*a*/
|
||||||
|
b
|
||||||
|
/*c*/
|
||||||
|
, /*d*/
|
||||||
|
e
|
||||||
|
/*f*/
|
||||||
|
, ...
|
||||||
|
}:
|
||||||
|
_
|
||||||
|
)
|
||||||
|
(
|
||||||
|
{ /*a*/
|
||||||
|
b
|
||||||
|
/*c*/
|
||||||
|
, /*d*/
|
||||||
|
e
|
||||||
|
/*f*/
|
||||||
|
, ...
|
||||||
|
/*h*/
|
||||||
|
}:
|
||||||
|
_
|
||||||
|
)
|
||||||
|
(
|
||||||
|
{ /*a*/
|
||||||
|
b
|
||||||
|
/*c*/
|
||||||
|
, /*d*/
|
||||||
|
e
|
||||||
|
/*f*/
|
||||||
|
, /*g*/
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
_
|
||||||
|
)
|
||||||
|
(
|
||||||
|
{ /*a*/
|
||||||
|
b
|
||||||
|
/*c*/
|
||||||
|
, /*d*/
|
||||||
|
e
|
||||||
|
/*f*/
|
||||||
|
, /*g*/
|
||||||
|
...
|
||||||
|
/*h*/
|
||||||
|
}:
|
||||||
|
_
|
||||||
|
)
|
||||||
|
]
|
14
tests/cases/root/in
Normal file
14
tests/cases/root/in
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
# a
|
||||||
|
/* test
|
||||||
|
* test
|
||||||
|
*/
|
||||||
|
|
||||||
|
# a
|
||||||
|
|
||||||
|
"test"
|
||||||
|
|
||||||
|
# b
|
||||||
|
/* c */
|
||||||
|
|
||||||
|
/* c */
|
||||||
|
# c
|
10
tests/cases/root/out
Normal file
10
tests/cases/root/out
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
# a
|
||||||
|
/* test
|
||||||
|
* test
|
||||||
|
*/
|
||||||
|
# a
|
||||||
|
"test"
|
||||||
|
# b
|
||||||
|
/* c */
|
||||||
|
/* c */
|
||||||
|
# c
|
8
tests/cases/select/in
Normal file
8
tests/cases/select/in
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
[
|
||||||
|
(a . a)
|
||||||
|
(a ./**/a)
|
||||||
|
(a/**/. a)
|
||||||
|
(a/**/./**/a)
|
||||||
|
( a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a )
|
||||||
|
( a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a )
|
||||||
|
]
|
65
tests/cases/select/out
Normal file
65
tests/cases/select/out
Normal file
|
@ -0,0 +1,65 @@
|
||||||
|
[
|
||||||
|
( a.a )
|
||||||
|
(
|
||||||
|
a
|
||||||
|
.
|
||||||
|
/**/
|
||||||
|
a
|
||||||
|
)
|
||||||
|
(
|
||||||
|
a
|
||||||
|
/**/
|
||||||
|
.a
|
||||||
|
)
|
||||||
|
(
|
||||||
|
a
|
||||||
|
/**/
|
||||||
|
.
|
||||||
|
/**/
|
||||||
|
a
|
||||||
|
)
|
||||||
|
(
|
||||||
|
a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a
|
||||||
|
)
|
||||||
|
(
|
||||||
|
a
|
||||||
|
.a
|
||||||
|
.a
|
||||||
|
.a
|
||||||
|
.a
|
||||||
|
.a
|
||||||
|
.a
|
||||||
|
.a
|
||||||
|
.a
|
||||||
|
.a
|
||||||
|
.a
|
||||||
|
.a
|
||||||
|
.a
|
||||||
|
.a
|
||||||
|
.a
|
||||||
|
.a
|
||||||
|
.a
|
||||||
|
.a
|
||||||
|
.a
|
||||||
|
.a
|
||||||
|
.a
|
||||||
|
.a
|
||||||
|
.a
|
||||||
|
.a
|
||||||
|
.a
|
||||||
|
.a
|
||||||
|
.a
|
||||||
|
.a
|
||||||
|
.a
|
||||||
|
.a
|
||||||
|
.a
|
||||||
|
.a
|
||||||
|
.a
|
||||||
|
.a
|
||||||
|
.a
|
||||||
|
.a
|
||||||
|
.a
|
||||||
|
.a
|
||||||
|
.a
|
||||||
|
)
|
||||||
|
]
|
40
tests/cases/string/in
Normal file
40
tests/cases/string/in
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
[
|
||||||
|
""
|
||||||
|
|
||||||
|
"
|
||||||
|
"
|
||||||
|
|
||||||
|
"a
|
||||||
|
${x}
|
||||||
|
b
|
||||||
|
"
|
||||||
|
|
||||||
|
''''
|
||||||
|
|
||||||
|
|
||||||
|
''a''
|
||||||
|
|
||||||
|
''${""}''
|
||||||
|
|
||||||
|
''
|
||||||
|
a
|
||||||
|
${""}
|
||||||
|
b
|
||||||
|
${""}
|
||||||
|
c ${""} d
|
||||||
|
e
|
||||||
|
''
|
||||||
|
|
||||||
|
''
|
||||||
|
''
|
||||||
|
|
||||||
|
''
|
||||||
|
declare -a makefiles=(./*.mak)
|
||||||
|
sed -i -f ${makefile-sed} "''${makefiles[@]}"
|
||||||
|
# assign Makefile variables eagerly & change backticks to `$(shell …)`
|
||||||
|
sed -i -e 's/ = `\([^`]\+\)`/ := $(shell \1)/' \
|
||||||
|
-e 's/`\([^`]\+\)`/$(shell \1)/' \
|
||||||
|
"''${makefiles[@]}"
|
||||||
|
''
|
||||||
|
|
||||||
|
]
|
30
tests/cases/string/out
Normal file
30
tests/cases/string/out
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
[
|
||||||
|
""
|
||||||
|
"
|
||||||
|
"
|
||||||
|
"a
|
||||||
|
${ x }
|
||||||
|
b
|
||||||
|
"
|
||||||
|
''''
|
||||||
|
''a''
|
||||||
|
''${ "" }''
|
||||||
|
''
|
||||||
|
a
|
||||||
|
${ "" }
|
||||||
|
b
|
||||||
|
${ "" }
|
||||||
|
c ${ "" } d
|
||||||
|
e
|
||||||
|
''
|
||||||
|
''
|
||||||
|
''
|
||||||
|
''
|
||||||
|
declare -a makefiles=(./*.mak)
|
||||||
|
sed -i -f ${ makefile-sed } "''${makefiles[@]}"
|
||||||
|
# assign Makefile variables eagerly & change backticks to `$(shell …)`
|
||||||
|
sed -i -e 's/ = `\([^`]\+\)`/ := $(shell \1)/' \
|
||||||
|
-e 's/`\([^`]\+\)`/$(shell \1)/' \
|
||||||
|
"''${makefiles[@]}"
|
||||||
|
''
|
||||||
|
]
|
1
tests/cases/string_interpol/in
Normal file
1
tests/cases/string_interpol/in
Normal file
|
@ -0,0 +1 @@
|
||||||
|
"${/*a*/"${/*b*/"${c}"}"/*d*/}"
|
8
tests/cases/string_interpol/out
Normal file
8
tests/cases/string_interpol/out
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
"${
|
||||||
|
/*a*/
|
||||||
|
"${
|
||||||
|
/*b*/
|
||||||
|
"${ c }"
|
||||||
|
}"
|
||||||
|
/*d*/
|
||||||
|
}"
|
8
tests/cases/with/in
Normal file
8
tests/cases/with/in
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
[
|
||||||
|
(with b; c)
|
||||||
|
(with b; /*b*/ c)
|
||||||
|
(with /*a*/ b; c)
|
||||||
|
(with /*a*/ b; /*b*/ c)
|
||||||
|
( with b; cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc )
|
||||||
|
( with b; cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc )
|
||||||
|
]
|
28
tests/cases/with/out
Normal file
28
tests/cases/with/out
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
[
|
||||||
|
( with b; c )
|
||||||
|
(
|
||||||
|
with b;
|
||||||
|
/*b*/
|
||||||
|
c
|
||||||
|
)
|
||||||
|
(
|
||||||
|
with
|
||||||
|
/*a*/
|
||||||
|
b;
|
||||||
|
c
|
||||||
|
)
|
||||||
|
(
|
||||||
|
with
|
||||||
|
/*a*/
|
||||||
|
b;
|
||||||
|
/*b*/
|
||||||
|
c
|
||||||
|
)
|
||||||
|
(
|
||||||
|
with b; cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
|
||||||
|
)
|
||||||
|
(
|
||||||
|
with b;
|
||||||
|
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
|
||||||
|
)
|
||||||
|
]
|
52
tests/fmt.rs
Normal file
52
tests/fmt.rs
Normal file
|
@ -0,0 +1,52 @@
|
||||||
|
use std::io::Write;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn cases() {
|
||||||
|
let should_update = std::env::var("UPDATE").is_ok();
|
||||||
|
|
||||||
|
let config = alejandra::config::Config::new();
|
||||||
|
|
||||||
|
let cases: std::collections::HashSet<String> =
|
||||||
|
std::fs::read_dir("tests/cases")
|
||||||
|
.unwrap()
|
||||||
|
.map(|entry| entry.unwrap().file_name().into_string().unwrap())
|
||||||
|
.collect();
|
||||||
|
|
||||||
|
for case in cases {
|
||||||
|
let path_in = format!("tests/cases/{}/in", case);
|
||||||
|
let path_out = format!("tests/cases/{}/out", case);
|
||||||
|
let content_in = std::fs::read_to_string(path_in.clone()).unwrap();
|
||||||
|
let content_got =
|
||||||
|
alejandra::format::string(&config, &path_in, content_in.clone());
|
||||||
|
|
||||||
|
if should_update {
|
||||||
|
std::fs::File::create(&path_out)
|
||||||
|
.unwrap()
|
||||||
|
.write_all(content_got.as_bytes())
|
||||||
|
.unwrap();
|
||||||
|
}
|
||||||
|
|
||||||
|
let content_out = std::fs::read_to_string(path_out.clone()).unwrap();
|
||||||
|
|
||||||
|
assert!(
|
||||||
|
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