From c578a4ede7066716e2cc0993b5b6061e142f4bae Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Mon, 5 Jun 2017 19:44:50 +0300 Subject: [PATCH] disable assign param to field (IDEA-173747; IDEA-173689) inapplicable types or already assigned --- .../intention/impl/AssignFieldFromParameterAction.java | 2 +- .../intention/impl/FieldFromParameterUtils.java | 6 +++--- .../beforeAlreadyAssigned.java | 10 ++++++++++ .../beforeCheckAssignability.java | 10 ++++++++++ 4 files changed, 24 insertions(+), 4 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/assignFieldFromParameter/beforeAlreadyAssigned.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/assignFieldFromParameter/beforeCheckAssignability.java diff --git a/java/java-impl/src/com/intellij/codeInsight/intention/impl/AssignFieldFromParameterAction.java b/java/java-impl/src/com/intellij/codeInsight/intention/impl/AssignFieldFromParameterAction.java index 6cf28f28ccb1..fa578c172089 100644 --- a/java/java-impl/src/com/intellij/codeInsight/intention/impl/AssignFieldFromParameterAction.java +++ b/java/java-impl/src/com/intellij/codeInsight/intention/impl/AssignFieldFromParameterAction.java @@ -46,7 +46,7 @@ public class AssignFieldFromParameterAction extends BaseIntentionAction { return false; } final PsiField field = findFieldToAssign(project, myParameter); - if (field == null) return false; + if (field == null || type == null || !field.getType().isAssignableFrom(type)) return false; if (!field.getLanguage().isKindOf(JavaLanguage.INSTANCE)) return false; setText(CodeInsightBundle.message("intention.assign.field.from.parameter.text", field.getName())); diff --git a/java/java-impl/src/com/intellij/codeInsight/intention/impl/FieldFromParameterUtils.java b/java/java-impl/src/com/intellij/codeInsight/intention/impl/FieldFromParameterUtils.java index aa644cd96a20..8168ae2fe60a 100644 --- a/java/java-impl/src/com/intellij/codeInsight/intention/impl/FieldFromParameterUtils.java +++ b/java/java-impl/src/com/intellij/codeInsight/intention/impl/FieldFromParameterUtils.java @@ -112,9 +112,9 @@ public final class FieldFromParameterUtils { for (PsiReference reference : ReferencesSearch.search(parameter, new LocalSearchScope(parameter.getDeclarationScope()), false)) { if (!(reference instanceof PsiReferenceExpression)) continue; final PsiReferenceExpression expression = (PsiReferenceExpression)reference; - if (!(expression.getParent() instanceof PsiAssignmentExpression)) continue; - final PsiAssignmentExpression assignmentExpression = (PsiAssignmentExpression)expression.getParent(); - if (assignmentExpression.getRExpression() != expression) continue; + PsiAssignmentExpression assignmentExpression = PsiTreeUtil.getParentOfType(expression, PsiAssignmentExpression.class, true, PsiClass.class); + if (assignmentExpression == null) continue; + if (!PsiTreeUtil.isAncestor(assignmentExpression.getRExpression(), expression, false)) continue; final PsiExpression lExpression = assignmentExpression.getLExpression(); if (!(lExpression instanceof PsiReferenceExpression)) continue; final PsiElement element = ((PsiReferenceExpression)lExpression).resolve(); diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/assignFieldFromParameter/beforeAlreadyAssigned.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/assignFieldFromParameter/beforeAlreadyAssigned.java new file mode 100644 index 000000000000..94684be58489 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/assignFieldFromParameter/beforeAlreadyAssigned.java @@ -0,0 +1,10 @@ +// "Assign Parameter to Field 'myA'" "false" + +class Person { + int myA; + int myId; + void f(int a, String id) { + this.myA = foo(a); + } + int foo(int a) {return a;} +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/assignFieldFromParameter/beforeCheckAssignability.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/assignFieldFromParameter/beforeCheckAssignability.java new file mode 100644 index 000000000000..38db6f1a210d --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/assignFieldFromParameter/beforeCheckAssignability.java @@ -0,0 +1,10 @@ +// "Assign Parameter to Field 'myId'" "false" + +class Person { + int a; + int myId; + void f(int a, String id) { + this.a = foo(a); + } + int foo(int a) {return a;} +} \ No newline at end of file