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))
}
}
@@ -23,8 +23,7 @@ fun test() {}
// FILE: jvm.kt
actual typealias A1 = J1
// TODO: support arguments coming from Java via typealias (KT-22704)
actual typealias <!ACTUAL_ANNOTATION_CONFLICTING_DEFAULT_ARGUMENT_VALUE!>A2<!> = J2
actual typealias A2 = J2
actual typealias A3 = J3
actual typealias A4 = J4
actual typealias <!ACTUAL_ANNOTATION_CONFLICTING_DEFAULT_ARGUMENT_VALUE!>A5<!> = J5