[K/JS] Move ES modules logic to a new transformer with IC

This commit is contained in:
Artem Kobzar
2022-10-13 07:32:44 +00:00
committed by Space Team
parent 54deba63a1
commit de880ce9aa
88 changed files with 2476 additions and 1134 deletions
@@ -1329,31 +1329,47 @@ public class JsToStringGenerationVisitor extends JsVisitor {
@Override
public void visitImport(@NotNull JsImport jsImport) {
p.print("import {");
boolean isMultiline = jsImport.getElements().size() > 1;
p.indentIn();
if (isMultiline)
newlineOpt();
else
space();
JsImport.Target target = jsImport.getTarget();
for (JsImport.Element element : jsImport.getElements()) {
nameDef(element.getName());
JsName alias = element.getAlias();
if (alias != null) {
p.print(" as ");
nameDef(alias);
}
p.print("import ");
if (isMultiline) {
p.print(',');
if (target instanceof JsImport.Target.Default) {
nameDef(((JsImport.Target.Default) target).getName());
} else if (target instanceof JsImport.Target.All) {
p.print("* as ");
nameDef(((JsImport.Target.All) target).getAlias());
} else if (target instanceof JsImport.Target.Elements) {
List<JsImport.Element> elements = ((JsImport.Target.Elements) target).getElements();
p.print("{");
boolean isMultiline = elements.size() > 1;
p.indentIn();
if (isMultiline)
newlineOpt();
} else {
else
space();
for (JsImport.Element element : elements) {
nameDef(element.getName());
JsName alias = element.getAlias();
if (alias != null) {
p.print(" as ");
nameDef(alias);
}
if (isMultiline) {
p.print(',');
newlineOpt();
}
else {
space();
}
}
p.indentOut();
p.print("}");
}
p.indentOut();
p.print("} from ");
p.print(" from ");
p.print(javaScriptString(jsImport.getModule()));
}
@@ -7,8 +7,23 @@ package org.jetbrains.kotlin.js.backend.ast
class JsImport(
val module: String,
val elements: MutableList<Element> = mutableListOf(),
val target: Target,
) : SourceInfoAwareJsNode(), JsStatement {
constructor(module: String, elements: MutableList<Element> = mutableListOf()) : this(module, Target.Elements(elements))
val elements: MutableList<Element>
get() = (target as Target.Elements).elements
sealed class Target {
class Elements(val elements: MutableList<Element>) : Target()
class Default(val name: JsName) : Target() {
constructor(name: String) : this(JsName(name, false))
}
class All(val alias: JsName) : Target() {
constructor(alias: String) : this(JsName(alias, false))
}
}
class Element(
val name: JsName,
@@ -25,7 +40,7 @@ class JsImport(
}
override fun deepCopy(): JsStatement =
JsImport(module, elements.map { it }.toMutableList())
JsImport(module, target)
override fun traverse(v: JsVisitorWithContext, ctx: JsContext<*>) {
v.visit(this, ctx)