[java] IDEA-216276 Provide fix for "method is already defined in"

For each "method is already defined in" error, a quick fix is added with "Navigate to duplicate method" text. In case of many duplicates, quick fix navigates to the topmost one.

Merge-request: IJ-MR-170181
Merged-by: Marcin Mikosik <marcin.mikosik@jetbrains.com>

GitOrigin-RevId: d609be3a3e4526bed37471f814d2e675cbd0d2a6
This commit is contained in:
Marcin Mikosik
2025-07-31 11:45:47 +00:00
committed by intellij-monorepo-bot
parent e5a45550c6
commit 787051b0be
16 changed files with 128 additions and 5 deletions
@@ -527,7 +527,7 @@ final class MethodChecker {
MethodSignature methodSignature = method.getSignature(PsiSubstitutor.EMPTY);
List<PsiMethod> methods = (List<PsiMethod>)duplicateMethods.get(methodSignature);
if (methods.size() > 1) {
myVisitor.report(JavaErrorKinds.METHOD_DUPLICATE.create(method));
myVisitor.report(JavaErrorKinds.METHOD_DUPLICATE.create(method, new JavaErrorKinds.DuplicateMethodsContext(methods)));
}
}
@@ -640,11 +640,11 @@ public final class JavaErrorKinds {
owner.getTypeParameters().length));
public static final Simple<PsiTypeElement> TYPE_PARAMETER_ACTUAL_INFERRED_MISMATCH = error("type.parameter.actual.inferred.mismatch");
public static final Simple<PsiMethod> METHOD_DUPLICATE =
error(PsiMethod.class, "method.duplicate")
.withRange(JavaErrorFormatUtil::getMethodDeclarationTextRange)
public static final Parameterized<PsiMethod, DuplicateMethodsContext> METHOD_DUPLICATE =
parameterized(PsiMethod.class, DuplicateMethodsContext.class, "method.duplicate")
.withRange((method, duplicates) -> getMethodDeclarationTextRange(method))
.withDescription(
method -> message("method.duplicate", formatMethod(method), formatClass(requireNonNull(method.getContainingClass()))));
(method, duplicates) -> message("method.duplicate", formatMethod(method), formatClass(requireNonNull(method.getContainingClass()))));
public static final Simple<PsiMethod> METHOD_NO_PARAMETER_LIST =
error(PsiMethod.class, "method.no.parameter.list").withAnchor(PsiMethod::getNameIdentifier);
public static final Simple<PsiJavaCodeReferenceElement> METHOD_THROWS_CLASS_NAME_EXPECTED =
@@ -1775,4 +1775,6 @@ public final class JavaErrorKinds {
public record DeconstructionCountMismatchContext(@NotNull PsiPattern @NotNull [] patternComponents,
@NotNull PsiRecordComponent @NotNull [] recordComponents,
boolean hasMismatch) {}
public record DuplicateMethodsContext(@NotNull List<@NotNull PsiMethod> methods) {}
}