mirror of
https://github.com/github/codeql.git
synced 2026-04-30 03:05:15 +02:00
Complete implementation of equality tests
- Create a new operator representing an infix value [in]equality test, equivalent to Objects.equals(lhs, rhs) - Continue to use simple equality where it is clearly possible at the callsite - Note that ieee754equals is the same as Java's == and != operators
This commit is contained in:
committed by
Ian Lynagh
parent
b339cf7f2b
commit
a120fab9f7
@@ -1102,6 +1102,19 @@ open class KotlinFileExtractor(
|
||||
return result
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true if EQEQ call `c` can be implemented by a Java-style `==` or `!=` test. This is true if both operands
|
||||
* are primitives, or either is a null constant.
|
||||
*/
|
||||
fun isShallowEqualityTest(c: IrCall): Boolean {
|
||||
val arg0 = c.getValueArgument(0)!!
|
||||
val arg1 = c.getValueArgument(1)!!
|
||||
|
||||
return (arg0.type.isPrimitiveType(false) && arg1.type.isPrimitiveType(false))
|
||||
|| arg0.isNullConst()
|
||||
|| arg1.isNullConst()
|
||||
}
|
||||
|
||||
fun extractCall(c: IrCall, callable: Label<out DbCallable>, parent: Label<out DbExprparent>, idx: Int, enclosingStmt: Label<out DbStmt>) {
|
||||
with("call", c) {
|
||||
fun isFunction(pkgName: String, className: String, fName: String, hasQuestionMark: Boolean? = false): Boolean {
|
||||
@@ -1264,11 +1277,16 @@ open class KotlinFileExtractor(
|
||||
binopDisp(id)
|
||||
}
|
||||
// != gets desugared into not and ==. Here we resugar it.
|
||||
// TODO: This is wrong. Kotlin `a == b` is `a?.equals(b) ?: (b === null)`
|
||||
c.origin == IrStatementOrigin.EXCLEQ && isFunction("kotlin", "Boolean", "not") && c.valueArgumentsCount == 0 && dr != null && dr is IrCall && isBuiltinCallInternal(dr, "EQEQ") -> {
|
||||
val id = tw.getFreshIdLabel<DbNeexpr>()
|
||||
var id: Label<out DbExpr>
|
||||
val type = useType(c.type)
|
||||
tw.writeExprs_neexpr(id, type.javaResult.id, parent, idx)
|
||||
if (isShallowEqualityTest(dr)) {
|
||||
id = tw.getFreshIdLabel<DbNeexpr>()
|
||||
tw.writeExprs_neexpr(id, type.javaResult.id, parent, idx)
|
||||
} else {
|
||||
id = tw.getFreshIdLabel<DbValueneexpr>()
|
||||
tw.writeExprs_valueneexpr(id, type.javaResult.id, parent, idx)
|
||||
}
|
||||
tw.writeExprsKotlinType(id, type.kotlinResult.id)
|
||||
binOp(id, dr, callable, enclosingStmt)
|
||||
}
|
||||
@@ -1282,7 +1300,6 @@ open class KotlinFileExtractor(
|
||||
c.origin == IrStatementOrigin.EXCLEQ && isFunction("kotlin", "Boolean", "not") && c.valueArgumentsCount == 0 && dr != null && dr is IrCall && isBuiltinCallInternal(dr, "ieee754equals") -> {
|
||||
val id = tw.getFreshIdLabel<DbNeexpr>()
|
||||
val type = useType(c.type)
|
||||
// TODO: Is this consistent with Java?
|
||||
tw.writeExprs_neexpr(id, type.javaResult.id, parent, idx)
|
||||
tw.writeExprsKotlinType(id, type.kotlinResult.id)
|
||||
binOp(id, dr, callable, enclosingStmt)
|
||||
@@ -1334,10 +1351,15 @@ open class KotlinFileExtractor(
|
||||
if(c.origin != IrStatementOrigin.EQEQ) {
|
||||
logger.errorElement("Unexpected origin for EQEQ: ${c.origin}", c)
|
||||
}
|
||||
// TODO: This is wrong. Kotlin `a == b` is `a?.equals(b) ?: (b === null)`
|
||||
val id = tw.getFreshIdLabel<DbEqexpr>()
|
||||
var id: Label<out DbExpr>
|
||||
val type = useType(c.type)
|
||||
tw.writeExprs_eqexpr(id, type.javaResult.id, parent, idx)
|
||||
if (isShallowEqualityTest(c)) {
|
||||
id = tw.getFreshIdLabel<DbEqexpr>()
|
||||
tw.writeExprs_eqexpr(id, type.javaResult.id, parent, idx)
|
||||
} else {
|
||||
id = tw.getFreshIdLabel<DbValueeqexpr>()
|
||||
tw.writeExprs_valueeqexpr(id, type.javaResult.id, parent, idx)
|
||||
}
|
||||
tw.writeExprsKotlinType(id, type.kotlinResult.id)
|
||||
binOp(id, c, callable, enclosingStmt)
|
||||
}
|
||||
@@ -1355,7 +1377,6 @@ open class KotlinFileExtractor(
|
||||
if(c.origin != IrStatementOrigin.EQEQ) {
|
||||
logger.errorElement("Unexpected origin for ieee754equals: ${c.origin}", c)
|
||||
}
|
||||
// TODO: Is this consistent with Java?
|
||||
val id = tw.getFreshIdLabel<DbEqexpr>()
|
||||
val type = useType(c.type)
|
||||
tw.writeExprs_eqexpr(id, type.javaResult.id, parent, idx)
|
||||
|
||||
@@ -748,6 +748,8 @@ case @expr.kind of
|
||||
| 84 = @varargexpr
|
||||
| 85 = @notnullexpr
|
||||
| 86 = @unsafecoerceexpr
|
||||
| 87 = @valueeqexpr
|
||||
| 88 = @valueneexpr
|
||||
;
|
||||
|
||||
/** Holds if this `when` expression was written as an `if` expression. */
|
||||
@@ -815,7 +817,9 @@ when_branch_else(unique int id: @whenbranch ref);
|
||||
| @leexpr
|
||||
| @geexpr
|
||||
| @eqexpr
|
||||
| @neexpr;
|
||||
| @neexpr
|
||||
| @valueeqexpr
|
||||
| @valueneexpr;
|
||||
|
||||
@unaryexpr = @postincexpr
|
||||
| @postdecexpr
|
||||
|
||||
@@ -959,6 +959,13 @@ class EQExpr extends BinaryExpr, @eqexpr {
|
||||
override string getAPrimaryQlClass() { result = "EQExpr" }
|
||||
}
|
||||
|
||||
/** A binary expression using the Kotlin `==` operator, semantically equivalent to `Objects.equals`. */
|
||||
class ValueEQExpr extends BinaryExpr, @valueeqexpr {
|
||||
override string getOp() { result = " == " }
|
||||
|
||||
override string getAPrimaryQlClass() { result = "ValueEQExpr" }
|
||||
}
|
||||
|
||||
/** A binary expression using the `!=` operator. */
|
||||
class NEExpr extends BinaryExpr, @neexpr {
|
||||
override string getOp() { result = " != " }
|
||||
@@ -966,6 +973,13 @@ class NEExpr extends BinaryExpr, @neexpr {
|
||||
override string getAPrimaryQlClass() { result = "NEExpr" }
|
||||
}
|
||||
|
||||
/** A binary expression using the Kotlin `!=` operator, semantically equivalent to `Objects.equals`. */
|
||||
class ValueNEExpr extends BinaryExpr, @valueneexpr {
|
||||
override string getOp() { result = " != " }
|
||||
|
||||
override string getAPrimaryQlClass() { result = "ValueNEExpr" }
|
||||
}
|
||||
|
||||
/**
|
||||
* A bitwise expression.
|
||||
*
|
||||
|
||||
@@ -737,6 +737,113 @@ exprs.kt:
|
||||
# 220| 1: [LocalVariableDeclExpr] x
|
||||
# 220| 0: [TypeLiteral] SomeClass1.class
|
||||
# 220| 0: [TypeAccess] SomeClass1
|
||||
# 223| 9: [Method] equalityTests
|
||||
#-----| 4: (Parameters)
|
||||
# 223| 0: [Parameter] notNullPrimitive
|
||||
# 223| 1: [Parameter] nullablePrimitive
|
||||
# 223| 2: [Parameter] notNullReftype
|
||||
# 223| 3: [Parameter] nullableReftype
|
||||
# 223| 5: [BlockStmt] { ... }
|
||||
# 224| 0: [LocalVariableDeclStmt] var ...;
|
||||
# 224| 1: [LocalVariableDeclExpr] b1
|
||||
# 224| 0: [EQExpr] ... == ...
|
||||
# 224| 0: [VarAccess] notNullPrimitive
|
||||
# 224| 1: [VarAccess] notNullPrimitive
|
||||
# 225| 1: [LocalVariableDeclStmt] var ...;
|
||||
# 225| 1: [LocalVariableDeclExpr] b2
|
||||
# 225| 0: [ValueEQExpr] ... == ...
|
||||
# 225| 0: [VarAccess] notNullPrimitive
|
||||
# 225| 1: [VarAccess] nullablePrimitive
|
||||
# 226| 2: [LocalVariableDeclStmt] var ...;
|
||||
# 226| 1: [LocalVariableDeclExpr] b3
|
||||
# 226| 0: [ValueEQExpr] ... == ...
|
||||
# 226| 0: [VarAccess] nullablePrimitive
|
||||
# 226| 1: [VarAccess] nullablePrimitive
|
||||
# 227| 3: [LocalVariableDeclStmt] var ...;
|
||||
# 227| 1: [LocalVariableDeclExpr] b4
|
||||
# 227| 0: [ValueEQExpr] ... == ...
|
||||
# 227| 0: [VarAccess] notNullReftype
|
||||
# 227| 1: [VarAccess] notNullReftype
|
||||
# 228| 4: [LocalVariableDeclStmt] var ...;
|
||||
# 228| 1: [LocalVariableDeclExpr] b5
|
||||
# 228| 0: [ValueEQExpr] ... == ...
|
||||
# 228| 0: [VarAccess] notNullReftype
|
||||
# 228| 1: [VarAccess] nullableReftype
|
||||
# 229| 5: [LocalVariableDeclStmt] var ...;
|
||||
# 229| 1: [LocalVariableDeclExpr] b6
|
||||
# 229| 0: [ValueEQExpr] ... == ...
|
||||
# 229| 0: [VarAccess] nullableReftype
|
||||
# 229| 1: [VarAccess] nullableReftype
|
||||
# 230| 6: [LocalVariableDeclStmt] var ...;
|
||||
# 230| 1: [LocalVariableDeclExpr] b7
|
||||
# 230| 0: [NEExpr] ... != ...
|
||||
# 230| 0: [VarAccess] notNullPrimitive
|
||||
# 230| 1: [VarAccess] notNullPrimitive
|
||||
# 231| 7: [LocalVariableDeclStmt] var ...;
|
||||
# 231| 1: [LocalVariableDeclExpr] b8
|
||||
# 231| 0: [ValueNEExpr] ... != ...
|
||||
# 231| 0: [VarAccess] notNullPrimitive
|
||||
# 231| 1: [VarAccess] nullablePrimitive
|
||||
# 232| 8: [LocalVariableDeclStmt] var ...;
|
||||
# 232| 1: [LocalVariableDeclExpr] b9
|
||||
# 232| 0: [ValueNEExpr] ... != ...
|
||||
# 232| 0: [VarAccess] nullablePrimitive
|
||||
# 232| 1: [VarAccess] nullablePrimitive
|
||||
# 233| 9: [LocalVariableDeclStmt] var ...;
|
||||
# 233| 1: [LocalVariableDeclExpr] b10
|
||||
# 233| 0: [ValueNEExpr] ... != ...
|
||||
# 233| 0: [VarAccess] notNullReftype
|
||||
# 233| 1: [VarAccess] notNullReftype
|
||||
# 234| 10: [LocalVariableDeclStmt] var ...;
|
||||
# 234| 1: [LocalVariableDeclExpr] b11
|
||||
# 234| 0: [ValueNEExpr] ... != ...
|
||||
# 234| 0: [VarAccess] notNullReftype
|
||||
# 234| 1: [VarAccess] nullableReftype
|
||||
# 235| 11: [LocalVariableDeclStmt] var ...;
|
||||
# 235| 1: [LocalVariableDeclExpr] b12
|
||||
# 235| 0: [ValueNEExpr] ... != ...
|
||||
# 235| 0: [VarAccess] nullableReftype
|
||||
# 235| 1: [VarAccess] nullableReftype
|
||||
# 236| 12: [LocalVariableDeclStmt] var ...;
|
||||
# 236| 1: [LocalVariableDeclExpr] b13
|
||||
# 236| 0: [EQExpr] ... == ...
|
||||
# 236| 0: [VarAccess] notNullPrimitive
|
||||
# 236| 1: [NullLiteral] null
|
||||
# 237| 13: [LocalVariableDeclStmt] var ...;
|
||||
# 237| 1: [LocalVariableDeclExpr] b14
|
||||
# 237| 0: [EQExpr] ... == ...
|
||||
# 237| 0: [VarAccess] nullablePrimitive
|
||||
# 237| 1: [NullLiteral] null
|
||||
# 238| 14: [LocalVariableDeclStmt] var ...;
|
||||
# 238| 1: [LocalVariableDeclExpr] b15
|
||||
# 238| 0: [EQExpr] ... == ...
|
||||
# 238| 0: [VarAccess] notNullReftype
|
||||
# 238| 1: [NullLiteral] null
|
||||
# 239| 15: [LocalVariableDeclStmt] var ...;
|
||||
# 239| 1: [LocalVariableDeclExpr] b16
|
||||
# 239| 0: [EQExpr] ... == ...
|
||||
# 239| 0: [VarAccess] nullableReftype
|
||||
# 239| 1: [NullLiteral] null
|
||||
# 240| 16: [LocalVariableDeclStmt] var ...;
|
||||
# 240| 1: [LocalVariableDeclExpr] b17
|
||||
# 240| 0: [NEExpr] ... != ...
|
||||
# 240| 0: [VarAccess] notNullPrimitive
|
||||
# 240| 1: [NullLiteral] null
|
||||
# 241| 17: [LocalVariableDeclStmt] var ...;
|
||||
# 241| 1: [LocalVariableDeclExpr] b18
|
||||
# 241| 0: [NEExpr] ... != ...
|
||||
# 241| 0: [VarAccess] nullablePrimitive
|
||||
# 241| 1: [NullLiteral] null
|
||||
# 242| 18: [LocalVariableDeclStmt] var ...;
|
||||
# 242| 1: [LocalVariableDeclExpr] b19
|
||||
# 242| 0: [NEExpr] ... != ...
|
||||
# 242| 0: [VarAccess] notNullReftype
|
||||
# 242| 1: [NullLiteral] null
|
||||
# 243| 19: [LocalVariableDeclStmt] var ...;
|
||||
# 243| 1: [LocalVariableDeclExpr] b20
|
||||
# 243| 0: [NEExpr] ... != ...
|
||||
# 243| 0: [VarAccess] nullableReftype
|
||||
# 243| 1: [NullLiteral] null
|
||||
# 142| 2: [Class] C
|
||||
# 142| 1: [Constructor] C
|
||||
#-----| 4: (Parameters)
|
||||
|
||||
@@ -79,5 +79,25 @@
|
||||
| exprs.kt:190:31:190:37 | ... + ... | exprs.kt:190:31:190:32 | getA1(...) | exprs.kt:190:36:190:37 | a2 |
|
||||
| exprs.kt:204:19:204:23 | ... + ... | exprs.kt:204:19:204:19 | s | exprs.kt:204:23:204:23 | 5 |
|
||||
| exprs.kt:206:19:206:25 | ... + ... | exprs.kt:206:20:206:21 | ...!! | exprs.kt:206:25:206:25 | 5 |
|
||||
| exprs.kt:224:12:224:47 | ... == ... | exprs.kt:224:12:224:27 | notNullPrimitive | exprs.kt:224:32:224:47 | notNullPrimitive |
|
||||
| exprs.kt:225:12:225:48 | ... == ... | exprs.kt:225:12:225:27 | notNullPrimitive | exprs.kt:225:32:225:48 | nullablePrimitive |
|
||||
| exprs.kt:226:12:226:49 | ... == ... | exprs.kt:226:12:226:28 | nullablePrimitive | exprs.kt:226:33:226:49 | nullablePrimitive |
|
||||
| exprs.kt:227:12:227:43 | ... == ... | exprs.kt:227:12:227:25 | notNullReftype | exprs.kt:227:30:227:43 | notNullReftype |
|
||||
| exprs.kt:228:12:228:44 | ... == ... | exprs.kt:228:12:228:25 | notNullReftype | exprs.kt:228:30:228:44 | nullableReftype |
|
||||
| exprs.kt:229:12:229:45 | ... == ... | exprs.kt:229:12:229:26 | nullableReftype | exprs.kt:229:31:229:45 | nullableReftype |
|
||||
| exprs.kt:230:12:230:47 | ... != ... | exprs.kt:230:12:230:27 | notNullPrimitive | exprs.kt:230:32:230:47 | notNullPrimitive |
|
||||
| exprs.kt:231:12:231:48 | ... != ... | exprs.kt:231:12:231:27 | notNullPrimitive | exprs.kt:231:32:231:48 | nullablePrimitive |
|
||||
| exprs.kt:232:12:232:49 | ... != ... | exprs.kt:232:12:232:28 | nullablePrimitive | exprs.kt:232:33:232:49 | nullablePrimitive |
|
||||
| exprs.kt:233:13:233:44 | ... != ... | exprs.kt:233:13:233:26 | notNullReftype | exprs.kt:233:31:233:44 | notNullReftype |
|
||||
| exprs.kt:234:13:234:45 | ... != ... | exprs.kt:234:13:234:26 | notNullReftype | exprs.kt:234:31:234:45 | nullableReftype |
|
||||
| exprs.kt:235:13:235:46 | ... != ... | exprs.kt:235:13:235:27 | nullableReftype | exprs.kt:235:32:235:46 | nullableReftype |
|
||||
| exprs.kt:236:13:236:36 | ... == ... | exprs.kt:236:13:236:28 | notNullPrimitive | exprs.kt:236:33:236:36 | null |
|
||||
| exprs.kt:237:13:237:37 | ... == ... | exprs.kt:237:13:237:29 | nullablePrimitive | exprs.kt:237:34:237:37 | null |
|
||||
| exprs.kt:238:13:238:34 | ... == ... | exprs.kt:238:13:238:26 | notNullReftype | exprs.kt:238:31:238:34 | null |
|
||||
| exprs.kt:239:13:239:35 | ... == ... | exprs.kt:239:13:239:27 | nullableReftype | exprs.kt:239:32:239:35 | null |
|
||||
| exprs.kt:240:13:240:36 | ... != ... | exprs.kt:240:13:240:28 | notNullPrimitive | exprs.kt:240:33:240:36 | null |
|
||||
| exprs.kt:241:13:241:37 | ... != ... | exprs.kt:241:13:241:29 | nullablePrimitive | exprs.kt:241:34:241:37 | null |
|
||||
| exprs.kt:242:13:242:34 | ... != ... | exprs.kt:242:13:242:26 | notNullReftype | exprs.kt:242:31:242:34 | null |
|
||||
| exprs.kt:243:13:243:35 | ... != ... | exprs.kt:243:13:243:27 | nullableReftype | exprs.kt:243:32:243:35 | null |
|
||||
| funcExprs.kt:26:35:26:42 | ... + ... | funcExprs.kt:26:35:26:38 | this | funcExprs.kt:26:42:26:42 | a |
|
||||
| localFunctionCalls.kt:5:25:5:29 | ... + ... | localFunctionCalls.kt:5:25:5:25 | i | localFunctionCalls.kt:5:29:5:29 | x |
|
||||
|
||||
@@ -619,6 +619,86 @@
|
||||
| exprs.kt:220:5:220:29 | x | exprs.kt:219:1:221:1 | fnClassRef | LocalVariableDeclExpr |
|
||||
| exprs.kt:220:13:220:29 | SomeClass1 | exprs.kt:219:1:221:1 | fnClassRef | TypeAccess |
|
||||
| exprs.kt:220:13:220:29 | SomeClass1.class | exprs.kt:219:1:221:1 | fnClassRef | TypeLiteral |
|
||||
| exprs.kt:224:3:224:47 | b1 | exprs.kt:223:1:244:1 | equalityTests | LocalVariableDeclExpr |
|
||||
| exprs.kt:224:12:224:27 | notNullPrimitive | exprs.kt:223:1:244:1 | equalityTests | VarAccess |
|
||||
| exprs.kt:224:12:224:47 | ... == ... | exprs.kt:223:1:244:1 | equalityTests | EQExpr |
|
||||
| exprs.kt:224:32:224:47 | notNullPrimitive | exprs.kt:223:1:244:1 | equalityTests | VarAccess |
|
||||
| exprs.kt:225:3:225:48 | b2 | exprs.kt:223:1:244:1 | equalityTests | LocalVariableDeclExpr |
|
||||
| exprs.kt:225:12:225:27 | notNullPrimitive | exprs.kt:223:1:244:1 | equalityTests | VarAccess |
|
||||
| exprs.kt:225:12:225:48 | ... == ... | exprs.kt:223:1:244:1 | equalityTests | ValueEQExpr |
|
||||
| exprs.kt:225:32:225:48 | nullablePrimitive | exprs.kt:223:1:244:1 | equalityTests | VarAccess |
|
||||
| exprs.kt:226:3:226:49 | b3 | exprs.kt:223:1:244:1 | equalityTests | LocalVariableDeclExpr |
|
||||
| exprs.kt:226:12:226:28 | nullablePrimitive | exprs.kt:223:1:244:1 | equalityTests | VarAccess |
|
||||
| exprs.kt:226:12:226:49 | ... == ... | exprs.kt:223:1:244:1 | equalityTests | ValueEQExpr |
|
||||
| exprs.kt:226:33:226:49 | nullablePrimitive | exprs.kt:223:1:244:1 | equalityTests | VarAccess |
|
||||
| exprs.kt:227:3:227:43 | b4 | exprs.kt:223:1:244:1 | equalityTests | LocalVariableDeclExpr |
|
||||
| exprs.kt:227:12:227:25 | notNullReftype | exprs.kt:223:1:244:1 | equalityTests | VarAccess |
|
||||
| exprs.kt:227:12:227:43 | ... == ... | exprs.kt:223:1:244:1 | equalityTests | ValueEQExpr |
|
||||
| exprs.kt:227:30:227:43 | notNullReftype | exprs.kt:223:1:244:1 | equalityTests | VarAccess |
|
||||
| exprs.kt:228:3:228:44 | b5 | exprs.kt:223:1:244:1 | equalityTests | LocalVariableDeclExpr |
|
||||
| exprs.kt:228:12:228:25 | notNullReftype | exprs.kt:223:1:244:1 | equalityTests | VarAccess |
|
||||
| exprs.kt:228:12:228:44 | ... == ... | exprs.kt:223:1:244:1 | equalityTests | ValueEQExpr |
|
||||
| exprs.kt:228:30:228:44 | nullableReftype | exprs.kt:223:1:244:1 | equalityTests | VarAccess |
|
||||
| exprs.kt:229:3:229:45 | b6 | exprs.kt:223:1:244:1 | equalityTests | LocalVariableDeclExpr |
|
||||
| exprs.kt:229:12:229:26 | nullableReftype | exprs.kt:223:1:244:1 | equalityTests | VarAccess |
|
||||
| exprs.kt:229:12:229:45 | ... == ... | exprs.kt:223:1:244:1 | equalityTests | ValueEQExpr |
|
||||
| exprs.kt:229:31:229:45 | nullableReftype | exprs.kt:223:1:244:1 | equalityTests | VarAccess |
|
||||
| exprs.kt:230:3:230:47 | b7 | exprs.kt:223:1:244:1 | equalityTests | LocalVariableDeclExpr |
|
||||
| exprs.kt:230:12:230:27 | notNullPrimitive | exprs.kt:223:1:244:1 | equalityTests | VarAccess |
|
||||
| exprs.kt:230:12:230:47 | ... != ... | exprs.kt:223:1:244:1 | equalityTests | NEExpr |
|
||||
| exprs.kt:230:32:230:47 | notNullPrimitive | exprs.kt:223:1:244:1 | equalityTests | VarAccess |
|
||||
| exprs.kt:231:3:231:48 | b8 | exprs.kt:223:1:244:1 | equalityTests | LocalVariableDeclExpr |
|
||||
| exprs.kt:231:12:231:27 | notNullPrimitive | exprs.kt:223:1:244:1 | equalityTests | VarAccess |
|
||||
| exprs.kt:231:12:231:48 | ... != ... | exprs.kt:223:1:244:1 | equalityTests | ValueNEExpr |
|
||||
| exprs.kt:231:32:231:48 | nullablePrimitive | exprs.kt:223:1:244:1 | equalityTests | VarAccess |
|
||||
| exprs.kt:232:3:232:49 | b9 | exprs.kt:223:1:244:1 | equalityTests | LocalVariableDeclExpr |
|
||||
| exprs.kt:232:12:232:28 | nullablePrimitive | exprs.kt:223:1:244:1 | equalityTests | VarAccess |
|
||||
| exprs.kt:232:12:232:49 | ... != ... | exprs.kt:223:1:244:1 | equalityTests | ValueNEExpr |
|
||||
| exprs.kt:232:33:232:49 | nullablePrimitive | exprs.kt:223:1:244:1 | equalityTests | VarAccess |
|
||||
| exprs.kt:233:3:233:44 | b10 | exprs.kt:223:1:244:1 | equalityTests | LocalVariableDeclExpr |
|
||||
| exprs.kt:233:13:233:26 | notNullReftype | exprs.kt:223:1:244:1 | equalityTests | VarAccess |
|
||||
| exprs.kt:233:13:233:44 | ... != ... | exprs.kt:223:1:244:1 | equalityTests | ValueNEExpr |
|
||||
| exprs.kt:233:31:233:44 | notNullReftype | exprs.kt:223:1:244:1 | equalityTests | VarAccess |
|
||||
| exprs.kt:234:3:234:45 | b11 | exprs.kt:223:1:244:1 | equalityTests | LocalVariableDeclExpr |
|
||||
| exprs.kt:234:13:234:26 | notNullReftype | exprs.kt:223:1:244:1 | equalityTests | VarAccess |
|
||||
| exprs.kt:234:13:234:45 | ... != ... | exprs.kt:223:1:244:1 | equalityTests | ValueNEExpr |
|
||||
| exprs.kt:234:31:234:45 | nullableReftype | exprs.kt:223:1:244:1 | equalityTests | VarAccess |
|
||||
| exprs.kt:235:3:235:46 | b12 | exprs.kt:223:1:244:1 | equalityTests | LocalVariableDeclExpr |
|
||||
| exprs.kt:235:13:235:27 | nullableReftype | exprs.kt:223:1:244:1 | equalityTests | VarAccess |
|
||||
| exprs.kt:235:13:235:46 | ... != ... | exprs.kt:223:1:244:1 | equalityTests | ValueNEExpr |
|
||||
| exprs.kt:235:32:235:46 | nullableReftype | exprs.kt:223:1:244:1 | equalityTests | VarAccess |
|
||||
| exprs.kt:236:3:236:36 | b13 | exprs.kt:223:1:244:1 | equalityTests | LocalVariableDeclExpr |
|
||||
| exprs.kt:236:13:236:28 | notNullPrimitive | exprs.kt:223:1:244:1 | equalityTests | VarAccess |
|
||||
| exprs.kt:236:13:236:36 | ... == ... | exprs.kt:223:1:244:1 | equalityTests | EQExpr |
|
||||
| exprs.kt:236:33:236:36 | null | exprs.kt:223:1:244:1 | equalityTests | NullLiteral |
|
||||
| exprs.kt:237:3:237:37 | b14 | exprs.kt:223:1:244:1 | equalityTests | LocalVariableDeclExpr |
|
||||
| exprs.kt:237:13:237:29 | nullablePrimitive | exprs.kt:223:1:244:1 | equalityTests | VarAccess |
|
||||
| exprs.kt:237:13:237:37 | ... == ... | exprs.kt:223:1:244:1 | equalityTests | EQExpr |
|
||||
| exprs.kt:237:34:237:37 | null | exprs.kt:223:1:244:1 | equalityTests | NullLiteral |
|
||||
| exprs.kt:238:3:238:34 | b15 | exprs.kt:223:1:244:1 | equalityTests | LocalVariableDeclExpr |
|
||||
| exprs.kt:238:13:238:26 | notNullReftype | exprs.kt:223:1:244:1 | equalityTests | VarAccess |
|
||||
| exprs.kt:238:13:238:34 | ... == ... | exprs.kt:223:1:244:1 | equalityTests | EQExpr |
|
||||
| exprs.kt:238:31:238:34 | null | exprs.kt:223:1:244:1 | equalityTests | NullLiteral |
|
||||
| exprs.kt:239:3:239:35 | b16 | exprs.kt:223:1:244:1 | equalityTests | LocalVariableDeclExpr |
|
||||
| exprs.kt:239:13:239:27 | nullableReftype | exprs.kt:223:1:244:1 | equalityTests | VarAccess |
|
||||
| exprs.kt:239:13:239:35 | ... == ... | exprs.kt:223:1:244:1 | equalityTests | EQExpr |
|
||||
| exprs.kt:239:32:239:35 | null | exprs.kt:223:1:244:1 | equalityTests | NullLiteral |
|
||||
| exprs.kt:240:3:240:36 | b17 | exprs.kt:223:1:244:1 | equalityTests | LocalVariableDeclExpr |
|
||||
| exprs.kt:240:13:240:28 | notNullPrimitive | exprs.kt:223:1:244:1 | equalityTests | VarAccess |
|
||||
| exprs.kt:240:13:240:36 | ... != ... | exprs.kt:223:1:244:1 | equalityTests | NEExpr |
|
||||
| exprs.kt:240:33:240:36 | null | exprs.kt:223:1:244:1 | equalityTests | NullLiteral |
|
||||
| exprs.kt:241:3:241:37 | b18 | exprs.kt:223:1:244:1 | equalityTests | LocalVariableDeclExpr |
|
||||
| exprs.kt:241:13:241:29 | nullablePrimitive | exprs.kt:223:1:244:1 | equalityTests | VarAccess |
|
||||
| exprs.kt:241:13:241:37 | ... != ... | exprs.kt:223:1:244:1 | equalityTests | NEExpr |
|
||||
| exprs.kt:241:34:241:37 | null | exprs.kt:223:1:244:1 | equalityTests | NullLiteral |
|
||||
| exprs.kt:242:3:242:34 | b19 | exprs.kt:223:1:244:1 | equalityTests | LocalVariableDeclExpr |
|
||||
| exprs.kt:242:13:242:26 | notNullReftype | exprs.kt:223:1:244:1 | equalityTests | VarAccess |
|
||||
| exprs.kt:242:13:242:34 | ... != ... | exprs.kt:223:1:244:1 | equalityTests | NEExpr |
|
||||
| exprs.kt:242:31:242:34 | null | exprs.kt:223:1:244:1 | equalityTests | NullLiteral |
|
||||
| exprs.kt:243:3:243:35 | b20 | exprs.kt:223:1:244:1 | equalityTests | LocalVariableDeclExpr |
|
||||
| exprs.kt:243:13:243:27 | nullableReftype | exprs.kt:223:1:244:1 | equalityTests | VarAccess |
|
||||
| exprs.kt:243:13:243:35 | ... != ... | exprs.kt:223:1:244:1 | equalityTests | NEExpr |
|
||||
| exprs.kt:243:32:243:35 | null | exprs.kt:223:1:244:1 | equalityTests | NullLiteral |
|
||||
| funcExprs.kt:16:5:16:33 | functionExpression0a(...) | funcExprs.kt:15:1:46:1 | call | MethodAccess |
|
||||
| funcExprs.kt:16:26:16:33 | ...->... | funcExprs.kt:15:1:46:1 | call | LambdaExpr |
|
||||
| funcExprs.kt:16:26:16:33 | Function0<Integer> | funcExprs.kt:15:1:46:1 | call | TypeAccess |
|
||||
|
||||
@@ -219,3 +219,26 @@ class SomeClass1 {}
|
||||
fun fnClassRef() {
|
||||
val x = SomeClass1::class
|
||||
}
|
||||
|
||||
fun equalityTests(notNullPrimitive: Int, nullablePrimitive: Int?, notNullReftype: String, nullableReftype: String?) {
|
||||
val b1 = notNullPrimitive == notNullPrimitive
|
||||
val b2 = notNullPrimitive == nullablePrimitive
|
||||
val b3 = nullablePrimitive == nullablePrimitive
|
||||
val b4 = notNullReftype == notNullReftype
|
||||
val b5 = notNullReftype == nullableReftype
|
||||
val b6 = nullableReftype == nullableReftype
|
||||
val b7 = notNullPrimitive != notNullPrimitive
|
||||
val b8 = notNullPrimitive != nullablePrimitive
|
||||
val b9 = nullablePrimitive != nullablePrimitive
|
||||
val b10 = notNullReftype != notNullReftype
|
||||
val b11 = notNullReftype != nullableReftype
|
||||
val b12 = nullableReftype != nullableReftype
|
||||
val b13 = notNullPrimitive == null
|
||||
val b14 = nullablePrimitive == null
|
||||
val b15 = notNullReftype == null
|
||||
val b16 = nullableReftype == null
|
||||
val b17 = notNullPrimitive != null
|
||||
val b18 = nullablePrimitive != null
|
||||
val b19 = notNullReftype != null
|
||||
val b20 = nullableReftype != null
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user