diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/binding/CodegenBinding.java b/compiler/backend/src/org/jetbrains/jet/codegen/binding/CodegenBinding.java index 8719eeac9b0..9ca99540e42 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/binding/CodegenBinding.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/binding/CodegenBinding.java @@ -367,4 +367,40 @@ public class CodegenBinding { return null; } + + @NotNull + public static Collection getAllInnerClasses( + @NotNull BindingContext bindingContext, @NotNull ClassDescriptor outermostClass + ) { + Collection innerClasses = bindingContext.get(INNER_CLASSES, outermostClass); + if (innerClasses == null || innerClasses.isEmpty()) return Collections.emptySet(); + + Set allInnerClasses = new HashSet(); + + Deque stack = new ArrayDeque(innerClasses); + do { + ClassDescriptor currentClass = stack.pop(); + if (allInnerClasses.add(currentClass)) { + Collection nextClasses = bindingContext.get(INNER_CLASSES, currentClass); + if (nextClasses != null) { + for (ClassDescriptor nextClass : nextClasses) { + stack.push(nextClass); + } + } + } + } while (!stack.isEmpty()); + + return allInnerClasses; + } + + @NotNull + public static String getJvmInternalName(@NotNull BindingContext bindingContext, @NotNull ClassDescriptor classDescriptor) { + Type asmType = bindingContext.get(CodegenBinding.ASM_TYPE, classDescriptor); + assert (asmType != null); + + String jvmInternalName = asmType.getClassName(); + assert (jvmInternalName != null); + + return jvmInternalName; + } } diff --git a/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/GeneratedLightClassData.kt b/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/GeneratedLightClassData.kt deleted file mode 100644 index e68849f8f23..00000000000 --- a/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/GeneratedLightClassData.kt +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright 2010-2013 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.asJava - -import com.intellij.psi.impl.java.stubs.PsiJavaFileStub -import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor -import org.jetbrains.jet.lang.resolve.BindingContext -import com.intellij.psi.PsiElement -import org.jetbrains.jet.lang.descriptors.ClassDescriptor - -data class GeneratedLightClassData( - val javaFileStub: PsiJavaFileStub, - val jvmInternalName: String, - val descriptor: ClassDescriptor? -) diff --git a/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/KotlinJavaFileStubProvider.java b/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/KotlinJavaFileStubProvider.java index 9d17fee4dd9..8619eab849e 100644 --- a/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/KotlinJavaFileStubProvider.java +++ b/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/KotlinJavaFileStubProvider.java @@ -34,10 +34,10 @@ import com.intellij.psi.stubs.StubElement; import com.intellij.psi.util.CachedValueProvider; import com.intellij.psi.util.PsiModificationTracker; import com.intellij.testFramework.LightVirtualFile; +import com.intellij.util.containers.ContainerUtil; import com.intellij.util.containers.Stack; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.jetbrains.asm4.Type; import org.jetbrains.jet.codegen.CompilationErrorHandler; import org.jetbrains.jet.codegen.NamespaceCodegen; import org.jetbrains.jet.codegen.binding.CodegenBinding; @@ -48,13 +48,15 @@ import org.jetbrains.jet.lang.psi.JetClassOrObject; import org.jetbrains.jet.lang.psi.JetFile; import org.jetbrains.jet.lang.psi.JetPsiUtil; import org.jetbrains.jet.lang.resolve.BindingContext; +import org.jetbrains.jet.lang.resolve.BindingContextUtils; import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.jet.lang.types.lang.InlineUtil; import java.util.Collection; import java.util.Collections; +import java.util.Map; -public class KotlinJavaFileStubProvider implements CachedValueProvider { +public class KotlinJavaFileStubProvider implements CachedValueProvider { @NotNull public static KotlinJavaFileStubProvider createForPackageClass( @@ -82,8 +84,8 @@ public class KotlinJavaFileStubProvider implements CachedValueProvider allInnerClasses = CodegenBinding.getAllInnerClasses(bindingContext, classDescriptor); - String jvmInternalName = asmType.getClassName(); - assert (jvmInternalName != null); + Map innerClassesMap = ContainerUtil.newHashMap(); + for (ClassDescriptor innerClassDescriptor : allInnerClasses) { + JetClassOrObject innerClass = (JetClassOrObject) BindingContextUtils.descriptorToDeclaration( + bindingContext, innerClassDescriptor + ); + if (innerClass == null) continue; - return new GeneratedLightClassData(javaFileStub, jvmInternalName, classDescriptor); + InnerKotlinClassLightClassData innerLightClassData = new InnerKotlinClassLightClassData( + CodegenBinding.getJvmInternalName(bindingContext, innerClassDescriptor), + innerClass, + innerClassDescriptor + ); + innerClassesMap.put(innerClass, innerLightClassData); + } + + return new LightClassStubWithData( + javaFileStub, + new OutermostKotlinClassLightClassData(jvmInternalName, classOrObject, classDescriptor, innerClassesMap) + ); } @NotNull @@ -173,7 +190,7 @@ public class KotlinJavaFileStubProvider implements CachedValueProvider compute() { + public Result compute() { FqName packageFqName = stubGenerationStrategy.getPackageFqName(); Collection files = stubGenerationStrategy.getFiles(); @@ -221,7 +238,7 @@ public class KotlinJavaFileStubProvider implements CachedValueProvider files); @NotNull - GeneratedLightClassData createStubWithName(PsiJavaFileStub javaFileStub, BindingContext bindingContext); + LightClassStubWithData createLightClassStubWithData(PsiJavaFileStub javaFileStub, BindingContext bindingContext); @NotNull Collection getFiles(); @NotNull FqName getPackageFqName(); boolean generateDeclaredClasses(); diff --git a/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/KotlinLightClassForExplicitDeclaration.java b/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/KotlinLightClassForExplicitDeclaration.java index a7aeae36dcf..6a8b6e60d08 100644 --- a/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/KotlinLightClassForExplicitDeclaration.java +++ b/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/KotlinLightClassForExplicitDeclaration.java @@ -42,7 +42,8 @@ import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.codegen.binding.PsiCodegenPredictor; import org.jetbrains.jet.lang.descriptors.ClassDescriptor; import org.jetbrains.jet.lang.psi.*; -import org.jetbrains.jet.lang.resolve.*; +import org.jetbrains.jet.lang.resolve.DescriptorUtils; +import org.jetbrains.jet.lang.resolve.ResolvePackage; import org.jetbrains.jet.lang.resolve.java.JvmClassName; import org.jetbrains.jet.lang.resolve.java.jetAsJava.JetJavaMirrorMarker; import org.jetbrains.jet.lang.resolve.name.FqName; @@ -59,7 +60,7 @@ import java.util.List; import static org.jetbrains.jet.lexer.JetTokens.*; public class KotlinLightClassForExplicitDeclaration extends KotlinWrappingLightClass implements KotlinLightClass, JetJavaMirrorMarker { - private final static Key> JAVA_API_STUB = Key.create("JAVA_API_STUB"); + private final static Key> JAVA_API_STUB = Key.create("JAVA_API_STUB"); @Nullable public static KotlinLightClassForExplicitDeclaration create(@NotNull PsiManager manager, @NotNull JetClassOrObject classOrObject) { @@ -77,7 +78,7 @@ public class KotlinLightClassForExplicitDeclaration extends KotlinWrappingLightC private static String getJvmInternalName(JetClassOrObject classOrObject) { if (JetPsiUtil.isLocal(classOrObject)) { - return getGeneratedLightClassData(classOrObject).getJvmInternalName(); + return getLightClassDataExactly(classOrObject).getJvmInternalName(); } return PsiCodegenPredictor.getPredefinedJvmInternalName(classOrObject); } @@ -156,24 +157,21 @@ public class KotlinLightClassForExplicitDeclaration extends KotlinWrappingLightC @NotNull private PsiJavaFileStub getJavaFileStub() { - return getGeneratedLightClassData().getJavaFileStub(); + return getLightClassStubWithData().getJavaFileStub(); } @NotNull private ClassDescriptor getDescriptor() { - ClassDescriptor descriptor = getGeneratedLightClassData().getDescriptor(); - assert descriptor != null; - - return descriptor; + return getLightClassDataExactly(classOrObject).getDescriptor(); } @NotNull - private GeneratedLightClassData getGeneratedLightClassData() { - return getGeneratedLightClassData(classOrObject); + private LightClassStubWithData getLightClassStubWithData() { + return getLightClassStubWithData(classOrObject); } @NotNull - private static GeneratedLightClassData getGeneratedLightClassData(JetClassOrObject classOrObject) { + private static LightClassStubWithData getLightClassStubWithData(JetClassOrObject classOrObject) { JetClassOrObject outermostClassOrObject = getOutermostClassOrObject(classOrObject); return CachedValuesManager.getManager(classOrObject.getProject()).getCachedValue( outermostClassOrObject, @@ -183,6 +181,18 @@ public class KotlinLightClassForExplicitDeclaration extends KotlinWrappingLightC ); } + @NotNull + private static LightClassDataForKotlinClass getLightClassDataExactly(JetClassOrObject classOrObject) { + OutermostKotlinClassLightClassData data = + (OutermostKotlinClassLightClassData) getLightClassStubWithData(classOrObject).getClassData(); + + if (data.getClassOrObject().equals(classOrObject)) return data; + + LightClassDataForKotlinClass innerClassData = data.getAllInnerClasses().get(classOrObject); + assert innerClassData != null; + return innerClassData; + } + @NotNull private static JetClassOrObject getOutermostClassOrObject(@NotNull JetClassOrObject classOrObject) { JetClassOrObject outermostClass = JetPsiUtil.getOutermostClassOrObject(classOrObject); diff --git a/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/KotlinLightClassForPackage.java b/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/KotlinLightClassForPackage.java index ee8f2fdad4e..d93d8558d95 100644 --- a/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/KotlinLightClassForPackage.java +++ b/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/KotlinLightClassForPackage.java @@ -47,7 +47,7 @@ public class KotlinLightClassForPackage extends KotlinWrappingLightClass impleme private final GlobalSearchScope searchScope; private final Collection files; private final int hashCode; - private final CachedValue javaFileStub; + private final CachedValue javaFileStub; private final PsiModifierList modifierList; private final LightEmptyImplementsList implementsList; diff --git a/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/LightClassStubWithData.kt b/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/LightClassStubWithData.kt new file mode 100644 index 00000000000..9a4349887ee --- /dev/null +++ b/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/LightClassStubWithData.kt @@ -0,0 +1,52 @@ +/* + * Copyright 2010-2013 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.asJava + +import com.intellij.psi.impl.java.stubs.PsiJavaFileStub +import org.jetbrains.jet.lang.descriptors.ClassDescriptor +import org.jetbrains.jet.lang.psi.JetClassOrObject + +trait LightClassData { + val jvmInternalName: String +} + +trait LightClassDataForKotlinClass: LightClassData { + val classOrObject: JetClassOrObject + val descriptor: ClassDescriptor +} + +object KotlinPackageLightClassData: LightClassData { + override val jvmInternalName: String = "" +} + +data class InnerKotlinClassLightClassData( + override val jvmInternalName: String, + override val classOrObject: JetClassOrObject, + override val descriptor: ClassDescriptor +): LightClassDataForKotlinClass + +data class OutermostKotlinClassLightClassData( + override val jvmInternalName: String, + override val classOrObject: JetClassOrObject, + override val descriptor: ClassDescriptor, + val allInnerClasses: Map +): LightClassDataForKotlinClass + +data class LightClassStubWithData( + val javaFileStub: PsiJavaFileStub, + val classData: LightClassData +) \ No newline at end of file diff --git a/idea/testData/findUsages/java/findJavaClassUsages/JKClassDerivedInnerClasses.0.java b/idea/testData/findUsages/java/findJavaClassUsages/JKClassDerivedInnerClasses.0.java new file mode 100644 index 00000000000..1b651131d41 --- /dev/null +++ b/idea/testData/findUsages/java/findJavaClassUsages/JKClassDerivedInnerClasses.0.java @@ -0,0 +1,5 @@ +// PSI_ELEMENT: com.intellij.psi.PsiClass +// OPTIONS: derivedClasses +public class A { + +} \ No newline at end of file diff --git a/idea/testData/findUsages/java/findJavaClassUsages/JKClassDerivedInnerClasses.1.kt b/idea/testData/findUsages/java/findJavaClassUsages/JKClassDerivedInnerClasses.1.kt new file mode 100644 index 00000000000..87d94664872 --- /dev/null +++ b/idea/testData/findUsages/java/findJavaClassUsages/JKClassDerivedInnerClasses.1.kt @@ -0,0 +1,11 @@ +public class Outer { + public open class X: A() + + public trait T: A + + public class Inner { + public open class Y: X() + + public class Z: Y(), T + } +} \ No newline at end of file diff --git a/idea/testData/findUsages/java/findJavaClassUsages/JKClassDerivedInnerClasses.results.txt b/idea/testData/findUsages/java/findJavaClassUsages/JKClassDerivedInnerClasses.results.txt new file mode 100644 index 00000000000..61f1193f5e0 --- /dev/null +++ b/idea/testData/findUsages/java/findJavaClassUsages/JKClassDerivedInnerClasses.results.txt @@ -0,0 +1,5 @@ +Unclassified usage (2: 23) public open class X: A() +Unclassified usage (4: 18) public trait T: A +Unclassified usage (7: 27) public open class Y: X() +Unclassified usage (9: 22) public class Z: Y(), T +Unclassified usage (9: 22) public class Z: Y(), T diff --git a/idea/testData/findUsages/java/findJavaClassUsages/JKClassDerivedInnerObjects.0.java b/idea/testData/findUsages/java/findJavaClassUsages/JKClassDerivedInnerObjects.0.java new file mode 100644 index 00000000000..1b651131d41 --- /dev/null +++ b/idea/testData/findUsages/java/findJavaClassUsages/JKClassDerivedInnerObjects.0.java @@ -0,0 +1,5 @@ +// PSI_ELEMENT: com.intellij.psi.PsiClass +// OPTIONS: derivedClasses +public class A { + +} \ No newline at end of file diff --git a/idea/testData/findUsages/java/findJavaClassUsages/JKClassDerivedInnerObjects.1.kt b/idea/testData/findUsages/java/findJavaClassUsages/JKClassDerivedInnerObjects.1.kt new file mode 100644 index 00000000000..74a3ce6c01f --- /dev/null +++ b/idea/testData/findUsages/java/findJavaClassUsages/JKClassDerivedInnerObjects.1.kt @@ -0,0 +1,10 @@ +class Outer { + public trait T: A + + public object O1: A() + + class Inner { + public object O2: T + } +} + diff --git a/idea/testData/findUsages/java/findJavaClassUsages/JKClassDerivedInnerObjects.results.txt b/idea/testData/findUsages/java/findJavaClassUsages/JKClassDerivedInnerObjects.results.txt new file mode 100644 index 00000000000..72eb88703d0 --- /dev/null +++ b/idea/testData/findUsages/java/findJavaClassUsages/JKClassDerivedInnerObjects.results.txt @@ -0,0 +1,3 @@ +Unclassified usage (2: 18) public trait T: A +Unclassified usage (4: 19) public object O1: A() +Unclassified usage (7: 23) public object O2: T diff --git a/idea/testData/findUsages/java/findJavaClassUsages/JKInterfaceDerivedInnerClasses.0.java b/idea/testData/findUsages/java/findJavaClassUsages/JKInterfaceDerivedInnerClasses.0.java new file mode 100644 index 00000000000..699b54fd6c4 --- /dev/null +++ b/idea/testData/findUsages/java/findJavaClassUsages/JKInterfaceDerivedInnerClasses.0.java @@ -0,0 +1,5 @@ +// PSI_ELEMENT: com.intellij.psi.PsiClass +// OPTIONS: implementingClasses +public interface A { + +} diff --git a/idea/testData/findUsages/java/findJavaClassUsages/JKInterfaceDerivedInnerClasses.1.kt b/idea/testData/findUsages/java/findJavaClassUsages/JKInterfaceDerivedInnerClasses.1.kt new file mode 100644 index 00000000000..895e3c0e23f --- /dev/null +++ b/idea/testData/findUsages/java/findJavaClassUsages/JKInterfaceDerivedInnerClasses.1.kt @@ -0,0 +1,11 @@ +class Outer { + public open class X: A + + public trait T: A + + class Inner { + public open class Y: X() + + public class Z: Y(), T + } +} \ No newline at end of file diff --git a/idea/testData/findUsages/java/findJavaClassUsages/JKInterfaceDerivedInnerClasses.results.txt b/idea/testData/findUsages/java/findJavaClassUsages/JKInterfaceDerivedInnerClasses.results.txt new file mode 100644 index 00000000000..440c28a4a59 --- /dev/null +++ b/idea/testData/findUsages/java/findJavaClassUsages/JKInterfaceDerivedInnerClasses.results.txt @@ -0,0 +1,4 @@ +Unclassified usage (2: 23) public open class X: A +Unclassified usage (7: 27) public open class Y: X() +Unclassified usage (9: 22) public class Z: Y(), T +Unclassified usage (9: 22) public class Z: Y(), T diff --git a/idea/testData/findUsages/java/findJavaClassUsages/JKInterfaceDerivedInnerObjects.0.java b/idea/testData/findUsages/java/findJavaClassUsages/JKInterfaceDerivedInnerObjects.0.java new file mode 100644 index 00000000000..2f1ebac5750 --- /dev/null +++ b/idea/testData/findUsages/java/findJavaClassUsages/JKInterfaceDerivedInnerObjects.0.java @@ -0,0 +1,5 @@ +// PSI_ELEMENT: com.intellij.psi.PsiClass +// OPTIONS: implementingClasses +public interface A { + +} \ No newline at end of file diff --git a/idea/testData/findUsages/java/findJavaClassUsages/JKInterfaceDerivedInnerObjects.1.kt b/idea/testData/findUsages/java/findJavaClassUsages/JKInterfaceDerivedInnerObjects.1.kt new file mode 100644 index 00000000000..39cde3c77ee --- /dev/null +++ b/idea/testData/findUsages/java/findJavaClassUsages/JKInterfaceDerivedInnerObjects.1.kt @@ -0,0 +1,9 @@ +class Outer { + public open class T: A + + public object O1: A() + + class Inner { + public object O2: T() + } +} \ No newline at end of file diff --git a/idea/testData/findUsages/java/findJavaClassUsages/JKInterfaceDerivedInnerObjects.results.txt b/idea/testData/findUsages/java/findJavaClassUsages/JKInterfaceDerivedInnerObjects.results.txt new file mode 100644 index 00000000000..328c9aceee2 --- /dev/null +++ b/idea/testData/findUsages/java/findJavaClassUsages/JKInterfaceDerivedInnerObjects.results.txt @@ -0,0 +1,3 @@ +Unclassified usage (2: 23) public open class T: A +Unclassified usage (4: 19) public object O1: A() +Unclassified usage (7: 23) public object O2: T() diff --git a/idea/testData/findUsages/kotlin/findClassUsages/kotlinClassDerivedInnerClasses.0.kt b/idea/testData/findUsages/kotlin/findClassUsages/kotlinClassDerivedInnerClasses.0.kt new file mode 100644 index 00000000000..bb98ff4b379 --- /dev/null +++ b/idea/testData/findUsages/kotlin/findClassUsages/kotlinClassDerivedInnerClasses.0.kt @@ -0,0 +1,13 @@ +// PSI_ELEMENT: org.jetbrains.jet.lang.psi.JetClass +// OPTIONS: derivedClasses +trait X { + +} + +open class A: X { + +} + +trait Y: X { + +} \ No newline at end of file diff --git a/idea/testData/findUsages/kotlin/findClassUsages/kotlinClassDerivedInnerClasses.1.kt b/idea/testData/findUsages/kotlin/findClassUsages/kotlinClassDerivedInnerClasses.1.kt new file mode 100644 index 00000000000..6ae6c8dd62d --- /dev/null +++ b/idea/testData/findUsages/kotlin/findClassUsages/kotlinClassDerivedInnerClasses.1.kt @@ -0,0 +1,21 @@ +// PSI_ELEMENT: org.jetbrains.jet.lang.psi.JetClass +// OPTIONS: derivedClasses +class Outer { + open class B: A() { + + } + + open class C: Y { + + } + + class Inner { + trait Z: A { + + } + + class U: Z { + + } + } +} \ No newline at end of file diff --git a/idea/testData/findUsages/kotlin/findClassUsages/kotlinClassDerivedInnerClasses.results.txt b/idea/testData/findUsages/kotlin/findClassUsages/kotlinClassDerivedInnerClasses.results.txt new file mode 100644 index 00000000000..f929716dcbe --- /dev/null +++ b/idea/testData/findUsages/kotlin/findClassUsages/kotlinClassDerivedInnerClasses.results.txt @@ -0,0 +1,2 @@ +Unclassified usage (17: 15) class U: Z { +Unclassified usage (4: 16) open class B: A() { diff --git a/idea/testData/findUsages/kotlin/findClassUsages/kotlinClassDerivedInnerObjects.0.kt b/idea/testData/findUsages/kotlin/findClassUsages/kotlinClassDerivedInnerObjects.0.kt new file mode 100644 index 00000000000..c24dd193978 --- /dev/null +++ b/idea/testData/findUsages/kotlin/findClassUsages/kotlinClassDerivedInnerObjects.0.kt @@ -0,0 +1,5 @@ +// PSI_ELEMENT: org.jetbrains.jet.lang.psi.JetClass +// OPTIONS: derivedClasses +open class A { + +} \ No newline at end of file diff --git a/idea/testData/findUsages/kotlin/findClassUsages/kotlinClassDerivedInnerObjects.1.kt b/idea/testData/findUsages/kotlin/findClassUsages/kotlinClassDerivedInnerObjects.1.kt new file mode 100644 index 00000000000..f3f7435e99b --- /dev/null +++ b/idea/testData/findUsages/kotlin/findClassUsages/kotlinClassDerivedInnerObjects.1.kt @@ -0,0 +1,13 @@ +// PSI_ELEMENT: org.jetbrains.jet.lang.psi.JetClass +// OPTIONS: derivedClasses +class Outer { + trait Z: A { + + } + + object O1: A() + + class Inner { + object O2: Z + } +} \ No newline at end of file diff --git a/idea/testData/findUsages/kotlin/findClassUsages/kotlinClassDerivedInnerObjects.results.txt b/idea/testData/findUsages/kotlin/findClassUsages/kotlinClassDerivedInnerObjects.results.txt new file mode 100644 index 00000000000..f13a5b4c5ac --- /dev/null +++ b/idea/testData/findUsages/kotlin/findClassUsages/kotlinClassDerivedInnerObjects.results.txt @@ -0,0 +1,2 @@ +Unclassified usage (11: 16) object O2: Z +Unclassified usage (8: 12) object O1: A() diff --git a/idea/testData/findUsages/kotlin/findClassUsages/kotlinTraitDerivedInnerClasses.0.kt b/idea/testData/findUsages/kotlin/findClassUsages/kotlinTraitDerivedInnerClasses.0.kt new file mode 100644 index 00000000000..1813a7169ac --- /dev/null +++ b/idea/testData/findUsages/kotlin/findClassUsages/kotlinTraitDerivedInnerClasses.0.kt @@ -0,0 +1,13 @@ +// PSI_ELEMENT: org.jetbrains.jet.lang.psi.JetClass +// OPTIONS: derivedClasses +trait X { + +} + +open class A: X { + +} + +trait Y: X { + +} \ No newline at end of file diff --git a/idea/testData/findUsages/kotlin/findClassUsages/kotlinTraitDerivedInnerClasses.1.kt b/idea/testData/findUsages/kotlin/findClassUsages/kotlinTraitDerivedInnerClasses.1.kt new file mode 100644 index 00000000000..3321582d8ab --- /dev/null +++ b/idea/testData/findUsages/kotlin/findClassUsages/kotlinTraitDerivedInnerClasses.1.kt @@ -0,0 +1,21 @@ +// PSI_ELEMENT: org.jetbrains.jet.lang.psi.JetClass +// OPTIONS: derivedClasses +class Outer { + open class B: A() { + + } + + open class C: Y { + + } + + class Inner { + trait Z: A { + + } + + trait U: Z { + + } + } +} \ No newline at end of file diff --git a/idea/testData/findUsages/kotlin/findClassUsages/kotlinTraitDerivedInnerClasses.results.txt b/idea/testData/findUsages/kotlin/findClassUsages/kotlinTraitDerivedInnerClasses.results.txt new file mode 100644 index 00000000000..d43e4c8f4e3 --- /dev/null +++ b/idea/testData/findUsages/kotlin/findClassUsages/kotlinTraitDerivedInnerClasses.results.txt @@ -0,0 +1,3 @@ +Unclassified usage (4: 16) open class B: A() { +Unclassified usage (7: 12) open class A: X { +Unclassified usage (8: 16) open class C: Y { diff --git a/idea/testData/findUsages/kotlin/findClassUsages/kotlinTraitDerivedInnerObjects.0.kt b/idea/testData/findUsages/kotlin/findClassUsages/kotlinTraitDerivedInnerObjects.0.kt new file mode 100644 index 00000000000..1813a7169ac --- /dev/null +++ b/idea/testData/findUsages/kotlin/findClassUsages/kotlinTraitDerivedInnerObjects.0.kt @@ -0,0 +1,13 @@ +// PSI_ELEMENT: org.jetbrains.jet.lang.psi.JetClass +// OPTIONS: derivedClasses +trait X { + +} + +open class A: X { + +} + +trait Y: X { + +} \ No newline at end of file diff --git a/idea/testData/findUsages/kotlin/findClassUsages/kotlinTraitDerivedInnerObjects.1.kt b/idea/testData/findUsages/kotlin/findClassUsages/kotlinTraitDerivedInnerObjects.1.kt new file mode 100644 index 00000000000..21d871ed3b3 --- /dev/null +++ b/idea/testData/findUsages/kotlin/findClassUsages/kotlinTraitDerivedInnerObjects.1.kt @@ -0,0 +1,13 @@ +// PSI_ELEMENT: org.jetbrains.jet.lang.psi.JetClass +// OPTIONS: derivedClasses +class Outer { + object O1: A() { + + } + + class Inner { + object O2: X { + + } + } +} \ No newline at end of file diff --git a/idea/testData/findUsages/kotlin/findClassUsages/kotlinTraitDerivedInnerObjects.results.txt b/idea/testData/findUsages/kotlin/findClassUsages/kotlinTraitDerivedInnerObjects.results.txt new file mode 100644 index 00000000000..36bd42d4c01 --- /dev/null +++ b/idea/testData/findUsages/kotlin/findClassUsages/kotlinTraitDerivedInnerObjects.results.txt @@ -0,0 +1,3 @@ +Unclassified usage (4: 12) object O1: A() { +Unclassified usage (7: 12) open class A: X { +Unclassified usage (9: 16) object O2: X { diff --git a/idea/tests/org/jetbrains/jet/findUsages/JetFindUsagesTestGenerated.java b/idea/tests/org/jetbrains/jet/findUsages/JetFindUsagesTestGenerated.java index b0a1d0fbb06..fd90605ebbf 100644 --- a/idea/tests/org/jetbrains/jet/findUsages/JetFindUsagesTestGenerated.java +++ b/idea/tests/org/jetbrains/jet/findUsages/JetFindUsagesTestGenerated.java @@ -135,6 +135,16 @@ public class JetFindUsagesTestGenerated extends AbstractJetFindUsagesTest { doTest("idea/testData/findUsages/kotlin/findClassUsages/kotlinClassDerivedClasses.0.kt"); } + @TestMetadata("kotlinClassDerivedInnerClasses.0.kt") + public void testKotlinClassDerivedInnerClasses() throws Exception { + doTest("idea/testData/findUsages/kotlin/findClassUsages/kotlinClassDerivedInnerClasses.0.kt"); + } + + @TestMetadata("kotlinClassDerivedInnerObjects.0.kt") + public void testKotlinClassDerivedInnerObjects() throws Exception { + doTest("idea/testData/findUsages/kotlin/findClassUsages/kotlinClassDerivedInnerObjects.0.kt"); + } + @TestMetadata("kotlinClassDerivedLocalClasses.0.kt") public void testKotlinClassDerivedLocalClasses() throws Exception { doTest("idea/testData/findUsages/kotlin/findClassUsages/kotlinClassDerivedLocalClasses.0.kt"); @@ -240,6 +250,16 @@ public class JetFindUsagesTestGenerated extends AbstractJetFindUsagesTest { doTest("idea/testData/findUsages/kotlin/findClassUsages/kotlinTraitDerivedClasses.0.kt"); } + @TestMetadata("kotlinTraitDerivedInnerClasses.0.kt") + public void testKotlinTraitDerivedInnerClasses() throws Exception { + doTest("idea/testData/findUsages/kotlin/findClassUsages/kotlinTraitDerivedInnerClasses.0.kt"); + } + + @TestMetadata("kotlinTraitDerivedInnerObjects.0.kt") + public void testKotlinTraitDerivedInnerObjects() throws Exception { + doTest("idea/testData/findUsages/kotlin/findClassUsages/kotlinTraitDerivedInnerObjects.0.kt"); + } + @TestMetadata("kotlinTraitDerivedLocalClasses.0.kt") public void testKotlinTraitDerivedLocalClasses() throws Exception { doTest("idea/testData/findUsages/kotlin/findClassUsages/kotlinTraitDerivedLocalClasses.0.kt"); @@ -571,6 +591,16 @@ public class JetFindUsagesTestGenerated extends AbstractJetFindUsagesTest { doTest("idea/testData/findUsages/java/findJavaClassUsages/JKClassDerivedClasses.0.java"); } + @TestMetadata("JKClassDerivedInnerClasses.0.java") + public void testJKClassDerivedInnerClasses() throws Exception { + doTest("idea/testData/findUsages/java/findJavaClassUsages/JKClassDerivedInnerClasses.0.java"); + } + + @TestMetadata("JKClassDerivedInnerObjects.0.java") + public void testJKClassDerivedInnerObjects() throws Exception { + doTest("idea/testData/findUsages/java/findJavaClassUsages/JKClassDerivedInnerObjects.0.java"); + } + @TestMetadata("JKClassDerivedLocalClasses.0.java") public void testJKClassDerivedLocalClasses() throws Exception { doTest("idea/testData/findUsages/java/findJavaClassUsages/JKClassDerivedLocalClasses.0.java"); @@ -616,6 +646,16 @@ public class JetFindUsagesTestGenerated extends AbstractJetFindUsagesTest { doTest("idea/testData/findUsages/java/findJavaClassUsages/JKInterfaceDerivedClasses.0.java"); } + @TestMetadata("JKInterfaceDerivedInnerClasses.0.java") + public void testJKInterfaceDerivedInnerClasses() throws Exception { + doTest("idea/testData/findUsages/java/findJavaClassUsages/JKInterfaceDerivedInnerClasses.0.java"); + } + + @TestMetadata("JKInterfaceDerivedInnerObjects.0.java") + public void testJKInterfaceDerivedInnerObjects() throws Exception { + doTest("idea/testData/findUsages/java/findJavaClassUsages/JKInterfaceDerivedInnerObjects.0.java"); + } + @TestMetadata("JKInterfaceDerivedLocalClasses.0.java") public void testJKInterfaceDerivedLocalClasses() throws Exception { doTest("idea/testData/findUsages/java/findJavaClassUsages/JKInterfaceDerivedLocalClasses.0.java");