Pseudocode: Replace {<: Any?} type predicate with *
This commit is contained in:
@@ -20,6 +20,7 @@ import org.jetbrains.jet.lang.types.JetType
|
||||
import org.jetbrains.jet.lang.types.checker.JetTypeChecker
|
||||
import org.jetbrains.jet.renderer.DescriptorRenderer
|
||||
import com.intellij.util.SmartFMap
|
||||
import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns
|
||||
import org.jetbrains.jet.lang.types.TypeUtils
|
||||
|
||||
public trait TypePredicate: (JetType) -> Boolean {
|
||||
@@ -71,8 +72,14 @@ fun or(predicates: Collection<TypePredicate>): TypePredicate? =
|
||||
else -> ForSomeType(predicates.toList())
|
||||
}
|
||||
|
||||
fun JetType.getSubtypesPredicate(): TypePredicate? =
|
||||
if (TypeUtils.canHaveSubtypes(JetTypeChecker.DEFAULT, this)) AllSubtypes(this) else SingleType(this)
|
||||
fun JetType.getSubtypesPredicate(): TypePredicate? {
|
||||
return when {
|
||||
KotlinBuiltIns.getInstance().isAnyOrNullableAny(this) && isNullable() -> AllTypes
|
||||
TypeUtils.canHaveSubtypes(JetTypeChecker.DEFAULT, this) -> AllSubtypes(this)
|
||||
else -> SingleType(this)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private fun JetType.render(): String = DescriptorRenderer.SHORT_NAMES_IN_TYPES.renderType(this)
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@ fun foo() {
|
||||
1 <v0>: {<: Comparable<Int>} NEW: r(1) -> <v0>
|
||||
2 <v1>: Int NEW: r(2) -> <v1>
|
||||
1 < 2 <v2>: Boolean NEW: call(1 < 2, compareTo|<v0>, <v1>) -> <v2>
|
||||
b <v3>: {<: Any?} NEW: r(b) -> <v3>
|
||||
b <v3>: * NEW: r(b) -> <v3>
|
||||
use(b) <v4>: * NEW: call(use(b), use|<v3>) -> <v4>
|
||||
{ use(b) } <v4>: * COPY
|
||||
true <v5>: Boolean NEW: r(true) -> <v5>
|
||||
|
||||
@@ -20,7 +20,7 @@ fun foo() {
|
||||
x <v1>: Int NEW: r(x) -> <v1>
|
||||
a <v2>: Int NEW: r(a) -> <v2>
|
||||
x + a <v3>: Int NEW: call(x + a, plus|<v1>, <v2>) -> <v3>
|
||||
a <v4>: {<: Any?} NEW: r(a) -> <v4>
|
||||
a <v4>: * NEW: r(a) -> <v4>
|
||||
use(a) <v5>: {<: Array<Any?>} NEW: call(use(a), use|<v4>) -> <v5>
|
||||
val y = x + a use(a) <v5>: {<: Array<Any?>} COPY
|
||||
=====================
|
||||
|
||||
@@ -21,7 +21,7 @@ numbers <v1>: {<: Iterable<Int>} NEW: r(numbers) -> <v1>
|
||||
1 < 2 <v5>: Boolean NEW: call(1 < 2, compareTo|<v3>, <v4>) -> <v5>
|
||||
false <v6>: Boolean NEW: r(false) -> <v6>
|
||||
true <v7>: Boolean NEW: r(true) -> <v7>
|
||||
b <v8>: {<: Any?} NEW: r(b) -> <v8>
|
||||
b <v8>: * NEW: r(b) -> <v8>
|
||||
use(b) <v9>: * NEW: call(use(b), use|<v8>) -> <v9>
|
||||
=====================
|
||||
== use ==
|
||||
|
||||
@@ -30,11 +30,11 @@ genfun<Any>()
|
||||
{1} <v9>: {<: () -> Any} NEW: r({1}) -> <v9>
|
||||
flfun {1} <v10>: * NEW: call(flfun {1}, flfun|<v9>) -> <v10>
|
||||
3 <v11>: OR{{<: Any}, {<: Any}} NEW: r(3) -> <v11>
|
||||
4 <v12>: {<: Any?} NEW: r(4) -> <v12>
|
||||
4 <v12>: * NEW: r(4) -> <v12>
|
||||
equals(4) <v13>: * NEW: call(equals(4), equals|<v11>, <v12>) -> <v13>
|
||||
3.equals(4) <v13>: * COPY
|
||||
3 <v14>: OR{{<: Any}, {<: Any}} NEW: r(3) -> <v14>
|
||||
4 <v15>: {<: Any?} NEW: r(4) -> <v15>
|
||||
4 <v15>: * NEW: r(4) -> <v15>
|
||||
3 equals 4 <v16>: * NEW: call(3 equals 4, equals|<v14>, <v15>) -> <v16>
|
||||
1 <v17>: Int NEW: r(1) -> <v17>
|
||||
2 <v18>: Int NEW: r(2) -> <v18>
|
||||
|
||||
@@ -116,8 +116,8 @@ fun doTestCopy4(list: List<String>?) : Int {
|
||||
<v0>: {<: List<String>?} NEW: magic[FAKE_INITIALIZER](list: List<String>?) -> <v0>
|
||||
doSmth() <v1>: * NEW: call(doSmth(), doSmth) -> <v1>
|
||||
{ doSmth() } <v1>: * COPY
|
||||
list <v2>: {<: Any?} NEW: r(list) -> <v2>
|
||||
null <v3>: {<: Any?} NEW: r(null) -> <v3>
|
||||
list <v2>: * NEW: r(list) -> <v2>
|
||||
null <v3>: * NEW: r(null) -> <v3>
|
||||
list != null <v4>: Boolean NEW: call(list != null, equals|<v2>, <v3>) -> <v4>
|
||||
try { doSmth() } finally { if(list != null) { } } <v1>: * COPY
|
||||
{ try { doSmth() } finally { if(list != null) { } } } <v1>: * COPY
|
||||
|
||||
@@ -11,7 +11,7 @@ fun foo(a: Number) {
|
||||
}
|
||||
---------------------
|
||||
<v0>: {<: Number} NEW: magic[FAKE_INITIALIZER](a: Number) -> <v0>
|
||||
a <v1>: AND{*, {<: Any?}} NEW: r(a) -> <v1>
|
||||
a <v1>: * NEW: r(a) -> <v1>
|
||||
1 <v2>: * NEW: r(1) -> <v2>
|
||||
1 <v3>: * NEW: magic[EQUALS_IN_WHEN_CONDITION](1|<v1>, <v2>) -> <v3>
|
||||
"1" <v4>: {<: String?} NEW: r("1") -> <v4>
|
||||
|
||||
@@ -7,6 +7,6 @@ fun foo(a: Int, b: Int) {
|
||||
<v0>: Int NEW: magic[FAKE_INITIALIZER](a: Int) -> <v0>
|
||||
<v1>: Int NEW: magic[FAKE_INITIALIZER](b: Int) -> <v1>
|
||||
a <v2>: OR{{<: Any}, {<: Any}} NEW: r(a) -> <v2>
|
||||
b <v3>: {<: Any?} NEW: r(b) -> <v3>
|
||||
b <v3>: * NEW: r(b) -> <v3>
|
||||
a == b <v4>: Boolean NEW: call(a == b, equals|<v2>, <v3>) -> <v4>
|
||||
=====================
|
||||
|
||||
@@ -6,6 +6,6 @@ fun neq(a: Int, b: Int) {
|
||||
<v0>: Int NEW: magic[FAKE_INITIALIZER](a: Int) -> <v0>
|
||||
<v1>: Int NEW: magic[FAKE_INITIALIZER](b: Int) -> <v1>
|
||||
a <v2>: OR{{<: Any}, {<: Any}} NEW: r(a) -> <v2>
|
||||
b <v3>: {<: Any?} NEW: r(b) -> <v3>
|
||||
b <v3>: * NEW: r(b) -> <v3>
|
||||
a != b <v4>: Boolean NEW: call(a != b, equals|<v2>, <v3>) -> <v4>
|
||||
=====================
|
||||
|
||||
@@ -8,10 +8,10 @@ abstract class Bar {
|
||||
== foo ==
|
||||
fun foo() = "foo" + this.$bar
|
||||
---------------------
|
||||
"foo" <v0>: String NEW: r("foo") -> <v0>
|
||||
this <v1>: {<: Bar} COPY
|
||||
this <v1>: {<: Bar} NEW: r(this) -> <v1>
|
||||
$bar <v2>: {<: Any?} NEW: r($bar|<v1>) -> <v2>
|
||||
this.$bar <v2>: {<: Any?} COPY
|
||||
"foo" + this.$bar <v3>: String NEW: call("foo" + this.$bar, plus|<v0>, <v2>) -> <v3>
|
||||
=====================
|
||||
"foo" <v0>: String NEW: r("foo") -> <v0>
|
||||
this <v1>: {<: Bar} COPY
|
||||
this <v1>: {<: Bar} NEW: r(this) -> <v1>
|
||||
$bar <v2>: * NEW: r($bar|<v1>) -> <v2>
|
||||
this.$bar <v2>: * COPY
|
||||
"foo" + this.$bar <v3>: String NEW: call("foo" + this.$bar, plus|<v0>, <v2>) -> <v3>
|
||||
=====================
|
||||
|
||||
@@ -8,8 +8,8 @@ tailRecursive fun sum(x: Long, sum: Long): Long {
|
||||
<v1>: Long NEW: magic[FAKE_INITIALIZER](sum: Long) -> <v1>
|
||||
x <v2>: OR{{<: Any}, {<: Any}} NEW: r(x) -> <v2>
|
||||
0 <v3>: {<: Number} NEW: r(0) -> <v3>
|
||||
toLong() <v4>: {<: Any?} NEW: call(toLong(), toLong|<v3>) -> <v4>
|
||||
0.toLong() <v4>: {<: Any?} COPY
|
||||
toLong() <v4>: * NEW: call(toLong(), toLong|<v3>) -> <v4>
|
||||
0.toLong() <v4>: * COPY
|
||||
x == 0.toLong() <v5>: Boolean NEW: call(x == 0.toLong(), equals|<v2>, <v4>) -> <v5>
|
||||
sum <v6>: Long NEW: r(sum) -> <v6>
|
||||
x <v7>: Long NEW: r(x) -> <v7>
|
||||
|
||||
Reference in New Issue
Block a user