Skip to content

Commit 2f626ed

Browse files
committed
Worklets. Add extension
1 parent 2c51ae0 commit 2f626ed

4 files changed

Lines changed: 84 additions & 0 deletions

File tree

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package seskar.compiler.worklets.backend
2+
3+
import org.jetbrains.kotlin.ir.declarations.IrProperty
4+
import org.jetbrains.kotlin.ir.types.classFqName
5+
import org.jetbrains.kotlin.ir.util.isTopLevel
6+
import org.jetbrains.kotlin.name.FqName
7+
8+
internal const val WORKLET_MODULE_DELIMITER = "$$"
9+
10+
private val WORKLET_MODULES = setOf(
11+
FqName("web.audio.AudioWorkletModule"),
12+
FqName("web.css.painting.PaintWorkletModule"),
13+
)
14+
15+
internal fun IrProperty.isWorkletModule(): Boolean =
16+
isTopLevel && getter?.returnType?.classFqName in WORKLET_MODULES
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package seskar.compiler.worklets.backend
2+
3+
import org.jetbrains.kotlin.backend.common.extensions.IrPluginContext
4+
import org.jetbrains.kotlin.ir.IrStatement
5+
import org.jetbrains.kotlin.ir.declarations.IrProperty
6+
import org.jetbrains.kotlin.ir.declarations.name
7+
import org.jetbrains.kotlin.ir.util.file
8+
import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid
9+
import seskar.compiler.common.backend.JsFileName
10+
import seskar.compiler.common.backend.JsName
11+
12+
internal class WorkletTransformer(
13+
private val context: IrPluginContext,
14+
) : IrElementTransformerVoid() {
15+
override fun visitProperty(declaration: IrProperty): IrStatement {
16+
if (!declaration.isWorkletModule())
17+
return declaration
18+
19+
val fileName = declaration.file.name.removeSuffix(".kt")
20+
declaration.file.annotations += JsFileName(context, "${fileName}__worklet__module")
21+
22+
val jsName = sequenceOf(
23+
fileName,
24+
declaration.name.identifier,
25+
).joinToString(
26+
separator = WORKLET_MODULE_DELIMITER,
27+
prefix = WORKLET_MODULE_DELIMITER,
28+
postfix = WORKLET_MODULE_DELIMITER,
29+
)
30+
31+
declaration.annotations += JsName(context, jsName)
32+
33+
return super.visitProperty(declaration)
34+
}
35+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package seskar.compiler.worklets.extensions
2+
3+
import org.jetbrains.kotlin.backend.common.extensions.IrGenerationExtension
4+
import org.jetbrains.kotlin.backend.common.extensions.IrPluginContext
5+
import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
6+
import org.jetbrains.kotlin.platform.isJs
7+
import seskar.compiler.worklets.backend.WorkletTransformer
8+
9+
internal class WorkletExtension : IrGenerationExtension {
10+
override fun generate(
11+
moduleFragment: IrModuleFragment,
12+
pluginContext: IrPluginContext,
13+
) {
14+
pluginContext.platform
15+
?.takeIf { it.isJs() }
16+
?: return
17+
18+
moduleFragment.transformChildren(WorkletTransformer(pluginContext), null)
19+
}
20+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package seskar.compiler.worklets.extensions
2+
3+
import org.jetbrains.kotlin.backend.common.extensions.IrGenerationExtension
4+
import org.jetbrains.kotlin.config.CompilerConfiguration
5+
import seskar.compiler.common.extensions.JsCompilerPluginRegistrar
6+
7+
class WorkletRegistrar : JsCompilerPluginRegistrar() {
8+
override fun ExtensionStorage.registerExtensions(
9+
configuration: CompilerConfiguration,
10+
) {
11+
IrGenerationExtension.registerExtension(WorkletExtension())
12+
}
13+
}

0 commit comments

Comments
 (0)