FIR: use override checker when populating directOverriddenProperties

This commit is contained in:
Jinseong Jeon
2021-02-08 15:49:48 -08:00
committed by Mikhail Glukhikh
parent fa1507fb91
commit 9370f918e9
9 changed files with 20 additions and 107 deletions
@@ -6,6 +6,7 @@
package org.jetbrains.kotlin.fir.scopes.impl
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirProperty
import org.jetbrains.kotlin.fir.scopes.FirScope
import org.jetbrains.kotlin.fir.scopes.FirTypeScope
import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol
@@ -23,6 +24,10 @@ class FirClassUseSiteMemberScope(
val seen = mutableSetOf<FirVariableSymbol<*>>()
declaredMemberScope.processPropertiesByName(name) l@{
if (it.isStatic) return@l
if (it is FirPropertySymbol) {
val directOverridden = computeDirectOverridden(it.fir)
this@FirClassUseSiteMemberScope.directOverriddenProperties[it] = directOverridden
}
seen += it
processor(it)
}
@@ -31,9 +36,18 @@ class FirClassUseSiteMemberScope(
val overriddenBy = it.getOverridden(seen)
if (overriddenBy == null) {
processor(it)
} else if (overriddenBy is FirPropertySymbol && it is FirPropertySymbol) {
directOverriddenProperties.getOrPut(overriddenBy) { mutableListOf() }.add(it)
}
}
}
private fun computeDirectOverridden(property: FirProperty): MutableList<FirPropertySymbol> {
val result = mutableListOf<FirPropertySymbol>()
superTypesScope.processPropertiesByName(property.name) l@{ superSymbol ->
if (superSymbol !is FirPropertySymbol) return@l
if (overrideChecker.isOverriddenProperty(property, superSymbol.fir)) {
result.add(superSymbol)
}
}
return result
}
}
@@ -1,11 +0,0 @@
enum class E {
ENTRY;
override val name: String = "lol"
override val ordinal: Int = 0
<!OVERRIDING_FINAL_MEMBER!>override<!> fun compareTo(other: E) = -1
<!OVERRIDING_FINAL_MEMBER!>override<!> fun equals(other: Any?) = true
<!OVERRIDING_FINAL_MEMBER!>override<!> fun hashCode() = -1
}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
enum class E {
ENTRY;
@@ -1,27 +0,0 @@
// FILE: A.java
public class A extends B {
public int isFoo() { return 0; }
public void setFoo(int x) {}
}
// FILE: F.java
public class F extends B {
public final int isFoo() { return 0; }
public final void setFoo(int x) {}
}
// FILE: main.kt
open class B {
open var isFoo: Int = 1
}
class C1 : A() {
override var isFoo: Int = 2
}
class C2 : F() {
override var isFoo: Int = 3
}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
// FILE: A.java
public class A extends B {
@@ -1,25 +0,0 @@
// FILE: A.java
public class A extends B {
public int getFoo() { return 0; }
}
// FILE: F.java
public class F extends B {
public final int getFoo() { return 0; }
}
// FILE: main.kt
open class B {
open val foo: Int = 1
}
class C1 : A() {
override val foo: Int = 2
}
class C2 : F() {
override val foo: Int = 3
}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
// FILE: A.java
public class A extends B {
@@ -1,42 +0,0 @@
// FILE: A.java
public class A extends B {
public int getFoo() { return 0; }
public void setFoo(int x) {}
}
// FILE: F.java
public class F extends B {
public final int getFoo() { return 0; }
public final void setFoo(int x) {}
}
// FILE: ConflictingModality.java
public class ConflictingModality extends B {
public final int getFoo() { return 0; }
public abstract void setFoo(int x) {}
}
// FILE: ConflictingVisibility.java
public class ConflictingVisibility extends B {
public int getFoo() { return 0; }
protected void setFoo(int x) {}
}
// FILE: main.kt
open class B {
// check that final is not overridden
open protected var foo: Int = 1
}
class C1 : A() {
override var foo: Int = 2
}
class C2 : F() {
override var foo: Int = 3
}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
// FILE: A.java
public class A extends B {