Skip to content

Commit 2a8db63

Browse files
seclerpSpace Team
authored andcommitted
[K/JS]: KT-21626: Support const and let declarations in parser
1 parent 8b5e4f7 commit 2a8db63

File tree

21 files changed

+169
-137
lines changed

21 files changed

+169
-137
lines changed

compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/jsexport/ExportModelToJsStatements.kt

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ class ExportModelToJsStatements(
6060
val varName = JsName(declareNewNamespace(newNamespace), false)
6161
val namespaceRef = jsElementAccess(element, currentRef)
6262
statements += JsVars(
63+
JsVars.Variant.Var,
6364
JsVars.JsVar(
6465
varName,
6566
JsAstUtils.or(
@@ -107,7 +108,7 @@ class ExportModelToJsStatements(
107108
JsExport(property.name.makeRef(), JsName(declaration.name, false))
108109
}
109110

110-
listOf(JsVars(property), exportStatement)
111+
listOf(JsVars(JsVars.Variant.Var, property), exportStatement)
111112
}
112113
else -> {
113114
val getter = declaration.irGetter?.let { staticContext.getNameForStaticDeclaration(it) }
@@ -234,7 +235,10 @@ class ExportModelToJsStatements(
234235
val bindConstructor = JsName("__bind_constructor_", false)
235236

236237
val blockStatements = mutableListOf<JsStatement>(
237-
JsVars(JsVars.JsVar(bindConstructor, innerClassRef.bindToThis(innerClassRef)))
238+
JsVars(
239+
JsVars.Variant.Var,
240+
JsVars.JsVar(bindConstructor, innerClassRef.bindToThis(innerClassRef))
241+
)
238242
)
239243

240244
if (companionObject != null) {
@@ -280,7 +284,7 @@ class ExportModelToJsStatements(
280284
is JsNameRef -> classRef.name!! to null
281285
else -> {
282286
val stableName = JsName(makeValidES5Identifier(name), true)
283-
stableName to JsVars(JsVars.JsVar(stableName, classRef))
287+
stableName to JsVars(JsVars.Variant.Var, JsVars.JsVar(stableName, classRef))
284288
}
285289
}
286290
}

compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/IrDeclarationToJsTransformer.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ class IrDeclarationToJsTransformer : BaseIrElementToJsNodeTransformer<JsStatemen
5151
initializerBlock.statements += jsAssignment(fieldName.makeRef(), initializer).makeStmt()
5252
}
5353

54-
return JsVars(JsVars.JsVar(fieldName))
54+
return JsVars(JsVars.Variant.Var, JsVars.JsVar(fieldName))
5555
}
5656

5757
override fun visitVariable(declaration: IrVariable, context: JsGenerationContext): JsStatement {

compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/IrElementToJsStatementTransformer.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,7 @@ class IrElementToJsStatementTransformer : BaseIrElementToJsNodeTransformer<JsSta
171171
}
172172

173173
SwitchOptimizer(context, isExpression = true, transformer).tryOptimize(value)?.let {
174-
return JsBlock(JsVars(JsVars.JsVar(varName)), it).withSource(declaration, context)
174+
return JsBlock(JsVars(JsVars.Variant.Var, JsVars.JsVar(varName)), it).withSource(declaration, context)
175175
}
176176
}
177177

@@ -189,7 +189,7 @@ class IrElementToJsStatementTransformer : BaseIrElementToJsNodeTransformer<JsSta
189189
synthetic = syntheticVariable
190190
wasMovedFromItsDeclarationPlace = declaration.wasMovedFromItsDeclarationPlace
191191
}
192-
return JsVars(variable).apply { synthetic = syntheticVariable }
192+
return JsVars(JsVars.Variant.Var, variable).apply { synthetic = syntheticVariable }
193193
}
194194

195195
override fun visitDelegatingConstructorCall(expression: IrDelegatingConstructorCall, context: JsGenerationContext): JsStatement {

compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/JsClassGenerator.kt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,12 @@ class JsClassGenerator(private val irClass: IrClass, val context: JsGenerationCo
9393
}
9494
}
9595

