Fix resolution of inherited Kotlin properties in Java classes
#KT-6720 Fixed
This commit is contained in:
@@ -0,0 +1,18 @@
|
|||||||
|
// FILE: AC.kt
|
||||||
|
|
||||||
|
trait A {
|
||||||
|
val a: Int
|
||||||
|
}
|
||||||
|
|
||||||
|
// FILE: B.java
|
||||||
|
|
||||||
|
public abstract class B implements A {
|
||||||
|
}
|
||||||
|
|
||||||
|
// FILE: C.kt
|
||||||
|
|
||||||
|
<!ABSTRACT_MEMBER_NOT_IMPLEMENTED!>class C<!> : B()
|
||||||
|
|
||||||
|
fun main() {
|
||||||
|
C().a
|
||||||
|
}
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
package
|
||||||
|
|
||||||
|
internal fun main(): kotlin.Unit
|
||||||
|
|
||||||
|
internal trait A {
|
||||||
|
internal abstract val a: kotlin.Int
|
||||||
|
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
|
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
|
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
|
}
|
||||||
|
|
||||||
|
public abstract class B : A {
|
||||||
|
public constructor B()
|
||||||
|
internal abstract override /*1*/ /*fake_override*/ val a: kotlin.Int
|
||||||
|
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
|
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
|
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
|
}
|
||||||
|
|
||||||
|
internal final class C : B {
|
||||||
|
public constructor C()
|
||||||
|
internal abstract override /*1*/ /*fake_override*/ val a: kotlin.Int
|
||||||
|
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
|
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
|
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
|
}
|
||||||
@@ -6780,6 +6780,12 @@ public class JetDiagnosticsTestGenerated extends AbstractJetDiagnosticsTest {
|
|||||||
doTest(fileName);
|
doTest(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("kt6720_abstractProperty.kt")
|
||||||
|
public void testKt6720_abstractProperty() throws Exception {
|
||||||
|
String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/j+k/kt6720_abstractProperty.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("mutableIterator.kt")
|
@TestMetadata("mutableIterator.kt")
|
||||||
public void testMutableIterator() throws Exception {
|
public void testMutableIterator() throws Exception {
|
||||||
String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/j+k/mutableIterator.kt");
|
String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/j+k/mutableIterator.kt");
|
||||||
|
|||||||
+9
@@ -36,6 +36,7 @@ import org.jetbrains.kotlin.load.java.descriptors.JavaConstructorDescriptor
|
|||||||
import org.jetbrains.kotlin.load.java.components.DescriptorResolverUtils
|
import org.jetbrains.kotlin.load.java.components.DescriptorResolverUtils
|
||||||
import org.jetbrains.kotlin.types.JetType
|
import org.jetbrains.kotlin.types.JetType
|
||||||
import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter
|
import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter
|
||||||
|
import java.util.LinkedHashSet
|
||||||
|
|
||||||
public class LazyJavaClassMemberScope(
|
public class LazyJavaClassMemberScope(
|
||||||
c: LazyJavaResolverContext,
|
c: LazyJavaResolverContext,
|
||||||
@@ -233,6 +234,14 @@ public class LazyJavaClassMemberScope(
|
|||||||
override fun getClassNames(kindFilter: DescriptorKindFilter, nameFilter: (Name) -> Boolean): Collection<Name>
|
override fun getClassNames(kindFilter: DescriptorKindFilter, nameFilter: (Name) -> Boolean): Collection<Name>
|
||||||
= nestedClassIndex().keySet() + enumEntryIndex().keySet()
|
= 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
|
// TODO
|
||||||
override fun getImplicitReceiversHierarchy(): List<ReceiverParameterDescriptor> = listOf()
|
override fun getImplicitReceiversHierarchy(): List<ReceiverParameterDescriptor> = listOf()
|
||||||
|
|
||||||
|
|||||||
+3
-4
@@ -219,6 +219,8 @@ public abstract class LazyJavaMemberScope(
|
|||||||
|
|
||||||
protected abstract fun computeNonDeclaredProperties(name: Name, result: MutableCollection<PropertyDescriptor>)
|
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 {
|
private val properties = c.storageManager.createMemoizedFunction {
|
||||||
(name: Name) ->
|
(name: Name) ->
|
||||||
val properties = ArrayList<PropertyDescriptor>()
|
val properties = ArrayList<PropertyDescriptor>()
|
||||||
@@ -288,9 +290,6 @@ public abstract class LazyJavaMemberScope(
|
|||||||
|
|
||||||
override fun getProperties(name: Name): Collection<VariableDescriptor> = properties(name)
|
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 getLocalVariable(name: Name): VariableDescriptor? = null
|
||||||
override fun getDeclarationsByLabel(labelName: Name) = listOf<DeclarationDescriptor>()
|
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)) {
|
if (kindFilter.acceptsKinds(DescriptorKindFilter.VARIABLES_MASK) && !kindFilter.excludes.contains(NonExtensions)) {
|
||||||
for (name in getAllPropertyNames()) {
|
for (name in getPropertyNames(kindFilter, nameFilter)) {
|
||||||
if (nameFilter(name)) {
|
if (nameFilter(name)) {
|
||||||
result.addAll(getProperties(name))
|
result.addAll(getProperties(name))
|
||||||
}
|
}
|
||||||
|
|||||||
+4
-1
@@ -49,7 +49,10 @@ public class LazyJavaStaticClassScope(
|
|||||||
}
|
}
|
||||||
return super.getFunctionNames(kindFilter, nameFilter)
|
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 getClassNames(kindFilter: DescriptorKindFilter, nameFilter: (Name) -> Boolean): Collection<Name> = listOf()
|
||||||
override fun getClassifier(name: Name): ClassifierDescriptor? = null
|
override fun getClassifier(name: Name): ClassifierDescriptor? = null
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -110,7 +110,7 @@ public class LazyPackageFragmentScopeForJavaPackage(
|
|||||||
|
|
||||||
override fun getSubPackages() = subPackages()
|
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
|
// 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> {
|
override fun getDescriptors(kindFilter: DescriptorKindFilter, nameFilter: (Name) -> Boolean): Collection<DeclarationDescriptor> {
|
||||||
|
|||||||
Reference in New Issue
Block a user