create field from parameter even if parameter is already used in assignment

IDEA-192896
This commit is contained in:
Anna Kozlova
2018-05-29 20:54:23 +03:00
parent 489d6204bd
commit 5d77379fd3
4 changed files with 47 additions and 4 deletions
@@ -32,7 +32,7 @@ public class CreateFieldFromParameterAction extends CreateFieldFromParameterActi
protected boolean isAvailable(PsiParameter psiParameter) {
final PsiType type = getSubstitutedType(psiParameter);
final PsiClass targetClass = PsiTreeUtil.getParentOfType(psiParameter, PsiClass.class);
return FieldFromParameterUtils.isAvailable(psiParameter, type, targetClass) &&
return FieldFromParameterUtils.isAvailable(psiParameter, type, targetClass, false) &&
psiParameter.getLanguage().isKindOf(JavaLanguage.INSTANCE);
}
@@ -109,10 +109,22 @@ public final class FieldFromParameterUtils {
@Nullable
public static PsiField getParameterAssignedToField(final PsiParameter parameter) {
return getParameterAssignedToField(parameter, true);
}
@Nullable
public static PsiField getParameterAssignedToField(final PsiParameter parameter, boolean findIndirectAssignments) {
for (PsiReference reference : ReferencesSearch.search(parameter, new LocalSearchScope(parameter.getDeclarationScope()), false)) {
if (!(reference instanceof PsiReferenceExpression)) continue;
final PsiReferenceExpression expression = (PsiReferenceExpression)reference;
PsiAssignmentExpression assignmentExpression = PsiTreeUtil.getParentOfType(expression, PsiAssignmentExpression.class, true, PsiClass.class);
PsiAssignmentExpression assignmentExpression;
if (findIndirectAssignments) {
assignmentExpression = PsiTreeUtil.getParentOfType(expression, PsiAssignmentExpression.class, true, PsiClass.class);
}
else {
PsiElement parent = PsiUtil.skipParenthesizedExprUp(expression.getParent());
assignmentExpression = parent instanceof PsiAssignmentExpression ? (PsiAssignmentExpression)parent : null;
}
if (assignmentExpression == null) continue;
if (!PsiTreeUtil.isAncestor(assignmentExpression.getRExpression(), expression, false)) continue;
final PsiExpression lExpression = assignmentExpression.getLExpression();
@@ -256,7 +268,16 @@ public final class FieldFromParameterUtils {
}
}
public static boolean isAvailable(@Nullable PsiParameter myParameter, @Nullable PsiType type, @Nullable PsiClass targetClass) {
public static boolean isAvailable(@Nullable PsiParameter myParameter,
@Nullable PsiType type,
@Nullable PsiClass targetClass) {
return isAvailable(myParameter, type, targetClass, true);
}
public static boolean isAvailable(@Nullable PsiParameter myParameter,
@Nullable PsiType type,
@Nullable PsiClass targetClass,
boolean findIndirectAssignments) {
return myParameter != null
&& myParameter.isValid()
&& myParameter.getManager().isInProject(myParameter)
@@ -266,7 +287,7 @@ public final class FieldFromParameterUtils {
&& type.isValid()
&& targetClass != null
&& !targetClass.isInterface()
&& getParameterAssignedToField(myParameter) == null;
&& getParameterAssignedToField(myParameter, findIndirectAssignments) == null;
}
private FieldFromParameterUtils() { }
@@ -0,0 +1,13 @@
// "Create field for parameter 'p1'" "true"
class Test{
int b;
@org.jetbrains.annotations.NotNull
private final String myP1;
Test(String p1){
b = p1.length();
myP1 = p1;
}
}
@@ -0,0 +1,9 @@
// "Create field for parameter 'p1'" "true"
class Test{
int b;
Test(String p<caret>1){
b = p1.length();
}
}