15897c08299fe919d6ee3fe72def9605eb2883958Ben Gruver/* 25897c08299fe919d6ee3fe72def9605eb2883958Ben Gruver * Copyright 2015, Google Inc. 35897c08299fe919d6ee3fe72def9605eb2883958Ben Gruver * All rights reserved. 45897c08299fe919d6ee3fe72def9605eb2883958Ben Gruver * 55897c08299fe919d6ee3fe72def9605eb2883958Ben Gruver * Redistribution and use in source and binary forms, with or without 65897c08299fe919d6ee3fe72def9605eb2883958Ben Gruver * modification, are permitted provided that the following conditions are 75897c08299fe919d6ee3fe72def9605eb2883958Ben Gruver * met: 85897c08299fe919d6ee3fe72def9605eb2883958Ben Gruver * 95897c08299fe919d6ee3fe72def9605eb2883958Ben Gruver * * Redistributions of source code must retain the above copyright 105897c08299fe919d6ee3fe72def9605eb2883958Ben Gruver * notice, this list of conditions and the following disclaimer. 115897c08299fe919d6ee3fe72def9605eb2883958Ben Gruver * * Redistributions in binary form must reproduce the above 125897c08299fe919d6ee3fe72def9605eb2883958Ben Gruver * copyright notice, this list of conditions and the following disclaimer 135897c08299fe919d6ee3fe72def9605eb2883958Ben Gruver * in the documentation and/or other materials provided with the 145897c08299fe919d6ee3fe72def9605eb2883958Ben Gruver * distribution. 155897c08299fe919d6ee3fe72def9605eb2883958Ben Gruver * * Neither the name of Google Inc. nor the names of its 165897c08299fe919d6ee3fe72def9605eb2883958Ben Gruver * contributors may be used to endorse or promote products derived from 175897c08299fe919d6ee3fe72def9605eb2883958Ben Gruver * this software without specific prior written permission. 185897c08299fe919d6ee3fe72def9605eb2883958Ben Gruver * 195897c08299fe919d6ee3fe72def9605eb2883958Ben Gruver * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 205897c08299fe919d6ee3fe72def9605eb2883958Ben Gruver * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 215897c08299fe919d6ee3fe72def9605eb2883958Ben Gruver * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 225897c08299fe919d6ee3fe72def9605eb2883958Ben Gruver * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 235897c08299fe919d6ee3fe72def9605eb2883958Ben Gruver * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 245897c08299fe919d6ee3fe72def9605eb2883958Ben Gruver * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 255897c08299fe919d6ee3fe72def9605eb2883958Ben Gruver * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 265897c08299fe919d6ee3fe72def9605eb2883958Ben Gruver * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 275897c08299fe919d6ee3fe72def9605eb2883958Ben Gruver * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 285897c08299fe919d6ee3fe72def9605eb2883958Ben Gruver * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 295897c08299fe919d6ee3fe72def9605eb2883958Ben Gruver * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 305897c08299fe919d6ee3fe72def9605eb2883958Ben Gruver */ 315897c08299fe919d6ee3fe72def9605eb2883958Ben Gruver 325897c08299fe919d6ee3fe72def9605eb2883958Ben Gruverpackage org.jf.smalidea; 335897c08299fe919d6ee3fe72def9605eb2883958Ben Gruver 342e7fe1b8fe660c867a49264abfb8a30765e07401Ben Gruverimport com.intellij.openapi.projectRoots.Sdk; 352e7fe1b8fe660c867a49264abfb8a30765e07401Ben Gruverimport com.intellij.openapi.projectRoots.impl.JavaAwareProjectJdkTableImpl; 365897c08299fe919d6ee3fe72def9605eb2883958Ben Gruverimport com.intellij.psi.PsiField; 375897c08299fe919d6ee3fe72def9605eb2883958Ben Gruverimport com.intellij.psi.PsiReference; 385897c08299fe919d6ee3fe72def9605eb2883958Ben Gruverimport com.intellij.testFramework.ResolveTestCase; 395897c08299fe919d6ee3fe72def9605eb2883958Ben Gruverimport org.jf.smalidea.psi.impl.SmaliFieldReference; 405897c08299fe919d6ee3fe72def9605eb2883958Ben Gruverimport org.junit.Assert; 415897c08299fe919d6ee3fe72def9605eb2883958Ben Gruver 425897c08299fe919d6ee3fe72def9605eb2883958Ben Gruverpublic class FieldReferenceTest extends ResolveTestCase { 435897c08299fe919d6ee3fe72def9605eb2883958Ben Gruver /** 445897c08299fe919d6ee3fe72def9605eb2883958Ben Gruver * Test a reference to a java field from a smali class 455897c08299fe919d6ee3fe72def9605eb2883958Ben Gruver */ 465897c08299fe919d6ee3fe72def9605eb2883958Ben Gruver public void testJavaReferenceFromSmali() throws Exception { 475897c08299fe919d6ee3fe72def9605eb2883958Ben Gruver String text = 485897c08299fe919d6ee3fe72def9605eb2883958Ben Gruver ".class public Lmy/pkg/blah; .super Ljava/lang/Object;\n" + 495897c08299fe919d6ee3fe72def9605eb2883958Ben Gruver ".method public blah()V\n" + 505897c08299fe919d6ee3fe72def9605eb2883958Ben Gruver " .locals 1\n" + 515897c08299fe919d6ee3fe72def9605eb2883958Ben Gruver " sget-object v0, Ljava/lang/System;->o<ref>ut:Ljava/io/PrintStream;\n" + 525897c08299fe919d6ee3fe72def9605eb2883958Ben Gruver " return-void\n" + 535897c08299fe919d6ee3fe72def9605eb2883958Ben Gruver ".end method"; 545897c08299fe919d6ee3fe72def9605eb2883958Ben Gruver 555897c08299fe919d6ee3fe72def9605eb2883958Ben Gruver SmaliFieldReference fieldReference = (SmaliFieldReference)configureByFileText(text, "blah.smali"); 565897c08299fe919d6ee3fe72def9605eb2883958Ben Gruver 575897c08299fe919d6ee3fe72def9605eb2883958Ben Gruver Assert.assertNotNull(fieldReference); 585897c08299fe919d6ee3fe72def9605eb2883958Ben Gruver Assert.assertEquals("out", fieldReference.getName()); 595897c08299fe919d6ee3fe72def9605eb2883958Ben Gruver Assert.assertNotNull(fieldReference.getFieldType()); 605897c08299fe919d6ee3fe72def9605eb2883958Ben Gruver Assert.assertEquals("java.io.PrintStream", fieldReference.getFieldType().getType().getCanonicalText()); 615897c08299fe919d6ee3fe72def9605eb2883958Ben Gruver 625897c08299fe919d6ee3fe72def9605eb2883958Ben Gruver PsiField resolvedField = fieldReference.resolve(); 635897c08299fe919d6ee3fe72def9605eb2883958Ben Gruver Assert.assertNotNull(resolvedField); 645897c08299fe919d6ee3fe72def9605eb2883958Ben Gruver Assert.assertEquals("out", resolvedField.getName()); 655897c08299fe919d6ee3fe72def9605eb2883958Ben Gruver Assert.assertNotNull(resolvedField.getContainingClass()); 665897c08299fe919d6ee3fe72def9605eb2883958Ben Gruver Assert.assertEquals("java.lang.System", resolvedField.getContainingClass().getQualifiedName()); 675897c08299fe919d6ee3fe72def9605eb2883958Ben Gruver Assert.assertEquals("java.io.PrintStream", resolvedField.getType().getCanonicalText()); 685897c08299fe919d6ee3fe72def9605eb2883958Ben Gruver } 695897c08299fe919d6ee3fe72def9605eb2883958Ben Gruver 705897c08299fe919d6ee3fe72def9605eb2883958Ben Gruver /** 715897c08299fe919d6ee3fe72def9605eb2883958Ben Gruver * Test a reference to a smali field from a smali class 725897c08299fe919d6ee3fe72def9605eb2883958Ben Gruver */ 735897c08299fe919d6ee3fe72def9605eb2883958Ben Gruver public void testSmaliReferenceFromSmali() throws Exception { 745897c08299fe919d6ee3fe72def9605eb2883958Ben Gruver createFile("blarg.smali", ".class public Lblarg; .super Ljava/lang/Object;" + 755897c08299fe919d6ee3fe72def9605eb2883958Ben Gruver ".field public static blort:I"); 765897c08299fe919d6ee3fe72def9605eb2883958Ben Gruver 775897c08299fe919d6ee3fe72def9605eb2883958Ben Gruver String text = 785897c08299fe919d6ee3fe72def9605eb2883958Ben Gruver ".class public Lmy/pkg/blah; .super Ljava/lang/Object;\n" + 795897c08299fe919d6ee3fe72def9605eb2883958Ben Gruver ".method public blah()V\n" + 805897c08299fe919d6ee3fe72def9605eb2883958Ben Gruver " .locals 1\n" + 815897c08299fe919d6ee3fe72def9605eb2883958Ben Gruver " sget v0, Lblarg;->bl<ref>ort:I\n" + 825897c08299fe919d6ee3fe72def9605eb2883958Ben Gruver " return-void\n" + 835897c08299fe919d6ee3fe72def9605eb2883958Ben Gruver ".end method"; 845897c08299fe919d6ee3fe72def9605eb2883958Ben Gruver 855897c08299fe919d6ee3fe72def9605eb2883958Ben Gruver SmaliFieldReference fieldReference = (SmaliFieldReference)configureByFileText(text, "blah.smali"); 865897c08299fe919d6ee3fe72def9605eb2883958Ben Gruver 875897c08299fe919d6ee3fe72def9605eb2883958Ben Gruver Assert.assertNotNull(fieldReference); 885897c08299fe919d6ee3fe72def9605eb2883958Ben Gruver Assert.assertEquals("blort", fieldReference.getName()); 895897c08299fe919d6ee3fe72def9605eb2883958Ben Gruver Assert.assertNotNull(fieldReference.getFieldType()); 905897c08299fe919d6ee3fe72def9605eb2883958Ben Gruver Assert.assertEquals("int", fieldReference.getFieldType().getType().getCanonicalText()); 915897c08299fe919d6ee3fe72def9605eb2883958Ben Gruver 925897c08299fe919d6ee3fe72def9605eb2883958Ben Gruver PsiField resolvedField = fieldReference.resolve(); 935897c08299fe919d6ee3fe72def9605eb2883958Ben Gruver Assert.assertNotNull(resolvedField); 945897c08299fe919d6ee3fe72def9605eb2883958Ben Gruver Assert.assertEquals("blort", resolvedField.getName()); 955897c08299fe919d6ee3fe72def9605eb2883958Ben Gruver Assert.assertNotNull(resolvedField.getContainingClass()); 965897c08299fe919d6ee3fe72def9605eb2883958Ben Gruver Assert.assertEquals("blarg", resolvedField.getContainingClass().getQualifiedName()); 975897c08299fe919d6ee3fe72def9605eb2883958Ben Gruver Assert.assertEquals("int", resolvedField.getType().getCanonicalText()); 985897c08299fe919d6ee3fe72def9605eb2883958Ben Gruver } 995897c08299fe919d6ee3fe72def9605eb2883958Ben Gruver 1005897c08299fe919d6ee3fe72def9605eb2883958Ben Gruver /** 1015897c08299fe919d6ee3fe72def9605eb2883958Ben Gruver * Test a reference to a smali field from a java class 1025897c08299fe919d6ee3fe72def9605eb2883958Ben Gruver */ 1035897c08299fe919d6ee3fe72def9605eb2883958Ben Gruver public void testSmaliReferenceFromJava() throws Exception { 1045897c08299fe919d6ee3fe72def9605eb2883958Ben Gruver createFile("blarg.smali", ".class public Lblarg; .super Ljava/lang/Object;" + 1055897c08299fe919d6ee3fe72def9605eb2883958Ben Gruver ".field public static blort:I"); 1065897c08299fe919d6ee3fe72def9605eb2883958Ben Gruver 1075897c08299fe919d6ee3fe72def9605eb2883958Ben Gruver String text = "public class blah { public static void something() {" + 1085897c08299fe919d6ee3fe72def9605eb2883958Ben Gruver "blarg.bl<ref>ort = 10;" + 1095897c08299fe919d6ee3fe72def9605eb2883958Ben Gruver "}}"; 1105897c08299fe919d6ee3fe72def9605eb2883958Ben Gruver 1115897c08299fe919d6ee3fe72def9605eb2883958Ben Gruver PsiReference fieldReference = configureByFileText(text, "blah.java"); 1125897c08299fe919d6ee3fe72def9605eb2883958Ben Gruver 1135897c08299fe919d6ee3fe72def9605eb2883958Ben Gruver Assert.assertNotNull(fieldReference); 1145897c08299fe919d6ee3fe72def9605eb2883958Ben Gruver 1155897c08299fe919d6ee3fe72def9605eb2883958Ben Gruver PsiField resolvedField = (PsiField)fieldReference.resolve(); 1165897c08299fe919d6ee3fe72def9605eb2883958Ben Gruver Assert.assertNotNull(resolvedField); 1175897c08299fe919d6ee3fe72def9605eb2883958Ben Gruver Assert.assertEquals("blort", resolvedField.getName()); 1185897c08299fe919d6ee3fe72def9605eb2883958Ben Gruver Assert.assertNotNull(resolvedField.getContainingClass()); 1195897c08299fe919d6ee3fe72def9605eb2883958Ben Gruver Assert.assertEquals("blarg", resolvedField.getContainingClass().getQualifiedName()); 1205897c08299fe919d6ee3fe72def9605eb2883958Ben Gruver Assert.assertEquals("int", resolvedField.getType().getCanonicalText()); 1215897c08299fe919d6ee3fe72def9605eb2883958Ben Gruver } 1222e7fe1b8fe660c867a49264abfb8a30765e07401Ben Gruver 1232e7fe1b8fe660c867a49264abfb8a30765e07401Ben Gruver @Override 1242e7fe1b8fe660c867a49264abfb8a30765e07401Ben Gruver protected Sdk getTestProjectJdk() { 1252e7fe1b8fe660c867a49264abfb8a30765e07401Ben Gruver return JavaAwareProjectJdkTableImpl.getInstanceEx().getInternalJdk(); 1262e7fe1b8fe660c867a49264abfb8a30765e07401Ben Gruver } 1275897c08299fe919d6ee3fe72def9605eb2883958Ben Gruver} 128