From 38fa900e56b5a6751b50dc3b692150c43ae52154 Mon Sep 17 00:00:00 2001 From: "Denis.Zharkov" Date: Wed, 15 Sep 2021 17:53:33 +0300 Subject: [PATCH] FIR: Optimize case with no annotations on package --- .../kotlin/incremental/JavaClassDescriptorCreator.kt | 2 +- .../src/org/jetbrains/kotlin/fir/java/FirJavaFacade.kt | 9 ++++++++- .../jetbrains/kotlin/load/java/JavaClassFinderImpl.kt | 4 ++-- .../kotlin/javac/components/JavacBasedClassFinder.kt | 2 +- .../kotlin/load/java/structure/impl/JavaPackageImpl.kt | 9 +++++++-- .../org/jetbrains/kotlin/load/java/JavaClassFinder.kt | 2 +- .../runtime/components/ReflectJavaClassFinder.kt | 2 +- 7 files changed, 21 insertions(+), 9 deletions(-) diff --git a/build-common/src/org/jetbrains/kotlin/incremental/JavaClassDescriptorCreator.kt b/build-common/src/org/jetbrains/kotlin/incremental/JavaClassDescriptorCreator.kt index e3e66037f5d..0deb8c1c8a0 100644 --- a/build-common/src/org/jetbrains/kotlin/incremental/JavaClassDescriptorCreator.kt +++ b/build-common/src/org/jetbrains/kotlin/incremental/JavaClassDescriptorCreator.kt @@ -117,7 +117,7 @@ private class BinaryJavaClassFinder(binaryJavaClasses: List) : return nameToJavaClass[request.classId.asSingleFqName()] } - override fun findPackage(fqName: FqName): JavaPackage { + override fun findPackage(fqName: FqName, mayHaveAnnotations: Boolean): JavaPackage { return object : JavaPackage { override val fqName: FqName diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirJavaFacade.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirJavaFacade.kt index 69baec415dc..8169ca02cbc 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirJavaFacade.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirJavaFacade.kt @@ -53,9 +53,16 @@ class FirJavaFacade( ) { companion object { val VALUE_METHOD_NAME = Name.identifier("value") + private const val PACKAGE_INFO_CLASS_NAME = "package-info" } - private val packageCache = session.firCachesFactory.createCache(classFinder::findPackage) + private val packageCache = session.firCachesFactory.createCache { fqName: FqName -> + val knownClassNames: Set? = knownClassNamesInPackage.getValue(fqName) + classFinder.findPackage( + fqName, + mayHaveAnnotations = if (knownClassNames != null) PACKAGE_INFO_CLASS_NAME in knownClassNames else true + ) + } private val knownClassNamesInPackage = session.firCachesFactory.createCache(classFinder::knownClassNamesInPackage) private val parentClassTypeParameterStackCache = mutableMapOf() diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/JavaClassFinderImpl.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/JavaClassFinderImpl.kt index 83ea7764165..8709b7b8578 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/JavaClassFinderImpl.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/JavaClassFinderImpl.kt @@ -44,8 +44,8 @@ class JavaClassFinderImpl : AbstractJavaClassFinder() { return javaFacade.findClass(request, javaSearchScope) } - override fun findPackage(fqName: FqName): JavaPackage? { - return javaFacade.findPackage(fqName.asString(), javaSearchScope)?.let { JavaPackageImpl(it, javaSearchScope) } + override fun findPackage(fqName: FqName, mayHaveAnnotations: Boolean): JavaPackage? { + return javaFacade.findPackage(fqName.asString(), javaSearchScope)?.let { JavaPackageImpl(it, javaSearchScope, mayHaveAnnotations) } } override fun knownClassNamesInPackage(packageFqName: FqName): Set? { diff --git a/compiler/javac-wrapper/src/org/jetbrains/kotlin/javac/components/JavacBasedClassFinder.kt b/compiler/javac-wrapper/src/org/jetbrains/kotlin/javac/components/JavacBasedClassFinder.kt index cb3b5ab5cad..aeacb9c86de 100644 --- a/compiler/javac-wrapper/src/org/jetbrains/kotlin/javac/components/JavacBasedClassFinder.kt +++ b/compiler/javac-wrapper/src/org/jetbrains/kotlin/javac/components/JavacBasedClassFinder.kt @@ -42,7 +42,7 @@ class JavacBasedClassFinder : AbstractJavaClassFinder() { // TODO: reuse previouslyFoundClassFileContent if it's possible in javac javac.findClass(request.classId, javaSearchScope) - override fun findPackage(fqName: FqName) = javac.findPackage(fqName, javaSearchScope) + override fun findPackage(fqName: FqName, mayHaveAnnotations: Boolean) = javac.findPackage(fqName, javaSearchScope) override fun knownClassNamesInPackage(packageFqName: FqName) = javac.knownClassNamesInPackage(packageFqName) } diff --git a/compiler/resolution.common.jvm/src/org/jetbrains/kotlin/load/java/structure/impl/JavaPackageImpl.kt b/compiler/resolution.common.jvm/src/org/jetbrains/kotlin/load/java/structure/impl/JavaPackageImpl.kt index 361c79d6de4..8d61de482e3 100644 --- a/compiler/resolution.common.jvm/src/org/jetbrains/kotlin/load/java/structure/impl/JavaPackageImpl.kt +++ b/compiler/resolution.common.jvm/src/org/jetbrains/kotlin/load/java/structure/impl/JavaPackageImpl.kt @@ -23,7 +23,8 @@ import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name class JavaPackageImpl( - psiPackage: PsiPackage, private val scope: GlobalSearchScope + psiPackage: PsiPackage, private val scope: GlobalSearchScope, + private val mayHaveAnnotations: Boolean = true, ) : JavaElementImpl(psiPackage), JavaPackage, MapBasedJavaAnnotationOwner { override fun getClasses(nameFilter: (Name) -> Boolean): Collection { @@ -41,7 +42,11 @@ class JavaPackageImpl( get() = FqName(psi.qualifiedName) override val annotations: Collection - get() = org.jetbrains.kotlin.load.java.structure.impl.annotations(psi.annotationList?.annotations.orEmpty()) + get() = + if (mayHaveAnnotations) + org.jetbrains.kotlin.load.java.structure.impl.annotations(psi.annotationList?.annotations.orEmpty()) + else + emptyList() override val annotationsByFqName: Map by buildLazyValueForMap() } diff --git a/core/compiler.common.jvm/src/org/jetbrains/kotlin/load/java/JavaClassFinder.kt b/core/compiler.common.jvm/src/org/jetbrains/kotlin/load/java/JavaClassFinder.kt index b1a6525aa65..6c7a402ea84 100644 --- a/core/compiler.common.jvm/src/org/jetbrains/kotlin/load/java/JavaClassFinder.kt +++ b/core/compiler.common.jvm/src/org/jetbrains/kotlin/load/java/JavaClassFinder.kt @@ -21,7 +21,7 @@ interface JavaClassFinder { fun findClass(request: Request): JavaClass? fun findClass(classId: ClassId): JavaClass? = findClass(Request(classId)) - fun findPackage(fqName: FqName): JavaPackage? + fun findPackage(fqName: FqName, mayHaveAnnotations: Boolean = true): JavaPackage? fun knownClassNamesInPackage(packageFqName: FqName): Set? } diff --git a/core/descriptors.runtime/src/org/jetbrains/kotlin/descriptors/runtime/components/ReflectJavaClassFinder.kt b/core/descriptors.runtime/src/org/jetbrains/kotlin/descriptors/runtime/components/ReflectJavaClassFinder.kt index 885305783e2..be88d680817 100644 --- a/core/descriptors.runtime/src/org/jetbrains/kotlin/descriptors/runtime/components/ReflectJavaClassFinder.kt +++ b/core/descriptors.runtime/src/org/jetbrains/kotlin/descriptors/runtime/components/ReflectJavaClassFinder.kt @@ -36,7 +36,7 @@ class ReflectJavaClassFinder(private val classLoader: ClassLoader) : JavaClassFi return if (klass != null) ReflectJavaClass(klass) else null } - override fun findPackage(fqName: FqName): JavaPackage? { + override fun findPackage(fqName: FqName, mayHaveAnnotations: Boolean): JavaPackage? { // We don't know which packages our class loader has and has not, so we behave as if it contains any package in the world return ReflectJavaPackage(fqName) }