Search in sources :

Example 16 with SmaliClass

use of org.jf.smalidea.psi.impl.SmaliClass in project smali by JesusFreke.

the class SmaliImplementsExtendsTest method testNormalClass.

public void testNormalClass() {
    myFixture.addFileToProject("my/pkg/base.smali", ".class public Lmy/pkg/base; .super Ljava/lang/Object;");
    myFixture.addFileToProject("my/pkg/iface.smali", ".class public Lmy/pkg/iface; .super Ljava/lang/Object;");
    myFixture.addFileToProject("my/pkg/iface2.smali", ".class public Lmy/pkg/iface2; .super Ljava/lang/Object;");
    SmaliFile file = (SmaliFile) myFixture.addFileToProject("my/pkg/blah.smali", ".class public Lmy/pkg/blah; .implements Lmy/pkg/iface; .super Lmy/pkg/base; " + ".implements Lmy/pkg/iface2;");
    SmaliClass smaliClass = file.getPsiClass();
    SmaliExtendsList extendsList = smaliClass.getExtendsList();
    Assert.assertEquals(1, extendsList.getReferencedTypes().length);
    Assert.assertEquals("my.pkg.base", extendsList.getReferencedTypes()[0].getCanonicalText());
    Assert.assertEquals(1, extendsList.getReferenceNames().length);
    Assert.assertEquals("my.pkg.base", extendsList.getReferenceNames()[0]);
    Assert.assertEquals(1, smaliClass.getExtendsListTypes().length);
    Assert.assertEquals("my.pkg.base", smaliClass.getExtendsListTypes()[0].getCanonicalText());
    PsiClass resolvedSuper = extendsList.getReferencedTypes()[0].resolve();
    Assert.assertNotNull(resolvedSuper);
    Assert.assertEquals("my.pkg.base", resolvedSuper.getQualifiedName());
    SmaliImplementsList implementsList = smaliClass.getImplementsList();
    Assert.assertEquals(2, implementsList.getReferencedTypes().length);
    Assert.assertEquals("my.pkg.iface", implementsList.getReferencedTypes()[0].getCanonicalText());
    Assert.assertEquals("my.pkg.iface2", implementsList.getReferencedTypes()[1].getCanonicalText());
    Assert.assertEquals(2, implementsList.getReferenceNames().length);
    Assert.assertEquals("my.pkg.iface", implementsList.getReferenceNames()[0]);
    Assert.assertEquals("my.pkg.iface2", implementsList.getReferenceNames()[1]);
    Assert.assertEquals(2, smaliClass.getImplementsListTypes().length);
    Assert.assertEquals("my.pkg.iface", smaliClass.getImplementsListTypes()[0].getCanonicalText());
    Assert.assertEquals("my.pkg.iface2", smaliClass.getImplementsListTypes()[1].getCanonicalText());
    PsiClass resolvedInterface = implementsList.getReferencedTypes()[0].resolve();
    Assert.assertNotNull(resolvedInterface);
    Assert.assertEquals("my.pkg.iface", resolvedInterface.getQualifiedName());
    resolvedInterface = implementsList.getReferencedTypes()[1].resolve();
    Assert.assertNotNull(resolvedInterface);
    Assert.assertEquals("my.pkg.iface2", resolvedInterface.getQualifiedName());
}
Also used : SmaliFile(org.jf.smalidea.psi.impl.SmaliFile) SmaliClass(org.jf.smalidea.psi.impl.SmaliClass) PsiClass(com.intellij.psi.PsiClass) SmaliExtendsList(org.jf.smalidea.psi.impl.SmaliExtendsList) SmaliImplementsList(org.jf.smalidea.psi.impl.SmaliImplementsList)

Example 17 with SmaliClass

use of org.jf.smalidea.psi.impl.SmaliClass in project smali by JesusFreke.

the class SmaliImplementsExtendsTest method testInterface.

