FIR IDE/LC: introduce/use KtTypeMappingMode

This commit is contained in:
Jinseong Jeon
2021-11-04 15:06:42 -07:00
committed by Ilya Kirillov
parent 0da9ef873a
commit 4eec381d1b
12 changed files with 114 additions and 55 deletions
@@ -10,11 +10,11 @@ import com.intellij.psi.impl.PsiClassImplUtil
import org.jetbrains.kotlin.asJava.elements.KtLightMethod
import org.jetbrains.kotlin.analysis.api.isValid
import org.jetbrains.kotlin.analysis.api.symbols.KtEnumEntrySymbol
import org.jetbrains.kotlin.analysis.api.types.KtTypeMappingMode
import org.jetbrains.kotlin.light.classes.symbol.*
import org.jetbrains.kotlin.light.classes.symbol.classes.createConstructors
import org.jetbrains.kotlin.light.classes.symbol.classes.createMethods
import org.jetbrains.kotlin.load.java.structure.LightClassOriginKind
import org.jetbrains.kotlin.load.kotlin.TypeMappingMode
import org.jetbrains.kotlin.psi.KtClassOrObject
internal class FirLightClassForEnumEntry(
@@ -82,8 +82,7 @@ internal class FirLightClassForEnumEntry(
private val _extendsList: PsiReferenceList? by lazyPub {
val mappedType = analyzeWithSymbolAsContext(enumEntrySymbol) {
enumEntrySymbol.annotatedType
.type.asPsiType(this@FirLightClassForEnumEntry, TypeMappingMode.SUPER_TYPE) as? PsiClassType
enumEntrySymbol.annotatedType.type.asPsiType(this@FirLightClassForEnumEntry, KtTypeMappingMode.SUPER_TYPE) as? PsiClassType
?: return@lazyPub null
}
@@ -67,8 +67,7 @@ internal class FirLightFieldForEnumEntry(
private val _type: PsiType by lazyPub {
analyzeWithSymbolAsContext(enumEntrySymbol) {
enumEntrySymbol.annotatedType.type.asPsiType(this@FirLightFieldForEnumEntry)
?: this@FirLightFieldForEnumEntry.nonExistentType()
}
} ?: nonExistentType()
}
override fun getType(): PsiType = _type
@@ -41,8 +41,7 @@ internal class FirLightFieldForObjectSymbol(
private val _type: PsiType by lazyPub {
analyzeWithSymbolAsContext(objectSymbol) {
objectSymbol.buildSelfClassType().asPsiType(this@FirLightFieldForObjectSymbol)
?: this@FirLightFieldForObjectSymbol.nonExistentType()
}
} ?: nonExistentType()
}
private val _identifier: PsiIdentifier by lazyPub {
@@ -13,6 +13,7 @@ import org.jetbrains.kotlin.analysis.api.isValid
import org.jetbrains.kotlin.analysis.api.symbols.KtKotlinPropertySymbol
import org.jetbrains.kotlin.analysis.api.symbols.KtPropertySymbol
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtLiteralConstantValue
import org.jetbrains.kotlin.analysis.api.types.KtTypeMappingMode
import org.jetbrains.kotlin.psi.KtDeclaration
import org.jetbrains.kotlin.psi.KtProperty
@@ -34,18 +35,10 @@ internal class FirLightFieldForPropertySymbol(
when {
isDelegated ->
(kotlinOrigin as? KtProperty)?.delegateExpression?.let {
val ktType = it.getKtType()
ktType?.asPsiType(
this@FirLightFieldForPropertySymbol,
ktType.getOptimalModeForReturnType(containingClass.isAnnotationType)
)
it.getKtType()?.asPsiType(this@FirLightFieldForPropertySymbol, KtTypeMappingMode.RETURN_TYPE)
}
else -> {
val ktType = propertySymbol.annotatedType.type
ktType.asPsiType(
this@FirLightFieldForPropertySymbol,
ktType.getOptimalModeForReturnType(containingClass.isAnnotationType)
)
propertySymbol.annotatedType.type.asPsiType(this@FirLightFieldForPropertySymbol, KtTypeMappingMode.RETURN_TYPE)
}
}
} ?: nonExistentType()
@@ -18,7 +18,6 @@ import org.jetbrains.kotlin.analysis.api.symbols.KtClassLikeSymbol
import org.jetbrains.kotlin.analysis.api.symbols.KtFunctionSymbol
import org.jetbrains.kotlin.analysis.api.symbols.markers.*
import org.jetbrains.kotlin.analysis.api.types.*
import org.jetbrains.kotlin.load.kotlin.TypeMappingMode
import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.SpecialNames
import java.util.*
@@ -43,7 +42,7 @@ internal fun KtAnalysisSession.mapSuperType(
if (type !is KtNonErrorClassType) return null
val psiType = type.asPsiType(
psiContext,
if (kotlinCollectionAsIs) TypeMappingMode.SUPER_TYPE_KOTLIN_COLLECTIONS_AS_IS else TypeMappingMode.SUPER_TYPE,
if (kotlinCollectionAsIs) KtTypeMappingMode.SUPER_TYPE_KOTLIN_COLLECTIONS_AS_IS else KtTypeMappingMode.SUPER_TYPE,
)
return psiType as? PsiClassType
}
@@ -16,6 +16,7 @@ import org.jetbrains.kotlin.analysis.api.symbols.KtPropertyAccessorSymbol
import org.jetbrains.kotlin.analysis.api.symbols.KtPropertyGetterSymbol
import org.jetbrains.kotlin.analysis.api.symbols.KtPropertySetterSymbol
import org.jetbrains.kotlin.analysis.api.symbols.KtPropertySymbol
import org.jetbrains.kotlin.analysis.api.types.KtTypeMappingMode
import org.jetbrains.kotlin.load.java.JvmAbi.getterName
import org.jetbrains.kotlin.load.java.JvmAbi.setterName
import org.jetbrains.kotlin.psi.KtDeclaration
@@ -150,10 +151,10 @@ internal class FirLightAccessorMethodForSymbol(
private val _returnedType: PsiType by lazyPub {
if (!isGetter) return@lazyPub PsiType.VOID
analyzeWithSymbolAsContext(containingPropertySymbol) {
val ktType = containingPropertySymbol.annotatedType.type
ktType.asPsiType(
containingPropertySymbol.annotatedType.type.asPsiType(
this@FirLightAccessorMethodForSymbol,
ktType.getOptimalModeForReturnType(containingClass.isAnnotationType)
KtTypeMappingMode.RETURN_TYPE,
containingClass.isAnnotationType
)
} ?: nonExistentType()
}
@@ -10,6 +10,7 @@ import org.jetbrains.kotlin.asJava.builder.LightMemberOrigin
import org.jetbrains.kotlin.asJava.classes.lazyPub
import org.jetbrains.kotlin.analysis.api.isValid
import org.jetbrains.kotlin.analysis.api.symbols.KtFunctionSymbol
import org.jetbrains.kotlin.analysis.api.types.KtTypeMappingMode
import org.jetbrains.kotlin.lexer.KtTokens
import org.jetbrains.kotlin.utils.addToStdlib.ifTrue
import java.util.*
@@ -147,7 +148,8 @@ internal class FirLightSimpleMethodForSymbol(
}
ktType.asPsiType(
this@FirLightSimpleMethodForSymbol,
ktType.getOptimalModeForReturnType(containingClass.isAnnotationType)
KtTypeMappingMode.RETURN_TYPE,
containingClass.isAnnotationType
)
} ?: nonExistentType()
}
@@ -8,7 +8,7 @@ package org.jetbrains.kotlin.light.classes.symbol
import com.intellij.psi.*
import org.jetbrains.kotlin.asJava.classes.lazyPub
import org.jetbrains.kotlin.analysis.api.symbols.KtValueParameterSymbol
import org.jetbrains.kotlin.load.kotlin.TypeMappingMode
import org.jetbrains.kotlin.analysis.api.types.KtTypeMappingMode
import org.jetbrains.kotlin.psi.KtParameter
internal abstract class FirLightParameterBaseForSymbol(
@@ -49,10 +49,10 @@ internal abstract class FirLightParameterBaseForSymbol(
val convertedType = analyzeWithSymbolAsContext(parameterSymbol) {
val ktType = parameterSymbol.annotatedType.type
val typeMappingMode = when {
ktType.isSuspendFunctionType -> TypeMappingMode.DEFAULT
ktType.isSuspendFunctionType -> KtTypeMappingMode.DEFAULT
// TODO: extract type mapping mode from annotation?
// TODO: methods with declaration site wildcards?
else -> ktType.getOptimalModeForValueParameter()
else -> KtTypeMappingMode.VALUE_PARAMETER
}
ktType.asPsiType(this@FirLightParameterBaseForSymbol, typeMappingMode)
} ?: nonExistentType()