<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