mirror of
https://github.com/github/codeql.git
synced 2026-05-25 00:27:09 +02:00
@@ -385,69 +385,64 @@ private fun KotlinFileExtractor.extractBinaryExpression(
|
||||
return extractBinaryExpression(expression, callable, parent, trapWriterWriteExpr)
|
||||
}
|
||||
|
||||
when {
|
||||
op in listOf(KtTokens.LT, KtTokens.GT, KtTokens.LTEQ, KtTokens.GTEQ) -> {
|
||||
// Extract lowered equivalent call, such as `a.compareTo(b) < 0` instead of `a < b` in the below:
|
||||
// ```
|
||||
// fun test(a: Data, b: Data) {
|
||||
// a < b
|
||||
// }
|
||||
//
|
||||
// class Data(val v: Int) : Comparable<Data> {
|
||||
// override fun compareTo(other: Data) = v.compareTo(other.v)
|
||||
// }
|
||||
// ```
|
||||
|
||||
val exprParent = parent.expr(expression, callable)
|
||||
|
||||
val trapWriterWriteExpr = when (op) {
|
||||
KtTokens.LT -> tw::writeExprs_ltexpr
|
||||
KtTokens.GT -> tw::writeExprs_gtexpr
|
||||
KtTokens.LTEQ -> tw::writeExprs_leexpr
|
||||
KtTokens.GTEQ -> tw::writeExprs_geexpr
|
||||
else -> TODO("error")
|
||||
}
|
||||
|
||||
val id = extractRawBinaryExpression(builtinTypes.boolean, exprParent, trapWriterWriteExpr)
|
||||
extractExprContext(id, tw.getLocation(expression), callable, exprParent.enclosingStmt)
|
||||
|
||||
extractRawMethodAccess(
|
||||
target,
|
||||
tw.getLocation(expression),
|
||||
target.returnType,
|
||||
callable,
|
||||
id,
|
||||
0,
|
||||
exprParent.enclosingStmt,
|
||||
if (target.isExtension) null else expression.left!!,
|
||||
if (target.isExtension) expression.left!! else null,
|
||||
listOf(expression.right!!)
|
||||
)
|
||||
|
||||
extractConstantInteger(
|
||||
"0",
|
||||
builtinTypes.int,
|
||||
0,
|
||||
tw.getLocation(expression),
|
||||
id,
|
||||
1,
|
||||
callable,
|
||||
exprParent.enclosingStmt,
|
||||
/*
|
||||
OLD: KE1
|
||||
overrideId = overrideId
|
||||
*/
|
||||
)
|
||||
|
||||
return id
|
||||
}
|
||||
|
||||
else -> {
|
||||
// todo: other operators, such as .., ..<, in, !in, =, +=, -=, *=, /=, %=, ==, !=,
|
||||
TODO("Extract as method call")
|
||||
}
|
||||
|
||||
val trapWriterWriteExprComparison = when (op) {
|
||||
KtTokens.LT -> tw::writeExprs_ltexpr
|
||||
KtTokens.GT -> tw::writeExprs_gtexpr
|
||||
KtTokens.LTEQ -> tw::writeExprs_leexpr
|
||||
KtTokens.GTEQ -> tw::writeExprs_geexpr
|
||||
else -> null
|
||||
}
|
||||
|
||||
if (trapWriterWriteExprComparison != null) {
|
||||
// Extract lowered equivalent call, such as `a.compareTo(b) < 0` instead of `a < b` in the below:
|
||||
// ```
|
||||
// fun test(a: Data, b: Data) {
|
||||
// a < b
|
||||
// }
|
||||
//
|
||||
// class Data(val v: Int) : Comparable<Data> {
|
||||
// override fun compareTo(other: Data) = v.compareTo(other.v)
|
||||
// }
|
||||
// ```
|
||||
|
||||
val exprParent = parent.expr(expression, callable)
|
||||
|
||||
val id = extractRawBinaryExpression(builtinTypes.boolean, exprParent, trapWriterWriteExprComparison)
|
||||
extractExprContext(id, tw.getLocation(expression), callable, exprParent.enclosingStmt)
|
||||
|
||||
extractRawMethodAccess(
|
||||
target,
|
||||
tw.getLocation(expression),
|
||||
target.returnType,
|
||||
callable,
|
||||
id,
|
||||
0,
|
||||
exprParent.enclosingStmt,
|
||||
if (target.isExtension) null else expression.left!!,
|
||||
if (target.isExtension) expression.left!! else null,
|
||||
listOf(expression.right!!)
|
||||
)
|
||||
|
||||
extractConstantInteger(
|
||||
"0",
|
||||
builtinTypes.int,
|
||||
0,
|
||||
tw.getLocation(expression),
|
||||
id,
|
||||
1,
|
||||
callable,
|
||||
exprParent.enclosingStmt,
|
||||
/*
|
||||
OLD: KE1
|
||||
overrideId = overrideId
|
||||
*/
|
||||
)
|
||||
|
||||
return id
|
||||
}
|
||||
|
||||
// todo: other operators, such as .., ..<, in, !in, =, +=, -=, *=, /=, %=, ==, !=,
|
||||
TODO("Extract as method call")
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user