diff --git a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/LazyJavaPackageFragmentProvider.kt b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/LazyJavaPackageFragmentProvider.kt index 9db7c8c16d0..5dc0fe8e05e 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/LazyJavaPackageFragmentProvider.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/LazyJavaPackageFragmentProvider.kt @@ -28,6 +28,7 @@ import org.jetbrains.jet.lang.resolve.java.resolver.JavaPackageFragmentProvider import org.jetbrains.jet.lang.resolve.java.lazy.descriptors.LazyJavaPackageFragment import org.jetbrains.jet.lang.resolve.kotlin.KotlinJvmBinaryClass import org.jetbrains.jet.lang.resolve.java.lazy.descriptors.LazyJavaClassDescriptor +import org.jetbrains.jet.lang.resolve.scopes.JetScope public class LazyJavaPackageFragmentProvider( outerContext: GlobalJavaResolverContext, @@ -66,7 +67,7 @@ public class LazyJavaPackageFragmentProvider( } } - private val topLevelClasses = c.storageManager.createMemoizedFunctionWithNullableValues @lambda { + internal val topLevelClasses = c.storageManager.createMemoizedFunctionWithNullableValues @lambda { (jClass: JavaClass): LazyJavaClassDescriptor? -> val fqName = jClass.getFqName() if (fqName == null) return@lambda null @@ -120,13 +121,18 @@ public class LazyJavaPackageFragmentProvider( return c.javaResolverCache.getClassResolvedFromSource(fqName) } } + val resolvedClassifier = getContainingScope(javaClass)?.getClassifier(javaClass.getName()) + return resolvedClassifier as? ClassDescriptor ?: c.javaResolverCache.getClass(javaClass) + } + + private fun getContainingScope(javaClass: JavaClass): JetScope? { val outerClass = javaClass.getOuterClass() - if (outerClass == null) { - return c.lookupBinaryClass(javaClass) ?: topLevelClasses(javaClass) + if (outerClass != null) { + return resolveClass(outerClass)?.getUnsubstitutedInnerClassesScope() + } + else { + return getPackageFragment(javaClass.getFqName()!!.parent())?.getMemberScope() } - val outerClassScope = resolveClass(outerClass)?.getUnsubstitutedInnerClassesScope() - val nestedClass = outerClassScope?.getClassifier(javaClass.getName()) as? ClassDescriptor - return nestedClass ?: c.javaResolverCache.getClass(javaClass) } override fun resolveClassByFqName(fqName: FqName): ClassDescriptor? { diff --git a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/descriptors/LazyJavaPackageFragmentScope.kt b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/descriptors/LazyJavaPackageFragmentScope.kt index f772b939566..56948580a6f 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/descriptors/LazyJavaPackageFragmentScope.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/descriptors/LazyJavaPackageFragmentScope.kt @@ -55,7 +55,7 @@ public abstract class LazyJavaPackageFragmentScope( if (cached != null) cached else { - val classDescriptor = c.javaClassResolver.resolveClass(jClass) + val classDescriptor = c.packageFragmentProvider.topLevelClasses(jClass) assert(classDescriptor == null || classDescriptor.getContainingDeclaration() == packageFragment, "Wrong package fragment for $classDescriptor, expected $packageFragment") classDescriptor