From 87f459dce7bbb2b467e6fddace3e27d8fee72104 Mon Sep 17 00:00:00 2001 From: Alexey Berezin Date: Sat, 4 Apr 2020 19:12:41 +0300 Subject: [PATCH 01/11] =?UTF-8?q?=E2=9E=95=20add=20test=20fixture?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../test/fixtures/type-reference/input.ts | 13 +++++++++++++ .../test/fixtures/type-reference/options.json | 4 ++++ 2 files changed, 17 insertions(+) create mode 100644 packages/babel-traverse/test/fixtures/type-reference/input.ts create mode 100644 packages/babel-traverse/test/fixtures/type-reference/options.json diff --git a/packages/babel-traverse/test/fixtures/type-reference/input.ts b/packages/babel-traverse/test/fixtures/type-reference/input.ts new file mode 100644 index 000000000000..5f03dd440acf --- /dev/null +++ b/packages/babel-traverse/test/fixtures/type-reference/input.ts @@ -0,0 +1,13 @@ +function bug() { + const x = 1 ? a() : b(); + + return [...x]; +} + +function a(): number[] { + return []; +} + +function b(): number[] { + return []; +} diff --git a/packages/babel-traverse/test/fixtures/type-reference/options.json b/packages/babel-traverse/test/fixtures/type-reference/options.json new file mode 100644 index 000000000000..ee5254f3f4c2 --- /dev/null +++ b/packages/babel-traverse/test/fixtures/type-reference/options.json @@ -0,0 +1,4 @@ +{ + "plugins": ["transform-spread"], + "presets": ["typescript"] +} \ No newline at end of file From e0f3fc2dfd3d7320887e2259757afc03fce81271 Mon Sep 17 00:00:00 2001 From: Alexey Berezin Date: Sat, 4 Apr 2020 23:53:09 +0300 Subject: [PATCH 02/11] =?UTF-8?q?=E2=9E=95=20add=20removeTypeDuplicates=20?= =?UTF-8?q?for=20typescript?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../typescript/removeTypeDuplicates.js | 74 +++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 packages/babel-types/src/modifications/typescript/removeTypeDuplicates.js diff --git a/packages/babel-types/src/modifications/typescript/removeTypeDuplicates.js b/packages/babel-types/src/modifications/typescript/removeTypeDuplicates.js new file mode 100644 index 000000000000..ba18fce02b5d --- /dev/null +++ b/packages/babel-types/src/modifications/typescript/removeTypeDuplicates.js @@ -0,0 +1,74 @@ +import { + isTSAnyKeyword, + isTSUnionType, + isTSTypeParameter, +} from "../../validators/generated"; + +/** + * Dedupe type annotations. + */ +export default function removeTypeDuplicates( + nodes: Array, +): Array { + const generics = {}; + // FIXME: I don't understand the purpose of bases for Flow (if it has an analogue for TS) + // const bases = {}; + + // store union type groups to circular references + const typeGroups = []; + + const types = []; + + for (let i = 0; i < nodes.length; i++) { + const node = nodes[i]; + if (!node) continue; + + // detect duplicates + if (types.indexOf(node) >= 0) { + continue; + } + + if (isTSAnyKeyword(node)) { + return [node]; + } + + // FIXME: I don't understand the purpose of bases for Flow (if it has an analogue for TS) + // if (isFlowBaseAnnotation(node)) { + // bases[node.type] = node; + // continue; + // } + + if (isTSUnionType(node)) { + if (typeGroups.indexOf(node.types) < 0) { + nodes = nodes.concat(node.types); + typeGroups.push(node.types); + } + continue; + } + + if (isTSTypeParameter(node)) { + const name = node.name; + + if (!generics[name]) { + generics[name] = node; + } + + continue; + } + + types.push(node); + } + + // FIXME: I don't understand the purpose of bases for Flow (if it has an analogue for TS) + // add back in bases + // for (const type of Object.keys(bases)) { + // types.push(bases[type]); + // } + + // add back in generics + for (const name of Object.keys(generics)) { + types.push(generics[name]); + } + + return types; +} From 4740c97c2bb0841da42e1292f1b5afa058517f3a Mon Sep 17 00:00:00 2001 From: Alexey Berezin Date: Sat, 4 Apr 2020 23:53:39 +0300 Subject: [PATCH 03/11] =?UTF-8?q?=E2=9E=95=20add=20createTSUnionType=20for?= =?UTF-8?q?=20typescript?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/builders/typescript/createTSUnionType.js | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 packages/babel-types/src/builders/typescript/createTSUnionType.js diff --git a/packages/babel-types/src/builders/typescript/createTSUnionType.js b/packages/babel-types/src/builders/typescript/createTSUnionType.js new file mode 100644 index 000000000000..2d6aec199ba1 --- /dev/null +++ b/packages/babel-types/src/builders/typescript/createTSUnionType.js @@ -0,0 +1,16 @@ +import { TSUnionType } from "../generated"; +import removeTypeDuplicates from "../../modifications/typescript/removeTypeDuplicates"; + +/** + * Takes an array of `types` and flattens them, removing duplicates and + * returns a `UnionTypeAnnotation` node containg them. + */ +export default function createTSUnionType(types: Array): Object { + const flattened = removeTypeDuplicates(types); + + if (flattened.length === 1) { + return flattened[0]; + } else { + return TSUnionType(flattened); + } +} From ae083965e8ae2a1d0366db2e35a93ba105cd4948 Mon Sep 17 00:00:00 2001 From: Alexey Berezin Date: Sat, 4 Apr 2020 23:54:27 +0300 Subject: [PATCH 04/11] =?UTF-8?q?=F0=9F=92=8A=20fix=20ConditionalExpressio?= =?UTF-8?q?n=20for=20typescript?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/babel-traverse/src/path/inference/inferers.js | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/packages/babel-traverse/src/path/inference/inferers.js b/packages/babel-traverse/src/path/inference/inferers.js index fb9a467b1f64..7faf96b33748 100644 --- a/packages/babel-traverse/src/path/inference/inferers.js +++ b/packages/babel-traverse/src/path/inference/inferers.js @@ -89,7 +89,15 @@ export function LogicalExpression() { ]); } -export function ConditionalExpression() { +export function ConditionalExpression(node) { + console.log(node); + if (t.isTSTypeAnnotation(node)) { + return t.createTSUnionType([ + this.get("consequent").getTypeAnnotation(), + this.get("alternate").getTypeAnnotation(), + ]); + } + return t.createUnionTypeAnnotation([ this.get("consequent").getTypeAnnotation(), this.get("alternate").getTypeAnnotation(), From d9c792d0ed3a96478667fb269102e7352396bbd7 Mon Sep 17 00:00:00 2001 From: Alexey Berezin Date: Sun, 5 Apr 2020 11:38:55 +0300 Subject: [PATCH 05/11] =?UTF-8?q?=F0=9F=92=8A=20fix=20ConditionalExpressio?= =?UTF-8?q?n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/path/inference/inferers.js | 20 +++++++++---------- packages/babel-types/src/index.js | 1 + 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/packages/babel-traverse/src/path/inference/inferers.js b/packages/babel-traverse/src/path/inference/inferers.js index 7faf96b33748..f584e66a9d69 100644 --- a/packages/babel-traverse/src/path/inference/inferers.js +++ b/packages/babel-traverse/src/path/inference/inferers.js @@ -89,19 +89,17 @@ export function LogicalExpression() { ]); } -export function ConditionalExpression(node) { - console.log(node); - if (t.isTSTypeAnnotation(node)) { - return t.createTSUnionType([ - this.get("consequent").getTypeAnnotation(), - this.get("alternate").getTypeAnnotation(), - ]); - } - - return t.createUnionTypeAnnotation([ +export function ConditionalExpression() { + const argumentTypes = [ this.get("consequent").getTypeAnnotation(), this.get("alternate").getTypeAnnotation(), - ]); + ]; + + if (argumentTypes.every(t.isTSTypeAnnotation)) { + return t.createTSUnionType(argumentTypes); + } + + return t.createUnionTypeAnnotation(argumentTypes); } export function SequenceExpression() { diff --git a/packages/babel-types/src/index.js b/packages/babel-types/src/index.js index b0586a4f90ec..a2126a1fe81c 100644 --- a/packages/babel-types/src/index.js +++ b/packages/babel-types/src/index.js @@ -10,6 +10,7 @@ export * from "./asserts/generated"; // builders export { default as createTypeAnnotationBasedOnTypeof } from "./builders/flow/createTypeAnnotationBasedOnTypeof"; export { default as createUnionTypeAnnotation } from "./builders/flow/createUnionTypeAnnotation"; +export { default as createTSUnionType } from "./builders/typescript/createTSUnionType"; export * from "./builders/generated"; // clone From aa8c16ab25b1edaf61ab670218816da30c23acc8 Mon Sep 17 00:00:00 2001 From: Alexey Berezin Date: Sun, 5 Apr 2020 14:30:57 +0300 Subject: [PATCH 06/11] =?UTF-8?q?=F0=9F=92=8A=20fix=20added=20test=20case?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/path/inference/inferer-reference.js | 17 +++++- .../src/path/inference/inferers.js | 10 +++- .../builders/typescript/createTSUnionType.js | 5 +- .../typescript/removeTypeDuplicates.js | 59 ++++++++++++------- 4 files changed, 64 insertions(+), 27 deletions(-) diff --git a/packages/babel-traverse/src/path/inference/inferer-reference.js b/packages/babel-traverse/src/path/inference/inferer-reference.js index 0af6f1eedb04..fd51ff12b687 100644 --- a/packages/babel-traverse/src/path/inference/inferer-reference.js +++ b/packages/babel-traverse/src/path/inference/inferer-reference.js @@ -91,9 +91,15 @@ function getTypeAnnotationBindingConstantViolations(binding, path, name) { } } - if (types.length) { - return t.createUnionTypeAnnotation(types); + if (!types.length) { + return; + } + + if (types.every(t.isTSTypeAnnotation)) { + return t.createTSUnionType(types); } + + return t.createUnionTypeAnnotation(types); } function getConstantViolationsBefore(binding, path, functions) { @@ -201,6 +207,13 @@ function getConditionalAnnotation(binding, path, name) { } if (types.length) { + if (types.every(t.isTSTypeAnnotation)) { + return { + typeAnnotation: t.createTSUnionType(types), + ifStatement, + }; + } + return { typeAnnotation: t.createUnionTypeAnnotation(types), ifStatement, diff --git a/packages/babel-traverse/src/path/inference/inferers.js b/packages/babel-traverse/src/path/inference/inferers.js index f584e66a9d69..54e9465a7657 100644 --- a/packages/babel-traverse/src/path/inference/inferers.js +++ b/packages/babel-traverse/src/path/inference/inferers.js @@ -83,10 +83,16 @@ export function BinaryExpression(node) { } export function LogicalExpression() { - return t.createUnionTypeAnnotation([ + const argumentTypes = [ this.get("left").getTypeAnnotation(), this.get("right").getTypeAnnotation(), - ]); + ]; + + if (argumentTypes.every(t.isTSTypeAnnotation)) { + return t.createTSUnionType(argumentTypes); + } + + return t.createUnionTypeAnnotation(argumentTypes); } export function ConditionalExpression() { diff --git a/packages/babel-types/src/builders/typescript/createTSUnionType.js b/packages/babel-types/src/builders/typescript/createTSUnionType.js index 2d6aec199ba1..49138ad029f3 100644 --- a/packages/babel-types/src/builders/typescript/createTSUnionType.js +++ b/packages/babel-types/src/builders/typescript/createTSUnionType.js @@ -5,7 +5,10 @@ import removeTypeDuplicates from "../../modifications/typescript/removeTypeDupli * Takes an array of `types` and flattens them, removing duplicates and * returns a `UnionTypeAnnotation` node containg them. */ -export default function createTSUnionType(types: Array): Object { +export default function createTSUnionType( + typeAnnotations: Array, +): Object { + const types = typeAnnotations.map(type => type.typeAnnotations); const flattened = removeTypeDuplicates(types); if (flattened.length === 1) { diff --git a/packages/babel-types/src/modifications/typescript/removeTypeDuplicates.js b/packages/babel-types/src/modifications/typescript/removeTypeDuplicates.js index ba18fce02b5d..fced87a8e118 100644 --- a/packages/babel-types/src/modifications/typescript/removeTypeDuplicates.js +++ b/packages/babel-types/src/modifications/typescript/removeTypeDuplicates.js @@ -1,7 +1,18 @@ import { isTSAnyKeyword, isTSUnionType, - isTSTypeParameter, + isTSBooleanKeyword, + isTSBigIntKeyword, + isTSNeverKeyword, + isTSNullKeyword, + isTSNumberKeyword, + isTSObjectKeyword, + isTSStringKeyword, + isTSUnknownKeyword, + isTSVoidKeyword, + isTSUndefinedKeyword, + isTSLiteralType, + isTSThisType, } from "../../validators/generated"; /** @@ -11,8 +22,7 @@ export default function removeTypeDuplicates( nodes: Array, ): Array { const generics = {}; - // FIXME: I don't understand the purpose of bases for Flow (if it has an analogue for TS) - // const bases = {}; + const bases = {}; // store union type groups to circular references const typeGroups = []; @@ -28,15 +38,29 @@ export default function removeTypeDuplicates( continue; } - if (isTSAnyKeyword(node)) { + // this type matches anything + if (isTSAnyKeyword(node.type)) { return [node]; } - // FIXME: I don't understand the purpose of bases for Flow (if it has an analogue for TS) - // if (isFlowBaseAnnotation(node)) { - // bases[node.type] = node; - // continue; - // } + // Basic TS types, analogue of FlowBaseAnnotation + if ( + isTSBooleanKeyword(node) || + isTSBigIntKeyword(node) || + isTSNeverKeyword(node) || + isTSNullKeyword(node) || + isTSNumberKeyword(node) || + isTSObjectKeyword(node) || + isTSStringKeyword(node) || + isTSUndefinedKeyword(node) || + isTSUnknownKeyword(node) || + isTSVoidKeyword(node) || + isTSThisType(node) || + isTSLiteralType(node) + ) { + bases[node.type] = node; + continue; + } if (isTSUnionType(node)) { if (typeGroups.indexOf(node.types) < 0) { @@ -46,24 +70,15 @@ export default function removeTypeDuplicates( continue; } - if (isTSTypeParameter(node)) { - const name = node.name; - - if (!generics[name]) { - generics[name] = node; - } - - continue; - } + // TODO: add generic types types.push(node); } - // FIXME: I don't understand the purpose of bases for Flow (if it has an analogue for TS) // add back in bases - // for (const type of Object.keys(bases)) { - // types.push(bases[type]); - // } + for (const type of Object.keys(bases)) { + types.push(bases[type]); + } // add back in generics for (const name of Object.keys(generics)) { From fb48f709a44986bb982e15b8b7d07be22b5fdf29 Mon Sep 17 00:00:00 2001 From: Alexey Berezin Date: Sun, 5 Apr 2020 14:44:24 +0300 Subject: [PATCH 07/11] =?UTF-8?q?=E2=9E=95=20add=20new=20line=20at=20the?= =?UTF-8?q?=20end=20of=20the=20file?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../babel-traverse/test/fixtures/type-reference/options.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/babel-traverse/test/fixtures/type-reference/options.json b/packages/babel-traverse/test/fixtures/type-reference/options.json index ee5254f3f4c2..f809bfc203e2 100644 --- a/packages/babel-traverse/test/fixtures/type-reference/options.json +++ b/packages/babel-traverse/test/fixtures/type-reference/options.json @@ -1,4 +1,4 @@ { "plugins": ["transform-spread"], "presets": ["typescript"] -} \ No newline at end of file +} From 7e2c323c589c43bec1ab5b38ecb211556abbe511 Mon Sep 17 00:00:00 2001 From: Alexey Berezin Date: Wed, 8 Apr 2020 18:59:46 +0300 Subject: [PATCH 08/11] =?UTF-8?q?=F0=9F=92=8A=20types.every(f)=20=3D>=20f(?= =?UTF-8?q?types[0])?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../babel-traverse/src/path/inference/inferer-reference.js | 4 ++-- packages/babel-traverse/src/path/inference/inferers.js | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/babel-traverse/src/path/inference/inferer-reference.js b/packages/babel-traverse/src/path/inference/inferer-reference.js index fd51ff12b687..dc0a69b6c6b6 100644 --- a/packages/babel-traverse/src/path/inference/inferer-reference.js +++ b/packages/babel-traverse/src/path/inference/inferer-reference.js @@ -95,7 +95,7 @@ function getTypeAnnotationBindingConstantViolations(binding, path, name) { return; } - if (types.every(t.isTSTypeAnnotation)) { + if (t.isTSTypeAnnotation(types[0])) { return t.createTSUnionType(types); } @@ -207,7 +207,7 @@ function getConditionalAnnotation(binding, path, name) { } if (types.length) { - if (types.every(t.isTSTypeAnnotation)) { + if (t.isTSTypeAnnotation(types[0])) { return { typeAnnotation: t.createTSUnionType(types), ifStatement, diff --git a/packages/babel-traverse/src/path/inference/inferers.js b/packages/babel-traverse/src/path/inference/inferers.js index 54e9465a7657..988af8426948 100644 --- a/packages/babel-traverse/src/path/inference/inferers.js +++ b/packages/babel-traverse/src/path/inference/inferers.js @@ -88,7 +88,7 @@ export function LogicalExpression() { this.get("right").getTypeAnnotation(), ]; - if (argumentTypes.every(t.isTSTypeAnnotation)) { + if (t.isTSTypeAnnotation(argumentTypes[0])) { return t.createTSUnionType(argumentTypes); } @@ -101,7 +101,7 @@ export function ConditionalExpression() { this.get("alternate").getTypeAnnotation(), ]; - if (argumentTypes.every(t.isTSTypeAnnotation)) { + if (t.isTSTypeAnnotation(argumentTypes[0])) { return t.createTSUnionType(argumentTypes); } From 65331a3f9df5a3fb5d0e75aff785a3e27948c482 Mon Sep 17 00:00:00 2001 From: Alexey Berezin Date: Wed, 8 Apr 2020 19:02:38 +0300 Subject: [PATCH 09/11] =?UTF-8?q?=F0=9F=94=84=20bug=20=3D>=20foo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/babel-traverse/test/fixtures/type-reference/input.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/babel-traverse/test/fixtures/type-reference/input.ts b/packages/babel-traverse/test/fixtures/type-reference/input.ts index 5f03dd440acf..9fc2c011bd9c 100644 --- a/packages/babel-traverse/test/fixtures/type-reference/input.ts +++ b/packages/babel-traverse/test/fixtures/type-reference/input.ts @@ -1,4 +1,4 @@ -function bug() { +function foo() { const x = 1 ? a() : b(); return [...x]; From 93d5af2c41631d990b5d39ee3a04dbf47c5b551e Mon Sep 17 00:00:00 2001 From: Alexey Berezin Date: Wed, 8 Apr 2020 20:40:16 +0300 Subject: [PATCH 10/11] =?UTF-8?q?=E2=9E=95=20add=20TSBaseType?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/asserts/generated/index.js | 3 ++ .../src/constants/generated/index.js | 1 + .../babel-types/src/definitions/typescript.js | 6 ++-- .../typescript/removeTypeDuplicates.js | 30 ++----------------- .../src/validators/generated/index.js | 30 +++++++++++++++++++ 5 files changed, 40 insertions(+), 30 deletions(-) diff --git a/packages/babel-types/src/asserts/generated/index.js b/packages/babel-types/src/asserts/generated/index.js index 06464cd3a347..a99c58081d41 100644 --- a/packages/babel-types/src/asserts/generated/index.js +++ b/packages/babel-types/src/asserts/generated/index.js @@ -1202,6 +1202,9 @@ export function assertTSTypeElement(node: Object, opts?: Object = {}): void { export function assertTSType(node: Object, opts?: Object = {}): void { assert("TSType", node, opts); } +export function assertTSBaseType(node: Object, opts?: Object = {}): void { + assert("TSBaseType", node, opts); +} export function assertNumberLiteral(node: Object, opts: Object): void { console.trace( "The node type NumberLiteral has been renamed to NumericLiteral", diff --git a/packages/babel-types/src/constants/generated/index.js b/packages/babel-types/src/constants/generated/index.js index 1f4b576a87b6..acdf21744af7 100644 --- a/packages/babel-types/src/constants/generated/index.js +++ b/packages/babel-types/src/constants/generated/index.js @@ -51,3 +51,4 @@ export const JSX_TYPES = FLIPPED_ALIAS_KEYS["JSX"]; export const PRIVATE_TYPES = FLIPPED_ALIAS_KEYS["Private"]; export const TSTYPEELEMENT_TYPES = FLIPPED_ALIAS_KEYS["TSTypeElement"]; export const TSTYPE_TYPES = FLIPPED_ALIAS_KEYS["TSType"]; +export const TSBASETYPE_TYPES = FLIPPED_ALIAS_KEYS["TSBaseType"]; diff --git a/packages/babel-types/src/definitions/typescript.js b/packages/babel-types/src/definitions/typescript.js index 608ea8ab2207..421b16c47d6c 100644 --- a/packages/babel-types/src/definitions/typescript.js +++ b/packages/babel-types/src/definitions/typescript.js @@ -143,14 +143,14 @@ const tsKeywordTypes = [ for (const type of tsKeywordTypes) { defineType(type, { - aliases: ["TSType"], + aliases: ["TSType", "TSBaseType"], visitor: [], fields: {}, }); } defineType("TSThisType", { - aliases: ["TSType"], + aliases: ["TSType", "TSBaseType"], visitor: [], fields: {}, }); @@ -300,7 +300,7 @@ defineType("TSMappedType", { }); defineType("TSLiteralType", { - aliases: ["TSType"], + aliases: ["TSType", "TSBaseType"], visitor: ["literal"], fields: { literal: validateType([ diff --git a/packages/babel-types/src/modifications/typescript/removeTypeDuplicates.js b/packages/babel-types/src/modifications/typescript/removeTypeDuplicates.js index fced87a8e118..1ed0e34f3f2b 100644 --- a/packages/babel-types/src/modifications/typescript/removeTypeDuplicates.js +++ b/packages/babel-types/src/modifications/typescript/removeTypeDuplicates.js @@ -1,18 +1,7 @@ import { isTSAnyKeyword, isTSUnionType, - isTSBooleanKeyword, - isTSBigIntKeyword, - isTSNeverKeyword, - isTSNullKeyword, - isTSNumberKeyword, - isTSObjectKeyword, - isTSStringKeyword, - isTSUnknownKeyword, - isTSVoidKeyword, - isTSUndefinedKeyword, - isTSLiteralType, - isTSThisType, + isTSBaseType, } from "../../validators/generated"; /** @@ -43,21 +32,8 @@ export default function removeTypeDuplicates( return [node]; } - // Basic TS types, analogue of FlowBaseAnnotation - if ( - isTSBooleanKeyword(node) || - isTSBigIntKeyword(node) || - isTSNeverKeyword(node) || - isTSNullKeyword(node) || - isTSNumberKeyword(node) || - isTSObjectKeyword(node) || - isTSStringKeyword(node) || - isTSUndefinedKeyword(node) || - isTSUnknownKeyword(node) || - isTSVoidKeyword(node) || - isTSThisType(node) || - isTSLiteralType(node) - ) { + // Analogue of FlowBaseAnnotation + if (isTSBaseType(node)) { bases[node.type] = node; continue; } diff --git a/packages/babel-types/src/validators/generated/index.js b/packages/babel-types/src/validators/generated/index.js index f78c4127ef0b..4fc045c201a9 100644 --- a/packages/babel-types/src/validators/generated/index.js +++ b/packages/babel-types/src/validators/generated/index.js @@ -4611,6 +4611,36 @@ export function isTSType(node: ?Object, opts?: Object): boolean { return false; } +export function isTSBaseType(node: ?Object, opts?: Object): boolean { + if (!node) return false; + + const nodeType = node.type; + if ( + nodeType === "TSBaseType" || + "TSAnyKeyword" === nodeType || + "TSBooleanKeyword" === nodeType || + "TSBigIntKeyword" === nodeType || + "TSNeverKeyword" === nodeType || + "TSNullKeyword" === nodeType || + "TSNumberKeyword" === nodeType || + "TSObjectKeyword" === nodeType || + "TSStringKeyword" === nodeType || + "TSSymbolKeyword" === nodeType || + "TSUndefinedKeyword" === nodeType || + "TSUnknownKeyword" === nodeType || + "TSVoidKeyword" === nodeType || + "TSThisType" === nodeType || + "TSLiteralType" === nodeType + ) { + if (typeof opts === "undefined") { + return true; + } else { + return shallowEqual(node, opts); + } + } + + return false; +} export function isNumberLiteral(node: ?Object, opts?: Object): boolean { console.trace( "The node type NumberLiteral has been renamed to NumericLiteral", From 5e9c92098d7d79a9e6f0c72d67370d0b2400c9cf Mon Sep 17 00:00:00 2001 From: Alexey Berezin Date: Wed, 15 Apr 2020 09:01:25 +0300 Subject: [PATCH 11/11] =?UTF-8?q?=E2=9E=95=20add=20conditions=20NOT=20to?= =?UTF-8?q?=20break=20backward=20compatibility?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../babel-traverse/src/path/inference/inferer-reference.js | 4 ++-- packages/babel-traverse/src/path/inference/inferers.js | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/babel-traverse/src/path/inference/inferer-reference.js b/packages/babel-traverse/src/path/inference/inferer-reference.js index dc0a69b6c6b6..94505566e684 100644 --- a/packages/babel-traverse/src/path/inference/inferer-reference.js +++ b/packages/babel-traverse/src/path/inference/inferer-reference.js @@ -95,7 +95,7 @@ function getTypeAnnotationBindingConstantViolations(binding, path, name) { return; } - if (t.isTSTypeAnnotation(types[0])) { + if (t.isTSTypeAnnotation(types[0]) && t.createTSUnionType) { return t.createTSUnionType(types); } @@ -207,7 +207,7 @@ function getConditionalAnnotation(binding, path, name) { } if (types.length) { - if (t.isTSTypeAnnotation(types[0])) { + if (t.isTSTypeAnnotation(types[0]) && t.createTSUnionType) { return { typeAnnotation: t.createTSUnionType(types), ifStatement, diff --git a/packages/babel-traverse/src/path/inference/inferers.js b/packages/babel-traverse/src/path/inference/inferers.js index 988af8426948..876516725557 100644 --- a/packages/babel-traverse/src/path/inference/inferers.js +++ b/packages/babel-traverse/src/path/inference/inferers.js @@ -88,7 +88,7 @@ export function LogicalExpression() { this.get("right").getTypeAnnotation(), ]; - if (t.isTSTypeAnnotation(argumentTypes[0])) { + if (t.isTSTypeAnnotation(argumentTypes[0]) && t.createTSUnionType) { return t.createTSUnionType(argumentTypes); } @@ -101,7 +101,7 @@ export function ConditionalExpression() { this.get("alternate").getTypeAnnotation(), ]; - if (t.isTSTypeAnnotation(argumentTypes[0])) { + if (t.isTSTypeAnnotation(argumentTypes[0]) && t.createTSUnionType) { return t.createTSUnionType(argumentTypes); }