From 34c0599db8841c2bbef5c7438a5d4882d88e78ce Mon Sep 17 00:00:00 2001 From: Boshen Date: Sat, 11 Mar 2023 13:49:58 +0800 Subject: [PATCH] feat(semantic): bind `FormalParameters` --- crates/oxc_semantic/src/binder.rs | 19 +++++++ crates/oxc_semantic/src/builder.rs | 7 ++- tasks/coverage/test262.snap | 91 +++++++++++++++++++++++++++--- 3 files changed, 107 insertions(+), 10 deletions(-) diff --git a/crates/oxc_semantic/src/binder.rs b/crates/oxc_semantic/src/binder.rs index f0d754d06..8da52e987 100644 --- a/crates/oxc_semantic/src/binder.rs +++ b/crates/oxc_semantic/src/binder.rs @@ -74,3 +74,22 @@ impl<'a> Binder for VariableDeclarator<'a> { } } } + +impl<'a> Binder for FormalParameters<'a> { + fn bind(&self, builder: &mut SemanticBuilder) { + let includes = SymbolFlags::FunctionScopedVariable; + let excludes = SymbolFlags::FunctionScopedVariableExcludes; + let is_signature = self.kind == FormalParameterKind::Signature; + for ident in self.bound_names() { + if !is_signature { + builder.declare_symbol( + &ident.name, + ident.span, + builder.scope.current_scope_id, + includes, + excludes, + ); + } + } + } +} diff --git a/crates/oxc_semantic/src/builder.rs b/crates/oxc_semantic/src/builder.rs index 3f6eeeb5a..9c3cb5fa5 100644 --- a/crates/oxc_semantic/src/builder.rs +++ b/crates/oxc_semantic/src/builder.rs @@ -175,7 +175,12 @@ impl<'a> Visit<'a> for SemanticBuilder<'a> { impl<'a> SemanticBuilder<'a> { fn enter_kind(&mut self, kind: AstKind<'a>) { match kind { - AstKind::VariableDeclarator(decl) => decl.bind(self), + AstKind::VariableDeclarator(decl) => { + decl.bind(self); + } + AstKind::FormalParameters(params) => { + params.bind(self); + } AstKind::IdentifierReference(ident) => { self.reference_identifier(ident); } diff --git a/tasks/coverage/test262.snap b/tasks/coverage/test262.snap index 6c70e26cc..9051f0c69 100644 --- a/tasks/coverage/test262.snap +++ b/tasks/coverage/test262.snap @@ -1,7 +1,7 @@ Test262 Summary: AST Parsed : 44022/44034 (99.97%) Positive Passed: 44022/44034 (99.97%) -Negative Passed: 2686/3917 (68.57%) +Negative Passed: 2694/3917 (68.78%) Expect Syntax Error: "annexB/language/statements/for-in/const-initializer.js" Expect Syntax Error: "annexB/language/statements/for-in/let-initializer.js" Expect Syntax Error: "annexB/language/statements/for-in/strict-initializer.js" @@ -141,7 +141,6 @@ Expect Syntax Error: "language/expressions/async-arrow-function/early-errors-arr Expect Syntax Error: "language/expressions/async-arrow-function/early-errors-arrow-body-contains-super-property.js" Expect Syntax Error: "language/expressions/async-arrow-function/early-errors-arrow-duplicate-parameters.js" Expect Syntax Error: "language/expressions/async-arrow-function/early-errors-arrow-eval-in-formal-parameters.js" -Expect Syntax Error: "language/expressions/async-arrow-function/early-errors-arrow-formals-body-duplicate.js" Expect Syntax Error: "language/expressions/async-arrow-function/early-errors-arrow-formals-contains-super-call.js" Expect Syntax Error: "language/expressions/async-arrow-function/early-errors-arrow-formals-contains-super-property.js" Expect Syntax Error: "language/expressions/async-arrow-function/object-destructuring-param-strict-body.js" @@ -154,7 +153,6 @@ Expect Syntax Error: "language/expressions/async-function/early-errors-expressio Expect Syntax Error: "language/expressions/async-function/early-errors-expression-body-contains-super-call.js" Expect Syntax Error: "language/expressions/async-function/early-errors-expression-body-contains-super-property.js" Expect Syntax Error: "language/expressions/async-function/early-errors-expression-eval-in-formal-parameters.js" -Expect Syntax Error: "language/expressions/async-function/early-errors-expression-formals-body-duplicate.js" Expect Syntax Error: "language/expressions/async-function/early-errors-expression-formals-contains-super-call.js" Expect Syntax Error: "language/expressions/async-function/early-errors-expression-formals-contains-super-property.js" Expect Syntax Error: "language/expressions/async-function/named-array-destructuring-param-strict-body.js" @@ -194,8 +192,6 @@ Expect Syntax Error: "language/expressions/async-generator/early-errors-expressi Expect Syntax Error: "language/expressions/async-generator/early-errors-expression-body-contains-super-call.js" Expect Syntax Error: "language/expressions/async-generator/early-errors-expression-body-contains-super-property.js" Expect Syntax Error: "language/expressions/async-generator/early-errors-expression-eval-in-formal-parameters.js" -Expect Syntax Error: "language/expressions/async-generator/early-errors-expression-formals-body-duplicate-const.js" -Expect Syntax Error: "language/expressions/async-generator/early-errors-expression-formals-body-duplicate-let.js" Expect Syntax Error: "language/expressions/async-generator/early-errors-expression-formals-contains-await-expr.js" Expect Syntax Error: "language/expressions/async-generator/early-errors-expression-formals-contains-await.js" Expect Syntax Error: "language/expressions/async-generator/early-errors-expression-formals-contains-super-call.js" @@ -541,8 +537,6 @@ Expect Syntax Error: "language/expressions/object/method-definition/gen-meth-obj Expect Syntax Error: "language/expressions/object/method-definition/gen-meth-rest-param-strict-body.js" Expect Syntax Error: "language/expressions/object/method-definition/generator-param-id-yield.js" Expect Syntax Error: "language/expressions/object/method-definition/generator-param-init-yield.js" -Expect Syntax Error: "language/expressions/object/method-definition/generator-param-redecl-const.js" -Expect Syntax Error: "language/expressions/object/method-definition/generator-param-redecl-let.js" Expect Syntax Error: "language/expressions/object/method-definition/generator-super-call-body.js" Expect Syntax Error: "language/expressions/object/method-definition/generator-super-call-param.js" Expect Syntax Error: "language/expressions/object/method-definition/generator-use-strict-with-non-simple-param.js" @@ -551,7 +545,6 @@ Expect Syntax Error: "language/expressions/object/method-definition/meth-dflt-pa Expect Syntax Error: "language/expressions/object/method-definition/meth-dflt-params-rest.js" Expect Syntax Error: "language/expressions/object/method-definition/meth-object-destructuring-param-strict-body.js" Expect Syntax Error: "language/expressions/object/method-definition/meth-rest-param-strict-body.js" -Expect Syntax Error: "language/expressions/object/method-definition/name-param-redecl.js" Expect Syntax Error: "language/expressions/object/method-definition/name-super-call-body.js" Expect Syntax Error: "language/expressions/object/method-definition/name-super-call-param.js" Expect Syntax Error: "language/expressions/object/method-definition/setter-use-strict-with-non-simple-param.js" @@ -711,7 +704,6 @@ Expect Syntax Error: "language/statements/async-function/early-errors-declaratio Expect Syntax Error: "language/statements/async-function/early-errors-declaration-body-contains-super-property.js" Expect Syntax Error: "language/statements/async-function/early-errors-declaration-duplicate-parameters.js" Expect Syntax Error: "language/statements/async-function/early-errors-declaration-eval-in-formal-parameters.js" -Expect Syntax Error: "language/statements/async-function/early-errors-declaration-formals-body-duplicate.js" Expect Syntax Error: "language/statements/async-function/early-errors-declaration-formals-contains-super-call.js" Expect Syntax Error: "language/statements/async-function/early-errors-declaration-formals-contains-super-property.js" Expect Syntax Error: "language/statements/async-function/object-destructuring-param-strict-body.js" @@ -5807,6 +5799,15 @@ Expect to Parse: "language/statements/class/decorator/syntax/valid/decorator-par ╰──── help: Try insert a semicolon here + × Identifier `"bar"` has already been declared + ╭─[language/expressions/async-arrow-function/early-errors-arrow-formals-body-duplicate.js:14:1] + 14 │ + 15 │ async(bar) => { let bar; } + · ─┬─ ─┬─ + · │ ╰── It can not be redeclared here + · ╰── `bar` has already been declared here + ╰──── + × Automatic Semicolon Insertion ╭─[language/expressions/async-arrow-function/early-errors-arrow-formals-lineterminator.js:32:1] 32 │ async @@ -5883,6 +5884,15 @@ Expect to Parse: "language/statements/class/decorator/syntax/valid/decorator-par 30 │ }; ╰──── + × Identifier `"bar"` has already been declared + ╭─[language/expressions/async-function/early-errors-expression-formals-body-duplicate.js:14:1] + 14 │ + 15 │ (async function foo (bar) { let bar; }); + · ─┬─ ─┬─ + · │ ╰── It can not be redeclared here + · ╰── `bar` has already been declared here + ╰──── + × Invalid assignment ╭─[language/expressions/async-function/early-errors-expression-not-simple-assignment-target.js:15:1] 15 │ @@ -6125,6 +6135,24 @@ Expect to Parse: "language/statements/class/decorator/syntax/valid/decorator-par 34 │ ╰──── + × Identifier `"a"` has already been declared + ╭─[language/expressions/async-generator/early-errors-expression-formals-body-duplicate-const.js:20:1] + 20 │ + 21 │ (async function*(a) { const a = 0; }); + · ┬ ┬ + · │ ╰── It can not be redeclared here + · ╰── `a` has already been declared here + ╰──── + + × Identifier `"a"` has already been declared + ╭─[language/expressions/async-generator/early-errors-expression-formals-body-duplicate-let.js:17:1] + 17 │ + 18 │ (async function*(a) { let a; }); + · ┬ ┬ + · │ ╰── It can not be redeclared here + · ╰── `a` has already been declared here + ╰──── + × The keyword '"yield"' is reserved ╭─[language/expressions/async-generator/early-errors-expression-formals-contains-yield.js:17:1] 17 │ @@ -12501,6 +12529,30 @@ Expect to Parse: "language/statements/class/decorator/syntax/valid/decorator-par 28 │ throw new Test262Error(); ╰──── + × Identifier `"a"` has already been declared + ╭─[language/expressions/object/method-definition/generator-param-redecl-const.js:19:1] + 19 │ var obj = { + 20 │ *foo(a) { + · ┬ + · ╰── `a` has already been declared here + 21 │ const a = 3; + · ┬ + · ╰── It can not be redeclared here + 22 │ } + ╰──── + + × Identifier `"a"` has already been declared + ╭─[language/expressions/object/method-definition/generator-param-redecl-let.js:19:1] + 19 │ var obj = { + 20 │ *foo(a) { + · ┬ + · ╰── `a` has already been declared here + 21 │ let a = 3; + · ┬ + · ╰── It can not be redeclared here + 22 │ } + ╰──── + × Rest element must be last element ╭─[language/expressions/object/method-definition/meth-rest-params-trailing-comma-early-error.js:57:1] 57 │ 0, { @@ -12510,6 +12562,18 @@ Expect to Parse: "language/statements/class/decorator/syntax/valid/decorator-par 59 │ ╰──── + × Identifier `"param"` has already been declared + ╭─[language/expressions/object/method-definition/name-param-redecl.js:17:1] + 17 │ var obj = { + 18 │ method(param) { + · ──┬── + · ╰── `param` has already been declared here + 19 │ let param; + · ──┬── + · ╰── It can not be redeclared here + 20 │ } + ╰──── + × Unexpected token ╭─[language/expressions/object/method-definition/private-name-early-error-async-fn-inside-class.js:23:1] 23 │ field = { @@ -16419,6 +16483,15 @@ Expect to Parse: "language/statements/class/decorator/syntax/valid/decorator-par · ─ ╰──── + × Identifier `"bar"` has already been declared + ╭─[language/statements/async-function/early-errors-declaration-formals-body-duplicate.js:14:1] + 14 │ + 15 │ async function foo (bar) { let bar; } + · ─┬─ ─┬─ + · │ ╰── It can not be redeclared here + · ╰── `bar` has already been declared here + ╰──── + × Keywords cannot contain escape characters ╭─[language/statements/async-function/escaped-async.js:23:1] 23 │