diff --git a/packages/babel-parser/src/parser/expression.js b/packages/babel-parser/src/parser/expression.js index b02190d19579..62a7c07c6764 100644 --- a/packages/babel-parser/src/parser/expression.js +++ b/packages/babel-parser/src/parser/expression.js @@ -2245,7 +2245,6 @@ export default class ExpressionParser extends LValParser { if (refExpressionErrors.privateKey === -1) { refExpressionErrors.privateKey = privateKeyPos; } - this.classScope.usePrivateName(value, privateKeyPos); } else { this.raise(privateKeyPos, Errors.UnexpectedPrivateField); } diff --git a/packages/babel-parser/src/parser/lval.js b/packages/babel-parser/src/parser/lval.js index 200012247f54..9aeae0b4a888 100644 --- a/packages/babel-parser/src/parser/lval.js +++ b/packages/babel-parser/src/parser/lval.js @@ -143,9 +143,14 @@ export default class LValParser extends NodeUtils { } break; - case "ObjectProperty": - this.toAssignable(node.value, isLHS); + case "ObjectProperty": { + const { key, value } = node; + if (this.isPrivateName(key)) { + this.classScope.usePrivateName(this.getPrivateNameSV(key), key.start); + } + this.toAssignable(value, isLHS); break; + } case "SpreadElement": { this.checkToRestConversion(node); diff --git a/packages/babel-parser/src/plugins/estree.js b/packages/babel-parser/src/plugins/estree.js index 38b97f76672d..f5fbfd210d72 100644 --- a/packages/babel-parser/src/plugins/estree.js +++ b/packages/babel-parser/src/plugins/estree.js @@ -336,8 +336,11 @@ export default (superClass: Class): Class => toAssignable(node: N.Node, isLHS: boolean = false): N.Node { if (node != null && this.isObjectProperty(node)) { - this.toAssignable(node.value, isLHS); - + const { key, value } = node; + if (this.isPrivateName(key)) { + this.classScope.usePrivateName(this.getPrivateNameSV(key), key.start); + } + this.toAssignable(value, isLHS); return node; } diff --git a/packages/babel-parser/test/fixtures/es2022/class-private-properties/invalid-object-method/output.json b/packages/babel-parser/test/fixtures/es2022/class-private-properties/invalid-object-method/output.json index c652c2c767db..7b0a93594846 100644 --- a/packages/babel-parser/test/fixtures/es2022/class-private-properties/invalid-object-method/output.json +++ b/packages/babel-parser/test/fixtures/es2022/class-private-properties/invalid-object-method/output.json @@ -2,8 +2,7 @@ "type": "File", "start":0,"end":33,"loc":{"start":{"line":1,"column":0},"end":{"line":3,"column":1}}, "errors": [ - "SyntaxError: Private names can only be used as the name of a class element (i.e. class C { #p = 42; #m() {} } )\n or a property of member expression (i.e. this.#p). (2:10)", - "SyntaxError: Private name #x is not defined. (2:10)" + "SyntaxError: Private names can only be used as the name of a class element (i.e. class C { #p = 42; #m() {} } )\n or a property of member expression (i.e. this.#p). (2:10)" ], "program": { "type": "Program", diff --git a/packages/babel-parser/test/fixtures/es2022/class-private-properties/invalid-object-property/output.json b/packages/babel-parser/test/fixtures/es2022/class-private-properties/invalid-object-property/output.json index f9bedeefa247..d7360fbbf53b 100644 --- a/packages/babel-parser/test/fixtures/es2022/class-private-properties/invalid-object-property/output.json +++ b/packages/babel-parser/test/fixtures/es2022/class-private-properties/invalid-object-property/output.json @@ -2,8 +2,7 @@ "type": "File", "start":0,"end":32,"loc":{"start":{"line":1,"column":0},"end":{"line":3,"column":1}}, "errors": [ - "SyntaxError: Private names can only be used as the name of a class element (i.e. class C { #p = 42; #m() {} } )\n or a property of member expression (i.e. this.#p). (2:10)", - "SyntaxError: Private name #x is not defined. (2:10)" + "SyntaxError: Private names can only be used as the name of a class element (i.e. class C { #p = 42; #m() {} } )\n or a property of member expression (i.e. this.#p). (2:10)" ], "program": { "type": "Program",