Add typechecking for borrow/deref
This commit is contained in:
parent
cf30f79951
commit
c0e375d84c
@ -629,8 +629,57 @@ impl Expression {
|
||||
}
|
||||
Ok(TypeKind::CustomType(struct_name.clone()))
|
||||
}
|
||||
ExprKind::Borrow(named_variable_ref) => todo!(),
|
||||
ExprKind::Deref(named_variable_ref) => todo!(),
|
||||
ExprKind::Borrow(var_ref) => {
|
||||
let existing = state
|
||||
.or_else(
|
||||
state
|
||||
.scope
|
||||
.variables
|
||||
.get(&var_ref.1)
|
||||
.map(|var| &var.ty)
|
||||
.cloned()
|
||||
.ok_or(ErrorKind::VariableNotDefined(var_ref.1.clone())),
|
||||
TypeKind::Vague(Vague::Unknown),
|
||||
var_ref.2,
|
||||
)
|
||||
.resolve_ref(typerefs);
|
||||
|
||||
// Update typing to be more accurate
|
||||
var_ref.0 = state.or_else(
|
||||
var_ref.0.resolve_ref(typerefs).collapse_into(&existing),
|
||||
TypeKind::Vague(Vague::Unknown),
|
||||
var_ref.2,
|
||||
);
|
||||
|
||||
Ok(TypeKind::Borrow(Box::new(var_ref.0.clone())))
|
||||
}
|
||||
ExprKind::Deref(var_ref) => {
|
||||
let existing = state
|
||||
.or_else(
|
||||
state
|
||||
.scope
|
||||
.variables
|
||||
.get(&var_ref.1)
|
||||
.map(|var| &var.ty)
|
||||
.cloned()
|
||||
.ok_or(ErrorKind::VariableNotDefined(var_ref.1.clone())),
|
||||
TypeKind::Vague(Vague::Unknown),
|
||||
var_ref.2,
|
||||
)
|
||||
.resolve_ref(typerefs);
|
||||
|
||||
// Update typing to be more accurate
|
||||
var_ref.0 = state.or_else(
|
||||
var_ref.0.resolve_ref(typerefs).collapse_into(&existing),
|
||||
TypeKind::Vague(Vague::Unknown),
|
||||
var_ref.2,
|
||||
);
|
||||
|
||||
match &var_ref.0 {
|
||||
TypeKind::Borrow(type_kind) => Ok(*type_kind.clone()),
|
||||
_ => Err(ErrorKind::AttemptedDerefNonBorrow(var_ref.1.clone())),
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user