Implement SmaliClass.isInheritor/isInheritorDeep

This commit is contained in:
Ben Gruver 2015-03-21 11:09:58 -07:00
parent aa4b0a0506
commit 29a71371ad
2 changed files with 38 additions and 2 deletions

View File

@ -37,6 +37,7 @@ import com.intellij.lang.ASTNode;
import com.intellij.openapi.util.Pair; import com.intellij.openapi.util.Pair;
import com.intellij.psi.*; import com.intellij.psi.*;
import com.intellij.psi.PsiModifier.ModifierConstant; import com.intellij.psi.PsiModifier.ModifierConstant;
import com.intellij.psi.impl.InheritanceImplUtil;
import com.intellij.psi.impl.PsiClassImplUtil; import com.intellij.psi.impl.PsiClassImplUtil;
import com.intellij.psi.impl.PsiImplUtil; import com.intellij.psi.impl.PsiImplUtil;
import com.intellij.psi.javadoc.PsiDocComment; import com.intellij.psi.javadoc.PsiDocComment;
@ -252,11 +253,11 @@ public class SmaliClass extends SmaliStubBasedPsiElement<SmaliClassStub> impleme
} }
@Override public boolean isInheritor(@NotNull PsiClass baseClass, boolean checkDeep) { @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) { @Override public boolean isInheritorDeep(PsiClass baseClass, @Nullable PsiClass classToByPass) {
return false; return InheritanceImplUtil.isInheritorDeep(this, baseClass, classToByPass);
} }
@Nullable @Override public PsiClass getContainingClass() { @Nullable @Override public PsiClass getContainingClass() {

View File

@ -31,7 +31,10 @@
package org.jf.smalidea; package org.jf.smalidea;
import com.intellij.psi.JavaPsiFacade;
import com.intellij.psi.PsiClass; import com.intellij.psi.PsiClass;
import com.intellij.psi.PsiClassType;
import com.intellij.psi.PsiElementFactory;
import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase; import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase;
import org.jf.smalidea.psi.impl.SmaliClass; import org.jf.smalidea.psi.impl.SmaliClass;
import org.jf.smalidea.psi.impl.SmaliFile; import org.jf.smalidea.psi.impl.SmaliFile;
@ -108,4 +111,36 @@ public class SmaliClassTest extends LightCodeInsightFixtureTestCase {
Assert.assertEquals(1, smaliClass.getInterfaces().length); Assert.assertEquals(1, smaliClass.getInterfaces().length);
Assert.assertEquals("iface", smaliClass.getInterfaces()[0].getQualifiedName()); 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));
}
} }