Skip to content

Commit

Permalink
fix(semantic): correctly resolve binding for return type of functions
Browse files Browse the repository at this point in the history
  • Loading branch information
overlookmotel committed Oct 9, 2024
1 parent 994b60b commit ed93641
Showing 1 changed file with 23 additions and 9 deletions.
32 changes: 23 additions & 9 deletions crates/oxc_semantic/src/builder.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1672,6 +1672,18 @@ impl<'a> Visit<'a> for SemanticBuilder<'a> {
if let Some(return_type) = &func.return_type {
self.visit_ts_type_annotation(return_type);
}

if func.params.kind != FormalParameterKind::Signature && func.params.has_parameter() {
// `function foo({bar: identifier_reference}) {}`
// ^^^^^^^^^^^^^^^^^^^^
// `function foo<SomeType>(v: SomeType): SomeType { return v; }`
// ^^^^^^^^ ^^^^^^^^
// Parameter initializers must be resolved after all parameters have been declared.
// Param types and return type must be resolved after type parameters have been declared.
// In both cases, need to avoid binding to variables/types declared inside the function body.
self.resolve_references_for_current_scope();
}

if let Some(body) = &func.body {
self.visit_function_body(body);
}
Expand Down Expand Up @@ -1726,6 +1738,17 @@ impl<'a> Visit<'a> for SemanticBuilder<'a> {
self.visit_ts_type_annotation(return_type);
}

if expr.params.kind != FormalParameterKind::Signature && expr.params.has_parameter() {
// `let foo = ({bar: identifier_reference}) => {};`
// ^^^^^^^^^^^^^^^^^^^^
// `let foo = <SomeType>(v: SomeType): SomeType => v;`
// ^^^^^^^^ ^^^^^^^^
// Parameter initializers must be resolved after all parameters have been declared.
// Param types and return type must be resolved after type parameters have been declared.
// In both cases, need to avoid binding to variables/types declared inside the function body.
self.resolve_references_for_current_scope();
}

self.visit_function_body(&expr.body);

/* cfg */
Expand Down Expand Up @@ -1980,15 +2003,6 @@ impl<'a> SemanticBuilder<'a> {
AstKind::Function(_) | AstKind::ArrowFunctionExpression(_) => {
self.function_stack.pop();
}
AstKind::FormalParameters(parameters) => {
if parameters.kind != FormalParameterKind::Signature && parameters.has_parameter() {
// `function foo({bar: identifier_reference}) {}`
// ^^^^^^^^^^^^^^^^^^^^ Parameter initializer must be resolved
// after all parameters have been declared
// to avoid binding to variables inside the scope
self.resolve_references_for_current_scope();
}
}
AstKind::CatchParameter(_) => {
self.resolve_references_for_current_scope();
}
Expand Down

0 comments on commit ed93641

Please sign in to comment.