From f4993e6f99843a11592df4ae4bb8918d694c2ecd Mon Sep 17 00:00:00 2001 From: Dmitry Batkovich Date: Mon, 13 Mar 2017 13:24:58 +0300 Subject: [PATCH] field initialization fix: add body for incomplete constructor --- .../InitializeFinalFieldInConstructorFix.java | 21 ++++++++++++------- .../afterIncompleteConstructor.java | 8 +++++++ .../beforeIncompleteConstructor.java | 6 ++++++ 3 files changed, 27 insertions(+), 8 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/initializeFinalFieldInConstructor/afterIncompleteConstructor.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/initializeFinalFieldInConstructor/beforeIncompleteConstructor.java diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/InitializeFinalFieldInConstructorFix.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/InitializeFinalFieldInConstructorFix.java index f99520fcac2f..c91d8e8752ea 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/InitializeFinalFieldInConstructorFix.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/InitializeFinalFieldInConstructorFix.java @@ -22,6 +22,7 @@ import com.intellij.codeInsight.intention.IntentionAction; import com.intellij.codeInsight.lookup.LookupElement; import com.intellij.ide.util.MemberChooser; import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.project.Project; import com.intellij.psi.*; @@ -31,6 +32,7 @@ import com.intellij.psi.search.searches.ReferencesSearch; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.util.PsiUtil; import com.intellij.util.IncorrectOperationException; +import com.intellij.util.ObjectUtils; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -40,6 +42,7 @@ import java.util.Collections; import java.util.List; public class InitializeFinalFieldInConstructorFix implements IntentionAction { + private static final Logger LOG = Logger.getInstance(InitializeFinalFieldInConstructorFix.class); private final PsiField myField; public InitializeFinalFieldInConstructorFix(@NotNull PsiField field) { @@ -96,25 +99,27 @@ public class InitializeFinalFieldInConstructorFix implements IntentionAction { @Nullable Editor editor) { if (constructors.isEmpty()) return; - final List rExpressions = new ArrayList<>(constructors.size()); final LookupElement[] suggestedInitializers = AddVariableInitializerFix.suggestInitializer(field); + final List rExpressions = new ArrayList<>(constructors.size()); for (PsiMethod constructor : constructors) { - PsiExpression initialization = addFieldInitialization(constructor, suggestedInitializers, field, project); - if (initialization != null) { - rExpressions.add(initialization); - } + rExpressions.add(addFieldInitialization(constructor, suggestedInitializers, field, project)); } AddVariableInitializerFix.runAssignmentTemplate(rExpressions, suggestedInitializers, editor); } - @Nullable + @NotNull private static PsiExpression addFieldInitialization(@NotNull PsiMethod constructor, @NotNull LookupElement[] suggestedInitializers, @NotNull PsiField field, @NotNull Project project) { PsiCodeBlock methodBody = constructor.getBody(); - if (methodBody == null) return null; + if (methodBody == null) { + //incomplete code + CreateFromUsageUtils.setupMethodBody(constructor); + methodBody = constructor.getBody(); + LOG.assertTrue(methodBody != null); + } final String fieldName = field.getName(); String stmtText = fieldName + " = " + suggestedInitializers[0].getPsiElement().getText() + ";"; @@ -128,7 +133,7 @@ public class InitializeFinalFieldInConstructorFix implements IntentionAction { final PsiExpressionStatement addedStatement = (PsiExpressionStatement)methodBody.add(codeStyleManager .reformat(factory.createStatementFromText(stmtText, methodBody))); - return ((PsiAssignmentExpression)addedStatement.getExpression()).getRExpression(); + return ObjectUtils.notNull(((PsiAssignmentExpression)addedStatement.getExpression()).getRExpression()); } private static boolean methodContainsParameterWithName(@NotNull PsiMethod constructor, @NotNull String name) { diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/initializeFinalFieldInConstructor/afterIncompleteConstructor.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/initializeFinalFieldInConstructor/afterIncompleteConstructor.java new file mode 100644 index 000000000000..c2fd7a905da8 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/initializeFinalFieldInConstructor/afterIncompleteConstructor.java @@ -0,0 +1,8 @@ +// "Initialize in constructor" "true" +class A { + private final int var; + + private Main() { + var = 0; + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/initializeFinalFieldInConstructor/beforeIncompleteConstructor.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/initializeFinalFieldInConstructor/beforeIncompleteConstructor.java new file mode 100644 index 000000000000..60cc88a0ab56 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/initializeFinalFieldInConstructor/beforeIncompleteConstructor.java @@ -0,0 +1,6 @@ +// "Initialize in constructor" "true" +class A { + private final int var; + + private Main() +} \ No newline at end of file