Also preserve warnings when resetting scope for backtracking.

This is crucial as some checks regarding variable usages depends on
  warnings; so we may accidentally remove variables from the AST as a
  consequence of backtracking for deep inferrence.
This commit is contained in:
KtorZ 2024-05-16 23:20:52 +02:00
parent eadf709411
commit 27b3536f09
No known key found for this signature in database
GPG Key ID: 33173CB6F77F4277
1 changed files with 6 additions and 1 deletions

View File

@ -71,6 +71,8 @@ pub(crate) fn infer_function(
.function_types() .function_types()
.unwrap_or_else(|| panic!("Preregistered type for fn {name} was not a fn")); .unwrap_or_else(|| panic!("Preregistered type for fn {name} was not a fn"));
let warnings = environment.warnings.clone();
// ━━━ open new scope ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ // ━━━ open new scope ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
let initial_scope = environment.open_new_scope(); let initial_scope = environment.open_new_scope();
@ -106,10 +108,12 @@ pub(crate) fn infer_function(
// callee. Otherwise, identifiers present in the caller's scope may become available to the // callee. Otherwise, identifiers present in the caller's scope may become available to the
// callee. // callee.
if let Err(Error::MustInferFirst { function, .. }) = inferred { if let Err(Error::MustInferFirst { function, .. }) = inferred {
// Reset the environment & scope.
hydrators.insert(name.to_string(), expr_typer.hydrator); hydrators.insert(name.to_string(), expr_typer.hydrator);
environment.close_scope(initial_scope); environment.close_scope(initial_scope);
*environment.warnings = warnings;
// Backtrack and infer callee first.
infer_function( infer_function(
&function, &function,
environment.current_module, environment.current_module,
@ -119,6 +123,7 @@ pub(crate) fn infer_function(
tracing, tracing,
)?; )?;
// Then, try again the entire function definition.
return infer_function(fun, module_name, hydrators, environment, lines, tracing); return infer_function(fun, module_name, hydrators, environment, lines, tracing);
} }