From 29a71371ad38e20906a7b2991ed43d89445bc2ca Mon Sep 17 00:00:00 2001 From: Ben Gruver Date: Sat, 21 Mar 2015 11:09:58 -0700 Subject: [PATCH] Implement SmaliClass.isInheritor/isInheritorDeep --- .../org/jf/smalidea/psi/impl/SmaliClass.java | 5 +-- .../java/org/jf/smalidea/SmaliClassTest.java | 35 +++++++++++++++++++ 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/smalidea/src/main/java/org/jf/smalidea/psi/impl/SmaliClass.java b/smalidea/src/main/java/org/jf/smalidea/psi/impl/SmaliClass.java index 77d95a79..ea9e89d1 100644 --- a/smalidea/src/main/java/org/jf/smalidea/psi/impl/SmaliClass.java +++ b/smalidea/src/main/java/org/jf/smalidea/psi/impl/SmaliClass.java @@ -37,6 +37,7 @@ import com.intellij.lang.ASTNode; import com.intellij.openapi.util.Pair; import com.intellij.psi.*; import com.intellij.psi.PsiModifier.ModifierConstant; +import com.intellij.psi.impl.InheritanceImplUtil; import com.intellij.psi.impl.PsiClassImplUtil; import com.intellij.psi.impl.PsiImplUtil; import com.intellij.psi.javadoc.PsiDocComment; @@ -252,11 +253,11 @@ public class SmaliClass extends SmaliStubBasedPsiElement impleme } @Override public boolean isInheritor(@NotNull PsiClass baseClass, boolean checkDeep) { - return false; + return InheritanceImplUtil.isInheritor(this, baseClass, checkDeep); } @Override public boolean isInheritorDeep(PsiClass baseClass, @Nullable PsiClass classToByPass) { - return false; + return InheritanceImplUtil.isInheritorDeep(this, baseClass, classToByPass); } @Nullable @Override public PsiClass getContainingClass() { diff --git a/smalidea/src/test/java/org/jf/smalidea/SmaliClassTest.java b/smalidea/src/test/java/org/jf/smalidea/SmaliClassTest.java index d9d56940..0dd2e015 100644 --- a/smalidea/src/test/java/org/jf/smalidea/SmaliClassTest.java +++ b/smalidea/src/test/java/org/jf/smalidea/SmaliClassTest.java @@ -31,7 +31,10 @@ package org.jf.smalidea; +import com.intellij.psi.JavaPsiFacade; import com.intellij.psi.PsiClass; +import com.intellij.psi.PsiClassType; +import com.intellij.psi.PsiElementFactory; import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase; import org.jf.smalidea.psi.impl.SmaliClass; import org.jf.smalidea.psi.impl.SmaliFile; @@ -108,4 +111,36 @@ public class SmaliClassTest extends LightCodeInsightFixtureTestCase { Assert.assertEquals(1, smaliClass.getInterfaces().length); Assert.assertEquals("iface", smaliClass.getInterfaces()[0].getQualifiedName()); } + + public void testIsInheritor() { + SmaliFile file = (SmaliFile)myFixture.addFileToProject("blah.smali", + ".class public Lblah; .super Ljava/lang/Exception;"); + SmaliClass smaliClass = file.getPsiClass(); + Assert.assertEquals("blah", smaliClass.getQualifiedName()); + + PsiElementFactory factory = JavaPsiFacade.getInstance(getProject()).getElementFactory(); + PsiClassType throwableType = factory.createTypeByFQClassName("java.lang.Throwable", file.getResolveScope()); + PsiClass throwableClass = throwableType.resolve(); + Assert.assertNotNull(throwableClass); + + PsiClassType exceptionType = factory.createTypeByFQClassName("java.lang.Exception", file.getResolveScope()); + PsiClass exceptionClass = exceptionType.resolve(); + Assert.assertNotNull(exceptionClass); + + PsiClassType objectType = factory.createTypeByFQClassName("java.lang.Object", file.getResolveScope()); + PsiClass objectClass = objectType.resolve(); + Assert.assertNotNull(objectClass); + + Assert.assertTrue(smaliClass.isInheritor(exceptionClass, true)); + Assert.assertTrue(smaliClass.isInheritor(throwableClass, true)); + Assert.assertTrue(smaliClass.isInheritor(objectClass, true)); + + Assert.assertTrue(smaliClass.isInheritorDeep(exceptionClass, null)); + Assert.assertTrue(smaliClass.isInheritorDeep(throwableClass, null)); + Assert.assertTrue(smaliClass.isInheritorDeep(objectClass, null)); + + Assert.assertTrue(smaliClass.isInheritor(exceptionClass, false)); + Assert.assertFalse(smaliClass.isInheritor(throwableClass, false)); + Assert.assertFalse(smaliClass.isInheritor(objectClass, false)); + } }