From 159a46baf0b5729819a014336e9db731eedebfaf Mon Sep 17 00:00:00 2001 From: Yaroslav Lepenkin Date: Thu, 5 Jun 2014 11:56:42 +0400 Subject: [PATCH] JavaRearranger: fixed field caching in case of multiple classes in java file (IDEA-123733) --- .../arrangement/JavaArrangementVisitor.java | 7 +++- .../JavaRearrangerFieldReferenceTest.groovy | 37 ++++++++++++++++++- 2 files changed, 40 insertions(+), 4 deletions(-) diff --git a/java/java-impl/src/com/intellij/psi/codeStyle/arrangement/JavaArrangementVisitor.java b/java/java-impl/src/com/intellij/psi/codeStyle/arrangement/JavaArrangementVisitor.java index 0fbe3399552a..3651fa1afe3a 100644 --- a/java/java-impl/src/com/intellij/psi/codeStyle/arrangement/JavaArrangementVisitor.java +++ b/java/java-impl/src/com/intellij/psi/codeStyle/arrangement/JavaArrangementVisitor.java @@ -70,7 +70,7 @@ public class JavaArrangementVisitor extends JavaRecursiveElementVisitor { @NotNull private final ArrangementSectionDetector mySectionDetector; @Nullable private final Document myDocument; - @Nullable private Set classFields; + @NotNull private HashMap> myCachedClassFields = ContainerUtil.newHashMap(); @NotNull private Set myProcessedSectionsComments = ContainerUtil.newHashSet(); @@ -266,15 +266,18 @@ public class JavaArrangementVisitor extends JavaRecursiveElementVisitor { return referencedElements; } + Set classFields = myCachedClassFields.get(containingClass); if (classFields == null) { classFields = ContainerUtil.map2Set(containingClass.getFields(), new Function.Self()); + myCachedClassFields.put(containingClass, classFields); } + final Set containingClassFields = classFields; fieldInitializer.accept(new JavaRecursiveElementVisitor() { @Override public void visitReferenceExpression(PsiReferenceExpression expression) { PsiElement ref = expression.resolve(); - if (ref instanceof PsiField && classFields.contains(ref)) { + if (ref instanceof PsiField && containingClassFields.contains(ref)) { referencedElements.add((PsiField)ref); } } diff --git a/java/java-tests/testSrc/com/intellij/psi/codeStyle/arrangement/JavaRearrangerFieldReferenceTest.groovy b/java/java-tests/testSrc/com/intellij/psi/codeStyle/arrangement/JavaRearrangerFieldReferenceTest.groovy index bd1b18b4fcc3..302f1b331530 100644 --- a/java/java-tests/testSrc/com/intellij/psi/codeStyle/arrangement/JavaRearrangerFieldReferenceTest.groovy +++ b/java/java-tests/testSrc/com/intellij/psi/codeStyle/arrangement/JavaRearrangerFieldReferenceTest.groovy @@ -23,7 +23,6 @@ import static com.intellij.psi.codeStyle.arrangement.std.StdArrangementTokens.Mo class JavaRearrangerFieldReferenceTest extends AbstractJavaRearrangerTest { private List defaultFieldsArrangement = [ - rule(CLASS), rule(FIELD, STATIC, FINAL), rule(FIELD, PUBLIC), rule(FIELD, PROTECTED), @@ -31,7 +30,6 @@ class JavaRearrangerFieldReferenceTest extends AbstractJavaRearrangerTest { rule(FIELD, PRIVATE) ] - void "test keep referenced package private field before public one which has reference through binary expression"() { doTest(initial: '''\ public class TestRunnable { @@ -300,4 +298,39 @@ public class Q { ) } + void "test IDEA-123733"() { + doTest( + initial: '''\ +class First { + protected int test = 12; +} + +class Second extends First { + void test() {} + + private int q = test; + public int t = q; +} +''', + expected: '''\ +class First { + protected int test = 12; +} + +class Second extends First { + private int q = test; + public int t = q; + + void test() {} +} +''', + rules: defaultFieldsArrangement + ) + } + + + + + + }