diff --git a/packages/babel-helper-create-class-features-plugin/src/fields.js b/packages/babel-helper-create-class-features-plugin/src/fields.js index 566458b1c585..76bc96b6d662 100644 --- a/packages/babel-helper-create-class-features-plugin/src/fields.js +++ b/packages/babel-helper-create-class-features-plugin/src/fields.js @@ -128,8 +128,12 @@ const privateNameVisitor = privateNameVisitorFactory({ const { privateNamesMap, redeclared } = this; const { node, parentPath } = path; - if (!parentPath.isMemberExpression({ property: node })) return; - + if ( + !parentPath.isMemberExpression({ property: node }) && + !parentPath.isOptionalMemberExpression({ property: node }) + ) { + return; + } const { name } = node.id; if (!privateNamesMap.has(name)) return; if (redeclared && redeclared.includes(name)) return; @@ -296,23 +300,43 @@ const privateNameHandlerSpec = { // The first access (the get) should do the memo assignment. this.memoise(member, 1); - return optimiseCall(this.get(member), this.receiver(member), args); + return optimiseCall(this.get(member), this.receiver(member), args, false); + }, + + optionalCall(member, args) { + this.memoise(member, 1); + + return optimiseCall(this.get(member), this.receiver(member), args, true); }, }; const privateNameHandlerLoose = { - handle(member) { + get(member) { const { privateNamesMap, file } = this; const { object } = member.node; const { name } = member.node.property.id; - member.replaceWith( - template.expression`BASE(REF, PROP)[PROP]`({ - BASE: file.addHelper("classPrivateFieldLooseBase"), - REF: object, - PROP: privateNamesMap.get(name).id, - }), - ); + return template.expression`BASE(REF, PROP)[PROP]`({ + BASE: file.addHelper("classPrivateFieldLooseBase"), + REF: object, + PROP: privateNamesMap.get(name).id, + }); + }, + + simpleSet(member) { + return this.get(member); + }, + + destructureSet(member) { + return this.get(member); + }, + + call(member, args) { + return t.callExpression(this.get(member), args); + }, + + optionalCall(member, args) { + return t.optionalCallExpression(this.get(member), args, true); }, }; @@ -326,21 +350,14 @@ export function transformPrivateNamesUsage( if (!privateNamesMap.size) return; const body = path.get("body"); + const handler = loose ? privateNameHandlerLoose : privateNameHandlerSpec; - if (loose) { - body.traverse(privateNameVisitor, { - privateNamesMap, - file: state, - ...privateNameHandlerLoose, - }); - } else { - memberExpressionToFunctions(body, privateNameVisitor, { - privateNamesMap, - classRef: ref, - file: state, - ...privateNameHandlerSpec, - }); - } + memberExpressionToFunctions(body, privateNameVisitor, { + privateNamesMap, + classRef: ref, + file: state, + ...handler, + }); body.traverse(privateInVisitor, { privateNamesMap, classRef: ref, diff --git a/packages/babel-helper-member-expression-to-functions/src/index.js b/packages/babel-helper-member-expression-to-functions/src/index.js index 88b8514c2cdf..67d3621debc6 100644 --- a/packages/babel-helper-member-expression-to-functions/src/index.js +++ b/packages/babel-helper-member-expression-to-functions/src/index.js @@ -29,6 +29,55 @@ class AssignmentMemoiser { } } +function toNonOptional(path, base) { + const { node } = path; + if (path.isOptionalMemberExpression()) { + return t.memberExpression(base, node.property, node.computed); + } + + if (path.isOptionalCallExpression()) { + const callee = path.get("callee"); + if (path.node.optional && callee.isOptionalMemberExpression()) { + const { object } = callee.node; + const context = path.scope.maybeGenerateMemoised(object) || object; + callee + .get("object") + .replaceWith(t.assignmentExpression("=", context, object)); + + return t.callExpression(t.memberExpression(base, t.identifier("call")), [ + context, + ...node.arguments, + ]); + } + + return t.callExpression(base, node.arguments); + } + + return path.node; +} + +// Determines if the current path is in a detached tree. This can happen when +// we are iterating on a path, and replace an ancestor with a new node. Babel +// doesn't always stop traversing the old node tree, and that can cause +// inconsistencies. +function isInDetachedTree(path) { + while (path) { + if (path.isProgram()) break; + + const { parentPath, container, listKey } = path; + const parentNode = parentPath.node; + if (listKey) { + if (container !== parentNode[listKey]) return true; + } else { + if (container !== parentNode) return true; + } + + path = parentPath; + } + + return false; +} + const handle = { memoise() { // noop. @@ -37,9 +86,175 @@ const handle = { handle(member) { const { node, parent, parentPath } = member; + if (member.isOptionalMemberExpression()) { + // Transforming optional chaining requires we replace ancestors. + if (isInDetachedTree(member)) return; + + // We're looking for the end of _this_ optional chain, which is actually + // the "rightmost" property access of the chain. This is because + // everything up to that property access is "optional". + // + // Let's take the case of `FOO?.BAR.baz?.qux`, with `FOO?.BAR` being our + // member. The "end" to most users would be `qux` property access. + // Everything up to it could be skipped if it `FOO` were nullish. But + // actually, we can consider the `baz` access to be the end. So we're + // looking for the nearest optional chain that is `optional: true`. + const endPath = member.find(({ node, parent, parentPath }) => { + if (parentPath.isOptionalMemberExpression()) { + // We need to check `parent.object` since we could be inside the + // computed expression of a `bad?.[FOO?.BAR]`. In this case, the + // endPath is the `FOO?.BAR` member itself. + return parent.optional || parent.object !== node; + } + if (parentPath.isOptionalCallExpression()) { + // Checking `parent.callee` since we could be in the arguments, eg + // `bad?.(FOO?.BAR)`. + // Also skip `FOO?.BAR` in `FOO?.BAR?.()` since we need to transform the optional call to ensure proper this + return ( + // In FOO?.#BAR?.(), endPath points the optional call expression so we skip FOO?.#BAR + (node !== member.node && parent.optional) || parent.callee !== node + ); + } + return true; + }); + + const rootParentPath = endPath.parentPath; + if ( + rootParentPath.isUpdateExpression({ argument: node }) || + rootParentPath.isAssignmentExpression({ left: node }) + ) { + throw member.buildCodeFrameError(`can't handle assignment`); + } + if (rootParentPath.isUnaryExpression({ operator: "delete" })) { + throw member.buildCodeFrameError(`can't handle delete`); + } + + // Now, we're looking for the start of this optional chain, which is + // optional to the left of this member. + // + // Let's take the case of `foo?.bar?.baz.QUX?.BAM`, with `QUX?.BAM` being + // our member. The "start" to most users would be `foo` object access. + // But actually, we can consider the `bar` access to be the start. So + // we're looking for the nearest optional chain that is `optional: true`, + // which is guaranteed to be somewhere in the object/callee tree. + let startingOptional = member; + for (;;) { + if (startingOptional.isOptionalMemberExpression()) { + if (startingOptional.node.optional) break; + startingOptional = startingOptional.get("object"); + continue; + } else if (startingOptional.isOptionalCallExpression()) { + if (startingOptional.node.optional) break; + startingOptional = startingOptional.get("callee"); + continue; + } + // prevent infinite loop: unreachable if the AST is well-formed + throw new Error( + `Internal error: unexpected ${startingOptional.node.type}`, + ); + } + + const { scope } = member; + const startingProp = startingOptional.isOptionalMemberExpression() + ? "object" + : "callee"; + const startingNode = startingOptional.node[startingProp]; + const baseNeedsMemoised = scope.maybeGenerateMemoised(startingNode); + const baseRef = baseNeedsMemoised ?? startingNode; + + // Compute parentIsOptionalCall before `startingOptional` is replaced + // as `node` may refer to `startingOptional.node` before replaced. + const parentIsOptionalCall = parentPath.isOptionalCallExpression({ + callee: node, + }); + startingOptional.replaceWith(toNonOptional(startingOptional, baseRef)); + if (parentIsOptionalCall) { + if (parent.optional) { + parentPath.replaceWith(this.optionalCall(member, parent.arguments)); + } else { + parentPath.replaceWith(this.call(member, parent.arguments)); + } + } else { + member.replaceWith(this.get(member)); + } + + let regular = member.node; + for (let current = member; current !== endPath; ) { + const { parentPath } = current; + // skip transforming `Foo.#BAR?.call(FOO)` + if (parentPath === endPath && parentIsOptionalCall && parent.optional) { + regular = parentPath.node; + break; + } + regular = toNonOptional(parentPath, regular); + current = parentPath; + } + + let context; + const endParentPath = endPath.parentPath; + if ( + t.isMemberExpression(regular) && + endParentPath.isOptionalCallExpression({ + callee: endPath.node, + optional: true, + }) + ) { + const { object } = regular; + context = member.scope.maybeGenerateMemoised(object); + if (context) { + regular.object = t.assignmentExpression("=", context, object); + } + } + + endPath.replaceWith( + t.conditionalExpression( + t.logicalExpression( + "||", + t.binaryExpression( + "===", + baseNeedsMemoised + ? t.assignmentExpression("=", baseRef, startingNode) + : baseRef, + t.nullLiteral(), + ), + t.binaryExpression( + "===", + t.cloneNode(baseRef), + scope.buildUndefinedNode(), + ), + ), + scope.buildUndefinedNode(), + regular, + ), + ); + + if (context) { + const endParent = endParentPath.node; + endParentPath.replaceWith( + t.optionalCallExpression( + t.optionalMemberExpression( + endParent.callee, + t.identifier("call"), + false, + true, + ), + [context, ...endParent.arguments], + false, + ), + ); + } + + return; + } + // MEMBER++ -> _set(MEMBER, (_ref = (+_get(MEMBER))) + 1), _ref // ++MEMBER -> _set(MEMBER, (+_get(MEMBER)) + 1) if (parentPath.isUpdateExpression({ argument: node })) { + if (this.simpleSet) { + member.replaceWith(this.simpleSet(member)); + return; + } + const { operator, prefix } = parent; // Give the state handler a chance to memoise the member, since we'll @@ -72,6 +287,11 @@ const handle = { // MEMBER = VALUE -> _set(MEMBER, VALUE) // MEMBER += VALUE -> _set(MEMBER, _get(MEMBER) + VALUE) if (parentPath.isAssignmentExpression({ left: node })) { + if (this.simpleSet) { + member.replaceWith(this.simpleSet(member)); + return; + } + const { operator, right } = parent; let value = right; @@ -92,11 +312,15 @@ const handle = { return; } - // MEMBER(ARGS) -> _call(MEMBER, ARGS) + // MEMBER(ARGS) -> _call(MEMBER, ARGS) if (parentPath.isCallExpression({ callee: node })) { - const { arguments: args } = parent; + parentPath.replaceWith(this.call(member, parent.arguments)); + return; + } - parentPath.replaceWith(this.call(member, args)); + // MEMBER?.(ARGS) -> _optionalCall(MEMBER, ARGS) + if (parentPath.isOptionalCallExpression({ callee: node })) { + parentPath.replaceWith(this.optionalCall(member, parent.arguments)); return; } diff --git a/packages/babel-helper-optimise-call-expression/src/index.js b/packages/babel-helper-optimise-call-expression/src/index.js index 56f9b2991bde..2dcfd29ec852 100644 --- a/packages/babel-helper-optimise-call-expression/src/index.js +++ b/packages/babel-helper-optimise-call-expression/src/index.js @@ -1,6 +1,6 @@ import * as t from "@babel/types"; -export default function(callee, thisNode, args) { +export default function(callee, thisNode, args, optional) { if ( args.length === 1 && t.isSpreadElement(args[0]) && @@ -12,6 +12,13 @@ export default function(callee, thisNode, args) { args[0].argument, ]); } else { + if (optional) { + return t.optionalCallExpression( + t.optionalMemberExpression(callee, t.identifier("call"), false, true), + [thisNode, ...args], + false, + ); + } return t.callExpression(t.memberExpression(callee, t.identifier("call")), [ thisNode, ...args, diff --git a/packages/babel-helper-replace-supers/src/index.js b/packages/babel-helper-replace-supers/src/index.js index 804d4251805b..0bf1d50c3d35 100644 --- a/packages/babel-helper-replace-supers/src/index.js +++ b/packages/babel-helper-replace-supers/src/index.js @@ -158,6 +158,7 @@ const specHandlers = { this._get(superMember, thisRefs), t.cloneNode(thisRefs.this), args, + false, ); }, }; @@ -215,7 +216,7 @@ const looseHandlers = { }, call(superMember, args) { - return optimiseCall(this.get(superMember), t.thisExpression(), args); + return optimiseCall(this.get(superMember), t.thisExpression(), args, false); }, }; diff --git a/packages/babel-parser/src/parser/expression.js b/packages/babel-parser/src/parser/expression.js index e4acf72cfdda..43612d9c924c 100644 --- a/packages/babel-parser/src/parser/expression.js +++ b/packages/babel-parser/src/parser/expression.js @@ -502,7 +502,8 @@ export default class ExpressionParser extends LValParser { if (arg.type === "Identifier") { this.raise(node.start, Errors.StrictDelete); } else if ( - arg.type === "MemberExpression" && + (arg.type === "MemberExpression" || + arg.type === "OptionalMemberExpression") && arg.property.type === "PrivateName" ) { this.raise(node.start, Errors.DeletePrivateField); @@ -616,8 +617,6 @@ export default class ExpressionParser extends LValParser { node.object = base; node.property = computed ? this.parseExpression() - : optional - ? this.parseIdentifier(true) : this.parseMaybePrivateName(true); node.computed = computed; diff --git a/packages/babel-parser/test/fixtures/experimental/class-private-properties/failure-delete-optional-private-property/input.js b/packages/babel-parser/test/fixtures/experimental/class-private-properties/failure-delete-optional-private-property/input.js new file mode 100644 index 000000000000..d555f86d05a1 --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/class-private-properties/failure-delete-optional-private-property/input.js @@ -0,0 +1,6 @@ +class Foo { + #x; + constructor() { + delete this?.#x; + } +} diff --git a/packages/babel-parser/test/fixtures/experimental/class-private-properties/failure-delete-optional-private-property/options.json b/packages/babel-parser/test/fixtures/experimental/class-private-properties/failure-delete-optional-private-property/options.json new file mode 100644 index 000000000000..f26e916957c8 --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/class-private-properties/failure-delete-optional-private-property/options.json @@ -0,0 +1,3 @@ +{ + "plugins": ["classPrivateProperties"] +} diff --git a/packages/babel-parser/test/fixtures/experimental/class-private-properties/failure-delete-optional-private-property/output.json b/packages/babel-parser/test/fixtures/experimental/class-private-properties/failure-delete-optional-private-property/output.json new file mode 100644 index 000000000000..c616eec20ec0 --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/class-private-properties/failure-delete-optional-private-property/output.json @@ -0,0 +1,99 @@ +{ + "type": "File", + "start":0,"end":62,"loc":{"start":{"line":1,"column":0},"end":{"line":6,"column":1}}, + "errors": [ + "SyntaxError: Deleting a private field is not allowed (4:4)" + ], + "program": { + "type": "Program", + "start":0,"end":62,"loc":{"start":{"line":1,"column":0},"end":{"line":6,"column":1}}, + "sourceType": "script", + "interpreter": null, + "body": [ + { + "type": "ClassDeclaration", + "start":0,"end":62,"loc":{"start":{"line":1,"column":0},"end":{"line":6,"column":1}}, + "id": { + "type": "Identifier", + "start":6,"end":9,"loc":{"start":{"line":1,"column":6},"end":{"line":1,"column":9},"identifierName":"Foo"}, + "name": "Foo" + }, + "superClass": null, + "body": { + "type": "ClassBody", + "start":10,"end":62,"loc":{"start":{"line":1,"column":10},"end":{"line":6,"column":1}}, + "body": [ + { + "type": "ClassPrivateProperty", + "start":14,"end":17,"loc":{"start":{"line":2,"column":2},"end":{"line":2,"column":5}}, + "static": false, + "key": { + "type": "PrivateName", + "start":14,"end":16,"loc":{"start":{"line":2,"column":2},"end":{"line":2,"column":4}}, + "id": { + "type": "Identifier", + "start":15,"end":16,"loc":{"start":{"line":2,"column":3},"end":{"line":2,"column":4},"identifierName":"x"}, + "name": "x" + } + }, + "value": null + }, + { + "type": "ClassMethod", + "start":20,"end":60,"loc":{"start":{"line":3,"column":2},"end":{"line":5,"column":3}}, + "static": false, + "key": { + "type": "Identifier", + "start":20,"end":31,"loc":{"start":{"line":3,"column":2},"end":{"line":3,"column":13},"identifierName":"constructor"}, + "name": "constructor" + }, + "computed": false, + "kind": "constructor", + "id": null, + "generator": false, + "async": false, + "params": [], + "body": { + "type": "BlockStatement", + "start":34,"end":60,"loc":{"start":{"line":3,"column":16},"end":{"line":5,"column":3}}, + "body": [ + { + "type": "ExpressionStatement", + "start":40,"end":56,"loc":{"start":{"line":4,"column":4},"end":{"line":4,"column":20}}, + "expression": { + "type": "UnaryExpression", + "start":40,"end":55,"loc":{"start":{"line":4,"column":4},"end":{"line":4,"column":19}}, + "operator": "delete", + "prefix": true, + "argument": { + "type": "OptionalMemberExpression", + "start":47,"end":55,"loc":{"start":{"line":4,"column":11},"end":{"line":4,"column":19}}, + "object": { + "type": "ThisExpression", + "start":47,"end":51,"loc":{"start":{"line":4,"column":11},"end":{"line":4,"column":15}} + }, + "property": { + "type": "PrivateName", + "start":53,"end":55,"loc":{"start":{"line":4,"column":17},"end":{"line":4,"column":19}}, + "id": { + "type": "Identifier", + "start":54,"end":55,"loc":{"start":{"line":4,"column":18},"end":{"line":4,"column":19},"identifierName":"x"}, + "name": "x" + } + }, + "computed": false, + "optional": true + } + } + } + ], + "directives": [] + } + } + ] + } + } + ], + "directives": [] + } +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/experimental/class-private-properties/optional-chain-object/input.js b/packages/babel-parser/test/fixtures/experimental/class-private-properties/optional-chain-object/input.js new file mode 100644 index 000000000000..8f152088b2ef --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/class-private-properties/optional-chain-object/input.js @@ -0,0 +1,14 @@ +class Foo { + static #x = 1; + static #m = function() {}; + + static test() { + const o = { Foo: Foo }; + return [ + o?.Foo.#x, + o?.Foo.#x.toFixed, + o?.Foo.#x.toFixed(2), + o?.Foo.#m(), + ]; + } +} diff --git a/packages/babel-parser/test/fixtures/experimental/class-private-properties/optional-chain-object/options.json b/packages/babel-parser/test/fixtures/experimental/class-private-properties/optional-chain-object/options.json new file mode 100644 index 000000000000..f26e916957c8 --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/class-private-properties/optional-chain-object/options.json @@ -0,0 +1,3 @@ +{ + "plugins": ["classPrivateProperties"] +} diff --git a/packages/babel-parser/test/fixtures/experimental/class-private-properties/optional-chain-object/output.json b/packages/babel-parser/test/fixtures/experimental/class-private-properties/optional-chain-object/output.json new file mode 100644 index 000000000000..a338c29398f2 --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/class-private-properties/optional-chain-object/output.json @@ -0,0 +1,321 @@ +{ + "type": "File", + "start":0,"end":219,"loc":{"start":{"line":1,"column":0},"end":{"line":14,"column":1}}, + "program": { + "type": "Program", + "start":0,"end":219,"loc":{"start":{"line":1,"column":0},"end":{"line":14,"column":1}}, + "sourceType": "script", + "interpreter": null, + "body": [ + { + "type": "ClassDeclaration", + "start":0,"end":219,"loc":{"start":{"line":1,"column":0},"end":{"line":14,"column":1}}, + "id": { + "type": "Identifier", + "start":6,"end":9,"loc":{"start":{"line":1,"column":6},"end":{"line":1,"column":9},"identifierName":"Foo"}, + "name": "Foo" + }, + "superClass": null, + "body": { + "type": "ClassBody", + "start":10,"end":219,"loc":{"start":{"line":1,"column":10},"end":{"line":14,"column":1}}, + "body": [ + { + "type": "ClassPrivateProperty", + "start":14,"end":28,"loc":{"start":{"line":2,"column":2},"end":{"line":2,"column":16}}, + "static": true, + "key": { + "type": "PrivateName", + "start":21,"end":23,"loc":{"start":{"line":2,"column":9},"end":{"line":2,"column":11}}, + "id": { + "type": "Identifier", + "start":22,"end":23,"loc":{"start":{"line":2,"column":10},"end":{"line":2,"column":11},"identifierName":"x"}, + "name": "x" + } + }, + "value": { + "type": "NumericLiteral", + "start":26,"end":27,"loc":{"start":{"line":2,"column":14},"end":{"line":2,"column":15}}, + "extra": { + "rawValue": 1, + "raw": "1" + }, + "value": 1 + } + }, + { + "type": "ClassPrivateProperty", + "start":31,"end":57,"loc":{"start":{"line":3,"column":2},"end":{"line":3,"column":28}}, + "static": true, + "key": { + "type": "PrivateName", + "start":38,"end":40,"loc":{"start":{"line":3,"column":9},"end":{"line":3,"column":11}}, + "id": { + "type": "Identifier", + "start":39,"end":40,"loc":{"start":{"line":3,"column":10},"end":{"line":3,"column":11},"identifierName":"m"}, + "name": "m" + } + }, + "value": { + "type": "FunctionExpression", + "start":43,"end":56,"loc":{"start":{"line":3,"column":14},"end":{"line":3,"column":27}}, + "id": null, + "generator": false, + "async": false, + "params": [], + "body": { + "type": "BlockStatement", + "start":54,"end":56,"loc":{"start":{"line":3,"column":25},"end":{"line":3,"column":27}}, + "body": [], + "directives": [] + } + } + }, + { + "type": "ClassMethod", + "start":61,"end":217,"loc":{"start":{"line":5,"column":2},"end":{"line":13,"column":3}}, + "static": true, + "key": { + "type": "Identifier", + "start":68,"end":72,"loc":{"start":{"line":5,"column":9},"end":{"line":5,"column":13},"identifierName":"test"}, + "name": "test" + }, + "computed": false, + "kind": "method", + "id": null, + "generator": false, + "async": false, + "params": [], + "body": { + "type": "BlockStatement", + "start":75,"end":217,"loc":{"start":{"line":5,"column":16},"end":{"line":13,"column":3}}, + "body": [ + { + "type": "VariableDeclaration", + "start":81,"end":104,"loc":{"start":{"line":6,"column":4},"end":{"line":6,"column":27}}, + "declarations": [ + { + "type": "VariableDeclarator", + "start":87,"end":103,"loc":{"start":{"line":6,"column":10},"end":{"line":6,"column":26}}, + "id": { + "type": "Identifier", + "start":87,"end":88,"loc":{"start":{"line":6,"column":10},"end":{"line":6,"column":11},"identifierName":"o"}, + "name": "o" + }, + "init": { + "type": "ObjectExpression", + "start":91,"end":103,"loc":{"start":{"line":6,"column":14},"end":{"line":6,"column":26}}, + "properties": [ + { + "type": "ObjectProperty", + "start":93,"end":101,"loc":{"start":{"line":6,"column":16},"end":{"line":6,"column":24}}, + "method": false, + "key": { + "type": "Identifier", + "start":93,"end":96,"loc":{"start":{"line":6,"column":16},"end":{"line":6,"column":19},"identifierName":"Foo"}, + "name": "Foo" + }, + "computed": false, + "shorthand": false, + "value": { + "type": "Identifier", + "start":98,"end":101,"loc":{"start":{"line":6,"column":21},"end":{"line":6,"column":24},"identifierName":"Foo"}, + "name": "Foo" + } + } + ] + } + } + ], + "kind": "const" + }, + { + "type": "ReturnStatement", + "start":109,"end":213,"loc":{"start":{"line":7,"column":4},"end":{"line":12,"column":6}}, + "argument": { + "type": "ArrayExpression", + "start":116,"end":212,"loc":{"start":{"line":7,"column":11},"end":{"line":12,"column":5}}, + "extra": { + "trailingComma": 205 + }, + "elements": [ + { + "type": "OptionalMemberExpression", + "start":124,"end":133,"loc":{"start":{"line":8,"column":6},"end":{"line":8,"column":15}}, + "object": { + "type": "OptionalMemberExpression", + "start":124,"end":130,"loc":{"start":{"line":8,"column":6},"end":{"line":8,"column":12}}, + "object": { + "type": "Identifier", + "start":124,"end":125,"loc":{"start":{"line":8,"column":6},"end":{"line":8,"column":7},"identifierName":"o"}, + "name": "o" + }, + "property": { + "type": "Identifier", + "start":127,"end":130,"loc":{"start":{"line":8,"column":9},"end":{"line":8,"column":12},"identifierName":"Foo"}, + "name": "Foo" + }, + "computed": false, + "optional": true + }, + "property": { + "type": "PrivateName", + "start":131,"end":133,"loc":{"start":{"line":8,"column":13},"end":{"line":8,"column":15}}, + "id": { + "type": "Identifier", + "start":132,"end":133,"loc":{"start":{"line":8,"column":14},"end":{"line":8,"column":15},"identifierName":"x"}, + "name": "x" + } + }, + "computed": false, + "optional": false + }, + { + "type": "OptionalMemberExpression", + "start":141,"end":158,"loc":{"start":{"line":9,"column":6},"end":{"line":9,"column":23}}, + "object": { + "type": "OptionalMemberExpression", + "start":141,"end":150,"loc":{"start":{"line":9,"column":6},"end":{"line":9,"column":15}}, + "object": { + "type": "OptionalMemberExpression", + "start":141,"end":147,"loc":{"start":{"line":9,"column":6},"end":{"line":9,"column":12}}, + "object": { + "type": "Identifier", + "start":141,"end":142,"loc":{"start":{"line":9,"column":6},"end":{"line":9,"column":7},"identifierName":"o"}, + "name": "o" + }, + "property": { + "type": "Identifier", + "start":144,"end":147,"loc":{"start":{"line":9,"column":9},"end":{"line":9,"column":12},"identifierName":"Foo"}, + "name": "Foo" + }, + "computed": false, + "optional": true + }, + "property": { + "type": "PrivateName", + "start":148,"end":150,"loc":{"start":{"line":9,"column":13},"end":{"line":9,"column":15}}, + "id": { + "type": "Identifier", + "start":149,"end":150,"loc":{"start":{"line":9,"column":14},"end":{"line":9,"column":15},"identifierName":"x"}, + "name": "x" + } + }, + "computed": false, + "optional": false + }, + "property": { + "type": "Identifier", + "start":151,"end":158,"loc":{"start":{"line":9,"column":16},"end":{"line":9,"column":23},"identifierName":"toFixed"}, + "name": "toFixed" + }, + "computed": false, + "optional": false + }, + { + "type": "OptionalCallExpression", + "start":166,"end":186,"loc":{"start":{"line":10,"column":6},"end":{"line":10,"column":26}}, + "callee": { + "type": "OptionalMemberExpression", + "start":166,"end":183,"loc":{"start":{"line":10,"column":6},"end":{"line":10,"column":23}}, + "object": { + "type": "OptionalMemberExpression", + "start":166,"end":175,"loc":{"start":{"line":10,"column":6},"end":{"line":10,"column":15}}, + "object": { + "type": "OptionalMemberExpression", + "start":166,"end":172,"loc":{"start":{"line":10,"column":6},"end":{"line":10,"column":12}}, + "object": { + "type": "Identifier", + "start":166,"end":167,"loc":{"start":{"line":10,"column":6},"end":{"line":10,"column":7},"identifierName":"o"}, + "name": "o" + }, + "property": { + "type": "Identifier", + "start":169,"end":172,"loc":{"start":{"line":10,"column":9},"end":{"line":10,"column":12},"identifierName":"Foo"}, + "name": "Foo" + }, + "computed": false, + "optional": true + }, + "property": { + "type": "PrivateName", + "start":173,"end":175,"loc":{"start":{"line":10,"column":13},"end":{"line":10,"column":15}}, + "id": { + "type": "Identifier", + "start":174,"end":175,"loc":{"start":{"line":10,"column":14},"end":{"line":10,"column":15},"identifierName":"x"}, + "name": "x" + } + }, + "computed": false, + "optional": false + }, + "property": { + "type": "Identifier", + "start":176,"end":183,"loc":{"start":{"line":10,"column":16},"end":{"line":10,"column":23},"identifierName":"toFixed"}, + "name": "toFixed" + }, + "computed": false, + "optional": false + }, + "arguments": [ + { + "type": "NumericLiteral", + "start":184,"end":185,"loc":{"start":{"line":10,"column":24},"end":{"line":10,"column":25}}, + "extra": { + "rawValue": 2, + "raw": "2" + }, + "value": 2 + } + ] + }, + { + "type": "OptionalCallExpression", + "start":194,"end":205,"loc":{"start":{"line":11,"column":6},"end":{"line":11,"column":17}}, + "callee": { + "type": "OptionalMemberExpression", + "start":194,"end":203,"loc":{"start":{"line":11,"column":6},"end":{"line":11,"column":15}}, + "object": { + "type": "OptionalMemberExpression", + "start":194,"end":200,"loc":{"start":{"line":11,"column":6},"end":{"line":11,"column":12}}, + "object": { + "type": "Identifier", + "start":194,"end":195,"loc":{"start":{"line":11,"column":6},"end":{"line":11,"column":7},"identifierName":"o"}, + "name": "o" + }, + "property": { + "type": "Identifier", + "start":197,"end":200,"loc":{"start":{"line":11,"column":9},"end":{"line":11,"column":12},"identifierName":"Foo"}, + "name": "Foo" + }, + "computed": false, + "optional": true + }, + "property": { + "type": "PrivateName", + "start":201,"end":203,"loc":{"start":{"line":11,"column":13},"end":{"line":11,"column":15}}, + "id": { + "type": "Identifier", + "start":202,"end":203,"loc":{"start":{"line":11,"column":14},"end":{"line":11,"column":15},"identifierName":"m"}, + "name": "m" + } + }, + "computed": false, + "optional": false + }, + "arguments": [] + } + ] + } + } + ], + "directives": [] + } + } + ] + } + } + ], + "directives": [] + } +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/experimental/class-private-properties/optional-chain-start-call/input.js b/packages/babel-parser/test/fixtures/experimental/class-private-properties/optional-chain-start-call/input.js new file mode 100644 index 000000000000..861a7c721195 --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/class-private-properties/optional-chain-start-call/input.js @@ -0,0 +1,7 @@ +class Foo { + static #m = function() {}; + + static test() { + return Foo?.#m(); + } +} diff --git a/packages/babel-parser/test/fixtures/experimental/class-private-properties/optional-chain-start-call/options.json b/packages/babel-parser/test/fixtures/experimental/class-private-properties/optional-chain-start-call/options.json new file mode 100644 index 000000000000..f26e916957c8 --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/class-private-properties/optional-chain-start-call/options.json @@ -0,0 +1,3 @@ +{ + "plugins": ["classPrivateProperties"] +} diff --git a/packages/babel-parser/test/fixtures/experimental/class-private-properties/optional-chain-start-call/output.json b/packages/babel-parser/test/fixtures/experimental/class-private-properties/optional-chain-start-call/output.json new file mode 100644 index 000000000000..fab6f81ebb0c --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/class-private-properties/optional-chain-start-call/output.json @@ -0,0 +1,109 @@ +{ + "type": "File", + "start":0,"end":87,"loc":{"start":{"line":1,"column":0},"end":{"line":7,"column":1}}, + "program": { + "type": "Program", + "start":0,"end":87,"loc":{"start":{"line":1,"column":0},"end":{"line":7,"column":1}}, + "sourceType": "script", + "interpreter": null, + "body": [ + { + "type": "ClassDeclaration", + "start":0,"end":87,"loc":{"start":{"line":1,"column":0},"end":{"line":7,"column":1}}, + "id": { + "type": "Identifier", + "start":6,"end":9,"loc":{"start":{"line":1,"column":6},"end":{"line":1,"column":9},"identifierName":"Foo"}, + "name": "Foo" + }, + "superClass": null, + "body": { + "type": "ClassBody", + "start":10,"end":87,"loc":{"start":{"line":1,"column":10},"end":{"line":7,"column":1}}, + "body": [ + { + "type": "ClassPrivateProperty", + "start":14,"end":40,"loc":{"start":{"line":2,"column":2},"end":{"line":2,"column":28}}, + "static": true, + "key": { + "type": "PrivateName", + "start":21,"end":23,"loc":{"start":{"line":2,"column":9},"end":{"line":2,"column":11}}, + "id": { + "type": "Identifier", + "start":22,"end":23,"loc":{"start":{"line":2,"column":10},"end":{"line":2,"column":11},"identifierName":"m"}, + "name": "m" + } + }, + "value": { + "type": "FunctionExpression", + "start":26,"end":39,"loc":{"start":{"line":2,"column":14},"end":{"line":2,"column":27}}, + "id": null, + "generator": false, + "async": false, + "params": [], + "body": { + "type": "BlockStatement", + "start":37,"end":39,"loc":{"start":{"line":2,"column":25},"end":{"line":2,"column":27}}, + "body": [], + "directives": [] + } + } + }, + { + "type": "ClassMethod", + "start":44,"end":85,"loc":{"start":{"line":4,"column":2},"end":{"line":6,"column":3}}, + "static": true, + "key": { + "type": "Identifier", + "start":51,"end":55,"loc":{"start":{"line":4,"column":9},"end":{"line":4,"column":13},"identifierName":"test"}, + "name": "test" + }, + "computed": false, + "kind": "method", + "id": null, + "generator": false, + "async": false, + "params": [], + "body": { + "type": "BlockStatement", + "start":58,"end":85,"loc":{"start":{"line":4,"column":16},"end":{"line":6,"column":3}}, + "body": [ + { + "type": "ReturnStatement", + "start":64,"end":81,"loc":{"start":{"line":5,"column":4},"end":{"line":5,"column":21}}, + "argument": { + "type": "OptionalCallExpression", + "start":71,"end":80,"loc":{"start":{"line":5,"column":11},"end":{"line":5,"column":20}}, + "callee": { + "type": "OptionalMemberExpression", + "start":71,"end":78,"loc":{"start":{"line":5,"column":11},"end":{"line":5,"column":18}}, + "object": { + "type": "Identifier", + "start":71,"end":74,"loc":{"start":{"line":5,"column":11},"end":{"line":5,"column":14},"identifierName":"Foo"}, + "name": "Foo" + }, + "property": { + "type": "PrivateName", + "start":76,"end":78,"loc":{"start":{"line":5,"column":16},"end":{"line":5,"column":18}}, + "id": { + "type": "Identifier", + "start":77,"end":78,"loc":{"start":{"line":5,"column":17},"end":{"line":5,"column":18},"identifierName":"m"}, + "name": "m" + } + }, + "computed": false, + "optional": true + }, + "arguments": [] + } + } + ], + "directives": [] + } + } + ] + } + } + ], + "directives": [] + } +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/experimental/class-private-properties/optional-chain-start-member-call/input.js b/packages/babel-parser/test/fixtures/experimental/class-private-properties/optional-chain-start-member-call/input.js new file mode 100644 index 000000000000..93e0a61c975b --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/class-private-properties/optional-chain-start-member-call/input.js @@ -0,0 +1,7 @@ +class Foo { + static #x = 1; + + static test() { + return Foo?.#x.toFixed(2); + } +} diff --git a/packages/babel-parser/test/fixtures/experimental/class-private-properties/optional-chain-start-member-call/options.json b/packages/babel-parser/test/fixtures/experimental/class-private-properties/optional-chain-start-member-call/options.json new file mode 100644 index 000000000000..f26e916957c8 --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/class-private-properties/optional-chain-start-member-call/options.json @@ -0,0 +1,3 @@ +{ + "plugins": ["classPrivateProperties"] +} diff --git a/packages/babel-parser/test/fixtures/experimental/class-private-properties/optional-chain-start-member-call/output.json b/packages/babel-parser/test/fixtures/experimental/class-private-properties/optional-chain-start-member-call/output.json new file mode 100644 index 000000000000..10b49c52f465 --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/class-private-properties/optional-chain-start-member-call/output.json @@ -0,0 +1,125 @@ +{ + "type": "File", + "start":0,"end":84,"loc":{"start":{"line":1,"column":0},"end":{"line":7,"column":1}}, + "program": { + "type": "Program", + "start":0,"end":84,"loc":{"start":{"line":1,"column":0},"end":{"line":7,"column":1}}, + "sourceType": "script", + "interpreter": null, + "body": [ + { + "type": "ClassDeclaration", + "start":0,"end":84,"loc":{"start":{"line":1,"column":0},"end":{"line":7,"column":1}}, + "id": { + "type": "Identifier", + "start":6,"end":9,"loc":{"start":{"line":1,"column":6},"end":{"line":1,"column":9},"identifierName":"Foo"}, + "name": "Foo" + }, + "superClass": null, + "body": { + "type": "ClassBody", + "start":10,"end":84,"loc":{"start":{"line":1,"column":10},"end":{"line":7,"column":1}}, + "body": [ + { + "type": "ClassPrivateProperty", + "start":14,"end":28,"loc":{"start":{"line":2,"column":2},"end":{"line":2,"column":16}}, + "static": true, + "key": { + "type": "PrivateName", + "start":21,"end":23,"loc":{"start":{"line":2,"column":9},"end":{"line":2,"column":11}}, + "id": { + "type": "Identifier", + "start":22,"end":23,"loc":{"start":{"line":2,"column":10},"end":{"line":2,"column":11},"identifierName":"x"}, + "name": "x" + } + }, + "value": { + "type": "NumericLiteral", + "start":26,"end":27,"loc":{"start":{"line":2,"column":14},"end":{"line":2,"column":15}}, + "extra": { + "rawValue": 1, + "raw": "1" + }, + "value": 1 + } + }, + { + "type": "ClassMethod", + "start":32,"end":82,"loc":{"start":{"line":4,"column":2},"end":{"line":6,"column":3}}, + "static": true, + "key": { + "type": "Identifier", + "start":39,"end":43,"loc":{"start":{"line":4,"column":9},"end":{"line":4,"column":13},"identifierName":"test"}, + "name": "test" + }, + "computed": false, + "kind": "method", + "id": null, + "generator": false, + "async": false, + "params": [], + "body": { + "type": "BlockStatement", + "start":46,"end":82,"loc":{"start":{"line":4,"column":16},"end":{"line":6,"column":3}}, + "body": [ + { + "type": "ReturnStatement", + "start":52,"end":78,"loc":{"start":{"line":5,"column":4},"end":{"line":5,"column":30}}, + "argument": { + "type": "OptionalCallExpression", + "start":59,"end":77,"loc":{"start":{"line":5,"column":11},"end":{"line":5,"column":29}}, + "callee": { + "type": "OptionalMemberExpression", + "start":59,"end":74,"loc":{"start":{"line":5,"column":11},"end":{"line":5,"column":26}}, + "object": { + "type": "OptionalMemberExpression", + "start":59,"end":66,"loc":{"start":{"line":5,"column":11},"end":{"line":5,"column":18}}, + "object": { + "type": "Identifier", + "start":59,"end":62,"loc":{"start":{"line":5,"column":11},"end":{"line":5,"column":14},"identifierName":"Foo"}, + "name": "Foo" + }, + "property": { + "type": "PrivateName", + "start":64,"end":66,"loc":{"start":{"line":5,"column":16},"end":{"line":5,"column":18}}, + "id": { + "type": "Identifier", + "start":65,"end":66,"loc":{"start":{"line":5,"column":17},"end":{"line":5,"column":18},"identifierName":"x"}, + "name": "x" + } + }, + "computed": false, + "optional": true + }, + "property": { + "type": "Identifier", + "start":67,"end":74,"loc":{"start":{"line":5,"column":19},"end":{"line":5,"column":26},"identifierName":"toFixed"}, + "name": "toFixed" + }, + "computed": false, + "optional": false + }, + "arguments": [ + { + "type": "NumericLiteral", + "start":75,"end":76,"loc":{"start":{"line":5,"column":27},"end":{"line":5,"column":28}}, + "extra": { + "rawValue": 2, + "raw": "2" + }, + "value": 2 + } + ] + } + } + ], + "directives": [] + } + } + ] + } + } + ], + "directives": [] + } +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/experimental/class-private-properties/optional-chain-start-member/input.js b/packages/babel-parser/test/fixtures/experimental/class-private-properties/optional-chain-start-member/input.js new file mode 100644 index 000000000000..48bc5c3a3ffd --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/class-private-properties/optional-chain-start-member/input.js @@ -0,0 +1,7 @@ +class Foo { + static #x = 1; + + static test() { + return Foo?.#x.toFixed; + } +} diff --git a/packages/babel-parser/test/fixtures/experimental/class-private-properties/optional-chain-start-member/options.json b/packages/babel-parser/test/fixtures/experimental/class-private-properties/optional-chain-start-member/options.json new file mode 100644 index 000000000000..f26e916957c8 --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/class-private-properties/optional-chain-start-member/options.json @@ -0,0 +1,3 @@ +{ + "plugins": ["classPrivateProperties"] +} diff --git a/packages/babel-parser/test/fixtures/experimental/class-private-properties/optional-chain-start-member/output.json b/packages/babel-parser/test/fixtures/experimental/class-private-properties/optional-chain-start-member/output.json new file mode 100644 index 000000000000..44f1a1d0548a --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/class-private-properties/optional-chain-start-member/output.json @@ -0,0 +1,110 @@ +{ + "type": "File", + "start":0,"end":81,"loc":{"start":{"line":1,"column":0},"end":{"line":7,"column":1}}, + "program": { + "type": "Program", + "start":0,"end":81,"loc":{"start":{"line":1,"column":0},"end":{"line":7,"column":1}}, + "sourceType": "script", + "interpreter": null, + "body": [ + { + "type": "ClassDeclaration", + "start":0,"end":81,"loc":{"start":{"line":1,"column":0},"end":{"line":7,"column":1}}, + "id": { + "type": "Identifier", + "start":6,"end":9,"loc":{"start":{"line":1,"column":6},"end":{"line":1,"column":9},"identifierName":"Foo"}, + "name": "Foo" + }, + "superClass": null, + "body": { + "type": "ClassBody", + "start":10,"end":81,"loc":{"start":{"line":1,"column":10},"end":{"line":7,"column":1}}, + "body": [ + { + "type": "ClassPrivateProperty", + "start":14,"end":28,"loc":{"start":{"line":2,"column":2},"end":{"line":2,"column":16}}, + "static": true, + "key": { + "type": "PrivateName", + "start":21,"end":23,"loc":{"start":{"line":2,"column":9},"end":{"line":2,"column":11}}, + "id": { + "type": "Identifier", + "start":22,"end":23,"loc":{"start":{"line":2,"column":10},"end":{"line":2,"column":11},"identifierName":"x"}, + "name": "x" + } + }, + "value": { + "type": "NumericLiteral", + "start":26,"end":27,"loc":{"start":{"line":2,"column":14},"end":{"line":2,"column":15}}, + "extra": { + "rawValue": 1, + "raw": "1" + }, + "value": 1 + } + }, + { + "type": "ClassMethod", + "start":32,"end":79,"loc":{"start":{"line":4,"column":2},"end":{"line":6,"column":3}}, + "static": true, + "key": { + "type": "Identifier", + "start":39,"end":43,"loc":{"start":{"line":4,"column":9},"end":{"line":4,"column":13},"identifierName":"test"}, + "name": "test" + }, + "computed": false, + "kind": "method", + "id": null, + "generator": false, + "async": false, + "params": [], + "body": { + "type": "BlockStatement", + "start":46,"end":79,"loc":{"start":{"line":4,"column":16},"end":{"line":6,"column":3}}, + "body": [ + { + "type": "ReturnStatement", + "start":52,"end":75,"loc":{"start":{"line":5,"column":4},"end":{"line":5,"column":27}}, + "argument": { + "type": "OptionalMemberExpression", + "start":59,"end":74,"loc":{"start":{"line":5,"column":11},"end":{"line":5,"column":26}}, + "object": { + "type": "OptionalMemberExpression", + "start":59,"end":66,"loc":{"start":{"line":5,"column":11},"end":{"line":5,"column":18}}, + "object": { + "type": "Identifier", + "start":59,"end":62,"loc":{"start":{"line":5,"column":11},"end":{"line":5,"column":14},"identifierName":"Foo"}, + "name": "Foo" + }, + "property": { + "type": "PrivateName", + "start":64,"end":66,"loc":{"start":{"line":5,"column":16},"end":{"line":5,"column":18}}, + "id": { + "type": "Identifier", + "start":65,"end":66,"loc":{"start":{"line":5,"column":17},"end":{"line":5,"column":18},"identifierName":"x"}, + "name": "x" + } + }, + "computed": false, + "optional": true + }, + "property": { + "type": "Identifier", + "start":67,"end":74,"loc":{"start":{"line":5,"column":19},"end":{"line":5,"column":26},"identifierName":"toFixed"}, + "name": "toFixed" + }, + "computed": false, + "optional": false + } + } + ], + "directives": [] + } + } + ] + } + } + ], + "directives": [] + } +} diff --git a/packages/babel-parser/test/fixtures/experimental/class-private-properties/optional-chain-start-simple/input.js b/packages/babel-parser/test/fixtures/experimental/class-private-properties/optional-chain-start-simple/input.js new file mode 100644 index 000000000000..4802298ea379 --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/class-private-properties/optional-chain-start-simple/input.js @@ -0,0 +1,7 @@ +class Foo { + static #x = 1; + + static test() { + return Foo?.#x; + } +} diff --git a/packages/babel-parser/test/fixtures/experimental/class-private-properties/optional-chain-start-simple/options.json b/packages/babel-parser/test/fixtures/experimental/class-private-properties/optional-chain-start-simple/options.json new file mode 100644 index 000000000000..f26e916957c8 --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/class-private-properties/optional-chain-start-simple/options.json @@ -0,0 +1,3 @@ +{ + "plugins": ["classPrivateProperties"] +} diff --git a/packages/babel-parser/test/fixtures/experimental/class-private-properties/optional-chain-start-simple/output.json b/packages/babel-parser/test/fixtures/experimental/class-private-properties/optional-chain-start-simple/output.json new file mode 100644 index 000000000000..bf77ed55e9a7 --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/class-private-properties/optional-chain-start-simple/output.json @@ -0,0 +1,99 @@ +{ + "type": "File", + "start":0,"end":73,"loc":{"start":{"line":1,"column":0},"end":{"line":7,"column":1}}, + "program": { + "type": "Program", + "start":0,"end":73,"loc":{"start":{"line":1,"column":0},"end":{"line":7,"column":1}}, + "sourceType": "script", + "interpreter": null, + "body": [ + { + "type": "ClassDeclaration", + "start":0,"end":73,"loc":{"start":{"line":1,"column":0},"end":{"line":7,"column":1}}, + "id": { + "type": "Identifier", + "start":6,"end":9,"loc":{"start":{"line":1,"column":6},"end":{"line":1,"column":9},"identifierName":"Foo"}, + "name": "Foo" + }, + "superClass": null, + "body": { + "type": "ClassBody", + "start":10,"end":73,"loc":{"start":{"line":1,"column":10},"end":{"line":7,"column":1}}, + "body": [ + { + "type": "ClassPrivateProperty", + "start":14,"end":28,"loc":{"start":{"line":2,"column":2},"end":{"line":2,"column":16}}, + "static": true, + "key": { + "type": "PrivateName", + "start":21,"end":23,"loc":{"start":{"line":2,"column":9},"end":{"line":2,"column":11}}, + "id": { + "type": "Identifier", + "start":22,"end":23,"loc":{"start":{"line":2,"column":10},"end":{"line":2,"column":11},"identifierName":"x"}, + "name": "x" + } + }, + "value": { + "type": "NumericLiteral", + "start":26,"end":27,"loc":{"start":{"line":2,"column":14},"end":{"line":2,"column":15}}, + "extra": { + "rawValue": 1, + "raw": "1" + }, + "value": 1 + } + }, + { + "type": "ClassMethod", + "start":32,"end":71,"loc":{"start":{"line":4,"column":2},"end":{"line":6,"column":3}}, + "static": true, + "key": { + "type": "Identifier", + "start":39,"end":43,"loc":{"start":{"line":4,"column":9},"end":{"line":4,"column":13},"identifierName":"test"}, + "name": "test" + }, + "computed": false, + "kind": "method", + "id": null, + "generator": false, + "async": false, + "params": [], + "body": { + "type": "BlockStatement", + "start":46,"end":71,"loc":{"start":{"line":4,"column":16},"end":{"line":6,"column":3}}, + "body": [ + { + "type": "ReturnStatement", + "start":52,"end":67,"loc":{"start":{"line":5,"column":4},"end":{"line":5,"column":19}}, + "argument": { + "type": "OptionalMemberExpression", + "start":59,"end":66,"loc":{"start":{"line":5,"column":11},"end":{"line":5,"column":18}}, + "object": { + "type": "Identifier", + "start":59,"end":62,"loc":{"start":{"line":5,"column":11},"end":{"line":5,"column":14},"identifierName":"Foo"}, + "name": "Foo" + }, + "property": { + "type": "PrivateName", + "start":64,"end":66,"loc":{"start":{"line":5,"column":16},"end":{"line":5,"column":18}}, + "id": { + "type": "Identifier", + "start":65,"end":66,"loc":{"start":{"line":5,"column":17},"end":{"line":5,"column":18},"identifierName":"x"}, + "name": "x" + } + }, + "computed": false, + "optional": true + } + } + ], + "directives": [] + } + } + ] + } + } + ], + "directives": [] + } +} \ No newline at end of file diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-before-member-call-with-transform/exec.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-before-member-call-with-transform/exec.js new file mode 100644 index 000000000000..13cc95662d95 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-before-member-call-with-transform/exec.js @@ -0,0 +1,122 @@ +class Foo { + static #x = 1; + static #m = function() { return this.#x; }; + static #self = Foo; + static self = Foo; + static getSelf() { return this } + + static test() { + const o = { Foo: Foo }; + const deep = { very: { o } }; + function fn() { + return o; + } + function fnDeep() { + return deep; + } + + expect(o?.Foo.#m()).toEqual(1); + expect(o?.Foo.#m().toString).toEqual(1..toString); + expect(o?.Foo.#m().toString()).toEqual('1'); + + expect(deep?.very.o?.Foo.#m()).toEqual(1); + expect(deep?.very.o?.Foo.#m().toString).toEqual(1..toString); + expect(deep?.very.o?.Foo.#m().toString()).toEqual('1'); + + expect(o?.Foo.#self.#m()).toEqual(1); + expect(o?.Foo.#self.self.#m()).toEqual(1); + expect(o?.Foo.#self?.self.#m()).toEqual(1); + expect(o?.Foo.#self.self?.self.#m()).toEqual(1); + expect(o?.Foo.#self?.self?.self.#m()).toEqual(1); + + expect(o?.Foo.#self.getSelf().#m()).toEqual(1); + expect(o?.Foo.#self.getSelf?.().#m()).toEqual(1); + expect(o?.Foo.#self?.getSelf().#m()).toEqual(1); + expect(o?.Foo.#self?.getSelf?.().#m()).toEqual(1); + expect(o?.Foo.#self.getSelf()?.self.#m()).toEqual(1); + expect(o?.Foo.#self.getSelf?.()?.self.#m()).toEqual(1); + expect(o?.Foo.#self?.getSelf()?.self.#m()).toEqual(1); + expect(o?.Foo.#self?.getSelf?.()?.self.#m()).toEqual(1); + + expect(fn?.().Foo.#m()).toEqual(1); + expect(fn?.().Foo.#m().toString).toEqual(1..toString); + expect(fn?.().Foo.#m().toString()).toEqual('1'); + + expect(fnDeep?.().very.o?.Foo.#m()).toEqual(1); + expect(fnDeep?.().very.o?.Foo.#m().toString).toEqual(1..toString); + expect(fnDeep?.().very.o?.Foo.#m().toString()).toEqual('1'); + + expect(fn?.().Foo.#self.#m()).toEqual(1); + expect(fn?.().Foo.#self.self.#m()).toEqual(1); + expect(fn?.().Foo.#self?.self.#m()).toEqual(1); + expect(fn?.().Foo.#self.self?.self.#m()).toEqual(1); + expect(fn?.().Foo.#self?.self?.self.#m()).toEqual(1); + + expect(fn?.().Foo.#self.getSelf().#m()).toEqual(1); + expect(fn?.().Foo.#self.getSelf?.().#m()).toEqual(1); + expect(fn?.().Foo.#self?.getSelf().#m()).toEqual(1); + expect(fn?.().Foo.#self?.getSelf?.().#m()).toEqual(1); + expect(fn?.().Foo.#self.getSelf()?.self.#m()).toEqual(1); + expect(fn?.().Foo.#self.getSelf?.()?.self.#m()).toEqual(1); + expect(fn?.().Foo.#self?.getSelf()?.self.#m()).toEqual(1); + expect(fn?.().Foo.#self?.getSelf?.()?.self.#m()).toEqual(1); + } + + static testNull() { + const o = null;; + const deep = { very: { o } }; + const fn = null; + function fnDeep() { + return deep; + } + + expect(o?.Foo.#m()).toEqual(undefined); + expect(o?.Foo.#m().toString).toEqual(undefined); + expect(o?.Foo.#m().toString()).toEqual(undefined); + + expect(deep?.very.o?.Foo.#m()).toEqual(undefined); + expect(deep?.very.o?.Foo.#m().toString).toEqual(undefined); + expect(deep?.very.o?.Foo.#m().toString()).toEqual(undefined); + + expect(o?.Foo.#self.#m()).toEqual(undefined); + expect(o?.Foo.#self.self.#m()).toEqual(undefined); + expect(o?.Foo.#self?.self.#m()).toEqual(undefined); + expect(o?.Foo.#self.self?.self.#m()).toEqual(undefined); + expect(o?.Foo.#self?.self?.self.#m()).toEqual(undefined); + + expect(o?.Foo.#self.getSelf().#m()).toEqual(undefined); + expect(o?.Foo.#self.getSelf?.().#m()).toEqual(undefined); + expect(o?.Foo.#self?.getSelf().#m()).toEqual(undefined); + expect(o?.Foo.#self?.getSelf?.().#m()).toEqual(undefined); + expect(o?.Foo.#self.getSelf()?.self.#m()).toEqual(undefined); + expect(o?.Foo.#self.getSelf?.()?.self.#m()).toEqual(undefined); + expect(o?.Foo.#self?.getSelf()?.self.#m()).toEqual(undefined); + expect(o?.Foo.#self?.getSelf?.()?.self.#m()).toEqual(undefined); + + expect(fn?.().Foo.#m()).toEqual(undefined); + expect(fn?.().Foo.#m().toString).toEqual(undefined); + expect(fn?.().Foo.#m().toString()).toEqual(undefined); + + expect(fnDeep?.().very.o?.Foo.#m()).toEqual(undefined); + expect(fnDeep?.().very.o?.Foo.#m().toString).toEqual(undefined); + expect(fnDeep?.().very.o?.Foo.#m().toString()).toEqual(undefined); + + expect(fn?.().Foo.#self.#m()).toEqual(undefined); + expect(fn?.().Foo.#self.self.#m()).toEqual(undefined); + expect(fn?.().Foo.#self?.self.#m()).toEqual(undefined); + expect(fn?.().Foo.#self.self?.self.#m()).toEqual(undefined); + expect(fn?.().Foo.#self?.self?.self.#m()).toEqual(undefined); + + expect(fn?.().Foo.#self.getSelf().#m()).toEqual(undefined); + expect(fn?.().Foo.#self.getSelf?.().#m()).toEqual(undefined); + expect(fn?.().Foo.#self?.getSelf().#m()).toEqual(undefined); + expect(fn?.().Foo.#self?.getSelf?.().#m()).toEqual(undefined); + expect(fn?.().Foo.#self.getSelf()?.self.#m()).toEqual(undefined); + expect(fn?.().Foo.#self.getSelf?.()?.self.#m()).toEqual(undefined); + expect(fn?.().Foo.#self?.getSelf()?.self.#m()).toEqual(undefined); + expect(fn?.().Foo.#self?.getSelf?.()?.self.#m()).toEqual(undefined); + } +} + +Foo.test(); +Foo.testNull(); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-before-member-call-with-transform/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-before-member-call-with-transform/input.js new file mode 100644 index 000000000000..d29585b51d60 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-before-member-call-with-transform/input.js @@ -0,0 +1,66 @@ +class Foo { + static #x = 1; + static #m = function() { return this.#x; }; + static #self = Foo; + static self = Foo; + static getSelf() { return this } + + static test() { + const o = { Foo: Foo }; + const deep = { very: { o } }; + function fn() { + return o; + } + function fnDeep() { + return deep; + } + + o?.Foo.#m(); + o?.Foo.#m().toString; + o?.Foo.#m().toString(); + + deep?.very.o?.Foo.#m(); + deep?.very.o?.Foo.#m().toString; + deep?.very.o?.Foo.#m().toString(); + + o?.Foo.#self.#m(); + o?.Foo.#self.self.#m(); + o?.Foo.#self?.self.#m(); + o?.Foo.#self.self?.self.#m(); + o?.Foo.#self?.self?.self.#m(); + + o?.Foo.#self.getSelf().#m(); + o?.Foo.#self.getSelf?.().#m(); + o?.Foo.#self?.getSelf().#m(); + o?.Foo.#self?.getSelf?.().#m(); + o?.Foo.#self.getSelf()?.self.#m(); + o?.Foo.#self.getSelf?.()?.self.#m(); + o?.Foo.#self?.getSelf()?.self.#m(); + o?.Foo.#self?.getSelf?.()?.self.#m(); + + fn?.().Foo.#m(); + fn?.().Foo.#m().toString; + fn?.().Foo.#m().toString(); + + fnDeep?.().very.o?.Foo.#m(); + fnDeep?.().very.o?.Foo.#m().toString; + fnDeep?.().very.o?.Foo.#m().toString(); + + fn?.().Foo.#self.#m(); + fn?.().Foo.#self.self.#m(); + fn?.().Foo.#self?.self.#m(); + fn?.().Foo.#self.self?.self.#m(); + fn?.().Foo.#self?.self?.self.#m(); + + fn?.().Foo.#self.getSelf().#m(); + fn?.().Foo.#self.getSelf?.().#m(); + fn?.().Foo.#self?.getSelf().#m(); + fn?.().Foo.#self?.getSelf?.().#m(); + fn?.().Foo.#self.getSelf()?.self.#m(); + fn?.().Foo.#self.getSelf?.()?.self.#m(); + fn?.().Foo.#self?.getSelf()?.self.#m(); + fn?.().Foo.#self?.getSelf?.()?.self.#m(); + } +} + +Foo.test(); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-before-member-call-with-transform/options.json b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-before-member-call-with-transform/options.json new file mode 100644 index 000000000000..124133b5af2b --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-before-member-call-with-transform/options.json @@ -0,0 +1,6 @@ +{ + "plugins": [ + ["proposal-optional-chaining", { "loose": true }], + ["proposal-class-properties", { "loose": true }] + ] +} diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-before-member-call-with-transform/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-before-member-call-with-transform/output.js new file mode 100644 index 000000000000..a7f5c767a7b2 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-before-member-call-with-transform/output.js @@ -0,0 +1,95 @@ +function _classPrivateFieldLooseBase(receiver, privateKey) { if (!Object.prototype.hasOwnProperty.call(receiver, privateKey)) { throw new TypeError("attempted to use private field on non-instance"); } return receiver; } + +var id = 0; + +function _classPrivateFieldLooseKey(name) { return "__private_" + id++ + "_" + name; } + +class Foo { + static getSelf() { + return this; + } + + static test() { + var _deep$very$o, _deep$very$o2, _deep$very$o3, _ref, _ref2, _self2, _classPrivateFieldLoo, _ref3, _ref4, _getSelf, _ref5, _ref6, _classPrivateFieldLoo2, _call, _getSelf2, _getSelf3, _fnDeep$very$o, _fnDeep$very$o2, _fnDeep$very$o3, _ref7, _ref8, _self3, _classPrivateFieldLoo3, _ref9, _ref10, _getSelf4, _ref11, _ref12, _classPrivateFieldLoo4, _call2, _getSelf5, _getSelf6, _ref13, _ref14, _ref15, _ref16, _ref17, _ref18, _ref19, _ref20, _ref21, _ref22; + + const o = { + Foo: Foo + }; + const deep = { + very: { + o + } + }; + + function fn() { + return o; + } + + function fnDeep() { + return deep; + } + + o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _m)[_m](); + o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _m)[_m]().toString; + o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _m)[_m]().toString(); + (_deep$very$o = deep == null ? void 0 : deep.very.o) === null || _deep$very$o === void 0 ? void 0 : _classPrivateFieldLooseBase(_deep$very$o.Foo, _m)[_m](); + (_deep$very$o2 = deep == null ? void 0 : deep.very.o) === null || _deep$very$o2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_deep$very$o2.Foo, _m)[_m]().toString; + (_deep$very$o3 = deep == null ? void 0 : deep.very.o) === null || _deep$very$o3 === void 0 ? void 0 : _classPrivateFieldLooseBase(_deep$very$o3.Foo, _m)[_m]().toString(); + o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(_classPrivateFieldLooseBase(o.Foo, _self)[_self], _m)[_m](); + o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(_classPrivateFieldLooseBase(o.Foo, _self)[_self].self, _m)[_m](); + (_ref = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self]) === null || _ref === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref.self, _m)[_m](); + (_ref2 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self].self) === null || _ref2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref2.self, _m)[_m](); + (_self2 = (_ref13 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self]) == null ? void 0 : _ref13.self) === null || _self2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_self2.self, _m)[_m](); + o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(_classPrivateFieldLooseBase(o.Foo, _self)[_self].getSelf(), _m)[_m](); + (_ref3 = o === null || o === void 0 ? void 0 : (_classPrivateFieldLoo = _classPrivateFieldLooseBase(o.Foo, _self)[_self]).getSelf) === null || _ref3 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref3.call(_classPrivateFieldLoo), _m)[_m](); + (_ref4 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self]) === null || _ref4 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref4.getSelf(), _m)[_m](); + (_getSelf = (_ref14 = _ref5 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self]) == null ? void 0 : _ref14.getSelf) === null || _getSelf === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf.call(_ref5), _m)[_m](); + (_ref6 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self].getSelf()) === null || _ref6 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref6.self, _m)[_m](); + (_call = (_ref15 = o === null || o === void 0 ? void 0 : (_classPrivateFieldLoo2 = _classPrivateFieldLooseBase(o.Foo, _self)[_self]).getSelf) == null ? void 0 : _ref15.call(_classPrivateFieldLoo2)) === null || _call === void 0 ? void 0 : _classPrivateFieldLooseBase(_call.self, _m)[_m](); + (_getSelf2 = (_ref16 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self]) == null ? void 0 : _ref16.getSelf()) === null || _getSelf2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf2.self, _m)[_m](); + (_getSelf3 = (_ref17 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self]) == null ? void 0 : _ref17.getSelf == null ? void 0 : _ref17.getSelf()) === null || _getSelf3 === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf3.self, _m)[_m](); + fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _m)[_m](); + fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _m)[_m]().toString; + fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _m)[_m]().toString(); + (_fnDeep$very$o = fnDeep == null ? void 0 : fnDeep().very.o) === null || _fnDeep$very$o === void 0 ? void 0 : _classPrivateFieldLooseBase(_fnDeep$very$o.Foo, _m)[_m](); + (_fnDeep$very$o2 = fnDeep == null ? void 0 : fnDeep().very.o) === null || _fnDeep$very$o2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_fnDeep$very$o2.Foo, _m)[_m]().toString; + (_fnDeep$very$o3 = fnDeep == null ? void 0 : fnDeep().very.o) === null || _fnDeep$very$o3 === void 0 ? void 0 : _classPrivateFieldLooseBase(_fnDeep$very$o3.Foo, _m)[_m]().toString(); + fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(_classPrivateFieldLooseBase(fn().Foo, _self)[_self], _m)[_m](); + fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(_classPrivateFieldLooseBase(fn().Foo, _self)[_self].self, _m)[_m](); + (_ref7 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self]) === null || _ref7 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref7.self, _m)[_m](); + (_ref8 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self].self) === null || _ref8 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref8.self, _m)[_m](); + (_self3 = (_ref18 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self]) == null ? void 0 : _ref18.self) === null || _self3 === void 0 ? void 0 : _classPrivateFieldLooseBase(_self3.self, _m)[_m](); + fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(_classPrivateFieldLooseBase(fn().Foo, _self)[_self].getSelf(), _m)[_m](); + (_ref9 = fn === null || fn === void 0 ? void 0 : (_classPrivateFieldLoo3 = _classPrivateFieldLooseBase(fn().Foo, _self)[_self]).getSelf) === null || _ref9 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref9.call(_classPrivateFieldLoo3), _m)[_m](); + (_ref10 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self]) === null || _ref10 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref10.getSelf(), _m)[_m](); + (_getSelf4 = (_ref19 = _ref11 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self]) == null ? void 0 : _ref19.getSelf) === null || _getSelf4 === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf4.call(_ref11), _m)[_m](); + (_ref12 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self].getSelf()) === null || _ref12 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref12.self, _m)[_m](); + (_call2 = (_ref20 = fn === null || fn === void 0 ? void 0 : (_classPrivateFieldLoo4 = _classPrivateFieldLooseBase(fn().Foo, _self)[_self]).getSelf) == null ? void 0 : _ref20.call(_classPrivateFieldLoo4)) === null || _call2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_call2.self, _m)[_m](); + (_getSelf5 = (_ref21 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self]) == null ? void 0 : _ref21.getSelf()) === null || _getSelf5 === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf5.self, _m)[_m](); + (_getSelf6 = (_ref22 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self]) == null ? void 0 : _ref22.getSelf == null ? void 0 : _ref22.getSelf()) === null || _getSelf6 === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf6.self, _m)[_m](); + } + +} + +var _x = _classPrivateFieldLooseKey("x"); + +var _m = _classPrivateFieldLooseKey("m"); + +var _self = _classPrivateFieldLooseKey("self"); + +Object.defineProperty(Foo, _x, { + writable: true, + value: 1 +}); +Object.defineProperty(Foo, _m, { + writable: true, + value: function () { + return _classPrivateFieldLooseBase(this, _x)[_x]; + } +}); +Object.defineProperty(Foo, _self, { + writable: true, + value: Foo +}); +Foo.self = Foo; +Foo.test(); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-before-member-call/exec.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-before-member-call/exec.js new file mode 100644 index 000000000000..13cc95662d95 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-before-member-call/exec.js @@ -0,0 +1,122 @@ +class Foo { + static #x = 1; + static #m = function() { return this.#x; }; + static #self = Foo; + static self = Foo; + static getSelf() { return this } + + static test() { + const o = { Foo: Foo }; + const deep = { very: { o } }; + function fn() { + return o; + } + function fnDeep() { + return deep; + } + + expect(o?.Foo.#m()).toEqual(1); + expect(o?.Foo.#m().toString).toEqual(1..toString); + expect(o?.Foo.#m().toString()).toEqual('1'); + + expect(deep?.very.o?.Foo.#m()).toEqual(1); + expect(deep?.very.o?.Foo.#m().toString).toEqual(1..toString); + expect(deep?.very.o?.Foo.#m().toString()).toEqual('1'); + + expect(o?.Foo.#self.#m()).toEqual(1); + expect(o?.Foo.#self.self.#m()).toEqual(1); + expect(o?.Foo.#self?.self.#m()).toEqual(1); + expect(o?.Foo.#self.self?.self.#m()).toEqual(1); + expect(o?.Foo.#self?.self?.self.#m()).toEqual(1); + + expect(o?.Foo.#self.getSelf().#m()).toEqual(1); + expect(o?.Foo.#self.getSelf?.().#m()).toEqual(1); + expect(o?.Foo.#self?.getSelf().#m()).toEqual(1); + expect(o?.Foo.#self?.getSelf?.().#m()).toEqual(1); + expect(o?.Foo.#self.getSelf()?.self.#m()).toEqual(1); + expect(o?.Foo.#self.getSelf?.()?.self.#m()).toEqual(1); + expect(o?.Foo.#self?.getSelf()?.self.#m()).toEqual(1); + expect(o?.Foo.#self?.getSelf?.()?.self.#m()).toEqual(1); + + expect(fn?.().Foo.#m()).toEqual(1); + expect(fn?.().Foo.#m().toString).toEqual(1..toString); + expect(fn?.().Foo.#m().toString()).toEqual('1'); + + expect(fnDeep?.().very.o?.Foo.#m()).toEqual(1); + expect(fnDeep?.().very.o?.Foo.#m().toString).toEqual(1..toString); + expect(fnDeep?.().very.o?.Foo.#m().toString()).toEqual('1'); + + expect(fn?.().Foo.#self.#m()).toEqual(1); + expect(fn?.().Foo.#self.self.#m()).toEqual(1); + expect(fn?.().Foo.#self?.self.#m()).toEqual(1); + expect(fn?.().Foo.#self.self?.self.#m()).toEqual(1); + expect(fn?.().Foo.#self?.self?.self.#m()).toEqual(1); + + expect(fn?.().Foo.#self.getSelf().#m()).toEqual(1); + expect(fn?.().Foo.#self.getSelf?.().#m()).toEqual(1); + expect(fn?.().Foo.#self?.getSelf().#m()).toEqual(1); + expect(fn?.().Foo.#self?.getSelf?.().#m()).toEqual(1); + expect(fn?.().Foo.#self.getSelf()?.self.#m()).toEqual(1); + expect(fn?.().Foo.#self.getSelf?.()?.self.#m()).toEqual(1); + expect(fn?.().Foo.#self?.getSelf()?.self.#m()).toEqual(1); + expect(fn?.().Foo.#self?.getSelf?.()?.self.#m()).toEqual(1); + } + + static testNull() { + const o = null;; + const deep = { very: { o } }; + const fn = null; + function fnDeep() { + return deep; + } + + expect(o?.Foo.#m()).toEqual(undefined); + expect(o?.Foo.#m().toString).toEqual(undefined); + expect(o?.Foo.#m().toString()).toEqual(undefined); + + expect(deep?.very.o?.Foo.#m()).toEqual(undefined); + expect(deep?.very.o?.Foo.#m().toString).toEqual(undefined); + expect(deep?.very.o?.Foo.#m().toString()).toEqual(undefined); + + expect(o?.Foo.#self.#m()).toEqual(undefined); + expect(o?.Foo.#self.self.#m()).toEqual(undefined); + expect(o?.Foo.#self?.self.#m()).toEqual(undefined); + expect(o?.Foo.#self.self?.self.#m()).toEqual(undefined); + expect(o?.Foo.#self?.self?.self.#m()).toEqual(undefined); + + expect(o?.Foo.#self.getSelf().#m()).toEqual(undefined); + expect(o?.Foo.#self.getSelf?.().#m()).toEqual(undefined); + expect(o?.Foo.#self?.getSelf().#m()).toEqual(undefined); + expect(o?.Foo.#self?.getSelf?.().#m()).toEqual(undefined); + expect(o?.Foo.#self.getSelf()?.self.#m()).toEqual(undefined); + expect(o?.Foo.#self.getSelf?.()?.self.#m()).toEqual(undefined); + expect(o?.Foo.#self?.getSelf()?.self.#m()).toEqual(undefined); + expect(o?.Foo.#self?.getSelf?.()?.self.#m()).toEqual(undefined); + + expect(fn?.().Foo.#m()).toEqual(undefined); + expect(fn?.().Foo.#m().toString).toEqual(undefined); + expect(fn?.().Foo.#m().toString()).toEqual(undefined); + + expect(fnDeep?.().very.o?.Foo.#m()).toEqual(undefined); + expect(fnDeep?.().very.o?.Foo.#m().toString).toEqual(undefined); + expect(fnDeep?.().very.o?.Foo.#m().toString()).toEqual(undefined); + + expect(fn?.().Foo.#self.#m()).toEqual(undefined); + expect(fn?.().Foo.#self.self.#m()).toEqual(undefined); + expect(fn?.().Foo.#self?.self.#m()).toEqual(undefined); + expect(fn?.().Foo.#self.self?.self.#m()).toEqual(undefined); + expect(fn?.().Foo.#self?.self?.self.#m()).toEqual(undefined); + + expect(fn?.().Foo.#self.getSelf().#m()).toEqual(undefined); + expect(fn?.().Foo.#self.getSelf?.().#m()).toEqual(undefined); + expect(fn?.().Foo.#self?.getSelf().#m()).toEqual(undefined); + expect(fn?.().Foo.#self?.getSelf?.().#m()).toEqual(undefined); + expect(fn?.().Foo.#self.getSelf()?.self.#m()).toEqual(undefined); + expect(fn?.().Foo.#self.getSelf?.()?.self.#m()).toEqual(undefined); + expect(fn?.().Foo.#self?.getSelf()?.self.#m()).toEqual(undefined); + expect(fn?.().Foo.#self?.getSelf?.()?.self.#m()).toEqual(undefined); + } +} + +Foo.test(); +Foo.testNull(); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-before-member-call/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-before-member-call/input.js new file mode 100644 index 000000000000..d29585b51d60 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-before-member-call/input.js @@ -0,0 +1,66 @@ +class Foo { + static #x = 1; + static #m = function() { return this.#x; }; + static #self = Foo; + static self = Foo; + static getSelf() { return this } + + static test() { + const o = { Foo: Foo }; + const deep = { very: { o } }; + function fn() { + return o; + } + function fnDeep() { + return deep; + } + + o?.Foo.#m(); + o?.Foo.#m().toString; + o?.Foo.#m().toString(); + + deep?.very.o?.Foo.#m(); + deep?.very.o?.Foo.#m().toString; + deep?.very.o?.Foo.#m().toString(); + + o?.Foo.#self.#m(); + o?.Foo.#self.self.#m(); + o?.Foo.#self?.self.#m(); + o?.Foo.#self.self?.self.#m(); + o?.Foo.#self?.self?.self.#m(); + + o?.Foo.#self.getSelf().#m(); + o?.Foo.#self.getSelf?.().#m(); + o?.Foo.#self?.getSelf().#m(); + o?.Foo.#self?.getSelf?.().#m(); + o?.Foo.#self.getSelf()?.self.#m(); + o?.Foo.#self.getSelf?.()?.self.#m(); + o?.Foo.#self?.getSelf()?.self.#m(); + o?.Foo.#self?.getSelf?.()?.self.#m(); + + fn?.().Foo.#m(); + fn?.().Foo.#m().toString; + fn?.().Foo.#m().toString(); + + fnDeep?.().very.o?.Foo.#m(); + fnDeep?.().very.o?.Foo.#m().toString; + fnDeep?.().very.o?.Foo.#m().toString(); + + fn?.().Foo.#self.#m(); + fn?.().Foo.#self.self.#m(); + fn?.().Foo.#self?.self.#m(); + fn?.().Foo.#self.self?.self.#m(); + fn?.().Foo.#self?.self?.self.#m(); + + fn?.().Foo.#self.getSelf().#m(); + fn?.().Foo.#self.getSelf?.().#m(); + fn?.().Foo.#self?.getSelf().#m(); + fn?.().Foo.#self?.getSelf?.().#m(); + fn?.().Foo.#self.getSelf()?.self.#m(); + fn?.().Foo.#self.getSelf?.()?.self.#m(); + fn?.().Foo.#self?.getSelf()?.self.#m(); + fn?.().Foo.#self?.getSelf?.()?.self.#m(); + } +} + +Foo.test(); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-before-member-call/options.json b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-before-member-call/options.json new file mode 100644 index 000000000000..2d5cfe8e8095 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-before-member-call/options.json @@ -0,0 +1,4 @@ +{ + "plugins": [["proposal-class-properties", { "loose": true }]], + "minNodeVersion": "14.0.0" +} diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-before-member-call/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-before-member-call/output.js new file mode 100644 index 000000000000..4dfec699eef5 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-before-member-call/output.js @@ -0,0 +1,95 @@ +function _classPrivateFieldLooseBase(receiver, privateKey) { if (!Object.prototype.hasOwnProperty.call(receiver, privateKey)) { throw new TypeError("attempted to use private field on non-instance"); } return receiver; } + +var id = 0; + +function _classPrivateFieldLooseKey(name) { return "__private_" + id++ + "_" + name; } + +class Foo { + static getSelf() { + return this; + } + + static test() { + var _deep$very$o, _deep$very$o2, _deep$very$o3, _ref, _ref2, _self2, _classPrivateFieldLoo, _ref3, _ref4, _getSelf, _ref5, _ref6, _classPrivateFieldLoo2, _call, _getSelf2, _getSelf3, _fnDeep$very$o, _fnDeep$very$o2, _fnDeep$very$o3, _ref7, _ref8, _self3, _classPrivateFieldLoo3, _ref9, _ref10, _getSelf4, _ref11, _ref12, _classPrivateFieldLoo4, _call2, _getSelf5, _getSelf6; + + const o = { + Foo: Foo + }; + const deep = { + very: { + o + } + }; + + function fn() { + return o; + } + + function fnDeep() { + return deep; + } + + o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _m)[_m](); + o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _m)[_m]().toString; + o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _m)[_m]().toString(); + (_deep$very$o = deep?.very.o) === null || _deep$very$o === void 0 ? void 0 : _classPrivateFieldLooseBase(_deep$very$o.Foo, _m)[_m](); + (_deep$very$o2 = deep?.very.o) === null || _deep$very$o2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_deep$very$o2.Foo, _m)[_m]().toString; + (_deep$very$o3 = deep?.very.o) === null || _deep$very$o3 === void 0 ? void 0 : _classPrivateFieldLooseBase(_deep$very$o3.Foo, _m)[_m]().toString(); + o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(_classPrivateFieldLooseBase(o.Foo, _self)[_self], _m)[_m](); + o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(_classPrivateFieldLooseBase(o.Foo, _self)[_self].self, _m)[_m](); + (_ref = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self]) === null || _ref === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref.self, _m)[_m](); + (_ref2 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self].self) === null || _ref2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref2.self, _m)[_m](); + (_self2 = (o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self])?.self) === null || _self2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_self2.self, _m)[_m](); + o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(_classPrivateFieldLooseBase(o.Foo, _self)[_self].getSelf(), _m)[_m](); + (_ref3 = o === null || o === void 0 ? void 0 : (_classPrivateFieldLoo = _classPrivateFieldLooseBase(o.Foo, _self)[_self]).getSelf) === null || _ref3 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref3.call(_classPrivateFieldLoo), _m)[_m](); + (_ref4 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self]) === null || _ref4 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref4.getSelf(), _m)[_m](); + (_getSelf = (_ref5 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self])?.getSelf) === null || _getSelf === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf.call(_ref5), _m)[_m](); + (_ref6 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self].getSelf()) === null || _ref6 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref6.self, _m)[_m](); + (_call = (o === null || o === void 0 ? void 0 : (_classPrivateFieldLoo2 = _classPrivateFieldLooseBase(o.Foo, _self)[_self]).getSelf)?.call(_classPrivateFieldLoo2)) === null || _call === void 0 ? void 0 : _classPrivateFieldLooseBase(_call.self, _m)[_m](); + (_getSelf2 = (o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self])?.getSelf()) === null || _getSelf2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf2.self, _m)[_m](); + (_getSelf3 = (o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self])?.getSelf?.()) === null || _getSelf3 === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf3.self, _m)[_m](); + fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _m)[_m](); + fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _m)[_m]().toString; + fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _m)[_m]().toString(); + (_fnDeep$very$o = fnDeep?.().very.o) === null || _fnDeep$very$o === void 0 ? void 0 : _classPrivateFieldLooseBase(_fnDeep$very$o.Foo, _m)[_m](); + (_fnDeep$very$o2 = fnDeep?.().very.o) === null || _fnDeep$very$o2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_fnDeep$very$o2.Foo, _m)[_m]().toString; + (_fnDeep$very$o3 = fnDeep?.().very.o) === null || _fnDeep$very$o3 === void 0 ? void 0 : _classPrivateFieldLooseBase(_fnDeep$very$o3.Foo, _m)[_m]().toString(); + fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(_classPrivateFieldLooseBase(fn().Foo, _self)[_self], _m)[_m](); + fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(_classPrivateFieldLooseBase(fn().Foo, _self)[_self].self, _m)[_m](); + (_ref7 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self]) === null || _ref7 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref7.self, _m)[_m](); + (_ref8 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self].self) === null || _ref8 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref8.self, _m)[_m](); + (_self3 = (fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self])?.self) === null || _self3 === void 0 ? void 0 : _classPrivateFieldLooseBase(_self3.self, _m)[_m](); + fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(_classPrivateFieldLooseBase(fn().Foo, _self)[_self].getSelf(), _m)[_m](); + (_ref9 = fn === null || fn === void 0 ? void 0 : (_classPrivateFieldLoo3 = _classPrivateFieldLooseBase(fn().Foo, _self)[_self]).getSelf) === null || _ref9 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref9.call(_classPrivateFieldLoo3), _m)[_m](); + (_ref10 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self]) === null || _ref10 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref10.getSelf(), _m)[_m](); + (_getSelf4 = (_ref11 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self])?.getSelf) === null || _getSelf4 === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf4.call(_ref11), _m)[_m](); + (_ref12 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self].getSelf()) === null || _ref12 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref12.self, _m)[_m](); + (_call2 = (fn === null || fn === void 0 ? void 0 : (_classPrivateFieldLoo4 = _classPrivateFieldLooseBase(fn().Foo, _self)[_self]).getSelf)?.call(_classPrivateFieldLoo4)) === null || _call2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_call2.self, _m)[_m](); + (_getSelf5 = (fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self])?.getSelf()) === null || _getSelf5 === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf5.self, _m)[_m](); + (_getSelf6 = (fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self])?.getSelf?.()) === null || _getSelf6 === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf6.self, _m)[_m](); + } + +} + +var _x = _classPrivateFieldLooseKey("x"); + +var _m = _classPrivateFieldLooseKey("m"); + +var _self = _classPrivateFieldLooseKey("self"); + +Object.defineProperty(Foo, _x, { + writable: true, + value: 1 +}); +Object.defineProperty(Foo, _m, { + writable: true, + value: function () { + return _classPrivateFieldLooseBase(this, _x)[_x]; + } +}); +Object.defineProperty(Foo, _self, { + writable: true, + value: Foo +}); +Foo.self = Foo; +Foo.test(); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-before-property-with-transform/exec.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-before-property-with-transform/exec.js new file mode 100644 index 000000000000..98ac8e7a7e12 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-before-property-with-transform/exec.js @@ -0,0 +1,121 @@ +class Foo { + static #x = 1; + static #self = Foo; + static self = Foo; + static getSelf() { return this } + + static test() { + const o = { Foo: Foo }; + const deep = { very: { o } }; + function fn() { + return o; + } + function fnDeep() { + return deep; + } + + expect(o?.Foo.#x).toEqual(1); + expect(o?.Foo.#x.toString).toEqual(1..toString); + expect(o?.Foo.#x.toString()).toEqual('1'); + + expect(deep?.very.o?.Foo.#x).toEqual(1); + expect(deep?.very.o?.Foo.#x.toString).toEqual(1..toString); + expect(deep?.very.o?.Foo.#x.toString()).toEqual('1'); + + expect(o?.Foo.#self.#x).toEqual(1); + expect(o?.Foo.#self.self.#x).toEqual(1); + expect(o?.Foo.#self?.self.#x).toEqual(1); + expect(o?.Foo.#self.self?.self.#x).toEqual(1); + expect(o?.Foo.#self?.self?.self.#x).toEqual(1); + + expect(o?.Foo.#self.getSelf().#x).toEqual(1); + expect(o?.Foo.#self.getSelf?.().#x).toEqual(1); + expect(o?.Foo.#self?.getSelf().#x).toEqual(1); + expect(o?.Foo.#self?.getSelf?.().#x).toEqual(1); + expect(o?.Foo.#self.getSelf()?.self.#x).toEqual(1); + expect(o?.Foo.#self.getSelf?.()?.self.#x).toEqual(1); + expect(o?.Foo.#self?.getSelf()?.self.#x).toEqual(1); + expect(o?.Foo.#self?.getSelf?.()?.self.#x).toEqual(1); + + expect(fn?.().Foo.#x).toEqual(1); + expect(fn?.().Foo.#x.toString).toEqual(1..toString); + expect(fn?.().Foo.#x.toString()).toEqual('1'); + + expect(fnDeep?.().very.o?.Foo.#x).toEqual(1); + expect(fnDeep?.().very.o?.Foo.#x.toString).toEqual(1..toString); + expect(fnDeep?.().very.o?.Foo.#x.toString()).toEqual('1'); + + expect(fn?.().Foo.#self.#x).toEqual(1); + expect(fn?.().Foo.#self.self.#x).toEqual(1); + expect(fn?.().Foo.#self?.self.#x).toEqual(1); + expect(fn?.().Foo.#self.self?.self.#x).toEqual(1); + expect(fn?.().Foo.#self?.self?.self.#x).toEqual(1); + + expect(fn?.().Foo.#self.getSelf().#x).toEqual(1); + expect(fn?.().Foo.#self.getSelf?.().#x).toEqual(1); + expect(fn?.().Foo.#self?.getSelf().#x).toEqual(1); + expect(fn?.().Foo.#self?.getSelf?.().#x).toEqual(1); + expect(fn?.().Foo.#self.getSelf()?.self.#x).toEqual(1); + expect(fn?.().Foo.#self.getSelf?.()?.self.#x).toEqual(1); + expect(fn?.().Foo.#self?.getSelf()?.self.#x).toEqual(1); + expect(fn?.().Foo.#self?.getSelf?.()?.self.#x).toEqual(1); + } + + static testNull() { + const o = null;; + const deep = { very: { o } }; + const fn = null; + function fnDeep() { + return deep; + } + + expect(o?.Foo.#x).toEqual(undefined); + expect(o?.Foo.#x.toString).toEqual(undefined); + expect(o?.Foo.#x.toString()).toEqual(undefined); + + expect(deep?.very.o?.Foo.#x).toEqual(undefined); + expect(deep?.very.o?.Foo.#x.toString).toEqual(undefined); + expect(deep?.very.o?.Foo.#x.toString()).toEqual(undefined); + + expect(o?.Foo.#self.#x).toEqual(undefined); + expect(o?.Foo.#self.self.#x).toEqual(undefined); + expect(o?.Foo.#self?.self.#x).toEqual(undefined); + expect(o?.Foo.#self.self?.self.#x).toEqual(undefined); + expect(o?.Foo.#self?.self?.self.#x).toEqual(undefined); + + expect(o?.Foo.#self.getSelf().#x).toEqual(undefined); + expect(o?.Foo.#self.getSelf?.().#x).toEqual(undefined); + expect(o?.Foo.#self?.getSelf().#x).toEqual(undefined); + expect(o?.Foo.#self?.getSelf?.().#x).toEqual(undefined); + expect(o?.Foo.#self.getSelf()?.self.#x).toEqual(undefined); + expect(o?.Foo.#self.getSelf?.()?.self.#x).toEqual(undefined); + expect(o?.Foo.#self?.getSelf()?.self.#x).toEqual(undefined); + expect(o?.Foo.#self?.getSelf?.()?.self.#x).toEqual(undefined); + + expect(fn?.().Foo.#x).toEqual(undefined); + expect(fn?.().Foo.#x.toString).toEqual(undefined); + expect(fn?.().Foo.#x.toString()).toEqual(undefined); + + expect(fnDeep?.().very.o?.Foo.#x).toEqual(undefined); + expect(fnDeep?.().very.o?.Foo.#x.toString).toEqual(undefined); + expect(fnDeep?.().very.o?.Foo.#x.toString()).toEqual(undefined); + + expect(fn?.().Foo.#self.#x).toEqual(undefined); + expect(fn?.().Foo.#self.self.#x).toEqual(undefined); + expect(fn?.().Foo.#self?.self.#x).toEqual(undefined); + expect(fn?.().Foo.#self.self?.self.#x).toEqual(undefined); + expect(fn?.().Foo.#self?.self?.self.#x).toEqual(undefined); + + expect(fn?.().Foo.#self.getSelf().#x).toEqual(undefined); + expect(fn?.().Foo.#self.getSelf?.().#x).toEqual(undefined); + expect(fn?.().Foo.#self?.getSelf().#x).toEqual(undefined); + expect(fn?.().Foo.#self?.getSelf?.().#x).toEqual(undefined); + expect(fn?.().Foo.#self.getSelf()?.self.#x).toEqual(undefined); + expect(fn?.().Foo.#self.getSelf?.()?.self.#x).toEqual(undefined); + expect(fn?.().Foo.#self?.getSelf()?.self.#x).toEqual(undefined); + expect(fn?.().Foo.#self?.getSelf?.()?.self.#x).toEqual(undefined); + } +} + +Foo.test(); +Foo.testNull(); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-before-property-with-transform/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-before-property-with-transform/input.js new file mode 100644 index 000000000000..fad2504d95e6 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-before-property-with-transform/input.js @@ -0,0 +1,65 @@ +class Foo { + static #x = 1; + static #self = Foo; + static self = Foo; + static getSelf() { return this } + + static test() { + const o = { Foo: Foo }; + const deep = { very: { o } }; + function fn() { + return o; + } + function fnDeep() { + return deep; + } + + o?.Foo.#x; + o?.Foo.#x.toString; + o?.Foo.#x.toString(); + + deep?.very.o?.Foo.#x; + deep?.very.o?.Foo.#x.toString; + deep?.very.o?.Foo.#x.toString(); + + o?.Foo.#self.#x; + o?.Foo.#self.self.#x; + o?.Foo.#self?.self.#x; + o?.Foo.#self.self?.self.#x; + o?.Foo.#self?.self?.self.#x; + + o?.Foo.#self.getSelf().#x; + o?.Foo.#self.getSelf?.().#x; + o?.Foo.#self?.getSelf().#x; + o?.Foo.#self?.getSelf?.().#x; + o?.Foo.#self.getSelf()?.self.#x; + o?.Foo.#self.getSelf?.()?.self.#x; + o?.Foo.#self?.getSelf()?.self.#x; + o?.Foo.#self?.getSelf?.()?.self.#x; + + fn?.().Foo.#x; + fn?.().Foo.#x.toString; + fn?.().Foo.#x.toString(); + + fnDeep?.().very.o?.Foo.#x; + fnDeep?.().very.o?.Foo.#x.toString; + fnDeep?.().very.o?.Foo.#x.toString(); + + fn?.().Foo.#self.#x; + fn?.().Foo.#self.self.#x; + fn?.().Foo.#self?.self.#x; + fn?.().Foo.#self.self?.self.#x; + fn?.().Foo.#self?.self?.self.#x; + + fn?.().Foo.#self.getSelf().#x; + fn?.().Foo.#self.getSelf?.().#x; + fn?.().Foo.#self?.getSelf().#x; + fn?.().Foo.#self?.getSelf?.().#x; + fn?.().Foo.#self.getSelf()?.self.#x; + fn?.().Foo.#self.getSelf?.()?.self.#x; + fn?.().Foo.#self?.getSelf()?.self.#x; + fn?.().Foo.#self?.getSelf?.()?.self.#x; + } +} + +Foo.test(); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-before-property-with-transform/options.json b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-before-property-with-transform/options.json new file mode 100644 index 000000000000..124133b5af2b --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-before-property-with-transform/options.json @@ -0,0 +1,6 @@ +{ + "plugins": [ + ["proposal-optional-chaining", { "loose": true }], + ["proposal-class-properties", { "loose": true }] + ] +} diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-before-property-with-transform/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-before-property-with-transform/output.js new file mode 100644 index 000000000000..c48dfe3de5a9 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-before-property-with-transform/output.js @@ -0,0 +1,87 @@ +function _classPrivateFieldLooseBase(receiver, privateKey) { if (!Object.prototype.hasOwnProperty.call(receiver, privateKey)) { throw new TypeError("attempted to use private field on non-instance"); } return receiver; } + +var id = 0; + +function _classPrivateFieldLooseKey(name) { return "__private_" + id++ + "_" + name; } + +class Foo { + static getSelf() { + return this; + } + + static test() { + var _deep$very$o, _deep$very$o2, _deep$very$o3, _ref, _ref2, _self2, _classPrivateFieldLoo, _ref3, _ref4, _getSelf, _ref5, _ref6, _classPrivateFieldLoo2, _call, _getSelf2, _getSelf3, _fnDeep$very$o, _fnDeep$very$o2, _fnDeep$very$o3, _ref7, _ref8, _self3, _classPrivateFieldLoo3, _ref9, _ref10, _getSelf4, _ref11, _ref12, _classPrivateFieldLoo4, _call2, _getSelf5, _getSelf6, _ref13, _ref14, _ref15, _ref16, _ref17, _ref18, _ref19, _ref20, _ref21, _ref22; + + const o = { + Foo: Foo + }; + const deep = { + very: { + o + } + }; + + function fn() { + return o; + } + + function fnDeep() { + return deep; + } + + o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _x)[_x]; + o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _x)[_x].toString; + o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _x)[_x].toString(); + (_deep$very$o = deep == null ? void 0 : deep.very.o) === null || _deep$very$o === void 0 ? void 0 : _classPrivateFieldLooseBase(_deep$very$o.Foo, _x)[_x]; + (_deep$very$o2 = deep == null ? void 0 : deep.very.o) === null || _deep$very$o2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_deep$very$o2.Foo, _x)[_x].toString; + (_deep$very$o3 = deep == null ? void 0 : deep.very.o) === null || _deep$very$o3 === void 0 ? void 0 : _classPrivateFieldLooseBase(_deep$very$o3.Foo, _x)[_x].toString(); + o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(_classPrivateFieldLooseBase(o.Foo, _self)[_self], _x)[_x]; + o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(_classPrivateFieldLooseBase(o.Foo, _self)[_self].self, _x)[_x]; + (_ref = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self]) === null || _ref === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref.self, _x)[_x]; + (_ref2 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self].self) === null || _ref2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref2.self, _x)[_x]; + (_self2 = (_ref13 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self]) == null ? void 0 : _ref13.self) === null || _self2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_self2.self, _x)[_x]; + o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(_classPrivateFieldLooseBase(o.Foo, _self)[_self].getSelf(), _x)[_x]; + (_ref3 = o === null || o === void 0 ? void 0 : (_classPrivateFieldLoo = _classPrivateFieldLooseBase(o.Foo, _self)[_self]).getSelf) === null || _ref3 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref3.call(_classPrivateFieldLoo), _x)[_x]; + (_ref4 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self]) === null || _ref4 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref4.getSelf(), _x)[_x]; + (_getSelf = (_ref14 = _ref5 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self]) == null ? void 0 : _ref14.getSelf) === null || _getSelf === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf.call(_ref5), _x)[_x]; + (_ref6 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self].getSelf()) === null || _ref6 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref6.self, _x)[_x]; + (_call = (_ref15 = o === null || o === void 0 ? void 0 : (_classPrivateFieldLoo2 = _classPrivateFieldLooseBase(o.Foo, _self)[_self]).getSelf) == null ? void 0 : _ref15.call(_classPrivateFieldLoo2)) === null || _call === void 0 ? void 0 : _classPrivateFieldLooseBase(_call.self, _x)[_x]; + (_getSelf2 = (_ref16 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self]) == null ? void 0 : _ref16.getSelf()) === null || _getSelf2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf2.self, _x)[_x]; + (_getSelf3 = (_ref17 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self]) == null ? void 0 : _ref17.getSelf == null ? void 0 : _ref17.getSelf()) === null || _getSelf3 === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf3.self, _x)[_x]; + fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _x)[_x]; + fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _x)[_x].toString; + fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _x)[_x].toString(); + (_fnDeep$very$o = fnDeep == null ? void 0 : fnDeep().very.o) === null || _fnDeep$very$o === void 0 ? void 0 : _classPrivateFieldLooseBase(_fnDeep$very$o.Foo, _x)[_x]; + (_fnDeep$very$o2 = fnDeep == null ? void 0 : fnDeep().very.o) === null || _fnDeep$very$o2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_fnDeep$very$o2.Foo, _x)[_x].toString; + (_fnDeep$very$o3 = fnDeep == null ? void 0 : fnDeep().very.o) === null || _fnDeep$very$o3 === void 0 ? void 0 : _classPrivateFieldLooseBase(_fnDeep$very$o3.Foo, _x)[_x].toString(); + fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(_classPrivateFieldLooseBase(fn().Foo, _self)[_self], _x)[_x]; + fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(_classPrivateFieldLooseBase(fn().Foo, _self)[_self].self, _x)[_x]; + (_ref7 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self]) === null || _ref7 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref7.self, _x)[_x]; + (_ref8 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self].self) === null || _ref8 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref8.self, _x)[_x]; + (_self3 = (_ref18 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self]) == null ? void 0 : _ref18.self) === null || _self3 === void 0 ? void 0 : _classPrivateFieldLooseBase(_self3.self, _x)[_x]; + fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(_classPrivateFieldLooseBase(fn().Foo, _self)[_self].getSelf(), _x)[_x]; + (_ref9 = fn === null || fn === void 0 ? void 0 : (_classPrivateFieldLoo3 = _classPrivateFieldLooseBase(fn().Foo, _self)[_self]).getSelf) === null || _ref9 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref9.call(_classPrivateFieldLoo3), _x)[_x]; + (_ref10 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self]) === null || _ref10 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref10.getSelf(), _x)[_x]; + (_getSelf4 = (_ref19 = _ref11 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self]) == null ? void 0 : _ref19.getSelf) === null || _getSelf4 === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf4.call(_ref11), _x)[_x]; + (_ref12 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self].getSelf()) === null || _ref12 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref12.self, _x)[_x]; + (_call2 = (_ref20 = fn === null || fn === void 0 ? void 0 : (_classPrivateFieldLoo4 = _classPrivateFieldLooseBase(fn().Foo, _self)[_self]).getSelf) == null ? void 0 : _ref20.call(_classPrivateFieldLoo4)) === null || _call2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_call2.self, _x)[_x]; + (_getSelf5 = (_ref21 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self]) == null ? void 0 : _ref21.getSelf()) === null || _getSelf5 === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf5.self, _x)[_x]; + (_getSelf6 = (_ref22 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self]) == null ? void 0 : _ref22.getSelf == null ? void 0 : _ref22.getSelf()) === null || _getSelf6 === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf6.self, _x)[_x]; + } + +} + +var _x = _classPrivateFieldLooseKey("x"); + +var _self = _classPrivateFieldLooseKey("self"); + +Object.defineProperty(Foo, _x, { + writable: true, + value: 1 +}); +Object.defineProperty(Foo, _self, { + writable: true, + value: Foo +}); +Foo.self = Foo; +Foo.test(); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-before-property/exec.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-before-property/exec.js new file mode 100644 index 000000000000..98ac8e7a7e12 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-before-property/exec.js @@ -0,0 +1,121 @@ +class Foo { + static #x = 1; + static #self = Foo; + static self = Foo; + static getSelf() { return this } + + static test() { + const o = { Foo: Foo }; + const deep = { very: { o } }; + function fn() { + return o; + } + function fnDeep() { + return deep; + } + + expect(o?.Foo.#x).toEqual(1); + expect(o?.Foo.#x.toString).toEqual(1..toString); + expect(o?.Foo.#x.toString()).toEqual('1'); + + expect(deep?.very.o?.Foo.#x).toEqual(1); + expect(deep?.very.o?.Foo.#x.toString).toEqual(1..toString); + expect(deep?.very.o?.Foo.#x.toString()).toEqual('1'); + + expect(o?.Foo.#self.#x).toEqual(1); + expect(o?.Foo.#self.self.#x).toEqual(1); + expect(o?.Foo.#self?.self.#x).toEqual(1); + expect(o?.Foo.#self.self?.self.#x).toEqual(1); + expect(o?.Foo.#self?.self?.self.#x).toEqual(1); + + expect(o?.Foo.#self.getSelf().#x).toEqual(1); + expect(o?.Foo.#self.getSelf?.().#x).toEqual(1); + expect(o?.Foo.#self?.getSelf().#x).toEqual(1); + expect(o?.Foo.#self?.getSelf?.().#x).toEqual(1); + expect(o?.Foo.#self.getSelf()?.self.#x).toEqual(1); + expect(o?.Foo.#self.getSelf?.()?.self.#x).toEqual(1); + expect(o?.Foo.#self?.getSelf()?.self.#x).toEqual(1); + expect(o?.Foo.#self?.getSelf?.()?.self.#x).toEqual(1); + + expect(fn?.().Foo.#x).toEqual(1); + expect(fn?.().Foo.#x.toString).toEqual(1..toString); + expect(fn?.().Foo.#x.toString()).toEqual('1'); + + expect(fnDeep?.().very.o?.Foo.#x).toEqual(1); + expect(fnDeep?.().very.o?.Foo.#x.toString).toEqual(1..toString); + expect(fnDeep?.().very.o?.Foo.#x.toString()).toEqual('1'); + + expect(fn?.().Foo.#self.#x).toEqual(1); + expect(fn?.().Foo.#self.self.#x).toEqual(1); + expect(fn?.().Foo.#self?.self.#x).toEqual(1); + expect(fn?.().Foo.#self.self?.self.#x).toEqual(1); + expect(fn?.().Foo.#self?.self?.self.#x).toEqual(1); + + expect(fn?.().Foo.#self.getSelf().#x).toEqual(1); + expect(fn?.().Foo.#self.getSelf?.().#x).toEqual(1); + expect(fn?.().Foo.#self?.getSelf().#x).toEqual(1); + expect(fn?.().Foo.#self?.getSelf?.().#x).toEqual(1); + expect(fn?.().Foo.#self.getSelf()?.self.#x).toEqual(1); + expect(fn?.().Foo.#self.getSelf?.()?.self.#x).toEqual(1); + expect(fn?.().Foo.#self?.getSelf()?.self.#x).toEqual(1); + expect(fn?.().Foo.#self?.getSelf?.()?.self.#x).toEqual(1); + } + + static testNull() { + const o = null;; + const deep = { very: { o } }; + const fn = null; + function fnDeep() { + return deep; + } + + expect(o?.Foo.#x).toEqual(undefined); + expect(o?.Foo.#x.toString).toEqual(undefined); + expect(o?.Foo.#x.toString()).toEqual(undefined); + + expect(deep?.very.o?.Foo.#x).toEqual(undefined); + expect(deep?.very.o?.Foo.#x.toString).toEqual(undefined); + expect(deep?.very.o?.Foo.#x.toString()).toEqual(undefined); + + expect(o?.Foo.#self.#x).toEqual(undefined); + expect(o?.Foo.#self.self.#x).toEqual(undefined); + expect(o?.Foo.#self?.self.#x).toEqual(undefined); + expect(o?.Foo.#self.self?.self.#x).toEqual(undefined); + expect(o?.Foo.#self?.self?.self.#x).toEqual(undefined); + + expect(o?.Foo.#self.getSelf().#x).toEqual(undefined); + expect(o?.Foo.#self.getSelf?.().#x).toEqual(undefined); + expect(o?.Foo.#self?.getSelf().#x).toEqual(undefined); + expect(o?.Foo.#self?.getSelf?.().#x).toEqual(undefined); + expect(o?.Foo.#self.getSelf()?.self.#x).toEqual(undefined); + expect(o?.Foo.#self.getSelf?.()?.self.#x).toEqual(undefined); + expect(o?.Foo.#self?.getSelf()?.self.#x).toEqual(undefined); + expect(o?.Foo.#self?.getSelf?.()?.self.#x).toEqual(undefined); + + expect(fn?.().Foo.#x).toEqual(undefined); + expect(fn?.().Foo.#x.toString).toEqual(undefined); + expect(fn?.().Foo.#x.toString()).toEqual(undefined); + + expect(fnDeep?.().very.o?.Foo.#x).toEqual(undefined); + expect(fnDeep?.().very.o?.Foo.#x.toString).toEqual(undefined); + expect(fnDeep?.().very.o?.Foo.#x.toString()).toEqual(undefined); + + expect(fn?.().Foo.#self.#x).toEqual(undefined); + expect(fn?.().Foo.#self.self.#x).toEqual(undefined); + expect(fn?.().Foo.#self?.self.#x).toEqual(undefined); + expect(fn?.().Foo.#self.self?.self.#x).toEqual(undefined); + expect(fn?.().Foo.#self?.self?.self.#x).toEqual(undefined); + + expect(fn?.().Foo.#self.getSelf().#x).toEqual(undefined); + expect(fn?.().Foo.#self.getSelf?.().#x).toEqual(undefined); + expect(fn?.().Foo.#self?.getSelf().#x).toEqual(undefined); + expect(fn?.().Foo.#self?.getSelf?.().#x).toEqual(undefined); + expect(fn?.().Foo.#self.getSelf()?.self.#x).toEqual(undefined); + expect(fn?.().Foo.#self.getSelf?.()?.self.#x).toEqual(undefined); + expect(fn?.().Foo.#self?.getSelf()?.self.#x).toEqual(undefined); + expect(fn?.().Foo.#self?.getSelf?.()?.self.#x).toEqual(undefined); + } +} + +Foo.test(); +Foo.testNull(); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-before-property/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-before-property/input.js new file mode 100644 index 000000000000..cf001da081fc --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-before-property/input.js @@ -0,0 +1,66 @@ +class Foo { + static #x = 1; + static #self = Foo; + static self = Foo; + static getSelf() { return this } + + static test() { + const o = { Foo: Foo }; + const deep = { very: { o } }; + function fn() { + return o; + } + function fnDeep() { + return deep; + } + + o?.Foo.#x; + o?.Foo.#x.toString; + o?.Foo.#x.toString(); + + deep?.very.o?.Foo.#x; + deep?.very.o?.Foo.#x.toString; + deep?.very.o?.Foo.#x.toString(); + + o?.Foo.#self.#x; + o?.Foo.#self.self.#x; + o?.Foo.#self?.self.#x; + o?.Foo.#self.self?.self.#x; + o?.Foo.#self?.self?.self.#x; + + o?.Foo.#self.getSelf().#x; + o?.Foo.#self.getSelf?.().#x; + o?.Foo.#self?.getSelf().#x; + o?.Foo.#self?.getSelf?.().#x; + o?.Foo.#self.getSelf()?.self.#x; + o?.Foo.#self.getSelf?.()?.self.#x; + o?.Foo.#self?.getSelf()?.self.#x; + o?.Foo.#self?.getSelf?.()?.self.#x; + + fn?.().Foo.#x; + fn?.().Foo.#x.toString; + fn?.().Foo.#x.toString(); + + fnDeep?.().very.o?.Foo.#x; + fnDeep?.().very.o?.Foo.#x.toString; + fnDeep?.().very.o?.Foo.#x.toString(); + + fn?.().Foo.#self.#x; + fn?.().Foo.#self.self.#x; + fn?.().Foo.#self?.self.#x; + fn?.().Foo.#self.self?.self.#x; + fn?.().Foo.#self?.self?.self.#x; + + fn?.().Foo.#self.getSelf().#x; + fn?.().Foo.#self.getSelf?.().#x; + fn?.().Foo.#self?.getSelf().#x; + fn?.().Foo.#self?.getSelf?.().#x; + fn?.().Foo.#self.getSelf()?.self.#x; + fn?.().Foo.#self.getSelf?.()?.self.#x; + fn?.().Foo.#self?.getSelf()?.self.#x; + fn?.().Foo.#self?.getSelf?.()?.self.#x; + + } +} + +Foo.test(); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-before-property/options.json b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-before-property/options.json new file mode 100644 index 000000000000..2d5cfe8e8095 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-before-property/options.json @@ -0,0 +1,4 @@ +{ + "plugins": [["proposal-class-properties", { "loose": true }]], + "minNodeVersion": "14.0.0" +} diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-before-property/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-before-property/output.js new file mode 100644 index 000000000000..c79efa798a3e --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-before-property/output.js @@ -0,0 +1,87 @@ +function _classPrivateFieldLooseBase(receiver, privateKey) { if (!Object.prototype.hasOwnProperty.call(receiver, privateKey)) { throw new TypeError("attempted to use private field on non-instance"); } return receiver; } + +var id = 0; + +function _classPrivateFieldLooseKey(name) { return "__private_" + id++ + "_" + name; } + +class Foo { + static getSelf() { + return this; + } + + static test() { + var _deep$very$o, _deep$very$o2, _deep$very$o3, _ref, _ref2, _self2, _classPrivateFieldLoo, _ref3, _ref4, _getSelf, _ref5, _ref6, _classPrivateFieldLoo2, _call, _getSelf2, _getSelf3, _fnDeep$very$o, _fnDeep$very$o2, _fnDeep$very$o3, _ref7, _ref8, _self3, _classPrivateFieldLoo3, _ref9, _ref10, _getSelf4, _ref11, _ref12, _classPrivateFieldLoo4, _call2, _getSelf5, _getSelf6; + + const o = { + Foo: Foo + }; + const deep = { + very: { + o + } + }; + + function fn() { + return o; + } + + function fnDeep() { + return deep; + } + + o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _x)[_x]; + o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _x)[_x].toString; + o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _x)[_x].toString(); + (_deep$very$o = deep?.very.o) === null || _deep$very$o === void 0 ? void 0 : _classPrivateFieldLooseBase(_deep$very$o.Foo, _x)[_x]; + (_deep$very$o2 = deep?.very.o) === null || _deep$very$o2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_deep$very$o2.Foo, _x)[_x].toString; + (_deep$very$o3 = deep?.very.o) === null || _deep$very$o3 === void 0 ? void 0 : _classPrivateFieldLooseBase(_deep$very$o3.Foo, _x)[_x].toString(); + o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(_classPrivateFieldLooseBase(o.Foo, _self)[_self], _x)[_x]; + o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(_classPrivateFieldLooseBase(o.Foo, _self)[_self].self, _x)[_x]; + (_ref = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self]) === null || _ref === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref.self, _x)[_x]; + (_ref2 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self].self) === null || _ref2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref2.self, _x)[_x]; + (_self2 = (o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self])?.self) === null || _self2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_self2.self, _x)[_x]; + o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(_classPrivateFieldLooseBase(o.Foo, _self)[_self].getSelf(), _x)[_x]; + (_ref3 = o === null || o === void 0 ? void 0 : (_classPrivateFieldLoo = _classPrivateFieldLooseBase(o.Foo, _self)[_self]).getSelf) === null || _ref3 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref3.call(_classPrivateFieldLoo), _x)[_x]; + (_ref4 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self]) === null || _ref4 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref4.getSelf(), _x)[_x]; + (_getSelf = (_ref5 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self])?.getSelf) === null || _getSelf === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf.call(_ref5), _x)[_x]; + (_ref6 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self].getSelf()) === null || _ref6 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref6.self, _x)[_x]; + (_call = (o === null || o === void 0 ? void 0 : (_classPrivateFieldLoo2 = _classPrivateFieldLooseBase(o.Foo, _self)[_self]).getSelf)?.call(_classPrivateFieldLoo2)) === null || _call === void 0 ? void 0 : _classPrivateFieldLooseBase(_call.self, _x)[_x]; + (_getSelf2 = (o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self])?.getSelf()) === null || _getSelf2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf2.self, _x)[_x]; + (_getSelf3 = (o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self])?.getSelf?.()) === null || _getSelf3 === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf3.self, _x)[_x]; + fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _x)[_x]; + fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _x)[_x].toString; + fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _x)[_x].toString(); + (_fnDeep$very$o = fnDeep?.().very.o) === null || _fnDeep$very$o === void 0 ? void 0 : _classPrivateFieldLooseBase(_fnDeep$very$o.Foo, _x)[_x]; + (_fnDeep$very$o2 = fnDeep?.().very.o) === null || _fnDeep$very$o2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_fnDeep$very$o2.Foo, _x)[_x].toString; + (_fnDeep$very$o3 = fnDeep?.().very.o) === null || _fnDeep$very$o3 === void 0 ? void 0 : _classPrivateFieldLooseBase(_fnDeep$very$o3.Foo, _x)[_x].toString(); + fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(_classPrivateFieldLooseBase(fn().Foo, _self)[_self], _x)[_x]; + fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(_classPrivateFieldLooseBase(fn().Foo, _self)[_self].self, _x)[_x]; + (_ref7 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self]) === null || _ref7 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref7.self, _x)[_x]; + (_ref8 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self].self) === null || _ref8 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref8.self, _x)[_x]; + (_self3 = (fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self])?.self) === null || _self3 === void 0 ? void 0 : _classPrivateFieldLooseBase(_self3.self, _x)[_x]; + fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(_classPrivateFieldLooseBase(fn().Foo, _self)[_self].getSelf(), _x)[_x]; + (_ref9 = fn === null || fn === void 0 ? void 0 : (_classPrivateFieldLoo3 = _classPrivateFieldLooseBase(fn().Foo, _self)[_self]).getSelf) === null || _ref9 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref9.call(_classPrivateFieldLoo3), _x)[_x]; + (_ref10 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self]) === null || _ref10 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref10.getSelf(), _x)[_x]; + (_getSelf4 = (_ref11 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self])?.getSelf) === null || _getSelf4 === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf4.call(_ref11), _x)[_x]; + (_ref12 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self].getSelf()) === null || _ref12 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref12.self, _x)[_x]; + (_call2 = (fn === null || fn === void 0 ? void 0 : (_classPrivateFieldLoo4 = _classPrivateFieldLooseBase(fn().Foo, _self)[_self]).getSelf)?.call(_classPrivateFieldLoo4)) === null || _call2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_call2.self, _x)[_x]; + (_getSelf5 = (fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self])?.getSelf()) === null || _getSelf5 === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf5.self, _x)[_x]; + (_getSelf6 = (fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self])?.getSelf?.()) === null || _getSelf6 === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf6.self, _x)[_x]; + } + +} + +var _x = _classPrivateFieldLooseKey("x"); + +var _self = _classPrivateFieldLooseKey("self"); + +Object.defineProperty(Foo, _x, { + writable: true, + value: 1 +}); +Object.defineProperty(Foo, _self, { + writable: true, + value: Foo +}); +Foo.self = Foo; +Foo.test(); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-member-optional-call-with-transform/exec.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-member-optional-call-with-transform/exec.js new file mode 100644 index 000000000000..6e82fc8d6543 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-member-optional-call-with-transform/exec.js @@ -0,0 +1,126 @@ +class Foo { + static #x = 1; + static #m = function() { return this.#x; }; + static #self = Foo; + static self = Foo; + static getSelf() { return this } + + static test() { + const o = { Foo: Foo }; + const deep = { very: { o } }; + function fn() { + return o; + } + function fnDeep() { + return deep; + } + + expect(Foo.#m?.()).toEqual(1); + expect(Foo.#m?.().toString).toEqual(1..toString); + expect(Foo.#m?.().toString()).toEqual('1'); + + expect(o?.Foo.#m?.()).toEqual(1); + expect(o?.Foo.#m?.().toString).toEqual(1..toString); + expect(o?.Foo.#m?.().toString()).toEqual('1'); + + expect(deep?.very.o?.Foo.#m?.()).toEqual(1); + expect(deep?.very.o?.Foo.#m?.().toString).toEqual(1..toString); + expect(deep?.very.o?.Foo.#m?.().toString()).toEqual('1'); + + expect(o?.Foo.#self.#m?.()).toEqual(1); + expect(o?.Foo.#self.self.#m?.()).toEqual(1); + expect(o?.Foo.#self?.self.#m?.()).toEqual(1); + expect(o?.Foo.#self.self?.self.#m?.()).toEqual(1); + expect(o?.Foo.#self?.self?.self.#m?.()).toEqual(1); + + expect(o?.Foo.#self.getSelf().#m?.()).toEqual(1); + expect(o?.Foo.#self.getSelf?.().#m?.()).toEqual(1); + expect(o?.Foo.#self?.getSelf().#m?.()).toEqual(1); + expect(o?.Foo.#self?.getSelf?.().#m?.()).toEqual(1); + expect(o?.Foo.#self.getSelf()?.self.#m?.()).toEqual(1); + expect(o?.Foo.#self.getSelf?.()?.self.#m?.()).toEqual(1); + expect(o?.Foo.#self?.getSelf()?.self.#m?.()).toEqual(1); + expect(o?.Foo.#self?.getSelf?.()?.self.#m?.()).toEqual(1); + + expect(fn?.().Foo.#m?.()).toEqual(1); + expect(fn?.().Foo.#m?.().toString).toEqual(1..toString); + expect(fn?.().Foo.#m?.().toString()).toEqual('1'); + + expect(fnDeep?.().very.o?.Foo.#m?.()).toEqual(1); + expect(fnDeep?.().very.o?.Foo.#m?.().toString).toEqual(1..toString); + expect(fnDeep?.().very.o?.Foo.#m?.().toString()).toEqual('1'); + + expect(fn?.().Foo.#self.#m?.()).toEqual(1); + expect(fn?.().Foo.#self.self.#m?.()).toEqual(1); + expect(fn?.().Foo.#self?.self.#m?.()).toEqual(1); + expect(fn?.().Foo.#self.self?.self.#m?.()).toEqual(1); + expect(fn?.().Foo.#self?.self?.self.#m?.()).toEqual(1); + + expect(fn?.().Foo.#self.getSelf().#m?.()).toEqual(1); + expect(fn?.().Foo.#self.getSelf?.().#m?.()).toEqual(1); + expect(fn?.().Foo.#self?.getSelf().#m?.()).toEqual(1); + expect(fn?.().Foo.#self?.getSelf?.().#m?.()).toEqual(1); + expect(fn?.().Foo.#self.getSelf()?.self.#m?.()).toEqual(1); + expect(fn?.().Foo.#self.getSelf?.()?.self.#m?.()).toEqual(1); + expect(fn?.().Foo.#self?.getSelf()?.self.#m?.()).toEqual(1); + expect(fn?.().Foo.#self?.getSelf?.()?.self.#m?.()).toEqual(1); + } + + static testNull() { + const o = null;; + const deep = { very: { o } }; + const fn = null; + function fnDeep() { + return deep; + } + + expect(o?.Foo.#m?.()).toEqual(undefined); + expect(o?.Foo.#m?.().toString).toEqual(undefined); + expect(o?.Foo.#m?.().toString()).toEqual(undefined); + + expect(deep?.very.o?.Foo.#m?.()).toEqual(undefined); + expect(deep?.very.o?.Foo.#m?.().toString).toEqual(undefined); + expect(deep?.very.o?.Foo.#m?.().toString()).toEqual(undefined); + + expect(o?.Foo.#self.#m?.()).toEqual(undefined); + expect(o?.Foo.#self.self.#m?.()).toEqual(undefined); + expect(o?.Foo.#self?.self.#m?.()).toEqual(undefined); + expect(o?.Foo.#self.self?.self.#m?.()).toEqual(undefined); + expect(o?.Foo.#self?.self?.self.#m?.()).toEqual(undefined); + + expect(o?.Foo.#self.getSelf().#m?.()).toEqual(undefined); + expect(o?.Foo.#self.getSelf?.().#m?.()).toEqual(undefined); + expect(o?.Foo.#self?.getSelf().#m?.()).toEqual(undefined); + expect(o?.Foo.#self?.getSelf?.().#m?.()).toEqual(undefined); + expect(o?.Foo.#self.getSelf()?.self.#m?.()).toEqual(undefined); + expect(o?.Foo.#self.getSelf?.()?.self.#m?.()).toEqual(undefined); + expect(o?.Foo.#self?.getSelf()?.self.#m?.()).toEqual(undefined); + expect(o?.Foo.#self?.getSelf?.()?.self.#m?.()).toEqual(undefined); + + expect(fn?.().Foo.#m?.()).toEqual(undefined); + expect(fn?.().Foo.#m?.().toString).toEqual(undefined); + expect(fn?.().Foo.#m?.().toString()).toEqual(undefined); + + expect(fnDeep?.().very.o?.Foo.#m?.()).toEqual(undefined); + expect(fnDeep?.().very.o?.Foo.#m?.().toString).toEqual(undefined); + expect(fnDeep?.().very.o?.Foo.#m?.().toString()).toEqual(undefined); + + expect(fn?.().Foo.#self.#m?.()).toEqual(undefined); + expect(fn?.().Foo.#self.self.#m?.()).toEqual(undefined); + expect(fn?.().Foo.#self?.self.#m?.()).toEqual(undefined); + expect(fn?.().Foo.#self.self?.self.#m?.()).toEqual(undefined); + expect(fn?.().Foo.#self?.self?.self.#m?.()).toEqual(undefined); + + expect(fn?.().Foo.#self.getSelf().#m?.()).toEqual(undefined); + expect(fn?.().Foo.#self.getSelf?.().#m?.()).toEqual(undefined); + expect(fn?.().Foo.#self?.getSelf().#m?.()).toEqual(undefined); + expect(fn?.().Foo.#self?.getSelf?.().#m?.()).toEqual(undefined); + expect(fn?.().Foo.#self.getSelf()?.self.#m?.()).toEqual(undefined); + expect(fn?.().Foo.#self.getSelf?.()?.self.#m?.()).toEqual(undefined); + expect(fn?.().Foo.#self?.getSelf()?.self.#m?.()).toEqual(undefined); + expect(fn?.().Foo.#self?.getSelf?.()?.self.#m?.()).toEqual(undefined); + } +} + +Foo.test(); +Foo.testNull(); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-member-optional-call-with-transform/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-member-optional-call-with-transform/input.js new file mode 100644 index 000000000000..11dd4a57060d --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-member-optional-call-with-transform/input.js @@ -0,0 +1,71 @@ +class Foo { + static #x = 1; + static #m = function() { return this.#x; }; + static #self = Foo; + static self = Foo; + static getSelf() { return this } + + static test() { + const o = { Foo: Foo }; + const deep = { very: { o } }; + function fn() { + return o; + } + function fnDeep() { + return deep; + } + + Foo.#m?.(); + Foo.#m?.().toString; + Foo.#m?.().toString(); + + o?.Foo.#m?.(); + o?.Foo.#m?.().toString; + o?.Foo.#m?.().toString(); + + deep?.very.o?.Foo.#m?.(); + deep?.very.o?.Foo.#m?.().toString; + deep?.very.o?.Foo.#m?.().toString(); + + o?.Foo.#self.#m?.(); + o?.Foo.#self.self.#m?.(); + o?.Foo.#self?.self.#m?.(); + o?.Foo.#self.self?.self.#m?.(); + o?.Foo.#self?.self?.self.#m?.(); + + o?.Foo.#self.getSelf().#m?.(); + o?.Foo.#self.getSelf?.().#m?.(); + o?.Foo.#self?.getSelf().#m?.(); + o?.Foo.#self?.getSelf?.().#m?.(); + o?.Foo.#self.getSelf()?.self.#m?.(); + o?.Foo.#self.getSelf?.()?.self.#m?.(); + o?.Foo.#self?.getSelf()?.self.#m?.(); + o?.Foo.#self?.getSelf?.()?.self.#m?.(); + + fn?.().Foo.#m?.(); + fn?.().Foo.#m?.().toString; + fn?.().Foo.#m?.().toString(); + + fnDeep?.().very.o?.Foo.#m?.(); + fnDeep?.().very.o?.Foo.#m?.().toString; + fnDeep?.().very.o?.Foo.#m?.().toString(); + + fn?.().Foo.#self.#m?.(); + fn?.().Foo.#self.self.#m?.(); + fn?.().Foo.#self?.self.#m?.(); + fn?.().Foo.#self.self?.self.#m?.(); + fn?.().Foo.#self?.self?.self.#m?.(); + + fn?.().Foo.#self.getSelf().#m?.(); + fn?.().Foo.#self.getSelf?.().#m?.(); + fn?.().Foo.#self?.getSelf().#m?.(); + fn?.().Foo.#self?.getSelf?.().#m?.(); + fn?.().Foo.#self.getSelf()?.self.#m?.(); + fn?.().Foo.#self.getSelf?.()?.self.#m?.(); + fn?.().Foo.#self?.getSelf()?.self.#m?.(); + fn?.().Foo.#self?.getSelf?.()?.self.#m?.(); + } + +} + +Foo.test(); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-member-optional-call-with-transform/options.json b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-member-optional-call-with-transform/options.json new file mode 100644 index 000000000000..124133b5af2b --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-member-optional-call-with-transform/options.json @@ -0,0 +1,6 @@ +{ + "plugins": [ + ["proposal-optional-chaining", { "loose": true }], + ["proposal-class-properties", { "loose": true }] + ] +} diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-member-optional-call-with-transform/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-member-optional-call-with-transform/output.js new file mode 100644 index 000000000000..c51884d907f3 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-member-optional-call-with-transform/output.js @@ -0,0 +1,98 @@ +function _classPrivateFieldLooseBase(receiver, privateKey) { if (!Object.prototype.hasOwnProperty.call(receiver, privateKey)) { throw new TypeError("attempted to use private field on non-instance"); } return receiver; } + +var id = 0; + +function _classPrivateFieldLooseKey(name) { return "__private_" + id++ + "_" + name; } + +class Foo { + static getSelf() { + return this; + } + + static test() { + var _deep$very$o, _deep$very$o2, _deep$very$o3, _classPrivateFieldLoo, _classPrivateFieldLoo2, _ref, _ref2, _self2, _classPrivateFieldLoo3, _classPrivateFieldLoo4, _ref3, _ref4, _getSelf, _ref5, _ref6, _classPrivateFieldLoo5, _call, _getSelf2, _getSelf3, _fnDeep$very$o, _fnDeep$very$o2, _fnDeep$very$o3, _classPrivateFieldLoo6, _classPrivateFieldLoo7, _ref7, _ref8, _self3, _classPrivateFieldLoo8, _classPrivateFieldLoo9, _ref9, _ref10, _getSelf4, _ref11, _ref12, _classPrivateFieldLoo10, _call2, _getSelf5, _getSelf6, _classPrivateFieldLoo11, _classPrivateFieldLoo12, _classPrivateFieldLoo13, _classPrivateFieldLoo14, _classPrivateFieldLoo15, _classPrivateFieldLoo16, _classPrivateFieldLoo17, _classPrivateFieldLoo18, _classPrivateFieldLoo19, _classPrivateFieldLoo20, _classPrivateFieldLoo21, _classPrivateFieldLoo22, _classPrivateFieldLoo23, _classPrivateFieldLoo24, _classPrivateFieldLoo25, _classPrivateFieldLoo26, _classPrivateFieldLoo27, _classPrivateFieldLoo28, _ref13, _ref14, _classPrivateFieldLoo29, _classPrivateFieldLoo30, _classPrivateFieldLoo31, _classPrivateFieldLoo32, _ref15, _classPrivateFieldLoo33, _classPrivateFieldLoo34, _ref16, _classPrivateFieldLoo35, _classPrivateFieldLoo36, _classPrivateFieldLoo37, _classPrivateFieldLoo38, _ref17, _classPrivateFieldLoo39, _classPrivateFieldLoo40, _classPrivateFieldLoo41, _classPrivateFieldLoo42, _ref18, _classPrivateFieldLoo43, _classPrivateFieldLoo44, _ref19, _classPrivateFieldLoo45, _classPrivateFieldLoo46, _ref20, _classPrivateFieldLoo47, _classPrivateFieldLoo48, _classPrivateFieldLoo49, _classPrivateFieldLoo50, _classPrivateFieldLoo51, _classPrivateFieldLoo52, _classPrivateFieldLoo53, _classPrivateFieldLoo54, _classPrivateFieldLoo55, _classPrivateFieldLoo56, _classPrivateFieldLoo57, _classPrivateFieldLoo58, _classPrivateFieldLoo59, _classPrivateFieldLoo60, _ref21, _ref22, _classPrivateFieldLoo61, _classPrivateFieldLoo62, _classPrivateFieldLoo63, _classPrivateFieldLoo64, _ref23, _classPrivateFieldLoo65, _classPrivateFieldLoo66, _ref24, _classPrivateFieldLoo67, _classPrivateFieldLoo68, _classPrivateFieldLoo69, _classPrivateFieldLoo70, _ref25, _classPrivateFieldLoo71, _classPrivateFieldLoo72, _classPrivateFieldLoo73, _classPrivateFieldLoo74, _ref26, _classPrivateFieldLoo75, _classPrivateFieldLoo76, _ref27, _classPrivateFieldLoo77, _classPrivateFieldLoo78, _ref28, _classPrivateFieldLoo79, _classPrivateFieldLoo80; + + const o = { + Foo: Foo + }; + const deep = { + very: { + o + } + }; + + function fn() { + return o; + } + + function fnDeep() { + return deep; + } + + (_classPrivateFieldLoo11 = (_classPrivateFieldLoo12 = _classPrivateFieldLooseBase(Foo, _m))[_m]) == null ? void 0 : _classPrivateFieldLoo11.call(_classPrivateFieldLoo12); + (_classPrivateFieldLoo13 = (_classPrivateFieldLoo14 = _classPrivateFieldLooseBase(Foo, _m))[_m]) == null ? void 0 : _classPrivateFieldLoo13.call(_classPrivateFieldLoo14).toString; + (_classPrivateFieldLoo15 = (_classPrivateFieldLoo16 = _classPrivateFieldLooseBase(Foo, _m))[_m]) == null ? void 0 : _classPrivateFieldLoo15.call(_classPrivateFieldLoo16).toString(); + o === null || o === void 0 ? void 0 : (_classPrivateFieldLoo17 = (_classPrivateFieldLoo18 = _classPrivateFieldLooseBase(o.Foo, _m))[_m]) == null ? void 0 : _classPrivateFieldLoo17.call(_classPrivateFieldLoo18); + o === null || o === void 0 ? void 0 : (_classPrivateFieldLoo19 = (_classPrivateFieldLoo20 = _classPrivateFieldLooseBase(o.Foo, _m))[_m]) == null ? void 0 : _classPrivateFieldLoo19.call(_classPrivateFieldLoo20).toString; + o === null || o === void 0 ? void 0 : (_classPrivateFieldLoo21 = (_classPrivateFieldLoo22 = _classPrivateFieldLooseBase(o.Foo, _m))[_m]) == null ? void 0 : _classPrivateFieldLoo21.call(_classPrivateFieldLoo22).toString(); + (_deep$very$o = deep == null ? void 0 : deep.very.o) === null || _deep$very$o === void 0 ? void 0 : (_classPrivateFieldLoo23 = (_classPrivateFieldLoo24 = _classPrivateFieldLooseBase(_deep$very$o.Foo, _m))[_m]) == null ? void 0 : _classPrivateFieldLoo23.call(_classPrivateFieldLoo24); + (_deep$very$o2 = deep == null ? void 0 : deep.very.o) === null || _deep$very$o2 === void 0 ? void 0 : (_classPrivateFieldLoo25 = (_classPrivateFieldLoo26 = _classPrivateFieldLooseBase(_deep$very$o2.Foo, _m))[_m]) == null ? void 0 : _classPrivateFieldLoo25.call(_classPrivateFieldLoo26).toString; + (_deep$very$o3 = deep == null ? void 0 : deep.very.o) === null || _deep$very$o3 === void 0 ? void 0 : (_classPrivateFieldLoo27 = (_classPrivateFieldLoo28 = _classPrivateFieldLooseBase(_deep$very$o3.Foo, _m))[_m]) == null ? void 0 : _classPrivateFieldLoo27.call(_classPrivateFieldLoo28).toString(); + (_ref13 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(_classPrivateFieldLoo = _classPrivateFieldLooseBase(o.Foo, _self)[_self], _m)[_m]) == null ? void 0 : _ref13.call(_classPrivateFieldLoo); + (_ref14 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(_classPrivateFieldLoo2 = _classPrivateFieldLooseBase(o.Foo, _self)[_self].self, _m)[_m]) == null ? void 0 : _ref14.call(_classPrivateFieldLoo2); + (_ref = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self]) === null || _ref === void 0 ? void 0 : (_classPrivateFieldLoo29 = (_classPrivateFieldLoo30 = _classPrivateFieldLooseBase(_ref.self, _m))[_m]) == null ? void 0 : _classPrivateFieldLoo29.call(_classPrivateFieldLoo30); + (_ref2 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self].self) === null || _ref2 === void 0 ? void 0 : (_classPrivateFieldLoo31 = (_classPrivateFieldLoo32 = _classPrivateFieldLooseBase(_ref2.self, _m))[_m]) == null ? void 0 : _classPrivateFieldLoo31.call(_classPrivateFieldLoo32); + (_self2 = (_ref15 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self]) == null ? void 0 : _ref15.self) === null || _self2 === void 0 ? void 0 : (_classPrivateFieldLoo33 = (_classPrivateFieldLoo34 = _classPrivateFieldLooseBase(_self2.self, _m))[_m]) == null ? void 0 : _classPrivateFieldLoo33.call(_classPrivateFieldLoo34); + (_ref16 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(_classPrivateFieldLoo3 = _classPrivateFieldLooseBase(o.Foo, _self)[_self].getSelf(), _m)[_m]) == null ? void 0 : _ref16.call(_classPrivateFieldLoo3); + (_ref3 = o === null || o === void 0 ? void 0 : (_classPrivateFieldLoo4 = _classPrivateFieldLooseBase(o.Foo, _self)[_self]).getSelf) === null || _ref3 === void 0 ? void 0 : (_classPrivateFieldLoo35 = (_classPrivateFieldLoo36 = _classPrivateFieldLooseBase(_ref3.call(_classPrivateFieldLoo4), _m))[_m]) == null ? void 0 : _classPrivateFieldLoo35.call(_classPrivateFieldLoo36); + (_ref4 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self]) === null || _ref4 === void 0 ? void 0 : (_classPrivateFieldLoo37 = (_classPrivateFieldLoo38 = _classPrivateFieldLooseBase(_ref4.getSelf(), _m))[_m]) == null ? void 0 : _classPrivateFieldLoo37.call(_classPrivateFieldLoo38); + (_getSelf = (_ref17 = _ref5 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self]) == null ? void 0 : _ref17.getSelf) === null || _getSelf === void 0 ? void 0 : (_classPrivateFieldLoo39 = (_classPrivateFieldLoo40 = _classPrivateFieldLooseBase(_getSelf.call(_ref5), _m))[_m]) == null ? void 0 : _classPrivateFieldLoo39.call(_classPrivateFieldLoo40); + (_ref6 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self].getSelf()) === null || _ref6 === void 0 ? void 0 : (_classPrivateFieldLoo41 = (_classPrivateFieldLoo42 = _classPrivateFieldLooseBase(_ref6.self, _m))[_m]) == null ? void 0 : _classPrivateFieldLoo41.call(_classPrivateFieldLoo42); + (_call = (_ref18 = o === null || o === void 0 ? void 0 : (_classPrivateFieldLoo5 = _classPrivateFieldLooseBase(o.Foo, _self)[_self]).getSelf) == null ? void 0 : _ref18.call(_classPrivateFieldLoo5)) === null || _call === void 0 ? void 0 : (_classPrivateFieldLoo43 = (_classPrivateFieldLoo44 = _classPrivateFieldLooseBase(_call.self, _m))[_m]) == null ? void 0 : _classPrivateFieldLoo43.call(_classPrivateFieldLoo44); + (_getSelf2 = (_ref19 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self]) == null ? void 0 : _ref19.getSelf()) === null || _getSelf2 === void 0 ? void 0 : (_classPrivateFieldLoo45 = (_classPrivateFieldLoo46 = _classPrivateFieldLooseBase(_getSelf2.self, _m))[_m]) == null ? void 0 : _classPrivateFieldLoo45.call(_classPrivateFieldLoo46); + (_getSelf3 = (_ref20 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self]) == null ? void 0 : _ref20.getSelf == null ? void 0 : _ref20.getSelf()) === null || _getSelf3 === void 0 ? void 0 : (_classPrivateFieldLoo47 = (_classPrivateFieldLoo48 = _classPrivateFieldLooseBase(_getSelf3.self, _m))[_m]) == null ? void 0 : _classPrivateFieldLoo47.call(_classPrivateFieldLoo48); + fn === null || fn === void 0 ? void 0 : (_classPrivateFieldLoo49 = (_classPrivateFieldLoo50 = _classPrivateFieldLooseBase(fn().Foo, _m))[_m]) == null ? void 0 : _classPrivateFieldLoo49.call(_classPrivateFieldLoo50); + fn === null || fn === void 0 ? void 0 : (_classPrivateFieldLoo51 = (_classPrivateFieldLoo52 = _classPrivateFieldLooseBase(fn().Foo, _m))[_m]) == null ? void 0 : _classPrivateFieldLoo51.call(_classPrivateFieldLoo52).toString; + fn === null || fn === void 0 ? void 0 : (_classPrivateFieldLoo53 = (_classPrivateFieldLoo54 = _classPrivateFieldLooseBase(fn().Foo, _m))[_m]) == null ? void 0 : _classPrivateFieldLoo53.call(_classPrivateFieldLoo54).toString(); + (_fnDeep$very$o = fnDeep == null ? void 0 : fnDeep().very.o) === null || _fnDeep$very$o === void 0 ? void 0 : (_classPrivateFieldLoo55 = (_classPrivateFieldLoo56 = _classPrivateFieldLooseBase(_fnDeep$very$o.Foo, _m))[_m]) == null ? void 0 : _classPrivateFieldLoo55.call(_classPrivateFieldLoo56); + (_fnDeep$very$o2 = fnDeep == null ? void 0 : fnDeep().very.o) === null || _fnDeep$very$o2 === void 0 ? void 0 : (_classPrivateFieldLoo57 = (_classPrivateFieldLoo58 = _classPrivateFieldLooseBase(_fnDeep$very$o2.Foo, _m))[_m]) == null ? void 0 : _classPrivateFieldLoo57.call(_classPrivateFieldLoo58).toString; + (_fnDeep$very$o3 = fnDeep == null ? void 0 : fnDeep().very.o) === null || _fnDeep$very$o3 === void 0 ? void 0 : (_classPrivateFieldLoo59 = (_classPrivateFieldLoo60 = _classPrivateFieldLooseBase(_fnDeep$very$o3.Foo, _m))[_m]) == null ? void 0 : _classPrivateFieldLoo59.call(_classPrivateFieldLoo60).toString(); + (_ref21 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(_classPrivateFieldLoo6 = _classPrivateFieldLooseBase(fn().Foo, _self)[_self], _m)[_m]) == null ? void 0 : _ref21.call(_classPrivateFieldLoo6); + (_ref22 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(_classPrivateFieldLoo7 = _classPrivateFieldLooseBase(fn().Foo, _self)[_self].self, _m)[_m]) == null ? void 0 : _ref22.call(_classPrivateFieldLoo7); + (_ref7 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self]) === null || _ref7 === void 0 ? void 0 : (_classPrivateFieldLoo61 = (_classPrivateFieldLoo62 = _classPrivateFieldLooseBase(_ref7.self, _m))[_m]) == null ? void 0 : _classPrivateFieldLoo61.call(_classPrivateFieldLoo62); + (_ref8 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self].self) === null || _ref8 === void 0 ? void 0 : (_classPrivateFieldLoo63 = (_classPrivateFieldLoo64 = _classPrivateFieldLooseBase(_ref8.self, _m))[_m]) == null ? void 0 : _classPrivateFieldLoo63.call(_classPrivateFieldLoo64); + (_self3 = (_ref23 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self]) == null ? void 0 : _ref23.self) === null || _self3 === void 0 ? void 0 : (_classPrivateFieldLoo65 = (_classPrivateFieldLoo66 = _classPrivateFieldLooseBase(_self3.self, _m))[_m]) == null ? void 0 : _classPrivateFieldLoo65.call(_classPrivateFieldLoo66); + (_ref24 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(_classPrivateFieldLoo8 = _classPrivateFieldLooseBase(fn().Foo, _self)[_self].getSelf(), _m)[_m]) == null ? void 0 : _ref24.call(_classPrivateFieldLoo8); + (_ref9 = fn === null || fn === void 0 ? void 0 : (_classPrivateFieldLoo9 = _classPrivateFieldLooseBase(fn().Foo, _self)[_self]).getSelf) === null || _ref9 === void 0 ? void 0 : (_classPrivateFieldLoo67 = (_classPrivateFieldLoo68 = _classPrivateFieldLooseBase(_ref9.call(_classPrivateFieldLoo9), _m))[_m]) == null ? void 0 : _classPrivateFieldLoo67.call(_classPrivateFieldLoo68); + (_ref10 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self]) === null || _ref10 === void 0 ? void 0 : (_classPrivateFieldLoo69 = (_classPrivateFieldLoo70 = _classPrivateFieldLooseBase(_ref10.getSelf(), _m))[_m]) == null ? void 0 : _classPrivateFieldLoo69.call(_classPrivateFieldLoo70); + (_getSelf4 = (_ref25 = _ref11 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self]) == null ? void 0 : _ref25.getSelf) === null || _getSelf4 === void 0 ? void 0 : (_classPrivateFieldLoo71 = (_classPrivateFieldLoo72 = _classPrivateFieldLooseBase(_getSelf4.call(_ref11), _m))[_m]) == null ? void 0 : _classPrivateFieldLoo71.call(_classPrivateFieldLoo72); + (_ref12 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self].getSelf()) === null || _ref12 === void 0 ? void 0 : (_classPrivateFieldLoo73 = (_classPrivateFieldLoo74 = _classPrivateFieldLooseBase(_ref12.self, _m))[_m]) == null ? void 0 : _classPrivateFieldLoo73.call(_classPrivateFieldLoo74); + (_call2 = (_ref26 = fn === null || fn === void 0 ? void 0 : (_classPrivateFieldLoo10 = _classPrivateFieldLooseBase(fn().Foo, _self)[_self]).getSelf) == null ? void 0 : _ref26.call(_classPrivateFieldLoo10)) === null || _call2 === void 0 ? void 0 : (_classPrivateFieldLoo75 = (_classPrivateFieldLoo76 = _classPrivateFieldLooseBase(_call2.self, _m))[_m]) == null ? void 0 : _classPrivateFieldLoo75.call(_classPrivateFieldLoo76); + (_getSelf5 = (_ref27 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self]) == null ? void 0 : _ref27.getSelf()) === null || _getSelf5 === void 0 ? void 0 : (_classPrivateFieldLoo77 = (_classPrivateFieldLoo78 = _classPrivateFieldLooseBase(_getSelf5.self, _m))[_m]) == null ? void 0 : _classPrivateFieldLoo77.call(_classPrivateFieldLoo78); + (_getSelf6 = (_ref28 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self]) == null ? void 0 : _ref28.getSelf == null ? void 0 : _ref28.getSelf()) === null || _getSelf6 === void 0 ? void 0 : (_classPrivateFieldLoo79 = (_classPrivateFieldLoo80 = _classPrivateFieldLooseBase(_getSelf6.self, _m))[_m]) == null ? void 0 : _classPrivateFieldLoo79.call(_classPrivateFieldLoo80); + } + +} + +var _x = _classPrivateFieldLooseKey("x"); + +var _m = _classPrivateFieldLooseKey("m"); + +var _self = _classPrivateFieldLooseKey("self"); + +Object.defineProperty(Foo, _x, { + writable: true, + value: 1 +}); +Object.defineProperty(Foo, _m, { + writable: true, + value: function () { + return _classPrivateFieldLooseBase(this, _x)[_x]; + } +}); +Object.defineProperty(Foo, _self, { + writable: true, + value: Foo +}); +Foo.self = Foo; +Foo.test(); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-member-optional-call/exec.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-member-optional-call/exec.js new file mode 100644 index 000000000000..6e82fc8d6543 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-member-optional-call/exec.js @@ -0,0 +1,126 @@ +class Foo { + static #x = 1; + static #m = function() { return this.#x; }; + static #self = Foo; + static self = Foo; + static getSelf() { return this } + + static test() { + const o = { Foo: Foo }; + const deep = { very: { o } }; + function fn() { + return o; + } + function fnDeep() { + return deep; + } + + expect(Foo.#m?.()).toEqual(1); + expect(Foo.#m?.().toString).toEqual(1..toString); + expect(Foo.#m?.().toString()).toEqual('1'); + + expect(o?.Foo.#m?.()).toEqual(1); + expect(o?.Foo.#m?.().toString).toEqual(1..toString); + expect(o?.Foo.#m?.().toString()).toEqual('1'); + + expect(deep?.very.o?.Foo.#m?.()).toEqual(1); + expect(deep?.very.o?.Foo.#m?.().toString).toEqual(1..toString); + expect(deep?.very.o?.Foo.#m?.().toString()).toEqual('1'); + + expect(o?.Foo.#self.#m?.()).toEqual(1); + expect(o?.Foo.#self.self.#m?.()).toEqual(1); + expect(o?.Foo.#self?.self.#m?.()).toEqual(1); + expect(o?.Foo.#self.self?.self.#m?.()).toEqual(1); + expect(o?.Foo.#self?.self?.self.#m?.()).toEqual(1); + + expect(o?.Foo.#self.getSelf().#m?.()).toEqual(1); + expect(o?.Foo.#self.getSelf?.().#m?.()).toEqual(1); + expect(o?.Foo.#self?.getSelf().#m?.()).toEqual(1); + expect(o?.Foo.#self?.getSelf?.().#m?.()).toEqual(1); + expect(o?.Foo.#self.getSelf()?.self.#m?.()).toEqual(1); + expect(o?.Foo.#self.getSelf?.()?.self.#m?.()).toEqual(1); + expect(o?.Foo.#self?.getSelf()?.self.#m?.()).toEqual(1); + expect(o?.Foo.#self?.getSelf?.()?.self.#m?.()).toEqual(1); + + expect(fn?.().Foo.#m?.()).toEqual(1); + expect(fn?.().Foo.#m?.().toString).toEqual(1..toString); + expect(fn?.().Foo.#m?.().toString()).toEqual('1'); + + expect(fnDeep?.().very.o?.Foo.#m?.()).toEqual(1); + expect(fnDeep?.().very.o?.Foo.#m?.().toString).toEqual(1..toString); + expect(fnDeep?.().very.o?.Foo.#m?.().toString()).toEqual('1'); + + expect(fn?.().Foo.#self.#m?.()).toEqual(1); + expect(fn?.().Foo.#self.self.#m?.()).toEqual(1); + expect(fn?.().Foo.#self?.self.#m?.()).toEqual(1); + expect(fn?.().Foo.#self.self?.self.#m?.()).toEqual(1); + expect(fn?.().Foo.#self?.self?.self.#m?.()).toEqual(1); + + expect(fn?.().Foo.#self.getSelf().#m?.()).toEqual(1); + expect(fn?.().Foo.#self.getSelf?.().#m?.()).toEqual(1); + expect(fn?.().Foo.#self?.getSelf().#m?.()).toEqual(1); + expect(fn?.().Foo.#self?.getSelf?.().#m?.()).toEqual(1); + expect(fn?.().Foo.#self.getSelf()?.self.#m?.()).toEqual(1); + expect(fn?.().Foo.#self.getSelf?.()?.self.#m?.()).toEqual(1); + expect(fn?.().Foo.#self?.getSelf()?.self.#m?.()).toEqual(1); + expect(fn?.().Foo.#self?.getSelf?.()?.self.#m?.()).toEqual(1); + } + + static testNull() { + const o = null;; + const deep = { very: { o } }; + const fn = null; + function fnDeep() { + return deep; + } + + expect(o?.Foo.#m?.()).toEqual(undefined); + expect(o?.Foo.#m?.().toString).toEqual(undefined); + expect(o?.Foo.#m?.().toString()).toEqual(undefined); + + expect(deep?.very.o?.Foo.#m?.()).toEqual(undefined); + expect(deep?.very.o?.Foo.#m?.().toString).toEqual(undefined); + expect(deep?.very.o?.Foo.#m?.().toString()).toEqual(undefined); + + expect(o?.Foo.#self.#m?.()).toEqual(undefined); + expect(o?.Foo.#self.self.#m?.()).toEqual(undefined); + expect(o?.Foo.#self?.self.#m?.()).toEqual(undefined); + expect(o?.Foo.#self.self?.self.#m?.()).toEqual(undefined); + expect(o?.Foo.#self?.self?.self.#m?.()).toEqual(undefined); + + expect(o?.Foo.#self.getSelf().#m?.()).toEqual(undefined); + expect(o?.Foo.#self.getSelf?.().#m?.()).toEqual(undefined); + expect(o?.Foo.#self?.getSelf().#m?.()).toEqual(undefined); + expect(o?.Foo.#self?.getSelf?.().#m?.()).toEqual(undefined); + expect(o?.Foo.#self.getSelf()?.self.#m?.()).toEqual(undefined); + expect(o?.Foo.#self.getSelf?.()?.self.#m?.()).toEqual(undefined); + expect(o?.Foo.#self?.getSelf()?.self.#m?.()).toEqual(undefined); + expect(o?.Foo.#self?.getSelf?.()?.self.#m?.()).toEqual(undefined); + + expect(fn?.().Foo.#m?.()).toEqual(undefined); + expect(fn?.().Foo.#m?.().toString).toEqual(undefined); + expect(fn?.().Foo.#m?.().toString()).toEqual(undefined); + + expect(fnDeep?.().very.o?.Foo.#m?.()).toEqual(undefined); + expect(fnDeep?.().very.o?.Foo.#m?.().toString).toEqual(undefined); + expect(fnDeep?.().very.o?.Foo.#m?.().toString()).toEqual(undefined); + + expect(fn?.().Foo.#self.#m?.()).toEqual(undefined); + expect(fn?.().Foo.#self.self.#m?.()).toEqual(undefined); + expect(fn?.().Foo.#self?.self.#m?.()).toEqual(undefined); + expect(fn?.().Foo.#self.self?.self.#m?.()).toEqual(undefined); + expect(fn?.().Foo.#self?.self?.self.#m?.()).toEqual(undefined); + + expect(fn?.().Foo.#self.getSelf().#m?.()).toEqual(undefined); + expect(fn?.().Foo.#self.getSelf?.().#m?.()).toEqual(undefined); + expect(fn?.().Foo.#self?.getSelf().#m?.()).toEqual(undefined); + expect(fn?.().Foo.#self?.getSelf?.().#m?.()).toEqual(undefined); + expect(fn?.().Foo.#self.getSelf()?.self.#m?.()).toEqual(undefined); + expect(fn?.().Foo.#self.getSelf?.()?.self.#m?.()).toEqual(undefined); + expect(fn?.().Foo.#self?.getSelf()?.self.#m?.()).toEqual(undefined); + expect(fn?.().Foo.#self?.getSelf?.()?.self.#m?.()).toEqual(undefined); + } +} + +Foo.test(); +Foo.testNull(); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-member-optional-call/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-member-optional-call/input.js new file mode 100644 index 000000000000..11dd4a57060d --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-member-optional-call/input.js @@ -0,0 +1,71 @@ +class Foo { + static #x = 1; + static #m = function() { return this.#x; }; + static #self = Foo; + static self = Foo; + static getSelf() { return this } + + static test() { + const o = { Foo: Foo }; + const deep = { very: { o } }; + function fn() { + return o; + } + function fnDeep() { + return deep; + } + + Foo.#m?.(); + Foo.#m?.().toString; + Foo.#m?.().toString(); + + o?.Foo.#m?.(); + o?.Foo.#m?.().toString; + o?.Foo.#m?.().toString(); + + deep?.very.o?.Foo.#m?.(); + deep?.very.o?.Foo.#m?.().toString; + deep?.very.o?.Foo.#m?.().toString(); + + o?.Foo.#self.#m?.(); + o?.Foo.#self.self.#m?.(); + o?.Foo.#self?.self.#m?.(); + o?.Foo.#self.self?.self.#m?.(); + o?.Foo.#self?.self?.self.#m?.(); + + o?.Foo.#self.getSelf().#m?.(); + o?.Foo.#self.getSelf?.().#m?.(); + o?.Foo.#self?.getSelf().#m?.(); + o?.Foo.#self?.getSelf?.().#m?.(); + o?.Foo.#self.getSelf()?.self.#m?.(); + o?.Foo.#self.getSelf?.()?.self.#m?.(); + o?.Foo.#self?.getSelf()?.self.#m?.(); + o?.Foo.#self?.getSelf?.()?.self.#m?.(); + + fn?.().Foo.#m?.(); + fn?.().Foo.#m?.().toString; + fn?.().Foo.#m?.().toString(); + + fnDeep?.().very.o?.Foo.#m?.(); + fnDeep?.().very.o?.Foo.#m?.().toString; + fnDeep?.().very.o?.Foo.#m?.().toString(); + + fn?.().Foo.#self.#m?.(); + fn?.().Foo.#self.self.#m?.(); + fn?.().Foo.#self?.self.#m?.(); + fn?.().Foo.#self.self?.self.#m?.(); + fn?.().Foo.#self?.self?.self.#m?.(); + + fn?.().Foo.#self.getSelf().#m?.(); + fn?.().Foo.#self.getSelf?.().#m?.(); + fn?.().Foo.#self?.getSelf().#m?.(); + fn?.().Foo.#self?.getSelf?.().#m?.(); + fn?.().Foo.#self.getSelf()?.self.#m?.(); + fn?.().Foo.#self.getSelf?.()?.self.#m?.(); + fn?.().Foo.#self?.getSelf()?.self.#m?.(); + fn?.().Foo.#self?.getSelf?.()?.self.#m?.(); + } + +} + +Foo.test(); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-member-optional-call/options.json b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-member-optional-call/options.json new file mode 100644 index 000000000000..2d5cfe8e8095 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-member-optional-call/options.json @@ -0,0 +1,4 @@ +{ + "plugins": [["proposal-class-properties", { "loose": true }]], + "minNodeVersion": "14.0.0" +} diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-member-optional-call/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-member-optional-call/output.js new file mode 100644 index 000000000000..16be28736749 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-member-optional-call/output.js @@ -0,0 +1,98 @@ +function _classPrivateFieldLooseBase(receiver, privateKey) { if (!Object.prototype.hasOwnProperty.call(receiver, privateKey)) { throw new TypeError("attempted to use private field on non-instance"); } return receiver; } + +var id = 0; + +function _classPrivateFieldLooseKey(name) { return "__private_" + id++ + "_" + name; } + +class Foo { + static getSelf() { + return this; + } + + static test() { + var _deep$very$o, _deep$very$o2, _deep$very$o3, _classPrivateFieldLoo, _classPrivateFieldLoo2, _ref, _ref2, _self2, _classPrivateFieldLoo3, _classPrivateFieldLoo4, _ref3, _ref4, _getSelf, _ref5, _ref6, _classPrivateFieldLoo5, _call, _getSelf2, _getSelf3, _fnDeep$very$o, _fnDeep$very$o2, _fnDeep$very$o3, _classPrivateFieldLoo6, _classPrivateFieldLoo7, _ref7, _ref8, _self3, _classPrivateFieldLoo8, _classPrivateFieldLoo9, _ref9, _ref10, _getSelf4, _ref11, _ref12, _classPrivateFieldLoo10, _call2, _getSelf5, _getSelf6; + + const o = { + Foo: Foo + }; + const deep = { + very: { + o + } + }; + + function fn() { + return o; + } + + function fnDeep() { + return deep; + } + + _classPrivateFieldLooseBase(Foo, _m)[_m]?.(); + _classPrivateFieldLooseBase(Foo, _m)[_m]?.().toString; + _classPrivateFieldLooseBase(Foo, _m)[_m]?.().toString(); + o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _m)[_m]?.(); + o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _m)[_m]?.().toString; + o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _m)[_m]?.().toString(); + (_deep$very$o = deep?.very.o) === null || _deep$very$o === void 0 ? void 0 : _classPrivateFieldLooseBase(_deep$very$o.Foo, _m)[_m]?.(); + (_deep$very$o2 = deep?.very.o) === null || _deep$very$o2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_deep$very$o2.Foo, _m)[_m]?.().toString; + (_deep$very$o3 = deep?.very.o) === null || _deep$very$o3 === void 0 ? void 0 : _classPrivateFieldLooseBase(_deep$very$o3.Foo, _m)[_m]?.().toString(); + (o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(_classPrivateFieldLoo = _classPrivateFieldLooseBase(o.Foo, _self)[_self], _m)[_m])?.call(_classPrivateFieldLoo); + (o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(_classPrivateFieldLoo2 = _classPrivateFieldLooseBase(o.Foo, _self)[_self].self, _m)[_m])?.call(_classPrivateFieldLoo2); + (_ref = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self]) === null || _ref === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref.self, _m)[_m]?.(); + (_ref2 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self].self) === null || _ref2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref2.self, _m)[_m]?.(); + (_self2 = (o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self])?.self) === null || _self2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_self2.self, _m)[_m]?.(); + (o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(_classPrivateFieldLoo3 = _classPrivateFieldLooseBase(o.Foo, _self)[_self].getSelf(), _m)[_m])?.call(_classPrivateFieldLoo3); + (_ref3 = o === null || o === void 0 ? void 0 : (_classPrivateFieldLoo4 = _classPrivateFieldLooseBase(o.Foo, _self)[_self]).getSelf) === null || _ref3 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref3.call(_classPrivateFieldLoo4), _m)[_m]?.(); + (_ref4 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self]) === null || _ref4 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref4.getSelf(), _m)[_m]?.(); + (_getSelf = (_ref5 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self])?.getSelf) === null || _getSelf === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf.call(_ref5), _m)[_m]?.(); + (_ref6 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self].getSelf()) === null || _ref6 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref6.self, _m)[_m]?.(); + (_call = (o === null || o === void 0 ? void 0 : (_classPrivateFieldLoo5 = _classPrivateFieldLooseBase(o.Foo, _self)[_self]).getSelf)?.call(_classPrivateFieldLoo5)) === null || _call === void 0 ? void 0 : _classPrivateFieldLooseBase(_call.self, _m)[_m]?.(); + (_getSelf2 = (o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self])?.getSelf()) === null || _getSelf2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf2.self, _m)[_m]?.(); + (_getSelf3 = (o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self])?.getSelf?.()) === null || _getSelf3 === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf3.self, _m)[_m]?.(); + fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _m)[_m]?.(); + fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _m)[_m]?.().toString; + fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _m)[_m]?.().toString(); + (_fnDeep$very$o = fnDeep?.().very.o) === null || _fnDeep$very$o === void 0 ? void 0 : _classPrivateFieldLooseBase(_fnDeep$very$o.Foo, _m)[_m]?.(); + (_fnDeep$very$o2 = fnDeep?.().very.o) === null || _fnDeep$very$o2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_fnDeep$very$o2.Foo, _m)[_m]?.().toString; + (_fnDeep$very$o3 = fnDeep?.().very.o) === null || _fnDeep$very$o3 === void 0 ? void 0 : _classPrivateFieldLooseBase(_fnDeep$very$o3.Foo, _m)[_m]?.().toString(); + (fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(_classPrivateFieldLoo6 = _classPrivateFieldLooseBase(fn().Foo, _self)[_self], _m)[_m])?.call(_classPrivateFieldLoo6); + (fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(_classPrivateFieldLoo7 = _classPrivateFieldLooseBase(fn().Foo, _self)[_self].self, _m)[_m])?.call(_classPrivateFieldLoo7); + (_ref7 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self]) === null || _ref7 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref7.self, _m)[_m]?.(); + (_ref8 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self].self) === null || _ref8 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref8.self, _m)[_m]?.(); + (_self3 = (fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self])?.self) === null || _self3 === void 0 ? void 0 : _classPrivateFieldLooseBase(_self3.self, _m)[_m]?.(); + (fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(_classPrivateFieldLoo8 = _classPrivateFieldLooseBase(fn().Foo, _self)[_self].getSelf(), _m)[_m])?.call(_classPrivateFieldLoo8); + (_ref9 = fn === null || fn === void 0 ? void 0 : (_classPrivateFieldLoo9 = _classPrivateFieldLooseBase(fn().Foo, _self)[_self]).getSelf) === null || _ref9 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref9.call(_classPrivateFieldLoo9), _m)[_m]?.(); + (_ref10 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self]) === null || _ref10 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref10.getSelf(), _m)[_m]?.(); + (_getSelf4 = (_ref11 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self])?.getSelf) === null || _getSelf4 === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf4.call(_ref11), _m)[_m]?.(); + (_ref12 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self].getSelf()) === null || _ref12 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref12.self, _m)[_m]?.(); + (_call2 = (fn === null || fn === void 0 ? void 0 : (_classPrivateFieldLoo10 = _classPrivateFieldLooseBase(fn().Foo, _self)[_self]).getSelf)?.call(_classPrivateFieldLoo10)) === null || _call2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_call2.self, _m)[_m]?.(); + (_getSelf5 = (fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self])?.getSelf()) === null || _getSelf5 === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf5.self, _m)[_m]?.(); + (_getSelf6 = (fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self])?.getSelf?.()) === null || _getSelf6 === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf6.self, _m)[_m]?.(); + } + +} + +var _x = _classPrivateFieldLooseKey("x"); + +var _m = _classPrivateFieldLooseKey("m"); + +var _self = _classPrivateFieldLooseKey("self"); + +Object.defineProperty(Foo, _x, { + writable: true, + value: 1 +}); +Object.defineProperty(Foo, _m, { + writable: true, + value: function () { + return _classPrivateFieldLooseBase(this, _x)[_x]; + } +}); +Object.defineProperty(Foo, _self, { + writable: true, + value: Foo +}); +Foo.self = Foo; +Foo.test(); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-optional-member-call-with-transform/exec.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-optional-member-call-with-transform/exec.js new file mode 100644 index 000000000000..df4319aff69b --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-optional-member-call-with-transform/exec.js @@ -0,0 +1,126 @@ +class Foo { + static #x = 1; + static #m = function() { return this.#x; }; + static #self = Foo; + static self = Foo; + static getSelf() { return this } + + static test() { + const o = { Foo: Foo }; + const deep = { very: { o } }; + function fn() { + return o; + } + function fnDeep() { + return deep; + } + + expect(Foo?.#m()).toEqual(1); + expect(Foo?.#m().toString).toEqual(1..toString); + expect(Foo?.#m().toString()).toEqual('1'); + + expect(o?.Foo?.#m()).toEqual(1); + expect(o?.Foo?.#m().toString).toEqual(1..toString); + expect(o?.Foo?.#m().toString()).toEqual('1'); + + expect(deep?.very.o?.Foo?.#m()).toEqual(1); + expect(deep?.very.o?.Foo?.#m().toString).toEqual(1..toString); + expect(deep?.very.o?.Foo?.#m().toString()).toEqual('1'); + + expect(o?.Foo.#self?.#m()).toEqual(1); + expect(o?.Foo.#self.self?.#m()).toEqual(1); + expect(o?.Foo.#self?.self?.#m()).toEqual(1); + expect(o?.Foo.#self.self?.self?.#m()).toEqual(1); + expect(o?.Foo.#self?.self?.self?.#m()).toEqual(1); + + expect(o?.Foo.#self.getSelf()?.#m()).toEqual(1); + expect(o?.Foo.#self.getSelf?.()?.#m()).toEqual(1); + expect(o?.Foo.#self?.getSelf()?.#m()).toEqual(1); + expect(o?.Foo.#self?.getSelf?.()?.#m()).toEqual(1); + expect(o?.Foo.#self.getSelf()?.self?.#m()).toEqual(1); + expect(o?.Foo.#self.getSelf?.()?.self?.#m()).toEqual(1); + expect(o?.Foo.#self?.getSelf()?.self?.#m()).toEqual(1); + expect(o?.Foo.#self?.getSelf?.()?.self?.#m()).toEqual(1); + + expect(fn?.().Foo?.#m()).toEqual(1); + expect(fn?.().Foo?.#m().toString).toEqual(1..toString); + expect(fn?.().Foo?.#m().toString()).toEqual('1'); + + expect(fnDeep?.().very.o?.Foo?.#m()).toEqual(1); + expect(fnDeep?.().very.o?.Foo?.#m().toString).toEqual(1..toString); + expect(fnDeep?.().very.o?.Foo?.#m().toString()).toEqual('1'); + + expect(fn?.().Foo.#self?.#m()).toEqual(1); + expect(fn?.().Foo.#self.self?.#m()).toEqual(1); + expect(fn?.().Foo.#self?.self?.#m()).toEqual(1); + expect(fn?.().Foo.#self.self?.self?.#m()).toEqual(1); + expect(fn?.().Foo.#self?.self?.self?.#m()).toEqual(1); + + expect(fn?.().Foo.#self.getSelf()?.#m()).toEqual(1); + expect(fn?.().Foo.#self.getSelf?.()?.#m()).toEqual(1); + expect(fn?.().Foo.#self?.getSelf()?.#m()).toEqual(1); + expect(fn?.().Foo.#self?.getSelf?.()?.#m()).toEqual(1); + expect(fn?.().Foo.#self.getSelf()?.self?.#m()).toEqual(1); + expect(fn?.().Foo.#self.getSelf?.()?.self?.#m()).toEqual(1); + expect(fn?.().Foo.#self?.getSelf()?.self?.#m()).toEqual(1); + expect(fn?.().Foo.#self?.getSelf?.()?.self?.#m()).toEqual(1); + } + + static testNull() { + const o = null;; + const deep = { very: { o } }; + const fn = null; + function fnDeep() { + return deep; + } + + expect(o?.Foo?.#m()).toEqual(undefined); + expect(o?.Foo?.#m().toString).toEqual(undefined); + expect(o?.Foo?.#m().toString()).toEqual(undefined); + + expect(deep?.very.o?.Foo?.#m()).toEqual(undefined); + expect(deep?.very.o?.Foo?.#m().toString).toEqual(undefined); + expect(deep?.very.o?.Foo?.#m().toString()).toEqual(undefined); + + expect(o?.Foo.#self?.#m()).toEqual(undefined); + expect(o?.Foo.#self.self?.#m()).toEqual(undefined); + expect(o?.Foo.#self?.self?.#m()).toEqual(undefined); + expect(o?.Foo.#self.self?.self?.#m()).toEqual(undefined); + expect(o?.Foo.#self?.self?.self?.#m()).toEqual(undefined); + + expect(o?.Foo.#self.getSelf()?.#m()).toEqual(undefined); + expect(o?.Foo.#self.getSelf?.()?.#m()).toEqual(undefined); + expect(o?.Foo.#self?.getSelf()?.#m()).toEqual(undefined); + expect(o?.Foo.#self?.getSelf?.()?.#m()).toEqual(undefined); + expect(o?.Foo.#self.getSelf()?.self?.#m()).toEqual(undefined); + expect(o?.Foo.#self.getSelf?.()?.self?.#m()).toEqual(undefined); + expect(o?.Foo.#self?.getSelf()?.self?.#m()).toEqual(undefined); + expect(o?.Foo.#self?.getSelf?.()?.self?.#m()).toEqual(undefined); + + expect(fn?.().Foo?.#m()).toEqual(undefined); + expect(fn?.().Foo?.#m().toString).toEqual(undefined); + expect(fn?.().Foo?.#m().toString()).toEqual(undefined); + + expect(fnDeep?.().very.o?.Foo?.#m()).toEqual(undefined); + expect(fnDeep?.().very.o?.Foo?.#m().toString).toEqual(undefined); + expect(fnDeep?.().very.o?.Foo?.#m().toString()).toEqual(undefined); + + expect(fn?.().Foo.#self?.#m()).toEqual(undefined); + expect(fn?.().Foo.#self.self?.#m()).toEqual(undefined); + expect(fn?.().Foo.#self?.self?.#m()).toEqual(undefined); + expect(fn?.().Foo.#self.self?.self?.#m()).toEqual(undefined); + expect(fn?.().Foo.#self?.self?.self?.#m()).toEqual(undefined); + + expect(fn?.().Foo.#self.getSelf()?.#m()).toEqual(undefined); + expect(fn?.().Foo.#self.getSelf?.()?.#m()).toEqual(undefined); + expect(fn?.().Foo.#self?.getSelf()?.#m()).toEqual(undefined); + expect(fn?.().Foo.#self?.getSelf?.()?.#m()).toEqual(undefined); + expect(fn?.().Foo.#self.getSelf()?.self?.#m()).toEqual(undefined); + expect(fn?.().Foo.#self.getSelf?.()?.self?.#m()).toEqual(undefined); + expect(fn?.().Foo.#self?.getSelf()?.self?.#m()).toEqual(undefined); + expect(fn?.().Foo.#self?.getSelf?.()?.self?.#m()).toEqual(undefined); + } +} + +Foo.test(); +Foo.testNull(); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-optional-member-call-with-transform/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-optional-member-call-with-transform/input.js new file mode 100644 index 000000000000..80f689342109 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-optional-member-call-with-transform/input.js @@ -0,0 +1,70 @@ +class Foo { + static #x = 1; + static #m = function() { return this.#x; }; + static #self = Foo; + static self = Foo; + static getSelf() { return this } + + static test() { + const o = { Foo: Foo }; + const deep = { very: { o } }; + function fn() { + return o; + } + function fnDeep() { + return deep; + } + + Foo?.#m(); + Foo?.#m().toString; + Foo?.#m().toString(); + + o?.Foo?.#m(); + o?.Foo?.#m().toString; + o?.Foo?.#m().toString(); + + deep?.very.o?.Foo?.#m(); + deep?.very.o?.Foo?.#m().toString; + deep?.very.o?.Foo?.#m().toString(); + + o?.Foo.#self?.#m(); + o?.Foo.#self.self?.#m(); + o?.Foo.#self?.self?.#m(); + o?.Foo.#self.self?.self?.#m(); + o?.Foo.#self?.self?.self?.#m(); + + o?.Foo.#self.getSelf()?.#m(); + o?.Foo.#self.getSelf?.()?.#m(); + o?.Foo.#self?.getSelf()?.#m(); + o?.Foo.#self?.getSelf?.()?.#m(); + o?.Foo.#self.getSelf()?.self?.#m(); + o?.Foo.#self.getSelf?.()?.self?.#m(); + o?.Foo.#self?.getSelf()?.self?.#m(); + o?.Foo.#self?.getSelf?.()?.self?.#m(); + + fn?.().Foo?.#m(); + fn?.().Foo?.#m().toString; + fn?.().Foo?.#m().toString(); + + fnDeep?.().very.o?.Foo?.#m(); + fnDeep?.().very.o?.Foo?.#m().toString; + fnDeep?.().very.o?.Foo?.#m().toString(); + + fn?.().Foo.#self?.#m(); + fn?.().Foo.#self.self?.#m(); + fn?.().Foo.#self?.self?.#m(); + fn?.().Foo.#self.self?.self?.#m(); + fn?.().Foo.#self?.self?.self?.#m(); + + fn?.().Foo.#self.getSelf()?.#m(); + fn?.().Foo.#self.getSelf?.()?.#m(); + fn?.().Foo.#self?.getSelf()?.#m(); + fn?.().Foo.#self?.getSelf?.()?.#m(); + fn?.().Foo.#self.getSelf()?.self?.#m(); + fn?.().Foo.#self.getSelf?.()?.self?.#m(); + fn?.().Foo.#self?.getSelf()?.self?.#m(); + fn?.().Foo.#self?.getSelf?.()?.self?.#m(); + } +} + +Foo.test(); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-optional-member-call-with-transform/options.json b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-optional-member-call-with-transform/options.json new file mode 100644 index 000000000000..124133b5af2b --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-optional-member-call-with-transform/options.json @@ -0,0 +1,6 @@ +{ + "plugins": [ + ["proposal-optional-chaining", { "loose": true }], + ["proposal-class-properties", { "loose": true }] + ] +} diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-optional-member-call-with-transform/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-optional-member-call-with-transform/output.js new file mode 100644 index 000000000000..b4f91f63bf6c --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-optional-member-call-with-transform/output.js @@ -0,0 +1,98 @@ +function _classPrivateFieldLooseBase(receiver, privateKey) { if (!Object.prototype.hasOwnProperty.call(receiver, privateKey)) { throw new TypeError("attempted to use private field on non-instance"); } return receiver; } + +var id = 0; + +function _classPrivateFieldLooseKey(name) { return "__private_" + id++ + "_" + name; } + +class Foo { + static getSelf() { + return this; + } + + static test() { + var _o$Foo, _o$Foo2, _o$Foo3, _deep$very$o$Foo, _deep$very$o$Foo2, _deep$very$o$Foo3, _ref, _ref2, _self2, _self3, _self$self, _ref3, _classPrivateFieldLoo, _call, _getSelf, _getSelf2, _self4, _classPrivateFieldLoo2, _call$self, _getSelf$self, _getSelf$self2, _fn$Foo, _fn$Foo2, _fn$Foo3, _fnDeep$very$o$Foo, _fnDeep$very$o$Foo2, _fnDeep$very$o$Foo3, _ref4, _ref5, _self5, _self6, _self$self2, _ref6, _classPrivateFieldLoo3, _call2, _getSelf3, _getSelf4, _self7, _classPrivateFieldLoo4, _call$self2, _getSelf$self3, _getSelf$self4, _deep$very$o, _deep$very$o2, _deep$very$o3, _ref7, _ref8, _ref9, _ref9$self, _ref10, _ref11, _ref12, _ref13, _ref14, _ref14$call, _ref15, _ref15$getSelf, _ref16, _ref16$getSelf, _fnDeep$very$o, _fnDeep$very$o2, _fnDeep$very$o3, _ref17, _ref18, _ref19, _ref19$self, _ref20, _ref21, _ref22, _ref23, _ref24, _ref24$call, _ref25, _ref25$getSelf, _ref26, _ref26$getSelf; + + const o = { + Foo: Foo + }; + const deep = { + very: { + o + } + }; + + function fn() { + return o; + } + + function fnDeep() { + return deep; + } + + Foo === null || Foo === void 0 ? void 0 : _classPrivateFieldLooseBase(Foo, _m)[_m](); + Foo === null || Foo === void 0 ? void 0 : _classPrivateFieldLooseBase(Foo, _m)[_m]().toString; + Foo === null || Foo === void 0 ? void 0 : _classPrivateFieldLooseBase(Foo, _m)[_m]().toString(); + (_o$Foo = o == null ? void 0 : o.Foo) === null || _o$Foo === void 0 ? void 0 : _classPrivateFieldLooseBase(_o$Foo, _m)[_m](); + (_o$Foo2 = o == null ? void 0 : o.Foo) === null || _o$Foo2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_o$Foo2, _m)[_m]().toString; + (_o$Foo3 = o == null ? void 0 : o.Foo) === null || _o$Foo3 === void 0 ? void 0 : _classPrivateFieldLooseBase(_o$Foo3, _m)[_m]().toString(); + (_deep$very$o$Foo = deep == null ? void 0 : (_deep$very$o = deep.very.o) == null ? void 0 : _deep$very$o.Foo) === null || _deep$very$o$Foo === void 0 ? void 0 : _classPrivateFieldLooseBase(_deep$very$o$Foo, _m)[_m](); + (_deep$very$o$Foo2 = deep == null ? void 0 : (_deep$very$o2 = deep.very.o) == null ? void 0 : _deep$very$o2.Foo) === null || _deep$very$o$Foo2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_deep$very$o$Foo2, _m)[_m]().toString; + (_deep$very$o$Foo3 = deep == null ? void 0 : (_deep$very$o3 = deep.very.o) == null ? void 0 : _deep$very$o3.Foo) === null || _deep$very$o$Foo3 === void 0 ? void 0 : _classPrivateFieldLooseBase(_deep$very$o$Foo3, _m)[_m]().toString(); + (_ref = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self]) === null || _ref === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref, _m)[_m](); + (_ref2 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self].self) === null || _ref2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref2, _m)[_m](); + (_self2 = (_ref7 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self]) == null ? void 0 : _ref7.self) === null || _self2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_self2, _m)[_m](); + (_self3 = (_ref8 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self].self) == null ? void 0 : _ref8.self) === null || _self3 === void 0 ? void 0 : _classPrivateFieldLooseBase(_self3, _m)[_m](); + (_self$self = (_ref9 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self]) == null ? void 0 : (_ref9$self = _ref9.self) == null ? void 0 : _ref9$self.self) === null || _self$self === void 0 ? void 0 : _classPrivateFieldLooseBase(_self$self, _m)[_m](); + (_ref3 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self].getSelf()) === null || _ref3 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref3, _m)[_m](); + (_call = (_ref10 = o === null || o === void 0 ? void 0 : (_classPrivateFieldLoo = _classPrivateFieldLooseBase(o.Foo, _self)[_self]).getSelf) == null ? void 0 : _ref10.call(_classPrivateFieldLoo)) === null || _call === void 0 ? void 0 : _classPrivateFieldLooseBase(_call, _m)[_m](); + (_getSelf = (_ref11 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self]) == null ? void 0 : _ref11.getSelf()) === null || _getSelf === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf, _m)[_m](); + (_getSelf2 = (_ref12 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self]) == null ? void 0 : _ref12.getSelf == null ? void 0 : _ref12.getSelf()) === null || _getSelf2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf2, _m)[_m](); + (_self4 = (_ref13 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self].getSelf()) == null ? void 0 : _ref13.self) === null || _self4 === void 0 ? void 0 : _classPrivateFieldLooseBase(_self4, _m)[_m](); + (_call$self = (_ref14 = o === null || o === void 0 ? void 0 : (_classPrivateFieldLoo2 = _classPrivateFieldLooseBase(o.Foo, _self)[_self]).getSelf) == null ? void 0 : (_ref14$call = _ref14.call(_classPrivateFieldLoo2)) == null ? void 0 : _ref14$call.self) === null || _call$self === void 0 ? void 0 : _classPrivateFieldLooseBase(_call$self, _m)[_m](); + (_getSelf$self = (_ref15 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self]) == null ? void 0 : (_ref15$getSelf = _ref15.getSelf()) == null ? void 0 : _ref15$getSelf.self) === null || _getSelf$self === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf$self, _m)[_m](); + (_getSelf$self2 = (_ref16 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self]) == null ? void 0 : _ref16.getSelf == null ? void 0 : (_ref16$getSelf = _ref16.getSelf()) == null ? void 0 : _ref16$getSelf.self) === null || _getSelf$self2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf$self2, _m)[_m](); + (_fn$Foo = fn == null ? void 0 : fn().Foo) === null || _fn$Foo === void 0 ? void 0 : _classPrivateFieldLooseBase(_fn$Foo, _m)[_m](); + (_fn$Foo2 = fn == null ? void 0 : fn().Foo) === null || _fn$Foo2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_fn$Foo2, _m)[_m]().toString; + (_fn$Foo3 = fn == null ? void 0 : fn().Foo) === null || _fn$Foo3 === void 0 ? void 0 : _classPrivateFieldLooseBase(_fn$Foo3, _m)[_m]().toString(); + (_fnDeep$very$o$Foo = fnDeep == null ? void 0 : (_fnDeep$very$o = fnDeep().very.o) == null ? void 0 : _fnDeep$very$o.Foo) === null || _fnDeep$very$o$Foo === void 0 ? void 0 : _classPrivateFieldLooseBase(_fnDeep$very$o$Foo, _m)[_m](); + (_fnDeep$very$o$Foo2 = fnDeep == null ? void 0 : (_fnDeep$very$o2 = fnDeep().very.o) == null ? void 0 : _fnDeep$very$o2.Foo) === null || _fnDeep$very$o$Foo2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_fnDeep$very$o$Foo2, _m)[_m]().toString; + (_fnDeep$very$o$Foo3 = fnDeep == null ? void 0 : (_fnDeep$very$o3 = fnDeep().very.o) == null ? void 0 : _fnDeep$very$o3.Foo) === null || _fnDeep$very$o$Foo3 === void 0 ? void 0 : _classPrivateFieldLooseBase(_fnDeep$very$o$Foo3, _m)[_m]().toString(); + (_ref4 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self]) === null || _ref4 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref4, _m)[_m](); + (_ref5 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self].self) === null || _ref5 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref5, _m)[_m](); + (_self5 = (_ref17 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self]) == null ? void 0 : _ref17.self) === null || _self5 === void 0 ? void 0 : _classPrivateFieldLooseBase(_self5, _m)[_m](); + (_self6 = (_ref18 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self].self) == null ? void 0 : _ref18.self) === null || _self6 === void 0 ? void 0 : _classPrivateFieldLooseBase(_self6, _m)[_m](); + (_self$self2 = (_ref19 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self]) == null ? void 0 : (_ref19$self = _ref19.self) == null ? void 0 : _ref19$self.self) === null || _self$self2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_self$self2, _m)[_m](); + (_ref6 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self].getSelf()) === null || _ref6 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref6, _m)[_m](); + (_call2 = (_ref20 = fn === null || fn === void 0 ? void 0 : (_classPrivateFieldLoo3 = _classPrivateFieldLooseBase(fn().Foo, _self)[_self]).getSelf) == null ? void 0 : _ref20.call(_classPrivateFieldLoo3)) === null || _call2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_call2, _m)[_m](); + (_getSelf3 = (_ref21 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self]) == null ? void 0 : _ref21.getSelf()) === null || _getSelf3 === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf3, _m)[_m](); + (_getSelf4 = (_ref22 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self]) == null ? void 0 : _ref22.getSelf == null ? void 0 : _ref22.getSelf()) === null || _getSelf4 === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf4, _m)[_m](); + (_self7 = (_ref23 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self].getSelf()) == null ? void 0 : _ref23.self) === null || _self7 === void 0 ? void 0 : _classPrivateFieldLooseBase(_self7, _m)[_m](); + (_call$self2 = (_ref24 = fn === null || fn === void 0 ? void 0 : (_classPrivateFieldLoo4 = _classPrivateFieldLooseBase(fn().Foo, _self)[_self]).getSelf) == null ? void 0 : (_ref24$call = _ref24.call(_classPrivateFieldLoo4)) == null ? void 0 : _ref24$call.self) === null || _call$self2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_call$self2, _m)[_m](); + (_getSelf$self3 = (_ref25 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self]) == null ? void 0 : (_ref25$getSelf = _ref25.getSelf()) == null ? void 0 : _ref25$getSelf.self) === null || _getSelf$self3 === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf$self3, _m)[_m](); + (_getSelf$self4 = (_ref26 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self]) == null ? void 0 : _ref26.getSelf == null ? void 0 : (_ref26$getSelf = _ref26.getSelf()) == null ? void 0 : _ref26$getSelf.self) === null || _getSelf$self4 === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf$self4, _m)[_m](); + } + +} + +var _x = _classPrivateFieldLooseKey("x"); + +var _m = _classPrivateFieldLooseKey("m"); + +var _self = _classPrivateFieldLooseKey("self"); + +Object.defineProperty(Foo, _x, { + writable: true, + value: 1 +}); +Object.defineProperty(Foo, _m, { + writable: true, + value: function () { + return _classPrivateFieldLooseBase(this, _x)[_x]; + } +}); +Object.defineProperty(Foo, _self, { + writable: true, + value: Foo +}); +Foo.self = Foo; +Foo.test(); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-optional-member-call/exec.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-optional-member-call/exec.js new file mode 100644 index 000000000000..df4319aff69b --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-optional-member-call/exec.js @@ -0,0 +1,126 @@ +class Foo { + static #x = 1; + static #m = function() { return this.#x; }; + static #self = Foo; + static self = Foo; + static getSelf() { return this } + + static test() { + const o = { Foo: Foo }; + const deep = { very: { o } }; + function fn() { + return o; + } + function fnDeep() { + return deep; + } + + expect(Foo?.#m()).toEqual(1); + expect(Foo?.#m().toString).toEqual(1..toString); + expect(Foo?.#m().toString()).toEqual('1'); + + expect(o?.Foo?.#m()).toEqual(1); + expect(o?.Foo?.#m().toString).toEqual(1..toString); + expect(o?.Foo?.#m().toString()).toEqual('1'); + + expect(deep?.very.o?.Foo?.#m()).toEqual(1); + expect(deep?.very.o?.Foo?.#m().toString).toEqual(1..toString); + expect(deep?.very.o?.Foo?.#m().toString()).toEqual('1'); + + expect(o?.Foo.#self?.#m()).toEqual(1); + expect(o?.Foo.#self.self?.#m()).toEqual(1); + expect(o?.Foo.#self?.self?.#m()).toEqual(1); + expect(o?.Foo.#self.self?.self?.#m()).toEqual(1); + expect(o?.Foo.#self?.self?.self?.#m()).toEqual(1); + + expect(o?.Foo.#self.getSelf()?.#m()).toEqual(1); + expect(o?.Foo.#self.getSelf?.()?.#m()).toEqual(1); + expect(o?.Foo.#self?.getSelf()?.#m()).toEqual(1); + expect(o?.Foo.#self?.getSelf?.()?.#m()).toEqual(1); + expect(o?.Foo.#self.getSelf()?.self?.#m()).toEqual(1); + expect(o?.Foo.#self.getSelf?.()?.self?.#m()).toEqual(1); + expect(o?.Foo.#self?.getSelf()?.self?.#m()).toEqual(1); + expect(o?.Foo.#self?.getSelf?.()?.self?.#m()).toEqual(1); + + expect(fn?.().Foo?.#m()).toEqual(1); + expect(fn?.().Foo?.#m().toString).toEqual(1..toString); + expect(fn?.().Foo?.#m().toString()).toEqual('1'); + + expect(fnDeep?.().very.o?.Foo?.#m()).toEqual(1); + expect(fnDeep?.().very.o?.Foo?.#m().toString).toEqual(1..toString); + expect(fnDeep?.().very.o?.Foo?.#m().toString()).toEqual('1'); + + expect(fn?.().Foo.#self?.#m()).toEqual(1); + expect(fn?.().Foo.#self.self?.#m()).toEqual(1); + expect(fn?.().Foo.#self?.self?.#m()).toEqual(1); + expect(fn?.().Foo.#self.self?.self?.#m()).toEqual(1); + expect(fn?.().Foo.#self?.self?.self?.#m()).toEqual(1); + + expect(fn?.().Foo.#self.getSelf()?.#m()).toEqual(1); + expect(fn?.().Foo.#self.getSelf?.()?.#m()).toEqual(1); + expect(fn?.().Foo.#self?.getSelf()?.#m()).toEqual(1); + expect(fn?.().Foo.#self?.getSelf?.()?.#m()).toEqual(1); + expect(fn?.().Foo.#self.getSelf()?.self?.#m()).toEqual(1); + expect(fn?.().Foo.#self.getSelf?.()?.self?.#m()).toEqual(1); + expect(fn?.().Foo.#self?.getSelf()?.self?.#m()).toEqual(1); + expect(fn?.().Foo.#self?.getSelf?.()?.self?.#m()).toEqual(1); + } + + static testNull() { + const o = null;; + const deep = { very: { o } }; + const fn = null; + function fnDeep() { + return deep; + } + + expect(o?.Foo?.#m()).toEqual(undefined); + expect(o?.Foo?.#m().toString).toEqual(undefined); + expect(o?.Foo?.#m().toString()).toEqual(undefined); + + expect(deep?.very.o?.Foo?.#m()).toEqual(undefined); + expect(deep?.very.o?.Foo?.#m().toString).toEqual(undefined); + expect(deep?.very.o?.Foo?.#m().toString()).toEqual(undefined); + + expect(o?.Foo.#self?.#m()).toEqual(undefined); + expect(o?.Foo.#self.self?.#m()).toEqual(undefined); + expect(o?.Foo.#self?.self?.#m()).toEqual(undefined); + expect(o?.Foo.#self.self?.self?.#m()).toEqual(undefined); + expect(o?.Foo.#self?.self?.self?.#m()).toEqual(undefined); + + expect(o?.Foo.#self.getSelf()?.#m()).toEqual(undefined); + expect(o?.Foo.#self.getSelf?.()?.#m()).toEqual(undefined); + expect(o?.Foo.#self?.getSelf()?.#m()).toEqual(undefined); + expect(o?.Foo.#self?.getSelf?.()?.#m()).toEqual(undefined); + expect(o?.Foo.#self.getSelf()?.self?.#m()).toEqual(undefined); + expect(o?.Foo.#self.getSelf?.()?.self?.#m()).toEqual(undefined); + expect(o?.Foo.#self?.getSelf()?.self?.#m()).toEqual(undefined); + expect(o?.Foo.#self?.getSelf?.()?.self?.#m()).toEqual(undefined); + + expect(fn?.().Foo?.#m()).toEqual(undefined); + expect(fn?.().Foo?.#m().toString).toEqual(undefined); + expect(fn?.().Foo?.#m().toString()).toEqual(undefined); + + expect(fnDeep?.().very.o?.Foo?.#m()).toEqual(undefined); + expect(fnDeep?.().very.o?.Foo?.#m().toString).toEqual(undefined); + expect(fnDeep?.().very.o?.Foo?.#m().toString()).toEqual(undefined); + + expect(fn?.().Foo.#self?.#m()).toEqual(undefined); + expect(fn?.().Foo.#self.self?.#m()).toEqual(undefined); + expect(fn?.().Foo.#self?.self?.#m()).toEqual(undefined); + expect(fn?.().Foo.#self.self?.self?.#m()).toEqual(undefined); + expect(fn?.().Foo.#self?.self?.self?.#m()).toEqual(undefined); + + expect(fn?.().Foo.#self.getSelf()?.#m()).toEqual(undefined); + expect(fn?.().Foo.#self.getSelf?.()?.#m()).toEqual(undefined); + expect(fn?.().Foo.#self?.getSelf()?.#m()).toEqual(undefined); + expect(fn?.().Foo.#self?.getSelf?.()?.#m()).toEqual(undefined); + expect(fn?.().Foo.#self.getSelf()?.self?.#m()).toEqual(undefined); + expect(fn?.().Foo.#self.getSelf?.()?.self?.#m()).toEqual(undefined); + expect(fn?.().Foo.#self?.getSelf()?.self?.#m()).toEqual(undefined); + expect(fn?.().Foo.#self?.getSelf?.()?.self?.#m()).toEqual(undefined); + } +} + +Foo.test(); +Foo.testNull(); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-optional-member-call/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-optional-member-call/input.js new file mode 100644 index 000000000000..a5c222687ee8 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-optional-member-call/input.js @@ -0,0 +1,70 @@ +class Foo { + static #x = 1; + static #m = function() { return this.#x; }; + static #self = Foo; + static self = Foo; + static getSelf() { return this } + + static test() { + const o = { Foo: Foo }; + const deep = { very: { o } }; + function fn() { + return o; + } + function fnDeep() { + return deep; + } + + Foo?.#m(); + Foo?.#m().toString; + Foo?.#m().toString(); + + o?.Foo.#m(); + o?.Foo.#m().toString; + o?.Foo.#m().toString(); + + deep?.very.o?.Foo.#m(); + deep?.very.o?.Foo.#m().toString; + deep?.very.o?.Foo.#m().toString(); + + o?.Foo.#self.#m(); + o?.Foo.#self.self.#m(); + o?.Foo.#self?.self.#m(); + o?.Foo.#self.self?.self.#m(); + o?.Foo.#self?.self?.self.#m(); + + o?.Foo.#self.getSelf().#m(); + o?.Foo.#self.getSelf?.().#m(); + o?.Foo.#self?.getSelf().#m(); + o?.Foo.#self?.getSelf?.().#m(); + o?.Foo.#self.getSelf()?.self.#m(); + o?.Foo.#self.getSelf?.()?.self.#m(); + o?.Foo.#self?.getSelf()?.self.#m(); + o?.Foo.#self?.getSelf?.()?.self.#m(); + + fn?.().Foo.#m(); + fn?.().Foo.#m().toString; + fn?.().Foo.#m().toString(); + + fnDeep?.().very.o?.Foo.#m(); + fnDeep?.().very.o?.Foo.#m().toString; + fnDeep?.().very.o?.Foo.#m().toString(); + + fn?.().Foo.#self.#m(); + fn?.().Foo.#self.self.#m(); + fn?.().Foo.#self?.self.#m(); + fn?.().Foo.#self.self?.self.#m(); + fn?.().Foo.#self?.self?.self.#m(); + + fn?.().Foo.#self.getSelf().#m(); + fn?.().Foo.#self.getSelf?.().#m(); + fn?.().Foo.#self?.getSelf().#m(); + fn?.().Foo.#self?.getSelf?.().#m(); + fn?.().Foo.#self.getSelf()?.self.#m(); + fn?.().Foo.#self.getSelf?.()?.self.#m(); + fn?.().Foo.#self?.getSelf()?.self.#m(); + fn?.().Foo.#self?.getSelf?.()?.self.#m(); + } +} + +Foo.test(); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-optional-member-call/options.json b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-optional-member-call/options.json new file mode 100644 index 000000000000..2d5cfe8e8095 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-optional-member-call/options.json @@ -0,0 +1,4 @@ +{ + "plugins": [["proposal-class-properties", { "loose": true }]], + "minNodeVersion": "14.0.0" +} diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-optional-member-call/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-optional-member-call/output.js new file mode 100644 index 000000000000..dfb6357ed971 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-optional-member-call/output.js @@ -0,0 +1,98 @@ +function _classPrivateFieldLooseBase(receiver, privateKey) { if (!Object.prototype.hasOwnProperty.call(receiver, privateKey)) { throw new TypeError("attempted to use private field on non-instance"); } return receiver; } + +var id = 0; + +function _classPrivateFieldLooseKey(name) { return "__private_" + id++ + "_" + name; } + +class Foo { + static getSelf() { + return this; + } + + static test() { + var _deep$very$o, _deep$very$o2, _deep$very$o3, _ref, _ref2, _self2, _classPrivateFieldLoo, _ref3, _ref4, _getSelf, _ref5, _ref6, _classPrivateFieldLoo2, _call, _getSelf2, _getSelf3, _fnDeep$very$o, _fnDeep$very$o2, _fnDeep$very$o3, _ref7, _ref8, _self3, _classPrivateFieldLoo3, _ref9, _ref10, _getSelf4, _ref11, _ref12, _classPrivateFieldLoo4, _call2, _getSelf5, _getSelf6; + + const o = { + Foo: Foo + }; + const deep = { + very: { + o + } + }; + + function fn() { + return o; + } + + function fnDeep() { + return deep; + } + + Foo === null || Foo === void 0 ? void 0 : _classPrivateFieldLooseBase(Foo, _m)[_m](); + Foo === null || Foo === void 0 ? void 0 : _classPrivateFieldLooseBase(Foo, _m)[_m]().toString; + Foo === null || Foo === void 0 ? void 0 : _classPrivateFieldLooseBase(Foo, _m)[_m]().toString(); + o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _m)[_m](); + o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _m)[_m]().toString; + o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _m)[_m]().toString(); + (_deep$very$o = deep?.very.o) === null || _deep$very$o === void 0 ? void 0 : _classPrivateFieldLooseBase(_deep$very$o.Foo, _m)[_m](); + (_deep$very$o2 = deep?.very.o) === null || _deep$very$o2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_deep$very$o2.Foo, _m)[_m]().toString; + (_deep$very$o3 = deep?.very.o) === null || _deep$very$o3 === void 0 ? void 0 : _classPrivateFieldLooseBase(_deep$very$o3.Foo, _m)[_m]().toString(); + o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(_classPrivateFieldLooseBase(o.Foo, _self)[_self], _m)[_m](); + o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(_classPrivateFieldLooseBase(o.Foo, _self)[_self].self, _m)[_m](); + (_ref = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self]) === null || _ref === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref.self, _m)[_m](); + (_ref2 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self].self) === null || _ref2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref2.self, _m)[_m](); + (_self2 = (o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self])?.self) === null || _self2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_self2.self, _m)[_m](); + o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(_classPrivateFieldLooseBase(o.Foo, _self)[_self].getSelf(), _m)[_m](); + (_ref3 = o === null || o === void 0 ? void 0 : (_classPrivateFieldLoo = _classPrivateFieldLooseBase(o.Foo, _self)[_self]).getSelf) === null || _ref3 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref3.call(_classPrivateFieldLoo), _m)[_m](); + (_ref4 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self]) === null || _ref4 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref4.getSelf(), _m)[_m](); + (_getSelf = (_ref5 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self])?.getSelf) === null || _getSelf === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf.call(_ref5), _m)[_m](); + (_ref6 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self].getSelf()) === null || _ref6 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref6.self, _m)[_m](); + (_call = (o === null || o === void 0 ? void 0 : (_classPrivateFieldLoo2 = _classPrivateFieldLooseBase(o.Foo, _self)[_self]).getSelf)?.call(_classPrivateFieldLoo2)) === null || _call === void 0 ? void 0 : _classPrivateFieldLooseBase(_call.self, _m)[_m](); + (_getSelf2 = (o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self])?.getSelf()) === null || _getSelf2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf2.self, _m)[_m](); + (_getSelf3 = (o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self])?.getSelf?.()) === null || _getSelf3 === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf3.self, _m)[_m](); + fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _m)[_m](); + fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _m)[_m]().toString; + fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _m)[_m]().toString(); + (_fnDeep$very$o = fnDeep?.().very.o) === null || _fnDeep$very$o === void 0 ? void 0 : _classPrivateFieldLooseBase(_fnDeep$very$o.Foo, _m)[_m](); + (_fnDeep$very$o2 = fnDeep?.().very.o) === null || _fnDeep$very$o2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_fnDeep$very$o2.Foo, _m)[_m]().toString; + (_fnDeep$very$o3 = fnDeep?.().very.o) === null || _fnDeep$very$o3 === void 0 ? void 0 : _classPrivateFieldLooseBase(_fnDeep$very$o3.Foo, _m)[_m]().toString(); + fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(_classPrivateFieldLooseBase(fn().Foo, _self)[_self], _m)[_m](); + fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(_classPrivateFieldLooseBase(fn().Foo, _self)[_self].self, _m)[_m](); + (_ref7 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self]) === null || _ref7 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref7.self, _m)[_m](); + (_ref8 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self].self) === null || _ref8 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref8.self, _m)[_m](); + (_self3 = (fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self])?.self) === null || _self3 === void 0 ? void 0 : _classPrivateFieldLooseBase(_self3.self, _m)[_m](); + fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(_classPrivateFieldLooseBase(fn().Foo, _self)[_self].getSelf(), _m)[_m](); + (_ref9 = fn === null || fn === void 0 ? void 0 : (_classPrivateFieldLoo3 = _classPrivateFieldLooseBase(fn().Foo, _self)[_self]).getSelf) === null || _ref9 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref9.call(_classPrivateFieldLoo3), _m)[_m](); + (_ref10 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self]) === null || _ref10 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref10.getSelf(), _m)[_m](); + (_getSelf4 = (_ref11 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self])?.getSelf) === null || _getSelf4 === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf4.call(_ref11), _m)[_m](); + (_ref12 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self].getSelf()) === null || _ref12 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref12.self, _m)[_m](); + (_call2 = (fn === null || fn === void 0 ? void 0 : (_classPrivateFieldLoo4 = _classPrivateFieldLooseBase(fn().Foo, _self)[_self]).getSelf)?.call(_classPrivateFieldLoo4)) === null || _call2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_call2.self, _m)[_m](); + (_getSelf5 = (fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self])?.getSelf()) === null || _getSelf5 === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf5.self, _m)[_m](); + (_getSelf6 = (fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self])?.getSelf?.()) === null || _getSelf6 === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf6.self, _m)[_m](); + } + +} + +var _x = _classPrivateFieldLooseKey("x"); + +var _m = _classPrivateFieldLooseKey("m"); + +var _self = _classPrivateFieldLooseKey("self"); + +Object.defineProperty(Foo, _x, { + writable: true, + value: 1 +}); +Object.defineProperty(Foo, _m, { + writable: true, + value: function () { + return _classPrivateFieldLooseBase(this, _x)[_x]; + } +}); +Object.defineProperty(Foo, _self, { + writable: true, + value: Foo +}); +Foo.self = Foo; +Foo.test(); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-optional-property-with-transform/exec.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-optional-property-with-transform/exec.js new file mode 100644 index 000000000000..0d627ac9e0d4 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-optional-property-with-transform/exec.js @@ -0,0 +1,125 @@ +class Foo { + static #x = 1; + static #self = Foo; + static self = Foo; + static getSelf() { return this } + + static test() { + const o = { Foo: Foo }; + const deep = { very: { o } }; + function fn() { + return o; + } + function fnDeep() { + return deep; + } + + expect(Foo?.#x).toEqual(1); + expect(Foo?.#x.toString).toEqual(1..toString); + expect(Foo?.#x.toString()).toEqual('1'); + + expect(o?.Foo?.#x).toEqual(1); + expect(o?.Foo?.#x.toString).toEqual(1..toString); + expect(o?.Foo?.#x.toString()).toEqual('1'); + + expect(deep?.very.o?.Foo?.#x).toEqual(1); + expect(deep?.very.o?.Foo?.#x.toString).toEqual(1..toString); + expect(deep?.very.o?.Foo?.#x.toString()).toEqual('1'); + + expect(o?.Foo.#self?.#x).toEqual(1); + expect(o?.Foo.#self.self?.#x).toEqual(1); + expect(o?.Foo.#self?.self?.#x).toEqual(1); + expect(o?.Foo.#self.self?.self?.#x).toEqual(1); + expect(o?.Foo.#self?.self?.self?.#x).toEqual(1); + + expect(o?.Foo.#self.getSelf()?.#x).toEqual(1); + expect(o?.Foo.#self.getSelf?.()?.#x).toEqual(1); + expect(o?.Foo.#self?.getSelf()?.#x).toEqual(1); + expect(o?.Foo.#self?.getSelf?.()?.#x).toEqual(1); + expect(o?.Foo.#self.getSelf()?.self?.#x).toEqual(1); + expect(o?.Foo.#self.getSelf?.()?.self?.#x).toEqual(1); + expect(o?.Foo.#self?.getSelf()?.self?.#x).toEqual(1); + expect(o?.Foo.#self?.getSelf?.()?.self?.#x).toEqual(1); + + expect(fn?.().Foo?.#x).toEqual(1); + expect(fn?.().Foo?.#x.toString).toEqual(1..toString); + expect(fn?.().Foo?.#x.toString()).toEqual('1'); + + expect(fnDeep?.().very.o?.Foo?.#x).toEqual(1); + expect(fnDeep?.().very.o?.Foo?.#x.toString).toEqual(1..toString); + expect(fnDeep?.().very.o?.Foo?.#x.toString()).toEqual('1'); + + expect(fn?.().Foo.#self?.#x).toEqual(1); + expect(fn?.().Foo.#self.self?.#x).toEqual(1); + expect(fn?.().Foo.#self?.self?.#x).toEqual(1); + expect(fn?.().Foo.#self.self?.self?.#x).toEqual(1); + expect(fn?.().Foo.#self?.self?.self?.#x).toEqual(1); + + expect(fn?.().Foo.#self.getSelf()?.#x).toEqual(1); + expect(fn?.().Foo.#self.getSelf?.()?.#x).toEqual(1); + expect(fn?.().Foo.#self?.getSelf()?.#x).toEqual(1); + expect(fn?.().Foo.#self?.getSelf?.()?.#x).toEqual(1); + expect(fn?.().Foo.#self.getSelf()?.self?.#x).toEqual(1); + expect(fn?.().Foo.#self.getSelf?.()?.self?.#x).toEqual(1); + expect(fn?.().Foo.#self?.getSelf()?.self?.#x).toEqual(1); + expect(fn?.().Foo.#self?.getSelf?.()?.self?.#x).toEqual(1); + } + + static testNull() { + const o = null;; + const deep = { very: { o } }; + const fn = null; + function fnDeep() { + return deep; + } + + expect(o?.Foo?.#x).toEqual(undefined); + expect(o?.Foo?.#x.toString).toEqual(undefined); + expect(o?.Foo?.#x.toString()).toEqual(undefined); + + expect(deep?.very.o?.Foo?.#x).toEqual(undefined); + expect(deep?.very.o?.Foo?.#x.toString).toEqual(undefined); + expect(deep?.very.o?.Foo?.#x.toString()).toEqual(undefined); + + expect(o?.Foo.#self?.#x).toEqual(undefined); + expect(o?.Foo.#self.self?.#x).toEqual(undefined); + expect(o?.Foo.#self?.self?.#x).toEqual(undefined); + expect(o?.Foo.#self.self?.self?.#x).toEqual(undefined); + expect(o?.Foo.#self?.self?.self?.#x).toEqual(undefined); + + expect(o?.Foo.#self.getSelf()?.#x).toEqual(undefined); + expect(o?.Foo.#self.getSelf?.()?.#x).toEqual(undefined); + expect(o?.Foo.#self?.getSelf()?.#x).toEqual(undefined); + expect(o?.Foo.#self?.getSelf?.()?.#x).toEqual(undefined); + expect(o?.Foo.#self.getSelf()?.self?.#x).toEqual(undefined); + expect(o?.Foo.#self.getSelf?.()?.self?.#x).toEqual(undefined); + expect(o?.Foo.#self?.getSelf()?.self?.#x).toEqual(undefined); + expect(o?.Foo.#self?.getSelf?.()?.self?.#x).toEqual(undefined); + + expect(fn?.().Foo?.#x).toEqual(undefined); + expect(fn?.().Foo?.#x.toString).toEqual(undefined); + expect(fn?.().Foo?.#x.toString()).toEqual(undefined); + + expect(fnDeep?.().very.o?.Foo?.#x).toEqual(undefined); + expect(fnDeep?.().very.o?.Foo?.#x.toString).toEqual(undefined); + expect(fnDeep?.().very.o?.Foo?.#x.toString()).toEqual(undefined); + + expect(fn?.().Foo.#self?.#x).toEqual(undefined); + expect(fn?.().Foo.#self.self?.#x).toEqual(undefined); + expect(fn?.().Foo.#self?.self?.#x).toEqual(undefined); + expect(fn?.().Foo.#self.self?.self?.#x).toEqual(undefined); + expect(fn?.().Foo.#self?.self?.self?.#x).toEqual(undefined); + + expect(fn?.().Foo.#self.getSelf()?.#x).toEqual(undefined); + expect(fn?.().Foo.#self.getSelf?.()?.#x).toEqual(undefined); + expect(fn?.().Foo.#self?.getSelf()?.#x).toEqual(undefined); + expect(fn?.().Foo.#self?.getSelf?.()?.#x).toEqual(undefined); + expect(fn?.().Foo.#self.getSelf()?.self?.#x).toEqual(undefined); + expect(fn?.().Foo.#self.getSelf?.()?.self?.#x).toEqual(undefined); + expect(fn?.().Foo.#self?.getSelf()?.self?.#x).toEqual(undefined); + expect(fn?.().Foo.#self?.getSelf?.()?.self?.#x).toEqual(undefined); + } +} + +Foo.test(); +Foo.testNull(); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-optional-property-with-transform/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-optional-property-with-transform/input.js new file mode 100644 index 000000000000..968eeaf3cb44 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-optional-property-with-transform/input.js @@ -0,0 +1,69 @@ +class Foo { + static #x = 1; + static #self = Foo; + static self = Foo; + static getSelf() { return this } + + static test() { + const o = { Foo: Foo }; + const deep = { very: { o } }; + function fn() { + return o; + } + function fnDeep() { + return deep; + } + + Foo?.#x; + Foo?.#x.toString; + Foo?.#x.toString(); + + o?.Foo?.#x; + o?.Foo?.#x.toString; + o?.Foo?.#x.toString(); + + deep?.very.o?.Foo?.#x; + deep?.very.o?.Foo?.#x.toString; + deep?.very.o?.Foo?.#x.toString(); + + o?.Foo.#self?.#x; + o?.Foo.#self.self?.#x; + o?.Foo.#self?.self?.#x; + o?.Foo.#self.self?.self?.#x; + o?.Foo.#self?.self?.self?.#x; + + o?.Foo.#self.getSelf()?.#x; + o?.Foo.#self.getSelf?.()?.#x; + o?.Foo.#self?.getSelf()?.#x; + o?.Foo.#self?.getSelf?.()?.#x; + o?.Foo.#self.getSelf()?.self?.#x; + o?.Foo.#self.getSelf?.()?.self?.#x; + o?.Foo.#self?.getSelf()?.self?.#x; + o?.Foo.#self?.getSelf?.()?.self?.#x; + + fn?.().Foo?.#x; + fn?.().Foo?.#x.toString; + fn?.().Foo?.#x.toString(); + + fnDeep?.().very.o?.Foo?.#x; + fnDeep?.().very.o?.Foo?.#x.toString; + fnDeep?.().very.o?.Foo?.#x.toString(); + + fn?.().Foo.#self?.#x; + fn?.().Foo.#self.self?.#x; + fn?.().Foo.#self?.self?.#x; + fn?.().Foo.#self.self?.self?.#x; + fn?.().Foo.#self?.self?.self?.#x; + + fn?.().Foo.#self.getSelf()?.#x; + fn?.().Foo.#self.getSelf?.()?.#x; + fn?.().Foo.#self?.getSelf()?.#x; + fn?.().Foo.#self?.getSelf?.()?.#x; + fn?.().Foo.#self.getSelf()?.self?.#x; + fn?.().Foo.#self.getSelf?.()?.self?.#x; + fn?.().Foo.#self?.getSelf()?.self?.#x; + fn?.().Foo.#self?.getSelf?.()?.self?.#x; + } +} + +Foo.test(); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-optional-property-with-transform/options.json b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-optional-property-with-transform/options.json new file mode 100644 index 000000000000..124133b5af2b --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-optional-property-with-transform/options.json @@ -0,0 +1,6 @@ +{ + "plugins": [ + ["proposal-optional-chaining", { "loose": true }], + ["proposal-class-properties", { "loose": true }] + ] +} diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-optional-property-with-transform/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-optional-property-with-transform/output.js new file mode 100644 index 000000000000..b1ede3a8c4c9 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-optional-property-with-transform/output.js @@ -0,0 +1,90 @@ +function _classPrivateFieldLooseBase(receiver, privateKey) { if (!Object.prototype.hasOwnProperty.call(receiver, privateKey)) { throw new TypeError("attempted to use private field on non-instance"); } return receiver; } + +var id = 0; + +function _classPrivateFieldLooseKey(name) { return "__private_" + id++ + "_" + name; } + +class Foo { + static getSelf() { + return this; + } + + static test() { + var _o$Foo, _o$Foo2, _o$Foo3, _deep$very$o$Foo, _deep$very$o$Foo2, _deep$very$o$Foo3, _ref, _ref2, _self2, _self3, _self$self, _ref3, _classPrivateFieldLoo, _call, _getSelf, _getSelf2, _self4, _classPrivateFieldLoo2, _call$self, _getSelf$self, _getSelf$self2, _fn$Foo, _fn$Foo2, _fn$Foo3, _fnDeep$very$o$Foo, _fnDeep$very$o$Foo2, _fnDeep$very$o$Foo3, _ref4, _ref5, _self5, _self6, _self$self2, _ref6, _classPrivateFieldLoo3, _call2, _getSelf3, _getSelf4, _self7, _classPrivateFieldLoo4, _call$self2, _getSelf$self3, _getSelf$self4, _deep$very$o, _deep$very$o2, _deep$very$o3, _ref7, _ref8, _ref9, _ref9$self, _ref10, _ref11, _ref12, _ref13, _ref14, _ref14$call, _ref15, _ref15$getSelf, _ref16, _ref16$getSelf, _fnDeep$very$o, _fnDeep$very$o2, _fnDeep$very$o3, _ref17, _ref18, _ref19, _ref19$self, _ref20, _ref21, _ref22, _ref23, _ref24, _ref24$call, _ref25, _ref25$getSelf, _ref26, _ref26$getSelf; + + const o = { + Foo: Foo + }; + const deep = { + very: { + o + } + }; + + function fn() { + return o; + } + + function fnDeep() { + return deep; + } + + Foo === null || Foo === void 0 ? void 0 : _classPrivateFieldLooseBase(Foo, _x)[_x]; + Foo === null || Foo === void 0 ? void 0 : _classPrivateFieldLooseBase(Foo, _x)[_x].toString; + Foo === null || Foo === void 0 ? void 0 : _classPrivateFieldLooseBase(Foo, _x)[_x].toString(); + (_o$Foo = o == null ? void 0 : o.Foo) === null || _o$Foo === void 0 ? void 0 : _classPrivateFieldLooseBase(_o$Foo, _x)[_x]; + (_o$Foo2 = o == null ? void 0 : o.Foo) === null || _o$Foo2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_o$Foo2, _x)[_x].toString; + (_o$Foo3 = o == null ? void 0 : o.Foo) === null || _o$Foo3 === void 0 ? void 0 : _classPrivateFieldLooseBase(_o$Foo3, _x)[_x].toString(); + (_deep$very$o$Foo = deep == null ? void 0 : (_deep$very$o = deep.very.o) == null ? void 0 : _deep$very$o.Foo) === null || _deep$very$o$Foo === void 0 ? void 0 : _classPrivateFieldLooseBase(_deep$very$o$Foo, _x)[_x]; + (_deep$very$o$Foo2 = deep == null ? void 0 : (_deep$very$o2 = deep.very.o) == null ? void 0 : _deep$very$o2.Foo) === null || _deep$very$o$Foo2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_deep$very$o$Foo2, _x)[_x].toString; + (_deep$very$o$Foo3 = deep == null ? void 0 : (_deep$very$o3 = deep.very.o) == null ? void 0 : _deep$very$o3.Foo) === null || _deep$very$o$Foo3 === void 0 ? void 0 : _classPrivateFieldLooseBase(_deep$very$o$Foo3, _x)[_x].toString(); + (_ref = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self]) === null || _ref === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref, _x)[_x]; + (_ref2 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self].self) === null || _ref2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref2, _x)[_x]; + (_self2 = (_ref7 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self]) == null ? void 0 : _ref7.self) === null || _self2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_self2, _x)[_x]; + (_self3 = (_ref8 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self].self) == null ? void 0 : _ref8.self) === null || _self3 === void 0 ? void 0 : _classPrivateFieldLooseBase(_self3, _x)[_x]; + (_self$self = (_ref9 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self]) == null ? void 0 : (_ref9$self = _ref9.self) == null ? void 0 : _ref9$self.self) === null || _self$self === void 0 ? void 0 : _classPrivateFieldLooseBase(_self$self, _x)[_x]; + (_ref3 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self].getSelf()) === null || _ref3 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref3, _x)[_x]; + (_call = (_ref10 = o === null || o === void 0 ? void 0 : (_classPrivateFieldLoo = _classPrivateFieldLooseBase(o.Foo, _self)[_self]).getSelf) == null ? void 0 : _ref10.call(_classPrivateFieldLoo)) === null || _call === void 0 ? void 0 : _classPrivateFieldLooseBase(_call, _x)[_x]; + (_getSelf = (_ref11 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self]) == null ? void 0 : _ref11.getSelf()) === null || _getSelf === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf, _x)[_x]; + (_getSelf2 = (_ref12 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self]) == null ? void 0 : _ref12.getSelf == null ? void 0 : _ref12.getSelf()) === null || _getSelf2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf2, _x)[_x]; + (_self4 = (_ref13 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self].getSelf()) == null ? void 0 : _ref13.self) === null || _self4 === void 0 ? void 0 : _classPrivateFieldLooseBase(_self4, _x)[_x]; + (_call$self = (_ref14 = o === null || o === void 0 ? void 0 : (_classPrivateFieldLoo2 = _classPrivateFieldLooseBase(o.Foo, _self)[_self]).getSelf) == null ? void 0 : (_ref14$call = _ref14.call(_classPrivateFieldLoo2)) == null ? void 0 : _ref14$call.self) === null || _call$self === void 0 ? void 0 : _classPrivateFieldLooseBase(_call$self, _x)[_x]; + (_getSelf$self = (_ref15 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self]) == null ? void 0 : (_ref15$getSelf = _ref15.getSelf()) == null ? void 0 : _ref15$getSelf.self) === null || _getSelf$self === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf$self, _x)[_x]; + (_getSelf$self2 = (_ref16 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self]) == null ? void 0 : _ref16.getSelf == null ? void 0 : (_ref16$getSelf = _ref16.getSelf()) == null ? void 0 : _ref16$getSelf.self) === null || _getSelf$self2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf$self2, _x)[_x]; + (_fn$Foo = fn == null ? void 0 : fn().Foo) === null || _fn$Foo === void 0 ? void 0 : _classPrivateFieldLooseBase(_fn$Foo, _x)[_x]; + (_fn$Foo2 = fn == null ? void 0 : fn().Foo) === null || _fn$Foo2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_fn$Foo2, _x)[_x].toString; + (_fn$Foo3 = fn == null ? void 0 : fn().Foo) === null || _fn$Foo3 === void 0 ? void 0 : _classPrivateFieldLooseBase(_fn$Foo3, _x)[_x].toString(); + (_fnDeep$very$o$Foo = fnDeep == null ? void 0 : (_fnDeep$very$o = fnDeep().very.o) == null ? void 0 : _fnDeep$very$o.Foo) === null || _fnDeep$very$o$Foo === void 0 ? void 0 : _classPrivateFieldLooseBase(_fnDeep$very$o$Foo, _x)[_x]; + (_fnDeep$very$o$Foo2 = fnDeep == null ? void 0 : (_fnDeep$very$o2 = fnDeep().very.o) == null ? void 0 : _fnDeep$very$o2.Foo) === null || _fnDeep$very$o$Foo2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_fnDeep$very$o$Foo2, _x)[_x].toString; + (_fnDeep$very$o$Foo3 = fnDeep == null ? void 0 : (_fnDeep$very$o3 = fnDeep().very.o) == null ? void 0 : _fnDeep$very$o3.Foo) === null || _fnDeep$very$o$Foo3 === void 0 ? void 0 : _classPrivateFieldLooseBase(_fnDeep$very$o$Foo3, _x)[_x].toString(); + (_ref4 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self]) === null || _ref4 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref4, _x)[_x]; + (_ref5 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self].self) === null || _ref5 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref5, _x)[_x]; + (_self5 = (_ref17 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self]) == null ? void 0 : _ref17.self) === null || _self5 === void 0 ? void 0 : _classPrivateFieldLooseBase(_self5, _x)[_x]; + (_self6 = (_ref18 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self].self) == null ? void 0 : _ref18.self) === null || _self6 === void 0 ? void 0 : _classPrivateFieldLooseBase(_self6, _x)[_x]; + (_self$self2 = (_ref19 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self]) == null ? void 0 : (_ref19$self = _ref19.self) == null ? void 0 : _ref19$self.self) === null || _self$self2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_self$self2, _x)[_x]; + (_ref6 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self].getSelf()) === null || _ref6 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref6, _x)[_x]; + (_call2 = (_ref20 = fn === null || fn === void 0 ? void 0 : (_classPrivateFieldLoo3 = _classPrivateFieldLooseBase(fn().Foo, _self)[_self]).getSelf) == null ? void 0 : _ref20.call(_classPrivateFieldLoo3)) === null || _call2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_call2, _x)[_x]; + (_getSelf3 = (_ref21 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self]) == null ? void 0 : _ref21.getSelf()) === null || _getSelf3 === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf3, _x)[_x]; + (_getSelf4 = (_ref22 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self]) == null ? void 0 : _ref22.getSelf == null ? void 0 : _ref22.getSelf()) === null || _getSelf4 === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf4, _x)[_x]; + (_self7 = (_ref23 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self].getSelf()) == null ? void 0 : _ref23.self) === null || _self7 === void 0 ? void 0 : _classPrivateFieldLooseBase(_self7, _x)[_x]; + (_call$self2 = (_ref24 = fn === null || fn === void 0 ? void 0 : (_classPrivateFieldLoo4 = _classPrivateFieldLooseBase(fn().Foo, _self)[_self]).getSelf) == null ? void 0 : (_ref24$call = _ref24.call(_classPrivateFieldLoo4)) == null ? void 0 : _ref24$call.self) === null || _call$self2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_call$self2, _x)[_x]; + (_getSelf$self3 = (_ref25 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self]) == null ? void 0 : (_ref25$getSelf = _ref25.getSelf()) == null ? void 0 : _ref25$getSelf.self) === null || _getSelf$self3 === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf$self3, _x)[_x]; + (_getSelf$self4 = (_ref26 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self]) == null ? void 0 : _ref26.getSelf == null ? void 0 : (_ref26$getSelf = _ref26.getSelf()) == null ? void 0 : _ref26$getSelf.self) === null || _getSelf$self4 === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf$self4, _x)[_x]; + } + +} + +var _x = _classPrivateFieldLooseKey("x"); + +var _self = _classPrivateFieldLooseKey("self"); + +Object.defineProperty(Foo, _x, { + writable: true, + value: 1 +}); +Object.defineProperty(Foo, _self, { + writable: true, + value: Foo +}); +Foo.self = Foo; +Foo.test(); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-optional-property/exec.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-optional-property/exec.js new file mode 100644 index 000000000000..0d627ac9e0d4 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-optional-property/exec.js @@ -0,0 +1,125 @@ +class Foo { + static #x = 1; + static #self = Foo; + static self = Foo; + static getSelf() { return this } + + static test() { + const o = { Foo: Foo }; + const deep = { very: { o } }; + function fn() { + return o; + } + function fnDeep() { + return deep; + } + + expect(Foo?.#x).toEqual(1); + expect(Foo?.#x.toString).toEqual(1..toString); + expect(Foo?.#x.toString()).toEqual('1'); + + expect(o?.Foo?.#x).toEqual(1); + expect(o?.Foo?.#x.toString).toEqual(1..toString); + expect(o?.Foo?.#x.toString()).toEqual('1'); + + expect(deep?.very.o?.Foo?.#x).toEqual(1); + expect(deep?.very.o?.Foo?.#x.toString).toEqual(1..toString); + expect(deep?.very.o?.Foo?.#x.toString()).toEqual('1'); + + expect(o?.Foo.#self?.#x).toEqual(1); + expect(o?.Foo.#self.self?.#x).toEqual(1); + expect(o?.Foo.#self?.self?.#x).toEqual(1); + expect(o?.Foo.#self.self?.self?.#x).toEqual(1); + expect(o?.Foo.#self?.self?.self?.#x).toEqual(1); + + expect(o?.Foo.#self.getSelf()?.#x).toEqual(1); + expect(o?.Foo.#self.getSelf?.()?.#x).toEqual(1); + expect(o?.Foo.#self?.getSelf()?.#x).toEqual(1); + expect(o?.Foo.#self?.getSelf?.()?.#x).toEqual(1); + expect(o?.Foo.#self.getSelf()?.self?.#x).toEqual(1); + expect(o?.Foo.#self.getSelf?.()?.self?.#x).toEqual(1); + expect(o?.Foo.#self?.getSelf()?.self?.#x).toEqual(1); + expect(o?.Foo.#self?.getSelf?.()?.self?.#x).toEqual(1); + + expect(fn?.().Foo?.#x).toEqual(1); + expect(fn?.().Foo?.#x.toString).toEqual(1..toString); + expect(fn?.().Foo?.#x.toString()).toEqual('1'); + + expect(fnDeep?.().very.o?.Foo?.#x).toEqual(1); + expect(fnDeep?.().very.o?.Foo?.#x.toString).toEqual(1..toString); + expect(fnDeep?.().very.o?.Foo?.#x.toString()).toEqual('1'); + + expect(fn?.().Foo.#self?.#x).toEqual(1); + expect(fn?.().Foo.#self.self?.#x).toEqual(1); + expect(fn?.().Foo.#self?.self?.#x).toEqual(1); + expect(fn?.().Foo.#self.self?.self?.#x).toEqual(1); + expect(fn?.().Foo.#self?.self?.self?.#x).toEqual(1); + + expect(fn?.().Foo.#self.getSelf()?.#x).toEqual(1); + expect(fn?.().Foo.#self.getSelf?.()?.#x).toEqual(1); + expect(fn?.().Foo.#self?.getSelf()?.#x).toEqual(1); + expect(fn?.().Foo.#self?.getSelf?.()?.#x).toEqual(1); + expect(fn?.().Foo.#self.getSelf()?.self?.#x).toEqual(1); + expect(fn?.().Foo.#self.getSelf?.()?.self?.#x).toEqual(1); + expect(fn?.().Foo.#self?.getSelf()?.self?.#x).toEqual(1); + expect(fn?.().Foo.#self?.getSelf?.()?.self?.#x).toEqual(1); + } + + static testNull() { + const o = null;; + const deep = { very: { o } }; + const fn = null; + function fnDeep() { + return deep; + } + + expect(o?.Foo?.#x).toEqual(undefined); + expect(o?.Foo?.#x.toString).toEqual(undefined); + expect(o?.Foo?.#x.toString()).toEqual(undefined); + + expect(deep?.very.o?.Foo?.#x).toEqual(undefined); + expect(deep?.very.o?.Foo?.#x.toString).toEqual(undefined); + expect(deep?.very.o?.Foo?.#x.toString()).toEqual(undefined); + + expect(o?.Foo.#self?.#x).toEqual(undefined); + expect(o?.Foo.#self.self?.#x).toEqual(undefined); + expect(o?.Foo.#self?.self?.#x).toEqual(undefined); + expect(o?.Foo.#self.self?.self?.#x).toEqual(undefined); + expect(o?.Foo.#self?.self?.self?.#x).toEqual(undefined); + + expect(o?.Foo.#self.getSelf()?.#x).toEqual(undefined); + expect(o?.Foo.#self.getSelf?.()?.#x).toEqual(undefined); + expect(o?.Foo.#self?.getSelf()?.#x).toEqual(undefined); + expect(o?.Foo.#self?.getSelf?.()?.#x).toEqual(undefined); + expect(o?.Foo.#self.getSelf()?.self?.#x).toEqual(undefined); + expect(o?.Foo.#self.getSelf?.()?.self?.#x).toEqual(undefined); + expect(o?.Foo.#self?.getSelf()?.self?.#x).toEqual(undefined); + expect(o?.Foo.#self?.getSelf?.()?.self?.#x).toEqual(undefined); + + expect(fn?.().Foo?.#x).toEqual(undefined); + expect(fn?.().Foo?.#x.toString).toEqual(undefined); + expect(fn?.().Foo?.#x.toString()).toEqual(undefined); + + expect(fnDeep?.().very.o?.Foo?.#x).toEqual(undefined); + expect(fnDeep?.().very.o?.Foo?.#x.toString).toEqual(undefined); + expect(fnDeep?.().very.o?.Foo?.#x.toString()).toEqual(undefined); + + expect(fn?.().Foo.#self?.#x).toEqual(undefined); + expect(fn?.().Foo.#self.self?.#x).toEqual(undefined); + expect(fn?.().Foo.#self?.self?.#x).toEqual(undefined); + expect(fn?.().Foo.#self.self?.self?.#x).toEqual(undefined); + expect(fn?.().Foo.#self?.self?.self?.#x).toEqual(undefined); + + expect(fn?.().Foo.#self.getSelf()?.#x).toEqual(undefined); + expect(fn?.().Foo.#self.getSelf?.()?.#x).toEqual(undefined); + expect(fn?.().Foo.#self?.getSelf()?.#x).toEqual(undefined); + expect(fn?.().Foo.#self?.getSelf?.()?.#x).toEqual(undefined); + expect(fn?.().Foo.#self.getSelf()?.self?.#x).toEqual(undefined); + expect(fn?.().Foo.#self.getSelf?.()?.self?.#x).toEqual(undefined); + expect(fn?.().Foo.#self?.getSelf()?.self?.#x).toEqual(undefined); + expect(fn?.().Foo.#self?.getSelf?.()?.self?.#x).toEqual(undefined); + } +} + +Foo.test(); +Foo.testNull(); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-optional-property/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-optional-property/input.js new file mode 100644 index 000000000000..aecba329a27a --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-optional-property/input.js @@ -0,0 +1,70 @@ +class Foo { + static #x = 1; + static #self = Foo; + static self = Foo; + static getSelf() { return this } + + static test() { + const o = { Foo: Foo }; + const deep = { very: { o } }; + function fn() { + return o; + } + function fnDeep() { + return deep; + } + + Foo?.#x; + Foo?.#x.toString; + Foo?.#x.toString(); + + o?.Foo?.#x; + o?.Foo?.#x.toString; + o?.Foo?.#x.toString(); + + deep?.very.o?.Foo?.#x; + deep?.very.o?.Foo?.#x.toString; + deep?.very.o?.Foo?.#x.toString(); + + o?.Foo.#self?.#x; + o?.Foo.#self.self?.#x; + o?.Foo.#self?.self?.#x; + o?.Foo.#self.self?.self?.#x; + o?.Foo.#self?.self?.self?.#x; + + o?.Foo.#self.getSelf()?.#x; + o?.Foo.#self.getSelf?.()?.#x; + o?.Foo.#self?.getSelf()?.#x; + o?.Foo.#self?.getSelf?.()?.#x; + o?.Foo.#self.getSelf()?.self?.#x; + o?.Foo.#self.getSelf?.()?.self?.#x; + o?.Foo.#self?.getSelf()?.self?.#x; + o?.Foo.#self?.getSelf?.()?.self?.#x; + + fn?.().Foo?.#x; + fn?.().Foo?.#x.toString; + fn?.().Foo?.#x.toString(); + + fnDeep?.().very.o?.Foo?.#x; + fnDeep?.().very.o?.Foo?.#x.toString; + fnDeep?.().very.o?.Foo?.#x.toString(); + + fn?.().Foo.#self?.#x; + fn?.().Foo.#self.self?.#x; + fn?.().Foo.#self?.self?.#x; + fn?.().Foo.#self.self?.self?.#x; + fn?.().Foo.#self?.self?.self?.#x; + + fn?.().Foo.#self.getSelf()?.#x; + fn?.().Foo.#self.getSelf?.()?.#x; + fn?.().Foo.#self?.getSelf()?.#x; + fn?.().Foo.#self?.getSelf?.()?.#x; + fn?.().Foo.#self.getSelf()?.self?.#x; + fn?.().Foo.#self.getSelf?.()?.self?.#x; + fn?.().Foo.#self?.getSelf()?.self?.#x; + fn?.().Foo.#self?.getSelf?.()?.self?.#x; + + } +} + +Foo.test(); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-optional-property/options.json b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-optional-property/options.json new file mode 100644 index 000000000000..2d5cfe8e8095 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-optional-property/options.json @@ -0,0 +1,4 @@ +{ + "plugins": [["proposal-class-properties", { "loose": true }]], + "minNodeVersion": "14.0.0" +} diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-optional-property/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-optional-property/output.js new file mode 100644 index 000000000000..d3912701eb1a --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private-loose/optional-chain-optional-property/output.js @@ -0,0 +1,90 @@ +function _classPrivateFieldLooseBase(receiver, privateKey) { if (!Object.prototype.hasOwnProperty.call(receiver, privateKey)) { throw new TypeError("attempted to use private field on non-instance"); } return receiver; } + +var id = 0; + +function _classPrivateFieldLooseKey(name) { return "__private_" + id++ + "_" + name; } + +class Foo { + static getSelf() { + return this; + } + + static test() { + var _o$Foo, _o$Foo2, _o$Foo3, _deep$very$o$Foo, _deep$very$o$Foo2, _deep$very$o$Foo3, _ref, _ref2, _self2, _self3, _self$self, _ref3, _classPrivateFieldLoo, _call, _getSelf, _getSelf2, _self4, _classPrivateFieldLoo2, _call$self, _getSelf$self, _getSelf$self2, _fn$Foo, _fn$Foo2, _fn$Foo3, _fnDeep$very$o$Foo, _fnDeep$very$o$Foo2, _fnDeep$very$o$Foo3, _ref4, _ref5, _self5, _self6, _self$self2, _ref6, _classPrivateFieldLoo3, _call2, _getSelf3, _getSelf4, _self7, _classPrivateFieldLoo4, _call$self2, _getSelf$self3, _getSelf$self4; + + const o = { + Foo: Foo + }; + const deep = { + very: { + o + } + }; + + function fn() { + return o; + } + + function fnDeep() { + return deep; + } + + Foo === null || Foo === void 0 ? void 0 : _classPrivateFieldLooseBase(Foo, _x)[_x]; + Foo === null || Foo === void 0 ? void 0 : _classPrivateFieldLooseBase(Foo, _x)[_x].toString; + Foo === null || Foo === void 0 ? void 0 : _classPrivateFieldLooseBase(Foo, _x)[_x].toString(); + (_o$Foo = o?.Foo) === null || _o$Foo === void 0 ? void 0 : _classPrivateFieldLooseBase(_o$Foo, _x)[_x]; + (_o$Foo2 = o?.Foo) === null || _o$Foo2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_o$Foo2, _x)[_x].toString; + (_o$Foo3 = o?.Foo) === null || _o$Foo3 === void 0 ? void 0 : _classPrivateFieldLooseBase(_o$Foo3, _x)[_x].toString(); + (_deep$very$o$Foo = deep?.very.o?.Foo) === null || _deep$very$o$Foo === void 0 ? void 0 : _classPrivateFieldLooseBase(_deep$very$o$Foo, _x)[_x]; + (_deep$very$o$Foo2 = deep?.very.o?.Foo) === null || _deep$very$o$Foo2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_deep$very$o$Foo2, _x)[_x].toString; + (_deep$very$o$Foo3 = deep?.very.o?.Foo) === null || _deep$very$o$Foo3 === void 0 ? void 0 : _classPrivateFieldLooseBase(_deep$very$o$Foo3, _x)[_x].toString(); + (_ref = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self]) === null || _ref === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref, _x)[_x]; + (_ref2 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self].self) === null || _ref2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref2, _x)[_x]; + (_self2 = (o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self])?.self) === null || _self2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_self2, _x)[_x]; + (_self3 = (o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self].self)?.self) === null || _self3 === void 0 ? void 0 : _classPrivateFieldLooseBase(_self3, _x)[_x]; + (_self$self = (o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self])?.self?.self) === null || _self$self === void 0 ? void 0 : _classPrivateFieldLooseBase(_self$self, _x)[_x]; + (_ref3 = o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self].getSelf()) === null || _ref3 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref3, _x)[_x]; + (_call = (o === null || o === void 0 ? void 0 : (_classPrivateFieldLoo = _classPrivateFieldLooseBase(o.Foo, _self)[_self]).getSelf)?.call(_classPrivateFieldLoo)) === null || _call === void 0 ? void 0 : _classPrivateFieldLooseBase(_call, _x)[_x]; + (_getSelf = (o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self])?.getSelf()) === null || _getSelf === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf, _x)[_x]; + (_getSelf2 = (o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self])?.getSelf?.()) === null || _getSelf2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf2, _x)[_x]; + (_self4 = (o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self].getSelf())?.self) === null || _self4 === void 0 ? void 0 : _classPrivateFieldLooseBase(_self4, _x)[_x]; + (_call$self = (o === null || o === void 0 ? void 0 : (_classPrivateFieldLoo2 = _classPrivateFieldLooseBase(o.Foo, _self)[_self]).getSelf)?.call(_classPrivateFieldLoo2)?.self) === null || _call$self === void 0 ? void 0 : _classPrivateFieldLooseBase(_call$self, _x)[_x]; + (_getSelf$self = (o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self])?.getSelf()?.self) === null || _getSelf$self === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf$self, _x)[_x]; + (_getSelf$self2 = (o === null || o === void 0 ? void 0 : _classPrivateFieldLooseBase(o.Foo, _self)[_self])?.getSelf?.()?.self) === null || _getSelf$self2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf$self2, _x)[_x]; + (_fn$Foo = fn?.().Foo) === null || _fn$Foo === void 0 ? void 0 : _classPrivateFieldLooseBase(_fn$Foo, _x)[_x]; + (_fn$Foo2 = fn?.().Foo) === null || _fn$Foo2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_fn$Foo2, _x)[_x].toString; + (_fn$Foo3 = fn?.().Foo) === null || _fn$Foo3 === void 0 ? void 0 : _classPrivateFieldLooseBase(_fn$Foo3, _x)[_x].toString(); + (_fnDeep$very$o$Foo = fnDeep?.().very.o?.Foo) === null || _fnDeep$very$o$Foo === void 0 ? void 0 : _classPrivateFieldLooseBase(_fnDeep$very$o$Foo, _x)[_x]; + (_fnDeep$very$o$Foo2 = fnDeep?.().very.o?.Foo) === null || _fnDeep$very$o$Foo2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_fnDeep$very$o$Foo2, _x)[_x].toString; + (_fnDeep$very$o$Foo3 = fnDeep?.().very.o?.Foo) === null || _fnDeep$very$o$Foo3 === void 0 ? void 0 : _classPrivateFieldLooseBase(_fnDeep$very$o$Foo3, _x)[_x].toString(); + (_ref4 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self]) === null || _ref4 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref4, _x)[_x]; + (_ref5 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self].self) === null || _ref5 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref5, _x)[_x]; + (_self5 = (fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self])?.self) === null || _self5 === void 0 ? void 0 : _classPrivateFieldLooseBase(_self5, _x)[_x]; + (_self6 = (fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self].self)?.self) === null || _self6 === void 0 ? void 0 : _classPrivateFieldLooseBase(_self6, _x)[_x]; + (_self$self2 = (fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self])?.self?.self) === null || _self$self2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_self$self2, _x)[_x]; + (_ref6 = fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self].getSelf()) === null || _ref6 === void 0 ? void 0 : _classPrivateFieldLooseBase(_ref6, _x)[_x]; + (_call2 = (fn === null || fn === void 0 ? void 0 : (_classPrivateFieldLoo3 = _classPrivateFieldLooseBase(fn().Foo, _self)[_self]).getSelf)?.call(_classPrivateFieldLoo3)) === null || _call2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_call2, _x)[_x]; + (_getSelf3 = (fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self])?.getSelf()) === null || _getSelf3 === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf3, _x)[_x]; + (_getSelf4 = (fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self])?.getSelf?.()) === null || _getSelf4 === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf4, _x)[_x]; + (_self7 = (fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self].getSelf())?.self) === null || _self7 === void 0 ? void 0 : _classPrivateFieldLooseBase(_self7, _x)[_x]; + (_call$self2 = (fn === null || fn === void 0 ? void 0 : (_classPrivateFieldLoo4 = _classPrivateFieldLooseBase(fn().Foo, _self)[_self]).getSelf)?.call(_classPrivateFieldLoo4)?.self) === null || _call$self2 === void 0 ? void 0 : _classPrivateFieldLooseBase(_call$self2, _x)[_x]; + (_getSelf$self3 = (fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self])?.getSelf()?.self) === null || _getSelf$self3 === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf$self3, _x)[_x]; + (_getSelf$self4 = (fn === null || fn === void 0 ? void 0 : _classPrivateFieldLooseBase(fn().Foo, _self)[_self])?.getSelf?.()?.self) === null || _getSelf$self4 === void 0 ? void 0 : _classPrivateFieldLooseBase(_getSelf$self4, _x)[_x]; + } + +} + +var _x = _classPrivateFieldLooseKey("x"); + +var _self = _classPrivateFieldLooseKey("self"); + +Object.defineProperty(Foo, _x, { + writable: true, + value: 1 +}); +Object.defineProperty(Foo, _self, { + writable: true, + value: Foo +}); +Foo.self = Foo; +Foo.test(); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-before-member-call-with-transform/exec.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-before-member-call-with-transform/exec.js new file mode 100644 index 000000000000..13cc95662d95 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-before-member-call-with-transform/exec.js @@ -0,0 +1,122 @@ +class Foo { + static #x = 1; + static #m = function() { return this.#x; }; + static #self = Foo; + static self = Foo; + static getSelf() { return this } + + static test() { + const o = { Foo: Foo }; + const deep = { very: { o } }; + function fn() { + return o; + } + function fnDeep() { + return deep; + } + + expect(o?.Foo.#m()).toEqual(1); + expect(o?.Foo.#m().toString).toEqual(1..toString); + expect(o?.Foo.#m().toString()).toEqual('1'); + + expect(deep?.very.o?.Foo.#m()).toEqual(1); + expect(deep?.very.o?.Foo.#m().toString).toEqual(1..toString); + expect(deep?.very.o?.Foo.#m().toString()).toEqual('1'); + + expect(o?.Foo.#self.#m()).toEqual(1); + expect(o?.Foo.#self.self.#m()).toEqual(1); + expect(o?.Foo.#self?.self.#m()).toEqual(1); + expect(o?.Foo.#self.self?.self.#m()).toEqual(1); + expect(o?.Foo.#self?.self?.self.#m()).toEqual(1); + + expect(o?.Foo.#self.getSelf().#m()).toEqual(1); + expect(o?.Foo.#self.getSelf?.().#m()).toEqual(1); + expect(o?.Foo.#self?.getSelf().#m()).toEqual(1); + expect(o?.Foo.#self?.getSelf?.().#m()).toEqual(1); + expect(o?.Foo.#self.getSelf()?.self.#m()).toEqual(1); + expect(o?.Foo.#self.getSelf?.()?.self.#m()).toEqual(1); + expect(o?.Foo.#self?.getSelf()?.self.#m()).toEqual(1); + expect(o?.Foo.#self?.getSelf?.()?.self.#m()).toEqual(1); + + expect(fn?.().Foo.#m()).toEqual(1); + expect(fn?.().Foo.#m().toString).toEqual(1..toString); + expect(fn?.().Foo.#m().toString()).toEqual('1'); + + expect(fnDeep?.().very.o?.Foo.#m()).toEqual(1); + expect(fnDeep?.().very.o?.Foo.#m().toString).toEqual(1..toString); + expect(fnDeep?.().very.o?.Foo.#m().toString()).toEqual('1'); + + expect(fn?.().Foo.#self.#m()).toEqual(1); + expect(fn?.().Foo.#self.self.#m()).toEqual(1); + expect(fn?.().Foo.#self?.self.#m()).toEqual(1); + expect(fn?.().Foo.#self.self?.self.#m()).toEqual(1); + expect(fn?.().Foo.#self?.self?.self.#m()).toEqual(1); + + expect(fn?.().Foo.#self.getSelf().#m()).toEqual(1); + expect(fn?.().Foo.#self.getSelf?.().#m()).toEqual(1); + expect(fn?.().Foo.#self?.getSelf().#m()).toEqual(1); + expect(fn?.().Foo.#self?.getSelf?.().#m()).toEqual(1); + expect(fn?.().Foo.#self.getSelf()?.self.#m()).toEqual(1); + expect(fn?.().Foo.#self.getSelf?.()?.self.#m()).toEqual(1); + expect(fn?.().Foo.#self?.getSelf()?.self.#m()).toEqual(1); + expect(fn?.().Foo.#self?.getSelf?.()?.self.#m()).toEqual(1); + } + + static testNull() { + const o = null;; + const deep = { very: { o } }; + const fn = null; + function fnDeep() { + return deep; + } + + expect(o?.Foo.#m()).toEqual(undefined); + expect(o?.Foo.#m().toString).toEqual(undefined); + expect(o?.Foo.#m().toString()).toEqual(undefined); + + expect(deep?.very.o?.Foo.#m()).toEqual(undefined); + expect(deep?.very.o?.Foo.#m().toString).toEqual(undefined); + expect(deep?.very.o?.Foo.#m().toString()).toEqual(undefined); + + expect(o?.Foo.#self.#m()).toEqual(undefined); + expect(o?.Foo.#self.self.#m()).toEqual(undefined); + expect(o?.Foo.#self?.self.#m()).toEqual(undefined); + expect(o?.Foo.#self.self?.self.#m()).toEqual(undefined); + expect(o?.Foo.#self?.self?.self.#m()).toEqual(undefined); + + expect(o?.Foo.#self.getSelf().#m()).toEqual(undefined); + expect(o?.Foo.#self.getSelf?.().#m()).toEqual(undefined); + expect(o?.Foo.#self?.getSelf().#m()).toEqual(undefined); + expect(o?.Foo.#self?.getSelf?.().#m()).toEqual(undefined); + expect(o?.Foo.#self.getSelf()?.self.#m()).toEqual(undefined); + expect(o?.Foo.#self.getSelf?.()?.self.#m()).toEqual(undefined); + expect(o?.Foo.#self?.getSelf()?.self.#m()).toEqual(undefined); + expect(o?.Foo.#self?.getSelf?.()?.self.#m()).toEqual(undefined); + + expect(fn?.().Foo.#m()).toEqual(undefined); + expect(fn?.().Foo.#m().toString).toEqual(undefined); + expect(fn?.().Foo.#m().toString()).toEqual(undefined); + + expect(fnDeep?.().very.o?.Foo.#m()).toEqual(undefined); + expect(fnDeep?.().very.o?.Foo.#m().toString).toEqual(undefined); + expect(fnDeep?.().very.o?.Foo.#m().toString()).toEqual(undefined); + + expect(fn?.().Foo.#self.#m()).toEqual(undefined); + expect(fn?.().Foo.#self.self.#m()).toEqual(undefined); + expect(fn?.().Foo.#self?.self.#m()).toEqual(undefined); + expect(fn?.().Foo.#self.self?.self.#m()).toEqual(undefined); + expect(fn?.().Foo.#self?.self?.self.#m()).toEqual(undefined); + + expect(fn?.().Foo.#self.getSelf().#m()).toEqual(undefined); + expect(fn?.().Foo.#self.getSelf?.().#m()).toEqual(undefined); + expect(fn?.().Foo.#self?.getSelf().#m()).toEqual(undefined); + expect(fn?.().Foo.#self?.getSelf?.().#m()).toEqual(undefined); + expect(fn?.().Foo.#self.getSelf()?.self.#m()).toEqual(undefined); + expect(fn?.().Foo.#self.getSelf?.()?.self.#m()).toEqual(undefined); + expect(fn?.().Foo.#self?.getSelf()?.self.#m()).toEqual(undefined); + expect(fn?.().Foo.#self?.getSelf?.()?.self.#m()).toEqual(undefined); + } +} + +Foo.test(); +Foo.testNull(); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-before-member-call-with-transform/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-before-member-call-with-transform/input.js new file mode 100644 index 000000000000..d29585b51d60 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-before-member-call-with-transform/input.js @@ -0,0 +1,66 @@ +class Foo { + static #x = 1; + static #m = function() { return this.#x; }; + static #self = Foo; + static self = Foo; + static getSelf() { return this } + + static test() { + const o = { Foo: Foo }; + const deep = { very: { o } }; + function fn() { + return o; + } + function fnDeep() { + return deep; + } + + o?.Foo.#m(); + o?.Foo.#m().toString; + o?.Foo.#m().toString(); + + deep?.very.o?.Foo.#m(); + deep?.very.o?.Foo.#m().toString; + deep?.very.o?.Foo.#m().toString(); + + o?.Foo.#self.#m(); + o?.Foo.#self.self.#m(); + o?.Foo.#self?.self.#m(); + o?.Foo.#self.self?.self.#m(); + o?.Foo.#self?.self?.self.#m(); + + o?.Foo.#self.getSelf().#m(); + o?.Foo.#self.getSelf?.().#m(); + o?.Foo.#self?.getSelf().#m(); + o?.Foo.#self?.getSelf?.().#m(); + o?.Foo.#self.getSelf()?.self.#m(); + o?.Foo.#self.getSelf?.()?.self.#m(); + o?.Foo.#self?.getSelf()?.self.#m(); + o?.Foo.#self?.getSelf?.()?.self.#m(); + + fn?.().Foo.#m(); + fn?.().Foo.#m().toString; + fn?.().Foo.#m().toString(); + + fnDeep?.().very.o?.Foo.#m(); + fnDeep?.().very.o?.Foo.#m().toString; + fnDeep?.().very.o?.Foo.#m().toString(); + + fn?.().Foo.#self.#m(); + fn?.().Foo.#self.self.#m(); + fn?.().Foo.#self?.self.#m(); + fn?.().Foo.#self.self?.self.#m(); + fn?.().Foo.#self?.self?.self.#m(); + + fn?.().Foo.#self.getSelf().#m(); + fn?.().Foo.#self.getSelf?.().#m(); + fn?.().Foo.#self?.getSelf().#m(); + fn?.().Foo.#self?.getSelf?.().#m(); + fn?.().Foo.#self.getSelf()?.self.#m(); + fn?.().Foo.#self.getSelf?.()?.self.#m(); + fn?.().Foo.#self?.getSelf()?.self.#m(); + fn?.().Foo.#self?.getSelf?.()?.self.#m(); + } +} + +Foo.test(); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-before-member-call-with-transform/options.json b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-before-member-call-with-transform/options.json new file mode 100644 index 000000000000..63b4c77cc8e8 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-before-member-call-with-transform/options.json @@ -0,0 +1,3 @@ +{ + "plugins": ["proposal-optional-chaining", "proposal-class-properties"] +} diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-before-member-call-with-transform/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-before-member-call-with-transform/output.js new file mode 100644 index 000000000000..e754115aea72 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-before-member-call-with-transform/output.js @@ -0,0 +1,89 @@ +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +function _classStaticPrivateFieldSpecGet(receiver, classConstructor, descriptor) { if (receiver !== classConstructor) { throw new TypeError("Private static access of wrong provenance"); } if (descriptor.get) { return descriptor.get.call(receiver); } return descriptor.value; } + +class Foo { + static getSelf() { + return this; + } + + static test() { + var _o$Foo, _o$Foo2, _o$Foo3, _deep$very$o, _deep$very$o$Foo, _deep$very$o2, _deep$very$o2$Foo, _deep$very$o3, _deep$very$o3$Foo, _classStaticPrivateFi, _classStaticPrivateFi2, _ref, _ref$self, _ref2, _ref2$self, _self2, _self2$self, _classStaticPrivateFi3, _classStaticPrivateFi4, _ref3, _ref3$call, _ref4, _ref4$getSelf, _getSelf, _ref5, _getSelf$call, _ref6, _ref6$self, _classStaticPrivateFi5, _call, _call$self, _getSelf2, _getSelf2$self, _getSelf3, _getSelf3$self, _fn$Foo, _fn$Foo2, _fn$Foo3, _fnDeep$very$o, _fnDeep$very$o$Foo, _fnDeep$very$o2, _fnDeep$very$o2$Foo, _fnDeep$very$o3, _fnDeep$very$o3$Foo, _classStaticPrivateFi6, _classStaticPrivateFi7, _ref7, _ref7$self, _ref8, _ref8$self, _self3, _self3$self, _classStaticPrivateFi8, _classStaticPrivateFi9, _ref9, _ref9$call, _ref10, _ref10$getSelf, _getSelf4, _ref11, _getSelf4$call, _ref12, _ref12$self, _classStaticPrivateFi10, _call2, _call2$self, _getSelf5, _getSelf5$self, _getSelf6, _getSelf6$self, _ref13, _ref14, _ref15, _ref16, _ref17, _ref17$getSelf, _ref18, _ref19, _ref20, _ref21, _ref22, _ref22$getSelf; + + const o = { + Foo: Foo + }; + const deep = { + very: { + o + } + }; + + function fn() { + return o; + } + + function fnDeep() { + return deep; + } + + o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_o$Foo = o.Foo, Foo, _m).call(_o$Foo); + o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_o$Foo2 = o.Foo, Foo, _m).call(_o$Foo2).toString; + o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_o$Foo3 = o.Foo, Foo, _m).call(_o$Foo3).toString(); + (_deep$very$o = deep === null || deep === void 0 ? void 0 : deep.very.o) === null || _deep$very$o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_deep$very$o$Foo = _deep$very$o.Foo, Foo, _m).call(_deep$very$o$Foo); + (_deep$very$o2 = deep === null || deep === void 0 ? void 0 : deep.very.o) === null || _deep$very$o2 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_deep$very$o2$Foo = _deep$very$o2.Foo, Foo, _m).call(_deep$very$o2$Foo).toString; + (_deep$very$o3 = deep === null || deep === void 0 ? void 0 : deep.very.o) === null || _deep$very$o3 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_deep$very$o3$Foo = _deep$very$o3.Foo, Foo, _m).call(_deep$very$o3$Foo).toString(); + o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_classStaticPrivateFi = _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self), Foo, _m).call(_classStaticPrivateFi); + o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_classStaticPrivateFi2 = _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self).self, Foo, _m).call(_classStaticPrivateFi2); + (_ref = o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self)) === null || _ref === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_ref$self = _ref.self, Foo, _m).call(_ref$self); + (_ref2 = o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self).self) === null || _ref2 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_ref2$self = _ref2.self, Foo, _m).call(_ref2$self); + (_self2 = (_ref13 = o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self)) === null || _ref13 === void 0 ? void 0 : _ref13.self) === null || _self2 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_self2$self = _self2.self, Foo, _m).call(_self2$self); + o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_classStaticPrivateFi3 = _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self).getSelf(), Foo, _m).call(_classStaticPrivateFi3); + (_ref3 = o === null || o === void 0 ? void 0 : (_classStaticPrivateFi4 = _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self)).getSelf) === null || _ref3 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_ref3$call = _ref3.call(_classStaticPrivateFi4), Foo, _m).call(_ref3$call); + (_ref4 = o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self)) === null || _ref4 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_ref4$getSelf = _ref4.getSelf(), Foo, _m).call(_ref4$getSelf); + (_getSelf = (_ref14 = _ref5 = o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self)) === null || _ref14 === void 0 ? void 0 : _ref14.getSelf) === null || _getSelf === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_getSelf$call = _getSelf.call(_ref5), Foo, _m).call(_getSelf$call); + (_ref6 = o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self).getSelf()) === null || _ref6 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_ref6$self = _ref6.self, Foo, _m).call(_ref6$self); + (_call = (_ref15 = o === null || o === void 0 ? void 0 : (_classStaticPrivateFi5 = _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self)).getSelf) === null || _ref15 === void 0 ? void 0 : _ref15.call(_classStaticPrivateFi5)) === null || _call === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_call$self = _call.self, Foo, _m).call(_call$self); + (_getSelf2 = (_ref16 = o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self)) === null || _ref16 === void 0 ? void 0 : _ref16.getSelf()) === null || _getSelf2 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_getSelf2$self = _getSelf2.self, Foo, _m).call(_getSelf2$self); + (_getSelf3 = (_ref17 = o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self)) === null || _ref17 === void 0 ? void 0 : (_ref17$getSelf = _ref17.getSelf) === null || _ref17$getSelf === void 0 ? void 0 : _ref17$getSelf.call(_ref17)) === null || _getSelf3 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_getSelf3$self = _getSelf3.self, Foo, _m).call(_getSelf3$self); + fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_fn$Foo = fn().Foo, Foo, _m).call(_fn$Foo); + fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_fn$Foo2 = fn().Foo, Foo, _m).call(_fn$Foo2).toString; + fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_fn$Foo3 = fn().Foo, Foo, _m).call(_fn$Foo3).toString(); + (_fnDeep$very$o = fnDeep === null || fnDeep === void 0 ? void 0 : fnDeep().very.o) === null || _fnDeep$very$o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_fnDeep$very$o$Foo = _fnDeep$very$o.Foo, Foo, _m).call(_fnDeep$very$o$Foo); + (_fnDeep$very$o2 = fnDeep === null || fnDeep === void 0 ? void 0 : fnDeep().very.o) === null || _fnDeep$very$o2 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_fnDeep$very$o2$Foo = _fnDeep$very$o2.Foo, Foo, _m).call(_fnDeep$very$o2$Foo).toString; + (_fnDeep$very$o3 = fnDeep === null || fnDeep === void 0 ? void 0 : fnDeep().very.o) === null || _fnDeep$very$o3 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_fnDeep$very$o3$Foo = _fnDeep$very$o3.Foo, Foo, _m).call(_fnDeep$very$o3$Foo).toString(); + fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_classStaticPrivateFi6 = _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self), Foo, _m).call(_classStaticPrivateFi6); + fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_classStaticPrivateFi7 = _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self).self, Foo, _m).call(_classStaticPrivateFi7); + (_ref7 = fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self)) === null || _ref7 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_ref7$self = _ref7.self, Foo, _m).call(_ref7$self); + (_ref8 = fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self).self) === null || _ref8 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_ref8$self = _ref8.self, Foo, _m).call(_ref8$self); + (_self3 = (_ref18 = fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self)) === null || _ref18 === void 0 ? void 0 : _ref18.self) === null || _self3 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_self3$self = _self3.self, Foo, _m).call(_self3$self); + fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_classStaticPrivateFi8 = _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self).getSelf(), Foo, _m).call(_classStaticPrivateFi8); + (_ref9 = fn === null || fn === void 0 ? void 0 : (_classStaticPrivateFi9 = _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self)).getSelf) === null || _ref9 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_ref9$call = _ref9.call(_classStaticPrivateFi9), Foo, _m).call(_ref9$call); + (_ref10 = fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self)) === null || _ref10 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_ref10$getSelf = _ref10.getSelf(), Foo, _m).call(_ref10$getSelf); + (_getSelf4 = (_ref19 = _ref11 = fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self)) === null || _ref19 === void 0 ? void 0 : _ref19.getSelf) === null || _getSelf4 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_getSelf4$call = _getSelf4.call(_ref11), Foo, _m).call(_getSelf4$call); + (_ref12 = fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self).getSelf()) === null || _ref12 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_ref12$self = _ref12.self, Foo, _m).call(_ref12$self); + (_call2 = (_ref20 = fn === null || fn === void 0 ? void 0 : (_classStaticPrivateFi10 = _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self)).getSelf) === null || _ref20 === void 0 ? void 0 : _ref20.call(_classStaticPrivateFi10)) === null || _call2 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_call2$self = _call2.self, Foo, _m).call(_call2$self); + (_getSelf5 = (_ref21 = fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self)) === null || _ref21 === void 0 ? void 0 : _ref21.getSelf()) === null || _getSelf5 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_getSelf5$self = _getSelf5.self, Foo, _m).call(_getSelf5$self); + (_getSelf6 = (_ref22 = fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self)) === null || _ref22 === void 0 ? void 0 : (_ref22$getSelf = _ref22.getSelf) === null || _ref22$getSelf === void 0 ? void 0 : _ref22$getSelf.call(_ref22)) === null || _getSelf6 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_getSelf6$self = _getSelf6.self, Foo, _m).call(_getSelf6$self); + } + +} + +var _x = { + writable: true, + value: 1 +}; +var _m = { + writable: true, + value: function () { + return _classStaticPrivateFieldSpecGet(this, Foo, _x); + } +}; +var _self = { + writable: true, + value: Foo +}; + +_defineProperty(Foo, "self", Foo); + +Foo.test(); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-before-member-call/exec.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-before-member-call/exec.js new file mode 100644 index 000000000000..13cc95662d95 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-before-member-call/exec.js @@ -0,0 +1,122 @@ +class Foo { + static #x = 1; + static #m = function() { return this.#x; }; + static #self = Foo; + static self = Foo; + static getSelf() { return this } + + static test() { + const o = { Foo: Foo }; + const deep = { very: { o } }; + function fn() { + return o; + } + function fnDeep() { + return deep; + } + + expect(o?.Foo.#m()).toEqual(1); + expect(o?.Foo.#m().toString).toEqual(1..toString); + expect(o?.Foo.#m().toString()).toEqual('1'); + + expect(deep?.very.o?.Foo.#m()).toEqual(1); + expect(deep?.very.o?.Foo.#m().toString).toEqual(1..toString); + expect(deep?.very.o?.Foo.#m().toString()).toEqual('1'); + + expect(o?.Foo.#self.#m()).toEqual(1); + expect(o?.Foo.#self.self.#m()).toEqual(1); + expect(o?.Foo.#self?.self.#m()).toEqual(1); + expect(o?.Foo.#self.self?.self.#m()).toEqual(1); + expect(o?.Foo.#self?.self?.self.#m()).toEqual(1); + + expect(o?.Foo.#self.getSelf().#m()).toEqual(1); + expect(o?.Foo.#self.getSelf?.().#m()).toEqual(1); + expect(o?.Foo.#self?.getSelf().#m()).toEqual(1); + expect(o?.Foo.#self?.getSelf?.().#m()).toEqual(1); + expect(o?.Foo.#self.getSelf()?.self.#m()).toEqual(1); + expect(o?.Foo.#self.getSelf?.()?.self.#m()).toEqual(1); + expect(o?.Foo.#self?.getSelf()?.self.#m()).toEqual(1); + expect(o?.Foo.#self?.getSelf?.()?.self.#m()).toEqual(1); + + expect(fn?.().Foo.#m()).toEqual(1); + expect(fn?.().Foo.#m().toString).toEqual(1..toString); + expect(fn?.().Foo.#m().toString()).toEqual('1'); + + expect(fnDeep?.().very.o?.Foo.#m()).toEqual(1); + expect(fnDeep?.().very.o?.Foo.#m().toString).toEqual(1..toString); + expect(fnDeep?.().very.o?.Foo.#m().toString()).toEqual('1'); + + expect(fn?.().Foo.#self.#m()).toEqual(1); + expect(fn?.().Foo.#self.self.#m()).toEqual(1); + expect(fn?.().Foo.#self?.self.#m()).toEqual(1); + expect(fn?.().Foo.#self.self?.self.#m()).toEqual(1); + expect(fn?.().Foo.#self?.self?.self.#m()).toEqual(1); + + expect(fn?.().Foo.#self.getSelf().#m()).toEqual(1); + expect(fn?.().Foo.#self.getSelf?.().#m()).toEqual(1); + expect(fn?.().Foo.#self?.getSelf().#m()).toEqual(1); + expect(fn?.().Foo.#self?.getSelf?.().#m()).toEqual(1); + expect(fn?.().Foo.#self.getSelf()?.self.#m()).toEqual(1); + expect(fn?.().Foo.#self.getSelf?.()?.self.#m()).toEqual(1); + expect(fn?.().Foo.#self?.getSelf()?.self.#m()).toEqual(1); + expect(fn?.().Foo.#self?.getSelf?.()?.self.#m()).toEqual(1); + } + + static testNull() { + const o = null;; + const deep = { very: { o } }; + const fn = null; + function fnDeep() { + return deep; + } + + expect(o?.Foo.#m()).toEqual(undefined); + expect(o?.Foo.#m().toString).toEqual(undefined); + expect(o?.Foo.#m().toString()).toEqual(undefined); + + expect(deep?.very.o?.Foo.#m()).toEqual(undefined); + expect(deep?.very.o?.Foo.#m().toString).toEqual(undefined); + expect(deep?.very.o?.Foo.#m().toString()).toEqual(undefined); + + expect(o?.Foo.#self.#m()).toEqual(undefined); + expect(o?.Foo.#self.self.#m()).toEqual(undefined); + expect(o?.Foo.#self?.self.#m()).toEqual(undefined); + expect(o?.Foo.#self.self?.self.#m()).toEqual(undefined); + expect(o?.Foo.#self?.self?.self.#m()).toEqual(undefined); + + expect(o?.Foo.#self.getSelf().#m()).toEqual(undefined); + expect(o?.Foo.#self.getSelf?.().#m()).toEqual(undefined); + expect(o?.Foo.#self?.getSelf().#m()).toEqual(undefined); + expect(o?.Foo.#self?.getSelf?.().#m()).toEqual(undefined); + expect(o?.Foo.#self.getSelf()?.self.#m()).toEqual(undefined); + expect(o?.Foo.#self.getSelf?.()?.self.#m()).toEqual(undefined); + expect(o?.Foo.#self?.getSelf()?.self.#m()).toEqual(undefined); + expect(o?.Foo.#self?.getSelf?.()?.self.#m()).toEqual(undefined); + + expect(fn?.().Foo.#m()).toEqual(undefined); + expect(fn?.().Foo.#m().toString).toEqual(undefined); + expect(fn?.().Foo.#m().toString()).toEqual(undefined); + + expect(fnDeep?.().very.o?.Foo.#m()).toEqual(undefined); + expect(fnDeep?.().very.o?.Foo.#m().toString).toEqual(undefined); + expect(fnDeep?.().very.o?.Foo.#m().toString()).toEqual(undefined); + + expect(fn?.().Foo.#self.#m()).toEqual(undefined); + expect(fn?.().Foo.#self.self.#m()).toEqual(undefined); + expect(fn?.().Foo.#self?.self.#m()).toEqual(undefined); + expect(fn?.().Foo.#self.self?.self.#m()).toEqual(undefined); + expect(fn?.().Foo.#self?.self?.self.#m()).toEqual(undefined); + + expect(fn?.().Foo.#self.getSelf().#m()).toEqual(undefined); + expect(fn?.().Foo.#self.getSelf?.().#m()).toEqual(undefined); + expect(fn?.().Foo.#self?.getSelf().#m()).toEqual(undefined); + expect(fn?.().Foo.#self?.getSelf?.().#m()).toEqual(undefined); + expect(fn?.().Foo.#self.getSelf()?.self.#m()).toEqual(undefined); + expect(fn?.().Foo.#self.getSelf?.()?.self.#m()).toEqual(undefined); + expect(fn?.().Foo.#self?.getSelf()?.self.#m()).toEqual(undefined); + expect(fn?.().Foo.#self?.getSelf?.()?.self.#m()).toEqual(undefined); + } +} + +Foo.test(); +Foo.testNull(); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-before-member-call/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-before-member-call/input.js new file mode 100644 index 000000000000..d29585b51d60 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-before-member-call/input.js @@ -0,0 +1,66 @@ +class Foo { + static #x = 1; + static #m = function() { return this.#x; }; + static #self = Foo; + static self = Foo; + static getSelf() { return this } + + static test() { + const o = { Foo: Foo }; + const deep = { very: { o } }; + function fn() { + return o; + } + function fnDeep() { + return deep; + } + + o?.Foo.#m(); + o?.Foo.#m().toString; + o?.Foo.#m().toString(); + + deep?.very.o?.Foo.#m(); + deep?.very.o?.Foo.#m().toString; + deep?.very.o?.Foo.#m().toString(); + + o?.Foo.#self.#m(); + o?.Foo.#self.self.#m(); + o?.Foo.#self?.self.#m(); + o?.Foo.#self.self?.self.#m(); + o?.Foo.#self?.self?.self.#m(); + + o?.Foo.#self.getSelf().#m(); + o?.Foo.#self.getSelf?.().#m(); + o?.Foo.#self?.getSelf().#m(); + o?.Foo.#self?.getSelf?.().#m(); + o?.Foo.#self.getSelf()?.self.#m(); + o?.Foo.#self.getSelf?.()?.self.#m(); + o?.Foo.#self?.getSelf()?.self.#m(); + o?.Foo.#self?.getSelf?.()?.self.#m(); + + fn?.().Foo.#m(); + fn?.().Foo.#m().toString; + fn?.().Foo.#m().toString(); + + fnDeep?.().very.o?.Foo.#m(); + fnDeep?.().very.o?.Foo.#m().toString; + fnDeep?.().very.o?.Foo.#m().toString(); + + fn?.().Foo.#self.#m(); + fn?.().Foo.#self.self.#m(); + fn?.().Foo.#self?.self.#m(); + fn?.().Foo.#self.self?.self.#m(); + fn?.().Foo.#self?.self?.self.#m(); + + fn?.().Foo.#self.getSelf().#m(); + fn?.().Foo.#self.getSelf?.().#m(); + fn?.().Foo.#self?.getSelf().#m(); + fn?.().Foo.#self?.getSelf?.().#m(); + fn?.().Foo.#self.getSelf()?.self.#m(); + fn?.().Foo.#self.getSelf?.()?.self.#m(); + fn?.().Foo.#self?.getSelf()?.self.#m(); + fn?.().Foo.#self?.getSelf?.()?.self.#m(); + } +} + +Foo.test(); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-before-member-call/options.json b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-before-member-call/options.json new file mode 100644 index 000000000000..3b59e1bbfcc8 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-before-member-call/options.json @@ -0,0 +1,4 @@ +{ + "plugins": ["proposal-class-properties"], + "minNodeVersion": "14.0.0" +} diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-before-member-call/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-before-member-call/output.js new file mode 100644 index 000000000000..f3282ff89c62 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-before-member-call/output.js @@ -0,0 +1,89 @@ +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +function _classStaticPrivateFieldSpecGet(receiver, classConstructor, descriptor) { if (receiver !== classConstructor) { throw new TypeError("Private static access of wrong provenance"); } if (descriptor.get) { return descriptor.get.call(receiver); } return descriptor.value; } + +class Foo { + static getSelf() { + return this; + } + + static test() { + var _o$Foo, _o$Foo2, _o$Foo3, _deep$very$o, _deep$very$o$Foo, _deep$very$o2, _deep$very$o2$Foo, _deep$very$o3, _deep$very$o3$Foo, _classStaticPrivateFi, _classStaticPrivateFi2, _ref, _ref$self, _ref2, _ref2$self, _self2, _self2$self, _classStaticPrivateFi3, _classStaticPrivateFi4, _ref3, _ref3$call, _ref4, _ref4$getSelf, _getSelf, _ref5, _getSelf$call, _ref6, _ref6$self, _classStaticPrivateFi5, _call, _call$self, _getSelf2, _getSelf2$self, _getSelf3, _getSelf3$self, _fn$Foo, _fn$Foo2, _fn$Foo3, _fnDeep$very$o, _fnDeep$very$o$Foo, _fnDeep$very$o2, _fnDeep$very$o2$Foo, _fnDeep$very$o3, _fnDeep$very$o3$Foo, _classStaticPrivateFi6, _classStaticPrivateFi7, _ref7, _ref7$self, _ref8, _ref8$self, _self3, _self3$self, _classStaticPrivateFi8, _classStaticPrivateFi9, _ref9, _ref9$call, _ref10, _ref10$getSelf, _getSelf4, _ref11, _getSelf4$call, _ref12, _ref12$self, _classStaticPrivateFi10, _call2, _call2$self, _getSelf5, _getSelf5$self, _getSelf6, _getSelf6$self; + + const o = { + Foo: Foo + }; + const deep = { + very: { + o + } + }; + + function fn() { + return o; + } + + function fnDeep() { + return deep; + } + + o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_o$Foo = o.Foo, Foo, _m).call(_o$Foo); + o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_o$Foo2 = o.Foo, Foo, _m).call(_o$Foo2).toString; + o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_o$Foo3 = o.Foo, Foo, _m).call(_o$Foo3).toString(); + (_deep$very$o = deep?.very.o) === null || _deep$very$o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_deep$very$o$Foo = _deep$very$o.Foo, Foo, _m).call(_deep$very$o$Foo); + (_deep$very$o2 = deep?.very.o) === null || _deep$very$o2 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_deep$very$o2$Foo = _deep$very$o2.Foo, Foo, _m).call(_deep$very$o2$Foo).toString; + (_deep$very$o3 = deep?.very.o) === null || _deep$very$o3 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_deep$very$o3$Foo = _deep$very$o3.Foo, Foo, _m).call(_deep$very$o3$Foo).toString(); + o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_classStaticPrivateFi = _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self), Foo, _m).call(_classStaticPrivateFi); + o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_classStaticPrivateFi2 = _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self).self, Foo, _m).call(_classStaticPrivateFi2); + (_ref = o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self)) === null || _ref === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_ref$self = _ref.self, Foo, _m).call(_ref$self); + (_ref2 = o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self).self) === null || _ref2 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_ref2$self = _ref2.self, Foo, _m).call(_ref2$self); + (_self2 = (o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self))?.self) === null || _self2 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_self2$self = _self2.self, Foo, _m).call(_self2$self); + o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_classStaticPrivateFi3 = _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self).getSelf(), Foo, _m).call(_classStaticPrivateFi3); + (_ref3 = o === null || o === void 0 ? void 0 : (_classStaticPrivateFi4 = _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self)).getSelf) === null || _ref3 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_ref3$call = _ref3.call(_classStaticPrivateFi4), Foo, _m).call(_ref3$call); + (_ref4 = o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self)) === null || _ref4 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_ref4$getSelf = _ref4.getSelf(), Foo, _m).call(_ref4$getSelf); + (_getSelf = (_ref5 = o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self))?.getSelf) === null || _getSelf === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_getSelf$call = _getSelf.call(_ref5), Foo, _m).call(_getSelf$call); + (_ref6 = o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self).getSelf()) === null || _ref6 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_ref6$self = _ref6.self, Foo, _m).call(_ref6$self); + (_call = (o === null || o === void 0 ? void 0 : (_classStaticPrivateFi5 = _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self)).getSelf)?.call(_classStaticPrivateFi5)) === null || _call === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_call$self = _call.self, Foo, _m).call(_call$self); + (_getSelf2 = (o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self))?.getSelf()) === null || _getSelf2 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_getSelf2$self = _getSelf2.self, Foo, _m).call(_getSelf2$self); + (_getSelf3 = (o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self))?.getSelf?.()) === null || _getSelf3 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_getSelf3$self = _getSelf3.self, Foo, _m).call(_getSelf3$self); + fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_fn$Foo = fn().Foo, Foo, _m).call(_fn$Foo); + fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_fn$Foo2 = fn().Foo, Foo, _m).call(_fn$Foo2).toString; + fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_fn$Foo3 = fn().Foo, Foo, _m).call(_fn$Foo3).toString(); + (_fnDeep$very$o = fnDeep?.().very.o) === null || _fnDeep$very$o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_fnDeep$very$o$Foo = _fnDeep$very$o.Foo, Foo, _m).call(_fnDeep$very$o$Foo); + (_fnDeep$very$o2 = fnDeep?.().very.o) === null || _fnDeep$very$o2 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_fnDeep$very$o2$Foo = _fnDeep$very$o2.Foo, Foo, _m).call(_fnDeep$very$o2$Foo).toString; + (_fnDeep$very$o3 = fnDeep?.().very.o) === null || _fnDeep$very$o3 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_fnDeep$very$o3$Foo = _fnDeep$very$o3.Foo, Foo, _m).call(_fnDeep$very$o3$Foo).toString(); + fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_classStaticPrivateFi6 = _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self), Foo, _m).call(_classStaticPrivateFi6); + fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_classStaticPrivateFi7 = _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self).self, Foo, _m).call(_classStaticPrivateFi7); + (_ref7 = fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self)) === null || _ref7 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_ref7$self = _ref7.self, Foo, _m).call(_ref7$self); + (_ref8 = fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self).self) === null || _ref8 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_ref8$self = _ref8.self, Foo, _m).call(_ref8$self); + (_self3 = (fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self))?.self) === null || _self3 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_self3$self = _self3.self, Foo, _m).call(_self3$self); + fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_classStaticPrivateFi8 = _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self).getSelf(), Foo, _m).call(_classStaticPrivateFi8); + (_ref9 = fn === null || fn === void 0 ? void 0 : (_classStaticPrivateFi9 = _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self)).getSelf) === null || _ref9 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_ref9$call = _ref9.call(_classStaticPrivateFi9), Foo, _m).call(_ref9$call); + (_ref10 = fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self)) === null || _ref10 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_ref10$getSelf = _ref10.getSelf(), Foo, _m).call(_ref10$getSelf); + (_getSelf4 = (_ref11 = fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self))?.getSelf) === null || _getSelf4 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_getSelf4$call = _getSelf4.call(_ref11), Foo, _m).call(_getSelf4$call); + (_ref12 = fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self).getSelf()) === null || _ref12 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_ref12$self = _ref12.self, Foo, _m).call(_ref12$self); + (_call2 = (fn === null || fn === void 0 ? void 0 : (_classStaticPrivateFi10 = _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self)).getSelf)?.call(_classStaticPrivateFi10)) === null || _call2 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_call2$self = _call2.self, Foo, _m).call(_call2$self); + (_getSelf5 = (fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self))?.getSelf()) === null || _getSelf5 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_getSelf5$self = _getSelf5.self, Foo, _m).call(_getSelf5$self); + (_getSelf6 = (fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self))?.getSelf?.()) === null || _getSelf6 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_getSelf6$self = _getSelf6.self, Foo, _m).call(_getSelf6$self); + } + +} + +var _x = { + writable: true, + value: 1 +}; +var _m = { + writable: true, + value: function () { + return _classStaticPrivateFieldSpecGet(this, Foo, _x); + } +}; +var _self = { + writable: true, + value: Foo +}; + +_defineProperty(Foo, "self", Foo); + +Foo.test(); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-before-property-with-transform/exec.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-before-property-with-transform/exec.js new file mode 100644 index 000000000000..98ac8e7a7e12 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-before-property-with-transform/exec.js @@ -0,0 +1,121 @@ +class Foo { + static #x = 1; + static #self = Foo; + static self = Foo; + static getSelf() { return this } + + static test() { + const o = { Foo: Foo }; + const deep = { very: { o } }; + function fn() { + return o; + } + function fnDeep() { + return deep; + } + + expect(o?.Foo.#x).toEqual(1); + expect(o?.Foo.#x.toString).toEqual(1..toString); + expect(o?.Foo.#x.toString()).toEqual('1'); + + expect(deep?.very.o?.Foo.#x).toEqual(1); + expect(deep?.very.o?.Foo.#x.toString).toEqual(1..toString); + expect(deep?.very.o?.Foo.#x.toString()).toEqual('1'); + + expect(o?.Foo.#self.#x).toEqual(1); + expect(o?.Foo.#self.self.#x).toEqual(1); + expect(o?.Foo.#self?.self.#x).toEqual(1); + expect(o?.Foo.#self.self?.self.#x).toEqual(1); + expect(o?.Foo.#self?.self?.self.#x).toEqual(1); + + expect(o?.Foo.#self.getSelf().#x).toEqual(1); + expect(o?.Foo.#self.getSelf?.().#x).toEqual(1); + expect(o?.Foo.#self?.getSelf().#x).toEqual(1); + expect(o?.Foo.#self?.getSelf?.().#x).toEqual(1); + expect(o?.Foo.#self.getSelf()?.self.#x).toEqual(1); + expect(o?.Foo.#self.getSelf?.()?.self.#x).toEqual(1); + expect(o?.Foo.#self?.getSelf()?.self.#x).toEqual(1); + expect(o?.Foo.#self?.getSelf?.()?.self.#x).toEqual(1); + + expect(fn?.().Foo.#x).toEqual(1); + expect(fn?.().Foo.#x.toString).toEqual(1..toString); + expect(fn?.().Foo.#x.toString()).toEqual('1'); + + expect(fnDeep?.().very.o?.Foo.#x).toEqual(1); + expect(fnDeep?.().very.o?.Foo.#x.toString).toEqual(1..toString); + expect(fnDeep?.().very.o?.Foo.#x.toString()).toEqual('1'); + + expect(fn?.().Foo.#self.#x).toEqual(1); + expect(fn?.().Foo.#self.self.#x).toEqual(1); + expect(fn?.().Foo.#self?.self.#x).toEqual(1); + expect(fn?.().Foo.#self.self?.self.#x).toEqual(1); + expect(fn?.().Foo.#self?.self?.self.#x).toEqual(1); + + expect(fn?.().Foo.#self.getSelf().#x).toEqual(1); + expect(fn?.().Foo.#self.getSelf?.().#x).toEqual(1); + expect(fn?.().Foo.#self?.getSelf().#x).toEqual(1); + expect(fn?.().Foo.#self?.getSelf?.().#x).toEqual(1); + expect(fn?.().Foo.#self.getSelf()?.self.#x).toEqual(1); + expect(fn?.().Foo.#self.getSelf?.()?.self.#x).toEqual(1); + expect(fn?.().Foo.#self?.getSelf()?.self.#x).toEqual(1); + expect(fn?.().Foo.#self?.getSelf?.()?.self.#x).toEqual(1); + } + + static testNull() { + const o = null;; + const deep = { very: { o } }; + const fn = null; + function fnDeep() { + return deep; + } + + expect(o?.Foo.#x).toEqual(undefined); + expect(o?.Foo.#x.toString).toEqual(undefined); + expect(o?.Foo.#x.toString()).toEqual(undefined); + + expect(deep?.very.o?.Foo.#x).toEqual(undefined); + expect(deep?.very.o?.Foo.#x.toString).toEqual(undefined); + expect(deep?.very.o?.Foo.#x.toString()).toEqual(undefined); + + expect(o?.Foo.#self.#x).toEqual(undefined); + expect(o?.Foo.#self.self.#x).toEqual(undefined); + expect(o?.Foo.#self?.self.#x).toEqual(undefined); + expect(o?.Foo.#self.self?.self.#x).toEqual(undefined); + expect(o?.Foo.#self?.self?.self.#x).toEqual(undefined); + + expect(o?.Foo.#self.getSelf().#x).toEqual(undefined); + expect(o?.Foo.#self.getSelf?.().#x).toEqual(undefined); + expect(o?.Foo.#self?.getSelf().#x).toEqual(undefined); + expect(o?.Foo.#self?.getSelf?.().#x).toEqual(undefined); + expect(o?.Foo.#self.getSelf()?.self.#x).toEqual(undefined); + expect(o?.Foo.#self.getSelf?.()?.self.#x).toEqual(undefined); + expect(o?.Foo.#self?.getSelf()?.self.#x).toEqual(undefined); + expect(o?.Foo.#self?.getSelf?.()?.self.#x).toEqual(undefined); + + expect(fn?.().Foo.#x).toEqual(undefined); + expect(fn?.().Foo.#x.toString).toEqual(undefined); + expect(fn?.().Foo.#x.toString()).toEqual(undefined); + + expect(fnDeep?.().very.o?.Foo.#x).toEqual(undefined); + expect(fnDeep?.().very.o?.Foo.#x.toString).toEqual(undefined); + expect(fnDeep?.().very.o?.Foo.#x.toString()).toEqual(undefined); + + expect(fn?.().Foo.#self.#x).toEqual(undefined); + expect(fn?.().Foo.#self.self.#x).toEqual(undefined); + expect(fn?.().Foo.#self?.self.#x).toEqual(undefined); + expect(fn?.().Foo.#self.self?.self.#x).toEqual(undefined); + expect(fn?.().Foo.#self?.self?.self.#x).toEqual(undefined); + + expect(fn?.().Foo.#self.getSelf().#x).toEqual(undefined); + expect(fn?.().Foo.#self.getSelf?.().#x).toEqual(undefined); + expect(fn?.().Foo.#self?.getSelf().#x).toEqual(undefined); + expect(fn?.().Foo.#self?.getSelf?.().#x).toEqual(undefined); + expect(fn?.().Foo.#self.getSelf()?.self.#x).toEqual(undefined); + expect(fn?.().Foo.#self.getSelf?.()?.self.#x).toEqual(undefined); + expect(fn?.().Foo.#self?.getSelf()?.self.#x).toEqual(undefined); + expect(fn?.().Foo.#self?.getSelf?.()?.self.#x).toEqual(undefined); + } +} + +Foo.test(); +Foo.testNull(); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-before-property-with-transform/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-before-property-with-transform/input.js new file mode 100644 index 000000000000..fad2504d95e6 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-before-property-with-transform/input.js @@ -0,0 +1,65 @@ +class Foo { + static #x = 1; + static #self = Foo; + static self = Foo; + static getSelf() { return this } + + static test() { + const o = { Foo: Foo }; + const deep = { very: { o } }; + function fn() { + return o; + } + function fnDeep() { + return deep; + } + + o?.Foo.#x; + o?.Foo.#x.toString; + o?.Foo.#x.toString(); + + deep?.very.o?.Foo.#x; + deep?.very.o?.Foo.#x.toString; + deep?.very.o?.Foo.#x.toString(); + + o?.Foo.#self.#x; + o?.Foo.#self.self.#x; + o?.Foo.#self?.self.#x; + o?.Foo.#self.self?.self.#x; + o?.Foo.#self?.self?.self.#x; + + o?.Foo.#self.getSelf().#x; + o?.Foo.#self.getSelf?.().#x; + o?.Foo.#self?.getSelf().#x; + o?.Foo.#self?.getSelf?.().#x; + o?.Foo.#self.getSelf()?.self.#x; + o?.Foo.#self.getSelf?.()?.self.#x; + o?.Foo.#self?.getSelf()?.self.#x; + o?.Foo.#self?.getSelf?.()?.self.#x; + + fn?.().Foo.#x; + fn?.().Foo.#x.toString; + fn?.().Foo.#x.toString(); + + fnDeep?.().very.o?.Foo.#x; + fnDeep?.().very.o?.Foo.#x.toString; + fnDeep?.().very.o?.Foo.#x.toString(); + + fn?.().Foo.#self.#x; + fn?.().Foo.#self.self.#x; + fn?.().Foo.#self?.self.#x; + fn?.().Foo.#self.self?.self.#x; + fn?.().Foo.#self?.self?.self.#x; + + fn?.().Foo.#self.getSelf().#x; + fn?.().Foo.#self.getSelf?.().#x; + fn?.().Foo.#self?.getSelf().#x; + fn?.().Foo.#self?.getSelf?.().#x; + fn?.().Foo.#self.getSelf()?.self.#x; + fn?.().Foo.#self.getSelf?.()?.self.#x; + fn?.().Foo.#self?.getSelf()?.self.#x; + fn?.().Foo.#self?.getSelf?.()?.self.#x; + } +} + +Foo.test(); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-before-property-with-transform/options.json b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-before-property-with-transform/options.json new file mode 100644 index 000000000000..63b4c77cc8e8 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-before-property-with-transform/options.json @@ -0,0 +1,3 @@ +{ + "plugins": ["proposal-optional-chaining", "proposal-class-properties"] +} diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-before-property-with-transform/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-before-property-with-transform/output.js new file mode 100644 index 000000000000..1f754b075002 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-before-property-with-transform/output.js @@ -0,0 +1,83 @@ +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +function _classStaticPrivateFieldSpecGet(receiver, classConstructor, descriptor) { if (receiver !== classConstructor) { throw new TypeError("Private static access of wrong provenance"); } if (descriptor.get) { return descriptor.get.call(receiver); } return descriptor.value; } + +class Foo { + static getSelf() { + return this; + } + + static test() { + var _deep$very$o, _deep$very$o2, _deep$very$o3, _ref, _ref2, _self2, _classStaticPrivateFi, _ref3, _ref4, _getSelf, _ref5, _ref6, _classStaticPrivateFi2, _call, _getSelf2, _getSelf3, _fnDeep$very$o, _fnDeep$very$o2, _fnDeep$very$o3, _ref7, _ref8, _self3, _classStaticPrivateFi3, _ref9, _ref10, _getSelf4, _ref11, _ref12, _classStaticPrivateFi4, _call2, _getSelf5, _getSelf6, _ref13, _ref14, _ref15, _ref16, _ref17, _ref17$getSelf, _ref18, _ref19, _ref20, _ref21, _ref22, _ref22$getSelf; + + const o = { + Foo: Foo + }; + const deep = { + very: { + o + } + }; + + function fn() { + return o; + } + + function fnDeep() { + return deep; + } + + o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(o.Foo, Foo, _x); + o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(o.Foo, Foo, _x).toString; + o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(o.Foo, Foo, _x).toString(); + (_deep$very$o = deep === null || deep === void 0 ? void 0 : deep.very.o) === null || _deep$very$o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_deep$very$o.Foo, Foo, _x); + (_deep$very$o2 = deep === null || deep === void 0 ? void 0 : deep.very.o) === null || _deep$very$o2 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_deep$very$o2.Foo, Foo, _x).toString; + (_deep$very$o3 = deep === null || deep === void 0 ? void 0 : deep.very.o) === null || _deep$very$o3 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_deep$very$o3.Foo, Foo, _x).toString(); + o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_classStaticPrivateFieldSpecGet(o.Foo, Foo, _self), Foo, _x); + o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_classStaticPrivateFieldSpecGet(o.Foo, Foo, _self).self, Foo, _x); + (_ref = o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self)) === null || _ref === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_ref.self, Foo, _x); + (_ref2 = o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self).self) === null || _ref2 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_ref2.self, Foo, _x); + (_self2 = (_ref13 = o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self)) === null || _ref13 === void 0 ? void 0 : _ref13.self) === null || _self2 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_self2.self, Foo, _x); + o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_classStaticPrivateFieldSpecGet(o.Foo, Foo, _self).getSelf(), Foo, _x); + (_ref3 = o === null || o === void 0 ? void 0 : (_classStaticPrivateFi = _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self)).getSelf) === null || _ref3 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_ref3.call(_classStaticPrivateFi), Foo, _x); + (_ref4 = o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self)) === null || _ref4 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_ref4.getSelf(), Foo, _x); + (_getSelf = (_ref14 = _ref5 = o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self)) === null || _ref14 === void 0 ? void 0 : _ref14.getSelf) === null || _getSelf === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_getSelf.call(_ref5), Foo, _x); + (_ref6 = o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self).getSelf()) === null || _ref6 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_ref6.self, Foo, _x); + (_call = (_ref15 = o === null || o === void 0 ? void 0 : (_classStaticPrivateFi2 = _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self)).getSelf) === null || _ref15 === void 0 ? void 0 : _ref15.call(_classStaticPrivateFi2)) === null || _call === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_call.self, Foo, _x); + (_getSelf2 = (_ref16 = o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self)) === null || _ref16 === void 0 ? void 0 : _ref16.getSelf()) === null || _getSelf2 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_getSelf2.self, Foo, _x); + (_getSelf3 = (_ref17 = o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self)) === null || _ref17 === void 0 ? void 0 : (_ref17$getSelf = _ref17.getSelf) === null || _ref17$getSelf === void 0 ? void 0 : _ref17$getSelf.call(_ref17)) === null || _getSelf3 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_getSelf3.self, Foo, _x); + fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _x); + fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _x).toString; + fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _x).toString(); + (_fnDeep$very$o = fnDeep === null || fnDeep === void 0 ? void 0 : fnDeep().very.o) === null || _fnDeep$very$o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_fnDeep$very$o.Foo, Foo, _x); + (_fnDeep$very$o2 = fnDeep === null || fnDeep === void 0 ? void 0 : fnDeep().very.o) === null || _fnDeep$very$o2 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_fnDeep$very$o2.Foo, Foo, _x).toString; + (_fnDeep$very$o3 = fnDeep === null || fnDeep === void 0 ? void 0 : fnDeep().very.o) === null || _fnDeep$very$o3 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_fnDeep$very$o3.Foo, Foo, _x).toString(); + fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self), Foo, _x); + fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self).self, Foo, _x); + (_ref7 = fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self)) === null || _ref7 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_ref7.self, Foo, _x); + (_ref8 = fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self).self) === null || _ref8 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_ref8.self, Foo, _x); + (_self3 = (_ref18 = fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self)) === null || _ref18 === void 0 ? void 0 : _ref18.self) === null || _self3 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_self3.self, Foo, _x); + fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self).getSelf(), Foo, _x); + (_ref9 = fn === null || fn === void 0 ? void 0 : (_classStaticPrivateFi3 = _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self)).getSelf) === null || _ref9 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_ref9.call(_classStaticPrivateFi3), Foo, _x); + (_ref10 = fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self)) === null || _ref10 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_ref10.getSelf(), Foo, _x); + (_getSelf4 = (_ref19 = _ref11 = fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self)) === null || _ref19 === void 0 ? void 0 : _ref19.getSelf) === null || _getSelf4 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_getSelf4.call(_ref11), Foo, _x); + (_ref12 = fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self).getSelf()) === null || _ref12 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_ref12.self, Foo, _x); + (_call2 = (_ref20 = fn === null || fn === void 0 ? void 0 : (_classStaticPrivateFi4 = _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self)).getSelf) === null || _ref20 === void 0 ? void 0 : _ref20.call(_classStaticPrivateFi4)) === null || _call2 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_call2.self, Foo, _x); + (_getSelf5 = (_ref21 = fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self)) === null || _ref21 === void 0 ? void 0 : _ref21.getSelf()) === null || _getSelf5 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_getSelf5.self, Foo, _x); + (_getSelf6 = (_ref22 = fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self)) === null || _ref22 === void 0 ? void 0 : (_ref22$getSelf = _ref22.getSelf) === null || _ref22$getSelf === void 0 ? void 0 : _ref22$getSelf.call(_ref22)) === null || _getSelf6 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_getSelf6.self, Foo, _x); + } + +} + +var _x = { + writable: true, + value: 1 +}; +var _self = { + writable: true, + value: Foo +}; + +_defineProperty(Foo, "self", Foo); + +Foo.test(); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-before-property/exec.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-before-property/exec.js new file mode 100644 index 000000000000..98ac8e7a7e12 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-before-property/exec.js @@ -0,0 +1,121 @@ +class Foo { + static #x = 1; + static #self = Foo; + static self = Foo; + static getSelf() { return this } + + static test() { + const o = { Foo: Foo }; + const deep = { very: { o } }; + function fn() { + return o; + } + function fnDeep() { + return deep; + } + + expect(o?.Foo.#x).toEqual(1); + expect(o?.Foo.#x.toString).toEqual(1..toString); + expect(o?.Foo.#x.toString()).toEqual('1'); + + expect(deep?.very.o?.Foo.#x).toEqual(1); + expect(deep?.very.o?.Foo.#x.toString).toEqual(1..toString); + expect(deep?.very.o?.Foo.#x.toString()).toEqual('1'); + + expect(o?.Foo.#self.#x).toEqual(1); + expect(o?.Foo.#self.self.#x).toEqual(1); + expect(o?.Foo.#self?.self.#x).toEqual(1); + expect(o?.Foo.#self.self?.self.#x).toEqual(1); + expect(o?.Foo.#self?.self?.self.#x).toEqual(1); + + expect(o?.Foo.#self.getSelf().#x).toEqual(1); + expect(o?.Foo.#self.getSelf?.().#x).toEqual(1); + expect(o?.Foo.#self?.getSelf().#x).toEqual(1); + expect(o?.Foo.#self?.getSelf?.().#x).toEqual(1); + expect(o?.Foo.#self.getSelf()?.self.#x).toEqual(1); + expect(o?.Foo.#self.getSelf?.()?.self.#x).toEqual(1); + expect(o?.Foo.#self?.getSelf()?.self.#x).toEqual(1); + expect(o?.Foo.#self?.getSelf?.()?.self.#x).toEqual(1); + + expect(fn?.().Foo.#x).toEqual(1); + expect(fn?.().Foo.#x.toString).toEqual(1..toString); + expect(fn?.().Foo.#x.toString()).toEqual('1'); + + expect(fnDeep?.().very.o?.Foo.#x).toEqual(1); + expect(fnDeep?.().very.o?.Foo.#x.toString).toEqual(1..toString); + expect(fnDeep?.().very.o?.Foo.#x.toString()).toEqual('1'); + + expect(fn?.().Foo.#self.#x).toEqual(1); + expect(fn?.().Foo.#self.self.#x).toEqual(1); + expect(fn?.().Foo.#self?.self.#x).toEqual(1); + expect(fn?.().Foo.#self.self?.self.#x).toEqual(1); + expect(fn?.().Foo.#self?.self?.self.#x).toEqual(1); + + expect(fn?.().Foo.#self.getSelf().#x).toEqual(1); + expect(fn?.().Foo.#self.getSelf?.().#x).toEqual(1); + expect(fn?.().Foo.#self?.getSelf().#x).toEqual(1); + expect(fn?.().Foo.#self?.getSelf?.().#x).toEqual(1); + expect(fn?.().Foo.#self.getSelf()?.self.#x).toEqual(1); + expect(fn?.().Foo.#self.getSelf?.()?.self.#x).toEqual(1); + expect(fn?.().Foo.#self?.getSelf()?.self.#x).toEqual(1); + expect(fn?.().Foo.#self?.getSelf?.()?.self.#x).toEqual(1); + } + + static testNull() { + const o = null;; + const deep = { very: { o } }; + const fn = null; + function fnDeep() { + return deep; + } + + expect(o?.Foo.#x).toEqual(undefined); + expect(o?.Foo.#x.toString).toEqual(undefined); + expect(o?.Foo.#x.toString()).toEqual(undefined); + + expect(deep?.very.o?.Foo.#x).toEqual(undefined); + expect(deep?.very.o?.Foo.#x.toString).toEqual(undefined); + expect(deep?.very.o?.Foo.#x.toString()).toEqual(undefined); + + expect(o?.Foo.#self.#x).toEqual(undefined); + expect(o?.Foo.#self.self.#x).toEqual(undefined); + expect(o?.Foo.#self?.self.#x).toEqual(undefined); + expect(o?.Foo.#self.self?.self.#x).toEqual(undefined); + expect(o?.Foo.#self?.self?.self.#x).toEqual(undefined); + + expect(o?.Foo.#self.getSelf().#x).toEqual(undefined); + expect(o?.Foo.#self.getSelf?.().#x).toEqual(undefined); + expect(o?.Foo.#self?.getSelf().#x).toEqual(undefined); + expect(o?.Foo.#self?.getSelf?.().#x).toEqual(undefined); + expect(o?.Foo.#self.getSelf()?.self.#x).toEqual(undefined); + expect(o?.Foo.#self.getSelf?.()?.self.#x).toEqual(undefined); + expect(o?.Foo.#self?.getSelf()?.self.#x).toEqual(undefined); + expect(o?.Foo.#self?.getSelf?.()?.self.#x).toEqual(undefined); + + expect(fn?.().Foo.#x).toEqual(undefined); + expect(fn?.().Foo.#x.toString).toEqual(undefined); + expect(fn?.().Foo.#x.toString()).toEqual(undefined); + + expect(fnDeep?.().very.o?.Foo.#x).toEqual(undefined); + expect(fnDeep?.().very.o?.Foo.#x.toString).toEqual(undefined); + expect(fnDeep?.().very.o?.Foo.#x.toString()).toEqual(undefined); + + expect(fn?.().Foo.#self.#x).toEqual(undefined); + expect(fn?.().Foo.#self.self.#x).toEqual(undefined); + expect(fn?.().Foo.#self?.self.#x).toEqual(undefined); + expect(fn?.().Foo.#self.self?.self.#x).toEqual(undefined); + expect(fn?.().Foo.#self?.self?.self.#x).toEqual(undefined); + + expect(fn?.().Foo.#self.getSelf().#x).toEqual(undefined); + expect(fn?.().Foo.#self.getSelf?.().#x).toEqual(undefined); + expect(fn?.().Foo.#self?.getSelf().#x).toEqual(undefined); + expect(fn?.().Foo.#self?.getSelf?.().#x).toEqual(undefined); + expect(fn?.().Foo.#self.getSelf()?.self.#x).toEqual(undefined); + expect(fn?.().Foo.#self.getSelf?.()?.self.#x).toEqual(undefined); + expect(fn?.().Foo.#self?.getSelf()?.self.#x).toEqual(undefined); + expect(fn?.().Foo.#self?.getSelf?.()?.self.#x).toEqual(undefined); + } +} + +Foo.test(); +Foo.testNull(); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-before-property/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-before-property/input.js new file mode 100644 index 000000000000..cf001da081fc --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-before-property/input.js @@ -0,0 +1,66 @@ +class Foo { + static #x = 1; + static #self = Foo; + static self = Foo; + static getSelf() { return this } + + static test() { + const o = { Foo: Foo }; + const deep = { very: { o } }; + function fn() { + return o; + } + function fnDeep() { + return deep; + } + + o?.Foo.#x; + o?.Foo.#x.toString; + o?.Foo.#x.toString(); + + deep?.very.o?.Foo.#x; + deep?.very.o?.Foo.#x.toString; + deep?.very.o?.Foo.#x.toString(); + + o?.Foo.#self.#x; + o?.Foo.#self.self.#x; + o?.Foo.#self?.self.#x; + o?.Foo.#self.self?.self.#x; + o?.Foo.#self?.self?.self.#x; + + o?.Foo.#self.getSelf().#x; + o?.Foo.#self.getSelf?.().#x; + o?.Foo.#self?.getSelf().#x; + o?.Foo.#self?.getSelf?.().#x; + o?.Foo.#self.getSelf()?.self.#x; + o?.Foo.#self.getSelf?.()?.self.#x; + o?.Foo.#self?.getSelf()?.self.#x; + o?.Foo.#self?.getSelf?.()?.self.#x; + + fn?.().Foo.#x; + fn?.().Foo.#x.toString; + fn?.().Foo.#x.toString(); + + fnDeep?.().very.o?.Foo.#x; + fnDeep?.().very.o?.Foo.#x.toString; + fnDeep?.().very.o?.Foo.#x.toString(); + + fn?.().Foo.#self.#x; + fn?.().Foo.#self.self.#x; + fn?.().Foo.#self?.self.#x; + fn?.().Foo.#self.self?.self.#x; + fn?.().Foo.#self?.self?.self.#x; + + fn?.().Foo.#self.getSelf().#x; + fn?.().Foo.#self.getSelf?.().#x; + fn?.().Foo.#self?.getSelf().#x; + fn?.().Foo.#self?.getSelf?.().#x; + fn?.().Foo.#self.getSelf()?.self.#x; + fn?.().Foo.#self.getSelf?.()?.self.#x; + fn?.().Foo.#self?.getSelf()?.self.#x; + fn?.().Foo.#self?.getSelf?.()?.self.#x; + + } +} + +Foo.test(); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-before-property/options.json b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-before-property/options.json new file mode 100644 index 000000000000..3b59e1bbfcc8 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-before-property/options.json @@ -0,0 +1,4 @@ +{ + "plugins": ["proposal-class-properties"], + "minNodeVersion": "14.0.0" +} diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-before-property/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-before-property/output.js new file mode 100644 index 000000000000..0ba37b422f2a --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-before-property/output.js @@ -0,0 +1,83 @@ +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +function _classStaticPrivateFieldSpecGet(receiver, classConstructor, descriptor) { if (receiver !== classConstructor) { throw new TypeError("Private static access of wrong provenance"); } if (descriptor.get) { return descriptor.get.call(receiver); } return descriptor.value; } + +class Foo { + static getSelf() { + return this; + } + + static test() { + var _deep$very$o, _deep$very$o2, _deep$very$o3, _ref, _ref2, _self2, _classStaticPrivateFi, _ref3, _ref4, _getSelf, _ref5, _ref6, _classStaticPrivateFi2, _call, _getSelf2, _getSelf3, _fnDeep$very$o, _fnDeep$very$o2, _fnDeep$very$o3, _ref7, _ref8, _self3, _classStaticPrivateFi3, _ref9, _ref10, _getSelf4, _ref11, _ref12, _classStaticPrivateFi4, _call2, _getSelf5, _getSelf6; + + const o = { + Foo: Foo + }; + const deep = { + very: { + o + } + }; + + function fn() { + return o; + } + + function fnDeep() { + return deep; + } + + o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(o.Foo, Foo, _x); + o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(o.Foo, Foo, _x).toString; + o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(o.Foo, Foo, _x).toString(); + (_deep$very$o = deep?.very.o) === null || _deep$very$o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_deep$very$o.Foo, Foo, _x); + (_deep$very$o2 = deep?.very.o) === null || _deep$very$o2 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_deep$very$o2.Foo, Foo, _x).toString; + (_deep$very$o3 = deep?.very.o) === null || _deep$very$o3 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_deep$very$o3.Foo, Foo, _x).toString(); + o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_classStaticPrivateFieldSpecGet(o.Foo, Foo, _self), Foo, _x); + o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_classStaticPrivateFieldSpecGet(o.Foo, Foo, _self).self, Foo, _x); + (_ref = o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self)) === null || _ref === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_ref.self, Foo, _x); + (_ref2 = o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self).self) === null || _ref2 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_ref2.self, Foo, _x); + (_self2 = (o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self))?.self) === null || _self2 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_self2.self, Foo, _x); + o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_classStaticPrivateFieldSpecGet(o.Foo, Foo, _self).getSelf(), Foo, _x); + (_ref3 = o === null || o === void 0 ? void 0 : (_classStaticPrivateFi = _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self)).getSelf) === null || _ref3 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_ref3.call(_classStaticPrivateFi), Foo, _x); + (_ref4 = o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self)) === null || _ref4 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_ref4.getSelf(), Foo, _x); + (_getSelf = (_ref5 = o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self))?.getSelf) === null || _getSelf === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_getSelf.call(_ref5), Foo, _x); + (_ref6 = o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self).getSelf()) === null || _ref6 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_ref6.self, Foo, _x); + (_call = (o === null || o === void 0 ? void 0 : (_classStaticPrivateFi2 = _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self)).getSelf)?.call(_classStaticPrivateFi2)) === null || _call === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_call.self, Foo, _x); + (_getSelf2 = (o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self))?.getSelf()) === null || _getSelf2 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_getSelf2.self, Foo, _x); + (_getSelf3 = (o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self))?.getSelf?.()) === null || _getSelf3 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_getSelf3.self, Foo, _x); + fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _x); + fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _x).toString; + fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _x).toString(); + (_fnDeep$very$o = fnDeep?.().very.o) === null || _fnDeep$very$o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_fnDeep$very$o.Foo, Foo, _x); + (_fnDeep$very$o2 = fnDeep?.().very.o) === null || _fnDeep$very$o2 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_fnDeep$very$o2.Foo, Foo, _x).toString; + (_fnDeep$very$o3 = fnDeep?.().very.o) === null || _fnDeep$very$o3 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_fnDeep$very$o3.Foo, Foo, _x).toString(); + fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self), Foo, _x); + fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self).self, Foo, _x); + (_ref7 = fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self)) === null || _ref7 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_ref7.self, Foo, _x); + (_ref8 = fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self).self) === null || _ref8 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_ref8.self, Foo, _x); + (_self3 = (fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self))?.self) === null || _self3 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_self3.self, Foo, _x); + fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self).getSelf(), Foo, _x); + (_ref9 = fn === null || fn === void 0 ? void 0 : (_classStaticPrivateFi3 = _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self)).getSelf) === null || _ref9 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_ref9.call(_classStaticPrivateFi3), Foo, _x); + (_ref10 = fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self)) === null || _ref10 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_ref10.getSelf(), Foo, _x); + (_getSelf4 = (_ref11 = fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self))?.getSelf) === null || _getSelf4 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_getSelf4.call(_ref11), Foo, _x); + (_ref12 = fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self).getSelf()) === null || _ref12 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_ref12.self, Foo, _x); + (_call2 = (fn === null || fn === void 0 ? void 0 : (_classStaticPrivateFi4 = _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self)).getSelf)?.call(_classStaticPrivateFi4)) === null || _call2 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_call2.self, Foo, _x); + (_getSelf5 = (fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self))?.getSelf()) === null || _getSelf5 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_getSelf5.self, Foo, _x); + (_getSelf6 = (fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self))?.getSelf?.()) === null || _getSelf6 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_getSelf6.self, Foo, _x); + } + +} + +var _x = { + writable: true, + value: 1 +}; +var _self = { + writable: true, + value: Foo +}; + +_defineProperty(Foo, "self", Foo); + +Foo.test(); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-member-optional-call-with-transform/exec.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-member-optional-call-with-transform/exec.js new file mode 100644 index 000000000000..6e82fc8d6543 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-member-optional-call-with-transform/exec.js @@ -0,0 +1,126 @@ +class Foo { + static #x = 1; + static #m = function() { return this.#x; }; + static #self = Foo; + static self = Foo; + static getSelf() { return this } + + static test() { + const o = { Foo: Foo }; + const deep = { very: { o } }; + function fn() { + return o; + } + function fnDeep() { + return deep; + } + + expect(Foo.#m?.()).toEqual(1); + expect(Foo.#m?.().toString).toEqual(1..toString); + expect(Foo.#m?.().toString()).toEqual('1'); + + expect(o?.Foo.#m?.()).toEqual(1); + expect(o?.Foo.#m?.().toString).toEqual(1..toString); + expect(o?.Foo.#m?.().toString()).toEqual('1'); + + expect(deep?.very.o?.Foo.#m?.()).toEqual(1); + expect(deep?.very.o?.Foo.#m?.().toString).toEqual(1..toString); + expect(deep?.very.o?.Foo.#m?.().toString()).toEqual('1'); + + expect(o?.Foo.#self.#m?.()).toEqual(1); + expect(o?.Foo.#self.self.#m?.()).toEqual(1); + expect(o?.Foo.#self?.self.#m?.()).toEqual(1); + expect(o?.Foo.#self.self?.self.#m?.()).toEqual(1); + expect(o?.Foo.#self?.self?.self.#m?.()).toEqual(1); + + expect(o?.Foo.#self.getSelf().#m?.()).toEqual(1); + expect(o?.Foo.#self.getSelf?.().#m?.()).toEqual(1); + expect(o?.Foo.#self?.getSelf().#m?.()).toEqual(1); + expect(o?.Foo.#self?.getSelf?.().#m?.()).toEqual(1); + expect(o?.Foo.#self.getSelf()?.self.#m?.()).toEqual(1); + expect(o?.Foo.#self.getSelf?.()?.self.#m?.()).toEqual(1); + expect(o?.Foo.#self?.getSelf()?.self.#m?.()).toEqual(1); + expect(o?.Foo.#self?.getSelf?.()?.self.#m?.()).toEqual(1); + + expect(fn?.().Foo.#m?.()).toEqual(1); + expect(fn?.().Foo.#m?.().toString).toEqual(1..toString); + expect(fn?.().Foo.#m?.().toString()).toEqual('1'); + + expect(fnDeep?.().very.o?.Foo.#m?.()).toEqual(1); + expect(fnDeep?.().very.o?.Foo.#m?.().toString).toEqual(1..toString); + expect(fnDeep?.().very.o?.Foo.#m?.().toString()).toEqual('1'); + + expect(fn?.().Foo.#self.#m?.()).toEqual(1); + expect(fn?.().Foo.#self.self.#m?.()).toEqual(1); + expect(fn?.().Foo.#self?.self.#m?.()).toEqual(1); + expect(fn?.().Foo.#self.self?.self.#m?.()).toEqual(1); + expect(fn?.().Foo.#self?.self?.self.#m?.()).toEqual(1); + + expect(fn?.().Foo.#self.getSelf().#m?.()).toEqual(1); + expect(fn?.().Foo.#self.getSelf?.().#m?.()).toEqual(1); + expect(fn?.().Foo.#self?.getSelf().#m?.()).toEqual(1); + expect(fn?.().Foo.#self?.getSelf?.().#m?.()).toEqual(1); + expect(fn?.().Foo.#self.getSelf()?.self.#m?.()).toEqual(1); + expect(fn?.().Foo.#self.getSelf?.()?.self.#m?.()).toEqual(1); + expect(fn?.().Foo.#self?.getSelf()?.self.#m?.()).toEqual(1); + expect(fn?.().Foo.#self?.getSelf?.()?.self.#m?.()).toEqual(1); + } + + static testNull() { + const o = null;; + const deep = { very: { o } }; + const fn = null; + function fnDeep() { + return deep; + } + + expect(o?.Foo.#m?.()).toEqual(undefined); + expect(o?.Foo.#m?.().toString).toEqual(undefined); + expect(o?.Foo.#m?.().toString()).toEqual(undefined); + + expect(deep?.very.o?.Foo.#m?.()).toEqual(undefined); + expect(deep?.very.o?.Foo.#m?.().toString).toEqual(undefined); + expect(deep?.very.o?.Foo.#m?.().toString()).toEqual(undefined); + + expect(o?.Foo.#self.#m?.()).toEqual(undefined); + expect(o?.Foo.#self.self.#m?.()).toEqual(undefined); + expect(o?.Foo.#self?.self.#m?.()).toEqual(undefined); + expect(o?.Foo.#self.self?.self.#m?.()).toEqual(undefined); + expect(o?.Foo.#self?.self?.self.#m?.()).toEqual(undefined); + + expect(o?.Foo.#self.getSelf().#m?.()).toEqual(undefined); + expect(o?.Foo.#self.getSelf?.().#m?.()).toEqual(undefined); + expect(o?.Foo.#self?.getSelf().#m?.()).toEqual(undefined); + expect(o?.Foo.#self?.getSelf?.().#m?.()).toEqual(undefined); + expect(o?.Foo.#self.getSelf()?.self.#m?.()).toEqual(undefined); + expect(o?.Foo.#self.getSelf?.()?.self.#m?.()).toEqual(undefined); + expect(o?.Foo.#self?.getSelf()?.self.#m?.()).toEqual(undefined); + expect(o?.Foo.#self?.getSelf?.()?.self.#m?.()).toEqual(undefined); + + expect(fn?.().Foo.#m?.()).toEqual(undefined); + expect(fn?.().Foo.#m?.().toString).toEqual(undefined); + expect(fn?.().Foo.#m?.().toString()).toEqual(undefined); + + expect(fnDeep?.().very.o?.Foo.#m?.()).toEqual(undefined); + expect(fnDeep?.().very.o?.Foo.#m?.().toString).toEqual(undefined); + expect(fnDeep?.().very.o?.Foo.#m?.().toString()).toEqual(undefined); + + expect(fn?.().Foo.#self.#m?.()).toEqual(undefined); + expect(fn?.().Foo.#self.self.#m?.()).toEqual(undefined); + expect(fn?.().Foo.#self?.self.#m?.()).toEqual(undefined); + expect(fn?.().Foo.#self.self?.self.#m?.()).toEqual(undefined); + expect(fn?.().Foo.#self?.self?.self.#m?.()).toEqual(undefined); + + expect(fn?.().Foo.#self.getSelf().#m?.()).toEqual(undefined); + expect(fn?.().Foo.#self.getSelf?.().#m?.()).toEqual(undefined); + expect(fn?.().Foo.#self?.getSelf().#m?.()).toEqual(undefined); + expect(fn?.().Foo.#self?.getSelf?.().#m?.()).toEqual(undefined); + expect(fn?.().Foo.#self.getSelf()?.self.#m?.()).toEqual(undefined); + expect(fn?.().Foo.#self.getSelf?.()?.self.#m?.()).toEqual(undefined); + expect(fn?.().Foo.#self?.getSelf()?.self.#m?.()).toEqual(undefined); + expect(fn?.().Foo.#self?.getSelf?.()?.self.#m?.()).toEqual(undefined); + } +} + +Foo.test(); +Foo.testNull(); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-member-optional-call-with-transform/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-member-optional-call-with-transform/input.js new file mode 100644 index 000000000000..11dd4a57060d --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-member-optional-call-with-transform/input.js @@ -0,0 +1,71 @@ +class Foo { + static #x = 1; + static #m = function() { return this.#x; }; + static #self = Foo; + static self = Foo; + static getSelf() { return this } + + static test() { + const o = { Foo: Foo }; + const deep = { very: { o } }; + function fn() { + return o; + } + function fnDeep() { + return deep; + } + + Foo.#m?.(); + Foo.#m?.().toString; + Foo.#m?.().toString(); + + o?.Foo.#m?.(); + o?.Foo.#m?.().toString; + o?.Foo.#m?.().toString(); + + deep?.very.o?.Foo.#m?.(); + deep?.very.o?.Foo.#m?.().toString; + deep?.very.o?.Foo.#m?.().toString(); + + o?.Foo.#self.#m?.(); + o?.Foo.#self.self.#m?.(); + o?.Foo.#self?.self.#m?.(); + o?.Foo.#self.self?.self.#m?.(); + o?.Foo.#self?.self?.self.#m?.(); + + o?.Foo.#self.getSelf().#m?.(); + o?.Foo.#self.getSelf?.().#m?.(); + o?.Foo.#self?.getSelf().#m?.(); + o?.Foo.#self?.getSelf?.().#m?.(); + o?.Foo.#self.getSelf()?.self.#m?.(); + o?.Foo.#self.getSelf?.()?.self.#m?.(); + o?.Foo.#self?.getSelf()?.self.#m?.(); + o?.Foo.#self?.getSelf?.()?.self.#m?.(); + + fn?.().Foo.#m?.(); + fn?.().Foo.#m?.().toString; + fn?.().Foo.#m?.().toString(); + + fnDeep?.().very.o?.Foo.#m?.(); + fnDeep?.().very.o?.Foo.#m?.().toString; + fnDeep?.().very.o?.Foo.#m?.().toString(); + + fn?.().Foo.#self.#m?.(); + fn?.().Foo.#self.self.#m?.(); + fn?.().Foo.#self?.self.#m?.(); + fn?.().Foo.#self.self?.self.#m?.(); + fn?.().Foo.#self?.self?.self.#m?.(); + + fn?.().Foo.#self.getSelf().#m?.(); + fn?.().Foo.#self.getSelf?.().#m?.(); + fn?.().Foo.#self?.getSelf().#m?.(); + fn?.().Foo.#self?.getSelf?.().#m?.(); + fn?.().Foo.#self.getSelf()?.self.#m?.(); + fn?.().Foo.#self.getSelf?.()?.self.#m?.(); + fn?.().Foo.#self?.getSelf()?.self.#m?.(); + fn?.().Foo.#self?.getSelf?.()?.self.#m?.(); + } + +} + +Foo.test(); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-member-optional-call-with-transform/options.json b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-member-optional-call-with-transform/options.json new file mode 100644 index 000000000000..63b4c77cc8e8 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-member-optional-call-with-transform/options.json @@ -0,0 +1,3 @@ +{ + "plugins": ["proposal-optional-chaining", "proposal-class-properties"] +} diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-member-optional-call-with-transform/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-member-optional-call-with-transform/output.js new file mode 100644 index 000000000000..349cb4e9e213 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-member-optional-call-with-transform/output.js @@ -0,0 +1,92 @@ +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +function _classStaticPrivateFieldSpecGet(receiver, classConstructor, descriptor) { if (receiver !== classConstructor) { throw new TypeError("Private static access of wrong provenance"); } if (descriptor.get) { return descriptor.get.call(receiver); } return descriptor.value; } + +class Foo { + static getSelf() { + return this; + } + + static test() { + var _o$Foo, _o$Foo2, _o$Foo3, _deep$very$o, _deep$very$o$Foo, _deep$very$o2, _deep$very$o2$Foo, _deep$very$o3, _deep$very$o3$Foo, _classStaticPrivateFi, _classStaticPrivateFi2, _ref, _ref$self, _ref2, _ref2$self, _self2, _self2$self, _classStaticPrivateFi3, _classStaticPrivateFi4, _ref3, _ref3$call, _ref4, _ref4$getSelf, _getSelf, _ref5, _getSelf$call, _ref6, _ref6$self, _classStaticPrivateFi5, _call, _call$self, _getSelf2, _getSelf2$self, _getSelf3, _getSelf3$self, _fn$Foo, _fn$Foo2, _fn$Foo3, _fnDeep$very$o, _fnDeep$very$o$Foo, _fnDeep$very$o2, _fnDeep$very$o2$Foo, _fnDeep$very$o3, _fnDeep$very$o3$Foo, _classStaticPrivateFi6, _classStaticPrivateFi7, _ref7, _ref7$self, _ref8, _ref8$self, _self3, _self3$self, _classStaticPrivateFi8, _classStaticPrivateFi9, _ref9, _ref9$call, _ref10, _ref10$getSelf, _getSelf4, _ref11, _getSelf4$call, _ref12, _ref12$self, _classStaticPrivateFi10, _call2, _call2$self, _getSelf5, _getSelf5$self, _getSelf6, _getSelf6$self, _classStaticPrivateFi11, _classStaticPrivateFi12, _classStaticPrivateFi13, _classStaticPrivateFi14, _classStaticPrivateFi15, _classStaticPrivateFi16, _classStaticPrivateFi17, _classStaticPrivateFi18, _classStaticPrivateFi19, _ref13, _ref14, _classStaticPrivateFi20, _classStaticPrivateFi21, _ref15, _classStaticPrivateFi22, _ref16, _classStaticPrivateFi23, _classStaticPrivateFi24, _ref17, _classStaticPrivateFi25, _classStaticPrivateFi26, _ref18, _classStaticPrivateFi27, _ref19, _classStaticPrivateFi28, _ref20, _ref20$getSelf, _classStaticPrivateFi29, _classStaticPrivateFi30, _classStaticPrivateFi31, _classStaticPrivateFi32, _classStaticPrivateFi33, _classStaticPrivateFi34, _classStaticPrivateFi35, _ref21, _ref22, _classStaticPrivateFi36, _classStaticPrivateFi37, _ref23, _classStaticPrivateFi38, _ref24, _classStaticPrivateFi39, _classStaticPrivateFi40, _ref25, _classStaticPrivateFi41, _classStaticPrivateFi42, _ref26, _classStaticPrivateFi43, _ref27, _classStaticPrivateFi44, _ref28, _ref28$getSelf, _classStaticPrivateFi45; + + const o = { + Foo: Foo + }; + const deep = { + very: { + o + } + }; + + function fn() { + return o; + } + + function fnDeep() { + return deep; + } + + (_classStaticPrivateFi11 = _classStaticPrivateFieldSpecGet(Foo, Foo, _m)) === null || _classStaticPrivateFi11 === void 0 ? void 0 : _classStaticPrivateFi11.call(Foo); + (_classStaticPrivateFi12 = _classStaticPrivateFieldSpecGet(Foo, Foo, _m)) === null || _classStaticPrivateFi12 === void 0 ? void 0 : _classStaticPrivateFi12.call(Foo).toString; + (_classStaticPrivateFi13 = _classStaticPrivateFieldSpecGet(Foo, Foo, _m)) === null || _classStaticPrivateFi13 === void 0 ? void 0 : _classStaticPrivateFi13.call(Foo).toString(); + o === null || o === void 0 ? void 0 : (_classStaticPrivateFi14 = _classStaticPrivateFieldSpecGet(_o$Foo = o.Foo, Foo, _m)) === null || _classStaticPrivateFi14 === void 0 ? void 0 : _classStaticPrivateFi14.call(_o$Foo); + o === null || o === void 0 ? void 0 : (_classStaticPrivateFi15 = _classStaticPrivateFieldSpecGet(_o$Foo2 = o.Foo, Foo, _m)) === null || _classStaticPrivateFi15 === void 0 ? void 0 : _classStaticPrivateFi15.call(_o$Foo2).toString; + o === null || o === void 0 ? void 0 : (_classStaticPrivateFi16 = _classStaticPrivateFieldSpecGet(_o$Foo3 = o.Foo, Foo, _m)) === null || _classStaticPrivateFi16 === void 0 ? void 0 : _classStaticPrivateFi16.call(_o$Foo3).toString(); + (_deep$very$o = deep === null || deep === void 0 ? void 0 : deep.very.o) === null || _deep$very$o === void 0 ? void 0 : (_classStaticPrivateFi17 = _classStaticPrivateFieldSpecGet(_deep$very$o$Foo = _deep$very$o.Foo, Foo, _m)) === null || _classStaticPrivateFi17 === void 0 ? void 0 : _classStaticPrivateFi17.call(_deep$very$o$Foo); + (_deep$very$o2 = deep === null || deep === void 0 ? void 0 : deep.very.o) === null || _deep$very$o2 === void 0 ? void 0 : (_classStaticPrivateFi18 = _classStaticPrivateFieldSpecGet(_deep$very$o2$Foo = _deep$very$o2.Foo, Foo, _m)) === null || _classStaticPrivateFi18 === void 0 ? void 0 : _classStaticPrivateFi18.call(_deep$very$o2$Foo).toString; + (_deep$very$o3 = deep === null || deep === void 0 ? void 0 : deep.very.o) === null || _deep$very$o3 === void 0 ? void 0 : (_classStaticPrivateFi19 = _classStaticPrivateFieldSpecGet(_deep$very$o3$Foo = _deep$very$o3.Foo, Foo, _m)) === null || _classStaticPrivateFi19 === void 0 ? void 0 : _classStaticPrivateFi19.call(_deep$very$o3$Foo).toString(); + (_ref13 = o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_classStaticPrivateFi = _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self), Foo, _m)) === null || _ref13 === void 0 ? void 0 : _ref13.call(_classStaticPrivateFi); + (_ref14 = o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_classStaticPrivateFi2 = _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self).self, Foo, _m)) === null || _ref14 === void 0 ? void 0 : _ref14.call(_classStaticPrivateFi2); + (_ref = o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self)) === null || _ref === void 0 ? void 0 : (_classStaticPrivateFi20 = _classStaticPrivateFieldSpecGet(_ref$self = _ref.self, Foo, _m)) === null || _classStaticPrivateFi20 === void 0 ? void 0 : _classStaticPrivateFi20.call(_ref$self); + (_ref2 = o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self).self) === null || _ref2 === void 0 ? void 0 : (_classStaticPrivateFi21 = _classStaticPrivateFieldSpecGet(_ref2$self = _ref2.self, Foo, _m)) === null || _classStaticPrivateFi21 === void 0 ? void 0 : _classStaticPrivateFi21.call(_ref2$self); + (_self2 = (_ref15 = o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self)) === null || _ref15 === void 0 ? void 0 : _ref15.self) === null || _self2 === void 0 ? void 0 : (_classStaticPrivateFi22 = _classStaticPrivateFieldSpecGet(_self2$self = _self2.self, Foo, _m)) === null || _classStaticPrivateFi22 === void 0 ? void 0 : _classStaticPrivateFi22.call(_self2$self); + (_ref16 = o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_classStaticPrivateFi3 = _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self).getSelf(), Foo, _m)) === null || _ref16 === void 0 ? void 0 : _ref16.call(_classStaticPrivateFi3); + (_ref3 = o === null || o === void 0 ? void 0 : (_classStaticPrivateFi4 = _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self)).getSelf) === null || _ref3 === void 0 ? void 0 : (_classStaticPrivateFi23 = _classStaticPrivateFieldSpecGet(_ref3$call = _ref3.call(_classStaticPrivateFi4), Foo, _m)) === null || _classStaticPrivateFi23 === void 0 ? void 0 : _classStaticPrivateFi23.call(_ref3$call); + (_ref4 = o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self)) === null || _ref4 === void 0 ? void 0 : (_classStaticPrivateFi24 = _classStaticPrivateFieldSpecGet(_ref4$getSelf = _ref4.getSelf(), Foo, _m)) === null || _classStaticPrivateFi24 === void 0 ? void 0 : _classStaticPrivateFi24.call(_ref4$getSelf); + (_getSelf = (_ref17 = _ref5 = o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self)) === null || _ref17 === void 0 ? void 0 : _ref17.getSelf) === null || _getSelf === void 0 ? void 0 : (_classStaticPrivateFi25 = _classStaticPrivateFieldSpecGet(_getSelf$call = _getSelf.call(_ref5), Foo, _m)) === null || _classStaticPrivateFi25 === void 0 ? void 0 : _classStaticPrivateFi25.call(_getSelf$call); + (_ref6 = o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self).getSelf()) === null || _ref6 === void 0 ? void 0 : (_classStaticPrivateFi26 = _classStaticPrivateFieldSpecGet(_ref6$self = _ref6.self, Foo, _m)) === null || _classStaticPrivateFi26 === void 0 ? void 0 : _classStaticPrivateFi26.call(_ref6$self); + (_call = (_ref18 = o === null || o === void 0 ? void 0 : (_classStaticPrivateFi5 = _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self)).getSelf) === null || _ref18 === void 0 ? void 0 : _ref18.call(_classStaticPrivateFi5)) === null || _call === void 0 ? void 0 : (_classStaticPrivateFi27 = _classStaticPrivateFieldSpecGet(_call$self = _call.self, Foo, _m)) === null || _classStaticPrivateFi27 === void 0 ? void 0 : _classStaticPrivateFi27.call(_call$self); + (_getSelf2 = (_ref19 = o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self)) === null || _ref19 === void 0 ? void 0 : _ref19.getSelf()) === null || _getSelf2 === void 0 ? void 0 : (_classStaticPrivateFi28 = _classStaticPrivateFieldSpecGet(_getSelf2$self = _getSelf2.self, Foo, _m)) === null || _classStaticPrivateFi28 === void 0 ? void 0 : _classStaticPrivateFi28.call(_getSelf2$self); + (_getSelf3 = (_ref20 = o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self)) === null || _ref20 === void 0 ? void 0 : (_ref20$getSelf = _ref20.getSelf) === null || _ref20$getSelf === void 0 ? void 0 : _ref20$getSelf.call(_ref20)) === null || _getSelf3 === void 0 ? void 0 : (_classStaticPrivateFi29 = _classStaticPrivateFieldSpecGet(_getSelf3$self = _getSelf3.self, Foo, _m)) === null || _classStaticPrivateFi29 === void 0 ? void 0 : _classStaticPrivateFi29.call(_getSelf3$self); + fn === null || fn === void 0 ? void 0 : (_classStaticPrivateFi30 = _classStaticPrivateFieldSpecGet(_fn$Foo = fn().Foo, Foo, _m)) === null || _classStaticPrivateFi30 === void 0 ? void 0 : _classStaticPrivateFi30.call(_fn$Foo); + fn === null || fn === void 0 ? void 0 : (_classStaticPrivateFi31 = _classStaticPrivateFieldSpecGet(_fn$Foo2 = fn().Foo, Foo, _m)) === null || _classStaticPrivateFi31 === void 0 ? void 0 : _classStaticPrivateFi31.call(_fn$Foo2).toString; + fn === null || fn === void 0 ? void 0 : (_classStaticPrivateFi32 = _classStaticPrivateFieldSpecGet(_fn$Foo3 = fn().Foo, Foo, _m)) === null || _classStaticPrivateFi32 === void 0 ? void 0 : _classStaticPrivateFi32.call(_fn$Foo3).toString(); + (_fnDeep$very$o = fnDeep === null || fnDeep === void 0 ? void 0 : fnDeep().very.o) === null || _fnDeep$very$o === void 0 ? void 0 : (_classStaticPrivateFi33 = _classStaticPrivateFieldSpecGet(_fnDeep$very$o$Foo = _fnDeep$very$o.Foo, Foo, _m)) === null || _classStaticPrivateFi33 === void 0 ? void 0 : _classStaticPrivateFi33.call(_fnDeep$very$o$Foo); + (_fnDeep$very$o2 = fnDeep === null || fnDeep === void 0 ? void 0 : fnDeep().very.o) === null || _fnDeep$very$o2 === void 0 ? void 0 : (_classStaticPrivateFi34 = _classStaticPrivateFieldSpecGet(_fnDeep$very$o2$Foo = _fnDeep$very$o2.Foo, Foo, _m)) === null || _classStaticPrivateFi34 === void 0 ? void 0 : _classStaticPrivateFi34.call(_fnDeep$very$o2$Foo).toString; + (_fnDeep$very$o3 = fnDeep === null || fnDeep === void 0 ? void 0 : fnDeep().very.o) === null || _fnDeep$very$o3 === void 0 ? void 0 : (_classStaticPrivateFi35 = _classStaticPrivateFieldSpecGet(_fnDeep$very$o3$Foo = _fnDeep$very$o3.Foo, Foo, _m)) === null || _classStaticPrivateFi35 === void 0 ? void 0 : _classStaticPrivateFi35.call(_fnDeep$very$o3$Foo).toString(); + (_ref21 = fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_classStaticPrivateFi6 = _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self), Foo, _m)) === null || _ref21 === void 0 ? void 0 : _ref21.call(_classStaticPrivateFi6); + (_ref22 = fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_classStaticPrivateFi7 = _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self).self, Foo, _m)) === null || _ref22 === void 0 ? void 0 : _ref22.call(_classStaticPrivateFi7); + (_ref7 = fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self)) === null || _ref7 === void 0 ? void 0 : (_classStaticPrivateFi36 = _classStaticPrivateFieldSpecGet(_ref7$self = _ref7.self, Foo, _m)) === null || _classStaticPrivateFi36 === void 0 ? void 0 : _classStaticPrivateFi36.call(_ref7$self); + (_ref8 = fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self).self) === null || _ref8 === void 0 ? void 0 : (_classStaticPrivateFi37 = _classStaticPrivateFieldSpecGet(_ref8$self = _ref8.self, Foo, _m)) === null || _classStaticPrivateFi37 === void 0 ? void 0 : _classStaticPrivateFi37.call(_ref8$self); + (_self3 = (_ref23 = fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self)) === null || _ref23 === void 0 ? void 0 : _ref23.self) === null || _self3 === void 0 ? void 0 : (_classStaticPrivateFi38 = _classStaticPrivateFieldSpecGet(_self3$self = _self3.self, Foo, _m)) === null || _classStaticPrivateFi38 === void 0 ? void 0 : _classStaticPrivateFi38.call(_self3$self); + (_ref24 = fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_classStaticPrivateFi8 = _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self).getSelf(), Foo, _m)) === null || _ref24 === void 0 ? void 0 : _ref24.call(_classStaticPrivateFi8); + (_ref9 = fn === null || fn === void 0 ? void 0 : (_classStaticPrivateFi9 = _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self)).getSelf) === null || _ref9 === void 0 ? void 0 : (_classStaticPrivateFi39 = _classStaticPrivateFieldSpecGet(_ref9$call = _ref9.call(_classStaticPrivateFi9), Foo, _m)) === null || _classStaticPrivateFi39 === void 0 ? void 0 : _classStaticPrivateFi39.call(_ref9$call); + (_ref10 = fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self)) === null || _ref10 === void 0 ? void 0 : (_classStaticPrivateFi40 = _classStaticPrivateFieldSpecGet(_ref10$getSelf = _ref10.getSelf(), Foo, _m)) === null || _classStaticPrivateFi40 === void 0 ? void 0 : _classStaticPrivateFi40.call(_ref10$getSelf); + (_getSelf4 = (_ref25 = _ref11 = fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self)) === null || _ref25 === void 0 ? void 0 : _ref25.getSelf) === null || _getSelf4 === void 0 ? void 0 : (_classStaticPrivateFi41 = _classStaticPrivateFieldSpecGet(_getSelf4$call = _getSelf4.call(_ref11), Foo, _m)) === null || _classStaticPrivateFi41 === void 0 ? void 0 : _classStaticPrivateFi41.call(_getSelf4$call); + (_ref12 = fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self).getSelf()) === null || _ref12 === void 0 ? void 0 : (_classStaticPrivateFi42 = _classStaticPrivateFieldSpecGet(_ref12$self = _ref12.self, Foo, _m)) === null || _classStaticPrivateFi42 === void 0 ? void 0 : _classStaticPrivateFi42.call(_ref12$self); + (_call2 = (_ref26 = fn === null || fn === void 0 ? void 0 : (_classStaticPrivateFi10 = _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self)).getSelf) === null || _ref26 === void 0 ? void 0 : _ref26.call(_classStaticPrivateFi10)) === null || _call2 === void 0 ? void 0 : (_classStaticPrivateFi43 = _classStaticPrivateFieldSpecGet(_call2$self = _call2.self, Foo, _m)) === null || _classStaticPrivateFi43 === void 0 ? void 0 : _classStaticPrivateFi43.call(_call2$self); + (_getSelf5 = (_ref27 = fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self)) === null || _ref27 === void 0 ? void 0 : _ref27.getSelf()) === null || _getSelf5 === void 0 ? void 0 : (_classStaticPrivateFi44 = _classStaticPrivateFieldSpecGet(_getSelf5$self = _getSelf5.self, Foo, _m)) === null || _classStaticPrivateFi44 === void 0 ? void 0 : _classStaticPrivateFi44.call(_getSelf5$self); + (_getSelf6 = (_ref28 = fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self)) === null || _ref28 === void 0 ? void 0 : (_ref28$getSelf = _ref28.getSelf) === null || _ref28$getSelf === void 0 ? void 0 : _ref28$getSelf.call(_ref28)) === null || _getSelf6 === void 0 ? void 0 : (_classStaticPrivateFi45 = _classStaticPrivateFieldSpecGet(_getSelf6$self = _getSelf6.self, Foo, _m)) === null || _classStaticPrivateFi45 === void 0 ? void 0 : _classStaticPrivateFi45.call(_getSelf6$self); + } + +} + +var _x = { + writable: true, + value: 1 +}; +var _m = { + writable: true, + value: function () { + return _classStaticPrivateFieldSpecGet(this, Foo, _x); + } +}; +var _self = { + writable: true, + value: Foo +}; + +_defineProperty(Foo, "self", Foo); + +Foo.test(); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-member-optional-call/exec.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-member-optional-call/exec.js new file mode 100644 index 000000000000..6e82fc8d6543 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-member-optional-call/exec.js @@ -0,0 +1,126 @@ +class Foo { + static #x = 1; + static #m = function() { return this.#x; }; + static #self = Foo; + static self = Foo; + static getSelf() { return this } + + static test() { + const o = { Foo: Foo }; + const deep = { very: { o } }; + function fn() { + return o; + } + function fnDeep() { + return deep; + } + + expect(Foo.#m?.()).toEqual(1); + expect(Foo.#m?.().toString).toEqual(1..toString); + expect(Foo.#m?.().toString()).toEqual('1'); + + expect(o?.Foo.#m?.()).toEqual(1); + expect(o?.Foo.#m?.().toString).toEqual(1..toString); + expect(o?.Foo.#m?.().toString()).toEqual('1'); + + expect(deep?.very.o?.Foo.#m?.()).toEqual(1); + expect(deep?.very.o?.Foo.#m?.().toString).toEqual(1..toString); + expect(deep?.very.o?.Foo.#m?.().toString()).toEqual('1'); + + expect(o?.Foo.#self.#m?.()).toEqual(1); + expect(o?.Foo.#self.self.#m?.()).toEqual(1); + expect(o?.Foo.#self?.self.#m?.()).toEqual(1); + expect(o?.Foo.#self.self?.self.#m?.()).toEqual(1); + expect(o?.Foo.#self?.self?.self.#m?.()).toEqual(1); + + expect(o?.Foo.#self.getSelf().#m?.()).toEqual(1); + expect(o?.Foo.#self.getSelf?.().#m?.()).toEqual(1); + expect(o?.Foo.#self?.getSelf().#m?.()).toEqual(1); + expect(o?.Foo.#self?.getSelf?.().#m?.()).toEqual(1); + expect(o?.Foo.#self.getSelf()?.self.#m?.()).toEqual(1); + expect(o?.Foo.#self.getSelf?.()?.self.#m?.()).toEqual(1); + expect(o?.Foo.#self?.getSelf()?.self.#m?.()).toEqual(1); + expect(o?.Foo.#self?.getSelf?.()?.self.#m?.()).toEqual(1); + + expect(fn?.().Foo.#m?.()).toEqual(1); + expect(fn?.().Foo.#m?.().toString).toEqual(1..toString); + expect(fn?.().Foo.#m?.().toString()).toEqual('1'); + + expect(fnDeep?.().very.o?.Foo.#m?.()).toEqual(1); + expect(fnDeep?.().very.o?.Foo.#m?.().toString).toEqual(1..toString); + expect(fnDeep?.().very.o?.Foo.#m?.().toString()).toEqual('1'); + + expect(fn?.().Foo.#self.#m?.()).toEqual(1); + expect(fn?.().Foo.#self.self.#m?.()).toEqual(1); + expect(fn?.().Foo.#self?.self.#m?.()).toEqual(1); + expect(fn?.().Foo.#self.self?.self.#m?.()).toEqual(1); + expect(fn?.().Foo.#self?.self?.self.#m?.()).toEqual(1); + + expect(fn?.().Foo.#self.getSelf().#m?.()).toEqual(1); + expect(fn?.().Foo.#self.getSelf?.().#m?.()).toEqual(1); + expect(fn?.().Foo.#self?.getSelf().#m?.()).toEqual(1); + expect(fn?.().Foo.#self?.getSelf?.().#m?.()).toEqual(1); + expect(fn?.().Foo.#self.getSelf()?.self.#m?.()).toEqual(1); + expect(fn?.().Foo.#self.getSelf?.()?.self.#m?.()).toEqual(1); + expect(fn?.().Foo.#self?.getSelf()?.self.#m?.()).toEqual(1); + expect(fn?.().Foo.#self?.getSelf?.()?.self.#m?.()).toEqual(1); + } + + static testNull() { + const o = null;; + const deep = { very: { o } }; + const fn = null; + function fnDeep() { + return deep; + } + + expect(o?.Foo.#m?.()).toEqual(undefined); + expect(o?.Foo.#m?.().toString).toEqual(undefined); + expect(o?.Foo.#m?.().toString()).toEqual(undefined); + + expect(deep?.very.o?.Foo.#m?.()).toEqual(undefined); + expect(deep?.very.o?.Foo.#m?.().toString).toEqual(undefined); + expect(deep?.very.o?.Foo.#m?.().toString()).toEqual(undefined); + + expect(o?.Foo.#self.#m?.()).toEqual(undefined); + expect(o?.Foo.#self.self.#m?.()).toEqual(undefined); + expect(o?.Foo.#self?.self.#m?.()).toEqual(undefined); + expect(o?.Foo.#self.self?.self.#m?.()).toEqual(undefined); + expect(o?.Foo.#self?.self?.self.#m?.()).toEqual(undefined); + + expect(o?.Foo.#self.getSelf().#m?.()).toEqual(undefined); + expect(o?.Foo.#self.getSelf?.().#m?.()).toEqual(undefined); + expect(o?.Foo.#self?.getSelf().#m?.()).toEqual(undefined); + expect(o?.Foo.#self?.getSelf?.().#m?.()).toEqual(undefined); + expect(o?.Foo.#self.getSelf()?.self.#m?.()).toEqual(undefined); + expect(o?.Foo.#self.getSelf?.()?.self.#m?.()).toEqual(undefined); + expect(o?.Foo.#self?.getSelf()?.self.#m?.()).toEqual(undefined); + expect(o?.Foo.#self?.getSelf?.()?.self.#m?.()).toEqual(undefined); + + expect(fn?.().Foo.#m?.()).toEqual(undefined); + expect(fn?.().Foo.#m?.().toString).toEqual(undefined); + expect(fn?.().Foo.#m?.().toString()).toEqual(undefined); + + expect(fnDeep?.().very.o?.Foo.#m?.()).toEqual(undefined); + expect(fnDeep?.().very.o?.Foo.#m?.().toString).toEqual(undefined); + expect(fnDeep?.().very.o?.Foo.#m?.().toString()).toEqual(undefined); + + expect(fn?.().Foo.#self.#m?.()).toEqual(undefined); + expect(fn?.().Foo.#self.self.#m?.()).toEqual(undefined); + expect(fn?.().Foo.#self?.self.#m?.()).toEqual(undefined); + expect(fn?.().Foo.#self.self?.self.#m?.()).toEqual(undefined); + expect(fn?.().Foo.#self?.self?.self.#m?.()).toEqual(undefined); + + expect(fn?.().Foo.#self.getSelf().#m?.()).toEqual(undefined); + expect(fn?.().Foo.#self.getSelf?.().#m?.()).toEqual(undefined); + expect(fn?.().Foo.#self?.getSelf().#m?.()).toEqual(undefined); + expect(fn?.().Foo.#self?.getSelf?.().#m?.()).toEqual(undefined); + expect(fn?.().Foo.#self.getSelf()?.self.#m?.()).toEqual(undefined); + expect(fn?.().Foo.#self.getSelf?.()?.self.#m?.()).toEqual(undefined); + expect(fn?.().Foo.#self?.getSelf()?.self.#m?.()).toEqual(undefined); + expect(fn?.().Foo.#self?.getSelf?.()?.self.#m?.()).toEqual(undefined); + } +} + +Foo.test(); +Foo.testNull(); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-member-optional-call/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-member-optional-call/input.js new file mode 100644 index 000000000000..11dd4a57060d --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-member-optional-call/input.js @@ -0,0 +1,71 @@ +class Foo { + static #x = 1; + static #m = function() { return this.#x; }; + static #self = Foo; + static self = Foo; + static getSelf() { return this } + + static test() { + const o = { Foo: Foo }; + const deep = { very: { o } }; + function fn() { + return o; + } + function fnDeep() { + return deep; + } + + Foo.#m?.(); + Foo.#m?.().toString; + Foo.#m?.().toString(); + + o?.Foo.#m?.(); + o?.Foo.#m?.().toString; + o?.Foo.#m?.().toString(); + + deep?.very.o?.Foo.#m?.(); + deep?.very.o?.Foo.#m?.().toString; + deep?.very.o?.Foo.#m?.().toString(); + + o?.Foo.#self.#m?.(); + o?.Foo.#self.self.#m?.(); + o?.Foo.#self?.self.#m?.(); + o?.Foo.#self.self?.self.#m?.(); + o?.Foo.#self?.self?.self.#m?.(); + + o?.Foo.#self.getSelf().#m?.(); + o?.Foo.#self.getSelf?.().#m?.(); + o?.Foo.#self?.getSelf().#m?.(); + o?.Foo.#self?.getSelf?.().#m?.(); + o?.Foo.#self.getSelf()?.self.#m?.(); + o?.Foo.#self.getSelf?.()?.self.#m?.(); + o?.Foo.#self?.getSelf()?.self.#m?.(); + o?.Foo.#self?.getSelf?.()?.self.#m?.(); + + fn?.().Foo.#m?.(); + fn?.().Foo.#m?.().toString; + fn?.().Foo.#m?.().toString(); + + fnDeep?.().very.o?.Foo.#m?.(); + fnDeep?.().very.o?.Foo.#m?.().toString; + fnDeep?.().very.o?.Foo.#m?.().toString(); + + fn?.().Foo.#self.#m?.(); + fn?.().Foo.#self.self.#m?.(); + fn?.().Foo.#self?.self.#m?.(); + fn?.().Foo.#self.self?.self.#m?.(); + fn?.().Foo.#self?.self?.self.#m?.(); + + fn?.().Foo.#self.getSelf().#m?.(); + fn?.().Foo.#self.getSelf?.().#m?.(); + fn?.().Foo.#self?.getSelf().#m?.(); + fn?.().Foo.#self?.getSelf?.().#m?.(); + fn?.().Foo.#self.getSelf()?.self.#m?.(); + fn?.().Foo.#self.getSelf?.()?.self.#m?.(); + fn?.().Foo.#self?.getSelf()?.self.#m?.(); + fn?.().Foo.#self?.getSelf?.()?.self.#m?.(); + } + +} + +Foo.test(); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-member-optional-call/options.json b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-member-optional-call/options.json new file mode 100644 index 000000000000..3b59e1bbfcc8 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-member-optional-call/options.json @@ -0,0 +1,4 @@ +{ + "plugins": ["proposal-class-properties"], + "minNodeVersion": "14.0.0" +} diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-member-optional-call/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-member-optional-call/output.js new file mode 100644 index 000000000000..c9e4dcb46a81 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-member-optional-call/output.js @@ -0,0 +1,92 @@ +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +function _classStaticPrivateFieldSpecGet(receiver, classConstructor, descriptor) { if (receiver !== classConstructor) { throw new TypeError("Private static access of wrong provenance"); } if (descriptor.get) { return descriptor.get.call(receiver); } return descriptor.value; } + +class Foo { + static getSelf() { + return this; + } + + static test() { + var _o$Foo, _o$Foo2, _o$Foo3, _deep$very$o, _deep$very$o$Foo, _deep$very$o2, _deep$very$o2$Foo, _deep$very$o3, _deep$very$o3$Foo, _classStaticPrivateFi, _classStaticPrivateFi2, _ref, _ref$self, _ref2, _ref2$self, _self2, _self2$self, _classStaticPrivateFi3, _classStaticPrivateFi4, _ref3, _ref3$call, _ref4, _ref4$getSelf, _getSelf, _ref5, _getSelf$call, _ref6, _ref6$self, _classStaticPrivateFi5, _call, _call$self, _getSelf2, _getSelf2$self, _getSelf3, _getSelf3$self, _fn$Foo, _fn$Foo2, _fn$Foo3, _fnDeep$very$o, _fnDeep$very$o$Foo, _fnDeep$very$o2, _fnDeep$very$o2$Foo, _fnDeep$very$o3, _fnDeep$very$o3$Foo, _classStaticPrivateFi6, _classStaticPrivateFi7, _ref7, _ref7$self, _ref8, _ref8$self, _self3, _self3$self, _classStaticPrivateFi8, _classStaticPrivateFi9, _ref9, _ref9$call, _ref10, _ref10$getSelf, _getSelf4, _ref11, _getSelf4$call, _ref12, _ref12$self, _classStaticPrivateFi10, _call2, _call2$self, _getSelf5, _getSelf5$self, _getSelf6, _getSelf6$self; + + const o = { + Foo: Foo + }; + const deep = { + very: { + o + } + }; + + function fn() { + return o; + } + + function fnDeep() { + return deep; + } + + _classStaticPrivateFieldSpecGet(Foo, Foo, _m)?.call(Foo); + _classStaticPrivateFieldSpecGet(Foo, Foo, _m)?.call(Foo).toString; + _classStaticPrivateFieldSpecGet(Foo, Foo, _m)?.call(Foo).toString(); + o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_o$Foo = o.Foo, Foo, _m)?.call(_o$Foo); + o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_o$Foo2 = o.Foo, Foo, _m)?.call(_o$Foo2).toString; + o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_o$Foo3 = o.Foo, Foo, _m)?.call(_o$Foo3).toString(); + (_deep$very$o = deep?.very.o) === null || _deep$very$o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_deep$very$o$Foo = _deep$very$o.Foo, Foo, _m)?.call(_deep$very$o$Foo); + (_deep$very$o2 = deep?.very.o) === null || _deep$very$o2 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_deep$very$o2$Foo = _deep$very$o2.Foo, Foo, _m)?.call(_deep$very$o2$Foo).toString; + (_deep$very$o3 = deep?.very.o) === null || _deep$very$o3 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_deep$very$o3$Foo = _deep$very$o3.Foo, Foo, _m)?.call(_deep$very$o3$Foo).toString(); + (o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_classStaticPrivateFi = _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self), Foo, _m))?.call(_classStaticPrivateFi); + (o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_classStaticPrivateFi2 = _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self).self, Foo, _m))?.call(_classStaticPrivateFi2); + (_ref = o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self)) === null || _ref === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_ref$self = _ref.self, Foo, _m)?.call(_ref$self); + (_ref2 = o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self).self) === null || _ref2 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_ref2$self = _ref2.self, Foo, _m)?.call(_ref2$self); + (_self2 = (o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self))?.self) === null || _self2 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_self2$self = _self2.self, Foo, _m)?.call(_self2$self); + (o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_classStaticPrivateFi3 = _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self).getSelf(), Foo, _m))?.call(_classStaticPrivateFi3); + (_ref3 = o === null || o === void 0 ? void 0 : (_classStaticPrivateFi4 = _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self)).getSelf) === null || _ref3 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_ref3$call = _ref3.call(_classStaticPrivateFi4), Foo, _m)?.call(_ref3$call); + (_ref4 = o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self)) === null || _ref4 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_ref4$getSelf = _ref4.getSelf(), Foo, _m)?.call(_ref4$getSelf); + (_getSelf = (_ref5 = o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self))?.getSelf) === null || _getSelf === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_getSelf$call = _getSelf.call(_ref5), Foo, _m)?.call(_getSelf$call); + (_ref6 = o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self).getSelf()) === null || _ref6 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_ref6$self = _ref6.self, Foo, _m)?.call(_ref6$self); + (_call = (o === null || o === void 0 ? void 0 : (_classStaticPrivateFi5 = _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self)).getSelf)?.call(_classStaticPrivateFi5)) === null || _call === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_call$self = _call.self, Foo, _m)?.call(_call$self); + (_getSelf2 = (o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self))?.getSelf()) === null || _getSelf2 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_getSelf2$self = _getSelf2.self, Foo, _m)?.call(_getSelf2$self); + (_getSelf3 = (o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self))?.getSelf?.()) === null || _getSelf3 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_getSelf3$self = _getSelf3.self, Foo, _m)?.call(_getSelf3$self); + fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_fn$Foo = fn().Foo, Foo, _m)?.call(_fn$Foo); + fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_fn$Foo2 = fn().Foo, Foo, _m)?.call(_fn$Foo2).toString; + fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_fn$Foo3 = fn().Foo, Foo, _m)?.call(_fn$Foo3).toString(); + (_fnDeep$very$o = fnDeep?.().very.o) === null || _fnDeep$very$o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_fnDeep$very$o$Foo = _fnDeep$very$o.Foo, Foo, _m)?.call(_fnDeep$very$o$Foo); + (_fnDeep$very$o2 = fnDeep?.().very.o) === null || _fnDeep$very$o2 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_fnDeep$very$o2$Foo = _fnDeep$very$o2.Foo, Foo, _m)?.call(_fnDeep$very$o2$Foo).toString; + (_fnDeep$very$o3 = fnDeep?.().very.o) === null || _fnDeep$very$o3 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_fnDeep$very$o3$Foo = _fnDeep$very$o3.Foo, Foo, _m)?.call(_fnDeep$very$o3$Foo).toString(); + (fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_classStaticPrivateFi6 = _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self), Foo, _m))?.call(_classStaticPrivateFi6); + (fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_classStaticPrivateFi7 = _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self).self, Foo, _m))?.call(_classStaticPrivateFi7); + (_ref7 = fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self)) === null || _ref7 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_ref7$self = _ref7.self, Foo, _m)?.call(_ref7$self); + (_ref8 = fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self).self) === null || _ref8 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_ref8$self = _ref8.self, Foo, _m)?.call(_ref8$self); + (_self3 = (fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self))?.self) === null || _self3 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_self3$self = _self3.self, Foo, _m)?.call(_self3$self); + (fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_classStaticPrivateFi8 = _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self).getSelf(), Foo, _m))?.call(_classStaticPrivateFi8); + (_ref9 = fn === null || fn === void 0 ? void 0 : (_classStaticPrivateFi9 = _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self)).getSelf) === null || _ref9 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_ref9$call = _ref9.call(_classStaticPrivateFi9), Foo, _m)?.call(_ref9$call); + (_ref10 = fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self)) === null || _ref10 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_ref10$getSelf = _ref10.getSelf(), Foo, _m)?.call(_ref10$getSelf); + (_getSelf4 = (_ref11 = fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self))?.getSelf) === null || _getSelf4 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_getSelf4$call = _getSelf4.call(_ref11), Foo, _m)?.call(_getSelf4$call); + (_ref12 = fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self).getSelf()) === null || _ref12 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_ref12$self = _ref12.self, Foo, _m)?.call(_ref12$self); + (_call2 = (fn === null || fn === void 0 ? void 0 : (_classStaticPrivateFi10 = _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self)).getSelf)?.call(_classStaticPrivateFi10)) === null || _call2 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_call2$self = _call2.self, Foo, _m)?.call(_call2$self); + (_getSelf5 = (fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self))?.getSelf()) === null || _getSelf5 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_getSelf5$self = _getSelf5.self, Foo, _m)?.call(_getSelf5$self); + (_getSelf6 = (fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self))?.getSelf?.()) === null || _getSelf6 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_getSelf6$self = _getSelf6.self, Foo, _m)?.call(_getSelf6$self); + } + +} + +var _x = { + writable: true, + value: 1 +}; +var _m = { + writable: true, + value: function () { + return _classStaticPrivateFieldSpecGet(this, Foo, _x); + } +}; +var _self = { + writable: true, + value: Foo +}; + +_defineProperty(Foo, "self", Foo); + +Foo.test(); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-optional-member-call-with-transform/exec.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-optional-member-call-with-transform/exec.js new file mode 100644 index 000000000000..df4319aff69b --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-optional-member-call-with-transform/exec.js @@ -0,0 +1,126 @@ +class Foo { + static #x = 1; + static #m = function() { return this.#x; }; + static #self = Foo; + static self = Foo; + static getSelf() { return this } + + static test() { + const o = { Foo: Foo }; + const deep = { very: { o } }; + function fn() { + return o; + } + function fnDeep() { + return deep; + } + + expect(Foo?.#m()).toEqual(1); + expect(Foo?.#m().toString).toEqual(1..toString); + expect(Foo?.#m().toString()).toEqual('1'); + + expect(o?.Foo?.#m()).toEqual(1); + expect(o?.Foo?.#m().toString).toEqual(1..toString); + expect(o?.Foo?.#m().toString()).toEqual('1'); + + expect(deep?.very.o?.Foo?.#m()).toEqual(1); + expect(deep?.very.o?.Foo?.#m().toString).toEqual(1..toString); + expect(deep?.very.o?.Foo?.#m().toString()).toEqual('1'); + + expect(o?.Foo.#self?.#m()).toEqual(1); + expect(o?.Foo.#self.self?.#m()).toEqual(1); + expect(o?.Foo.#self?.self?.#m()).toEqual(1); + expect(o?.Foo.#self.self?.self?.#m()).toEqual(1); + expect(o?.Foo.#self?.self?.self?.#m()).toEqual(1); + + expect(o?.Foo.#self.getSelf()?.#m()).toEqual(1); + expect(o?.Foo.#self.getSelf?.()?.#m()).toEqual(1); + expect(o?.Foo.#self?.getSelf()?.#m()).toEqual(1); + expect(o?.Foo.#self?.getSelf?.()?.#m()).toEqual(1); + expect(o?.Foo.#self.getSelf()?.self?.#m()).toEqual(1); + expect(o?.Foo.#self.getSelf?.()?.self?.#m()).toEqual(1); + expect(o?.Foo.#self?.getSelf()?.self?.#m()).toEqual(1); + expect(o?.Foo.#self?.getSelf?.()?.self?.#m()).toEqual(1); + + expect(fn?.().Foo?.#m()).toEqual(1); + expect(fn?.().Foo?.#m().toString).toEqual(1..toString); + expect(fn?.().Foo?.#m().toString()).toEqual('1'); + + expect(fnDeep?.().very.o?.Foo?.#m()).toEqual(1); + expect(fnDeep?.().very.o?.Foo?.#m().toString).toEqual(1..toString); + expect(fnDeep?.().very.o?.Foo?.#m().toString()).toEqual('1'); + + expect(fn?.().Foo.#self?.#m()).toEqual(1); + expect(fn?.().Foo.#self.self?.#m()).toEqual(1); + expect(fn?.().Foo.#self?.self?.#m()).toEqual(1); + expect(fn?.().Foo.#self.self?.self?.#m()).toEqual(1); + expect(fn?.().Foo.#self?.self?.self?.#m()).toEqual(1); + + expect(fn?.().Foo.#self.getSelf()?.#m()).toEqual(1); + expect(fn?.().Foo.#self.getSelf?.()?.#m()).toEqual(1); + expect(fn?.().Foo.#self?.getSelf()?.#m()).toEqual(1); + expect(fn?.().Foo.#self?.getSelf?.()?.#m()).toEqual(1); + expect(fn?.().Foo.#self.getSelf()?.self?.#m()).toEqual(1); + expect(fn?.().Foo.#self.getSelf?.()?.self?.#m()).toEqual(1); + expect(fn?.().Foo.#self?.getSelf()?.self?.#m()).toEqual(1); + expect(fn?.().Foo.#self?.getSelf?.()?.self?.#m()).toEqual(1); + } + + static testNull() { + const o = null;; + const deep = { very: { o } }; + const fn = null; + function fnDeep() { + return deep; + } + + expect(o?.Foo?.#m()).toEqual(undefined); + expect(o?.Foo?.#m().toString).toEqual(undefined); + expect(o?.Foo?.#m().toString()).toEqual(undefined); + + expect(deep?.very.o?.Foo?.#m()).toEqual(undefined); + expect(deep?.very.o?.Foo?.#m().toString).toEqual(undefined); + expect(deep?.very.o?.Foo?.#m().toString()).toEqual(undefined); + + expect(o?.Foo.#self?.#m()).toEqual(undefined); + expect(o?.Foo.#self.self?.#m()).toEqual(undefined); + expect(o?.Foo.#self?.self?.#m()).toEqual(undefined); + expect(o?.Foo.#self.self?.self?.#m()).toEqual(undefined); + expect(o?.Foo.#self?.self?.self?.#m()).toEqual(undefined); + + expect(o?.Foo.#self.getSelf()?.#m()).toEqual(undefined); + expect(o?.Foo.#self.getSelf?.()?.#m()).toEqual(undefined); + expect(o?.Foo.#self?.getSelf()?.#m()).toEqual(undefined); + expect(o?.Foo.#self?.getSelf?.()?.#m()).toEqual(undefined); + expect(o?.Foo.#self.getSelf()?.self?.#m()).toEqual(undefined); + expect(o?.Foo.#self.getSelf?.()?.self?.#m()).toEqual(undefined); + expect(o?.Foo.#self?.getSelf()?.self?.#m()).toEqual(undefined); + expect(o?.Foo.#self?.getSelf?.()?.self?.#m()).toEqual(undefined); + + expect(fn?.().Foo?.#m()).toEqual(undefined); + expect(fn?.().Foo?.#m().toString).toEqual(undefined); + expect(fn?.().Foo?.#m().toString()).toEqual(undefined); + + expect(fnDeep?.().very.o?.Foo?.#m()).toEqual(undefined); + expect(fnDeep?.().very.o?.Foo?.#m().toString).toEqual(undefined); + expect(fnDeep?.().very.o?.Foo?.#m().toString()).toEqual(undefined); + + expect(fn?.().Foo.#self?.#m()).toEqual(undefined); + expect(fn?.().Foo.#self.self?.#m()).toEqual(undefined); + expect(fn?.().Foo.#self?.self?.#m()).toEqual(undefined); + expect(fn?.().Foo.#self.self?.self?.#m()).toEqual(undefined); + expect(fn?.().Foo.#self?.self?.self?.#m()).toEqual(undefined); + + expect(fn?.().Foo.#self.getSelf()?.#m()).toEqual(undefined); + expect(fn?.().Foo.#self.getSelf?.()?.#m()).toEqual(undefined); + expect(fn?.().Foo.#self?.getSelf()?.#m()).toEqual(undefined); + expect(fn?.().Foo.#self?.getSelf?.()?.#m()).toEqual(undefined); + expect(fn?.().Foo.#self.getSelf()?.self?.#m()).toEqual(undefined); + expect(fn?.().Foo.#self.getSelf?.()?.self?.#m()).toEqual(undefined); + expect(fn?.().Foo.#self?.getSelf()?.self?.#m()).toEqual(undefined); + expect(fn?.().Foo.#self?.getSelf?.()?.self?.#m()).toEqual(undefined); + } +} + +Foo.test(); +Foo.testNull(); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-optional-member-call-with-transform/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-optional-member-call-with-transform/input.js new file mode 100644 index 000000000000..80f689342109 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-optional-member-call-with-transform/input.js @@ -0,0 +1,70 @@ +class Foo { + static #x = 1; + static #m = function() { return this.#x; }; + static #self = Foo; + static self = Foo; + static getSelf() { return this } + + static test() { + const o = { Foo: Foo }; + const deep = { very: { o } }; + function fn() { + return o; + } + function fnDeep() { + return deep; + } + + Foo?.#m(); + Foo?.#m().toString; + Foo?.#m().toString(); + + o?.Foo?.#m(); + o?.Foo?.#m().toString; + o?.Foo?.#m().toString(); + + deep?.very.o?.Foo?.#m(); + deep?.very.o?.Foo?.#m().toString; + deep?.very.o?.Foo?.#m().toString(); + + o?.Foo.#self?.#m(); + o?.Foo.#self.self?.#m(); + o?.Foo.#self?.self?.#m(); + o?.Foo.#self.self?.self?.#m(); + o?.Foo.#self?.self?.self?.#m(); + + o?.Foo.#self.getSelf()?.#m(); + o?.Foo.#self.getSelf?.()?.#m(); + o?.Foo.#self?.getSelf()?.#m(); + o?.Foo.#self?.getSelf?.()?.#m(); + o?.Foo.#self.getSelf()?.self?.#m(); + o?.Foo.#self.getSelf?.()?.self?.#m(); + o?.Foo.#self?.getSelf()?.self?.#m(); + o?.Foo.#self?.getSelf?.()?.self?.#m(); + + fn?.().Foo?.#m(); + fn?.().Foo?.#m().toString; + fn?.().Foo?.#m().toString(); + + fnDeep?.().very.o?.Foo?.#m(); + fnDeep?.().very.o?.Foo?.#m().toString; + fnDeep?.().very.o?.Foo?.#m().toString(); + + fn?.().Foo.#self?.#m(); + fn?.().Foo.#self.self?.#m(); + fn?.().Foo.#self?.self?.#m(); + fn?.().Foo.#self.self?.self?.#m(); + fn?.().Foo.#self?.self?.self?.#m(); + + fn?.().Foo.#self.getSelf()?.#m(); + fn?.().Foo.#self.getSelf?.()?.#m(); + fn?.().Foo.#self?.getSelf()?.#m(); + fn?.().Foo.#self?.getSelf?.()?.#m(); + fn?.().Foo.#self.getSelf()?.self?.#m(); + fn?.().Foo.#self.getSelf?.()?.self?.#m(); + fn?.().Foo.#self?.getSelf()?.self?.#m(); + fn?.().Foo.#self?.getSelf?.()?.self?.#m(); + } +} + +Foo.test(); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-optional-member-call-with-transform/options.json b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-optional-member-call-with-transform/options.json new file mode 100644 index 000000000000..63b4c77cc8e8 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-optional-member-call-with-transform/options.json @@ -0,0 +1,3 @@ +{ + "plugins": ["proposal-optional-chaining", "proposal-class-properties"] +} diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-optional-member-call-with-transform/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-optional-member-call-with-transform/output.js new file mode 100644 index 000000000000..a2c6eae6d3b4 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-optional-member-call-with-transform/output.js @@ -0,0 +1,92 @@ +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +function _classStaticPrivateFieldSpecGet(receiver, classConstructor, descriptor) { if (receiver !== classConstructor) { throw new TypeError("Private static access of wrong provenance"); } if (descriptor.get) { return descriptor.get.call(receiver); } return descriptor.value; } + +class Foo { + static getSelf() { + return this; + } + + static test() { + var _o$Foo, _o$Foo2, _o$Foo3, _deep$very$o$Foo, _deep$very$o$Foo2, _deep$very$o$Foo3, _ref, _ref2, _self2, _self3, _self$self, _ref3, _classStaticPrivateFi, _call, _getSelf, _getSelf2, _self4, _classStaticPrivateFi2, _call$self, _getSelf$self, _getSelf$self2, _fn$Foo, _fn$Foo2, _fn$Foo3, _fnDeep$very$o$Foo, _fnDeep$very$o$Foo2, _fnDeep$very$o$Foo3, _ref4, _ref5, _self5, _self6, _self$self2, _ref6, _classStaticPrivateFi3, _call2, _getSelf3, _getSelf4, _self7, _classStaticPrivateFi4, _call$self2, _getSelf$self3, _getSelf$self4, _deep$very$o, _deep$very$o2, _deep$very$o3, _ref7, _ref8, _ref9, _ref9$self, _ref10, _ref11, _ref12, _ref12$getSelf, _ref13, _ref14, _ref14$call, _ref15, _ref15$getSelf, _ref16, _ref16$getSelf, _ref16$getSelf$call, _fnDeep$very$o, _fnDeep$very$o2, _fnDeep$very$o3, _ref17, _ref18, _ref19, _ref19$self, _ref20, _ref21, _ref22, _ref22$getSelf, _ref23, _ref24, _ref24$call, _ref25, _ref25$getSelf, _ref26, _ref26$getSelf, _ref26$getSelf$call; + + const o = { + Foo: Foo + }; + const deep = { + very: { + o + } + }; + + function fn() { + return o; + } + + function fnDeep() { + return deep; + } + + Foo === null || Foo === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(Foo, Foo, _m).call(Foo); + Foo === null || Foo === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(Foo, Foo, _m).call(Foo).toString; + Foo === null || Foo === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(Foo, Foo, _m).call(Foo).toString(); + (_o$Foo = o === null || o === void 0 ? void 0 : o.Foo) === null || _o$Foo === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_o$Foo, Foo, _m).call(_o$Foo); + (_o$Foo2 = o === null || o === void 0 ? void 0 : o.Foo) === null || _o$Foo2 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_o$Foo2, Foo, _m).call(_o$Foo2).toString; + (_o$Foo3 = o === null || o === void 0 ? void 0 : o.Foo) === null || _o$Foo3 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_o$Foo3, Foo, _m).call(_o$Foo3).toString(); + (_deep$very$o$Foo = deep === null || deep === void 0 ? void 0 : (_deep$very$o = deep.very.o) === null || _deep$very$o === void 0 ? void 0 : _deep$very$o.Foo) === null || _deep$very$o$Foo === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_deep$very$o$Foo, Foo, _m).call(_deep$very$o$Foo); + (_deep$very$o$Foo2 = deep === null || deep === void 0 ? void 0 : (_deep$very$o2 = deep.very.o) === null || _deep$very$o2 === void 0 ? void 0 : _deep$very$o2.Foo) === null || _deep$very$o$Foo2 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_deep$very$o$Foo2, Foo, _m).call(_deep$very$o$Foo2).toString; + (_deep$very$o$Foo3 = deep === null || deep === void 0 ? void 0 : (_deep$very$o3 = deep.very.o) === null || _deep$very$o3 === void 0 ? void 0 : _deep$very$o3.Foo) === null || _deep$very$o$Foo3 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_deep$very$o$Foo3, Foo, _m).call(_deep$very$o$Foo3).toString(); + (_ref = o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self)) === null || _ref === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_ref, Foo, _m).call(_ref); + (_ref2 = o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self).self) === null || _ref2 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_ref2, Foo, _m).call(_ref2); + (_self2 = (_ref7 = o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self)) === null || _ref7 === void 0 ? void 0 : _ref7.self) === null || _self2 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_self2, Foo, _m).call(_self2); + (_self3 = (_ref8 = o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self).self) === null || _ref8 === void 0 ? void 0 : _ref8.self) === null || _self3 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_self3, Foo, _m).call(_self3); + (_self$self = (_ref9 = o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self)) === null || _ref9 === void 0 ? void 0 : (_ref9$self = _ref9.self) === null || _ref9$self === void 0 ? void 0 : _ref9$self.self) === null || _self$self === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_self$self, Foo, _m).call(_self$self); + (_ref3 = o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self).getSelf()) === null || _ref3 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_ref3, Foo, _m).call(_ref3); + (_call = (_ref10 = o === null || o === void 0 ? void 0 : (_classStaticPrivateFi = _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self)).getSelf) === null || _ref10 === void 0 ? void 0 : _ref10.call(_classStaticPrivateFi)) === null || _call === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_call, Foo, _m).call(_call); + (_getSelf = (_ref11 = o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self)) === null || _ref11 === void 0 ? void 0 : _ref11.getSelf()) === null || _getSelf === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_getSelf, Foo, _m).call(_getSelf); + (_getSelf2 = (_ref12 = o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self)) === null || _ref12 === void 0 ? void 0 : (_ref12$getSelf = _ref12.getSelf) === null || _ref12$getSelf === void 0 ? void 0 : _ref12$getSelf.call(_ref12)) === null || _getSelf2 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_getSelf2, Foo, _m).call(_getSelf2); + (_self4 = (_ref13 = o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self).getSelf()) === null || _ref13 === void 0 ? void 0 : _ref13.self) === null || _self4 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_self4, Foo, _m).call(_self4); + (_call$self = (_ref14 = o === null || o === void 0 ? void 0 : (_classStaticPrivateFi2 = _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self)).getSelf) === null || _ref14 === void 0 ? void 0 : (_ref14$call = _ref14.call(_classStaticPrivateFi2)) === null || _ref14$call === void 0 ? void 0 : _ref14$call.self) === null || _call$self === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_call$self, Foo, _m).call(_call$self); + (_getSelf$self = (_ref15 = o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self)) === null || _ref15 === void 0 ? void 0 : (_ref15$getSelf = _ref15.getSelf()) === null || _ref15$getSelf === void 0 ? void 0 : _ref15$getSelf.self) === null || _getSelf$self === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_getSelf$self, Foo, _m).call(_getSelf$self); + (_getSelf$self2 = (_ref16 = o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self)) === null || _ref16 === void 0 ? void 0 : (_ref16$getSelf = _ref16.getSelf) === null || _ref16$getSelf === void 0 ? void 0 : (_ref16$getSelf$call = _ref16$getSelf.call(_ref16)) === null || _ref16$getSelf$call === void 0 ? void 0 : _ref16$getSelf$call.self) === null || _getSelf$self2 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_getSelf$self2, Foo, _m).call(_getSelf$self2); + (_fn$Foo = fn === null || fn === void 0 ? void 0 : fn().Foo) === null || _fn$Foo === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_fn$Foo, Foo, _m).call(_fn$Foo); + (_fn$Foo2 = fn === null || fn === void 0 ? void 0 : fn().Foo) === null || _fn$Foo2 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_fn$Foo2, Foo, _m).call(_fn$Foo2).toString; + (_fn$Foo3 = fn === null || fn === void 0 ? void 0 : fn().Foo) === null || _fn$Foo3 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_fn$Foo3, Foo, _m).call(_fn$Foo3).toString(); + (_fnDeep$very$o$Foo = fnDeep === null || fnDeep === void 0 ? void 0 : (_fnDeep$very$o = fnDeep().very.o) === null || _fnDeep$very$o === void 0 ? void 0 : _fnDeep$very$o.Foo) === null || _fnDeep$very$o$Foo === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_fnDeep$very$o$Foo, Foo, _m).call(_fnDeep$very$o$Foo); + (_fnDeep$very$o$Foo2 = fnDeep === null || fnDeep === void 0 ? void 0 : (_fnDeep$very$o2 = fnDeep().very.o) === null || _fnDeep$very$o2 === void 0 ? void 0 : _fnDeep$very$o2.Foo) === null || _fnDeep$very$o$Foo2 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_fnDeep$very$o$Foo2, Foo, _m).call(_fnDeep$very$o$Foo2).toString; + (_fnDeep$very$o$Foo3 = fnDeep === null || fnDeep === void 0 ? void 0 : (_fnDeep$very$o3 = fnDeep().very.o) === null || _fnDeep$very$o3 === void 0 ? void 0 : _fnDeep$very$o3.Foo) === null || _fnDeep$very$o$Foo3 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_fnDeep$very$o$Foo3, Foo, _m).call(_fnDeep$very$o$Foo3).toString(); + (_ref4 = fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self)) === null || _ref4 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_ref4, Foo, _m).call(_ref4); + (_ref5 = fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self).self) === null || _ref5 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_ref5, Foo, _m).call(_ref5); + (_self5 = (_ref17 = fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self)) === null || _ref17 === void 0 ? void 0 : _ref17.self) === null || _self5 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_self5, Foo, _m).call(_self5); + (_self6 = (_ref18 = fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self).self) === null || _ref18 === void 0 ? void 0 : _ref18.self) === null || _self6 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_self6, Foo, _m).call(_self6); + (_self$self2 = (_ref19 = fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self)) === null || _ref19 === void 0 ? void 0 : (_ref19$self = _ref19.self) === null || _ref19$self === void 0 ? void 0 : _ref19$self.self) === null || _self$self2 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_self$self2, Foo, _m).call(_self$self2); + (_ref6 = fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self).getSelf()) === null || _ref6 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_ref6, Foo, _m).call(_ref6); + (_call2 = (_ref20 = fn === null || fn === void 0 ? void 0 : (_classStaticPrivateFi3 = _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self)).getSelf) === null || _ref20 === void 0 ? void 0 : _ref20.call(_classStaticPrivateFi3)) === null || _call2 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_call2, Foo, _m).call(_call2); + (_getSelf3 = (_ref21 = fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self)) === null || _ref21 === void 0 ? void 0 : _ref21.getSelf()) === null || _getSelf3 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_getSelf3, Foo, _m).call(_getSelf3); + (_getSelf4 = (_ref22 = fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self)) === null || _ref22 === void 0 ? void 0 : (_ref22$getSelf = _ref22.getSelf) === null || _ref22$getSelf === void 0 ? void 0 : _ref22$getSelf.call(_ref22)) === null || _getSelf4 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_getSelf4, Foo, _m).call(_getSelf4); + (_self7 = (_ref23 = fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self).getSelf()) === null || _ref23 === void 0 ? void 0 : _ref23.self) === null || _self7 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_self7, Foo, _m).call(_self7); + (_call$self2 = (_ref24 = fn === null || fn === void 0 ? void 0 : (_classStaticPrivateFi4 = _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self)).getSelf) === null || _ref24 === void 0 ? void 0 : (_ref24$call = _ref24.call(_classStaticPrivateFi4)) === null || _ref24$call === void 0 ? void 0 : _ref24$call.self) === null || _call$self2 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_call$self2, Foo, _m).call(_call$self2); + (_getSelf$self3 = (_ref25 = fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self)) === null || _ref25 === void 0 ? void 0 : (_ref25$getSelf = _ref25.getSelf()) === null || _ref25$getSelf === void 0 ? void 0 : _ref25$getSelf.self) === null || _getSelf$self3 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_getSelf$self3, Foo, _m).call(_getSelf$self3); + (_getSelf$self4 = (_ref26 = fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self)) === null || _ref26 === void 0 ? void 0 : (_ref26$getSelf = _ref26.getSelf) === null || _ref26$getSelf === void 0 ? void 0 : (_ref26$getSelf$call = _ref26$getSelf.call(_ref26)) === null || _ref26$getSelf$call === void 0 ? void 0 : _ref26$getSelf$call.self) === null || _getSelf$self4 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_getSelf$self4, Foo, _m).call(_getSelf$self4); + } + +} + +var _x = { + writable: true, + value: 1 +}; +var _m = { + writable: true, + value: function () { + return _classStaticPrivateFieldSpecGet(this, Foo, _x); + } +}; +var _self = { + writable: true, + value: Foo +}; + +_defineProperty(Foo, "self", Foo); + +Foo.test(); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-optional-member-call/exec.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-optional-member-call/exec.js new file mode 100644 index 000000000000..df4319aff69b --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-optional-member-call/exec.js @@ -0,0 +1,126 @@ +class Foo { + static #x = 1; + static #m = function() { return this.#x; }; + static #self = Foo; + static self = Foo; + static getSelf() { return this } + + static test() { + const o = { Foo: Foo }; + const deep = { very: { o } }; + function fn() { + return o; + } + function fnDeep() { + return deep; + } + + expect(Foo?.#m()).toEqual(1); + expect(Foo?.#m().toString).toEqual(1..toString); + expect(Foo?.#m().toString()).toEqual('1'); + + expect(o?.Foo?.#m()).toEqual(1); + expect(o?.Foo?.#m().toString).toEqual(1..toString); + expect(o?.Foo?.#m().toString()).toEqual('1'); + + expect(deep?.very.o?.Foo?.#m()).toEqual(1); + expect(deep?.very.o?.Foo?.#m().toString).toEqual(1..toString); + expect(deep?.very.o?.Foo?.#m().toString()).toEqual('1'); + + expect(o?.Foo.#self?.#m()).toEqual(1); + expect(o?.Foo.#self.self?.#m()).toEqual(1); + expect(o?.Foo.#self?.self?.#m()).toEqual(1); + expect(o?.Foo.#self.self?.self?.#m()).toEqual(1); + expect(o?.Foo.#self?.self?.self?.#m()).toEqual(1); + + expect(o?.Foo.#self.getSelf()?.#m()).toEqual(1); + expect(o?.Foo.#self.getSelf?.()?.#m()).toEqual(1); + expect(o?.Foo.#self?.getSelf()?.#m()).toEqual(1); + expect(o?.Foo.#self?.getSelf?.()?.#m()).toEqual(1); + expect(o?.Foo.#self.getSelf()?.self?.#m()).toEqual(1); + expect(o?.Foo.#self.getSelf?.()?.self?.#m()).toEqual(1); + expect(o?.Foo.#self?.getSelf()?.self?.#m()).toEqual(1); + expect(o?.Foo.#self?.getSelf?.()?.self?.#m()).toEqual(1); + + expect(fn?.().Foo?.#m()).toEqual(1); + expect(fn?.().Foo?.#m().toString).toEqual(1..toString); + expect(fn?.().Foo?.#m().toString()).toEqual('1'); + + expect(fnDeep?.().very.o?.Foo?.#m()).toEqual(1); + expect(fnDeep?.().very.o?.Foo?.#m().toString).toEqual(1..toString); + expect(fnDeep?.().very.o?.Foo?.#m().toString()).toEqual('1'); + + expect(fn?.().Foo.#self?.#m()).toEqual(1); + expect(fn?.().Foo.#self.self?.#m()).toEqual(1); + expect(fn?.().Foo.#self?.self?.#m()).toEqual(1); + expect(fn?.().Foo.#self.self?.self?.#m()).toEqual(1); + expect(fn?.().Foo.#self?.self?.self?.#m()).toEqual(1); + + expect(fn?.().Foo.#self.getSelf()?.#m()).toEqual(1); + expect(fn?.().Foo.#self.getSelf?.()?.#m()).toEqual(1); + expect(fn?.().Foo.#self?.getSelf()?.#m()).toEqual(1); + expect(fn?.().Foo.#self?.getSelf?.()?.#m()).toEqual(1); + expect(fn?.().Foo.#self.getSelf()?.self?.#m()).toEqual(1); + expect(fn?.().Foo.#self.getSelf?.()?.self?.#m()).toEqual(1); + expect(fn?.().Foo.#self?.getSelf()?.self?.#m()).toEqual(1); + expect(fn?.().Foo.#self?.getSelf?.()?.self?.#m()).toEqual(1); + } + + static testNull() { + const o = null;; + const deep = { very: { o } }; + const fn = null; + function fnDeep() { + return deep; + } + + expect(o?.Foo?.#m()).toEqual(undefined); + expect(o?.Foo?.#m().toString).toEqual(undefined); + expect(o?.Foo?.#m().toString()).toEqual(undefined); + + expect(deep?.very.o?.Foo?.#m()).toEqual(undefined); + expect(deep?.very.o?.Foo?.#m().toString).toEqual(undefined); + expect(deep?.very.o?.Foo?.#m().toString()).toEqual(undefined); + + expect(o?.Foo.#self?.#m()).toEqual(undefined); + expect(o?.Foo.#self.self?.#m()).toEqual(undefined); + expect(o?.Foo.#self?.self?.#m()).toEqual(undefined); + expect(o?.Foo.#self.self?.self?.#m()).toEqual(undefined); + expect(o?.Foo.#self?.self?.self?.#m()).toEqual(undefined); + + expect(o?.Foo.#self.getSelf()?.#m()).toEqual(undefined); + expect(o?.Foo.#self.getSelf?.()?.#m()).toEqual(undefined); + expect(o?.Foo.#self?.getSelf()?.#m()).toEqual(undefined); + expect(o?.Foo.#self?.getSelf?.()?.#m()).toEqual(undefined); + expect(o?.Foo.#self.getSelf()?.self?.#m()).toEqual(undefined); + expect(o?.Foo.#self.getSelf?.()?.self?.#m()).toEqual(undefined); + expect(o?.Foo.#self?.getSelf()?.self?.#m()).toEqual(undefined); + expect(o?.Foo.#self?.getSelf?.()?.self?.#m()).toEqual(undefined); + + expect(fn?.().Foo?.#m()).toEqual(undefined); + expect(fn?.().Foo?.#m().toString).toEqual(undefined); + expect(fn?.().Foo?.#m().toString()).toEqual(undefined); + + expect(fnDeep?.().very.o?.Foo?.#m()).toEqual(undefined); + expect(fnDeep?.().very.o?.Foo?.#m().toString).toEqual(undefined); + expect(fnDeep?.().very.o?.Foo?.#m().toString()).toEqual(undefined); + + expect(fn?.().Foo.#self?.#m()).toEqual(undefined); + expect(fn?.().Foo.#self.self?.#m()).toEqual(undefined); + expect(fn?.().Foo.#self?.self?.#m()).toEqual(undefined); + expect(fn?.().Foo.#self.self?.self?.#m()).toEqual(undefined); + expect(fn?.().Foo.#self?.self?.self?.#m()).toEqual(undefined); + + expect(fn?.().Foo.#self.getSelf()?.#m()).toEqual(undefined); + expect(fn?.().Foo.#self.getSelf?.()?.#m()).toEqual(undefined); + expect(fn?.().Foo.#self?.getSelf()?.#m()).toEqual(undefined); + expect(fn?.().Foo.#self?.getSelf?.()?.#m()).toEqual(undefined); + expect(fn?.().Foo.#self.getSelf()?.self?.#m()).toEqual(undefined); + expect(fn?.().Foo.#self.getSelf?.()?.self?.#m()).toEqual(undefined); + expect(fn?.().Foo.#self?.getSelf()?.self?.#m()).toEqual(undefined); + expect(fn?.().Foo.#self?.getSelf?.()?.self?.#m()).toEqual(undefined); + } +} + +Foo.test(); +Foo.testNull(); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-optional-member-call/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-optional-member-call/input.js new file mode 100644 index 000000000000..a5c222687ee8 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-optional-member-call/input.js @@ -0,0 +1,70 @@ +class Foo { + static #x = 1; + static #m = function() { return this.#x; }; + static #self = Foo; + static self = Foo; + static getSelf() { return this } + + static test() { + const o = { Foo: Foo }; + const deep = { very: { o } }; + function fn() { + return o; + } + function fnDeep() { + return deep; + } + + Foo?.#m(); + Foo?.#m().toString; + Foo?.#m().toString(); + + o?.Foo.#m(); + o?.Foo.#m().toString; + o?.Foo.#m().toString(); + + deep?.very.o?.Foo.#m(); + deep?.very.o?.Foo.#m().toString; + deep?.very.o?.Foo.#m().toString(); + + o?.Foo.#self.#m(); + o?.Foo.#self.self.#m(); + o?.Foo.#self?.self.#m(); + o?.Foo.#self.self?.self.#m(); + o?.Foo.#self?.self?.self.#m(); + + o?.Foo.#self.getSelf().#m(); + o?.Foo.#self.getSelf?.().#m(); + o?.Foo.#self?.getSelf().#m(); + o?.Foo.#self?.getSelf?.().#m(); + o?.Foo.#self.getSelf()?.self.#m(); + o?.Foo.#self.getSelf?.()?.self.#m(); + o?.Foo.#self?.getSelf()?.self.#m(); + o?.Foo.#self?.getSelf?.()?.self.#m(); + + fn?.().Foo.#m(); + fn?.().Foo.#m().toString; + fn?.().Foo.#m().toString(); + + fnDeep?.().very.o?.Foo.#m(); + fnDeep?.().very.o?.Foo.#m().toString; + fnDeep?.().very.o?.Foo.#m().toString(); + + fn?.().Foo.#self.#m(); + fn?.().Foo.#self.self.#m(); + fn?.().Foo.#self?.self.#m(); + fn?.().Foo.#self.self?.self.#m(); + fn?.().Foo.#self?.self?.self.#m(); + + fn?.().Foo.#self.getSelf().#m(); + fn?.().Foo.#self.getSelf?.().#m(); + fn?.().Foo.#self?.getSelf().#m(); + fn?.().Foo.#self?.getSelf?.().#m(); + fn?.().Foo.#self.getSelf()?.self.#m(); + fn?.().Foo.#self.getSelf?.()?.self.#m(); + fn?.().Foo.#self?.getSelf()?.self.#m(); + fn?.().Foo.#self?.getSelf?.()?.self.#m(); + } +} + +Foo.test(); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-optional-member-call/options.json b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-optional-member-call/options.json new file mode 100644 index 000000000000..3b59e1bbfcc8 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-optional-member-call/options.json @@ -0,0 +1,4 @@ +{ + "plugins": ["proposal-class-properties"], + "minNodeVersion": "14.0.0" +} diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-optional-member-call/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-optional-member-call/output.js new file mode 100644 index 000000000000..c5d75bcaca63 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-optional-member-call/output.js @@ -0,0 +1,92 @@ +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +function _classStaticPrivateFieldSpecGet(receiver, classConstructor, descriptor) { if (receiver !== classConstructor) { throw new TypeError("Private static access of wrong provenance"); } if (descriptor.get) { return descriptor.get.call(receiver); } return descriptor.value; } + +class Foo { + static getSelf() { + return this; + } + + static test() { + var _o$Foo, _o$Foo2, _o$Foo3, _deep$very$o, _deep$very$o$Foo, _deep$very$o2, _deep$very$o2$Foo, _deep$very$o3, _deep$very$o3$Foo, _classStaticPrivateFi, _classStaticPrivateFi2, _ref, _ref$self, _ref2, _ref2$self, _self2, _self2$self, _classStaticPrivateFi3, _classStaticPrivateFi4, _ref3, _ref3$call, _ref4, _ref4$getSelf, _getSelf, _ref5, _getSelf$call, _ref6, _ref6$self, _classStaticPrivateFi5, _call, _call$self, _getSelf2, _getSelf2$self, _getSelf3, _getSelf3$self, _fn$Foo, _fn$Foo2, _fn$Foo3, _fnDeep$very$o, _fnDeep$very$o$Foo, _fnDeep$very$o2, _fnDeep$very$o2$Foo, _fnDeep$very$o3, _fnDeep$very$o3$Foo, _classStaticPrivateFi6, _classStaticPrivateFi7, _ref7, _ref7$self, _ref8, _ref8$self, _self3, _self3$self, _classStaticPrivateFi8, _classStaticPrivateFi9, _ref9, _ref9$call, _ref10, _ref10$getSelf, _getSelf4, _ref11, _getSelf4$call, _ref12, _ref12$self, _classStaticPrivateFi10, _call2, _call2$self, _getSelf5, _getSelf5$self, _getSelf6, _getSelf6$self; + + const o = { + Foo: Foo + }; + const deep = { + very: { + o + } + }; + + function fn() { + return o; + } + + function fnDeep() { + return deep; + } + + Foo === null || Foo === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(Foo, Foo, _m).call(Foo); + Foo === null || Foo === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(Foo, Foo, _m).call(Foo).toString; + Foo === null || Foo === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(Foo, Foo, _m).call(Foo).toString(); + o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_o$Foo = o.Foo, Foo, _m).call(_o$Foo); + o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_o$Foo2 = o.Foo, Foo, _m).call(_o$Foo2).toString; + o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_o$Foo3 = o.Foo, Foo, _m).call(_o$Foo3).toString(); + (_deep$very$o = deep?.very.o) === null || _deep$very$o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_deep$very$o$Foo = _deep$very$o.Foo, Foo, _m).call(_deep$very$o$Foo); + (_deep$very$o2 = deep?.very.o) === null || _deep$very$o2 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_deep$very$o2$Foo = _deep$very$o2.Foo, Foo, _m).call(_deep$very$o2$Foo).toString; + (_deep$very$o3 = deep?.very.o) === null || _deep$very$o3 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_deep$very$o3$Foo = _deep$very$o3.Foo, Foo, _m).call(_deep$very$o3$Foo).toString(); + o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_classStaticPrivateFi = _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self), Foo, _m).call(_classStaticPrivateFi); + o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_classStaticPrivateFi2 = _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self).self, Foo, _m).call(_classStaticPrivateFi2); + (_ref = o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self)) === null || _ref === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_ref$self = _ref.self, Foo, _m).call(_ref$self); + (_ref2 = o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self).self) === null || _ref2 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_ref2$self = _ref2.self, Foo, _m).call(_ref2$self); + (_self2 = (o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self))?.self) === null || _self2 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_self2$self = _self2.self, Foo, _m).call(_self2$self); + o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_classStaticPrivateFi3 = _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self).getSelf(), Foo, _m).call(_classStaticPrivateFi3); + (_ref3 = o === null || o === void 0 ? void 0 : (_classStaticPrivateFi4 = _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self)).getSelf) === null || _ref3 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_ref3$call = _ref3.call(_classStaticPrivateFi4), Foo, _m).call(_ref3$call); + (_ref4 = o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self)) === null || _ref4 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_ref4$getSelf = _ref4.getSelf(), Foo, _m).call(_ref4$getSelf); + (_getSelf = (_ref5 = o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self))?.getSelf) === null || _getSelf === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_getSelf$call = _getSelf.call(_ref5), Foo, _m).call(_getSelf$call); + (_ref6 = o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self).getSelf()) === null || _ref6 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_ref6$self = _ref6.self, Foo, _m).call(_ref6$self); + (_call = (o === null || o === void 0 ? void 0 : (_classStaticPrivateFi5 = _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self)).getSelf)?.call(_classStaticPrivateFi5)) === null || _call === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_call$self = _call.self, Foo, _m).call(_call$self); + (_getSelf2 = (o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self))?.getSelf()) === null || _getSelf2 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_getSelf2$self = _getSelf2.self, Foo, _m).call(_getSelf2$self); + (_getSelf3 = (o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self))?.getSelf?.()) === null || _getSelf3 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_getSelf3$self = _getSelf3.self, Foo, _m).call(_getSelf3$self); + fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_fn$Foo = fn().Foo, Foo, _m).call(_fn$Foo); + fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_fn$Foo2 = fn().Foo, Foo, _m).call(_fn$Foo2).toString; + fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_fn$Foo3 = fn().Foo, Foo, _m).call(_fn$Foo3).toString(); + (_fnDeep$very$o = fnDeep?.().very.o) === null || _fnDeep$very$o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_fnDeep$very$o$Foo = _fnDeep$very$o.Foo, Foo, _m).call(_fnDeep$very$o$Foo); + (_fnDeep$very$o2 = fnDeep?.().very.o) === null || _fnDeep$very$o2 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_fnDeep$very$o2$Foo = _fnDeep$very$o2.Foo, Foo, _m).call(_fnDeep$very$o2$Foo).toString; + (_fnDeep$very$o3 = fnDeep?.().very.o) === null || _fnDeep$very$o3 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_fnDeep$very$o3$Foo = _fnDeep$very$o3.Foo, Foo, _m).call(_fnDeep$very$o3$Foo).toString(); + fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_classStaticPrivateFi6 = _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self), Foo, _m).call(_classStaticPrivateFi6); + fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_classStaticPrivateFi7 = _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self).self, Foo, _m).call(_classStaticPrivateFi7); + (_ref7 = fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self)) === null || _ref7 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_ref7$self = _ref7.self, Foo, _m).call(_ref7$self); + (_ref8 = fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self).self) === null || _ref8 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_ref8$self = _ref8.self, Foo, _m).call(_ref8$self); + (_self3 = (fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self))?.self) === null || _self3 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_self3$self = _self3.self, Foo, _m).call(_self3$self); + fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_classStaticPrivateFi8 = _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self).getSelf(), Foo, _m).call(_classStaticPrivateFi8); + (_ref9 = fn === null || fn === void 0 ? void 0 : (_classStaticPrivateFi9 = _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self)).getSelf) === null || _ref9 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_ref9$call = _ref9.call(_classStaticPrivateFi9), Foo, _m).call(_ref9$call); + (_ref10 = fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self)) === null || _ref10 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_ref10$getSelf = _ref10.getSelf(), Foo, _m).call(_ref10$getSelf); + (_getSelf4 = (_ref11 = fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self))?.getSelf) === null || _getSelf4 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_getSelf4$call = _getSelf4.call(_ref11), Foo, _m).call(_getSelf4$call); + (_ref12 = fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self).getSelf()) === null || _ref12 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_ref12$self = _ref12.self, Foo, _m).call(_ref12$self); + (_call2 = (fn === null || fn === void 0 ? void 0 : (_classStaticPrivateFi10 = _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self)).getSelf)?.call(_classStaticPrivateFi10)) === null || _call2 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_call2$self = _call2.self, Foo, _m).call(_call2$self); + (_getSelf5 = (fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self))?.getSelf()) === null || _getSelf5 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_getSelf5$self = _getSelf5.self, Foo, _m).call(_getSelf5$self); + (_getSelf6 = (fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self))?.getSelf?.()) === null || _getSelf6 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_getSelf6$self = _getSelf6.self, Foo, _m).call(_getSelf6$self); + } + +} + +var _x = { + writable: true, + value: 1 +}; +var _m = { + writable: true, + value: function () { + return _classStaticPrivateFieldSpecGet(this, Foo, _x); + } +}; +var _self = { + writable: true, + value: Foo +}; + +_defineProperty(Foo, "self", Foo); + +Foo.test(); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-optional-property-with-transform/exec.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-optional-property-with-transform/exec.js new file mode 100644 index 000000000000..0d627ac9e0d4 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-optional-property-with-transform/exec.js @@ -0,0 +1,125 @@ +class Foo { + static #x = 1; + static #self = Foo; + static self = Foo; + static getSelf() { return this } + + static test() { + const o = { Foo: Foo }; + const deep = { very: { o } }; + function fn() { + return o; + } + function fnDeep() { + return deep; + } + + expect(Foo?.#x).toEqual(1); + expect(Foo?.#x.toString).toEqual(1..toString); + expect(Foo?.#x.toString()).toEqual('1'); + + expect(o?.Foo?.#x).toEqual(1); + expect(o?.Foo?.#x.toString).toEqual(1..toString); + expect(o?.Foo?.#x.toString()).toEqual('1'); + + expect(deep?.very.o?.Foo?.#x).toEqual(1); + expect(deep?.very.o?.Foo?.#x.toString).toEqual(1..toString); + expect(deep?.very.o?.Foo?.#x.toString()).toEqual('1'); + + expect(o?.Foo.#self?.#x).toEqual(1); + expect(o?.Foo.#self.self?.#x).toEqual(1); + expect(o?.Foo.#self?.self?.#x).toEqual(1); + expect(o?.Foo.#self.self?.self?.#x).toEqual(1); + expect(o?.Foo.#self?.self?.self?.#x).toEqual(1); + + expect(o?.Foo.#self.getSelf()?.#x).toEqual(1); + expect(o?.Foo.#self.getSelf?.()?.#x).toEqual(1); + expect(o?.Foo.#self?.getSelf()?.#x).toEqual(1); + expect(o?.Foo.#self?.getSelf?.()?.#x).toEqual(1); + expect(o?.Foo.#self.getSelf()?.self?.#x).toEqual(1); + expect(o?.Foo.#self.getSelf?.()?.self?.#x).toEqual(1); + expect(o?.Foo.#self?.getSelf()?.self?.#x).toEqual(1); + expect(o?.Foo.#self?.getSelf?.()?.self?.#x).toEqual(1); + + expect(fn?.().Foo?.#x).toEqual(1); + expect(fn?.().Foo?.#x.toString).toEqual(1..toString); + expect(fn?.().Foo?.#x.toString()).toEqual('1'); + + expect(fnDeep?.().very.o?.Foo?.#x).toEqual(1); + expect(fnDeep?.().very.o?.Foo?.#x.toString).toEqual(1..toString); + expect(fnDeep?.().very.o?.Foo?.#x.toString()).toEqual('1'); + + expect(fn?.().Foo.#self?.#x).toEqual(1); + expect(fn?.().Foo.#self.self?.#x).toEqual(1); + expect(fn?.().Foo.#self?.self?.#x).toEqual(1); + expect(fn?.().Foo.#self.self?.self?.#x).toEqual(1); + expect(fn?.().Foo.#self?.self?.self?.#x).toEqual(1); + + expect(fn?.().Foo.#self.getSelf()?.#x).toEqual(1); + expect(fn?.().Foo.#self.getSelf?.()?.#x).toEqual(1); + expect(fn?.().Foo.#self?.getSelf()?.#x).toEqual(1); + expect(fn?.().Foo.#self?.getSelf?.()?.#x).toEqual(1); + expect(fn?.().Foo.#self.getSelf()?.self?.#x).toEqual(1); + expect(fn?.().Foo.#self.getSelf?.()?.self?.#x).toEqual(1); + expect(fn?.().Foo.#self?.getSelf()?.self?.#x).toEqual(1); + expect(fn?.().Foo.#self?.getSelf?.()?.self?.#x).toEqual(1); + } + + static testNull() { + const o = null;; + const deep = { very: { o } }; + const fn = null; + function fnDeep() { + return deep; + } + + expect(o?.Foo?.#x).toEqual(undefined); + expect(o?.Foo?.#x.toString).toEqual(undefined); + expect(o?.Foo?.#x.toString()).toEqual(undefined); + + expect(deep?.very.o?.Foo?.#x).toEqual(undefined); + expect(deep?.very.o?.Foo?.#x.toString).toEqual(undefined); + expect(deep?.very.o?.Foo?.#x.toString()).toEqual(undefined); + + expect(o?.Foo.#self?.#x).toEqual(undefined); + expect(o?.Foo.#self.self?.#x).toEqual(undefined); + expect(o?.Foo.#self?.self?.#x).toEqual(undefined); + expect(o?.Foo.#self.self?.self?.#x).toEqual(undefined); + expect(o?.Foo.#self?.self?.self?.#x).toEqual(undefined); + + expect(o?.Foo.#self.getSelf()?.#x).toEqual(undefined); + expect(o?.Foo.#self.getSelf?.()?.#x).toEqual(undefined); + expect(o?.Foo.#self?.getSelf()?.#x).toEqual(undefined); + expect(o?.Foo.#self?.getSelf?.()?.#x).toEqual(undefined); + expect(o?.Foo.#self.getSelf()?.self?.#x).toEqual(undefined); + expect(o?.Foo.#self.getSelf?.()?.self?.#x).toEqual(undefined); + expect(o?.Foo.#self?.getSelf()?.self?.#x).toEqual(undefined); + expect(o?.Foo.#self?.getSelf?.()?.self?.#x).toEqual(undefined); + + expect(fn?.().Foo?.#x).toEqual(undefined); + expect(fn?.().Foo?.#x.toString).toEqual(undefined); + expect(fn?.().Foo?.#x.toString()).toEqual(undefined); + + expect(fnDeep?.().very.o?.Foo?.#x).toEqual(undefined); + expect(fnDeep?.().very.o?.Foo?.#x.toString).toEqual(undefined); + expect(fnDeep?.().very.o?.Foo?.#x.toString()).toEqual(undefined); + + expect(fn?.().Foo.#self?.#x).toEqual(undefined); + expect(fn?.().Foo.#self.self?.#x).toEqual(undefined); + expect(fn?.().Foo.#self?.self?.#x).toEqual(undefined); + expect(fn?.().Foo.#self.self?.self?.#x).toEqual(undefined); + expect(fn?.().Foo.#self?.self?.self?.#x).toEqual(undefined); + + expect(fn?.().Foo.#self.getSelf()?.#x).toEqual(undefined); + expect(fn?.().Foo.#self.getSelf?.()?.#x).toEqual(undefined); + expect(fn?.().Foo.#self?.getSelf()?.#x).toEqual(undefined); + expect(fn?.().Foo.#self?.getSelf?.()?.#x).toEqual(undefined); + expect(fn?.().Foo.#self.getSelf()?.self?.#x).toEqual(undefined); + expect(fn?.().Foo.#self.getSelf?.()?.self?.#x).toEqual(undefined); + expect(fn?.().Foo.#self?.getSelf()?.self?.#x).toEqual(undefined); + expect(fn?.().Foo.#self?.getSelf?.()?.self?.#x).toEqual(undefined); + } +} + +Foo.test(); +Foo.testNull(); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-optional-property-with-transform/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-optional-property-with-transform/input.js new file mode 100644 index 000000000000..968eeaf3cb44 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-optional-property-with-transform/input.js @@ -0,0 +1,69 @@ +class Foo { + static #x = 1; + static #self = Foo; + static self = Foo; + static getSelf() { return this } + + static test() { + const o = { Foo: Foo }; + const deep = { very: { o } }; + function fn() { + return o; + } + function fnDeep() { + return deep; + } + + Foo?.#x; + Foo?.#x.toString; + Foo?.#x.toString(); + + o?.Foo?.#x; + o?.Foo?.#x.toString; + o?.Foo?.#x.toString(); + + deep?.very.o?.Foo?.#x; + deep?.very.o?.Foo?.#x.toString; + deep?.very.o?.Foo?.#x.toString(); + + o?.Foo.#self?.#x; + o?.Foo.#self.self?.#x; + o?.Foo.#self?.self?.#x; + o?.Foo.#self.self?.self?.#x; + o?.Foo.#self?.self?.self?.#x; + + o?.Foo.#self.getSelf()?.#x; + o?.Foo.#self.getSelf?.()?.#x; + o?.Foo.#self?.getSelf()?.#x; + o?.Foo.#self?.getSelf?.()?.#x; + o?.Foo.#self.getSelf()?.self?.#x; + o?.Foo.#self.getSelf?.()?.self?.#x; + o?.Foo.#self?.getSelf()?.self?.#x; + o?.Foo.#self?.getSelf?.()?.self?.#x; + + fn?.().Foo?.#x; + fn?.().Foo?.#x.toString; + fn?.().Foo?.#x.toString(); + + fnDeep?.().very.o?.Foo?.#x; + fnDeep?.().very.o?.Foo?.#x.toString; + fnDeep?.().very.o?.Foo?.#x.toString(); + + fn?.().Foo.#self?.#x; + fn?.().Foo.#self.self?.#x; + fn?.().Foo.#self?.self?.#x; + fn?.().Foo.#self.self?.self?.#x; + fn?.().Foo.#self?.self?.self?.#x; + + fn?.().Foo.#self.getSelf()?.#x; + fn?.().Foo.#self.getSelf?.()?.#x; + fn?.().Foo.#self?.getSelf()?.#x; + fn?.().Foo.#self?.getSelf?.()?.#x; + fn?.().Foo.#self.getSelf()?.self?.#x; + fn?.().Foo.#self.getSelf?.()?.self?.#x; + fn?.().Foo.#self?.getSelf()?.self?.#x; + fn?.().Foo.#self?.getSelf?.()?.self?.#x; + } +} + +Foo.test(); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-optional-property-with-transform/options.json b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-optional-property-with-transform/options.json new file mode 100644 index 000000000000..63b4c77cc8e8 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-optional-property-with-transform/options.json @@ -0,0 +1,3 @@ +{ + "plugins": ["proposal-optional-chaining", "proposal-class-properties"] +} diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-optional-property-with-transform/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-optional-property-with-transform/output.js new file mode 100644 index 000000000000..be682ce43b57 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-optional-property-with-transform/output.js @@ -0,0 +1,86 @@ +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +function _classStaticPrivateFieldSpecGet(receiver, classConstructor, descriptor) { if (receiver !== classConstructor) { throw new TypeError("Private static access of wrong provenance"); } if (descriptor.get) { return descriptor.get.call(receiver); } return descriptor.value; } + +class Foo { + static getSelf() { + return this; + } + + static test() { + var _o$Foo, _o$Foo2, _o$Foo3, _deep$very$o$Foo, _deep$very$o$Foo2, _deep$very$o$Foo3, _ref, _ref2, _self2, _self3, _self$self, _ref3, _classStaticPrivateFi, _call, _getSelf, _getSelf2, _self4, _classStaticPrivateFi2, _call$self, _getSelf$self, _getSelf$self2, _fn$Foo, _fn$Foo2, _fn$Foo3, _fnDeep$very$o$Foo, _fnDeep$very$o$Foo2, _fnDeep$very$o$Foo3, _ref4, _ref5, _self5, _self6, _self$self2, _ref6, _classStaticPrivateFi3, _call2, _getSelf3, _getSelf4, _self7, _classStaticPrivateFi4, _call$self2, _getSelf$self3, _getSelf$self4, _deep$very$o, _deep$very$o2, _deep$very$o3, _ref7, _ref8, _ref9, _ref9$self, _ref10, _ref11, _ref12, _ref12$getSelf, _ref13, _ref14, _ref14$call, _ref15, _ref15$getSelf, _ref16, _ref16$getSelf, _ref16$getSelf$call, _fnDeep$very$o, _fnDeep$very$o2, _fnDeep$very$o3, _ref17, _ref18, _ref19, _ref19$self, _ref20, _ref21, _ref22, _ref22$getSelf, _ref23, _ref24, _ref24$call, _ref25, _ref25$getSelf, _ref26, _ref26$getSelf, _ref26$getSelf$call; + + const o = { + Foo: Foo + }; + const deep = { + very: { + o + } + }; + + function fn() { + return o; + } + + function fnDeep() { + return deep; + } + + Foo === null || Foo === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(Foo, Foo, _x); + Foo === null || Foo === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(Foo, Foo, _x).toString; + Foo === null || Foo === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(Foo, Foo, _x).toString(); + (_o$Foo = o === null || o === void 0 ? void 0 : o.Foo) === null || _o$Foo === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_o$Foo, Foo, _x); + (_o$Foo2 = o === null || o === void 0 ? void 0 : o.Foo) === null || _o$Foo2 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_o$Foo2, Foo, _x).toString; + (_o$Foo3 = o === null || o === void 0 ? void 0 : o.Foo) === null || _o$Foo3 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_o$Foo3, Foo, _x).toString(); + (_deep$very$o$Foo = deep === null || deep === void 0 ? void 0 : (_deep$very$o = deep.very.o) === null || _deep$very$o === void 0 ? void 0 : _deep$very$o.Foo) === null || _deep$very$o$Foo === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_deep$very$o$Foo, Foo, _x); + (_deep$very$o$Foo2 = deep === null || deep === void 0 ? void 0 : (_deep$very$o2 = deep.very.o) === null || _deep$very$o2 === void 0 ? void 0 : _deep$very$o2.Foo) === null || _deep$very$o$Foo2 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_deep$very$o$Foo2, Foo, _x).toString; + (_deep$very$o$Foo3 = deep === null || deep === void 0 ? void 0 : (_deep$very$o3 = deep.very.o) === null || _deep$very$o3 === void 0 ? void 0 : _deep$very$o3.Foo) === null || _deep$very$o$Foo3 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_deep$very$o$Foo3, Foo, _x).toString(); + (_ref = o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self)) === null || _ref === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_ref, Foo, _x); + (_ref2 = o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self).self) === null || _ref2 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_ref2, Foo, _x); + (_self2 = (_ref7 = o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self)) === null || _ref7 === void 0 ? void 0 : _ref7.self) === null || _self2 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_self2, Foo, _x); + (_self3 = (_ref8 = o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self).self) === null || _ref8 === void 0 ? void 0 : _ref8.self) === null || _self3 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_self3, Foo, _x); + (_self$self = (_ref9 = o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self)) === null || _ref9 === void 0 ? void 0 : (_ref9$self = _ref9.self) === null || _ref9$self === void 0 ? void 0 : _ref9$self.self) === null || _self$self === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_self$self, Foo, _x); + (_ref3 = o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self).getSelf()) === null || _ref3 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_ref3, Foo, _x); + (_call = (_ref10 = o === null || o === void 0 ? void 0 : (_classStaticPrivateFi = _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self)).getSelf) === null || _ref10 === void 0 ? void 0 : _ref10.call(_classStaticPrivateFi)) === null || _call === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_call, Foo, _x); + (_getSelf = (_ref11 = o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self)) === null || _ref11 === void 0 ? void 0 : _ref11.getSelf()) === null || _getSelf === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_getSelf, Foo, _x); + (_getSelf2 = (_ref12 = o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self)) === null || _ref12 === void 0 ? void 0 : (_ref12$getSelf = _ref12.getSelf) === null || _ref12$getSelf === void 0 ? void 0 : _ref12$getSelf.call(_ref12)) === null || _getSelf2 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_getSelf2, Foo, _x); + (_self4 = (_ref13 = o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self).getSelf()) === null || _ref13 === void 0 ? void 0 : _ref13.self) === null || _self4 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_self4, Foo, _x); + (_call$self = (_ref14 = o === null || o === void 0 ? void 0 : (_classStaticPrivateFi2 = _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self)).getSelf) === null || _ref14 === void 0 ? void 0 : (_ref14$call = _ref14.call(_classStaticPrivateFi2)) === null || _ref14$call === void 0 ? void 0 : _ref14$call.self) === null || _call$self === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_call$self, Foo, _x); + (_getSelf$self = (_ref15 = o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self)) === null || _ref15 === void 0 ? void 0 : (_ref15$getSelf = _ref15.getSelf()) === null || _ref15$getSelf === void 0 ? void 0 : _ref15$getSelf.self) === null || _getSelf$self === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_getSelf$self, Foo, _x); + (_getSelf$self2 = (_ref16 = o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self)) === null || _ref16 === void 0 ? void 0 : (_ref16$getSelf = _ref16.getSelf) === null || _ref16$getSelf === void 0 ? void 0 : (_ref16$getSelf$call = _ref16$getSelf.call(_ref16)) === null || _ref16$getSelf$call === void 0 ? void 0 : _ref16$getSelf$call.self) === null || _getSelf$self2 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_getSelf$self2, Foo, _x); + (_fn$Foo = fn === null || fn === void 0 ? void 0 : fn().Foo) === null || _fn$Foo === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_fn$Foo, Foo, _x); + (_fn$Foo2 = fn === null || fn === void 0 ? void 0 : fn().Foo) === null || _fn$Foo2 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_fn$Foo2, Foo, _x).toString; + (_fn$Foo3 = fn === null || fn === void 0 ? void 0 : fn().Foo) === null || _fn$Foo3 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_fn$Foo3, Foo, _x).toString(); + (_fnDeep$very$o$Foo = fnDeep === null || fnDeep === void 0 ? void 0 : (_fnDeep$very$o = fnDeep().very.o) === null || _fnDeep$very$o === void 0 ? void 0 : _fnDeep$very$o.Foo) === null || _fnDeep$very$o$Foo === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_fnDeep$very$o$Foo, Foo, _x); + (_fnDeep$very$o$Foo2 = fnDeep === null || fnDeep === void 0 ? void 0 : (_fnDeep$very$o2 = fnDeep().very.o) === null || _fnDeep$very$o2 === void 0 ? void 0 : _fnDeep$very$o2.Foo) === null || _fnDeep$very$o$Foo2 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_fnDeep$very$o$Foo2, Foo, _x).toString; + (_fnDeep$very$o$Foo3 = fnDeep === null || fnDeep === void 0 ? void 0 : (_fnDeep$very$o3 = fnDeep().very.o) === null || _fnDeep$very$o3 === void 0 ? void 0 : _fnDeep$very$o3.Foo) === null || _fnDeep$very$o$Foo3 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_fnDeep$very$o$Foo3, Foo, _x).toString(); + (_ref4 = fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self)) === null || _ref4 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_ref4, Foo, _x); + (_ref5 = fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self).self) === null || _ref5 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_ref5, Foo, _x); + (_self5 = (_ref17 = fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self)) === null || _ref17 === void 0 ? void 0 : _ref17.self) === null || _self5 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_self5, Foo, _x); + (_self6 = (_ref18 = fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self).self) === null || _ref18 === void 0 ? void 0 : _ref18.self) === null || _self6 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_self6, Foo, _x); + (_self$self2 = (_ref19 = fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self)) === null || _ref19 === void 0 ? void 0 : (_ref19$self = _ref19.self) === null || _ref19$self === void 0 ? void 0 : _ref19$self.self) === null || _self$self2 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_self$self2, Foo, _x); + (_ref6 = fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self).getSelf()) === null || _ref6 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_ref6, Foo, _x); + (_call2 = (_ref20 = fn === null || fn === void 0 ? void 0 : (_classStaticPrivateFi3 = _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self)).getSelf) === null || _ref20 === void 0 ? void 0 : _ref20.call(_classStaticPrivateFi3)) === null || _call2 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_call2, Foo, _x); + (_getSelf3 = (_ref21 = fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self)) === null || _ref21 === void 0 ? void 0 : _ref21.getSelf()) === null || _getSelf3 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_getSelf3, Foo, _x); + (_getSelf4 = (_ref22 = fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self)) === null || _ref22 === void 0 ? void 0 : (_ref22$getSelf = _ref22.getSelf) === null || _ref22$getSelf === void 0 ? void 0 : _ref22$getSelf.call(_ref22)) === null || _getSelf4 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_getSelf4, Foo, _x); + (_self7 = (_ref23 = fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self).getSelf()) === null || _ref23 === void 0 ? void 0 : _ref23.self) === null || _self7 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_self7, Foo, _x); + (_call$self2 = (_ref24 = fn === null || fn === void 0 ? void 0 : (_classStaticPrivateFi4 = _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self)).getSelf) === null || _ref24 === void 0 ? void 0 : (_ref24$call = _ref24.call(_classStaticPrivateFi4)) === null || _ref24$call === void 0 ? void 0 : _ref24$call.self) === null || _call$self2 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_call$self2, Foo, _x); + (_getSelf$self3 = (_ref25 = fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self)) === null || _ref25 === void 0 ? void 0 : (_ref25$getSelf = _ref25.getSelf()) === null || _ref25$getSelf === void 0 ? void 0 : _ref25$getSelf.self) === null || _getSelf$self3 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_getSelf$self3, Foo, _x); + (_getSelf$self4 = (_ref26 = fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self)) === null || _ref26 === void 0 ? void 0 : (_ref26$getSelf = _ref26.getSelf) === null || _ref26$getSelf === void 0 ? void 0 : (_ref26$getSelf$call = _ref26$getSelf.call(_ref26)) === null || _ref26$getSelf$call === void 0 ? void 0 : _ref26$getSelf$call.self) === null || _getSelf$self4 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_getSelf$self4, Foo, _x); + } + +} + +var _x = { + writable: true, + value: 1 +}; +var _self = { + writable: true, + value: Foo +}; + +_defineProperty(Foo, "self", Foo); + +Foo.test(); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-optional-property/exec.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-optional-property/exec.js new file mode 100644 index 000000000000..0d627ac9e0d4 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-optional-property/exec.js @@ -0,0 +1,125 @@ +class Foo { + static #x = 1; + static #self = Foo; + static self = Foo; + static getSelf() { return this } + + static test() { + const o = { Foo: Foo }; + const deep = { very: { o } }; + function fn() { + return o; + } + function fnDeep() { + return deep; + } + + expect(Foo?.#x).toEqual(1); + expect(Foo?.#x.toString).toEqual(1..toString); + expect(Foo?.#x.toString()).toEqual('1'); + + expect(o?.Foo?.#x).toEqual(1); + expect(o?.Foo?.#x.toString).toEqual(1..toString); + expect(o?.Foo?.#x.toString()).toEqual('1'); + + expect(deep?.very.o?.Foo?.#x).toEqual(1); + expect(deep?.very.o?.Foo?.#x.toString).toEqual(1..toString); + expect(deep?.very.o?.Foo?.#x.toString()).toEqual('1'); + + expect(o?.Foo.#self?.#x).toEqual(1); + expect(o?.Foo.#self.self?.#x).toEqual(1); + expect(o?.Foo.#self?.self?.#x).toEqual(1); + expect(o?.Foo.#self.self?.self?.#x).toEqual(1); + expect(o?.Foo.#self?.self?.self?.#x).toEqual(1); + + expect(o?.Foo.#self.getSelf()?.#x).toEqual(1); + expect(o?.Foo.#self.getSelf?.()?.#x).toEqual(1); + expect(o?.Foo.#self?.getSelf()?.#x).toEqual(1); + expect(o?.Foo.#self?.getSelf?.()?.#x).toEqual(1); + expect(o?.Foo.#self.getSelf()?.self?.#x).toEqual(1); + expect(o?.Foo.#self.getSelf?.()?.self?.#x).toEqual(1); + expect(o?.Foo.#self?.getSelf()?.self?.#x).toEqual(1); + expect(o?.Foo.#self?.getSelf?.()?.self?.#x).toEqual(1); + + expect(fn?.().Foo?.#x).toEqual(1); + expect(fn?.().Foo?.#x.toString).toEqual(1..toString); + expect(fn?.().Foo?.#x.toString()).toEqual('1'); + + expect(fnDeep?.().very.o?.Foo?.#x).toEqual(1); + expect(fnDeep?.().very.o?.Foo?.#x.toString).toEqual(1..toString); + expect(fnDeep?.().very.o?.Foo?.#x.toString()).toEqual('1'); + + expect(fn?.().Foo.#self?.#x).toEqual(1); + expect(fn?.().Foo.#self.self?.#x).toEqual(1); + expect(fn?.().Foo.#self?.self?.#x).toEqual(1); + expect(fn?.().Foo.#self.self?.self?.#x).toEqual(1); + expect(fn?.().Foo.#self?.self?.self?.#x).toEqual(1); + + expect(fn?.().Foo.#self.getSelf()?.#x).toEqual(1); + expect(fn?.().Foo.#self.getSelf?.()?.#x).toEqual(1); + expect(fn?.().Foo.#self?.getSelf()?.#x).toEqual(1); + expect(fn?.().Foo.#self?.getSelf?.()?.#x).toEqual(1); + expect(fn?.().Foo.#self.getSelf()?.self?.#x).toEqual(1); + expect(fn?.().Foo.#self.getSelf?.()?.self?.#x).toEqual(1); + expect(fn?.().Foo.#self?.getSelf()?.self?.#x).toEqual(1); + expect(fn?.().Foo.#self?.getSelf?.()?.self?.#x).toEqual(1); + } + + static testNull() { + const o = null;; + const deep = { very: { o } }; + const fn = null; + function fnDeep() { + return deep; + } + + expect(o?.Foo?.#x).toEqual(undefined); + expect(o?.Foo?.#x.toString).toEqual(undefined); + expect(o?.Foo?.#x.toString()).toEqual(undefined); + + expect(deep?.very.o?.Foo?.#x).toEqual(undefined); + expect(deep?.very.o?.Foo?.#x.toString).toEqual(undefined); + expect(deep?.very.o?.Foo?.#x.toString()).toEqual(undefined); + + expect(o?.Foo.#self?.#x).toEqual(undefined); + expect(o?.Foo.#self.self?.#x).toEqual(undefined); + expect(o?.Foo.#self?.self?.#x).toEqual(undefined); + expect(o?.Foo.#self.self?.self?.#x).toEqual(undefined); + expect(o?.Foo.#self?.self?.self?.#x).toEqual(undefined); + + expect(o?.Foo.#self.getSelf()?.#x).toEqual(undefined); + expect(o?.Foo.#self.getSelf?.()?.#x).toEqual(undefined); + expect(o?.Foo.#self?.getSelf()?.#x).toEqual(undefined); + expect(o?.Foo.#self?.getSelf?.()?.#x).toEqual(undefined); + expect(o?.Foo.#self.getSelf()?.self?.#x).toEqual(undefined); + expect(o?.Foo.#self.getSelf?.()?.self?.#x).toEqual(undefined); + expect(o?.Foo.#self?.getSelf()?.self?.#x).toEqual(undefined); + expect(o?.Foo.#self?.getSelf?.()?.self?.#x).toEqual(undefined); + + expect(fn?.().Foo?.#x).toEqual(undefined); + expect(fn?.().Foo?.#x.toString).toEqual(undefined); + expect(fn?.().Foo?.#x.toString()).toEqual(undefined); + + expect(fnDeep?.().very.o?.Foo?.#x).toEqual(undefined); + expect(fnDeep?.().very.o?.Foo?.#x.toString).toEqual(undefined); + expect(fnDeep?.().very.o?.Foo?.#x.toString()).toEqual(undefined); + + expect(fn?.().Foo.#self?.#x).toEqual(undefined); + expect(fn?.().Foo.#self.self?.#x).toEqual(undefined); + expect(fn?.().Foo.#self?.self?.#x).toEqual(undefined); + expect(fn?.().Foo.#self.self?.self?.#x).toEqual(undefined); + expect(fn?.().Foo.#self?.self?.self?.#x).toEqual(undefined); + + expect(fn?.().Foo.#self.getSelf()?.#x).toEqual(undefined); + expect(fn?.().Foo.#self.getSelf?.()?.#x).toEqual(undefined); + expect(fn?.().Foo.#self?.getSelf()?.#x).toEqual(undefined); + expect(fn?.().Foo.#self?.getSelf?.()?.#x).toEqual(undefined); + expect(fn?.().Foo.#self.getSelf()?.self?.#x).toEqual(undefined); + expect(fn?.().Foo.#self.getSelf?.()?.self?.#x).toEqual(undefined); + expect(fn?.().Foo.#self?.getSelf()?.self?.#x).toEqual(undefined); + expect(fn?.().Foo.#self?.getSelf?.()?.self?.#x).toEqual(undefined); + } +} + +Foo.test(); +Foo.testNull(); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-optional-property/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-optional-property/input.js new file mode 100644 index 000000000000..aecba329a27a --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-optional-property/input.js @@ -0,0 +1,70 @@ +class Foo { + static #x = 1; + static #self = Foo; + static self = Foo; + static getSelf() { return this } + + static test() { + const o = { Foo: Foo }; + const deep = { very: { o } }; + function fn() { + return o; + } + function fnDeep() { + return deep; + } + + Foo?.#x; + Foo?.#x.toString; + Foo?.#x.toString(); + + o?.Foo?.#x; + o?.Foo?.#x.toString; + o?.Foo?.#x.toString(); + + deep?.very.o?.Foo?.#x; + deep?.very.o?.Foo?.#x.toString; + deep?.very.o?.Foo?.#x.toString(); + + o?.Foo.#self?.#x; + o?.Foo.#self.self?.#x; + o?.Foo.#self?.self?.#x; + o?.Foo.#self.self?.self?.#x; + o?.Foo.#self?.self?.self?.#x; + + o?.Foo.#self.getSelf()?.#x; + o?.Foo.#self.getSelf?.()?.#x; + o?.Foo.#self?.getSelf()?.#x; + o?.Foo.#self?.getSelf?.()?.#x; + o?.Foo.#self.getSelf()?.self?.#x; + o?.Foo.#self.getSelf?.()?.self?.#x; + o?.Foo.#self?.getSelf()?.self?.#x; + o?.Foo.#self?.getSelf?.()?.self?.#x; + + fn?.().Foo?.#x; + fn?.().Foo?.#x.toString; + fn?.().Foo?.#x.toString(); + + fnDeep?.().very.o?.Foo?.#x; + fnDeep?.().very.o?.Foo?.#x.toString; + fnDeep?.().very.o?.Foo?.#x.toString(); + + fn?.().Foo.#self?.#x; + fn?.().Foo.#self.self?.#x; + fn?.().Foo.#self?.self?.#x; + fn?.().Foo.#self.self?.self?.#x; + fn?.().Foo.#self?.self?.self?.#x; + + fn?.().Foo.#self.getSelf()?.#x; + fn?.().Foo.#self.getSelf?.()?.#x; + fn?.().Foo.#self?.getSelf()?.#x; + fn?.().Foo.#self?.getSelf?.()?.#x; + fn?.().Foo.#self.getSelf()?.self?.#x; + fn?.().Foo.#self.getSelf?.()?.self?.#x; + fn?.().Foo.#self?.getSelf()?.self?.#x; + fn?.().Foo.#self?.getSelf?.()?.self?.#x; + + } +} + +Foo.test(); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-optional-property/options.json b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-optional-property/options.json new file mode 100644 index 000000000000..3b59e1bbfcc8 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-optional-property/options.json @@ -0,0 +1,4 @@ +{ + "plugins": ["proposal-class-properties"], + "minNodeVersion": "14.0.0" +} diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-optional-property/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-optional-property/output.js new file mode 100644 index 000000000000..de6a92dd23e0 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/private/optional-chain-optional-property/output.js @@ -0,0 +1,86 @@ +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +function _classStaticPrivateFieldSpecGet(receiver, classConstructor, descriptor) { if (receiver !== classConstructor) { throw new TypeError("Private static access of wrong provenance"); } if (descriptor.get) { return descriptor.get.call(receiver); } return descriptor.value; } + +class Foo { + static getSelf() { + return this; + } + + static test() { + var _o$Foo, _o$Foo2, _o$Foo3, _deep$very$o$Foo, _deep$very$o$Foo2, _deep$very$o$Foo3, _ref, _ref2, _self2, _self3, _self$self, _ref3, _classStaticPrivateFi, _call, _getSelf, _getSelf2, _self4, _classStaticPrivateFi2, _call$self, _getSelf$self, _getSelf$self2, _fn$Foo, _fn$Foo2, _fn$Foo3, _fnDeep$very$o$Foo, _fnDeep$very$o$Foo2, _fnDeep$very$o$Foo3, _ref4, _ref5, _self5, _self6, _self$self2, _ref6, _classStaticPrivateFi3, _call2, _getSelf3, _getSelf4, _self7, _classStaticPrivateFi4, _call$self2, _getSelf$self3, _getSelf$self4; + + const o = { + Foo: Foo + }; + const deep = { + very: { + o + } + }; + + function fn() { + return o; + } + + function fnDeep() { + return deep; + } + + Foo === null || Foo === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(Foo, Foo, _x); + Foo === null || Foo === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(Foo, Foo, _x).toString; + Foo === null || Foo === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(Foo, Foo, _x).toString(); + (_o$Foo = o?.Foo) === null || _o$Foo === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_o$Foo, Foo, _x); + (_o$Foo2 = o?.Foo) === null || _o$Foo2 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_o$Foo2, Foo, _x).toString; + (_o$Foo3 = o?.Foo) === null || _o$Foo3 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_o$Foo3, Foo, _x).toString(); + (_deep$very$o$Foo = deep?.very.o?.Foo) === null || _deep$very$o$Foo === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_deep$very$o$Foo, Foo, _x); + (_deep$very$o$Foo2 = deep?.very.o?.Foo) === null || _deep$very$o$Foo2 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_deep$very$o$Foo2, Foo, _x).toString; + (_deep$very$o$Foo3 = deep?.very.o?.Foo) === null || _deep$very$o$Foo3 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_deep$very$o$Foo3, Foo, _x).toString(); + (_ref = o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self)) === null || _ref === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_ref, Foo, _x); + (_ref2 = o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self).self) === null || _ref2 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_ref2, Foo, _x); + (_self2 = (o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self))?.self) === null || _self2 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_self2, Foo, _x); + (_self3 = (o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self).self)?.self) === null || _self3 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_self3, Foo, _x); + (_self$self = (o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self))?.self?.self) === null || _self$self === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_self$self, Foo, _x); + (_ref3 = o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self).getSelf()) === null || _ref3 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_ref3, Foo, _x); + (_call = (o === null || o === void 0 ? void 0 : (_classStaticPrivateFi = _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self)).getSelf)?.call(_classStaticPrivateFi)) === null || _call === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_call, Foo, _x); + (_getSelf = (o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self))?.getSelf()) === null || _getSelf === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_getSelf, Foo, _x); + (_getSelf2 = (o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self))?.getSelf?.()) === null || _getSelf2 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_getSelf2, Foo, _x); + (_self4 = (o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self).getSelf())?.self) === null || _self4 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_self4, Foo, _x); + (_call$self = (o === null || o === void 0 ? void 0 : (_classStaticPrivateFi2 = _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self)).getSelf)?.call(_classStaticPrivateFi2)?.self) === null || _call$self === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_call$self, Foo, _x); + (_getSelf$self = (o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self))?.getSelf()?.self) === null || _getSelf$self === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_getSelf$self, Foo, _x); + (_getSelf$self2 = (o === null || o === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(o.Foo, Foo, _self))?.getSelf?.()?.self) === null || _getSelf$self2 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_getSelf$self2, Foo, _x); + (_fn$Foo = fn?.().Foo) === null || _fn$Foo === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_fn$Foo, Foo, _x); + (_fn$Foo2 = fn?.().Foo) === null || _fn$Foo2 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_fn$Foo2, Foo, _x).toString; + (_fn$Foo3 = fn?.().Foo) === null || _fn$Foo3 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_fn$Foo3, Foo, _x).toString(); + (_fnDeep$very$o$Foo = fnDeep?.().very.o?.Foo) === null || _fnDeep$very$o$Foo === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_fnDeep$very$o$Foo, Foo, _x); + (_fnDeep$very$o$Foo2 = fnDeep?.().very.o?.Foo) === null || _fnDeep$very$o$Foo2 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_fnDeep$very$o$Foo2, Foo, _x).toString; + (_fnDeep$very$o$Foo3 = fnDeep?.().very.o?.Foo) === null || _fnDeep$very$o$Foo3 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_fnDeep$very$o$Foo3, Foo, _x).toString(); + (_ref4 = fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self)) === null || _ref4 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_ref4, Foo, _x); + (_ref5 = fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self).self) === null || _ref5 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_ref5, Foo, _x); + (_self5 = (fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self))?.self) === null || _self5 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_self5, Foo, _x); + (_self6 = (fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self).self)?.self) === null || _self6 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_self6, Foo, _x); + (_self$self2 = (fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self))?.self?.self) === null || _self$self2 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_self$self2, Foo, _x); + (_ref6 = fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self).getSelf()) === null || _ref6 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_ref6, Foo, _x); + (_call2 = (fn === null || fn === void 0 ? void 0 : (_classStaticPrivateFi3 = _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self)).getSelf)?.call(_classStaticPrivateFi3)) === null || _call2 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_call2, Foo, _x); + (_getSelf3 = (fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self))?.getSelf()) === null || _getSelf3 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_getSelf3, Foo, _x); + (_getSelf4 = (fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self))?.getSelf?.()) === null || _getSelf4 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_getSelf4, Foo, _x); + (_self7 = (fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self).getSelf())?.self) === null || _self7 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_self7, Foo, _x); + (_call$self2 = (fn === null || fn === void 0 ? void 0 : (_classStaticPrivateFi4 = _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self)).getSelf)?.call(_classStaticPrivateFi4)?.self) === null || _call$self2 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_call$self2, Foo, _x); + (_getSelf$self3 = (fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self))?.getSelf()?.self) === null || _getSelf$self3 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_getSelf$self3, Foo, _x); + (_getSelf$self4 = (fn === null || fn === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(fn().Foo, Foo, _self))?.getSelf?.()?.self) === null || _getSelf$self4 === void 0 ? void 0 : _classStaticPrivateFieldSpecGet(_getSelf$self4, Foo, _x); + } + +} + +var _x = { + writable: true, + value: 1 +}; +var _self = { + writable: true, + value: Foo +}; + +_defineProperty(Foo, "self", Foo); + +Foo.test(); diff --git a/scripts/parser-tests/test262/whitelist.txt b/scripts/parser-tests/test262/whitelist.txt index 75b75ef96b23..8b137891791f 100644 --- a/scripts/parser-tests/test262/whitelist.txt +++ b/scripts/parser-tests/test262/whitelist.txt @@ -1,4 +1 @@ -language/expressions/class/elements/grammar-private-field-optional-chaining.js(default) -language/expressions/class/elements/grammar-private-field-optional-chaining.js(strict mode) -language/statements/class/elements/grammar-private-field-optional-chaining.js(default) -language/statements/class/elements/grammar-private-field-optional-chaining.js(strict mode) +