Names of subpackages and classes are computed in LazyJavaPackageFragmentProvider

This commit is contained in:
Andrey Breslav
2013-12-24 14:02:50 +04:00
parent c01705f542
commit ada79588f6
3 changed files with 17 additions and 11 deletions
@@ -10,7 +10,7 @@ import org.jetbrains.jet.lang.resolve.java.lazy.descriptors.LazyPackageFragmentF
import org.jetbrains.jet.lang.resolve.java.resolver.JavaClassResolver import org.jetbrains.jet.lang.resolve.java.resolver.JavaClassResolver
import org.jetbrains.jet.lang.resolve.java.resolver.DescriptorResolverUtils import org.jetbrains.jet.lang.resolve.java.resolver.DescriptorResolverUtils
import org.jetbrains.jet.lang.resolve.java.resolver.JavaPackageFragmentProvider import org.jetbrains.jet.lang.resolve.java.resolver.JavaPackageFragmentProvider
import org.jetbrains.jet.lang.resolve.java.descriptor.JavaPackageFragmentDescriptor import org.jetbrains.jet.lang.resolve.java.lazy.descriptors.LazyJavaPackageFragment
import org.jetbrains.jet.lang.resolve.name.Name import org.jetbrains.jet.lang.resolve.name.Name
public open class LazyJavaPackageFragmentProvider( public open class LazyJavaPackageFragmentProvider(
@@ -34,7 +34,7 @@ public open class LazyJavaPackageFragmentProvider(
override fun getJavaDescriptorResolver() = c.javaDescriptorResolver override fun getJavaDescriptorResolver() = c.javaDescriptorResolver
private val _packageFragments: MemoizedFunctionToNullable<FqName, JavaPackageFragmentDescriptor> = c.storageManager.createMemoizedFunctionWithNullableValues { private val _packageFragments: MemoizedFunctionToNullable<FqName, LazyJavaPackageFragment> = c.storageManager.createMemoizedFunctionWithNullableValues {
fqName -> fqName ->
val jPackage = c.finder.findPackage(fqName) val jPackage = c.finder.findPackage(fqName)
if (jPackage != null) { if (jPackage != null) {
@@ -52,8 +52,10 @@ public open class LazyJavaPackageFragmentProvider(
override fun getPackageFragment(fqName: FqName) = _packageFragments(fqName) override fun getPackageFragment(fqName: FqName) = _packageFragments(fqName)
override fun getPackageFragments(fqName: FqName) = getPackageFragment(fqName)?.let {listOf(it)} ?: listOf() override fun getPackageFragments(fqName: FqName) = getPackageFragment(fqName)?.let {listOf(it)} ?: listOf()
override fun getSubPackagesOf(fqName: FqName) = listOf<FqName>() // TODO override fun getSubPackagesOf(fqName: FqName) = getPackageFragment(fqName)?.getMemberScope()?.getSubPackages()
override fun getClassNamesInPackage(packageName: FqName) = listOf<Name>() // TODO ?: listOf<FqName>()
override fun getClassNamesInPackage(packageName: FqName) = getPackageFragment(packageName)?.getMemberScope()?.getAllClassNames()
?: listOf<Name>()
fun getClass(fqName: FqName): ClassDescriptor? = c.javaClassResolver.resolveClassByFqName(fqName) fun getClass(fqName: FqName): ClassDescriptor? = c.javaClassResolver.resolveClassByFqName(fqName)
@@ -36,12 +36,12 @@ class LazyJavaPackageFragment(
containingDeclaration: ModuleDescriptor, containingDeclaration: ModuleDescriptor,
val _kind: JavaPackageFragmentDescriptor.Kind, val _kind: JavaPackageFragmentDescriptor.Kind,
val _fqName: FqName, val _fqName: FqName,
createMemberScope: LazyJavaPackageFragment.() -> JetScope createMemberScope: LazyJavaPackageFragment.() -> LazyJavaPackageFragmentScope
) : DeclarationDescriptorNonRootImpl(containingDeclaration, listOf(), _fqName.shortNameOrSpecial()), ) : DeclarationDescriptorNonRootImpl(containingDeclaration, listOf(), _fqName.shortNameOrSpecial()),
JavaPackageFragmentDescriptor, LazyJavaDescriptor JavaPackageFragmentDescriptor, LazyJavaDescriptor
{ {
private val _memberScope = createMemberScope() private val _memberScope = createMemberScope()
override fun getMemberScope() = _memberScope override fun getMemberScope(): LazyJavaPackageFragmentScope = _memberScope
override fun getKind() = _kind override fun getKind() = _kind
override fun getFqName() = _fqName override fun getFqName() = _fqName
@@ -13,6 +13,7 @@ import org.jetbrains.jet.utils.flatten
import org.jetbrains.jet.lang.resolve.java.structure.JavaClass import org.jetbrains.jet.lang.resolve.java.structure.JavaClass
import org.jetbrains.kotlin.util.inn import org.jetbrains.kotlin.util.inn
import org.jetbrains.jet.lang.resolve.java.DescriptorSearchRule import org.jetbrains.jet.lang.resolve.java.DescriptorSearchRule
import org.jetbrains.kotlin.util.sure
public abstract class LazyJavaPackageFragmentScope( public abstract class LazyJavaPackageFragmentScope(
c: LazyJavaResolverContext, c: LazyJavaResolverContext,
@@ -47,9 +48,12 @@ public abstract class LazyJavaPackageFragmentScope(
} }
override fun getClassifier(name: Name): ClassifierDescriptor? = classes(name) override fun getClassifier(name: Name): ClassifierDescriptor? = classes(name)
public abstract override fun getAllClassNames(): Collection<Name>
// Package fragments are not nested // Package fragments are not nested
override fun getPackage(name: Name) = null override fun getPackage(name: Name) = null
final override fun getAllPackageNames() = listOf<Name>()
abstract fun getSubPackages(): Collection<FqName>
override fun getImplicitReceiversHierarchy(): List<ReceiverParameterDescriptor> = listOf() override fun getImplicitReceiversHierarchy(): List<ReceiverParameterDescriptor> = listOf()
@@ -70,12 +74,12 @@ public class LazyPackageFragmentScopeForJavaPackage(
.map { c -> c.getName() }.toList() .map { c -> c.getName() }.toList()
} }
override fun getAllPackageNames(): Collection<Name> = override fun getSubPackages(): Collection<FqName> =
listOf( listOf(
// We do not filter by hasStaticMembers() because it's slow (e.g. it triggers light class generation), // We do not filter by hasStaticMembers() because it's slow (e.g. it triggers light class generation),
// and there's no harm in having some names in the result that can not be resolved // and there's no harm in having some names in the result that can not be resolved
jPackage.getClasses().map { c -> c.getName() }, jPackage.getClasses().map { c -> c.getFqName().sure("Toplevel class has no fqName: $c}") },
jPackage.getSubPackages().map { sp -> sp.getFqName().shortName() } jPackage.getSubPackages().map { sp -> sp.getFqName() }
).flatten() ).flatten()
@@ -97,7 +101,7 @@ public class LazyPackageFragmentScopeForJavaClass(
// We do not filter by hasStaticMembers() because it's slow (e.g. it triggers light class generation), // We do not filter by hasStaticMembers() because it's slow (e.g. it triggers light class generation),
// and there's no harm in having some names in the result that can not be resolved // and there's no harm in having some names in the result that can not be resolved
override fun getAllPackageNames(): Collection<Name> = jClass.getInnerClasses().iterator() override fun getSubPackages(): Collection<FqName> = jClass.getInnerClasses().iterator()
.filter { c -> c.isStatic() } .filter { c -> c.isStatic() }
.map { c -> c.getName() }.toList() .map { c -> c.getFqName().sure("Nested class has no fqName: $c}") }.toList()
} }