field initialization fix: add body for incomplete constructor

This commit is contained in:
Dmitry Batkovich
2017-03-13 13:24:58 +03:00
parent 745930b309
commit f4993e6f99
3 changed files with 27 additions and 8 deletions

View File

@@ -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<PsiExpression> rExpressions = new ArrayList<>(constructors.size());
final LookupElement[] suggestedInitializers = AddVariableInitializerFix.suggestInitializer(field);
final List<PsiExpression> 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) {

View File

@@ -0,0 +1,8 @@
// "Initialize in constructor" "true"
class A {
private final int var;
private Main() {
var = 0;
}
}

View File

@@ -0,0 +1,6 @@
// "Initialize in constructor" "true"
class A {
private final int v<caret>ar;
private Main()
}