From bbb4d7b6d7c2182b997d966d4a8a5ff7e353e419 Mon Sep 17 00:00:00 2001 From: Tan Li Hau Date: Mon, 18 Feb 2019 15:22:22 +0800 Subject: [PATCH] Fix typescript generator params (#9524) * Fix typescript generator params * add TSOptionalType, TSRestType, add more test --- .../src/generators/typescript.js | 2 +- .../babel-generator/src/node/parentheses.js | 12 +++++++ .../types-union-intersection/output.js | 4 +-- packages/babel-generator/test/index.js | 34 +++++++++++++++++++ 4 files changed, 49 insertions(+), 3 deletions(-) diff --git a/packages/babel-generator/src/generators/typescript.js b/packages/babel-generator/src/generators/typescript.js index 83c279c1f1..c5d737892f 100644 --- a/packages/babel-generator/src/generators/typescript.js +++ b/packages/babel-generator/src/generators/typescript.js @@ -231,7 +231,7 @@ export function tsPrintBraced(members, node) { } export function TSArrayType(node) { - this.print(node.elementType); + this.print(node.elementType, node); this.token("[]"); } diff --git a/packages/babel-generator/src/node/parentheses.js b/packages/babel-generator/src/node/parentheses.js index c48988f0b2..8c38fa6272 100644 --- a/packages/babel-generator/src/node/parentheses.js +++ b/packages/babel-generator/src/node/parentheses.js @@ -136,6 +136,18 @@ export function TSTypeAssertion() { return true; } +export function TSUnionType(node: Object, parent: Object): boolean { + return ( + t.isTSArrayType(parent) || + t.isTSOptionalType(parent) || + t.isTSIntersectionType(parent) || + t.isTSUnionType(parent) || + t.isTSRestType(parent) + ); +} + +export { TSUnionType as TSIntersectionType }; + export function BinaryExpression(node: Object, parent: Object): boolean { // let i = (1 in []); // for ((1 in []);;); diff --git a/packages/babel-generator/test/fixtures/typescript/types-union-intersection/output.js b/packages/babel-generator/test/fixtures/typescript/types-union-intersection/output.js index 8f74eb81d7..24a187a151 100644 --- a/packages/babel-generator/test/fixtures/typescript/types-union-intersection/output.js +++ b/packages/babel-generator/test/fixtures/typescript/types-union-intersection/output.js @@ -1,4 +1,4 @@ let union: number | null | undefined; let intersection: number & string; -let precedence1: number | string & boolean; -let precedence2: number & string | boolean; \ No newline at end of file +let precedence1: number | (string & boolean); +let precedence2: (number & string) | boolean; \ No newline at end of file diff --git a/packages/babel-generator/test/index.js b/packages/babel-generator/test/index.js index bf2fef0dfd..c8b60b4051 100644 --- a/packages/babel-generator/test/index.js +++ b/packages/babel-generator/test/index.js @@ -426,6 +426,40 @@ describe("programmatic generation", function() { }).toThrow(); }); }); + + describe("typescript generate parantheses if necessary", function() { + it("wraps around union for array", () => { + const typeStatement = t.TSArrayType( + t.TSUnionType([ + t.TSIntersectionType([t.TSNumberKeyword(), t.TSBooleanKeyword()]), + t.TSNullKeyword(), + ]), + ); + const output = generate(typeStatement).code; + expect(output).toBe("((number & boolean) | null)[]"); + }); + it("wraps around intersection for array", () => { + const typeStatement = t.TSArrayType( + t.TSIntersectionType([t.TSNumberKeyword(), t.TSBooleanKeyword()]), + ); + const output = generate(typeStatement).code; + expect(output).toBe("(number & boolean)[]"); + }); + it("wraps around rest", () => { + const typeStatement = t.tsRestType( + t.TSIntersectionType([t.TSNumberKeyword(), t.TSBooleanKeyword()]), + ); + const output = generate(typeStatement).code; + expect(output).toBe("...(number & boolean)"); + }); + it("wraps around optional type", () => { + const typeStatement = t.tsOptionalType( + t.TSIntersectionType([t.TSNumberKeyword(), t.TSBooleanKeyword()]), + ); + const output = generate(typeStatement).code; + expect(output).toBe("(number & boolean)?"); + }); + }); }); describe("CodeGenerator", function() {