Fix "Class name must not be root" assertion + inline some utilities
Fix EA-60649, EA-65875; do not lookup classes with an empty name. No test added since no steps to reproduce are known
This commit is contained in:
+2
-1
@@ -76,7 +76,8 @@ public class LazyJavaPackageFragmentProvider(
|
|||||||
}
|
}
|
||||||
val outerClass = javaClass.getOuterClass()
|
val outerClass = javaClass.getOuterClass()
|
||||||
if (outerClass == null) {
|
if (outerClass == null) {
|
||||||
return c.lookupBinaryClass(javaClass) ?: topLevelClasses(javaClass)
|
return c.resolveBinaryClass(c.kotlinClassFinder.findKotlinClass(javaClass))?.kClass
|
||||||
|
?: topLevelClasses(javaClass)
|
||||||
}
|
}
|
||||||
val outerClassScope = resolveClass(outerClass)?.getUnsubstitutedInnerClassesScope()
|
val outerClassScope = resolveClass(outerClass)?.getUnsubstitutedInnerClassesScope()
|
||||||
return outerClassScope?.getClassifier(javaClass.getName()) as? ClassDescriptor
|
return outerClassScope?.getClassifier(javaClass.getName()) as? ClassDescriptor
|
||||||
|
|||||||
+24
-16
@@ -22,7 +22,7 @@ import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
|
|||||||
import org.jetbrains.kotlin.descriptors.SimpleFunctionDescriptor
|
import org.jetbrains.kotlin.descriptors.SimpleFunctionDescriptor
|
||||||
import org.jetbrains.kotlin.load.java.descriptors.SamConstructorDescriptorKindExclude
|
import org.jetbrains.kotlin.load.java.descriptors.SamConstructorDescriptorKindExclude
|
||||||
import org.jetbrains.kotlin.load.java.lazy.LazyJavaResolverContext
|
import org.jetbrains.kotlin.load.java.lazy.LazyJavaResolverContext
|
||||||
import org.jetbrains.kotlin.load.java.lazy.findClassInJava
|
import org.jetbrains.kotlin.load.java.lazy.resolveBinaryClass
|
||||||
import org.jetbrains.kotlin.load.java.structure.JavaClass
|
import org.jetbrains.kotlin.load.java.structure.JavaClass
|
||||||
import org.jetbrains.kotlin.load.java.structure.JavaPackage
|
import org.jetbrains.kotlin.load.java.structure.JavaPackage
|
||||||
import org.jetbrains.kotlin.load.kotlin.KotlinJvmBinaryClass
|
import org.jetbrains.kotlin.load.kotlin.KotlinJvmBinaryClass
|
||||||
@@ -38,36 +38,44 @@ import org.jetbrains.kotlin.utils.addIfNotNull
|
|||||||
public class LazyPackageFragmentScopeForJavaPackage(
|
public class LazyPackageFragmentScopeForJavaPackage(
|
||||||
c: LazyJavaResolverContext,
|
c: LazyJavaResolverContext,
|
||||||
private val jPackage: JavaPackage,
|
private val jPackage: JavaPackage,
|
||||||
packageFragment: LazyJavaPackageFragment
|
containingDeclaration: LazyJavaPackageFragment
|
||||||
) : LazyJavaStaticScope(c, packageFragment) {
|
) : LazyJavaStaticScope(c, containingDeclaration) {
|
||||||
|
|
||||||
// TODO: Storing references is a temporary hack until modules infrastructure is implemented.
|
// TODO: Storing references is a temporary hack until modules infrastructure is implemented.
|
||||||
// See JetTypeMapperWithOutDirectories for details
|
// See JetTypeMapperWithOutDirectories for details
|
||||||
public val kotlinBinaryClass: KotlinJvmBinaryClass?
|
public val kotlinBinaryClass: KotlinJvmBinaryClass?
|
||||||
= c.kotlinClassFinder.findKotlinClass(PackageClassUtils.getPackageClassId(packageFragment.fqName))
|
= c.kotlinClassFinder.findKotlinClass(PackageClassUtils.getPackageClassId(this.packageFragment.fqName))
|
||||||
|
|
||||||
private val deserializedPackageScope = c.storageManager.createLazyValue {
|
private val deserializedPackageScope = c.storageManager.createLazyValue {
|
||||||
val kotlinBinaryClass = kotlinBinaryClass
|
val kotlinBinaryClass = kotlinBinaryClass
|
||||||
if (kotlinBinaryClass == null)
|
if (kotlinBinaryClass == null)
|
||||||
JetScope.Empty
|
JetScope.Empty
|
||||||
else
|
else
|
||||||
c.deserializedDescriptorResolver.createKotlinPackageScope(packageFragment, kotlinBinaryClass) ?: JetScope.Empty
|
c.deserializedDescriptorResolver.createKotlinPackageScope(this.packageFragment, kotlinBinaryClass) ?: JetScope.Empty
|
||||||
}
|
}
|
||||||
|
|
||||||
private val classes = c.storageManager.createMemoizedFunctionWithNullableValues<Name, ClassDescriptor> { name ->
|
private val packageFragment: LazyJavaPackageFragment get() = getContainingDeclaration() as LazyJavaPackageFragment
|
||||||
val classId = ClassId(packageFragment.fqName, SpecialNames.safeIdentifier(name))
|
|
||||||
val (jClass, kClass) = this.c.findClassInJava(classId)
|
private val classes = c.storageManager.createMemoizedFunctionWithNullableValues<Name, ClassDescriptor> { name -> findClass(name) }
|
||||||
if (kClass != null)
|
|
||||||
kClass
|
private fun findClass(name: Name): ClassDescriptor? {
|
||||||
else if (jClass == null)
|
if (!SpecialNames.isSafeIdentifier(name)) return null
|
||||||
null
|
|
||||||
else {
|
val classId = ClassId(packageFragment.fqName, name)
|
||||||
val classDescriptor = this.c.javaClassResolver.resolveClass(jClass)
|
|
||||||
assert(classDescriptor == null || classDescriptor.getContainingDeclaration() == packageFragment) {
|
val kotlinClass = c.resolveBinaryClass(c.kotlinClassFinder.findKotlinClass(classId))
|
||||||
|
if (kotlinClass != null) return kotlinClass.kClass
|
||||||
|
|
||||||
|
val javaClass = c.finder.findClass(classId)
|
||||||
|
if (javaClass != null) {
|
||||||
|
val classDescriptor = c.javaClassResolver.resolveClass(javaClass)
|
||||||
|
assert(classDescriptor == null || classDescriptor.containingDeclaration == packageFragment) {
|
||||||
"Wrong package fragment for $classDescriptor, expected $packageFragment"
|
"Wrong package fragment for $classDescriptor, expected $packageFragment"
|
||||||
}
|
}
|
||||||
classDescriptor
|
return classDescriptor
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return null
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getClassifier(name: Name, location: UsageLocation): ClassifierDescriptor? = classes(name)
|
override fun getClassifier(name: Name, location: UsageLocation): ClassifierDescriptor? = classes(name)
|
||||||
|
|||||||
@@ -25,7 +25,6 @@ import org.jetbrains.kotlin.load.java.structure.JavaTypeParameter
|
|||||||
import org.jetbrains.kotlin.load.java.structure.JavaTypeParameterListOwner
|
import org.jetbrains.kotlin.load.java.structure.JavaTypeParameterListOwner
|
||||||
import org.jetbrains.kotlin.load.kotlin.KotlinJvmBinaryClass
|
import org.jetbrains.kotlin.load.kotlin.KotlinJvmBinaryClass
|
||||||
import org.jetbrains.kotlin.load.kotlin.header.KotlinClassHeader
|
import org.jetbrains.kotlin.load.kotlin.header.KotlinClassHeader
|
||||||
import org.jetbrains.kotlin.name.ClassId
|
|
||||||
import org.jetbrains.kotlin.utils.mapToIndex
|
import org.jetbrains.kotlin.utils.mapToIndex
|
||||||
|
|
||||||
//TODO: (module refactoring) usages of this interface should be replaced by ModuleClassResolver
|
//TODO: (module refactoring) usages of this interface should be replaced by ModuleClassResolver
|
||||||
@@ -66,23 +65,7 @@ data class JavaClassLookupResult(val jClass: JavaClass? = null, val kClass: Clas
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun LazyJavaResolverContext.lookupBinaryClass(javaClass: JavaClass): ClassDescriptor? {
|
fun LazyJavaResolverContext.resolveBinaryClass(kotlinClass: KotlinJvmBinaryClass?): JavaClassLookupResult? {
|
||||||
val kotlinJvmBinaryClass = kotlinClassFinder.findKotlinClass(javaClass)
|
|
||||||
return resolveBinaryClass(kotlinJvmBinaryClass)?.kClass
|
|
||||||
}
|
|
||||||
|
|
||||||
fun LazyJavaResolverContext.findClassInJava(classId: ClassId): JavaClassLookupResult {
|
|
||||||
val kotlinClass = kotlinClassFinder.findKotlinClass(classId)
|
|
||||||
val binaryClassResult = resolveBinaryClass(kotlinClass)
|
|
||||||
if (binaryClassResult != null) return binaryClassResult
|
|
||||||
|
|
||||||
val javaClass = finder.findClass(classId)
|
|
||||||
if (javaClass != null) return JavaClassLookupResult(javaClass)
|
|
||||||
|
|
||||||
return JavaClassLookupResult.EMPTY
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun LazyJavaResolverContext.resolveBinaryClass(kotlinClass: KotlinJvmBinaryClass?): JavaClassLookupResult? {
|
|
||||||
if (kotlinClass == null) return null
|
if (kotlinClass == null) return null
|
||||||
|
|
||||||
val header = kotlinClass.getClassHeader()
|
val header = kotlinClass.getClassHeader()
|
||||||
|
|||||||
Reference in New Issue
Block a user