diff --git a/java/java-impl-inspections/src/com/intellij/codeInspection/RecordCanBeClassInspection.java b/java/java-impl-inspections/src/com/intellij/codeInspection/RecordCanBeClassInspection.java index a845266a9bc8..31f86cd7913f 100644 --- a/java/java-impl-inspections/src/com/intellij/codeInspection/RecordCanBeClassInspection.java +++ b/java/java-impl-inspections/src/com/intellij/codeInspection/RecordCanBeClassInspection.java @@ -1,4 +1,4 @@ -// Copyright 2000-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. +// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package com.intellij.codeInspection; import com.intellij.codeInsight.daemon.impl.analysis.HighlightingFeature; @@ -21,20 +21,18 @@ public class RecordCanBeClassInspection extends AbstractBaseJavaLocalInspectionT if (InspectionProjectProfileManager.isInformationLevel(getShortName(), aClass)) { PsiElement brace = aClass.getLBrace(); if (brace != null) { - holder.registerProblem(aClass, TextRange.create(0, brace.getStartOffsetInParent() + brace.getTextLength()), - JavaBundle.message("inspection.message.record.can.be.converted.to.class"), - new ConvertRecordToClassFix(aClass)); + holder.problem(aClass, JavaBundle.message("inspection.message.record.can.be.converted.to.class")) + .range(TextRange.create(0, brace.getStartOffsetInParent() + brace.getTextLength())) + .fix(new ConvertRecordToClassFix(aClass)).register(); } else { - holder.registerProblem(aClass, JavaBundle.message("inspection.message.record.can.be.converted.to.class"), - new ConvertRecordToClassFix(aClass)); + holder.problem(aClass, JavaBundle.message("inspection.message.record.can.be.converted.to.class")).fix(new ConvertRecordToClassFix(aClass)).register(); } } else { PsiIdentifier identifier = aClass.getNameIdentifier(); if (identifier != null) { - holder.registerProblem(identifier, JavaBundle.message("inspection.message.record.can.be.converted.to.class"), - new ConvertRecordToClassFix(aClass)); + holder.problem(identifier, JavaBundle.message("inspection.message.record.can.be.converted.to.class")).fix(new ConvertRecordToClassFix(aClass)).register(); } } } diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/JavaErrorQuickFixProvider.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/JavaErrorQuickFixProvider.java index c0ba653d9797..74b86ff1ab5a 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/JavaErrorQuickFixProvider.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/JavaErrorQuickFixProvider.java @@ -8,7 +8,6 @@ import com.intellij.codeInsight.daemon.impl.quickfix.InsertMissingTokenFix; import com.intellij.codeInsight.daemon.impl.quickfix.QuickFixAction; import com.intellij.codeInsight.intention.IntentionAction; import com.intellij.codeInsight.intention.QuickFixFactory; -import com.intellij.codeInsight.intention.impl.PriorityIntentionActionWrapper; import com.intellij.codeInspection.ConvertRecordToClassFix; import com.intellij.core.JavaPsiBundle; import com.intellij.psi.*; @@ -45,8 +44,7 @@ public class JavaErrorQuickFixProvider implements ErrorQuickFixProvider { case PsiKeyword.RECORD -> { HighlightUtil.registerIncreaseLanguageLevelFixes(errorElement, HighlightingFeature.RECORDS, registrar); if (ConvertRecordToClassFix.tryMakeRecord(errorElement) != null) { - IntentionAction action = PriorityIntentionActionWrapper.lowPriority(new ConvertRecordToClassFix(errorElement)); - registrar.add(action); + registrar.add(new ConvertRecordToClassFix(errorElement).asIntention()); } } case PsiKeyword.SEALED -> HighlightUtil.registerIncreaseLanguageLevelFixes(errorElement, HighlightingFeature.SEALED_CLASSES, registrar); diff --git a/java/java-impl/src/com/intellij/codeInspection/ConvertRecordToClassFix.java b/java/java-impl/src/com/intellij/codeInspection/ConvertRecordToClassFix.java index 627ed913a4ec..8842caa8db71 100644 --- a/java/java-impl/src/com/intellij/codeInspection/ConvertRecordToClassFix.java +++ b/java/java-impl/src/com/intellij/codeInspection/ConvertRecordToClassFix.java @@ -1,18 +1,17 @@ -// Copyright 2000-2021 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. +// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package com.intellij.codeInspection; import com.intellij.codeInsight.AnnotationTargetUtil; import com.intellij.codeInsight.daemon.impl.analysis.HighlightingFeature; import com.intellij.codeInsight.intention.AddAnnotationPsiFix; +import com.intellij.codeInsight.intention.PriorityAction; import com.intellij.codeInsight.intention.impl.ConvertCompactConstructorToCanonicalAction; import com.intellij.codeInspection.util.IntentionFamilyName; -import com.intellij.codeInspection.util.IntentionName; import com.intellij.java.JavaBundle; import com.intellij.lang.java.JavaLanguage; import com.intellij.lang.java.parser.DeclarationParser; import com.intellij.lang.java.parser.JavaParser; import com.intellij.openapi.editor.Document; -import com.intellij.openapi.editor.Editor; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.TextRange; import com.intellij.pom.java.LanguageLevel; @@ -42,7 +41,7 @@ import java.util.Objects; import static com.intellij.psi.CommonClassNames.SERIAL_VERSION_UID_FIELD_NAME; -public class ConvertRecordToClassFix extends LocalQuickFixAndIntentionActionOnPsiElement { +public class ConvertRecordToClassFix extends PsiUpdateModCommandAction { private final LanguageLevel myLanguageLevel; public ConvertRecordToClassFix(@NotNull PsiElement candidate) { @@ -51,13 +50,14 @@ public class ConvertRecordToClassFix extends LocalQuickFixAndIntentionActionOnPs } @Override - public @IntentionFamilyName @NotNull String getFamilyName() { - return JavaBundle.message("intention.family.name.convert.record.to.class"); + protected @Nullable Presentation getPresentation(@NotNull ActionContext context, @NotNull PsiElement element) { + return Presentation.of(getFamilyName()) + .withPriority(PriorityAction.Priority.LOW); } @Override - public @IntentionName @NotNull String getText() { - return getFamilyName(); + public @IntentionFamilyName @NotNull String getFamilyName() { + return JavaBundle.message("intention.family.name.convert.record.to.class"); } @Nullable @@ -75,11 +75,7 @@ public class ConvertRecordToClassFix extends LocalQuickFixAndIntentionActionOnPs } @Override - public void invoke(@NotNull Project project, - @NotNull PsiFile file, - @Nullable Editor editor, - @NotNull PsiElement startElement, - @NotNull PsiElement endElement) { + protected void invoke(@NotNull ActionContext context, @NotNull PsiElement startElement, @NotNull EditorUpdater updater) { PsiClass recordClass; if (startElement instanceof PsiErrorElement) { recordClass = tryMakeRecord(startElement); @@ -92,6 +88,8 @@ public class ConvertRecordToClassFix extends LocalQuickFixAndIntentionActionOnPs JavaDummyElement dummyElement = new JavaDummyElement( recordClassText, builder -> JavaParser.INSTANCE.getDeclarationParser().parse(builder, DeclarationParser.Context.CLASS), LanguageLevel.JDK_16); + Project project = context.project(); + PsiFile file = startElement.getContainingFile(); DummyHolder holder = DummyHolderFactory.createHolder(file.getManager(), dummyElement, recordClass); PsiClass converted = (PsiClass)Objects.requireNonNull(SourceTreeToPsiMap.treeElementToPsi(holder.getTreeElement().getFirstChildNode())); postProcessAnnotations(recordClass, converted); @@ -294,7 +292,7 @@ public class ConvertRecordToClassFix extends LocalQuickFixAndIntentionActionOnPs private void insertMethods(StringBuilder result, PsiClass psiClass, PsiRecordComponent @NotNull [] components) { boolean hasEquals = false, hasHashCode = false, hasToString = false; for (PsiMethod method : psiClass.getMethods()) { - if (!method.isPhysical() && JavaPsiRecordUtil.getRecordComponentForAccessor(method) != null) { + if (method instanceof SyntheticElement && JavaPsiRecordUtil.getRecordComponentForAccessor(method) != null) { result.append(method.getText()).append("\n"); } hasEquals |= MethodUtils.isEquals(method); diff --git a/java/java-tests/testData/inspection/recordCanBeClass/afterAmbiguousAnnotations.java b/java/java-tests/testData/inspection/recordCanBeClass/afterAmbiguousAnnotations.java index 98dd79fb3c64..f5f6de21bd11 100644 --- a/java/java-tests/testData/inspection/recordCanBeClass/afterAmbiguousAnnotations.java +++ b/java/java-tests/testData/inspection/recordCanBeClass/afterAmbiguousAnnotations.java @@ -1,4 +1,4 @@ -// "Convert record to class" "true" +// "Convert record to class" "true-preview" import java.lang.annotation.*; import java.util.Objects; diff --git a/java/java-tests/testData/inspection/recordCanBeClass/afterAnnotations.java b/java/java-tests/testData/inspection/recordCanBeClass/afterAnnotations.java index 5551d4fa8241..3c35455be22f 100644 --- a/java/java-tests/testData/inspection/recordCanBeClass/afterAnnotations.java +++ b/java/java-tests/testData/inspection/recordCanBeClass/afterAnnotations.java @@ -1,4 +1,4 @@ -// "Convert record to class" "true" +// "Convert record to class" "true-preview" import java.lang.annotation.*; import java.util.Objects; diff --git a/java/java-tests/testData/inspection/recordCanBeClass/afterCanonicalConstructor.java b/java/java-tests/testData/inspection/recordCanBeClass/afterCanonicalConstructor.java index 2841c010f701..a6cc8784b3c4 100644 --- a/java/java-tests/testData/inspection/recordCanBeClass/afterCanonicalConstructor.java +++ b/java/java-tests/testData/inspection/recordCanBeClass/afterCanonicalConstructor.java @@ -1,6 +1,6 @@ import java.util.Objects; -// "Convert record to class" "true" +// "Convert record to class" "true-preview" final class Range implements Cloneable { private final int x; private final int y; diff --git a/java/java-tests/testData/inspection/recordCanBeClass/afterClassNameCollision.java b/java/java-tests/testData/inspection/recordCanBeClass/afterClassNameCollision.java index a40f98cd6fd8..c8d6696a59f0 100644 --- a/java/java-tests/testData/inspection/recordCanBeClass/afterClassNameCollision.java +++ b/java/java-tests/testData/inspection/recordCanBeClass/afterClassNameCollision.java @@ -1,4 +1,4 @@ -// "Convert record to class" "true" +// "Convert record to class" "true-preview" package com.example; interface Runnable {} diff --git a/java/java-tests/testData/inspection/recordCanBeClass/afterCompactConstructor.java b/java/java-tests/testData/inspection/recordCanBeClass/afterCompactConstructor.java index da6f96842d76..0198dc28f13b 100644 --- a/java/java-tests/testData/inspection/recordCanBeClass/afterCompactConstructor.java +++ b/java/java-tests/testData/inspection/recordCanBeClass/afterCompactConstructor.java @@ -1,6 +1,6 @@ import java.util.Objects; -// "Convert record to class" "true" +// "Convert record to class" "true-preview" final class Range { private final int x; private final int y; diff --git a/java/java-tests/testData/inspection/recordCanBeClass/afterCustomConstructor.java b/java/java-tests/testData/inspection/recordCanBeClass/afterCustomConstructor.java index 9d18b73fa00f..57b18c2cb12d 100644 --- a/java/java-tests/testData/inspection/recordCanBeClass/afterCustomConstructor.java +++ b/java/java-tests/testData/inspection/recordCanBeClass/afterCustomConstructor.java @@ -1,6 +1,6 @@ import java.util.Objects; -// "Convert record to class" "true" +// "Convert record to class" "true-preview" final class Range { static final Range ZERO = new Range(0); private final int x; diff --git a/java/java-tests/testData/inspection/recordCanBeClass/afterGeneric.java b/java/java-tests/testData/inspection/recordCanBeClass/afterGeneric.java index ca0282271697..86c1f1d3e6e7 100644 --- a/java/java-tests/testData/inspection/recordCanBeClass/afterGeneric.java +++ b/java/java-tests/testData/inspection/recordCanBeClass/afterGeneric.java @@ -1,6 +1,6 @@ import java.util.Objects; -// "Convert record to class" "true" +// "Convert record to class" "true-preview" final class R { private final T t; diff --git a/java/java-tests/testData/inspection/recordCanBeClass/afterIncomplete.java b/java/java-tests/testData/inspection/recordCanBeClass/afterIncomplete.java index 997f81f6c033..428200efb625 100644 --- a/java/java-tests/testData/inspection/recordCanBeClass/afterIncomplete.java +++ b/java/java-tests/testData/inspection/recordCanBeClass/afterIncomplete.java @@ -1,6 +1,6 @@ import java.util.Objects; -// "Convert record to class" "true" +// "Convert record to class" "true-preview" final class Rec { private final int x; private final int y; diff --git a/java/java-tests/testData/inspection/recordCanBeClass/afterInner.java b/java/java-tests/testData/inspection/recordCanBeClass/afterInner.java index d74767205db3..bb30bd4da2c2 100644 --- a/java/java-tests/testData/inspection/recordCanBeClass/afterInner.java +++ b/java/java-tests/testData/inspection/recordCanBeClass/afterInner.java @@ -1,4 +1,4 @@ -// "Convert record to class" "true" +// "Convert record to class" "true-preview" class X { private static final class R { private R() { diff --git a/java/java-tests/testData/inspection/recordCanBeClass/afterNoArg.java b/java/java-tests/testData/inspection/recordCanBeClass/afterNoArg.java index cab507206cb9..2ee21dddf854 100644 --- a/java/java-tests/testData/inspection/recordCanBeClass/afterNoArg.java +++ b/java/java-tests/testData/inspection/recordCanBeClass/afterNoArg.java @@ -1,4 +1,4 @@ -// "Convert record to class" "true" +// "Convert record to class" "true-preview" final class R { R() { } diff --git a/java/java-tests/testData/inspection/recordCanBeClass/afterNormal.java b/java/java-tests/testData/inspection/recordCanBeClass/afterNormal.java index d8e8f990832d..1efcdbd1729b 100644 --- a/java/java-tests/testData/inspection/recordCanBeClass/afterNormal.java +++ b/java/java-tests/testData/inspection/recordCanBeClass/afterNormal.java @@ -1,4 +1,4 @@ -// "Convert record to class" "true" +// "Convert record to class" "true-preview" import java.util.Objects; diff --git a/java/java-tests/testData/inspection/recordCanBeClass/beforeAmbiguousAnnotations.java b/java/java-tests/testData/inspection/recordCanBeClass/beforeAmbiguousAnnotations.java index 9b9307c2c313..b9f23a75d34a 100644 --- a/java/java-tests/testData/inspection/recordCanBeClass/beforeAmbiguousAnnotations.java +++ b/java/java-tests/testData/inspection/recordCanBeClass/beforeAmbiguousAnnotations.java @@ -1,4 +1,4 @@ -// "Convert record to class" "true" +// "Convert record to class" "true-preview" import java.lang.annotation.*; @Target({ElementType.PARAMETER, ElementType.METHOD, ElementType.FIELD, ElementType.TYPE_USE}) diff --git a/java/java-tests/testData/inspection/recordCanBeClass/beforeAnnotations.java b/java/java-tests/testData/inspection/recordCanBeClass/beforeAnnotations.java index 5f24b1837da2..5afd34d02cf5 100644 --- a/java/java-tests/testData/inspection/recordCanBeClass/beforeAnnotations.java +++ b/java/java-tests/testData/inspection/recordCanBeClass/beforeAnnotations.java @@ -1,4 +1,4 @@ -// "Convert record to class" "true" +// "Convert record to class" "true-preview" import java.lang.annotation.*; @Target(ElementType.FIELD) diff --git a/java/java-tests/testData/inspection/recordCanBeClass/beforeCanonicalConstructor.java b/java/java-tests/testData/inspection/recordCanBeClass/beforeCanonicalConstructor.java index 45b70968febc..3e182c97db5f 100644 --- a/java/java-tests/testData/inspection/recordCanBeClass/beforeCanonicalConstructor.java +++ b/java/java-tests/testData/inspection/recordCanBeClass/beforeCanonicalConstructor.java @@ -1,4 +1,4 @@ -// "Convert record to class" "true" +// "Convert record to class" "true-preview" record Range(int x, int y) implements Cloneable { Range(int x, int y) { if (x > y) { diff --git a/java/java-tests/testData/inspection/recordCanBeClass/beforeClassNameCollision.java b/java/java-tests/testData/inspection/recordCanBeClass/beforeClassNameCollision.java index 7cef1b16fcfc..2b036f2931fe 100644 --- a/java/java-tests/testData/inspection/recordCanBeClass/beforeClassNameCollision.java +++ b/java/java-tests/testData/inspection/recordCanBeClass/beforeClassNameCollision.java @@ -1,4 +1,4 @@ -// "Convert record to class" "true" +// "Convert record to class" "true-preview" package com.example; interface Runnable {} diff --git a/java/java-tests/testData/inspection/recordCanBeClass/beforeCompactConstructor.java b/java/java-tests/testData/inspection/recordCanBeClass/beforeCompactConstructor.java index 544234bbee7a..1e1687ef1091 100644 --- a/java/java-tests/testData/inspection/recordCanBeClass/beforeCompactConstructor.java +++ b/java/java-tests/testData/inspection/recordCanBeClass/beforeCompactConstructor.java @@ -1,4 +1,4 @@ -// "Convert record to class" "true" +// "Convert record to class" "true-preview" record Range(int x, int y) { /** * Checks invariant diff --git a/java/java-tests/testData/inspection/recordCanBeClass/beforeCustomConstructor.java b/java/java-tests/testData/inspection/recordCanBeClass/beforeCustomConstructor.java index af3bb0a74a8e..1922e86a928e 100644 --- a/java/java-tests/testData/inspection/recordCanBeClass/beforeCustomConstructor.java +++ b/java/java-tests/testData/inspection/recordCanBeClass/beforeCustomConstructor.java @@ -1,4 +1,4 @@ -// "Convert record to class" "true" +// "Convert record to class" "true-preview" record Range(int x, int y) { static final Range ZERO = new Range(0); diff --git a/java/java-tests/testData/inspection/recordCanBeClass/beforeGeneric.java b/java/java-tests/testData/inspection/recordCanBeClass/beforeGeneric.java index 3a9fd6409709..5cc14e7abea1 100644 --- a/java/java-tests/testData/inspection/recordCanBeClass/beforeGeneric.java +++ b/java/java-tests/testData/inspection/recordCanBeClass/beforeGeneric.java @@ -1,2 +1,2 @@ -// "Convert record to class" "true" +// "Convert record to class" "true-preview" final record R(T t) {} \ No newline at end of file diff --git a/java/java-tests/testData/inspection/recordCanBeClass/beforeIncomplete.java b/java/java-tests/testData/inspection/recordCanBeClass/beforeIncomplete.java index b39f82b54640..f5bcc4ff43b9 100644 --- a/java/java-tests/testData/inspection/recordCanBeClass/beforeIncomplete.java +++ b/java/java-tests/testData/inspection/recordCanBeClass/beforeIncomplete.java @@ -1,2 +1,2 @@ -// "Convert record to class" "true" +// "Convert record to class" "true-preview" record Rec(int x, int y \ No newline at end of file diff --git a/java/java-tests/testData/inspection/recordCanBeClass/beforeInner.java b/java/java-tests/testData/inspection/recordCanBeClass/beforeInner.java index 0643692d0130..83690faa51d7 100644 --- a/java/java-tests/testData/inspection/recordCanBeClass/beforeInner.java +++ b/java/java-tests/testData/inspection/recordCanBeClass/beforeInner.java @@ -1,4 +1,4 @@ -// "Convert record to class" "true" +// "Convert record to class" "true-preview" class X { private record R() {} } \ No newline at end of file diff --git a/java/java-tests/testData/inspection/recordCanBeClass/beforeNoArg.java b/java/java-tests/testData/inspection/recordCanBeClass/beforeNoArg.java index f45dfbc140aa..55e8e13ccfae 100644 --- a/java/java-tests/testData/inspection/recordCanBeClass/beforeNoArg.java +++ b/java/java-tests/testData/inspection/recordCanBeClass/beforeNoArg.java @@ -1,2 +1,2 @@ -// "Convert record to class" "true" +// "Convert record to class" "true-preview" record R() {} \ No newline at end of file diff --git a/java/java-tests/testData/inspection/recordCanBeClass/beforeNormal.java b/java/java-tests/testData/inspection/recordCanBeClass/beforeNormal.java index 42b92ae7f533..9e31246ecb21 100644 --- a/java/java-tests/testData/inspection/recordCanBeClass/beforeNormal.java +++ b/java/java-tests/testData/inspection/recordCanBeClass/beforeNormal.java @@ -1,4 +1,4 @@ -// "Convert record to class" "true" +// "Convert record to class" "true-preview" /** * Cool record. diff --git a/java/java-tests/testData/inspection/recordCanBeClass8/afterNonPublic.java b/java/java-tests/testData/inspection/recordCanBeClass8/afterNonPublic.java index f6389202fe56..aff5a6261ac2 100644 --- a/java/java-tests/testData/inspection/recordCanBeClass8/afterNonPublic.java +++ b/java/java-tests/testData/inspection/recordCanBeClass8/afterNonPublic.java @@ -1,6 +1,6 @@ import java.util.Objects; -// "Convert record to class" "true" +// "Convert record to class" "true-preview" final class Point { private final double x; private final double y; diff --git a/java/java-tests/testData/inspection/recordCanBeClass8/afterSimple.java b/java/java-tests/testData/inspection/recordCanBeClass8/afterSimple.java index 1a0cc10216d7..00cfc6bab2a7 100644 --- a/java/java-tests/testData/inspection/recordCanBeClass8/afterSimple.java +++ b/java/java-tests/testData/inspection/recordCanBeClass8/afterSimple.java @@ -1,6 +1,6 @@ import java.util.Objects; -// "Convert record to class" "true" +// "Convert record to class" "true-preview" public final class Point { private final int x; private final int y; diff --git a/java/java-tests/testData/inspection/recordCanBeClass8/beforeNonPublic.java b/java/java-tests/testData/inspection/recordCanBeClass8/beforeNonPublic.java index f10e766fd572..c39343f9ad8e 100644 --- a/java/java-tests/testData/inspection/recordCanBeClass8/beforeNonPublic.java +++ b/java/java-tests/testData/inspection/recordCanBeClass8/beforeNonPublic.java @@ -1,4 +1,4 @@ -// "Convert record to class" "true" +// "Convert record to class" "true-preview" record Point(double x, double y) { void foo() {} } \ No newline at end of file diff --git a/java/java-tests/testData/inspection/recordCanBeClass8/beforeSimple.java b/java/java-tests/testData/inspection/recordCanBeClass8/beforeSimple.java index ab7c1fc8c138..f8183fa14ace 100644 --- a/java/java-tests/testData/inspection/recordCanBeClass8/beforeSimple.java +++ b/java/java-tests/testData/inspection/recordCanBeClass8/beforeSimple.java @@ -1,2 +1,2 @@ -// "Convert record to class" "true" +// "Convert record to class" "true-preview" public record Point(int x, int y) {} \ No newline at end of file