From 523b8f2963532da4c7f1fc7e9aba288848889fbf Mon Sep 17 00:00:00 2001 From: felipegchi Date: Thu, 24 Nov 2022 09:40:45 -0300 Subject: [PATCH] fix: erasure --- crates/kind-derive/src/matching.rs | 12 ++++++------ crates/kind-derive/src/open.rs | 2 +- crates/kind-driver/src/resolution.rs | 2 +- crates/kind-driver/src/session.rs | 1 + crates/kind-parser/src/top_level/mod.rs | 24 ++++++------------------ crates/kind-pass/src/desugar/app.rs | 4 ++-- crates/kind-pass/src/desugar/destruct.rs | 2 +- crates/kind-pass/src/desugar/expr.rs | 2 +- crates/kind-pass/src/desugar/mod.rs | 6 +++--- crates/kind-pass/src/erasure/mod.rs | 11 +---------- crates/kind-pass/src/expand/uses.rs | 10 +++++----- crates/kind-pass/src/unbound/mod.rs | 12 ++++++------ crates/kind-tree/src/symbol.rs | 15 +++++++++++++-- 13 files changed, 47 insertions(+), 56 deletions(-) diff --git a/crates/kind-derive/src/matching.rs b/crates/kind-derive/src/matching.rs index 32033b23..69de0b3b 100644 --- a/crates/kind-derive/src/matching.rs +++ b/crates/kind-derive/src/matching.rs @@ -191,7 +191,7 @@ pub fn derive_match( types.push(Argument { hidden: false, erased: false, - name: Ident::new_static(&format!("{}_", cons.name.to_string()), range), + name: Ident::new_static(&format!("_{}", cons.name.to_string()), range), typ: Some(cons_type), range, }); @@ -239,11 +239,11 @@ pub fn derive_match( spine_params = sum .parameters .extend(&cons.args) - .map(|x| x.name.with_name(|f| format!("{}_", f))) + .map(|x| x.name.with_name(|f| format!("_{}", f))) .to_vec(); spine = cons .args - .map(|x| x.name.with_name(|f| format!("{}_", f))) + .map(|x| x.name.with_name(|f| format!("_{}", f))) .to_vec(); args_indices = args .iter() @@ -261,7 +261,7 @@ pub fn derive_match( let renames = FxHashMap::from_iter( sum.parameters .extend(&cons.args) - .map(|x| (x.name.to_string(), format!("{}_", x.name.to_string()))) + .map(|x| (x.name.to_string(), format!("_{}", x.name.to_string()))) .iter() .cloned(), ); @@ -280,12 +280,12 @@ pub fn derive_match( .parameters .extend(&sum.indices) .extend(&cons.args) - .map(|x| x.name.with_name(|f| format!("{}_", f))) + .map(|x| x.name.with_name(|f| format!("_{}", f))) .to_vec(); spine = sum .indices .extend(&cons.args) - .map(|x| x.name.with_name(|f| format!("{}_", f))) + .map(|x| x.name.with_name(|f| format!("_{}", f))) .to_vec(); args_indices = sum .indices diff --git a/crates/kind-derive/src/open.rs b/crates/kind-derive/src/open.rs index 55d8903a..5c808a40 100644 --- a/crates/kind-derive/src/open.rs +++ b/crates/kind-derive/src/open.rs @@ -106,7 +106,7 @@ pub fn derive_open(range: Range, rec: &RecordDecl) -> concrete::Entry { let spine: Vec = rec .fields .iter() - .map(|(name, _, _)| name.with_name(|f| format!("{}_", f))) + .map(|(name, _, _)| name.with_name(|f| format!("_{}", f))) .collect(); pats.push(Box::new(Pat { diff --git a/crates/kind-driver/src/resolution.rs b/crates/kind-driver/src/resolution.rs index 2f047a51..689f5c97 100644 --- a/crates/kind-driver/src/resolution.rs +++ b/crates/kind-driver/src/resolution.rs @@ -59,7 +59,7 @@ fn ident_to_path( ident: &QualifiedIdent, search_on_parent: bool, ) -> Result, Box> { - let name = ident.root.to_string(); + let name = ident.to_string(); let segments = name.as_str().split('.').collect::>(); let mut raw_path = root.to_path_buf(); raw_path.push(PathBuf::from(segments.join("/"))); diff --git a/crates/kind-driver/src/session.rs b/crates/kind-driver/src/session.rs index e0333da9..49c3555e 100644 --- a/crates/kind-driver/src/session.rs +++ b/crates/kind-driver/src/session.rs @@ -13,6 +13,7 @@ use kind_report::data::Diagnostic; pub struct Session { pub loaded_paths: Vec>, pub loaded_sources: Vec, + pub loaded_paths_map: FxHashMap, /// It will be useful in the future diff --git a/crates/kind-parser/src/top_level/mod.rs b/crates/kind-parser/src/top_level/mod.rs index 0bec3ace..507f2c7a 100644 --- a/crates/kind-parser/src/top_level/mod.rs +++ b/crates/kind-parser/src/top_level/mod.rs @@ -262,24 +262,12 @@ impl<'a> Parser<'a> { self.eat_id("as")?; let alias = self.parse_upper_id()?; - match (origin, alias) { - ( - QualifiedIdent { - aux: Some(_), - range, - .. - }, - _, - ) - | ( - _, - QualifiedIdent { - aux: Some(_), - range, - .. - }, - ) => Err(SyntaxDiagnostic::ImportsCannotHaveAlias(range)), - (origin, alias) => Ok((origin.to_string(), alias.to_string())), + if origin.get_aux().is_some() { + Err(SyntaxDiagnostic::ImportsCannotHaveAlias(origin.range)) + } else if alias.get_aux().is_some() { + Err(SyntaxDiagnostic::ImportsCannotHaveAlias(alias.range)) + } else { + Ok((origin.to_string(), alias.to_string())) } } diff --git a/crates/kind-pass/src/desugar/app.rs b/crates/kind-pass/src/desugar/app.rs index 91bbc6a5..130b8695 100644 --- a/crates/kind-pass/src/desugar/app.rs +++ b/crates/kind-pass/src/desugar/app.rs @@ -31,7 +31,7 @@ impl<'a> DesugarState<'a> { if create_var { arguments.push(desugared::Expr::var(self.gen_name(arg.range))) } else { - arguments.push(self.gen_hole_expr()) + arguments.push(self.gen_hole_expr(arg.range)) } } else { arguments.push(spine_iter.next().unwrap().to_owned()) @@ -93,7 +93,7 @@ impl<'a> DesugarState<'a> { if entry.arguments[i].hidden { // It's not expected that positional arguments require the range so // it's the reason why we are using a terrible "ghost range" - arguments[i] = Some((Range::ghost_range(), self.gen_hole_expr())) + arguments[i] = Some((Range::ghost_range(), self.gen_hole_expr(Range::ghost_range()))) } } } else if entry.arguments.len() != args.len() { diff --git a/crates/kind-pass/src/desugar/destruct.rs b/crates/kind-pass/src/desugar/destruct.rs index c123c9f9..bb7eafeb 100644 --- a/crates/kind-pass/src/desugar/destruct.rs +++ b/crates/kind-pass/src/desugar/destruct.rs @@ -249,7 +249,7 @@ impl<'a> DesugarState<'a> { } else { let mut idx: Vec = sum.indices.iter().map(|x| x.name.clone()).collect(); idx.push(Ident::generate("_val")); - idx.iter().rfold(self.gen_hole_expr(), |expr, l| { + idx.iter().rfold(self.gen_hole_expr(match_.typ.range), |expr, l| { desugared::Expr::lambda(l.range, l.clone(), expr, false) }) }; diff --git a/crates/kind-pass/src/desugar/expr.rs b/crates/kind-pass/src/desugar/expr.rs index 3676d4ca..823d11ed 100644 --- a/crates/kind-pass/src/desugar/expr.rs +++ b/crates/kind-pass/src/desugar/expr.rs @@ -280,7 +280,7 @@ impl<'a> DesugarState<'a> { typ.range, self.gen_name(expr.range), self.desugar_expr(typ), - self.gen_hole_expr(), + self.gen_hole_expr(typ.range), *erased, ), ), diff --git a/crates/kind-pass/src/desugar/mod.rs b/crates/kind-pass/src/desugar/mod.rs index 0a005068..10f802d5 100644 --- a/crates/kind-pass/src/desugar/mod.rs +++ b/crates/kind-pass/src/desugar/mod.rs @@ -61,13 +61,13 @@ impl<'a> DesugarState<'a> { fn gen_name(&mut self, range: Range) -> Ident { self.name_count += 1; - Ident::new(format!("x{}_", self.name_count), range) + Ident::new(format!("_x{}", self.name_count), range) } - fn gen_hole_expr(&mut self) -> Box { + fn gen_hole_expr(&mut self, range: Range) -> Box { Box::new(desugared::Expr { data: desugared::ExprKind::Hole(self.gen_hole()), - span: Span::Generated, + span: Span::Locatable(range), }) } diff --git a/crates/kind-pass/src/erasure/mod.rs b/crates/kind-pass/src/erasure/mod.rs index 8805be14..00dfac48 100644 --- a/crates/kind-pass/src/erasure/mod.rs +++ b/crates/kind-pass/src/erasure/mod.rs @@ -265,22 +265,13 @@ impl<'a> ErasureState<'a> { match &expr.data { Num(_) | Str(_) => Box::new(expr.clone()), - Typ | NumType(_) | Err => { + Typ | NumType(_) | Err | Hole(_) | Hlp(_) => { let span = expr.span.to_range().unwrap(); if !self.unify(span, *on, (None, Relevance::Irrelevant), false) { self.err_irrelevant(None, span, None) } Box::new(expr.clone()) } - Hole(_) | Hlp(_) => match &expr.span { - kind_span::Span::Generated => Box::new(expr.clone()), - kind_span::Span::Locatable(span) => { - if !self.unify(*span, *on, (None, Relevance::Irrelevant), false) { - self.err_irrelevant(None, *span, None) - } - Box::new(expr.clone()) - } - }, Var(name) => { let relev = self.ctx.get(name.to_str()).unwrap(); let declared_ty = (relev.1).0; diff --git a/crates/kind-pass/src/expand/uses.rs b/crates/kind-pass/src/expand/uses.rs index a3f1ee51..ab90e372 100644 --- a/crates/kind-pass/src/expand/uses.rs +++ b/crates/kind-pass/src/expand/uses.rs @@ -16,15 +16,15 @@ pub struct Expand { impl Visitor for Expand { fn visit_qualified_ident(&mut self, ident: &mut kind_tree::symbol::QualifiedIdent) { - if ident.aux.is_none() { + if ident.get_aux().is_none() { return; } - let alias = match self.names.get(&ident.root.to_string()) { + let alias = match self.names.get(&ident.get_root().to_string()) { Some(path) => path, None => { self.errors .send(Box::new(PassError::CannotFindAlias( - ident.root.to_string(), + ident.get_root().to_string(), ident.range, ))) .unwrap(); @@ -32,10 +32,10 @@ impl Visitor for Expand { return; } }; - match &ident.aux { + match &ident.get_aux() { Some(post) => { ident.change_root(format!("{}.{}", alias, post)); - ident.aux = None; + ident.reset_aux() } None => ident.change_root(alias.clone()), } diff --git a/crates/kind-pass/src/unbound/mod.rs b/crates/kind-pass/src/unbound/mod.rs index 95f3c0e2..e38dc6b4 100644 --- a/crates/kind-pass/src/unbound/mod.rs +++ b/crates/kind-pass/src/unbound/mod.rs @@ -94,12 +94,12 @@ impl UnboundCollector { fn visit_top_level_names(&mut self, toplevel: &mut TopLevel) { match toplevel { TopLevel::SumType(sum) => { - debug_assert!(sum.name.aux.is_none()); + debug_assert!(sum.name.get_aux().is_none()); self.top_level_defs .insert(sum.name.get_root(), sum.name.range); for cons in &sum.constructors { let name_cons = sum.name.add_segment(cons.name.to_str()); - debug_assert!(name_cons.aux.is_none()); + debug_assert!(name_cons.get_aux().is_none()); self.top_level_defs .insert(name_cons.get_root(), name_cons.range); } @@ -107,8 +107,8 @@ impl UnboundCollector { TopLevel::RecordType(rec) => { let name_cons = rec.name.add_segment(rec.constructor.to_str()); - debug_assert!(rec.name.aux.is_none()); - debug_assert!(name_cons.aux.is_none()); + debug_assert!(rec.name.get_aux().is_none()); + debug_assert!(name_cons.get_aux().is_none()); self.top_level_defs .insert(rec.name.get_root(), rec.name.range); @@ -117,7 +117,7 @@ impl UnboundCollector { } TopLevel::Entry(entry) => { - debug_assert!(entry.name.aux.is_none()); + debug_assert!(entry.name.get_aux().is_none()); self.top_level_defs .insert(entry.name.get_root(), entry.name.range); } @@ -140,7 +140,7 @@ impl Visitor for UnboundCollector { } fn visit_qualified_ident(&mut self, ident: &mut QualifiedIdent) { - debug_assert!(ident.aux.is_none()); + debug_assert!(ident.get_aux().is_none()); if !self.top_level_defs.contains_key(&ident.get_root()) { let entry = self.unbound_top_level.entry(ident.get_root()).or_default(); entry.insert(ident.clone()); diff --git a/crates/kind-tree/src/symbol.rs b/crates/kind-tree/src/symbol.rs index 81a80137..886121db 100644 --- a/crates/kind-tree/src/symbol.rs +++ b/crates/kind-tree/src/symbol.rs @@ -49,8 +49,9 @@ pub struct Ident { /// constructions. #[derive(Clone, Debug, Hash, PartialEq, Eq)] pub struct QualifiedIdent { - pub root: Symbol, - pub aux: Option, + root: Symbol, + aux: Option, + pub range: Range, /// Flag that is useful to avoid unbound errors while @@ -82,6 +83,16 @@ impl QualifiedIdent { self.root.data.clone() } + #[inline] + pub fn get_aux(&self) -> Option { + self.aux.clone() + } + + #[inline] + pub fn reset_aux(&mut self) { + self.aux = None + } + pub fn change_root(&mut self, str: String) { self.root = Symbol::new(str); }