96-
return JsCompositeBlock(interfaceDefaultsBlock.statements + listOf(JsVars(classHolder), functionWrapper.makeStmt())).also {
96+
return JsCompositeBlock(
97+
interfaceDefaultsBlock.statements + listOf(
98+
JsVars(JsVars.Variant.Var, classHolder),
99+
functionWrapper.makeStmt()
100+
)
101+
).also {
97102
classModel.preDeclarationBlock.statements.clear()
98103
classModel.postDeclarationBlock.statements.clear()
99104
}

compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/JsIrProgramFragment.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -299,7 +299,7 @@ class CrossModuleReferences(
299299

300300
private fun CrossModuleImport.generateImportVariableDeclaration(importedAs: JsName): JsStatement {
301301
val exportRef = JsNameRef(exportedAs, ReservedJsNames.makeCrossModuleNameRef(moduleExporter.internalName))
302-
return JsVars(JsVars.JsVar(importedAs, exportRef))
302+
return JsVars(JsVars.Variant.Var, JsVars.JsVar(importedAs, exportRef))
303303
}
304304

305305
private fun CrossModuleImport.generateJsImportStatement(importedAs: JsName): JsStatement {
@@ -317,7 +317,7 @@ class CrossModuleReferences(
317317
fun JsStatement.renameImportedSymbolInternalName(newName: JsName): JsStatement {
318318
return when (this) {
319319
is JsImport -> JsImport(module, JsImport.Element((target as JsImport.Target.Elements).elements.single().name, newName.makeRef()))
320-
is JsVars -> JsVars(JsVars.JsVar(newName, vars.single().initExpression))
320+
is JsVars -> JsVars(JsVars.Variant.Var, JsVars.JsVar(newName, vars.single().initExpression))
321321
else -> error("Unexpected cross-module import statement ${this::class.qualifiedName}")
322322
}
323323
}

compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/Merger.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -335,7 +335,7 @@ class Merger(
335335
if (name == null) return this
336336

337337
return when (this) {
338-
is JsVars -> JsVars(JsVars.JsVar(name, vars.single().initExpression))
338+
is JsVars -> JsVars(JsVars.Variant.Var, JsVars.JsVar(name, vars.single().initExpression))
339339
is JsImport -> JsImport(
340340
module,
341341
when (target) {

compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/jsAstUtils.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ fun jsElementAccess(name: String, receiver: JsExpression?): JsExpression =
8181
jsElementAccess(JsName(name, false), receiver)
8282

8383
fun JsExpression.putIntoVariableWitName(name: JsName): JsVars {
84-
return JsVars(JsVars.JsVar(name, this))
84+
return JsVars(JsVars.Variant.Var, JsVars.JsVar(name, this))
8585
}
8686

8787
fun jsElementAccess(name: JsName, computedName: JsExpression?, receiver: JsExpression?): JsExpression =
@@ -379,7 +379,7 @@ fun translateCall(
379379
val iifeFun = JsFunction(
380380
emptyScope,
381381
JsBlock(
382-
JsVars(JsVars.JsVar(receiverName, jsDispatchReceiver)),
382+
JsVars(JsVars.Variant.Var, JsVars.JsVar(receiverName, jsDispatchReceiver)),
383383
JsReturn(
384384
JsInvocation(
385385
JsNameRef("apply", jsElementAccess(functionName.ident, receiverRef)),
@@ -598,7 +598,7 @@ object JsAstUtils {
598598
}
599599

600600
fun newVar(name: JsName, expr: JsExpression?): JsVars {
601-
return JsVars(JsVars.JsVar(name, expr))
601+
return JsVars(JsVars.Variant.Var, JsVars.JsVar(name, expr))
602602
}
603603
}
604604

compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/utils/serialization/JsIrAstDeserializer.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -290,6 +290,7 @@ private class JsIrAstDeserializer(private val source: ByteArray) {
290290
private val jsBinaryOperatorValues get() = JsBinaryOperator.entries
291291
private val jsUnaryOperatorValues get() = JsUnaryOperator.entries
292292
private val jsFunctionModifiersValues get() = JsFunction.Modifier.entries
293+
private val jsVarVariants get() = JsVars.Variant.entries
293294

294295
private fun readExpression(): JsExpression {
295296
return withComments {
@@ -458,7 +459,8 @@ private class JsIrAstDeserializer(private val source: ByteArray) {
458459
}
459460

460461
private fun readVars(): JsVars {
461-
return JsVars(readBoolean()).apply {
462+
val variant = jsVarVariants[readInt()]
463+
return JsVars(variant, readBoolean()).apply {
462464
readRepeated {
463465
vars += withLocation {
464466
JsVars.JsVar(nameTable[readInt()], ifTrue { readExpression() })

compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/utils/serialization/JsIrAstSerializer.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -604,6 +604,7 @@ private class JsIrAstSerializer {
604604
}
605605

606606
private fun DataWriter.writeVars(vars: JsVars) {
607+
writeInt(vars.variant.ordinal)
607608
writeBoolean(vars.isMultiline)
608609
writeCollection(vars.vars) { varDecl ->
609610
withLocation(varDecl) {

js/js.ast/src/org/jetbrains/kotlin/js/backend/JsToStringGenerationVisitor.java

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,8 @@ public class JsToStringGenerationVisitor extends JsVisitor {
5454
private static final char[] CHARS_TRUE = "true".toCharArray();
5555
private static final char[] CHARS_TRY = "try".toCharArray();
5656
private static final char[] CHARS_VAR = "var".toCharArray();
57+
private static final char[] CHARS_LET = "let".toCharArray();
58+
private static final char[] CHARS_CONST = "const".toCharArray();
5759
private static final char[] CHARS_WHILE = "while".toCharArray();
5860
private static final char[] HEX_DIGITS = {
5961
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
@@ -1301,7 +1303,12 @@ public void visitVars(@NotNull JsVars vars) {
13011303
pushSourceInfo(vars.getSource());
13021304
printCommentsBeforeNode(vars);
13031305

1304-
var();
1306+
switch (vars.getVariant()) {
1307+
case Var: var(); break;
1308+
case Let: let(); break;
1309+
case Const: _const(); break;
1310+
}
1311+
13051312
space();
13061313
boolean sep = false;
13071314
for (JsVar var : vars) {
@@ -1833,6 +1840,14 @@ private void var() {
18331840
p.print(CHARS_VAR);
18341841
}
18351842

1843+
private void let() {
1844+
p.print(CHARS_LET);
1845+
}
1846+
1847+
private void _const() {
1848+
p.print(CHARS_CONST);
1849+
}
1850+
18361851
private void _while() {
18371852
p.print(CHARS_WHILE);
18381853
}

0 commit comments

Comments
 (0)