AA: use appropriate type mapping mode in eq checker

This commit is contained in:
Jinseong Jeon
2022-09-11 01:12:23 -07:00
committed by Ilya Kirillov
parent 3c74751f73
commit a77933ca9a
@@ -12,6 +12,7 @@ import org.jetbrains.kotlin.analysis.api.symbols.KtCallableSymbol
import org.jetbrains.kotlin.analysis.api.symbols.KtConstructorSymbol
import org.jetbrains.kotlin.analysis.api.symbols.KtFunctionLikeSymbol
import org.jetbrains.kotlin.analysis.api.types.KtType
import org.jetbrains.kotlin.analysis.api.types.KtTypeMappingMode
// TODO replace with structural type comparison?
internal object PsiDeclarationAndKtSymbolEqualityChecker {
@@ -25,8 +26,15 @@ internal object PsiDeclarationAndKtSymbolEqualityChecker {
private fun KtAnalysisSession.returnTypesMatch(psi: PsiMethod, symbol: KtCallableSymbol): Boolean {
if (symbol is KtConstructorSymbol) return true
return psi.returnType?.let { isTheSameTypes(psi, it, symbol.returnType, isVararg = false) }
?: false
return psi.returnType?.let {
isTheSameTypes(
psi,
it,
symbol.returnType,
KtTypeMappingMode.RETURN_TYPE,
isVararg = false
)
} ?: false
}
private fun typeParametersMatch(psi: PsiMethod, symbol: KtCallableSymbol): Boolean {
@@ -50,7 +58,14 @@ internal object PsiDeclarationAndKtSymbolEqualityChecker {
val psiParameter = psi.parameterList.parameters[index + offset]
if (valueParameterSymbol.name.asString() != psiParameter.name) return false
if (valueParameterSymbol.isVararg != psiParameter.isVarArgs) return false
if (!isTheSameTypes(psi, psiParameter.type, valueParameterSymbol.returnType, valueParameterSymbol.isVararg)) return false
if (!isTheSameTypes(
psi,
psiParameter.type,
valueParameterSymbol.returnType,
KtTypeMappingMode.VALUE_PARAMETER,
valueParameterSymbol.isVararg
)
) return false
}
return true
}
@@ -59,11 +74,12 @@ internal object PsiDeclarationAndKtSymbolEqualityChecker {
context: PsiMethod,
psi: PsiType,
ktType: KtType,
mode: KtTypeMappingMode = KtTypeMappingMode.DEFAULT,
isVararg: Boolean = false
): Boolean {
// Shortcut: primitive void == Unit as a function return type
if (psi == PsiType.VOID && ktType.isUnit) return true
val ktTypeRendered = ktType.asPsiType(context) ?: return false
val ktTypeRendered = ktType.asPsiType(context, mode) ?: return false
val rendered = if (isVararg) ktTypeRendered.createArrayType() else ktTypeRendered
return rendered == psi
}