Skip to content

Commit

Permalink
helper removed
Browse files Browse the repository at this point in the history
  • Loading branch information
gzanitti committed Oct 25, 2024
1 parent b488fc6 commit 56d1ce4
Showing 1 changed file with 20 additions and 31 deletions.
51 changes: 20 additions & 31 deletions pil-analyzer/src/type_inference.rs
Original file line number Diff line number Diff line change
Expand Up @@ -526,9 +526,26 @@ impl TypeChecker {
source_ref,
Reference::Poly(PolynomialReference { name, type_args }),
) => {
let scheme = self.declared_types[name].1.clone();
let ty =
self.instantiate_scheme_with_type_args(type_args, scheme, name, source_ref)?;
let (ty, args) = self
.unifier
.instantiate_scheme(self.declared_types[name].1.clone());
if let Some(requested_type_args) = type_args {
if requested_type_args.len() != args.len() {
return Err(source_ref.with_error(format!(
"Expected {} type arguments for symbol {name}, but got {}: {}",
args.len(),
requested_type_args.len(),
requested_type_args.iter().join(", ")
)));
}
for (requested, inferred) in requested_type_args.iter_mut().zip(&args) {
requested.substitute_type_vars(&self.declared_type_vars);
self.unifier
.unify_types(requested.clone(), inferred.clone())
.map_err(|err| source_ref.with_error(err))?;
}
}
*type_args = Some(args);
type_for_reference(&ty)
}
Expression::PublicReference(_, _) => Type::Expr,
Expand Down Expand Up @@ -776,34 +793,6 @@ impl TypeChecker {
})
}

fn instantiate_scheme_with_type_args(
&mut self,
type_args: &mut Option<Vec<Type>>,
scheme: TypeScheme,
symbol_name: &mut String,
source_ref: &mut SourceRef,
) -> Result<Type, Error> {
let (ty, args) = self.unifier.instantiate_scheme(scheme);
if let Some(requested_type_args) = type_args {
if requested_type_args.len() != args.len() {
return Err(source_ref.with_error(format!(
"Expected {} type arguments for symbol {symbol_name}, but got {}: {}",
args.len(),
requested_type_args.len(),
requested_type_args.iter().join(", ")
)));
}
for (requested, inferred) in requested_type_args.iter_mut().zip(&args) {
requested.substitute_type_vars(&self.declared_type_vars);
self.unifier
.unify_types(requested.clone(), inferred.clone())
.map_err(|err| source_ref.with_error(err))?;
}
}
*type_args = Some(args);
Ok(ty)
}

/// Returns the type expected at statement level, given the current function context.
fn statement_type(&self) -> ExpectedType {
if self.lambda_kind == FunctionKind::Constr {
Expand Down

0 comments on commit 56d1ce4

Please sign in to comment.