feat(parser): check ReturnStatement in return context

This commit is contained in:
Boshen 2023-03-12 23:30:32 +08:00
parent 84eaa0b7e3
commit d6e8c6fb2f
No known key found for this signature in database
GPG key ID: 6AC90C77AAAA6ABC
4 changed files with 247 additions and 28 deletions

View file

@ -101,7 +101,6 @@ impl<'a> Parser<'a> {
}
Kind::Export => self.parse_export_declaration(),
// [+Return] ReturnStatement[?Yield, ?Await]
// Error is checked in linter
Kind::Return => self.parse_return_statement(),
Kind::Var => self.parse_variable_statement(stmt_ctx),
Kind::Const if !(self.ts_enabled() && self.is_at_enum_declaration()) => {
@ -374,6 +373,12 @@ impl<'a> Parser<'a> {
self.asi()?;
Some(expr)
};
if !self.ctx.has_return() {
self.error(diagnostics::ReturnStatementOnlyInFunctionBody(Span::new(
span.start,
span.start + 6,
)));
}
Ok(self.ast.return_statement(self.end_span(span), argument))
}

View file

@ -1,7 +1,7 @@
Babel Summary:
AST Parsed : 2053/2069 (99.23%)
Positive Passed: 2053/2069 (99.23%)
Negative Passed: 1061/1502 (70.64%)
AST Parsed : 2051/2069 (99.13%)
Positive Passed: 2051/2069 (99.13%)
Negative Passed: 1063/1502 (70.77%)
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/454/input.js"
Expect Syntax Error: "core/uncategorised/466/input.js"
Expect Syntax Error: "core/uncategorised/467/input.js"
Expect Syntax Error: "core/uncategorised/468/input.js"
@ -245,7 +244,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_0171/input.js"
Expect Syntax Error: "esprima/invalid-syntax/migrated_0183/input.js"
Expect Syntax Error: "esprima/invalid-syntax/migrated_0184/input.js"
Expect Syntax Error: "esprima/invalid-syntax/migrated_0185/input.js"
@ -465,6 +463,23 @@ Expect to Parse: "core/scope/dupl-bind-gen-gen-script/input.js"
· ─┬─
· ╰── It can not be redeclared here
╰────
Expect to Parse: "core/uncategorised/327/input.js"
× TS1108: A 'return' statement can only be used within a function body
╭─[core/uncategorised/327/input.js:1:1]
1 │ return {} / 2
· ───┬──
· ╰── A 'return' statement can only be used within a function body.
╰────
Expect to Parse: "core/uncategorised/328/input.js"
× TS1108: A 'return' statement can only be used within a function body
╭─[core/uncategorised/328/input.js:1:1]
1 │ return
· ───┬──
· ╰── A 'return' statement can only be used within a function body.
2 │ {}
╰────
Expect to Parse: "typescript/arrow-function/generic-tsx-babel-7/input.ts"
× Expect token
@ -1868,6 +1883,13 @@ Expect to Parse: "typescript/types/const-type-parameters/input.ts"
· ╰── Unterminated string
╰────
× TS1108: A 'return' statement can only be used within a function body
╭─[core/uncategorised/454/input.js:1:1]
1 │ return
· ───┬──
· ╰── A 'return' statement can only be used within a function body.
╰────
× Illegal break statement
╭─[core/uncategorised/455/input.js:1:1]
1 │ break
@ -7861,6 +7883,13 @@ Expect to Parse: "typescript/types/const-type-parameters/input.ts"
· ─
╰────
× TS1108: A 'return' statement can only be used within a function body
╭─[esprima/invalid-syntax/migrated_0171/input.js:1:1]
1 │ return
· ───┬──
· ╰── A 'return' statement can only be used within a function body.
╰────
× Illegal break statement
╭─[esprima/invalid-syntax/migrated_0172/input.js:1:1]
1 │ break

View file

@ -1,7 +1,7 @@
Test262 Summary:
AST Parsed : 44015/44034 (99.96%)
Positive Passed: 44015/44034 (99.96%)
Negative Passed: 3302/3917 (84.30%)
Negative Passed: 3315/3917 (84.63%)
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"
@ -302,7 +302,6 @@ Expect Syntax Error: "language/global-code/export.js"
Expect Syntax Error: "language/global-code/import.js"
Expect Syntax Error: "language/global-code/new.target-arrow.js"
Expect Syntax Error: "language/global-code/new.target.js"
Expect Syntax Error: "language/global-code/return.js"
Expect Syntax Error: "language/import/dup-bound-names.js"
Expect Syntax Error: "language/import/json-invalid.js"
Expect Syntax Error: "language/import/json-named-bindings.js"
@ -323,7 +322,6 @@ Expect Syntax Error: "language/module-code/early-dup-export-star-as-dflt.js"
Expect Syntax Error: "language/module-code/early-export-global.js"
Expect Syntax Error: "language/module-code/early-export-unresolvable.js"
Expect Syntax Error: "language/module-code/early-new-target.js"
Expect Syntax Error: "language/module-code/parse-err-return.js"
Expect Syntax Error: "language/module-code/top-level-await/syntax/early-does-not-propagate-to-fn-declaration-body.js"
Expect Syntax Error: "language/module-code/top-level-await/syntax/early-does-not-propagate-to-fn-declaration-params.js"
Expect Syntax Error: "language/module-code/top-level-await/syntax/early-does-not-propagate-to-fn-expr-body.js"
@ -464,7 +462,6 @@ Expect Syntax Error: "language/statements/class/method/object-destructuring-para
Expect Syntax Error: "language/statements/class/method/rest-param-strict-body.js"
Expect Syntax Error: "language/statements/class/static-gen-method-param-dflt-yield.js"
Expect Syntax Error: "language/statements/class/static-init-invalid-await.js"
Expect Syntax Error: "language/statements/class/static-init-invalid-return.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"
@ -594,16 +591,6 @@ 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"
Expect Syntax Error: "language/statements/return/S12.9_A1_T1.js"
Expect Syntax Error: "language/statements/return/S12.9_A1_T10.js"
Expect Syntax Error: "language/statements/return/S12.9_A1_T2.js"
Expect Syntax Error: "language/statements/return/S12.9_A1_T3.js"
Expect Syntax Error: "language/statements/return/S12.9_A1_T4.js"
Expect Syntax Error: "language/statements/return/S12.9_A1_T5.js"
Expect Syntax Error: "language/statements/return/S12.9_A1_T6.js"
Expect Syntax Error: "language/statements/return/S12.9_A1_T7.js"
Expect Syntax Error: "language/statements/return/S12.9_A1_T8.js"
Expect Syntax Error: "language/statements/return/S12.9_A1_T9.js"
Expect Syntax Error: "language/statements/try/dstr/ary-ptrn-rest-init-ary.js"
Expect Syntax Error: "language/statements/try/dstr/ary-ptrn-rest-init-id.js"
Expect Syntax Error: "language/statements/try/dstr/ary-ptrn-rest-init-obj.js"
@ -16157,6 +16144,14 @@ Expect to Parse: "language/statements/function/S14_A5_T2.js"
· ──
╰────
× TS1108: A 'return' statement can only be used within a function body
╭─[language/global-code/return.js:21:1]
21 │
22 │ return;
· ───┬──
· ╰── A 'return' statement can only be used within a function body.
╰────
× Super calls are not permitted outside constructors or in nested functions inside constructors.
╭─[language/global-code/super-call-arrow.js:35:1]
@ -19484,6 +19479,14 @@ Expect to Parse: "language/statements/function/S14_A5_T2.js"
· ╰── Expected an expression here
╰────
× TS1108: A 'return' statement can only be used within a function body
╭─[language/module-code/parse-err-return.js:31:1]
31 │
32 │ return;
· ───┬──
· ╰── A 'return' statement can only be used within a function body.
╰────
× Automatic Semicolon Insertion
╭─[language/module-code/parse-err-semi-dflt-expr.js:26:1]
26 │
@ -26338,6 +26341,15 @@ Expect to Parse: "language/statements/function/S14_A5_T2.js"
24 │ }
╰────
× TS1108: A 'return' statement can only be used within a function body
╭─[language/statements/class/static-init-invalid-return.js:23:1]
23 │ static {
24 │ return;
· ───┬──
· ╰── A 'return' statement can only be used within a function body.
25 │ }
╰────
× Super calls are not permitted outside constructors or in nested functions inside constructors.
╭─[language/statements/class/static-init-invalid-super-call.js:19:1]
@ -29867,6 +29879,105 @@ Expect to Parse: "language/statements/function/S14_A5_T2.js"
╰────
help: Try insert a semicolon here
× TS1108: A 'return' statement can only be used within a function body
╭─[language/statements/return/S12.9_A1_T1.js:17:1]
17 │ var x=1;
18 │ return;
· ───┬──
· ╰── A 'return' statement can only be used within a function body.
19 │ var y=2;
╰────
× TS1108: A 'return' statement can only be used within a function body
╭─[language/statements/return/S12.9_A1_T10.js:16:1]
16 │ //CHECK#1
17 │ return (0);
· ───┬──
· ╰── A 'return' statement can only be used within a function body.
18 │ //
╰────
× TS1108: A 'return' statement can only be used within a function body
╭─[language/statements/return/S12.9_A1_T2.js:17:1]
17 │ var x=1;
18 │ return x;
· ───┬──
· ╰── A 'return' statement can only be used within a function body.
19 │ var y=2;
╰────
× TS1108: A 'return' statement can only be used within a function body
╭─[language/statements/return/S12.9_A1_T3.js:17:1]
17 │ try {
18 │ return 1;
· ───┬──
· ╰── A 'return' statement can only be used within a function body.
19 │ } catch(e){
╰────
× TS1108: A 'return' statement can only be used within a function body
╭─[language/statements/return/S12.9_A1_T3.js:19:1]
19 │ } catch(e){
20 │ return 1;
· ───┬──
· ╰── A 'return' statement can only be used within a function body.
21 │ }
╰────
× TS1108: A 'return' statement can only be used within a function body
╭─[language/statements/return/S12.9_A1_T4.js:16:1]
16 │ //CHECK#1
17 │ return;
· ───┬──
· ╰── A 'return' statement can only be used within a function body.
18 │ //
╰────
× TS1108: A 'return' statement can only be used within a function body
╭─[language/statements/return/S12.9_A1_T5.js:20:1]
20 │ var x=1;
21 │ return;
· ───┬──
· ╰── A 'return' statement can only be used within a function body.
22 │ var y=2;
╰────
× TS1108: A 'return' statement can only be used within a function body
╭─[language/statements/return/S12.9_A1_T6.js:20:1]
20 │ var x=1;
21 │ return;
· ───┬──
· ╰── A 'return' statement can only be used within a function body.
22 │ var y=2;
╰────
× TS1108: A 'return' statement can only be used within a function body
╭─[language/statements/return/S12.9_A1_T7.js:20:1]
20 │ var x=1;
21 │ return x;
· ───┬──
· ╰── A 'return' statement can only be used within a function body.
22 │ var y=2;
╰────
× TS1108: A 'return' statement can only be used within a function body
╭─[language/statements/return/S12.9_A1_T8.js:20:1]
20 │ var x=1;
21 │ return x;
· ───┬──
· ╰── A 'return' statement can only be used within a function body.
22 │ var y=2;
╰────
× TS1108: A 'return' statement can only be used within a function body
╭─[language/statements/return/S12.9_A1_T9.js:19:1]
19 │ } catch(e){
20 │ return e;
· ───┬──
· ╰── A 'return' statement can only be used within a function body.
21 │ }
╰────
× Identifier `default` has already been declared
╭─[language/statements/switch/S12.11_A2_T1.js:20:1]
20 │ result += 2;

