From 2496d8598b89772a8b054cb547617d92e85e30e0 Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Thu, 25 Jun 2020 22:23:03 +0700 Subject: [PATCH] Add @Override annotation to explicit record getters (IDEA-244562) GitOrigin-RevId: d5c1775ef64f4d59970e72cd0ab284ffabc98ce5 --- .../generation/GenerateMembersUtil.java | 6 ++++ .../intellij/psi/util/JavaPsiRecordUtil.java | 8 ++++++ .../GenerateGetterSetterTest.groovy | 28 +++++++++++++++++++ 3 files changed, 42 insertions(+) diff --git a/java/java-impl/src/com/intellij/codeInsight/generation/GenerateMembersUtil.java b/java/java-impl/src/com/intellij/codeInsight/generation/GenerateMembersUtil.java index cfc198871fbe..746948131016 100644 --- a/java/java-impl/src/com/intellij/codeInsight/generation/GenerateMembersUtil.java +++ b/java/java-impl/src/com/intellij/codeInsight/generation/GenerateMembersUtil.java @@ -15,6 +15,7 @@ import com.intellij.openapi.editor.ScrollType; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Comparing; import com.intellij.openapi.util.text.StringUtil; +import com.intellij.pom.java.LanguageLevel; import com.intellij.psi.*; import com.intellij.psi.codeStyle.*; import com.intellij.psi.impl.light.LightTypeElement; @@ -777,6 +778,11 @@ public class GenerateMembersUtil { if (superMethod != null && superMethod.getContainingClass() != targetClass && PsiUtil.isAccessible(superMethod, targetClass, null)) { OverrideImplementUtil.annotateOnOverrideImplement(generated, targetClass, superMethod, true); } + if (JavaPsiRecordUtil.getRecordComponentForAccessor(generated) != null && + PsiUtil.getLanguageLevel(targetClass) != LanguageLevel.JDK_14_PREVIEW) { + AddAnnotationPsiFix + .addPhysicalAnnotationIfAbsent(CommonClassNames.JAVA_LANG_OVERRIDE, PsiNameValuePair.EMPTY_ARRAY, generated.getModifierList()); + } } return generated; } diff --git a/java/java-psi-impl/src/com/intellij/psi/util/JavaPsiRecordUtil.java b/java/java-psi-impl/src/com/intellij/psi/util/JavaPsiRecordUtil.java index 991db706dc6b..8df2b912f4a7 100644 --- a/java/java-psi-impl/src/com/intellij/psi/util/JavaPsiRecordUtil.java +++ b/java/java-psi-impl/src/com/intellij/psi/util/JavaPsiRecordUtil.java @@ -3,6 +3,8 @@ package com.intellij.psi.util; import com.intellij.psi.*; import com.intellij.psi.impl.light.LightRecordField; +import com.intellij.psi.impl.source.DummyHolder; +import com.intellij.util.ObjectUtils; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -18,6 +20,12 @@ public class JavaPsiRecordUtil { @Nullable public static PsiRecordComponent getRecordComponentForAccessor(@NotNull PsiMethod accessor) { PsiClass aClass = accessor.getContainingClass(); + if (aClass == null) { + PsiElement parent = accessor.getParent(); + if (parent instanceof DummyHolder) { + aClass = ObjectUtils.tryCast(parent.getContext(), PsiClass.class); + } + } if (aClass == null || !aClass.isRecord()) return null; if (!accessor.getParameterList().isEmpty()) return null; String name = accessor.getName(); diff --git a/java/java-tests/testSrc/com/intellij/java/codeInsight/GenerateGetterSetterTest.groovy b/java/java-tests/testSrc/com/intellij/java/codeInsight/GenerateGetterSetterTest.groovy index bc90b9552a70..8b1595dfcbe3 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInsight/GenerateGetterSetterTest.groovy +++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/GenerateGetterSetterTest.groovy @@ -8,6 +8,7 @@ import com.intellij.codeInsight.generation.SetterTemplatesManager import com.intellij.openapi.editor.Editor import com.intellij.openapi.project.Project import com.intellij.psi.codeStyle.JavaCodeStyleSettings +import com.intellij.testFramework.LightProjectDescriptor import com.intellij.testFramework.fixtures.LightJavaCodeInsightFixtureTestCase import com.intellij.util.ui.UIUtil import com.siyeh.ig.style.UnqualifiedFieldAccessInspection @@ -251,6 +252,28 @@ class Foo { void foo() {} }''' } + + void "test record accessor"() { + myFixture.configureByText('a.java', ''' +record Point(int x, int y) { + +} +''') + generateGetter() + myFixture.checkResult(''' +record Point(int x, int y) { + @Override + public int x() { + return x; + } + + @Override + public int y() { + return y; + } +} +''') + } private void generateSetter() { new GenerateSetterHandler() { @@ -266,4 +289,9 @@ class Foo { }.invoke(project, myFixture.editor, myFixture.file) UIUtil.dispatchAllInvocationEvents() } + + @Override + protected LightProjectDescriptor getProjectDescriptor() { + return JAVA_15 + } }