rra/ilgonmic/after-test-promise

[JS] Node downloading for js ir integration kotlin test

[JS] Fix API of Promise

[JS IR] Promise symbol as lazy2

[JS] Support legacy compiler aftertest with promises

[JS IR] Generate finally for promised tests

[JS] Setup it tests for JS IR kotlin-test

Merge-request: KT-MR-5168

^KT-49738 fixed
This commit is contained in:
Ilya Goncharov
2021-12-08 08:22:53 +00:00
committed by Space
parent bdeae7668e
commit 0c74376cc4
13 changed files with 258 additions and 11 deletions
@@ -21,6 +21,7 @@ import org.jetbrains.kotlin.js.backend.ast.*
import org.jetbrains.kotlin.js.translate.callTranslator.CallTranslator
import org.jetbrains.kotlin.js.translate.context.TranslationContext
import org.jetbrains.kotlin.js.translate.reference.ReferenceTranslator
import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.FqNameUnsafe
import org.jetbrains.kotlin.name.Name
@@ -121,14 +122,37 @@ class JSTestGenerator(val context: TranslationContext) {
if (afterDescriptors.isEmpty()) {
functionToTest.body.statements += JsReturn(functionDescriptor.buildCall())
return functionToTest
}
else {
functionToTest.body.statements += JsTry(
JsBlock(JsReturn(functionDescriptor.buildCall())),
listOf(),
JsBlock(afterDescriptors.map { it.buildCall().makeStmt() }))
val declarationDescriptor: ClassifierDescriptor? = functionDescriptor.returnType?.constructor?.declarationDescriptor
val promiseClass = findPromise()
if (declarationDescriptor == promiseClass) {
val call = functionDescriptor.buildCall()
val finallyDescriptor = DescriptorUtils.getFunctionByName(promiseClass.unsubstitutedMemberScope, Name.identifier("finally"))
functionToTest.body.statements += JsReturn(
CallTranslator.buildCall(
context,
finallyDescriptor,
listOf(
JsFunction(
scope,
JsBlock(afterDescriptors.map { it.buildCall().makeStmt() }),
"function for after funs test"
)
),
call
)
)
return functionToTest
}
functionToTest.body.statements += JsTry(
JsBlock(JsReturn(functionDescriptor.buildCall())),
listOf(),
JsBlock(afterDescriptors.map { it.buildCall().makeStmt() })
)
return functionToTest
}
@@ -142,6 +166,9 @@ class JSTestGenerator(val context: TranslationContext) {
}
}
fun findPromise(): ClassDescriptor =
context.currentModule.findClassAcrossModuleDependencies(ClassId.topLevel(promiseFqName))!!
private val suiteRef: JsExpression by lazy { findFunction("suite") }
private val testRef: JsExpression by lazy { findFunction("test") }
@@ -164,6 +191,8 @@ class JSTestGenerator(val context: TranslationContext) {
private val FunctionDescriptor.isAfter
get() = annotationFinder("AfterTest", "kotlin.test")
private val promiseFqName = FqName("kotlin.js.Promise")
private fun DeclarationDescriptor.annotationFinder(shortName: String, vararg packages: String) = packages.any { packageName ->
annotations.hasAnnotation(FqName("$packageName.$shortName"))
}