[Commonizer] Implement two phased re-approximation

^KT-48288
This commit is contained in:
sebastian.sellmair
2021-09-15 16:03:47 +02:00
committed by Space
parent b68f14960a
commit cf0f061db5
4 changed files with 18 additions and 13 deletions
@@ -65,14 +65,11 @@ internal fun commonizeTarget(
InlineTypeAliasCirNodeTransformer(parameters.storageManager, classifiers).invoke(mergedTree)
/*
ReApproximationCirNodeTransformer(
parameters.storageManager, classifiers,
SignatureBuildingContextProvider(classifiers, typeAliasInvariant = true, skipArguments = false)
).invoke(mergedTree)
*/
ReApproximationCirNodeTransformer(
parameters.storageManager, classifiers,
SignatureBuildingContextProvider(classifiers, typeAliasInvariant = true, skipArguments = true)
@@ -68,7 +68,11 @@ internal class ReApproximationCirNodeTransformer(
buildFunctionNode(storageManager, parent.targetDeclarations.size, classifiers, ParentNode(parent))
}
newNode.targetDeclarations.setIfAbsent(index, functionAtIndex)
// Move declaration
if (newNode.targetDeclarations[index] == null) {
function.targetDeclarations[index] = null
newNode.targetDeclarations[index] = functionAtIndex
}
}
private operator fun invoke(parent: CirNodeWithMembers<*, *>, property: CirPropertyNode, index: Int, context: CirMemberContext) {
@@ -81,7 +85,11 @@ internal class ReApproximationCirNodeTransformer(
buildPropertyNode(storageManager, parent.targetDeclarations.size, classifiers, ParentNode(parent))
}
newNode.targetDeclarations.setIfAbsent(index, propertyAtIndex)
// Move declaration
if (newNode.targetDeclarations[index] == null) {
property.targetDeclarations[index] = null
newNode.targetDeclarations[index] = propertyAtIndex
}
}
private operator fun invoke(
@@ -98,6 +106,10 @@ internal class ReApproximationCirNodeTransformer(
buildClassConstructorNode(storageManager, parent.targetDeclarations.size, classifiers, ParentNode(parent))
}
newNode.targetDeclarations.setIfAbsent(index, constructorAtIndex)
// Move declaration
if (newNode.targetDeclarations[index] == null) {
constructor.targetDeclarations[index] = null
newNode.targetDeclarations[index] = constructorAtIndex
}
}
}
@@ -87,7 +87,7 @@ internal fun CirNodeWithMembers<*, *>.buildFunction(
buildFunctionNode(context.storageManager, context.targets, context.classifiers, ParentNode(parent))
}
/* Multiple type substitutions could in result in the same commonization result */
functionNode.targetDeclarations.setIfAbsent(context.targetIndex, function)
functionNode.targetDeclarations.set(context.targetIndex, function)
}
internal fun CirNodeWithMembers<*, *>.buildProperty(
@@ -99,7 +99,7 @@ internal fun CirNodeWithMembers<*, *>.buildProperty(
buildPropertyNode(context.storageManager, context.targets, context.classifiers, ParentNode(parent))
}
/* Multiple type substitutions could in result in the same commonization result */
propertyNode.targetDeclarations.setIfAbsent(context.targetIndex, property)
propertyNode.targetDeclarations.set(context.targetIndex, property)
}
internal fun CirClassNode.buildConstructor(
@@ -111,7 +111,7 @@ internal fun CirClassNode.buildConstructor(
buildClassConstructorNode(context.storageManager, context.targets, context.classifiers, ParentNode(parent))
}
/* Multiple type substitutions could in result in the same commonization result */
constructorNode.targetDeclarations.setIfAbsent(context.targetIndex, constructor)
constructorNode.targetDeclarations.set(context.targetIndex, constructor)
}
internal fun CirPackageNode.buildTypeAlias(context: TargetBuildingContext, treeTypeAlias: CirTreeTypeAlias) {
@@ -31,8 +31,4 @@ class CommonizedGroup<T : Any>(
elements[index] = value
}
fun setIfAbsent(index: Int, value: T?) {
if (this[index] == null) set(index, value)
}
}