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
|
package org.jetbrains.kotlin.fir.scopes.impl
|
||||||
|
|
||||||
import org.jetbrains.kotlin.fir.FirSession
|
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.FirScope
|
||||||
import org.jetbrains.kotlin.fir.scopes.FirTypeScope
|
import org.jetbrains.kotlin.fir.scopes.FirTypeScope
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol
|
import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol
|
||||||
@@ -23,6 +24,10 @@ class FirClassUseSiteMemberScope(
|
|||||||
val seen = mutableSetOf<FirVariableSymbol<*>>()
|
val seen = mutableSetOf<FirVariableSymbol<*>>()
|
||||||
declaredMemberScope.processPropertiesByName(name) l@{
|
declaredMemberScope.processPropertiesByName(name) l@{
|
||||||
if (it.isStatic) return@l
|
if (it.isStatic) return@l
|
||||||
|
if (it is FirPropertySymbol) {
|
||||||
|
val directOverridden = computeDirectOverridden(it.fir)
|
||||||
|
this@FirClassUseSiteMemberScope.directOverriddenProperties[it] = directOverridden
|
||||||
|
}
|
||||||
seen += it
|
seen += it
|
||||||
processor(it)
|
processor(it)
|
||||||
}
|
}
|
||||||
@@ -31,9 +36,18 @@ class FirClassUseSiteMemberScope(
|
|||||||
val overriddenBy = it.getOverridden(seen)
|
val overriddenBy = it.getOverridden(seen)
|
||||||
if (overriddenBy == null) {
|
if (overriddenBy == null) {
|
||||||
processor(it)
|
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 {
|
enum class E {
|
||||||
ENTRY;
|
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
|
// FILE: A.java
|
||||||
|
|
||||||
public class A extends B {
|
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
|
// FILE: A.java
|
||||||
|
|
||||||
public class A extends B {
|
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
|
// FILE: A.java
|
||||||
|
|
||||||
public class A extends B {
|
public class A extends B {
|
||||||
|
|||||||
Reference in New Issue
Block a user