Skip to content

Commit d29a47e

Browse files
committed
Generate references to superclasses
1 parent e5295d0 commit d29a47e

File tree

9 files changed

+83
-25
lines changed

9 files changed

+83
-25
lines changed

compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ClassGenerator.kt

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,14 +38,20 @@ import java.lang.AssertionError
3838
class ClassGenerator(declarationGenerator: DeclarationGenerator) : DeclarationGeneratorExtension(declarationGenerator) {
3939
fun generateClass(ktClassOrObject: KtClassOrObject): IrClass {
4040
val descriptor = getOrFail(BindingContext.CLASS, ktClassOrObject)
41+
val startOffset = ktClassOrObject.startOffset
42+
val endOffset = ktClassOrObject.endOffset
4143

4244
return context.symbolTable.declareClass(
43-
ktClassOrObject.startOffset, ktClassOrObject.endOffset,
44-
IrDeclarationOrigin.DEFINED,
45-
descriptor
45+
startOffset, endOffset, IrDeclarationOrigin.DEFINED, descriptor
4646
).buildWithScope { irClass ->
47+
descriptor.typeConstructor.supertypes.mapNotNullTo(irClass.superClasses) {
48+
it.constructor.declarationDescriptor?.safeAs<ClassDescriptor>()?.let {
49+
context.symbolTable.referenceClass(it)
50+
}
51+
}
52+
4753
irClass.thisReceiver = context.symbolTable.declareValueParameter(
48-
ktClassOrObject.startOffset, ktClassOrObject.endOffset,
54+
startOffset, endOffset,
4955
IrDeclarationOrigin.INSTANCE_RECEIVER,
5056
irClass.descriptor.thisAsReceiverParameter
5157
)

compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/DeclarationGenerator.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ class DeclarationGenerator(override val context: GeneratorContext) : Generator {
6868
fun generateClassOrObjectDeclaration(ktClassOrObject: KtClassOrObject): IrClass =
6969
ClassGenerator(this).generateClass(ktClassOrObject)
7070

71-
fun generateTypeAliasDeclaration(ktDeclaration: KtTypeAlias): IrDeclaration =
71+
private fun generateTypeAliasDeclaration(ktDeclaration: KtTypeAlias): IrDeclaration =
7272
IrTypeAliasImpl(
7373
ktDeclaration.startOffset, ktDeclaration.endOffset, IrDeclarationOrigin.DEFINED,
7474
getOrFail(BindingContext.TYPE_ALIAS, ktDeclaration)

compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrClass.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,9 @@ interface IrClass : IrSymbolDeclaration<IrClassSymbol>, IrDeclarationContainer,
3636
val isCompanion: Boolean
3737
val isData: Boolean
3838

39+
// NB type parameters can't be top-level classifiers in supetypes of a class
40+
val superClasses: MutableList<IrClassSymbol>
41+
3942
var thisReceiver: IrValueParameter?
4043
}
4144

compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrClassImpl.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,8 @@ class IrClassImpl(
7373

7474
override val typeParameters: MutableList<IrTypeParameter> = SmartList()
7575

76+
override val superClasses: MutableList<IrClassSymbol> = SmartList()
77+
7678
override fun <R, D> accept(visitor: IrElementVisitor<R, D>, data: D): R =
7779
visitor.visitClass(this, data)
7880

compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeclarationStubGenerator.kt

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import org.jetbrains.kotlin.ir.expressions.impl.IrErrorExpressionImpl
2828
import org.jetbrains.kotlin.ir.expressions.impl.IrExpressionBodyImpl
2929
import org.jetbrains.kotlin.resolve.DescriptorUtils
3030
import org.jetbrains.kotlin.resolve.scopes.MemberScope
31+
import org.jetbrains.kotlin.utils.addToStdlib.safeAs
3132

3233
class DeclarationStubGenerator(
3334
val symbolTable: SymbolTable,
@@ -56,7 +57,7 @@ class DeclarationStubGenerator(
5657
throw AssertionError("Unexpected member descriptor: $descriptor")
5758
}
5859

59-
fun generatePropertyStub(descriptor: PropertyDescriptor): IrProperty =
60+
private fun generatePropertyStub(descriptor: PropertyDescriptor): IrProperty =
6061
IrPropertyImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, origin, descriptor).also { irProperty ->
6162
val getterDescriptor = descriptor.getter
6263
if (getterDescriptor == null) {
@@ -75,16 +76,16 @@ class DeclarationStubGenerator(
7576
generateValueParametersStubs(descriptor.valueParameters, irFunction)
7677
}
7778

78-
fun generateConstructorStub(descriptor: ClassConstructorDescriptor): IrConstructor =
79+
private fun generateConstructorStub(descriptor: ClassConstructorDescriptor): IrConstructor =
7980
symbolTable.declareConstructor(UNDEFINED_OFFSET, UNDEFINED_OFFSET, origin, descriptor.original).also { irConstructor ->
8081
generateValueParametersStubs(descriptor.valueParameters, irConstructor)
8182
}
8283

83-
fun generateValueParametersStubs(valueParameters: Collection<ValueParameterDescriptor>, function: IrFunction) {
84+
private fun generateValueParametersStubs(valueParameters: Collection<ValueParameterDescriptor>, function: IrFunction) {
8485
valueParameters.mapTo(function.valueParameters) { generateValueParameterStub(it) }
8586
}
8687

87-
fun generateValueParameterStub(descriptor: ValueParameterDescriptor): IrValueParameter =
88+
private fun generateValueParameterStub(descriptor: ValueParameterDescriptor): IrValueParameter =
8889
IrValueParameterImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, origin, descriptor).also { irValueParameter ->
8990
if (descriptor.declaresDefaultValue()) {
9091
irValueParameter.defaultValue =
@@ -97,29 +98,36 @@ class DeclarationStubGenerator(
9798
}
9899
}
99100

100-
fun generateClassStub(descriptor: ClassDescriptor): IrClass =
101+
private fun generateClassStub(descriptor: ClassDescriptor): IrClass =
101102
symbolTable.declareClass(UNDEFINED_OFFSET, UNDEFINED_OFFSET, origin, descriptor).also { irClass ->
103+
// TODO get rid of code duplication, see ClassGenerator#generateClass
104+
descriptor.typeConstructor.supertypes.mapNotNullTo(irClass.superClasses) {
105+
it.constructor.declarationDescriptor?.safeAs<ClassDescriptor>()?.let {
106+
symbolTable.referenceClass(it)
107+
}
108+
}
109+
102110
generateTypeParameterStubs(descriptor.declaredTypeParameters, irClass)
103111
generateChildStubs(descriptor.constructors, irClass)
104112
generateMemberStubs(descriptor.defaultType.memberScope, irClass)
105113
generateMemberStubs(descriptor.staticScope, irClass)
106114
}
107115

108-
fun generateEnumEntryStub(descriptor: ClassDescriptor): IrEnumEntry =
116+
private fun generateEnumEntryStub(descriptor: ClassDescriptor): IrEnumEntry =
109117
symbolTable.declareEnumEntry(UNDEFINED_OFFSET, UNDEFINED_OFFSET, origin, descriptor)
110118

111-
fun generateTypeParameterStubs(typeParameters: List<TypeParameterDescriptor>, container: IrTypeParametersContainer) {
119+
private fun generateTypeParameterStubs(typeParameters: List<TypeParameterDescriptor>, container: IrTypeParametersContainer) {
112120
typeParameters.mapTo(container.typeParameters) { generateTypeParameterStub(it) }
113121
}
114122

115-
fun generateTypeParameterStub(descriptor: TypeParameterDescriptor): IrTypeParameter =
123+
private fun generateTypeParameterStub(descriptor: TypeParameterDescriptor): IrTypeParameter =
116124
IrTypeParameterImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, origin, descriptor)
117125

118-
fun generateMemberStubs(memberScope: MemberScope, container: IrDeclarationContainer) {
126+
private fun generateMemberStubs(memberScope: MemberScope, container: IrDeclarationContainer) {
119127
generateChildStubs(memberScope.getContributedDescriptors(), container)
120128
}
121129

122-
fun generateChildStubs(descriptors: Collection<DeclarationDescriptor>, container: IrDeclarationContainer) {
130+
private fun generateChildStubs(descriptors: Collection<DeclarationDescriptor>, container: IrDeclarationContainer) {
123131
descriptors.sortedWith(StableDescriptorsComparator).mapTo(container.declarations) { generateMemberStub(it) }
124132
}
125133
}

compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeepCopyIrTree.kt

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import org.jetbrains.kotlin.ir.declarations.*
2424
import org.jetbrains.kotlin.ir.declarations.impl.*
2525
import org.jetbrains.kotlin.ir.expressions.*
2626
import org.jetbrains.kotlin.ir.expressions.impl.*
27+
import org.jetbrains.kotlin.ir.symbols.impl.IrClassSymbolImpl
2728
import org.jetbrains.kotlin.ir.symbols.impl.IrFieldSymbolImpl
2829
import org.jetbrains.kotlin.ir.symbols.impl.IrSimpleFunctionSymbolImpl
2930
import org.jetbrains.kotlin.ir.symbols.impl.IrVariableSymbolImpl
@@ -96,6 +97,19 @@ open class DeepCopyIrTree : IrElementTransformerVoid() {
9697
).apply {
9798
thisReceiver = declaration.thisReceiver?.withDescriptor(descriptor.thisAsReceiverParameter)
9899
transformTypeParameters(declaration, descriptor.declaredTypeParameters)
100+
101+
descriptor.typeConstructor.supertypes.forEachIndexed { index, supertype ->
102+
val superclassDescriptor = supertype.constructor.declarationDescriptor
103+
if (superclassDescriptor is ClassDescriptor) {
104+
val oldSuperclassSymbol = declaration.superClasses.getOrNull(index)
105+
val newSuperclassSymbol =
106+
if (superclassDescriptor == oldSuperclassSymbol?.descriptor)
107+
oldSuperclassSymbol
108+
else
109+
IrClassSymbolImpl(superclassDescriptor)
110+
superClasses.add(newSuperclassSymbol)
111+
}
112+
}
99113
}
100114

101115
private fun IrValueParameter.withDescriptor(newDescriptor: ParameterDescriptor) =

compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeepCopyIrTreeWithSymbols.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,9 @@ open class DeepCopyIrTreeWithSymbols(private val symbolRemapper: SymbolRemapper)
8888
mapDeclarationOrigin(declaration.origin),
8989
symbolRemapper.getDeclaredClass(declaration.symbol)
9090
).apply {
91+
declaration.superClasses.mapTo(superClasses) {
92+
symbolRemapper.getReferencedClass(it)
93+
}
9194
thisReceiver = declaration.thisReceiver?.transform()
9295
declaration.typeParameters.transformTo(typeParameters)
9396
declaration.transformDeclarationsTo(this)

compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DependenciesCollector.kt

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import org.jetbrains.kotlin.descriptors.ModuleDescriptor
2222
import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor
2323
import org.jetbrains.kotlin.ir.symbols.IrSymbol
2424
import org.jetbrains.kotlin.resolve.DescriptorUtils
25+
import org.jetbrains.kotlin.resolve.descriptorUtil.getAllSuperClassifiers
2526

2627
class DependenciesCollector {
2728
private val modulesForDependencyDescriptors = LinkedHashSet<ModuleDescriptor>()
@@ -41,6 +42,14 @@ class DependenciesCollector {
4142
assert(symbolTable.unboundValueParameters.isEmpty()) { "Unbound value parameters: ${symbolTable.unboundValueParameters}" }
4243
assert(symbolTable.unboundVariables.isEmpty()) { "Unbound variables: ${symbolTable.unboundVariables}" }
4344

45+
for (unboundClass in symbolTable.unboundClasses.toTypedArray()) {
46+
for (superClassifier in unboundClass.descriptor.getAllSuperClassifiers()) {
47+
if (superClassifier is ClassDescriptor) {
48+
symbolTable.referenceClass(superClassifier)
49+
}
50+
}
51+
}
52+
4453
symbolTable.unboundClasses.addTopLevelDeclarations()
4554
symbolTable.unboundConstructors.addTopLevelDeclarations()
4655
symbolTable.unboundEnumEntries.addTopLevelDeclarations()

compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DumpIrTree.kt

Lines changed: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,12 @@
1616

1717
package org.jetbrains.kotlin.ir.util
1818

19+
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
1920
import org.jetbrains.kotlin.ir.IrElement
2021
import org.jetbrains.kotlin.ir.SourceManager
2122
import org.jetbrains.kotlin.ir.declarations.*
2223
import org.jetbrains.kotlin.ir.expressions.*
24+
import org.jetbrains.kotlin.ir.symbols.IrBindableSymbol
2325
import org.jetbrains.kotlin.ir.visitors.IrElementVisitor
2426
import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid
2527
import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid
@@ -78,23 +80,15 @@ class DumpIrTreeVisitor(out: Appendable) : IrElementVisitor<Unit, String> {
7880
override fun visitClass(declaration: IrClass, data: String) {
7981
declaration.dumpLabeledElementWith(data) {
8082
declaration.thisReceiver?.accept(this, "\$this")
83+
declaration.superClasses.renderDeclarationElementsOrDescriptors("superClasses")
8184
declaration.typeParameters.dumpElements()
8285
declaration.declarations.dumpElements()
8386
}
8487
}
8588

8689
override fun visitSimpleFunction(declaration: IrSimpleFunction, data: String) {
8790
declaration.dumpLabeledElementWith(data) {
88-
if (declaration.overriddenSymbols.isNotEmpty()) {
89-
indented("overridden") {
90-
for (overriddenSymbol in declaration.overriddenSymbols) {
91-
if (overriddenSymbol.isBound)
92-
overriddenSymbol.owner.render()
93-
else
94-
printer.println("UNBOUND: ", DescriptorRenderer.COMPACT.render(overriddenSymbol.descriptor))
95-
}
96-
}
97-
}
91+
declaration.overriddenSymbols.renderDeclarationElementsOrDescriptors("overridden")
9892
declaration.typeParameters.dumpElements()
9993
declaration.dispatchReceiverParameter?.accept(this, "\$this")
10094
declaration.extensionReceiverParameter?.accept(this, "\$receiver")
@@ -103,6 +97,25 @@ class DumpIrTreeVisitor(out: Appendable) : IrElementVisitor<Unit, String> {
10397
}
10498
}
10599

100+
private fun <D : DeclarationDescriptor, B : IrSymbolOwner> Collection<IrBindableSymbol<D, B>>.renderDeclarationElementsOrDescriptors(
101+
caption: String
102+
) {
103+
if (isNotEmpty()) {
104+
indented(caption) {
105+
for (symbol in this) {
106+
symbol.renderDeclarationElementOrDescriptor()
107+
}
108+
}
109+
}
110+
}
111+
112+
private fun <D : DeclarationDescriptor, B : IrSymbolOwner> IrBindableSymbol<D, B>.renderDeclarationElementOrDescriptor() {
113+
if (isBound)
114+
owner.render()
115+
else
116+
printer.println("UNBOUND: ", DescriptorRenderer.COMPACT.render(descriptor))
117+
}
118+
106119
override fun visitConstructor(declaration: IrConstructor, data: String) {
107120
declaration.dumpLabeledElementWith(data) {
108121
declaration.typeParameters.dumpElements()

0 commit comments

Comments
 (0)