feat(linter): check ForStatementLeft in javascript

This commit is contained in:
Boshen 2023-03-11 19:09:59 +08:00
parent f22539e93f
commit 403682960f
No known key found for this signature in database
GPG key ID: 6AC90C77AAAA6ABC
4 changed files with 451 additions and 59 deletions

View file

@ -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.")]

View file

@ -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 {}));

View file

@ -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 │

View file

@ -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;