From f4c8cb2cde15e5dbbeb470a7104caaf4f3cf4ac8 Mon Sep 17 00:00:00 2001 From: Boshen Date: Mon, 13 Mar 2023 23:33:20 +0800 Subject: [PATCH] feat(linter): check `FunctionDeclaration` in javascript --- .../src/rules/early_error/javascript.rs | 51 +- tasks/coverage/babel.snap | 40 +- tasks/coverage/test262.snap | 652 +++++++++++++++++- 3 files changed, 701 insertions(+), 42 deletions(-) diff --git a/crates/oxc_linter/src/rules/early_error/javascript.rs b/crates/oxc_linter/src/rules/early_error/javascript.rs index 5a7f6707a..8ea50f0a5 100644 --- a/crates/oxc_linter/src/rules/early_error/javascript.rs +++ b/crates/oxc_linter/src/rules/early_error/javascript.rs @@ -18,7 +18,10 @@ pub struct EarlyErrorJavaScript; impl Rule for EarlyErrorJavaScript { #[allow(clippy::single_match)] fn run<'a>(&self, node: &AstNode<'a>, ctx: &LintContext<'a>) { - match node.get().kind() { + let kind = node.get().kind(); + check_function_declaration(kind, node, ctx); + + match kind { AstKind::BindingIdentifier(ident) => { check_identifier(&ident.name, ident.span, node, ctx); check_binding_identifier(ident, node, ctx); @@ -371,6 +374,52 @@ fn check_module_declaration<'a>( } } +fn check_function_declaration<'a>(kind: AstKind<'a>, node: &AstNode<'a>, ctx: &LintContext<'a>) { + #[derive(Debug, Error, Diagnostic)] + #[error("Invalid function declaration")] + #[diagnostic(help( + "In strict mode code, functions can only be declared at top level or inside a block" + ))] + struct FunctionDeclarationStrict(#[label] Span); + + #[derive(Debug, Error, Diagnostic)] + #[error("Invalid function declaration")] + #[diagnostic(help( + "In non-strict mode code, functions can only be declared at top level, inside a block, or as the body of an if statement" + ))] + struct FunctionDeclarationNonStrict(#[label] Span); + + // Function declaration not allowed in statement position + let check = |stmt: &Statement<'a>| { + if let Statement::Declaration(Declaration::FunctionDeclaration(decl)) = stmt { + if ctx.strict_mode(node) { + ctx.diagnostic(FunctionDeclarationStrict(decl.span)); + } else if !matches!(kind, AstKind::IfStatement(_) | AstKind::LabeledStatement(_)) { + ctx.diagnostic(FunctionDeclarationNonStrict(decl.span)); + } + } + }; + + match kind { + AstKind::WithStatement(WithStatement { body, .. }) + | AstKind::WhileStatement(WhileStatement { body, .. }) + | AstKind::DoWhileStatement(DoWhileStatement { body, .. }) + | AstKind::ForStatement(ForStatement { body, .. }) + | AstKind::ForInStatement(ForInStatement { body, .. }) + | AstKind::ForOfStatement(ForOfStatement { body, .. }) + | AstKind::LabeledStatement(LabeledStatement { body, .. }) => { + check(body); + } + AstKind::IfStatement(if_stmt) => { + check(&if_stmt.consequent); + if let Some(alternate) = &if_stmt.alternate { + check(alternate); + } + } + _ => {} + } +} + fn check_regexp_literal(lit: &RegExpLiteral, ctx: &LintContext) { #[derive(Debug, Error, Diagnostic)] #[error("The 'u' and 'v' regular expression flags cannot be enabled at the same time")] diff --git a/tasks/coverage/babel.snap b/tasks/coverage/babel.snap index 6bdcd3321..a27698454 100644 --- a/tasks/coverage/babel.snap +++ b/tasks/coverage/babel.snap @@ -1,7 +1,7 @@ Babel Summary: AST Parsed : 2051/2069 (99.13%) Positive Passed: 2051/2069 (99.13%) -Negative Passed: 1120/1502 (74.57%) +Negative Passed: 1122/1502 (74.70%) Expect Syntax Error: "annex-b/disabled/1.1-html-comments-close/input.js" Expect Syntax Error: "annex-b/disabled/3.1-sloppy-labeled-functions-if-body/input.js" Expect Syntax Error: "annex-b/disabled/3.1-sloppy-labeled-functions-multiple-labels/input.js" @@ -11,7 +11,6 @@ Expect Syntax Error: "annex-b/disabled/3.2.5-duplicate-function-in-switch/input. Expect Syntax Error: "annex-b/disabled/3.3-function-in-if-body/input.js" Expect Syntax Error: "annex-b/disabled/3.5-for-in-initializer/input.js" Expect Syntax Error: "annex-b/enabled/3.1-sloppy-labeled-functions-if-body/input.js" -Expect Syntax Error: "core/categorized/invalid-fn-decl-inside-loop/input.js" Expect Syntax Error: "core/categorized/invalid-fn-decl-labeled-inside-if/input.js" Expect Syntax Error: "core/categorized/invalid-fn-decl-labeled-inside-loop/input.js" Expect Syntax Error: "core/escape-string/invalid-decimal-escape-strict-directive-function/input.js" @@ -29,7 +28,6 @@ Expect Syntax Error: "core/scope/undecl-export-as/input.js" Expect Syntax Error: "core/scope/undecl-export-block/input.js" Expect Syntax Error: "core/scope/undecl-export-builtin-as/input.js" Expect Syntax Error: "core/scope/undecl-export-builtin/input.js" -Expect Syntax Error: "core/scope/undecl-export-if/input.js" Expect Syntax Error: "core/scope/undecl-export/input.js" Expect Syntax Error: "core/uncategorised/466/input.js" Expect Syntax Error: "core/uncategorised/467/input.js" @@ -629,6 +627,13 @@ Expect to Parse: "typescript/types/const-type-parameters/input.ts" · ╰── Cannot assign to this expression ╰──── + × Invalid function declaration + ╭─[core/categorized/invalid-fn-decl-inside-loop/input.js:1:1] + 1 │ while (1) function foo(){} + · ──────────────── + ╰──── + help: In non-strict mode code, functions can only be declared at top level, inside a block, or as the body of an if statement + × Invalid assignment ╭─[core/categorized/invalid-left-hand-side-in-postfix-operation/input.js:1:1] 1 │ a++ = t @@ -1041,6 +1046,14 @@ Expect to Parse: "typescript/types/const-type-parameters/input.ts" 3 │ } ╰──── + × Invalid function declaration + ╭─[core/scope/undecl-export-if/input.js:1:1] + 1 │ export { encrypt }; + 2 │ if (true) function encrypt() {} + · ───────────────────── + ╰──── + help: In strict mode code, functions can only be declared at top level or inside a block + × A 'get' accessor must not have any formal parameters. ╭─[core/uncategorised/.542/input.js:1:1] 1 │ ({ get prop(x) {} }) @@ -2368,6 +2381,13 @@ Expect to Parse: "typescript/types/const-type-parameters/input.ts" · ╰── Generators can only be declared at the top level or inside a block ╰──── + × Invalid function declaration + ╭─[es2015/generators/invalid-sloppy-function/input.js:1:1] + 1 │ while (1) function *foo() {} + · ────────────────── + ╰──── + help: In non-strict mode code, functions can only be declared at top level, inside a block, or as the body of an if statement + × Generators can only be declared at the top level or inside a block ╭─[es2015/generators/invalid-sloppy-function/input.js:1:1] 1 │ while (1) function *foo() {} @@ -4391,6 +4411,13 @@ Expect to Parse: "typescript/types/const-type-parameters/input.ts" · ╰── Expect `)` here, but found `;` ╰──── + × Invalid function declaration + ╭─[es2017/async-functions/invalid-generator-inside-loop/input.js:1:1] + 1 │ while (1) async function *foo(){} + · ─────────────────────── + ╰──── + help: In non-strict mode code, functions can only be declared at top level, inside a block, or as the body of an if statement + × Async functions can only be declared at the top level or inside a block ╭─[es2017/async-functions/invalid-generator-inside-loop/input.js:1:1] 1 │ while (1) async function *foo(){} @@ -4398,6 +4425,13 @@ Expect to Parse: "typescript/types/const-type-parameters/input.ts" · ╰── Async functions can only be declared at the top level or inside a block ╰──── + × Invalid function declaration + ╭─[es2017/async-functions/invalid-inside-loop/input.js:1:1] + 1 │ while (1) async function foo(){} + · ────────────────────── + ╰──── + help: In non-strict mode code, functions can only be declared at top level, inside a block, or as the body of an if statement + × Async functions can only be declared at the top level or inside a block ╭─[es2017/async-functions/invalid-inside-loop/input.js:1:1] 1 │ while (1) async function foo(){} diff --git a/tasks/coverage/test262.snap b/tasks/coverage/test262.snap index cc1c95d1a..1b03f0e73 100644 --- a/tasks/coverage/test262.snap +++ b/tasks/coverage/test262.snap @@ -1,12 +1,7 @@ Test262 Summary: AST Parsed : 44015/44034 (99.96%) Positive Passed: 44015/44034 (99.96%) -Negative Passed: 3499/3917 (89.33%) -Expect Syntax Error: "language/block-scope/syntax/function-declarations/in-statement-position-do-statement-while-expression.js" -Expect Syntax Error: "language/block-scope/syntax/function-declarations/in-statement-position-for-statement.js" -Expect Syntax Error: "language/block-scope/syntax/function-declarations/in-statement-position-if-expression-statement-else-statement.js" -Expect Syntax Error: "language/block-scope/syntax/function-declarations/in-statement-position-if-expression-statement.js" -Expect Syntax Error: "language/block-scope/syntax/function-declarations/in-statement-position-while-expression-statement.js" +Negative Passed: 3536/3917 (90.27%) Expect Syntax Error: "language/directive-prologue/10.1.1-2gs.js" Expect Syntax Error: "language/directive-prologue/10.1.1-5gs.js" Expect Syntax Error: "language/directive-prologue/10.1.1-8gs.js" @@ -297,8 +292,6 @@ Expect Syntax Error: "language/statements/class/static-init-invalid-await.js" Expect Syntax Error: "language/statements/const/dstr/ary-ptrn-rest-init-ary.js" Expect Syntax Error: "language/statements/const/dstr/ary-ptrn-rest-init-id.js" Expect Syntax Error: "language/statements/const/dstr/ary-ptrn-rest-init-obj.js" -Expect Syntax Error: "language/statements/do-while/decl-fun.js" -Expect Syntax Error: "language/statements/do-while/labelled-fn-stmt.js" Expect Syntax Error: "language/statements/for-await-of/async-func-dstr-const-ary-ptrn-rest-init-ary.js" Expect Syntax Error: "language/statements/for-await-of/async-func-dstr-const-ary-ptrn-rest-init-id.js" Expect Syntax Error: "language/statements/for-await-of/async-func-dstr-const-ary-ptrn-rest-init-obj.js" @@ -335,12 +328,6 @@ Expect Syntax Error: "language/statements/for-await-of/async-gen-dstr-var-ary-pt Expect Syntax Error: "language/statements/for-await-of/async-gen-dstr-var-async-ary-ptrn-rest-init-ary.js" Expect Syntax Error: "language/statements/for-await-of/async-gen-dstr-var-async-ary-ptrn-rest-init-id.js" Expect Syntax Error: "language/statements/for-await-of/async-gen-dstr-var-async-ary-ptrn-rest-init-obj.js" -Expect Syntax Error: "language/statements/for-in/decl-fun.js" -Expect Syntax Error: "language/statements/for-in/labelled-fn-stmt-const.js" -Expect Syntax Error: "language/statements/for-in/labelled-fn-stmt-let.js" -Expect Syntax Error: "language/statements/for-in/labelled-fn-stmt-lhs.js" -Expect Syntax Error: "language/statements/for-in/labelled-fn-stmt-var.js" -Expect Syntax Error: "language/statements/for-of/decl-fun.js" Expect Syntax Error: "language/statements/for-of/dstr/const-ary-ptrn-rest-init-ary.js" Expect Syntax Error: "language/statements/for-of/dstr/const-ary-ptrn-rest-init-id.js" Expect Syntax Error: "language/statements/for-of/dstr/const-ary-ptrn-rest-init-obj.js" @@ -350,11 +337,6 @@ Expect Syntax Error: "language/statements/for-of/dstr/let-ary-ptrn-rest-init-obj Expect Syntax Error: "language/statements/for-of/dstr/var-ary-ptrn-rest-init-ary.js" Expect Syntax Error: "language/statements/for-of/dstr/var-ary-ptrn-rest-init-id.js" Expect Syntax Error: "language/statements/for-of/dstr/var-ary-ptrn-rest-init-obj.js" -Expect Syntax Error: "language/statements/for-of/labelled-fn-stmt-const.js" -Expect Syntax Error: "language/statements/for-of/labelled-fn-stmt-let.js" -Expect Syntax Error: "language/statements/for-of/labelled-fn-stmt-lhs.js" -Expect Syntax Error: "language/statements/for-of/labelled-fn-stmt-var.js" -Expect Syntax Error: "language/statements/for/decl-fun.js" Expect Syntax Error: "language/statements/for/dstr/const-ary-ptrn-rest-init-ary.js" Expect Syntax Error: "language/statements/for/dstr/const-ary-ptrn-rest-init-id.js" Expect Syntax Error: "language/statements/for/dstr/const-ary-ptrn-rest-init-obj.js" @@ -364,10 +346,6 @@ Expect Syntax Error: "language/statements/for/dstr/let-ary-ptrn-rest-init-obj.js Expect Syntax Error: "language/statements/for/dstr/var-ary-ptrn-rest-init-ary.js" Expect Syntax Error: "language/statements/for/dstr/var-ary-ptrn-rest-init-id.js" Expect Syntax Error: "language/statements/for/dstr/var-ary-ptrn-rest-init-obj.js" -Expect Syntax Error: "language/statements/for/labelled-fn-stmt-const.js" -Expect Syntax Error: "language/statements/for/labelled-fn-stmt-expr.js" -Expect Syntax Error: "language/statements/for/labelled-fn-stmt-let.js" -Expect Syntax Error: "language/statements/for/labelled-fn-stmt-var.js" Expect Syntax Error: "language/statements/function/dflt-params-rest.js" Expect Syntax Error: "language/statements/function/dstr/ary-ptrn-rest-init-ary.js" Expect Syntax Error: "language/statements/function/dstr/ary-ptrn-rest-init-id.js" @@ -392,18 +370,6 @@ Expect Syntax Error: "language/statements/generators/dstr/ary-ptrn-rest-init-obj Expect Syntax Error: "language/statements/generators/dstr/dflt-ary-ptrn-rest-init-ary.js" Expect Syntax Error: "language/statements/generators/dstr/dflt-ary-ptrn-rest-init-id.js" Expect Syntax Error: "language/statements/generators/dstr/dflt-ary-ptrn-rest-init-obj.js" -Expect Syntax Error: "language/statements/if/if-decl-else-decl-strict.js" -Expect Syntax Error: "language/statements/if/if-decl-else-stmt-strict.js" -Expect Syntax Error: "language/statements/if/if-decl-no-else-strict.js" -Expect Syntax Error: "language/statements/if/if-fun-else-fun-strict.js" -Expect Syntax Error: "language/statements/if/if-fun-else-stmt-strict.js" -Expect Syntax Error: "language/statements/if/if-fun-no-else-strict.js" -Expect Syntax Error: "language/statements/if/if-stmt-else-decl-strict.js" -Expect Syntax Error: "language/statements/if/if-stmt-else-fun-strict.js" -Expect Syntax Error: "language/statements/if/labelled-fn-stmt-first.js" -Expect Syntax Error: "language/statements/if/labelled-fn-stmt-lone.js" -Expect Syntax Error: "language/statements/if/labelled-fn-stmt-second.js" -Expect Syntax Error: "language/statements/labeled/decl-fun-strict.js" Expect Syntax Error: "language/statements/let/dstr/ary-ptrn-rest-init-ary.js" Expect Syntax Error: "language/statements/let/dstr/ary-ptrn-rest-init-id.js" Expect Syntax Error: "language/statements/let/dstr/ary-ptrn-rest-init-obj.js" @@ -414,9 +380,6 @@ Expect Syntax Error: "language/statements/variable/dstr/ary-ptrn-rest-init-ary.j Expect Syntax Error: "language/statements/variable/dstr/ary-ptrn-rest-init-id.js" Expect Syntax Error: "language/statements/variable/dstr/ary-ptrn-rest-init-obj.js" Expect Syntax Error: "language/statements/variable/dstr/obj-ptrn-elem-id-static-init-await-invalid.js" -Expect Syntax Error: "language/statements/while/decl-fun.js" -Expect Syntax Error: "language/statements/while/labelled-fn-stmt.js" -Expect Syntax Error: "language/statements/with/decl-fun.js" Expect Syntax Error: "language/statements/with/strict-fn-decl-nested-1.js" Expect Syntax Error: "language/statements/with/strict-fn-decl-nested-2.js" Expect Syntax Error: "language/statements/with/strict-fn-decl.js" @@ -1039,6 +1002,51 @@ Expect to Parse: "language/statements/function/S14_A5_T2.js" 15 │ ╰──── + × Invalid function declaration + ╭─[language/block-scope/syntax/function-declarations/in-statement-position-do-statement-while-expression.js:13:1] + 13 │ $DONOTEVALUATE(); + 14 │ do function g() {} while (false) + · ─────────────── + 15 │ + ╰──── + help: In strict mode code, functions can only be declared at top level or inside a block + + × Invalid function declaration + ╭─[language/block-scope/syntax/function-declarations/in-statement-position-for-statement.js:13:1] + 13 │ $DONOTEVALUATE(); + 14 │ for (;false;) function g() {} + · ─────────────── + 15 │ + ╰──── + help: In strict mode code, functions can only be declared at top level or inside a block + + × Invalid function declaration + ╭─[language/block-scope/syntax/function-declarations/in-statement-position-if-expression-statement-else-statement.js:14:1] + 14 │ $DONOTEVALUATE(); + 15 │ if (true) {} else function g() {} + · ─────────────── + 16 │ + ╰──── + help: In strict mode code, functions can only be declared at top level or inside a block + + × Invalid function declaration + ╭─[language/block-scope/syntax/function-declarations/in-statement-position-if-expression-statement.js:14:1] + 14 │ $DONOTEVALUATE(); + 15 │ if (true) function g() {} + · ─────────────── + 16 │ + ╰──── + help: In strict mode code, functions can only be declared at top level or inside a block + + × Invalid function declaration + ╭─[language/block-scope/syntax/function-declarations/in-statement-position-while-expression-statement.js:13:1] + 13 │ $DONOTEVALUATE(); + 14 │ while (false) function g() {} + · ─────────────── + 15 │ + ╰──── + help: In strict mode code, functions can only be declared at top level or inside a block + × Identifier `f` has already been declared ╭─[language/block-scope/syntax/redeclaration/async-function-name-redeclaration-attempt-with-async-function.js:22:1] 22 │ @@ -28145,6 +28153,14 @@ Expect to Parse: "language/statements/function/S14_A5_T2.js" 18 │ // ╰──── + × Invalid function declaration + ╭─[language/statements/do-while/decl-async-fun.js:19:1] + 19 │ + 20 │ do async function f() {} while (false) + · ───────────────────── + ╰──── + help: In strict mode code, functions can only be declared at top level or inside a block + × Async functions can only be declared at the top level or inside a block ╭─[language/statements/do-while/decl-async-fun.js:19:1] 19 │ @@ -28153,6 +28169,14 @@ Expect to Parse: "language/statements/function/S14_A5_T2.js" · ╰── Async functions can only be declared at the top level or inside a block ╰──── + × Invalid function declaration + ╭─[language/statements/do-while/decl-async-gen.js:19:1] + 19 │ + 20 │ do async function* g() {} while (false) + · ────────────────────── + ╰──── + help: In strict mode code, functions can only be declared at top level or inside a block + × Async functions can only be declared at the top level or inside a block ╭─[language/statements/do-while/decl-async-gen.js:19:1] 19 │ @@ -28178,6 +28202,22 @@ Expect to Parse: "language/statements/function/S14_A5_T2.js" ╰──── help: Wrap this declaration in a block statement + × Invalid function declaration + ╭─[language/statements/do-while/decl-fun.js:13:1] + 13 │ + 14 │ do function f() {} while (false) + · ─────────────── + ╰──── + help: In strict mode code, functions can only be declared at top level or inside a block + + × Invalid function declaration + ╭─[language/statements/do-while/decl-gen.js:14:1] + 14 │ + 15 │ do function* g() {} while (false) + · ──────────────── + ╰──── + help: In strict mode code, functions can only be declared at top level or inside a block + × Generators can only be declared at the top level or inside a block ╭─[language/statements/do-while/decl-gen.js:14:1] 14 │ @@ -28195,6 +28235,14 @@ Expect to Parse: "language/statements/function/S14_A5_T2.js" ╰──── help: Try insert a semicolon here + × Invalid function declaration + ╭─[language/statements/do-while/labelled-fn-stmt.js:17:1] + 17 │ + 18 │ do label1: label2: function f() {} while (false) + · ─────────────── + ╰──── + help: In strict mode code, functions can only be declared at top level or inside a block + × Lexical declaration cannot appear in a single-statement context ╭─[language/statements/do-while/let-array-with-newline.js:19:1] 19 │ @@ -28694,6 +28742,14 @@ Expect to Parse: "language/statements/function/S14_A5_T2.js" 20 │ break ; ╰──── + × Invalid function declaration + ╭─[language/statements/for-in/decl-async-fun.js:19:1] + 19 │ + 20 │ for (var x in {}) async function f() {} + · ───────────────────── + ╰──── + help: In strict mode code, functions can only be declared at top level or inside a block + × Async functions can only be declared at the top level or inside a block ╭─[language/statements/for-in/decl-async-fun.js:19:1] 19 │ @@ -28702,6 +28758,14 @@ Expect to Parse: "language/statements/function/S14_A5_T2.js" · ╰── Async functions can only be declared at the top level or inside a block ╰──── + × Invalid function declaration + ╭─[language/statements/for-in/decl-async-gen.js:19:1] + 19 │ + 20 │ for (var x in {}) async function* g() {} + · ────────────────────── + ╰──── + help: In strict mode code, functions can only be declared at top level or inside a block + × Async functions can only be declared at the top level or inside a block ╭─[language/statements/for-in/decl-async-gen.js:19:1] 19 │ @@ -28727,6 +28791,22 @@ Expect to Parse: "language/statements/function/S14_A5_T2.js" ╰──── help: Wrap this declaration in a block statement + × Invalid function declaration + ╭─[language/statements/for-in/decl-fun.js:13:1] + 13 │ + 14 │ for (var x in {}) function f() {} + · ─────────────── + ╰──── + help: In strict mode code, functions can only be declared at top level or inside a block + + × Invalid function declaration + ╭─[language/statements/for-in/decl-gen.js:14:1] + 14 │ + 15 │ for (var x in {}) function* g() {} + · ──────────────── + ╰──── + help: In strict mode code, functions can only be declared at top level or inside a block + × Generators can only be declared at the top level or inside a block ╭─[language/statements/for-in/decl-gen.js:14:1] 14 │ @@ -29073,6 +29153,38 @@ Expect to Parse: "language/statements/function/S14_A5_T2.js" · ──── ╰──── + × Invalid function declaration + ╭─[language/statements/for-in/labelled-fn-stmt-const.js:17:1] + 17 │ + 18 │ for (const x in {}) label1: label2: function f() {} + · ─────────────── + ╰──── + help: In strict mode code, functions can only be declared at top level or inside a block + + × Invalid function declaration + ╭─[language/statements/for-in/labelled-fn-stmt-let.js:17:1] + 17 │ + 18 │ for (let x in {}) label1: label2: function f() {} + · ─────────────── + ╰──── + help: In strict mode code, functions can only be declared at top level or inside a block + + × Invalid function declaration + ╭─[language/statements/for-in/labelled-fn-stmt-lhs.js:17:1] + 17 │ + 18 │ for (x in {}) label1: label2: function f() {} + · ─────────────── + ╰──── + help: In strict mode code, functions can only be declared at top level or inside a block + + × Invalid function declaration + ╭─[language/statements/for-in/labelled-fn-stmt-var.js:17:1] + 17 │ + 18 │ for (var x in {}) label1: label2: function f() {} + · ─────────────── + ╰──── + help: In strict mode code, functions can only be declared at top level or inside a block + × Lexical declaration cannot appear in a single-statement context ╭─[language/statements/for-in/let-array-with-newline.js:19:1] 19 │ @@ -29148,6 +29260,14 @@ Expect to Parse: "language/statements/function/S14_A5_T2.js" · ──── ╰──── + × Invalid function declaration + ╭─[language/statements/for-of/decl-async-fun.js:19:1] + 19 │ + 20 │ for (var x of []) async function f() {} + · ───────────────────── + ╰──── + help: In strict mode code, functions can only be declared at top level or inside a block + × Async functions can only be declared at the top level or inside a block ╭─[language/statements/for-of/decl-async-fun.js:19:1] 19 │ @@ -29156,6 +29276,14 @@ Expect to Parse: "language/statements/function/S14_A5_T2.js" · ╰── Async functions can only be declared at the top level or inside a block ╰──── + × Invalid function declaration + ╭─[language/statements/for-of/decl-async-gen.js:19:1] + 19 │ + 20 │ for (var x of []) async function* g() {} + · ────────────────────── + ╰──── + help: In strict mode code, functions can only be declared at top level or inside a block + × Async functions can only be declared at the top level or inside a block ╭─[language/statements/for-of/decl-async-gen.js:19:1] 19 │ @@ -29181,6 +29309,22 @@ Expect to Parse: "language/statements/function/S14_A5_T2.js" ╰──── help: Wrap this declaration in a block statement + × Invalid function declaration + ╭─[language/statements/for-of/decl-fun.js:13:1] + 13 │ + 14 │ for (var x of []) function f() {} + · ─────────────── + ╰──── + help: In strict mode code, functions can only be declared at top level or inside a block + + × Invalid function declaration + ╭─[language/statements/for-of/decl-gen.js:14:1] + 14 │ + 15 │ for (var x of []) function* g() {} + · ──────────────── + ╰──── + help: In strict mode code, functions can only be declared at top level or inside a block + × Generators can only be declared at the top level or inside a block ╭─[language/statements/for-of/decl-gen.js:14:1] 14 │ @@ -29719,6 +29863,38 @@ Expect to Parse: "language/statements/function/S14_A5_T2.js" · ╰── Expect `)` here, but found `,` ╰──── + × Invalid function declaration + ╭─[language/statements/for-of/labelled-fn-stmt-const.js:17:1] + 17 │ + 18 │ for (const x of []) label1: label2: function f() {} + · ─────────────── + ╰──── + help: In strict mode code, functions can only be declared at top level or inside a block + + × Invalid function declaration + ╭─[language/statements/for-of/labelled-fn-stmt-let.js:17:1] + 17 │ + 18 │ for (let x of []) label1: label2: function f() {} + · ─────────────── + ╰──── + help: In strict mode code, functions can only be declared at top level or inside a block + + × Invalid function declaration + ╭─[language/statements/for-of/labelled-fn-stmt-lhs.js:17:1] + 17 │ + 18 │ for (x of []) label1: label2: function f() {} + · ─────────────── + ╰──── + help: In strict mode code, functions can only be declared at top level or inside a block + + × Invalid function declaration + ╭─[language/statements/for-of/labelled-fn-stmt-var.js:17:1] + 17 │ + 18 │ for (var x of []) label1: label2: function f() {} + · ─────────────── + ╰──── + help: In strict mode code, functions can only be declared at top level or inside a block + × Lexical declaration cannot appear in a single-statement context ╭─[language/statements/for-of/let-array-with-newline.js:19:1] 19 │ @@ -29879,6 +30055,14 @@ Expect to Parse: "language/statements/function/S14_A5_T2.js" 22 │ // ╰──── + × Invalid function declaration + ╭─[language/statements/for/decl-async-fun.js:19:1] + 19 │ + 20 │ for ( ; false; ) async function f() {} + · ───────────────────── + ╰──── + help: In strict mode code, functions can only be declared at top level or inside a block + × Async functions can only be declared at the top level or inside a block ╭─[language/statements/for/decl-async-fun.js:19:1] 19 │ @@ -29887,6 +30071,14 @@ Expect to Parse: "language/statements/function/S14_A5_T2.js" · ╰── Async functions can only be declared at the top level or inside a block ╰──── + × Invalid function declaration + ╭─[language/statements/for/decl-async-gen.js:19:1] + 19 │ + 20 │ for ( ; false; ) async function* g() {} + · ────────────────────── + ╰──── + help: In strict mode code, functions can only be declared at top level or inside a block + × Async functions can only be declared at the top level or inside a block ╭─[language/statements/for/decl-async-gen.js:19:1] 19 │ @@ -29912,6 +30104,22 @@ Expect to Parse: "language/statements/function/S14_A5_T2.js" ╰──── help: Wrap this declaration in a block statement + × Invalid function declaration + ╭─[language/statements/for/decl-fun.js:13:1] + 13 │ + 14 │ for ( ; false; ) function f() {} + · ─────────────── + ╰──── + help: In strict mode code, functions can only be declared at top level or inside a block + + × Invalid function declaration + ╭─[language/statements/for/decl-gen.js:14:1] + 14 │ + 15 │ for ( ; false; ) function* g() {} + · ──────────────── + ╰──── + help: In strict mode code, functions can only be declared at top level or inside a block + × Generators can only be declared at the top level or inside a block ╭─[language/statements/for/decl-gen.js:14:1] 14 │ @@ -30034,6 +30242,38 @@ Expect to Parse: "language/statements/function/S14_A5_T2.js" 22 │ } ╰──── + × Invalid function declaration + ╭─[language/statements/for/labelled-fn-stmt-const.js:17:1] + 17 │ + 18 │ for (const x = 0; false; ) label1: label2: function f() {} + · ─────────────── + ╰──── + help: In strict mode code, functions can only be declared at top level or inside a block + + × Invalid function declaration + ╭─[language/statements/for/labelled-fn-stmt-expr.js:17:1] + 17 │ + 18 │ for ( ; false; ) label1: label2: function f() {} + · ─────────────── + ╰──── + help: In strict mode code, functions can only be declared at top level or inside a block + + × Invalid function declaration + ╭─[language/statements/for/labelled-fn-stmt-let.js:17:1] + 17 │ + 18 │ for (let x; false; ) label1: label2: function f() {} + · ─────────────── + ╰──── + help: In strict mode code, functions can only be declared at top level or inside a block + + × Invalid function declaration + ╭─[language/statements/for/labelled-fn-stmt-var.js:17:1] + 17 │ + 18 │ for (var x; false; ) label1: label2: function f() {} + · ─────────────── + ╰──── + help: In strict mode code, functions can only be declared at top level or inside a block + × Lexical declaration cannot appear in a single-statement context ╭─[language/statements/for/let-array-with-newline.js:19:1] 19 │ @@ -30717,6 +30957,22 @@ Expect to Parse: "language/statements/function/S14_A5_T2.js" 18 │ // ╰──── + × Invalid function declaration + ╭─[language/statements/if/if-async-fun-else-async-fun.js:19:1] + 19 │ + 20 │ if (true) async function f() { } else async function _f() {} + · ─────────────────────── + ╰──── + help: In strict mode code, functions can only be declared at top level or inside a block + + × Invalid function declaration + ╭─[language/statements/if/if-async-fun-else-async-fun.js:19:1] + 19 │ + 20 │ if (true) async function f() { } else async function _f() {} + · ────────────────────── + ╰──── + help: In strict mode code, functions can only be declared at top level or inside a block + × Async functions can only be declared at the top level or inside a block ╭─[language/statements/if/if-async-fun-else-async-fun.js:19:1] 19 │ @@ -30733,6 +30989,14 @@ Expect to Parse: "language/statements/function/S14_A5_T2.js" · ╰── Async functions can only be declared at the top level or inside a block ╰──── + × Invalid function declaration + ╭─[language/statements/if/if-async-fun-else-stmt.js:19:1] + 19 │ + 20 │ if (true) async function f() { } else ; + · ─────────────────────── + ╰──── + help: In strict mode code, functions can only be declared at top level or inside a block + × Async functions can only be declared at the top level or inside a block ╭─[language/statements/if/if-async-fun-else-stmt.js:19:1] 19 │ @@ -30741,6 +31005,14 @@ Expect to Parse: "language/statements/function/S14_A5_T2.js" · ╰── Async functions can only be declared at the top level or inside a block ╰──── + × Invalid function declaration + ╭─[language/statements/if/if-async-fun-no-else.js:19:1] + 19 │ + 20 │ if (true) async function f() { } + · ─────────────────────── + ╰──── + help: In strict mode code, functions can only be declared at top level or inside a block + × Async functions can only be declared at the top level or inside a block ╭─[language/statements/if/if-async-fun-no-else.js:19:1] 19 │ @@ -30749,6 +31021,22 @@ Expect to Parse: "language/statements/function/S14_A5_T2.js" · ╰── Async functions can only be declared at the top level or inside a block ╰──── + × Invalid function declaration + ╭─[language/statements/if/if-async-gen-else-async-gen.js:19:1] + 19 │ + 20 │ if (true) async function* f() { } else async function* _f() {} + · ──────────────────────── + ╰──── + help: In strict mode code, functions can only be declared at top level or inside a block + + × Invalid function declaration + ╭─[language/statements/if/if-async-gen-else-async-gen.js:19:1] + 19 │ + 20 │ if (true) async function* f() { } else async function* _f() {} + · ─────────────────────── + ╰──── + help: In strict mode code, functions can only be declared at top level or inside a block + × Async functions can only be declared at the top level or inside a block ╭─[language/statements/if/if-async-gen-else-async-gen.js:19:1] 19 │ @@ -30765,6 +31053,14 @@ Expect to Parse: "language/statements/function/S14_A5_T2.js" · ╰── Async functions can only be declared at the top level or inside a block ╰──── + × Invalid function declaration + ╭─[language/statements/if/if-async-gen-else-stmt.js:19:1] + 19 │ + 20 │ if (true) async function* f() { } else ; + · ──────────────────────── + ╰──── + help: In strict mode code, functions can only be declared at top level or inside a block + × Async functions can only be declared at the top level or inside a block ╭─[language/statements/if/if-async-gen-else-stmt.js:19:1] 19 │ @@ -30773,6 +31069,14 @@ Expect to Parse: "language/statements/function/S14_A5_T2.js" · ╰── Async functions can only be declared at the top level or inside a block ╰──── + × Invalid function declaration + ╭─[language/statements/if/if-async-gen-no-else.js:19:1] + 19 │ + 20 │ if (true) async function* f() { } + · ──────────────────────── + ╰──── + help: In strict mode code, functions can only be declared at top level or inside a block + × Async functions can only be declared at the top level or inside a block ╭─[language/statements/if/if-async-gen-no-else.js:19:1] 19 │ @@ -30849,6 +31153,86 @@ Expect to Parse: "language/statements/function/S14_A5_T2.js" ╰──── help: Wrap this declaration in a block statement + × Invalid function declaration + ╭─[language/statements/if/if-decl-else-decl-strict.js:23:1] + 23 │ + 24 │ if (true) function f() { } else function _f() {} + · ───────────────── + ╰──── + help: In strict mode code, functions can only be declared at top level or inside a block + + × Invalid function declaration + ╭─[language/statements/if/if-decl-else-decl-strict.js:23:1] + 23 │ + 24 │ if (true) function f() { } else function _f() {} + · ──────────────── + ╰──── + help: In strict mode code, functions can only be declared at top level or inside a block + + × Invalid function declaration + ╭─[language/statements/if/if-decl-else-stmt-strict.js:23:1] + 23 │ + 24 │ if (true) function f() { } else ; + · ───────────────── + ╰──── + help: In strict mode code, functions can only be declared at top level or inside a block + + × Invalid function declaration + ╭─[language/statements/if/if-decl-no-else-strict.js:23:1] + 23 │ + 24 │ if (true) function f() { } + · ───────────────── + ╰──── + help: In strict mode code, functions can only be declared at top level or inside a block + + × Invalid function declaration + ╭─[language/statements/if/if-fun-else-fun-strict.js:24:1] + 24 │ + 25 │ if (true) function f() {} else function _f() {} + · ─────────────── + ╰──── + help: In strict mode code, functions can only be declared at top level or inside a block + + × Invalid function declaration + ╭─[language/statements/if/if-fun-else-fun-strict.js:24:1] + 24 │ + 25 │ if (true) function f() {} else function _f() {} + · ──────────────── + ╰──── + help: In strict mode code, functions can only be declared at top level or inside a block + + × Invalid function declaration + ╭─[language/statements/if/if-fun-else-stmt-strict.js:24:1] + 24 │ + 25 │ if (true) function f() {} else ; + · ─────────────── + ╰──── + help: In strict mode code, functions can only be declared at top level or inside a block + + × Invalid function declaration + ╭─[language/statements/if/if-fun-no-else-strict.js:24:1] + 24 │ + 25 │ if (true) function f() {} + · ─────────────── + ╰──── + help: In strict mode code, functions can only be declared at top level or inside a block + + × Invalid function declaration + ╭─[language/statements/if/if-gen-else-gen.js:14:1] + 14 │ + 15 │ if (true) function* g() { } else function* _g() {} + · ────────────────── + ╰──── + help: In strict mode code, functions can only be declared at top level or inside a block + + × Invalid function declaration + ╭─[language/statements/if/if-gen-else-gen.js:14:1] + 14 │ + 15 │ if (true) function* g() { } else function* _g() {} + · ───────────────── + ╰──── + help: In strict mode code, functions can only be declared at top level or inside a block + × Generators can only be declared at the top level or inside a block ╭─[language/statements/if/if-gen-else-gen.js:14:1] 14 │ @@ -30865,6 +31249,14 @@ Expect to Parse: "language/statements/function/S14_A5_T2.js" · ╰── Generators can only be declared at the top level or inside a block ╰──── + × Invalid function declaration + ╭─[language/statements/if/if-gen-else-stmt.js:14:1] + 14 │ + 15 │ if (true) function* g() { } else ; + · ────────────────── + ╰──── + help: In strict mode code, functions can only be declared at top level or inside a block + × Generators can only be declared at the top level or inside a block ╭─[language/statements/if/if-gen-else-stmt.js:14:1] 14 │ @@ -30873,6 +31265,14 @@ Expect to Parse: "language/statements/function/S14_A5_T2.js" · ╰── Generators can only be declared at the top level or inside a block ╰──── + × Invalid function declaration + ╭─[language/statements/if/if-gen-no-else.js:14:1] + 14 │ + 15 │ if (true) function* g() { } + · ────────────────── + ╰──── + help: In strict mode code, functions can only be declared at top level or inside a block + × Generators can only be declared at the top level or inside a block ╭─[language/statements/if/if-gen-no-else.js:14:1] 14 │ @@ -30908,6 +31308,14 @@ Expect to Parse: "language/statements/function/S14_A5_T2.js" ╰──── help: Try insert a semicolon here + × Invalid function declaration + ╭─[language/statements/if/if-stmt-else-async-fun.js:19:1] + 19 │ + 20 │ if (false) ; else async function f() { } + · ─────────────────────── + ╰──── + help: In strict mode code, functions can only be declared at top level or inside a block + × Async functions can only be declared at the top level or inside a block ╭─[language/statements/if/if-stmt-else-async-fun.js:19:1] 19 │ @@ -30916,6 +31324,14 @@ Expect to Parse: "language/statements/function/S14_A5_T2.js" · ╰── Async functions can only be declared at the top level or inside a block ╰──── + × Invalid function declaration + ╭─[language/statements/if/if-stmt-else-async-gen.js:19:1] + 19 │ + 20 │ if (false) ; else async function* f() { } + · ──────────────────────── + ╰──── + help: In strict mode code, functions can only be declared at top level or inside a block + × Async functions can only be declared at the top level or inside a block ╭─[language/statements/if/if-stmt-else-async-gen.js:19:1] 19 │ @@ -30941,6 +31357,30 @@ Expect to Parse: "language/statements/function/S14_A5_T2.js" ╰──── help: Wrap this declaration in a block statement + × Invalid function declaration + ╭─[language/statements/if/if-stmt-else-decl-strict.js:27:1] + 27 │ + 28 │ if (false) ; else function f() { } + · ───────────────── + ╰──── + help: In strict mode code, functions can only be declared at top level or inside a block + + × Invalid function declaration + ╭─[language/statements/if/if-stmt-else-fun-strict.js:28:1] + 28 │ + 29 │ if (false) ; else function f() {} + · ─────────────── + ╰──── + help: In strict mode code, functions can only be declared at top level or inside a block + + × Invalid function declaration + ╭─[language/statements/if/if-stmt-else-gen.js:14:1] + 14 │ + 15 │ if (false) ; else function* g() { } + · ────────────────── + ╰──── + help: In strict mode code, functions can only be declared at top level or inside a block + × Generators can only be declared at the top level or inside a block ╭─[language/statements/if/if-stmt-else-gen.js:14:1] 14 │ @@ -30958,6 +31398,30 @@ Expect to Parse: "language/statements/function/S14_A5_T2.js" ╰──── help: Try insert a semicolon here + × Invalid function declaration + ╭─[language/statements/if/labelled-fn-stmt-first.js:28:1] + 28 │ + 29 │ if (false) label1: label2: function test262() {} else ; + · ───────────────────── + ╰──── + help: In strict mode code, functions can only be declared at top level or inside a block + + × Invalid function declaration + ╭─[language/statements/if/labelled-fn-stmt-lone.js:28:1] + 28 │ + 29 │ if (false) label1: label2: function test262() {} + · ───────────────────── + ╰──── + help: In strict mode code, functions can only be declared at top level or inside a block + + × Invalid function declaration + ╭─[language/statements/if/labelled-fn-stmt-second.js:28:1] + 28 │ + 29 │ if (true) ; else label1: label2: function test262() {} + · ───────────────────── + ╰──── + help: In strict mode code, functions can only be declared at top level or inside a block + × Lexical declaration cannot appear in a single-statement context ╭─[language/statements/if/let-array-with-newline.js:19:1] 19 │ @@ -30979,6 +31443,14 @@ Expect to Parse: "language/statements/function/S14_A5_T2.js" 26 │ } ╰──── + × Invalid function declaration + ╭─[language/statements/labeled/decl-async-function.js:19:1] + 19 │ + 20 │ label: async function f() {} + · ───────────────────── + ╰──── + help: In strict mode code, functions can only be declared at top level or inside a block + × Async functions can only be declared at the top level or inside a block ╭─[language/statements/labeled/decl-async-function.js:19:1] 19 │ @@ -30987,6 +31459,14 @@ Expect to Parse: "language/statements/function/S14_A5_T2.js" · ╰── Async functions can only be declared at the top level or inside a block ╰──── + × Invalid function declaration + ╭─[language/statements/labeled/decl-async-generator.js:19:1] + 19 │ + 20 │ label: async function* g() {} + · ────────────────────── + ╰──── + help: In strict mode code, functions can only be declared at top level or inside a block + × Async functions can only be declared at the top level or inside a block ╭─[language/statements/labeled/decl-async-generator.js:19:1] 19 │ @@ -31012,6 +31492,22 @@ Expect to Parse: "language/statements/function/S14_A5_T2.js" ╰──── help: Wrap this declaration in a block statement + × Invalid function declaration + ╭─[language/statements/labeled/decl-fun-strict.js:16:1] + 16 │ + 17 │ label: function g() {} + · ─────────────── + ╰──── + help: In strict mode code, functions can only be declared at top level or inside a block + + × Invalid function declaration + ╭─[language/statements/labeled/decl-gen.js:14:1] + 14 │ + 15 │ label: function* g() {} + · ──────────────── + ╰──── + help: In strict mode code, functions can only be declared at top level or inside a block + × Generators can only be declared at the top level or inside a block ╭─[language/statements/labeled/decl-gen.js:14:1] 14 │ @@ -32660,6 +33156,14 @@ Expect to Parse: "language/statements/function/S14_A5_T2.js" 18 │ // ╰──── + × Invalid function declaration + ╭─[language/statements/while/decl-async-fun.js:19:1] + 19 │ + 20 │ while (false) async function f() {} + · ───────────────────── + ╰──── + help: In strict mode code, functions can only be declared at top level or inside a block + × Async functions can only be declared at the top level or inside a block ╭─[language/statements/while/decl-async-fun.js:19:1] 19 │ @@ -32668,6 +33172,14 @@ Expect to Parse: "language/statements/function/S14_A5_T2.js" · ╰── Async functions can only be declared at the top level or inside a block ╰──── + × Invalid function declaration + ╭─[language/statements/while/decl-async-gen.js:19:1] + 19 │ + 20 │ while (false) async function* g() {} + · ────────────────────── + ╰──── + help: In strict mode code, functions can only be declared at top level or inside a block + × Async functions can only be declared at the top level or inside a block ╭─[language/statements/while/decl-async-gen.js:19:1] 19 │ @@ -32693,6 +33205,22 @@ Expect to Parse: "language/statements/function/S14_A5_T2.js" ╰──── help: Wrap this declaration in a block statement + × Invalid function declaration + ╭─[language/statements/while/decl-fun.js:13:1] + 13 │ + 14 │ while (false) function f() {} + · ─────────────── + ╰──── + help: In strict mode code, functions can only be declared at top level or inside a block + + × Invalid function declaration + ╭─[language/statements/while/decl-gen.js:14:1] + 14 │ + 15 │ while (false) function* g() {} + · ──────────────── + ╰──── + help: In strict mode code, functions can only be declared at top level or inside a block + × Generators can only be declared at the top level or inside a block ╭─[language/statements/while/decl-gen.js:14:1] 14 │ @@ -32710,6 +33238,14 @@ Expect to Parse: "language/statements/function/S14_A5_T2.js" ╰──── help: Try insert a semicolon here + × Invalid function declaration + ╭─[language/statements/while/labelled-fn-stmt.js:17:1] + 17 │ + 18 │ while (false) label1: label2: function f() {} + · ─────────────── + ╰──── + help: In strict mode code, functions can only be declared at top level or inside a block + × Lexical declaration cannot appear in a single-statement context ╭─[language/statements/while/let-array-with-newline.js:19:1] 19 │ @@ -32726,6 +33262,14 @@ Expect to Parse: "language/statements/function/S14_A5_T2.js" · ──── ╰──── + × Invalid function declaration + ╭─[language/statements/with/decl-async-fun.js:20:1] + 20 │ + 21 │ with ({}) async function f() {} + · ───────────────────── + ╰──── + help: In non-strict mode code, functions can only be declared at top level, inside a block, or as the body of an if statement + × Async functions can only be declared at the top level or inside a block ╭─[language/statements/with/decl-async-fun.js:20:1] 20 │ @@ -32734,6 +33278,14 @@ Expect to Parse: "language/statements/function/S14_A5_T2.js" · ╰── Async functions can only be declared at the top level or inside a block ╰──── + × Invalid function declaration + ╭─[language/statements/with/decl-async-gen.js:20:1] + 20 │ + 21 │ with ({}) async function* g() {} + · ────────────────────── + ╰──── + help: In non-strict mode code, functions can only be declared at top level, inside a block, or as the body of an if statement + × Async functions can only be declared at the top level or inside a block ╭─[language/statements/with/decl-async-gen.js:20:1] 20 │ @@ -32759,6 +33311,22 @@ Expect to Parse: "language/statements/function/S14_A5_T2.js" ╰──── help: Wrap this declaration in a block statement + × Invalid function declaration + ╭─[language/statements/with/decl-fun.js:14:1] + 14 │ + 15 │ with ({}) function f() {} + · ─────────────── + ╰──── + help: In non-strict mode code, functions can only be declared at top level, inside a block, or as the body of an if statement + + × Invalid function declaration + ╭─[language/statements/with/decl-gen.js:15:1] + 15 │ + 16 │ with ({}) function* g() {} + · ──────────────── + ╰──── + help: In non-strict mode code, functions can only be declared at top level, inside a block, or as the body of an if statement + × Generators can only be declared at the top level or inside a block ╭─[language/statements/with/decl-gen.js:15:1] 15 │ @@ -32783,6 +33351,14 @@ Expect to Parse: "language/statements/function/S14_A5_T2.js" · ──── ╰──── + × Invalid function declaration + ╭─[language/statements/with/labelled-fn-stmt.js:25:1] + 25 │ + 26 │ with ({}) label1: label2: function test262() {} + · ───────────────────── + ╰──── + help: In strict mode code, functions can only be declared at top level or inside a block + × Lexical declaration cannot appear in a single-statement context ╭─[language/statements/with/let-array-with-newline.js:21:1] 21 │ if (false) {