FIR IDE: make smartcast API return unstable smartcasts

This commit is contained in:
Tianyu Geng
2021-11-03 10:34:49 -07:00
committed by Ilya Kirillov
parent 6462642988
commit 197079c85c
31 changed files with 356 additions and 23 deletions
@@ -10,13 +10,18 @@ import org.jetbrains.kotlin.analysis.api.types.KtType
import org.jetbrains.kotlin.psi.KtExpression
public abstract class KtSmartCastProvider : KtAnalysisSessionComponent() {
public abstract fun getSmartCastedToType(expression: KtExpression): KtType?
public abstract fun getSmartCastedInfo(expression: KtExpression): SmartCastInfo?
public abstract fun getImplicitReceiverSmartCast(expression: KtExpression): Collection<ImplicitReceiverSmartCast>
}
public class SmartCastInfo(public val smartCastType: KtType, public val isStable: Boolean)
public interface KtSmartCastProviderMixIn : KtAnalysisSessionMixIn {
public fun KtExpression.getSmartCast(): KtType? =
analysisSession.smartCastProvider.getSmartCastedToType(this)
/**
* Gets the smart-cast information of the given expression or null if the expression is not smart casted.
*/
public fun KtExpression.getSmartCastInfo(): SmartCastInfo? =
analysisSession.smartCastProvider.getSmartCastedInfo(this)
public fun KtExpression.getImplicitReceiverSmartCast(): Collection<ImplicitReceiverSmartCast> =
analysisSession.smartCastProvider.getImplicitReceiverSmartCast(this)
@@ -0,0 +1,3 @@
expression: a
isStable: null
smartCastType: null
@@ -0,0 +1,10 @@
interface A
interface B
fun <T> T.foo() where T: A, T: B {}
fun test(a: Any) {
if (a is A && a is B) {
<expr>a</expr>.foo()
}
}
@@ -0,0 +1,3 @@
expression: a
isStable: true
smartCastType: (A&B)
@@ -0,0 +1,3 @@
expression: a
isStable: null
smartCastType: null
@@ -0,0 +1,11 @@
interface A
interface B
fun <T> T.foo() where T: A, T: B {}
var a: Any = 1
fun test() {
if (a is A && a is B) {
<expr>a</expr>.foo()
}
}
@@ -0,0 +1,3 @@
expression: a
isStable: false
smartCastType: (A&B)
@@ -0,0 +1,3 @@
expression: a
isStable: null
smartCastType: null
@@ -0,0 +1,8 @@
interface A
interface B
fun test(a: Any) {
if (a is A && a is B) {
<expr>a</expr>
}
}
@@ -0,0 +1,3 @@
expression: a
isStable: true
smartCastType: (A&B)
@@ -0,0 +1,3 @@
expression: a
isStable: null
smartCastType: null
@@ -0,0 +1,9 @@
interface A
interface B
var a: Any = 1
fun test() {
if (a is A && a is B) {
<expr>a</expr>
}
}
@@ -0,0 +1,3 @@
expression: a
isStable: false
smartCastType: (A&B)
@@ -0,0 +1,5 @@
fun test(a: Any) {
if (a is String) {
<expr>a</expr>.length
}
}
@@ -0,0 +1,3 @@
expression: a
isStable: true
smartCastType: kotlin.String
@@ -0,0 +1,6 @@
var a: Any = 1
fun test() {
if (a is String) {
<expr>a</expr>.length
}
}
@@ -0,0 +1,3 @@
expression: a
isStable: null
smartCastType: null
@@ -0,0 +1,3 @@
expression: a
isStable: null
smartCastType: null
@@ -0,0 +1,5 @@
fun test(a: Any) {
if (a is String) {
<expr>a</expr>
}
}
@@ -0,0 +1,3 @@
expression: a
isStable: true
smartCastType: kotlin.String
@@ -0,0 +1,3 @@
expression: a
isStable: null
smartCastType: null
@@ -0,0 +1,6 @@
var a: Any = 1
fun test() {
if (a is String) {
<expr>a</expr>
}
}
@@ -0,0 +1,3 @@
expression: a
isStable: false
smartCastType: kotlin.String