Find Usages: Classify package usages

#KT-4882 Fixed
This commit is contained in:
Alexey Sedunov
2014-06-24 16:08:29 +04:00
parent 86c8bfc864
commit 1452ffec6d
6 changed files with 59 additions and 12 deletions
@@ -366,6 +366,8 @@ usageType.super.type.qualifier = Super type qualifier
usageType.receiver = Receiver
usageType.selector = Selector
usageType.delegate = Delegate
usageType.packageDirective = Package directive
usageType.packageMemberAccess = Package member access
x.in.y={0} in {1}
x.implements.y={0} in {1} implements {2} in {3}.
@@ -17,12 +17,9 @@
package org.jetbrains.jet.plugin.findUsages
import com.intellij.psi.PsiElement
import com.intellij.psi.tree.IElementType
import com.intellij.psi.util.PsiTreeUtil
import com.intellij.usages.UsageTarget
import com.intellij.usages.impl.rules.UsageType
import com.intellij.usages.impl.rules.UsageTypeProviderEx
import org.jetbrains.annotations.Nullable
import org.jetbrains.jet.lang.descriptors.*
import org.jetbrains.jet.lang.psi.*
import org.jetbrains.jet.lang.psi.psiUtil.*
@@ -30,9 +27,8 @@ import org.jetbrains.jet.lang.resolve.BindingContext
import org.jetbrains.jet.lexer.JetTokens
import org.jetbrains.jet.plugin.project.AnalyzerFacadeWithCache
import org.jetbrains.jet.plugin.JetBundle
import org.jetbrains.jet.lang.resolve.java.descriptor.JavaPackageFragmentDescriptor
import org.jetbrains.jet.lang.resolve.java.lazy.descriptors.LazyJavaPackageFragment
import org.jetbrains.jet.lang.resolve.DescriptorUtils
import com.intellij.psi.PsiPackage
public object JetUsageTypeProvider : UsageTypeProviderEx {
public override fun getUsageType(element: PsiElement?): UsageType? {
@@ -166,6 +162,14 @@ public object JetUsageTypeProvider : UsageTypeProviderEx {
}
}
fun getPackageUsageType(): UsageType? {
return when {
simpleName.getParentByType(javaClass<JetPackageDirective>()) != null -> JetUsageTypes.PACKAGE_DIRECTIVE
simpleName.getParentByType(javaClass<JetQualifiedExpression>()) != null -> JetUsageTypes.PACKAGE_MEMBER_ACCESS
else -> getClassUsageType()
}
}
val usageType = getCommonUsageType()
if (usageType != null) return usageType
@@ -181,7 +185,9 @@ public object JetUsageTypeProvider : UsageTypeProviderEx {
} else {
getClassUsageType()
}
is PackageViewDescriptor -> getClassUsageType()
is PackageViewDescriptor -> {
if (reference.getReference()?.resolve() is PsiPackage) getPackageUsageType() else getClassUsageType()
}
is VariableDescriptor -> getVariableUsageType()
is FunctionDescriptor -> getFunctionUsageType(descriptor)
else -> null
@@ -209,6 +215,10 @@ object JetUsageTypes {
val RECEIVER = UsageType(JetBundle.message("usageType.receiver"))
val DELEGATE = UsageType(JetBundle.message("usageType.delegate"))
// packages
val PACKAGE_DIRECTIVE = UsageType(JetBundle.message("usageType.packageDirective"))
val PACKAGE_MEMBER_ACCESS = UsageType(JetBundle.message("usageType.packageMemberAccess"))
// common usage types
val CALLABLE_REFERENCE = UsageType(JetBundle.message("usageType.callable.reference"))
}
@@ -0,0 +1,10 @@
// PSI_ELEMENT: com.intellij.psi.PsiPackage
// OPTIONS: usages
// FIND_BY_REF
package <caret>foo.bar
import foo.bar.X
class X
val x: foo.bar.X? = foo.bar.X()
@@ -0,0 +1,4 @@
Class/object property type (10: 8) val x: foo.bar.X? = foo.bar.X()
Package directive (4: 9) package foo.bar
Package member access (10: 21) val x: foo.bar.X? = foo.bar.X()
Usage in import (6: 8) import foo.bar.X
@@ -202,6 +202,13 @@ public abstract class AbstractJetFindUsagesTest extends LightCodeInsightFixtureT
return new JavaVariableFindUsagesOptions(project);
}
},
JAVA_PACKAGE {
@NotNull
@Override
public FindUsagesOptions parse(@NotNull String text, @NotNull Project project) {
return new JavaPackageFindUsagesOptions(project);
}
},
DEFAULT {
@NotNull
@Override
@@ -247,6 +254,9 @@ public abstract class AbstractJetFindUsagesTest extends LightCodeInsightFixtureT
if (klass == PsiField.class) {
return JAVA_FIELD;
}
if (klass == PsiPackage.class) {
return JAVA_PACKAGE;
}
if (klass == JetTypeParameter.class) {
return DEFAULT;
}
@@ -16,24 +16,21 @@
package org.jetbrains.jet.findUsages;
import junit.framework.Assert;
import junit.framework.Test;
import junit.framework.TestSuite;
import java.io.File;
import java.util.regex.Pattern;
import org.jetbrains.jet.JetTestUtils;
import org.jetbrains.jet.test.InnerTestClasses;
import org.jetbrains.jet.test.TestMetadata;
import org.jetbrains.jet.findUsages.AbstractJetFindUsagesTest;
import java.io.File;
import java.util.regex.Pattern;
/** This class is generated by {@link org.jetbrains.jet.generators.tests.TestsPackage}. DO NOT MODIFY MANUALLY */
@SuppressWarnings("all")
@InnerTestClasses({JetFindUsagesTestGenerated.Kotlin.class, JetFindUsagesTestGenerated.Java.class})
public class JetFindUsagesTestGenerated extends AbstractJetFindUsagesTest {
@TestMetadata("idea/testData/findUsages/kotlin")
@InnerTestClasses({Kotlin.FindClassUsages.class, Kotlin.FindFunctionUsages.class, Kotlin.FindObjectUsages.class, Kotlin.FindParameterUsages.class, Kotlin.FindPropertyUsages.class, Kotlin.FindTypeParameterUsages.class, Kotlin.FindWithFilteringImports.class, Kotlin.FindWithStructuralGrouping.class, Kotlin.UnresolvedAnnotation.class})
@InnerTestClasses({Kotlin.FindClassUsages.class, Kotlin.FindFunctionUsages.class, Kotlin.FindObjectUsages.class, Kotlin.FindPackageUsages.class, Kotlin.FindParameterUsages.class, Kotlin.FindPropertyUsages.class, Kotlin.FindTypeParameterUsages.class, Kotlin.FindWithFilteringImports.class, Kotlin.FindWithStructuralGrouping.class, Kotlin.UnresolvedAnnotation.class})
public static class Kotlin extends AbstractJetFindUsagesTest {
public void testAllFilesPresentInKotlin() throws Exception {
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.TestsPackage", new File("idea/testData/findUsages/kotlin"), Pattern.compile("^(.+)\\.0\\.kt$"), true);
@@ -388,6 +385,19 @@ public class JetFindUsagesTestGenerated extends AbstractJetFindUsagesTest {
}
@TestMetadata("idea/testData/findUsages/kotlin/findPackageUsages")
public static class FindPackageUsages extends AbstractJetFindUsagesTest {
public void testAllFilesPresentInFindPackageUsages() throws Exception {
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.TestsPackage", new File("idea/testData/findUsages/kotlin/findPackageUsages"), Pattern.compile("^(.+)\\.0\\.kt$"), true);
}
@TestMetadata("kotlinPackageUsages.0.kt")
public void testKotlinPackageUsages() throws Exception {
doTest("idea/testData/findUsages/kotlin/findPackageUsages/kotlinPackageUsages.0.kt");
}
}
@TestMetadata("idea/testData/findUsages/kotlin/findParameterUsages")
public static class FindParameterUsages extends AbstractJetFindUsagesTest {
public void testAllFilesPresentInFindParameterUsages() throws Exception {
@@ -587,6 +597,7 @@ public class JetFindUsagesTestGenerated extends AbstractJetFindUsagesTest {
suite.addTestSuite(FindClassUsages.class);
suite.addTestSuite(FindFunctionUsages.class);
suite.addTestSuite(FindObjectUsages.class);
suite.addTestSuite(FindPackageUsages.class);
suite.addTestSuite(FindParameterUsages.class);
suite.addTestSuite(FindPropertyUsages.class);
suite.addTestSuite(FindTypeParameterUsages.class);