public void testInterface() {
    myFixture.addFileToProject("my/pkg/iface.smali", ".class public Lmy/pkg/iface; .super Ljava/lang/Object;");
    myFixture.addFileToProject("my/pkg/iface2.smali", ".class public Lmy/pkg/iface2; .super Ljava/lang/Object;");
    SmaliFile file = (SmaliFile) myFixture.addFileToProject("my/pkg/blah.smali", ".class public interface Lmy/pkg/blah; .implements Lmy/pkg/iface; .super Ljava/lang/Object; " + ".implements Lmy/pkg/iface2;");
    SmaliClass smaliClass = file.getPsiClass();
    SmaliExtendsList extendsList = smaliClass.getExtendsList();
    Assert.assertEquals(2, extendsList.getReferencedTypes().length);
    Assert.assertEquals("my.pkg.iface", extendsList.getReferencedTypes()[0].getCanonicalText());
    Assert.assertEquals("my.pkg.iface2", extendsList.getReferencedTypes()[1].getCanonicalText());
    Assert.assertEquals(2, extendsList.getReferenceNames().length);
    Assert.assertEquals("my.pkg.iface", extendsList.getReferenceNames()[0]);
    Assert.assertEquals("my.pkg.iface2", extendsList.getReferenceNames()[1]);
    Assert.assertEquals(2, smaliClass.getExtendsListTypes().length);
    Assert.assertEquals("my.pkg.iface", smaliClass.getExtendsListTypes()[0].getCanonicalText());
    Assert.assertEquals("my.pkg.iface2", smaliClass.getExtendsListTypes()[1].getCanonicalText());
    PsiClass resolvedInterface = extendsList.getReferencedTypes()[0].resolve();
    Assert.assertNotNull(resolvedInterface);
    Assert.assertEquals("my.pkg.iface", resolvedInterface.getQualifiedName());
    resolvedInterface = extendsList.getReferencedTypes()[1].resolve();
    Assert.assertNotNull(resolvedInterface);
    Assert.assertEquals("my.pkg.iface2", resolvedInterface.getQualifiedName());
    SmaliImplementsList implementsList = smaliClass.getImplementsList();
    Assert.assertEquals(0, implementsList.getReferencedTypes().length);
    Assert.assertEquals(0, implementsList.getReferenceNames().length);
    Assert.assertEquals(0, smaliClass.getImplementsListTypes().length);
}
Also used : SmaliFile(org.jf.smalidea.psi.impl.SmaliFile) SmaliClass(org.jf.smalidea.psi.impl.SmaliClass) PsiClass(com.intellij.psi.PsiClass) SmaliExtendsList(org.jf.smalidea.psi.impl.SmaliExtendsList) SmaliImplementsList(org.jf.smalidea.psi.impl.SmaliImplementsList)

Example 18 with SmaliClass

use of org.jf.smalidea.psi.impl.SmaliClass in project smali by JesusFreke.

the class ClassReferenceTest method testSmaliReferenceFromJava.

/**
     * Test a reference to a smali class from a java class
     */
public void testSmaliReferenceFromJava() throws Exception {
    createFile("blarg.smali", ".class public Lblarg; .super Ljava/lang/Object;");
    PsiReference reference = configureByFileText("public class blah extends bla<ref>rg { }", "blah.java");
    SmaliClass smaliClass = (SmaliClass) reference.resolve();
    Assert.assertNotNull(smaliClass);
    Assert.assertEquals("blarg", smaliClass.getQualifiedName());
}
Also used : SmaliClass(org.jf.smalidea.psi.impl.SmaliClass) PsiReference(com.intellij.psi.PsiReference)

Example 19 with SmaliClass

use of org.jf.smalidea.psi.impl.SmaliClass in project smali by JesusFreke.

the class ClassReferenceTest method testSmaliReferenceFromSmali.

/**
     * Test a reference to a smali class from a smali class
     */
public void testSmaliReferenceFromSmali() throws Exception {
    createFile("blarg.smali", ".class public Lblarg; .super Ljava/lang/Object;");
    SmaliClassTypeElement typeElement = (SmaliClassTypeElement) configureByFileText(".class public Lblah; .super L<ref>blarg;", "blah.smali");
    Assert.assertEquals("blarg", typeElement.getName());
    SmaliClass smaliClass = (SmaliClass) typeElement.resolve();
    Assert.assertNotNull(smaliClass);
    Assert.assertEquals("blarg", smaliClass.getQualifiedName());
    JavaResolveResult resolveResult = typeElement.advancedResolve(false);
    Assert.assertNotNull(resolveResult.getElement());
    Assert.assertEquals("blarg", ((PsiClass) resolveResult.getElement()).getQualifiedName());
    JavaResolveResult[] resolveResults = typeElement.multiResolve(false);
    Assert.assertEquals(1, resolveResults.length);
    Assert.assertNotNull(resolveResults[0].getElement());
    Assert.assertEquals("blarg", ((PsiClass) resolveResults[0].getElement()).getQualifiedName());
}
Also used : SmaliClass(org.jf.smalidea.psi.impl.SmaliClass) SmaliClassTypeElement(org.jf.smalidea.psi.impl.SmaliClassTypeElement) JavaResolveResult(com.intellij.psi.JavaResolveResult)

Example 20 with SmaliClass

use of org.jf.smalidea.psi.impl.SmaliClass in project smali by JesusFreke.

the class SmalideaMethodTest method testArrayData.

