From 9e8666f15974d06c2800590259b1dbe9fabb7456 Mon Sep 17 00:00:00 2001 From: "Anna.Kozlova" Date: Wed, 23 Mar 2016 15:23:23 +0100 Subject: [PATCH] bind params to fields: accept field assignments if not exactly the parameter reference was assigned (IDEA-120320) --- .../impl/FieldFromParameterUtils.java | 24 ++++++++++++------- .../afterPositionAfter.java | 11 +++++++++ .../beforePositionAfter.java | 10 ++++++++ 3 files changed, 36 insertions(+), 9 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/assignFieldFromParameter/afterPositionAfter.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/assignFieldFromParameter/beforePositionAfter.java 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 3160a2bb45c3..b2bc06e28f62 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 @@ -145,19 +145,25 @@ public final class FieldFromParameterUtils { else if (expression instanceof PsiAssignmentExpression) { PsiAssignmentExpression assignmentExpression = (PsiAssignmentExpression)expression; PsiExpression lExpression = assignmentExpression.getLExpression(); - PsiExpression rExpression = assignmentExpression.getRExpression(); if (!(lExpression instanceof PsiReferenceExpression)) break; - if (!(rExpression instanceof PsiReferenceExpression)) break; - - PsiReferenceExpression lReference = (PsiReferenceExpression)lExpression; - PsiReferenceExpression rReference = (PsiReferenceExpression)rExpression; - - PsiElement lElement = lReference.resolve(); - PsiElement rElement = rReference.resolve(); + PsiElement lElement = ((PsiReferenceExpression)lExpression).resolve(); if (!(lElement instanceof PsiField) || ((PsiField)lElement).getContainingClass() != targetClass) break; - if (!(rElement instanceof PsiParameter)) break; + + final Set parameters = new HashSet<>(); + SyntaxTraverser.psiTraverser().withRoot(assignmentExpression.getRExpression()) + .filter(PsiReferenceExpression.class) + .forEach(expr -> { + final PsiElement resolve = expr.resolve(); + if (resolve instanceof PsiParameter && ((PsiParameter)resolve).getDeclarationScope() == myParameter.getDeclarationScope()) { + parameters.add((PsiParameter)resolve); + } + }); + + if (parameters.size() != 1) break; + + PsiElement rElement = parameters.iterator().next(); if (myParameter.getTextRange().getStartOffset() < rElement.getTextRange().getStartOffset()) { if (anchorRef != null) { diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/assignFieldFromParameter/afterPositionAfter.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/assignFieldFromParameter/afterPositionAfter.java new file mode 100644 index 000000000000..d7d2684fc282 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/assignFieldFromParameter/afterPositionAfter.java @@ -0,0 +1,11 @@ +// "Assign Parameter to Field 'myId'" "true" + +class Person { + int a; + int myId; + void f(int a, int id) { + this.a = foo(a); + myId = id; + } + int foo(int a) {return a;} +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/assignFieldFromParameter/beforePositionAfter.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/assignFieldFromParameter/beforePositionAfter.java new file mode 100644 index 000000000000..4f7d9fe7b720 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/assignFieldFromParameter/beforePositionAfter.java @@ -0,0 +1,10 @@ +// "Assign Parameter to Field 'myId'" "true" + +class Person { + int a; + int myId; + void f(int a, int id) { + this.a = foo(a); + } + int foo(int a) {return a;} +} \ No newline at end of file