FIR deserializer: provide proper type for enum entries

This commit is contained in:
Simon Ogorodnik
2019-04-25 14:13:38 +03:00
committed by Mikhail Glukhikh
parent ca350e64c2
commit e521e66c74
11 changed files with 38 additions and 27 deletions
@@ -33,6 +33,7 @@ import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirTypeAliasSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirTypeAliasSymbol
import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef
import org.jetbrains.kotlin.fir.types.impl.ConeClassTypeImpl
import org.jetbrains.kotlin.fir.types.impl.FirErrorTypeRefImpl import org.jetbrains.kotlin.fir.types.impl.FirErrorTypeRefImpl
import org.jetbrains.kotlin.fir.types.impl.FirResolvedTypeRefImpl import org.jetbrains.kotlin.fir.types.impl.FirResolvedTypeRefImpl
import org.jetbrains.kotlin.load.java.JavaClassFinder import org.jetbrains.kotlin.load.java.JavaClassFinder
@@ -296,7 +297,15 @@ class KotlinDeserializedJvmSymbolsProvider(
} }
val symbol = FirClassSymbol(classId) val symbol = FirClassSymbol(classId)
FirEnumEntryImpl(session, null, symbol, classId.shortClassName) FirEnumEntryImpl(session, null, symbol, classId.shortClassName).apply {
superTypeRefs += FirResolvedTypeRefImpl(
session,
null,
ConeClassTypeImpl(ConeClassLikeLookupTagImpl(outerClassId), emptyArray(), false),
false,
emptyList()
)
}
classesCache[classId] = symbol classesCache[classId] = symbol
} else { } else {
if (kotlinJvmBinaryClass.classHeader.kind != KotlinClassHeader.Kind.CLASS) return null if (kotlinJvmBinaryClass.classHeader.kind != KotlinClassHeader.Kind.CLASS) return null
@@ -6,7 +6,7 @@
public final enum class E : R|kotlin/Enum<test/E>| { public final enum class E : R|kotlin/Enum<test/E>| {
private constructor(): R|test/E| private constructor(): R|test/E|
public? final enum entry ENTRY { public? final enum entry ENTRY : R|test/E| {
} }
} }
@@ -17,16 +17,16 @@ public final annotation class Bnno : R|kotlin/Annotation| {
public final enum class Eee : R|kotlin/Enum<test/Eee>| { public final enum class Eee : R|kotlin/Enum<test/Eee>| {
private constructor(): R|test/Eee| private constructor(): R|test/Eee|
public? final enum entry Entry1 { public? final enum entry Entry1 : R|test/Eee| {
} }
public? final enum entry Entry2 { public? final enum entry Entry2 : R|test/Eee| {
} }
public? final enum entry Entry3 { public? final enum entry Entry3 : R|test/Eee| {
} }
public? final enum entry Entry4 { public? final enum entry Entry4 : R|test/Eee| {
} }
} }
@@ -1,7 +1,7 @@
internal final enum class In : R|kotlin/Enum<test/In>| { internal final enum class In : R|kotlin/Enum<test/In>| {
private constructor(): R|test/In| private constructor(): R|test/In|
public? final enum entry A { public? final enum entry A : R|test/In| {
} }
} }
@@ -9,7 +9,7 @@ internal final enum class In : R|kotlin/Enum<test/In>| {
private final enum class Pr : R|kotlin/Enum<test/Pr>| { private final enum class Pr : R|kotlin/Enum<test/Pr>| {
private constructor(): R|test/Pr| private constructor(): R|test/Pr|
public? final enum entry A { public? final enum entry A : R|test/Pr| {
} }
} }
@@ -17,7 +17,7 @@ private final enum class Pr : R|kotlin/Enum<test/Pr>| {
public final enum class Pu : R|kotlin/Enum<test/Pu>| { public final enum class Pu : R|kotlin/Enum<test/Pu>| {
private constructor(): R|test/Pu| private constructor(): R|test/Pu|
public? final enum entry A { public? final enum entry A : R|test/Pu| {
} }
} }
@@ -7,13 +7,13 @@ public final enum class En : R|kotlin/Enum<test/En>| {
private constructor(b: R|kotlin/Boolean| = STUB, i: R|kotlin/Int| = STUB): R|test/En| private constructor(b: R|kotlin/Boolean| = STUB, i: R|kotlin/Int| = STUB): R|test/En|
public? final enum entry E1 { public? final enum entry E1 : R|test/En| {
} }
public? final enum entry E2 { public? final enum entry E2 : R|test/En| {
} }
public? final enum entry E3 { public? final enum entry E3 : R|test/En| {
} }
} }
@@ -19,10 +19,10 @@ public final enum class Enum : R|kotlin/Enum<test/Enum>| {
public abstract interface Trait : R|kotlin/Any| { public abstract interface Trait : R|kotlin/Any| {
} }
public? final enum entry ENTRY1 { public? final enum entry ENTRY1 : R|test/Enum| {
} }
public? final enum entry ENTRY2 { public? final enum entry ENTRY2 : R|test/Enum| {
} }
} }
@@ -4,9 +4,10 @@ public final class A : R|kotlin/Any| {
public final enum class E : R|kotlin/Enum<test/A.E>| { public final enum class E : R|kotlin/Enum<test/A.E>| {
private constructor(): R|test/A.E| private constructor(): R|test/A.E|
public? final enum entry ENTRY { public? final enum entry ENTRY : R|test/A.E| {
} }
} }
} }
@@ -9,9 +9,10 @@ public final class A : R|kotlin/Any| {
public final enum class E : R|kotlin/Enum<test/A.E>| { public final enum class E : R|kotlin/Enum<test/A.E>| {
private constructor(): R|test/A.E| private constructor(): R|test/A.E|
public? final enum entry ENTRY { public? final enum entry ENTRY : R|test/A.E| {
} }
} }
} }
@@ -1,7 +1,7 @@
public final enum class MyEnum : R|kotlin/Enum<test/MyEnum>| { public final enum class MyEnum : R|kotlin/Enum<test/MyEnum>| {
private constructor(): R|test/MyEnum| private constructor(): R|test/MyEnum|
public? final enum entry ENTRY { public? final enum entry ENTRY : R|test/MyEnum| {
} }
} }
@@ -1,10 +1,10 @@
public final enum class Test : R|kotlin/Enum<test/Test>| { public final enum class Test : R|kotlin/Enum<test/Test>| {
private constructor(a: R|kotlin/Int|): R|test/Test| private constructor(a: R|kotlin/Int|): R|test/Test|
public? final enum entry A { public? final enum entry A : R|test/Test| {
} }
public? final enum entry B { public? final enum entry B : R|test/Test| {
} }
} }
@@ -1,28 +1,28 @@
public final enum class E : R|kotlin/Enum<test/E>| { public final enum class E : R|kotlin/Enum<test/E>| {
private constructor(): R|test/E| private constructor(): R|test/E|
public? final enum entry ONE { public? final enum entry ONE : R|test/E| {
} }
public? final enum entry TWO { public? final enum entry TWO : R|test/E| {
} }
public? final enum entry THREE { public? final enum entry THREE : R|test/E| {
} }
public? final enum entry FOUR { public? final enum entry FOUR : R|test/E| {
} }
public? final enum entry FIVE { public? final enum entry FIVE : R|test/E| {
} }
public? final enum entry SIX { public? final enum entry SIX : R|test/E| {
} }
public? final enum entry SEVEN { public? final enum entry SEVEN : R|test/E| {
} }
public? final enum entry EIGHT { public? final enum entry EIGHT : R|test/E| {
} }
} }