<lambda>null1 import com.google.devtools.ksp.getClassDeclarationByName
2 import com.google.devtools.ksp.processing.*
3 import com.google.devtools.ksp.symbol.*
4 import com.google.devtools.ksp.validate
5 import com.google.devtools.ksp.visitor.KSDefaultVisitor
6 import java.io.OutputStreamWriter
7
8 class Validator : SymbolProcessor {
9 lateinit var codeGenerator: CodeGenerator
10 lateinit var logger: KSPLogger
11 var processed = false
12
13 fun init(
14 options: Map<String, String>,
15 kotlinVersion: KotlinVersion,
16 codeGenerator: CodeGenerator,
17 logger: KSPLogger,
18 ) {
19 this.codeGenerator = codeGenerator
20 this.logger = logger
21 }
22
23 override fun process(resolver: Resolver): List<KSAnnotated> {
24 if (processed) {
25 return emptyList()
26 }
27 val validator = object : KSDefaultVisitor<OutputStreamWriter, Unit>() {
28 override fun defaultHandler(node: KSNode, data: OutputStreamWriter) = Unit
29
30 override fun visitDeclaration(declaration: KSDeclaration, data: OutputStreamWriter) {
31 data.write(declaration.qualifiedName?.asString() ?: declaration.simpleName.asString())
32 declaration.validate()
33 }
34 }
35
36 // for each file, create an output from it and everything reachable from it.
37 val files = resolver.getAllFiles()
38 files.forEach { file ->
39 logger.warn("${file.packageName.asString()}/${file.fileName}")
40 val output = OutputStreamWriter(
41 codeGenerator.createNewFile(
42 Dependencies(false, file),
43 file.packageName.asString(),
44 file.fileName,
45 "log"
46 )
47 )
48 file.declarations.forEach {
49 it.accept(validator, output)
50 }
51 output.close()
52 }
53
54 // create an output from k3 + l4
55 val k3 = resolver.getClassDeclarationByName("p1.K3")!!
56 val l4 = resolver.getClassDeclarationByName("p1.L4")!!
57 codeGenerator.createNewFile(Dependencies(false), "p1", "l4", "log")
58 codeGenerator.associateWithClasses(listOf(k3, l4), "p1", "l4", "log")
59
60 // create an output from l5
61 val l5 = resolver.getClassDeclarationByName("p1.L5")!!
62 codeGenerator.createNewFile(Dependencies(false), "p1", "l5", "log")
63 codeGenerator.associateWithClasses(listOf(l5), "p1", "l5", "log")
64 logger.warn("processing done")
65
66 processed = true
67 return emptyList()
68 }
69 }
70
71 class TestProcessorProvider : SymbolProcessorProvider {
createnull72 override fun create(
73 env: SymbolProcessorEnvironment,
74 ): SymbolProcessor {
75 return Validator().apply {
76 init(env.options, env.kotlinVersion, env.codeGenerator, env.logger)
77 }
78 }
79 }
80