[JS IR] Add test with exception diagnostic of boolean in externals
This commit is contained in:
@@ -14,10 +14,12 @@ import com.intellij.psi.PsiManager
|
|||||||
import junit.framework.TestCase
|
import junit.framework.TestCase
|
||||||
import org.jetbrains.kotlin.checkers.CompilerTestLanguageVersionSettings
|
import org.jetbrains.kotlin.checkers.CompilerTestLanguageVersionSettings
|
||||||
import org.jetbrains.kotlin.checkers.parseLanguageVersionSettings
|
import org.jetbrains.kotlin.checkers.parseLanguageVersionSettings
|
||||||
|
import org.jetbrains.kotlin.cli.common.arguments.K2JsArgumentConstants
|
||||||
import org.jetbrains.kotlin.cli.common.messages.AnalyzerWithCompilerReport
|
import org.jetbrains.kotlin.cli.common.messages.AnalyzerWithCompilerReport
|
||||||
import org.jetbrains.kotlin.cli.common.messages.MessageRenderer
|
import org.jetbrains.kotlin.cli.common.messages.MessageRenderer
|
||||||
import org.jetbrains.kotlin.cli.common.messages.PrintingMessageCollector
|
import org.jetbrains.kotlin.cli.common.messages.PrintingMessageCollector
|
||||||
import org.jetbrains.kotlin.cli.common.output.writeAllTo
|
import org.jetbrains.kotlin.cli.common.output.writeAllTo
|
||||||
|
import org.jetbrains.kotlin.cli.js.resolve
|
||||||
import org.jetbrains.kotlin.cli.jvm.compiler.EnvironmentConfigFiles
|
import org.jetbrains.kotlin.cli.jvm.compiler.EnvironmentConfigFiles
|
||||||
import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment
|
import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment
|
||||||
import org.jetbrains.kotlin.config.*
|
import org.jetbrains.kotlin.config.*
|
||||||
@@ -151,6 +153,12 @@ abstract class BasicBoxTest(
|
|||||||
|
|
||||||
val propertyLazyInitialization = PROPERTY_LAZY_INITIALIZATION.matcher(fileContent).find()
|
val propertyLazyInitialization = PROPERTY_LAZY_INITIALIZATION.matcher(fileContent).find()
|
||||||
val safeExternalBoolean = SAFE_EXTERNAL_BOOLEAN.matcher(fileContent).find()
|
val safeExternalBoolean = SAFE_EXTERNAL_BOOLEAN.matcher(fileContent).find()
|
||||||
|
val safeExternalBooleanDiagnosticMatcher = SAFE_EXTERNAL_BOOLEAN_DIAGNOSTIC.matcher(fileContent)
|
||||||
|
|
||||||
|
val safeExternalBooleanDiagnostic =
|
||||||
|
if (safeExternalBooleanDiagnosticMatcher.find())
|
||||||
|
RuntimeDiagnostic.resolve(safeExternalBooleanDiagnosticMatcher.group(1))
|
||||||
|
else null
|
||||||
|
|
||||||
TestFileFactoryImpl().use { testFactory ->
|
TestFileFactoryImpl().use { testFactory ->
|
||||||
val inputFiles = TestFiles.createTestFiles(
|
val inputFiles = TestFiles.createTestFiles(
|
||||||
@@ -216,7 +224,8 @@ abstract class BasicBoxTest(
|
|||||||
splitPerModule,
|
splitPerModule,
|
||||||
errorPolicy,
|
errorPolicy,
|
||||||
propertyLazyInitialization,
|
propertyLazyInitialization,
|
||||||
safeExternalBoolean
|
safeExternalBoolean,
|
||||||
|
safeExternalBooleanDiagnostic,
|
||||||
)
|
)
|
||||||
|
|
||||||
when {
|
when {
|
||||||
@@ -471,6 +480,7 @@ abstract class BasicBoxTest(
|
|||||||
errorIgnorancePolicy: ErrorTolerancePolicy,
|
errorIgnorancePolicy: ErrorTolerancePolicy,
|
||||||
propertyLazyInitialization: Boolean,
|
propertyLazyInitialization: Boolean,
|
||||||
safeExternalBoolean: Boolean,
|
safeExternalBoolean: Boolean,
|
||||||
|
safeExternalBooleanDiagnostic: RuntimeDiagnostic?,
|
||||||
) {
|
) {
|
||||||
val kotlinFiles = module.files.filter { it.fileName.endsWith(".kt") }
|
val kotlinFiles = module.files.filter { it.fileName.endsWith(".kt") }
|
||||||
val testFiles = kotlinFiles.map { it.fileName }
|
val testFiles = kotlinFiles.map { it.fileName }
|
||||||
@@ -522,6 +532,7 @@ abstract class BasicBoxTest(
|
|||||||
splitPerModule,
|
splitPerModule,
|
||||||
propertyLazyInitialization,
|
propertyLazyInitialization,
|
||||||
safeExternalBoolean,
|
safeExternalBoolean,
|
||||||
|
safeExternalBooleanDiagnostic,
|
||||||
)
|
)
|
||||||
|
|
||||||
if (incrementalCompilationChecksEnabled && module.hasFilesToRecompile) {
|
if (incrementalCompilationChecksEnabled && module.hasFilesToRecompile) {
|
||||||
@@ -617,6 +628,7 @@ abstract class BasicBoxTest(
|
|||||||
splitPerModule = false,
|
splitPerModule = false,
|
||||||
propertyLazyInitialization = false,
|
propertyLazyInitialization = false,
|
||||||
safeExternalBoolean = false,
|
safeExternalBoolean = false,
|
||||||
|
safeExternalBooleanDiagnostic = null,
|
||||||
)
|
)
|
||||||
|
|
||||||
val originalOutput = FileUtil.loadFile(outputFile)
|
val originalOutput = FileUtil.loadFile(outputFile)
|
||||||
@@ -697,6 +709,7 @@ abstract class BasicBoxTest(
|
|||||||
splitPerModule: Boolean,
|
splitPerModule: Boolean,
|
||||||
propertyLazyInitialization: Boolean,
|
propertyLazyInitialization: Boolean,
|
||||||
safeExternalBoolean: Boolean,
|
safeExternalBoolean: Boolean,
|
||||||
|
safeExternalBooleanDiagnostic: RuntimeDiagnostic?,
|
||||||
) {
|
) {
|
||||||
val translator = K2JSTranslator(config, false)
|
val translator = K2JSTranslator(config, false)
|
||||||
val translationResult = translator.translateUnits(ExceptionThrowingReporter, units, mainCallParameters)
|
val translationResult = translator.translateUnits(ExceptionThrowingReporter, units, mainCallParameters)
|
||||||
@@ -1101,6 +1114,7 @@ abstract class BasicBoxTest(
|
|||||||
private val PROPERTY_LAZY_INITIALIZATION = Pattern.compile("^// *PROPERTY_LAZY_INITIALIZATION *$", Pattern.MULTILINE)
|
private val PROPERTY_LAZY_INITIALIZATION = Pattern.compile("^// *PROPERTY_LAZY_INITIALIZATION *$", Pattern.MULTILINE)
|
||||||
|
|
||||||
private val SAFE_EXTERNAL_BOOLEAN = Pattern.compile("^// *SAFE_EXTERNAL_BOOLEAN *$", Pattern.MULTILINE)
|
private val SAFE_EXTERNAL_BOOLEAN = Pattern.compile("^// *SAFE_EXTERNAL_BOOLEAN *$", Pattern.MULTILINE)
|
||||||
|
private val SAFE_EXTERNAL_BOOLEAN_DIAGNOSTIC = Pattern.compile("^// *SAFE_EXTERNAL_BOOLEAN_DIAGNOSTIC: *(.+)$", Pattern.MULTILINE)
|
||||||
|
|
||||||
@JvmStatic
|
@JvmStatic
|
||||||
protected val runTestInNashorn = getBoolean("kotlin.js.useNashorn")
|
protected val runTestInNashorn = getBoolean("kotlin.js.useNashorn")
|
||||||
@@ -1137,3 +1151,14 @@ class KotlinJsTestLogger {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun RuntimeDiagnostic.Companion.resolve(
|
||||||
|
value: String?,
|
||||||
|
): RuntimeDiagnostic? = when (value?.lowercase()) {
|
||||||
|
K2JsArgumentConstants.RUNTIME_DIAGNOSTIC_LOG -> RuntimeDiagnostic.LOG
|
||||||
|
K2JsArgumentConstants.RUNTIME_DIAGNOSTIC_EXCEPTION -> RuntimeDiagnostic.EXCEPTION
|
||||||
|
null -> null
|
||||||
|
else -> {
|
||||||
|
null
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -16,6 +16,7 @@ import org.jetbrains.kotlin.ir.declarations.impl.IrFactoryImpl
|
|||||||
import org.jetbrains.kotlin.ir.declarations.persistent.PersistentIrFactory
|
import org.jetbrains.kotlin.ir.declarations.persistent.PersistentIrFactory
|
||||||
import org.jetbrains.kotlin.js.config.JSConfigurationKeys
|
import org.jetbrains.kotlin.js.config.JSConfigurationKeys
|
||||||
import org.jetbrains.kotlin.js.config.JsConfig
|
import org.jetbrains.kotlin.js.config.JsConfig
|
||||||
|
import org.jetbrains.kotlin.js.config.RuntimeDiagnostic
|
||||||
import org.jetbrains.kotlin.js.facade.MainCallParameters
|
import org.jetbrains.kotlin.js.facade.MainCallParameters
|
||||||
import org.jetbrains.kotlin.js.facade.TranslationUnit
|
import org.jetbrains.kotlin.js.facade.TranslationUnit
|
||||||
import org.jetbrains.kotlin.name.FqName
|
import org.jetbrains.kotlin.name.FqName
|
||||||
@@ -96,6 +97,7 @@ abstract class BasicIrBoxTest(
|
|||||||
splitPerModule: Boolean,
|
splitPerModule: Boolean,
|
||||||
propertyLazyInitialization: Boolean,
|
propertyLazyInitialization: Boolean,
|
||||||
safeExternalBoolean: Boolean,
|
safeExternalBoolean: Boolean,
|
||||||
|
safeExternalBooleanDiagnostic: RuntimeDiagnostic?,
|
||||||
) {
|
) {
|
||||||
val filesToCompile = units.map { (it as TranslationUnit.SourceFile).file }
|
val filesToCompile = units.map { (it as TranslationUnit.SourceFile).file }
|
||||||
|
|
||||||
@@ -153,6 +155,7 @@ abstract class BasicIrBoxTest(
|
|||||||
propertyLazyInitialization = propertyLazyInitialization,
|
propertyLazyInitialization = propertyLazyInitialization,
|
||||||
lowerPerModule = lowerPerModule,
|
lowerPerModule = lowerPerModule,
|
||||||
safeExternalBoolean = safeExternalBoolean,
|
safeExternalBoolean = safeExternalBoolean,
|
||||||
|
safeExternalBooleanDiagnostic = safeExternalBooleanDiagnostic,
|
||||||
)
|
)
|
||||||
|
|
||||||
compiledModule.jsCode!!.writeTo(outputFile, config)
|
compiledModule.jsCode!!.writeTo(outputFile, config)
|
||||||
@@ -183,6 +186,7 @@ abstract class BasicIrBoxTest(
|
|||||||
multiModule = splitPerModule || perModule,
|
multiModule = splitPerModule || perModule,
|
||||||
propertyLazyInitialization = propertyLazyInitialization,
|
propertyLazyInitialization = propertyLazyInitialization,
|
||||||
safeExternalBoolean = safeExternalBoolean,
|
safeExternalBoolean = safeExternalBoolean,
|
||||||
|
safeExternalBooleanDiagnostic = safeExternalBooleanDiagnostic,
|
||||||
).jsCode!!.writeTo(pirOutputFile, config)
|
).jsCode!!.writeTo(pirOutputFile, config)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
Generated
+5
@@ -6827,6 +6827,11 @@ public class IrBoxJsES6TestGenerated extends AbstractIrBoxJsES6Test {
|
|||||||
runTest("js/js.translator/testData/box/propertyAccess/booleanInExternals.kt");
|
runTest("js/js.translator/testData/box/propertyAccess/booleanInExternals.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("booleanInExternalsWithDiagnostic.kt")
|
||||||
|
public void testBooleanInExternalsWithDiagnostic() throws Exception {
|
||||||
|
runTest("js/js.translator/testData/box/propertyAccess/booleanInExternalsWithDiagnostic.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("classUsesPackageProperties.kt")
|
@TestMetadata("classUsesPackageProperties.kt")
|
||||||
public void testClassUsesPackageProperties() throws Exception {
|
public void testClassUsesPackageProperties() throws Exception {
|
||||||
runTest("js/js.translator/testData/box/propertyAccess/classUsesPackageProperties.kt");
|
runTest("js/js.translator/testData/box/propertyAccess/classUsesPackageProperties.kt");
|
||||||
|
|||||||
+5
@@ -6827,6 +6827,11 @@ public class IrBoxJsTestGenerated extends AbstractIrBoxJsTest {
|
|||||||
runTest("js/js.translator/testData/box/propertyAccess/booleanInExternals.kt");
|
runTest("js/js.translator/testData/box/propertyAccess/booleanInExternals.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("booleanInExternalsWithDiagnostic.kt")
|
||||||
|
public void testBooleanInExternalsWithDiagnostic() throws Exception {
|
||||||
|
runTest("js/js.translator/testData/box/propertyAccess/booleanInExternalsWithDiagnostic.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("classUsesPackageProperties.kt")
|
@TestMetadata("classUsesPackageProperties.kt")
|
||||||
public void testClassUsesPackageProperties() throws Exception {
|
public void testClassUsesPackageProperties() throws Exception {
|
||||||
runTest("js/js.translator/testData/box/propertyAccess/classUsesPackageProperties.kt");
|
runTest("js/js.translator/testData/box/propertyAccess/classUsesPackageProperties.kt");
|
||||||
|
|||||||
+50
@@ -0,0 +1,50 @@
|
|||||||
|
// TARGET_BACKEND: JS_IR
|
||||||
|
// SAFE_EXTERNAL_BOOLEAN_DIAGNOSTIC: EXCEPTION
|
||||||
|
|
||||||
|
@JsName("Error")
|
||||||
|
internal open external class JsError(message: String) : Throwable
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
val interfaceWithBoolean: InterfaceWithBoolean = js("{}")
|
||||||
|
try {
|
||||||
|
C().c = interfaceWithBoolean.foo
|
||||||
|
} catch (e: JsError) {
|
||||||
|
if (e.message.asDynamic().includes("Boolean expected for")) {
|
||||||
|
return "OK"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return "fail"
|
||||||
|
}
|
||||||
|
|
||||||
|
abstract class A<T> {
|
||||||
|
open fun get(): T {
|
||||||
|
return this.asDynamic()["attr"].unsafeCast<T>()
|
||||||
|
}
|
||||||
|
|
||||||
|
open fun set(value: T) {
|
||||||
|
this.asDynamic()["attr"] = value
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class B : A<Boolean>() {
|
||||||
|
override fun set(value: Boolean) {
|
||||||
|
if (value) {
|
||||||
|
this.asDynamic()["attr"] = value
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
val b: A<Boolean> = B()
|
||||||
|
|
||||||
|
class C {
|
||||||
|
var c: Boolean
|
||||||
|
get() = b.get()
|
||||||
|
set(newValue) {
|
||||||
|
b.set(newValue)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
external interface InterfaceWithBoolean {
|
||||||
|
var foo: Boolean
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user