[AA] Provide API for obtaining array element type of KtType
KTIJ-23199
This commit is contained in:
+15
@@ -27,6 +27,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.analysis.api.types.KtTypeNullability
|
import org.jetbrains.kotlin.analysis.api.types.KtTypeNullability
|
||||||
import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion
|
import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion
|
||||||
|
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
||||||
import org.jetbrains.kotlin.config.LanguageFeature
|
import org.jetbrains.kotlin.config.LanguageFeature
|
||||||
import org.jetbrains.kotlin.descriptors.*
|
import org.jetbrains.kotlin.descriptors.*
|
||||||
import org.jetbrains.kotlin.name.StandardClassIds
|
import org.jetbrains.kotlin.name.StandardClassIds
|
||||||
@@ -47,8 +48,12 @@ import org.jetbrains.kotlin.types.checker.intersectWrappedTypes
|
|||||||
import org.jetbrains.kotlin.types.error.ErrorType
|
import org.jetbrains.kotlin.types.error.ErrorType
|
||||||
import org.jetbrains.kotlin.types.error.ErrorTypeKind
|
import org.jetbrains.kotlin.types.error.ErrorTypeKind
|
||||||
import org.jetbrains.kotlin.types.error.ErrorUtils
|
import org.jetbrains.kotlin.types.error.ErrorUtils
|
||||||
|
import org.jetbrains.kotlin.types.typeUtil.builtIns
|
||||||
|
import org.jetbrains.kotlin.types.typeUtil.isGenericArrayOfTypeParameter
|
||||||
import org.jetbrains.kotlin.types.typeUtil.isNothing
|
import org.jetbrains.kotlin.types.typeUtil.isNothing
|
||||||
|
import org.jetbrains.kotlin.types.typeUtil.makeNullable
|
||||||
import org.jetbrains.kotlin.util.containingNonLocalDeclaration
|
import org.jetbrains.kotlin.util.containingNonLocalDeclaration
|
||||||
|
import org.jetbrains.kotlin.utils.addToStdlib.applyIf
|
||||||
|
|
||||||
internal class KtFe10TypeProvider(
|
internal class KtFe10TypeProvider(
|
||||||
override val analysisSession: KtFe10AnalysisSession
|
override val analysisSession: KtFe10AnalysisSession
|
||||||
@@ -146,6 +151,16 @@ internal class KtFe10TypeProvider(
|
|||||||
return descriptor.dispatchReceiverParameter?.type?.toKtType(analysisContext)
|
return descriptor.dispatchReceiverParameter?.type?.toKtType(analysisContext)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun getArrayElementType(type: KtType): KtType? {
|
||||||
|
require(type is KtFe10Type)
|
||||||
|
val fe10Type = type.fe10Type
|
||||||
|
|
||||||
|
if (!KotlinBuiltIns.isArrayOrPrimitiveArray(fe10Type)) return null
|
||||||
|
|
||||||
|
val arrayElementType = fe10Type.builtIns.getArrayElementType(fe10Type)
|
||||||
|
return arrayElementType.toKtType(analysisContext)
|
||||||
|
}
|
||||||
|
|
||||||
private fun areTypesCompatible(a: KotlinType, b: KotlinType): Boolean {
|
private fun areTypesCompatible(a: KotlinType, b: KotlinType): Boolean {
|
||||||
if (a.isNothing() || b.isNothing() || TypeUtils.equalTypes(a, b) || (a.isNullable() && b.isNullable())) {
|
if (a.isNothing() || b.isNothing() || TypeUtils.equalTypes(a, b) || (a.isNullable() && b.isNullable())) {
|
||||||
return true
|
return true
|
||||||
|
|||||||
+5
@@ -266,5 +266,10 @@ internal class KtFirTypeProvider(
|
|||||||
}
|
}
|
||||||
return firSymbol.dispatchReceiverType(analysisSession.firSymbolBuilder)
|
return firSymbol.dispatchReceiverType(analysisSession.firSymbolBuilder)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun getArrayElementType(type: KtType): KtType? {
|
||||||
|
require(type is KtFirType)
|
||||||
|
return type.coneType.arrayElementType()?.asKtType()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+8
@@ -42,6 +42,8 @@ public abstract class KtTypeProvider : KtAnalysisSessionComponent() {
|
|||||||
public abstract fun getAllSuperTypes(type: KtType, shouldApproximate: Boolean): List<KtType>
|
public abstract fun getAllSuperTypes(type: KtType, shouldApproximate: Boolean): List<KtType>
|
||||||
|
|
||||||
public abstract fun getDispatchReceiverType(symbol: KtCallableSymbol): KtType?
|
public abstract fun getDispatchReceiverType(symbol: KtCallableSymbol): KtType?
|
||||||
|
|
||||||
|
public abstract fun getArrayElementType(type: KtType): KtType?
|
||||||
}
|
}
|
||||||
|
|
||||||
public interface KtTypeProviderMixIn : KtAnalysisSessionMixIn {
|
public interface KtTypeProviderMixIn : KtAnalysisSessionMixIn {
|
||||||
@@ -152,6 +154,12 @@ public interface KtTypeProviderMixIn : KtAnalysisSessionMixIn {
|
|||||||
@Deprecated("Avoid using this function")
|
@Deprecated("Avoid using this function")
|
||||||
public fun KtCallableSymbol.getDispatchReceiverType(): KtType? =
|
public fun KtCallableSymbol.getDispatchReceiverType(): KtType? =
|
||||||
withValidityAssertion { analysisSession.typeProvider.getDispatchReceiverType(this) }
|
withValidityAssertion { analysisSession.typeProvider.getDispatchReceiverType(this) }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* If provided [KtType] is a primitive type array or [Array], returns the type of the array's elements. Otherwise, returns null.
|
||||||
|
*/
|
||||||
|
public fun KtType.getArrayElementType(): KtType? =
|
||||||
|
withValidityAssertion { analysisSession.typeProvider.getArrayElementType(this) }
|
||||||
}
|
}
|
||||||
|
|
||||||
@Suppress("PropertyName")
|
@Suppress("PropertyName")
|
||||||
|
|||||||
Reference in New Issue
Block a user