[K/JS] Introduce new @JsImport API for JS interop
diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDataClassConverters.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDataClassConverters.kt
index 940cfac..5f6fb56 100644
--- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDataClassConverters.kt
+++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDataClassConverters.kt
@@ -5660,6 +5660,54 @@
token,
)
}
+ add(FirJsErrors.JS_IMPORT_PROHIBITED_ON_VAR) { firDiagnostic ->
+ JsImportProhibitedOnVarImpl(
+ firDiagnostic as KtPsiDiagnostic,
+ token,
+ )
+ }
+ add(FirJsErrors.JS_IMPORT_PROHIBITED_ON_NON_NATIVE) { firDiagnostic ->
+ JsImportProhibitedOnNonNativeImpl(
+ firDiagnostic as KtPsiDiagnostic,
+ token,
+ )
+ }
+ add(FirJsErrors.NESTED_JS_IMPORT_PROHIBITED) { firDiagnostic ->
+ NestedJsImportProhibitedImpl(
+ firDiagnostic as KtPsiDiagnostic,
+ token,
+ )
+ }
+ add(FirJsErrors.JS_IMPORT_DEFAULT_AND_NAMED) { firDiagnostic ->
+ JsImportDefaultAndNamedImpl(
+ firDiagnostic as KtPsiDiagnostic,
+ token,
+ )
+ }
+ add(FirJsErrors.JS_IMPORT_OPTION_WITHOUT_JS_IMPORT) { firDiagnostic ->
+ JsImportOptionWithoutJsImportImpl(
+ firDiagnostic as KtPsiDiagnostic,
+ token,
+ )
+ }
+ add(FirJsErrors.JS_IMPORT_NAMESPACE_ON_NON_OBJECT_DECLARATION) { firDiagnostic ->
+ JsImportNamespaceOnNonObjectDeclarationImpl(
+ firDiagnostic as KtPsiDiagnostic,
+ token,
+ )
+ }
+ add(FirJsErrors.JS_IMPORT_NAMESPACE_WITH_FILE_JS_IMPORT) { firDiagnostic ->
+ JsImportNamespaceWithFileJsImportImpl(
+ firDiagnostic as KtPsiDiagnostic,
+ token,
+ )
+ }
+ add(FirJsErrors.JS_IMPORT_AND_JS_MODULE_MIX) { firDiagnostic ->
+ JsImportAndJsModuleMixImpl(
+ firDiagnostic as KtPsiDiagnostic,
+ token,
+ )
+ }
add(FirJsErrors.OVERRIDING_EXTERNAL_FUN_WITH_OPTIONAL_PARAMS) { firDiagnostic ->
OverridingExternalFunWithOptionalParamsImpl(
firDiagnostic as KtPsiDiagnostic,
diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnostics.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnostics.kt
index df0e024..fc9b407 100644
--- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnostics.kt
+++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnostics.kt
@@ -3941,6 +3941,38 @@
override val diagnosticClass get() = ImplementingFunctionInterface::class
}
+ interface JsImportProhibitedOnVar : KtFirDiagnostic<KtElement> {
+ override val diagnosticClass get() = JsImportProhibitedOnVar::class
+ }
+
+ interface JsImportProhibitedOnNonNative : KtFirDiagnostic<KtElement> {
+ override val diagnosticClass get() = JsImportProhibitedOnNonNative::class
+ }
+
+ interface NestedJsImportProhibited : KtFirDiagnostic<KtElement> {
+ override val diagnosticClass get() = NestedJsImportProhibited::class
+ }
+
+ interface JsImportDefaultAndNamed : KtFirDiagnostic<KtElement> {
+ override val diagnosticClass get() = JsImportDefaultAndNamed::class
+ }
+
+ interface JsImportOptionWithoutJsImport : KtFirDiagnostic<KtElement> {
+ override val diagnosticClass get() = JsImportOptionWithoutJsImport::class
+ }
+
+ interface JsImportNamespaceOnNonObjectDeclaration : KtFirDiagnostic<KtElement> {
+ override val diagnosticClass get() = JsImportNamespaceOnNonObjectDeclaration::class
+ }
+
+ interface JsImportNamespaceWithFileJsImport : KtFirDiagnostic<KtElement> {
+ override val diagnosticClass get() = JsImportNamespaceWithFileJsImport::class
+ }
+
+ interface JsImportAndJsModuleMix : KtFirDiagnostic<KtElement> {
+ override val diagnosticClass get() = JsImportAndJsModuleMix::class
+ }
+
interface OverridingExternalFunWithOptionalParams : KtFirDiagnostic<KtElement> {
override val diagnosticClass get() = OverridingExternalFunWithOptionalParams::class
}
diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnosticsImpl.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnosticsImpl.kt
index bebc863..96a5bee 100644
--- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnosticsImpl.kt
+++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnosticsImpl.kt
@@ -4757,6 +4757,46 @@
token: KtLifetimeToken,
) : KtAbstractFirDiagnostic<KtClassOrObject>(firDiagnostic, token), KtFirDiagnostic.ImplementingFunctionInterface
+internal class JsImportProhibitedOnVarImpl(
+ firDiagnostic: KtPsiDiagnostic,
+ token: KtLifetimeToken,
+) : KtAbstractFirDiagnostic<KtElement>(firDiagnostic, token), KtFirDiagnostic.JsImportProhibitedOnVar
+
+internal class JsImportProhibitedOnNonNativeImpl(
+ firDiagnostic: KtPsiDiagnostic,
+ token: KtLifetimeToken,
+) : KtAbstractFirDiagnostic<KtElement>(firDiagnostic, token), KtFirDiagnostic.JsImportProhibitedOnNonNative
+
+internal class NestedJsImportProhibitedImpl(
+ firDiagnostic: KtPsiDiagnostic,
+ token: KtLifetimeToken,
+) : KtAbstractFirDiagnostic<KtElement>(firDiagnostic, token), KtFirDiagnostic.NestedJsImportProhibited
+
+internal class JsImportDefaultAndNamedImpl(
+ firDiagnostic: KtPsiDiagnostic,
+ token: KtLifetimeToken,
+) : KtAbstractFirDiagnostic<KtElement>(firDiagnostic, token), KtFirDiagnostic.JsImportDefaultAndNamed
+
+internal class JsImportOptionWithoutJsImportImpl(
+ firDiagnostic: KtPsiDiagnostic,
+ token: KtLifetimeToken,
+) : KtAbstractFirDiagnostic<KtElement>(firDiagnostic, token), KtFirDiagnostic.JsImportOptionWithoutJsImport
+
+internal class JsImportNamespaceOnNonObjectDeclarationImpl(
+ firDiagnostic: KtPsiDiagnostic,
+ token: KtLifetimeToken,
+) : KtAbstractFirDiagnostic<KtElement>(firDiagnostic, token), KtFirDiagnostic.JsImportNamespaceOnNonObjectDeclaration
+
+internal class JsImportNamespaceWithFileJsImportImpl(
+ firDiagnostic: KtPsiDiagnostic,
+ token: KtLifetimeToken,
+) : KtAbstractFirDiagnostic<KtElement>(firDiagnostic, token), KtFirDiagnostic.JsImportNamespaceWithFileJsImport
+
+internal class JsImportAndJsModuleMixImpl(
+ firDiagnostic: KtPsiDiagnostic,
+ token: KtLifetimeToken,
+) : KtAbstractFirDiagnostic<KtElement>(firDiagnostic, token), KtFirDiagnostic.JsImportAndJsModuleMix
+
internal class OverridingExternalFunWithOptionalParamsImpl(
firDiagnostic: KtPsiDiagnostic,
token: KtLifetimeToken,
diff --git a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirJsDiagnosticsList.kt b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirJsDiagnosticsList.kt
index 04844d0..a2e7767 100644
--- a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirJsDiagnosticsList.kt
+++ b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirJsDiagnosticsList.kt
@@ -78,6 +78,19 @@
val IMPLEMENTING_FUNCTION_INTERFACE by error<KtClassOrObject>(PositioningStrategy.DECLARATION_SIGNATURE_OR_DEFAULT)
}
+ val IMPORT by object : DiagnosticGroup("JsImport") {
+ val JS_IMPORT_PROHIBITED_ON_VAR by error<KtElement>(PositioningStrategy.DECLARATION_SIGNATURE_OR_DEFAULT)
+ val JS_IMPORT_PROHIBITED_ON_NON_NATIVE by error<KtElement>(PositioningStrategy.DECLARATION_SIGNATURE_OR_DEFAULT)
+ val NESTED_JS_IMPORT_PROHIBITED by error<KtElement>(PositioningStrategy.DECLARATION_SIGNATURE_OR_DEFAULT)
+
+ val JS_IMPORT_DEFAULT_AND_NAMED by error<KtElement>(PositioningStrategy.DECLARATION_SIGNATURE_OR_DEFAULT)
+ val JS_IMPORT_OPTION_WITHOUT_JS_IMPORT by error<KtElement>(PositioningStrategy.DECLARATION_SIGNATURE_OR_DEFAULT)
+ val JS_IMPORT_NAMESPACE_ON_NON_OBJECT_DECLARATION by error<KtElement>(PositioningStrategy.DECLARATION_SIGNATURE_OR_DEFAULT)
+ val JS_IMPORT_NAMESPACE_WITH_FILE_JS_IMPORT by error<KtElement>(PositioningStrategy.DECLARATION_SIGNATURE_OR_DEFAULT)
+
+ val JS_IMPORT_AND_JS_MODULE_MIX by error<KtElement>(PositioningStrategy.DECLARATION_SIGNATURE_OR_DEFAULT)
+ }
+
val EXTERNAL by object : DiagnosticGroup("External") {
val OVERRIDING_EXTERNAL_FUN_WITH_OPTIONAL_PARAMS by error<KtElement>(PositioningStrategy.DECLARATION_SIGNATURE_OR_DEFAULT)
val OVERRIDING_EXTERNAL_FUN_WITH_OPTIONAL_PARAMS_WITH_FAKE by error<KtElement>(PositioningStrategy.DECLARATION_SIGNATURE_OR_DEFAULT) {
diff --git a/compiler/fir/checkers/checkers.js/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/js/FirJsErrors.kt b/compiler/fir/checkers/checkers.js/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/js/FirJsErrors.kt
index c863bae..411fa47 100644
--- a/compiler/fir/checkers/checkers.js/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/js/FirJsErrors.kt
+++ b/compiler/fir/checkers/checkers.js/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/js/FirJsErrors.kt
@@ -60,6 +60,16 @@
// Fun Interfaces
val IMPLEMENTING_FUNCTION_INTERFACE: KtDiagnosticFactory0 by error0<KtClassOrObject>(SourceElementPositioningStrategies.DECLARATION_SIGNATURE_OR_DEFAULT)
+ // JsImport
+ val JS_IMPORT_PROHIBITED_ON_VAR: KtDiagnosticFactory0 by error0<KtElement>(SourceElementPositioningStrategies.DECLARATION_SIGNATURE_OR_DEFAULT)
+ val JS_IMPORT_PROHIBITED_ON_NON_NATIVE: KtDiagnosticFactory0 by error0<KtElement>(SourceElementPositioningStrategies.DECLARATION_SIGNATURE_OR_DEFAULT)
+ val NESTED_JS_IMPORT_PROHIBITED: KtDiagnosticFactory0 by error0<KtElement>(SourceElementPositioningStrategies.DECLARATION_SIGNATURE_OR_DEFAULT)
+ val JS_IMPORT_DEFAULT_AND_NAMED: KtDiagnosticFactory0 by error0<KtElement>(SourceElementPositioningStrategies.DECLARATION_SIGNATURE_OR_DEFAULT)
+ val JS_IMPORT_OPTION_WITHOUT_JS_IMPORT: KtDiagnosticFactory0 by error0<KtElement>(SourceElementPositioningStrategies.DECLARATION_SIGNATURE_OR_DEFAULT)
+ val JS_IMPORT_NAMESPACE_ON_NON_OBJECT_DECLARATION: KtDiagnosticFactory0 by error0<KtElement>(SourceElementPositioningStrategies.DECLARATION_SIGNATURE_OR_DEFAULT)
+ val JS_IMPORT_NAMESPACE_WITH_FILE_JS_IMPORT: KtDiagnosticFactory0 by error0<KtElement>(SourceElementPositioningStrategies.DECLARATION_SIGNATURE_OR_DEFAULT)
+ val JS_IMPORT_AND_JS_MODULE_MIX: KtDiagnosticFactory0 by error0<KtElement>(SourceElementPositioningStrategies.DECLARATION_SIGNATURE_OR_DEFAULT)
+
// External
val OVERRIDING_EXTERNAL_FUN_WITH_OPTIONAL_PARAMS: KtDiagnosticFactory0 by error0<KtElement>(SourceElementPositioningStrategies.DECLARATION_SIGNATURE_OR_DEFAULT)
val OVERRIDING_EXTERNAL_FUN_WITH_OPTIONAL_PARAMS_WITH_FAKE: KtDiagnosticFactory1<FirNamedFunctionSymbol> by error1<KtElement, FirNamedFunctionSymbol>(SourceElementPositioningStrategies.DECLARATION_SIGNATURE_OR_DEFAULT)
diff --git a/compiler/fir/checkers/checkers.js/src/org/jetbrains/kotlin/fir/analysis/js/checkers/JsDeclarationCheckers.kt b/compiler/fir/checkers/checkers.js/src/org/jetbrains/kotlin/fir/analysis/js/checkers/JsDeclarationCheckers.kt
index ef9d44d..2f43a51 100644
--- a/compiler/fir/checkers/checkers.js/src/org/jetbrains/kotlin/fir/analysis/js/checkers/JsDeclarationCheckers.kt
+++ b/compiler/fir/checkers/checkers.js/src/org/jetbrains/kotlin/fir/analysis/js/checkers/JsDeclarationCheckers.kt
@@ -19,6 +19,8 @@
override val basicDeclarationCheckers: Set<FirBasicDeclarationChecker>
get() = setOf(
FirJsModuleChecker,
+ FirJsImportChecker,
+ FirJsImportOptionsChecker,
FirJsRuntimeAnnotationChecker,
FirJsExternalChecker,
FirJsExternalFileChecker,
diff --git a/compiler/fir/checkers/checkers.js/src/org/jetbrains/kotlin/fir/analysis/js/checkers/declaration/FirJsImportChecker.kt b/compiler/fir/checkers/checkers.js/src/org/jetbrains/kotlin/fir/analysis/js/checkers/declaration/FirJsImportChecker.kt
new file mode 100644
index 0000000..6cfc7778
--- /dev/null
+++ b/compiler/fir/checkers/checkers.js/src/org/jetbrains/kotlin/fir/analysis/js/checkers/declaration/FirJsImportChecker.kt
@@ -0,0 +1,55 @@
+/*
+ * Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
+ * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
+ */
+
+package org.jetbrains.kotlin.fir.analysis.js.checkers.declaration
+
+import org.jetbrains.kotlin.diagnostics.DiagnosticReporter
+import org.jetbrains.kotlin.diagnostics.reportOn
+import org.jetbrains.kotlin.fir.analysis.checkers.MppCheckerKind
+import org.jetbrains.kotlin.fir.analysis.checkers.closestNonLocalWith
+import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
+import org.jetbrains.kotlin.fir.analysis.checkers.declaration.FirBasicDeclarationChecker
+import org.jetbrains.kotlin.fir.analysis.checkers.isTopLevel
+import org.jetbrains.kotlin.fir.analysis.diagnostics.js.FirJsErrors
+import org.jetbrains.kotlin.fir.analysis.js.checkers.isNativeObject
+import org.jetbrains.kotlin.fir.declarations.*
+import org.jetbrains.kotlin.fir.resolve.fqName
+import org.jetbrains.kotlin.name.JsStandardClassIds.Annotations.JsImport
+import org.jetbrains.kotlin.name.JsStandardClassIds.Annotations.JsModule
+import org.jetbrains.kotlin.name.JsStandardClassIds.Annotations.JsNonModule
+import org.jetbrains.kotlin.name.JsStandardClassIds.Annotations.JsQualifier
+
+object FirJsImportChecker : FirBasicDeclarationChecker(MppCheckerKind.Common) {
+ private val annotationsForbiddenToUseWithJsImport = setOf(
+ JsModule.asSingleFqName(),
+ JsNonModule.asSingleFqName(),
+ JsQualifier.asSingleFqName()
+ )
+
+ override fun check(declaration: FirDeclaration, context: CheckerContext, reporter: DiagnosticReporter) {
+ if (!declaration.hasAnnotation(JsImport, context.session)) return
+
+ if (declaration is FirProperty && declaration.isVar) {
+ reporter.reportOn(declaration.source, FirJsErrors.JS_IMPORT_PROHIBITED_ON_VAR, context)
+ }
+
+ val closestNonLocal = context.closestNonLocalWith(declaration)?.symbol ?: return
+
+ if (!closestNonLocal.isNativeObject(context)) {
+ reporter.reportOn(declaration.source, FirJsErrors.JS_IMPORT_PROHIBITED_ON_NON_NATIVE, context)
+ }
+
+ if (context.isTopLevel && context.containingFile?.hasAnnotation(JsImport, context.session) == true) {
+ reporter.reportOn(declaration.source, FirJsErrors.NESTED_JS_IMPORT_PROHIBITED, context)
+ }
+
+ if (
+ declaration.hasAnnotation(JsModule, context.session) ||
+ context.containingFile?.annotations?.any { it.fqName(context.session) in annotationsForbiddenToUseWithJsImport } == true
+ ) {
+ reporter.reportOn(declaration.source, FirJsErrors.JS_IMPORT_AND_JS_MODULE_MIX, context)
+ }
+ }
+}
diff --git a/compiler/fir/checkers/checkers.js/src/org/jetbrains/kotlin/fir/analysis/js/checkers/declaration/FirJsImportOptionsChecker.kt b/compiler/fir/checkers/checkers.js/src/org/jetbrains/kotlin/fir/analysis/js/checkers/declaration/FirJsImportOptionsChecker.kt
new file mode 100644
index 0000000..1ff9801
--- /dev/null
+++ b/compiler/fir/checkers/checkers.js/src/org/jetbrains/kotlin/fir/analysis/js/checkers/declaration/FirJsImportOptionsChecker.kt
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
+ * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
+ */
+
+package org.jetbrains.kotlin.fir.analysis.js.checkers.declaration
+
+import org.jetbrains.kotlin.descriptors.isObject
+import org.jetbrains.kotlin.diagnostics.DiagnosticReporter
+import org.jetbrains.kotlin.diagnostics.reportOn
+import org.jetbrains.kotlin.fir.analysis.checkers.MppCheckerKind
+import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
+import org.jetbrains.kotlin.fir.analysis.checkers.declaration.FirBasicDeclarationChecker
+import org.jetbrains.kotlin.fir.analysis.diagnostics.js.FirJsErrors
+import org.jetbrains.kotlin.fir.declarations.*
+import org.jetbrains.kotlin.name.JsStandardClassIds.Annotations.JsImport
+import org.jetbrains.kotlin.name.JsStandardClassIds.Annotations.JsImportName
+import org.jetbrains.kotlin.name.JsStandardClassIds.Annotations.JsImportDefault
+import org.jetbrains.kotlin.name.JsStandardClassIds.Annotations.JsImportNamespace
+
+object FirJsImportOptionsChecker : FirBasicDeclarationChecker(MppCheckerKind.Common) {
+ override fun check(declaration: FirDeclaration, context: CheckerContext, reporter: DiagnosticReporter) {
+ val hasJsImportName = declaration.hasAnnotation(JsImportName, context.session)
+ val hasJsImportDefault = declaration.hasAnnotation(JsImportDefault, context.session)
+ val hasJsImportNamespace = declaration.hasAnnotation(JsImportNamespace, context.session)
+
+ if (!hasJsImportName && !hasJsImportDefault && !hasJsImportNamespace) return
+
+ val thereIsMixOfOptions = listOf(hasJsImportName, hasJsImportDefault, hasJsImportNamespace).count { it } > 1
+ if (thereIsMixOfOptions) {
+ reporter.reportOn(declaration.source, FirJsErrors.JS_IMPORT_DEFAULT_AND_NAMED, context)
+ }
+
+ if (hasJsImportNamespace && (declaration !is FirClass || !declaration.classKind.isObject)) {
+ reporter.reportOn(declaration.source, FirJsErrors.JS_IMPORT_NAMESPACE_ON_NON_OBJECT_DECLARATION, context)
+ }
+
+ val hasJsImport = declaration.hasAnnotation(JsImport, context.session)
+
+ if (!hasJsImport && context.containingFile?.hasAnnotation(JsImport, context.session) != true) {
+ reporter.reportOn(declaration.source, FirJsErrors.JS_IMPORT_OPTION_WITHOUT_JS_IMPORT, context)
+ return
+ }
+
+ if (hasJsImportNamespace && !hasJsImport) {
+ reporter.reportOn(declaration.source, FirJsErrors.JS_IMPORT_NAMESPACE_WITH_FILE_JS_IMPORT, context)
+ }
+ }
+}
diff --git a/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirNonSuppressibleErrorNames.kt b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirNonSuppressibleErrorNames.kt
index 6595e51..0535db7 100644
--- a/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirNonSuppressibleErrorNames.kt
+++ b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirNonSuppressibleErrorNames.kt
@@ -636,6 +636,14 @@
"SUBCLASS_CANT_CALL_COMPANION_PROTECTED_NON_STATIC",
"JAVA_SAM_INTERFACE_CONSTRUCTOR_REFERENCE",
"IMPLEMENTING_FUNCTION_INTERFACE",
+ "JS_IMPORT_PROHIBITED_ON_VAR",
+ "JS_IMPORT_PROHIBITED_ON_NON_NATIVE",
+ "NESTED_JS_IMPORT_PROHIBITED",
+ "JS_IMPORT_DEFAULT_AND_NAMED",
+ "JS_IMPORT_OPTION_WITHOUT_JS_IMPORT",
+ "JS_IMPORT_NAMESPACE_ON_NON_OBJECT_DECLARATION",
+ "JS_IMPORT_NAMESPACE_WITH_FILE_JS_IMPORT",
+ "JS_IMPORT_AND_JS_MODULE_MIX",
"OVERRIDING_EXTERNAL_FUN_WITH_OPTIONAL_PARAMS",
"OVERRIDING_EXTERNAL_FUN_WITH_OPTIONAL_PARAMS_WITH_FAKE",
"CALL_TO_DEFINED_EXTERNALLY_FROM_NON_EXTERNAL_DECLARATION",
diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/JsNameLinkingNamer.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/JsNameLinkingNamer.kt
index 0a7d345..a4b9e34 100644
--- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/JsNameLinkingNamer.kt
+++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/JsNameLinkingNamer.kt
@@ -14,7 +14,9 @@
import org.jetbrains.kotlin.ir.util.*
import org.jetbrains.kotlin.js.backend.ast.*
import org.jetbrains.kotlin.js.backend.ast.metadata.constant
+import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.utils.DFS
+import org.jetbrains.kotlin.utils.addToStdlib.runIf
import org.jetbrains.kotlin.utils.addToStdlib.safeAs
class JsNameLinkingNamer(
@@ -39,9 +41,9 @@
override fun getNameForStaticDeclaration(declaration: IrDeclarationWithName): JsName {
if (declaration.isEffectivelyExternal()) {
- val jsModule: String? = declaration.getJsModule()
+ val jsModule: String? = declaration.getJsImport() ?: declaration.getJsModule()
val maybeParentFile: IrFile? = declaration.parent as? IrFile
- val fileJsModule: String? = maybeParentFile?.getJsModule()
+ val fileJsModule: String? = maybeParentFile?.getJsImport() ?: maybeParentFile?.getJsModule()
val jsQualifier: List<JsName>? = maybeParentFile?.getJsQualifier()?.split('.')?.map { JsName(it, false) }
return when {
@@ -80,25 +82,55 @@
}
private fun IrDeclarationWithName.generateImportForDeclarationWithJsModule(jsModule: String): JsName {
- val nameString = if (isJsNonModule()) {
- getJsNameOrKotlinName().asString()
+ val hasJsImport = getJsImport() != null
+ val importName = getJsImportName()?.toJsName(temporary = false)
+ val isDefaultImport = hasJsImportDefault()
+ val isNamespaceImport = hasJsImportNamespace()
+
+ val declarationName = getJsNameOrKotlinName()
+ val nameString = if (isJsNonModule() || hasJsImport) {
+ declarationName.identifier
} else {
val parent = fqNameWhenAvailable!!.parent()
- parent.child(getJsNameOrKotlinName()).asString()
+ parent.child(declarationName).asString()
}
val name = JsName(sanitizeName(nameString), true)
val nameRef = name.makeRef()
if (isEsModules) {
val importSubject = when {
+ hasJsImport -> when {
+ isNamespaceImport -> JsImport.Target.All(nameRef)
+ isDefaultImport -> JsImport.Target.Default(nameRef)
+ else -> JsImport.Target.Elements(
+ mutableListOf(
+ JsImport.Element(importName ?: JsName(nameString, false), nameRef)
+ )
+ )
+ }
this is IrClass && isObject -> JsImport.Target.All(nameRef)
else -> JsImport.Target.Default(nameRef)
}
imports[this] = JsImport(jsModule, importSubject)
nameMap[this] = name
+ } else if (hasJsImport) {
+ if (isNamespaceImport || isDefaultImport) {
+ importedModules += JsImportedModule(jsModule, name, null)
+ return name
+ }
+
+ val moduleName = JsName(sanitizeName("\$module\$$jsModule"), true)
+ importedModules += JsImportedModule(jsModule, moduleName, null)
+ nameMap[this] = name
+
+ imports[this] = jsElementAccess(
+ importName?.ident ?: nameString,
+ moduleName.makeRef()
+ ).putIntoVariableWitName(name)
} else {
importedModules += JsImportedModule(jsModule, name, nameRef)
}
+
return name
}
@@ -108,11 +140,21 @@
): JsName {
if (this in nameMap) return getName()
+ val importName = getJsImportName()?.toJsName(temporary = false)
+ val isDefaultImport = hasJsImportDefault()
val declarationStableName = getJsNameOrKotlinName().identifier
if (isEsModules) {
- val importedName = jsQualifier?.firstOrNull() ?: declarationStableName.toJsName(temporary = false)
- val importStatement = JsImport(fileJsModule, JsImport.Element(importedName))
+ val usedDeclarationName = jsQualifier?.firstOrNull() ?: declarationStableName.toJsName(temporary = importName != null)
+
+ val importElement = when {
+ isDefaultImport -> JsImport.Target.Default(usedDeclarationName.makeRef())
+ importName != null -> JsImport.Target.Elements(mutableListOf(JsImport.Element(importName, usedDeclarationName.makeRef())))
+ else -> JsImport.Target.Elements(mutableListOf(JsImport.Element(usedDeclarationName)))
+ }
+
+ val importStatement = JsImport(fileJsModule, importElement)
+
imports[this] = when (val qualifiedReference = jsQualifier?.makeRef()) {
null -> importStatement
else -> JsCompositeBlock(
@@ -126,12 +168,20 @@
}
} else {
+ if (isDefaultImport) {
+ val declarationName = declarationStableName.toJsName()
+ importedModules += JsImportedModule(fileJsModule, declarationName, null)
+ return declarationName
+ }
val moduleName = JsName(sanitizeName("\$module\$$fileJsModule"), true)
importedModules += JsImportedModule(fileJsModule, moduleName, null)
val qualifiedReference =
if (jsQualifier == null) moduleName.makeRef() else (listOf(moduleName) + jsQualifier).makeRef()
imports[this] =
- jsElementAccess(declarationStableName, qualifiedReference).putIntoVariableWitName(declarationStableName.toJsName())
+ jsElementAccess(
+ importName?.ident ?: declarationStableName,
+ qualifiedReference
+ ).putIntoVariableWitName(declarationStableName.toJsName())
}
return getName()
diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/utils/AnnotationUtils.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/utils/AnnotationUtils.kt
index 15d8591..6b27004 100644
--- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/utils/AnnotationUtils.kt
+++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/utils/AnnotationUtils.kt
@@ -17,6 +17,10 @@
object JsAnnotations {
val jsModuleFqn = FqName("kotlin.js.JsModule")
+ val jsImportFqn = FqName("kotlin.js.JsImport")
+ val jsImportNameFqn = FqName("kotlin.js.JsImport.Name")
+ val jsImportDefaultFqn = FqName("kotlin.js.JsImport.Default")
+ val jsImportNamespaceFqn = FqName("kotlin.js.JsImport.Namespace")
val jsNonModuleFqn = FqName("kotlin.js.JsNonModule")
val jsNameFqn = FqName("kotlin.js.JsName")
val jsFileNameFqn = FqName("kotlin.js.JsFileName")
@@ -43,6 +47,18 @@
fun IrAnnotationContainer.getJsModule(): String? =
getAnnotation(JsAnnotations.jsModuleFqn)?.getSingleConstStringArgument()
+fun IrAnnotationContainer.getJsImport(): String? =
+ getAnnotation(JsAnnotations.jsImportFqn)?.getSingleConstStringArgument()
+
+fun IrAnnotationContainer.getJsImportName(): String? =
+ getAnnotation(JsAnnotations.jsImportNameFqn)?.getSingleConstStringArgument()
+
+fun IrAnnotationContainer.hasJsImportDefault(): Boolean =
+ hasAnnotation(JsAnnotations.jsImportDefaultFqn)
+
+fun IrAnnotationContainer.hasJsImportNamespace(): Boolean =
+ hasAnnotation(JsAnnotations.jsImportNamespaceFqn)
+
fun IrAnnotationContainer.isJsNonModule(): Boolean =
hasAnnotation(JsAnnotations.jsNonModuleFqn)
diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrUtils.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrUtils.kt
index 83fdef8..374fa17 100644
--- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrUtils.kt
+++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrUtils.kt
@@ -376,7 +376,8 @@
?: (parent as IrDeclaration).getPackageFragment()
}
-fun IrConstructorCall.isAnnotation(name: FqName) = symbol.owner.parentAsClass.fqNameWhenAvailable == name
+fun IrConstructorCall.isAnnotation(name: FqName) =
+ symbol.owner.parentAsClass.hasEqualFqName(name)
fun IrAnnotationContainer.getAnnotation(name: FqName): IrConstructorCall? =
annotations.find { it.isAnnotation(name) }
diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/import/jsImportOptionsWithoutJsImport.kt b/compiler/testData/diagnostics/testsWithJsStdLib/import/jsImportOptionsWithoutJsImport.kt
new file mode 100644
index 0000000..4ccf4d6
--- /dev/null
+++ b/compiler/testData/diagnostics/testsWithJsStdLib/import/jsImportOptionsWithoutJsImport.kt
@@ -0,0 +1,11 @@
+// FIR_IDENTICAL
+package foo
+
+<!JS_IMPORT_OPTION_WITHOUT_JS_IMPORT!>@JsImport.Name("Foo")
+external fun foo()<!>
+
+@JsImport.Default
+external class <!JS_IMPORT_OPTION_WITHOUT_JS_IMPORT!>Bar<!>
+
+@JsImport.Namespace
+external <!JS_IMPORT_OPTION_WITHOUT_JS_IMPORT!>object Correct<!>
diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/import/jsVarProhibited.kt b/compiler/testData/diagnostics/testsWithJsStdLib/import/jsVarProhibited.kt
new file mode 100644
index 0000000..fd54349
--- /dev/null
+++ b/compiler/testData/diagnostics/testsWithJsStdLib/import/jsVarProhibited.kt
@@ -0,0 +1,10 @@
+// FIR_IDENTICAL
+package foo
+
+<!JS_IMPORT_PROHIBITED_ON_VAR!>@JsImport("bar")
+external var bar: Int<!> = definedExternally
+
+typealias JsI = JsImport
+
+<!JS_IMPORT_PROHIBITED_ON_VAR!>@JsI("bar")
+external var bar2: Int<!> = definedExternally
diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/import/jsVarProhibited.txt b/compiler/testData/diagnostics/testsWithJsStdLib/import/jsVarProhibited.txt
new file mode 100644
index 0000000..ad2846b
--- /dev/null
+++ b/compiler/testData/diagnostics/testsWithJsStdLib/import/jsVarProhibited.txt
@@ -0,0 +1,7 @@
+package
+
+package foo {
+ @kotlin.js.JsImport(from = "bar") public external var bar: kotlin.Int
+ @foo.JsI /* = kotlin.js.JsImport */(from = "bar") public external var bar2: kotlin.Int
+ public typealias JsI = kotlin.js.JsImport
+}
diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/import/mixedJsImportAndJsModule.kt b/compiler/testData/diagnostics/testsWithJsStdLib/import/mixedJsImportAndJsModule.kt
new file mode 100644
index 0000000..a8dc825
--- /dev/null
+++ b/compiler/testData/diagnostics/testsWithJsStdLib/import/mixedJsImportAndJsModule.kt
@@ -0,0 +1,7 @@
+// FIR_IDENTICAL
+package foo
+
+<!JS_IMPORT_AND_JS_MODULE_MIX!>@JsImport("A")
+@JsModule("A")
+@JsImport.Default
+external fun foo(): String<!>
diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/import/mixedJsImportAndJsQualifier.kt b/compiler/testData/diagnostics/testsWithJsStdLib/import/mixedJsImportAndJsQualifier.kt
new file mode 100644
index 0000000..d314c52
--- /dev/null
+++ b/compiler/testData/diagnostics/testsWithJsStdLib/import/mixedJsImportAndJsQualifier.kt
@@ -0,0 +1,7 @@
+// FIR_IDENTICAL
+@file:JsQualifier("a.b.c")
+package foo
+
+<!JS_IMPORT_AND_JS_MODULE_MIX!>@JsImport("A")
+@JsImport.Default
+external fun foo(): String<!>
diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/import/multipleJsImportOptions.kt b/compiler/testData/diagnostics/testsWithJsStdLib/import/multipleJsImportOptions.kt
new file mode 100644
index 0000000..4e28e4a
--- /dev/null
+++ b/compiler/testData/diagnostics/testsWithJsStdLib/import/multipleJsImportOptions.kt
@@ -0,0 +1,23 @@
+// FIR_IDENTICAL
+package foo
+
+<!JS_IMPORT_DEFAULT_AND_NAMED!>@JsImport("A")
+@JsImport.Default
+@JsImport.Name("Foo")
+external fun foo(): String<!>
+
+<!JS_IMPORT_DEFAULT_AND_NAMED, JS_IMPORT_NAMESPACE_ON_NON_OBJECT_DECLARATION!>@JsImport("A")
+@JsImport.Default
+<!WRONG_ANNOTATION_TARGET!>@JsImport.Namespace<!>
+external fun bar(): String<!>
+
+<!JS_IMPORT_DEFAULT_AND_NAMED, JS_IMPORT_NAMESPACE_ON_NON_OBJECT_DECLARATION!>@JsImport("A")
+<!WRONG_ANNOTATION_TARGET!>@JsImport.Namespace<!>
+@JsImport.Name("Foo")
+external fun baz(): String<!>
+
+<!JS_IMPORT_DEFAULT_AND_NAMED, JS_IMPORT_NAMESPACE_ON_NON_OBJECT_DECLARATION!>@JsImport("A")
+@JsImport.Default
+<!WRONG_ANNOTATION_TARGET!>@JsImport.Namespace<!>
+@JsImport.Name("Foo")
+external fun boo(): String<!>
diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/import/namespaceInsideFileJsImport.kt b/compiler/testData/diagnostics/testsWithJsStdLib/import/namespaceInsideFileJsImport.kt
new file mode 100644
index 0000000..4165fc4
--- /dev/null
+++ b/compiler/testData/diagnostics/testsWithJsStdLib/import/namespaceInsideFileJsImport.kt
@@ -0,0 +1,6 @@
+// FIR_IDENTICAL
+@file:JsImport("A")
+package foo
+
+@JsImport.Namespace
+external <!JS_IMPORT_NAMESPACE_WITH_FILE_JS_IMPORT!>object Correct<!>
diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/import/nestedProhibited.kt b/compiler/testData/diagnostics/testsWithJsStdLib/import/nestedProhibited.kt
new file mode 100644
index 0000000..9f05109
--- /dev/null
+++ b/compiler/testData/diagnostics/testsWithJsStdLib/import/nestedProhibited.kt
@@ -0,0 +1,17 @@
+// FIR_IDENTICAL
+@file:JsImport("foo")
+package foo
+
+@JsImport("A")
+external class <!NESTED_JS_IMPORT_PROHIBITED!>A<!> {
+ class Nested
+}
+
+@JsImport("B")
+external <!NESTED_JS_IMPORT_PROHIBITED!>object B<!>
+
+<!NESTED_JS_IMPORT_PROHIBITED!>@JsImport("foo")
+external fun foo(): Int<!>
+
+<!NESTED_JS_IMPORT_PROHIBITED!>@JsImport("bar")
+external val bar: Int<!>
\ No newline at end of file
diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/import/nestedProhibited.txt b/compiler/testData/diagnostics/testsWithJsStdLib/import/nestedProhibited.txt
new file mode 100644
index 0000000..01303e9
--- /dev/null
+++ b/compiler/testData/diagnostics/testsWithJsStdLib/import/nestedProhibited.txt
@@ -0,0 +1,27 @@
+package
+
+package foo {
+ @kotlin.js.JsImport(from = "bar") public external val bar: kotlin.Int
+ @kotlin.js.JsImport(from = "foo") public external fun foo(): kotlin.Int
+
+ @kotlin.js.JsImport(from = "A") public final external class A {
+ public constructor A()
+ public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
+ public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
+ public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
+
+ public final class Nested {
+ public constructor Nested()
+ public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
+ public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
+ public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
+ }
+ }
+
+ @kotlin.js.JsImport(from = "B") public external object B {
+ private constructor B()
+ public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
+ public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
+ public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
+ }
+}
diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/import/nonObjectNamespace.kt b/compiler/testData/diagnostics/testsWithJsStdLib/import/nonObjectNamespace.kt
new file mode 100644
index 0000000..6ab5774
--- /dev/null
+++ b/compiler/testData/diagnostics/testsWithJsStdLib/import/nonObjectNamespace.kt
@@ -0,0 +1,22 @@
+// FIR_IDENTICAL
+package foo
+
+<!JS_IMPORT_NAMESPACE_ON_NON_OBJECT_DECLARATION!>@JsImport("A")
+<!WRONG_ANNOTATION_TARGET!>@JsImport.Namespace<!>
+external fun foo()<!>
+
+@JsImport("A")
+@JsImport.Namespace
+external class <!JS_IMPORT_NAMESPACE_ON_NON_OBJECT_DECLARATION!>Bar<!>
+
+<!JS_IMPORT_NAMESPACE_ON_NON_OBJECT_DECLARATION!>@JsImport("A")
+<!WRONG_ANNOTATION_TARGET!>@JsImport.Namespace<!>
+external val test: String<!>
+
+@JsImport("A")
+@JsImport.Namespace
+external interface <!JS_IMPORT_NAMESPACE_ON_NON_OBJECT_DECLARATION!>Foo<!>
+
+@JsImport("A")
+@JsImport.Namespace
+external object Correct
diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/import/prohibitedOnNonNative.kt b/compiler/testData/diagnostics/testsWithJsStdLib/import/prohibitedOnNonNative.kt
new file mode 100644
index 0000000..08c46ec
--- /dev/null
+++ b/compiler/testData/diagnostics/testsWithJsStdLib/import/prohibitedOnNonNative.kt
@@ -0,0 +1,17 @@
+// FIR_IDENTICAL
+package foo
+
+@JsImport("A")
+class <!JS_IMPORT_PROHIBITED_ON_NON_NATIVE!>A<!>
+
+@JsImport("B")
+<!JS_IMPORT_PROHIBITED_ON_NON_NATIVE!>object B<!>
+
+<!JS_IMPORT_PROHIBITED_ON_NON_NATIVE!>@JsImport("foo")
+fun foo()<!> = 23
+
+<!JS_IMPORT_PROHIBITED_ON_NON_NATIVE!>@JsImport("bar")
+val bar<!> = 42
+
+<!JS_IMPORT_PROHIBITED_ON_NON_NATIVE!>@JsImport("baz")
+val baz<!> = 99
diff --git a/core/compiler.common.js/src/org/jetbrains/kotlin/name/JsStandardClassIds.kt b/core/compiler.common.js/src/org/jetbrains/kotlin/name/JsStandardClassIds.kt
index 72b00ba..9ea6ab1 100644
--- a/core/compiler.common.js/src/org/jetbrains/kotlin/name/JsStandardClassIds.kt
+++ b/core/compiler.common.js/src/org/jetbrains/kotlin/name/JsStandardClassIds.kt
@@ -42,6 +42,18 @@
val JsExport = "JsExport".jsId()
@JvmField
+ val JsImport = "JsImport".jsId()
+
+ @JvmField
+ val JsImportName = JsImport.createNestedClassId(Name.identifier("Name"))
+
+ @JvmField
+ val JsImportDefault = JsImport.createNestedClassId(Name.identifier("Default"))
+
+ @JvmField
+ val JsImportNamespace = JsImport.createNestedClassId(Name.identifier("Namespace"))
+
+ @JvmField
val JsExternalInheritorsOnly = "JsExternalInheritorsOnly".jsId()
@JvmField
diff --git a/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/JsPlatformConfigurator.kt b/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/JsPlatformConfigurator.kt
index e8709bd..e785925 100644
--- a/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/JsPlatformConfigurator.kt
+++ b/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/JsPlatformConfigurator.kt
@@ -22,6 +22,7 @@
additionalDeclarationCheckers = listOf(
NativeInvokeChecker(), NativeGetterChecker(), NativeSetterChecker(),
JsNameChecker, JsModuleChecker, JsExternalFileChecker,
+ JsImportChecker, JsImportOptionsChecker,
JsInheritanceChecker, JsMultipleInheritanceChecker,
JsExternalInheritorOnlyChecker,
JsRuntimeAnnotationChecker,
diff --git a/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/diagnostics/ErrorsJs.java b/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/diagnostics/ErrorsJs.java
index 5af2dea..22f0de1 100644
--- a/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/diagnostics/ErrorsJs.java
+++ b/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/diagnostics/ErrorsJs.java
@@ -58,6 +58,18 @@
DiagnosticFactory0<KtElement> JS_MODULE_PROHIBITED_ON_VAR = DiagnosticFactory0.create(ERROR, DECLARATION_SIGNATURE_OR_DEFAULT);
DiagnosticFactory0<KtElement> JS_MODULE_PROHIBITED_ON_NON_NATIVE = DiagnosticFactory0.create(ERROR, DECLARATION_SIGNATURE_OR_DEFAULT);
DiagnosticFactory0<KtElement> NESTED_JS_MODULE_PROHIBITED = DiagnosticFactory0.create(ERROR, DECLARATION_SIGNATURE_OR_DEFAULT);
+
+ DiagnosticFactory0<KtElement> JS_IMPORT_PROHIBITED_ON_VAR = DiagnosticFactory0.create(ERROR, DECLARATION_SIGNATURE_OR_DEFAULT);
+ DiagnosticFactory0<KtElement> JS_IMPORT_PROHIBITED_ON_NON_NATIVE = DiagnosticFactory0.create(ERROR, DECLARATION_SIGNATURE_OR_DEFAULT);
+ DiagnosticFactory0<KtElement> NESTED_JS_IMPORT_PROHIBITED = DiagnosticFactory0.create(ERROR, DECLARATION_SIGNATURE_OR_DEFAULT);
+
+ DiagnosticFactory0<KtElement> JS_IMPORT_DEFAULT_AND_NAMED = DiagnosticFactory0.create(ERROR, DECLARATION_SIGNATURE_OR_DEFAULT);
+ DiagnosticFactory0<KtElement> JS_IMPORT_OPTION_WITHOUT_JS_IMPORT = DiagnosticFactory0.create(ERROR, DECLARATION_SIGNATURE_OR_DEFAULT);
+ DiagnosticFactory0<KtElement> JS_IMPORT_NAMESPACE_ON_NON_OBJECT_DECLARATION = DiagnosticFactory0.create(ERROR, DECLARATION_SIGNATURE_OR_DEFAULT);
+ DiagnosticFactory0<KtElement> JS_IMPORT_NAMESPACE_WITH_FILE_JS_IMPORT = DiagnosticFactory0.create(ERROR, DECLARATION_SIGNATURE_OR_DEFAULT);
+
+ DiagnosticFactory0<KtElement> JS_IMPORT_AND_JS_MODULE_MIX = DiagnosticFactory0.create(ERROR, DECLARATION_SIGNATURE_OR_DEFAULT);
+
DiagnosticFactory1<PsiElement, DeclarationDescriptor> CALL_TO_JS_MODULE_WITHOUT_MODULE_SYSTEM =
DiagnosticFactory1.create(ERROR, DEFAULT);
DiagnosticFactory1<PsiElement, DeclarationDescriptor> CALL_TO_JS_NON_MODULE_WITH_MODULE_SYSTEM =
diff --git a/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/diagnostics/JsImportChecker.kt b/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/diagnostics/JsImportChecker.kt
new file mode 100644
index 0000000..7586183
--- /dev/null
+++ b/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/diagnostics/JsImportChecker.kt
@@ -0,0 +1,62 @@
+/*
+ * Copyright 2010-2016 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.jetbrains.kotlin.js.resolve.diagnostics
+
+import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
+import org.jetbrains.kotlin.descriptors.PropertyDescriptor
+import org.jetbrains.kotlin.js.translate.utils.AnnotationsUtils
+import org.jetbrains.kotlin.name.JsStandardClassIds.Annotations.JsModule
+import org.jetbrains.kotlin.name.JsStandardClassIds.Annotations.JsNonModule
+import org.jetbrains.kotlin.name.JsStandardClassIds.Annotations.JsQualifier
+import org.jetbrains.kotlin.psi.KtDeclaration
+import org.jetbrains.kotlin.resolve.DescriptorUtils
+import org.jetbrains.kotlin.resolve.checkers.DeclarationCheckerContext
+import org.jetbrains.kotlin.resolve.checkers.DeclarationChecker
+
+object JsImportChecker : DeclarationChecker {
+ private val annotationsForbiddenToUseWithJsImport = setOf(
+ JsModule.asSingleFqName(),
+ JsNonModule.asSingleFqName(),
+ JsQualifier.asSingleFqName()
+ )
+
+ override fun check(declaration: KtDeclaration, descriptor: DeclarationDescriptor, context: DeclarationCheckerContext) {
+ val trace = context.trace
+
+ if (AnnotationsUtils.getImportSource(descriptor) == null) return
+
+ if (descriptor is PropertyDescriptor && descriptor.isVar) {
+ trace.report(ErrorsJs.JS_IMPORT_PROHIBITED_ON_VAR.on(declaration))
+ }
+
+ if (!AnnotationsUtils.isNativeObject(descriptor)) {
+ trace.report(ErrorsJs.JS_IMPORT_PROHIBITED_ON_NON_NATIVE.on(declaration))
+ }
+
+ if (DescriptorUtils.isTopLevelDeclaration(descriptor) && AnnotationsUtils.getFileImportSource(trace.bindingContext, descriptor) != null) {
+ trace.report(ErrorsJs.NESTED_JS_IMPORT_PROHIBITED.on(declaration))
+ }
+
+ if (
+ AnnotationsUtils.getModuleName(descriptor) != null ||
+ AnnotationsUtils.getContainingFileAnnotations(context.trace.bindingContext, descriptor)
+ .any { it.fqName in annotationsForbiddenToUseWithJsImport }
+ ) {
+ trace.report(ErrorsJs.JS_IMPORT_AND_JS_MODULE_MIX.on(declaration))
+ }
+ }
+}
diff --git a/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/diagnostics/JsImportOptionsChecker.kt b/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/diagnostics/JsImportOptionsChecker.kt
new file mode 100644
index 0000000..657cacb
--- /dev/null
+++ b/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/diagnostics/JsImportOptionsChecker.kt
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2010-2016 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.jetbrains.kotlin.js.resolve.diagnostics
+
+import org.jetbrains.kotlin.descriptors.ClassDescriptor
+import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
+import org.jetbrains.kotlin.descriptors.isObject
+import org.jetbrains.kotlin.js.translate.utils.AnnotationsUtils
+import org.jetbrains.kotlin.name.JsStandardClassIds.Annotations.JsImport
+import org.jetbrains.kotlin.psi.KtDeclaration
+import org.jetbrains.kotlin.resolve.checkers.DeclarationChecker
+import org.jetbrains.kotlin.resolve.checkers.DeclarationCheckerContext
+
+object JsImportOptionsChecker : DeclarationChecker {
+ override fun check(declaration: KtDeclaration, descriptor: DeclarationDescriptor, context: DeclarationCheckerContext) {
+ val trace = context.trace
+
+ val jsImportName = AnnotationsUtils.getImportName(descriptor)
+ val hasJsImportDefault = AnnotationsUtils.hasImportDefault(descriptor)
+ val hasJsImportNamespace = AnnotationsUtils.hasImportNamespace(descriptor)
+
+ if (jsImportName == null && !hasJsImportDefault && !hasJsImportNamespace) return
+
+ val thereIsMixOfOptions = listOf(jsImportName != null, hasJsImportDefault, hasJsImportNamespace).count { it } > 1
+ if (thereIsMixOfOptions) {
+ trace.report(ErrorsJs.JS_IMPORT_DEFAULT_AND_NAMED.on(declaration))
+ }
+
+ if (hasJsImportNamespace && (descriptor !is ClassDescriptor || !descriptor.kind.isObject)) {
+ trace.report(ErrorsJs.JS_IMPORT_NAMESPACE_ON_NON_OBJECT_DECLARATION.on(declaration))
+ }
+
+ val hasJsImport = AnnotationsUtils.getImportSource(descriptor) != null
+
+ if (!hasJsImport && !AnnotationsUtils.getContainingFileAnnotations(context.trace.bindingContext, descriptor)
+ .any { JsImport.asSingleFqName() == it.fqName }
+ ) {
+ trace.report(ErrorsJs.JS_IMPORT_OPTION_WITHOUT_JS_IMPORT.on(declaration))
+ return
+ }
+
+ if (hasJsImportNamespace && !hasJsImport) {
+ trace.report(ErrorsJs.JS_IMPORT_NAMESPACE_WITH_FILE_JS_IMPORT.on(declaration))
+ }
+ }
+}
diff --git a/js/js.frontend/src/org/jetbrains/kotlin/js/translate/utils/AnnotationsUtils.java b/js/js.frontend/src/org/jetbrains/kotlin/js/translate/utils/AnnotationsUtils.java
index 344fc36..94ae8ac 100644
--- a/js/js.frontend/src/org/jetbrains/kotlin/js/translate/utils/AnnotationsUtils.java
+++ b/js/js.frontend/src/org/jetbrains/kotlin/js/translate/utils/AnnotationsUtils.java
@@ -42,6 +42,10 @@
public final class AnnotationsUtils {
private static final FqName JS_NAME = Annotations.JsName.asSingleFqName();
private static final FqName JS_EXPORT = Annotations.JsExport.asSingleFqName();
+ private static final FqName JS_IMPORT = Annotations.JsImport.asSingleFqName();
+ private static final FqName JS_IMPORT_NAME = Annotations.JsImportName.asSingleFqName();
+ private static final FqName JS_IMPORT_DEFAULT = Annotations.JsImportDefault.asSingleFqName();
+ private static final FqName JS_IMPORT_NAMESPACE = Annotations.JsImportNamespace.asSingleFqName();
private static final FqName JS_EXPORT_IGNORE = Annotations.JsExportIgnore.asSingleFqName();
private static final FqName JS_MODULE_ANNOTATION = Annotations.JsModule.asSingleFqName();
private static final FqName JS_NON_MODULE_ANNOTATION = Annotations.JsNonModule.asSingleFqName();
@@ -233,11 +237,38 @@
}
@Nullable
+ public static String getImportSource(@NotNull DeclarationDescriptor declaration) {
+ AnnotationDescriptor annotation = declaration.getAnnotations().findAnnotation(JS_IMPORT);
+ return annotation != null ? extractSingleStringArgument(annotation) : null;
+ }
+
+ @Nullable
+ public static String getImportName(@NotNull DeclarationDescriptor declaration) {
+ AnnotationDescriptor annotation = declaration.getAnnotations().findAnnotation(JS_IMPORT_NAME);
+ return annotation != null ? extractSingleStringArgument(annotation) : null;
+ }
+
+ @Nullable
+ public static boolean hasImportDefault(@NotNull DeclarationDescriptor declaration) {
+ return declaration.getAnnotations().findAnnotation(JS_IMPORT_DEFAULT) != null;
+ }
+
+ @Nullable
+ public static boolean hasImportNamespace(@NotNull DeclarationDescriptor declaration) {
+ return declaration.getAnnotations().findAnnotation(JS_IMPORT_NAMESPACE) != null;
+ }
+
+ @Nullable
public static String getFileModuleName(@NotNull BindingContext bindingContext, @NotNull DeclarationDescriptor declaration) {
return getSingleStringAnnotationArgument(bindingContext, declaration, JS_MODULE_ANNOTATION);
}
@Nullable
+ public static String getFileImportSource(@NotNull BindingContext bindingContext, @NotNull DeclarationDescriptor declaration) {
+ return getSingleStringAnnotationArgument(bindingContext, declaration, JS_IMPORT);
+ }
+
+ @Nullable
public static String getFileQualifier(@NotNull BindingContext bindingContext, @NotNull DeclarationDescriptor declaration) {
return getSingleStringAnnotationArgument(bindingContext, declaration, JS_QUALIFIER_ANNOTATION);
}
diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/converters/JsIrPathReplacer.kt b/js/js.tests/test/org/jetbrains/kotlin/js/test/converters/JsIrPathReplacer.kt
index 44fed99..c4f3404 100644
--- a/js/js.tests/test/org/jetbrains/kotlin/js/test/converters/JsIrPathReplacer.kt
+++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/converters/JsIrPathReplacer.kt
@@ -24,7 +24,7 @@
private const val PATH_TO_ROOT_TOKEN = "@PATH_TO_ROOT"
class JsIrPathReplacer(testServices: TestServices) : DeclarationTransformer {
- private val replacements = testServices.collectReplacementsMap()
+ private val replacements = testServices.collectReplacementMap()
override fun lower(irFile: IrFile) {
super.lower(irFile)
@@ -38,7 +38,7 @@
}
private fun IrAnnotationContainer.replaceJsModulePath() {
- val jsModuleAnnotation = getAnnotation(JsAnnotations.jsModuleFqn) ?: return
+ val jsModuleAnnotation = getAnnotation(JsAnnotations.jsImportFqn) ?: getAnnotation(JsAnnotations.jsModuleFqn) ?: return
@Suppress("UNCHECKED_CAST")
val stringLiteral = jsModuleAnnotation.getValueArgument(0) as IrConst<String>
@@ -51,7 +51,7 @@
return IrConstImpl.string(startOffset, endOffset, type, replacements[value] ?: return null)
}
- private fun TestServices.collectReplacementsMap(): Map<String, String> {
+ private fun TestServices.collectReplacementMap(): Map<String, String> {
return moduleStructure.modules.asSequence()
.map { module -> module to module.files.filter { it.isJsFile || it.isMjsFile } }
.filter { (_, files) -> files.isNotEmpty() }
diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirJsES6BoxTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirJsES6BoxTestGenerated.java
index 9804efc..2b933b2 100644
--- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirJsES6BoxTestGenerated.java
+++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirJsES6BoxTestGenerated.java
@@ -2631,6 +2631,360 @@
}
@Nested
+ @TestMetadata("js/js.translator/testData/box/esModules/jsFileImport")
+ @TestDataPath("$PROJECT_ROOT")
+ public class JsFileImport {
+ @Test
+ public void testAllFilesPresentInJsFileImport() {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsFileImport"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR_ES6, true);
+ }
+
+ @Nested
+ @TestMetadata("js/js.translator/testData/box/esModules/jsFileImport/default")
+ @TestDataPath("$PROJECT_ROOT")
+ public class Default {
+ @Test
+ public void testAllFilesPresentInDefault() {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsFileImport/default"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR_ES6, true);
+ }
+
+ @Test
+ @TestMetadata("externalClass.kt")
+ public void testExternalClass() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/default/externalClass.kt");
+ }
+
+ @Test
+ @TestMetadata("externalClassWithDefaults.kt")
+ public void testExternalClassWithDefaults() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/default/externalClassWithDefaults.kt");
+ }
+
+ @Test
+ @TestMetadata("externalConstructor.kt")
+ public void testExternalConstructor() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/default/externalConstructor.kt");
+ }
+
+ @Test
+ @TestMetadata("externalFunction.kt")
+ public void testExternalFunction() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/default/externalFunction.kt");
+ }
+
+ @Test
+ @TestMetadata("externalFunctionNameClash.kt")
+ public void testExternalFunctionNameClash() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/default/externalFunctionNameClash.kt");
+ }
+
+ @Test
+ @TestMetadata("externalObject.kt")
+ public void testExternalObject() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/default/externalObject.kt");
+ }
+
+ @Test
+ @TestMetadata("externalProperty.kt")
+ public void testExternalProperty() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/default/externalProperty.kt");
+ }
+
+ @Test
+ @TestMetadata("topLevelVarargFun.kt")
+ public void testTopLevelVarargFun() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/default/topLevelVarargFun.kt");
+ }
+ }
+
+ @Nested
+ @TestMetadata("js/js.translator/testData/box/esModules/jsFileImport/named")
+ @TestDataPath("$PROJECT_ROOT")
+ public class Named {
+ @Test
+ public void testAllFilesPresentInNamed() {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsFileImport/named"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR_ES6, true);
+ }
+
+ @Test
+ @TestMetadata("externalClass.kt")
+ public void testExternalClass() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/named/externalClass.kt");
+ }
+
+ @Test
+ @TestMetadata("externalClassWithDefaults.kt")
+ public void testExternalClassWithDefaults() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/named/externalClassWithDefaults.kt");
+ }
+
+ @Test
+ @TestMetadata("externalConstructor.kt")
+ public void testExternalConstructor() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/named/externalConstructor.kt");
+ }
+
+ @Test
+ @TestMetadata("externalFunction.kt")
+ public void testExternalFunction() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/named/externalFunction.kt");
+ }
+
+ @Test
+ @TestMetadata("externalFunctionNameClash.kt")
+ public void testExternalFunctionNameClash() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/named/externalFunctionNameClash.kt");
+ }
+
+ @Test
+ @TestMetadata("externalObject.kt")
+ public void testExternalObject() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/named/externalObject.kt");
+ }
+
+ @Test
+ @TestMetadata("externalProperty.kt")
+ public void testExternalProperty() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/named/externalProperty.kt");
+ }
+
+ @Test
+ @TestMetadata("topLevelVarargFun.kt")
+ public void testTopLevelVarargFun() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/named/topLevelVarargFun.kt");
+ }
+ }
+
+ @Nested
+ @TestMetadata("js/js.translator/testData/box/esModules/jsFileImport/plainNamed")
+ @TestDataPath("$PROJECT_ROOT")
+ public class PlainNamed {
+ @Test
+ public void testAllFilesPresentInPlainNamed() {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsFileImport/plainNamed"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR_ES6, true);
+ }
+
+ @Test
+ @TestMetadata("externalClassNameClash.kt")
+ public void testExternalClassNameClash() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/plainNamed/externalClassNameClash.kt");
+ }
+
+ @Test
+ @TestMetadata("externalPackage.kt")
+ public void testExternalPackage() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/plainNamed/externalPackage.kt");
+ }
+
+ @Test
+ @TestMetadata("externalPackageInDifferentFile.kt")
+ public void testExternalPackageInDifferentFile() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/plainNamed/externalPackageInDifferentFile.kt");
+ }
+
+ @Test
+ @TestMetadata("interfaces.kt")
+ public void testInterfaces() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/plainNamed/interfaces.kt");
+ }
+
+ @Test
+ @TestMetadata("interfacesWithCompanion.kt")
+ public void testInterfacesWithCompanion() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/plainNamed/interfacesWithCompanion.kt");
+ }
+ }
+ }
+
+ @Nested
+ @TestMetadata("js/js.translator/testData/box/esModules/jsImport")
+ @TestDataPath("$PROJECT_ROOT")
+ public class JsImport {
+ @Test
+ public void testAllFilesPresentInJsImport() {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsImport"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR_ES6, true);
+ }
+
+ @Nested
+ @TestMetadata("js/js.translator/testData/box/esModules/jsImport/default")
+ @TestDataPath("$PROJECT_ROOT")
+ public class Default {
+ @Test
+ public void testAllFilesPresentInDefault() {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsImport/default"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR_ES6, true);
+ }
+
+ @Test
+ @TestMetadata("externalClass.kt")
+ public void testExternalClass() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/default/externalClass.kt");
+ }
+
+ @Test
+ @TestMetadata("externalClassWithDefaults.kt")
+ public void testExternalClassWithDefaults() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/default/externalClassWithDefaults.kt");
+ }
+
+ @Test
+ @TestMetadata("externalConstructor.kt")
+ public void testExternalConstructor() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/default/externalConstructor.kt");
+ }
+
+ @Test
+ @TestMetadata("externalFunction.kt")
+ public void testExternalFunction() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/default/externalFunction.kt");
+ }
+
+ @Test
+ @TestMetadata("externalFunctionNameClash.kt")
+ public void testExternalFunctionNameClash() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/default/externalFunctionNameClash.kt");
+ }
+
+ @Test
+ @TestMetadata("externalObject.kt")
+ public void testExternalObject() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/default/externalObject.kt");
+ }
+
+ @Test
+ @TestMetadata("externalProperty.kt")
+ public void testExternalProperty() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/default/externalProperty.kt");
+ }
+
+ @Test
+ @TestMetadata("topLevelVarargFun.kt")
+ public void testTopLevelVarargFun() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/default/topLevelVarargFun.kt");
+ }
+ }
+
+ @Nested
+ @TestMetadata("js/js.translator/testData/box/esModules/jsImport/named")
+ @TestDataPath("$PROJECT_ROOT")
+ public class Named {
+ @Test
+ public void testAllFilesPresentInNamed() {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsImport/named"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR_ES6, true);
+ }
+
+ @Test
+ @TestMetadata("externalClass.kt")
+ public void testExternalClass() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/named/externalClass.kt");
+ }
+
+ @Test
+ @TestMetadata("externalClassWithDefaults.kt")
+ public void testExternalClassWithDefaults() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/named/externalClassWithDefaults.kt");
+ }
+
+ @Test
+ @TestMetadata("externalConstructor.kt")
+ public void testExternalConstructor() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/named/externalConstructor.kt");
+ }
+
+ @Test
+ @TestMetadata("externalFunction.kt")
+ public void testExternalFunction() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/named/externalFunction.kt");
+ }
+
+ @Test
+ @TestMetadata("externalFunctionNameClash.kt")
+ public void testExternalFunctionNameClash() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/named/externalFunctionNameClash.kt");
+ }
+
+ @Test
+ @TestMetadata("externalObject.kt")
+ public void testExternalObject() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/named/externalObject.kt");
+ }
+
+ @Test
+ @TestMetadata("externalProperty.kt")
+ public void testExternalProperty() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/named/externalProperty.kt");
+ }
+
+ @Test
+ @TestMetadata("topLevelVarargFun.kt")
+ public void testTopLevelVarargFun() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/named/topLevelVarargFun.kt");
+ }
+ }
+
+ @Nested
+ @TestMetadata("js/js.translator/testData/box/esModules/jsImport/namespaced")
+ @TestDataPath("$PROJECT_ROOT")
+ public class Namespaced {
+ @Test
+ public void testAllFilesPresentInNamespaced() {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsImport/namespaced"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR_ES6, true);
+ }
+
+ @Test
+ @TestMetadata("externalObject.kt")
+ public void testExternalObject() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/namespaced/externalObject.kt");
+ }
+
+ @Test
+ @TestMetadata("jsExternalInheritorsOnly.kt")
+ public void testJsExternalInheritorsOnly() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/namespaced/jsExternalInheritorsOnly.kt");
+ }
+ }
+
+ @Nested
+ @TestMetadata("js/js.translator/testData/box/esModules/jsImport/plainNamed")
+ @TestDataPath("$PROJECT_ROOT")
+ public class PlainNamed {
+ @Test
+ public void testAllFilesPresentInPlainNamed() {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsImport/plainNamed"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR_ES6, true);
+ }
+
+ @Test
+ @TestMetadata("externalClassNameClash.kt")
+ public void testExternalClassNameClash() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/plainNamed/externalClassNameClash.kt");
+ }
+
+ @Test
+ @TestMetadata("externalPackage.kt")
+ public void testExternalPackage() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/plainNamed/externalPackage.kt");
+ }
+
+ @Test
+ @TestMetadata("externalPackageInDifferentFile.kt")
+ public void testExternalPackageInDifferentFile() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/plainNamed/externalPackageInDifferentFile.kt");
+ }
+
+ @Test
+ @TestMetadata("interfaces.kt")
+ public void testInterfaces() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/plainNamed/interfaces.kt");
+ }
+
+ @Test
+ @TestMetadata("interfacesWithCompanion.kt")
+ public void testInterfacesWithCompanion() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/plainNamed/interfacesWithCompanion.kt");
+ }
+ }
+ }
+
+ @Nested
@TestMetadata("js/js.translator/testData/box/esModules/jsModule")
@TestDataPath("$PROJECT_ROOT")
public class JsModule {
@@ -7562,6 +7916,360 @@
}
@Nested
+ @TestMetadata("js/js.translator/testData/box/jsFileImport")
+ @TestDataPath("$PROJECT_ROOT")
+ public class JsFileImport {
+ @Test
+ public void testAllFilesPresentInJsFileImport() {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/jsFileImport"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR_ES6, true);
+ }
+
+ @Nested
+ @TestMetadata("js/js.translator/testData/box/jsFileImport/default")
+ @TestDataPath("$PROJECT_ROOT")
+ public class Default {
+ @Test
+ public void testAllFilesPresentInDefault() {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/jsFileImport/default"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR_ES6, true);
+ }
+
+ @Test
+ @TestMetadata("externalClass.kt")
+ public void testExternalClass() {
+ runTest("js/js.translator/testData/box/jsFileImport/default/externalClass.kt");
+ }
+
+ @Test
+ @TestMetadata("externalClassWithDefaults.kt")
+ public void testExternalClassWithDefaults() {
+ runTest("js/js.translator/testData/box/jsFileImport/default/externalClassWithDefaults.kt");
+ }
+
+ @Test
+ @TestMetadata("externalConstructor.kt")
+ public void testExternalConstructor() {
+ runTest("js/js.translator/testData/box/jsFileImport/default/externalConstructor.kt");
+ }
+
+ @Test
+ @TestMetadata("externalFunction.kt")
+ public void testExternalFunction() {
+ runTest("js/js.translator/testData/box/jsFileImport/default/externalFunction.kt");
+ }
+
+ @Test
+ @TestMetadata("externalFunctionNameClash.kt")
+ public void testExternalFunctionNameClash() {
+ runTest("js/js.translator/testData/box/jsFileImport/default/externalFunctionNameClash.kt");
+ }
+
+ @Test
+ @TestMetadata("externalObject.kt")
+ public void testExternalObject() {
+ runTest("js/js.translator/testData/box/jsFileImport/default/externalObject.kt");
+ }
+
+ @Test
+ @TestMetadata("externalProperty.kt")
+ public void testExternalProperty() {
+ runTest("js/js.translator/testData/box/jsFileImport/default/externalProperty.kt");
+ }
+
+ @Test
+ @TestMetadata("topLevelVarargFun.kt")
+ public void testTopLevelVarargFun() {
+ runTest("js/js.translator/testData/box/jsFileImport/default/topLevelVarargFun.kt");
+ }
+ }
+
+ @Nested
+ @TestMetadata("js/js.translator/testData/box/jsFileImport/named")
+ @TestDataPath("$PROJECT_ROOT")
+ public class Named {
+ @Test
+ public void testAllFilesPresentInNamed() {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/jsFileImport/named"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR_ES6, true);
+ }
+
+ @Test
+ @TestMetadata("externalClass.kt")
+ public void testExternalClass() {
+ runTest("js/js.translator/testData/box/jsFileImport/named/externalClass.kt");
+ }
+
+ @Test
+ @TestMetadata("externalClassWithDefaults.kt")
+ public void testExternalClassWithDefaults() {
+ runTest("js/js.translator/testData/box/jsFileImport/named/externalClassWithDefaults.kt");
+ }
+
+ @Test
+ @TestMetadata("externalConstructor.kt")
+ public void testExternalConstructor() {
+ runTest("js/js.translator/testData/box/jsFileImport/named/externalConstructor.kt");
+ }
+
+ @Test
+ @TestMetadata("externalFunction.kt")
+ public void testExternalFunction() {
+ runTest("js/js.translator/testData/box/jsFileImport/named/externalFunction.kt");
+ }
+
+ @Test
+ @TestMetadata("externalFunctionNameClash.kt")
+ public void testExternalFunctionNameClash() {
+ runTest("js/js.translator/testData/box/jsFileImport/named/externalFunctionNameClash.kt");
+ }
+
+ @Test
+ @TestMetadata("externalObject.kt")
+ public void testExternalObject() {
+ runTest("js/js.translator/testData/box/jsFileImport/named/externalObject.kt");
+ }
+
+ @Test
+ @TestMetadata("externalProperty.kt")
+ public void testExternalProperty() {
+ runTest("js/js.translator/testData/box/jsFileImport/named/externalProperty.kt");
+ }
+
+ @Test
+ @TestMetadata("topLevelVarargFun.kt")
+ public void testTopLevelVarargFun() {
+ runTest("js/js.translator/testData/box/jsFileImport/named/topLevelVarargFun.kt");
+ }
+ }
+
+ @Nested
+ @TestMetadata("js/js.translator/testData/box/jsFileImport/plainNamed")
+ @TestDataPath("$PROJECT_ROOT")
+ public class PlainNamed {
+ @Test
+ public void testAllFilesPresentInPlainNamed() {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/jsFileImport/plainNamed"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR_ES6, true);
+ }
+
+ @Test
+ @TestMetadata("externalClassNameClash.kt")
+ public void testExternalClassNameClash() {
+ runTest("js/js.translator/testData/box/jsFileImport/plainNamed/externalClassNameClash.kt");
+ }
+
+ @Test
+ @TestMetadata("externalPackage.kt")
+ public void testExternalPackage() {
+ runTest("js/js.translator/testData/box/jsFileImport/plainNamed/externalPackage.kt");
+ }
+
+ @Test
+ @TestMetadata("externalPackageInDifferentFile.kt")
+ public void testExternalPackageInDifferentFile() {
+ runTest("js/js.translator/testData/box/jsFileImport/plainNamed/externalPackageInDifferentFile.kt");
+ }
+
+ @Test
+ @TestMetadata("interfaces.kt")
+ public void testInterfaces() {
+ runTest("js/js.translator/testData/box/jsFileImport/plainNamed/interfaces.kt");
+ }
+
+ @Test
+ @TestMetadata("interfacesWithCompanion.kt")
+ public void testInterfacesWithCompanion() {
+ runTest("js/js.translator/testData/box/jsFileImport/plainNamed/interfacesWithCompanion.kt");
+ }
+ }
+ }
+
+ @Nested
+ @TestMetadata("js/js.translator/testData/box/jsImport")
+ @TestDataPath("$PROJECT_ROOT")
+ public class JsImport {
+ @Test
+ public void testAllFilesPresentInJsImport() {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/jsImport"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR_ES6, true);
+ }
+
+ @Nested
+ @TestMetadata("js/js.translator/testData/box/jsImport/default")
+ @TestDataPath("$PROJECT_ROOT")
+ public class Default {
+ @Test
+ public void testAllFilesPresentInDefault() {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/jsImport/default"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR_ES6, true);
+ }
+
+ @Test
+ @TestMetadata("externalClass.kt")
+ public void testExternalClass() {
+ runTest("js/js.translator/testData/box/jsImport/default/externalClass.kt");
+ }
+
+ @Test
+ @TestMetadata("externalClassWithDefaults.kt")
+ public void testExternalClassWithDefaults() {
+ runTest("js/js.translator/testData/box/jsImport/default/externalClassWithDefaults.kt");
+ }
+
+ @Test
+ @TestMetadata("externalConstructor.kt")
+ public void testExternalConstructor() {
+ runTest("js/js.translator/testData/box/jsImport/default/externalConstructor.kt");
+ }
+
+ @Test
+ @TestMetadata("externalFunction.kt")
+ public void testExternalFunction() {
+ runTest("js/js.translator/testData/box/jsImport/default/externalFunction.kt");
+ }
+
+ @Test
+ @TestMetadata("externalFunctionNameClash.kt")
+ public void testExternalFunctionNameClash() {
+ runTest("js/js.translator/testData/box/jsImport/default/externalFunctionNameClash.kt");
+ }
+
+ @Test
+ @TestMetadata("externalObject.kt")
+ public void testExternalObject() {
+ runTest("js/js.translator/testData/box/jsImport/default/externalObject.kt");
+ }
+
+ @Test
+ @TestMetadata("externalProperty.kt")
+ public void testExternalProperty() {
+ runTest("js/js.translator/testData/box/jsImport/default/externalProperty.kt");
+ }
+
+ @Test
+ @TestMetadata("topLevelVarargFun.kt")
+ public void testTopLevelVarargFun() {
+ runTest("js/js.translator/testData/box/jsImport/default/topLevelVarargFun.kt");
+ }
+ }
+
+ @Nested
+ @TestMetadata("js/js.translator/testData/box/jsImport/named")
+ @TestDataPath("$PROJECT_ROOT")
+ public class Named {
+ @Test
+ public void testAllFilesPresentInNamed() {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/jsImport/named"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR_ES6, true);
+ }
+
+ @Test
+ @TestMetadata("externalClass.kt")
+ public void testExternalClass() {
+ runTest("js/js.translator/testData/box/jsImport/named/externalClass.kt");
+ }
+
+ @Test
+ @TestMetadata("externalClassWithDefaults.kt")
+ public void testExternalClassWithDefaults() {
+ runTest("js/js.translator/testData/box/jsImport/named/externalClassWithDefaults.kt");
+ }
+
+ @Test
+ @TestMetadata("externalConstructor.kt")
+ public void testExternalConstructor() {
+ runTest("js/js.translator/testData/box/jsImport/named/externalConstructor.kt");
+ }
+
+ @Test
+ @TestMetadata("externalFunction.kt")
+ public void testExternalFunction() {
+ runTest("js/js.translator/testData/box/jsImport/named/externalFunction.kt");
+ }
+
+ @Test
+ @TestMetadata("externalFunctionNameClash.kt")
+ public void testExternalFunctionNameClash() {
+ runTest("js/js.translator/testData/box/jsImport/named/externalFunctionNameClash.kt");
+ }
+
+ @Test
+ @TestMetadata("externalObject.kt")
+ public void testExternalObject() {
+ runTest("js/js.translator/testData/box/jsImport/named/externalObject.kt");
+ }
+
+ @Test
+ @TestMetadata("externalProperty.kt")
+ public void testExternalProperty() {
+ runTest("js/js.translator/testData/box/jsImport/named/externalProperty.kt");
+ }
+
+ @Test
+ @TestMetadata("topLevelVarargFun.kt")
+ public void testTopLevelVarargFun() {
+ runTest("js/js.translator/testData/box/jsImport/named/topLevelVarargFun.kt");
+ }
+ }
+
+ @Nested
+ @TestMetadata("js/js.translator/testData/box/jsImport/namespaced")
+ @TestDataPath("$PROJECT_ROOT")
+ public class Namespaced {
+ @Test
+ public void testAllFilesPresentInNamespaced() {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/jsImport/namespaced"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR_ES6, true);
+ }
+
+ @Test
+ @TestMetadata("externalObject.kt")
+ public void testExternalObject() {
+ runTest("js/js.translator/testData/box/jsImport/namespaced/externalObject.kt");
+ }
+
+ @Test
+ @TestMetadata("jsExternalInheritorsOnly.kt")
+ public void testJsExternalInheritorsOnly() {
+ runTest("js/js.translator/testData/box/jsImport/namespaced/jsExternalInheritorsOnly.kt");
+ }
+ }
+
+ @Nested
+ @TestMetadata("js/js.translator/testData/box/jsImport/plainNamed")
+ @TestDataPath("$PROJECT_ROOT")
+ public class PlainNamed {
+ @Test
+ public void testAllFilesPresentInPlainNamed() {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/jsImport/plainNamed"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR_ES6, true);
+ }
+
+ @Test
+ @TestMetadata("externalClassNameClash.kt")
+ public void testExternalClassNameClash() {
+ runTest("js/js.translator/testData/box/jsImport/plainNamed/externalClassNameClash.kt");
+ }
+
+ @Test
+ @TestMetadata("externalPackage.kt")
+ public void testExternalPackage() {
+ runTest("js/js.translator/testData/box/jsImport/plainNamed/externalPackage.kt");
+ }
+
+ @Test
+ @TestMetadata("externalPackageInDifferentFile.kt")
+ public void testExternalPackageInDifferentFile() {
+ runTest("js/js.translator/testData/box/jsImport/plainNamed/externalPackageInDifferentFile.kt");
+ }
+
+ @Test
+ @TestMetadata("interfaces.kt")
+ public void testInterfaces() {
+ runTest("js/js.translator/testData/box/jsImport/plainNamed/interfaces.kt");
+ }
+
+ @Test
+ @TestMetadata("interfacesWithCompanion.kt")
+ public void testInterfacesWithCompanion() {
+ runTest("js/js.translator/testData/box/jsImport/plainNamed/interfacesWithCompanion.kt");
+ }
+ }
+ }
+
+ @Nested
@TestMetadata("js/js.translator/testData/box/jsModule")
@TestDataPath("$PROJECT_ROOT")
public class JsModule {
diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirLightTreeJsBoxTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirLightTreeJsBoxTestGenerated.java
index f0d3d34..75ed97b 100644
--- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirLightTreeJsBoxTestGenerated.java
+++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirLightTreeJsBoxTestGenerated.java
@@ -2525,6 +2525,360 @@
}
@Nested
+ @TestMetadata("js/js.translator/testData/box/esModules/jsFileImport")
+ @TestDataPath("$PROJECT_ROOT")
+ public class JsFileImport {
+ @Test
+ public void testAllFilesPresentInJsFileImport() {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsFileImport"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR, true);
+ }
+
+ @Nested
+ @TestMetadata("js/js.translator/testData/box/esModules/jsFileImport/default")
+ @TestDataPath("$PROJECT_ROOT")
+ public class Default {
+ @Test
+ public void testAllFilesPresentInDefault() {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsFileImport/default"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR, true);
+ }
+
+ @Test
+ @TestMetadata("externalClass.kt")
+ public void testExternalClass() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/default/externalClass.kt");
+ }
+
+ @Test
+ @TestMetadata("externalClassWithDefaults.kt")
+ public void testExternalClassWithDefaults() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/default/externalClassWithDefaults.kt");
+ }
+
+ @Test
+ @TestMetadata("externalConstructor.kt")
+ public void testExternalConstructor() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/default/externalConstructor.kt");
+ }
+
+ @Test
+ @TestMetadata("externalFunction.kt")
+ public void testExternalFunction() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/default/externalFunction.kt");
+ }
+
+ @Test
+ @TestMetadata("externalFunctionNameClash.kt")
+ public void testExternalFunctionNameClash() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/default/externalFunctionNameClash.kt");
+ }
+
+ @Test
+ @TestMetadata("externalObject.kt")
+ public void testExternalObject() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/default/externalObject.kt");
+ }
+
+ @Test
+ @TestMetadata("externalProperty.kt")
+ public void testExternalProperty() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/default/externalProperty.kt");
+ }
+
+ @Test
+ @TestMetadata("topLevelVarargFun.kt")
+ public void testTopLevelVarargFun() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/default/topLevelVarargFun.kt");
+ }
+ }
+
+ @Nested
+ @TestMetadata("js/js.translator/testData/box/esModules/jsFileImport/named")
+ @TestDataPath("$PROJECT_ROOT")
+ public class Named {
+ @Test
+ public void testAllFilesPresentInNamed() {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsFileImport/named"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR, true);
+ }
+
+ @Test
+ @TestMetadata("externalClass.kt")
+ public void testExternalClass() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/named/externalClass.kt");
+ }
+
+ @Test
+ @TestMetadata("externalClassWithDefaults.kt")
+ public void testExternalClassWithDefaults() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/named/externalClassWithDefaults.kt");
+ }
+
+ @Test
+ @TestMetadata("externalConstructor.kt")
+ public void testExternalConstructor() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/named/externalConstructor.kt");
+ }
+
+ @Test
+ @TestMetadata("externalFunction.kt")
+ public void testExternalFunction() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/named/externalFunction.kt");
+ }
+
+ @Test
+ @TestMetadata("externalFunctionNameClash.kt")
+ public void testExternalFunctionNameClash() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/named/externalFunctionNameClash.kt");
+ }
+
+ @Test
+ @TestMetadata("externalObject.kt")
+ public void testExternalObject() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/named/externalObject.kt");
+ }
+
+ @Test
+ @TestMetadata("externalProperty.kt")
+ public void testExternalProperty() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/named/externalProperty.kt");
+ }
+
+ @Test
+ @TestMetadata("topLevelVarargFun.kt")
+ public void testTopLevelVarargFun() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/named/topLevelVarargFun.kt");
+ }
+ }
+
+ @Nested
+ @TestMetadata("js/js.translator/testData/box/esModules/jsFileImport/plainNamed")
+ @TestDataPath("$PROJECT_ROOT")
+ public class PlainNamed {
+ @Test
+ public void testAllFilesPresentInPlainNamed() {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsFileImport/plainNamed"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR, true);
+ }
+
+ @Test
+ @TestMetadata("externalClassNameClash.kt")
+ public void testExternalClassNameClash() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/plainNamed/externalClassNameClash.kt");
+ }
+
+ @Test
+ @TestMetadata("externalPackage.kt")
+ public void testExternalPackage() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/plainNamed/externalPackage.kt");
+ }
+
+ @Test
+ @TestMetadata("externalPackageInDifferentFile.kt")
+ public void testExternalPackageInDifferentFile() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/plainNamed/externalPackageInDifferentFile.kt");
+ }
+
+ @Test
+ @TestMetadata("interfaces.kt")
+ public void testInterfaces() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/plainNamed/interfaces.kt");
+ }
+
+ @Test
+ @TestMetadata("interfacesWithCompanion.kt")
+ public void testInterfacesWithCompanion() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/plainNamed/interfacesWithCompanion.kt");
+ }
+ }
+ }
+
+ @Nested
+ @TestMetadata("js/js.translator/testData/box/esModules/jsImport")
+ @TestDataPath("$PROJECT_ROOT")
+ public class JsImport {
+ @Test
+ public void testAllFilesPresentInJsImport() {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsImport"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR, true);
+ }
+
+ @Nested
+ @TestMetadata("js/js.translator/testData/box/esModules/jsImport/default")
+ @TestDataPath("$PROJECT_ROOT")
+ public class Default {
+ @Test
+ public void testAllFilesPresentInDefault() {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsImport/default"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR, true);
+ }
+
+ @Test
+ @TestMetadata("externalClass.kt")
+ public void testExternalClass() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/default/externalClass.kt");
+ }
+
+ @Test
+ @TestMetadata("externalClassWithDefaults.kt")
+ public void testExternalClassWithDefaults() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/default/externalClassWithDefaults.kt");
+ }
+
+ @Test
+ @TestMetadata("externalConstructor.kt")
+ public void testExternalConstructor() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/default/externalConstructor.kt");
+ }
+
+ @Test
+ @TestMetadata("externalFunction.kt")
+ public void testExternalFunction() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/default/externalFunction.kt");
+ }
+
+ @Test
+ @TestMetadata("externalFunctionNameClash.kt")
+ public void testExternalFunctionNameClash() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/default/externalFunctionNameClash.kt");
+ }
+
+ @Test
+ @TestMetadata("externalObject.kt")
+ public void testExternalObject() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/default/externalObject.kt");
+ }
+
+ @Test
+ @TestMetadata("externalProperty.kt")
+ public void testExternalProperty() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/default/externalProperty.kt");
+ }
+
+ @Test
+ @TestMetadata("topLevelVarargFun.kt")
+ public void testTopLevelVarargFun() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/default/topLevelVarargFun.kt");
+ }
+ }
+
+ @Nested
+ @TestMetadata("js/js.translator/testData/box/esModules/jsImport/named")
+ @TestDataPath("$PROJECT_ROOT")
+ public class Named {
+ @Test
+ public void testAllFilesPresentInNamed() {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsImport/named"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR, true);
+ }
+
+ @Test
+ @TestMetadata("externalClass.kt")
+ public void testExternalClass() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/named/externalClass.kt");
+ }
+
+ @Test
+ @TestMetadata("externalClassWithDefaults.kt")
+ public void testExternalClassWithDefaults() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/named/externalClassWithDefaults.kt");
+ }
+
+ @Test
+ @TestMetadata("externalConstructor.kt")
+ public void testExternalConstructor() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/named/externalConstructor.kt");
+ }
+
+ @Test
+ @TestMetadata("externalFunction.kt")
+ public void testExternalFunction() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/named/externalFunction.kt");
+ }
+
+ @Test
+ @TestMetadata("externalFunctionNameClash.kt")
+ public void testExternalFunctionNameClash() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/named/externalFunctionNameClash.kt");
+ }
+
+ @Test
+ @TestMetadata("externalObject.kt")
+ public void testExternalObject() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/named/externalObject.kt");
+ }
+
+ @Test
+ @TestMetadata("externalProperty.kt")
+ public void testExternalProperty() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/named/externalProperty.kt");
+ }
+
+ @Test
+ @TestMetadata("topLevelVarargFun.kt")
+ public void testTopLevelVarargFun() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/named/topLevelVarargFun.kt");
+ }
+ }
+
+ @Nested
+ @TestMetadata("js/js.translator/testData/box/esModules/jsImport/namespaced")
+ @TestDataPath("$PROJECT_ROOT")
+ public class Namespaced {
+ @Test
+ public void testAllFilesPresentInNamespaced() {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsImport/namespaced"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR, true);
+ }
+
+ @Test
+ @TestMetadata("externalObject.kt")
+ public void testExternalObject() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/namespaced/externalObject.kt");
+ }
+
+ @Test
+ @TestMetadata("jsExternalInheritorsOnly.kt")
+ public void testJsExternalInheritorsOnly() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/namespaced/jsExternalInheritorsOnly.kt");
+ }
+ }
+
+ @Nested
+ @TestMetadata("js/js.translator/testData/box/esModules/jsImport/plainNamed")
+ @TestDataPath("$PROJECT_ROOT")
+ public class PlainNamed {
+ @Test
+ public void testAllFilesPresentInPlainNamed() {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsImport/plainNamed"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR, true);
+ }
+
+ @Test
+ @TestMetadata("externalClassNameClash.kt")
+ public void testExternalClassNameClash() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/plainNamed/externalClassNameClash.kt");
+ }
+
+ @Test
+ @TestMetadata("externalPackage.kt")
+ public void testExternalPackage() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/plainNamed/externalPackage.kt");
+ }
+
+ @Test
+ @TestMetadata("externalPackageInDifferentFile.kt")
+ public void testExternalPackageInDifferentFile() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/plainNamed/externalPackageInDifferentFile.kt");
+ }
+
+ @Test
+ @TestMetadata("interfaces.kt")
+ public void testInterfaces() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/plainNamed/interfaces.kt");
+ }
+
+ @Test
+ @TestMetadata("interfacesWithCompanion.kt")
+ public void testInterfacesWithCompanion() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/plainNamed/interfacesWithCompanion.kt");
+ }
+ }
+ }
+
+ @Nested
@TestMetadata("js/js.translator/testData/box/esModules/jsModule")
@TestDataPath("$PROJECT_ROOT")
public class JsModule {
@@ -7456,6 +7810,360 @@
}
@Nested
+ @TestMetadata("js/js.translator/testData/box/jsFileImport")
+ @TestDataPath("$PROJECT_ROOT")
+ public class JsFileImport {
+ @Test
+ public void testAllFilesPresentInJsFileImport() {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/jsFileImport"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR, true);
+ }
+
+ @Nested
+ @TestMetadata("js/js.translator/testData/box/jsFileImport/default")
+ @TestDataPath("$PROJECT_ROOT")
+ public class Default {
+ @Test
+ public void testAllFilesPresentInDefault() {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/jsFileImport/default"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR, true);
+ }
+
+ @Test
+ @TestMetadata("externalClass.kt")
+ public void testExternalClass() {
+ runTest("js/js.translator/testData/box/jsFileImport/default/externalClass.kt");
+ }
+
+ @Test
+ @TestMetadata("externalClassWithDefaults.kt")
+ public void testExternalClassWithDefaults() {
+ runTest("js/js.translator/testData/box/jsFileImport/default/externalClassWithDefaults.kt");
+ }
+
+ @Test
+ @TestMetadata("externalConstructor.kt")
+ public void testExternalConstructor() {
+ runTest("js/js.translator/testData/box/jsFileImport/default/externalConstructor.kt");
+ }
+
+ @Test
+ @TestMetadata("externalFunction.kt")
+ public void testExternalFunction() {
+ runTest("js/js.translator/testData/box/jsFileImport/default/externalFunction.kt");
+ }
+
+ @Test
+ @TestMetadata("externalFunctionNameClash.kt")
+ public void testExternalFunctionNameClash() {
+ runTest("js/js.translator/testData/box/jsFileImport/default/externalFunctionNameClash.kt");
+ }
+
+ @Test
+ @TestMetadata("externalObject.kt")
+ public void testExternalObject() {
+ runTest("js/js.translator/testData/box/jsFileImport/default/externalObject.kt");
+ }
+
+ @Test
+ @TestMetadata("externalProperty.kt")
+ public void testExternalProperty() {
+ runTest("js/js.translator/testData/box/jsFileImport/default/externalProperty.kt");
+ }
+
+ @Test
+ @TestMetadata("topLevelVarargFun.kt")
+ public void testTopLevelVarargFun() {
+ runTest("js/js.translator/testData/box/jsFileImport/default/topLevelVarargFun.kt");
+ }
+ }
+
+ @Nested
+ @TestMetadata("js/js.translator/testData/box/jsFileImport/named")
+ @TestDataPath("$PROJECT_ROOT")
+ public class Named {
+ @Test
+ public void testAllFilesPresentInNamed() {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/jsFileImport/named"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR, true);
+ }
+
+ @Test
+ @TestMetadata("externalClass.kt")
+ public void testExternalClass() {
+ runTest("js/js.translator/testData/box/jsFileImport/named/externalClass.kt");
+ }
+
+ @Test
+ @TestMetadata("externalClassWithDefaults.kt")
+ public void testExternalClassWithDefaults() {
+ runTest("js/js.translator/testData/box/jsFileImport/named/externalClassWithDefaults.kt");
+ }
+
+ @Test
+ @TestMetadata("externalConstructor.kt")
+ public void testExternalConstructor() {
+ runTest("js/js.translator/testData/box/jsFileImport/named/externalConstructor.kt");
+ }
+
+ @Test
+ @TestMetadata("externalFunction.kt")
+ public void testExternalFunction() {
+ runTest("js/js.translator/testData/box/jsFileImport/named/externalFunction.kt");
+ }
+
+ @Test
+ @TestMetadata("externalFunctionNameClash.kt")
+ public void testExternalFunctionNameClash() {
+ runTest("js/js.translator/testData/box/jsFileImport/named/externalFunctionNameClash.kt");
+ }
+
+ @Test
+ @TestMetadata("externalObject.kt")
+ public void testExternalObject() {
+ runTest("js/js.translator/testData/box/jsFileImport/named/externalObject.kt");
+ }
+
+ @Test
+ @TestMetadata("externalProperty.kt")
+ public void testExternalProperty() {
+ runTest("js/js.translator/testData/box/jsFileImport/named/externalProperty.kt");
+ }
+
+ @Test
+ @TestMetadata("topLevelVarargFun.kt")
+ public void testTopLevelVarargFun() {
+ runTest("js/js.translator/testData/box/jsFileImport/named/topLevelVarargFun.kt");
+ }
+ }
+
+ @Nested
+ @TestMetadata("js/js.translator/testData/box/jsFileImport/plainNamed")
+ @TestDataPath("$PROJECT_ROOT")
+ public class PlainNamed {
+ @Test
+ public void testAllFilesPresentInPlainNamed() {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/jsFileImport/plainNamed"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR, true);
+ }
+
+ @Test
+ @TestMetadata("externalClassNameClash.kt")
+ public void testExternalClassNameClash() {
+ runTest("js/js.translator/testData/box/jsFileImport/plainNamed/externalClassNameClash.kt");
+ }
+
+ @Test
+ @TestMetadata("externalPackage.kt")
+ public void testExternalPackage() {
+ runTest("js/js.translator/testData/box/jsFileImport/plainNamed/externalPackage.kt");
+ }
+
+ @Test
+ @TestMetadata("externalPackageInDifferentFile.kt")
+ public void testExternalPackageInDifferentFile() {
+ runTest("js/js.translator/testData/box/jsFileImport/plainNamed/externalPackageInDifferentFile.kt");
+ }
+
+ @Test
+ @TestMetadata("interfaces.kt")
+ public void testInterfaces() {
+ runTest("js/js.translator/testData/box/jsFileImport/plainNamed/interfaces.kt");
+ }
+
+ @Test
+ @TestMetadata("interfacesWithCompanion.kt")
+ public void testInterfacesWithCompanion() {
+ runTest("js/js.translator/testData/box/jsFileImport/plainNamed/interfacesWithCompanion.kt");
+ }
+ }
+ }
+
+ @Nested
+ @TestMetadata("js/js.translator/testData/box/jsImport")
+ @TestDataPath("$PROJECT_ROOT")
+ public class JsImport {
+ @Test
+ public void testAllFilesPresentInJsImport() {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/jsImport"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR, true);
+ }
+
+ @Nested
+ @TestMetadata("js/js.translator/testData/box/jsImport/default")
+ @TestDataPath("$PROJECT_ROOT")
+ public class Default {
+ @Test
+ public void testAllFilesPresentInDefault() {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/jsImport/default"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR, true);
+ }
+
+ @Test
+ @TestMetadata("externalClass.kt")
+ public void testExternalClass() {
+ runTest("js/js.translator/testData/box/jsImport/default/externalClass.kt");
+ }
+
+ @Test
+ @TestMetadata("externalClassWithDefaults.kt")
+ public void testExternalClassWithDefaults() {
+ runTest("js/js.translator/testData/box/jsImport/default/externalClassWithDefaults.kt");
+ }
+
+ @Test
+ @TestMetadata("externalConstructor.kt")
+ public void testExternalConstructor() {
+ runTest("js/js.translator/testData/box/jsImport/default/externalConstructor.kt");
+ }
+
+ @Test
+ @TestMetadata("externalFunction.kt")
+ public void testExternalFunction() {
+ runTest("js/js.translator/testData/box/jsImport/default/externalFunction.kt");
+ }
+
+ @Test
+ @TestMetadata("externalFunctionNameClash.kt")
+ public void testExternalFunctionNameClash() {
+ runTest("js/js.translator/testData/box/jsImport/default/externalFunctionNameClash.kt");
+ }
+
+ @Test
+ @TestMetadata("externalObject.kt")
+ public void testExternalObject() {
+ runTest("js/js.translator/testData/box/jsImport/default/externalObject.kt");
+ }
+
+ @Test
+ @TestMetadata("externalProperty.kt")
+ public void testExternalProperty() {
+ runTest("js/js.translator/testData/box/jsImport/default/externalProperty.kt");
+ }
+
+ @Test
+ @TestMetadata("topLevelVarargFun.kt")
+ public void testTopLevelVarargFun() {
+ runTest("js/js.translator/testData/box/jsImport/default/topLevelVarargFun.kt");
+ }
+ }
+
+ @Nested
+ @TestMetadata("js/js.translator/testData/box/jsImport/named")
+ @TestDataPath("$PROJECT_ROOT")
+ public class Named {
+ @Test
+ public void testAllFilesPresentInNamed() {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/jsImport/named"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR, true);
+ }
+
+ @Test
+ @TestMetadata("externalClass.kt")
+ public void testExternalClass() {
+ runTest("js/js.translator/testData/box/jsImport/named/externalClass.kt");
+ }
+
+ @Test
+ @TestMetadata("externalClassWithDefaults.kt")
+ public void testExternalClassWithDefaults() {
+ runTest("js/js.translator/testData/box/jsImport/named/externalClassWithDefaults.kt");
+ }
+
+ @Test
+ @TestMetadata("externalConstructor.kt")
+ public void testExternalConstructor() {
+ runTest("js/js.translator/testData/box/jsImport/named/externalConstructor.kt");
+ }
+
+ @Test
+ @TestMetadata("externalFunction.kt")
+ public void testExternalFunction() {
+ runTest("js/js.translator/testData/box/jsImport/named/externalFunction.kt");
+ }
+
+ @Test
+ @TestMetadata("externalFunctionNameClash.kt")
+ public void testExternalFunctionNameClash() {
+ runTest("js/js.translator/testData/box/jsImport/named/externalFunctionNameClash.kt");
+ }
+
+ @Test
+ @TestMetadata("externalObject.kt")
+ public void testExternalObject() {
+ runTest("js/js.translator/testData/box/jsImport/named/externalObject.kt");
+ }
+
+ @Test
+ @TestMetadata("externalProperty.kt")
+ public void testExternalProperty() {
+ runTest("js/js.translator/testData/box/jsImport/named/externalProperty.kt");
+ }
+
+ @Test
+ @TestMetadata("topLevelVarargFun.kt")
+ public void testTopLevelVarargFun() {
+ runTest("js/js.translator/testData/box/jsImport/named/topLevelVarargFun.kt");
+ }
+ }
+
+ @Nested
+ @TestMetadata("js/js.translator/testData/box/jsImport/namespaced")
+ @TestDataPath("$PROJECT_ROOT")
+ public class Namespaced {
+ @Test
+ public void testAllFilesPresentInNamespaced() {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/jsImport/namespaced"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR, true);
+ }
+
+ @Test
+ @TestMetadata("externalObject.kt")
+ public void testExternalObject() {
+ runTest("js/js.translator/testData/box/jsImport/namespaced/externalObject.kt");
+ }
+
+ @Test
+ @TestMetadata("jsExternalInheritorsOnly.kt")
+ public void testJsExternalInheritorsOnly() {
+ runTest("js/js.translator/testData/box/jsImport/namespaced/jsExternalInheritorsOnly.kt");
+ }
+ }
+
+ @Nested
+ @TestMetadata("js/js.translator/testData/box/jsImport/plainNamed")
+ @TestDataPath("$PROJECT_ROOT")
+ public class PlainNamed {
+ @Test
+ public void testAllFilesPresentInPlainNamed() {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/jsImport/plainNamed"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR, true);
+ }
+
+ @Test
+ @TestMetadata("externalClassNameClash.kt")
+ public void testExternalClassNameClash() {
+ runTest("js/js.translator/testData/box/jsImport/plainNamed/externalClassNameClash.kt");
+ }
+
+ @Test
+ @TestMetadata("externalPackage.kt")
+ public void testExternalPackage() {
+ runTest("js/js.translator/testData/box/jsImport/plainNamed/externalPackage.kt");
+ }
+
+ @Test
+ @TestMetadata("externalPackageInDifferentFile.kt")
+ public void testExternalPackageInDifferentFile() {
+ runTest("js/js.translator/testData/box/jsImport/plainNamed/externalPackageInDifferentFile.kt");
+ }
+
+ @Test
+ @TestMetadata("interfaces.kt")
+ public void testInterfaces() {
+ runTest("js/js.translator/testData/box/jsImport/plainNamed/interfaces.kt");
+ }
+
+ @Test
+ @TestMetadata("interfacesWithCompanion.kt")
+ public void testInterfacesWithCompanion() {
+ runTest("js/js.translator/testData/box/jsImport/plainNamed/interfacesWithCompanion.kt");
+ }
+ }
+ }
+
+ @Nested
@TestMetadata("js/js.translator/testData/box/jsModule")
@TestDataPath("$PROJECT_ROOT")
public class JsModule {
diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirLightTreeJsOldFrontendDiagnosticsTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirLightTreeJsOldFrontendDiagnosticsTestGenerated.java
index 9e18285..5745eca 100644
--- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirLightTreeJsOldFrontendDiagnosticsTestGenerated.java
+++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirLightTreeJsOldFrontendDiagnosticsTestGenerated.java
@@ -542,6 +542,70 @@
}
@Nested
+ @TestMetadata("compiler/testData/diagnostics/testsWithJsStdLib/import")
+ @TestDataPath("$PROJECT_ROOT")
+ public class Import {
+ @Test
+ public void testAllFilesPresentInImport() {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/diagnostics/testsWithJsStdLib/import"), Pattern.compile("^([^_](.+))\\.kt$"), Pattern.compile("^(.+)\\.fir\\.kts?$"), TargetBackend.JS_IR, true);
+ }
+
+ @Test
+ @TestMetadata("jsImportOptionsWithoutJsImport.kt")
+ public void testJsImportOptionsWithoutJsImport() {
+ runTest("compiler/testData/diagnostics/testsWithJsStdLib/import/jsImportOptionsWithoutJsImport.kt");
+ }
+
+ @Test
+ @TestMetadata("jsVarProhibited.kt")
+ public void testJsVarProhibited() {
+ runTest("compiler/testData/diagnostics/testsWithJsStdLib/import/jsVarProhibited.kt");
+ }
+
+ @Test
+ @TestMetadata("mixedJsImportAndJsModule.kt")
+ public void testMixedJsImportAndJsModule() {
+ runTest("compiler/testData/diagnostics/testsWithJsStdLib/import/mixedJsImportAndJsModule.kt");
+ }
+
+ @Test
+ @TestMetadata("mixedJsImportAndJsQualifier.kt")
+ public void testMixedJsImportAndJsQualifier() {
+ runTest("compiler/testData/diagnostics/testsWithJsStdLib/import/mixedJsImportAndJsQualifier.kt");
+ }
+
+ @Test
+ @TestMetadata("multipleJsImportOptions.kt")
+ public void testMultipleJsImportOptions() {
+ runTest("compiler/testData/diagnostics/testsWithJsStdLib/import/multipleJsImportOptions.kt");
+ }
+
+ @Test
+ @TestMetadata("namespaceInsideFileJsImport.kt")
+ public void testNamespaceInsideFileJsImport() {
+ runTest("compiler/testData/diagnostics/testsWithJsStdLib/import/namespaceInsideFileJsImport.kt");
+ }
+
+ @Test
+ @TestMetadata("nestedProhibited.kt")
+ public void testNestedProhibited() {
+ runTest("compiler/testData/diagnostics/testsWithJsStdLib/import/nestedProhibited.kt");
+ }
+
+ @Test
+ @TestMetadata("nonObjectNamespace.kt")
+ public void testNonObjectNamespace() {
+ runTest("compiler/testData/diagnostics/testsWithJsStdLib/import/nonObjectNamespace.kt");
+ }
+
+ @Test
+ @TestMetadata("prohibitedOnNonNative.kt")
+ public void testProhibitedOnNonNative() {
+ runTest("compiler/testData/diagnostics/testsWithJsStdLib/import/prohibitedOnNonNative.kt");
+ }
+ }
+
+ @Nested
@TestMetadata("compiler/testData/diagnostics/testsWithJsStdLib/inline")
@TestDataPath("$PROJECT_ROOT")
public class Inline {
diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirPsiJsBoxTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirPsiJsBoxTestGenerated.java
index 75c3de0..3996726 100644
--- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirPsiJsBoxTestGenerated.java
+++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirPsiJsBoxTestGenerated.java
@@ -2525,6 +2525,360 @@
}
@Nested
+ @TestMetadata("js/js.translator/testData/box/esModules/jsFileImport")
+ @TestDataPath("$PROJECT_ROOT")
+ public class JsFileImport {
+ @Test
+ public void testAllFilesPresentInJsFileImport() {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsFileImport"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR, true);
+ }
+
+ @Nested
+ @TestMetadata("js/js.translator/testData/box/esModules/jsFileImport/default")
+ @TestDataPath("$PROJECT_ROOT")
+ public class Default {
+ @Test
+ public void testAllFilesPresentInDefault() {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsFileImport/default"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR, true);
+ }
+
+ @Test
+ @TestMetadata("externalClass.kt")
+ public void testExternalClass() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/default/externalClass.kt");
+ }
+
+ @Test
+ @TestMetadata("externalClassWithDefaults.kt")
+ public void testExternalClassWithDefaults() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/default/externalClassWithDefaults.kt");
+ }
+
+ @Test
+ @TestMetadata("externalConstructor.kt")
+ public void testExternalConstructor() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/default/externalConstructor.kt");
+ }
+
+ @Test
+ @TestMetadata("externalFunction.kt")
+ public void testExternalFunction() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/default/externalFunction.kt");
+ }
+
+ @Test
+ @TestMetadata("externalFunctionNameClash.kt")
+ public void testExternalFunctionNameClash() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/default/externalFunctionNameClash.kt");
+ }
+
+ @Test
+ @TestMetadata("externalObject.kt")
+ public void testExternalObject() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/default/externalObject.kt");
+ }
+
+ @Test
+ @TestMetadata("externalProperty.kt")
+ public void testExternalProperty() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/default/externalProperty.kt");
+ }
+
+ @Test
+ @TestMetadata("topLevelVarargFun.kt")
+ public void testTopLevelVarargFun() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/default/topLevelVarargFun.kt");
+ }
+ }
+
+ @Nested
+ @TestMetadata("js/js.translator/testData/box/esModules/jsFileImport/named")
+ @TestDataPath("$PROJECT_ROOT")
+ public class Named {
+ @Test
+ public void testAllFilesPresentInNamed() {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsFileImport/named"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR, true);
+ }
+
+ @Test
+ @TestMetadata("externalClass.kt")
+ public void testExternalClass() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/named/externalClass.kt");
+ }
+
+ @Test
+ @TestMetadata("externalClassWithDefaults.kt")
+ public void testExternalClassWithDefaults() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/named/externalClassWithDefaults.kt");
+ }
+
+ @Test
+ @TestMetadata("externalConstructor.kt")
+ public void testExternalConstructor() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/named/externalConstructor.kt");
+ }
+
+ @Test
+ @TestMetadata("externalFunction.kt")
+ public void testExternalFunction() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/named/externalFunction.kt");
+ }
+
+ @Test
+ @TestMetadata("externalFunctionNameClash.kt")
+ public void testExternalFunctionNameClash() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/named/externalFunctionNameClash.kt");
+ }
+
+ @Test
+ @TestMetadata("externalObject.kt")
+ public void testExternalObject() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/named/externalObject.kt");
+ }
+
+ @Test
+ @TestMetadata("externalProperty.kt")
+ public void testExternalProperty() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/named/externalProperty.kt");
+ }
+
+ @Test
+ @TestMetadata("topLevelVarargFun.kt")
+ public void testTopLevelVarargFun() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/named/topLevelVarargFun.kt");
+ }
+ }
+
+ @Nested
+ @TestMetadata("js/js.translator/testData/box/esModules/jsFileImport/plainNamed")
+ @TestDataPath("$PROJECT_ROOT")
+ public class PlainNamed {
+ @Test
+ public void testAllFilesPresentInPlainNamed() {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsFileImport/plainNamed"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR, true);
+ }
+
+ @Test
+ @TestMetadata("externalClassNameClash.kt")
+ public void testExternalClassNameClash() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/plainNamed/externalClassNameClash.kt");
+ }
+
+ @Test
+ @TestMetadata("externalPackage.kt")
+ public void testExternalPackage() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/plainNamed/externalPackage.kt");
+ }
+
+ @Test
+ @TestMetadata("externalPackageInDifferentFile.kt")
+ public void testExternalPackageInDifferentFile() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/plainNamed/externalPackageInDifferentFile.kt");
+ }
+
+ @Test
+ @TestMetadata("interfaces.kt")
+ public void testInterfaces() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/plainNamed/interfaces.kt");
+ }
+
+ @Test
+ @TestMetadata("interfacesWithCompanion.kt")
+ public void testInterfacesWithCompanion() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/plainNamed/interfacesWithCompanion.kt");
+ }
+ }
+ }
+
+ @Nested
+ @TestMetadata("js/js.translator/testData/box/esModules/jsImport")
+ @TestDataPath("$PROJECT_ROOT")
+ public class JsImport {
+ @Test
+ public void testAllFilesPresentInJsImport() {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsImport"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR, true);
+ }
+
+ @Nested
+ @TestMetadata("js/js.translator/testData/box/esModules/jsImport/default")
+ @TestDataPath("$PROJECT_ROOT")
+ public class Default {
+ @Test
+ public void testAllFilesPresentInDefault() {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsImport/default"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR, true);
+ }
+
+ @Test
+ @TestMetadata("externalClass.kt")
+ public void testExternalClass() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/default/externalClass.kt");
+ }
+
+ @Test
+ @TestMetadata("externalClassWithDefaults.kt")
+ public void testExternalClassWithDefaults() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/default/externalClassWithDefaults.kt");
+ }
+
+ @Test
+ @TestMetadata("externalConstructor.kt")
+ public void testExternalConstructor() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/default/externalConstructor.kt");
+ }
+
+ @Test
+ @TestMetadata("externalFunction.kt")
+ public void testExternalFunction() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/default/externalFunction.kt");
+ }
+
+ @Test
+ @TestMetadata("externalFunctionNameClash.kt")
+ public void testExternalFunctionNameClash() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/default/externalFunctionNameClash.kt");
+ }
+
+ @Test
+ @TestMetadata("externalObject.kt")
+ public void testExternalObject() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/default/externalObject.kt");
+ }
+
+ @Test
+ @TestMetadata("externalProperty.kt")
+ public void testExternalProperty() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/default/externalProperty.kt");
+ }
+
+ @Test
+ @TestMetadata("topLevelVarargFun.kt")
+ public void testTopLevelVarargFun() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/default/topLevelVarargFun.kt");
+ }
+ }
+
+ @Nested
+ @TestMetadata("js/js.translator/testData/box/esModules/jsImport/named")
+ @TestDataPath("$PROJECT_ROOT")
+ public class Named {
+ @Test
+ public void testAllFilesPresentInNamed() {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsImport/named"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR, true);
+ }
+
+ @Test
+ @TestMetadata("externalClass.kt")
+ public void testExternalClass() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/named/externalClass.kt");
+ }
+
+ @Test
+ @TestMetadata("externalClassWithDefaults.kt")
+ public void testExternalClassWithDefaults() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/named/externalClassWithDefaults.kt");
+ }
+
+ @Test
+ @TestMetadata("externalConstructor.kt")
+ public void testExternalConstructor() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/named/externalConstructor.kt");
+ }
+
+ @Test
+ @TestMetadata("externalFunction.kt")
+ public void testExternalFunction() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/named/externalFunction.kt");
+ }
+
+ @Test
+ @TestMetadata("externalFunctionNameClash.kt")
+ public void testExternalFunctionNameClash() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/named/externalFunctionNameClash.kt");
+ }
+
+ @Test
+ @TestMetadata("externalObject.kt")
+ public void testExternalObject() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/named/externalObject.kt");
+ }
+
+ @Test
+ @TestMetadata("externalProperty.kt")
+ public void testExternalProperty() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/named/externalProperty.kt");
+ }
+
+ @Test
+ @TestMetadata("topLevelVarargFun.kt")
+ public void testTopLevelVarargFun() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/named/topLevelVarargFun.kt");
+ }
+ }
+
+ @Nested
+ @TestMetadata("js/js.translator/testData/box/esModules/jsImport/namespaced")
+ @TestDataPath("$PROJECT_ROOT")
+ public class Namespaced {
+ @Test
+ public void testAllFilesPresentInNamespaced() {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsImport/namespaced"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR, true);
+ }
+
+ @Test
+ @TestMetadata("externalObject.kt")
+ public void testExternalObject() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/namespaced/externalObject.kt");
+ }
+
+ @Test
+ @TestMetadata("jsExternalInheritorsOnly.kt")
+ public void testJsExternalInheritorsOnly() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/namespaced/jsExternalInheritorsOnly.kt");
+ }
+ }
+
+ @Nested
+ @TestMetadata("js/js.translator/testData/box/esModules/jsImport/plainNamed")
+ @TestDataPath("$PROJECT_ROOT")
+ public class PlainNamed {
+ @Test
+ public void testAllFilesPresentInPlainNamed() {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsImport/plainNamed"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR, true);
+ }
+
+ @Test
+ @TestMetadata("externalClassNameClash.kt")
+ public void testExternalClassNameClash() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/plainNamed/externalClassNameClash.kt");
+ }
+
+ @Test
+ @TestMetadata("externalPackage.kt")
+ public void testExternalPackage() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/plainNamed/externalPackage.kt");
+ }
+
+ @Test
+ @TestMetadata("externalPackageInDifferentFile.kt")
+ public void testExternalPackageInDifferentFile() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/plainNamed/externalPackageInDifferentFile.kt");
+ }
+
+ @Test
+ @TestMetadata("interfaces.kt")
+ public void testInterfaces() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/plainNamed/interfaces.kt");
+ }
+
+ @Test
+ @TestMetadata("interfacesWithCompanion.kt")
+ public void testInterfacesWithCompanion() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/plainNamed/interfacesWithCompanion.kt");
+ }
+ }
+ }
+
+ @Nested
@TestMetadata("js/js.translator/testData/box/esModules/jsModule")
@TestDataPath("$PROJECT_ROOT")
public class JsModule {
@@ -7456,6 +7810,360 @@
}
@Nested
+ @TestMetadata("js/js.translator/testData/box/jsFileImport")
+ @TestDataPath("$PROJECT_ROOT")
+ public class JsFileImport {
+ @Test
+ public void testAllFilesPresentInJsFileImport() {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/jsFileImport"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR, true);
+ }
+
+ @Nested
+ @TestMetadata("js/js.translator/testData/box/jsFileImport/default")
+ @TestDataPath("$PROJECT_ROOT")
+ public class Default {
+ @Test
+ public void testAllFilesPresentInDefault() {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/jsFileImport/default"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR, true);
+ }
+
+ @Test
+ @TestMetadata("externalClass.kt")
+ public void testExternalClass() {
+ runTest("js/js.translator/testData/box/jsFileImport/default/externalClass.kt");
+ }
+
+ @Test
+ @TestMetadata("externalClassWithDefaults.kt")
+ public void testExternalClassWithDefaults() {
+ runTest("js/js.translator/testData/box/jsFileImport/default/externalClassWithDefaults.kt");
+ }
+
+ @Test
+ @TestMetadata("externalConstructor.kt")
+ public void testExternalConstructor() {
+ runTest("js/js.translator/testData/box/jsFileImport/default/externalConstructor.kt");
+ }
+
+ @Test
+ @TestMetadata("externalFunction.kt")
+ public void testExternalFunction() {
+ runTest("js/js.translator/testData/box/jsFileImport/default/externalFunction.kt");
+ }
+
+ @Test
+ @TestMetadata("externalFunctionNameClash.kt")
+ public void testExternalFunctionNameClash() {
+ runTest("js/js.translator/testData/box/jsFileImport/default/externalFunctionNameClash.kt");
+ }
+
+ @Test
+ @TestMetadata("externalObject.kt")
+ public void testExternalObject() {
+ runTest("js/js.translator/testData/box/jsFileImport/default/externalObject.kt");
+ }
+
+ @Test
+ @TestMetadata("externalProperty.kt")
+ public void testExternalProperty() {
+ runTest("js/js.translator/testData/box/jsFileImport/default/externalProperty.kt");
+ }
+
+ @Test
+ @TestMetadata("topLevelVarargFun.kt")
+ public void testTopLevelVarargFun() {
+ runTest("js/js.translator/testData/box/jsFileImport/default/topLevelVarargFun.kt");
+ }
+ }
+
+ @Nested
+ @TestMetadata("js/js.translator/testData/box/jsFileImport/named")
+ @TestDataPath("$PROJECT_ROOT")
+ public class Named {
+ @Test
+ public void testAllFilesPresentInNamed() {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/jsFileImport/named"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR, true);
+ }
+
+ @Test
+ @TestMetadata("externalClass.kt")
+ public void testExternalClass() {
+ runTest("js/js.translator/testData/box/jsFileImport/named/externalClass.kt");
+ }
+
+ @Test
+ @TestMetadata("externalClassWithDefaults.kt")
+ public void testExternalClassWithDefaults() {
+ runTest("js/js.translator/testData/box/jsFileImport/named/externalClassWithDefaults.kt");
+ }
+
+ @Test
+ @TestMetadata("externalConstructor.kt")
+ public void testExternalConstructor() {
+ runTest("js/js.translator/testData/box/jsFileImport/named/externalConstructor.kt");
+ }
+
+ @Test
+ @TestMetadata("externalFunction.kt")
+ public void testExternalFunction() {
+ runTest("js/js.translator/testData/box/jsFileImport/named/externalFunction.kt");
+ }
+
+ @Test
+ @TestMetadata("externalFunctionNameClash.kt")
+ public void testExternalFunctionNameClash() {
+ runTest("js/js.translator/testData/box/jsFileImport/named/externalFunctionNameClash.kt");
+ }
+
+ @Test
+ @TestMetadata("externalObject.kt")
+ public void testExternalObject() {
+ runTest("js/js.translator/testData/box/jsFileImport/named/externalObject.kt");
+ }
+
+ @Test
+ @TestMetadata("externalProperty.kt")
+ public void testExternalProperty() {
+ runTest("js/js.translator/testData/box/jsFileImport/named/externalProperty.kt");
+ }
+
+ @Test
+ @TestMetadata("topLevelVarargFun.kt")
+ public void testTopLevelVarargFun() {
+ runTest("js/js.translator/testData/box/jsFileImport/named/topLevelVarargFun.kt");
+ }
+ }
+
+ @Nested
+ @TestMetadata("js/js.translator/testData/box/jsFileImport/plainNamed")
+ @TestDataPath("$PROJECT_ROOT")
+ public class PlainNamed {
+ @Test
+ public void testAllFilesPresentInPlainNamed() {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/jsFileImport/plainNamed"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR, true);
+ }
+
+ @Test
+ @TestMetadata("externalClassNameClash.kt")
+ public void testExternalClassNameClash() {
+ runTest("js/js.translator/testData/box/jsFileImport/plainNamed/externalClassNameClash.kt");
+ }
+
+ @Test
+ @TestMetadata("externalPackage.kt")
+ public void testExternalPackage() {
+ runTest("js/js.translator/testData/box/jsFileImport/plainNamed/externalPackage.kt");
+ }
+
+ @Test
+ @TestMetadata("externalPackageInDifferentFile.kt")
+ public void testExternalPackageInDifferentFile() {
+ runTest("js/js.translator/testData/box/jsFileImport/plainNamed/externalPackageInDifferentFile.kt");
+ }
+
+ @Test
+ @TestMetadata("interfaces.kt")
+ public void testInterfaces() {
+ runTest("js/js.translator/testData/box/jsFileImport/plainNamed/interfaces.kt");
+ }
+
+ @Test
+ @TestMetadata("interfacesWithCompanion.kt")
+ public void testInterfacesWithCompanion() {
+ runTest("js/js.translator/testData/box/jsFileImport/plainNamed/interfacesWithCompanion.kt");
+ }
+ }
+ }
+
+ @Nested
+ @TestMetadata("js/js.translator/testData/box/jsImport")
+ @TestDataPath("$PROJECT_ROOT")
+ public class JsImport {
+ @Test
+ public void testAllFilesPresentInJsImport() {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/jsImport"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR, true);
+ }
+
+ @Nested
+ @TestMetadata("js/js.translator/testData/box/jsImport/default")
+ @TestDataPath("$PROJECT_ROOT")
+ public class Default {
+ @Test
+ public void testAllFilesPresentInDefault() {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/jsImport/default"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR, true);
+ }
+
+ @Test
+ @TestMetadata("externalClass.kt")
+ public void testExternalClass() {
+ runTest("js/js.translator/testData/box/jsImport/default/externalClass.kt");
+ }
+
+ @Test
+ @TestMetadata("externalClassWithDefaults.kt")
+ public void testExternalClassWithDefaults() {
+ runTest("js/js.translator/testData/box/jsImport/default/externalClassWithDefaults.kt");
+ }
+
+ @Test
+ @TestMetadata("externalConstructor.kt")
+ public void testExternalConstructor() {
+ runTest("js/js.translator/testData/box/jsImport/default/externalConstructor.kt");
+ }
+
+ @Test
+ @TestMetadata("externalFunction.kt")
+ public void testExternalFunction() {
+ runTest("js/js.translator/testData/box/jsImport/default/externalFunction.kt");
+ }
+
+ @Test
+ @TestMetadata("externalFunctionNameClash.kt")
+ public void testExternalFunctionNameClash() {
+ runTest("js/js.translator/testData/box/jsImport/default/externalFunctionNameClash.kt");
+ }
+
+ @Test
+ @TestMetadata("externalObject.kt")
+ public void testExternalObject() {
+ runTest("js/js.translator/testData/box/jsImport/default/externalObject.kt");
+ }
+
+ @Test
+ @TestMetadata("externalProperty.kt")
+ public void testExternalProperty() {
+ runTest("js/js.translator/testData/box/jsImport/default/externalProperty.kt");
+ }
+
+ @Test
+ @TestMetadata("topLevelVarargFun.kt")
+ public void testTopLevelVarargFun() {
+ runTest("js/js.translator/testData/box/jsImport/default/topLevelVarargFun.kt");
+ }
+ }
+
+ @Nested
+ @TestMetadata("js/js.translator/testData/box/jsImport/named")
+ @TestDataPath("$PROJECT_ROOT")
+ public class Named {
+ @Test
+ public void testAllFilesPresentInNamed() {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/jsImport/named"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR, true);
+ }
+
+ @Test
+ @TestMetadata("externalClass.kt")
+ public void testExternalClass() {
+ runTest("js/js.translator/testData/box/jsImport/named/externalClass.kt");
+ }
+
+ @Test
+ @TestMetadata("externalClassWithDefaults.kt")
+ public void testExternalClassWithDefaults() {
+ runTest("js/js.translator/testData/box/jsImport/named/externalClassWithDefaults.kt");
+ }
+
+ @Test
+ @TestMetadata("externalConstructor.kt")
+ public void testExternalConstructor() {
+ runTest("js/js.translator/testData/box/jsImport/named/externalConstructor.kt");
+ }
+
+ @Test
+ @TestMetadata("externalFunction.kt")
+ public void testExternalFunction() {
+ runTest("js/js.translator/testData/box/jsImport/named/externalFunction.kt");
+ }
+
+ @Test
+ @TestMetadata("externalFunctionNameClash.kt")
+ public void testExternalFunctionNameClash() {
+ runTest("js/js.translator/testData/box/jsImport/named/externalFunctionNameClash.kt");
+ }
+
+ @Test
+ @TestMetadata("externalObject.kt")
+ public void testExternalObject() {
+ runTest("js/js.translator/testData/box/jsImport/named/externalObject.kt");
+ }
+
+ @Test
+ @TestMetadata("externalProperty.kt")
+ public void testExternalProperty() {
+ runTest("js/js.translator/testData/box/jsImport/named/externalProperty.kt");
+ }
+
+ @Test
+ @TestMetadata("topLevelVarargFun.kt")
+ public void testTopLevelVarargFun() {
+ runTest("js/js.translator/testData/box/jsImport/named/topLevelVarargFun.kt");
+ }
+ }
+
+ @Nested
+ @TestMetadata("js/js.translator/testData/box/jsImport/namespaced")
+ @TestDataPath("$PROJECT_ROOT")
+ public class Namespaced {
+ @Test
+ public void testAllFilesPresentInNamespaced() {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/jsImport/namespaced"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR, true);
+ }
+
+ @Test
+ @TestMetadata("externalObject.kt")
+ public void testExternalObject() {
+ runTest("js/js.translator/testData/box/jsImport/namespaced/externalObject.kt");
+ }
+
+ @Test
+ @TestMetadata("jsExternalInheritorsOnly.kt")
+ public void testJsExternalInheritorsOnly() {
+ runTest("js/js.translator/testData/box/jsImport/namespaced/jsExternalInheritorsOnly.kt");
+ }
+ }
+
+ @Nested
+ @TestMetadata("js/js.translator/testData/box/jsImport/plainNamed")
+ @TestDataPath("$PROJECT_ROOT")
+ public class PlainNamed {
+ @Test
+ public void testAllFilesPresentInPlainNamed() {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/jsImport/plainNamed"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR, true);
+ }
+
+ @Test
+ @TestMetadata("externalClassNameClash.kt")
+ public void testExternalClassNameClash() {
+ runTest("js/js.translator/testData/box/jsImport/plainNamed/externalClassNameClash.kt");
+ }
+
+ @Test
+ @TestMetadata("externalPackage.kt")
+ public void testExternalPackage() {
+ runTest("js/js.translator/testData/box/jsImport/plainNamed/externalPackage.kt");
+ }
+
+ @Test
+ @TestMetadata("externalPackageInDifferentFile.kt")
+ public void testExternalPackageInDifferentFile() {
+ runTest("js/js.translator/testData/box/jsImport/plainNamed/externalPackageInDifferentFile.kt");
+ }
+
+ @Test
+ @TestMetadata("interfaces.kt")
+ public void testInterfaces() {
+ runTest("js/js.translator/testData/box/jsImport/plainNamed/interfaces.kt");
+ }
+
+ @Test
+ @TestMetadata("interfacesWithCompanion.kt")
+ public void testInterfacesWithCompanion() {
+ runTest("js/js.translator/testData/box/jsImport/plainNamed/interfacesWithCompanion.kt");
+ }
+ }
+ }
+
+ @Nested
@TestMetadata("js/js.translator/testData/box/jsModule")
@TestDataPath("$PROJECT_ROOT")
public class JsModule {
diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirPsiJsOldFrontendDiagnosticsTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirPsiJsOldFrontendDiagnosticsTestGenerated.java
index dccb1c0..576813b 100644
--- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirPsiJsOldFrontendDiagnosticsTestGenerated.java
+++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirPsiJsOldFrontendDiagnosticsTestGenerated.java
@@ -542,6 +542,70 @@
}
@Nested
+ @TestMetadata("compiler/testData/diagnostics/testsWithJsStdLib/import")
+ @TestDataPath("$PROJECT_ROOT")
+ public class Import {
+ @Test
+ public void testAllFilesPresentInImport() {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/diagnostics/testsWithJsStdLib/import"), Pattern.compile("^([^_](.+))\\.kt$"), Pattern.compile("^(.+)\\.fir\\.kts?$"), TargetBackend.JS_IR, true);
+ }
+
+ @Test
+ @TestMetadata("jsImportOptionsWithoutJsImport.kt")
+ public void testJsImportOptionsWithoutJsImport() {
+ runTest("compiler/testData/diagnostics/testsWithJsStdLib/import/jsImportOptionsWithoutJsImport.kt");
+ }
+
+ @Test
+ @TestMetadata("jsVarProhibited.kt")
+ public void testJsVarProhibited() {
+ runTest("compiler/testData/diagnostics/testsWithJsStdLib/import/jsVarProhibited.kt");
+ }
+
+ @Test
+ @TestMetadata("mixedJsImportAndJsModule.kt")
+ public void testMixedJsImportAndJsModule() {
+ runTest("compiler/testData/diagnostics/testsWithJsStdLib/import/mixedJsImportAndJsModule.kt");
+ }
+
+ @Test
+ @TestMetadata("mixedJsImportAndJsQualifier.kt")
+ public void testMixedJsImportAndJsQualifier() {
+ runTest("compiler/testData/diagnostics/testsWithJsStdLib/import/mixedJsImportAndJsQualifier.kt");
+ }
+
+ @Test
+ @TestMetadata("multipleJsImportOptions.kt")
+ public void testMultipleJsImportOptions() {
+ runTest("compiler/testData/diagnostics/testsWithJsStdLib/import/multipleJsImportOptions.kt");
+ }
+
+ @Test
+ @TestMetadata("namespaceInsideFileJsImport.kt")
+ public void testNamespaceInsideFileJsImport() {
+ runTest("compiler/testData/diagnostics/testsWithJsStdLib/import/namespaceInsideFileJsImport.kt");
+ }
+
+ @Test
+ @TestMetadata("nestedProhibited.kt")
+ public void testNestedProhibited() {
+ runTest("compiler/testData/diagnostics/testsWithJsStdLib/import/nestedProhibited.kt");
+ }
+
+ @Test
+ @TestMetadata("nonObjectNamespace.kt")
+ public void testNonObjectNamespace() {
+ runTest("compiler/testData/diagnostics/testsWithJsStdLib/import/nonObjectNamespace.kt");
+ }
+
+ @Test
+ @TestMetadata("prohibitedOnNonNative.kt")
+ public void testProhibitedOnNonNative() {
+ runTest("compiler/testData/diagnostics/testsWithJsStdLib/import/prohibitedOnNonNative.kt");
+ }
+ }
+
+ @Nested
@TestMetadata("compiler/testData/diagnostics/testsWithJsStdLib/inline")
@TestDataPath("$PROJECT_ROOT")
public class Inline {
diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/DiagnosticsWithJsStdLibTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/DiagnosticsWithJsStdLibTestGenerated.java
index dd3f1d8..d15591b0 100644
--- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/DiagnosticsWithJsStdLibTestGenerated.java
+++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/DiagnosticsWithJsStdLibTestGenerated.java
@@ -542,6 +542,70 @@
}
@Nested
+ @TestMetadata("compiler/testData/diagnostics/testsWithJsStdLib/import")
+ @TestDataPath("$PROJECT_ROOT")
+ public class Import {
+ @Test
+ public void testAllFilesPresentInImport() {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/diagnostics/testsWithJsStdLib/import"), Pattern.compile("^([^_](.+))\\.kt$"), Pattern.compile("^(.+)\\.fir\\.kts?$"), TargetBackend.JS_IR, true);
+ }
+
+ @Test
+ @TestMetadata("jsImportOptionsWithoutJsImport.kt")
+ public void testJsImportOptionsWithoutJsImport() {
+ runTest("compiler/testData/diagnostics/testsWithJsStdLib/import/jsImportOptionsWithoutJsImport.kt");
+ }
+
+ @Test
+ @TestMetadata("jsVarProhibited.kt")
+ public void testJsVarProhibited() {
+ runTest("compiler/testData/diagnostics/testsWithJsStdLib/import/jsVarProhibited.kt");
+ }
+
+ @Test
+ @TestMetadata("mixedJsImportAndJsModule.kt")
+ public void testMixedJsImportAndJsModule() {
+ runTest("compiler/testData/diagnostics/testsWithJsStdLib/import/mixedJsImportAndJsModule.kt");
+ }
+
+ @Test
+ @TestMetadata("mixedJsImportAndJsQualifier.kt")
+ public void testMixedJsImportAndJsQualifier() {
+ runTest("compiler/testData/diagnostics/testsWithJsStdLib/import/mixedJsImportAndJsQualifier.kt");
+ }
+
+ @Test
+ @TestMetadata("multipleJsImportOptions.kt")
+ public void testMultipleJsImportOptions() {
+ runTest("compiler/testData/diagnostics/testsWithJsStdLib/import/multipleJsImportOptions.kt");
+ }
+
+ @Test
+ @TestMetadata("namespaceInsideFileJsImport.kt")
+ public void testNamespaceInsideFileJsImport() {
+ runTest("compiler/testData/diagnostics/testsWithJsStdLib/import/namespaceInsideFileJsImport.kt");
+ }
+
+ @Test
+ @TestMetadata("nestedProhibited.kt")
+ public void testNestedProhibited() {
+ runTest("compiler/testData/diagnostics/testsWithJsStdLib/import/nestedProhibited.kt");
+ }
+
+ @Test
+ @TestMetadata("nonObjectNamespace.kt")
+ public void testNonObjectNamespace() {
+ runTest("compiler/testData/diagnostics/testsWithJsStdLib/import/nonObjectNamespace.kt");
+ }
+
+ @Test
+ @TestMetadata("prohibitedOnNonNative.kt")
+ public void testProhibitedOnNonNative() {
+ runTest("compiler/testData/diagnostics/testsWithJsStdLib/import/prohibitedOnNonNative.kt");
+ }
+ }
+
+ @Nested
@TestMetadata("compiler/testData/diagnostics/testsWithJsStdLib/inline")
@TestDataPath("$PROJECT_ROOT")
public class Inline {
diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrBoxJsES6TestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrBoxJsES6TestGenerated.java
index 68765e0..80627c3 100644
--- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrBoxJsES6TestGenerated.java
+++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrBoxJsES6TestGenerated.java
@@ -2631,6 +2631,360 @@
}
@Nested
+ @TestMetadata("js/js.translator/testData/box/esModules/jsFileImport")
+ @TestDataPath("$PROJECT_ROOT")
+ public class JsFileImport {
+ @Test
+ public void testAllFilesPresentInJsFileImport() {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsFileImport"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR_ES6, true);
+ }
+
+ @Nested
+ @TestMetadata("js/js.translator/testData/box/esModules/jsFileImport/default")
+ @TestDataPath("$PROJECT_ROOT")
+ public class Default {
+ @Test
+ public void testAllFilesPresentInDefault() {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsFileImport/default"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR_ES6, true);
+ }
+
+ @Test
+ @TestMetadata("externalClass.kt")
+ public void testExternalClass() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/default/externalClass.kt");
+ }
+
+ @Test
+ @TestMetadata("externalClassWithDefaults.kt")
+ public void testExternalClassWithDefaults() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/default/externalClassWithDefaults.kt");
+ }
+
+ @Test
+ @TestMetadata("externalConstructor.kt")
+ public void testExternalConstructor() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/default/externalConstructor.kt");
+ }
+
+ @Test
+ @TestMetadata("externalFunction.kt")
+ public void testExternalFunction() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/default/externalFunction.kt");
+ }
+
+ @Test
+ @TestMetadata("externalFunctionNameClash.kt")
+ public void testExternalFunctionNameClash() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/default/externalFunctionNameClash.kt");
+ }
+
+ @Test
+ @TestMetadata("externalObject.kt")
+ public void testExternalObject() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/default/externalObject.kt");
+ }
+
+ @Test
+ @TestMetadata("externalProperty.kt")
+ public void testExternalProperty() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/default/externalProperty.kt");
+ }
+
+ @Test
+ @TestMetadata("topLevelVarargFun.kt")
+ public void testTopLevelVarargFun() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/default/topLevelVarargFun.kt");
+ }
+ }
+
+ @Nested
+ @TestMetadata("js/js.translator/testData/box/esModules/jsFileImport/named")
+ @TestDataPath("$PROJECT_ROOT")
+ public class Named {
+ @Test
+ public void testAllFilesPresentInNamed() {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsFileImport/named"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR_ES6, true);
+ }
+
+ @Test
+ @TestMetadata("externalClass.kt")
+ public void testExternalClass() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/named/externalClass.kt");
+ }
+
+ @Test
+ @TestMetadata("externalClassWithDefaults.kt")
+ public void testExternalClassWithDefaults() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/named/externalClassWithDefaults.kt");
+ }
+
+ @Test
+ @TestMetadata("externalConstructor.kt")
+ public void testExternalConstructor() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/named/externalConstructor.kt");
+ }
+
+ @Test
+ @TestMetadata("externalFunction.kt")
+ public void testExternalFunction() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/named/externalFunction.kt");
+ }
+
+ @Test
+ @TestMetadata("externalFunctionNameClash.kt")
+ public void testExternalFunctionNameClash() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/named/externalFunctionNameClash.kt");
+ }
+
+ @Test
+ @TestMetadata("externalObject.kt")
+ public void testExternalObject() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/named/externalObject.kt");
+ }
+
+ @Test
+ @TestMetadata("externalProperty.kt")
+ public void testExternalProperty() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/named/externalProperty.kt");
+ }
+
+ @Test
+ @TestMetadata("topLevelVarargFun.kt")
+ public void testTopLevelVarargFun() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/named/topLevelVarargFun.kt");
+ }
+ }
+
+ @Nested
+ @TestMetadata("js/js.translator/testData/box/esModules/jsFileImport/plainNamed")
+ @TestDataPath("$PROJECT_ROOT")
+ public class PlainNamed {
+ @Test
+ public void testAllFilesPresentInPlainNamed() {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsFileImport/plainNamed"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR_ES6, true);
+ }
+
+ @Test
+ @TestMetadata("externalClassNameClash.kt")
+ public void testExternalClassNameClash() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/plainNamed/externalClassNameClash.kt");
+ }
+
+ @Test
+ @TestMetadata("externalPackage.kt")
+ public void testExternalPackage() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/plainNamed/externalPackage.kt");
+ }
+
+ @Test
+ @TestMetadata("externalPackageInDifferentFile.kt")
+ public void testExternalPackageInDifferentFile() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/plainNamed/externalPackageInDifferentFile.kt");
+ }
+
+ @Test
+ @TestMetadata("interfaces.kt")
+ public void testInterfaces() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/plainNamed/interfaces.kt");
+ }
+
+ @Test
+ @TestMetadata("interfacesWithCompanion.kt")
+ public void testInterfacesWithCompanion() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/plainNamed/interfacesWithCompanion.kt");
+ }
+ }
+ }
+
+ @Nested
+ @TestMetadata("js/js.translator/testData/box/esModules/jsImport")
+ @TestDataPath("$PROJECT_ROOT")
+ public class JsImport {
+ @Test
+ public void testAllFilesPresentInJsImport() {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsImport"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR_ES6, true);
+ }
+
+ @Nested
+ @TestMetadata("js/js.translator/testData/box/esModules/jsImport/default")
+ @TestDataPath("$PROJECT_ROOT")
+ public class Default {
+ @Test
+ public void testAllFilesPresentInDefault() {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsImport/default"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR_ES6, true);
+ }
+
+ @Test
+ @TestMetadata("externalClass.kt")
+ public void testExternalClass() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/default/externalClass.kt");
+ }
+
+ @Test
+ @TestMetadata("externalClassWithDefaults.kt")
+ public void testExternalClassWithDefaults() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/default/externalClassWithDefaults.kt");
+ }
+
+ @Test
+ @TestMetadata("externalConstructor.kt")
+ public void testExternalConstructor() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/default/externalConstructor.kt");
+ }
+
+ @Test
+ @TestMetadata("externalFunction.kt")
+ public void testExternalFunction() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/default/externalFunction.kt");
+ }
+
+ @Test
+ @TestMetadata("externalFunctionNameClash.kt")
+ public void testExternalFunctionNameClash() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/default/externalFunctionNameClash.kt");
+ }
+
+ @Test
+ @TestMetadata("externalObject.kt")
+ public void testExternalObject() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/default/externalObject.kt");
+ }
+
+ @Test
+ @TestMetadata("externalProperty.kt")
+ public void testExternalProperty() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/default/externalProperty.kt");
+ }
+
+ @Test
+ @TestMetadata("topLevelVarargFun.kt")
+ public void testTopLevelVarargFun() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/default/topLevelVarargFun.kt");
+ }
+ }
+
+ @Nested
+ @TestMetadata("js/js.translator/testData/box/esModules/jsImport/named")
+ @TestDataPath("$PROJECT_ROOT")
+ public class Named {
+ @Test
+ public void testAllFilesPresentInNamed() {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsImport/named"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR_ES6, true);
+ }
+
+ @Test
+ @TestMetadata("externalClass.kt")
+ public void testExternalClass() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/named/externalClass.kt");
+ }
+
+ @Test
+ @TestMetadata("externalClassWithDefaults.kt")
+ public void testExternalClassWithDefaults() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/named/externalClassWithDefaults.kt");
+ }
+
+ @Test
+ @TestMetadata("externalConstructor.kt")
+ public void testExternalConstructor() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/named/externalConstructor.kt");
+ }
+
+ @Test
+ @TestMetadata("externalFunction.kt")
+ public void testExternalFunction() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/named/externalFunction.kt");
+ }
+
+ @Test
+ @TestMetadata("externalFunctionNameClash.kt")
+ public void testExternalFunctionNameClash() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/named/externalFunctionNameClash.kt");
+ }
+
+ @Test
+ @TestMetadata("externalObject.kt")
+ public void testExternalObject() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/named/externalObject.kt");
+ }
+
+ @Test
+ @TestMetadata("externalProperty.kt")
+ public void testExternalProperty() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/named/externalProperty.kt");
+ }
+
+ @Test
+ @TestMetadata("topLevelVarargFun.kt")
+ public void testTopLevelVarargFun() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/named/topLevelVarargFun.kt");
+ }
+ }
+
+ @Nested
+ @TestMetadata("js/js.translator/testData/box/esModules/jsImport/namespaced")
+ @TestDataPath("$PROJECT_ROOT")
+ public class Namespaced {
+ @Test
+ public void testAllFilesPresentInNamespaced() {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsImport/namespaced"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR_ES6, true);
+ }
+
+ @Test
+ @TestMetadata("externalObject.kt")
+ public void testExternalObject() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/namespaced/externalObject.kt");
+ }
+
+ @Test
+ @TestMetadata("jsExternalInheritorsOnly.kt")
+ public void testJsExternalInheritorsOnly() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/namespaced/jsExternalInheritorsOnly.kt");
+ }
+ }
+
+ @Nested
+ @TestMetadata("js/js.translator/testData/box/esModules/jsImport/plainNamed")
+ @TestDataPath("$PROJECT_ROOT")
+ public class PlainNamed {
+ @Test
+ public void testAllFilesPresentInPlainNamed() {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsImport/plainNamed"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR_ES6, true);
+ }
+
+ @Test
+ @TestMetadata("externalClassNameClash.kt")
+ public void testExternalClassNameClash() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/plainNamed/externalClassNameClash.kt");
+ }
+
+ @Test
+ @TestMetadata("externalPackage.kt")
+ public void testExternalPackage() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/plainNamed/externalPackage.kt");
+ }
+
+ @Test
+ @TestMetadata("externalPackageInDifferentFile.kt")
+ public void testExternalPackageInDifferentFile() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/plainNamed/externalPackageInDifferentFile.kt");
+ }
+
+ @Test
+ @TestMetadata("interfaces.kt")
+ public void testInterfaces() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/plainNamed/interfaces.kt");
+ }
+
+ @Test
+ @TestMetadata("interfacesWithCompanion.kt")
+ public void testInterfacesWithCompanion() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/plainNamed/interfacesWithCompanion.kt");
+ }
+ }
+ }
+
+ @Nested
@TestMetadata("js/js.translator/testData/box/esModules/jsModule")
@TestDataPath("$PROJECT_ROOT")
public class JsModule {
@@ -7562,6 +7916,360 @@
}
@Nested
+ @TestMetadata("js/js.translator/testData/box/jsFileImport")
+ @TestDataPath("$PROJECT_ROOT")
+ public class JsFileImport {
+ @Test
+ public void testAllFilesPresentInJsFileImport() {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/jsFileImport"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR_ES6, true);
+ }
+
+ @Nested
+ @TestMetadata("js/js.translator/testData/box/jsFileImport/default")
+ @TestDataPath("$PROJECT_ROOT")
+ public class Default {
+ @Test
+ public void testAllFilesPresentInDefault() {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/jsFileImport/default"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR_ES6, true);
+ }
+
+ @Test
+ @TestMetadata("externalClass.kt")
+ public void testExternalClass() {
+ runTest("js/js.translator/testData/box/jsFileImport/default/externalClass.kt");
+ }
+
+ @Test
+ @TestMetadata("externalClassWithDefaults.kt")
+ public void testExternalClassWithDefaults() {
+ runTest("js/js.translator/testData/box/jsFileImport/default/externalClassWithDefaults.kt");
+ }
+
+ @Test
+ @TestMetadata("externalConstructor.kt")
+ public void testExternalConstructor() {
+ runTest("js/js.translator/testData/box/jsFileImport/default/externalConstructor.kt");
+ }
+
+ @Test
+ @TestMetadata("externalFunction.kt")
+ public void testExternalFunction() {
+ runTest("js/js.translator/testData/box/jsFileImport/default/externalFunction.kt");
+ }
+
+ @Test
+ @TestMetadata("externalFunctionNameClash.kt")
+ public void testExternalFunctionNameClash() {
+ runTest("js/js.translator/testData/box/jsFileImport/default/externalFunctionNameClash.kt");
+ }
+
+ @Test
+ @TestMetadata("externalObject.kt")
+ public void testExternalObject() {
+ runTest("js/js.translator/testData/box/jsFileImport/default/externalObject.kt");
+ }
+
+ @Test
+ @TestMetadata("externalProperty.kt")
+ public void testExternalProperty() {
+ runTest("js/js.translator/testData/box/jsFileImport/default/externalProperty.kt");
+ }
+
+ @Test
+ @TestMetadata("topLevelVarargFun.kt")
+ public void testTopLevelVarargFun() {
+ runTest("js/js.translator/testData/box/jsFileImport/default/topLevelVarargFun.kt");
+ }
+ }
+
+ @Nested
+ @TestMetadata("js/js.translator/testData/box/jsFileImport/named")
+ @TestDataPath("$PROJECT_ROOT")
+ public class Named {
+ @Test
+ public void testAllFilesPresentInNamed() {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/jsFileImport/named"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR_ES6, true);
+ }
+
+ @Test
+ @TestMetadata("externalClass.kt")
+ public void testExternalClass() {
+ runTest("js/js.translator/testData/box/jsFileImport/named/externalClass.kt");
+ }
+
+ @Test
+ @TestMetadata("externalClassWithDefaults.kt")
+ public void testExternalClassWithDefaults() {
+ runTest("js/js.translator/testData/box/jsFileImport/named/externalClassWithDefaults.kt");
+ }
+
+ @Test
+ @TestMetadata("externalConstructor.kt")
+ public void testExternalConstructor() {
+ runTest("js/js.translator/testData/box/jsFileImport/named/externalConstructor.kt");
+ }
+
+ @Test
+ @TestMetadata("externalFunction.kt")
+ public void testExternalFunction() {
+ runTest("js/js.translator/testData/box/jsFileImport/named/externalFunction.kt");
+ }
+
+ @Test
+ @TestMetadata("externalFunctionNameClash.kt")
+ public void testExternalFunctionNameClash() {
+ runTest("js/js.translator/testData/box/jsFileImport/named/externalFunctionNameClash.kt");
+ }
+
+ @Test
+ @TestMetadata("externalObject.kt")
+ public void testExternalObject() {
+ runTest("js/js.translator/testData/box/jsFileImport/named/externalObject.kt");
+ }
+
+ @Test
+ @TestMetadata("externalProperty.kt")
+ public void testExternalProperty() {
+ runTest("js/js.translator/testData/box/jsFileImport/named/externalProperty.kt");
+ }
+
+ @Test
+ @TestMetadata("topLevelVarargFun.kt")
+ public void testTopLevelVarargFun() {
+ runTest("js/js.translator/testData/box/jsFileImport/named/topLevelVarargFun.kt");
+ }
+ }
+
+ @Nested
+ @TestMetadata("js/js.translator/testData/box/jsFileImport/plainNamed")
+ @TestDataPath("$PROJECT_ROOT")
+ public class PlainNamed {
+ @Test
+ public void testAllFilesPresentInPlainNamed() {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/jsFileImport/plainNamed"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR_ES6, true);
+ }
+
+ @Test
+ @TestMetadata("externalClassNameClash.kt")
+ public void testExternalClassNameClash() {
+ runTest("js/js.translator/testData/box/jsFileImport/plainNamed/externalClassNameClash.kt");
+ }
+
+ @Test
+ @TestMetadata("externalPackage.kt")
+ public void testExternalPackage() {
+ runTest("js/js.translator/testData/box/jsFileImport/plainNamed/externalPackage.kt");
+ }
+
+ @Test
+ @TestMetadata("externalPackageInDifferentFile.kt")
+ public void testExternalPackageInDifferentFile() {
+ runTest("js/js.translator/testData/box/jsFileImport/plainNamed/externalPackageInDifferentFile.kt");
+ }
+
+ @Test
+ @TestMetadata("interfaces.kt")
+ public void testInterfaces() {
+ runTest("js/js.translator/testData/box/jsFileImport/plainNamed/interfaces.kt");
+ }
+
+ @Test
+ @TestMetadata("interfacesWithCompanion.kt")
+ public void testInterfacesWithCompanion() {
+ runTest("js/js.translator/testData/box/jsFileImport/plainNamed/interfacesWithCompanion.kt");
+ }
+ }
+ }
+
+ @Nested
+ @TestMetadata("js/js.translator/testData/box/jsImport")
+ @TestDataPath("$PROJECT_ROOT")
+ public class JsImport {
+ @Test
+ public void testAllFilesPresentInJsImport() {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/jsImport"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR_ES6, true);
+ }
+
+ @Nested
+ @TestMetadata("js/js.translator/testData/box/jsImport/default")
+ @TestDataPath("$PROJECT_ROOT")
+ public class Default {
+ @Test
+ public void testAllFilesPresentInDefault() {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/jsImport/default"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR_ES6, true);
+ }
+
+ @Test
+ @TestMetadata("externalClass.kt")
+ public void testExternalClass() {
+ runTest("js/js.translator/testData/box/jsImport/default/externalClass.kt");
+ }
+
+ @Test
+ @TestMetadata("externalClassWithDefaults.kt")
+ public void testExternalClassWithDefaults() {
+ runTest("js/js.translator/testData/box/jsImport/default/externalClassWithDefaults.kt");
+ }
+
+ @Test
+ @TestMetadata("externalConstructor.kt")
+ public void testExternalConstructor() {
+ runTest("js/js.translator/testData/box/jsImport/default/externalConstructor.kt");
+ }
+
+ @Test
+ @TestMetadata("externalFunction.kt")
+ public void testExternalFunction() {
+ runTest("js/js.translator/testData/box/jsImport/default/externalFunction.kt");
+ }
+
+ @Test
+ @TestMetadata("externalFunctionNameClash.kt")
+ public void testExternalFunctionNameClash() {
+ runTest("js/js.translator/testData/box/jsImport/default/externalFunctionNameClash.kt");
+ }
+
+ @Test
+ @TestMetadata("externalObject.kt")
+ public void testExternalObject() {
+ runTest("js/js.translator/testData/box/jsImport/default/externalObject.kt");
+ }
+
+ @Test
+ @TestMetadata("externalProperty.kt")
+ public void testExternalProperty() {
+ runTest("js/js.translator/testData/box/jsImport/default/externalProperty.kt");
+ }
+
+ @Test
+ @TestMetadata("topLevelVarargFun.kt")
+ public void testTopLevelVarargFun() {
+ runTest("js/js.translator/testData/box/jsImport/default/topLevelVarargFun.kt");
+ }
+ }
+
+ @Nested
+ @TestMetadata("js/js.translator/testData/box/jsImport/named")
+ @TestDataPath("$PROJECT_ROOT")
+ public class Named {
+ @Test
+ public void testAllFilesPresentInNamed() {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/jsImport/named"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR_ES6, true);
+ }
+
+ @Test
+ @TestMetadata("externalClass.kt")
+ public void testExternalClass() {
+ runTest("js/js.translator/testData/box/jsImport/named/externalClass.kt");
+ }
+
+ @Test
+ @TestMetadata("externalClassWithDefaults.kt")
+ public void testExternalClassWithDefaults() {
+ runTest("js/js.translator/testData/box/jsImport/named/externalClassWithDefaults.kt");
+ }
+
+ @Test
+ @TestMetadata("externalConstructor.kt")
+ public void testExternalConstructor() {
+ runTest("js/js.translator/testData/box/jsImport/named/externalConstructor.kt");
+ }
+
+ @Test
+ @TestMetadata("externalFunction.kt")
+ public void testExternalFunction() {
+ runTest("js/js.translator/testData/box/jsImport/named/externalFunction.kt");
+ }
+
+ @Test
+ @TestMetadata("externalFunctionNameClash.kt")
+ public void testExternalFunctionNameClash() {
+ runTest("js/js.translator/testData/box/jsImport/named/externalFunctionNameClash.kt");
+ }
+
+ @Test
+ @TestMetadata("externalObject.kt")
+ public void testExternalObject() {
+ runTest("js/js.translator/testData/box/jsImport/named/externalObject.kt");
+ }
+
+ @Test
+ @TestMetadata("externalProperty.kt")
+ public void testExternalProperty() {
+ runTest("js/js.translator/testData/box/jsImport/named/externalProperty.kt");
+ }
+
+ @Test
+ @TestMetadata("topLevelVarargFun.kt")
+ public void testTopLevelVarargFun() {
+ runTest("js/js.translator/testData/box/jsImport/named/topLevelVarargFun.kt");
+ }
+ }
+
+ @Nested
+ @TestMetadata("js/js.translator/testData/box/jsImport/namespaced")
+ @TestDataPath("$PROJECT_ROOT")
+ public class Namespaced {
+ @Test
+ public void testAllFilesPresentInNamespaced() {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/jsImport/namespaced"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR_ES6, true);
+ }
+
+ @Test
+ @TestMetadata("externalObject.kt")
+ public void testExternalObject() {
+ runTest("js/js.translator/testData/box/jsImport/namespaced/externalObject.kt");
+ }
+
+ @Test
+ @TestMetadata("jsExternalInheritorsOnly.kt")
+ public void testJsExternalInheritorsOnly() {
+ runTest("js/js.translator/testData/box/jsImport/namespaced/jsExternalInheritorsOnly.kt");
+ }
+ }
+
+ @Nested
+ @TestMetadata("js/js.translator/testData/box/jsImport/plainNamed")
+ @TestDataPath("$PROJECT_ROOT")
+ public class PlainNamed {
+ @Test
+ public void testAllFilesPresentInPlainNamed() {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/jsImport/plainNamed"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR_ES6, true);
+ }
+
+ @Test
+ @TestMetadata("externalClassNameClash.kt")
+ public void testExternalClassNameClash() {
+ runTest("js/js.translator/testData/box/jsImport/plainNamed/externalClassNameClash.kt");
+ }
+
+ @Test
+ @TestMetadata("externalPackage.kt")
+ public void testExternalPackage() {
+ runTest("js/js.translator/testData/box/jsImport/plainNamed/externalPackage.kt");
+ }
+
+ @Test
+ @TestMetadata("externalPackageInDifferentFile.kt")
+ public void testExternalPackageInDifferentFile() {
+ runTest("js/js.translator/testData/box/jsImport/plainNamed/externalPackageInDifferentFile.kt");
+ }
+
+ @Test
+ @TestMetadata("interfaces.kt")
+ public void testInterfaces() {
+ runTest("js/js.translator/testData/box/jsImport/plainNamed/interfaces.kt");
+ }
+
+ @Test
+ @TestMetadata("interfacesWithCompanion.kt")
+ public void testInterfacesWithCompanion() {
+ runTest("js/js.translator/testData/box/jsImport/plainNamed/interfacesWithCompanion.kt");
+ }
+ }
+ }
+
+ @Nested
@TestMetadata("js/js.translator/testData/box/jsModule")
@TestDataPath("$PROJECT_ROOT")
public class JsModule {
diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrBoxJsTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrBoxJsTestGenerated.java
index c60a540..a03bf2e 100644
--- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrBoxJsTestGenerated.java
+++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrBoxJsTestGenerated.java
@@ -2525,6 +2525,360 @@
}
@Nested
+ @TestMetadata("js/js.translator/testData/box/esModules/jsFileImport")
+ @TestDataPath("$PROJECT_ROOT")
+ public class JsFileImport {
+ @Test
+ public void testAllFilesPresentInJsFileImport() {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsFileImport"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR, true);
+ }
+
+ @Nested
+ @TestMetadata("js/js.translator/testData/box/esModules/jsFileImport/default")
+ @TestDataPath("$PROJECT_ROOT")
+ public class Default {
+ @Test
+ public void testAllFilesPresentInDefault() {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsFileImport/default"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR, true);
+ }
+
+ @Test
+ @TestMetadata("externalClass.kt")
+ public void testExternalClass() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/default/externalClass.kt");
+ }
+
+ @Test
+ @TestMetadata("externalClassWithDefaults.kt")
+ public void testExternalClassWithDefaults() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/default/externalClassWithDefaults.kt");
+ }
+
+ @Test
+ @TestMetadata("externalConstructor.kt")
+ public void testExternalConstructor() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/default/externalConstructor.kt");
+ }
+
+ @Test
+ @TestMetadata("externalFunction.kt")
+ public void testExternalFunction() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/default/externalFunction.kt");
+ }
+
+ @Test
+ @TestMetadata("externalFunctionNameClash.kt")
+ public void testExternalFunctionNameClash() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/default/externalFunctionNameClash.kt");
+ }
+
+ @Test
+ @TestMetadata("externalObject.kt")
+ public void testExternalObject() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/default/externalObject.kt");
+ }
+
+ @Test
+ @TestMetadata("externalProperty.kt")
+ public void testExternalProperty() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/default/externalProperty.kt");
+ }
+
+ @Test
+ @TestMetadata("topLevelVarargFun.kt")
+ public void testTopLevelVarargFun() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/default/topLevelVarargFun.kt");
+ }
+ }
+
+ @Nested
+ @TestMetadata("js/js.translator/testData/box/esModules/jsFileImport/named")
+ @TestDataPath("$PROJECT_ROOT")
+ public class Named {
+ @Test
+ public void testAllFilesPresentInNamed() {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsFileImport/named"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR, true);
+ }
+
+ @Test
+ @TestMetadata("externalClass.kt")
+ public void testExternalClass() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/named/externalClass.kt");
+ }
+
+ @Test
+ @TestMetadata("externalClassWithDefaults.kt")
+ public void testExternalClassWithDefaults() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/named/externalClassWithDefaults.kt");
+ }
+
+ @Test
+ @TestMetadata("externalConstructor.kt")
+ public void testExternalConstructor() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/named/externalConstructor.kt");
+ }
+
+ @Test
+ @TestMetadata("externalFunction.kt")
+ public void testExternalFunction() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/named/externalFunction.kt");
+ }
+
+ @Test
+ @TestMetadata("externalFunctionNameClash.kt")
+ public void testExternalFunctionNameClash() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/named/externalFunctionNameClash.kt");
+ }
+
+ @Test
+ @TestMetadata("externalObject.kt")
+ public void testExternalObject() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/named/externalObject.kt");
+ }
+
+ @Test
+ @TestMetadata("externalProperty.kt")
+ public void testExternalProperty() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/named/externalProperty.kt");
+ }
+
+ @Test
+ @TestMetadata("topLevelVarargFun.kt")
+ public void testTopLevelVarargFun() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/named/topLevelVarargFun.kt");
+ }
+ }
+
+ @Nested
+ @TestMetadata("js/js.translator/testData/box/esModules/jsFileImport/plainNamed")
+ @TestDataPath("$PROJECT_ROOT")
+ public class PlainNamed {
+ @Test
+ public void testAllFilesPresentInPlainNamed() {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsFileImport/plainNamed"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR, true);
+ }
+
+ @Test
+ @TestMetadata("externalClassNameClash.kt")
+ public void testExternalClassNameClash() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/plainNamed/externalClassNameClash.kt");
+ }
+
+ @Test
+ @TestMetadata("externalPackage.kt")
+ public void testExternalPackage() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/plainNamed/externalPackage.kt");
+ }
+
+ @Test
+ @TestMetadata("externalPackageInDifferentFile.kt")
+ public void testExternalPackageInDifferentFile() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/plainNamed/externalPackageInDifferentFile.kt");
+ }
+
+ @Test
+ @TestMetadata("interfaces.kt")
+ public void testInterfaces() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/plainNamed/interfaces.kt");
+ }
+
+ @Test
+ @TestMetadata("interfacesWithCompanion.kt")
+ public void testInterfacesWithCompanion() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/plainNamed/interfacesWithCompanion.kt");
+ }
+ }
+ }
+
+ @Nested
+ @TestMetadata("js/js.translator/testData/box/esModules/jsImport")
+ @TestDataPath("$PROJECT_ROOT")
+ public class JsImport {
+ @Test
+ public void testAllFilesPresentInJsImport() {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsImport"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR, true);
+ }
+
+ @Nested
+ @TestMetadata("js/js.translator/testData/box/esModules/jsImport/default")
+ @TestDataPath("$PROJECT_ROOT")
+ public class Default {
+ @Test
+ public void testAllFilesPresentInDefault() {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsImport/default"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR, true);
+ }
+
+ @Test
+ @TestMetadata("externalClass.kt")
+ public void testExternalClass() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/default/externalClass.kt");
+ }
+
+ @Test
+ @TestMetadata("externalClassWithDefaults.kt")
+ public void testExternalClassWithDefaults() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/default/externalClassWithDefaults.kt");
+ }
+
+ @Test
+ @TestMetadata("externalConstructor.kt")
+ public void testExternalConstructor() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/default/externalConstructor.kt");
+ }
+
+ @Test
+ @TestMetadata("externalFunction.kt")
+ public void testExternalFunction() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/default/externalFunction.kt");
+ }
+
+ @Test
+ @TestMetadata("externalFunctionNameClash.kt")
+ public void testExternalFunctionNameClash() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/default/externalFunctionNameClash.kt");
+ }
+
+ @Test
+ @TestMetadata("externalObject.kt")
+ public void testExternalObject() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/default/externalObject.kt");
+ }
+
+ @Test
+ @TestMetadata("externalProperty.kt")
+ public void testExternalProperty() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/default/externalProperty.kt");
+ }
+
+ @Test
+ @TestMetadata("topLevelVarargFun.kt")
+ public void testTopLevelVarargFun() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/default/topLevelVarargFun.kt");
+ }
+ }
+
+ @Nested
+ @TestMetadata("js/js.translator/testData/box/esModules/jsImport/named")
+ @TestDataPath("$PROJECT_ROOT")
+ public class Named {
+ @Test
+ public void testAllFilesPresentInNamed() {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsImport/named"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR, true);
+ }
+
+ @Test
+ @TestMetadata("externalClass.kt")
+ public void testExternalClass() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/named/externalClass.kt");
+ }
+
+ @Test
+ @TestMetadata("externalClassWithDefaults.kt")
+ public void testExternalClassWithDefaults() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/named/externalClassWithDefaults.kt");
+ }
+
+ @Test
+ @TestMetadata("externalConstructor.kt")
+ public void testExternalConstructor() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/named/externalConstructor.kt");
+ }
+
+ @Test
+ @TestMetadata("externalFunction.kt")
+ public void testExternalFunction() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/named/externalFunction.kt");
+ }
+
+ @Test
+ @TestMetadata("externalFunctionNameClash.kt")
+ public void testExternalFunctionNameClash() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/named/externalFunctionNameClash.kt");
+ }
+
+ @Test
+ @TestMetadata("externalObject.kt")
+ public void testExternalObject() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/named/externalObject.kt");
+ }
+
+ @Test
+ @TestMetadata("externalProperty.kt")
+ public void testExternalProperty() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/named/externalProperty.kt");
+ }
+
+ @Test
+ @TestMetadata("topLevelVarargFun.kt")
+ public void testTopLevelVarargFun() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/named/topLevelVarargFun.kt");
+ }
+ }
+
+ @Nested
+ @TestMetadata("js/js.translator/testData/box/esModules/jsImport/namespaced")
+ @TestDataPath("$PROJECT_ROOT")
+ public class Namespaced {
+ @Test
+ public void testAllFilesPresentInNamespaced() {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsImport/namespaced"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR, true);
+ }
+
+ @Test
+ @TestMetadata("externalObject.kt")
+ public void testExternalObject() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/namespaced/externalObject.kt");
+ }
+
+ @Test
+ @TestMetadata("jsExternalInheritorsOnly.kt")
+ public void testJsExternalInheritorsOnly() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/namespaced/jsExternalInheritorsOnly.kt");
+ }
+ }
+
+ @Nested
+ @TestMetadata("js/js.translator/testData/box/esModules/jsImport/plainNamed")
+ @TestDataPath("$PROJECT_ROOT")
+ public class PlainNamed {
+ @Test
+ public void testAllFilesPresentInPlainNamed() {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsImport/plainNamed"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR, true);
+ }
+
+ @Test
+ @TestMetadata("externalClassNameClash.kt")
+ public void testExternalClassNameClash() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/plainNamed/externalClassNameClash.kt");
+ }
+
+ @Test
+ @TestMetadata("externalPackage.kt")
+ public void testExternalPackage() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/plainNamed/externalPackage.kt");
+ }
+
+ @Test
+ @TestMetadata("externalPackageInDifferentFile.kt")
+ public void testExternalPackageInDifferentFile() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/plainNamed/externalPackageInDifferentFile.kt");
+ }
+
+ @Test
+ @TestMetadata("interfaces.kt")
+ public void testInterfaces() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/plainNamed/interfaces.kt");
+ }
+
+ @Test
+ @TestMetadata("interfacesWithCompanion.kt")
+ public void testInterfacesWithCompanion() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/plainNamed/interfacesWithCompanion.kt");
+ }
+ }
+ }
+
+ @Nested
@TestMetadata("js/js.translator/testData/box/esModules/jsModule")
@TestDataPath("$PROJECT_ROOT")
public class JsModule {
@@ -7456,6 +7810,360 @@
}
@Nested
+ @TestMetadata("js/js.translator/testData/box/jsFileImport")
+ @TestDataPath("$PROJECT_ROOT")
+ public class JsFileImport {
+ @Test
+ public void testAllFilesPresentInJsFileImport() {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/jsFileImport"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR, true);
+ }
+
+ @Nested
+ @TestMetadata("js/js.translator/testData/box/jsFileImport/default")
+ @TestDataPath("$PROJECT_ROOT")
+ public class Default {
+ @Test
+ public void testAllFilesPresentInDefault() {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/jsFileImport/default"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR, true);
+ }
+
+ @Test
+ @TestMetadata("externalClass.kt")
+ public void testExternalClass() {
+ runTest("js/js.translator/testData/box/jsFileImport/default/externalClass.kt");
+ }
+
+ @Test
+ @TestMetadata("externalClassWithDefaults.kt")
+ public void testExternalClassWithDefaults() {
+ runTest("js/js.translator/testData/box/jsFileImport/default/externalClassWithDefaults.kt");
+ }
+
+ @Test
+ @TestMetadata("externalConstructor.kt")
+ public void testExternalConstructor() {
+ runTest("js/js.translator/testData/box/jsFileImport/default/externalConstructor.kt");
+ }
+
+ @Test
+ @TestMetadata("externalFunction.kt")
+ public void testExternalFunction() {
+ runTest("js/js.translator/testData/box/jsFileImport/default/externalFunction.kt");
+ }
+
+ @Test
+ @TestMetadata("externalFunctionNameClash.kt")
+ public void testExternalFunctionNameClash() {
+ runTest("js/js.translator/testData/box/jsFileImport/default/externalFunctionNameClash.kt");
+ }
+
+ @Test
+ @TestMetadata("externalObject.kt")
+ public void testExternalObject() {
+ runTest("js/js.translator/testData/box/jsFileImport/default/externalObject.kt");
+ }
+
+ @Test
+ @TestMetadata("externalProperty.kt")
+ public void testExternalProperty() {
+ runTest("js/js.translator/testData/box/jsFileImport/default/externalProperty.kt");
+ }
+
+ @Test
+ @TestMetadata("topLevelVarargFun.kt")
+ public void testTopLevelVarargFun() {
+ runTest("js/js.translator/testData/box/jsFileImport/default/topLevelVarargFun.kt");
+ }
+ }
+
+ @Nested
+ @TestMetadata("js/js.translator/testData/box/jsFileImport/named")
+ @TestDataPath("$PROJECT_ROOT")
+ public class Named {
+ @Test
+ public void testAllFilesPresentInNamed() {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/jsFileImport/named"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR, true);
+ }
+
+ @Test
+ @TestMetadata("externalClass.kt")
+ public void testExternalClass() {
+ runTest("js/js.translator/testData/box/jsFileImport/named/externalClass.kt");
+ }
+
+ @Test
+ @TestMetadata("externalClassWithDefaults.kt")
+ public void testExternalClassWithDefaults() {
+ runTest("js/js.translator/testData/box/jsFileImport/named/externalClassWithDefaults.kt");
+ }
+
+ @Test
+ @TestMetadata("externalConstructor.kt")
+ public void testExternalConstructor() {
+ runTest("js/js.translator/testData/box/jsFileImport/named/externalConstructor.kt");
+ }
+
+ @Test
+ @TestMetadata("externalFunction.kt")
+ public void testExternalFunction() {
+ runTest("js/js.translator/testData/box/jsFileImport/named/externalFunction.kt");
+ }
+
+ @Test
+ @TestMetadata("externalFunctionNameClash.kt")
+ public void testExternalFunctionNameClash() {
+ runTest("js/js.translator/testData/box/jsFileImport/named/externalFunctionNameClash.kt");
+ }
+
+ @Test
+ @TestMetadata("externalObject.kt")
+ public void testExternalObject() {
+ runTest("js/js.translator/testData/box/jsFileImport/named/externalObject.kt");
+ }
+
+ @Test
+ @TestMetadata("externalProperty.kt")
+ public void testExternalProperty() {
+ runTest("js/js.translator/testData/box/jsFileImport/named/externalProperty.kt");
+ }
+
+ @Test
+ @TestMetadata("topLevelVarargFun.kt")
+ public void testTopLevelVarargFun() {
+ runTest("js/js.translator/testData/box/jsFileImport/named/topLevelVarargFun.kt");
+ }
+ }
+
+ @Nested
+ @TestMetadata("js/js.translator/testData/box/jsFileImport/plainNamed")
+ @TestDataPath("$PROJECT_ROOT")
+ public class PlainNamed {
+ @Test
+ public void testAllFilesPresentInPlainNamed() {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/jsFileImport/plainNamed"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR, true);
+ }
+
+ @Test
+ @TestMetadata("externalClassNameClash.kt")
+ public void testExternalClassNameClash() {
+ runTest("js/js.translator/testData/box/jsFileImport/plainNamed/externalClassNameClash.kt");
+ }
+
+ @Test
+ @TestMetadata("externalPackage.kt")
+ public void testExternalPackage() {
+ runTest("js/js.translator/testData/box/jsFileImport/plainNamed/externalPackage.kt");
+ }
+
+ @Test
+ @TestMetadata("externalPackageInDifferentFile.kt")
+ public void testExternalPackageInDifferentFile() {
+ runTest("js/js.translator/testData/box/jsFileImport/plainNamed/externalPackageInDifferentFile.kt");
+ }
+
+ @Test
+ @TestMetadata("interfaces.kt")
+ public void testInterfaces() {
+ runTest("js/js.translator/testData/box/jsFileImport/plainNamed/interfaces.kt");
+ }
+
+ @Test
+ @TestMetadata("interfacesWithCompanion.kt")
+ public void testInterfacesWithCompanion() {
+ runTest("js/js.translator/testData/box/jsFileImport/plainNamed/interfacesWithCompanion.kt");
+ }
+ }
+ }
+
+ @Nested
+ @TestMetadata("js/js.translator/testData/box/jsImport")
+ @TestDataPath("$PROJECT_ROOT")
+ public class JsImport {
+ @Test
+ public void testAllFilesPresentInJsImport() {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/jsImport"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR, true);
+ }
+
+ @Nested
+ @TestMetadata("js/js.translator/testData/box/jsImport/default")
+ @TestDataPath("$PROJECT_ROOT")
+ public class Default {
+ @Test
+ public void testAllFilesPresentInDefault() {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/jsImport/default"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR, true);
+ }
+
+ @Test
+ @TestMetadata("externalClass.kt")
+ public void testExternalClass() {
+ runTest("js/js.translator/testData/box/jsImport/default/externalClass.kt");
+ }
+
+ @Test
+ @TestMetadata("externalClassWithDefaults.kt")
+ public void testExternalClassWithDefaults() {
+ runTest("js/js.translator/testData/box/jsImport/default/externalClassWithDefaults.kt");
+ }
+
+ @Test
+ @TestMetadata("externalConstructor.kt")
+ public void testExternalConstructor() {
+ runTest("js/js.translator/testData/box/jsImport/default/externalConstructor.kt");
+ }
+
+ @Test
+ @TestMetadata("externalFunction.kt")
+ public void testExternalFunction() {
+ runTest("js/js.translator/testData/box/jsImport/default/externalFunction.kt");
+ }
+
+ @Test
+ @TestMetadata("externalFunctionNameClash.kt")
+ public void testExternalFunctionNameClash() {
+ runTest("js/js.translator/testData/box/jsImport/default/externalFunctionNameClash.kt");
+ }
+
+ @Test
+ @TestMetadata("externalObject.kt")
+ public void testExternalObject() {
+ runTest("js/js.translator/testData/box/jsImport/default/externalObject.kt");
+ }
+
+ @Test
+ @TestMetadata("externalProperty.kt")
+ public void testExternalProperty() {
+ runTest("js/js.translator/testData/box/jsImport/default/externalProperty.kt");
+ }
+
+ @Test
+ @TestMetadata("topLevelVarargFun.kt")
+ public void testTopLevelVarargFun() {
+ runTest("js/js.translator/testData/box/jsImport/default/topLevelVarargFun.kt");
+ }
+ }
+
+ @Nested
+ @TestMetadata("js/js.translator/testData/box/jsImport/named")
+ @TestDataPath("$PROJECT_ROOT")
+ public class Named {
+ @Test
+ public void testAllFilesPresentInNamed() {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/jsImport/named"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR, true);
+ }
+
+ @Test
+ @TestMetadata("externalClass.kt")
+ public void testExternalClass() {
+ runTest("js/js.translator/testData/box/jsImport/named/externalClass.kt");
+ }
+
+ @Test
+ @TestMetadata("externalClassWithDefaults.kt")
+ public void testExternalClassWithDefaults() {
+ runTest("js/js.translator/testData/box/jsImport/named/externalClassWithDefaults.kt");
+ }
+
+ @Test
+ @TestMetadata("externalConstructor.kt")
+ public void testExternalConstructor() {
+ runTest("js/js.translator/testData/box/jsImport/named/externalConstructor.kt");
+ }
+
+ @Test
+ @TestMetadata("externalFunction.kt")
+ public void testExternalFunction() {
+ runTest("js/js.translator/testData/box/jsImport/named/externalFunction.kt");
+ }
+
+ @Test
+ @TestMetadata("externalFunctionNameClash.kt")
+ public void testExternalFunctionNameClash() {
+ runTest("js/js.translator/testData/box/jsImport/named/externalFunctionNameClash.kt");
+ }
+
+ @Test
+ @TestMetadata("externalObject.kt")
+ public void testExternalObject() {
+ runTest("js/js.translator/testData/box/jsImport/named/externalObject.kt");
+ }
+
+ @Test
+ @TestMetadata("externalProperty.kt")
+ public void testExternalProperty() {
+ runTest("js/js.translator/testData/box/jsImport/named/externalProperty.kt");
+ }
+
+ @Test
+ @TestMetadata("topLevelVarargFun.kt")
+ public void testTopLevelVarargFun() {
+ runTest("js/js.translator/testData/box/jsImport/named/topLevelVarargFun.kt");
+ }
+ }
+
+ @Nested
+ @TestMetadata("js/js.translator/testData/box/jsImport/namespaced")
+ @TestDataPath("$PROJECT_ROOT")
+ public class Namespaced {
+ @Test
+ public void testAllFilesPresentInNamespaced() {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/jsImport/namespaced"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR, true);
+ }
+
+ @Test
+ @TestMetadata("externalObject.kt")
+ public void testExternalObject() {
+ runTest("js/js.translator/testData/box/jsImport/namespaced/externalObject.kt");
+ }
+
+ @Test
+ @TestMetadata("jsExternalInheritorsOnly.kt")
+ public void testJsExternalInheritorsOnly() {
+ runTest("js/js.translator/testData/box/jsImport/namespaced/jsExternalInheritorsOnly.kt");
+ }
+ }
+
+ @Nested
+ @TestMetadata("js/js.translator/testData/box/jsImport/plainNamed")
+ @TestDataPath("$PROJECT_ROOT")
+ public class PlainNamed {
+ @Test
+ public void testAllFilesPresentInPlainNamed() {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/jsImport/plainNamed"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS_IR, true);
+ }
+
+ @Test
+ @TestMetadata("externalClassNameClash.kt")
+ public void testExternalClassNameClash() {
+ runTest("js/js.translator/testData/box/jsImport/plainNamed/externalClassNameClash.kt");
+ }
+
+ @Test
+ @TestMetadata("externalPackage.kt")
+ public void testExternalPackage() {
+ runTest("js/js.translator/testData/box/jsImport/plainNamed/externalPackage.kt");
+ }
+
+ @Test
+ @TestMetadata("externalPackageInDifferentFile.kt")
+ public void testExternalPackageInDifferentFile() {
+ runTest("js/js.translator/testData/box/jsImport/plainNamed/externalPackageInDifferentFile.kt");
+ }
+
+ @Test
+ @TestMetadata("interfaces.kt")
+ public void testInterfaces() {
+ runTest("js/js.translator/testData/box/jsImport/plainNamed/interfaces.kt");
+ }
+
+ @Test
+ @TestMetadata("interfacesWithCompanion.kt")
+ public void testInterfacesWithCompanion() {
+ runTest("js/js.translator/testData/box/jsImport/plainNamed/interfacesWithCompanion.kt");
+ }
+ }
+ }
+
+ @Nested
@TestMetadata("js/js.translator/testData/box/jsModule")
@TestDataPath("$PROJECT_ROOT")
public class JsModule {
diff --git a/js/js.translator/testData/box/esModules/jsFileImport/default/externalClass.kt b/js/js.translator/testData/box/esModules/jsFileImport/default/externalClass.kt
new file mode 100644
index 0000000..c076b62
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsFileImport/default/externalClass.kt
@@ -0,0 +1,34 @@
+// EXPECTED_REACHABLE_NODES: 1284
+// ES_MODULES
+// DONT_TARGET_EXACT_BACKEND: JS
+
+@file:JsImport("./externalClass.mjs")
+package foo
+
+@JsImport.Default
+external class A(x: Int = definedExternally) {
+ val x: Int
+
+ fun foo(y: Int): Int = definedExternally
+
+ fun bar(vararg arg: String): String = definedExternally
+}
+
+class C {
+ val e = arrayOf("e")
+ val f = arrayOf("f")
+ val a = A(1)
+
+ fun qux() = a.bar(*e, *f)
+}
+
+
+fun box(): String {
+ val a = A(23)
+ assertEquals(23, a.x)
+ assertEquals(65, a.foo(42))
+
+ assertEquals(C().qux(), "(ef)")
+
+ return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/esModules/jsFileImport/default/externalClass.mjs b/js/js.translator/testData/box/esModules/jsFileImport/default/externalClass.mjs
new file mode 100644
index 0000000..848fe5d
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsFileImport/default/externalClass.mjs
@@ -0,0 +1,11 @@
+export default function A(x) {
+ this.x = x;
+}
+
+A.prototype.foo = function (y) {
+ return this.x + y;
+};
+
+A.prototype.bar = function() {
+ return "(" + Array.prototype.join.call(arguments, "") + ")";
+};
diff --git a/js/js.translator/testData/box/esModules/jsFileImport/default/externalClassWithDefaults.kt b/js/js.translator/testData/box/esModules/jsFileImport/default/externalClassWithDefaults.kt
new file mode 100644
index 0000000..9ea3510
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsFileImport/default/externalClassWithDefaults.kt
@@ -0,0 +1,50 @@
+// EXPECTED_REACHABLE_NODES: 1284
+// ES_MODULES
+// DONT_TARGET_EXACT_BACKEND: JS
+
+// DONT_TARGET_EXACT_BACKEND: WASM
+// WASM_MUTE_REASON: UNSUPPORTED_JS_INTEROP
+
+@file:JsImport("./externalClassWithDefaults.mjs")
+package foo
+
+@JsImport.Default
+external open class A(ss: String = definedExternally) {
+ val s: String
+ fun foo(y: String = definedExternally): String = definedExternally
+ fun bar(y: String = definedExternally): String = definedExternally
+}
+
+class C: A {
+ constructor(ss: String) : super(ss) {}
+ constructor() : super() {}
+
+ fun qux(s: String = "O") = s
+}
+
+
+fun box(): String {
+ val a = A()
+ val c = C()
+
+ val r1 = a.foo("O") + c.foo()
+ if (r1 != "OK") return "Fail1: $r1"
+
+ val r2 = a.bar() + c.bar("K")
+ if (r2 != "OK") return "Fail2: $r2"
+
+ val r3 = c.qux() + c.qux("K")
+ if (r3 != "OK") return "Fail3: $r3"
+
+ if (a.s != "A") return "Fail4: ${a.s}"
+ if (c.s != "A") return "Fail5: ${c.s}"
+
+ val a2 = A("A2")
+ val c2 = C("C2")
+
+ val r6 = a2.s + c2.s
+ if (r6 != "A2C2") return "Fail6: $r6"
+
+ return "OK"
+
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/esModules/jsFileImport/default/externalClassWithDefaults.mjs b/js/js.translator/testData/box/esModules/jsFileImport/default/externalClassWithDefaults.mjs
new file mode 100644
index 0000000..1a1ebc0
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsFileImport/default/externalClassWithDefaults.mjs
@@ -0,0 +1,9 @@
+export default function A(ss) {
+ this.s = ss || "A"
+}
+A.prototype.foo = function (y) {
+ return y || "K";
+};
+A.prototype.bar = function (y) {
+ return y || "O";
+};
diff --git a/js/js.translator/testData/box/esModules/jsFileImport/default/externalConstructor.kt b/js/js.translator/testData/box/esModules/jsFileImport/default/externalConstructor.kt
new file mode 100644
index 0000000..26dd18e
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsFileImport/default/externalConstructor.kt
@@ -0,0 +1,30 @@
+// EXPECTED_REACHABLE_NODES: 1334
+// ES_MODULES
+// DONT_TARGET_EXACT_BACKEND: JS
+
+// DONT_TARGET_EXACT_BACKEND: WASM
+// WASM_MUTE_REASON: UNSUPPORTED_JS_INTEROP
+
+@file:JsImport("./externalConstructor.mjs")
+package foo
+
+@JsImport.Default
+open external class A(data: String) {
+ constructor(data: Int)
+ constructor(data: Boolean)
+
+ val data: Any
+}
+
+class B(data: String) : A(data)
+
+class C(data: Int) : A(data)
+
+class D(data: Boolean) : A(data)
+
+fun box(): String {
+ assertEquals("13", B("13").data)
+ assertEquals(42, C(42).data)
+ assertEquals(true, D(true).data)
+ return "OK"
+}
diff --git a/js/js.translator/testData/box/esModules/jsFileImport/default/externalConstructor.mjs b/js/js.translator/testData/box/esModules/jsFileImport/default/externalConstructor.mjs
new file mode 100644
index 0000000..4882be9
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsFileImport/default/externalConstructor.mjs
@@ -0,0 +1,3 @@
+export default function (data) {
+ this.data = data
+}
diff --git a/js/js.translator/testData/box/esModules/jsFileImport/default/externalFunction.kt b/js/js.translator/testData/box/esModules/jsFileImport/default/externalFunction.kt
new file mode 100644
index 0000000..fbcb049
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsFileImport/default/externalFunction.kt
@@ -0,0 +1,12 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// ES_MODULES
+@file:JsImport("./externalFunction.mjs")
+package foo
+
+@JsImport.Default
+external fun foo(y: Int): Int = definedExternally
+
+fun box(): String {
+ assertEquals(65, foo(42))
+ return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/esModules/jsFileImport/default/externalFunction.mjs b/js/js.translator/testData/box/esModules/jsFileImport/default/externalFunction.mjs
new file mode 100644
index 0000000..b80e3d9
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsFileImport/default/externalFunction.mjs
@@ -0,0 +1,3 @@
+export default function(y) {
+ return 23 + y;
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/esModules/jsFileImport/default/externalFunctionNameClash.kt b/js/js.translator/testData/box/esModules/jsFileImport/default/externalFunctionNameClash.kt
new file mode 100644
index 0000000..adaff66
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsFileImport/default/externalFunctionNameClash.kt
@@ -0,0 +1,15 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// ES_MODULES
+@file:JsImport("./externalFunctionNameClash.mjs")
+package foo
+
+@JsImport.Default
+external fun foo(y: Int): Int = definedExternally
+
+fun foo(y: String): String = y + "K"
+
+fun box(): String {
+ val foo10 = foo(10)
+ if (foo10 != 33) return "Fail: $foo10"
+ return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/esModules/jsFileImport/default/externalFunctionNameClash.mjs b/js/js.translator/testData/box/esModules/jsFileImport/default/externalFunctionNameClash.mjs
new file mode 100644
index 0000000..b80e3d9
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsFileImport/default/externalFunctionNameClash.mjs
@@ -0,0 +1,3 @@
+export default function(y) {
+ return 23 + y;
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/esModules/jsFileImport/default/externalObject.kt b/js/js.translator/testData/box/esModules/jsFileImport/default/externalObject.kt
new file mode 100644
index 0000000..da2ba7b
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsFileImport/default/externalObject.kt
@@ -0,0 +1,17 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// ES_MODULES
+@file:JsImport("./externalObject.mjs")
+package foo
+
+@JsImport.Default
+external object A {
+ val x: Int = definedExternally
+
+ fun foo(y: Int): Int = definedExternally
+}
+
+fun box(): String {
+ assertEquals(23, A.x)
+ assertEquals(65, A.foo(42))
+ return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/esModules/jsFileImport/default/externalObject.mjs b/js/js.translator/testData/box/esModules/jsFileImport/default/externalObject.mjs
new file mode 100644
index 0000000..5910b6d
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsFileImport/default/externalObject.mjs
@@ -0,0 +1,6 @@
+export default {
+ x: 23,
+ foo: function(y) {
+ return this.x + y;
+ }
+};
\ No newline at end of file
diff --git a/js/js.translator/testData/box/esModules/jsFileImport/default/externalProperty.kt b/js/js.translator/testData/box/esModules/jsFileImport/default/externalProperty.kt
new file mode 100644
index 0000000..99d3beb
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsFileImport/default/externalProperty.kt
@@ -0,0 +1,12 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// ES_MODULES
+@file:JsImport("./externalProperty.mjs")
+package foo
+
+@JsImport.Default
+external val foo: Int = definedExternally
+
+fun box(): String {
+ assertEquals(23, foo)
+ return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/esModules/jsFileImport/default/externalProperty.mjs b/js/js.translator/testData/box/esModules/jsFileImport/default/externalProperty.mjs
new file mode 100644
index 0000000..19835ca
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsFileImport/default/externalProperty.mjs
@@ -0,0 +1 @@
+export default 23;
\ No newline at end of file
diff --git a/js/js.translator/testData/box/esModules/jsFileImport/default/topLevelVarargFun.kt b/js/js.translator/testData/box/esModules/jsFileImport/default/topLevelVarargFun.kt
new file mode 100644
index 0000000..2411008
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsFileImport/default/topLevelVarargFun.kt
@@ -0,0 +1,17 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// ES_MODULES
+@file:JsImport("./topLevelVarargFun.mjs")
+
+@JsImport.Default
+external fun foo(vararg arg: String): String
+
+fun box(): String {
+ val x = arrayOf("a", "b")
+ var r = foo(*x)
+ if (r != "(ab)") return "fail1: $r"
+
+ r = foo("c", "d")
+ if (r != "(cd)") return "fail2: $r"
+
+ return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/esModules/jsFileImport/default/topLevelVarargFun.mjs b/js/js.translator/testData/box/esModules/jsFileImport/default/topLevelVarargFun.mjs
new file mode 100644
index 0000000..a447c76
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsFileImport/default/topLevelVarargFun.mjs
@@ -0,0 +1,3 @@
+export default function() {
+ return "(" + Array.prototype.join.call(arguments, "") + ")";
+};
diff --git a/js/js.translator/testData/box/esModules/jsFileImport/named/externalClass.kt b/js/js.translator/testData/box/esModules/jsFileImport/named/externalClass.kt
new file mode 100644
index 0000000..9b1f7e8
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsFileImport/named/externalClass.kt
@@ -0,0 +1,34 @@
+// EXPECTED_REACHABLE_NODES: 1284
+// ES_MODULES
+// DONT_TARGET_EXACT_BACKEND: JS
+
+@file:JsImport("./externalClass.mjs")
+package foo
+
+@JsImport.Name("Foo")
+external class A(x: Int = definedExternally) {
+ val x: Int
+
+ fun foo(y: Int): Int = definedExternally
+
+ fun bar(vararg arg: String): String = definedExternally
+}
+
+class C {
+ val e = arrayOf("e")
+ val f = arrayOf("f")
+ val a = A(1)
+
+ fun qux() = a.bar(*e, *f)
+}
+
+
+fun box(): String {
+ val a = A(23)
+ assertEquals(23, a.x)
+ assertEquals(65, a.foo(42))
+
+ assertEquals(C().qux(), "(ef)")
+
+ return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/esModules/jsFileImport/named/externalClass.mjs b/js/js.translator/testData/box/esModules/jsFileImport/named/externalClass.mjs
new file mode 100644
index 0000000..4ba1f27
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsFileImport/named/externalClass.mjs
@@ -0,0 +1,11 @@
+export function Foo(x) {
+ this.x = x;
+}
+
+Foo.prototype.foo = function (y) {
+ return this.x + y;
+};
+
+Foo.prototype.bar = function() {
+ return "(" + Array.prototype.join.call(arguments, "") + ")";
+};
diff --git a/js/js.translator/testData/box/esModules/jsFileImport/named/externalClassWithDefaults.kt b/js/js.translator/testData/box/esModules/jsFileImport/named/externalClassWithDefaults.kt
new file mode 100644
index 0000000..907c424
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsFileImport/named/externalClassWithDefaults.kt
@@ -0,0 +1,50 @@
+// EXPECTED_REACHABLE_NODES: 1284
+// ES_MODULES
+// DONT_TARGET_EXACT_BACKEND: JS
+
+// DONT_TARGET_EXACT_BACKEND: WASM
+// WASM_MUTE_REASON: UNSUPPORTED_JS_INTEROP
+
+@file:JsImport("./externalClassWithDefaults.mjs")
+package foo
+
+@JsImport.Name("Foo")
+external open class A(ss: String = definedExternally) {
+ val s: String
+ fun foo(y: String = definedExternally): String = definedExternally
+ fun bar(y: String = definedExternally): String = definedExternally
+}
+
+class C: A {
+ constructor(ss: String) : super(ss) {}
+ constructor() : super() {}
+
+ fun qux(s: String = "O") = s
+}
+
+
+fun box(): String {
+ val a = A()
+ val c = C()
+
+ val r1 = a.foo("O") + c.foo()
+ if (r1 != "OK") return "Fail1: $r1"
+
+ val r2 = a.bar() + c.bar("K")
+ if (r2 != "OK") return "Fail2: $r2"
+
+ val r3 = c.qux() + c.qux("K")
+ if (r3 != "OK") return "Fail3: $r3"
+
+ if (a.s != "A") return "Fail4: ${a.s}"
+ if (c.s != "A") return "Fail5: ${c.s}"
+
+ val a2 = A("A2")
+ val c2 = C("C2")
+
+ val r6 = a2.s + c2.s
+ if (r6 != "A2C2") return "Fail6: $r6"
+
+ return "OK"
+
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/esModules/jsFileImport/named/externalClassWithDefaults.mjs b/js/js.translator/testData/box/esModules/jsFileImport/named/externalClassWithDefaults.mjs
new file mode 100644
index 0000000..11dd982
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsFileImport/named/externalClassWithDefaults.mjs
@@ -0,0 +1,9 @@
+export function Foo(ss) {
+ this.s = ss || "A"
+}
+Foo.prototype.foo = function (y) {
+ return y || "K";
+};
+Foo.prototype.bar = function (y) {
+ return y || "O";
+};
diff --git a/js/js.translator/testData/box/esModules/jsFileImport/named/externalConstructor.kt b/js/js.translator/testData/box/esModules/jsFileImport/named/externalConstructor.kt
new file mode 100644
index 0000000..60f8820
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsFileImport/named/externalConstructor.kt
@@ -0,0 +1,30 @@
+// EXPECTED_REACHABLE_NODES: 1334
+// ES_MODULES
+// DONT_TARGET_EXACT_BACKEND: JS
+
+// DONT_TARGET_EXACT_BACKEND: WASM
+// WASM_MUTE_REASON: UNSUPPORTED_JS_INTEROP
+
+@file:JsImport("./externalConstructor.mjs")
+package foo
+
+@JsImport.Name("Foo")
+open external class A(data: String) {
+ constructor(data: Int)
+ constructor(data: Boolean)
+
+ val data: Any
+}
+
+class B(data: String) : A(data)
+
+class C(data: Int) : A(data)
+
+class D(data: Boolean) : A(data)
+
+fun box(): String {
+ assertEquals("13", B("13").data)
+ assertEquals(42, C(42).data)
+ assertEquals(true, D(true).data)
+ return "OK"
+}
diff --git a/js/js.translator/testData/box/esModules/jsFileImport/named/externalConstructor.mjs b/js/js.translator/testData/box/esModules/jsFileImport/named/externalConstructor.mjs
new file mode 100644
index 0000000..98a5db6
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsFileImport/named/externalConstructor.mjs
@@ -0,0 +1,3 @@
+export function Foo (data) {
+ this.data = data
+}
diff --git a/js/js.translator/testData/box/esModules/jsFileImport/named/externalFunction.kt b/js/js.translator/testData/box/esModules/jsFileImport/named/externalFunction.kt
new file mode 100644
index 0000000..bd89fc5
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsFileImport/named/externalFunction.kt
@@ -0,0 +1,12 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// ES_MODULES
+@file:JsImport("./externalFunction.mjs")
+package foo
+
+@JsImport.Name("bar")
+external fun foo(y: Int): Int = definedExternally
+
+fun box(): String {
+ assertEquals(65, foo(42))
+ return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/esModules/jsFileImport/named/externalFunction.mjs b/js/js.translator/testData/box/esModules/jsFileImport/named/externalFunction.mjs
new file mode 100644
index 0000000..e6b1cc4
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsFileImport/named/externalFunction.mjs
@@ -0,0 +1,3 @@
+export function bar(y) {
+ return 23 + y;
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/esModules/jsFileImport/named/externalFunctionNameClash.kt b/js/js.translator/testData/box/esModules/jsFileImport/named/externalFunctionNameClash.kt
new file mode 100644
index 0000000..bdf5fbf
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsFileImport/named/externalFunctionNameClash.kt
@@ -0,0 +1,15 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// ES_MODULES
+@file:JsImport("./externalFunctionNameClash.mjs")
+package foo
+
+@JsImport.Name("bar")
+external fun foo(y: Int): Int = definedExternally
+
+fun foo(y: String): String = y + "K"
+
+fun box(): String {
+ val foo10 = foo(10)
+ if (foo10 != 33) return "Fail: $foo10"
+ return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/esModules/jsFileImport/named/externalFunctionNameClash.mjs b/js/js.translator/testData/box/esModules/jsFileImport/named/externalFunctionNameClash.mjs
new file mode 100644
index 0000000..e6b1cc4
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsFileImport/named/externalFunctionNameClash.mjs
@@ -0,0 +1,3 @@
+export function bar(y) {
+ return 23 + y;
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/esModules/jsFileImport/named/externalObject.kt b/js/js.translator/testData/box/esModules/jsFileImport/named/externalObject.kt
new file mode 100644
index 0000000..f9c7fc7
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsFileImport/named/externalObject.kt
@@ -0,0 +1,17 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// ES_MODULES
+@file:JsImport("./externalObject.mjs")
+package foo
+
+@JsImport.Name("O")
+external object A {
+ val x: Int = definedExternally
+
+ fun foo(y: Int): Int = definedExternally
+}
+
+fun box(): String {
+ assertEquals(23, A.x)
+ assertEquals(65, A.foo(42))
+ return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/esModules/jsFileImport/named/externalObject.mjs b/js/js.translator/testData/box/esModules/jsFileImport/named/externalObject.mjs
new file mode 100644
index 0000000..ffa75f7
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsFileImport/named/externalObject.mjs
@@ -0,0 +1,6 @@
+export const O = {
+ x: 23,
+ foo: function(y) {
+ return this.x + y;
+ }
+};
\ No newline at end of file
diff --git a/js/js.translator/testData/box/esModules/jsFileImport/named/externalProperty.kt b/js/js.translator/testData/box/esModules/jsFileImport/named/externalProperty.kt
new file mode 100644
index 0000000..4c26535
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsFileImport/named/externalProperty.kt
@@ -0,0 +1,12 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// ES_MODULES
+@file:JsImport("./externalProperty.mjs")
+package foo
+
+@JsImport.Name("bar")
+external val foo: Int = definedExternally
+
+fun box(): String {
+ assertEquals(23, foo)
+ return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/esModules/jsFileImport/named/externalProperty.mjs b/js/js.translator/testData/box/esModules/jsFileImport/named/externalProperty.mjs
new file mode 100644
index 0000000..75a47e2
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsFileImport/named/externalProperty.mjs
@@ -0,0 +1 @@
+export const bar = 23;
\ No newline at end of file
diff --git a/js/js.translator/testData/box/esModules/jsFileImport/named/topLevelVarargFun.kt b/js/js.translator/testData/box/esModules/jsFileImport/named/topLevelVarargFun.kt
new file mode 100644
index 0000000..7c72b0f
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsFileImport/named/topLevelVarargFun.kt
@@ -0,0 +1,17 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// ES_MODULES
+@file:JsImport("./topLevelVarargFun.mjs")
+
+@JsImport.Name("bar")
+external fun foo(vararg arg: String): String
+
+fun box(): String {
+ val x = arrayOf("a", "b")
+ var r = foo(*x)
+ if (r != "(ab)") return "fail1: $r"
+
+ r = foo("c", "d")
+ if (r != "(cd)") return "fail2: $r"
+
+ return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/esModules/jsFileImport/named/topLevelVarargFun.mjs b/js/js.translator/testData/box/esModules/jsFileImport/named/topLevelVarargFun.mjs
new file mode 100644
index 0000000..c9d2a77
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsFileImport/named/topLevelVarargFun.mjs
@@ -0,0 +1,3 @@
+export function bar() {
+ return "(" + Array.prototype.join.call(arguments, "") + ")";
+};
diff --git a/js/js.translator/testData/box/esModules/jsFileImport/plainNamed/externalClassNameClash.kt b/js/js.translator/testData/box/esModules/jsFileImport/plainNamed/externalClassNameClash.kt
new file mode 100644
index 0000000..e99f418
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsFileImport/plainNamed/externalClassNameClash.kt
@@ -0,0 +1,62 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// ES_MODULES
+// FILE: a.kt
+@file:JsImport("./a.mjs")
+package a
+
+external class A {
+ fun foo(): String
+}
+
+external fun bar(): Int
+
+external val prop: Int
+
+// FILE: b.kt
+@file:JsImport("./b.mjs")
+package b
+
+external class A {
+ fun foo(): String
+}
+
+external fun bar(): Int
+
+external val prop: Int
+
+// FILE: main.kt
+
+import a.A as O
+import b.A as K
+
+fun box(): String {
+ if (a.bar() != 1) return "fail 1"
+ if (a.prop != 10) return "fail 2"
+ if (b.bar() != 2) return "fail 3"
+ if (b.prop != 20) return "fail 4"
+
+ return O().foo() + K().foo()
+}
+
+// FILE: a.mjs
+export function A() {}
+
+A.prototype.foo = function () {
+ return "O";
+};
+
+export function bar() { return 1; }
+
+export let prop = 10
+
+
+// FILE: b.mjs
+export function A() {}
+
+A.prototype.foo = function () {
+ return "K";
+};
+
+export function bar() { return 2; }
+
+export let prop = 20;
\ No newline at end of file
diff --git a/js/js.translator/testData/box/esModules/jsFileImport/plainNamed/externalPackage.kt b/js/js.translator/testData/box/esModules/jsFileImport/plainNamed/externalPackage.kt
new file mode 100644
index 0000000..fcfd665
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsFileImport/plainNamed/externalPackage.kt
@@ -0,0 +1,45 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// ES_MODULES
+// FILE: a.kt
+@file:JsImport("./externalPackage.mjs")
+package foo
+
+external class A(x: Int) {
+ val x: Int
+
+ fun foo(y: Int): Int = definedExternally
+
+ class Nested {
+ val y: Int
+ }
+}
+
+external object B {
+ val x: Int = definedExternally
+
+ fun foo(y: Int): Int = definedExternally
+}
+
+external fun foo(y: Int): Int = definedExternally
+
+external val bar: Int = definedExternally
+
+// FILE: b.kt
+package foo
+
+fun box(): String {
+ val a = A(23)
+ assertEquals(23, a.x)
+ assertEquals(65, a.foo(42))
+
+ val nested = A.Nested()
+ assertEquals(55, nested.y)
+
+ assertEquals(123, B.x)
+ assertEquals(265, B.foo(142))
+
+ assertEquals(365, foo(42))
+ assertEquals(423, bar)
+
+ return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/esModules/jsFileImport/plainNamed/externalPackage.mjs b/js/js.translator/testData/box/esModules/jsFileImport/plainNamed/externalPackage.mjs
new file mode 100644
index 0000000..da3a03f
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsFileImport/plainNamed/externalPackage.mjs
@@ -0,0 +1,24 @@
+export function A(x) {
+ this.x = x;
+}
+A.prototype.foo = function (y) {
+ return this.x + y;
+};
+
+function Nested() {
+ this.y = 55;
+}
+A.Nested = Nested;
+
+export var B = {
+ x: 123,
+ foo: function(y) {
+ return this.x + y;
+ }
+};
+
+export function foo(y) {
+ return 323 + y;
+}
+
+export var bar = 423;
diff --git a/js/js.translator/testData/box/esModules/jsFileImport/plainNamed/externalPackageInDifferentFile.js b/js/js.translator/testData/box/esModules/jsFileImport/plainNamed/externalPackageInDifferentFile.js
new file mode 100644
index 0000000..d5a29ec4
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsFileImport/plainNamed/externalPackageInDifferentFile.js
@@ -0,0 +1,5 @@
+C = {
+ f: function() {
+ return 12345;
+ }
+};
diff --git a/js/js.translator/testData/box/esModules/jsFileImport/plainNamed/externalPackageInDifferentFile.kt b/js/js.translator/testData/box/esModules/jsFileImport/plainNamed/externalPackageInDifferentFile.kt
new file mode 100644
index 0000000..08d80c1
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsFileImport/plainNamed/externalPackageInDifferentFile.kt
@@ -0,0 +1,47 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// ES_MODULES
+// FILE: lib.kt
+@file:JsImport("./externalPackageInDifferentFile.mjs")
+package foo
+
+external class A(x: Int = definedExternally) {
+ val x: Int
+
+ fun foo(y: Int): Int = definedExternally
+}
+
+external object B {
+ val x: Int = definedExternally
+
+ fun foo(y: Int): Int = definedExternally
+}
+
+external fun foo(y: Int): Int = definedExternally
+
+external val bar: Int = definedExternally
+
+// FILE: lib2.kt
+package foo
+
+external object C {
+ fun f(): Int = definedExternally
+}
+
+// FILE: main.kt
+package foo
+
+fun box(): String {
+ val a = A(23)
+ assertEquals(23, a.x)
+ assertEquals(65, a.foo(42))
+
+ assertEquals(123, B.x)
+ assertEquals(265, B.foo(142))
+
+ assertEquals(365, foo(42))
+ assertEquals(423, bar)
+
+ assertEquals(12345, C.f())
+
+ return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/esModules/jsFileImport/plainNamed/externalPackageInDifferentFile.mjs b/js/js.translator/testData/box/esModules/jsFileImport/plainNamed/externalPackageInDifferentFile.mjs
new file mode 100644
index 0000000..05d3135
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsFileImport/plainNamed/externalPackageInDifferentFile.mjs
@@ -0,0 +1,21 @@
+function A(x) {
+ this.x = x;
+}
+A.prototype.foo = function (y) {
+ return this.x + y;
+};
+
+var B = {
+ x: 123,
+ foo: function(y) {
+ return this.x + y;
+ }
+};
+
+function foo(y) {
+ return 323 + y;
+}
+
+var bar = 423;
+
+export { A, B, foo, bar };
\ No newline at end of file
diff --git a/js/js.translator/testData/box/esModules/jsFileImport/plainNamed/interfaces.kt b/js/js.translator/testData/box/esModules/jsFileImport/plainNamed/interfaces.kt
new file mode 100644
index 0000000..41a7cd2
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsFileImport/plainNamed/interfaces.kt
@@ -0,0 +1,41 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// IGNORE_BACKEND: WASM
+// ES_MODULES
+// FILE: bar.kt
+@file:JsImport("./interfaces.mjs")
+package foo
+
+external interface Bar {
+ fun ping(): String
+}
+
+// FILE: baz.kt
+@file:JsImport("./interfaces.mjs")
+package boo
+
+external interface Baz {
+ fun pong(): Int
+}
+
+// FILE: root.kt
+@file:JsImport("./interfaces.mjs")
+import foo.Bar
+import boo.Baz
+
+external val bar: Bar
+external val baz: Baz
+
+// FILE: test.kt
+import boo.Baz
+
+fun box(): String {
+ if (bar.ping() != "ping" || baz.pong() != 194) return "Fail"
+
+ val local = object : Baz {
+ override fun pong(): Int = 322
+ }
+
+ if (local.asDynamic().pong() != 322) return "Fail"
+
+ return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/esModules/jsFileImport/plainNamed/interfaces.mjs b/js/js.translator/testData/box/esModules/jsFileImport/plainNamed/interfaces.mjs
new file mode 100644
index 0000000..b5027cc
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsFileImport/plainNamed/interfaces.mjs
@@ -0,0 +1,12 @@
+export var bar = {
+ ping() {
+ return "ping"
+ }
+};
+
+export var baz = {
+ pong() {
+ return 194
+ }
+};
+
diff --git a/js/js.translator/testData/box/esModules/jsFileImport/plainNamed/interfacesWithCompanion.kt b/js/js.translator/testData/box/esModules/jsFileImport/plainNamed/interfacesWithCompanion.kt
new file mode 100644
index 0000000..a578db2
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsFileImport/plainNamed/interfacesWithCompanion.kt
@@ -0,0 +1,20 @@
+// TARGET_BACKEND: JS_IR
+// TARGET_BACKEND: JS_IR_ES6
+// EXPECTED_REACHABLE_NODES: 1238
+// ES_MODULES
+// FILE: bar.kt
+@file:JsImport("./interfacesWithCompanion.mjs")
+package bar
+
+external interface Bar {
+ companion object {
+ fun ok(): String
+ }
+}
+
+// FILE: test.kt
+import bar.Bar
+
+fun box(): String {
+ return Bar.ok()
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/esModules/jsFileImport/plainNamed/interfacesWithCompanion.mjs b/js/js.translator/testData/box/esModules/jsFileImport/plainNamed/interfacesWithCompanion.mjs
new file mode 100644
index 0000000..f5344ff
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsFileImport/plainNamed/interfacesWithCompanion.mjs
@@ -0,0 +1,3 @@
+export const Bar = {
+ ok() { return "OK" }
+};
diff --git a/js/js.translator/testData/box/esModules/jsImport/default/externalClass.kt b/js/js.translator/testData/box/esModules/jsImport/default/externalClass.kt
new file mode 100644
index 0000000..bfd5f37
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsImport/default/externalClass.kt
@@ -0,0 +1,34 @@
+// EXPECTED_REACHABLE_NODES: 1284
+// ES_MODULES
+// DONT_TARGET_EXACT_BACKEND: JS
+
+package foo
+
+@JsImport("./externalClass.mjs")
+@JsImport.Default
+external class A(x: Int = definedExternally) {
+ val x: Int
+
+ fun foo(y: Int): Int = definedExternally
+
+ fun bar(vararg arg: String): String = definedExternally
+}
+
+class C {
+ val e = arrayOf("e")
+ val f = arrayOf("f")
+ val a = A(1)
+
+ fun qux() = a.bar(*e, *f)
+}
+
+
+fun box(): String {
+ val a = A(23)
+ assertEquals(23, a.x)
+ assertEquals(65, a.foo(42))
+
+ assertEquals(C().qux(), "(ef)")
+
+ return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/esModules/jsImport/default/externalClass.mjs b/js/js.translator/testData/box/esModules/jsImport/default/externalClass.mjs
new file mode 100644
index 0000000..848fe5d
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsImport/default/externalClass.mjs
@@ -0,0 +1,11 @@
+export default function A(x) {
+ this.x = x;
+}
+
+A.prototype.foo = function (y) {
+ return this.x + y;
+};
+
+A.prototype.bar = function() {
+ return "(" + Array.prototype.join.call(arguments, "") + ")";
+};
diff --git a/js/js.translator/testData/box/esModules/jsImport/default/externalClassWithDefaults.kt b/js/js.translator/testData/box/esModules/jsImport/default/externalClassWithDefaults.kt
new file mode 100644
index 0000000..6883fc4
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsImport/default/externalClassWithDefaults.kt
@@ -0,0 +1,50 @@
+// EXPECTED_REACHABLE_NODES: 1284
+// ES_MODULES
+// DONT_TARGET_EXACT_BACKEND: JS
+
+// DONT_TARGET_EXACT_BACKEND: WASM
+// WASM_MUTE_REASON: UNSUPPORTED_JS_INTEROP
+
+package foo
+
+@JsImport("./externalClassWithDefaults.mjs")
+@JsImport.Default
+external open class A(ss: String = definedExternally) {
+ val s: String
+ fun foo(y: String = definedExternally): String = definedExternally
+ fun bar(y: String = definedExternally): String = definedExternally
+}
+
+class C: A {
+ constructor(ss: String) : super(ss) {}
+ constructor() : super() {}
+
+ fun qux(s: String = "O") = s
+}
+
+
+fun box(): String {
+ val a = A()
+ val c = C()
+
+ val r1 = a.foo("O") + c.foo()
+ if (r1 != "OK") return "Fail1: $r1"
+
+ val r2 = a.bar() + c.bar("K")
+ if (r2 != "OK") return "Fail2: $r2"
+
+ val r3 = c.qux() + c.qux("K")
+ if (r3 != "OK") return "Fail3: $r3"
+
+ if (a.s != "A") return "Fail4: ${a.s}"
+ if (c.s != "A") return "Fail5: ${c.s}"
+
+ val a2 = A("A2")
+ val c2 = C("C2")
+
+ val r6 = a2.s + c2.s
+ if (r6 != "A2C2") return "Fail6: $r6"
+
+ return "OK"
+
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/esModules/jsImport/default/externalClassWithDefaults.mjs b/js/js.translator/testData/box/esModules/jsImport/default/externalClassWithDefaults.mjs
new file mode 100644
index 0000000..1a1ebc0
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsImport/default/externalClassWithDefaults.mjs
@@ -0,0 +1,9 @@
+export default function A(ss) {
+ this.s = ss || "A"
+}
+A.prototype.foo = function (y) {
+ return y || "K";
+};
+A.prototype.bar = function (y) {
+ return y || "O";
+};
diff --git a/js/js.translator/testData/box/esModules/jsImport/default/externalConstructor.kt b/js/js.translator/testData/box/esModules/jsImport/default/externalConstructor.kt
new file mode 100644
index 0000000..b427b3f
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsImport/default/externalConstructor.kt
@@ -0,0 +1,30 @@
+// EXPECTED_REACHABLE_NODES: 1334
+// ES_MODULES
+// DONT_TARGET_EXACT_BACKEND: JS
+
+// DONT_TARGET_EXACT_BACKEND: WASM
+// WASM_MUTE_REASON: UNSUPPORTED_JS_INTEROP
+
+package foo
+
+@JsImport("./externalConstructor.mjs")
+@JsImport.Default
+open external class A(data: String) {
+ constructor(data: Int)
+ constructor(data: Boolean)
+
+ val data: Any
+}
+
+class B(data: String) : A(data)
+
+class C(data: Int) : A(data)
+
+class D(data: Boolean) : A(data)
+
+fun box(): String {
+ assertEquals("13", B("13").data)
+ assertEquals(42, C(42).data)
+ assertEquals(true, D(true).data)
+ return "OK"
+}
diff --git a/js/js.translator/testData/box/esModules/jsImport/default/externalConstructor.mjs b/js/js.translator/testData/box/esModules/jsImport/default/externalConstructor.mjs
new file mode 100644
index 0000000..4882be9
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsImport/default/externalConstructor.mjs
@@ -0,0 +1,3 @@
+export default function (data) {
+ this.data = data
+}
diff --git a/js/js.translator/testData/box/esModules/jsImport/default/externalFunction.kt b/js/js.translator/testData/box/esModules/jsImport/default/externalFunction.kt
new file mode 100644
index 0000000..6e232c5
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsImport/default/externalFunction.kt
@@ -0,0 +1,12 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// ES_MODULES
+package foo
+
+@JsImport("./externalFunction.mjs")
+@JsImport.Default
+external fun foo(y: Int): Int = definedExternally
+
+fun box(): String {
+ assertEquals(65, foo(42))
+ return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/esModules/jsImport/default/externalFunction.mjs b/js/js.translator/testData/box/esModules/jsImport/default/externalFunction.mjs
new file mode 100644
index 0000000..b80e3d9
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsImport/default/externalFunction.mjs
@@ -0,0 +1,3 @@
+export default function(y) {
+ return 23 + y;
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/esModules/jsImport/default/externalFunctionNameClash.kt b/js/js.translator/testData/box/esModules/jsImport/default/externalFunctionNameClash.kt
new file mode 100644
index 0000000..2eb65b4
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsImport/default/externalFunctionNameClash.kt
@@ -0,0 +1,15 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// ES_MODULES
+package foo
+
+@JsImport("./externalFunctionNameClash.mjs")
+@JsImport.Default
+external fun foo(y: Int): Int = definedExternally
+
+fun foo(y: String): String = y + "K"
+
+fun box(): String {
+ val foo10 = foo(10)
+ if (foo10 != 33) return "Fail: $foo10"
+ return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/esModules/jsImport/default/externalFunctionNameClash.mjs b/js/js.translator/testData/box/esModules/jsImport/default/externalFunctionNameClash.mjs
new file mode 100644
index 0000000..b80e3d9
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsImport/default/externalFunctionNameClash.mjs
@@ -0,0 +1,3 @@
+export default function(y) {
+ return 23 + y;
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/esModules/jsImport/default/externalObject.kt b/js/js.translator/testData/box/esModules/jsImport/default/externalObject.kt
new file mode 100644
index 0000000..4021654
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsImport/default/externalObject.kt
@@ -0,0 +1,17 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// ES_MODULES
+package foo
+
+@JsImport("./externalObject.mjs")
+@JsImport.Default
+external object A {
+ val x: Int = definedExternally
+
+ fun foo(y: Int): Int = definedExternally
+}
+
+fun box(): String {
+ assertEquals(23, A.x)
+ assertEquals(65, A.foo(42))
+ return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/esModules/jsImport/default/externalObject.mjs b/js/js.translator/testData/box/esModules/jsImport/default/externalObject.mjs
new file mode 100644
index 0000000..5910b6d
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsImport/default/externalObject.mjs
@@ -0,0 +1,6 @@
+export default {
+ x: 23,
+ foo: function(y) {
+ return this.x + y;
+ }
+};
\ No newline at end of file
diff --git a/js/js.translator/testData/box/esModules/jsImport/default/externalProperty.kt b/js/js.translator/testData/box/esModules/jsImport/default/externalProperty.kt
new file mode 100644
index 0000000..d3903cf
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsImport/default/externalProperty.kt
@@ -0,0 +1,12 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// ES_MODULES
+package foo
+
+@JsImport("./externalProperty.mjs")
+@JsImport.Default
+external val foo: Int = definedExternally
+
+fun box(): String {
+ assertEquals(23, foo)
+ return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/esModules/jsImport/default/externalProperty.mjs b/js/js.translator/testData/box/esModules/jsImport/default/externalProperty.mjs
new file mode 100644
index 0000000..19835ca
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsImport/default/externalProperty.mjs
@@ -0,0 +1 @@
+export default 23;
\ No newline at end of file
diff --git a/js/js.translator/testData/box/esModules/jsImport/default/topLevelVarargFun.kt b/js/js.translator/testData/box/esModules/jsImport/default/topLevelVarargFun.kt
new file mode 100644
index 0000000..9b4c90a
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsImport/default/topLevelVarargFun.kt
@@ -0,0 +1,16 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// ES_MODULES
+@JsImport("./topLevelVarargFun.mjs")
+@JsImport.Default
+external fun foo(vararg arg: String): String
+
+fun box(): String {
+ val x = arrayOf("a", "b")
+ var r = foo(*x)
+ if (r != "(ab)") return "fail1: $r"
+
+ r = foo("c", "d")
+ if (r != "(cd)") return "fail2: $r"
+
+ return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/esModules/jsImport/default/topLevelVarargFun.mjs b/js/js.translator/testData/box/esModules/jsImport/default/topLevelVarargFun.mjs
new file mode 100644
index 0000000..a447c76
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsImport/default/topLevelVarargFun.mjs
@@ -0,0 +1,3 @@
+export default function() {
+ return "(" + Array.prototype.join.call(arguments, "") + ")";
+};
diff --git a/js/js.translator/testData/box/esModules/jsImport/named/externalClass.kt b/js/js.translator/testData/box/esModules/jsImport/named/externalClass.kt
new file mode 100644
index 0000000..e0abbd43
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsImport/named/externalClass.kt
@@ -0,0 +1,34 @@
+// EXPECTED_REACHABLE_NODES: 1284
+// ES_MODULES
+// DONT_TARGET_EXACT_BACKEND: JS
+
+package foo
+
+@JsImport("./externalClass.mjs")
+@JsImport.Name("Foo")
+external class A(x: Int = definedExternally) {
+ val x: Int
+
+ fun foo(y: Int): Int = definedExternally
+
+ fun bar(vararg arg: String): String = definedExternally
+}
+
+class C {
+ val e = arrayOf("e")
+ val f = arrayOf("f")
+ val a = A(1)
+
+ fun qux() = a.bar(*e, *f)
+}
+
+
+fun box(): String {
+ val a = A(23)
+ assertEquals(23, a.x)
+ assertEquals(65, a.foo(42))
+
+ assertEquals(C().qux(), "(ef)")
+
+ return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/esModules/jsImport/named/externalClass.mjs b/js/js.translator/testData/box/esModules/jsImport/named/externalClass.mjs
new file mode 100644
index 0000000..4ba1f27
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsImport/named/externalClass.mjs
@@ -0,0 +1,11 @@
+export function Foo(x) {
+ this.x = x;
+}
+
+Foo.prototype.foo = function (y) {
+ return this.x + y;
+};
+
+Foo.prototype.bar = function() {
+ return "(" + Array.prototype.join.call(arguments, "") + ")";
+};
diff --git a/js/js.translator/testData/box/esModules/jsImport/named/externalClassWithDefaults.kt b/js/js.translator/testData/box/esModules/jsImport/named/externalClassWithDefaults.kt
new file mode 100644
index 0000000..ad360e1
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsImport/named/externalClassWithDefaults.kt
@@ -0,0 +1,50 @@
+// EXPECTED_REACHABLE_NODES: 1284
+// ES_MODULES
+// DONT_TARGET_EXACT_BACKEND: JS
+
+// DONT_TARGET_EXACT_BACKEND: WASM
+// WASM_MUTE_REASON: UNSUPPORTED_JS_INTEROP
+
+package foo
+
+@JsImport("./externalClassWithDefaults.mjs")
+@JsImport.Name("Foo")
+external open class A(ss: String = definedExternally) {
+ val s: String
+ fun foo(y: String = definedExternally): String = definedExternally
+ fun bar(y: String = definedExternally): String = definedExternally
+}
+
+class C: A {
+ constructor(ss: String) : super(ss) {}
+ constructor() : super() {}
+
+ fun qux(s: String = "O") = s
+}
+
+
+fun box(): String {
+ val a = A()
+ val c = C()
+
+ val r1 = a.foo("O") + c.foo()
+ if (r1 != "OK") return "Fail1: $r1"
+
+ val r2 = a.bar() + c.bar("K")
+ if (r2 != "OK") return "Fail2: $r2"
+
+ val r3 = c.qux() + c.qux("K")
+ if (r3 != "OK") return "Fail3: $r3"
+
+ if (a.s != "A") return "Fail4: ${a.s}"
+ if (c.s != "A") return "Fail5: ${c.s}"
+
+ val a2 = A("A2")
+ val c2 = C("C2")
+
+ val r6 = a2.s + c2.s
+ if (r6 != "A2C2") return "Fail6: $r6"
+
+ return "OK"
+
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/esModules/jsImport/named/externalClassWithDefaults.mjs b/js/js.translator/testData/box/esModules/jsImport/named/externalClassWithDefaults.mjs
new file mode 100644
index 0000000..11dd982
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsImport/named/externalClassWithDefaults.mjs
@@ -0,0 +1,9 @@
+export function Foo(ss) {
+ this.s = ss || "A"
+}
+Foo.prototype.foo = function (y) {
+ return y || "K";
+};
+Foo.prototype.bar = function (y) {
+ return y || "O";
+};
diff --git a/js/js.translator/testData/box/esModules/jsImport/named/externalConstructor.kt b/js/js.translator/testData/box/esModules/jsImport/named/externalConstructor.kt
new file mode 100644
index 0000000..aea9c9c
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsImport/named/externalConstructor.kt
@@ -0,0 +1,30 @@
+// EXPECTED_REACHABLE_NODES: 1334
+// ES_MODULES
+// DONT_TARGET_EXACT_BACKEND: JS
+
+// DONT_TARGET_EXACT_BACKEND: WASM
+// WASM_MUTE_REASON: UNSUPPORTED_JS_INTEROP
+
+package foo
+
+@JsImport("./externalConstructor.mjs")
+@JsImport.Name("Foo")
+open external class A(data: String) {
+ constructor(data: Int)
+ constructor(data: Boolean)
+
+ val data: Any
+}
+
+class B(data: String) : A(data)
+
+class C(data: Int) : A(data)
+
+class D(data: Boolean) : A(data)
+
+fun box(): String {
+ assertEquals("13", B("13").data)
+ assertEquals(42, C(42).data)
+ assertEquals(true, D(true).data)
+ return "OK"
+}
diff --git a/js/js.translator/testData/box/esModules/jsImport/named/externalConstructor.mjs b/js/js.translator/testData/box/esModules/jsImport/named/externalConstructor.mjs
new file mode 100644
index 0000000..98a5db6
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsImport/named/externalConstructor.mjs
@@ -0,0 +1,3 @@
+export function Foo (data) {
+ this.data = data
+}
diff --git a/js/js.translator/testData/box/esModules/jsImport/named/externalFunction.kt b/js/js.translator/testData/box/esModules/jsImport/named/externalFunction.kt
new file mode 100644
index 0000000..9b5aa58
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsImport/named/externalFunction.kt
@@ -0,0 +1,12 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// ES_MODULES
+package foo
+
+@JsImport("./externalFunction.mjs")
+@JsImport.Name("bar")
+external fun foo(y: Int): Int = definedExternally
+
+fun box(): String {
+ assertEquals(65, foo(42))
+ return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/esModules/jsImport/named/externalFunction.mjs b/js/js.translator/testData/box/esModules/jsImport/named/externalFunction.mjs
new file mode 100644
index 0000000..e6b1cc4
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsImport/named/externalFunction.mjs
@@ -0,0 +1,3 @@
+export function bar(y) {
+ return 23 + y;
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/esModules/jsImport/named/externalFunctionNameClash.kt b/js/js.translator/testData/box/esModules/jsImport/named/externalFunctionNameClash.kt
new file mode 100644
index 0000000..eaa863f
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsImport/named/externalFunctionNameClash.kt
@@ -0,0 +1,15 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// ES_MODULES
+package foo
+
+@JsImport("./externalFunctionNameClash.mjs")
+@JsImport.Name("bar")
+external fun foo(y: Int): Int = definedExternally
+
+fun foo(y: String): String = y + "K"
+
+fun box(): String {
+ val foo10 = foo(10)
+ if (foo10 != 33) return "Fail: $foo10"
+ return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/esModules/jsImport/named/externalFunctionNameClash.mjs b/js/js.translator/testData/box/esModules/jsImport/named/externalFunctionNameClash.mjs
new file mode 100644
index 0000000..e6b1cc4
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsImport/named/externalFunctionNameClash.mjs
@@ -0,0 +1,3 @@
+export function bar(y) {
+ return 23 + y;
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/esModules/jsImport/named/externalObject.kt b/js/js.translator/testData/box/esModules/jsImport/named/externalObject.kt
new file mode 100644
index 0000000..4bcd4d5
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsImport/named/externalObject.kt
@@ -0,0 +1,17 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// ES_MODULES
+package foo
+
+@JsImport("./externalObject.mjs")
+@JsImport.Name("O")
+external object A {
+ val x: Int = definedExternally
+
+ fun foo(y: Int): Int = definedExternally
+}
+
+fun box(): String {
+ assertEquals(23, A.x)
+ assertEquals(65, A.foo(42))
+ return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/esModules/jsImport/named/externalObject.mjs b/js/js.translator/testData/box/esModules/jsImport/named/externalObject.mjs
new file mode 100644
index 0000000..ffa75f7
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsImport/named/externalObject.mjs
@@ -0,0 +1,6 @@
+export const O = {
+ x: 23,
+ foo: function(y) {
+ return this.x + y;
+ }
+};
\ No newline at end of file
diff --git a/js/js.translator/testData/box/esModules/jsImport/named/externalProperty.kt b/js/js.translator/testData/box/esModules/jsImport/named/externalProperty.kt
new file mode 100644
index 0000000..a715a2d
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsImport/named/externalProperty.kt
@@ -0,0 +1,12 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// ES_MODULES
+package foo
+
+@JsImport("./externalProperty.mjs")
+@JsImport.Name("bar")
+external val foo: Int = definedExternally
+
+fun box(): String {
+ assertEquals(23, foo)
+ return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/esModules/jsImport/named/externalProperty.mjs b/js/js.translator/testData/box/esModules/jsImport/named/externalProperty.mjs
new file mode 100644
index 0000000..75a47e2
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsImport/named/externalProperty.mjs
@@ -0,0 +1 @@
+export const bar = 23;
\ No newline at end of file
diff --git a/js/js.translator/testData/box/esModules/jsImport/named/topLevelVarargFun.kt b/js/js.translator/testData/box/esModules/jsImport/named/topLevelVarargFun.kt
new file mode 100644
index 0000000..17883fb
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsImport/named/topLevelVarargFun.kt
@@ -0,0 +1,16 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// ES_MODULES
+@JsImport("./topLevelVarargFun.mjs")
+@JsImport.Name("bar")
+external fun foo(vararg arg: String): String
+
+fun box(): String {
+ val x = arrayOf("a", "b")
+ var r = foo(*x)
+ if (r != "(ab)") return "fail1: $r"
+
+ r = foo("c", "d")
+ if (r != "(cd)") return "fail2: $r"
+
+ return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/esModules/jsImport/named/topLevelVarargFun.mjs b/js/js.translator/testData/box/esModules/jsImport/named/topLevelVarargFun.mjs
new file mode 100644
index 0000000..c9d2a77
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsImport/named/topLevelVarargFun.mjs
@@ -0,0 +1,3 @@
+export function bar() {
+ return "(" + Array.prototype.join.call(arguments, "") + ")";
+};
diff --git a/js/js.translator/testData/box/esModules/jsImport/namespaced/externalObject.kt b/js/js.translator/testData/box/esModules/jsImport/namespaced/externalObject.kt
new file mode 100644
index 0000000..e595e59
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsImport/namespaced/externalObject.kt
@@ -0,0 +1,18 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// ES_MODULES
+package foo
+
+@JsImport("./externalObject.mjs")
+@JsImport.Namespace
+external object A {
+ object O {
+ val x: Int = definedExternally
+ fun foo(y: Int): Int = definedExternally
+ }
+}
+
+fun box(): String {
+ assertEquals(23, A.O.x)
+ assertEquals(65, A.O.foo(42))
+ return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/esModules/jsImport/namespaced/externalObject.mjs b/js/js.translator/testData/box/esModules/jsImport/namespaced/externalObject.mjs
new file mode 100644
index 0000000..ffa75f7
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsImport/namespaced/externalObject.mjs
@@ -0,0 +1,6 @@
+export const O = {
+ x: 23,
+ foo: function(y) {
+ return this.x + y;
+ }
+};
\ No newline at end of file
diff --git a/js/js.translator/testData/box/esModules/jsImport/namespaced/jsExternalInheritorsOnly.kt b/js/js.translator/testData/box/esModules/jsImport/namespaced/jsExternalInheritorsOnly.kt
new file mode 100644
index 0000000..f433eb5
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsImport/namespaced/jsExternalInheritorsOnly.kt
@@ -0,0 +1,64 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// DONT_TARGET_EXACT_BACKEND: WASM
+// ES_MODULES
+
+@OptIn(ExperimentalStdlibApi::class)
+@JsExternalInheritorsOnly
+external interface ExternalInterfaceX {
+ val x: String
+}
+
+external interface ExternalInterfaceXY : ExternalInterfaceX {
+ val y: String
+}
+
+external interface ExternalInterfaceXYZ : ExternalInterfaceXY {
+ val z: String
+}
+
+external class ExternalXYZ() : ExternalInterfaceXYZ {
+ override val x: String
+ override val y: String
+ override val z: String
+}
+
+external class ExternalClassNameSpace {
+ interface NestedInterfaceXYZ : ExternalInterfaceXYZ {
+ override val x: String
+ override val y: String
+ override val z: String
+ }
+}
+
+@JsImport("./jsExternalInheritorsOnly.mjs")
+@JsImport.Namespace
+external object Creator: ExternalInterfaceXYZ {
+ fun createX(): ExternalInterfaceX
+ fun createXY(): ExternalInterfaceXY
+ fun createXYZ(): ExternalInterfaceXYZ
+ fun createClassXYZ(): ExternalXYZ
+
+ fun createNestedInterfaceXYZ(): ExternalClassNameSpace.NestedInterfaceXYZ
+
+ override val x: String
+ override val y: String
+ override val z: String
+}
+
+fun checkX(x: ExternalInterfaceX, id: Int) = x.x == "X$id"
+fun checkXY(xy: ExternalInterfaceXY, id: Int) = checkX(xy, id) && xy.y == "Y$id"
+fun checkXYZ(xyz: ExternalInterfaceXYZ, id: Int) = checkXY(xyz, id) && xyz.z == "Z$id"
+
+fun box(): String {
+ if (!checkX(Creator.createX(), 1)) return "Fail interface X"
+ if (!checkXY(Creator.createXY(), 2)) return "Fail interface XY"
+ if (!checkXYZ(Creator.createXYZ(), 3)) return "Fail interface XYZ"
+
+ if (!checkXYZ(Creator.createClassXYZ(), 4)) return "Fail class XYZ"
+
+ if (!checkXYZ(Creator.createNestedInterfaceXYZ(), 5)) return "Fail nested interface XYZ"
+
+ if (!checkXYZ(Creator, 6)) return "Fail object XYZ"
+
+ return "OK"
+}
diff --git a/js/js.translator/testData/box/esModules/jsImport/namespaced/jsExternalInheritorsOnly.mjs b/js/js.translator/testData/box/esModules/jsImport/namespaced/jsExternalInheritorsOnly.mjs
new file mode 100644
index 0000000..aa31102
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsImport/namespaced/jsExternalInheritorsOnly.mjs
@@ -0,0 +1,19 @@
+export function createX () {
+ return {x: "X1"};
+}
+export function createXY () {
+ return {x: "X2", y: "Y2"};
+}
+export function createXYZ() {
+ return {x: "X3", y: "Y3", z: "Z3"};
+}
+export function createClassXYZ() {
+ return {x: "X4", y: "Y4", z: "Z4"};
+}
+export function createNestedInterfaceXYZ() {
+ return {x: "X5", y: "Y5", z: "Z5"};
+}
+
+export const x = "X6"
+export const y = "Y6"
+export const z = "Z6"
diff --git a/js/js.translator/testData/box/esModules/jsImport/plainNamed/externalClassNameClash.kt b/js/js.translator/testData/box/esModules/jsImport/plainNamed/externalClassNameClash.kt
new file mode 100644
index 0000000..e3c4c43
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsImport/plainNamed/externalClassNameClash.kt
@@ -0,0 +1,66 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// ES_MODULES
+// FILE: a.kt
+package a
+
+@JsImport("./a.mjs")
+external class A {
+ fun foo(): String
+}
+
+@JsImport("./a.mjs")
+external fun bar(): Int
+
+@JsImport("./a.mjs")
+external val prop: Int
+
+// FILE: b.kt
+package b
+
+@JsImport("./b.mjs")
+external class A {
+ fun foo(): String
+}
+
+@JsImport("./b.mjs")
+external fun bar(): Int
+
+@JsImport("./b.mjs")
+external val prop: Int
+
+// FILE: main.kt
+
+import a.A as O
+import b.A as K
+
+fun box(): String {
+ if (a.bar() != 1) return "fail 1"
+ if (a.prop != 10) return "fail 2"
+ if (b.bar() != 2) return "fail 3"
+ if (b.prop != 20) return "fail 4"
+
+ return O().foo() + K().foo()
+}
+
+// FILE: a.mjs
+export function A() {}
+
+A.prototype.foo = function () {
+ return "O";
+};
+
+export function bar() { return 1; }
+
+export let prop = 10
+
+
+// FILE: b.mjs
+export function A() {}
+
+A.prototype.foo = function () {
+ return "K";
+};
+
+export function bar() { return 2; }
+
+export let prop = 20;
\ No newline at end of file
diff --git a/js/js.translator/testData/box/esModules/jsImport/plainNamed/externalPackage.kt b/js/js.translator/testData/box/esModules/jsImport/plainNamed/externalPackage.kt
new file mode 100644
index 0000000..9f05521
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsImport/plainNamed/externalPackage.kt
@@ -0,0 +1,48 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// ES_MODULES
+// FILE: a.kt
+package foo
+
+@JsImport("./externalPackage.mjs")
+external class A(x: Int) {
+ val x: Int
+
+ fun foo(y: Int): Int = definedExternally
+
+ class Nested {
+ val y: Int
+ }
+}
+
+@JsImport("./externalPackage.mjs")
+external object B {
+ val x: Int = definedExternally
+
+ fun foo(y: Int): Int = definedExternally
+}
+
+@JsImport("./externalPackage.mjs")
+external fun foo(y: Int): Int = definedExternally
+
+@JsImport("./externalPackage.mjs")
+external val bar: Int = definedExternally
+
+// FILE: b.kt
+package foo
+
+fun box(): String {
+ val a = A(23)
+ assertEquals(23, a.x)
+ assertEquals(65, a.foo(42))
+
+ val nested = A.Nested()
+ assertEquals(55, nested.y)
+
+ assertEquals(123, B.x)
+ assertEquals(265, B.foo(142))
+
+ assertEquals(365, foo(42))
+ assertEquals(423, bar)
+
+ return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/esModules/jsImport/plainNamed/externalPackage.mjs b/js/js.translator/testData/box/esModules/jsImport/plainNamed/externalPackage.mjs
new file mode 100644
index 0000000..da3a03f
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsImport/plainNamed/externalPackage.mjs
@@ -0,0 +1,24 @@
+export function A(x) {
+ this.x = x;
+}
+A.prototype.foo = function (y) {
+ return this.x + y;
+};
+
+function Nested() {
+ this.y = 55;
+}
+A.Nested = Nested;
+
+export var B = {
+ x: 123,
+ foo: function(y) {
+ return this.x + y;
+ }
+};
+
+export function foo(y) {
+ return 323 + y;
+}
+
+export var bar = 423;
diff --git a/js/js.translator/testData/box/esModules/jsImport/plainNamed/externalPackageInDifferentFile.js b/js/js.translator/testData/box/esModules/jsImport/plainNamed/externalPackageInDifferentFile.js
new file mode 100644
index 0000000..d5a29ec4
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsImport/plainNamed/externalPackageInDifferentFile.js
@@ -0,0 +1,5 @@
+C = {
+ f: function() {
+ return 12345;
+ }
+};
diff --git a/js/js.translator/testData/box/esModules/jsImport/plainNamed/externalPackageInDifferentFile.kt b/js/js.translator/testData/box/esModules/jsImport/plainNamed/externalPackageInDifferentFile.kt
new file mode 100644
index 0000000..bfa38d7
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsImport/plainNamed/externalPackageInDifferentFile.kt
@@ -0,0 +1,50 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// ES_MODULES
+// FILE: lib.kt
+package foo
+
+@JsImport("./externalPackageInDifferentFile.mjs")
+external class A(x: Int = definedExternally) {
+ val x: Int
+
+ fun foo(y: Int): Int = definedExternally
+}
+
+@JsImport("./externalPackageInDifferentFile.mjs")
+external object B {
+ val x: Int = definedExternally
+
+ fun foo(y: Int): Int = definedExternally
+}
+
+@JsImport("./externalPackageInDifferentFile.mjs")
+external fun foo(y: Int): Int = definedExternally
+
+@JsImport("./externalPackageInDifferentFile.mjs")
+external val bar: Int = definedExternally
+
+// FILE: lib2.kt
+package foo
+
+external object C {
+ fun f(): Int = definedExternally
+}
+
+// FILE: main.kt
+package foo
+
+fun box(): String {
+ val a = A(23)
+ assertEquals(23, a.x)
+ assertEquals(65, a.foo(42))
+
+ assertEquals(123, B.x)
+ assertEquals(265, B.foo(142))
+
+ assertEquals(365, foo(42))
+ assertEquals(423, bar)
+
+ assertEquals(12345, C.f())
+
+ return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/esModules/jsImport/plainNamed/externalPackageInDifferentFile.mjs b/js/js.translator/testData/box/esModules/jsImport/plainNamed/externalPackageInDifferentFile.mjs
new file mode 100644
index 0000000..05d3135
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsImport/plainNamed/externalPackageInDifferentFile.mjs
@@ -0,0 +1,21 @@
+function A(x) {
+ this.x = x;
+}
+A.prototype.foo = function (y) {
+ return this.x + y;
+};
+
+var B = {
+ x: 123,
+ foo: function(y) {
+ return this.x + y;
+ }
+};
+
+function foo(y) {
+ return 323 + y;
+}
+
+var bar = 423;
+
+export { A, B, foo, bar };
\ No newline at end of file
diff --git a/js/js.translator/testData/box/esModules/jsImport/plainNamed/interfaces.kt b/js/js.translator/testData/box/esModules/jsImport/plainNamed/interfaces.kt
new file mode 100644
index 0000000..7e3a8de
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsImport/plainNamed/interfaces.kt
@@ -0,0 +1,43 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// IGNORE_BACKEND: WASM
+// ES_MODULES
+// FILE: bar.kt
+package foo
+
+@JsImport("./interfaces.mjs")
+external interface Bar {
+ fun ping(): String
+}
+
+// FILE: baz.kt
+package boo
+
+@JsImport("./interfaces.mjs")
+external interface Baz {
+ fun pong(): Int
+}
+
+// FILE: root.kt
+import foo.Bar
+import boo.Baz
+
+@JsImport("./interfaces.mjs")
+external val bar: Bar
+
+@JsImport("./interfaces.mjs")
+external val baz: Baz
+
+// FILE: test.kt
+import boo.Baz
+
+fun box(): String {
+ if (bar.ping() != "ping" || baz.pong() != 194) return "Fail"
+
+ val local = object : Baz {
+ override fun pong(): Int = 322
+ }
+
+ if (local.asDynamic().pong() != 322) return "Fail"
+
+ return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/esModules/jsImport/plainNamed/interfaces.mjs b/js/js.translator/testData/box/esModules/jsImport/plainNamed/interfaces.mjs
new file mode 100644
index 0000000..b5027cc
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsImport/plainNamed/interfaces.mjs
@@ -0,0 +1,12 @@
+export var bar = {
+ ping() {
+ return "ping"
+ }
+};
+
+export var baz = {
+ pong() {
+ return 194
+ }
+};
+
diff --git a/js/js.translator/testData/box/esModules/jsImport/plainNamed/interfacesWithCompanion.kt b/js/js.translator/testData/box/esModules/jsImport/plainNamed/interfacesWithCompanion.kt
new file mode 100644
index 0000000..c3d5231
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsImport/plainNamed/interfacesWithCompanion.kt
@@ -0,0 +1,20 @@
+// TARGET_BACKEND: JS_IR
+// TARGET_BACKEND: JS_IR_ES6
+// EXPECTED_REACHABLE_NODES: 1238
+// ES_MODULES
+// FILE: bar.kt
+package bar
+
+@JsImport("./interfacesWithCompanion.mjs")
+external interface Bar {
+ companion object {
+ fun ok(): String
+ }
+}
+
+// FILE: test.kt
+import bar.Bar
+
+fun box(): String {
+ return Bar.ok()
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/esModules/jsImport/plainNamed/interfacesWithCompanion.mjs b/js/js.translator/testData/box/esModules/jsImport/plainNamed/interfacesWithCompanion.mjs
new file mode 100644
index 0000000..f5344ff
--- /dev/null
+++ b/js/js.translator/testData/box/esModules/jsImport/plainNamed/interfacesWithCompanion.mjs
@@ -0,0 +1,3 @@
+export const Bar = {
+ ok() { return "OK" }
+};
diff --git a/js/js.translator/testData/box/jsFileImport/default/externalClass.js b/js/js.translator/testData/box/jsFileImport/default/externalClass.js
new file mode 100644
index 0000000..ece1640
--- /dev/null
+++ b/js/js.translator/testData/box/jsFileImport/default/externalClass.js
@@ -0,0 +1,15 @@
+define("lib", [], function() {
+ function A(x) {
+ this.x = x;
+ }
+
+ A.prototype.foo = function (y) {
+ return this.x + y;
+ };
+
+ A.prototype.bar = function () {
+ return "(" + Array.prototype.join.call(arguments, "") + ")";
+ };
+
+ return A;
+})
\ No newline at end of file
diff --git a/js/js.translator/testData/box/jsFileImport/default/externalClass.kt b/js/js.translator/testData/box/jsFileImport/default/externalClass.kt
new file mode 100644
index 0000000..c8b3773
--- /dev/null
+++ b/js/js.translator/testData/box/jsFileImport/default/externalClass.kt
@@ -0,0 +1,34 @@
+// EXPECTED_REACHABLE_NODES: 1284
+// MODULE_KIND: AMD
+// DONT_TARGET_EXACT_BACKEND: JS
+
+@file:JsImport("lib")
+package foo
+
+@JsImport.Default
+external class A(x: Int = definedExternally) {
+ val x: Int
+
+ fun foo(y: Int): Int = definedExternally
+
+ fun bar(vararg arg: String): String = definedExternally
+}
+
+class C {
+ val e = arrayOf("e")
+ val f = arrayOf("f")
+ val a = A(1)
+
+ fun qux() = a.bar(*e, *f)
+}
+
+
+fun box(): String {
+ val a = A(23)
+ assertEquals(23, a.x)
+ assertEquals(65, a.foo(42))
+
+ assertEquals(C().qux(), "(ef)")
+
+ return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/jsFileImport/default/externalClassWithDefaults.js b/js/js.translator/testData/box/jsFileImport/default/externalClassWithDefaults.js
new file mode 100644
index 0000000..f6a1a6d
--- /dev/null
+++ b/js/js.translator/testData/box/jsFileImport/default/externalClassWithDefaults.js
@@ -0,0 +1,12 @@
+define("lib", [], function () {
+ function A(ss) {
+ this.s = ss || "A"
+ }
+ A.prototype.foo = function (y) {
+ return y || "K";
+ };
+ A.prototype.bar = function (y) {
+ return y || "O";
+ };
+ return A;
+})
diff --git a/js/js.translator/testData/box/jsFileImport/default/externalClassWithDefaults.kt b/js/js.translator/testData/box/jsFileImport/default/externalClassWithDefaults.kt
new file mode 100644
index 0000000..b173f999
--- /dev/null
+++ b/js/js.translator/testData/box/jsFileImport/default/externalClassWithDefaults.kt
@@ -0,0 +1,50 @@
+// EXPECTED_REACHABLE_NODES: 1284
+// MODULE_KIND: AMD
+// DONT_TARGET_EXACT_BACKEND: JS
+
+// DONT_TARGET_EXACT_BACKEND: WASM
+// WASM_MUTE_REASON: UNSUPPORTED_JS_INTEROP
+
+@file:JsImport("lib")
+package foo
+
+@JsImport.Default
+external open class A(ss: String = definedExternally) {
+ val s: String
+ fun foo(y: String = definedExternally): String = definedExternally
+ fun bar(y: String = definedExternally): String = definedExternally
+}
+
+class C: A {
+ constructor(ss: String) : super(ss) {}
+ constructor() : super() {}
+
+ fun qux(s: String = "O") = s
+}
+
+
+fun box(): String {
+ val a = A()
+ val c = C()
+
+ val r1 = a.foo("O") + c.foo()
+ if (r1 != "OK") return "Fail1: $r1"
+
+ val r2 = a.bar() + c.bar("K")
+ if (r2 != "OK") return "Fail2: $r2"
+
+ val r3 = c.qux() + c.qux("K")
+ if (r3 != "OK") return "Fail3: $r3"
+
+ if (a.s != "A") return "Fail4: ${a.s}"
+ if (c.s != "A") return "Fail5: ${c.s}"
+
+ val a2 = A("A2")
+ val c2 = C("C2")
+
+ val r6 = a2.s + c2.s
+ if (r6 != "A2C2") return "Fail6: $r6"
+
+ return "OK"
+
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/jsFileImport/default/externalConstructor.js b/js/js.translator/testData/box/jsFileImport/default/externalConstructor.js
new file mode 100644
index 0000000..61948a0
--- /dev/null
+++ b/js/js.translator/testData/box/jsFileImport/default/externalConstructor.js
@@ -0,0 +1,5 @@
+define("lib", [], function () {
+ return function (data) {
+ this.data = data
+ }
+})
diff --git a/js/js.translator/testData/box/jsFileImport/default/externalConstructor.kt b/js/js.translator/testData/box/jsFileImport/default/externalConstructor.kt
new file mode 100644
index 0000000..157e23c
--- /dev/null
+++ b/js/js.translator/testData/box/jsFileImport/default/externalConstructor.kt
@@ -0,0 +1,30 @@
+// EXPECTED_REACHABLE_NODES: 1334
+// MODULE_KIND: AMD
+// DONT_TARGET_EXACT_BACKEND: JS
+
+// DONT_TARGET_EXACT_BACKEND: WASM
+// WASM_MUTE_REASON: UNSUPPORTED_JS_INTEROP
+
+@file:JsImport("lib")
+package foo
+
+@JsImport.Default
+open external class A(data: String) {
+ constructor(data: Int)
+ constructor(data: Boolean)
+
+ val data: Any
+}
+
+class B(data: String) : A(data)
+
+class C(data: Int) : A(data)
+
+class D(data: Boolean) : A(data)
+
+fun box(): String {
+ assertEquals("13", B("13").data)
+ assertEquals(42, C(42).data)
+ assertEquals(true, D(true).data)
+ return "OK"
+}
diff --git a/js/js.translator/testData/box/jsFileImport/default/externalFunction.js b/js/js.translator/testData/box/jsFileImport/default/externalFunction.js
new file mode 100644
index 0000000..dfc1ec0
--- /dev/null
+++ b/js/js.translator/testData/box/jsFileImport/default/externalFunction.js
@@ -0,0 +1,5 @@
+define("lib", [], function () {
+ return function (y) {
+ return 23 + y;
+ }
+})
\ No newline at end of file
diff --git a/js/js.translator/testData/box/jsFileImport/default/externalFunction.kt b/js/js.translator/testData/box/jsFileImport/default/externalFunction.kt
new file mode 100644
index 0000000..fe0a1db
--- /dev/null
+++ b/js/js.translator/testData/box/jsFileImport/default/externalFunction.kt
@@ -0,0 +1,12 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// MODULE_KIND: AMD
+@file:JsImport("lib")
+package foo
+
+@JsImport.Default
+external fun foo(y: Int): Int = definedExternally
+
+fun box(): String {
+ assertEquals(65, foo(42))
+ return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/jsFileImport/default/externalFunctionNameClash.js b/js/js.translator/testData/box/jsFileImport/default/externalFunctionNameClash.js
new file mode 100644
index 0000000..e731aac
--- /dev/null
+++ b/js/js.translator/testData/box/jsFileImport/default/externalFunctionNameClash.js
@@ -0,0 +1,5 @@
+define("lib", [], function () {
+ return function(y) {
+ return 23 + y;
+ }
+})
\ No newline at end of file
diff --git a/js/js.translator/testData/box/jsFileImport/default/externalFunctionNameClash.kt b/js/js.translator/testData/box/jsFileImport/default/externalFunctionNameClash.kt
new file mode 100644
index 0000000..49cc5eb
--- /dev/null
+++ b/js/js.translator/testData/box/jsFileImport/default/externalFunctionNameClash.kt
@@ -0,0 +1,15 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// MODULE_KIND: AMD
+@file:JsImport("lib")
+package foo
+
+@JsImport.Default
+external fun foo(y: Int): Int = definedExternally
+
+fun foo(y: String): String = y + "K"
+
+fun box(): String {
+ val foo10 = foo(10)
+ if (foo10 != 33) return "Fail: $foo10"
+ return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/jsFileImport/default/externalObject.js b/js/js.translator/testData/box/jsFileImport/default/externalObject.js
new file mode 100644
index 0000000..9b17e88
--- /dev/null
+++ b/js/js.translator/testData/box/jsFileImport/default/externalObject.js
@@ -0,0 +1,8 @@
+define("lib", [], function () {
+ return {
+ x: 23,
+ foo: function(y) {
+ return this.x + y;
+ }
+ };
+})
\ No newline at end of file
diff --git a/js/js.translator/testData/box/jsFileImport/default/externalObject.kt b/js/js.translator/testData/box/jsFileImport/default/externalObject.kt
new file mode 100644
index 0000000..73cf5fd
--- /dev/null
+++ b/js/js.translator/testData/box/jsFileImport/default/externalObject.kt
@@ -0,0 +1,17 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// MODULE_KIND: AMD
+@file:JsImport("lib")
+package foo
+
+@JsImport.Default
+external object A {
+ val x: Int = definedExternally
+
+ fun foo(y: Int): Int = definedExternally
+}
+
+fun box(): String {
+ assertEquals(23, A.x)
+ assertEquals(65, A.foo(42))
+ return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/jsFileImport/default/externalProperty.js b/js/js.translator/testData/box/jsFileImport/default/externalProperty.js
new file mode 100644
index 0000000..c76f9e7
--- /dev/null
+++ b/js/js.translator/testData/box/jsFileImport/default/externalProperty.js
@@ -0,0 +1,3 @@
+define("lib", [], function () {
+ return 23;
+})
\ No newline at end of file
diff --git a/js/js.translator/testData/box/jsFileImport/default/externalProperty.kt b/js/js.translator/testData/box/jsFileImport/default/externalProperty.kt
new file mode 100644
index 0000000..3308bc4
--- /dev/null
+++ b/js/js.translator/testData/box/jsFileImport/default/externalProperty.kt
@@ -0,0 +1,12 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// MODULE_KIND: AMD
+@file:JsImport("lib")
+package foo
+
+@JsImport.Default
+external val foo: Int = definedExternally
+
+fun box(): String {
+ assertEquals(23, foo)
+ return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/jsFileImport/default/topLevelVarargFun.js b/js/js.translator/testData/box/jsFileImport/default/topLevelVarargFun.js
new file mode 100644
index 0000000..1d1fa0e
--- /dev/null
+++ b/js/js.translator/testData/box/jsFileImport/default/topLevelVarargFun.js
@@ -0,0 +1,5 @@
+define("lib", [], function () {
+ return function() {
+ return "(" + Array.prototype.join.call(arguments, "") + ")";
+ };
+})
diff --git a/js/js.translator/testData/box/jsFileImport/default/topLevelVarargFun.kt b/js/js.translator/testData/box/jsFileImport/default/topLevelVarargFun.kt
new file mode 100644
index 0000000..5e4b6f1
--- /dev/null
+++ b/js/js.translator/testData/box/jsFileImport/default/topLevelVarargFun.kt
@@ -0,0 +1,17 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// MODULE_KIND: AMD
+@file:JsImport("lib")
+
+@JsImport.Default
+external fun foo(vararg arg: String): String
+
+fun box(): String {
+ val x = arrayOf("a", "b")
+ var r = foo(*x)
+ if (r != "(ab)") return "fail1: $r"
+
+ r = foo("c", "d")
+ if (r != "(cd)") return "fail2: $r"
+
+ return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/jsFileImport/named/externalClass.js b/js/js.translator/testData/box/jsFileImport/named/externalClass.js
new file mode 100644
index 0000000..7df3adb
--- /dev/null
+++ b/js/js.translator/testData/box/jsFileImport/named/externalClass.js
@@ -0,0 +1,15 @@
+define("lib", [], function () {
+ function Foo(x) {
+ this.x = x;
+ }
+
+ Foo.prototype.foo = function (y) {
+ return this.x + y;
+ };
+
+ Foo.prototype.bar = function() {
+ return "(" + Array.prototype.join.call(arguments, "") + ")";
+ };
+
+ return { Foo };
+})
diff --git a/js/js.translator/testData/box/jsFileImport/named/externalClass.kt b/js/js.translator/testData/box/jsFileImport/named/externalClass.kt
new file mode 100644
index 0000000..f24f57f
--- /dev/null
+++ b/js/js.translator/testData/box/jsFileImport/named/externalClass.kt
@@ -0,0 +1,34 @@
+// EXPECTED_REACHABLE_NODES: 1284
+// MODULE_KIND: AMD
+// DONT_TARGET_EXACT_BACKEND: JS
+
+@file:JsImport("lib")
+package foo
+
+@JsImport.Name("Foo")
+external class A(x: Int = definedExternally) {
+ val x: Int
+
+ fun foo(y: Int): Int = definedExternally
+
+ fun bar(vararg arg: String): String = definedExternally
+}
+
+class C {
+ val e = arrayOf("e")
+ val f = arrayOf("f")
+ val a = A(1)
+
+ fun qux() = a.bar(*e, *f)
+}
+
+
+fun box(): String {
+ val a = A(23)
+ assertEquals(23, a.x)
+ assertEquals(65, a.foo(42))
+
+ assertEquals(C().qux(), "(ef)")
+
+ return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/jsFileImport/named/externalClassWithDefaults.js b/js/js.translator/testData/box/jsFileImport/named/externalClassWithDefaults.js
new file mode 100644
index 0000000..69bf9b5
--- /dev/null
+++ b/js/js.translator/testData/box/jsFileImport/named/externalClassWithDefaults.js
@@ -0,0 +1,13 @@
+define("lib", [], function () {
+ function Foo(ss) {
+ this.s = ss || "A"
+ }
+ Foo.prototype.foo = function (y) {
+ return y || "K";
+ };
+ Foo.prototype.bar = function (y) {
+ return y || "O";
+ };
+
+ return { Foo };
+})
diff --git a/js/js.translator/testData/box/jsFileImport/named/externalClassWithDefaults.kt b/js/js.translator/testData/box/jsFileImport/named/externalClassWithDefaults.kt
new file mode 100644
index 0000000..9de4844
--- /dev/null
+++ b/js/js.translator/testData/box/jsFileImport/named/externalClassWithDefaults.kt
@@ -0,0 +1,50 @@
+// EXPECTED_REACHABLE_NODES: 1284
+// MODULE_KIND: AMD
+// DONT_TARGET_EXACT_BACKEND: JS
+
+// DONT_TARGET_EXACT_BACKEND: WASM
+// WASM_MUTE_REASON: UNSUPPORTED_JS_INTEROP
+
+@file:JsImport("lib")
+package foo
+
+@JsImport.Name("Foo")
+external open class A(ss: String = definedExternally) {
+ val s: String
+ fun foo(y: String = definedExternally): String = definedExternally
+ fun bar(y: String = definedExternally): String = definedExternally
+}
+
+class C: A {
+ constructor(ss: String) : super(ss) {}
+ constructor() : super() {}
+
+ fun qux(s: String = "O") = s
+}
+
+
+fun box(): String {
+ val a = A()
+ val c = C()
+
+ val r1 = a.foo("O") + c.foo()
+ if (r1 != "OK") return "Fail1: $r1"
+
+ val r2 = a.bar() + c.bar("K")
+ if (r2 != "OK") return "Fail2: $r2"
+
+ val r3 = c.qux() + c.qux("K")
+ if (r3 != "OK") return "Fail3: $r3"
+
+ if (a.s != "A") return "Fail4: ${a.s}"
+ if (c.s != "A") return "Fail5: ${c.s}"
+
+ val a2 = A("A2")
+ val c2 = C("C2")
+
+ val r6 = a2.s + c2.s
+ if (r6 != "A2C2") return "Fail6: $r6"
+
+ return "OK"
+
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/jsFileImport/named/externalConstructor.js b/js/js.translator/testData/box/jsFileImport/named/externalConstructor.js
new file mode 100644
index 0000000..8718a67
--- /dev/null
+++ b/js/js.translator/testData/box/jsFileImport/named/externalConstructor.js
@@ -0,0 +1,6 @@
+define("lib", [], function () {
+ function Foo (data) {
+ this.data = data
+ };
+ return { Foo }
+})
diff --git a/js/js.translator/testData/box/jsFileImport/named/externalConstructor.kt b/js/js.translator/testData/box/jsFileImport/named/externalConstructor.kt
new file mode 100644
index 0000000..fcef185
--- /dev/null
+++ b/js/js.translator/testData/box/jsFileImport/named/externalConstructor.kt
@@ -0,0 +1,30 @@
+// EXPECTED_REACHABLE_NODES: 1334
+// MODULE_KIND: AMD
+// DONT_TARGET_EXACT_BACKEND: JS
+
+// DONT_TARGET_EXACT_BACKEND: WASM
+// WASM_MUTE_REASON: UNSUPPORTED_JS_INTEROP
+
+@file:JsImport("lib")
+package foo
+
+@JsImport.Name("Foo")
+open external class A(data: String) {
+ constructor(data: Int)
+ constructor(data: Boolean)
+
+ val data: Any
+}
+
+class B(data: String) : A(data)
+
+class C(data: Int) : A(data)
+
+class D(data: Boolean) : A(data)
+
+fun box(): String {
+ assertEquals("13", B("13").data)
+ assertEquals(42, C(42).data)
+ assertEquals(true, D(true).data)
+ return "OK"
+}
diff --git a/js/js.translator/testData/box/jsFileImport/named/externalFunction.js b/js/js.translator/testData/box/jsFileImport/named/externalFunction.js
new file mode 100644
index 0000000..41df583
--- /dev/null
+++ b/js/js.translator/testData/box/jsFileImport/named/externalFunction.js
@@ -0,0 +1,7 @@
+define("lib", [], function () {
+ function bar(y) {
+ return 23 + y;
+ }
+
+ return { bar }
+})
\ No newline at end of file
diff --git a/js/js.translator/testData/box/jsFileImport/named/externalFunction.kt b/js/js.translator/testData/box/jsFileImport/named/externalFunction.kt
new file mode 100644
index 0000000..04cb631
--- /dev/null
+++ b/js/js.translator/testData/box/jsFileImport/named/externalFunction.kt
@@ -0,0 +1,12 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// MODULE_KIND: AMD
+@file:JsImport("lib")
+package foo
+
+@JsImport.Name("bar")
+external fun foo(y: Int): Int = definedExternally
+
+fun box(): String {
+ assertEquals(65, foo(42))
+ return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/jsFileImport/named/externalFunctionNameClash.js b/js/js.translator/testData/box/jsFileImport/named/externalFunctionNameClash.js
new file mode 100644
index 0000000..41df583
--- /dev/null
+++ b/js/js.translator/testData/box/jsFileImport/named/externalFunctionNameClash.js
@@ -0,0 +1,7 @@
+define("lib", [], function () {
+ function bar(y) {
+ return 23 + y;
+ }
+
+ return { bar }
+})
\ No newline at end of file
diff --git a/js/js.translator/testData/box/jsFileImport/named/externalFunctionNameClash.kt b/js/js.translator/testData/box/jsFileImport/named/externalFunctionNameClash.kt
new file mode 100644
index 0000000..2836026
--- /dev/null
+++ b/js/js.translator/testData/box/jsFileImport/named/externalFunctionNameClash.kt
@@ -0,0 +1,15 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// MODULE_KIND: AMD
+@file:JsImport("lib")
+package foo
+
+@JsImport.Name("bar")
+external fun foo(y: Int): Int = definedExternally
+
+fun foo(y: String): String = y + "K"
+
+fun box(): String {
+ val foo10 = foo(10)
+ if (foo10 != 33) return "Fail: $foo10"
+ return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/jsFileImport/named/externalObject.js b/js/js.translator/testData/box/jsFileImport/named/externalObject.js
new file mode 100644
index 0000000..2961c453
--- /dev/null
+++ b/js/js.translator/testData/box/jsFileImport/named/externalObject.js
@@ -0,0 +1,10 @@
+define("lib", [], function () {
+ const O = {
+ x: 23,
+ foo: function(y) {
+ return this.x + y;
+ }
+ };
+
+ return { O }
+})
\ No newline at end of file
diff --git a/js/js.translator/testData/box/jsFileImport/named/externalObject.kt b/js/js.translator/testData/box/jsFileImport/named/externalObject.kt
new file mode 100644
index 0000000..b6d8779
--- /dev/null
+++ b/js/js.translator/testData/box/jsFileImport/named/externalObject.kt
@@ -0,0 +1,17 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// MODULE_KIND: AMD
+@file:JsImport("lib")
+package foo
+
+@JsImport.Name("O")
+external object A {
+ val x: Int = definedExternally
+
+ fun foo(y: Int): Int = definedExternally
+}
+
+fun box(): String {
+ assertEquals(23, A.x)
+ assertEquals(65, A.foo(42))
+ return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/jsFileImport/named/externalProperty.js b/js/js.translator/testData/box/jsFileImport/named/externalProperty.js
new file mode 100644
index 0000000..2c0d2ca
--- /dev/null
+++ b/js/js.translator/testData/box/jsFileImport/named/externalProperty.js
@@ -0,0 +1,4 @@
+define("lib", [], function () {
+ const bar = 23;
+ return { bar }
+})
\ No newline at end of file
diff --git a/js/js.translator/testData/box/jsFileImport/named/externalProperty.kt b/js/js.translator/testData/box/jsFileImport/named/externalProperty.kt
new file mode 100644
index 0000000..a84fad1
--- /dev/null
+++ b/js/js.translator/testData/box/jsFileImport/named/externalProperty.kt
@@ -0,0 +1,12 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// MODULE_KIND: AMD
+@file:JsImport("lib")
+package foo
+
+@JsImport.Name("bar")
+external val foo: Int = definedExternally
+
+fun box(): String {
+ assertEquals(23, foo)
+ return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/jsFileImport/named/topLevelVarargFun.js b/js/js.translator/testData/box/jsFileImport/named/topLevelVarargFun.js
new file mode 100644
index 0000000..dbc0a37
--- /dev/null
+++ b/js/js.translator/testData/box/jsFileImport/named/topLevelVarargFun.js
@@ -0,0 +1,6 @@
+define("lib", [], function () {
+ function bar() {
+ return "(" + Array.prototype.join.call(arguments, "") + ")";
+ }
+ return { bar }
+})
diff --git a/js/js.translator/testData/box/jsFileImport/named/topLevelVarargFun.kt b/js/js.translator/testData/box/jsFileImport/named/topLevelVarargFun.kt
new file mode 100644
index 0000000..b8ceb60
--- /dev/null
+++ b/js/js.translator/testData/box/jsFileImport/named/topLevelVarargFun.kt
@@ -0,0 +1,17 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// MODULE_KIND: AMD
+@file:JsImport("lib")
+
+@JsImport.Name("bar")
+external fun foo(vararg arg: String): String
+
+fun box(): String {
+ val x = arrayOf("a", "b")
+ var r = foo(*x)
+ if (r != "(ab)") return "fail1: $r"
+
+ r = foo("c", "d")
+ if (r != "(cd)") return "fail2: $r"
+
+ return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/jsFileImport/plainNamed/externalClassNameClash.kt b/js/js.translator/testData/box/jsFileImport/plainNamed/externalClassNameClash.kt
new file mode 100644
index 0000000..adbd3c8
--- /dev/null
+++ b/js/js.translator/testData/box/jsFileImport/plainNamed/externalClassNameClash.kt
@@ -0,0 +1,69 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// MODULE_KIND: AMD
+// FILE: a.kt
+@file:JsImport("a")
+package a
+
+external class A {
+ fun foo(): String
+}
+
+external fun bar(): Int
+
+external val prop: Int
+
+// FILE: b.kt
+@file:JsImport("b")
+package b
+
+external class A {
+ fun foo(): String
+}
+
+external fun bar(): Int
+
+external val prop: Int
+
+// FILE: main.kt
+
+import a.A as O
+import b.A as K
+
+fun box(): String {
+ if (a.bar() != 1) return "fail 1"
+ if (a.prop != 10) return "fail 2"
+ if (b.bar() != 2) return "fail 3"
+ if (b.prop != 20) return "fail 4"
+
+ return O().foo() + K().foo()
+}
+
+// FILE: a.js
+define("a", [], function () {
+ function A() {}
+
+ A.prototype.foo = function () {
+ return "O";
+ };
+
+ function bar() { return 1; }
+
+ let prop = 10
+
+ return { A, bar, prop }
+})
+
+// FILE: b.js
+define("b", [], function () {
+ function A() {}
+
+ A.prototype.foo = function () {
+ return "K";
+ };
+
+ function bar() { return 2; }
+
+ let prop = 20;
+
+ return { A, bar, prop }
+})
\ No newline at end of file
diff --git a/js/js.translator/testData/box/jsFileImport/plainNamed/externalPackage.js b/js/js.translator/testData/box/jsFileImport/plainNamed/externalPackage.js
new file mode 100644
index 0000000..d8004d8
--- /dev/null
+++ b/js/js.translator/testData/box/jsFileImport/plainNamed/externalPackage.js
@@ -0,0 +1,28 @@
+define("lib", [], function () {
+ function A(x) {
+ this.x = x;
+ }
+ A.prototype.foo = function (y) {
+ return this.x + y;
+ };
+
+ function Nested() {
+ this.y = 55;
+ }
+ A.Nested = Nested;
+
+ var B = {
+ x: 123,
+ foo: function(y) {
+ return this.x + y;
+ }
+ };
+
+ function foo(y) {
+ return 323 + y;
+ }
+
+ var bar = 423;
+
+ return { A, B, foo, bar }
+})
diff --git a/js/js.translator/testData/box/jsFileImport/plainNamed/externalPackage.kt b/js/js.translator/testData/box/jsFileImport/plainNamed/externalPackage.kt
new file mode 100644
index 0000000..40557de
--- /dev/null
+++ b/js/js.translator/testData/box/jsFileImport/plainNamed/externalPackage.kt
@@ -0,0 +1,45 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// MODULE_KIND: AMD
+// FILE: a.kt
+@file:JsImport("lib")
+package foo
+
+external class A(x: Int) {
+ val x: Int
+
+ fun foo(y: Int): Int = definedExternally
+
+ class Nested {
+ val y: Int
+ }
+}
+
+external object B {
+ val x: Int = definedExternally
+
+ fun foo(y: Int): Int = definedExternally
+}
+
+external fun foo(y: Int): Int = definedExternally
+
+external val bar: Int = definedExternally
+
+// FILE: b.kt
+package foo
+
+fun box(): String {
+ val a = A(23)
+ assertEquals(23, a.x)
+ assertEquals(65, a.foo(42))
+
+ val nested = A.Nested()
+ assertEquals(55, nested.y)
+
+ assertEquals(123, B.x)
+ assertEquals(265, B.foo(142))
+
+ assertEquals(365, foo(42))
+ assertEquals(423, bar)
+
+ return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/jsFileImport/plainNamed/externalPackageInDifferentFile.js b/js/js.translator/testData/box/jsFileImport/plainNamed/externalPackageInDifferentFile.js
new file mode 100644
index 0000000..7034601
--- /dev/null
+++ b/js/js.translator/testData/box/jsFileImport/plainNamed/externalPackageInDifferentFile.js
@@ -0,0 +1,29 @@
+C = {
+ f: function() {
+ return 12345;
+ }
+};
+
+define("lib", [], function () {
+ function A(x) {
+ this.x = x;
+ }
+ A.prototype.foo = function (y) {
+ return this.x + y;
+ };
+
+ var B = {
+ x: 123,
+ foo: function(y) {
+ return this.x + y;
+ }
+ };
+
+ function foo(y) {
+ return 323 + y;
+ }
+
+ var bar = 423;
+
+ return { A, B, foo, bar };
+})
diff --git a/js/js.translator/testData/box/jsFileImport/plainNamed/externalPackageInDifferentFile.kt b/js/js.translator/testData/box/jsFileImport/plainNamed/externalPackageInDifferentFile.kt
new file mode 100644
index 0000000..38504bc
--- /dev/null
+++ b/js/js.translator/testData/box/jsFileImport/plainNamed/externalPackageInDifferentFile.kt
@@ -0,0 +1,47 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// MODULE_KIND: AMD
+// FILE: lib.kt
+@file:JsImport("lib")
+package foo
+
+external class A(x: Int = definedExternally) {
+ val x: Int
+
+ fun foo(y: Int): Int = definedExternally
+}
+
+external object B {
+ val x: Int = definedExternally
+
+ fun foo(y: Int): Int = definedExternally
+}
+
+external fun foo(y: Int): Int = definedExternally
+
+external val bar: Int = definedExternally
+
+// FILE: lib2.kt
+package foo
+
+external object C {
+ fun f(): Int = definedExternally
+}
+
+// FILE: main.kt
+package foo
+
+fun box(): String {
+ val a = A(23)
+ assertEquals(23, a.x)
+ assertEquals(65, a.foo(42))
+
+ assertEquals(123, B.x)
+ assertEquals(265, B.foo(142))
+
+ assertEquals(365, foo(42))
+ assertEquals(423, bar)
+
+ assertEquals(12345, C.f())
+
+ return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/jsFileImport/plainNamed/interfaces.js b/js/js.translator/testData/box/jsFileImport/plainNamed/interfaces.js
new file mode 100644
index 0000000..3147a35
--- /dev/null
+++ b/js/js.translator/testData/box/jsFileImport/plainNamed/interfaces.js
@@ -0,0 +1,15 @@
+define("lib", [], function () {
+ var bar = {
+ ping() {
+ return "ping"
+ }
+ };
+
+ var baz = {
+ pong() {
+ return 194
+ }
+ };
+
+ return { bar, baz }
+})
diff --git a/js/js.translator/testData/box/jsFileImport/plainNamed/interfaces.kt b/js/js.translator/testData/box/jsFileImport/plainNamed/interfaces.kt
new file mode 100644
index 0000000..a12785d
--- /dev/null
+++ b/js/js.translator/testData/box/jsFileImport/plainNamed/interfaces.kt
@@ -0,0 +1,43 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// IGNORE_BACKEND: WASM
+// MODULE_KIND: AMD
+// FILE: bar.kt
+@file:JsImport("lib")
+package foo
+
+external interface Bar {
+ fun ping(): String
+}
+
+// FILE: baz.kt
+@file:JsImport("lib")
+package boo
+
+external interface Baz {
+ fun pong(): Int
+}
+
+// FILE: root.kt
+@file:JsImport("lib")
+
+import foo.Bar
+import boo.Baz
+
+external val bar: Bar
+
+external val baz: Baz
+
+// FILE: test.kt
+import boo.Baz
+
+fun box(): String {
+ if (bar.ping() != "ping" || baz.pong() != 194) return "Fail"
+
+ val local = object : Baz {
+ override fun pong(): Int = 322
+ }
+
+ if (local.asDynamic().pong() != 322) return "Fail"
+
+ return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/jsFileImport/plainNamed/interfacesWithCompanion.js b/js/js.translator/testData/box/jsFileImport/plainNamed/interfacesWithCompanion.js
new file mode 100644
index 0000000..f3d161d
--- /dev/null
+++ b/js/js.translator/testData/box/jsFileImport/plainNamed/interfacesWithCompanion.js
@@ -0,0 +1,7 @@
+define("lib", [], function () {
+ const Bar = {
+ ok() { return "OK" }
+ };
+
+ return { Bar }
+})
diff --git a/js/js.translator/testData/box/jsFileImport/plainNamed/interfacesWithCompanion.kt b/js/js.translator/testData/box/jsFileImport/plainNamed/interfacesWithCompanion.kt
new file mode 100644
index 0000000..af8a58a
--- /dev/null
+++ b/js/js.translator/testData/box/jsFileImport/plainNamed/interfacesWithCompanion.kt
@@ -0,0 +1,20 @@
+// TARGET_BACKEND: JS_IR
+// TARGET_BACKEND: JS_IR_ES6
+// EXPECTED_REACHABLE_NODES: 1238
+// MODULE_KIND: AMD
+// FILE: bar.kt
+@file:JsImport("lib")
+package bar
+
+external interface Bar {
+ companion object {
+ fun ok(): String
+ }
+}
+
+// FILE: test.kt
+import bar.Bar
+
+fun box(): String {
+ return Bar.ok()
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/jsImport/default/externalClass.js b/js/js.translator/testData/box/jsImport/default/externalClass.js
new file mode 100644
index 0000000..ece1640
--- /dev/null
+++ b/js/js.translator/testData/box/jsImport/default/externalClass.js
@@ -0,0 +1,15 @@
+define("lib", [], function() {
+ function A(x) {
+ this.x = x;
+ }
+
+ A.prototype.foo = function (y) {
+ return this.x + y;
+ };
+
+ A.prototype.bar = function () {
+ return "(" + Array.prototype.join.call(arguments, "") + ")";
+ };
+
+ return A;
+})
\ No newline at end of file
diff --git a/js/js.translator/testData/box/jsImport/default/externalClass.kt b/js/js.translator/testData/box/jsImport/default/externalClass.kt
new file mode 100644
index 0000000..6675ed8
--- /dev/null
+++ b/js/js.translator/testData/box/jsImport/default/externalClass.kt
@@ -0,0 +1,34 @@
+// EXPECTED_REACHABLE_NODES: 1284
+// MODULE_KIND: AMD
+// DONT_TARGET_EXACT_BACKEND: JS
+
+package foo
+
+@JsImport("lib")
+@JsImport.Default
+external class A(x: Int = definedExternally) {
+ val x: Int
+
+ fun foo(y: Int): Int = definedExternally
+
+ fun bar(vararg arg: String): String = definedExternally
+}
+
+class C {
+ val e = arrayOf("e")
+ val f = arrayOf("f")
+ val a = A(1)
+
+ fun qux() = a.bar(*e, *f)
+}
+
+
+fun box(): String {
+ val a = A(23)
+ assertEquals(23, a.x)
+ assertEquals(65, a.foo(42))
+
+ assertEquals(C().qux(), "(ef)")
+
+ return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/jsImport/default/externalClassWithDefaults.js b/js/js.translator/testData/box/jsImport/default/externalClassWithDefaults.js
new file mode 100644
index 0000000..f6a1a6d
--- /dev/null
+++ b/js/js.translator/testData/box/jsImport/default/externalClassWithDefaults.js
@@ -0,0 +1,12 @@
+define("lib", [], function () {
+ function A(ss) {
+ this.s = ss || "A"
+ }
+ A.prototype.foo = function (y) {
+ return y || "K";
+ };
+ A.prototype.bar = function (y) {
+ return y || "O";
+ };
+ return A;
+})
diff --git a/js/js.translator/testData/box/jsImport/default/externalClassWithDefaults.kt b/js/js.translator/testData/box/jsImport/default/externalClassWithDefaults.kt
new file mode 100644
index 0000000..13d6409
--- /dev/null
+++ b/js/js.translator/testData/box/jsImport/default/externalClassWithDefaults.kt
@@ -0,0 +1,50 @@
+// EXPECTED_REACHABLE_NODES: 1284
+// MODULE_KIND: AMD
+// DONT_TARGET_EXACT_BACKEND: JS
+
+// DONT_TARGET_EXACT_BACKEND: WASM
+// WASM_MUTE_REASON: UNSUPPORTED_JS_INTEROP
+
+package foo
+
+@JsImport("lib")
+@JsImport.Default
+external open class A(ss: String = definedExternally) {
+ val s: String
+ fun foo(y: String = definedExternally): String = definedExternally
+ fun bar(y: String = definedExternally): String = definedExternally
+}
+
+class C: A {
+ constructor(ss: String) : super(ss) {}
+ constructor() : super() {}
+
+ fun qux(s: String = "O") = s
+}
+
+
+fun box(): String {
+ val a = A()
+ val c = C()
+
+ val r1 = a.foo("O") + c.foo()
+ if (r1 != "OK") return "Fail1: $r1"
+
+ val r2 = a.bar() + c.bar("K")
+ if (r2 != "OK") return "Fail2: $r2"
+
+ val r3 = c.qux() + c.qux("K")
+ if (r3 != "OK") return "Fail3: $r3"
+
+ if (a.s != "A") return "Fail4: ${a.s}"
+ if (c.s != "A") return "Fail5: ${c.s}"
+
+ val a2 = A("A2")
+ val c2 = C("C2")
+
+ val r6 = a2.s + c2.s
+ if (r6 != "A2C2") return "Fail6: $r6"
+
+ return "OK"
+
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/jsImport/default/externalConstructor.js b/js/js.translator/testData/box/jsImport/default/externalConstructor.js
new file mode 100644
index 0000000..61948a0
--- /dev/null
+++ b/js/js.translator/testData/box/jsImport/default/externalConstructor.js
@@ -0,0 +1,5 @@
+define("lib", [], function () {
+ return function (data) {
+ this.data = data
+ }
+})
diff --git a/js/js.translator/testData/box/jsImport/default/externalConstructor.kt b/js/js.translator/testData/box/jsImport/default/externalConstructor.kt
new file mode 100644
index 0000000..5ce1142
--- /dev/null
+++ b/js/js.translator/testData/box/jsImport/default/externalConstructor.kt
@@ -0,0 +1,30 @@
+// EXPECTED_REACHABLE_NODES: 1334
+// MODULE_KIND: AMD
+// DONT_TARGET_EXACT_BACKEND: JS
+
+// DONT_TARGET_EXACT_BACKEND: WASM
+// WASM_MUTE_REASON: UNSUPPORTED_JS_INTEROP
+
+package foo
+
+@JsImport("lib")
+@JsImport.Default
+open external class A(data: String) {
+ constructor(data: Int)
+ constructor(data: Boolean)
+
+ val data: Any
+}
+
+class B(data: String) : A(data)
+
+class C(data: Int) : A(data)
+
+class D(data: Boolean) : A(data)
+
+fun box(): String {
+ assertEquals("13", B("13").data)
+ assertEquals(42, C(42).data)
+ assertEquals(true, D(true).data)
+ return "OK"
+}
diff --git a/js/js.translator/testData/box/jsImport/default/externalFunction.js b/js/js.translator/testData/box/jsImport/default/externalFunction.js
new file mode 100644
index 0000000..dfc1ec0
--- /dev/null
+++ b/js/js.translator/testData/box/jsImport/default/externalFunction.js
@@ -0,0 +1,5 @@
+define("lib", [], function () {
+ return function (y) {
+ return 23 + y;
+ }
+})
\ No newline at end of file
diff --git a/js/js.translator/testData/box/jsImport/default/externalFunction.kt b/js/js.translator/testData/box/jsImport/default/externalFunction.kt
new file mode 100644
index 0000000..9362ab3
--- /dev/null
+++ b/js/js.translator/testData/box/jsImport/default/externalFunction.kt
@@ -0,0 +1,12 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// MODULE_KIND: AMD
+package foo
+
+@JsImport("lib")
+@JsImport.Default
+external fun foo(y: Int): Int = definedExternally
+
+fun box(): String {
+ assertEquals(65, foo(42))
+ return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/jsImport/default/externalFunctionNameClash.js b/js/js.translator/testData/box/jsImport/default/externalFunctionNameClash.js
new file mode 100644
index 0000000..e731aac
--- /dev/null
+++ b/js/js.translator/testData/box/jsImport/default/externalFunctionNameClash.js
@@ -0,0 +1,5 @@
+define("lib", [], function () {
+ return function(y) {
+ return 23 + y;
+ }
+})
\ No newline at end of file
diff --git a/js/js.translator/testData/box/jsImport/default/externalFunctionNameClash.kt b/js/js.translator/testData/box/jsImport/default/externalFunctionNameClash.kt
new file mode 100644
index 0000000..16e54ea
--- /dev/null
+++ b/js/js.translator/testData/box/jsImport/default/externalFunctionNameClash.kt
@@ -0,0 +1,15 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// MODULE_KIND: AMD
+package foo
+
+@JsImport("lib")
+@JsImport.Default
+external fun foo(y: Int): Int = definedExternally
+
+fun foo(y: String): String = y + "K"
+
+fun box(): String {
+ val foo10 = foo(10)
+ if (foo10 != 33) return "Fail: $foo10"
+ return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/jsImport/default/externalObject.js b/js/js.translator/testData/box/jsImport/default/externalObject.js
new file mode 100644
index 0000000..9b17e88
--- /dev/null
+++ b/js/js.translator/testData/box/jsImport/default/externalObject.js
@@ -0,0 +1,8 @@
+define("lib", [], function () {
+ return {
+ x: 23,
+ foo: function(y) {
+ return this.x + y;
+ }
+ };
+})
\ No newline at end of file
diff --git a/js/js.translator/testData/box/jsImport/default/externalObject.kt b/js/js.translator/testData/box/jsImport/default/externalObject.kt
new file mode 100644
index 0000000..bfc2dcd
--- /dev/null
+++ b/js/js.translator/testData/box/jsImport/default/externalObject.kt
@@ -0,0 +1,17 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// MODULE_KIND: AMD
+package foo
+
+@JsImport("lib")
+@JsImport.Default
+external object A {
+ val x: Int = definedExternally
+
+ fun foo(y: Int): Int = definedExternally
+}
+
+fun box(): String {
+ assertEquals(23, A.x)
+ assertEquals(65, A.foo(42))
+ return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/jsImport/default/externalProperty.js b/js/js.translator/testData/box/jsImport/default/externalProperty.js
new file mode 100644
index 0000000..c76f9e7
--- /dev/null
+++ b/js/js.translator/testData/box/jsImport/default/externalProperty.js
@@ -0,0 +1,3 @@
+define("lib", [], function () {
+ return 23;
+})
\ No newline at end of file
diff --git a/js/js.translator/testData/box/jsImport/default/externalProperty.kt b/js/js.translator/testData/box/jsImport/default/externalProperty.kt
new file mode 100644
index 0000000..4b22ba3
--- /dev/null
+++ b/js/js.translator/testData/box/jsImport/default/externalProperty.kt
@@ -0,0 +1,12 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// MODULE_KIND: AMD
+package foo
+
+@JsImport("lib")
+@JsImport.Default
+external val foo: Int = definedExternally
+
+fun box(): String {
+ assertEquals(23, foo)
+ return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/jsImport/default/topLevelVarargFun.js b/js/js.translator/testData/box/jsImport/default/topLevelVarargFun.js
new file mode 100644
index 0000000..1d1fa0e
--- /dev/null
+++ b/js/js.translator/testData/box/jsImport/default/topLevelVarargFun.js
@@ -0,0 +1,5 @@
+define("lib", [], function () {
+ return function() {
+ return "(" + Array.prototype.join.call(arguments, "") + ")";
+ };
+})
diff --git a/js/js.translator/testData/box/jsImport/default/topLevelVarargFun.kt b/js/js.translator/testData/box/jsImport/default/topLevelVarargFun.kt
new file mode 100644
index 0000000..4014159
--- /dev/null
+++ b/js/js.translator/testData/box/jsImport/default/topLevelVarargFun.kt
@@ -0,0 +1,16 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// MODULE_KIND: AMD
+@JsImport("lib")
+@JsImport.Default
+external fun foo(vararg arg: String): String
+
+fun box(): String {
+ val x = arrayOf("a", "b")
+ var r = foo(*x)
+ if (r != "(ab)") return "fail1: $r"
+
+ r = foo("c", "d")
+ if (r != "(cd)") return "fail2: $r"
+
+ return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/jsImport/named/externalClass.js b/js/js.translator/testData/box/jsImport/named/externalClass.js
new file mode 100644
index 0000000..7df3adb
--- /dev/null
+++ b/js/js.translator/testData/box/jsImport/named/externalClass.js
@@ -0,0 +1,15 @@
+define("lib", [], function () {
+ function Foo(x) {
+ this.x = x;
+ }
+
+ Foo.prototype.foo = function (y) {
+ return this.x + y;
+ };
+
+ Foo.prototype.bar = function() {
+ return "(" + Array.prototype.join.call(arguments, "") + ")";
+ };
+
+ return { Foo };
+})
diff --git a/js/js.translator/testData/box/jsImport/named/externalClass.kt b/js/js.translator/testData/box/jsImport/named/externalClass.kt
new file mode 100644
index 0000000..2153e0e
--- /dev/null
+++ b/js/js.translator/testData/box/jsImport/named/externalClass.kt
@@ -0,0 +1,34 @@
+// EXPECTED_REACHABLE_NODES: 1284
+// MODULE_KIND: AMD
+// DONT_TARGET_EXACT_BACKEND: JS
+
+package foo
+
+@JsImport("lib")
+@JsImport.Name("Foo")
+external class A(x: Int = definedExternally) {
+ val x: Int
+
+ fun foo(y: Int): Int = definedExternally
+
+ fun bar(vararg arg: String): String = definedExternally
+}
+
+class C {
+ val e = arrayOf("e")
+ val f = arrayOf("f")
+ val a = A(1)
+
+ fun qux() = a.bar(*e, *f)
+}
+
+
+fun box(): String {
+ val a = A(23)
+ assertEquals(23, a.x)
+ assertEquals(65, a.foo(42))
+
+ assertEquals(C().qux(), "(ef)")
+
+ return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/jsImport/named/externalClassWithDefaults.js b/js/js.translator/testData/box/jsImport/named/externalClassWithDefaults.js
new file mode 100644
index 0000000..69bf9b5
--- /dev/null
+++ b/js/js.translator/testData/box/jsImport/named/externalClassWithDefaults.js
@@ -0,0 +1,13 @@
+define("lib", [], function () {
+ function Foo(ss) {
+ this.s = ss || "A"
+ }
+ Foo.prototype.foo = function (y) {
+ return y || "K";
+ };
+ Foo.prototype.bar = function (y) {
+ return y || "O";
+ };
+
+ return { Foo };
+})
diff --git a/js/js.translator/testData/box/jsImport/named/externalClassWithDefaults.kt b/js/js.translator/testData/box/jsImport/named/externalClassWithDefaults.kt
new file mode 100644
index 0000000..2778325
--- /dev/null
+++ b/js/js.translator/testData/box/jsImport/named/externalClassWithDefaults.kt
@@ -0,0 +1,50 @@
+// EXPECTED_REACHABLE_NODES: 1284
+// MODULE_KIND: AMD
+// DONT_TARGET_EXACT_BACKEND: JS
+
+// DONT_TARGET_EXACT_BACKEND: WASM
+// WASM_MUTE_REASON: UNSUPPORTED_JS_INTEROP
+
+package foo
+
+@JsImport("lib")
+@JsImport.Name("Foo")
+external open class A(ss: String = definedExternally) {
+ val s: String
+ fun foo(y: String = definedExternally): String = definedExternally
+ fun bar(y: String = definedExternally): String = definedExternally
+}
+
+class C: A {
+ constructor(ss: String) : super(ss) {}
+ constructor() : super() {}
+
+ fun qux(s: String = "O") = s
+}
+
+
+fun box(): String {
+ val a = A()
+ val c = C()
+
+ val r1 = a.foo("O") + c.foo()
+ if (r1 != "OK") return "Fail1: $r1"
+
+ val r2 = a.bar() + c.bar("K")
+ if (r2 != "OK") return "Fail2: $r2"
+
+ val r3 = c.qux() + c.qux("K")
+ if (r3 != "OK") return "Fail3: $r3"
+
+ if (a.s != "A") return "Fail4: ${a.s}"
+ if (c.s != "A") return "Fail5: ${c.s}"
+
+ val a2 = A("A2")
+ val c2 = C("C2")
+
+ val r6 = a2.s + c2.s
+ if (r6 != "A2C2") return "Fail6: $r6"
+
+ return "OK"
+
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/jsImport/named/externalConstructor.js b/js/js.translator/testData/box/jsImport/named/externalConstructor.js
new file mode 100644
index 0000000..8718a67
--- /dev/null
+++ b/js/js.translator/testData/box/jsImport/named/externalConstructor.js
@@ -0,0 +1,6 @@
+define("lib", [], function () {
+ function Foo (data) {
+ this.data = data
+ };
+ return { Foo }
+})
diff --git a/js/js.translator/testData/box/jsImport/named/externalConstructor.kt b/js/js.translator/testData/box/jsImport/named/externalConstructor.kt
new file mode 100644
index 0000000..d0ff370
--- /dev/null
+++ b/js/js.translator/testData/box/jsImport/named/externalConstructor.kt
@@ -0,0 +1,30 @@
+// EXPECTED_REACHABLE_NODES: 1334
+// MODULE_KIND: AMD
+// DONT_TARGET_EXACT_BACKEND: JS
+
+// DONT_TARGET_EXACT_BACKEND: WASM
+// WASM_MUTE_REASON: UNSUPPORTED_JS_INTEROP
+
+package foo
+
+@JsImport("lib")
+@JsImport.Name("Foo")
+open external class A(data: String) {
+ constructor(data: Int)
+ constructor(data: Boolean)
+
+ val data: Any
+}
+
+class B(data: String) : A(data)
+
+class C(data: Int) : A(data)
+
+class D(data: Boolean) : A(data)
+
+fun box(): String {
+ assertEquals("13", B("13").data)
+ assertEquals(42, C(42).data)
+ assertEquals(true, D(true).data)
+ return "OK"
+}
diff --git a/js/js.translator/testData/box/jsImport/named/externalFunction.js b/js/js.translator/testData/box/jsImport/named/externalFunction.js
new file mode 100644
index 0000000..41df583
--- /dev/null
+++ b/js/js.translator/testData/box/jsImport/named/externalFunction.js
@@ -0,0 +1,7 @@
+define("lib", [], function () {
+ function bar(y) {
+ return 23 + y;
+ }
+
+ return { bar }
+})
\ No newline at end of file
diff --git a/js/js.translator/testData/box/jsImport/named/externalFunction.kt b/js/js.translator/testData/box/jsImport/named/externalFunction.kt
new file mode 100644
index 0000000..dd7cf87
--- /dev/null
+++ b/js/js.translator/testData/box/jsImport/named/externalFunction.kt
@@ -0,0 +1,12 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// MODULE_KIND: AMD
+package foo
+
+@JsImport("lib")
+@JsImport.Name("bar")
+external fun foo(y: Int): Int = definedExternally
+
+fun box(): String {
+ assertEquals(65, foo(42))
+ return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/jsImport/named/externalFunctionNameClash.js b/js/js.translator/testData/box/jsImport/named/externalFunctionNameClash.js
new file mode 100644
index 0000000..41df583
--- /dev/null
+++ b/js/js.translator/testData/box/jsImport/named/externalFunctionNameClash.js
@@ -0,0 +1,7 @@
+define("lib", [], function () {
+ function bar(y) {
+ return 23 + y;
+ }
+
+ return { bar }
+})
\ No newline at end of file
diff --git a/js/js.translator/testData/box/jsImport/named/externalFunctionNameClash.kt b/js/js.translator/testData/box/jsImport/named/externalFunctionNameClash.kt
new file mode 100644
index 0000000..6864ed1
--- /dev/null
+++ b/js/js.translator/testData/box/jsImport/named/externalFunctionNameClash.kt
@@ -0,0 +1,15 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// MODULE_KIND: AMD
+package foo
+
+@JsImport("lib")
+@JsImport.Name("bar")
+external fun foo(y: Int): Int = definedExternally
+
+fun foo(y: String): String = y + "K"
+
+fun box(): String {
+ val foo10 = foo(10)
+ if (foo10 != 33) return "Fail: $foo10"
+ return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/jsImport/named/externalObject.js b/js/js.translator/testData/box/jsImport/named/externalObject.js
new file mode 100644
index 0000000..2961c453
--- /dev/null
+++ b/js/js.translator/testData/box/jsImport/named/externalObject.js
@@ -0,0 +1,10 @@
+define("lib", [], function () {
+ const O = {
+ x: 23,
+ foo: function(y) {
+ return this.x + y;
+ }
+ };
+
+ return { O }
+})
\ No newline at end of file
diff --git a/js/js.translator/testData/box/jsImport/named/externalObject.kt b/js/js.translator/testData/box/jsImport/named/externalObject.kt
new file mode 100644
index 0000000..6369e97
--- /dev/null
+++ b/js/js.translator/testData/box/jsImport/named/externalObject.kt
@@ -0,0 +1,17 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// MODULE_KIND: AMD
+package foo
+
+@JsImport("lib")
+@JsImport.Name("O")
+external object A {
+ val x: Int = definedExternally
+
+ fun foo(y: Int): Int = definedExternally
+}
+
+fun box(): String {
+ assertEquals(23, A.x)
+ assertEquals(65, A.foo(42))
+ return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/jsImport/named/externalProperty.js b/js/js.translator/testData/box/jsImport/named/externalProperty.js
new file mode 100644
index 0000000..2c0d2ca
--- /dev/null
+++ b/js/js.translator/testData/box/jsImport/named/externalProperty.js
@@ -0,0 +1,4 @@
+define("lib", [], function () {
+ const bar = 23;
+ return { bar }
+})
\ No newline at end of file
diff --git a/js/js.translator/testData/box/jsImport/named/externalProperty.kt b/js/js.translator/testData/box/jsImport/named/externalProperty.kt
new file mode 100644
index 0000000..038e029
--- /dev/null
+++ b/js/js.translator/testData/box/jsImport/named/externalProperty.kt
@@ -0,0 +1,12 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// MODULE_KIND: AMD
+package foo
+
+@JsImport("lib")
+@JsImport.Name("bar")
+external val foo: Int = definedExternally
+
+fun box(): String {
+ assertEquals(23, foo)
+ return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/jsImport/named/topLevelVarargFun.js b/js/js.translator/testData/box/jsImport/named/topLevelVarargFun.js
new file mode 100644
index 0000000..dbc0a37
--- /dev/null
+++ b/js/js.translator/testData/box/jsImport/named/topLevelVarargFun.js
@@ -0,0 +1,6 @@
+define("lib", [], function () {
+ function bar() {
+ return "(" + Array.prototype.join.call(arguments, "") + ")";
+ }
+ return { bar }
+})
diff --git a/js/js.translator/testData/box/jsImport/named/topLevelVarargFun.kt b/js/js.translator/testData/box/jsImport/named/topLevelVarargFun.kt
new file mode 100644
index 0000000..26eb50a
--- /dev/null
+++ b/js/js.translator/testData/box/jsImport/named/topLevelVarargFun.kt
@@ -0,0 +1,16 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// MODULE_KIND: AMD
+@JsImport("lib")
+@JsImport.Name("bar")
+external fun foo(vararg arg: String): String
+
+fun box(): String {
+ val x = arrayOf("a", "b")
+ var r = foo(*x)
+ if (r != "(ab)") return "fail1: $r"
+
+ r = foo("c", "d")
+ if (r != "(cd)") return "fail2: $r"
+
+ return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/jsImport/namespaced/externalObject.js b/js/js.translator/testData/box/jsImport/namespaced/externalObject.js
new file mode 100644
index 0000000..e241286
--- /dev/null
+++ b/js/js.translator/testData/box/jsImport/namespaced/externalObject.js
@@ -0,0 +1,10 @@
+define("lib", [], function () {
+ return {
+ O: {
+ x: 23,
+ foo: function(y) {
+ return this.x + y;
+ }
+ }
+ };
+})
\ No newline at end of file
diff --git a/js/js.translator/testData/box/jsImport/namespaced/externalObject.kt b/js/js.translator/testData/box/jsImport/namespaced/externalObject.kt
new file mode 100644
index 0000000..1ad8d3e
--- /dev/null
+++ b/js/js.translator/testData/box/jsImport/namespaced/externalObject.kt
@@ -0,0 +1,18 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// MODULE_KIND: AMD
+package foo
+
+@JsImport("lib")
+@JsImport.Namespace
+external object A {
+ object O {
+ val x: Int = definedExternally
+ fun foo(y: Int): Int = definedExternally
+ }
+}
+
+fun box(): String {
+ assertEquals(23, A.O.x)
+ assertEquals(65, A.O.foo(42))
+ return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/jsImport/namespaced/jsExternalInheritorsOnly.js b/js/js.translator/testData/box/jsImport/namespaced/jsExternalInheritorsOnly.js
new file mode 100644
index 0000000..7962353
--- /dev/null
+++ b/js/js.translator/testData/box/jsImport/namespaced/jsExternalInheritorsOnly.js
@@ -0,0 +1,32 @@
+define("lib", [], function () {
+ function createX () {
+ return {x: "X1"};
+ }
+ function createXY () {
+ return {x: "X2", y: "Y2"};
+ }
+ function createXYZ() {
+ return {x: "X3", y: "Y3", z: "Z3"};
+ }
+ function createClassXYZ() {
+ return {x: "X4", y: "Y4", z: "Z4"};
+ }
+ function createNestedInterfaceXYZ() {
+ return {x: "X5", y: "Y5", z: "Z5"};
+ }
+
+ const x = "X6"
+ const y = "Y6"
+ const z = "Z6"
+
+ return {
+ createX,
+ createXY,
+ createXYZ,
+ createClassXYZ,
+ createNestedInterfaceXYZ,
+ x,
+ y,
+ z
+ }
+})
\ No newline at end of file
diff --git a/js/js.translator/testData/box/jsImport/namespaced/jsExternalInheritorsOnly.kt b/js/js.translator/testData/box/jsImport/namespaced/jsExternalInheritorsOnly.kt
new file mode 100644
index 0000000..4dcf925
--- /dev/null
+++ b/js/js.translator/testData/box/jsImport/namespaced/jsExternalInheritorsOnly.kt
@@ -0,0 +1,64 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// DONT_TARGET_EXACT_BACKEND: WASM
+// MODULE_KIND: AMD
+
+@OptIn(ExperimentalStdlibApi::class)
+@JsExternalInheritorsOnly
+external interface ExternalInterfaceX {
+ val x: String
+}
+
+external interface ExternalInterfaceXY : ExternalInterfaceX {
+ val y: String
+}
+
+external interface ExternalInterfaceXYZ : ExternalInterfaceXY {
+ val z: String
+}
+
+external class ExternalXYZ() : ExternalInterfaceXYZ {
+ override val x: String
+ override val y: String
+ override val z: String
+}
+
+external class ExternalClassNameSpace {
+ interface NestedInterfaceXYZ : ExternalInterfaceXYZ {
+ override val x: String
+ override val y: String
+ override val z: String
+ }
+}
+
+@JsImport("lib")
+@JsImport.Namespace
+external object Creator: ExternalInterfaceXYZ {
+ fun createX(): ExternalInterfaceX
+ fun createXY(): ExternalInterfaceXY
+ fun createXYZ(): ExternalInterfaceXYZ
+ fun createClassXYZ(): ExternalXYZ
+
+ fun createNestedInterfaceXYZ(): ExternalClassNameSpace.NestedInterfaceXYZ
+
+ override val x: String
+ override val y: String
+ override val z: String
+}
+
+fun checkX(x: ExternalInterfaceX, id: Int) = x.x == "X$id"
+fun checkXY(xy: ExternalInterfaceXY, id: Int) = checkX(xy, id) && xy.y == "Y$id"
+fun checkXYZ(xyz: ExternalInterfaceXYZ, id: Int) = checkXY(xyz, id) && xyz.z == "Z$id"
+
+fun box(): String {
+ if (!checkX(Creator.createX(), 1)) return "Fail interface X"
+ if (!checkXY(Creator.createXY(), 2)) return "Fail interface XY"
+ if (!checkXYZ(Creator.createXYZ(), 3)) return "Fail interface XYZ"
+
+ if (!checkXYZ(Creator.createClassXYZ(), 4)) return "Fail class XYZ"
+
+ if (!checkXYZ(Creator.createNestedInterfaceXYZ(), 5)) return "Fail nested interface XYZ"
+
+ if (!checkXYZ(Creator, 6)) return "Fail object XYZ"
+
+ return "OK"
+}
diff --git a/js/js.translator/testData/box/jsImport/plainNamed/externalClassNameClash.kt b/js/js.translator/testData/box/jsImport/plainNamed/externalClassNameClash.kt
new file mode 100644
index 0000000..0662128
--- /dev/null
+++ b/js/js.translator/testData/box/jsImport/plainNamed/externalClassNameClash.kt
@@ -0,0 +1,73 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// MODULE_KIND: AMD
+// FILE: a.kt
+package a
+
+@JsImport("a")
+external class A {
+ fun foo(): String
+}
+
+@JsImport("a")
+external fun bar(): Int
+
+@JsImport("a")
+external val prop: Int
+
+// FILE: b.kt
+package b
+
+@JsImport("b")
+external class A {
+ fun foo(): String
+}
+
+@JsImport("b")
+external fun bar(): Int
+
+@JsImport("b")
+external val prop: Int
+
+// FILE: main.kt
+
+import a.A as O
+import b.A as K
+
+fun box(): String {
+ if (a.bar() != 1) return "fail 1"
+ if (a.prop != 10) return "fail 2"
+ if (b.bar() != 2) return "fail 3"
+ if (b.prop != 20) return "fail 4"
+
+ return O().foo() + K().foo()
+}
+
+// FILE: a.js
+define("a", [], function () {
+ function A() {}
+
+ A.prototype.foo = function () {
+ return "O";
+ };
+
+ function bar() { return 1; }
+
+ let prop = 10
+
+ return { A, bar, prop }
+})
+
+// FILE: b.js
+define("b", [], function () {
+ function A() {}
+
+ A.prototype.foo = function () {
+ return "K";
+ };
+
+ function bar() { return 2; }
+
+ let prop = 20;
+
+ return { A, bar, prop }
+})
\ No newline at end of file
diff --git a/js/js.translator/testData/box/jsImport/plainNamed/externalPackage.js b/js/js.translator/testData/box/jsImport/plainNamed/externalPackage.js
new file mode 100644
index 0000000..d8004d8
--- /dev/null
+++ b/js/js.translator/testData/box/jsImport/plainNamed/externalPackage.js
@@ -0,0 +1,28 @@
+define("lib", [], function () {
+ function A(x) {
+ this.x = x;
+ }
+ A.prototype.foo = function (y) {
+ return this.x + y;
+ };
+
+ function Nested() {
+ this.y = 55;
+ }
+ A.Nested = Nested;
+
+ var B = {
+ x: 123,
+ foo: function(y) {
+ return this.x + y;
+ }
+ };
+
+ function foo(y) {
+ return 323 + y;
+ }
+
+ var bar = 423;
+
+ return { A, B, foo, bar }
+})
diff --git a/js/js.translator/testData/box/jsImport/plainNamed/externalPackage.kt b/js/js.translator/testData/box/jsImport/plainNamed/externalPackage.kt
new file mode 100644
index 0000000..dec2f31
--- /dev/null
+++ b/js/js.translator/testData/box/jsImport/plainNamed/externalPackage.kt
@@ -0,0 +1,48 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// MODULE_KIND: AMD
+// FILE: a.kt
+package foo
+
+@JsImport("lib")
+external class A(x: Int) {
+ val x: Int
+
+ fun foo(y: Int): Int = definedExternally
+
+ class Nested {
+ val y: Int
+ }
+}
+
+@JsImport("lib")
+external object B {
+ val x: Int = definedExternally
+
+ fun foo(y: Int): Int = definedExternally
+}
+
+@JsImport("lib")
+external fun foo(y: Int): Int = definedExternally
+
+@JsImport("lib")
+external val bar: Int = definedExternally
+
+// FILE: b.kt
+package foo
+
+fun box(): String {
+ val a = A(23)
+ assertEquals(23, a.x)
+ assertEquals(65, a.foo(42))
+
+ val nested = A.Nested()
+ assertEquals(55, nested.y)
+
+ assertEquals(123, B.x)
+ assertEquals(265, B.foo(142))
+
+ assertEquals(365, foo(42))
+ assertEquals(423, bar)
+
+ return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/jsImport/plainNamed/externalPackageInDifferentFile.js b/js/js.translator/testData/box/jsImport/plainNamed/externalPackageInDifferentFile.js
new file mode 100644
index 0000000..7034601
--- /dev/null
+++ b/js/js.translator/testData/box/jsImport/plainNamed/externalPackageInDifferentFile.js
@@ -0,0 +1,29 @@
+C = {
+ f: function() {
+ return 12345;
+ }
+};
+
+define("lib", [], function () {
+ function A(x) {
+ this.x = x;
+ }
+ A.prototype.foo = function (y) {
+ return this.x + y;
+ };
+
+ var B = {
+ x: 123,
+ foo: function(y) {
+ return this.x + y;
+ }
+ };
+
+ function foo(y) {
+ return 323 + y;
+ }
+
+ var bar = 423;
+
+ return { A, B, foo, bar };
+})
diff --git a/js/js.translator/testData/box/jsImport/plainNamed/externalPackageInDifferentFile.kt b/js/js.translator/testData/box/jsImport/plainNamed/externalPackageInDifferentFile.kt
new file mode 100644
index 0000000..b1c05f6
--- /dev/null
+++ b/js/js.translator/testData/box/jsImport/plainNamed/externalPackageInDifferentFile.kt
@@ -0,0 +1,50 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// MODULE_KIND: AMD
+// FILE: lib.kt
+package foo
+
+@JsImport("lib")
+external class A(x: Int = definedExternally) {
+ val x: Int
+
+ fun foo(y: Int): Int = definedExternally
+}
+
+@JsImport("lib")
+external object B {
+ val x: Int = definedExternally
+
+ fun foo(y: Int): Int = definedExternally
+}
+
+@JsImport("lib")
+external fun foo(y: Int): Int = definedExternally
+
+@JsImport("lib")
+external val bar: Int = definedExternally
+
+// FILE: lib2.kt
+package foo
+
+external object C {
+ fun f(): Int = definedExternally
+}
+
+// FILE: main.kt
+package foo
+
+fun box(): String {
+ val a = A(23)
+ assertEquals(23, a.x)
+ assertEquals(65, a.foo(42))
+
+ assertEquals(123, B.x)
+ assertEquals(265, B.foo(142))
+
+ assertEquals(365, foo(42))
+ assertEquals(423, bar)
+
+ assertEquals(12345, C.f())
+
+ return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/jsImport/plainNamed/interfaces.js b/js/js.translator/testData/box/jsImport/plainNamed/interfaces.js
new file mode 100644
index 0000000..3147a35
--- /dev/null
+++ b/js/js.translator/testData/box/jsImport/plainNamed/interfaces.js
@@ -0,0 +1,15 @@
+define("lib", [], function () {
+ var bar = {
+ ping() {
+ return "ping"
+ }
+ };
+
+ var baz = {
+ pong() {
+ return 194
+ }
+ };
+
+ return { bar, baz }
+})
diff --git a/js/js.translator/testData/box/jsImport/plainNamed/interfaces.kt b/js/js.translator/testData/box/jsImport/plainNamed/interfaces.kt
new file mode 100644
index 0000000..e9bf5e8
--- /dev/null
+++ b/js/js.translator/testData/box/jsImport/plainNamed/interfaces.kt
@@ -0,0 +1,43 @@
+// DONT_TARGET_EXACT_BACKEND: JS
+// IGNORE_BACKEND: WASM
+// MODULE_KIND: AMD
+// FILE: bar.kt
+package foo
+
+@JsImport("lib")
+external interface Bar {
+ fun ping(): String
+}
+
+// FILE: baz.kt
+package boo
+
+@JsImport("lib")
+external interface Baz {
+ fun pong(): Int
+}
+
+// FILE: root.kt
+import foo.Bar
+import boo.Baz
+
+@JsImport("lib")
+external val bar: Bar
+
+@JsImport("lib")
+external val baz: Baz
+
+// FILE: test.kt
+import boo.Baz
+
+fun box(): String {
+ if (bar.ping() != "ping" || baz.pong() != 194) return "Fail"
+
+ val local = object : Baz {
+ override fun pong(): Int = 322
+ }
+
+ if (local.asDynamic().pong() != 322) return "Fail"
+
+ return "OK"
+}
\ No newline at end of file
diff --git a/js/js.translator/testData/box/jsImport/plainNamed/interfacesWithCompanion.js b/js/js.translator/testData/box/jsImport/plainNamed/interfacesWithCompanion.js
new file mode 100644
index 0000000..f3d161d
--- /dev/null
+++ b/js/js.translator/testData/box/jsImport/plainNamed/interfacesWithCompanion.js
@@ -0,0 +1,7 @@
+define("lib", [], function () {
+ const Bar = {
+ ok() { return "OK" }
+ };
+
+ return { Bar }
+})
diff --git a/js/js.translator/testData/box/jsImport/plainNamed/interfacesWithCompanion.kt b/js/js.translator/testData/box/jsImport/plainNamed/interfacesWithCompanion.kt
new file mode 100644
index 0000000..d80f038
--- /dev/null
+++ b/js/js.translator/testData/box/jsImport/plainNamed/interfacesWithCompanion.kt
@@ -0,0 +1,20 @@
+// TARGET_BACKEND: JS_IR
+// TARGET_BACKEND: JS_IR_ES6
+// EXPECTED_REACHABLE_NODES: 1238
+// MODULE_KIND: AMD
+// FILE: bar.kt
+package bar
+
+@JsImport("lib")
+external interface Bar {
+ companion object {
+ fun ok(): String
+ }
+}
+
+// FILE: test.kt
+import bar.Bar
+
+fun box(): String {
+ return Bar.ok()
+}
\ No newline at end of file
diff --git a/libraries/stdlib/js/src/kotlin/annotationsJs.kt b/libraries/stdlib/js/src/kotlin/annotationsJs.kt
index 3c8780b..9b2736b 100644
--- a/libraries/stdlib/js/src/kotlin/annotationsJs.kt
+++ b/libraries/stdlib/js/src/kotlin/annotationsJs.kt
@@ -104,6 +104,56 @@
public annotation class JsModule(val import: String)
/**
+ * Denotes an `external` declaration that must be imported from native JavaScript library.
+ * It's the future replacement for the [JsModule] annotation
+ *
+ * The compiler produces the code relevant for the target module system, for example, in case of CommonJS,
+ * it will import the declaration via the ESM `import` statement
+ *
+ * The annotation can be used on top-level external declarations (classes, properties, functions) and files.
+ * In case of file (which can't be `external`) the following rule applies: all the declarations in
+ * the file must be `external`. By applying `@JsModule(...)` on a file you tell the compiler to import a JavaScript object
+ * that contain all the declarations from the file.
+ *
+ * Example:
+ *
+ * ``` kotlin
+ * @JsImport(from = "jquery", exportName = "Test")
+ * external abstract class JQuery() {
+ * // some declarations here
+ * }
+ *
+ * @JsImport(from = "jquery", default = true)
+ * external fun JQuery(element: Element): JQuery
+ * ```
+ *
+ * @property `from` name of a module to import declaration from.
+ * It is not interpreted by the Kotlin compiler, it's passed as is directly to the target module system.
+ * @property `default` handle the case if the imported declaration is default exported from the target module.
+ * @property `exportName` declare the original name that is used to export the declaration from the target module.
+ */
+@SinceKotlin("1.9")
+@Retention(AnnotationRetention.BINARY)
+@Target(CLASS, PROPERTY, FUNCTION, FILE)
+public annotation class JsImport(val from: String) {
+
+ @Retention(AnnotationRetention.BINARY)
+ @Target(CLASS, PROPERTY, FUNCTION, CONSTRUCTOR)
+ @SinceKotlin("1.9")
+ public annotation class Name(val exportName: String)
+
+ @Retention(AnnotationRetention.BINARY)
+ @Target(CLASS, PROPERTY, FUNCTION, CONSTRUCTOR)
+ @SinceKotlin("1.9")
+ public annotation class Default
+
+ @Retention(AnnotationRetention.BINARY)
+ @Target(CLASS)
+ @SinceKotlin("1.9")
+ public annotation class Namespace
+}
+
+/**
* Denotes an `external` declaration that can be used without module system.
*
* By default, an `external` declaration is available regardless your target module system.
diff --git a/wasm/wasm.tests/tests-gen/org/jetbrains/kotlin/wasm/test/FirWasmJsTranslatorTestGenerated.java b/wasm/wasm.tests/tests-gen/org/jetbrains/kotlin/wasm/test/FirWasmJsTranslatorTestGenerated.java
index 071ac06..6dc7332 100644
--- a/wasm/wasm.tests/tests-gen/org/jetbrains/kotlin/wasm/test/FirWasmJsTranslatorTestGenerated.java
+++ b/wasm/wasm.tests/tests-gen/org/jetbrains/kotlin/wasm/test/FirWasmJsTranslatorTestGenerated.java
@@ -266,6 +266,294 @@
}
@Nested
+ @TestMetadata("js/js.translator/testData/box/esModules/jsFileImport")
+ @TestDataPath("$PROJECT_ROOT")
+ public class JsFileImport {
+ @Test
+ public void testAllFilesPresentInJsFileImport() {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsFileImport"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.WASM, true);
+ }
+
+ @Nested
+ @TestMetadata("js/js.translator/testData/box/esModules/jsFileImport/default")
+ @TestDataPath("$PROJECT_ROOT")
+ public class Default {
+ @Test
+ public void testAllFilesPresentInDefault() {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsFileImport/default"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.WASM, true);
+ }
+
+ @Test
+ @TestMetadata("externalClass.kt")
+ public void testExternalClass() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/default/externalClass.kt");
+ }
+
+ @Test
+ @TestMetadata("externalFunction.kt")
+ public void testExternalFunction() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/default/externalFunction.kt");
+ }
+
+ @Test
+ @TestMetadata("externalFunctionNameClash.kt")
+ public void testExternalFunctionNameClash() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/default/externalFunctionNameClash.kt");
+ }
+
+ @Test
+ @TestMetadata("externalObject.kt")
+ public void testExternalObject() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/default/externalObject.kt");
+ }
+
+ @Test
+ @TestMetadata("externalProperty.kt")
+ public void testExternalProperty() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/default/externalProperty.kt");
+ }
+
+ @Test
+ @TestMetadata("topLevelVarargFun.kt")
+ public void testTopLevelVarargFun() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/default/topLevelVarargFun.kt");
+ }
+ }
+
+ @Nested
+ @TestMetadata("js/js.translator/testData/box/esModules/jsFileImport/named")
+ @TestDataPath("$PROJECT_ROOT")
+ public class Named {
+ @Test
+ public void testAllFilesPresentInNamed() {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsFileImport/named"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.WASM, true);
+ }
+
+ @Test
+ @TestMetadata("externalClass.kt")
+ public void testExternalClass() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/named/externalClass.kt");
+ }
+
+ @Test
+ @TestMetadata("externalFunction.kt")
+ public void testExternalFunction() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/named/externalFunction.kt");
+ }
+
+ @Test
+ @TestMetadata("externalFunctionNameClash.kt")
+ public void testExternalFunctionNameClash() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/named/externalFunctionNameClash.kt");
+ }
+
+ @Test
+ @TestMetadata("externalObject.kt")
+ public void testExternalObject() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/named/externalObject.kt");
+ }
+
+ @Test
+ @TestMetadata("externalProperty.kt")
+ public void testExternalProperty() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/named/externalProperty.kt");
+ }
+
+ @Test
+ @TestMetadata("topLevelVarargFun.kt")
+ public void testTopLevelVarargFun() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/named/topLevelVarargFun.kt");
+ }
+ }
+
+ @Nested
+ @TestMetadata("js/js.translator/testData/box/esModules/jsFileImport/plainNamed")
+ @TestDataPath("$PROJECT_ROOT")
+ public class PlainNamed {
+ @Test
+ public void testAllFilesPresentInPlainNamed() {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsFileImport/plainNamed"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.WASM, true);
+ }
+
+ @Test
+ @TestMetadata("externalClassNameClash.kt")
+ public void testExternalClassNameClash() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/plainNamed/externalClassNameClash.kt");
+ }
+
+ @Test
+ @TestMetadata("externalPackage.kt")
+ public void testExternalPackage() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/plainNamed/externalPackage.kt");
+ }
+
+ @Test
+ @TestMetadata("externalPackageInDifferentFile.kt")
+ public void testExternalPackageInDifferentFile() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/plainNamed/externalPackageInDifferentFile.kt");
+ }
+
+ @Test
+ @TestMetadata("interfaces.kt")
+ public void testInterfaces() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/plainNamed/interfaces.kt");
+ }
+ }
+ }
+
+ @Nested
+ @TestMetadata("js/js.translator/testData/box/esModules/jsImport")
+ @TestDataPath("$PROJECT_ROOT")
+ public class JsImport {
+ @Test
+ public void testAllFilesPresentInJsImport() {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsImport"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.WASM, true);
+ }
+
+ @Nested
+ @TestMetadata("js/js.translator/testData/box/esModules/jsImport/default")
+ @TestDataPath("$PROJECT_ROOT")
+ public class Default {
+ @Test
+ public void testAllFilesPresentInDefault() {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsImport/default"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.WASM, true);
+ }
+
+ @Test
+ @TestMetadata("externalClass.kt")
+ public void testExternalClass() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/default/externalClass.kt");
+ }
+
+ @Test
+ @TestMetadata("externalFunction.kt")
+ public void testExternalFunction() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/default/externalFunction.kt");
+ }
+
+ @Test
+ @TestMetadata("externalFunctionNameClash.kt")
+ public void testExternalFunctionNameClash() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/default/externalFunctionNameClash.kt");
+ }
+
+ @Test
+ @TestMetadata("externalObject.kt")
+ public void testExternalObject() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/default/externalObject.kt");
+ }
+
+ @Test
+ @TestMetadata("externalProperty.kt")
+ public void testExternalProperty() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/default/externalProperty.kt");
+ }
+
+ @Test
+ @TestMetadata("topLevelVarargFun.kt")
+ public void testTopLevelVarargFun() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/default/topLevelVarargFun.kt");
+ }
+ }
+
+ @Nested
+ @TestMetadata("js/js.translator/testData/box/esModules/jsImport/named")
+ @TestDataPath("$PROJECT_ROOT")
+ public class Named {
+ @Test
+ public void testAllFilesPresentInNamed() {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsImport/named"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.WASM, true);
+ }
+
+ @Test
+ @TestMetadata("externalClass.kt")
+ public void testExternalClass() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/named/externalClass.kt");
+ }
+
+ @Test
+ @TestMetadata("externalFunction.kt")
+ public void testExternalFunction() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/named/externalFunction.kt");
+ }
+
+ @Test
+ @TestMetadata("externalFunctionNameClash.kt")
+ public void testExternalFunctionNameClash() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/named/externalFunctionNameClash.kt");
+ }
+
+ @Test
+ @TestMetadata("externalObject.kt")
+ public void testExternalObject() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/named/externalObject.kt");
+ }
+
+ @Test
+ @TestMetadata("externalProperty.kt")
+ public void testExternalProperty() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/named/externalProperty.kt");
+ }
+
+ @Test
+ @TestMetadata("topLevelVarargFun.kt")
+ public void testTopLevelVarargFun() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/named/topLevelVarargFun.kt");
+ }
+ }
+
+ @Nested
+ @TestMetadata("js/js.translator/testData/box/esModules/jsImport/namespaced")
+ @TestDataPath("$PROJECT_ROOT")
+ public class Namespaced {
+ @Test
+ public void testAllFilesPresentInNamespaced() {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsImport/namespaced"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.WASM, true);
+ }
+
+ @Test
+ @TestMetadata("externalObject.kt")
+ public void testExternalObject() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/namespaced/externalObject.kt");
+ }
+ }
+
+ @Nested
+ @TestMetadata("js/js.translator/testData/box/esModules/jsImport/plainNamed")
+ @TestDataPath("$PROJECT_ROOT")
+ public class PlainNamed {
+ @Test
+ public void testAllFilesPresentInPlainNamed() {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsImport/plainNamed"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.WASM, true);
+ }
+
+ @Test
+ @TestMetadata("externalClassNameClash.kt")
+ public void testExternalClassNameClash() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/plainNamed/externalClassNameClash.kt");
+ }
+
+ @Test
+ @TestMetadata("externalPackage.kt")
+ public void testExternalPackage() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/plainNamed/externalPackage.kt");
+ }
+
+ @Test
+ @TestMetadata("externalPackageInDifferentFile.kt")
+ public void testExternalPackageInDifferentFile() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/plainNamed/externalPackageInDifferentFile.kt");
+ }
+
+ @Test
+ @TestMetadata("interfaces.kt")
+ public void testInterfaces() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/plainNamed/interfaces.kt");
+ }
+ }
+ }
+
+ @Nested
@TestMetadata("js/js.translator/testData/box/esModules/jsModule")
@TestDataPath("$PROJECT_ROOT")
public class JsModule {
diff --git a/wasm/wasm.tests/tests-gen/org/jetbrains/kotlin/wasm/test/K1WasmJsTranslatorTestGenerated.java b/wasm/wasm.tests/tests-gen/org/jetbrains/kotlin/wasm/test/K1WasmJsTranslatorTestGenerated.java
index 20bf569..95c1596 100644
--- a/wasm/wasm.tests/tests-gen/org/jetbrains/kotlin/wasm/test/K1WasmJsTranslatorTestGenerated.java
+++ b/wasm/wasm.tests/tests-gen/org/jetbrains/kotlin/wasm/test/K1WasmJsTranslatorTestGenerated.java
@@ -266,6 +266,294 @@
}
@Nested
+ @TestMetadata("js/js.translator/testData/box/esModules/jsFileImport")
+ @TestDataPath("$PROJECT_ROOT")
+ public class JsFileImport {
+ @Test
+ public void testAllFilesPresentInJsFileImport() {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsFileImport"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.WASM, true);
+ }
+
+ @Nested
+ @TestMetadata("js/js.translator/testData/box/esModules/jsFileImport/default")
+ @TestDataPath("$PROJECT_ROOT")
+ public class Default {
+ @Test
+ public void testAllFilesPresentInDefault() {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsFileImport/default"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.WASM, true);
+ }
+
+ @Test
+ @TestMetadata("externalClass.kt")
+ public void testExternalClass() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/default/externalClass.kt");
+ }
+
+ @Test
+ @TestMetadata("externalFunction.kt")
+ public void testExternalFunction() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/default/externalFunction.kt");
+ }
+
+ @Test
+ @TestMetadata("externalFunctionNameClash.kt")
+ public void testExternalFunctionNameClash() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/default/externalFunctionNameClash.kt");
+ }
+
+ @Test
+ @TestMetadata("externalObject.kt")
+ public void testExternalObject() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/default/externalObject.kt");
+ }
+
+ @Test
+ @TestMetadata("externalProperty.kt")
+ public void testExternalProperty() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/default/externalProperty.kt");
+ }
+
+ @Test
+ @TestMetadata("topLevelVarargFun.kt")
+ public void testTopLevelVarargFun() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/default/topLevelVarargFun.kt");
+ }
+ }
+
+ @Nested
+ @TestMetadata("js/js.translator/testData/box/esModules/jsFileImport/named")
+ @TestDataPath("$PROJECT_ROOT")
+ public class Named {
+ @Test
+ public void testAllFilesPresentInNamed() {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsFileImport/named"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.WASM, true);
+ }
+
+ @Test
+ @TestMetadata("externalClass.kt")
+ public void testExternalClass() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/named/externalClass.kt");
+ }
+
+ @Test
+ @TestMetadata("externalFunction.kt")
+ public void testExternalFunction() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/named/externalFunction.kt");
+ }
+
+ @Test
+ @TestMetadata("externalFunctionNameClash.kt")
+ public void testExternalFunctionNameClash() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/named/externalFunctionNameClash.kt");
+ }
+
+ @Test
+ @TestMetadata("externalObject.kt")
+ public void testExternalObject() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/named/externalObject.kt");
+ }
+
+ @Test
+ @TestMetadata("externalProperty.kt")
+ public void testExternalProperty() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/named/externalProperty.kt");
+ }
+
+ @Test
+ @TestMetadata("topLevelVarargFun.kt")
+ public void testTopLevelVarargFun() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/named/topLevelVarargFun.kt");
+ }
+ }
+
+ @Nested
+ @TestMetadata("js/js.translator/testData/box/esModules/jsFileImport/plainNamed")
+ @TestDataPath("$PROJECT_ROOT")
+ public class PlainNamed {
+ @Test
+ public void testAllFilesPresentInPlainNamed() {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsFileImport/plainNamed"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.WASM, true);
+ }
+
+ @Test
+ @TestMetadata("externalClassNameClash.kt")
+ public void testExternalClassNameClash() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/plainNamed/externalClassNameClash.kt");
+ }
+
+ @Test
+ @TestMetadata("externalPackage.kt")
+ public void testExternalPackage() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/plainNamed/externalPackage.kt");
+ }
+
+ @Test
+ @TestMetadata("externalPackageInDifferentFile.kt")
+ public void testExternalPackageInDifferentFile() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/plainNamed/externalPackageInDifferentFile.kt");
+ }
+
+ @Test
+ @TestMetadata("interfaces.kt")
+ public void testInterfaces() {
+ runTest("js/js.translator/testData/box/esModules/jsFileImport/plainNamed/interfaces.kt");
+ }
+ }
+ }
+
+ @Nested
+ @TestMetadata("js/js.translator/testData/box/esModules/jsImport")
+ @TestDataPath("$PROJECT_ROOT")
+ public class JsImport {
+ @Test
+ public void testAllFilesPresentInJsImport() {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsImport"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.WASM, true);
+ }
+
+ @Nested
+ @TestMetadata("js/js.translator/testData/box/esModules/jsImport/default")
+ @TestDataPath("$PROJECT_ROOT")
+ public class Default {
+ @Test
+ public void testAllFilesPresentInDefault() {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsImport/default"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.WASM, true);
+ }
+
+ @Test
+ @TestMetadata("externalClass.kt")
+ public void testExternalClass() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/default/externalClass.kt");
+ }
+
+ @Test
+ @TestMetadata("externalFunction.kt")
+ public void testExternalFunction() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/default/externalFunction.kt");
+ }
+
+ @Test
+ @TestMetadata("externalFunctionNameClash.kt")
+ public void testExternalFunctionNameClash() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/default/externalFunctionNameClash.kt");
+ }
+
+ @Test
+ @TestMetadata("externalObject.kt")
+ public void testExternalObject() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/default/externalObject.kt");
+ }
+
+ @Test
+ @TestMetadata("externalProperty.kt")
+ public void testExternalProperty() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/default/externalProperty.kt");
+ }
+
+ @Test
+ @TestMetadata("topLevelVarargFun.kt")
+ public void testTopLevelVarargFun() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/default/topLevelVarargFun.kt");
+ }
+ }
+
+ @Nested
+ @TestMetadata("js/js.translator/testData/box/esModules/jsImport/named")
+ @TestDataPath("$PROJECT_ROOT")
+ public class Named {
+ @Test
+ public void testAllFilesPresentInNamed() {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsImport/named"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.WASM, true);
+ }
+
+ @Test
+ @TestMetadata("externalClass.kt")
+ public void testExternalClass() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/named/externalClass.kt");
+ }
+
+ @Test
+ @TestMetadata("externalFunction.kt")
+ public void testExternalFunction() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/named/externalFunction.kt");
+ }
+
+ @Test
+ @TestMetadata("externalFunctionNameClash.kt")
+ public void testExternalFunctionNameClash() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/named/externalFunctionNameClash.kt");
+ }
+
+ @Test
+ @TestMetadata("externalObject.kt")
+ public void testExternalObject() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/named/externalObject.kt");
+ }
+
+ @Test
+ @TestMetadata("externalProperty.kt")
+ public void testExternalProperty() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/named/externalProperty.kt");
+ }
+
+ @Test
+ @TestMetadata("topLevelVarargFun.kt")
+ public void testTopLevelVarargFun() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/named/topLevelVarargFun.kt");
+ }
+ }
+
+ @Nested
+ @TestMetadata("js/js.translator/testData/box/esModules/jsImport/namespaced")
+ @TestDataPath("$PROJECT_ROOT")
+ public class Namespaced {
+ @Test
+ public void testAllFilesPresentInNamespaced() {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsImport/namespaced"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.WASM, true);
+ }
+
+ @Test
+ @TestMetadata("externalObject.kt")
+ public void testExternalObject() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/namespaced/externalObject.kt");
+ }
+ }
+
+ @Nested
+ @TestMetadata("js/js.translator/testData/box/esModules/jsImport/plainNamed")
+ @TestDataPath("$PROJECT_ROOT")
+ public class PlainNamed {
+ @Test
+ public void testAllFilesPresentInPlainNamed() {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/jsImport/plainNamed"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.WASM, true);
+ }
+
+ @Test
+ @TestMetadata("externalClassNameClash.kt")
+ public void testExternalClassNameClash() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/plainNamed/externalClassNameClash.kt");
+ }
+
+ @Test
+ @TestMetadata("externalPackage.kt")
+ public void testExternalPackage() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/plainNamed/externalPackage.kt");
+ }
+
+ @Test
+ @TestMetadata("externalPackageInDifferentFile.kt")
+ public void testExternalPackageInDifferentFile() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/plainNamed/externalPackageInDifferentFile.kt");
+ }
+
+ @Test
+ @TestMetadata("interfaces.kt")
+ public void testInterfaces() {
+ runTest("js/js.translator/testData/box/esModules/jsImport/plainNamed/interfaces.kt");
+ }
+ }
+ }
+
+ @Nested
@TestMetadata("js/js.translator/testData/box/esModules/jsModule")
@TestDataPath("$PROJECT_ROOT")
public class JsModule {