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:
parent
eadf709411
commit
27b3536f09
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue