From 0ee19e4d38bb868c229bac12d4f54212a387f0f7 Mon Sep 17 00:00:00 2001 From: sosukesuzuki Date: Mon, 26 Oct 2020 05:19:37 +0900 Subject: [PATCH 1/2] Allows the interface to be used as an Identifier for flow plugin --- packages/babel-parser/src/plugins/flow.js | 6 ++- .../assignment-expression/input.js | 1 + .../assignment-expression/output.json | 39 ++++++++++++++ .../binary-expression/input.js | 1 + .../binary-expression/output.json | 39 ++++++++++++++ .../call-expression/input.js | 1 + .../call-expression/output.json | 30 +++++++++++ .../class-declaration/input.js | 1 + .../class-declaration/output.json | 31 +++++++++++ .../conditional-expression/input.js | 1 + .../conditional-expression/output.json | 39 ++++++++++++++ .../function-declaration/input.js | 1 + .../function-declaration/output.json | 34 ++++++++++++ .../import-statement/input.js | 1 + .../import-statement/output.json | 41 ++++++++++++++ .../member-expression/input.js | 2 + .../member-expression/output.json | 54 +++++++++++++++++++ .../new-expression/input.js | 1 + .../new-expression/output.json | 31 +++++++++++ .../property/input.js | 3 ++ .../property/output.json | 48 +++++++++++++++++ .../sequence-expression/input.js | 1 + .../sequence-expression/output.json | 44 +++++++++++++++ .../unary-expression/input.js | 1 + .../unary-expression/output.json | 31 +++++++++++ .../variable/input.js | 1 + .../variable/output.json | 41 ++++++++++++++ 27 files changed, 522 insertions(+), 2 deletions(-) create mode 100644 packages/babel-parser/test/fixtures/flow/interfaces-as-identifier/assignment-expression/input.js create mode 100644 packages/babel-parser/test/fixtures/flow/interfaces-as-identifier/assignment-expression/output.json create mode 100644 packages/babel-parser/test/fixtures/flow/interfaces-as-identifier/binary-expression/input.js create mode 100644 packages/babel-parser/test/fixtures/flow/interfaces-as-identifier/binary-expression/output.json create mode 100644 packages/babel-parser/test/fixtures/flow/interfaces-as-identifier/call-expression/input.js create mode 100644 packages/babel-parser/test/fixtures/flow/interfaces-as-identifier/call-expression/output.json create mode 100644 packages/babel-parser/test/fixtures/flow/interfaces-as-identifier/class-declaration/input.js create mode 100644 packages/babel-parser/test/fixtures/flow/interfaces-as-identifier/class-declaration/output.json create mode 100644 packages/babel-parser/test/fixtures/flow/interfaces-as-identifier/conditional-expression/input.js create mode 100644 packages/babel-parser/test/fixtures/flow/interfaces-as-identifier/conditional-expression/output.json create mode 100644 packages/babel-parser/test/fixtures/flow/interfaces-as-identifier/function-declaration/input.js create mode 100644 packages/babel-parser/test/fixtures/flow/interfaces-as-identifier/function-declaration/output.json create mode 100644 packages/babel-parser/test/fixtures/flow/interfaces-as-identifier/import-statement/input.js create mode 100644 packages/babel-parser/test/fixtures/flow/interfaces-as-identifier/import-statement/output.json create mode 100644 packages/babel-parser/test/fixtures/flow/interfaces-as-identifier/member-expression/input.js create mode 100644 packages/babel-parser/test/fixtures/flow/interfaces-as-identifier/member-expression/output.json create mode 100644 packages/babel-parser/test/fixtures/flow/interfaces-as-identifier/new-expression/input.js create mode 100644 packages/babel-parser/test/fixtures/flow/interfaces-as-identifier/new-expression/output.json create mode 100644 packages/babel-parser/test/fixtures/flow/interfaces-as-identifier/property/input.js create mode 100644 packages/babel-parser/test/fixtures/flow/interfaces-as-identifier/property/output.json create mode 100644 packages/babel-parser/test/fixtures/flow/interfaces-as-identifier/sequence-expression/input.js create mode 100644 packages/babel-parser/test/fixtures/flow/interfaces-as-identifier/sequence-expression/output.json create mode 100644 packages/babel-parser/test/fixtures/flow/interfaces-as-identifier/unary-expression/input.js create mode 100644 packages/babel-parser/test/fixtures/flow/interfaces-as-identifier/unary-expression/output.json create mode 100644 packages/babel-parser/test/fixtures/flow/interfaces-as-identifier/variable/input.js create mode 100644 packages/babel-parser/test/fixtures/flow/interfaces-as-identifier/variable/output.json diff --git a/packages/babel-parser/src/plugins/flow.js b/packages/babel-parser/src/plugins/flow.js index 5beb2c3bccc9..ed2ddf0e45e2 100644 --- a/packages/babel-parser/src/plugins/flow.js +++ b/packages/babel-parser/src/plugins/flow.js @@ -13,7 +13,7 @@ import type { Pos, Position } from "../util/location"; import type State from "../tokenizer/state"; import { types as tc } from "../tokenizer/context"; import * as charCodes from "charcodes"; -import { isIteratorStart } from "../util/identifier"; +import { isIteratorStart, isKeyword } from "../util/identifier"; import { type BindingTypes, BIND_NONE, @@ -1730,10 +1730,12 @@ export default (superClass: Class): Class => // interfaces and enums parseStatement(context: ?string, topLevel?: boolean): N.Statement { // strict mode handling of `interface` since it's a reserved word + const lookahead = this.lookahead(); if ( this.state.strict && this.match(tt.name) && - this.state.value === "interface" + this.state.value === "interface" && + (lookahead.type === tt.name || isKeyword(lookahead.value)) ) { const node = this.startNode(); this.next(); diff --git a/packages/babel-parser/test/fixtures/flow/interfaces-as-identifier/assignment-expression/input.js b/packages/babel-parser/test/fixtures/flow/interfaces-as-identifier/assignment-expression/input.js new file mode 100644 index 000000000000..703a95046dcf --- /dev/null +++ b/packages/babel-parser/test/fixtures/flow/interfaces-as-identifier/assignment-expression/input.js @@ -0,0 +1 @@ +interface = "foo"; diff --git a/packages/babel-parser/test/fixtures/flow/interfaces-as-identifier/assignment-expression/output.json b/packages/babel-parser/test/fixtures/flow/interfaces-as-identifier/assignment-expression/output.json new file mode 100644 index 000000000000..e0bd14b6ea94 --- /dev/null +++ b/packages/babel-parser/test/fixtures/flow/interfaces-as-identifier/assignment-expression/output.json @@ -0,0 +1,39 @@ +{ + "type": "File", + "start":0,"end":18,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":18}}, + "errors": [ + "SyntaxError: Unexpected reserved word 'interface' (1:0)" + ], + "program": { + "type": "Program", + "start":0,"end":18,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":18}}, + "sourceType": "module", + "interpreter": null, + "body": [ + { + "type": "ExpressionStatement", + "start":0,"end":18,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":18}}, + "expression": { + "type": "AssignmentExpression", + "start":0,"end":17,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":17}}, + "operator": "=", + "left": { + "type": "Identifier", + "start":0,"end":9,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":9},"identifierName":"interface"}, + "name": "interface" + }, + "right": { + "type": "StringLiteral", + "start":12,"end":17,"loc":{"start":{"line":1,"column":12},"end":{"line":1,"column":17}}, + "extra": { + "rawValue": "foo", + "raw": "\"foo\"" + }, + "value": "foo" + } + } + } + ], + "directives": [] + } +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/flow/interfaces-as-identifier/binary-expression/input.js b/packages/babel-parser/test/fixtures/flow/interfaces-as-identifier/binary-expression/input.js new file mode 100644 index 000000000000..df921726409c --- /dev/null +++ b/packages/babel-parser/test/fixtures/flow/interfaces-as-identifier/binary-expression/input.js @@ -0,0 +1 @@ +interface + 3; diff --git a/packages/babel-parser/test/fixtures/flow/interfaces-as-identifier/binary-expression/output.json b/packages/babel-parser/test/fixtures/flow/interfaces-as-identifier/binary-expression/output.json new file mode 100644 index 000000000000..d4a672ad70ad --- /dev/null +++ b/packages/babel-parser/test/fixtures/flow/interfaces-as-identifier/binary-expression/output.json @@ -0,0 +1,39 @@ +{ + "type": "File", + "start":0,"end":14,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":14}}, + "errors": [ + "SyntaxError: Unexpected reserved word 'interface' (1:0)" + ], + "program": { + "type": "Program", + "start":0,"end":14,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":14}}, + "sourceType": "module", + "interpreter": null, + "body": [ + { + "type": "ExpressionStatement", + "start":0,"end":14,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":14}}, + "expression": { + "type": "BinaryExpression", + "start":0,"end":13,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":13}}, + "left": { + "type": "Identifier", + "start":0,"end":9,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":9},"identifierName":"interface"}, + "name": "interface" + }, + "operator": "+", + "right": { + "type": "NumericLiteral", + "start":12,"end":13,"loc":{"start":{"line":1,"column":12},"end":{"line":1,"column":13}}, + "extra": { + "rawValue": 3, + "raw": "3" + }, + "value": 3 + } + } + } + ], + "directives": [] + } +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/flow/interfaces-as-identifier/call-expression/input.js b/packages/babel-parser/test/fixtures/flow/interfaces-as-identifier/call-expression/input.js new file mode 100644 index 000000000000..3a4ff3e47a85 --- /dev/null +++ b/packages/babel-parser/test/fixtures/flow/interfaces-as-identifier/call-expression/input.js @@ -0,0 +1 @@ +interface(); diff --git a/packages/babel-parser/test/fixtures/flow/interfaces-as-identifier/call-expression/output.json b/packages/babel-parser/test/fixtures/flow/interfaces-as-identifier/call-expression/output.json new file mode 100644 index 000000000000..aa6500d58b08 --- /dev/null +++ b/packages/babel-parser/test/fixtures/flow/interfaces-as-identifier/call-expression/output.json @@ -0,0 +1,30 @@ +{ + "type": "File", + "start":0,"end":12,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":12}}, + "errors": [ + "SyntaxError: Unexpected reserved word 'interface' (1:0)" + ], + "program": { + "type": "Program", + "start":0,"end":12,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":12}}, + "sourceType": "module", + "interpreter": null, + "body": [ + { + "type": "ExpressionStatement", + "start":0,"end":12,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":12}}, + "expression": { + "type": "CallExpression", + "start":0,"end":11,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":11}}, + "callee": { + "type": "Identifier", + "start":0,"end":9,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":9},"identifierName":"interface"}, + "name": "interface" + }, + "arguments": [] + } + } + ], + "directives": [] + } +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/flow/interfaces-as-identifier/class-declaration/input.js b/packages/babel-parser/test/fixtures/flow/interfaces-as-identifier/class-declaration/input.js new file mode 100644 index 000000000000..3052fbc625d8 --- /dev/null +++ b/packages/babel-parser/test/fixtures/flow/interfaces-as-identifier/class-declaration/input.js @@ -0,0 +1 @@ +class interface {} diff --git a/packages/babel-parser/test/fixtures/flow/interfaces-as-identifier/class-declaration/output.json b/packages/babel-parser/test/fixtures/flow/interfaces-as-identifier/class-declaration/output.json new file mode 100644 index 000000000000..1193e8005e6f --- /dev/null +++ b/packages/babel-parser/test/fixtures/flow/interfaces-as-identifier/class-declaration/output.json @@ -0,0 +1,31 @@ +{ + "type": "File", + "start":0,"end":18,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":18}}, + "errors": [ + "SyntaxError: Unexpected reserved word 'interface' (1:6)" + ], + "program": { + "type": "Program", + "start":0,"end":18,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":18}}, + "sourceType": "module", + "interpreter": null, + "body": [ + { + "type": "ClassDeclaration", + "start":0,"end":18,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":18}}, + "id": { + "type": "Identifier", + "start":6,"end":15,"loc":{"start":{"line":1,"column":6},"end":{"line":1,"column":15},"identifierName":"interface"}, + "name": "interface" + }, + "superClass": null, + "body": { + "type": "ClassBody", + "start":16,"end":18,"loc":{"start":{"line":1,"column":16},"end":{"line":1,"column":18}}, + "body": [] + } + } + ], + "directives": [] + } +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/flow/interfaces-as-identifier/conditional-expression/input.js b/packages/babel-parser/test/fixtures/flow/interfaces-as-identifier/conditional-expression/input.js new file mode 100644 index 000000000000..5718eb5ebd2d --- /dev/null +++ b/packages/babel-parser/test/fixtures/flow/interfaces-as-identifier/conditional-expression/input.js @@ -0,0 +1 @@ +interface ? true : false; diff --git a/packages/babel-parser/test/fixtures/flow/interfaces-as-identifier/conditional-expression/output.json b/packages/babel-parser/test/fixtures/flow/interfaces-as-identifier/conditional-expression/output.json new file mode 100644 index 000000000000..f262c436627f --- /dev/null +++ b/packages/babel-parser/test/fixtures/flow/interfaces-as-identifier/conditional-expression/output.json @@ -0,0 +1,39 @@ +{ + "type": "File", + "start":0,"end":25,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":25}}, + "errors": [ + "SyntaxError: Unexpected reserved word 'interface' (1:0)" + ], + "program": { + "type": "Program", + "start":0,"end":25,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":25}}, + "sourceType": "module", + "interpreter": null, + "body": [ + { + "type": "ExpressionStatement", + "start":0,"end":25,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":25}}, + "expression": { + "type": "ConditionalExpression", + "start":0,"end":24,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":24}}, + "test": { + "type": "Identifier", + "start":0,"end":9,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":9},"identifierName":"interface"}, + "name": "interface" + }, + "consequent": { + "type": "BooleanLiteral", + "start":12,"end":16,"loc":{"start":{"line":1,"column":12},"end":{"line":1,"column":16}}, + "value": true + }, + "alternate": { + "type": "BooleanLiteral", + "start":19,"end":24,"loc":{"start":{"line":1,"column":19},"end":{"line":1,"column":24}}, + "value": false + } + } + } + ], + "directives": [] + } +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/flow/interfaces-as-identifier/function-declaration/input.js b/packages/babel-parser/test/fixtures/flow/interfaces-as-identifier/function-declaration/input.js new file mode 100644 index 000000000000..5b97dc9fc820 --- /dev/null +++ b/packages/babel-parser/test/fixtures/flow/interfaces-as-identifier/function-declaration/input.js @@ -0,0 +1 @@ +function interface() {} diff --git a/packages/babel-parser/test/fixtures/flow/interfaces-as-identifier/function-declaration/output.json b/packages/babel-parser/test/fixtures/flow/interfaces-as-identifier/function-declaration/output.json new file mode 100644 index 000000000000..47fedb9e186c --- /dev/null +++ b/packages/babel-parser/test/fixtures/flow/interfaces-as-identifier/function-declaration/output.json @@ -0,0 +1,34 @@ +{ + "type": "File", + "start":0,"end":23,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":23}}, + "errors": [ + "SyntaxError: Unexpected reserved word 'interface' (1:9)" + ], + "program": { + "type": "Program", + "start":0,"end":23,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":23}}, + "sourceType": "module", + "interpreter": null, + "body": [ + { + "type": "FunctionDeclaration", + "start":0,"end":23,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":23}}, + "id": { + "type": "Identifier", + "start":9,"end":18,"loc":{"start":{"line":1,"column":9},"end":{"line":1,"column":18},"identifierName":"interface"}, + "name": "interface" + }, + "generator": false, + "async": false, + "params": [], + "body": { + "type": "BlockStatement", + "start":21,"end":23,"loc":{"start":{"line":1,"column":21},"end":{"line":1,"column":23}}, + "body": [], + "directives": [] + } + } + ], + "directives": [] + } +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/flow/interfaces-as-identifier/import-statement/input.js b/packages/babel-parser/test/fixtures/flow/interfaces-as-identifier/import-statement/input.js new file mode 100644 index 000000000000..d1b74a5c683e --- /dev/null +++ b/packages/babel-parser/test/fixtures/flow/interfaces-as-identifier/import-statement/input.js @@ -0,0 +1 @@ +import interface from "foo"; diff --git a/packages/babel-parser/test/fixtures/flow/interfaces-as-identifier/import-statement/output.json b/packages/babel-parser/test/fixtures/flow/interfaces-as-identifier/import-statement/output.json new file mode 100644 index 000000000000..d994e24f05fb --- /dev/null +++ b/packages/babel-parser/test/fixtures/flow/interfaces-as-identifier/import-statement/output.json @@ -0,0 +1,41 @@ +{ + "type": "File", + "start":0,"end":28,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":28}}, + "errors": [ + "SyntaxError: Unexpected reserved word 'interface' (1:7)" + ], + "program": { + "type": "Program", + "start":0,"end":28,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":28}}, + "sourceType": "module", + "interpreter": null, + "body": [ + { + "type": "ImportDeclaration", + "start":0,"end":28,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":28}}, + "specifiers": [ + { + "type": "ImportDefaultSpecifier", + "start":7,"end":16,"loc":{"start":{"line":1,"column":7},"end":{"line":1,"column":16}}, + "local": { + "type": "Identifier", + "start":7,"end":16,"loc":{"start":{"line":1,"column":7},"end":{"line":1,"column":16},"identifierName":"interface"}, + "name": "interface" + } + } + ], + "importKind": "value", + "source": { + "type": "StringLiteral", + "start":22,"end":27,"loc":{"start":{"line":1,"column":22},"end":{"line":1,"column":27}}, + "extra": { + "rawValue": "foo", + "raw": "\"foo\"" + }, + "value": "foo" + } + } + ], + "directives": [] + } +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/flow/interfaces-as-identifier/member-expression/input.js b/packages/babel-parser/test/fixtures/flow/interfaces-as-identifier/member-expression/input.js new file mode 100644 index 000000000000..e6f642b2c005 --- /dev/null +++ b/packages/babel-parser/test/fixtures/flow/interfaces-as-identifier/member-expression/input.js @@ -0,0 +1,2 @@ +foo.interface; +interface.foo; diff --git a/packages/babel-parser/test/fixtures/flow/interfaces-as-identifier/member-expression/output.json b/packages/babel-parser/test/fixtures/flow/interfaces-as-identifier/member-expression/output.json new file mode 100644 index 000000000000..6a8a618b8f55 --- /dev/null +++ b/packages/babel-parser/test/fixtures/flow/interfaces-as-identifier/member-expression/output.json @@ -0,0 +1,54 @@ +{ + "type": "File", + "start":0,"end":29,"loc":{"start":{"line":1,"column":0},"end":{"line":2,"column":14}}, + "errors": [ + "SyntaxError: Unexpected reserved word 'interface' (2:0)" + ], + "program": { + "type": "Program", + "start":0,"end":29,"loc":{"start":{"line":1,"column":0},"end":{"line":2,"column":14}}, + "sourceType": "module", + "interpreter": null, + "body": [ + { + "type": "ExpressionStatement", + "start":0,"end":14,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":14}}, + "expression": { + "type": "MemberExpression", + "start":0,"end":13,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":13}}, + "object": { + "type": "Identifier", + "start":0,"end":3,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":3},"identifierName":"foo"}, + "name": "foo" + }, + "computed": false, + "property": { + "type": "Identifier", + "start":4,"end":13,"loc":{"start":{"line":1,"column":4},"end":{"line":1,"column":13},"identifierName":"interface"}, + "name": "interface" + } + } + }, + { + "type": "ExpressionStatement", + "start":15,"end":29,"loc":{"start":{"line":2,"column":0},"end":{"line":2,"column":14}}, + "expression": { + "type": "MemberExpression", + "start":15,"end":28,"loc":{"start":{"line":2,"column":0},"end":{"line":2,"column":13}}, + "object": { + "type": "Identifier", + "start":15,"end":24,"loc":{"start":{"line":2,"column":0},"end":{"line":2,"column":9},"identifierName":"interface"}, + "name": "interface" + }, + "computed": false, + "property": { + "type": "Identifier", + "start":25,"end":28,"loc":{"start":{"line":2,"column":10},"end":{"line":2,"column":13},"identifierName":"foo"}, + "name": "foo" + } + } + } + ], + "directives": [] + } +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/flow/interfaces-as-identifier/new-expression/input.js b/packages/babel-parser/test/fixtures/flow/interfaces-as-identifier/new-expression/input.js new file mode 100644 index 000000000000..6798870284e3 --- /dev/null +++ b/packages/babel-parser/test/fixtures/flow/interfaces-as-identifier/new-expression/input.js @@ -0,0 +1 @@ +new interface(); diff --git a/packages/babel-parser/test/fixtures/flow/interfaces-as-identifier/new-expression/output.json b/packages/babel-parser/test/fixtures/flow/interfaces-as-identifier/new-expression/output.json new file mode 100644 index 000000000000..394218d16272 --- /dev/null +++ b/packages/babel-parser/test/fixtures/flow/interfaces-as-identifier/new-expression/output.json @@ -0,0 +1,31 @@ +{ + "type": "File", + "start":0,"end":16,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":16}}, + "errors": [ + "SyntaxError: Unexpected reserved word 'interface' (1:4)" + ], + "program": { + "type": "Program", + "start":0,"end":16,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":16}}, + "sourceType": "module", + "interpreter": null, + "body": [ + { + "type": "ExpressionStatement", + "start":0,"end":16,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":16}}, + "expression": { + "type": "NewExpression", + "start":0,"end":15,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":15}}, + "callee": { + "type": "Identifier", + "start":4,"end":13,"loc":{"start":{"line":1,"column":4},"end":{"line":1,"column":13},"identifierName":"interface"}, + "name": "interface" + }, + "typeArguments": null, + "arguments": [] + } + } + ], + "directives": [] + } +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/flow/interfaces-as-identifier/property/input.js b/packages/babel-parser/test/fixtures/flow/interfaces-as-identifier/property/input.js new file mode 100644 index 000000000000..b9a3b99bd663 --- /dev/null +++ b/packages/babel-parser/test/fixtures/flow/interfaces-as-identifier/property/input.js @@ -0,0 +1,3 @@ +({ + interface: "foo" +}); diff --git a/packages/babel-parser/test/fixtures/flow/interfaces-as-identifier/property/output.json b/packages/babel-parser/test/fixtures/flow/interfaces-as-identifier/property/output.json new file mode 100644 index 000000000000..671cbb4a675c --- /dev/null +++ b/packages/babel-parser/test/fixtures/flow/interfaces-as-identifier/property/output.json @@ -0,0 +1,48 @@ +{ + "type": "File", + "start":0,"end":25,"loc":{"start":{"line":1,"column":0},"end":{"line":3,"column":3}}, + "program": { + "type": "Program", + "start":0,"end":25,"loc":{"start":{"line":1,"column":0},"end":{"line":3,"column":3}}, + "sourceType": "module", + "interpreter": null, + "body": [ + { + "type": "ExpressionStatement", + "start":0,"end":25,"loc":{"start":{"line":1,"column":0},"end":{"line":3,"column":3}}, + "expression": { + "type": "ObjectExpression", + "start":1,"end":23,"loc":{"start":{"line":1,"column":1},"end":{"line":3,"column":1}}, + "extra": { + "parenthesized": true, + "parenStart": 0 + }, + "properties": [ + { + "type": "ObjectProperty", + "start":5,"end":21,"loc":{"start":{"line":2,"column":2},"end":{"line":2,"column":18}}, + "method": false, + "key": { + "type": "Identifier", + "start":5,"end":14,"loc":{"start":{"line":2,"column":2},"end":{"line":2,"column":11},"identifierName":"interface"}, + "name": "interface" + }, + "computed": false, + "shorthand": false, + "value": { + "type": "StringLiteral", + "start":16,"end":21,"loc":{"start":{"line":2,"column":13},"end":{"line":2,"column":18}}, + "extra": { + "rawValue": "foo", + "raw": "\"foo\"" + }, + "value": "foo" + } + } + ] + } + } + ], + "directives": [] + } +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/flow/interfaces-as-identifier/sequence-expression/input.js b/packages/babel-parser/test/fixtures/flow/interfaces-as-identifier/sequence-expression/input.js new file mode 100644 index 000000000000..c5d4ef3b0449 --- /dev/null +++ b/packages/babel-parser/test/fixtures/flow/interfaces-as-identifier/sequence-expression/input.js @@ -0,0 +1 @@ +(interface, "foo"); diff --git a/packages/babel-parser/test/fixtures/flow/interfaces-as-identifier/sequence-expression/output.json b/packages/babel-parser/test/fixtures/flow/interfaces-as-identifier/sequence-expression/output.json new file mode 100644 index 000000000000..638420bfde16 --- /dev/null +++ b/packages/babel-parser/test/fixtures/flow/interfaces-as-identifier/sequence-expression/output.json @@ -0,0 +1,44 @@ +{ + "type": "File", + "start":0,"end":19,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":19}}, + "errors": [ + "SyntaxError: Unexpected reserved word 'interface' (1:1)" + ], + "program": { + "type": "Program", + "start":0,"end":19,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":19}}, + "sourceType": "module", + "interpreter": null, + "body": [ + { + "type": "ExpressionStatement", + "start":0,"end":19,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":19}}, + "expression": { + "type": "SequenceExpression", + "start":1,"end":17,"loc":{"start":{"line":1,"column":1},"end":{"line":1,"column":17}}, + "extra": { + "parenthesized": true, + "parenStart": 0 + }, + "expressions": [ + { + "type": "Identifier", + "start":1,"end":10,"loc":{"start":{"line":1,"column":1},"end":{"line":1,"column":10},"identifierName":"interface"}, + "name": "interface" + }, + { + "type": "StringLiteral", + "start":12,"end":17,"loc":{"start":{"line":1,"column":12},"end":{"line":1,"column":17}}, + "extra": { + "rawValue": "foo", + "raw": "\"foo\"" + }, + "value": "foo" + } + ] + } + } + ], + "directives": [] + } +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/flow/interfaces-as-identifier/unary-expression/input.js b/packages/babel-parser/test/fixtures/flow/interfaces-as-identifier/unary-expression/input.js new file mode 100644 index 000000000000..9e541baea6af --- /dev/null +++ b/packages/babel-parser/test/fixtures/flow/interfaces-as-identifier/unary-expression/input.js @@ -0,0 +1 @@ +void interface; diff --git a/packages/babel-parser/test/fixtures/flow/interfaces-as-identifier/unary-expression/output.json b/packages/babel-parser/test/fixtures/flow/interfaces-as-identifier/unary-expression/output.json new file mode 100644 index 000000000000..47bfc9d51654 --- /dev/null +++ b/packages/babel-parser/test/fixtures/flow/interfaces-as-identifier/unary-expression/output.json @@ -0,0 +1,31 @@ +{ + "type": "File", + "start":0,"end":15,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":15}}, + "errors": [ + "SyntaxError: Unexpected reserved word 'interface' (1:5)" + ], + "program": { + "type": "Program", + "start":0,"end":15,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":15}}, + "sourceType": "module", + "interpreter": null, + "body": [ + { + "type": "ExpressionStatement", + "start":0,"end":15,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":15}}, + "expression": { + "type": "UnaryExpression", + "start":0,"end":14,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":14}}, + "operator": "void", + "prefix": true, + "argument": { + "type": "Identifier", + "start":5,"end":14,"loc":{"start":{"line":1,"column":5},"end":{"line":1,"column":14},"identifierName":"interface"}, + "name": "interface" + } + } + } + ], + "directives": [] + } +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/flow/interfaces-as-identifier/variable/input.js b/packages/babel-parser/test/fixtures/flow/interfaces-as-identifier/variable/input.js new file mode 100644 index 000000000000..d775ff7db743 --- /dev/null +++ b/packages/babel-parser/test/fixtures/flow/interfaces-as-identifier/variable/input.js @@ -0,0 +1 @@ +const interface = "foo"; diff --git a/packages/babel-parser/test/fixtures/flow/interfaces-as-identifier/variable/output.json b/packages/babel-parser/test/fixtures/flow/interfaces-as-identifier/variable/output.json new file mode 100644 index 000000000000..e040c227cced --- /dev/null +++ b/packages/babel-parser/test/fixtures/flow/interfaces-as-identifier/variable/output.json @@ -0,0 +1,41 @@ +{ + "type": "File", + "start":0,"end":24,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":24}}, + "errors": [ + "SyntaxError: Unexpected reserved word 'interface' (1:6)" + ], + "program": { + "type": "Program", + "start":0,"end":24,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":24}}, + "sourceType": "module", + "interpreter": null, + "body": [ + { + "type": "VariableDeclaration", + "start":0,"end":24,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":24}}, + "declarations": [ + { + "type": "VariableDeclarator", + "start":6,"end":23,"loc":{"start":{"line":1,"column":6},"end":{"line":1,"column":23}}, + "id": { + "type": "Identifier", + "start":6,"end":15,"loc":{"start":{"line":1,"column":6},"end":{"line":1,"column":15},"identifierName":"interface"}, + "name": "interface" + }, + "init": { + "type": "StringLiteral", + "start":18,"end":23,"loc":{"start":{"line":1,"column":18},"end":{"line":1,"column":23}}, + "extra": { + "rawValue": "foo", + "raw": "\"foo\"" + }, + "value": "foo" + } + } + ], + "kind": "const" + } + ], + "directives": [] + } +} \ No newline at end of file From 31806a3e7718aed419d6865e42352ec68db9268f Mon Sep 17 00:00:00 2001 From: sosukesuzuki Date: Mon, 26 Oct 2020 07:06:25 +0900 Subject: [PATCH 2/2] Address review comments --- packages/babel-parser/src/plugins/flow.js | 26 +++++++++++------------ 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/packages/babel-parser/src/plugins/flow.js b/packages/babel-parser/src/plugins/flow.js index ed2ddf0e45e2..53dc48f3067e 100644 --- a/packages/babel-parser/src/plugins/flow.js +++ b/packages/babel-parser/src/plugins/flow.js @@ -1730,28 +1730,28 @@ export default (superClass: Class): Class => // interfaces and enums parseStatement(context: ?string, topLevel?: boolean): N.Statement { // strict mode handling of `interface` since it's a reserved word - const lookahead = this.lookahead(); if ( this.state.strict && this.match(tt.name) && - this.state.value === "interface" && - (lookahead.type === tt.name || isKeyword(lookahead.value)) + this.state.value === "interface" ) { - const node = this.startNode(); - this.next(); - return this.flowParseInterface(node); + const lookahead = this.lookahead(); + if (lookahead.type === tt.name || isKeyword(lookahead.value)) { + const node = this.startNode(); + this.next(); + return this.flowParseInterface(node); + } } else if (this.shouldParseEnums() && this.isContextual("enum")) { const node = this.startNode(); this.next(); return this.flowParseEnumDeclaration(node); - } else { - const stmt = super.parseStatement(context, topLevel); - // We will parse a flow pragma in any comment before the first statement. - if (this.flowPragma === undefined && !this.isValidDirective(stmt)) { - this.flowPragma = null; - } - return stmt; } + const stmt = super.parseStatement(context, topLevel); + // We will parse a flow pragma in any comment before the first statement. + if (this.flowPragma === undefined && !this.isValidDirective(stmt)) { + this.flowPragma = null; + } + return stmt; } // declares, interfaces and type aliases