diff --git a/idea/src/META-INF/plugin.xml b/idea/src/META-INF/plugin.xml index 79c3dcafee2..e3998f86705 100644 --- a/idea/src/META-INF/plugin.xml +++ b/idea/src/META-INF/plugin.xml @@ -105,6 +105,7 @@ + diff --git a/idea/src/org/jetbrains/jet/plugin/findUsages/JetImportFilteringRule.java b/idea/src/org/jetbrains/jet/plugin/findUsages/JetImportFilteringRule.java new file mode 100644 index 00000000000..1cfc249c4e1 --- /dev/null +++ b/idea/src/org/jetbrains/jet/plugin/findUsages/JetImportFilteringRule.java @@ -0,0 +1,40 @@ +/* + * Copyright 2010-2012 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.jet.plugin.findUsages; + +import com.intellij.psi.PsiElement; +import com.intellij.psi.util.PsiTreeUtil; +import com.intellij.usages.Usage; +import com.intellij.usages.rules.ImportFilteringRule; +import com.intellij.usages.rules.PsiElementUsage; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.lang.psi.JetFile; +import org.jetbrains.jet.lang.psi.JetImportDirective; + +public class JetImportFilteringRule extends ImportFilteringRule { + @Override + public boolean isVisible(@NotNull Usage usage) { + if (usage instanceof PsiElementUsage) { + final PsiElement psiElement = ((PsiElementUsage)usage).getElement(); + if (psiElement.getContainingFile() instanceof JetFile) { + return PsiTreeUtil.getParentOfType(psiElement, JetImportDirective.class) == null; + } + } + + return true; + } +} diff --git a/idea/testData/findUsages/findWithFilteringImports/Test.kt b/idea/testData/findUsages/findWithFilteringImports/Test.kt new file mode 100644 index 00000000000..02a9adb6934 --- /dev/null +++ b/idea/testData/findUsages/findWithFilteringImports/Test.kt @@ -0,0 +1,3 @@ +package testing + +public class Test diff --git a/idea/testData/findUsages/findWithFilteringImports/Usages.kt b/idea/testData/findUsages/findWithFilteringImports/Usages.kt new file mode 100644 index 00000000000..24a20b3d47c --- /dev/null +++ b/idea/testData/findUsages/findWithFilteringImports/Usages.kt @@ -0,0 +1,5 @@ +package some + +import testing.Test + +val a = Test() \ No newline at end of file diff --git a/idea/tests/org/jetbrains/jet/findUsages/JetFindUsagesTest.java b/idea/tests/org/jetbrains/jet/findUsages/JetFindUsagesTest.java index 45fad931a0e..a937c2e259e 100644 --- a/idea/tests/org/jetbrains/jet/findUsages/JetFindUsagesTest.java +++ b/idea/tests/org/jetbrains/jet/findUsages/JetFindUsagesTest.java @@ -16,6 +16,9 @@ package org.jetbrains.jet.findUsages; +import com.google.common.base.Function; +import com.google.common.base.Predicate; +import com.google.common.collect.Collections2; import com.intellij.psi.PsiClass; import com.intellij.psi.PsiField; import com.intellij.psi.PsiStatement; @@ -23,11 +26,15 @@ import com.intellij.psi.util.PsiTreeUtil; import com.intellij.testFramework.LightProjectDescriptor; import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase; import com.intellij.usageView.UsageInfo; +import com.intellij.usages.Usage; +import com.intellij.usages.UsageInfo2UsageAdapter; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.psi.JetClass; import org.jetbrains.jet.lang.psi.JetFunction; import org.jetbrains.jet.plugin.JetLightProjectDescriptor; import org.jetbrains.jet.plugin.PluginTestCaseBase; +import org.jetbrains.jet.plugin.findUsages.JetImportFilteringRule; import java.util.Collection; @@ -76,4 +83,32 @@ public class JetFindUsagesTest extends LightCodeInsightFixtureTestCase { final PsiStatement stmt = PsiTreeUtil.getParentOfType(first.getElement(), PsiStatement.class); assertEquals("server.processRequest();", stmt.getText()); } + + public void testFindWithFilteringImports() { + myFixture.configureByFiles("findWithFilteringImports/Test.kt", "findWithFilteringImports/Usages.kt"); + JetClass clazz = PsiTreeUtil.getParentOfType(myFixture.getElementAtCaret(), JetClass.class, false); + final Collection usageInfos = myFixture.findUsages(clazz); + + assertEquals(2, usageInfos.size()); + + Collection usages = Collections2.transform(usageInfos, new Function() { + @Override + public Usage apply(@Nullable UsageInfo usageInfo) { + assert (usageInfo != null); + return new UsageInfo2UsageAdapter(usageInfo); + } + }); + + final JetImportFilteringRule importFilteringRule = new JetImportFilteringRule(); + Collection filteredUsages = Collections2.filter(usages, new Predicate() { + @Override + public boolean apply(@Nullable Usage usage) { + assert (usage != null); + return importFilteringRule.isVisible(usage); + } + }); + + assertEquals(1, filteredUsages.size()); + assertEquals("Invalid usage:", "(5: 9) |val| |a| |=| |Test|(|)", filteredUsages.iterator().next().toString()); + } }