rename ScopeHint to TypeHint

This commit is contained in:
Sofia 2025-07-13 15:27:28 +03:00
parent 0d631bfa89
commit 7d77e1df32
2 changed files with 23 additions and 25 deletions

View File

@ -1,8 +1,6 @@
use std::{
any::TypeId,
cell::RefCell,
collections::{HashMap, HashSet},
hint::black_box,
rc::Rc,
};
@ -12,14 +10,14 @@ use super::{
};
#[derive(Clone)]
pub struct ScopeHint<'scope>(TypeIdRef, &'scope ScopeHints<'scope>);
pub struct TypeHint<'scope>(TypeIdRef, &'scope ScopeHints<'scope>);
impl<'scope> ScopeHint<'scope> {
impl<'scope> TypeHint<'scope> {
pub unsafe fn resolve_type(&self) -> TypeKind {
unsafe { *self.1.types.hints.borrow().get_unchecked(*self.0.borrow()) }
}
pub fn narrow(&mut self, other: &ScopeHint) -> Result<ScopeHint<'scope>, ErrorKind> {
pub fn narrow(&mut self, other: &TypeHint) -> Result<TypeHint<'scope>, ErrorKind> {
self.1.combine_vars(self, other)
}
@ -28,7 +26,7 @@ impl<'scope> ScopeHint<'scope> {
}
}
impl<'scope> std::fmt::Debug for ScopeHint<'scope> {
impl<'scope> std::fmt::Debug for TypeHint<'scope> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_tuple("Hint")
.field(&self.0)
@ -117,7 +115,7 @@ impl<'outer> ScopeHints<'outer> {
name: String,
mutable: bool,
initial_ty: TypeKind,
) -> Result<ScopeHint<'outer>, ErrorKind> {
) -> Result<TypeHint<'outer>, ErrorKind> {
if self.variables.borrow().contains_key(&name) {
return Err(ErrorKind::VariableAlreadyDefined(name));
}
@ -125,10 +123,10 @@ impl<'outer> ScopeHints<'outer> {
self.variables
.borrow_mut()
.insert(name, (mutable, idx.clone()));
Ok(ScopeHint(idx, self))
Ok(TypeHint(idx, self))
}
pub fn from_type(&'outer self, ty: &TypeKind) -> Option<ScopeHint<'outer>> {
pub fn from_type(&'outer self, ty: &TypeKind) -> Option<TypeHint<'outer>> {
let idx = match ty {
TypeKind::Vague(super::VagueType::Hinted(idx)) => {
let inner_idx = unsafe { *self.types.recurse_type_ref(*idx).borrow() };
@ -143,27 +141,27 @@ impl<'outer> ScopeHints<'outer> {
}
}
};
Some(ScopeHint(idx, self))
Some(TypeHint(idx, self))
}
fn narrow_to_type(
&'outer self,
hint: &ScopeHint,
hint: &TypeHint,
ty: &TypeKind,
) -> Result<ScopeHint<'outer>, ErrorKind> {
) -> Result<TypeHint<'outer>, ErrorKind> {
unsafe {
let mut hints = self.types.hints.borrow_mut();
let existing = hints.get_unchecked_mut(*hint.0.borrow());
*existing = existing.collapse_into(&ty)?;
Ok(ScopeHint(hint.0.clone(), self))
Ok(TypeHint(hint.0.clone(), self))
}
}
fn combine_vars(
&'outer self,
hint1: &ScopeHint,
hint2: &ScopeHint,
) -> Result<ScopeHint<'outer>, ErrorKind> {
hint1: &TypeHint,
hint2: &TypeHint,
) -> Result<TypeHint<'outer>, ErrorKind> {
unsafe {
let ty = self
.types
@ -177,7 +175,7 @@ impl<'outer> ScopeHints<'outer> {
*idx.borrow_mut() = *hint1.0.borrow();
}
}
Ok(ScopeHint(hint1.0.clone(), self))
Ok(TypeHint(hint1.0.clone(), self))
}
}
@ -189,20 +187,20 @@ impl<'outer> ScopeHints<'outer> {
}
}
pub fn find_hint(&'outer self, name: &String) -> Option<(bool, ScopeHint<'outer>)> {
pub fn find_hint(&'outer self, name: &String) -> Option<(bool, TypeHint<'outer>)> {
self.variables
.borrow()
.get(name)
.map(|(mutable, idx)| (*mutable, ScopeHint(idx.clone(), self)))
.map(|(mutable, idx)| (*mutable, TypeHint(idx.clone(), self)))
.or(self.outer.map(|o| o.find_hint(name)).flatten())
}
pub fn binop(
&'outer self,
op: &BinaryOperator,
lhs: &mut ScopeHint<'outer>,
rhs: &mut ScopeHint<'outer>,
) -> Result<ScopeHint<'outer>, ErrorKind> {
lhs: &mut TypeHint<'outer>,
rhs: &mut TypeHint<'outer>,
) -> Result<TypeHint<'outer>, ErrorKind> {
let ty = lhs.narrow(rhs)?;
Ok(match op {
BinaryOperator::Add => ty,

View File

@ -8,7 +8,7 @@ use VagueType::*;
use super::{
pass::{Pass, PassState, ScopeFunction, ScopeVariable},
scopehints::{ScopeHint, ScopeHints, TypeHints},
scopehints::{ScopeHints, TypeHint, TypeHints},
types::{pick_return, ReturnType},
};
@ -105,7 +105,7 @@ impl Block {
&mut self,
state: &mut PassState<ErrorKind>,
outer_hints: &'s ScopeHints,
) -> Result<(ReturnKind, ScopeHint<'s>), ErrorKind> {
) -> Result<(ReturnKind, TypeHint<'s>), ErrorKind> {
let mut state = state.inner();
let inner_hints = outer_hints.inner();
@ -313,7 +313,7 @@ impl Expression {
&mut self,
state: &mut PassState<ErrorKind>,
hints: &'s ScopeHints<'s>,
) -> Result<ScopeHint<'s>, ErrorKind> {
) -> Result<TypeHint<'s>, ErrorKind> {
match &mut self.0 {
ExprKind::Variable(var) => {
let hint = hints