mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-05-06 05:10:22 +07:00
field initialization fix: add body for incomplete constructor
This commit is contained in:
@@ -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) {
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
// "Initialize in constructor" "true"
|
||||
class A {
|
||||
private final int var;
|
||||
|
||||
private Main() {
|
||||
var = 0;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
// "Initialize in constructor" "true"
|
||||
class A {
|
||||
private final int v<caret>ar;
|
||||
|
||||
private Main()
|
||||
}
|
||||
Reference in New Issue
Block a user