[K/JS] Rework ES modules part with squashed JsImport and right renaming strategy inside import/export statements
This commit is contained in:
@@ -1342,7 +1342,7 @@ public class JsToStringGenerationVisitor extends JsVisitor {
|
||||
blockOpen();
|
||||
List<JsExport.Element> elements = ((JsExport.Subject.Elements) subject).getElements();
|
||||
for (JsExport.Element element : elements) {
|
||||
nameDef(element.getName());
|
||||
visitNameRef(element.getName());
|
||||
JsName alias = element.getAlias();
|
||||
if (alias != null) {
|
||||
p.print(" as ");
|
||||
@@ -1369,10 +1369,10 @@ public class JsToStringGenerationVisitor extends JsVisitor {
|
||||
p.print("import ");
|
||||
|
||||
if (target instanceof JsImport.Target.Default) {
|
||||
nameDef(((JsImport.Target.Default) target).getName());
|
||||
visitNameRef(((JsImport.Target.Default) target).getName());
|
||||
} else if (target instanceof JsImport.Target.All) {
|
||||
p.print("* as ");
|
||||
nameDef(((JsImport.Target.All) target).getAlias());
|
||||
visitNameRef(((JsImport.Target.All) target).getAlias());
|
||||
} else if (target instanceof JsImport.Target.Elements) {
|
||||
List<JsImport.Element> elements = ((JsImport.Target.Elements) target).getElements();
|
||||
|
||||
@@ -1386,10 +1386,10 @@ public class JsToStringGenerationVisitor extends JsVisitor {
|
||||
|
||||
for (JsImport.Element element : elements) {
|
||||
nameDef(element.getName());
|
||||
JsName alias = element.getAlias();
|
||||
JsNameRef alias = element.getAlias();
|
||||
if (alias != null) {
|
||||
p.print(" as ");
|
||||
nameDef(alias);
|
||||
visitNameRef(alias);
|
||||
}
|
||||
|
||||
if (isMultiline) {
|
||||
|
||||
@@ -11,7 +11,7 @@ class JsExport(
|
||||
) : SourceInfoAwareJsNode(), JsStatement {
|
||||
|
||||
constructor(element: Element) : this(Subject.Elements(listOf(element)))
|
||||
constructor(name: JsName, alias: JsName? = null) : this(Element(name, alias))
|
||||
constructor(name: JsNameRef, alias: JsName? = null) : this(Element(name, alias))
|
||||
|
||||
sealed class Subject {
|
||||
class Elements(val elements: List<Element>) : Subject()
|
||||
@@ -19,7 +19,7 @@ class JsExport(
|
||||
}
|
||||
|
||||
class Element(
|
||||
val name: JsName,
|
||||
val name: JsNameRef,
|
||||
val alias: JsName?
|
||||
)
|
||||
|
||||
@@ -28,6 +28,11 @@ class JsExport(
|
||||
}
|
||||
|
||||
override fun acceptChildren(visitor: JsVisitor) {
|
||||
if (subject is Subject.Elements) {
|
||||
subject.elements.forEach {
|
||||
visitor.accept(it.name)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override fun deepCopy(): JsStatement =
|
||||
|
||||
@@ -9,34 +9,39 @@ class JsImport(
|
||||
val module: String,
|
||||
val target: Target,
|
||||
) : SourceInfoAwareJsNode(), JsStatement {
|
||||
constructor(module: String, elements: MutableList<Element> = mutableListOf()) : this(module, Target.Elements(elements))
|
||||
constructor(module: String, vararg elements: Element) : this(module, Target.Elements(elements.toMutableList()))
|
||||
|
||||
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 Default(val name: JsNameRef) : Target() {
|
||||
constructor(name: String) : this(JsNameRef(name))
|
||||
}
|
||||
|
||||
class All(val alias: JsName) : Target() {
|
||||
constructor(alias: String) : this(JsName(alias, false))
|
||||
class All(val alias: JsNameRef) : Target() {
|
||||
constructor(alias: String) : this(JsNameRef(alias))
|
||||
}
|
||||
}
|
||||
|
||||
class Element(
|
||||
val name: JsName,
|
||||
val alias: JsName?
|
||||
) {
|
||||
constructor(name: String, alias: String?) : this(JsName(name, false), alias?.let { JsName(it, false) })
|
||||
}
|
||||
val alias: JsNameRef?
|
||||
)
|
||||
|
||||
override fun accept(visitor: JsVisitor) {
|
||||
visitor.visitImport(this)
|
||||
}
|
||||
|
||||
override fun acceptChildren(visitor: JsVisitor) {
|
||||
when (target) {
|
||||
is Target.All -> visitor.accept(target.alias)
|
||||
is Target.Default -> visitor.accept(target.name)
|
||||
is Target.Elements -> target.elements.forEach {
|
||||
it.alias?.let(visitor::accept)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override fun deepCopy(): JsStatement =
|
||||
|
||||
@@ -26,7 +26,14 @@ class JsImportedModule @JvmOverloads constructor(
|
||||
val key = JsImportedModuleKey(externalName, plainReference?.toString())
|
||||
}
|
||||
|
||||
val JsImportedModule.requireName: String
|
||||
get() = relativeRequirePath?.let { "$it.js" } ?: externalName
|
||||
const val REGULAR_EXTENSION = ".js"
|
||||
const val ESM_EXTENSION = ".mjs"
|
||||
|
||||
fun JsImportedModule.getRequireName(isEsm: Boolean = false): String {
|
||||
return relativeRequirePath?.let {
|
||||
val extension = if (isEsm) ESM_EXTENSION else REGULAR_EXTENSION
|
||||
"$it$extension"
|
||||
} ?: externalName
|
||||
}
|
||||
|
||||
data class JsImportedModuleKey(val baseName: String, val plainName: String?)
|
||||
Reference in New Issue
Block a user