diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/ClassBodyCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/ClassBodyCodegen.java index cb59b634031..b9b1d0dbdd3 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/ClassBodyCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/ClassBodyCodegen.java @@ -231,7 +231,9 @@ public abstract class ClassBodyCodegen extends MemberCodegen? = null ) { companion object { @JvmField diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/builder/LightElementOrigin.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/builder/LightElementOrigin.kt index f869afa5ccf..e30bdf732a4 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/builder/LightElementOrigin.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/builder/LightElementOrigin.kt @@ -19,6 +19,7 @@ package org.jetbrains.kotlin.asJava.builder import com.intellij.psi.PsiElement import org.jetbrains.kotlin.psi.KtAnnotationEntry import org.jetbrains.kotlin.psi.KtDeclaration +import org.jetbrains.kotlin.psi.KtParameter import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOrigin import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOriginKind @@ -41,7 +42,7 @@ fun JvmDeclarationOrigin.toLightMemberOrigin(): LightElementOrigin { val originalElement = element return when (originalElement) { is KtAnnotationEntry -> DefaultLightElementOrigin(originalElement) - is KtDeclaration -> LightMemberOriginForDeclaration(originalElement, originKind) + is KtDeclaration -> LightMemberOriginForDeclaration(originalElement, originKind, parametersForJvmOverload) else -> LightElementOrigin.None } } @@ -49,19 +50,24 @@ fun JvmDeclarationOrigin.toLightMemberOrigin(): LightElementOrigin { interface LightMemberOrigin : LightElementOrigin { override val originalElement: KtDeclaration? override val originKind: JvmDeclarationOriginKind + val parametersForJvmOverloads: List? get() = null fun isEquivalentTo(other: LightMemberOrigin?): Boolean fun copy(): LightMemberOrigin } -data class LightMemberOriginForDeclaration(override val originalElement: KtDeclaration, override val originKind: JvmDeclarationOriginKind) : LightMemberOrigin { +data class LightMemberOriginForDeclaration( + override val originalElement: KtDeclaration, + override val originKind: JvmDeclarationOriginKind, + override val parametersForJvmOverloads: List? = null +) : LightMemberOrigin { override fun isEquivalentTo(other: LightMemberOrigin?): Boolean { if (other !is LightMemberOriginForDeclaration) return false return originalElement.isEquivalentTo(other.originalElement) } override fun copy(): LightMemberOrigin { - return LightMemberOriginForDeclaration(originalElement.copy() as KtDeclaration, originKind) + return LightMemberOriginForDeclaration(originalElement.copy() as KtDeclaration, originKind, parametersForJvmOverloads) } } @@ -71,4 +77,4 @@ data class DefaultLightElementOrigin(override val originalElement: PsiElement?) fun PsiElement?.toLightClassOrigin(): LightElementOrigin { return if (this != null) DefaultLightElementOrigin(this) else LightElementOrigin.None -} \ No newline at end of file +} diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/elements/KtLightParameter.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/elements/KtLightParameter.kt index a624213a5f7..73ed6df40e0 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/elements/KtLightParameter.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/elements/KtLightParameter.kt @@ -41,7 +41,7 @@ class KtLightParameter( if (jetIndex < 0) return null if (declaration is KtFunction) { - val paramList = declaration.valueParameters + val paramList = method.lightMemberOrigin?.parametersForJvmOverloads ?: declaration.valueParameters return if (jetIndex < paramList.size) paramList[jetIndex] else null } diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/elements/lightAnnotations.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/elements/lightAnnotations.kt index 6e7f2f5d842..7ab66dd878e 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/elements/lightAnnotations.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/elements/lightAnnotations.kt @@ -44,7 +44,6 @@ import org.jetbrains.kotlin.resolve.calls.callUtil.getType import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall import org.jetbrains.kotlin.resolve.calls.model.ResolvedValueArgument import org.jetbrains.kotlin.resolve.descriptorUtil.declaresOrInheritsDefaultValue -import org.jetbrains.kotlin.resolve.jvm.annotations.findJvmOverloadsAnnotation import org.jetbrains.kotlin.resolve.source.getPsi import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.TypeUtils @@ -260,7 +259,6 @@ class KtLightNullabilityAnnotation(val member: KtLightElement<*, PsiModifierList if (annotatedElement is KtParameter) { if (annotatedElement.containingClassOrObject?.isAnnotation() == true) return null - if (isNullableInJvmOverloads(annotatedElement)) return Nullable::class.java.name } // don't annotate property setters @@ -289,13 +287,6 @@ class KtLightNullabilityAnnotation(val member: KtLightElement<*, PsiModifierList } } - private fun isNullableInJvmOverloads(annotatedElement: KtParameter): Boolean { - if (annotatedElement.ownerFunction?.let { it.analyze()[BindingContext.DECLARATION_TO_DESCRIPTOR, it]?.findJvmOverloadsAnnotation() } == null) return false - val lightParameterList = (member as? PsiParameter)?.parent as? PsiParameterList ?: return false - val lastParameter = (lightParameterList.parameters.lastOrNull() as? KtLightElement<*, *>)?.kotlinOrigin - return lastParameter == annotatedElement - } - internal fun KtTypeReference.getType(): KotlinType? = analyze()[BindingContext.TYPE, this] private fun getTargetType(annotatedElement: PsiElement): KotlinType? { @@ -430,4 +421,4 @@ fun withAllowedAnnotationsClsDelegate(body: () -> T): T { } finally { accessAnnotationsClsDelegateIsAllowed = prev } -} \ No newline at end of file +} diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/elements/lightAnnotations.kt.173 b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/elements/lightAnnotations.kt.173 index eb480b1d294..9f5fc9197bc 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/elements/lightAnnotations.kt.173 +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/elements/lightAnnotations.kt.173 @@ -43,7 +43,6 @@ import org.jetbrains.kotlin.resolve.calls.callUtil.getType import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall import org.jetbrains.kotlin.resolve.calls.model.ResolvedValueArgument import org.jetbrains.kotlin.resolve.descriptorUtil.declaresOrInheritsDefaultValue -import org.jetbrains.kotlin.resolve.jvm.annotations.findJvmOverloadsAnnotation import org.jetbrains.kotlin.resolve.source.getPsi import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.TypeUtils @@ -261,7 +260,6 @@ class KtLightNullabilityAnnotation(val member: KtLightElement<*, PsiModifierList if (annotatedElement is KtParameter) { if (annotatedElement.containingClassOrObject?.isAnnotation() == true) return null - if (isNullableInJvmOverloads(annotatedElement)) return Nullable::class.java.name } // don't annotate property setters @@ -290,13 +288,6 @@ class KtLightNullabilityAnnotation(val member: KtLightElement<*, PsiModifierList } } - private fun isNullableInJvmOverloads(annotatedElement: KtParameter): Boolean { - if (annotatedElement.ownerFunction?.let { it.analyze()[BindingContext.DECLARATION_TO_DESCRIPTOR, it]?.findJvmOverloadsAnnotation() } == null) return false - val lightParameterList = (member as? PsiParameter)?.parent as? PsiParameterList ?: return false - val lastParameter = (lightParameterList.parameters.lastOrNull() as? KtLightElement<*, *>)?.kotlinOrigin - return lastParameter == annotatedElement - } - internal fun KtTypeReference.getType(): KotlinType? = analyze()[BindingContext.TYPE, this] private fun getTargetType(annotatedElement: PsiElement): KotlinType? { @@ -427,4 +418,4 @@ fun withAllowedAnnotationsClsDelegate(body: () -> T): T { } finally { accessAnnotationsClsDelegateIsAllowed = prev } -} \ No newline at end of file +} diff --git a/idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/JvmOverloadsFunctions.java b/idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/JvmOverloadsFunctions.java index 443bced84a2..e342a357bc7 100644 --- a/idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/JvmOverloadsFunctions.java +++ b/idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/JvmOverloadsFunctions.java @@ -9,5 +9,10 @@ class JvmOverloadsFunctions { foo(a.getClass(), a, true, "Some"); foo(a.getClass(), a, true); foo(a.getClass(), a); + + // Before KT-28556 is fixed the second not-nullable parameter wasn't marked as it shoud, so there were no warnings on it + foo(null, null, true, null); + foo(null, null, true); + foo(null, null); } } diff --git a/idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/JvmOverloadsFunctions.txt b/idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/JvmOverloadsFunctions.txt index fc3b677841d..5463d84eb5d 100644 --- a/idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/JvmOverloadsFunctions.txt +++ b/idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/JvmOverloadsFunctions.txt @@ -1 +1,2 @@ -// WITH_RUNTIME \ No newline at end of file +// WITH_RUNTIME +// TOOL: DataFlowInspection