From c7f816be8899272d1862a8a45da145a79d2bc40e Mon Sep 17 00:00:00 2001 From: Thiago Arrais Date: Mon, 3 Dec 2018 19:41:46 -0300 Subject: [PATCH] Types for pipeline operator (smart proposal) --- .../babel-generator/src/generators/types.js | 12 +++++ .../types/PipelineBareFunction/input.js | 1 + .../types/PipelineBareFunction/options.json | 3 ++ .../types/PipelineBareFunction/output.js | 1 + .../types/PipelineTopicExpression/input.js | 8 +++ .../PipelineTopicExpression/options.json | 3 ++ .../types/PipelineTopicExpression/output.js | 8 +++ .../src/asserts/generated/index.js | 18 +++++++ .../src/builders/generated/index.js | 12 +++++ .../src/definitions/experimental.js | 24 +++++++++ .../src/validators/generated/index.js | 49 +++++++++++++++++++ 11 files changed, 139 insertions(+) create mode 100644 packages/babel-generator/test/fixtures/types/PipelineBareFunction/input.js create mode 100644 packages/babel-generator/test/fixtures/types/PipelineBareFunction/options.json create mode 100644 packages/babel-generator/test/fixtures/types/PipelineBareFunction/output.js create mode 100644 packages/babel-generator/test/fixtures/types/PipelineTopicExpression/input.js create mode 100644 packages/babel-generator/test/fixtures/types/PipelineTopicExpression/options.json create mode 100644 packages/babel-generator/test/fixtures/types/PipelineTopicExpression/output.js diff --git a/packages/babel-generator/src/generators/types.js b/packages/babel-generator/src/generators/types.js index 4a5ed312a661..491ae7513828 100644 --- a/packages/babel-generator/src/generators/types.js +++ b/packages/babel-generator/src/generators/types.js @@ -151,3 +151,15 @@ export function BigIntLiteral(node: Object) { } this.token(node.value); } + +export function PipelineTopicExpression(node: Object) { + this.print(node.expression, node); +} + +export function PipelineBareFunction(node: Object) { + this.print(node.callee, node); +} + +export function PipelinePrimaryTopicReference() { + this.token("#"); +} diff --git a/packages/babel-generator/test/fixtures/types/PipelineBareFunction/input.js b/packages/babel-generator/test/fixtures/types/PipelineBareFunction/input.js new file mode 100644 index 000000000000..e5b2807245d0 --- /dev/null +++ b/packages/babel-generator/test/fixtures/types/PipelineBareFunction/input.js @@ -0,0 +1 @@ +let result = "hello" |> doubleSay |> text.capitalize |> a.b.exclaim; diff --git a/packages/babel-generator/test/fixtures/types/PipelineBareFunction/options.json b/packages/babel-generator/test/fixtures/types/PipelineBareFunction/options.json new file mode 100644 index 000000000000..edb7679c6a74 --- /dev/null +++ b/packages/babel-generator/test/fixtures/types/PipelineBareFunction/options.json @@ -0,0 +1,3 @@ +{ + "plugins": [["pipelineOperator", { "proposal": "smart" }], "doExpressions"] +} diff --git a/packages/babel-generator/test/fixtures/types/PipelineBareFunction/output.js b/packages/babel-generator/test/fixtures/types/PipelineBareFunction/output.js new file mode 100644 index 000000000000..e5b2807245d0 --- /dev/null +++ b/packages/babel-generator/test/fixtures/types/PipelineBareFunction/output.js @@ -0,0 +1 @@ +let result = "hello" |> doubleSay |> text.capitalize |> a.b.exclaim; diff --git a/packages/babel-generator/test/fixtures/types/PipelineTopicExpression/input.js b/packages/babel-generator/test/fixtures/types/PipelineTopicExpression/input.js new file mode 100644 index 000000000000..4c8ffd3bf244 --- /dev/null +++ b/packages/babel-generator/test/fixtures/types/PipelineTopicExpression/input.js @@ -0,0 +1,8 @@ +value |> # + 1; +value |> 1 + #; +value |> do { + #; +}; +value |> do { + if (yes) #; +}; diff --git a/packages/babel-generator/test/fixtures/types/PipelineTopicExpression/options.json b/packages/babel-generator/test/fixtures/types/PipelineTopicExpression/options.json new file mode 100644 index 000000000000..edb7679c6a74 --- /dev/null +++ b/packages/babel-generator/test/fixtures/types/PipelineTopicExpression/options.json @@ -0,0 +1,3 @@ +{ + "plugins": [["pipelineOperator", { "proposal": "smart" }], "doExpressions"] +} diff --git a/packages/babel-generator/test/fixtures/types/PipelineTopicExpression/output.js b/packages/babel-generator/test/fixtures/types/PipelineTopicExpression/output.js new file mode 100644 index 000000000000..4c8ffd3bf244 --- /dev/null +++ b/packages/babel-generator/test/fixtures/types/PipelineTopicExpression/output.js @@ -0,0 +1,8 @@ +value |> # + 1; +value |> 1 + #; +value |> do { + #; +}; +value |> do { + if (yes) #; +}; diff --git a/packages/babel-types/src/asserts/generated/index.js b/packages/babel-types/src/asserts/generated/index.js index e55c1e6f38f1..b59008770da1 100644 --- a/packages/babel-types/src/asserts/generated/index.js +++ b/packages/babel-types/src/asserts/generated/index.js @@ -675,6 +675,24 @@ export function assertOptionalMemberExpression( ): void { assert("OptionalMemberExpression", node, opts); } +export function assertPipelineTopicExpression( + node: Object, + opts?: Object = {}, +): void { + assert("PipelineTopicExpression", node, opts); +} +export function assertPipelineBareFunction( + node: Object, + opts?: Object = {}, +): void { + assert("PipelineBareFunction", node, opts); +} +export function assertPipelinePrimaryTopicReference( + node: Object, + opts?: Object = {}, +): void { + assert("PipelinePrimaryTopicReference", node, opts); +} export function assertOptionalCallExpression( node: Object, opts?: Object = {}, diff --git a/packages/babel-types/src/builders/generated/index.js b/packages/babel-types/src/builders/generated/index.js index fc4eb6285eea..3ef4c396f91b 100644 --- a/packages/babel-types/src/builders/generated/index.js +++ b/packages/babel-types/src/builders/generated/index.js @@ -612,6 +612,18 @@ export function OptionalMemberExpression(...args: Array): Object { return builder("OptionalMemberExpression", ...args); } export { OptionalMemberExpression as optionalMemberExpression }; +export function PipelineTopicExpression(...args: Array): Object { + return builder("PipelineTopicExpression", ...args); +} +export { PipelineTopicExpression as pipelineTopicExpression }; +export function PipelineBareFunction(...args: Array): Object { + return builder("PipelineBareFunction", ...args); +} +export { PipelineBareFunction as pipelineBareFunction }; +export function PipelinePrimaryTopicReference(...args: Array): Object { + return builder("PipelinePrimaryTopicReference", ...args); +} +export { PipelinePrimaryTopicReference as pipelinePrimaryTopicReference }; export function OptionalCallExpression(...args: Array): Object { return builder("OptionalCallExpression", ...args); } diff --git a/packages/babel-types/src/definitions/experimental.js b/packages/babel-types/src/definitions/experimental.js index 03865adfc4a3..6bf4a476cc94 100644 --- a/packages/babel-types/src/definitions/experimental.js +++ b/packages/babel-types/src/definitions/experimental.js @@ -89,6 +89,30 @@ defineType("OptionalMemberExpression", { }, }); +defineType("PipelineTopicExpression", { + builder: ["expression"], + visitor: ["expression"], + fields: { + expression: { + validate: assertNodeType("Expression"), + }, + }, +}); + +defineType("PipelineBareFunction", { + builder: ["callee"], + visitor: ["callee"], + fields: { + callee: { + validate: assertNodeType("Expression"), + }, + }, +}); + +defineType("PipelinePrimaryTopicReference", { + aliases: ["Expression"], +}); + defineType("OptionalCallExpression", { visitor: ["callee", "arguments", "typeParameters", "typeArguments"], builder: ["callee", "arguments", "optional"], diff --git a/packages/babel-types/src/validators/generated/index.js b/packages/babel-types/src/validators/generated/index.js index 9b47f4feb9aa..e23dc5de2cda 100644 --- a/packages/babel-types/src/validators/generated/index.js +++ b/packages/babel-types/src/validators/generated/index.js @@ -2131,6 +2131,54 @@ export function isOptionalMemberExpression( return false; } +export function isPipelineTopicExpression( + node: Object, + opts?: Object, +): boolean { + if (!node) return false; + + const nodeType = node.type; + if (nodeType === "PipelineTopicExpression") { + if (typeof opts === "undefined") { + return true; + } else { + return shallowEqual(node, opts); + } + } + + return false; +} +export function isPipelineBareFunction(node: Object, opts?: Object): boolean { + if (!node) return false; + + const nodeType = node.type; + if (nodeType === "PipelineBareFunction") { + if (typeof opts === "undefined") { + return true; + } else { + return shallowEqual(node, opts); + } + } + + return false; +} +export function isPipelinePrimaryTopicReference( + node: Object, + opts?: Object, +): boolean { + if (!node) return false; + + const nodeType = node.type; + if (nodeType === "PipelinePrimaryTopicReference") { + if (typeof opts === "undefined") { + return true; + } else { + return shallowEqual(node, opts); + } + } + + return false; +} export function isOptionalCallExpression(node: Object, opts?: Object): boolean { if (!node) return false; @@ -3164,6 +3212,7 @@ export function isExpression(node: Object, opts?: Object): boolean { "AwaitExpression" === nodeType || "BindExpression" === nodeType || "OptionalMemberExpression" === nodeType || + "PipelinePrimaryTopicReference" === nodeType || "OptionalCallExpression" === nodeType || "Import" === nodeType || "DoExpression" === nodeType ||