IR: capture more type parameters for local functions.

Types of value parameters and captured variables, even unused, need to
be considered.
This commit is contained in:
Georgy Bronnikov
2020-01-15 16:44:30 +03:00
parent 437a26684d
commit 174b3db723
6 changed files with 45 additions and 6 deletions
@@ -88,13 +88,16 @@ class ClosureAnnotator(irFile: IrFile) {
}
fun declareVariable(valueDeclaration: IrValueDeclaration?) {
if (valueDeclaration != null)
if (valueDeclaration != null) {
declaredValues.add(valueDeclaration)
seeType(valueDeclaration.type)
}
}
fun seeVariable(value: IrValueSymbol) {
if (isExternal(value.owner))
if (isExternal(value.owner)) {
capturedValues.add(value)
}
}
fun isExternal(valueDeclaration: IrValueDeclaration): Boolean {
@@ -144,6 +147,8 @@ class ClosureAnnotator(irFile: IrFile) {
val closureBuilder = ClosureBuilder(declaration)
closureBuilders[declaration] = closureBuilder
collectPotentiallyCapturedTypeParameters(closureBuilder)
closureBuilder.declareVariable(declaration.thisReceiver)
if (declaration.isInner) {
closureBuilder.declareVariable((declaration.parent as IrClass).thisReceiver)
@@ -155,8 +160,6 @@ class ClosureAnnotator(irFile: IrFile) {
constructor.valueParameters.forEach { v -> closureBuilder.declareVariable(v) }
}
collectPotentiallyCapturedTypeParameters(closureBuilder)
closuresStack.push(closureBuilder)
declaration.acceptChildrenVoid(this)
closuresStack.pop()
@@ -166,6 +169,8 @@ class ClosureAnnotator(irFile: IrFile) {
val closureBuilder = ClosureBuilder(declaration)
closureBuilders[declaration] = closureBuilder
collectPotentiallyCapturedTypeParameters(closureBuilder)
declaration.valueParameters.forEach { closureBuilder.declareVariable(it) }
closureBuilder.declareVariable(declaration.dispatchReceiverParameter)
closureBuilder.declareVariable(declaration.extensionReceiverParameter)
@@ -182,8 +187,6 @@ class ClosureAnnotator(irFile: IrFile) {
}
}
collectPotentiallyCapturedTypeParameters(closureBuilder)
closuresStack.push(closureBuilder)
declaration.acceptChildrenVoid(this)
closuresStack.pop()