From 8329affbf8563d5440b4864e7860fc426959ddfe Mon Sep 17 00:00:00 2001 From: Edgar Luque Date: Mon, 4 Mar 2024 09:06:49 +0100 Subject: [PATCH] feat: more checks --- lib/edlang_check/src/lib.rs | 10 ++++++++++ lib/edlang_lowering/src/errors.rs | 2 ++ lib/edlang_lowering/src/lib.rs | 20 +++++++++++--------- 3 files changed, 23 insertions(+), 9 deletions(-) diff --git a/lib/edlang_check/src/lib.rs b/lib/edlang_check/src/lib.rs index 3a21fffb4..ecfa1e477 100644 --- a/lib/edlang_check/src/lib.rs +++ b/lib/edlang_check/src/lib.rs @@ -126,5 +126,15 @@ pub fn lowering_error_to_report( ) .finish() }, + LoweringError::UseOfUndeclaredVariable { span, name } => { + Report::build(ReportKind::Error, path.clone(), span.lo) + .with_code("UseOfUndeclaredVariable") + .with_label( + Label::new((path, span.into())) + .with_message(format!("use of undeclared variable {:?}", name)) + .with_color(colors.next()), + ) + .finish() + }, } } diff --git a/lib/edlang_lowering/src/errors.rs b/lib/edlang_lowering/src/errors.rs index a964e8ecf..b23a551c8 100644 --- a/lib/edlang_lowering/src/errors.rs +++ b/lib/edlang_lowering/src/errors.rs @@ -34,4 +34,6 @@ pub enum LoweringError { found: TypeKind, expected: TypeInfo, }, + #[error("use of underclared variable {name:?}")] + UseOfUndeclaredVariable { span: Span, name: String }, } diff --git a/lib/edlang_lowering/src/lib.rs b/lib/edlang_lowering/src/lib.rs index 7ac375a6b..b1e00646b 100644 --- a/lib/edlang_lowering/src/lib.rs +++ b/lib/edlang_lowering/src/lib.rs @@ -474,31 +474,31 @@ fn lower_let(builder: &mut BodyBuilder, info: &ast::LetStmt) -> Result<(), Lower fn lower_assign(builder: &mut BodyBuilder, info: &ast::AssignStmt) -> Result<(), LoweringError> { let (mut place, ty, _span) = lower_path(builder, &info.name)?; - let mut ty = TypeInfo { + let mut path_ty = TypeInfo { span: None, kind: ty, }; for _ in 0..info.deref_times { - match &ty.kind { + match &path_ty.kind { TypeKind::Ptr(is_mut, inner) => { if !is_mut { panic!("trying to mutate non mut ptr"); } - ty = *inner.clone(); + path_ty = *inner.clone(); } TypeKind::Ref(is_mut, inner) => { if !is_mut { panic!("trying to mutate non mut ref"); } - ty = *inner.clone(); + path_ty = *inner.clone(); } _ => unreachable!(), } place.projection.push(PlaceElem::Deref); } - let (rvalue, _ty, _span) = lower_expr(builder, &info.value, Some(&ty))?; + let (rvalue, _ty, _span) = lower_expr(builder, &info.value, Some(&path_ty))?; builder.statements.push(Statement { span: Some(info.name.first.span), @@ -1141,10 +1141,12 @@ fn lower_path( builder: &mut BodyBuilder, info: &ast::PathExpr, ) -> Result<(ir::Place, TypeKind, Span), LoweringError> { - let local = *builder - .name_to_local - .get(&info.first.name) - .expect("local not found"); + let local = *builder.name_to_local.get(&info.first.name).ok_or( + LoweringError::UseOfUndeclaredVariable { + span: info.span, + name: info.first.name.clone(), + }, + )?; let mut ty = builder.body.locals[local].ty.kind.clone(); let mut projection = Vec::new();