mirror of
https://github.com/roc-lang/roc.git
synced 2025-08-03 19:58:18 +00:00
Format ingested file with optional annotation
This commit is contained in:
parent
fe2eb0f0a5
commit
22716cea45
7 changed files with 135 additions and 24 deletions
|
@ -6,8 +6,8 @@ use crate::spaces::{fmt_default_newline, fmt_default_spaces, fmt_spaces, INDENT}
|
|||
use crate::Buf;
|
||||
use roc_parse::ast::{
|
||||
AbilityMember, Defs, Expr, ExtractSpaces, ImportAlias, ImportAsKeyword, ImportExposingKeyword,
|
||||
ImportedModuleName, IngestedFileImport, ModuleImport, Pattern, Spaces, StrLiteral,
|
||||
TypeAnnotation, TypeDef, TypeHeader, ValueDef,
|
||||
ImportedModuleName, IngestedFileAnnotation, IngestedFileImport, ModuleImport, Pattern, Spaces,
|
||||
StrLiteral, TypeAnnotation, TypeDef, TypeHeader, ValueDef,
|
||||
};
|
||||
use roc_parse::header::Keyword;
|
||||
use roc_region::all::Loc;
|
||||
|
@ -257,8 +257,9 @@ impl<'a> Formattable for IngestedFileImport<'a> {
|
|||
before_path,
|
||||
path: _,
|
||||
name,
|
||||
annotation,
|
||||
} = self;
|
||||
!before_path.is_empty() || name.is_multiline()
|
||||
!before_path.is_empty() || name.keyword.is_multiline() || annotation.is_multiline()
|
||||
}
|
||||
|
||||
fn format_with_options(
|
||||
|
@ -272,6 +273,7 @@ impl<'a> Formattable for IngestedFileImport<'a> {
|
|||
before_path,
|
||||
path,
|
||||
name,
|
||||
annotation,
|
||||
} = self;
|
||||
|
||||
buf.indent(indent);
|
||||
|
@ -281,7 +283,11 @@ impl<'a> Formattable for IngestedFileImport<'a> {
|
|||
|
||||
fmt_default_spaces(buf, before_path, indent);
|
||||
fmt_str_literal(buf, path.value, indent);
|
||||
name.format(buf, indent);
|
||||
|
||||
name.keyword.format(buf, indent);
|
||||
buf.push_str(&name.item.value);
|
||||
|
||||
annotation.format(buf, indent);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -361,6 +367,34 @@ impl Formattable for ImportExposingKeyword {
|
|||
}
|
||||
}
|
||||
|
||||
impl<'a> Formattable for IngestedFileAnnotation<'a> {
|
||||
fn is_multiline(&self) -> bool {
|
||||
let Self {
|
||||
before_colon,
|
||||
annotation,
|
||||
} = self;
|
||||
!before_colon.is_empty() || annotation.is_multiline()
|
||||
}
|
||||
|
||||
fn format_with_options(
|
||||
&self,
|
||||
buf: &mut Buf,
|
||||
_parens: Parens,
|
||||
_newlines: Newlines,
|
||||
indent: u16,
|
||||
) {
|
||||
let Self {
|
||||
before_colon,
|
||||
annotation,
|
||||
} = self;
|
||||
|
||||
fmt_default_spaces(buf, before_colon, indent);
|
||||
buf.push_str(":");
|
||||
buf.spaces(1);
|
||||
annotation.format(buf, indent);
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a> Formattable for ValueDef<'a> {
|
||||
fn is_multiline(&self) -> bool {
|
||||
use roc_parse::ast::ValueDef::*;
|
||||
|
|
|
@ -5,9 +5,10 @@ use roc_parse::{
|
|||
ast::{
|
||||
AbilityImpls, AbilityMember, AssignedField, Collection, CommentOrNewline, Defs, Expr,
|
||||
Header, Implements, ImplementsAbilities, ImplementsAbility, ImplementsClause, ImportAlias,
|
||||
ImportAsKeyword, ImportExposingKeyword, ImportedModuleName, IngestedFileImport, Module,
|
||||
ModuleImport, Pattern, PatternAs, RecordBuilderField, Spaced, Spaces, StrLiteral,
|
||||
StrSegment, Tag, TypeAnnotation, TypeDef, TypeHeader, ValueDef, WhenBranch,
|
||||
ImportAsKeyword, ImportExposingKeyword, ImportedModuleName, IngestedFileAnnotation,
|
||||
IngestedFileImport, Module, ModuleImport, Pattern, PatternAs, RecordBuilderField, Spaced,
|
||||
Spaces, StrLiteral, StrSegment, Tag, TypeAnnotation, TypeDef, TypeHeader, ValueDef,
|
||||
WhenBranch,
|
||||
},
|
||||
header::{
|
||||
AppHeader, ExposedName, HostedHeader, ImportsEntry, KeywordItem, ModuleHeader, ModuleName,
|
||||
|
@ -600,6 +601,7 @@ impl<'a> RemoveSpaces<'a> for IngestedFileImport<'a> {
|
|||
before_path: &[],
|
||||
path: self.path.remove_spaces(arena),
|
||||
name: self.name.remove_spaces(arena),
|
||||
annotation: self.annotation.remove_spaces(arena),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -631,6 +633,15 @@ impl<'a> RemoveSpaces<'a> for ImportExposingKeyword {
|
|||
}
|
||||
}
|
||||
|
||||
impl<'a> RemoveSpaces<'a> for IngestedFileAnnotation<'a> {
|
||||
fn remove_spaces(&self, arena: &'a Bump) -> Self {
|
||||
IngestedFileAnnotation {
|
||||
before_colon: &[],
|
||||
annotation: self.annotation.remove_spaces(arena),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a> RemoveSpaces<'a> for Implements<'a> {
|
||||
fn remove_spaces(&self, _arena: &'a Bump) -> Self {
|
||||
Implements::Implements
|
||||
|
|
|
@ -32,16 +32,18 @@ Defs {
|
|||
item: ImportAsKeyword,
|
||||
after: [],
|
||||
},
|
||||
item: @29-39 TypedIdent {
|
||||
ident: @29-33 "file",
|
||||
spaces_before_colon: [],
|
||||
ann: @36-39 Apply(
|
||||
item: @29-33 "file",
|
||||
},
|
||||
annotation: Some(
|
||||
IngestedFileAnnotation {
|
||||
before_colon: [],
|
||||
annotation: @36-39 Apply(
|
||||
"",
|
||||
"Str",
|
||||
[],
|
||||
),
|
||||
},
|
||||
},
|
||||
),
|
||||
},
|
||||
),
|
||||
IngestedFileImport(
|
||||
|
@ -56,10 +58,12 @@ Defs {
|
|||
item: ImportAsKeyword,
|
||||
after: [],
|
||||
},
|
||||
item: @70-85 TypedIdent {
|
||||
ident: @70-74 "file",
|
||||
spaces_before_colon: [],
|
||||
ann: @78-85 Apply(
|
||||
item: @70-74 "file",
|
||||
},
|
||||
annotation: Some(
|
||||
IngestedFileAnnotation {
|
||||
before_colon: [],
|
||||
annotation: @78-85 Apply(
|
||||
"",
|
||||
"List",
|
||||
[
|
||||
|
@ -71,7 +75,7 @@ Defs {
|
|||
],
|
||||
),
|
||||
},
|
||||
},
|
||||
),
|
||||
},
|
||||
),
|
||||
],
|
||||
|
|
|
@ -27,16 +27,18 @@ Defs(
|
|||
item: ImportAsKeyword,
|
||||
after: [],
|
||||
},
|
||||
item: @23-33 TypedIdent {
|
||||
ident: @23-27 "data",
|
||||
spaces_before_colon: [],
|
||||
ann: @30-33 Apply(
|
||||
item: @23-27 "data",
|
||||
},
|
||||
annotation: Some(
|
||||
IngestedFileAnnotation {
|
||||
before_colon: [],
|
||||
annotation: @30-33 Apply(
|
||||
"",
|
||||
"Str",
|
||||
[],
|
||||
),
|
||||
},
|
||||
},
|
||||
),
|
||||
},
|
||||
),
|
||||
],
|
||||
|
|
|
@ -0,0 +1,56 @@
|
|||
Defs(
|
||||
Defs {
|
||||
tags: [
|
||||
Index(2147483648),
|
||||
],
|
||||
regions: [
|
||||
@0-27,
|
||||
],
|
||||
space_before: [
|
||||
Slice(start = 0, length = 0),
|
||||
],
|
||||
space_after: [
|
||||
Slice(start = 0, length = 0),
|
||||
],
|
||||
spaces: [],
|
||||
type_defs: [],
|
||||
value_defs: [
|
||||
IngestedFileImport(
|
||||
IngestedFileImport {
|
||||
before_path: [],
|
||||
path: @7-19 PlainLine(
|
||||
"users.json",
|
||||
),
|
||||
name: KeywordItem {
|
||||
keyword: Spaces {
|
||||
before: [],
|
||||
item: ImportAsKeyword,
|
||||
after: [],
|
||||
},
|
||||
item: @23-27 "data",
|
||||
},
|
||||
annotation: None,
|
||||
},
|
||||
),
|
||||
],
|
||||
},
|
||||
@29-43 SpaceBefore(
|
||||
Apply(
|
||||
@29-38 Var {
|
||||
module_name: "",
|
||||
ident: "parseJson",
|
||||
},
|
||||
[
|
||||
@39-43 Var {
|
||||
module_name: "",
|
||||
ident: "data",
|
||||
},
|
||||
],
|
||||
Space,
|
||||
),
|
||||
[
|
||||
Newline,
|
||||
Newline,
|
||||
],
|
||||
),
|
||||
)
|
|
@ -0,0 +1,3 @@
|
|||
import "users.json" as data
|
||||
|
||||
parseJson data
|
|
@ -302,9 +302,9 @@ mod test_snapshots {
|
|||
pass/destructure_tag_assignment.expr,
|
||||
pass/docs.expr,
|
||||
pass/empty_app_header.header,
|
||||
pass/empty_module_header.header,
|
||||
pass/empty_hosted_header.header,
|
||||
pass/empty_list.expr,
|
||||
pass/empty_module_header.header,
|
||||
pass/empty_package_header.header,
|
||||
pass/empty_platform_header.header,
|
||||
pass/empty_record.expr,
|
||||
|
@ -333,6 +333,7 @@ mod test_snapshots {
|
|||
pass/ingested_file.moduledefs,
|
||||
pass/inline_import.expr,
|
||||
pass/inline_ingested_file.expr,
|
||||
pass/inline_ingested_file_no_ann.expr,
|
||||
pass/int_with_underscore.expr,
|
||||
pass/lambda_in_chain.expr,
|
||||
pass/lambda_indent.expr,
|
||||
|
@ -390,6 +391,7 @@ mod test_snapshots {
|
|||
pass/not_multiline_string.expr,
|
||||
pass/number_literal_suffixes.expr,
|
||||
pass/old_app_header.full,
|
||||
pass/old_interface_header.header,
|
||||
pass/one_backpassing.expr,
|
||||
pass/one_char_string.expr,
|
||||
pass/one_def.expr,
|
||||
|
@ -410,7 +412,6 @@ mod test_snapshots {
|
|||
pass/outdented_colon_in_record.expr,
|
||||
pass/outdented_list.expr,
|
||||
pass/outdented_record.expr,
|
||||
pass/old_interface_header.header,
|
||||
pass/packed_singleton_list.expr,
|
||||
pass/parens_in_type_def_apply.expr,
|
||||
pass/parens_in_value_def_annotation.expr,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue