From 734bc25a64bd693e133ce6024c68a160feb5d191 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hu=C3=A1ng=20J=C3=B9nli=C3=A0ng?= Date: Thu, 9 Mar 2023 10:59:01 -0500 Subject: [PATCH] disallow mixins/implements in flow interface --- .../babel-parser/src/plugins/flow/index.ts | 31 +++++++++---------- .../invalid-declare-implements/input.js | 1 + .../invalid-declare-implements/options.json | 3 ++ .../invalid-declare-mixins/input.js | 1 + .../invalid-declare-mixins/options.json | 3 ++ .../invalid-implements/input.js | 1 + .../invalid-implements/options.json | 3 ++ .../interface-types/invalid-mixins/input.js | 1 + .../invalid-mixins/options.json | 3 ++ 9 files changed, 30 insertions(+), 17 deletions(-) create mode 100644 packages/babel-parser/test/fixtures/flow/interface-types/invalid-declare-implements/input.js create mode 100644 packages/babel-parser/test/fixtures/flow/interface-types/invalid-declare-implements/options.json create mode 100644 packages/babel-parser/test/fixtures/flow/interface-types/invalid-declare-mixins/input.js create mode 100644 packages/babel-parser/test/fixtures/flow/interface-types/invalid-declare-mixins/options.json create mode 100644 packages/babel-parser/test/fixtures/flow/interface-types/invalid-implements/input.js create mode 100644 packages/babel-parser/test/fixtures/flow/interface-types/invalid-implements/options.json create mode 100644 packages/babel-parser/test/fixtures/flow/interface-types/invalid-mixins/input.js create mode 100644 packages/babel-parser/test/fixtures/flow/interface-types/invalid-mixins/options.json diff --git a/packages/babel-parser/src/plugins/flow/index.ts b/packages/babel-parser/src/plugins/flow/index.ts index 013f94d6d54c..e4ed21f1d96c 100644 --- a/packages/babel-parser/src/plugins/flow/index.ts +++ b/packages/babel-parser/src/plugins/flow/index.ts @@ -692,16 +692,13 @@ export default (superClass: typeof Parser) => node: Undone, ): N.FlowDeclareInterface { this.next(); - this.flowParseInterfaceish(node); + this.flowParseInterfaceish(node, /* isClass */ false); return this.finishNode(node, "DeclareInterface"); } // Interfaces - flowParseInterfaceish( - node: Undone, - isClass: boolean = false, - ): void { + flowParseInterfaceish(node: Undone, isClass: boolean): void { node.id = this.flowParseRestrictedIdentifier( /* liberal */ !isClass, /* declaration */ true, @@ -729,18 +726,18 @@ export default (superClass: typeof Parser) => } while (!isClass && this.eat(tt.comma)); } - if (this.isContextual(tt._mixins)) { - this.next(); - do { - node.mixins.push(this.flowParseInterfaceExtends()); - } while (this.eat(tt.comma)); - } + if (isClass) { + if (this.eatContextual(tt._mixins)) { + do { + node.mixins.push(this.flowParseInterfaceExtends()); + } while (this.eat(tt.comma)); + } - if (this.isContextual(tt._implements)) { - this.next(); - do { - node.implements.push(this.flowParseInterfaceExtends()); - } while (this.eat(tt.comma)); + if (this.eatContextual(tt._implements)) { + do { + node.implements.push(this.flowParseInterfaceExtends()); + } while (this.eat(tt.comma)); + } } node.body = this.flowParseObjectType({ @@ -766,7 +763,7 @@ export default (superClass: typeof Parser) => } flowParseInterface(node: Undone): N.FlowInterface { - this.flowParseInterfaceish(node); + this.flowParseInterfaceish(node, /* isClass */ false); return this.finishNode(node, "InterfaceDeclaration"); } diff --git a/packages/babel-parser/test/fixtures/flow/interface-types/invalid-declare-implements/input.js b/packages/babel-parser/test/fixtures/flow/interface-types/invalid-declare-implements/input.js new file mode 100644 index 000000000000..bb61502a3188 --- /dev/null +++ b/packages/babel-parser/test/fixtures/flow/interface-types/invalid-declare-implements/input.js @@ -0,0 +1 @@ +declare interface A implements I { p: string } diff --git a/packages/babel-parser/test/fixtures/flow/interface-types/invalid-declare-implements/options.json b/packages/babel-parser/test/fixtures/flow/interface-types/invalid-declare-implements/options.json new file mode 100644 index 000000000000..8f6f37f71464 --- /dev/null +++ b/packages/babel-parser/test/fixtures/flow/interface-types/invalid-declare-implements/options.json @@ -0,0 +1,3 @@ +{ + "throws": "Unexpected token, expected \"{\" (1:20)" +} diff --git a/packages/babel-parser/test/fixtures/flow/interface-types/invalid-declare-mixins/input.js b/packages/babel-parser/test/fixtures/flow/interface-types/invalid-declare-mixins/input.js new file mode 100644 index 000000000000..d23f2e3aeb64 --- /dev/null +++ b/packages/babel-parser/test/fixtures/flow/interface-types/invalid-declare-mixins/input.js @@ -0,0 +1 @@ +declare interface A mixins M { p: string } diff --git a/packages/babel-parser/test/fixtures/flow/interface-types/invalid-declare-mixins/options.json b/packages/babel-parser/test/fixtures/flow/interface-types/invalid-declare-mixins/options.json new file mode 100644 index 000000000000..8f6f37f71464 --- /dev/null +++ b/packages/babel-parser/test/fixtures/flow/interface-types/invalid-declare-mixins/options.json @@ -0,0 +1,3 @@ +{ + "throws": "Unexpected token, expected \"{\" (1:20)" +} diff --git a/packages/babel-parser/test/fixtures/flow/interface-types/invalid-implements/input.js b/packages/babel-parser/test/fixtures/flow/interface-types/invalid-implements/input.js new file mode 100644 index 000000000000..ac35757fec62 --- /dev/null +++ b/packages/babel-parser/test/fixtures/flow/interface-types/invalid-implements/input.js @@ -0,0 +1 @@ +interface A implements I { p: string } diff --git a/packages/babel-parser/test/fixtures/flow/interface-types/invalid-implements/options.json b/packages/babel-parser/test/fixtures/flow/interface-types/invalid-implements/options.json new file mode 100644 index 000000000000..79f7e5730a1c --- /dev/null +++ b/packages/babel-parser/test/fixtures/flow/interface-types/invalid-implements/options.json @@ -0,0 +1,3 @@ +{ + "throws": "Unexpected token, expected \"{\" (1:12)" +} diff --git a/packages/babel-parser/test/fixtures/flow/interface-types/invalid-mixins/input.js b/packages/babel-parser/test/fixtures/flow/interface-types/invalid-mixins/input.js new file mode 100644 index 000000000000..2a4dc210e835 --- /dev/null +++ b/packages/babel-parser/test/fixtures/flow/interface-types/invalid-mixins/input.js @@ -0,0 +1 @@ +interface A mixins M { p: string } diff --git a/packages/babel-parser/test/fixtures/flow/interface-types/invalid-mixins/options.json b/packages/babel-parser/test/fixtures/flow/interface-types/invalid-mixins/options.json new file mode 100644 index 000000000000..79f7e5730a1c --- /dev/null +++ b/packages/babel-parser/test/fixtures/flow/interface-types/invalid-mixins/options.json @@ -0,0 +1,3 @@ +{ + "throws": "Unexpected token, expected \"{\" (1:12)" +}