Remove unjustified assertions
This commit is contained in:
+6
-1
@@ -124,7 +124,12 @@ public class KotlinJavaFileStubProvider implements CachedValueProvider<LightClas
|
|||||||
@Override
|
@Override
|
||||||
public LightClassStubWithData createLightClassStubWithData(PsiJavaFileStub javaFileStub, BindingContext bindingContext) {
|
public LightClassStubWithData createLightClassStubWithData(PsiJavaFileStub javaFileStub, BindingContext bindingContext) {
|
||||||
ClassDescriptor classDescriptor = bindingContext.get(BindingContext.CLASS, classOrObject);
|
ClassDescriptor classDescriptor = bindingContext.get(BindingContext.CLASS, classOrObject);
|
||||||
assert (classDescriptor != null);
|
if (classDescriptor == null) {
|
||||||
|
return new LightClassStubWithData(
|
||||||
|
javaFileStub,
|
||||||
|
new OutermostKotlinClassLightClassData("", classOrObject, null, Collections.<JetClassOrObject, LightClassDataForKotlinClass>emptyMap())
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
String jvmInternalName = CodegenBinding.getJvmInternalName(bindingContext, classDescriptor);
|
String jvmInternalName = CodegenBinding.getJvmInternalName(bindingContext, classDescriptor);
|
||||||
Collection<ClassDescriptor> allInnerClasses = CodegenBinding.getAllInnerClasses(bindingContext, classDescriptor);
|
Collection<ClassDescriptor> allInnerClasses = CodegenBinding.getAllInnerClasses(bindingContext, classDescriptor);
|
||||||
|
|||||||
+17
-13
@@ -90,7 +90,8 @@ public class KotlinLightClassForExplicitDeclaration extends KotlinWrappingLightC
|
|||||||
|
|
||||||
private static String getJvmInternalName(JetClassOrObject classOrObject) {
|
private static String getJvmInternalName(JetClassOrObject classOrObject) {
|
||||||
if (JetPsiUtil.isLocal(classOrObject)) {
|
if (JetPsiUtil.isLocal(classOrObject)) {
|
||||||
return getLightClassDataExactly(classOrObject).getJvmInternalName();
|
LightClassData data = getLightClassDataExactly(classOrObject);
|
||||||
|
return data != null ? data.getJvmInternalName() : "";
|
||||||
}
|
}
|
||||||
return PsiCodegenPredictor.getPredefinedJvmInternalName(classOrObject);
|
return PsiCodegenPredictor.getPredefinedJvmInternalName(classOrObject);
|
||||||
}
|
}
|
||||||
@@ -255,9 +256,10 @@ public class KotlinLightClassForExplicitDeclaration extends KotlinWrappingLightC
|
|||||||
return getLightClassStubWithData().getJavaFileStub();
|
return getLightClassStubWithData().getJavaFileStub();
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@Nullable
|
||||||
protected final ClassDescriptor getDescriptor() {
|
protected final ClassDescriptor getDescriptor() {
|
||||||
return getLightClassDataExactly(classOrObject).getDescriptor();
|
LightClassDataForKotlinClass data = getLightClassDataExactly(classOrObject);
|
||||||
|
return data != null ? data.getDescriptor() : null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
@@ -276,16 +278,11 @@ public class KotlinLightClassForExplicitDeclaration extends KotlinWrappingLightC
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@Nullable
|
||||||
private static LightClassDataForKotlinClass getLightClassDataExactly(JetClassOrObject classOrObject) {
|
private static LightClassDataForKotlinClass getLightClassDataExactly(JetClassOrObject classOrObject) {
|
||||||
OutermostKotlinClassLightClassData data =
|
OutermostKotlinClassLightClassData data =
|
||||||
(OutermostKotlinClassLightClassData) getLightClassStubWithData(classOrObject).getClassData();
|
(OutermostKotlinClassLightClassData) getLightClassStubWithData(classOrObject).getClassData();
|
||||||
|
return data.getClassOrObject().equals(classOrObject) ? data : data.getAllInnerClasses().get(classOrObject);
|
||||||
if (data.getClassOrObject().equals(classOrObject)) return data;
|
|
||||||
|
|
||||||
LightClassDataForKotlinClass innerClassData = data.getAllInnerClasses().get(classOrObject);
|
|
||||||
assert innerClassData != null;
|
|
||||||
return innerClassData;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
@@ -523,13 +520,17 @@ public class KotlinLightClassForExplicitDeclaration extends KotlinWrappingLightC
|
|||||||
public boolean isInheritor(@NotNull PsiClass baseClass, boolean checkDeep) {
|
public boolean isInheritor(@NotNull PsiClass baseClass, boolean checkDeep) {
|
||||||
String qualifiedName;
|
String qualifiedName;
|
||||||
if (baseClass instanceof KotlinLightClassForExplicitDeclaration) {
|
if (baseClass instanceof KotlinLightClassForExplicitDeclaration) {
|
||||||
qualifiedName = DescriptorUtils.getFqName(((KotlinLightClassForExplicitDeclaration) baseClass).getDescriptor()).asString();
|
ClassDescriptor baseDescriptor = ((KotlinLightClassForExplicitDeclaration) baseClass).getDescriptor();
|
||||||
|
qualifiedName = baseDescriptor != null ? DescriptorUtils.getFqName(baseDescriptor).asString() : null;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
qualifiedName = baseClass.getQualifiedName();
|
qualifiedName = baseClass.getQualifiedName();
|
||||||
}
|
}
|
||||||
|
|
||||||
return ResolvePackage.checkSuperTypeByFQName(getDescriptor(), qualifiedName, checkDeep);
|
ClassDescriptor thisDescriptor = getDescriptor();
|
||||||
|
return qualifiedName != null
|
||||||
|
&& thisDescriptor != null
|
||||||
|
&& ResolvePackage.checkSuperTypeByFQName(thisDescriptor, qualifiedName, checkDeep);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -573,7 +574,10 @@ public class KotlinLightClassForExplicitDeclaration extends KotlinWrappingLightC
|
|||||||
}
|
}
|
||||||
|
|
||||||
private String getFirstSupertypeFQName() {
|
private String getFirstSupertypeFQName() {
|
||||||
Collection<JetType> superTypes = getDescriptor().getTypeConstructor().getSupertypes();
|
ClassDescriptor descriptor = getDescriptor();
|
||||||
|
if (descriptor == null) return CommonClassNames.JAVA_LANG_OBJECT;
|
||||||
|
|
||||||
|
Collection<JetType> superTypes = descriptor.getTypeConstructor().getSupertypes();
|
||||||
|
|
||||||
if (superTypes.isEmpty()) return CommonClassNames.JAVA_LANG_OBJECT;
|
if (superTypes.isEmpty()) return CommonClassNames.JAVA_LANG_OBJECT;
|
||||||
|
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ trait LightClassData {
|
|||||||
|
|
||||||
trait LightClassDataForKotlinClass: LightClassData {
|
trait LightClassDataForKotlinClass: LightClassData {
|
||||||
val classOrObject: JetClassOrObject
|
val classOrObject: JetClassOrObject
|
||||||
val descriptor: ClassDescriptor
|
val descriptor: ClassDescriptor?
|
||||||
}
|
}
|
||||||
|
|
||||||
object KotlinPackageLightClassData: LightClassData {
|
object KotlinPackageLightClassData: LightClassData {
|
||||||
@@ -36,13 +36,13 @@ object KotlinPackageLightClassData: LightClassData {
|
|||||||
data class InnerKotlinClassLightClassData(
|
data class InnerKotlinClassLightClassData(
|
||||||
override val jvmInternalName: String,
|
override val jvmInternalName: String,
|
||||||
override val classOrObject: JetClassOrObject,
|
override val classOrObject: JetClassOrObject,
|
||||||
override val descriptor: ClassDescriptor
|
override val descriptor: ClassDescriptor?
|
||||||
): LightClassDataForKotlinClass
|
): LightClassDataForKotlinClass
|
||||||
|
|
||||||
data class OutermostKotlinClassLightClassData(
|
data class OutermostKotlinClassLightClassData(
|
||||||
override val jvmInternalName: String,
|
override val jvmInternalName: String,
|
||||||
override val classOrObject: JetClassOrObject,
|
override val classOrObject: JetClassOrObject,
|
||||||
override val descriptor: ClassDescriptor,
|
override val descriptor: ClassDescriptor?,
|
||||||
val allInnerClasses: Map<JetClassOrObject, LightClassDataForKotlinClass>
|
val allInnerClasses: Map<JetClassOrObject, LightClassDataForKotlinClass>
|
||||||
): LightClassDataForKotlinClass
|
): LightClassDataForKotlinClass
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,15 @@
|
|||||||
|
<node text="A ()" base="true">
|
||||||
|
<node text="B ()">
|
||||||
|
<node text="C ()">
|
||||||
|
<node text="O3 ()"/>
|
||||||
|
</node>
|
||||||
|
<node text="O2 ()"/>
|
||||||
|
</node>
|
||||||
|
<node text="T ()">
|
||||||
|
<node text="U ()">
|
||||||
|
<node text="O5 ()"/>
|
||||||
|
</node>
|
||||||
|
<node text="O4 ()"/>
|
||||||
|
</node>
|
||||||
|
<node text="O1 ()"/>
|
||||||
|
</node>
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
open class <caret>A
|
||||||
|
|
||||||
|
open class B: A()
|
||||||
|
|
||||||
|
trait T: A
|
||||||
|
|
||||||
|
open class C: B()
|
||||||
|
|
||||||
|
trait U: T
|
||||||
|
|
||||||
|
object O1: A()
|
||||||
|
|
||||||
|
object O2: B()
|
||||||
|
|
||||||
|
object O3: C()
|
||||||
|
|
||||||
|
object O4: T
|
||||||
|
|
||||||
|
object O5: U
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
<node text="A ()" base="true">
|
||||||
|
<node text="B ()">
|
||||||
|
<node text="C ()">
|
||||||
|
<node text="O3 ()"/>
|
||||||
|
</node>
|
||||||
|
<node text="O2 ()"/>
|
||||||
|
</node>
|
||||||
|
<node text="T ()">
|
||||||
|
<node text="U ()">
|
||||||
|
<node text="O5 ()"/>
|
||||||
|
</node>
|
||||||
|
<node text="O4 ()"/>
|
||||||
|
</node>
|
||||||
|
<node text="O1 ()"/>
|
||||||
|
</node>
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
trait <caret>A
|
||||||
|
|
||||||
|
open class B: A
|
||||||
|
|
||||||
|
trait T: A
|
||||||
|
|
||||||
|
open class C: B()
|
||||||
|
|
||||||
|
trait U: T
|
||||||
|
|
||||||
|
object O1: A
|
||||||
|
|
||||||
|
object O2: B()
|
||||||
|
|
||||||
|
object O3: C()
|
||||||
|
|
||||||
|
object O4: T
|
||||||
|
|
||||||
|
object O5: U
|
||||||
@@ -1,3 +1,12 @@
|
|||||||
<node text="A ()" base="true">
|
<node text="A ()" base="true">
|
||||||
<node text="MyClass ()"/>
|
<node text="B ()"/>
|
||||||
</node>
|
<node text="X in MyClass ()"/>
|
||||||
|
<node text="Anonymous in MyClass ()"/>
|
||||||
|
<node text="G in MyClass ()"/>
|
||||||
|
<node text="C in MyClass ()"/>
|
||||||
|
<node text="X in foo() in MyClass ()"/>
|
||||||
|
<node text="Anonymous in foo() in MyClass ()"/>
|
||||||
|
<node text="F in foo() in MyClass ()"/>
|
||||||
|
<node text="D in foo() in MyClass ()"/>
|
||||||
|
<node text="E in bar() in main.kt ()"/>
|
||||||
|
</node>
|
||||||
|
|||||||
@@ -1,3 +1,26 @@
|
|||||||
class MyClass: A()
|
open class <caret>A
|
||||||
|
|
||||||
open class <caret>A
|
class B: A() {}
|
||||||
|
|
||||||
|
class MyClass(a: A = run { class X: A(); object: A() {} }) {
|
||||||
|
inner class G: A() {}
|
||||||
|
|
||||||
|
{
|
||||||
|
class C: A()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun foo(a: A = run { class X: A(); object: A() {} }) {
|
||||||
|
val t = object {
|
||||||
|
inner class F: A()
|
||||||
|
}
|
||||||
|
|
||||||
|
class D: A()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
val bar: Int
|
||||||
|
get() {
|
||||||
|
class E: A()
|
||||||
|
|
||||||
|
return 0
|
||||||
|
}
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
<node text="A ()" base="true">
|
||||||
|
<node text="B ()"/>
|
||||||
|
<node text="X in MyClass ()"/>
|
||||||
|
<node text="Anonymous in MyClass ()"/>
|
||||||
|
<node text="G in MyClass ()"/>
|
||||||
|
<node text="C in MyClass ()"/>
|
||||||
|
<node text="X in foo() in MyClass ()"/>
|
||||||
|
<node text="Anonymous in foo() in MyClass ()"/>
|
||||||
|
<node text="F in foo() in MyClass ()"/>
|
||||||
|
<node text="D in foo() in MyClass ()"/>
|
||||||
|
<node text="E in bar() in main.kt ()"/>
|
||||||
|
</node>
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
trait <caret>A
|
||||||
|
|
||||||
|
class B: A
|
||||||
|
|
||||||
|
class MyClass(a: A = run { class X: A; object: A {} }) {
|
||||||
|
inner class G: A {}
|
||||||
|
|
||||||
|
{
|
||||||
|
class C: A
|
||||||
|
}
|
||||||
|
|
||||||
|
fun foo(a: A = run { class X: A; object: A {} }) {
|
||||||
|
val t = object {
|
||||||
|
inner class F: A
|
||||||
|
}
|
||||||
|
|
||||||
|
class D: A
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
val bar: Int
|
||||||
|
get() {
|
||||||
|
class E: A
|
||||||
|
|
||||||
|
return 0
|
||||||
|
}
|
||||||
@@ -1,3 +1,10 @@
|
|||||||
<node text="A ()" base="true">
|
<node text="A ()" base="true">
|
||||||
<node text="O ()"/>
|
<node text="B ()"/>
|
||||||
</node>
|
<node text="Anonymous in MyClass ()"/>
|
||||||
|
<node text="C in MyClass ()"/>
|
||||||
|
<node text="Anonymous in foo() in MyClass ()"/>
|
||||||
|
<node text="D in foo() in MyClass ()"/>
|
||||||
|
<node text="F in t() in MyClass ()"/>
|
||||||
|
<node text="E in bar() in main.kt ()"/>
|
||||||
|
<node text="Anonymous in x() in main.kt ()"/>
|
||||||
|
</node>
|
||||||
|
|||||||
@@ -1,3 +1,28 @@
|
|||||||
object O: A()
|
open class <caret>A
|
||||||
|
|
||||||
open class <caret>A
|
object B: A()
|
||||||
|
|
||||||
|
class MyClass(a: A = run { object: A() {} }) {
|
||||||
|
{
|
||||||
|
object C: A()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun foo(a: A = run { object: A() {} }) {
|
||||||
|
object D: A()
|
||||||
|
}
|
||||||
|
|
||||||
|
val t = object {
|
||||||
|
object F: A()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
val bar: Int
|
||||||
|
get() {
|
||||||
|
object E: A()
|
||||||
|
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
val x = object: A() {
|
||||||
|
|
||||||
|
}
|
||||||
@@ -1,3 +1,10 @@
|
|||||||
<node text="A ()" base="true">
|
<node text="A ()" base="true">
|
||||||
<node text="O ()"/>
|
<node text="B ()"/>
|
||||||
</node>
|
<node text="Anonymous in MyClass ()"/>
|
||||||
|
<node text="C in MyClass ()"/>
|
||||||
|
<node text="Anonymous in foo() in MyClass ()"/>
|
||||||
|
<node text="D in foo() in MyClass ()"/>
|
||||||
|
<node text="F in t() in MyClass ()"/>
|
||||||
|
<node text="E in bar() in main.kt ()"/>
|
||||||
|
<node text="Anonymous in x() in main.kt ()"/>
|
||||||
|
</node>
|
||||||
|
|||||||
@@ -1,3 +1,28 @@
|
|||||||
object O: A
|
trait <caret>A
|
||||||
|
|
||||||
trait <caret>A
|
object B: A
|
||||||
|
|
||||||
|
class MyClass(a: A = run { object: A {} }) {
|
||||||
|
{
|
||||||
|
object C: A
|
||||||
|
}
|
||||||
|
|
||||||
|
fun foo(a: A = run { object: A {} }) {
|
||||||
|
object D: A
|
||||||
|
}
|
||||||
|
|
||||||
|
val t = object {
|
||||||
|
object F: A
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
val bar: Int
|
||||||
|
get() {
|
||||||
|
object E: A
|
||||||
|
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
val x = object: A {
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
<node text="A ()" base="true">
|
||||||
|
<node text="B ()"/>
|
||||||
|
<node text="X in MyClass ()"/>
|
||||||
|
<node text="Anonymous in MyClass ()"/>
|
||||||
|
<node text="G in MyClass ()"/>
|
||||||
|
<node text="C in MyClass ()"/>
|
||||||
|
<node text="X in foo() in MyClass ()"/>
|
||||||
|
<node text="Anonymous in foo() in MyClass ()"/>
|
||||||
|
<node text="D in foo() in MyClass ()"/>
|
||||||
|
<node text="F in foo() in MyClass ()"/>
|
||||||
|
<node text="E in bar() in main.kt ()"/>
|
||||||
|
</node>
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
open class <caret>A
|
||||||
|
|
||||||
|
trait B: A()
|
||||||
|
|
||||||
|
class MyClass(a: A = run { trait X: A(); object: A() {} }) {
|
||||||
|
inner trait G: A() {}
|
||||||
|
|
||||||
|
{
|
||||||
|
trait C: A()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun foo(a: A = run { trait X: A(); object: A() {} }) {
|
||||||
|
trait D: A()
|
||||||
|
|
||||||
|
val t = object {
|
||||||
|
inner trait F: A()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
val bar: Int
|
||||||
|
get() {
|
||||||
|
trait E: A()
|
||||||
|
|
||||||
|
return 0
|
||||||
|
}
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
<node text="A ()" base="true">
|
||||||
|
<node text="B ()"/>
|
||||||
|
<node text="X in MyClass ()"/>
|
||||||
|
<node text="Anonymous in MyClass ()"/>
|
||||||
|
<node text="G in MyClass ()"/>
|
||||||
|
<node text="C in MyClass ()"/>
|
||||||
|
<node text="X in foo() in MyClass ()"/>
|
||||||
|
<node text="Anonymous in foo() in MyClass ()"/>
|
||||||
|
<node text="D in foo() in MyClass ()"/>
|
||||||
|
<node text="F in foo() in MyClass ()"/>
|
||||||
|
<node text="E in bar() in main.kt ()"/>
|
||||||
|
</node>
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
trait <caret>A
|
||||||
|
|
||||||
|
trait B: A
|
||||||
|
|
||||||
|
class MyClass(a: A = run { trait X: A; object: A {} }) {
|
||||||
|
inner trait G: A {}
|
||||||
|
|
||||||
|
{
|
||||||
|
trait C: A
|
||||||
|
}
|
||||||
|
|
||||||
|
fun foo(a: A = run { trait X: A; object: A {} }) {
|
||||||
|
trait D: A
|
||||||
|
|
||||||
|
val t = object {
|
||||||
|
inner trait F: A
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
val bar: Int
|
||||||
|
get() {
|
||||||
|
trait E: A
|
||||||
|
|
||||||
|
return 0
|
||||||
|
}
|
||||||
@@ -184,11 +184,26 @@ public class HierarchyTestGenerated extends AbstractHierarchyTest {
|
|||||||
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.TestsPackage", new File("idea/testData/hierarchy/class/sub"), Pattern.compile("^([^\\.]+)$"), false);
|
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.TestsPackage", new File("idea/testData/hierarchy/class/sub"), Pattern.compile("^([^\\.]+)$"), false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("AllFromClass")
|
||||||
|
public void testAllFromClass() throws Exception {
|
||||||
|
doSubClassHierarchyTest("idea/testData/hierarchy/class/sub/AllFromClass");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("AllFromTrait")
|
||||||
|
public void testAllFromTrait() throws Exception {
|
||||||
|
doSubClassHierarchyTest("idea/testData/hierarchy/class/sub/AllFromTrait");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("ClassFromClass")
|
@TestMetadata("ClassFromClass")
|
||||||
public void testClassFromClass() throws Exception {
|
public void testClassFromClass() throws Exception {
|
||||||
doSubClassHierarchyTest("idea/testData/hierarchy/class/sub/ClassFromClass");
|
doSubClassHierarchyTest("idea/testData/hierarchy/class/sub/ClassFromClass");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("ClassFromTrait")
|
||||||
|
public void testClassFromTrait() throws Exception {
|
||||||
|
doSubClassHierarchyTest("idea/testData/hierarchy/class/sub/ClassFromTrait");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("ObjectFromClass")
|
@TestMetadata("ObjectFromClass")
|
||||||
public void testObjectFromClass() throws Exception {
|
public void testObjectFromClass() throws Exception {
|
||||||
doSubClassHierarchyTest("idea/testData/hierarchy/class/sub/ObjectFromClass");
|
doSubClassHierarchyTest("idea/testData/hierarchy/class/sub/ObjectFromClass");
|
||||||
@@ -199,6 +214,16 @@ public class HierarchyTestGenerated extends AbstractHierarchyTest {
|
|||||||
doSubClassHierarchyTest("idea/testData/hierarchy/class/sub/ObjectFromTrait");
|
doSubClassHierarchyTest("idea/testData/hierarchy/class/sub/ObjectFromTrait");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("TraitFromClass")
|
||||||
|
public void testTraitFromClass() throws Exception {
|
||||||
|
doSubClassHierarchyTest("idea/testData/hierarchy/class/sub/TraitFromClass");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("TraitFromTrait")
|
||||||
|
public void testTraitFromTrait() throws Exception {
|
||||||
|
doSubClassHierarchyTest("idea/testData/hierarchy/class/sub/TraitFromTrait");
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@TestMetadata("idea/testData/hierarchy/calls/callers")
|
@TestMetadata("idea/testData/hierarchy/calls/callers")
|
||||||
|
|||||||
Reference in New Issue
Block a user