Refactor Java resolver components
- Move components from LazyJavaResolverContext to JavaResolverComponents - Drop LazyJavaClassResolver replacing it's usages with module resolver (now enum entries from another module as annotation arguments are being resolved, see test)
This commit is contained in:
+1
-1
@@ -7,5 +7,5 @@ public class KotlinA: AClass() {
|
||||
|
||||
fun paramA(p: AClass) {}
|
||||
|
||||
@AAnnotation fun annoA() {}
|
||||
@AAnnotation(AEnum.AX) fun annoA() {}
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
package custom;
|
||||
|
||||
public @interface AAnnotation {
|
||||
|
||||
AEnum value();
|
||||
}
|
||||
@@ -3,6 +3,6 @@ package custom;
|
||||
public class AClass {
|
||||
public AClass returnA() {}
|
||||
public void paramA(AClass a) {}
|
||||
@AAnnotation
|
||||
@AAnnotation(AEnum.AX)
|
||||
public void annoA() {}
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
package custom;
|
||||
|
||||
public enum AEnum {
|
||||
AX;
|
||||
}
|
||||
+1
-1
@@ -11,7 +11,7 @@ public class KotlinB: AClass() {
|
||||
|
||||
public fun returnB(): BClass { }
|
||||
|
||||
@AAnnotation fun annoA() {}
|
||||
@AAnnotation(AEnum.AX) fun annoA() {}
|
||||
|
||||
@BAnnotation fun annoB() {}
|
||||
}
|
||||
@@ -3,7 +3,7 @@ package custom;
|
||||
public class BClass extends AClass {
|
||||
public AClass returnA() {}
|
||||
public void paramA(AClass a) {}
|
||||
@AAnnotation
|
||||
@AAnnotation(AEnum.AX)
|
||||
public void annoA() {}
|
||||
public BClass returnB() {}
|
||||
public void paramB(BClass b) {}
|
||||
|
||||
+1
-1
@@ -11,7 +11,7 @@ public class KotlinC: AClass() {
|
||||
|
||||
public fun returnB(): BClass { }
|
||||
|
||||
@AAnnotation fun annoA() {}
|
||||
@AAnnotation(AEnum.AX) fun annoA() {}
|
||||
|
||||
@BAnnotation fun annoB() {}
|
||||
}
|
||||
@@ -3,7 +3,7 @@ package custom;
|
||||
public class CClass extends BClass {
|
||||
public AClass returnA() {}
|
||||
public void paramA(AClass a) {}
|
||||
@AAnnotation
|
||||
@AAnnotation(AEnum.AX)
|
||||
public void annoA() {}
|
||||
public BClass returnB() {}
|
||||
public void paramB(BClass b) {}
|
||||
|
||||
+18
-4
@@ -34,6 +34,7 @@ import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.platform.JvmBuiltIns
|
||||
import org.jetbrains.kotlin.psi.KtFile
|
||||
import org.jetbrains.kotlin.resolve.CompilerEnvironment
|
||||
import org.jetbrains.kotlin.resolve.constants.EnumValue
|
||||
import org.jetbrains.kotlin.resolve.descriptorUtil.module
|
||||
import org.jetbrains.kotlin.resolve.jvm.JvmAnalyzerFacade
|
||||
import org.jetbrains.kotlin.resolve.jvm.JvmPlatformParameters
|
||||
@@ -85,7 +86,7 @@ class MultiModuleJavaAnalysisCustomTest : KtUsefulTestCase() {
|
||||
val configuration = KotlinTestUtils.compilerConfigurationForTests(
|
||||
ConfigurationKind.JDK_ONLY, TestJdkKind.MOCK_JDK, emptyList(), moduleDirs.toList()
|
||||
)
|
||||
return KotlinCoreEnvironment.createForTests(testRootDisposable!!, configuration, EnvironmentConfigFiles.JVM_CONFIG_FILES)
|
||||
return KotlinCoreEnvironment.createForTests(testRootDisposable, configuration, EnvironmentConfigFiles.JVM_CONFIG_FILES)
|
||||
}
|
||||
|
||||
private fun setupModules(environment: KotlinCoreEnvironment, moduleDirs: Array<File>): List<TestModule> {
|
||||
@@ -151,9 +152,22 @@ class MultiModuleJavaAnalysisCustomTest : KtUsefulTestCase() {
|
||||
it.type.constructor.declarationDescriptor!!
|
||||
}.forEach { checkDescriptor(it, callable) }
|
||||
|
||||
callable.annotations.map {
|
||||
it.type.constructor.declarationDescriptor!!
|
||||
}.forEach { checkDescriptor(it, callable) }
|
||||
callable.annotations.forEach {
|
||||
val annotationClassDescriptor = it.type.constructor.declarationDescriptor as ClassDescriptor
|
||||
checkDescriptor(annotationClassDescriptor, callable)
|
||||
|
||||
Assert.assertEquals(
|
||||
"Annotation value arguments number is not equal to number of parameters in $callable",
|
||||
annotationClassDescriptor.constructors.single().valueParameters.size, it.allValueArguments.size)
|
||||
|
||||
it.allValueArguments.forEach {
|
||||
val argument = it.value
|
||||
if (argument is EnumValue) {
|
||||
Assert.assertEquals("Enum entry name should be <module-name>X", "X", argument.value.name.identifier.last().toString())
|
||||
checkDescriptor(argument.value, callable)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun checkSupertypes(classDescriptor: ClassDescriptor) {
|
||||
|
||||
+2
-30
@@ -16,26 +16,18 @@
|
||||
|
||||
package org.jetbrains.kotlin.load.java.lazy
|
||||
|
||||
import org.jetbrains.kotlin.builtins.ReflectionTypes
|
||||
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.PackageFragmentProvider
|
||||
import org.jetbrains.kotlin.incremental.components.NoLookupLocation
|
||||
import org.jetbrains.kotlin.load.java.lazy.descriptors.LazyJavaPackageFragment
|
||||
import org.jetbrains.kotlin.load.java.structure.JavaClass
|
||||
import org.jetbrains.kotlin.name.FqName
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.storage.MemoizedFunctionToNullable
|
||||
import org.jetbrains.kotlin.utils.emptyOrSingletonList
|
||||
|
||||
class LazyJavaPackageFragmentProvider(
|
||||
components: JavaResolverComponents,
|
||||
module: ModuleDescriptor,
|
||||
reflectionTypes: ReflectionTypes
|
||||
components: JavaResolverComponents
|
||||
) : PackageFragmentProvider {
|
||||
|
||||
private val c =
|
||||
LazyJavaResolverContext(components, this, FragmentClassResolver(), module, reflectionTypes, TypeParameterResolver.EMPTY)
|
||||
private val c = LazyJavaResolverContext(components, TypeParameterResolver.EMPTY)
|
||||
|
||||
private val packageFragments: MemoizedFunctionToNullable<FqName, LazyJavaPackageFragment> =
|
||||
c.storageManager.createMemoizedFunctionWithNullableValues {
|
||||
@@ -53,24 +45,4 @@ class LazyJavaPackageFragmentProvider(
|
||||
|
||||
override fun getSubPackagesOf(fqName: FqName, nameFilter: (Name) -> Boolean) =
|
||||
getPackageFragment(fqName)?.getSubPackageFqNames().orEmpty()
|
||||
|
||||
fun getClass(javaClass: JavaClass): ClassDescriptor? = c.javaClassResolver.resolveClass(javaClass)
|
||||
|
||||
private inner class FragmentClassResolver : LazyJavaClassResolver {
|
||||
override fun resolveClass(javaClass: JavaClass): ClassDescriptor? {
|
||||
val fqName = javaClass.fqName
|
||||
if (fqName != null && javaClass.isKotlinLightClass) {
|
||||
return c.components.javaResolverCache.getClassResolvedFromSource(fqName)
|
||||
}
|
||||
|
||||
javaClass.outerClass?.let { outerClass ->
|
||||
val outerClassScope = resolveClass(outerClass)?.unsubstitutedInnerClassesScope
|
||||
return outerClassScope?.getContributedClassifier(javaClass.name, NoLookupLocation.FROM_JAVA_LOADER) as? ClassDescriptor
|
||||
}
|
||||
|
||||
if (fqName == null) return null
|
||||
|
||||
return getPackageFragment(fqName.parent())?.findClassifierByJavaClass(javaClass)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -47,7 +47,9 @@ class JavaResolverComponents(
|
||||
val moduleClassResolver: ModuleClassResolver,
|
||||
val packageMapper: PackagePartProvider,
|
||||
val supertypeLoopChecker: SupertypeLoopChecker,
|
||||
val lookupTracker: LookupTracker
|
||||
val lookupTracker: LookupTracker,
|
||||
val module: ModuleDescriptor,
|
||||
val reflectionTypes: ReflectionTypes
|
||||
) {
|
||||
fun replace(
|
||||
javaResolverCache: JavaResolverCache = this.javaResolverCache
|
||||
@@ -55,30 +57,28 @@ class JavaResolverComponents(
|
||||
storageManager, finder, kotlinClassFinder, deserializedDescriptorResolver,
|
||||
externalAnnotationResolver, signaturePropagator, errorReporter, javaResolverCache,
|
||||
javaPropertyInitializerEvaluator, samConversionResolver, sourceElementFactory,
|
||||
moduleClassResolver, packageMapper, supertypeLoopChecker, lookupTracker)
|
||||
moduleClassResolver, packageMapper, supertypeLoopChecker, lookupTracker, module, reflectionTypes)
|
||||
}
|
||||
|
||||
open class LazyJavaResolverContext(
|
||||
val components: JavaResolverComponents,
|
||||
val packageFragmentProvider: LazyJavaPackageFragmentProvider,
|
||||
val javaClassResolver: LazyJavaClassResolver,
|
||||
val module: ModuleDescriptor,
|
||||
val reflectionTypes: ReflectionTypes,
|
||||
val typeParameterResolver: TypeParameterResolver
|
||||
) {
|
||||
val typeResolver = LazyJavaTypeResolver(this, typeParameterResolver)
|
||||
|
||||
val storageManager: StorageManager
|
||||
get() = components.storageManager
|
||||
|
||||
val module: ModuleDescriptor get() = components.module
|
||||
}
|
||||
|
||||
fun LazyJavaResolverContext.child(
|
||||
typeParameterResolver: TypeParameterResolver
|
||||
) = LazyJavaResolverContext(components, packageFragmentProvider, javaClassResolver, module, reflectionTypes, typeParameterResolver)
|
||||
) = LazyJavaResolverContext(components, typeParameterResolver)
|
||||
|
||||
fun LazyJavaResolverContext.replaceComponents(
|
||||
components: JavaResolverComponents
|
||||
) = LazyJavaResolverContext(components, packageFragmentProvider, javaClassResolver, module, reflectionTypes, typeParameterResolver)
|
||||
) = LazyJavaResolverContext(components, typeParameterResolver)
|
||||
|
||||
fun LazyJavaResolverContext.child(
|
||||
containingDeclaration: DeclarationDescriptor,
|
||||
|
||||
+1
-2
@@ -118,8 +118,7 @@ class LazyJavaAnnotationDescriptor(
|
||||
|
||||
val containingJavaClass = element.containingClass
|
||||
|
||||
//TODO: (module refactoring) moduleClassResolver should be used here
|
||||
val enumClass = c.javaClassResolver.resolveClass(containingJavaClass) ?: return null
|
||||
val enumClass = c.components.moduleClassResolver.resolveClass(containingJavaClass) ?: return null
|
||||
|
||||
val classifier = enumClass.unsubstitutedInnerClassesScope.getContributedClassifier(element.name, NoLookupLocation.FROM_JAVA_LOADER)
|
||||
if (classifier !is ClassDescriptor) return null
|
||||
|
||||
@@ -16,20 +16,13 @@
|
||||
|
||||
package org.jetbrains.kotlin.load.java.lazy
|
||||
|
||||
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor
|
||||
import org.jetbrains.kotlin.load.java.lazy.descriptors.LazyJavaTypeParameterDescriptor
|
||||
import org.jetbrains.kotlin.load.java.structure.JavaClass
|
||||
import org.jetbrains.kotlin.load.java.structure.JavaTypeParameter
|
||||
import org.jetbrains.kotlin.load.java.structure.JavaTypeParameterListOwner
|
||||
import org.jetbrains.kotlin.utils.mapToIndex
|
||||
|
||||
//TODO: (module refactoring) usages of this interface should be replaced by ModuleClassResolver
|
||||
interface LazyJavaClassResolver {
|
||||
fun resolveClass(javaClass: JavaClass): ClassDescriptor?
|
||||
}
|
||||
|
||||
interface TypeParameterResolver {
|
||||
object EMPTY : TypeParameterResolver {
|
||||
override fun resolveTypeParameter(javaTypeParameter: JavaTypeParameter): TypeParameterDescriptor? = null
|
||||
|
||||
+1
-1
@@ -133,7 +133,7 @@ class LazyJavaTypeResolver(
|
||||
|
||||
private fun mapKotlinClass(fqName: FqName): ClassDescriptor? {
|
||||
if (attr.isForAnnotationParameter && fqName == JAVA_LANG_CLASS_FQ_NAME) {
|
||||
return c.reflectionTypes.kClass
|
||||
return c.components.reflectionTypes.kClass
|
||||
}
|
||||
|
||||
val javaToKotlin = JavaToKotlinClassMap.INSTANCE
|
||||
|
||||
+19
-2
@@ -17,11 +17,28 @@
|
||||
package org.jetbrains.kotlin.resolve.jvm
|
||||
|
||||
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
||||
import org.jetbrains.kotlin.incremental.components.NoLookupLocation
|
||||
import org.jetbrains.kotlin.load.java.components.JavaResolverCache
|
||||
import org.jetbrains.kotlin.load.java.lazy.LazyJavaPackageFragmentProvider
|
||||
import org.jetbrains.kotlin.load.java.structure.JavaClass
|
||||
|
||||
class JavaDescriptorResolver(val packageFragmentProvider: LazyJavaPackageFragmentProvider) {
|
||||
class JavaDescriptorResolver(
|
||||
val packageFragmentProvider: LazyJavaPackageFragmentProvider,
|
||||
private val javaResolverCache: JavaResolverCache
|
||||
) {
|
||||
fun resolveClass(javaClass: JavaClass): ClassDescriptor? {
|
||||
return packageFragmentProvider.getClass(javaClass)
|
||||
val fqName = javaClass.fqName
|
||||
if (fqName != null && javaClass.isKotlinLightClass) {
|
||||
return javaResolverCache.getClassResolvedFromSource(fqName)
|
||||
}
|
||||
|
||||
javaClass.outerClass?.let { outerClass ->
|
||||
val outerClassScope = resolveClass(outerClass)?.unsubstitutedInnerClassesScope
|
||||
return outerClassScope?.getContributedClassifier(javaClass.name, NoLookupLocation.FROM_JAVA_LOADER) as? ClassDescriptor
|
||||
}
|
||||
|
||||
if (fqName == null) return null
|
||||
|
||||
return packageFragmentProvider.getPackageFragments(fqName.parent()).firstOrNull()?.findClassifierByJavaClass(javaClass)
|
||||
}
|
||||
}
|
||||
|
||||
+5
-5
@@ -55,19 +55,19 @@ class RuntimeModuleData private constructor(val deserialization: Deserialization
|
||||
val deserializedDescriptorResolver = DeserializedDescriptorResolver(RuntimeErrorReporter)
|
||||
val singleModuleClassResolver = SingleModuleClassResolver()
|
||||
val runtimePackageFacadeProvider = RuntimePackagePartProvider(classLoader)
|
||||
val javaResolverCache = JavaResolverCache.EMPTY
|
||||
val globalJavaResolverContext = JavaResolverComponents(
|
||||
storageManager, ReflectJavaClassFinder(classLoader), reflectKotlinClassFinder, deserializedDescriptorResolver,
|
||||
ExternalAnnotationResolver.EMPTY, SignaturePropagator.DO_NOTHING, RuntimeErrorReporter, JavaResolverCache.EMPTY,
|
||||
ExternalAnnotationResolver.EMPTY, SignaturePropagator.DO_NOTHING, RuntimeErrorReporter, javaResolverCache,
|
||||
JavaPropertyInitializerEvaluator.DoNothing, SamConversionResolver, RuntimeSourceElementFactory, singleModuleClassResolver,
|
||||
runtimePackageFacadeProvider, SupertypeLoopChecker.EMPTY, LookupTracker.DO_NOTHING
|
||||
runtimePackageFacadeProvider, SupertypeLoopChecker.EMPTY, LookupTracker.DO_NOTHING, module, ReflectionTypes(module)
|
||||
)
|
||||
|
||||
val lazyJavaPackageFragmentProvider =
|
||||
LazyJavaPackageFragmentProvider(globalJavaResolverContext, module, ReflectionTypes(module))
|
||||
val lazyJavaPackageFragmentProvider = LazyJavaPackageFragmentProvider(globalJavaResolverContext)
|
||||
|
||||
builtIns.setOwnerModuleDescriptor(module)
|
||||
|
||||
val javaDescriptorResolver = JavaDescriptorResolver(lazyJavaPackageFragmentProvider)
|
||||
val javaDescriptorResolver = JavaDescriptorResolver(lazyJavaPackageFragmentProvider, javaResolverCache)
|
||||
val javaClassDataFinder = JavaClassDataFinder(reflectKotlinClassFinder, deserializedDescriptorResolver)
|
||||
val notFoundClasses = NotFoundClasses(storageManager, module)
|
||||
val binaryClassAnnotationAndConstantLoader = BinaryClassAnnotationAndConstantLoaderImpl(
|
||||
|
||||
Reference in New Issue
Block a user