mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-18 09:34:34 +07:00
IDEA-87401 For intention "Assign Parameter to Field", provide a "Assign All Unassigned Parameters to Fields" implemented
This commit is contained in:
+42
-54
@@ -43,19 +43,10 @@ public class AssignFieldFromParameterAction extends BaseIntentionAction {
|
||||
final PsiParameter myParameter = FieldFromParameterUtils.findParameterAtCursor(file, editor);
|
||||
final PsiType type = FieldFromParameterUtils.getType(myParameter);
|
||||
final PsiClass targetClass = PsiTreeUtil.getParentOfType(myParameter, PsiClass.class);
|
||||
if (myParameter == null
|
||||
|| !myParameter.isValid()
|
||||
|| !myParameter.getManager().isInProject(myParameter)
|
||||
|| !(myParameter.getDeclarationScope() instanceof PsiMethod)
|
||||
|| ((PsiMethod)myParameter.getDeclarationScope()).getBody() == null
|
||||
|| type == null
|
||||
|| !type.isValid()
|
||||
|| targetClass == null
|
||||
|| targetClass.isInterface()
|
||||
|| FieldFromParameterUtils.getParameterAssignedToField(myParameter) != null) {
|
||||
if (!FieldFromParameterUtils.isAvailable(myParameter, type, targetClass)) {
|
||||
return false;
|
||||
}
|
||||
final PsiField field = findFieldToAssign(myParameter);
|
||||
final PsiField field = findFieldToAssign(project, myParameter);
|
||||
if (field == null) return false;
|
||||
if (!field.getLanguage().isKindOf(JavaLanguage.INSTANCE)) return false;
|
||||
setText(CodeInsightBundle.message("intention.assign.field.from.parameter.text", field.getName()));
|
||||
@@ -71,12 +62,12 @@ public class AssignFieldFromParameterAction extends BaseIntentionAction {
|
||||
|
||||
@Override
|
||||
public void invoke(@NotNull Project project, Editor editor, PsiFile file) {
|
||||
PsiParameter myParameter = FieldFromParameterUtils.findParameterAtCursor(file, editor);
|
||||
final PsiParameter myParameter = FieldFromParameterUtils.findParameterAtCursor(file, editor);
|
||||
if (!CodeInsightUtilBase.prepareFileForWrite(myParameter.getContainingFile())) return;
|
||||
|
||||
IdeDocumentHistory.getInstance(project).includeCurrentPlaceAsChangePlace();
|
||||
try {
|
||||
PsiField field = findFieldToAssign(myParameter);
|
||||
PsiField field = findFieldToAssign(project, myParameter);
|
||||
if (field != null) addFieldAssignmentStatement(project, field, myParameter, editor);
|
||||
}
|
||||
catch (IncorrectOperationException e) {
|
||||
@@ -84,53 +75,18 @@ public class AssignFieldFromParameterAction extends BaseIntentionAction {
|
||||
}
|
||||
}
|
||||
|
||||
public static void addFieldAssignmentStatement(@NotNull Project project,
|
||||
@NotNull PsiField field,
|
||||
@NotNull PsiParameter parameter,
|
||||
@NotNull Editor editor) throws IncorrectOperationException {
|
||||
final PsiMethod method = (PsiMethod)parameter.getDeclarationScope();
|
||||
PsiCodeBlock methodBody = method.getBody();
|
||||
if (methodBody == null) return;
|
||||
PsiManager psiManager = PsiManager.getInstance(project);
|
||||
PsiElementFactory factory = JavaPsiFacade.getInstance(psiManager.getProject()).getElementFactory();
|
||||
String fieldName = field.getName();
|
||||
String parameterName = parameter.getName();
|
||||
final boolean isMethodStatic = method.hasModifierProperty(PsiModifier.STATIC);
|
||||
PsiClass targetClass = method.getContainingClass();
|
||||
|
||||
String stmtText = fieldName + " = " + parameterName + ";";
|
||||
if (Comparing.strEqual(fieldName, parameterName) || JavaPsiFacade.getInstance(project).getResolveHelper().resolveReferencedVariable(fieldName, methodBody) != field) {
|
||||
@NonNls String prefix = isMethodStatic ? targetClass.getName() == null ? "" : targetClass.getName() + "." : "this.";
|
||||
stmtText = prefix + stmtText;
|
||||
}
|
||||
|
||||
PsiStatement assignmentStmt = factory.createStatementFromText(stmtText, methodBody);
|
||||
assignmentStmt = (PsiStatement)CodeStyleManager.getInstance(project).reformat(assignmentStmt);
|
||||
PsiStatement[] statements = methodBody.getStatements();
|
||||
int i = FieldFromParameterUtils.findFieldAssignmentAnchor(statements, null, targetClass, parameter);
|
||||
PsiElement inserted;
|
||||
if (i == statements.length) {
|
||||
inserted = methodBody.add(assignmentStmt);
|
||||
}
|
||||
else {
|
||||
inserted = methodBody.addAfter(assignmentStmt, i > 0 ? statements[i - 1] : null);
|
||||
}
|
||||
editor.getCaretModel().moveToOffset(inserted.getTextRange().getEndOffset());
|
||||
editor.getScrollingModel().scrollToCaret(ScrollType.RELATIVE);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
private static PsiField findFieldToAssign(final PsiParameter myParameter) {
|
||||
final JavaCodeStyleManager styleManager = JavaCodeStyleManager.getInstance(myParameter.getProject());
|
||||
private static PsiField findFieldToAssign(@NotNull Project project,
|
||||
@NotNull PsiParameter myParameter) {
|
||||
final JavaCodeStyleManager styleManager = JavaCodeStyleManager.getInstance(project);
|
||||
final String parameterName = myParameter.getName();
|
||||
String propertyName = styleManager.variableNameToPropertyName(parameterName, VariableKind.PARAMETER);
|
||||
final String propertyName = styleManager.variableNameToPropertyName(parameterName, VariableKind.PARAMETER);
|
||||
|
||||
final PsiMethod method = (PsiMethod)myParameter.getDeclarationScope();
|
||||
|
||||
final boolean isMethodStatic = method.hasModifierProperty(PsiModifier.STATIC);
|
||||
|
||||
VariableKind kind = isMethodStatic ? VariableKind.STATIC_FIELD : VariableKind.FIELD;
|
||||
SuggestedNameInfo suggestedNameInfo = styleManager.suggestVariableName(kind, propertyName, null, FieldFromParameterUtils.getSubstitutedType(myParameter));
|
||||
final VariableKind kind = isMethodStatic ? VariableKind.STATIC_FIELD : VariableKind.FIELD;
|
||||
final SuggestedNameInfo suggestedNameInfo = styleManager.suggestVariableName(kind, propertyName, null, FieldFromParameterUtils.getSubstitutedType(myParameter));
|
||||
|
||||
final String fieldName = suggestedNameInfo.names[0];
|
||||
|
||||
@@ -143,5 +99,37 @@ public class AssignFieldFromParameterAction extends BaseIntentionAction {
|
||||
return field;
|
||||
}
|
||||
|
||||
public static void addFieldAssignmentStatement(@NotNull Project project,
|
||||
@NotNull PsiField field,
|
||||
@NotNull PsiParameter parameter,
|
||||
@NotNull Editor editor) throws IncorrectOperationException {
|
||||
final PsiMethod method = (PsiMethod)parameter.getDeclarationScope();
|
||||
final PsiCodeBlock methodBody = method.getBody();
|
||||
if (methodBody == null) return;
|
||||
final PsiElementFactory factory = JavaPsiFacade.getInstance(project).getElementFactory();
|
||||
final String fieldName = field.getName();
|
||||
final String parameterName = parameter.getName();
|
||||
final boolean isMethodStatic = method.hasModifierProperty(PsiModifier.STATIC);
|
||||
final PsiClass targetClass = method.getContainingClass();
|
||||
if (targetClass == null) return;
|
||||
|
||||
String stmtText = fieldName + " = " + parameterName + ";";
|
||||
if (Comparing.strEqual(fieldName, parameterName) || JavaPsiFacade.getInstance(project).getResolveHelper().resolveReferencedVariable(fieldName, methodBody) != field) {
|
||||
@NonNls String prefix = isMethodStatic ? targetClass.getName() == null ? "" : targetClass.getName() + "." : "this.";
|
||||
stmtText = prefix + stmtText;
|
||||
}
|
||||
|
||||
final PsiStatement assignmentStmt = (PsiStatement)CodeStyleManager.getInstance(project).reformat(factory.createStatementFromText(stmtText, methodBody));
|
||||
final PsiStatement[] statements = methodBody.getStatements();
|
||||
final int i = FieldFromParameterUtils.findFieldAssignmentAnchor(statements, null, targetClass, parameter);
|
||||
final PsiElement inserted;
|
||||
if (i == statements.length) {
|
||||
inserted = methodBody.add(assignmentStmt);
|
||||
}
|
||||
else {
|
||||
inserted = methodBody.addAfter(assignmentStmt, i > 0 ? statements[i - 1] : null);
|
||||
}
|
||||
editor.getCaretModel().moveToOffset(inserted.getTextRange().getEndOffset());
|
||||
editor.getScrollingModel().scrollToCaret(ScrollType.RELATIVE);
|
||||
}
|
||||
}
|
||||
|
||||
+5
-15
@@ -33,8 +33,6 @@ import com.intellij.psi.*;
|
||||
import com.intellij.psi.codeStyle.JavaCodeStyleManager;
|
||||
import com.intellij.psi.codeStyle.SuggestedNameInfo;
|
||||
import com.intellij.psi.codeStyle.VariableKind;
|
||||
import com.intellij.psi.search.LocalSearchScope;
|
||||
import com.intellij.psi.search.searches.ReferencesSearch;
|
||||
import com.intellij.psi.util.PsiTreeUtil;
|
||||
import com.intellij.ui.SimpleColoredComponent;
|
||||
import com.intellij.ui.SimpleTextAttributes;
|
||||
@@ -70,7 +68,8 @@ public class CreateAssignFieldsFromParametersAction extends BaseIntentionAction
|
||||
for (PsiParameter parameter : parameters) {
|
||||
params.add(SmartPointerManager.getInstance(project).createSmartPsiElementPointer(parameter));
|
||||
}
|
||||
if (params.size() <= 1) return false;
|
||||
if (params.isEmpty()) return false;
|
||||
if (params.size() == 1 && psiParameter != null) return false;
|
||||
if (psiParameter == null) {
|
||||
psiParameter = params.iterator().next().getElement();
|
||||
LOG.assertTrue(psiParameter != null);
|
||||
@@ -115,18 +114,9 @@ public class CreateAssignFieldsFromParametersAction extends BaseIntentionAction
|
||||
|
||||
private static boolean isAvailable(PsiParameter psiParameter) {
|
||||
final PsiType type = FieldFromParameterUtils.getSubstitutedType(psiParameter);
|
||||
PsiClass targetClass = PsiTreeUtil.getParentOfType(psiParameter, PsiClass.class);
|
||||
return psiParameter.isValid()
|
||||
&& psiParameter.getLanguage().isKindOf(JavaLanguage.INSTANCE)
|
||||
&& psiParameter.getDeclarationScope() instanceof PsiMethod
|
||||
&& ((PsiMethod)psiParameter.getDeclarationScope()).getBody() != null
|
||||
&& psiParameter.getManager().isInProject(psiParameter)
|
||||
&& type != null
|
||||
&& type.isValid()
|
||||
&& FieldFromParameterUtils.getParameterAssignedToField(psiParameter) == null
|
||||
&& targetClass != null
|
||||
&& !targetClass.isInterface()
|
||||
;
|
||||
final PsiClass targetClass = PsiTreeUtil.getParentOfType(psiParameter, PsiClass.class);
|
||||
return FieldFromParameterUtils.isAvailable(psiParameter, type, targetClass) &&
|
||||
psiParameter.getLanguage().isKindOf(JavaLanguage.INSTANCE);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
|
||||
+2
-10
@@ -54,16 +54,8 @@ public class CreateFieldFromParameterAction extends BaseIntentionAction {
|
||||
private static boolean isAvailable(PsiParameter psiParameter) {
|
||||
final PsiType type = FieldFromParameterUtils.getSubstitutedType(psiParameter);
|
||||
final PsiClass targetClass = PsiTreeUtil.getParentOfType(psiParameter, PsiClass.class);
|
||||
return psiParameter.isValid()
|
||||
&& psiParameter.getLanguage().isKindOf(JavaLanguage.INSTANCE)
|
||||
&& psiParameter.getDeclarationScope() instanceof PsiMethod
|
||||
&& ((PsiMethod)psiParameter.getDeclarationScope()).getBody() != null
|
||||
&& psiParameter.getManager().isInProject(psiParameter)
|
||||
&& type != null
|
||||
&& type.isValid()
|
||||
&& FieldFromParameterUtils.getParameterAssignedToField(psiParameter) == null
|
||||
&& targetClass != null
|
||||
&& !targetClass.isInterface();
|
||||
return FieldFromParameterUtils.isAvailable(psiParameter, type, targetClass) &&
|
||||
psiParameter.getLanguage().isKindOf(JavaLanguage.INSTANCE);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
+2
-1
@@ -50,7 +50,8 @@ class CreateFieldFromParameterDialog extends DialogWrapper {
|
||||
public CreateFieldFromParameterDialog(Project project,
|
||||
String[] names,
|
||||
PsiClass targetClass,
|
||||
final boolean fieldMayBeFinal, PsiType... types) {
|
||||
boolean fieldMayBeFinal,
|
||||
PsiType... types) {
|
||||
super(project, true);
|
||||
myProject = project;
|
||||
myNames = names;
|
||||
|
||||
+14
-1
@@ -16,7 +16,6 @@
|
||||
package com.intellij.codeInsight.intention.impl;
|
||||
|
||||
import com.intellij.codeInsight.NullableNotNullManager;
|
||||
import com.intellij.openapi.application.ApplicationManager;
|
||||
import com.intellij.openapi.editor.Editor;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.util.Pair;
|
||||
@@ -254,6 +253,20 @@ public final class FieldFromParameterUtils {
|
||||
}
|
||||
}
|
||||
|
||||
public static boolean isAvailable(@Nullable PsiParameter myParameter,
|
||||
@Nullable PsiType type,
|
||||
@Nullable PsiClass targetClass){
|
||||
return myParameter != null
|
||||
&& myParameter.isValid()
|
||||
&& myParameter.getManager().isInProject(myParameter)
|
||||
&& myParameter.getDeclarationScope() instanceof PsiMethod
|
||||
&& ((PsiMethod)myParameter.getDeclarationScope()).getBody() != null
|
||||
&& type != null
|
||||
&& type.isValid()
|
||||
&& targetClass != null
|
||||
&& !targetClass.isInterface()
|
||||
&& getParameterAssignedToField(myParameter) == null;
|
||||
}
|
||||
private FieldFromParameterUtils() {
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user