Closed NikolaDespotoski closed 3 years ago
Multiple-round is implemented with recursion in Kotlin JVM compiler. The StackOverflowError
is probably due to too many rounds, which in turn is a result of new file(s) generated at each round. Can you check whether there is a file always being generated, repeatedly?
I've looked at multiple-round notes and the stackoverflow is gone. Probably the order of annotation doesn't contribute to issue, but the already generated files and processed symbols. Thank you for pointing me to the right direction.
I guess I should also try to limit the max rounds allowed, can you add a round counter to the offending code so that I can know the max rounds executed before it stack overflows?
I don't know how internals of KSP work but I assume it is expected that number of symbols found is the amount of rounds, I did something like this:
private var rounds = 0
private var expectedRounds = 0
override fun process(resolver: Resolver): List<KSAnnotated> {
if(rounds > expectedRounds){
environment.logger.warn("Rounds: ${++rounds} expected: $expectedRounds")
return emptyList()
}
rounds++
val allServiceInterfaces = resolver.getSymbolsWithAnnotation("...")
expectedRounds = allServiceInterfaces.count()
environment.logger.warn("Expecting $expectedRounds rounds")
if (expectedRounds == 0) {
return emptyList()
}
//...other code
return allServiceInterfaces.toList()
}
Output:
[ksp] Rounds: 3 expected: 1
On the other hand there are 955 calls to org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler.repeatAnalysisIfNeeded(KotlinToJVMBytecodeCompiler.kt:213)
in the stacktrace.
Resolver
is unable to resolve symbols annotated with given annotation when the provided argument annotation is not direct to the class:Note the order of the annotations
OK:
NOT OK:
The processor:
Also if I try:
I get the same result, but this time unable to iterate over the sequence to find the
count()
Annotations:
Trace: