Fix this and qualified this parameter extraction

This commit is contained in:
Tamas Vajk
2021-09-23 09:24:03 +02:00
committed by Ian Lynagh
parent 575e5134bb
commit 7d8b6bac06
9 changed files with 133 additions and 8 deletions

View File

@@ -360,9 +360,6 @@ class KotlinFileExtractor(val logger: FileLogger, val tw: FileTrapWriter, val fi
}
}
c.declarations.map { extractDeclaration(it, Optional.of(id)) }
if (c.thisReceiver != null) {
logger.warnElement(Severity.ErrorSevere, "'thisReceiver' is not extracted", c)
}
return id
}
@@ -415,11 +412,22 @@ class KotlinFileExtractor(val logger: FileLogger, val tw: FileTrapWriter, val fi
private fun getValueParameterLabel(vp: IrValueParameter) : String {
@Suppress("UNCHECKED_CAST")
val parentId: Label<out DbMethod> = useDeclarationParent(vp.parent) as Label<out DbMethod>
val idx = vp.index
var idx = vp.index
if (isQualifiedThis(vp)) {
idx = -2
}
val label = "@\"params;{$parentId};$idx\""
return label
}
private fun isQualifiedThis(vp: IrValueParameter) : Boolean {
val parent = vp.parent
return vp.index == -1 &&
parent is IrFunction &&
parent.dispatchReceiverParameter == vp &&
parent.extensionReceiverParameter != null
}
fun useValueParameter(vp: IrValueParameter): Label<out DbParam> {
val label = getValueParameterLabel(vp)
val id = tw.getLabelFor<DbParam>(label)
@@ -450,12 +458,15 @@ class KotlinFileExtractor(val logger: FileLogger, val tw: FileTrapWriter, val fi
extractValueParameter(vp, id, i)
}
if (f.dispatchReceiverParameter != null) {
extractValueParameter(f.dispatchReceiverParameter!!, id, -1)
var index = -1
val extReceiver = f.extensionReceiverParameter
if (extReceiver != null) {
extractValueParameter(extReceiver, id, index--)
}
if (f.extensionReceiverParameter != null) {
extractValueParameter(f.extensionReceiverParameter!!, id, -1)
val dispReceiver = f.dispatchReceiverParameter
if (dispReceiver != null) {
extractValueParameter(dispReceiver, id, index)
}
}
@@ -701,6 +712,10 @@ class KotlinFileExtractor(val logger: FileLogger, val tw: FileTrapWriter, val fi
val typeId = useType(e.type)
val locId = tw.getLocation(e)
tw.writeExprs_thisaccess(id, typeId, parent, idx)
if (isQualifiedThis(owner)) {
// todo: add type access as child of 'id' at index 0
logger.warnElement(Severity.ErrorSevere, "TODO: Qualified this access found.", e)
}
tw.writeHasLocation(id, locId)
} else {
val id = tw.getFreshIdLabel<DbVaraccess>()