diff --git a/crates/oxc_linter/src/rules/early_error/javascript.rs b/crates/oxc_linter/src/rules/early_error/javascript.rs index 7a74ba584..a0269c61b 100644 --- a/crates/oxc_linter/src/rules/early_error/javascript.rs +++ b/crates/oxc_linter/src/rules/early_error/javascript.rs @@ -32,6 +32,8 @@ impl Rule for EarlyErrorJavaScript { AstKind::BreakStatement(stmt) => check_break_statement(stmt, node, ctx), AstKind::ContinueStatement(stmt) => check_continue_statement(stmt, node, ctx), AstKind::LabeledStatement(stmt) => check_labeled_statement(stmt, node, ctx), + AstKind::ForInStatement(stmt) => check_for_statement_left(&stmt.left, true, node, ctx), + AstKind::ForOfStatement(stmt) => check_for_statement_left(&stmt.left, false, node, ctx), AstKind::Class(class) => check_class(class, ctx), AstKind::Super(sup) => check_super(sup, node, ctx), AstKind::Property(prop) => check_property(prop, ctx), @@ -448,6 +450,48 @@ fn check_labeled_statement<'a>(stmt: &LabeledStatement, node: &AstNode<'a>, ctx: } } +fn check_for_statement_left<'a>( + left: &ForStatementLeft, + is_for_in: bool, + node: &AstNode<'a>, + ctx: &LintContext<'a>, +) { + #[derive(Debug, Error, Diagnostic)] + #[error("Only a single declaration is allowed in a `for...{0}` statement")] + #[diagnostic()] + struct MultipleDeclarationInForLoopHead(&'static str, #[label] Span); + + #[derive(Debug, Error, Diagnostic)] + #[error("{0} loop variable declaration may not have an initializer")] + #[diagnostic()] + struct UnexpectedInitializerInForLoopHead(&'static str, #[label] Span); + + let ForStatementLeft::VariableDeclaration(decl) = left else { return }; + + // initializer is not allowed for for-in / for-of + if decl.declarations.len() > 1 { + return ctx.diagnostic(MultipleDeclarationInForLoopHead( + if is_for_in { "in" } else { "of" }, + decl.span, + )); + } + + let strict_mode = ctx.strict_mode(node); + for declarator in &decl.declarations { + if declarator.init.is_some() + && (strict_mode + || !is_for_in + || decl.kind.is_lexical() + || !matches!(declarator.id.kind, BindingPatternKind::BindingIdentifier(_))) + { + return ctx.diagnostic(UnexpectedInitializerInForLoopHead( + if is_for_in { "for-in" } else { "for-of" }, + decl.span, + )); + } + } +} + fn check_class(class: &Class, ctx: &LintContext) { #[derive(Debug, Error, Diagnostic)] #[error("Multiple constructor implementations are not allowed.")] diff --git a/tasks/coverage/babel.snap b/tasks/coverage/babel.snap index a5e3c767a..14a1fcd60 100644 --- a/tasks/coverage/babel.snap +++ b/tasks/coverage/babel.snap @@ -1,7 +1,7 @@ Babel Summary: AST Parsed : 2053/2069 (99.23%) Positive Passed: 2053/2069 (99.23%) -Negative Passed: 1000/1502 (66.58%) +Negative Passed: 1014/1502 (67.51%) 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" @@ -31,7 +31,6 @@ 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/415/input.js" Expect Syntax Error: "core/uncategorised/427/input.js" Expect Syntax Error: "core/uncategorised/454/input.js" Expect Syntax Error: "core/uncategorised/466/input.js" @@ -100,11 +99,7 @@ Expect Syntax Error: "es2015/destructuring/error-operator-for-default/input.js" Expect Syntax Error: "es2015/duplicate-proto/in-new-expression/input.js" Expect Syntax Error: "es2015/duplicate-proto/with-assignment-expression/input.js" Expect Syntax Error: "es2015/duplicate-proto/without-assignment-expression/input.js" -Expect Syntax Error: "es2015/for-in/const-initializer/input.js" -Expect Syntax Error: "es2015/for-in/let-initializer/input.js" Expect Syntax Error: "es2015/for-in/strict-initializer/input.js" -Expect Syntax Error: "es2015/for-in/var-arraybindingpattern-initializer/input.js" -Expect Syntax Error: "es2015/for-in/var-objectbindingpattern-initializer/input.js" Expect Syntax Error: "es2015/for-of/invalid-let-as-identifier/input.js" Expect Syntax Error: "es2015/let/let-as-identifier-strict-fail/input.js" Expect Syntax Error: "es2015/meta-properties/invalid-arrow-function/input.js" @@ -124,15 +119,12 @@ Expect Syntax Error: "es2015/uncategorised/.191/input.js" Expect Syntax Error: "es2015/uncategorised/.260/input.js" Expect Syntax Error: "es2015/uncategorised/.335/input.js" Expect Syntax Error: "es2015/uncategorised/.343/input.js" -Expect Syntax Error: "es2015/uncategorised/109/input.js" Expect Syntax Error: "es2015/uncategorised/166/input.js" Expect Syntax Error: "es2015/uncategorised/220/input.js" Expect Syntax Error: "es2015/uncategorised/227/input.js" Expect Syntax Error: "es2015/uncategorised/228/input.js" Expect Syntax Error: "es2015/uncategorised/233/input.js" Expect Syntax Error: "es2015/uncategorised/234/input.js" -Expect Syntax Error: "es2015/uncategorised/235/input.js" -Expect Syntax Error: "es2015/uncategorised/236/input.js" Expect Syntax Error: "es2015/uncategorised/242/input.js" Expect Syntax Error: "es2015/uncategorised/243/input.js" Expect Syntax Error: "es2015/uncategorised/244/input.js" @@ -231,9 +223,6 @@ Expect Syntax Error: "esprima/es2015-arrow-function/invalid-duplicated-params/in Expect Syntax Error: "esprima/es2015-arrow-function/invalid-param-strict-mode/input.js" Expect Syntax Error: "esprima/es2015-class/.migrated_0026/input.js" Expect Syntax Error: "esprima/es2015-export-declaration/invalid-export-named-default/input.js" -Expect Syntax Error: "esprima/es2015-for-of/invalid-const-init/input.js" -Expect Syntax Error: "esprima/es2015-for-of/invalid-let-init/input.js" -Expect Syntax Error: "esprima/es2015-for-of/invalid-var-init/input.js" Expect Syntax Error: "esprima/es2015-generator/.generator-parameter-binding-property-reserved/input.js" Expect Syntax Error: "esprima/es2015-generator/generator-method-with-invalid-computed-name/input.js" Expect Syntax Error: "esprima/es2015-generator/generator-parameter-binding-element/input.js" @@ -245,8 +234,6 @@ Expect Syntax Error: "esprima/es2015-generator/generator-parameter-invalid-compu Expect Syntax Error: "esprima/es2015-identifier/.invalid_function_wait/input.js" Expect Syntax Error: "esprima/es2015-identifier/invalid_expression_await/input.js" Expect Syntax Error: "esprima/es2015-identifier/invalid_var_await/input.js" -Expect Syntax Error: "esprima/es2015-lexical-declaration/invalid_const_forin/input.js" -Expect Syntax Error: "esprima/es2015-lexical-declaration/invalid_let_forin/input.js" Expect Syntax Error: "esprima/es2015-meta-property/invalid-new-target/input.js" Expect Syntax Error: "esprima/es2015-meta-property/unknown-property/input.js" Expect Syntax Error: "esprima/es2015-object-initialiser/invalid-proto-getter-literal-identifier/input.js" @@ -301,7 +288,6 @@ Expect Syntax Error: "esprima/invalid-syntax/migrated_0093/input.js" Expect Syntax Error: "esprima/invalid-syntax/migrated_0094/input.js" Expect Syntax Error: "esprima/invalid-syntax/migrated_0100/input.js" Expect Syntax Error: "esprima/invalid-syntax/migrated_0101/input.js" -Expect Syntax Error: "esprima/invalid-syntax/migrated_0123/input.js" Expect Syntax Error: "esprima/invalid-syntax/migrated_0143/input.js" Expect Syntax Error: "esprima/invalid-syntax/migrated_0171/input.js" Expect Syntax Error: "esprima/invalid-syntax/migrated_0183/input.js" @@ -1658,6 +1644,12 @@ Expect to Parse: "typescript/types/const-type-parameters/input.ts" · ─ ╰──── + × Only a single declaration is allowed in a `for...in` statement + ╭─[core/uncategorised/415/input.js:1:1] + 1 │ for (var i, i2 in {}); + · ───────── + ╰──── + × Expect token ╭─[core/uncategorised/416/input.js:1:1] 1 │ for ((i in {})); @@ -2343,6 +2335,30 @@ Expect to Parse: "typescript/types/const-type-parameters/input.ts" · ───── ╰──── + × for-in loop variable declaration may not have an initializer + ╭─[es2015/for-in/const-initializer/input.js:1:1] + 1 │ for (const a = 0 in {}); + · ─────────── + ╰──── + + × for-in loop variable declaration may not have an initializer + ╭─[es2015/for-in/let-initializer/input.js:1:1] + 1 │ for (let a = 0 in {}); + · ───────── + ╰──── + + × for-in loop variable declaration may not have an initializer + ╭─[es2015/for-in/var-arraybindingpattern-initializer/input.js:1:1] + 1 │ for (var [a] = 0 in {}); + · ─────────── + ╰──── + + × for-in loop variable declaration may not have an initializer + ╭─[es2015/for-in/var-objectbindingpattern-initializer/input.js:1:1] + 1 │ for (var {a} = 0 in {}); + · ─────────── + ╰──── + × Unexpected token ╭─[es2015/for-of/bare-initializer/input.js:1:1] 1 │ var a; @@ -2901,6 +2917,12 @@ Expect to Parse: "typescript/types/const-type-parameters/input.ts" · ╰── A 'set' accessor must have exactly one parameter. ╰──── + × for-of loop variable declaration may not have an initializer + ╭─[es2015/uncategorised/109/input.js:1:1] + 1 │ for (var x = 42 of list) process(x); + · ────────── + ╰──── + × 'super' can only be referenced in a derived class. ╭─[es2015/uncategorised/123/input.js:1:1] 1 │ "use strict"; (class A {constructor() { super() }}) @@ -3153,6 +3175,18 @@ Expect to Parse: "typescript/types/const-type-parameters/input.ts" · ─────── ╰──── + × for-in loop variable declaration may not have an initializer + ╭─[es2015/uncategorised/235/input.js:1:1] + 1 │ for (let x = 42 in list) process(x); + · ────────── + ╰──── + + × for-of loop variable declaration may not have an initializer + ╭─[es2015/uncategorised/236/input.js:1:1] + 1 │ for (let x = 42 of list) process(x); + · ────────── + ╰──── + × Expect token ╭─[es2015/uncategorised/237/input.js:1:1] 1 │ import foo @@ -6002,12 +6036,30 @@ Expect to Parse: "typescript/types/const-type-parameters/input.ts" ╰──── help: Try insert a semicolon here + × for-of loop variable declaration may not have an initializer + ╭─[esprima/es2015-for-of/invalid-const-init/input.js:1:1] + 1 │ for (const x = 1 of y); + · ─────────── + ╰──── + + × for-of loop variable declaration may not have an initializer + ╭─[esprima/es2015-for-of/invalid-let-init/input.js:1:1] + 1 │ for (let x = 1 of y); + · ───────── + ╰──── + × Unexpected token ╭─[esprima/es2015-for-of/invalid-lhs-init/input.js:1:1] 1 │ for (this of that); · ──── ╰──── + × for-of loop variable declaration may not have an initializer + ╭─[esprima/es2015-for-of/invalid-var-init/input.js:1:1] + 1 │ for (var x = 1 of y); + · ───────── + ╰──── + × Expect token ╭─[esprima/es2015-for-of/unexpected-number/input.js:1:1] 1 │ for (const of 42); @@ -6166,6 +6218,18 @@ Expect to Parse: "typescript/types/const-type-parameters/input.ts" · ╰── Missing initializer in destructuring declaration ╰──── + × for-in loop variable declaration may not have an initializer + ╭─[esprima/es2015-lexical-declaration/invalid_const_forin/input.js:1:1] + 1 │ for (const x = 0 in y){} + · ─────────── + ╰──── + + × for-in loop variable declaration may not have an initializer + ╭─[esprima/es2015-lexical-declaration/invalid_let_forin/input.js:1:1] + 1 │ for (let x = 0 in y){} + · ───────── + ╰──── + × Unexpected token ╭─[esprima/es2015-meta-property/invalid-dots/input.js:1:1] 1 │ var x = function() { y = new..target; } @@ -7193,6 +7257,12 @@ Expect to Parse: "typescript/types/const-type-parameters/input.ts" · ▲ ╰──── + × Only a single declaration is allowed in a `for...in` statement + ╭─[esprima/invalid-syntax/migrated_0123/input.js:1:1] + 1 │ for (var i, i2 in {}); + · ───────── + ╰──── + × Expect token ╭─[esprima/invalid-syntax/migrated_0124/input.js:1:1] 1 │ for ((i in {})); diff --git a/tasks/coverage/test262.snap b/tasks/coverage/test262.snap index c14b847ad..5babf2fa0 100644 --- a/tasks/coverage/test262.snap +++ b/tasks/coverage/test262.snap @@ -1,17 +1,7 @@ Test262 Summary: AST Parsed : 44015/44034 (99.96%) Positive Passed: 44015/44034 (99.96%) -Negative Passed: 2962/3917 (75.62%) -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" -Expect Syntax Error: "annexB/language/statements/for-in/var-arraybindingpattern-initializer.js" -Expect Syntax Error: "annexB/language/statements/for-in/var-objectbindingpattern-initializer.js" -Expect Syntax Error: "language/block-scope/syntax/for-in/disallow-initialization-assignment.js" -Expect Syntax Error: "language/block-scope/syntax/for-in/disallow-multiple-lexical-bindings-with-and-without-initializer.js" -Expect Syntax Error: "language/block-scope/syntax/for-in/disallow-multiple-lexical-bindings-with-initializer.js" -Expect Syntax Error: "language/block-scope/syntax/for-in/disallow-multiple-lexical-bindings-without-and-with-initializer.js" -Expect Syntax Error: "language/block-scope/syntax/for-in/disallow-multiple-lexical-bindings.js" +Negative Passed: 2993/3917 (76.41%) 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" @@ -757,65 +747,44 @@ Expect Syntax Error: "language/statements/for-await-of/async-func-dstr-var-ary-p Expect Syntax Error: "language/statements/for-await-of/async-func-dstr-var-async-ary-ptrn-rest-init-ary.js" Expect Syntax Error: "language/statements/for-await-of/async-func-dstr-var-async-ary-ptrn-rest-init-id.js" Expect Syntax Error: "language/statements/for-await-of/async-func-dstr-var-async-ary-ptrn-rest-init-obj.js" -Expect Syntax Error: "language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-init-err.js" Expect Syntax Error: "language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-rest-init-ary.js" Expect Syntax Error: "language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-rest-init-id.js" Expect Syntax Error: "language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-rest-init-obj.js" Expect Syntax Error: "language/statements/for-await-of/async-gen-dstr-const-async-ary-ptrn-rest-init-ary.js" Expect Syntax Error: "language/statements/for-await-of/async-gen-dstr-const-async-ary-ptrn-rest-init-id.js" Expect Syntax Error: "language/statements/for-await-of/async-gen-dstr-const-async-ary-ptrn-rest-init-obj.js" -Expect Syntax Error: "language/statements/for-await-of/async-gen-dstr-const-obj-ptrn-init-err.js" -Expect Syntax Error: "language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-init-err.js" Expect Syntax Error: "language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-rest-init-ary.js" Expect Syntax Error: "language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-rest-init-id.js" Expect Syntax Error: "language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-rest-init-obj.js" Expect Syntax Error: "language/statements/for-await-of/async-gen-dstr-let-async-ary-ptrn-rest-init-ary.js" Expect Syntax Error: "language/statements/for-await-of/async-gen-dstr-let-async-ary-ptrn-rest-init-id.js" Expect Syntax Error: "language/statements/for-await-of/async-gen-dstr-let-async-ary-ptrn-rest-init-obj.js" -Expect Syntax Error: "language/statements/for-await-of/async-gen-dstr-let-obj-ptrn-init-err.js" -Expect Syntax Error: "language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-init-err.js" Expect Syntax Error: "language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-rest-init-ary.js" Expect Syntax Error: "language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-rest-init-id.js" Expect Syntax Error: "language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-rest-init-obj.js" 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-await-of/async-gen-dstr-var-obj-ptrn-init-err.js" -Expect Syntax Error: "language/statements/for-await-of/head-const-init.js" -Expect Syntax Error: "language/statements/for-await-of/head-let-init.js" -Expect Syntax Error: "language/statements/for-await-of/head-var-init.js" Expect Syntax Error: "language/statements/for-in/decl-fun.js" Expect Syntax Error: "language/statements/for-in/dstr/obj-id-identifier-yield-expr.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-in/var-arguments-fn-strict-init.js" Expect Syntax Error: "language/statements/for-in/var-arguments-fn-strict.js" -Expect Syntax Error: "language/statements/for-in/var-arguments-strict-init.js" Expect Syntax Error: "language/statements/for-in/var-arguments-strict.js" -Expect Syntax Error: "language/statements/for-in/var-eval-strict-init.js" Expect Syntax Error: "language/statements/for-in/var-eval-strict.js" Expect Syntax Error: "language/statements/for-of/decl-fun.js" -Expect Syntax Error: "language/statements/for-of/dstr/const-ary-ptrn-init-err.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" -Expect Syntax Error: "language/statements/for-of/dstr/const-obj-ptrn-init-err.js" -Expect Syntax Error: "language/statements/for-of/dstr/let-ary-ptrn-init-err.js" Expect Syntax Error: "language/statements/for-of/dstr/let-ary-ptrn-rest-init-ary.js" Expect Syntax Error: "language/statements/for-of/dstr/let-ary-ptrn-rest-init-id.js" Expect Syntax Error: "language/statements/for-of/dstr/let-ary-ptrn-rest-init-obj.js" -Expect Syntax Error: "language/statements/for-of/dstr/let-obj-ptrn-init-err.js" Expect Syntax Error: "language/statements/for-of/dstr/obj-id-identifier-yield-expr.js" -Expect Syntax Error: "language/statements/for-of/dstr/var-ary-ptrn-init-err.js" 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/dstr/var-obj-ptrn-init-err.js" -Expect Syntax Error: "language/statements/for-of/head-const-init.js" -Expect Syntax Error: "language/statements/for-of/head-let-init.js" -Expect Syntax Error: "language/statements/for-of/head-var-init.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" @@ -1187,6 +1156,44 @@ Expect to Parse: "language/statements/function/S14_A5_T2.js" · ───── ╰──── + × for-in loop variable declaration may not have an initializer + ╭─[annexB/language/statements/for-in/const-initializer.js:13:1] + 13 │ + 14 │ for (const a = 0 in {}); + · ─────────── + 15 │ + ╰──── + + × for-in loop variable declaration may not have an initializer + ╭─[annexB/language/statements/for-in/let-initializer.js:13:1] + 13 │ + 14 │ for (let a = 0 in {}); + · ───────── + 15 │ + ╰──── + + × for-in loop variable declaration may not have an initializer + ╭─[annexB/language/statements/for-in/strict-initializer.js:14:1] + 14 │ + 15 │ for (var a = 0 in {}); + · ───────── + ╰──── + + × for-in loop variable declaration may not have an initializer + ╭─[annexB/language/statements/for-in/var-arraybindingpattern-initializer.js:13:1] + 13 │ + 14 │ for (var [a] = 0 in {}); + · ─────────── + ╰──── + + × for-in loop variable declaration may not have an initializer + ╭─[annexB/language/statements/for-in/var-objectbindingpattern-initializer.js:13:1] + 13 │ + 14 │ for (var {a} = 0 in {}); + · ─────────── + 15 │ + ╰──── + × The 'u' and 'v' regular expression flags cannot be enabled at the same time ╭─[built-ins/RegExp/prototype/unicodeSets/uv-flags.js:16:1] 16 │ @@ -1498,6 +1505,46 @@ Expect to Parse: "language/statements/function/S14_A5_T2.js" 17 │ while (false) ╰──── + × for-in loop variable declaration may not have an initializer + ╭─[language/block-scope/syntax/for-in/disallow-initialization-assignment.js:13:1] + 13 │ $DONOTEVALUATE(); + 14 │ for (let x = 3 in {}) { } + · ───────── + 15 │ + ╰──── + + × Only a single declaration is allowed in a `for...in` statement + ╭─[language/block-scope/syntax/for-in/disallow-multiple-lexical-bindings-with-and-without-initializer.js:13:1] + 13 │ $DONOTEVALUATE(); + 14 │ for (let x = 3, y in {}) { } + · ──────────── + 15 │ + ╰──── + + × Only a single declaration is allowed in a `for...in` statement + ╭─[language/block-scope/syntax/for-in/disallow-multiple-lexical-bindings-with-initializer.js:13:1] + 13 │ $DONOTEVALUATE(); + 14 │ for (let x = 3, y = 4 in {}) { } + · ──────────────── + 15 │ + ╰──── + + × Only a single declaration is allowed in a `for...in` statement + ╭─[language/block-scope/syntax/for-in/disallow-multiple-lexical-bindings-without-and-with-initializer.js:13:1] + 13 │ $DONOTEVALUATE(); + 14 │ for (let x, y = 4 in {}) { } + · ──────────── + 15 │ + ╰──── + + × Only a single declaration is allowed in a `for...in` statement + ╭─[language/block-scope/syntax/for-in/disallow-multiple-lexical-bindings.js:13:1] + 13 │ $DONOTEVALUATE(); + 14 │ for (let x, y in {}) { } + · ──────── + 15 │ + ╰──── + × Identifier `f` has already been declared ╭─[language/block-scope/syntax/redeclaration/async-function-name-redeclaration-attempt-with-async-function.js:22:1] 22 │ @@ -23521,6 +23568,14 @@ Expect to Parse: "language/statements/function/S14_A5_T2.js" 56 │ ╰──── + × for-of loop variable declaration may not have an initializer + ╭─[language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-init-err.js:18:1] + 18 │ async function fn() { + 19 │ for await (const [x] = 1 of []) {} + · ───────────── + 20 │ } + ╰──── + × Rest element must be last element ╭─[language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-rest-not-final-ary.js:51:1] 51 │ async function *fn() { @@ -23575,6 +23630,22 @@ Expect to Parse: "language/statements/function/S14_A5_T2.js" 56 │ ╰──── + × for-of loop variable declaration may not have an initializer + ╭─[language/statements/for-await-of/async-gen-dstr-const-obj-ptrn-init-err.js:18:1] + 18 │ async function fn() { + 19 │ for await (const {x} = 1 of []) {} + · ───────────── + 20 │ } + ╰──── + + × for-of loop variable declaration may not have an initializer + ╭─[language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-init-err.js:18:1] + 18 │ async function fn() { + 19 │ for await (let [x] = 1 of []) {} + · ─────────── + 20 │ } + ╰──── + × Rest element must be last element ╭─[language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-rest-not-final-ary.js:51:1] 51 │ async function *fn() { @@ -23629,6 +23700,22 @@ Expect to Parse: "language/statements/function/S14_A5_T2.js" 56 │ ╰──── + × for-of loop variable declaration may not have an initializer + ╭─[language/statements/for-await-of/async-gen-dstr-let-obj-ptrn-init-err.js:18:1] + 18 │ async function fn() { + 19 │ for await (let {x} = 1 of []) {} + · ─────────── + 20 │ } + ╰──── + + × for-of loop variable declaration may not have an initializer + ╭─[language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-init-err.js:18:1] + 18 │ async function fn() { + 19 │ for await (var [x] = 1 of []) {} + · ─────────── + 20 │ } + ╰──── + × Rest element must be last element ╭─[language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-rest-not-final-ary.js:48:1] 48 │ async function *fn() { @@ -23683,6 +23770,14 @@ Expect to Parse: "language/statements/function/S14_A5_T2.js" 56 │ ╰──── + × for-of loop variable declaration may not have an initializer + ╭─[language/statements/for-await-of/async-gen-dstr-var-obj-ptrn-init-err.js:18:1] + 18 │ async function fn() { + 19 │ for await (var {x} = 1 of []) {} + · ─────────── + 20 │ } + ╰──── + × Keywords cannot contain escape characters ╭─[language/statements/for-await-of/escaped-of.js:24:1] 24 │ async function* f() { @@ -23692,6 +23787,30 @@ Expect to Parse: "language/statements/function/S14_A5_T2.js" 26 │ } ╰──── + × for-of loop variable declaration may not have an initializer + ╭─[language/statements/for-await-of/head-const-init.js:18:1] + 18 │ async function fn() { + 19 │ for await (const x = 1 of []) {} + · ─────────── + 20 │ } + ╰──── + + × for-of loop variable declaration may not have an initializer + ╭─[language/statements/for-await-of/head-let-init.js:18:1] + 18 │ async function fn() { + 19 │ for await (let x = 1 of []) {} + · ───────── + 20 │ } + ╰──── + + × for-of loop variable declaration may not have an initializer + ╭─[language/statements/for-await-of/head-var-init.js:18:1] + 18 │ async function fn() { + 19 │ for await (var x = 1 of []) {} + · ───────── + 20 │ } + ╰──── + × Lexical declaration cannot appear in a single-statement context ╭─[language/statements/for-await-of/let-array-with-newline.js:21:1] 21 │ async function* f() { @@ -24091,6 +24210,28 @@ Expect to Parse: "language/statements/function/S14_A5_T2.js" ╰──── help: Wrap this declaration in a block statement + × for-in loop variable declaration may not have an initializer + ╭─[language/statements/for-in/var-arguments-fn-strict-init.js:17:1] + 17 │ function f() { + 18 │ for (var arguments = 42 in null) {} + · ────────────────── + 19 │ } + ╰──── + + × for-in loop variable declaration may not have an initializer + ╭─[language/statements/for-in/var-arguments-strict-init.js:16:1] + 16 │ + 17 │ for (var arguments = 42 in null) {} + · ────────────────── + ╰──── + + × for-in loop variable declaration may not have an initializer + ╭─[language/statements/for-in/var-eval-strict-init.js:14:1] + 14 │ + 15 │ for (var eval = 42 in null) {} + · ───────────── + ╰──── + × 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 │ @@ -24281,6 +24422,13 @@ Expect to Parse: "language/statements/function/S14_A5_T2.js" · ───── ╰──── + × for-of loop variable declaration may not have an initializer + ╭─[language/statements/for-of/dstr/const-ary-ptrn-init-err.js:16:1] + 16 │ + 17 │ for (const [x] = 1 of []) {} + · ───────────── + ╰──── + × Rest element must be last element ╭─[language/statements/for-of/dstr/const-ary-ptrn-rest-not-final-ary.js:50:1] 50 │ @@ -24308,6 +24456,20 @@ Expect to Parse: "language/statements/function/S14_A5_T2.js" 52 │ ╰──── + × for-of loop variable declaration may not have an initializer + ╭─[language/statements/for-of/dstr/const-obj-ptrn-init-err.js:16:1] + 16 │ + 17 │ for (const {x} = 1 of []) {} + · ───────────── + ╰──── + + × for-of loop variable declaration may not have an initializer + ╭─[language/statements/for-of/dstr/let-ary-ptrn-init-err.js:16:1] + 16 │ + 17 │ for (let [x] = 1 of []) {} + · ─────────── + ╰──── + × Rest element must be last element ╭─[language/statements/for-of/dstr/let-ary-ptrn-rest-not-final-ary.js:50:1] 50 │ @@ -24335,6 +24497,13 @@ Expect to Parse: "language/statements/function/S14_A5_T2.js" 52 │ ╰──── + × for-of loop variable declaration may not have an initializer + ╭─[language/statements/for-of/dstr/let-obj-ptrn-init-err.js:16:1] + 16 │ + 17 │ for (let {x} = 1 of []) {} + · ─────────── + ╰──── + × The keyword 'yield' is reserved ╭─[language/statements/for-of/dstr/obj-id-identifier-yield-ident-invalid.js:31:1] 31 │ @@ -24432,6 +24601,13 @@ Expect to Parse: "language/statements/function/S14_A5_T2.js" 34 │ ]) ; ╰──── + × for-of loop variable declaration may not have an initializer + ╭─[language/statements/for-of/dstr/var-ary-ptrn-init-err.js:16:1] + 16 │ + 17 │ for (var [x] = 1 of []) {} + · ─────────── + ╰──── + × Rest element must be last element ╭─[language/statements/for-of/dstr/var-ary-ptrn-rest-not-final-ary.js:47:1] 47 │ @@ -24459,6 +24635,13 @@ Expect to Parse: "language/statements/function/S14_A5_T2.js" 49 │ ╰──── + × for-of loop variable declaration may not have an initializer + ╭─[language/statements/for-of/dstr/var-obj-ptrn-init-err.js:16:1] + 16 │ + 17 │ for (var {x} = 1 of []) {} + · ─────────── + ╰──── + × Keywords cannot contain escape characters ╭─[language/statements/for-of/escaped-of.js:22:1] 22 │ @@ -24495,6 +24678,13 @@ Expect to Parse: "language/statements/function/S14_A5_T2.js" · ─── ╰──── + × for-of loop variable declaration may not have an initializer + ╭─[language/statements/for-of/head-const-init.js:16:1] + 16 │ + 17 │ for (const x = 1 of []) {} + · ─────────── + ╰──── + × Expect token ╭─[language/statements/for-of/head-decl-no-expr.js:16:1] 16 │ @@ -24539,6 +24729,13 @@ Expect to Parse: "language/statements/function/S14_A5_T2.js" · ─── ╰──── + × for-of loop variable declaration may not have an initializer + ╭─[language/statements/for-of/head-let-init.js:16:1] + 16 │ + 17 │ for (let x = 1 of []) {} + · ───────── + ╰──── + × The left-hand side of a `for...of` statement may not be `async` ╭─[language/statements/for-of/head-lhs-async-invalid.js:16:1] 16 │ var async; @@ -24583,6 +24780,13 @@ Expect to Parse: "language/statements/function/S14_A5_T2.js" · ──── ╰──── + × for-of loop variable declaration may not have an initializer + ╭─[language/statements/for-of/head-var-init.js:16:1] + 16 │ + 17 │ for (var x = 1 of []) {} + · ───────── + ╰──── + × Expect token ╭─[language/statements/for-of/head-var-no-expr.js:16:1] 16 │ diff --git a/tasks/coverage/typescript.snap b/tasks/coverage/typescript.snap index bedc11b2b..6d09cebe3 100644 --- a/tasks/coverage/typescript.snap +++ b/tasks/coverage/typescript.snap @@ -1,7 +1,7 @@ TypeScript Summary: AST Parsed : 2305/2338 (98.59%) Positive Passed: 2305/2338 (98.59%) -Negative Passed: 597/2532 (23.58%) +Negative Passed: 608/2532 (24.01%) Expect Syntax Error: "Symbols/ES5SymbolProperty2.ts" Expect Syntax Error: "Symbols/ES5SymbolProperty6.ts" Expect Syntax Error: "additionalChecks/noPropertyAccessFromIndexSignature1.ts" @@ -1325,21 +1325,14 @@ Expect Syntax Error: "parser/ecmascript5/Statements/parserES5ForOfStatement14.ts Expect Syntax Error: "parser/ecmascript5/Statements/parserES5ForOfStatement15.ts" Expect Syntax Error: "parser/ecmascript5/Statements/parserES5ForOfStatement16.ts" Expect Syntax Error: "parser/ecmascript5/Statements/parserES5ForOfStatement20.ts" -Expect Syntax Error: "parser/ecmascript5/Statements/parserES5ForOfStatement3.ts" -Expect Syntax Error: "parser/ecmascript5/Statements/parserES5ForOfStatement4.ts" Expect Syntax Error: "parser/ecmascript5/Statements/parserES5ForOfStatement5.ts" -Expect Syntax Error: "parser/ecmascript5/Statements/parserES5ForOfStatement6.ts" -Expect Syntax Error: "parser/ecmascript5/Statements/parserES5ForOfStatement7.ts" Expect Syntax Error: "parser/ecmascript5/Statements/parserES5ForOfStatement8.ts" Expect Syntax Error: "parser/ecmascript5/Statements/parserES5ForOfStatement9.ts" Expect Syntax Error: "parser/ecmascript5/Statements/parserEmptyStatement1.d.ts" Expect Syntax Error: "parser/ecmascript5/Statements/parserExpressionStatement1.d.ts" Expect Syntax Error: "parser/ecmascript5/Statements/parserForInStatement1.d.ts" -Expect Syntax Error: "parser/ecmascript5/Statements/parserForInStatement3.ts" Expect Syntax Error: "parser/ecmascript5/Statements/parserForInStatement4.ts" Expect Syntax Error: "parser/ecmascript5/Statements/parserForInStatement5.ts" -Expect Syntax Error: "parser/ecmascript5/Statements/parserForInStatement6.ts" -Expect Syntax Error: "parser/ecmascript5/Statements/parserForInStatement7.ts" Expect Syntax Error: "parser/ecmascript5/Statements/parserForStatement1.d.ts" Expect Syntax Error: "parser/ecmascript5/Statements/parserForStatement2.ts" Expect Syntax Error: "parser/ecmascript5/Statements/parserForStatement3.ts" @@ -1462,11 +1455,7 @@ Expect Syntax Error: "parser/ecmascript6/Iterators/parserForOfStatement14.ts" Expect Syntax Error: "parser/ecmascript6/Iterators/parserForOfStatement15.ts" Expect Syntax Error: "parser/ecmascript6/Iterators/parserForOfStatement16.ts" Expect Syntax Error: "parser/ecmascript6/Iterators/parserForOfStatement20.ts" -Expect Syntax Error: "parser/ecmascript6/Iterators/parserForOfStatement3.ts" -Expect Syntax Error: "parser/ecmascript6/Iterators/parserForOfStatement4.ts" Expect Syntax Error: "parser/ecmascript6/Iterators/parserForOfStatement5.ts" -Expect Syntax Error: "parser/ecmascript6/Iterators/parserForOfStatement6.ts" -Expect Syntax Error: "parser/ecmascript6/Iterators/parserForOfStatement7.ts" Expect Syntax Error: "parser/ecmascript6/Iterators/parserForOfStatement8.ts" Expect Syntax Error: "parser/ecmascript6/Iterators/parserForOfStatement9.ts" Expect Syntax Error: "pedantic/noUncheckedIndexedAccess.ts" @@ -8137,6 +8126,38 @@ Expect to Parse: "salsa/privateIdentifierExpando.ts" · ─ ╰──── + × Only a single declaration is allowed in a `for...of` statement + ╭─[parser/ecmascript5/Statements/parserES5ForOfStatement3.ts:1:1] + 1 │ //@target: ES5 + 2 │ for (var a, b of X) { + · ──────── + 3 │ } + ╰──── + + × for-of loop variable declaration may not have an initializer + ╭─[parser/ecmascript5/Statements/parserES5ForOfStatement4.ts:1:1] + 1 │ //@target: ES5 + 2 │ for (var a = 1 of X) { + · ───────── + 3 │ } + ╰──── + + × Only a single declaration is allowed in a `for...of` statement + ╭─[parser/ecmascript5/Statements/parserES5ForOfStatement6.ts:1:1] + 1 │ //@target: ES5 + 2 │ for (var a = 1, b = 2 of X) { + · ──────────────── + 3 │ } + ╰──── + + × Only a single declaration is allowed in a `for...of` statement + ╭─[parser/ecmascript5/Statements/parserES5ForOfStatement7.ts:1:1] + 1 │ //@target: ES5 + 2 │ for (var a: number = 1, b: string = "" of X) { + · ───────────────────────────────── + 3 │ } + ╰──── + × Unexpected token ╭─[parser/ecmascript5/Statements/parserForInStatement2.ts:1:1] 1 │ for (var in X) { @@ -8144,6 +8165,27 @@ Expect to Parse: "salsa/privateIdentifierExpando.ts" 2 │ } ╰──── + × Only a single declaration is allowed in a `for...in` statement + ╭─[parser/ecmascript5/Statements/parserForInStatement3.ts:1:1] + 1 │ for (var a, b in X) { + · ──────── + 2 │ } + ╰──── + + × Only a single declaration is allowed in a `for...in` statement + ╭─[parser/ecmascript5/Statements/parserForInStatement6.ts:1:1] + 1 │ for (var a = 1, b = 2 in X) { + · ──────────────── + 2 │ } + ╰──── + + × Only a single declaration is allowed in a `for...in` statement + ╭─[parser/ecmascript5/Statements/parserForInStatement7.ts:1:1] + 1 │ for (var a: number = 1, b: string = "" in X) { + · ───────────────────────────────── + 2 │ } + ╰──── + × Unexpected token ╭─[parser/ecmascript5/Statements/parserForStatement4.ts:1:1] 1 │ for (a = 1 in b) { @@ -8449,6 +8491,38 @@ Expect to Parse: "salsa/privateIdentifierExpando.ts" · ╰── The left-hand side of a `for...of` statement may not be `async` ╰──── + × Only a single declaration is allowed in a `for...of` statement + ╭─[parser/ecmascript6/Iterators/parserForOfStatement3.ts:1:1] + 1 │ //@target: ES6 + 2 │ for (var a, b of X) { + · ──────── + 3 │ } + ╰──── + + × for-of loop variable declaration may not have an initializer + ╭─[parser/ecmascript6/Iterators/parserForOfStatement4.ts:1:1] + 1 │ //@target: ES6 + 2 │ for (var a = 1 of X) { + · ───────── + 3 │ } + ╰──── + + × Only a single declaration is allowed in a `for...of` statement + ╭─[parser/ecmascript6/Iterators/parserForOfStatement6.ts:1:1] + 1 │ //@target: ES6 + 2 │ for (var a = 1, b = 2 of X) { + · ──────────────── + 3 │ } + ╰──── + + × Only a single declaration is allowed in a `for...of` statement + ╭─[parser/ecmascript6/Iterators/parserForOfStatement7.ts:1:1] + 1 │ //@target: ES6 + 2 │ for (var a: number = 1, b: string = "" of X) { + · ───────────────────────────────── + 3 │ } + ╰──── + × Expect token ╭─[parser/ecmascript6/ShorthandPropertyAssignment/parserShorthandPropertyAssignment1.ts:3:1] 3 │ var name:any, id: any;