From 1b09d55adcfb1a78fa11b8c1f139bc554428de04 Mon Sep 17 00:00:00 2001 From: anna Date: Fri, 11 Mar 2011 11:13:47 +0100 Subject: [PATCH] find occurrences: distinguish <> with different inference (IDEA-66176) --- .../com/intellij/codeInsight/CodeInsightUtil.java | 13 ++++++++++++- .../introduceParameter/afterDiamondOccurrences.java | 9 +++++++++ .../beforeDiamondOccurrences.java | 9 +++++++++ .../refactoring/IntroduceParameterTest.java | 4 ++++ .../intellij/codeInsight/PsiEquivalenceUtil.java | 11 ++++++++++- 5 files changed, 44 insertions(+), 2 deletions(-) create mode 100644 java/java-tests/testData/refactoring/introduceParameter/afterDiamondOccurrences.java create mode 100644 java/java-tests/testData/refactoring/introduceParameter/beforeDiamondOccurrences.java diff --git a/java/java-impl/src/com/intellij/codeInsight/CodeInsightUtil.java b/java/java-impl/src/com/intellij/codeInsight/CodeInsightUtil.java index 1ef060f35e59..a3d28c1a5aa6 100644 --- a/java/java-impl/src/com/intellij/codeInsight/CodeInsightUtil.java +++ b/java/java-impl/src/com/intellij/codeInsight/CodeInsightUtil.java @@ -28,6 +28,7 @@ import com.intellij.openapi.util.Computable; import com.intellij.openapi.util.Condition; import com.intellij.openapi.util.TextRange; import com.intellij.psi.*; +import com.intellij.psi.impl.source.PsiDiamondTypeElementImpl; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.search.searches.ClassInheritorsSearch; import com.intellij.psi.tree.IElementType; @@ -225,7 +226,17 @@ public class CodeInsightUtil { } return 1; } - }, false); + }, new Comparator() { + @Override + public int compare(PsiElement o1, PsiElement o2) { + if (o1 instanceof PsiDiamondTypeElementImpl && o2 instanceof PsiDiamondTypeElementImpl) { + final PsiDiamondType.DiamondInferenceResult thisInferenceResult = new PsiDiamondType(o1.getManager(), (PsiTypeElement)o1).resolveInferredTypes(); + final PsiDiamondType.DiamondInferenceResult otherInferenceResult = new PsiDiamondType(o2.getManager(), (PsiTypeElement)o2).resolveInferredTypes(); + return thisInferenceResult.equals(otherInferenceResult) ? 0 : 1; + } + return 0; + } + }, false); } public static Editor positionCursor(final Project project, PsiFile targetFile, PsiElement element) { diff --git a/java/java-tests/testData/refactoring/introduceParameter/afterDiamondOccurrences.java b/java/java-tests/testData/refactoring/introduceParameter/afterDiamondOccurrences.java new file mode 100644 index 000000000000..88a3a93e66a7 --- /dev/null +++ b/java/java-tests/testData/refactoring/introduceParameter/afterDiamondOccurrences.java @@ -0,0 +1,9 @@ +import java.util.*; + +class Test { + void foo(final ArrayList anObject) { + List ls = anObject; + List lss = anObject; + List li = new ArrayList<>(); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/introduceParameter/beforeDiamondOccurrences.java b/java/java-tests/testData/refactoring/introduceParameter/beforeDiamondOccurrences.java new file mode 100644 index 000000000000..783ef5fcf68f --- /dev/null +++ b/java/java-tests/testData/refactoring/introduceParameter/beforeDiamondOccurrences.java @@ -0,0 +1,9 @@ +import java.util.*; + +class Test { + void foo() { + List ls = new ArrayList<>(); + List lss = new ArrayList<>(); + List li = new ArrayList<>(); + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/refactoring/IntroduceParameterTest.java b/java/java-tests/testSrc/com/intellij/refactoring/IntroduceParameterTest.java index 73dadf190ce6..2f44d5e0c35d 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/IntroduceParameterTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/IntroduceParameterTest.java @@ -264,6 +264,10 @@ public class IntroduceParameterTest extends LightCodeInsightTestCase { doTest(IntroduceParameterRefactoring.REPLACE_FIELDS_WITH_GETTERS_ALL, true, false, true, false); } + public void testDiamondOccurrences() throws Exception { + doTest(IntroduceParameterRefactoring.REPLACE_FIELDS_WITH_GETTERS_ALL, true, false, true, false); + } + private void doTestThroughHandler() throws Exception { configureByFile("/refactoring/introduceParameter/before" + getTestName(false) + ".java"); new IntroduceParameterHandler().invoke(getProject(), myEditor, myFile, new DataContext() { diff --git a/platform/lang-api/src/com/intellij/codeInsight/PsiEquivalenceUtil.java b/platform/lang-api/src/com/intellij/codeInsight/PsiEquivalenceUtil.java index 20ac1c0e1c37..41a41d2725a7 100644 --- a/platform/lang-api/src/com/intellij/codeInsight/PsiEquivalenceUtil.java +++ b/platform/lang-api/src/com/intellij/codeInsight/PsiEquivalenceUtil.java @@ -44,6 +44,14 @@ public class PsiEquivalenceUtil { @NotNull PsiElement element2, @Nullable Comparator resolvedElementsComparator, boolean areCommentsSignificant) { + return areElementsEquivalent(element1, element2, resolvedElementsComparator, null, areCommentsSignificant); + } + + public static boolean areElementsEquivalent(@NotNull PsiElement element1, + @NotNull PsiElement element2, + @Nullable Comparator resolvedElementsComparator, + @Nullable Comparator leafElementsComparator, + boolean areCommentsSignificant) { if(element1 == element2) return true; ASTNode node1 = element1.getNode(); ASTNode node2 = element2.getNode(); @@ -57,11 +65,12 @@ public class PsiEquivalenceUtil { for (int i = 0; i < children1.length; i++) { PsiElement child1 = children1[i]; PsiElement child2 = children2[i]; - if (!areElementsEquivalent(child1, child2, resolvedElementsComparator, areCommentsSignificant)) return false; + if (!areElementsEquivalent(child1, child2, resolvedElementsComparator, leafElementsComparator, areCommentsSignificant)) return false; } if (children1.length == 0) { if (!element1.textMatches(element2)) return false; + if (leafElementsComparator != null && leafElementsComparator.compare(element1, element2) != 0) return false; } PsiReference ref1 = element1.getReference();