Showkase icon indicating copy to clipboard operation
Showkase copied to clipboard

Showkase don't work with KSP2 and Room 2.7

Open StefMa opened this issue 7 months ago • 1 comments

Right know, KSP2, Room 2.7 and Showkase 1.0.3 doesn't work together.

KSP2 was released here: https://github.com/google/ksp/releases/tag/2.1.20-2.0.0

Bumped version to 2.0.0 and enabled KSP2 by default!

There is an issue with Room 2.6.X and KSP2, mentioned here: https://github.com/google/ksp/issues/1896

So at this time, Room 2.6.X and KSP2 can't be used together.

This is fixed with Room 2.7. Confirmed here: https://github.com/google/ksp/issues/1896#issuecomment-2790467140

At this time, Room 2.7 and KSP2 working together 🎉

However, now Showkase makes a problem. When building an project (Gradle module), that uses Room 2.7 and Showkase-Processor (KSP), the following error is thrown:

e: [ksp] java.lang.NoSuchMethodError: 'androidx.room.compiler.processing.XAnnotationBox androidx.room.compiler.processing.XMethodElement.getAnnotation(kotlin.reflect.KClass)'
        at com.airbnb.android.showkase.processor.models.ShowkaseMetadataKt.getShowkaseMetadataFromPreview(ShowkaseMetadata.kt:274)
        at com.airbnb.android.showkase.processor.ShowkaseProcessor.processPreviewAnnotation(ShowkaseProcessor.kt:152)
        at com.airbnb.android.showkase.processor.ShowkaseProcessor.processComponentAnnotation(ShowkaseProcessor.kt:101)
        at com.airbnb.android.showkase.processor.ShowkaseProcessor.process(ShowkaseProcessor.kt:84)
        at com.airbnb.android.showkase.processor.BaseProcessor.internalProcess(BaseProcessor.kt:95)
        at com.airbnb.android.showkase.processor.BaseProcessor.process(BaseProcessor.kt:80)
        at com.google.devtools.ksp.impl.KotlinSymbolProcessing$execute$1$1.invoke(KotlinSymbolProcessing.kt:579)
        at com.google.devtools.ksp.impl.KotlinSymbolProcessing$execute$1$1.invoke(KotlinSymbolProcessing.kt:577)
        at ksp.com.google.devtools.ksp.common.IncrementalContextBase.closeFilesOnException(IncrementalContextBase.kt:400)
        at com.google.devtools.ksp.impl.KotlinSymbolProcessing.execute(KotlinSymbolProcessing.kt:577)
        at com.google.devtools.ksp.impl.KSPLoader$Companion.loadAndRunKSP(KSPLoader.kt:37)
        at com.google.devtools.ksp.impl.KSPLoader.loadAndRunKSP(KSPLoader.kt)
        at jdk.internal.reflect.GeneratedMethodAccessor2302.invoke(Unknown Source)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:568)
        at com.google.devtools.ksp.gradle.KspAAWorkerAction.execute(KspAATask.kt:591)
        at org.gradle.workers.internal.DefaultWorkerServer.execute(DefaultWorkerServer.java:63)
        at org.gradle.workers.internal.NoIsolationWorkerFactory$1$1.create(NoIsolationWorkerFactory.java:66)
        at org.gradle.workers.internal.NoIsolationWorkerFactory$1$1.create(NoIsolationWorkerFactory.java:62)
        at org.gradle.internal.classloader.ClassLoaderUtils.executeInClassloader(ClassLoaderUtils.java:100)
        at org.gradle.workers.internal.NoIsolationWorkerFactory$1.lambda$execute$0(NoIsolationWorkerFactory.java:62)
        at org.gradle.workers.internal.AbstractWorker$1.call(AbstractWorker.java:44)
        at org.gradle.workers.internal.AbstractWorker$1.call(AbstractWorker.java:41)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:210)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:205)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:67)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:60)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:167)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:60)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:54)
        at org.gradle.workers.internal.AbstractWorker.executeWrappedInBuildOperation(AbstractWorker.java:41)
        at org.gradle.workers.internal.NoIsolationWorkerFactory$1.execute(NoIsolationWorkerFactory.java:59)
        at org.gradle.workers.internal.DefaultWorkerExecutor.lambda$submitWork$0(DefaultWorkerExecutor.java:174)
        at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
        at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.runExecution(DefaultConditionalExecutionQueue.java:194)
        at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.access$700(DefaultConditionalExecutionQueue.java:127)
        at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner$1.run(DefaultConditionalExecutionQueue.java:169)
        at org.gradle.internal.Factories$1.create(Factories.java:31)
        at org.gradle.internal.work.DefaultWorkerLeaseService.withLocks(DefaultWorkerLeaseService.java:263)
        at org.gradle.internal.work.DefaultWorkerLeaseService.runAsWorkerThread(DefaultWorkerLeaseService.java:127)
        at org.gradle.internal.work.DefaultWorkerLeaseService.runAsWorkerThread(DefaultWorkerLeaseService.java:132)
        at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.runBatch(DefaultConditionalExecutionQueue.java:164)
        at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.run(DefaultConditionalExecutionQueue.java:133)
        at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539)
        at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
        at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
        at org.gradle.internal.concurrent.AbstractManagedExecutor$1.run(AbstractManagedExecutor.java:48)
        at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
        at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
        at java.base/java.lang.Thread.run(Thread.java:833)

Showkase is using XAnnotationBox https://github.com/airbnb/Showkase/blob/30137accd7b0d99acc679b69d05fae366b5e6975/showkase-processor/src/main/java/com/airbnb/android/showkase/processor/models/ShowkaseMetadata.kt#L4

But it got removed by room in 2.7.0. See https://github.com/androidx/androidx/commit/f5b5a2249c78af7b126050986cc262e0dacc8c7c

StefMa avatar May 14 '25 12:05 StefMa

There is a branch here solving the issue #405. But it hasn't been updated for a while and I don't know the status of where it is at currently.

mubaarakhassan avatar Jun 18 '25 09:06 mubaarakhassan

This is now supported as part of the 1.0.5 release - https://github.com/airbnb/Showkase/releases/tag/1.0.5

vinaygaba avatar Aug 05 '25 18:08 vinaygaba