"Find Usages": add tests for Kotlin usages of Java declarations

This commit is contained in:
Alexey Sedunov
2013-10-29 16:22:26 +04:00
parent f41cfa2b8b
commit a0e90f38a2
30 changed files with 454 additions and 13 deletions
@@ -478,7 +478,8 @@ public class GenerateTests {
"idea/tests/",
"JetFindUsagesTest",
AbstractJetFindUsagesTest.class,
testModelWithPattern("idea/testData/findUsages", "^(.+)\\.0\\.kt$", "doTest")
testModelWithPattern("idea/testData/findUsages/kotlin", "^(.+)\\.0\\.kt$", "doTest"),
testModelWithPattern("idea/testData/findUsages/java", "^(.+)\\.0\\.java$", "doTest")
);
generateTest(
@@ -0,0 +1,14 @@
// PSI_ELEMENT: com.intellij.psi.PsiClass
// OPTIONS: usages
public class <caret>A {
public String bar = "bar";
public static String BAR = "BAR";
public void foo() {
}
public static void foos() {
}
}
@@ -0,0 +1,38 @@
public class X(bar: String? = A.BAR): A() {
var next: A? = A()
val myBar: String? = A.BAR
{
A.BAR = ""
A.foos()
}
fun foo(a: A) {
val aa: A = a
aa.bar = ""
}
fun getNext(): A? {
return next
}
public override fun foo() {
super<A>.foo()
}
class object: A() {
}
}
object O: A() {
}
fun X.bar(a: A = A()) {
}
fun Any.toA(): A? {
return if (this is A) this as A else null
}
@@ -0,0 +1,18 @@
Class/object property type (2: 15) var next: A? = A()
Function return types (15: 20) fun getNext(): A? {
Function return types (36: 16) fun Any.toA(): A? {
Instantiation (2: 20) var next: A? = A()
Instantiation (32: 18) fun X.bar(a: A = A()) {
Local variable type (11: 17) val aa: A = a
Parameter type (10: 16) fun foo(a: A) {
Parameter type (32: 14) fun X.bar(a: A = A()) {
Super type qualifier (20: 15) super<A>.foo()
Supertype (1: 39) public class X(bar: String? = A.BAR): A() {
Supertype (23: 19) class object: A() {
Supertype (28: 11) object O: A() {
Target type of 'as' operation (37: 35) return if (this is A) this as A else null
Target type of 'is' operation (37: 24) return if (this is A) this as A else null
Unclassified usage (1: 31) public class X(bar: String? = A.BAR): A() {
Unclassified usage (3: 26) val myBar: String? = A.BAR
Unclassified usage (6: 9) A.BAR = ""
Unclassified usage (7: 9) A.foos()
@@ -0,0 +1,14 @@
// PSI_ELEMENT: com.intellij.psi.PsiClass
// OPTIONS: fieldUsages
public class <caret>A {
public String bar = "bar";
public static String BAR = "BAR";
public void foo() {
}
public static void foos() {
}
}
@@ -0,0 +1,38 @@
public class X(bar: String? = A.BAR): A() {
var next: A? = A()
val myBar: String? = A.BAR
{
A.BAR = ""
A.foos()
}
fun foo(a: A) {
val aa: A = a
aa.bar = ""
}
fun getNext(): A? {
return next
}
public override fun foo() {
super<A>.foo()
}
class object: A() {
}
}
object O: A() {
}
fun X.bar(a: A = A()) {
}
fun Any.toA(): A? {
return if (this is A) this as A else null
}
@@ -0,0 +1,4 @@
Value read (1: 33) public class X(bar: String? = A.BAR): A() {
Value read (3: 28) val myBar: String? = A.BAR
Value write (12: 12) aa.bar = ""
Value write (6: 11) A.BAR = ""
@@ -0,0 +1,14 @@
// PSI_ELEMENT: com.intellij.psi.PsiClass
// OPTIONS: methodUsages
public class <caret>A {
public String bar = "bar";
public static String BAR = "BAR";
public void foo() {
}
public static void foos() {
}
}
@@ -0,0 +1,38 @@
public class X(bar: String? = A.BAR): A() {
var next: A? = A()
val myBar: String? = A.BAR
{
A.BAR = ""
A.foos()
}
fun foo(a: A) {
val aa: A = a
aa.bar = ""
}
fun getNext(): A? {
return next
}
public override fun foo() {
super<A>.foo()
}
class object: A() {
}
}
object O: A() {
}
fun X.bar(a: A = A()) {
}
fun Any.toA(): A? {
return if (this is A) this as A else null
}
@@ -0,0 +1,2 @@
Function call (20: 18) super<A>.foo()
Function call (7: 11) A.foos()
@@ -0,0 +1,5 @@
// PSI_ELEMENT: com.intellij.psi.PsiClass
// OPTIONS: derivedClasses
public class <caret>A {
}
@@ -0,0 +1,7 @@
public open class X: A()
public trait T: A
public open class Y: X()
public class Z: Y(), T
@@ -0,0 +1,3 @@
Unclassified usage (1: 19) public open class X: A()
Unclassified usage (5: 19) public open class Y: X()
Unclassified usage (7: 14) public class Z: Y(), T
@@ -0,0 +1,5 @@
// PSI_ELEMENT: com.intellij.psi.PsiClass
// OPTIONS: derivedInterfaces
public interface <caret>A {
}
@@ -0,0 +1,7 @@
public open class X: A
public trait T: A
public open class Y: X()
public class Z: Y(), T
@@ -0,0 +1 @@
Unclassified usage (3: 14) public trait T: A
@@ -0,0 +1,5 @@
// PSI_ELEMENT: com.intellij.psi.PsiClass
// OPTIONS: implementingClasses
public interface <caret>A {
}
@@ -0,0 +1,7 @@
public open class X: A
public trait T: A
public open class Y: X()
public class Z: Y(), T
@@ -0,0 +1,4 @@
Unclassified usage (1: 19) public open class X: A
Unclassified usage (5: 19) public open class Y: X()
Unclassified usage (7: 14) public class Z: Y(), T
Unclassified usage (7: 14) public class Z: Y(), T
@@ -0,0 +1,5 @@
// PSI_ELEMENT: com.intellij.psi.PsiField
// OPTIONS: readAccess
public class A {
public String <caret>foo = "foo";
}
@@ -0,0 +1,5 @@
fun test() {
val a = A()
a.foo = "bar"
println(a.foo)
}
@@ -0,0 +1,2 @@
Value read (4: 15) println(a.foo)
Value write (3: 7) a.foo = "bar"
@@ -0,0 +1,14 @@
// PSI_ELEMENT: com.intellij.psi.PsiMethod
// OPTIONS: overrides
public class A {
public void <caret>foo() {
}
}
public class B extends A {
@Override
public void foo() {
}
}
@@ -0,0 +1,17 @@
public open class X: A() {
public override fun foo() {
}
}
public class Y: X() {
public override fun foo() {
}
}
public class Z: B() {
public override fun foo() {
}
}
@@ -0,0 +1,4 @@
Unclassified usage (11: 17) public void foo() {
Unclassified usage (14: 25) public override fun foo() {
Unclassified usage (2: 25) public override fun foo() {
Unclassified usage (8: 25) public override fun foo() {
@@ -0,0 +1,14 @@
// PSI_ELEMENT: com.intellij.psi.PsiMethod
// OPTIONS: usages
class A {
public void <caret>foo() {
}
}
class B extends A {
@Override
public void foo() {
}
}
@@ -0,0 +1,7 @@
fun test() {
A().foo()
B().foo()
val a = A::foo
val b = B::foo
}
@@ -0,0 +1,4 @@
Callable reference (5: 16) val a = A::foo
Callable reference (6: 16) val b = B::foo
Function call (2: 9) A().foo()
Function call (3: 9) B().foo()
@@ -22,16 +22,13 @@ import com.google.common.base.Predicates;
import com.google.common.collect.Collections2;
import com.google.common.collect.Ordering;
import com.intellij.find.FindManager;
import com.intellij.find.findUsages.FindUsagesHandler;
import com.intellij.find.findUsages.FindUsagesOptions;
import com.intellij.find.findUsages.JavaFindUsagesOptions;
import com.intellij.find.findUsages.*;
import com.intellij.find.impl.FindManagerImpl;
import com.intellij.openapi.extensions.Extensions;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.PsiComment;
import com.intellij.psi.PsiElement;
import com.intellij.psi.*;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.testFramework.LightProjectDescriptor;
import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase;
@@ -140,6 +137,63 @@ public abstract class AbstractJetFindUsagesTest extends LightCodeInsightFixtureT
return options;
}
},
JAVA_CLASS {
@NotNull
@Override
public FindUsagesOptions parse(@NotNull String text, @NotNull Project project) {
KotlinClassFindUsagesOptions options = new KotlinClassFindUsagesOptions(project);
options.isUsages = false;
options.setSearchConstructorUsages(false);
for (String s : InTextDirectivesUtils.findListWithPrefixes(text, "// OPTIONS: ")) {
if (parseCommonOptions(options, s)) continue;
if (s.equals("derivedInterfaces")) {
options.isDerivedInterfaces = true;
}
else if (s.equals("derivedClasses")) {
options.isDerivedClasses = true;
}
else if (s.equals("implementingClasses")) {
options.isImplementingClasses = true;
}
else if (s.equals("methodUsages")) {
options.isMethodsUsages = true;
}
else if (s.equals("fieldUsages")) {
options.isFieldsUsages = true;
}
else fail("Invalid option: " + s);
}
return options;
}
},
JAVA_METHOD {
@NotNull
@Override
public FindUsagesOptions parse(@NotNull String text, @NotNull Project project) {
JavaMethodFindUsagesOptions options = new JavaMethodFindUsagesOptions(project);
options.isUsages = false;
for (String s : InTextDirectivesUtils.findListWithPrefixes(text, "// OPTIONS: ")) {
if (parseCommonOptions(options, s)) continue;
if (s.equals("overrides")) {
options.isOverridingMethods = true;
options.isImplementingMethods = true;
}
else fail("Invalid option: " + s);
}
return options;
}
},
JAVA_FIELD {
@NotNull
@Override
public FindUsagesOptions parse(@NotNull String text, @NotNull Project project) {
return new JavaVariableFindUsagesOptions(project);
}
};
protected static boolean parseCommonOptions(JavaFindUsagesOptions options, String s) {
@@ -170,6 +224,15 @@ public abstract class AbstractJetFindUsagesTest extends LightCodeInsightFixtureT
if (klass == JetClass.class) {
return CLASS;
}
if (klass == PsiMethod.class) {
return JAVA_METHOD;
}
if (klass == PsiClass.class) {
return JAVA_CLASS;
}
if (klass == PsiField.class) {
return JAVA_FIELD;
}
return null;
}
@@ -30,13 +30,8 @@ import org.jetbrains.jet.findUsages.AbstractJetFindUsagesTest;
/** This class is generated by {@link org.jetbrains.jet.generators.tests.GenerateTests}. DO NOT MODIFY MANUALLY */
@SuppressWarnings("all")
@TestMetadata("idea/testData/findUsages")
@InnerTestClasses({JetFindUsagesTest.Kotlin.class})
@InnerTestClasses({JetFindUsagesTest.Kotlin.class, JetFindUsagesTest.Java.class})
public class JetFindUsagesTest extends AbstractJetFindUsagesTest {
public void testAllFilesPresentInFindUsages() throws Exception {
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.GenerateTests", new File("idea/testData/findUsages"), Pattern.compile("^(.+)\\.0\\.kt$"), true);
}
@TestMetadata("idea/testData/findUsages/kotlin")
@InnerTestClasses({Kotlin.FindClassUsages.class, Kotlin.FindFunctionUsages.class, Kotlin.FindObjectUsages.class, Kotlin.FindPropertyUsages.class, Kotlin.FindWithFilteringImports.class, Kotlin.UnresolvedAnnotation.class})
public static class Kotlin extends AbstractJetFindUsagesTest {
@@ -380,10 +375,96 @@ public class JetFindUsagesTest extends AbstractJetFindUsagesTest {
}
}
@TestMetadata("idea/testData/findUsages/java")
@InnerTestClasses({Java.FindJavaClassUsages.class, Java.FindJavaFieldUsages.class, Java.FindJavaMethodUsages.class})
public static class Java extends AbstractJetFindUsagesTest {
public void testAllFilesPresentInJava() throws Exception {
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.GenerateTests", new File("idea/testData/findUsages/java"), Pattern.compile("^(.+)\\.0\\.java$"), true);
}
@TestMetadata("idea/testData/findUsages/java/findJavaClassUsages")
public static class FindJavaClassUsages extends AbstractJetFindUsagesTest {
public void testAllFilesPresentInFindJavaClassUsages() throws Exception {
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.GenerateTests", new File("idea/testData/findUsages/java/findJavaClassUsages"), Pattern.compile("^(.+)\\.0\\.java$"), true);
}
@TestMetadata("JKClassAllUsages.0.java")
public void testJKClassAllUsages() throws Exception {
doTest("idea/testData/findUsages/java/findJavaClassUsages/JKClassAllUsages.0.java");
}
@TestMetadata("JKClassFieldsUsages.0.java")
public void testJKClassFieldsUsages() throws Exception {
doTest("idea/testData/findUsages/java/findJavaClassUsages/JKClassFieldsUsages.0.java");
}
@TestMetadata("JKClassMethodsUsages.0.java")
public void testJKClassMethodsUsages() throws Exception {
doTest("idea/testData/findUsages/java/findJavaClassUsages/JKClassMethodsUsages.0.java");
}
@TestMetadata("JKDerivedClasses1.0.java")
public void testJKDerivedClasses1() throws Exception {
doTest("idea/testData/findUsages/java/findJavaClassUsages/JKDerivedClasses1.0.java");
}
@TestMetadata("JKDerivedClasses2.0.java")
public void testJKDerivedClasses2() throws Exception {
doTest("idea/testData/findUsages/java/findJavaClassUsages/JKDerivedClasses2.0.java");
}
@TestMetadata("JKDerivedClasses3.0.java")
public void testJKDerivedClasses3() throws Exception {
doTest("idea/testData/findUsages/java/findJavaClassUsages/JKDerivedClasses3.0.java");
}
}
@TestMetadata("idea/testData/findUsages/java/findJavaFieldUsages")
public static class FindJavaFieldUsages extends AbstractJetFindUsagesTest {
public void testAllFilesPresentInFindJavaFieldUsages() throws Exception {
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.GenerateTests", new File("idea/testData/findUsages/java/findJavaFieldUsages"), Pattern.compile("^(.+)\\.0\\.java$"), true);
}
@TestMetadata("JKFieldUsages.0.java")
public void testJKFieldUsages() throws Exception {
doTest("idea/testData/findUsages/java/findJavaFieldUsages/JKFieldUsages.0.java");
}
}
@TestMetadata("idea/testData/findUsages/java/findJavaMethodUsages")
public static class FindJavaMethodUsages extends AbstractJetFindUsagesTest {
public void testAllFilesPresentInFindJavaMethodUsages() throws Exception {
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.GenerateTests", new File("idea/testData/findUsages/java/findJavaMethodUsages"), Pattern.compile("^(.+)\\.0\\.java$"), true);
}
@TestMetadata("JKMethodOverrides.0.java")
public void testJKMethodOverrides() throws Exception {
doTest("idea/testData/findUsages/java/findJavaMethodUsages/JKMethodOverrides.0.java");
}
@TestMetadata("JKMethodUsages.0.java")
public void testJKMethodUsages() throws Exception {
doTest("idea/testData/findUsages/java/findJavaMethodUsages/JKMethodUsages.0.java");
}
}
public static Test innerSuite() {
TestSuite suite = new TestSuite("Java");
suite.addTestSuite(Java.class);
suite.addTestSuite(FindJavaClassUsages.class);
suite.addTestSuite(FindJavaFieldUsages.class);
suite.addTestSuite(FindJavaMethodUsages.class);
return suite;
}
}
public static Test suite() {
TestSuite suite = new TestSuite("JetFindUsagesTest");
suite.addTestSuite(JetFindUsagesTest.class);
suite.addTest(Kotlin.innerSuite());
suite.addTest(Java.innerSuite());
return suite;
}
}