mirror of
https://github.com/github/codeql.git
synced 2025-12-22 19:56:32 +01:00
Kotlin: substitute fake Parcelize functions with their real equivalent ones
This commit is contained in:
@@ -165,7 +165,7 @@ class KotlinExtractorGlobalState {
|
||||
// doesn't have a map as that plugin doesn't generate them. If and when these are used more widely additional maps
|
||||
// should be added here.
|
||||
val syntheticToRealClassMap = HashMap<IrClass, IrClass?>()
|
||||
val syntheticToRealFunctionMap = HashMap<IrSimpleFunction, IrSimpleFunction?>()
|
||||
val syntheticToRealFunctionMap = HashMap<IrFunction, IrFunction?>()
|
||||
val syntheticToRealFieldMap = HashMap<IrField, IrField?>()
|
||||
}
|
||||
|
||||
|
||||
@@ -1532,7 +1532,7 @@ open class KotlinFileExtractor(
|
||||
|
||||
fun extractCall(c: IrCall, callable: Label<out DbCallable>, stmtExprParent: StmtExprParent) {
|
||||
with("call", c) {
|
||||
val target = tryReplaceAndroidSyntheticFunction(c.symbol.owner)
|
||||
val target = tryReplaceSyntheticFunction(c.symbol.owner)
|
||||
|
||||
// The vast majority of types of call want an expr context, so make one available lazily:
|
||||
val exprParent by lazy {
|
||||
|
||||
@@ -378,17 +378,17 @@ open class KotlinUsesExtractor(
|
||||
} ?: c
|
||||
}
|
||||
|
||||
fun tryReplaceAndroidSyntheticFunction(f: IrSimpleFunction): IrSimpleFunction {
|
||||
private fun tryReplaceFunctionInSyntheticClass(f: IrFunction, getClassReplacement: (IrClass) -> IrClass): IrFunction {
|
||||
val parentClass = f.parent as? IrClass ?: return f
|
||||
val replacementClass = tryReplaceAndroidSyntheticClass(parentClass)
|
||||
val replacementClass = getClassReplacement(parentClass)
|
||||
if (replacementClass === parentClass)
|
||||
return f
|
||||
return globalExtensionState.syntheticToRealFunctionMap.getOrPut(f) {
|
||||
val result = replacementClass.declarations.find { replacementDecl ->
|
||||
replacementDecl is IrSimpleFunction && replacementDecl.name == f.name && replacementDecl.valueParameters.zip(f.valueParameters).all {
|
||||
it.first.type == it.second.type
|
||||
replacementDecl is IrSimpleFunction && replacementDecl.name == f.name && replacementDecl.valueParameters.size == f.valueParameters.size && replacementDecl.valueParameters.zip(f.valueParameters).all {
|
||||
erase(it.first.type) == erase(it.second.type)
|
||||
}
|
||||
} as IrSimpleFunction?
|
||||
} as IrFunction?
|
||||
if (result == null) {
|
||||
logger.warn("Failed to replace synthetic class function ${f.name}")
|
||||
} else {
|
||||
@@ -398,6 +398,11 @@ open class KotlinUsesExtractor(
|
||||
} ?: f
|
||||
}
|
||||
|
||||
fun tryReplaceSyntheticFunction(f: IrFunction): IrFunction {
|
||||
val androidReplacement = tryReplaceFunctionInSyntheticClass(f) { tryReplaceAndroidSyntheticClass(it) }
|
||||
return tryReplaceFunctionInSyntheticClass(androidReplacement) { tryReplaceParcelizeRawType(it)?.first ?: it }
|
||||
}
|
||||
|
||||
fun tryReplaceAndroidSyntheticField(f: IrField): IrField {
|
||||
val parentClass = f.parent as? IrClass ?: return f
|
||||
val replacementClass = tryReplaceAndroidSyntheticClass(parentClass)
|
||||
|
||||
Reference in New Issue
Block a user