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.lang.types.checker.JetTypeChecker
|
||||||
import org.jetbrains.jet.renderer.DescriptorRenderer
|
import org.jetbrains.jet.renderer.DescriptorRenderer
|
||||||
import com.intellij.util.SmartFMap
|
import com.intellij.util.SmartFMap
|
||||||
|
import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns
|
||||||
import org.jetbrains.jet.lang.types.TypeUtils
|
import org.jetbrains.jet.lang.types.TypeUtils
|
||||||
|
|
||||||
public trait TypePredicate: (JetType) -> Boolean {
|
public trait TypePredicate: (JetType) -> Boolean {
|
||||||
@@ -71,8 +72,14 @@ fun or(predicates: Collection<TypePredicate>): TypePredicate? =
|
|||||||
else -> ForSomeType(predicates.toList())
|
else -> ForSomeType(predicates.toList())
|
||||||
}
|
}
|
||||||
|
|
||||||
fun JetType.getSubtypesPredicate(): TypePredicate? =
|
fun JetType.getSubtypesPredicate(): TypePredicate? {
|
||||||
if (TypeUtils.canHaveSubtypes(JetTypeChecker.DEFAULT, this)) AllSubtypes(this) else SingleType(this)
|
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)
|
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>
|
1 <v0>: {<: Comparable<Int>} NEW: r(1) -> <v0>
|
||||||
2 <v1>: Int NEW: r(2) -> <v1>
|
2 <v1>: Int NEW: r(2) -> <v1>
|
||||||
1 < 2 <v2>: Boolean NEW: call(1 < 2, compareTo|<v0>, <v1>) -> <v2>
|
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>: * NEW: call(use(b), use|<v3>) -> <v4>
|
||||||
{ use(b) } <v4>: * COPY
|
{ use(b) } <v4>: * COPY
|
||||||
true <v5>: Boolean NEW: r(true) -> <v5>
|
true <v5>: Boolean NEW: r(true) -> <v5>
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ fun foo() {
|
|||||||
x <v1>: Int NEW: r(x) -> <v1>
|
x <v1>: Int NEW: r(x) -> <v1>
|
||||||
a <v2>: Int NEW: r(a) -> <v2>
|
a <v2>: Int NEW: r(a) -> <v2>
|
||||||
x + a <v3>: Int NEW: call(x + a, plus|<v1>, <v2>) -> <v3>
|
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>
|
use(a) <v5>: {<: Array<Any?>} NEW: call(use(a), use|<v4>) -> <v5>
|
||||||
val y = x + a use(a) <v5>: {<: Array<Any?>} COPY
|
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>
|
1 < 2 <v5>: Boolean NEW: call(1 < 2, compareTo|<v3>, <v4>) -> <v5>
|
||||||
false <v6>: Boolean NEW: r(false) -> <v6>
|
false <v6>: Boolean NEW: r(false) -> <v6>
|
||||||
true <v7>: Boolean NEW: r(true) -> <v7>
|
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(b) <v9>: * NEW: call(use(b), use|<v8>) -> <v9>
|
||||||
=====================
|
=====================
|
||||||
== use ==
|
== use ==
|
||||||
|
|||||||
@@ -30,11 +30,11 @@ genfun<Any>()
|
|||||||
{1} <v9>: {<: () -> Any} NEW: r({1}) -> <v9>
|
{1} <v9>: {<: () -> Any} NEW: r({1}) -> <v9>
|
||||||
flfun {1} <v10>: * NEW: call(flfun {1}, flfun|<v9>) -> <v10>
|
flfun {1} <v10>: * NEW: call(flfun {1}, flfun|<v9>) -> <v10>
|
||||||
3 <v11>: OR{{<: Any}, {<: Any}} NEW: r(3) -> <v11>
|
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>
|
equals(4) <v13>: * NEW: call(equals(4), equals|<v11>, <v12>) -> <v13>
|
||||||
3.equals(4) <v13>: * COPY
|
3.equals(4) <v13>: * COPY
|
||||||
3 <v14>: OR{{<: Any}, {<: Any}} NEW: r(3) -> <v14>
|
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>
|
3 equals 4 <v16>: * NEW: call(3 equals 4, equals|<v14>, <v15>) -> <v16>
|
||||||
1 <v17>: Int NEW: r(1) -> <v17>
|
1 <v17>: Int NEW: r(1) -> <v17>
|
||||||
2 <v18>: Int NEW: r(2) -> <v18>
|
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>
|
<v0>: {<: List<String>?} NEW: magic[FAKE_INITIALIZER](list: List<String>?) -> <v0>
|
||||||
doSmth() <v1>: * NEW: call(doSmth(), doSmth) -> <v1>
|
doSmth() <v1>: * NEW: call(doSmth(), doSmth) -> <v1>
|
||||||
{ doSmth() } <v1>: * COPY
|
{ doSmth() } <v1>: * COPY
|
||||||
list <v2>: {<: Any?} NEW: r(list) -> <v2>
|
list <v2>: * NEW: r(list) -> <v2>
|
||||||
null <v3>: {<: Any?} NEW: r(null) -> <v3>
|
null <v3>: * NEW: r(null) -> <v3>
|
||||||
list != null <v4>: Boolean NEW: call(list != null, equals|<v2>, <v3>) -> <v4>
|
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
|
||||||
{ 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>
|
<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 <v2>: * NEW: r(1) -> <v2>
|
||||||
1 <v3>: * NEW: magic[EQUALS_IN_WHEN_CONDITION](1|<v1>, <v2>) -> <v3>
|
1 <v3>: * NEW: magic[EQUALS_IN_WHEN_CONDITION](1|<v1>, <v2>) -> <v3>
|
||||||
"1" <v4>: {<: String?} NEW: r("1") -> <v4>
|
"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>
|
<v0>: Int NEW: magic[FAKE_INITIALIZER](a: Int) -> <v0>
|
||||||
<v1>: Int NEW: magic[FAKE_INITIALIZER](b: Int) -> <v1>
|
<v1>: Int NEW: magic[FAKE_INITIALIZER](b: Int) -> <v1>
|
||||||
a <v2>: OR{{<: Any}, {<: Any}} NEW: r(a) -> <v2>
|
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>
|
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>
|
<v0>: Int NEW: magic[FAKE_INITIALIZER](a: Int) -> <v0>
|
||||||
<v1>: Int NEW: magic[FAKE_INITIALIZER](b: Int) -> <v1>
|
<v1>: Int NEW: magic[FAKE_INITIALIZER](b: Int) -> <v1>
|
||||||
a <v2>: OR{{<: Any}, {<: Any}} NEW: r(a) -> <v2>
|
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>
|
a != b <v4>: Boolean NEW: call(a != b, equals|<v2>, <v3>) -> <v4>
|
||||||
=====================
|
=====================
|
||||||
|
|||||||
@@ -8,10 +8,10 @@ abstract class Bar {
|
|||||||
== foo ==
|
== foo ==
|
||||||
fun foo() = "foo" + this.$bar
|
fun foo() = "foo" + this.$bar
|
||||||
---------------------
|
---------------------
|
||||||
"foo" <v0>: String NEW: r("foo") -> <v0>
|
"foo" <v0>: String NEW: r("foo") -> <v0>
|
||||||
this <v1>: {<: Bar} COPY
|
this <v1>: {<: Bar} COPY
|
||||||
this <v1>: {<: Bar} NEW: r(this) -> <v1>
|
this <v1>: {<: Bar} NEW: r(this) -> <v1>
|
||||||
$bar <v2>: {<: Any?} NEW: r($bar|<v1>) -> <v2>
|
$bar <v2>: * NEW: r($bar|<v1>) -> <v2>
|
||||||
this.$bar <v2>: {<: Any?} COPY
|
this.$bar <v2>: * COPY
|
||||||
"foo" + this.$bar <v3>: String NEW: call("foo" + this.$bar, plus|<v0>, <v2>) -> <v3>
|
"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>
|
<v1>: Long NEW: magic[FAKE_INITIALIZER](sum: Long) -> <v1>
|
||||||
x <v2>: OR{{<: Any}, {<: Any}} NEW: r(x) -> <v2>
|
x <v2>: OR{{<: Any}, {<: Any}} NEW: r(x) -> <v2>
|
||||||
0 <v3>: {<: Number} NEW: r(0) -> <v3>
|
0 <v3>: {<: Number} NEW: r(0) -> <v3>
|
||||||
toLong() <v4>: {<: Any?} NEW: call(toLong(), toLong|<v3>) -> <v4>
|
toLong() <v4>: * NEW: call(toLong(), toLong|<v3>) -> <v4>
|
||||||
0.toLong() <v4>: {<: Any?} COPY
|
0.toLong() <v4>: * COPY
|
||||||
x == 0.toLong() <v5>: Boolean NEW: call(x == 0.toLong(), equals|<v2>, <v4>) -> <v5>
|
x == 0.toLong() <v5>: Boolean NEW: call(x == 0.toLong(), equals|<v2>, <v4>) -> <v5>
|
||||||
sum <v6>: Long NEW: r(sum) -> <v6>
|
sum <v6>: Long NEW: r(sum) -> <v6>
|
||||||
x <v7>: Long NEW: r(x) -> <v7>
|
x <v7>: Long NEW: r(x) -> <v7>
|
||||||
|
|||||||
Reference in New Issue
Block a user