diff --git a/java/java-analysis-api/src/com/intellij/codeInsight/intention/QuickFixFactory.java b/java/java-analysis-api/src/com/intellij/codeInsight/intention/QuickFixFactory.java index 93e2d2fd3368..7658c5c20045 100644 --- a/java/java-analysis-api/src/com/intellij/codeInsight/intention/QuickFixFactory.java +++ b/java/java-analysis-api/src/com/intellij/codeInsight/intention/QuickFixFactory.java @@ -483,4 +483,7 @@ public abstract class QuickFixFactory { @NotNull public abstract IntentionAction createAddParameterListFix(PsiMethod method); + + @NotNull + public abstract IntentionAction createAddEmptyRecordHeaderFix(PsiClass record); } \ No newline at end of file diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightClassUtil.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightClassUtil.java index 4cf9a107def6..19cfde5ec5d6 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightClassUtil.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightClassUtil.java @@ -890,8 +890,10 @@ public class HighlightClassUtil { PsiIdentifier identifier = psiClass.getNameIdentifier(); if (identifier == null) return null; if (header == null) { - return HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).range(identifier) + HighlightInfo info = HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).range(identifier) .descriptionAndTooltip(JavaErrorMessages.message("record.no.header")).create(); + QuickFixAction.registerQuickFixAction(info, QUICK_FIX_FACTORY.createAddEmptyRecordHeaderFix(psiClass)); + return info; } return null; } diff --git a/java/java-analysis-impl/src/messages/QuickFixBundle.properties b/java/java-analysis-impl/src/messages/QuickFixBundle.properties index 134044b4f00b..42c67b2df974 100644 --- a/java/java-analysis-impl/src/messages/QuickFixBundle.properties +++ b/java/java-analysis-impl/src/messages/QuickFixBundle.properties @@ -361,4 +361,6 @@ convert.variable.to.field.in.anonymous.class.fix.name=Move ''{0}'' into anonymou change.method.parameters.text=Change method parameters to ''{0}'' change.method.parameters.family=Change method parameters -add.default.branch.to.variable.initializing.switch.fix.name=Add ''default'' branch to the ''switch'' statement which initializes ''{0}'' \ No newline at end of file +add.default.branch.to.variable.initializing.switch.fix.name=Add ''default'' branch to the ''switch'' statement which initializes ''{0}'' + +add.empty.record.header=Insert '()' \ No newline at end of file diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/AddEmptyRecordHeaderFix.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/AddEmptyRecordHeaderFix.java new file mode 100644 index 000000000000..bd234c85c6b7 --- /dev/null +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/AddEmptyRecordHeaderFix.java @@ -0,0 +1,53 @@ +// Copyright 2000-2019 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. +package com.intellij.codeInsight.daemon.impl.quickfix; + +import com.intellij.codeInsight.daemon.QuickFixBundle; +import com.intellij.codeInspection.LocalQuickFixAndIntentionActionOnPsiElement; +import com.intellij.lang.java.JavaLanguage; +import com.intellij.openapi.editor.Editor; +import com.intellij.openapi.project.Project; +import com.intellij.psi.*; +import org.jetbrains.annotations.Nls; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public class AddEmptyRecordHeaderFix extends LocalQuickFixAndIntentionActionOnPsiElement { + private final SmartPsiElementPointer myRecordPointer; + + public AddEmptyRecordHeaderFix(@NotNull PsiClass record) { + super(record); + this.myRecordPointer = SmartPointerManager.createPointer(record); + } + + @Override + public void invoke(@NotNull Project project, + @NotNull PsiFile file, + @Nullable Editor editor, + @NotNull PsiElement startElement, + @NotNull PsiElement endElement) { + PsiClass record = myRecordPointer.dereference(); + if (record == null || !record.isRecord() || record.getRecordHeader() != null) return; + PsiTypeParameterList typeParameterList = record.getTypeParameterList(); + if (typeParameterList == null) return; + record.addAfter(createEmptyRecordHeader(project), typeParameterList); + } + + private static PsiRecordHeader createEmptyRecordHeader(Project project) { + PsiJavaFile file = (PsiJavaFile)PsiFileFactory.getInstance(project).createFileFromText(JavaLanguage.INSTANCE, "record __DUMMY(){}"); + return file.getClasses()[0].getRecordHeader(); + } + + @Nls(capitalization = Nls.Capitalization.Sentence) + @NotNull + @Override + public String getText() { + return getFamilyName(); + } + + @Nls(capitalization = Nls.Capitalization.Sentence) + @NotNull + @Override + public String getFamilyName() { + return QuickFixBundle.message("add.empty.record.header"); + } +} diff --git a/java/java-impl/src/com/intellij/codeInsight/intention/impl/config/QuickFixFactoryImpl.java b/java/java-impl/src/com/intellij/codeInsight/intention/impl/config/QuickFixFactoryImpl.java index 1ecaaa663083..81e92a2118aa 100644 --- a/java/java-impl/src/com/intellij/codeInsight/intention/impl/config/QuickFixFactoryImpl.java +++ b/java/java-impl/src/com/intellij/codeInsight/intention/impl/config/QuickFixFactoryImpl.java @@ -913,4 +913,10 @@ public class QuickFixFactoryImpl extends QuickFixFactory { public IntentionAction createAddParameterListFix(PsiMethod method) { return new AddParameterListFix(method); } + + @NotNull + @Override + public IntentionAction createAddEmptyRecordHeaderFix(PsiClass psiClass) { + return new AddEmptyRecordHeaderFix(psiClass); + } } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addEmptyRecordHeader/afterNoHeader.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addEmptyRecordHeader/afterNoHeader.java new file mode 100644 index 000000000000..d25914f0eddd --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addEmptyRecordHeader/afterNoHeader.java @@ -0,0 +1,3 @@ +// "Insert '()'" "true" + +record A() {} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addEmptyRecordHeader/beforeNoHeader.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addEmptyRecordHeader/beforeNoHeader.java new file mode 100644 index 000000000000..a49b65c683f0 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addEmptyRecordHeader/beforeNoHeader.java @@ -0,0 +1,3 @@ +// "Insert '()'" "true" + +record A {} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/quickFix/AddEmptyRecordHeaderTest.java b/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/quickFix/AddEmptyRecordHeaderTest.java new file mode 100644 index 000000000000..cd8a640c4328 --- /dev/null +++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/quickFix/AddEmptyRecordHeaderTest.java @@ -0,0 +1,20 @@ +// Copyright 2000-2018 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. +package com.intellij.java.codeInsight.daemon.quickFix; + +import com.intellij.codeInsight.daemon.quickFix.LightQuickFixParameterizedTestCase; +import com.intellij.testFramework.LightProjectDescriptor; +import com.intellij.testFramework.fixtures.LightJavaCodeInsightFixtureTestCase; +import org.jetbrains.annotations.NotNull; + +public class AddEmptyRecordHeaderTest extends LightQuickFixParameterizedTestCase { + @NotNull + @Override + protected LightProjectDescriptor getProjectDescriptor() { + return LightJavaCodeInsightFixtureTestCase.JAVA_14; + } + + @Override + protected String getBasePath() { + return "/codeInsight/daemonCodeAnalyzer/quickFix/addEmptyRecordHeader"; + } +}