Add minor improvements to psi2ir and IR utilities:

* Generate missing IR parameter declarations in external stubs
* Use origin = FAKE_OVERRIDE in external IR stubs for fake overrides
* Set .parent in external IR stubs
* Set .parent in IR generated by some utility methods
This commit is contained in:
Svyatoslav Scherbina
2018-03-01 17:06:23 +03:00
parent 13a7270129
commit 7a2d761a7d
127 changed files with 2293 additions and 1613 deletions
@@ -113,6 +113,7 @@ fun IrClass.addSimpleDelegatingConstructor(superConstructorSymbol: IrConstructor
)
)
constructor.parent = this
this.declarations.add(constructor)
}
}
@@ -126,7 +126,9 @@ fun IrFunction.createParameterDeclarations() {
innerStartOffset(this), innerEndOffset(this),
IrDeclarationOrigin.DEFINED,
this
)
).also {
it.parent = this@createParameterDeclarations
}
dispatchReceiverParameter = descriptor.dispatchReceiverParameter?.irValueParameter()
extensionReceiverParameter = descriptor.extensionReceiverParameter?.irValueParameter()
@@ -140,7 +142,9 @@ fun IrFunction.createParameterDeclarations() {
innerStartOffset(it), innerEndOffset(it),
IrDeclarationOrigin.DEFINED,
it
)
).also { typeParameter ->
typeParameter.parent = this
}
}
}
@@ -55,6 +55,7 @@ class IrBuiltIns(val builtIns: KotlinBuiltIns) {
private fun addStubToPackageFragment(descriptor: SimpleFunctionDescriptor): IrSimpleFunction {
val irSimpleFunction = stubBuilder.generateFunctionStub(descriptor)
irBuiltInsExternalPackageFragment.declarations.add(irSimpleFunction)
irSimpleFunction.parent = irBuiltInsExternalPackageFragment
return irSimpleFunction
}
@@ -71,20 +71,34 @@ class DeclarationStubGenerator(
}
fun generateFunctionStub(descriptor: FunctionDescriptor): IrSimpleFunction =
symbolTable.declareSimpleFunctionWithOverrides(UNDEFINED_OFFSET, UNDEFINED_OFFSET, origin, descriptor.original).also { irFunction ->
symbolTable.declareSimpleFunctionWithOverrides(
UNDEFINED_OFFSET, UNDEFINED_OFFSET,
if (descriptor.kind == CallableMemberDescriptor.Kind.FAKE_OVERRIDE) {
IrDeclarationOrigin.FAKE_OVERRIDE
} else {
origin
},
descriptor.original
).also { irFunction ->
generateTypeParameterStubs(descriptor.typeParameters, irFunction)
generateValueParametersStubs(descriptor.valueParameters, irFunction)
generateValueParametersStubs(irFunction)
}
private fun generateConstructorStub(descriptor: ClassConstructorDescriptor): IrConstructor =
symbolTable.declareConstructor(UNDEFINED_OFFSET, UNDEFINED_OFFSET, origin, descriptor.original).also { irConstructor ->
generateValueParametersStubs(descriptor.valueParameters, irConstructor)
generateValueParametersStubs(irConstructor)
}
private fun generateValueParametersStubs(valueParameters: Collection<ValueParameterDescriptor>, function: IrFunction) {
valueParameters.mapTo(function.valueParameters) { generateValueParameterStub(it) }
private fun generateValueParametersStubs(function: IrFunction) {
val descriptor = function.descriptor
function.dispatchReceiverParameter = descriptor.dispatchReceiverParameter?.generateReceiverParameterStub()
function.extensionReceiverParameter = descriptor.extensionReceiverParameter?.generateReceiverParameterStub()
descriptor.valueParameters.mapTo(function.valueParameters) { generateValueParameterStub(it) }
}
private fun ReceiverParameterDescriptor.generateReceiverParameterStub(): IrValueParameter =
IrValueParameterImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, origin, this)
private fun generateValueParameterStub(descriptor: ValueParameterDescriptor): IrValueParameter =
IrValueParameterImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, origin, descriptor).also { irValueParameter ->
if (descriptor.declaresDefaultValue()) {
@@ -108,6 +122,7 @@ class DeclarationStubGenerator(
}
generateTypeParameterStubs(descriptor.declaredTypeParameters, irClass)
irClass.thisReceiver = descriptor.thisAsReceiverParameter.generateReceiverParameterStub()
generateChildStubs(descriptor.constructors, irClass)
generateMemberStubs(descriptor.defaultType.memberScope, irClass)
generateMemberStubs(descriptor.staticScope, irClass)
@@ -52,6 +52,6 @@ class ExternalDependenciesGenerator(val symbolTable: SymbolTable, val irBuiltIns
topLevelDescriptors.mapTo(irExternalPackageFragment.declarations) {
stubGenerator.generateMemberStub(it)
}
}
}.patchDeclarationParents()
}