mirror of
https://github.com/roc-lang/roc.git
synced 2025-10-03 08:34:33 +00:00
Go deeper on UnqualifiedIdent
This commit is contained in:
parent
533d68691f
commit
db6f80f358
4 changed files with 32 additions and 10 deletions
|
@ -134,6 +134,8 @@ pub fn canonicalize_expr(
|
||||||
// let mut branch_cons = Vec::with_capacity(branches.len());
|
// let mut branch_cons = Vec::with_capacity(branches.len());
|
||||||
let mut field_map = SendMap::default();
|
let mut field_map = SendMap::default();
|
||||||
let mut output = Output::default();
|
let mut output = Output::default();
|
||||||
|
let record_var = panic!("TODO record_var");
|
||||||
|
let constraint = panic!("TODO constraint");
|
||||||
|
|
||||||
for loc_field in fields.iter() {
|
for loc_field in fields.iter() {
|
||||||
let (label, field_expr, field_out, field_con) = canonicalize_field(
|
let (label, field_expr, field_out, field_con) = canonicalize_field(
|
||||||
|
@ -146,7 +148,7 @@ pub fn canonicalize_expr(
|
||||||
loc_field.region,
|
loc_field.region,
|
||||||
);
|
);
|
||||||
|
|
||||||
output.references = output.references.union(field_out);
|
output.references = output.references.union(field_out.references);
|
||||||
}
|
}
|
||||||
|
|
||||||
(Record(record_var, field_map), output, constraint)
|
(Record(record_var, field_map), output, constraint)
|
||||||
|
@ -1101,7 +1103,7 @@ fn canonicalize_field<'a>(
|
||||||
env: &mut Env,
|
env: &mut Env,
|
||||||
var_store: &VarStore,
|
var_store: &VarStore,
|
||||||
scope: &mut Scope,
|
scope: &mut Scope,
|
||||||
field_map: SendMap<Lowercase, Expr>,
|
field_map: SendMap<Lowercase, Located<Expr>>,
|
||||||
field: &'a ast::AssignedField<'a, ast::Expr<'a>>,
|
field: &'a ast::AssignedField<'a, ast::Expr<'a>>,
|
||||||
region: Region,
|
region: Region,
|
||||||
) -> (Lowercase, Located<Expr>, Output, Constraint) {
|
) -> (Lowercase, Located<Expr>, Output, Constraint) {
|
||||||
|
@ -1110,6 +1112,8 @@ fn canonicalize_field<'a>(
|
||||||
match field {
|
match field {
|
||||||
// Both a label and a value, e.g. `{ name: "blah" }`
|
// Both a label and a value, e.g. `{ name: "blah" }`
|
||||||
LabeledValue(label, _, loc_expr) => {
|
LabeledValue(label, _, loc_expr) => {
|
||||||
|
let expected = panic!("TODO expected");
|
||||||
|
let label = panic!("TODO label");
|
||||||
let (loc_can_expr, output, constraint) = canonicalize_expr(
|
let (loc_can_expr, output, constraint) = canonicalize_expr(
|
||||||
rigids,
|
rigids,
|
||||||
env,
|
env,
|
||||||
|
|
|
@ -227,7 +227,7 @@ pub fn fmt_field<'a>(
|
||||||
newline(buf, indent);
|
newline(buf, indent);
|
||||||
}
|
}
|
||||||
|
|
||||||
buf.push_str(name.value);
|
buf.push_str(name.value.into());
|
||||||
|
|
||||||
if !spaces.is_empty() {
|
if !spaces.is_empty() {
|
||||||
fmt_spaces(buf, spaces.iter(), indent);
|
fmt_spaces(buf, spaces.iter(), indent);
|
||||||
|
@ -242,7 +242,7 @@ pub fn fmt_field<'a>(
|
||||||
newline(buf, indent);
|
newline(buf, indent);
|
||||||
}
|
}
|
||||||
|
|
||||||
buf.push_str(name.value);
|
buf.push_str(name.value.into());
|
||||||
}
|
}
|
||||||
AssignedField::SpaceBefore(sub_expr, spaces) => {
|
AssignedField::SpaceBefore(sub_expr, spaces) => {
|
||||||
fmt_comments_only(buf, spaces.iter(), indent);
|
fmt_comments_only(buf, spaces.iter(), indent);
|
||||||
|
|
|
@ -346,15 +346,15 @@ pub fn assigned_field_to_pattern<'a>(
|
||||||
value: pattern,
|
value: pattern,
|
||||||
});
|
});
|
||||||
if spaces.is_empty() {
|
if spaces.is_empty() {
|
||||||
Pattern::RecordField(name.value, result)
|
Pattern::RecordField(name.value.into(), result)
|
||||||
} else {
|
} else {
|
||||||
Pattern::SpaceAfter(
|
Pattern::SpaceAfter(
|
||||||
arena.alloc(Pattern::RecordField(name.value, result)),
|
arena.alloc(Pattern::RecordField(name.value.into(), result)),
|
||||||
spaces,
|
spaces,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
AssignedField::LabelOnly(name) => Pattern::Identifier(name.value),
|
AssignedField::LabelOnly(name) => Pattern::Identifier(name.value.into()),
|
||||||
AssignedField::SpaceBefore(nested, spaces) => Pattern::SpaceBefore(
|
AssignedField::SpaceBefore(nested, spaces) => Pattern::SpaceBefore(
|
||||||
arena.alloc(assigned_field_to_pattern(arena, nested)?),
|
arena.alloc(assigned_field_to_pattern(arena, nested)?),
|
||||||
spaces,
|
spaces,
|
||||||
|
|
|
@ -827,9 +827,11 @@ macro_rules! record_field {
|
||||||
'a,
|
'a,
|
||||||
$crate::parse::ast::AssignedField<'a, _>,
|
$crate::parse::ast::AssignedField<'a, _>,
|
||||||
> {
|
> {
|
||||||
|
use $crate::ident::UnqualifiedIdent;
|
||||||
use $crate::parse::ast::AssignedField::*;
|
use $crate::parse::ast::AssignedField::*;
|
||||||
use $crate::parse::blankspace::{space0, space0_before};
|
use $crate::parse::blankspace::{space0, space0_before};
|
||||||
use $crate::parse::ident::lowercase_ident;
|
use $crate::parse::ident::lowercase_ident;
|
||||||
|
use $crate::region::Located;
|
||||||
|
|
||||||
// You must have a field name, e.g. "email"
|
// You must have a field name, e.g. "email"
|
||||||
let (loc_label, state) = loc!(lowercase_ident()).parse(arena, state)?;
|
let (loc_label, state) = loc!(lowercase_ident()).parse(arena, state)?;
|
||||||
|
@ -843,14 +845,30 @@ macro_rules! record_field {
|
||||||
.parse(arena, state)?;
|
.parse(arena, state)?;
|
||||||
|
|
||||||
let answer = match opt_loc_val {
|
let answer = match opt_loc_val {
|
||||||
Some(loc_val) => LabeledValue(loc_label, spaces, arena.alloc(loc_val)),
|
Some(loc_val) => LabeledValue(
|
||||||
|
Located {
|
||||||
|
value: UnqualifiedIdent::new(loc_label.value),
|
||||||
|
region: loc_label.region,
|
||||||
|
},
|
||||||
|
spaces,
|
||||||
|
arena.alloc(loc_val),
|
||||||
|
),
|
||||||
// If no value was provided, record it as a Var.
|
// If no value was provided, record it as a Var.
|
||||||
// Canonicalize will know what to do with a Var later.
|
// Canonicalize will know what to do with a Var later.
|
||||||
None => {
|
None => {
|
||||||
if !spaces.is_empty() {
|
if !spaces.is_empty() {
|
||||||
SpaceAfter(arena.alloc(LabelOnly(loc_label)), spaces)
|
SpaceAfter(
|
||||||
|
arena.alloc(LabelOnly(Located {
|
||||||
|
value: UnqualifiedIdent::new(loc_label.value),
|
||||||
|
region: loc_label.region,
|
||||||
|
})),
|
||||||
|
spaces,
|
||||||
|
)
|
||||||
} else {
|
} else {
|
||||||
LabelOnly(loc_label)
|
LabelOnly(Located {
|
||||||
|
value: UnqualifiedIdent::new(loc_label.value),
|
||||||
|
region: loc_label.region,
|
||||||
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue