Allow expect annotations with actual typealias to Java have default arguments

This commit is contained in:
Ricardo Meneghin Filho
2018-10-17 16:04:36 -03:00
committed by Alexander Udalov
parent 53414aca87
commit c08540175b
2 changed files with 24 additions and 3 deletions
@@ -17,7 +17,10 @@
package org.jetbrains.kotlin.resolve.checkers
import com.intellij.openapi.vfs.VfsUtilCore
import com.intellij.psi.PsiAnnotationMethod
import com.intellij.psi.PsiCall
import com.intellij.psi.PsiElement
import com.intellij.psi.PsiLiteral
import org.jetbrains.kotlin.config.AnalysisFlags
import org.jetbrains.kotlin.config.LanguageFeature
import org.jetbrains.kotlin.descriptors.*
@@ -27,6 +30,7 @@ import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.hasActualModifier
import org.jetbrains.kotlin.resolve.*
import org.jetbrains.kotlin.resolve.constants.CompileTimeConstant
import org.jetbrains.kotlin.resolve.descriptorUtil.isAnnotationConstructor
import org.jetbrains.kotlin.resolve.descriptorUtil.isPrimaryConstructorOfInlineClass
import org.jetbrains.kotlin.resolve.descriptorUtil.module
@@ -253,7 +257,9 @@ object ExpectedActualDeclarationChecker : DeclarationChecker {
val actualParameter = DescriptorToSourceUtils.descriptorToDeclaration(actualParameterDescriptor)
val expectedValue = trace.bindingContext.get(BindingContext.COMPILE_TIME_VALUE, expectedParameter.defaultValue)
// TODO: support arguments coming from Java via typealias, see PsiAnnotationMethod.getDefaultValue()
if (javaDefaultValueEqualsExpectedValue(actualParameter, trace, expectedParameter, expectedValue)) continue
val actualValue = (actualParameter as? KtParameter)?.let { parameter ->
trace.bindingContext.get(BindingContext.COMPILE_TIME_VALUE, parameter.defaultValue)
}
@@ -264,4 +270,20 @@ object ExpectedActualDeclarationChecker : DeclarationChecker {
}
}
}
private fun javaDefaultValueEqualsExpectedValue(
actualParameter: PsiElement?, trace: BindingTrace, expectedParameter: KtParameter, expectedValue: CompileTimeConstant<*>?
): Boolean {
val actualPsi = (actualParameter as? PsiAnnotationMethod)?.defaultValue ?: return false
val expectedType = trace.bindingContext.get(BindingContext.EXPECTED_EXPRESSION_TYPE, expectedParameter.defaultValue) ?: return false
val actualValue = when (actualPsi) {
is PsiLiteral -> actualPsi.value
is PsiCall -> {
//TODO: arrays and annotations
return false
}
else -> return false
}
return (actualValue == expectedValue?.getValue(expectedType))
}
}