Skip to content

Commit 0b7b374

Browse files
Closure Teamcopybara-github
Closure Team
authored andcommitted
Add parsing support for ES6 class private properties
PiperOrigin-RevId: 722828272
1 parent 597c475 commit 0b7b374

13 files changed

+1104
-82
lines changed

src/com/google/javascript/jscomp/CodeGenerator.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -706,7 +706,7 @@ protected void add(Node node, Context context, boolean printComments) {
706706

707707
// Add the property name.
708708
if (!node.isQuotedStringKey()
709-
&& TokenStream.isJSIdentifier(name)
709+
&& (TokenStream.isJSIdentifier(name) || node.isPrivateIdentifier())
710710
&&
711711
// do not encode literally any non-literal characters that were
712712
// Unicode escaped.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
/*
2+
* Copyright 2025 The Closure Compiler Authors.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package com.google.javascript.jscomp;
18+
19+
import static com.google.javascript.jscomp.TranspilationUtil.cannotConvertYet;
20+
21+
import com.google.errorprone.annotations.CanIgnoreReturnValue;
22+
import com.google.javascript.jscomp.parsing.parser.FeatureSet;
23+
import com.google.javascript.jscomp.parsing.parser.FeatureSet.Feature;
24+
import com.google.javascript.rhino.Node;
25+
26+
/** Transpiles away usages of private properties in ES6 classes. */
27+
final class RewritePrivateClassProperties extends AbstractPeepholeTranspilation {
28+
29+
private final AbstractCompiler compiler;
30+
31+
RewritePrivateClassProperties(AbstractCompiler compiler) {
32+
this.compiler = compiler;
33+
}
34+
35+
@Override
36+
FeatureSet getTranspiledAwayFeatures() {
37+
return FeatureSet.BARE_MINIMUM.with(Feature.PRIVATE_CLASS_PROPERTIES);
38+
}
39+
40+
@Override
41+
@CanIgnoreReturnValue
42+
Node transpileSubtree(Node n) {
43+
if (n.isPrivateIdentifier()) {
44+
cannotConvertYet(compiler, n, "private class properties");
45+
}
46+
return n;
47+
}
48+
}

src/com/google/javascript/jscomp/TranspilationPasses.java

+3
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,9 @@ public static void addTranspilationPasses(PassListBuilder passes, CompilerOption
197197
compiler,
198198
compiler.getOptions().getBrowserFeaturesetYearObject(),
199199
compiler.getOptions().getOutputFeatureSet()));
200+
if (compiler.getOptions().needsTranspilationOf(Feature.PRIVATE_CLASS_PROPERTIES)) {
201+
peepholeTranspilations.add(new RewritePrivateClassProperties(compiler));
202+
}
200203
if (compiler.getOptions().needsTranspilationOf(Feature.OPTIONAL_CATCH_BINDING)) {
201204
peepholeTranspilations.add(new RewriteCatchWithNoBinding(compiler));
202205
}

0 commit comments

Comments
 (0)