View file

@ -1,7 +1,7 @@
TypeScript Summary:
AST Parsed : 2305/2338 (98.59%)
Positive Passed: 2305/2338 (98.59%)
Negative Passed: 637/2532 (25.16%)
Negative Passed: 644/2532 (25.43%)
Expect Syntax Error: "Symbols/ES5SymbolProperty2.ts"
Expect Syntax Error: "Symbols/ES5SymbolProperty6.ts"
Expect Syntax Error: "additionalChecks/noPropertyAccessFromIndexSignature1.ts"
@ -94,7 +94,6 @@ Expect Syntax Error: "classes/classStaticBlock/classStaticBlock19.ts"
Expect Syntax Error: "classes/classStaticBlock/classStaticBlock23.ts"
Expect Syntax Error: "classes/classStaticBlock/classStaticBlock3.ts"
Expect Syntax Error: "classes/classStaticBlock/classStaticBlock4.ts"
Expect Syntax Error: "classes/classStaticBlock/classStaticBlock7.ts"
Expect Syntax Error: "classes/classStaticBlock/classStaticBlock9.ts"
Expect Syntax Error: "classes/classStaticBlock/classStaticBlockUseBeforeDef2.ts"
Expect Syntax Error: "classes/classStaticBlock/classStaticBlockUseBeforeDef3.ts"
@ -1164,7 +1163,6 @@ Expect Syntax Error: "parser/ecmascript5/ErrorRecovery/ParameterLists/parserErro
Expect Syntax Error: "parser/ecmascript5/ErrorRecovery/parserCommaInTypeMemberList2.ts"
Expect Syntax Error: "parser/ecmascript5/ErrorRecovery/parserModifierOnPropertySignature1.ts"
Expect Syntax Error: "parser/ecmascript5/ErrorRecovery/parserModifierOnStatementInBlock2.ts"
Expect Syntax Error: "parser/ecmascript5/ErrorRecovery/parserStatementIsNotAMemberVariableDeclaration1.ts"
Expect Syntax Error: "parser/ecmascript5/ExportAssignments/parserExportAssignment1.ts"
Expect Syntax Error: "parser/ecmascript5/ExportAssignments/parserExportAssignment2.ts"
Expect Syntax Error: "parser/ecmascript5/ExportAssignments/parserExportAssignment5.ts"
@ -1271,7 +1269,6 @@ Expect Syntax Error: "parser/ecmascript5/RegressionTests/parser553699.ts"
Expect Syntax Error: "parser/ecmascript5/RegressionTests/parser618973.ts"
Expect Syntax Error: "parser/ecmascript5/RegressionTests/parserTernaryAndCommaOperators1.ts"
Expect Syntax Error: "parser/ecmascript5/RegularExpressions/parseRegularExpressionMixedWithComments.ts"
Expect Syntax Error: "parser/ecmascript5/RegularExpressions/parserRegularExpression1.ts"
Expect Syntax Error: "parser/ecmascript5/RegularExpressions/parserRegularExpression2.ts"
Expect Syntax Error: "parser/ecmascript5/RegularExpressions/parserRegularExpression3.ts"
Expect Syntax Error: "parser/ecmascript5/RegularExpressions/parserRegularExpression4.ts"
@ -1282,8 +1279,6 @@ Expect Syntax Error: "parser/ecmascript5/RegularExpressions/parserRegularExpress
Expect Syntax Error: "parser/ecmascript5/Statements/BreakStatements/parser_breakInIterationOrSwitchStatement4.ts"
Expect Syntax Error: "parser/ecmascript5/Statements/ContinueStatements/parser_continueInIterationStatement4.ts"
Expect Syntax Error: "parser/ecmascript5/Statements/ContinueStatements/parser_continueNotInIterationStatement4.ts"
Expect Syntax Error: "parser/ecmascript5/Statements/ReturnStatements/parserReturnStatement1.ts"
Expect Syntax Error: "parser/ecmascript5/Statements/ReturnStatements/parserReturnStatement2.ts"
Expect Syntax Error: "parser/ecmascript5/Statements/parserBlockStatement1.d.ts"
Expect Syntax Error: "parser/ecmascript5/Statements/parserDebuggerStatement1.d.ts"
Expect Syntax Error: "parser/ecmascript5/Statements/parserDoStatement1.d.ts"
@ -1311,7 +1306,6 @@ Expect Syntax Error: "parser/ecmascript5/Statements/parserForStatement5.ts"
Expect Syntax Error: "parser/ecmascript5/Statements/parserIfStatement1.d.ts"
Expect Syntax Error: "parser/ecmascript5/Statements/parserIfStatement2.ts"
Expect Syntax Error: "parser/ecmascript5/Statements/parserLabeledStatement1.d.ts"
Expect Syntax Error: "parser/ecmascript5/Statements/parserReturnStatement1.d.ts"
Expect Syntax Error: "parser/ecmascript5/Statements/parserSwitchStatement1.d.ts"
Expect Syntax Error: "parser/ecmascript5/Statements/parserThrowStatement1.d.ts"
Expect Syntax Error: "parser/ecmascript5/Statements/parserTryStatement1.d.ts"
@ -1367,7 +1361,6 @@ Expect Syntax Error: "parser/ecmascript5/parserArgumentList1.ts"
Expect Syntax Error: "parser/ecmascript5/parserAstSpans1.ts"
Expect Syntax Error: "parser/ecmascript5/parserImportDeclaration1.ts"
Expect Syntax Error: "parser/ecmascript5/parserNoASIOnCallAfterFunctionExpression1.ts"
Expect Syntax Error: "parser/ecmascript5/parserNotRegex1.ts"
Expect Syntax Error: "parser/ecmascript5/parserObjectCreationArrayLiteral2.ts"
Expect Syntax Error: "parser/ecmascript5/parserObjectCreationArrayLiteral4.ts"
Expect Syntax Error: "parser/ecmascript5/parserRealSource1.ts"
@ -2829,6 +2822,24 @@ Expect to Parse: "salsa/privateIdentifierExpando.ts"
14 │
╰────
× TS1108: A 'return' statement can only be used within a function body
╭─[classes/classStaticBlock/classStaticBlock7.ts:4:1]
4 │ yield 1;
5 │ return 1;
· ───┬──
· ╰── A 'return' statement can only be used within a function body.
6 │ }
╰────
× TS1108: A 'return' statement can only be used within a function body
╭─[classes/classStaticBlock/classStaticBlock7.ts:35:1]
35 │ static {
36 │ return 1;
· ───┬──
· ╰── A 'return' statement can only be used within a function body.
37 │
╰────
× Jump target cannot cross function boundary.
╭─[classes/classStaticBlock/classStaticBlock8.ts:5:1]
5 │ if (v === 1) {
@ -8745,6 +8756,14 @@ Expect to Parse: "salsa/privateIdentifierExpando.ts"
· ─
╰────
× TS1108: A 'return' statement can only be used within a function body
╭─[parser/ecmascript5/ErrorRecovery/ModuleElements/parserErrorRecovery_ModuleElement1.ts:1:1]
1 │ return foo;
· ───┬──
· ╰── A 'return' statement can only be used within a function body.
2 │ }
╰────
× Unexpected token
╭─[parser/ecmascript5/ErrorRecovery/ModuleElements/parserErrorRecovery_ModuleElement1.ts:1:1]
1 │ return foo;
@ -8988,6 +9007,14 @@ Expect to Parse: "salsa/privateIdentifierExpando.ts"
╰────
help: Try insert a semicolon here
× TS1108: A 'return' statement can only be used within a function body
╭─[parser/ecmascript5/ErrorRecovery/parserStatementIsNotAMemberVariableDeclaration1.ts:1:1]
1 │ return {
· ───┬──
· ╰── A 'return' statement can only be used within a function body.
2 │
╰────
× Automatic Semicolon Insertion
╭─[parser/ecmascript5/ErrorRecovery/parserUnfinishedTypeNameBeforeKeyword1.ts:1:1]
1 │ var x: TypeModule1.
@ -9554,6 +9581,13 @@ Expect to Parse: "salsa/privateIdentifierExpando.ts"
╰────
help: Try insert a semicolon here
× TS1108: A 'return' statement can only be used within a function body
╭─[parser/ecmascript5/RegularExpressions/parserRegularExpression1.ts:1:1]
1 │ return /(#?-?\d*\.\d\w*%?)|(@?#?[\w-?]+%?)/g;
· ───┬──
· ╰── A 'return' statement can only be used within a function body.
╰────
× Unexpected flag a in regular expression literal
╭─[parser/ecmascript5/RegularExpressions/parserRegularExpressionDivideAmbiguity3.ts:1:1]
1 │ if (1) /regexp/a.foo();
@ -9926,6 +9960,22 @@ Expect to Parse: "salsa/privateIdentifierExpando.ts"
4 │ while (true) {
╰────
× TS1108: A 'return' statement can only be used within a function body
╭─[parser/ecmascript5/Statements/ReturnStatements/parserReturnStatement1.ts:1:1]
1 │ return;
· ───┬──
· ╰── A 'return' statement can only be used within a function body.
╰────
× TS1108: A 'return' statement can only be used within a function body
╭─[parser/ecmascript5/Statements/ReturnStatements/parserReturnStatement2.ts:1:1]
1 │ {
2 │ return;
· ───┬──
· ╰── A 'return' statement can only be used within a function body.
3 │ }
╰────
× Illegal break statement
╭─[parser/ecmascript5/Statements/parserBreakStatement1.d.ts:1:1]
1 │ break;
@ -10044,6 +10094,13 @@ Expect to Parse: "salsa/privateIdentifierExpando.ts"
2 │ }
╰────
× TS1108: A 'return' statement can only be used within a function body
╭─[parser/ecmascript5/Statements/parserReturnStatement1.d.ts:1:1]
1 │ return;
· ───┬──
· ╰── A 'return' statement can only be used within a function body.
╰────
× 'with' statements are not allowed
╭─[parser/ecmascript5/Statements/parserWithStatement1.d.ts:1:1]
1 │ with (foo) {
@ -10058,6 +10115,14 @@ Expect to Parse: "salsa/privateIdentifierExpando.ts"
2 │ return;
╰────
× TS1108: A 'return' statement can only be used within a function body
╭─[parser/ecmascript5/Statements/parserWithStatement2.ts:1:1]
1 │ with (1)
2 │ return;
· ───┬──
· ╰── A 'return' statement can only be used within a function body.
╰────
× 'with' statements are not allowed
╭─[parser/ecmascript5/StrictMode/parserStrictMode14.ts:1:1]
1 │ "use strict";
@ -10142,6 +10207,15 @@ Expect to Parse: "salsa/privateIdentifierExpando.ts"
· ╰── Unterminated multiline comment
╰────
× TS1108: A 'return' statement can only be used within a function body
╭─[parser/ecmascript5/parserNotRegex1.ts:2:1]
2 │ {
3 │ return true;
· ───┬──
· ╰── A 'return' statement can only be used within a function body.
4 │ }
╰────
× Unexpected token
╭─[parser/ecmascript5/parserObjectCreationArrayLiteral1.ts:1:1]
1 │ new Foo[];