Fix resolution of inherited Kotlin properties in Java classes

#KT-6720 Fixed
This commit is contained in:
Alexander Udalov
2015-02-03 22:21:03 +03:00
parent 5170ab3588
commit cafc1ea24d
7 changed files with 67 additions and 6 deletions
@@ -36,6 +36,7 @@ import org.jetbrains.kotlin.load.java.descriptors.JavaConstructorDescriptor
import org.jetbrains.kotlin.load.java.components.DescriptorResolverUtils
import org.jetbrains.kotlin.types.JetType
import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter
import java.util.LinkedHashSet
public class LazyJavaClassMemberScope(
c: LazyJavaResolverContext,
@@ -233,6 +234,14 @@ public class LazyJavaClassMemberScope(
override fun getClassNames(kindFilter: DescriptorKindFilter, nameFilter: (Name) -> Boolean): Collection<Name>
= nestedClassIndex().keySet() + enumEntryIndex().keySet()
override fun getPropertyNames(kindFilter: DescriptorKindFilter, nameFilter: (Name) -> Boolean): Collection<Name> =
memberIndex().getAllFieldNames() +
getContainingDeclaration().getTypeConstructor().getSupertypes().flatMapTo(LinkedHashSet<Name>()) { supertype ->
supertype.getMemberScope().getDescriptors(kindFilter, nameFilter).map { variable ->
variable.getName()
}
}
// TODO
override fun getImplicitReceiversHierarchy(): List<ReceiverParameterDescriptor> = listOf()
@@ -219,6 +219,8 @@ public abstract class LazyJavaMemberScope(
protected abstract fun computeNonDeclaredProperties(name: Name, result: MutableCollection<PropertyDescriptor>)
protected abstract fun getPropertyNames(kindFilter: DescriptorKindFilter, nameFilter: (Name) -> Boolean): Collection<Name>
private val properties = c.storageManager.createMemoizedFunction {
(name: Name) ->
val properties = ArrayList<PropertyDescriptor>()
@@ -288,9 +290,6 @@ public abstract class LazyJavaMemberScope(
override fun getProperties(name: Name): Collection<VariableDescriptor> = properties(name)
// we do not have nameFilter here because it only makes sense in package but java package does not contain any properties
protected open fun getAllPropertyNames(): Collection<Name> = memberIndex().getAllFieldNames()
override fun getLocalVariable(name: Name): VariableDescriptor? = null
override fun getDeclarationsByLabel(labelName: Name) = listOf<DeclarationDescriptor>()
@@ -321,7 +320,7 @@ public abstract class LazyJavaMemberScope(
}
if (kindFilter.acceptsKinds(DescriptorKindFilter.VARIABLES_MASK) && !kindFilter.excludes.contains(NonExtensions)) {
for (name in getAllPropertyNames()) {
for (name in getPropertyNames(kindFilter, nameFilter)) {
if (nameFilter(name)) {
result.addAll(getProperties(name))
}
@@ -49,7 +49,10 @@ public class LazyJavaStaticClassScope(
}
return super.getFunctionNames(kindFilter, nameFilter)
}
override fun getPropertyNames(kindFilter: DescriptorKindFilter, nameFilter: (Name) -> Boolean): Collection<Name> =
memberIndex().getAllFieldNames()
override fun getClassNames(kindFilter: DescriptorKindFilter, nameFilter: (Name) -> Boolean): Collection<Name> = listOf()
override fun getClassifier(name: Name): ClassifierDescriptor? = null
@@ -110,7 +110,7 @@ public class LazyPackageFragmentScopeForJavaPackage(
override fun getSubPackages() = subPackages()
override fun getAllPropertyNames() = listOf<Name>()
override fun getPropertyNames(kindFilter: DescriptorKindFilter, nameFilter: (Name) -> Boolean) = listOf<Name>()
// we don't use implementation from super which caches all descriptors and does not use filters
override fun getDescriptors(kindFilter: DescriptorKindFilter, nameFilter: (Name) -> Boolean): Collection<DeclarationDescriptor> {