mirror of
https://github.com/edg-l/edlang.git
synced 2024-11-22 07:58:24 +00:00
feat: more checks
This commit is contained in:
parent
8319844673
commit
8329affbf8
|
@ -126,5 +126,15 @@ pub fn lowering_error_to_report(
|
||||||
)
|
)
|
||||||
.finish()
|
.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()
|
||||||
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -34,4 +34,6 @@ pub enum LoweringError {
|
||||||
found: TypeKind,
|
found: TypeKind,
|
||||||
expected: TypeInfo,
|
expected: TypeInfo,
|
||||||
},
|
},
|
||||||
|
#[error("use of underclared variable {name:?}")]
|
||||||
|
UseOfUndeclaredVariable { span: Span, name: String },
|
||||||
}
|
}
|
||||||
|
|
|
@ -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> {
|
fn lower_assign(builder: &mut BodyBuilder, info: &ast::AssignStmt) -> Result<(), LoweringError> {
|
||||||
let (mut place, ty, _span) = lower_path(builder, &info.name)?;
|
let (mut place, ty, _span) = lower_path(builder, &info.name)?;
|
||||||
let mut ty = TypeInfo {
|
let mut path_ty = TypeInfo {
|
||||||
span: None,
|
span: None,
|
||||||
kind: ty,
|
kind: ty,
|
||||||
};
|
};
|
||||||
|
|
||||||
for _ in 0..info.deref_times {
|
for _ in 0..info.deref_times {
|
||||||
match &ty.kind {
|
match &path_ty.kind {
|
||||||
TypeKind::Ptr(is_mut, inner) => {
|
TypeKind::Ptr(is_mut, inner) => {
|
||||||
if !is_mut {
|
if !is_mut {
|
||||||
panic!("trying to mutate non mut ptr");
|
panic!("trying to mutate non mut ptr");
|
||||||
}
|
}
|
||||||
ty = *inner.clone();
|
path_ty = *inner.clone();
|
||||||
}
|
}
|
||||||
TypeKind::Ref(is_mut, inner) => {
|
TypeKind::Ref(is_mut, inner) => {
|
||||||
if !is_mut {
|
if !is_mut {
|
||||||
panic!("trying to mutate non mut ref");
|
panic!("trying to mutate non mut ref");
|
||||||
}
|
}
|
||||||
ty = *inner.clone();
|
path_ty = *inner.clone();
|
||||||
}
|
}
|
||||||
_ => unreachable!(),
|
_ => unreachable!(),
|
||||||
}
|
}
|
||||||
place.projection.push(PlaceElem::Deref);
|
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 {
|
builder.statements.push(Statement {
|
||||||
span: Some(info.name.first.span),
|
span: Some(info.name.first.span),
|
||||||
|
@ -1141,10 +1141,12 @@ fn lower_path(
|
||||||
builder: &mut BodyBuilder,
|
builder: &mut BodyBuilder,
|
||||||
info: &ast::PathExpr,
|
info: &ast::PathExpr,
|
||||||
) -> Result<(ir::Place, TypeKind, Span), LoweringError> {
|
) -> Result<(ir::Place, TypeKind, Span), LoweringError> {
|
||||||
let local = *builder
|
let local = *builder.name_to_local.get(&info.first.name).ok_or(
|
||||||
.name_to_local
|
LoweringError::UseOfUndeclaredVariable {
|
||||||
.get(&info.first.name)
|
span: info.span,
|
||||||
.expect("local not found");
|
name: info.first.name.clone(),
|
||||||
|
},
|
||||||
|
)?;
|
||||||
|
|
||||||
let mut ty = builder.body.locals[local].ty.kind.clone();
|
let mut ty = builder.body.locals[local].ty.kind.clone();
|
||||||
let mut projection = Vec::new();
|
let mut projection = Vec::new();
|
||||||
|
|
Loading…
Reference in a new issue