Add KtType.isArrayOrPrimitiveArray/isNestedArray() to AA
This commit is contained in:
committed by
Ilya Kirillov
parent
4436ce22b0
commit
f8a101cf3a
+14
@@ -11,6 +11,7 @@ import org.jetbrains.kotlin.analysis.api.descriptors.components.base.Fe10KtAnaly
|
|||||||
import org.jetbrains.kotlin.analysis.api.descriptors.types.base.KtFe10Type
|
import org.jetbrains.kotlin.analysis.api.descriptors.types.base.KtFe10Type
|
||||||
import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken
|
import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken
|
||||||
import org.jetbrains.kotlin.analysis.api.types.KtType
|
import org.jetbrains.kotlin.analysis.api.types.KtType
|
||||||
|
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
||||||
import org.jetbrains.kotlin.builtins.functions.FunctionClassKind
|
import org.jetbrains.kotlin.builtins.functions.FunctionClassKind
|
||||||
import org.jetbrains.kotlin.builtins.getFunctionalClassKind
|
import org.jetbrains.kotlin.builtins.getFunctionalClassKind
|
||||||
import org.jetbrains.kotlin.load.java.sam.JavaSingleAbstractMethodUtils
|
import org.jetbrains.kotlin.load.java.sam.JavaSingleAbstractMethodUtils
|
||||||
@@ -46,6 +47,19 @@ internal class KtFe10TypeInfoProvider(
|
|||||||
return kotlinType.isDenotable()
|
return kotlinType.isDenotable()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun isArrayOrPrimitiveArray(type: KtType): Boolean {
|
||||||
|
require(type is KtFe10Type)
|
||||||
|
return KotlinBuiltIns.isArrayOrPrimitiveArray(type.type)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun isNestedArray(type: KtType): Boolean {
|
||||||
|
if (!isArrayOrPrimitiveArray(type)) return false
|
||||||
|
require(type is KtFe10Type)
|
||||||
|
val unwrappedType = type.type
|
||||||
|
val elementType = unwrappedType.constructor.builtIns.getArrayElementType(unwrappedType)
|
||||||
|
return KotlinBuiltIns.isArrayOrPrimitiveArray(elementType)
|
||||||
|
}
|
||||||
|
|
||||||
private fun KotlinType.isDenotable(): Boolean {
|
private fun KotlinType.isDenotable(): Boolean {
|
||||||
if (this is DefinitelyNotNullType) return false
|
if (this is DefinitelyNotNullType) return false
|
||||||
return constructor.isDenotable &&
|
return constructor.isDenotable &&
|
||||||
|
|||||||
+12
-3
@@ -13,9 +13,7 @@ import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken
|
|||||||
import org.jetbrains.kotlin.analysis.api.types.KtType
|
import org.jetbrains.kotlin.analysis.api.types.KtType
|
||||||
import org.jetbrains.kotlin.builtins.functions.FunctionClassKind
|
import org.jetbrains.kotlin.builtins.functions.FunctionClassKind
|
||||||
import org.jetbrains.kotlin.fir.resolve.FirSamResolverImpl
|
import org.jetbrains.kotlin.fir.resolve.FirSamResolverImpl
|
||||||
import org.jetbrains.kotlin.fir.types.canBeNull
|
import org.jetbrains.kotlin.fir.types.*
|
||||||
import org.jetbrains.kotlin.fir.types.functionClassKind
|
|
||||||
import org.jetbrains.kotlin.fir.types.typeApproximator
|
|
||||||
|
|
||||||
internal class KtFirTypeInfoProvider(
|
internal class KtFirTypeInfoProvider(
|
||||||
override val analysisSession: KtFirAnalysisSession,
|
override val analysisSession: KtFirAnalysisSession,
|
||||||
@@ -46,4 +44,15 @@ internal class KtFirTypeInfoProvider(
|
|||||||
PublicTypeApproximator.PublicApproximatorConfiguration(false)
|
PublicTypeApproximator.PublicApproximatorConfiguration(false)
|
||||||
) == null
|
) == null
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun isArrayOrPrimitiveArray(type: KtType): Boolean {
|
||||||
|
require(type is KtFirType)
|
||||||
|
return type.coneType.isArrayOrPrimitiveArray
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun isNestedArray(type: KtType): Boolean {
|
||||||
|
if (!isArrayOrPrimitiveArray(type)) return false
|
||||||
|
require(type is KtFirType)
|
||||||
|
return type.coneType.arrayElementType()?.isArrayOrPrimitiveArray == true
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+13
@@ -21,6 +21,8 @@ public abstract class KtTypeInfoProvider : KtAnalysisSessionComponent() {
|
|||||||
public abstract fun getFunctionClassKind(type: KtType): FunctionClassKind?
|
public abstract fun getFunctionClassKind(type: KtType): FunctionClassKind?
|
||||||
public abstract fun canBeNull(type: KtType): Boolean
|
public abstract fun canBeNull(type: KtType): Boolean
|
||||||
public abstract fun isDenotable(type: KtType): Boolean
|
public abstract fun isDenotable(type: KtType): Boolean
|
||||||
|
public abstract fun isArrayOrPrimitiveArray(type: KtType): Boolean
|
||||||
|
public abstract fun isNestedArray(type: KtType): Boolean
|
||||||
}
|
}
|
||||||
|
|
||||||
public interface KtTypeInfoProviderMixIn : KtAnalysisSessionMixIn {
|
public interface KtTypeInfoProviderMixIn : KtAnalysisSessionMixIn {
|
||||||
@@ -100,6 +102,17 @@ public interface KtTypeInfoProviderMixIn : KtAnalysisSessionMixIn {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns whether the given [KtType] is an array or a primitive array type or not.
|
||||||
|
*/
|
||||||
|
public fun KtType.isArrayOrPrimitiveArray(): Boolean =
|
||||||
|
withValidityAssertion { analysisSession.typeInfoProvider.isArrayOrPrimitiveArray(this) }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns whether the given [KtType] is an array or a primitive array type and its element is also an array type or not.
|
||||||
|
*/
|
||||||
|
public fun KtType.isNestedArray(): Boolean = withValidityAssertion { analysisSession.typeInfoProvider.isNestedArray(this) }
|
||||||
|
|
||||||
public fun KtType.isClassTypeWithClassId(classId: ClassId): Boolean = withValidityAssertion {
|
public fun KtType.isClassTypeWithClassId(classId: ClassId): Boolean = withValidityAssertion {
|
||||||
if (this !is KtNonErrorClassType) return false
|
if (this !is KtNonErrorClassType) return false
|
||||||
return this.classId == classId
|
return this.classId == classId
|
||||||
|
|||||||
Reference in New Issue
Block a user