[FIR] Make statics visible from nested companion/classes

This commit is contained in:
Simon Ogorodnik
2019-11-29 20:17:49 +03:00
parent 02cbe990c0
commit 90a1b15b77
5 changed files with 68 additions and 1 deletions
@@ -222,7 +222,7 @@ class FirTowerResolver(
}
val implicitScope = implicitReceiverValue.implicitScope
if (implicitScope != null) {
// Regular implicit receiver scope (outer objects only?)
// Regular implicit receiver scope (outer objects, statics)
// object Outer {
// val x = 0
// class Nested { val y = x }
@@ -270,6 +270,7 @@ class QualifiedReceiverTowerLevel(
fun FirCallableDeclaration<*>.dispatchReceiverValue(session: FirSession): ClassDispatchReceiverValue? {
// TODO: this is not true atCall least for inner class constructors
if (this is FirConstructor) return null
if ((this as? FirMemberDeclaration)?.isStatic == true) return null
val id = this.symbol.callableId.classId ?: return null
val symbol = session.firSymbolProvider.getClassLikeSymbolByFqName(id) as? FirClassSymbol ?: return null
@@ -0,0 +1,11 @@
enum class EC {
A, B;
companion object {
fun u(ec: EC): Boolean {
return when (ec) {
A -> true
B -> false
}
}
}
}
@@ -0,0 +1,50 @@
FILE: enumWithCompanion.kt
public final enum class EC : R|kotlin/Enum<EC>| {
private constructor(): R|EC| {
super<R|kotlin/Enum<EC>|>()
}
public final static val A: R|EC| = object : R|EC| {
private constructor(): R|EC| {
super<R|EC|>()
}
}
public final static val B: R|EC| = object : R|EC| {
private constructor(): R|EC| {
super<R|EC|>()
}
}
public final companion object Companion : R|kotlin/Any| {
private constructor(): R|EC.Companion| {
super<R|kotlin/Any|>()
}
public final fun u(ec: R|EC|): R|kotlin/Boolean| {
^u when (R|<local>/ec|) {
==($subj$, R|/EC.A|) -> {
Boolean(true)
}
==($subj$, R|/EC.B|) -> {
Boolean(false)
}
}
}
}
public final static fun values(): R|kotlin/Array<EC>| {
}
public final static fun valueOf(value: R|kotlin/String|): R|EC| {
}
}
@@ -73,6 +73,11 @@ public class FirDiagnosticsTestGenerated extends AbstractFirDiagnosticsTest {
runTest("compiler/fir/resolve/testData/resolve/enum.kt");
}
@TestMetadata("enumWithCompanion.kt")
public void testEnumWithCompanion() throws Exception {
runTest("compiler/fir/resolve/testData/resolve/enumWithCompanion.kt");
}
@TestMetadata("exhaustiveness_boolean.kt")
public void testExhaustiveness_boolean() throws Exception {
runTest("compiler/fir/resolve/testData/resolve/exhaustiveness_boolean.kt");