IDEA-367007 Exclude static methods from @OverrideOnly

GitOrigin-RevId: 0f67f91edf0558fcab0be98927e0828872ec21d4
This commit is contained in:
Johannes Spangenberg
2025-02-10 19:10:02 +01:00
committed by intellij-monorepo-bot
parent 6079d98ecf
commit 6c7da7b25a
13 changed files with 78 additions and 2 deletions

View File

@@ -9,6 +9,7 @@ import com.intellij.openapi.roots.ProjectFileIndex
import com.intellij.psi.PsiElement
import com.intellij.psi.PsiElementVisitor
import com.intellij.psi.PsiMethod
import com.intellij.psi.PsiModifier
import com.intellij.psi.PsiModifierListOwner
import com.intellij.psi.util.MethodSignatureUtil
import com.intellij.psi.util.PsiUtilCore
@@ -44,7 +45,8 @@ class OverrideOnlyInspection : LocalInspectionTool() {
}
private fun isOverrideOnlyMethod(method: PsiMethod) =
method.hasAnnotation(ANNOTATION_NAME) || method.containingClass?.hasAnnotation(ANNOTATION_NAME) == true
method.hasAnnotation(ANNOTATION_NAME) ||
!method.hasModifierProperty(PsiModifier.STATIC) && method.containingClass?.hasAnnotation(ANNOTATION_NAME) == true
private fun isInsideOverridenOnlyMethod(sourceNode: UElement, target: PsiMethod): Boolean = sourceNode.getContainingUMethod()?.let {
val psiMethod = it.javaPsi as? PsiMethod ?: return false

View File

@@ -32,6 +32,12 @@ class Invoker {
javaInterfaceOverrideOnly.<warning descr="Method 'implementOnlyMethod()' can only be overridden">implementOnlyMethod</warning>();
kotlinClassOverrideOnly.<warning descr="Method 'overrideOnlyMethod()' can only be overridden">overrideOnlyMethod</warning>();
kotlinInterfaceOverrideOnly.<warning descr="Method 'implementOnlyMethod()' can only be overridden">implementOnlyMethod</warning>();
//No warning
JavaClassOverrideOnly.staticMethod();
JavaInterfaceOverrideOnly.staticMethod();
KotlinClassOverrideOnly.staticMethod();
KotlinInterfaceOverrideOnly.staticMethod();
}
public void methodReferences() {
@@ -44,6 +50,12 @@ class Invoker {
Consumer<JavaInterfaceOverrideOnly> b1 = JavaInterfaceOverrideOnly::<warning descr="Method 'implementOnlyMethod()' can only be overridden">implementOnlyMethod</warning>;
Consumer<KotlinClassOverrideOnly> c1 = KotlinClassOverrideOnly::<warning descr="Method 'overrideOnlyMethod()' can only be overridden">overrideOnlyMethod</warning>;
Consumer<KotlinInterfaceOverrideOnly> d1 = KotlinInterfaceOverrideOnly::<warning descr="Method 'implementOnlyMethod()' can only be overridden">implementOnlyMethod</warning>;
//No warning
Runnable a2 = JavaClassOverrideOnly::staticMethod;
Runnable b2 = JavaInterfaceOverrideOnly::staticMethod;
Runnable c2 = KotlinClassOverrideOnly::staticMethod;
Runnable d2 = KotlinInterfaceOverrideOnly::staticMethod;
}
}
@@ -101,4 +113,4 @@ class KotlinImplementorOverrideOnly implements KotlinInterfaceOverrideOnly {
@Override
public void implementOnlyMethod() {
}
}
}

View File

@@ -30,6 +30,12 @@ class Invoker {
javaInterfaceOverrideOnly.<warning descr="Method 'implementOnlyMethod()' can only be overridden">implementOnlyMethod</warning>()
kotlinClassOverrideOnly.<warning descr="Method 'overrideOnlyMethod()' can only be overridden">overrideOnlyMethod</warning>()
kotlinInterfaceOverrideOnly.<warning descr="Method 'implementOnlyMethod()' can only be overridden">implementOnlyMethod</warning>()
//No warning
JavaClassOverrideOnly.staticMethod()
JavaInterfaceOverrideOnly.staticMethod()
KotlinClassOverrideOnly.staticMethod()
KotlinInterfaceOverrideOnly.staticMethod()
}
@Suppress("UNUSED_VARIABLE")
@@ -45,6 +51,12 @@ class Invoker {
val c1 = KotlinClassOverrideOnly::<warning descr="Method 'overrideOnlyMethod()' can only be overridden">overrideOnlyMethod</warning>
val d1 = KotlinInterfaceOverrideOnly::<warning descr="Method 'implementOnlyMethod()' can only be overridden">implementOnlyMethod</warning>
//No warning
val a2 = JavaClassOverrideOnly::staticMethod
val b2 = JavaInterfaceOverrideOnly::staticMethod
val c2 = KotlinClassOverrideOnly.Companion::staticMethod
val d2 = KotlinInterfaceOverrideOnly.Companion::staticMethod
}
}

View File

@@ -0,0 +1,11 @@
package library;
import org.jetbrains.annotations.ApiStatus.OverrideOnly;
@OverrideOnly
public abstract class JavaClassOverrideOnly {
public abstract void overrideOnlyMethod();
public static void staticMethod() {}
}

View File

@@ -0,0 +1,11 @@
package library;
import org.jetbrains.annotations.ApiStatus.OverrideOnly;
@OverrideOnly
public interface JavaInterfaceOverrideOnly {
void implementOnlyMethod();
static void staticMethod() {}
}

View File

@@ -0,0 +1,14 @@
package library
import org.jetbrains.annotations.ApiStatus.OverrideOnly
@OverrideOnly
abstract class KotlinClassOverrideOnly {
abstract fun overrideOnlyMethod(): Unit
companion object {
@JvmStatic
fun staticMethod() {}
}
}

View File

@@ -0,0 +1,14 @@
package library
import org.jetbrains.annotations.ApiStatus.OverrideOnly
@OverrideOnly
interface KotlinInterfaceOverrideOnly {
fun implementOnlyMethod(): Unit
companion object {
@JvmStatic
fun staticMethod() {}
}
}