From 123a9596cefae2a1667ab30a6ae5903229a5e53d Mon Sep 17 00:00:00 2001 From: Sam Goldman Date: Wed, 23 Dec 2015 16:09:12 -0500 Subject: [PATCH 1/6] Add support for mixins to Babel 6.x --- packages/babylon/src/plugins/flow.js | 8 + .../flow/declare-statements/13/actual.js | 1 + .../flow/declare-statements/13/expected.json | 199 ++++++++++++++++++ 3 files changed, 208 insertions(+) create mode 100644 packages/babylon/test/fixtures/flow/declare-statements/13/actual.js create mode 100644 packages/babylon/test/fixtures/flow/declare-statements/13/expected.json diff --git a/packages/babylon/src/plugins/flow.js b/packages/babylon/src/plugins/flow.js index a0f32f550c..f25595058e 100644 --- a/packages/babylon/src/plugins/flow.js +++ b/packages/babylon/src/plugins/flow.js @@ -109,6 +109,7 @@ pp.flowParseInterfaceish = function (node, allowStatic) { } node.extends = []; + node.mixins = []; if (this.eat(tt._extends)) { do { @@ -116,6 +117,13 @@ pp.flowParseInterfaceish = function (node, allowStatic) { } while (this.eat(tt.comma)); } + if (this.isContextual("mixins")) { + this.next(); + do { + node.mixins.push(this.flowParseInterfaceExtends()); + } while (this.eat(tt.comma)); + } + node.body = this.flowParseObjectType(allowStatic); }; diff --git a/packages/babylon/test/fixtures/flow/declare-statements/13/actual.js b/packages/babylon/test/fixtures/flow/declare-statements/13/actual.js new file mode 100644 index 0000000000..c397cf82f9 --- /dev/null +++ b/packages/babylon/test/fixtures/flow/declare-statements/13/actual.js @@ -0,0 +1 @@ +declare class A mixins B, C {} diff --git a/packages/babylon/test/fixtures/flow/declare-statements/13/expected.json b/packages/babylon/test/fixtures/flow/declare-statements/13/expected.json new file mode 100644 index 0000000000..28eabe6252 --- /dev/null +++ b/packages/babylon/test/fixtures/flow/declare-statements/13/expected.json @@ -0,0 +1,199 @@ +{ + "type": "File", + "start": 0, + "end": 33, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 1, + "column": 33 + } + }, + "program": { + "type": "Program", + "start": 0, + "end": 33, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 1, + "column": 33 + } + }, + "sourceType": "module", + "body": [ + { + "type": "DeclareClass", + "start": 0, + "end": 33, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 1, + "column": 33 + } + }, + "id": { + "type": "Identifier", + "start": 14, + "end": 15, + "loc": { + "start": { + "line": 1, + "column": 14 + }, + "end": { + "line": 1, + "column": 15 + } + }, + "name": "A" + }, + "typeParameters": null, + "extends": [], + "mixins": [ + { + "type": "InterfaceExtends", + "start": 23, + "end": 27, + "loc": { + "start": { + "line": 1, + "column": 23 + }, + "end": { + "line": 1, + "column": 27 + } + }, + "id": { + "type": "Identifier", + "start": 23, + "end": 24, + "loc": { + "start": { + "line": 1, + "column": 23 + }, + "end": { + "line": 1, + "column": 24 + } + }, + "name": "B" + }, + "typeParameters": { + "type": "TypeParameterInstantiation", + "start": 24, + "end": 27, + "loc": { + "start": { + "line": 1, + "column": 24 + }, + "end": { + "line": 1, + "column": 27 + } + }, + "params": [ + { + "type": "GenericTypeAnnotation", + "start": 25, + "end": 26, + "loc": { + "start": { + "line": 1, + "column": 25 + }, + "end": { + "line": 1, + "column": 26 + } + }, + "typeParameters": null, + "id": { + "type": "Identifier", + "start": 25, + "end": 26, + "loc": { + "start": { + "line": 1, + "column": 25 + }, + "end": { + "line": 1, + "column": 26 + } + }, + "name": "T" + } + } + ] + } + }, + { + "type": "InterfaceExtends", + "start": 29, + "end": 30, + "loc": { + "start": { + "line": 1, + "column": 29 + }, + "end": { + "line": 1, + "column": 30 + } + }, + "id": { + "type": "Identifier", + "start": 29, + "end": 30, + "loc": { + "start": { + "line": 1, + "column": 29 + }, + "end": { + "line": 1, + "column": 30 + } + }, + "name": "C" + }, + "typeParameters": null + } + ], + "body": { + "type": "ObjectTypeAnnotation", + "start": 31, + "end": 33, + "loc": { + "start": { + "line": 1, + "column": 31 + }, + "end": { + "line": 1, + "column": 33 + } + }, + "callProperties": [], + "properties": [], + "indexers": [] + } + } + ], + "directives": [] + } +} \ No newline at end of file From bb874a4e46b7fac9dc31b99ac0bd35d2d29ba512 Mon Sep 17 00:00:00 2001 From: Sam Goldman Date: Wed, 23 Dec 2015 16:26:29 -0500 Subject: [PATCH 2/6] Add babel-generator support for mixins to Babel 6.x --- packages/babel-generator/src/generators/flow.js | 4 ++++ .../test/fixtures/flow/declare-statements/actual.js | 1 + .../test/fixtures/flow/declare-statements/expected.js | 1 + 3 files changed, 6 insertions(+) diff --git a/packages/babel-generator/src/generators/flow.js b/packages/babel-generator/src/generators/flow.js index 20d29d7cc4..decdde9d74 100644 --- a/packages/babel-generator/src/generators/flow.js +++ b/packages/babel-generator/src/generators/flow.js @@ -104,6 +104,10 @@ export function _interfaceish(node: Object) { this.push(" extends "); this.printJoin(node.extends, node, { separator: ", " }); } + if (node.mixins.length) { + this.push(" mixins "); + this.printJoin(node.mixins, node, { separator: ", " }); + } this.space(); this.print(node.body, node); } diff --git a/packages/babel-generator/test/fixtures/flow/declare-statements/actual.js b/packages/babel-generator/test/fixtures/flow/declare-statements/actual.js index 369f608fa2..0a6f430654 100644 --- a/packages/babel-generator/test/fixtures/flow/declare-statements/actual.js +++ b/packages/babel-generator/test/fixtures/flow/declare-statements/actual.js @@ -9,3 +9,4 @@ declare class A extends B { x: number } declare class A { static foo(): number; static x : string } declare class A { static [ indexer: number]: string } declare class A { static () : number } +declare class A mixins B, C {} diff --git a/packages/babel-generator/test/fixtures/flow/declare-statements/expected.js b/packages/babel-generator/test/fixtures/flow/declare-statements/expected.js index 323cc86f70..840c9b4004 100644 --- a/packages/babel-generator/test/fixtures/flow/declare-statements/expected.js +++ b/packages/babel-generator/test/fixtures/flow/declare-statements/expected.js @@ -9,3 +9,4 @@ declare class A extends B { x: number } declare class A { static foo(): number; static x: string; } declare class A { static [indexer: number]: string } declare class A { static (): number } +declare class A mixins B, C {} From e9c23ba7a1b4227024d61b8d3919ac8060fd3f42 Mon Sep 17 00:00:00 2001 From: Sam Goldman Date: Wed, 23 Dec 2015 16:37:14 -0500 Subject: [PATCH 3/6] Don't generate class mixins if prop doesn't exist --- packages/babel-generator/src/generators/flow.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/babel-generator/src/generators/flow.js b/packages/babel-generator/src/generators/flow.js index decdde9d74..b20ebe593a 100644 --- a/packages/babel-generator/src/generators/flow.js +++ b/packages/babel-generator/src/generators/flow.js @@ -104,7 +104,7 @@ export function _interfaceish(node: Object) { this.push(" extends "); this.printJoin(node.extends, node, { separator: ", " }); } - if (node.mixins.length) { + if (node.mixins && node.mixins.length) { this.push(" mixins "); this.printJoin(node.mixins, node, { separator: ", " }); } From b4f130fd144922951a8fe7fbd656627dea983ab5 Mon Sep 17 00:00:00 2001 From: Sam Goldman Date: Wed, 23 Dec 2015 16:42:23 -0500 Subject: [PATCH 4/6] Add test ensuring declare class w/ mixins are stripped --- .../test/fixtures/strip-types/strip-declare-statements/actual.js | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/babel-plugin-transform-flow-strip-types/test/fixtures/strip-types/strip-declare-statements/actual.js b/packages/babel-plugin-transform-flow-strip-types/test/fixtures/strip-types/strip-declare-statements/actual.js index 369f608fa2..0a6f430654 100644 --- a/packages/babel-plugin-transform-flow-strip-types/test/fixtures/strip-types/strip-declare-statements/actual.js +++ b/packages/babel-plugin-transform-flow-strip-types/test/fixtures/strip-types/strip-declare-statements/actual.js @@ -9,3 +9,4 @@ declare class A extends B { x: number } declare class A { static foo(): number; static x : string } declare class A { static [ indexer: number]: string } declare class A { static () : number } +declare class A mixins B, C {} From ef60fed7d6ca963e30212a0b89199505c69bd8e6 Mon Sep 17 00:00:00 2001 From: Sam Goldman Date: Wed, 23 Dec 2015 16:49:18 -0500 Subject: [PATCH 5/6] Add test ensuring declare statements are transformed to comments --- .../flow-comments/declare-statements/actual.js | 12 ++++++++++++ .../flow-comments/declare-statements/expected.js | 12 ++++++++++++ 2 files changed, 24 insertions(+) create mode 100644 packages/babel-plugin-transform-flow-comments/test/fixtures/flow-comments/declare-statements/actual.js create mode 100644 packages/babel-plugin-transform-flow-comments/test/fixtures/flow-comments/declare-statements/expected.js diff --git a/packages/babel-plugin-transform-flow-comments/test/fixtures/flow-comments/declare-statements/actual.js b/packages/babel-plugin-transform-flow-comments/test/fixtures/flow-comments/declare-statements/actual.js new file mode 100644 index 0000000000..0a6f430654 --- /dev/null +++ b/packages/babel-plugin-transform-flow-comments/test/fixtures/flow-comments/declare-statements/actual.js @@ -0,0 +1,12 @@ +declare var foo +declare var foo; +declare function foo(): void +declare function foo(): void; +declare function foo(): void; +declare function foo(x: number, y: string): void; +declare class A {} +declare class A extends B { x: number } +declare class A { static foo(): number; static x : string } +declare class A { static [ indexer: number]: string } +declare class A { static () : number } +declare class A mixins B, C {} diff --git a/packages/babel-plugin-transform-flow-comments/test/fixtures/flow-comments/declare-statements/expected.js b/packages/babel-plugin-transform-flow-comments/test/fixtures/flow-comments/declare-statements/expected.js new file mode 100644 index 0000000000..778b35f17f --- /dev/null +++ b/packages/babel-plugin-transform-flow-comments/test/fixtures/flow-comments/declare-statements/expected.js @@ -0,0 +1,12 @@ +/*:: declare var foo*/ +/*:: declare var foo;*/ +/*:: declare function foo(): void*/ +/*:: declare function foo(): void;*/ +/*:: declare function foo(): void;*/ +/*:: declare function foo(x: number, y: string): void;*/ +/*:: declare class A {}*/ +/*:: declare class A extends B { x: number }*/ +/*:: declare class A { static foo(): number; static x : string }*/ +/*:: declare class A { static [ indexer: number]: string }*/ +/*:: declare class A { static () : number }*/ +/*:: declare class A mixins B, C {}*/ From 5cfec9d8cafae8f56cf214e011be88f70f0cb22b Mon Sep 17 00:00:00 2001 From: Sam Goldman Date: Thu, 24 Dec 2015 10:31:03 -0500 Subject: [PATCH 6/6] Add mixins to the class declaration visitor --- packages/babel-types/src/definitions/es2015.js | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/babel-types/src/definitions/es2015.js b/packages/babel-types/src/definitions/es2015.js index d70cebd15d..7dcfb2475a 100644 --- a/packages/babel-types/src/definitions/es2015.js +++ b/packages/babel-types/src/definitions/es2015.js @@ -64,6 +64,7 @@ defineType("ClassDeclaration", { "id", "body", "superClass", + "mixins", "typeParameters", "superTypeParameters", "implements",