public void testArrayData() {
    String text = ".class public LFormat31t;\n" + ".super Ljava/lang/Object;\n" + ".source \"Format31t.smali\"" + "\n" + ".method public test_fill-array-data()V\n" + "    .registers 3\n" + "    .annotation runtime Lorg/junit/Test;\n" + "    .end annotation\n" + "\n" + "    const v0, 6\n" + "    new-array v0, v0, [I\n" + "    fill-array-data v0, :ArrayData\n" + "\n" + "    const v1, 0\n" + "    aget v2, v0, v1\n" + "    const v1, 1\n" + "    invoke-static {v1, v2}, LAssert;->assertEquals(II)V\n" + "\n" + "    const v1, 1\n" + "    aget v2, v0, v1\n" + "    const v1, 2\n" + "    invoke-static {v1, v2}, LAssert;->assertEquals(II)V\n" + "\n" + "    const v1, 2\n" + "    aget v2, v0, v1\n" + "    const v1, 3\n" + "    invoke-static {v1, v2}, LAssert;->assertEquals(II)V\n" + "\n" + "    const v1, 3\n" + "    aget v2, v0, v1\n" + "    const v1, 4\n" + "    invoke-static {v1, v2}, LAssert;->assertEquals(II)V\n" + "\n" + "    const v1, 4\n" + "    aget v2, v0, v1\n" + "    const v1, 5\n" + "    invoke-static {v1, v2}, LAssert;->assertEquals(II)V\n" + "\n" + "    const v1, 5\n" + "    aget v2, v0, v1\n" + "    const v1, 6\n" + "    invoke-static {v1, v2}, LAssert;->assertEquals(II)V\n" + "\n" + "    return-void\n" + "\n" + ":ArrayData\n" + "    .array-data 4\n" + "        1 2 128 -256 65536 0x7fffffff\n" + "    .end array-data\n" + ".end method";
    SmaliFile file = (SmaliFile) myFixture.addFileToProject("my/pkg/blah.smali", text);
    SmaliClass smaliClass = file.getPsiClass();
    SmaliMethod smaliMethod = smaliClass.getMethods()[0];
    SmalideaMethod method = new SmalideaMethod(smaliMethod);
    MethodImplementation impl = method.getImplementation();
    Assert.assertNotNull(impl);
    List<Instruction> instructions = Lists.newArrayList(impl.getInstructions());
    ArrayPayload arrayPayload = (ArrayPayload) instructions.get(28);
    Assert.assertEquals(4, arrayPayload.getElementWidth());
    List<Number> elements = arrayPayload.getArrayElements();
    Assert.assertEquals(6, elements.size());
    Assert.assertEquals(1L, elements.get(0).longValue());
    Assert.assertEquals(2L, elements.get(1).longValue());
    Assert.assertEquals(128L, elements.get(2));
    Assert.assertEquals(-256L, elements.get(3));
    Assert.assertEquals(65536L, elements.get(4));
    Assert.assertEquals(0x7fffffffL, elements.get(5));
}
Also used : SmaliFile(org.jf.smalidea.psi.impl.SmaliFile) MethodImplementation(org.jf.dexlib2.iface.MethodImplementation) SmaliClass(org.jf.smalidea.psi.impl.SmaliClass) SmaliMethod(org.jf.smalidea.psi.impl.SmaliMethod) Instruction(org.jf.dexlib2.iface.instruction.Instruction)

Aggregations

SmaliClass (org.jf.smalidea.psi.impl.SmaliClass)31 SmaliFile (org.jf.smalidea.psi.impl.SmaliFile)28 SmaliMethod (org.jf.smalidea.psi.impl.SmaliMethod)7 SmaliModifierList (org.jf.smalidea.psi.impl.SmaliModifierList)7 PsiClass (com.intellij.psi.PsiClass)5 PsiField (com.intellij.psi.PsiField)5 MethodImplementation (org.jf.dexlib2.iface.MethodImplementation)5 Instruction (org.jf.dexlib2.iface.instruction.Instruction)3 SmaliField (org.jf.smalidea.psi.impl.SmaliField)3 PsiPrimitiveType (com.intellij.psi.PsiPrimitiveType)2 PsiTypeElement (com.intellij.psi.PsiTypeElement)2 SmaliAnnotation (org.jf.smalidea.psi.impl.SmaliAnnotation)2 SmaliClassTypeElement (org.jf.smalidea.psi.impl.SmaliClassTypeElement)2 SmaliExtendsList (org.jf.smalidea.psi.impl.SmaliExtendsList)2 SmaliImplementsList (org.jf.smalidea.psi.impl.SmaliImplementsList)2 JavaResolveResult (com.intellij.psi.JavaResolveResult)1 PsiClassType (com.intellij.psi.PsiClassType)1 PsiElementFactory (com.intellij.psi.PsiElementFactory)1 PsiModifierListOwner (com.intellij.psi.PsiModifierListOwner)1 PsiReference (com.intellij.psi.PsiReference)1