Skip to content

Instantly share code, notes, and snippets.

View Morfly's full-sized avatar

Pavlo Stavytskyi Morfly

View GitHub Profile
@Morfly
Morfly / FunctionProcessor.kt
Last active July 15, 2021 18:54
KSP function processor, process function
class FunctionProcessor(...) : SymbolProcessor {
override fun process(resolver: Resolver): List<KSAnnotated> {
val symbols = resolver
.getSymbolsWithAnnotation("com.morfly.Function")
.filterIsInstance<KSClassDeclaration>()
if (!symbols.iterator().hasNext()) return emptyList()
}
}
@Morfly
Morfly / FunctionProcessor.kt
Last active July 15, 2021 18:55
KSP, function processor, process function complete
class FunctionProcessor(...) : SymbolProcessor {
override fun process(resolver: Resolver): List<KSAnnotated> {
val symbols = resolver
.getSymbolsWithAnnotation("com.morfly.Function")
.filterIsInstance<KSClassDeclaration>()
if (!symbols.iterator().hasNext()) return emptyList()
val file: OutputStream = codeGenerator.createNewFile(
@Morfly
Morfly / FunctionProcessorProvider.kt
Last active July 15, 2021 19:07
KSP sample processor provider
package com.morfly
class FunctionProcessorProvider : SymbolProcessorProvider {
override fun create(environment: SymbolProcessorEnvironment): SymbolProcessor {
return FunctionProcessor(
codeGenerator = environment.codeGenerator,
logger = environment.logger,
options = environment.options
)
@Morfly
Morfly / Function.kt
Created July 15, 2021 19:07
KSP sample annotation
package com.morfly
@Target(AnnotationTarget.CLASS)
annotation class Function(val name: String)
interface KSVisitor<D, R> {
fun visitNode(node: KSNode, data: D): R
fun visitClassDeclaration(classDeclaration: KSClassDeclaration, data: D): R
fun visitPropertyDeclaration(property: KSPropertyDeclaration, data: D): R
// ~20 more functions
}
interface KSNode {
...
fun <D, R> accept(visitor: KSVisitor<D, R>, data: D): R
}
class KSPropertyDeclarationImpl(...) : KSPropertyDeclaration, ... {
...
override fun <D, R> accept(visitor: KSVisitor<D, R>, data: D): R {
return visitor.visitPropertyDeclaration(this, data)
}
}
...
kotlin {
sourceSets {
main {
kotlin.srcDirs(file("$buildDir/generated/ksp/main/kotlin"))
}
}
}
class FunctionProcessor(...) : SymbolProcessor {
...
inner class Visitor(private val file: OutputStream) : KSVisitorVoid() {
override fun visitClassDeclaration(classDeclaration: KSClassDeclaration, data: Unit) {
}
override fun visitPropertyDeclaration(property: KSPropertyDeclaration, data: Unit) {
}
package com.morfly
@Function(name = "myAmazingFunction")
interface MyAmazingFunction
fun main() {
println("Hello World!")
}