FIR: use override checker when populating directOverriddenProperties
This commit is contained in:
committed by
Mikhail Glukhikh
parent
fa1507fb91
commit
9370f918e9
+16
-2
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user