diff --git a/packages/babel-parser/src/plugins/flow.js b/packages/babel-parser/src/plugins/flow.js index d67393871209..f6d81fb6d1f2 100644 --- a/packages/babel-parser/src/plugins/flow.js +++ b/packages/babel-parser/src/plugins/flow.js @@ -3456,4 +3456,18 @@ export default (superClass: Class): Class => }); return this.finishNode(node, "EnumDeclaration"); } + + updateContext(prevType: TokenType): void { + if ( + this.match(tt.name) && + this.state.value === "of" && + prevType === tt.name && + this.input.slice(this.state.lastTokStart, this.state.lastTokEnd) === + "interface" + ) { + this.state.exprAllowed = false; + } else { + super.updateContext(prevType); + } + } }; diff --git a/packages/babel-parser/src/tokenizer/context.js b/packages/babel-parser/src/tokenizer/context.js index 3f3907872c06..064a81c9fc83 100644 --- a/packages/babel-parser/src/tokenizer/context.js +++ b/packages/babel-parser/src/tokenizer/context.js @@ -59,7 +59,10 @@ tt.name.updateContext = function(prevType) { let allowed = false; if (prevType !== tt.dot) { if ( - (this.state.value === "of" && !this.state.exprAllowed) || + (this.state.value === "of" && + !this.state.exprAllowed && + prevType !== tt._function && + prevType !== tt._class) || (this.state.value === "yield" && this.prodParam.hasYield) ) { allowed = true; diff --git a/packages/babel-parser/test/fixtures/flow/regression/issue-10675-class/input.js b/packages/babel-parser/test/fixtures/flow/regression/issue-10675-class/input.js new file mode 100644 index 000000000000..ba0916b8e4f9 --- /dev/null +++ b/packages/babel-parser/test/fixtures/flow/regression/issue-10675-class/input.js @@ -0,0 +1,2 @@ +class of {} + diff --git a/packages/babel-parser/test/fixtures/flow/regression/issue-10675-class/options.json b/packages/babel-parser/test/fixtures/flow/regression/issue-10675-class/options.json new file mode 100644 index 000000000000..7c91792f0e9c --- /dev/null +++ b/packages/babel-parser/test/fixtures/flow/regression/issue-10675-class/options.json @@ -0,0 +1,7 @@ +{ + "sourceType": "module", + "plugins": [ + "jsx", + "flow" + ] +} diff --git a/packages/babel-parser/test/fixtures/flow/regression/issue-10675-class/output.json b/packages/babel-parser/test/fixtures/flow/regression/issue-10675-class/output.json new file mode 100644 index 000000000000..d3709929d73e --- /dev/null +++ b/packages/babel-parser/test/fixtures/flow/regression/issue-10675-class/output.json @@ -0,0 +1,40 @@ +{ + "type": "File", + "start":0,"end":14,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":14}}, + "program": { + "type": "Program", + "start":0,"end":14,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":14}}, + "sourceType": "module", + "interpreter": null, + "body": [ + { + "type": "ClassDeclaration", + "start":0,"end":14,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":14}}, + "id": { + "type": "Identifier", + "start":6,"end":8,"loc":{"start":{"line":1,"column":6},"end":{"line":1,"column":8},"identifierName":"of"}, + "name": "of" + }, + "typeParameters": { + "type": "TypeParameterDeclaration", + "start":8,"end":11,"loc":{"start":{"line":1,"column":8},"end":{"line":1,"column":11}}, + "params": [ + { + "type": "TypeParameter", + "start":9,"end":10,"loc":{"start":{"line":1,"column":9},"end":{"line":1,"column":10}}, + "name": "T", + "variance": null + } + ] + }, + "superClass": null, + "body": { + "type": "ClassBody", + "start":12,"end":14,"loc":{"start":{"line":1,"column":12},"end":{"line":1,"column":14}}, + "body": [] + } + } + ], + "directives": [] + } +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/flow/regression/issue-10675-function/input.js b/packages/babel-parser/test/fixtures/flow/regression/issue-10675-function/input.js new file mode 100644 index 000000000000..1f364d918343 --- /dev/null +++ b/packages/babel-parser/test/fixtures/flow/regression/issue-10675-function/input.js @@ -0,0 +1,2 @@ +function of() {} + diff --git a/packages/babel-parser/test/fixtures/flow/regression/issue-10675-function/options.json b/packages/babel-parser/test/fixtures/flow/regression/issue-10675-function/options.json new file mode 100644 index 000000000000..7c91792f0e9c --- /dev/null +++ b/packages/babel-parser/test/fixtures/flow/regression/issue-10675-function/options.json @@ -0,0 +1,7 @@ +{ + "sourceType": "module", + "plugins": [ + "jsx", + "flow" + ] +} diff --git a/packages/babel-parser/test/fixtures/flow/regression/issue-10675-function/output.json b/packages/babel-parser/test/fixtures/flow/regression/issue-10675-function/output.json new file mode 100644 index 000000000000..d5037bec0d39 --- /dev/null +++ b/packages/babel-parser/test/fixtures/flow/regression/issue-10675-function/output.json @@ -0,0 +1,43 @@ +{ + "type": "File", + "start":0,"end":19,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":19}}, + "program": { + "type": "Program", + "start":0,"end":19,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":19}}, + "sourceType": "module", + "interpreter": null, + "body": [ + { + "type": "FunctionDeclaration", + "start":0,"end":19,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":19}}, + "id": { + "type": "Identifier", + "start":9,"end":11,"loc":{"start":{"line":1,"column":9},"end":{"line":1,"column":11},"identifierName":"of"}, + "name": "of" + }, + "generator": false, + "async": false, + "typeParameters": { + "type": "TypeParameterDeclaration", + "start":11,"end":14,"loc":{"start":{"line":1,"column":11},"end":{"line":1,"column":14}}, + "params": [ + { + "type": "TypeParameter", + "start":12,"end":13,"loc":{"start":{"line":1,"column":12},"end":{"line":1,"column":13}}, + "name": "T", + "variance": null + } + ] + }, + "params": [], + "body": { + "type": "BlockStatement", + "start":17,"end":19,"loc":{"start":{"line":1,"column":17},"end":{"line":1,"column":19}}, + "body": [], + "directives": [] + } + } + ], + "directives": [] + } +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/flow/regression/issue-10675-interface/input.js b/packages/babel-parser/test/fixtures/flow/regression/issue-10675-interface/input.js new file mode 100644 index 000000000000..a8ffa68c54cb --- /dev/null +++ b/packages/babel-parser/test/fixtures/flow/regression/issue-10675-interface/input.js @@ -0,0 +1,2 @@ +interface of {} + diff --git a/packages/babel-parser/test/fixtures/flow/regression/issue-10675-interface/options.json b/packages/babel-parser/test/fixtures/flow/regression/issue-10675-interface/options.json new file mode 100644 index 000000000000..7c91792f0e9c --- /dev/null +++ b/packages/babel-parser/test/fixtures/flow/regression/issue-10675-interface/options.json @@ -0,0 +1,7 @@ +{ + "sourceType": "module", + "plugins": [ + "jsx", + "flow" + ] +} diff --git a/packages/babel-parser/test/fixtures/flow/regression/issue-10675-interface/output.json b/packages/babel-parser/test/fixtures/flow/regression/issue-10675-interface/output.json new file mode 100644 index 000000000000..4c32af6e95ec --- /dev/null +++ b/packages/babel-parser/test/fixtures/flow/regression/issue-10675-interface/output.json @@ -0,0 +1,46 @@ +{ + "type": "File", + "start":0,"end":18,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":18}}, + "program": { + "type": "Program", + "start":0,"end":18,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":18}}, + "sourceType": "module", + "interpreter": null, + "body": [ + { + "type": "InterfaceDeclaration", + "start":0,"end":18,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":18}}, + "id": { + "type": "Identifier", + "start":10,"end":12,"loc":{"start":{"line":1,"column":10},"end":{"line":1,"column":12},"identifierName":"of"}, + "name": "of" + }, + "typeParameters": { + "type": "TypeParameterDeclaration", + "start":12,"end":15,"loc":{"start":{"line":1,"column":12},"end":{"line":1,"column":15}}, + "params": [ + { + "type": "TypeParameter", + "start":13,"end":14,"loc":{"start":{"line":1,"column":13},"end":{"line":1,"column":14}}, + "name": "T", + "variance": null + } + ] + }, + "extends": [], + "implements": [], + "mixins": [], + "body": { + "type": "ObjectTypeAnnotation", + "start":16,"end":18,"loc":{"start":{"line":1,"column":16},"end":{"line":1,"column":18}}, + "callProperties": [], + "properties": [], + "indexers": [], + "internalSlots": [], + "exact": false + } + } + ], + "directives": [] + } +} \ No newline at end of file