Pseudocode: Replace {<: Any?} type predicate with *

This commit is contained in:
Alexey Sedunov
2014-07-11 13:34:54 +04:00
parent 3cd7a22535
commit 487e7f2a91
11 changed files with 28 additions and 21 deletions
@@ -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 ==
+2 -2
View File
@@ -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>
=====================
+2 -2
View File
@@ -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>