From a35e5a314ab533828d0988a2da824edb04fc8d3c Mon Sep 17 00:00:00 2001 From: Pelle Nielsen Date: Sat, 16 Mar 2019 01:24:23 -0700 Subject: [PATCH] Fix TSFunctionType visitors definition (#9692) When traversing a tree parsing for TypeScript syntax and hitting a `TSFunctionType` node, the `typeParameters` and `typeAnnotation` fields are correctly visited but the `parameters` field isn't. As a result visitors by default don't visit `foo` below: ``` var x: (foo) => void; // foo is never visited ``` ``` module.exports = function() { return { visitor: { Identifier(path) { if (path.node.name == "foo") { // Never hit because it's nested within TSFunctionType.parameters path.node.name = "bar"; } } } }; } ``` It appears to be a bug in babel-types/src/definitions/typescript.js which omits `parameters` in the visitors list for `fnOrCtr`. Fixed by adding it. --- .../visit-tsfunctiontype-parameters/input.ts | 1 + .../visit-tsfunctiontype-parameters/options.json | 3 +++ .../visit-tsfunctiontype-parameters/output.js | 1 + .../visit-tsfunctiontype-parameters/plugin.js | 11 +++++++++++ packages/babel-types/src/definitions/typescript.js | 2 +- 5 files changed, 17 insertions(+), 1 deletion(-) create mode 100644 packages/babel-traverse/test/fixtures/regression/visit-tsfunctiontype-parameters/input.ts create mode 100644 packages/babel-traverse/test/fixtures/regression/visit-tsfunctiontype-parameters/options.json create mode 100644 packages/babel-traverse/test/fixtures/regression/visit-tsfunctiontype-parameters/output.js create mode 100644 packages/babel-traverse/test/fixtures/regression/visit-tsfunctiontype-parameters/plugin.js diff --git a/packages/babel-traverse/test/fixtures/regression/visit-tsfunctiontype-parameters/input.ts b/packages/babel-traverse/test/fixtures/regression/visit-tsfunctiontype-parameters/input.ts new file mode 100644 index 0000000000..06818eda99 --- /dev/null +++ b/packages/babel-traverse/test/fixtures/regression/visit-tsfunctiontype-parameters/input.ts @@ -0,0 +1 @@ +let x: (number) => void; diff --git a/packages/babel-traverse/test/fixtures/regression/visit-tsfunctiontype-parameters/options.json b/packages/babel-traverse/test/fixtures/regression/visit-tsfunctiontype-parameters/options.json new file mode 100644 index 0000000000..05760686b4 --- /dev/null +++ b/packages/babel-traverse/test/fixtures/regression/visit-tsfunctiontype-parameters/options.json @@ -0,0 +1,3 @@ +{ + "plugins": ["syntax-typescript", "./plugin"] +} diff --git a/packages/babel-traverse/test/fixtures/regression/visit-tsfunctiontype-parameters/output.js b/packages/babel-traverse/test/fixtures/regression/visit-tsfunctiontype-parameters/output.js new file mode 100644 index 0000000000..a3d4a2a515 --- /dev/null +++ b/packages/babel-traverse/test/fixtures/regression/visit-tsfunctiontype-parameters/output.js @@ -0,0 +1 @@ +let x: (string) => void; diff --git a/packages/babel-traverse/test/fixtures/regression/visit-tsfunctiontype-parameters/plugin.js b/packages/babel-traverse/test/fixtures/regression/visit-tsfunctiontype-parameters/plugin.js new file mode 100644 index 0000000000..b2294ab701 --- /dev/null +++ b/packages/babel-traverse/test/fixtures/regression/visit-tsfunctiontype-parameters/plugin.js @@ -0,0 +1,11 @@ +module.exports = function() { + return { + visitor: { + Identifier(path) { + if (path.node.name == "number") { + path.node.name = "string"; + } + } + } + }; +} diff --git a/packages/babel-types/src/definitions/typescript.js b/packages/babel-types/src/definitions/typescript.js index 4f321adb3b..f6a89fa8dc 100644 --- a/packages/babel-types/src/definitions/typescript.js +++ b/packages/babel-types/src/definitions/typescript.js @@ -156,7 +156,7 @@ defineType("TSThisType", { const fnOrCtr = { aliases: ["TSType"], - visitor: ["typeParameters", "typeAnnotation"], + visitor: ["typeParameters", "parameters", "typeAnnotation"], fields: signatureDeclarationCommon, };