[jvm] Don't warn about overrides in future Java versions

#IDEA-385156 Fixed

GitOrigin-RevId: 598ef1b8b7b1c9a8fe58849792674e0ecc9315d5
This commit is contained in:
Bart van Helvert
2026-02-10 22:28:06 +01:00
committed by intellij-monorepo-bot
parent eed4b1e9d9
commit 4668554949
4 changed files with 66 additions and 1 deletions

View File

@@ -148,7 +148,7 @@ class JavaApiUsageInspection : AbstractBaseUastLocalInspectionTool() {
private fun processMethodOverriding(method: UMethod, overriddenMethods: Array<PsiMethod>) {
val overrideAnnotation = method.findAnnotation(CommonClassNames.JAVA_LANG_OVERRIDE)
val hasOverrideModifier = overrideModifierLanguages.any { method.sourcePsi?.language != Language.findLanguageByID(it) }
val hasOverrideModifier = overrideModifierLanguages.contains(method.sourcePsi?.language?.id)
if (overrideAnnotation == null && !hasOverrideModifier) return
val sourcePsi = method.sourcePsi ?: return
val module = ModuleUtilCore.findModuleForPsiElement(sourcePsi) ?: return

View File

@@ -386,4 +386,23 @@ class JavaJavaApiUsageInspectionTest : JavaApiUsageInspectionTestBase() {
}
""".trimIndent())
}
fun `test method that will be overridden in a future Java version`() {
myFixture.setLanguageLevel(LanguageLevel.JDK_1_7)
myFixture.testHighlighting(JvmLanguage.JAVA, """
import java.util.Comparator;
class MyComparator implements Comparator<String> {
@Override
public int compare(String o1, String o2) {
return 0;
}
// this method is introduced in Java 8
public Comparator<String> reversed() {
return this;
}
}
""")
}
}

View File

@@ -1,7 +1,30 @@
package com.intellij.codeInspection.tests.kotlin
import com.intellij.jvm.analysis.testFramework.JvmLanguage
import com.intellij.pom.java.LanguageLevel
import org.jetbrains.kotlin.idea.base.plugin.KotlinPluginMode
class K1JavaApiUsageInspectionTest : KotlinJavaApiUsageInspectionTest() {
override val pluginMode: KotlinPluginMode get() = KotlinPluginMode.K1
fun `test method that will be overridden in a future Java version`() {
myFixture.setLanguageLevel(LanguageLevel.JDK_1_7)
// The reversed method declaration is erroneous because there is a missing `override`
// In Java, such code would be fine because overrides are implicit
myFixture.testHighlighting(JvmLanguage.KOTLIN, """
import java.util.Comparator
class MyComparator : Comparator<String> {
override fun compare(p0: String, p1: String): Int {
return 0
}
fun <error descr="Usage of API documented as @since 1.8+"><error descr="[VIRTUAL_MEMBER_HIDDEN] 'reversed' hides member of supertype 'Comparator' and needs 'override' modifier">reversed</error></error>(): Comparator<String> {
return this
}
}
""")
}
}

View File

@@ -1,7 +1,30 @@
package com.intellij.codeInspection.tests.kotlin
import com.intellij.jvm.analysis.testFramework.JvmLanguage
import com.intellij.pom.java.LanguageLevel
import org.jetbrains.kotlin.idea.base.plugin.KotlinPluginMode
class K2JavaApiUsageInspectionTest : KotlinJavaApiUsageInspectionTest() {
override val pluginMode: KotlinPluginMode get() = KotlinPluginMode.K2
fun `test method that will be overridden in a future Java version`() {
myFixture.setLanguageLevel(LanguageLevel.JDK_1_7)
// The reversed method declaration is erroneous because there is a missing `override`
// In Java, such code would be fine because overrides are implicit
myFixture.testHighlighting(JvmLanguage.KOTLIN, """
import java.util.Comparator
class MyComparator : Comparator<String> {
override fun compare(p0: String, p1: String): Int {
return 0
}
fun <error descr="Usage of API documented as @since 1.8+"><error descr="[VIRTUAL_MEMBER_HIDDEN] 'reversed' hides member of supertype 'Comparator' and needs an 'override' modifier.">reversed</error></error>(): Comparator<String> {
return this
}
}
""")
}
}