mirror of
https://github.com/github/codeql.git
synced 2025-12-21 11:16:30 +01:00
Extract type variable references
Also erase the types used to name methods; otherwise type-var labels and method labels are mutually recursive.
This commit is contained in:
committed by
Ian Lynagh
parent
87204f1634
commit
b5a8442e50
@@ -445,6 +445,9 @@ class KotlinFileExtractor(val logger: FileLogger, val tw: FileTrapWriter, val fi
|
||||
val cls: IrClass = classifier.owner as IrClass
|
||||
return useClass(cls)
|
||||
}
|
||||
s.classifier.owner is IrTypeParameter -> {
|
||||
return useTypeParameter(s.classifier.owner as IrTypeParameter)
|
||||
}
|
||||
else -> {
|
||||
logger.warn(Severity.ErrorSevere, "Unrecognised IrSimpleType: " + s.javaClass + ": " + s.render())
|
||||
return fakeLabel()
|
||||
@@ -452,6 +455,15 @@ class KotlinFileExtractor(val logger: FileLogger, val tw: FileTrapWriter, val fi
|
||||
}
|
||||
}
|
||||
|
||||
fun getTypeParameterLabel(param: IrTypeParameter): String {
|
||||
val parentLabel = useDeclarationParent(param.parent)
|
||||
return "@\"typevar;{$parentLabel};${param.name}\""
|
||||
}
|
||||
|
||||
fun useTypeParameter(param: IrTypeParameter): Label<out DbTypevariable> {
|
||||
return tw.getLabelFor(getTypeParameterLabel(param))
|
||||
}
|
||||
|
||||
fun getClassLabel(c: IrClass): String {
|
||||
val pkg = c.packageFqName?.asString() ?: ""
|
||||
val cls = c.name.asString()
|
||||
@@ -536,9 +548,18 @@ class KotlinFileExtractor(val logger: FileLogger, val tw: FileTrapWriter, val fi
|
||||
}
|
||||
}
|
||||
|
||||
fun erase (t: IrType): IrType {
|
||||
if(t is IrSimpleType) {
|
||||
if(t.classifier.owner is IrTypeParameter) {
|
||||
return erase((t.classifier.owner as IrTypeParameter).superTypes.get(0))
|
||||
}
|
||||
}
|
||||
return t
|
||||
}
|
||||
|
||||
fun useFunction(f: IrFunction): Label<out DbMethod> {
|
||||
val paramTypeIds = f.valueParameters.joinToString() { "{${useType(it.type).toString()}}" }
|
||||
val returnTypeId = useType(f.returnType)
|
||||
val paramTypeIds = f.valueParameters.joinToString() { "{${useType(erase(it.type)).toString()}}" }
|
||||
val returnTypeId = useType(erase(f.returnType))
|
||||
val parentId = useDeclarationParent(f.parent)
|
||||
val label = "@\"callable;{$parentId}.${f.name.asString()}($paramTypeIds){$returnTypeId}\""
|
||||
val id: Label<DbMethod> = tw.getLabelFor(label)
|
||||
|
||||
Reference in New Issue
Block a user