Hello! I am trying to find all PsiClasses annotated with spring @Service annotation:
val serviceAnnotation = JavaPsiFacade.getInstance(project).findClass(
"org.springframework.stereotype.Service",
scope
) ?: return emptyMap()
val serviceClasses = AnnotatedElementsSearch.searchPsiClasses(serviceAnnotation, scope)
I run it in tests. This search works fine for java classes, but as soon as it encounters a kotlin class, I get an error:
Stacktrace
Access to tree elements not allowed for ‘/Users/nbundin/.m2/repository/com/solanteq/solar/solar-commons/3.4.9.1.RELEASE/solar-commons-3.4.9.1.RELEASE.jar!/com/solanteq/solar/commons/l10n/service/impl/L10nPluralizeServiceImpl.class’.
Try using stub-based PSI API to avoid expensive AST loading for files that aren’t already opened in the editor.
Consult this method’s javadoc for more details.
java.lang.Throwable: Access to tree elements not allowed for ‘/Users/nbundin/.m2/repository/com/solanteq/solar/solar-commons/3.4.9.1.RELEASE/solar-commons-3.4.9.1.RELEASE.jar!/com/solanteq/solar/commons/l10n/service/impl/L10nPluralizeServiceImpl.class’.
Try using stub-based PSI API to avoid expensive AST loading for files that aren’t already opened in the editor.
Consult this method’s javadoc for more details.
at com.intellij.openapi.diagnostic.Logger.error(Logger.java:375)
at com.intellij.psi.impl.source.PsiFileImpl.reportProhibitedAstAccess(PsiFileImpl.java:265)
at com.intellij.psi.impl.source.PsiFileImpl.loadTreeElement(PsiFileImpl.java:213)
at com.intellij.psi.impl.source.PsiFileImpl.calcTreeElement(PsiFileImpl.java:844)
at com.intellij.extapi.psi.StubBasedPsiElementBase.getNode(StubBasedPsiElementBase.java:133)
at com.intellij.extapi.psi.ASTDelegatePsiElement.getText(ASTDelegatePsiElement.java:136)
at org.jetbrains.kotlin.resolve.TypeResolver$resolveTypeElement$1.visitUserType(TypeResolver.kt:264)
at org.jetbrains.kotlin.psi.KtVisitorVoid.visitUserType(KtVisitorVoid.java:943)
at org.jetbrains.kotlin.psi.KtVisitorVoid.visitUserType(KtVisitorVoid.java:21)
at org.jetbrains.kotlin.psi.KtUserType.accept(KtUserType.java:42)
at org.jetbrains.kotlin.psi.KtElementImplStub.accept(KtElementImplStub.java:49)
at org.jetbrains.kotlin.resolve.TypeResolver.resolveTypeElement(TypeResolver.kt:257)
at org.jetbrains.kotlin.resolve.TypeResolver.resolvePossiblyBareType(TypeResolver.kt:136)
at org.jetbrains.kotlin.resolve.TypeResolver.resolveType(TypeResolver.kt:126)
at org.jetbrains.kotlin.resolve.TypeResolver.resolveType(TypeResolver.kt:97)
at org.jetbrains.kotlin.resolve.AnnotationResolverImpl.resolveAnnotationType(AnnotationResolverImpl.java:128)
at org.jetbrains.kotlin.resolve.lazy.descriptors.LazyAnnotationDescriptor.type_delegate$lambda$3(LazyAnnotations.kt:83)
at org.jetbrains.kotlin.storage.LockBasedStorageManager$LockBasedLazyValue.invoke(LockBasedStorageManager.java:408)
at org.jetbrains.kotlin.storage.LockBasedStorageManager$LockBasedNotNullLazyValue.invoke(LockBasedStorageManager.java:527)
at org.jetbrains.kotlin.storage.StorageKt.getValue(storage.kt:42)
at org.jetbrains.kotlin.resolve.lazy.descriptors.LazyAnnotationDescriptor.getType(LazyAnnotations.kt:81)
at org.jetbrains.kotlin.resolve.lazy.descriptors.LazyAnnotationDescriptor.forceResolveAllContents(LazyAnnotations.kt:137)
at org.jetbrains.kotlin.resolve.lazy.ForceResolveUtil.doForceResolveAllContents(ForceResolveUtil.java:78)
at org.jetbrains.kotlin.resolve.lazy.ForceResolveUtil.forceResolveAllContents(ForceResolveUtil.java:69)
at org.jetbrains.kotlin.idea.project.ResolveElementCache.doResolveAnnotations(ResolveElementCache.kt:585)
at org.jetbrains.kotlin.idea.project.ResolveElementCache.annotationAdditionalResolve(ResolveElementCache.kt:570)
at org.jetbrains.kotlin.idea.project.ResolveElementCache.performElementAdditionalResolve(ResolveElementCache.kt:497)
at org.jetbrains.kotlin.idea.project.ResolveElementCache.getElementsAdditionalResolve(ResolveElementCache.kt:188)
at org.jetbrains.kotlin.idea.project.ResolveElementCache.getElementsAdditionalResolve(ResolveElementCache.kt:195)
at org.jetbrains.kotlin.idea.project.ResolveElementCache.getElementsAdditionalResolve(ResolveElementCache.kt:143)
at org.jetbrains.kotlin.idea.project.ResolveElementCache.resolveToElements(ResolveElementCache.kt:311)
at org.jetbrains.kotlin.idea.caches.resolve.ModuleResolutionFacadeImpl.analyze$lambda$6(ModuleResolutionFacadeImpl.kt:71)
at com.intellij.openapi.progress.impl.CancellationCheck.withCancellationCheck(CancellationCheck.kt:59)
at com.intellij.openapi.progress.impl.CancellationCheck$Companion.runWithCancellationCheck(CancellationCheck.kt:105)
at org.jetbrains.kotlin.idea.util.application.ApplicationUtilsKt.runWithCancellationCheck(ApplicationUtils.kt:64)
at org.jetbrains.kotlin.idea.caches.resolve.ModuleResolutionFacadeImpl.analyze(ModuleResolutionFacadeImpl.kt:70)
at org.jetbrains.kotlin.idea.caches.resolve.ResolutionFacadeWithDebugInfo.analyze(ResolutionFacadeWithDebugInfo.kt:49)
at org.jetbrains.kotlin.base.fe10.analysis.IdeFe10AnalysisFacade.analyze(IdeFe10AnalysisFacade.kt:94)
at org.jetbrains.kotlin.analysis.api.descriptors.Fe10AnalysisFacade.analyze(Fe10AnalysisFacade.kt:41)
at org.jetbrains.kotlin.analysis.api.descriptors.Fe10AnalysisContext.analyze(Fe10AnalysisFacade.kt)
at org.jetbrains.kotlin.analysis.api.descriptors.components.KaFe10Resolver.doResolveCall(KaFe10Resolver.kt:127)
at org.jetbrains.kotlin.analysis.api.impl.base.components.KaBaseResolver.resolveToCall(KaBaseResolver.kt:32)
at org.jetbrains.kotlin.analysis.api.impl.base.KaBaseSession.resolveToCall(KaBaseSession.kt)
at org.jetbrains.kotlin.idea.base.searching.KotlinAnnotatedElementsSearcher$Companion.processAnnotatedMembers$lambda$6(KotlinAnnotatedElementsSearcher.kt:140)
at com.intellij.openapi.application.ActionsKt.runReadAction$lambda$3(actions.kt:25)
at com.intellij.platform.locking.impl.NestedLocksThreadingSupport.runReadAction(NestedLocksThreadingSupport.kt:784)
at com.intellij.openapi.application.impl.ApplicationImpl.runReadAction(ApplicationImpl.java:1038)
at com.intellij.openapi.application.ActionsKt.runReadAction(actions.kt:25)
at org.jetbrains.kotlin.idea.base.searching.KotlinAnnotatedElementsSearcher$Companion.processAnnotatedMembers(KotlinAnnotatedElementsSearcher.kt:123)
at org.jetbrains.kotlin.idea.base.searching.KotlinAnnotatedElementsSearcher$Companion.processAnnotatedMembers$default(KotlinAnnotatedElementsSearcher.kt:108)
at org.jetbrains.kotlin.idea.base.searching.KotlinAnnotatedElementsSearcher.execute(KotlinAnnotatedElementsSearcher.kt:47)
at org.jetbrains.kotlin.idea.base.searching.KotlinAnnotatedElementsSearcher.execute(KotlinAnnotatedElementsSearcher.kt:44)
at com.intellij.util.ExecutorsQuery.processResults(ExecutorsQuery.java:31)
at com.intellij.util.AbstractQuery.doProcessResults(AbstractQuery.java:84)
at com.intellij.util.AbstractQuery.delegateProcessResults(AbstractQuery.java:101)
at com.intellij.util.InstanceofQuery.processResults(InstanceofQuery.java:22)
at com.intellij.util.AbstractQuery.doProcessResults(AbstractQuery.java:84)
at com.intellij.util.AbstractQuery.forEach(AbstractQuery.java:76)
at com.intellij.util.AbstractQuery.findAll(AbstractQuery.java:25)
at com.intellij.util.Query.asIterable(Query.kt:140)
at com.intellij.util.Query.iterator(Query.kt:153)
at com.intellij.util.AbstractQuery.iterator(AbstractQuery.java:35)
at com.solanteq.solar.plugin.callable.CallableServiceSearch.doFindAllServices(CallableServiceSearch.kt:104)
at com.solanteq.solar.plugin.callable.CallableServiceSearch.findAllServices$lambda$0(CallableServiceSearch.kt:32)
at com.intellij.psi.impl.AbstractPsiCachedValue.doCompute(PsiCachedValueImpl.kt:21)
at com.intellij.util.CachedValueBase.lambda$getValueWithLock$3(CachedValueBase.java:299)
at com.intellij.util.CachedValueBase.computeData(CachedValueBase.java:37)
at com.intellij.util.CachedValueBase.lambda$getValueWithLock$4(CachedValueBase.java:299)
at com.intellij.openapi.util.RecursionManager$1.computePreventingRecursion(RecursionManager.java:113)
at com.intellij.openapi.util.RecursionGuard.doPreventingRecursion(RecursionGuard.java:28)
at com.intellij.openapi.util.RecursionManager.doPreventingRecursion(RecursionManager.java:68)
at com.intellij.util.CachedValueBase.getValueWithLock(CachedValueBase.java:300)
at com.intellij.psi.impl.AbstractPsiCachedValue.getValue(PsiCachedValueImpl.kt:15)
at com.intellij.util.CachedValuesManagerImpl.getCachedValue(CachedValuesManagerImpl.java:83)
at com.solanteq.solar.plugin.callable.CallableServiceSearch.findAllServices(CallableServiceSearch.kt:27)
at com.solanteq.solar.plugin.callable.CallableServiceSearch.findService(CallableServiceSearch.kt:65)
at com.solanteq.solar.plugin.form.common.element.request.FormRequestData.referencedService_delegate$lambda$0(FormRequestData.kt:79)
at kotlin.SafePublicationLazyImpl.getValue(LazyJVM.kt:125)
at com.solanteq.solar.plugin.form.common.element.request.FormRequestData.getReferencedService(FormRequestData.kt:76)
at com.solanteq.solar.plugin.form.common.inspection.InvalidRequestInspection.registerProblem(InvalidRequestInspection.kt:38)
at com.solanteq.solar.plugin.form.common.inspection.InvalidRequestInspection$JsonVisitor.visitProperty(InvalidRequestInspection.kt:89)
at com.intellij.json.psi.impl.JsonPropertyImpl.accept(JsonPropertyImpl.java:21)
at com.intellij.json.psi.impl.JsonPropertyImpl.accept(JsonPropertyImpl.java:26)
at com.intellij.codeInsight.daemon.impl.InspectionRunner$InspectionProblemHolder.visitElement(InspectionRunner.java:609)
at com.intellij.codeInsight.daemon.impl.InspectionRunner.lambda$processContext$19(InspectionRunner.java:414)
at com.intellij.codeInsight.daemon.impl.InspectionVisitorOptimizer.acceptElements(InspectionVisitorOptimizer.java:217)
at com.intellij.codeInsight.daemon.impl.InspectionRunner.processContext(InspectionRunner.java:412)
at com.intellij.codeInsight.daemon.impl.InspectionRunner.lambda$inspect$7(InspectionRunner.java:179)
at com.intellij.platform.locking.impl.NestedLocksThreadingSupport.tryRunReadAction(NestedLocksThreadingSupport.kt:826)
at com.intellij.openapi.application.impl.ApplicationImpl.tryRunReadAction(ApplicationImpl.java:1221)
at com.intellij.codeInsight.daemon.impl.InspectionRunner.lambda$executeInImpatientReadAction$15(InspectionRunner.java:387)
at com.intellij.openapi.application.impl.ApplicationImpl.executeByImpatientReader(ApplicationImpl.java:258)
at com.intellij.codeInsight.daemon.impl.InspectionRunner.lambda$executeInImpatientReadAction$16(InspectionRunner.java:386)
at com.intellij.util.AstLoadingFilter.forceAllowTreeLoading(AstLoadingFilter.java:158)
at com.intellij.util.AstLoadingFilter.forceAllowTreeLoading(AstLoadingFilter.java:150)
at com.intellij.codeInsight.daemon.impl.InspectionRunner.lambda$executeInImpatientReadAction$17(InspectionRunner.java:384)
at com.intellij.util.AstLoadingFilter.disallowTreeLoading(AstLoadingFilter.java:129)
at com.intellij.util.AstLoadingFilter.disallowTreeLoading(AstLoadingFilter.java:118)
at com.intellij.codeInsight.daemon.impl.InspectionRunner.executeInImpatientReadAction(InspectionRunner.java:384)
at com.intellij.codeInsight.daemon.impl.InspectionRunner.lambda$inspect$8(InspectionRunner.java:173)
at com.intellij.concurrency.JobLauncherImpl.lambda$processImmediatelyIfTooFew$6(JobLauncherImpl.java:221)
at com.intellij.openapi.progress.impl.CoreProgressManager.lambda$executeProcessUnderProgress$14(CoreProgressManager.java:681)
at com.intellij.openapi.progress.impl.CoreProgressManager.registerIndicatorAndRun(CoreProgressManager.java:756)
at com.intellij.openapi.progress.impl.CoreProgressManager.computeUnderProgress(CoreProgressManager.java:712)
at com.intellij.openapi.progress.impl.CoreProgressManager.executeProcessUnderProgress(CoreProgressManager.java:680)
at com.intellij.openapi.progress.impl.ProgressManagerImpl.executeProcessUnderProgress(ProgressManagerImpl.java:78)
at com.intellij.concurrency.JobLauncherImpl.lambda$processImmediatelyIfTooFew$7(JobLauncherImpl.java:218)
at com.intellij.openapi.application.impl.AppImplKt$runnableUnitFunction$1.invoke(appImpl.kt:104)
at com.intellij.openapi.application.impl.AppImplKt$runnableUnitFunction$1.invoke(appImpl.kt:104)
at com.intellij.platform.locking.impl.NestedLocksThreadingSupport.runReadAction(NestedLocksThreadingSupport.kt:784)
at com.intellij.openapi.application.impl.ApplicationImpl.runReadAction(ApplicationImpl.java:1033)
at com.intellij.concurrency.JobLauncherImpl.processImmediatelyIfTooFew(JobLauncherImpl.java:228)
at com.intellij.concurrency.JobLauncherImpl.invokeConcurrentlyUnderProgressAsync(JobLauncherImpl.java:66)
at com.intellij.concurrency.JobLauncherImpl.processConcurrentlyAsync(JobLauncherImpl.java:466)
at com.intellij.codeInsight.daemon.impl.InspectionRunner.lambda$inspect$11(InspectionRunner.java:190)
at com.intellij.codeInspection.InspectionEngine.withSession(InspectionEngine.java:251)
at com.intellij.codeInsight.daemon.impl.InspectionRunner.inspect(InspectionRunner.java:147)
at com.intellij.codeInsight.daemon.impl.LocalInspectionsPass.lambda$collectInformationWithProgress$4(LocalInspectionsPass.java:147)
at com.intellij.codeInsight.daemon.impl.HighlightInfoUpdaterImpl.lambda$runWithInvalidPsiRecycler$42(HighlightInfoUpdaterImpl.java:889)
at com.intellij.codeInsight.daemon.impl.ManagedHighlighterRecycler.runWithRecycler(ManagedHighlighterRecycler.java:87)
at com.intellij.codeInsight.daemon.impl.HighlightInfoUpdaterImpl.runWithInvalidPsiRecycler(HighlightInfoUpdaterImpl.java:870)
at com.intellij.codeInsight.daemon.impl.LocalInspectionsPass.collectInformationWithProgress(LocalInspectionsPass.java:159)
at com.intellij.codeInsight.daemon.impl.ProgressableTextEditorHighlightingPass.doCollectInformation(ProgressableTextEditorHighlightingPass.java:92)
at com.intellij.codeHighlighting.TextEditorHighlightingPass.collectInformation(TextEditorHighlightingPass.java:71)
at com.intellij.codeInsight.daemon.impl.PassExecutorService$ScheduledPass.lambda$doRun$2(PassExecutorService.java:435)
at com.intellij.platform.diagnostic.telemetry.helpers.TraceKt.use(trace.kt:29)
at com.intellij.codeInsight.daemon.impl.PassExecutorService$ScheduledPass.lambda$doRun$3(PassExecutorService.java:431)
at com.intellij.platform.locking.impl.NestedLocksThreadingSupport.tryRunReadAction(NestedLocksThreadingSupport.kt:826)
at com.intellij.openapi.application.impl.ApplicationImpl.tryRunReadAction(ApplicationImpl.java:1221)
at com.intellij.codeInsight.daemon.impl.PassExecutorService$ScheduledPass.lambda$doRun$4(PassExecutorService.java:421)
at com.intellij.openapi.progress.impl.CoreProgressManager.lambda$executeProcessUnderProgress$14(CoreProgressManager.java:681)
at com.intellij.openapi.progress.impl.CoreProgressManager.registerIndicatorAndRun(CoreProgressManager.java:756)
at com.intellij.openapi.progress.impl.CoreProgressManager.computeUnderProgress(CoreProgressManager.java:712)
at com.intellij.openapi.progress.impl.CoreProgressManager.executeProcessUnderProgress(CoreProgressManager.java:680)
at com.intellij.openapi.progress.impl.ProgressManagerImpl.executeProcessUnderProgress(ProgressManagerImpl.java:78)
at com.intellij.codeInsight.daemon.impl.PassExecutorService$ScheduledPass.doRun(PassExecutorService.java:420)
at com.intellij.codeInsight.daemon.impl.PassExecutorService$ScheduledPass.lambda$run$0(PassExecutorService.java:395)
at com.intellij.openapi.fileTypes.impl.FileTypeManagerImpl.cacheFileTypesInside(FileTypeManagerImpl.java:852)
at com.intellij.codeInsight.daemon.impl.PassExecutorService$ScheduledPass.lambda$run$1(PassExecutorService.java:395)
at com.intellij.openapi.application.impl.ApplicationImpl.executeByImpatientReader(ApplicationImpl.java:258)
at com.intellij.codeInsight.daemon.impl.PassExecutorService$ScheduledPass.run(PassExecutorService.java:393)
at com.intellij.concurrency.JobLauncherImpl$VoidForkJoinTask$1.exec(JobLauncherImpl.java:265)
at java.base/java.util.concurrent.ForkJoinTask.doExec$$$capture(ForkJoinTask.java:507)
at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java)
at java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1491)
at java.base/java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:2073)
at java.base/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:2035)
at java.base/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:187)
I don’t think that this search should parse AST in the first place. I can get a FQ name from ClsAnnotationImpl without triggering AST parsing, but this search does it anyway.
Is there a way to find annotated elements without parsing AST for kotlin files? Or maybe this is a bug?