1cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver/* 2cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver * Copyright 2014, Google Inc. 3cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver * All rights reserved. 4cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver * 5cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver * Redistribution and use in source and binary forms, with or without 6cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver * modification, are permitted provided that the following conditions are 7cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver * met: 8cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver * 9cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver * * Redistributions of source code must retain the above copyright 10cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver * notice, this list of conditions and the following disclaimer. 11cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver * * Redistributions in binary form must reproduce the above 12cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver * copyright notice, this list of conditions and the following disclaimer 13cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver * in the documentation and/or other materials provided with the 14cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver * distribution. 15cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver * * Neither the name of Google Inc. nor the names of its 16cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver * contributors may be used to endorse or promote products derived from 17cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver * this software without specific prior written permission. 18cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver * 19cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 20cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 21cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 22cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 23cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 24cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 25cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 26cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 27cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 28cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver */ 31cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver 32cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruverpackage org.jf.smalidea.dexlib.instruction; 33cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver 34cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruverimport com.google.common.base.Function; 35cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruverimport com.google.common.collect.Lists; 36cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruverimport com.intellij.psi.PsiType; 37cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruverimport org.jf.dexlib2.Opcode; 38cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruverimport org.jf.dexlib2.ReferenceType; 39cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruverimport org.jf.dexlib2.iface.instruction.Instruction; 40cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruverimport org.jf.dexlib2.iface.reference.Reference; 41cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruverimport org.jf.dexlib2.immutable.reference.ImmutableFieldReference; 42cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruverimport org.jf.dexlib2.immutable.reference.ImmutableMethodReference; 43cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruverimport org.jf.dexlib2.immutable.reference.ImmutableStringReference; 44cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruverimport org.jf.dexlib2.immutable.reference.ImmutableTypeReference; 45cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruverimport org.jf.smalidea.psi.impl.*; 46cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruverimport org.jf.smalidea.util.NameUtils; 474645cc437d23bc9ca0ab4aeed10c7ff79ad229a3Ben Gruverimport org.jf.smalidea.util.StringUtils; 48cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver 49cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruverimport javax.annotation.Nonnull; 50cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruverimport javax.annotation.Nullable; 51cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruverimport java.util.List; 52cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver 53cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruverpublic abstract class SmalideaInstruction implements Instruction { 54cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver @Nonnull protected final SmaliInstruction psiInstruction; 55cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver 56cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver protected SmalideaInstruction(@Nonnull SmaliInstruction instruction) { 57cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver this.psiInstruction = instruction; 58cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver } 59cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver 60cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver @Nonnull 61cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver public static SmalideaInstruction of(SmaliInstruction instruction) { 62cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver switch (instruction.getOpcode().format) { 63cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver case Format10t: 64cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver return new SmalideaInstruction10t(instruction); 65cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver case Format10x: 66cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver return new SmalideaInstruction10x(instruction); 67cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver case Format11n: 68cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver return new SmalideaInstruction11n(instruction); 69cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver case Format11x: 70cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver return new SmalideaInstruction11x(instruction); 71cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver case Format12x: 72cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver return new SmalideaInstruction12x(instruction); 73cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver case Format20t: 74cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver return new SmalideaInstruction20t(instruction); 75cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver case Format21c: 76cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver return new SmalideaInstruction21c(instruction); 77cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver case Format21ih: 78cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver return new SmalideaInstruction21ih(instruction); 79cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver case Format21lh: 80cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver return new SmalideaInstruction21lh(instruction); 81cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver case Format21s: 82cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver return new SmalideaInstruction21s(instruction); 83cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver case Format21t: 84cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver return new SmalideaInstruction21t(instruction); 85cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver case Format22b: 86cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver return new SmalideaInstruction22b(instruction); 87cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver case Format22c: 88cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver return new SmalideaInstruction22c(instruction); 89cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver case Format22s: 90cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver return new SmalideaInstruction22s(instruction); 91cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver case Format22t: 92cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver return new SmalideaInstruction22t(instruction); 93cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver case Format22x: 94cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver return new SmalideaInstruction22x(instruction); 95cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver case Format23x: 96cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver return new SmalideaInstruction23x(instruction); 97cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver case Format30t: 98cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver return new SmalideaInstruction30t(instruction); 99cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver case Format31c: 100cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver return new SmalideaInstruction31c(instruction); 101cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver case Format31i: 102cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver return new SmalideaInstruction31i(instruction); 103cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver case Format31t: 104cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver return new SmalideaInstruction31t(instruction); 105cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver case Format32x: 106cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver return new SmalideaInstruction32x(instruction); 107cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver case Format35c: 108cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver return new SmalideaInstruction35c(instruction); 109cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver case Format3rc: 110cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver return new SmalideaInstruction3rc(instruction); 111cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver case Format51l: 112cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver return new SmalideaInstruction51l(instruction); 113cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver case PackedSwitchPayload: 114cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver return new SmalideaPackedSwitchPayload(instruction); 115cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver case SparseSwitchPayload: 116cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver return new SmalideaSparseSwitchPayload(instruction); 117cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver case ArrayPayload: 118cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver return new SmalideaArrayPayload(instruction); 119cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver default: 120cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver throw new RuntimeException("Unexpected instruction type"); 121cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver } 122cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver } 123cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver 124cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver @Nonnull public Opcode getOpcode() { 125cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver return psiInstruction.getOpcode(); 126cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver } 127cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver 128cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver public int getCodeUnits() { 129cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver return getOpcode().format.size / 2; 130cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver } 131cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver 132cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver public int getCodeOffset() { 1330dd228064d9e7f617bfea1e805bab59525cf7097Ben Gruver SmaliLabelReference labelReference = psiInstruction.getTarget(); 1340dd228064d9e7f617bfea1e805bab59525cf7097Ben Gruver if (labelReference == null) { 135cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver return -1; 136cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver } 137cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver 138cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver SmaliLabel label = labelReference.resolve(); 139cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver if (label == null) { 140cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver return -1; 141cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver } 142cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver return (label.getOffset() - psiInstruction.getOffset())/2; 143cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver } 144cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver 145cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver public int getRegisterCount() { 146cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver return psiInstruction.getRegisterCount(); 147cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver } 148cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver 149cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver public int getRegisterA() { 150cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver return psiInstruction.getRegister(0); 151cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver } 152cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver 153cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver public int getRegisterB() { 154cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver return psiInstruction.getRegister(1); 155cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver } 156cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver 157cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver public int getRegisterC() { 158cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver return psiInstruction.getRegister(2); 159cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver } 160cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver 161cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver public int getNarrowLiteral() { 162cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver SmaliLiteral literal = psiInstruction.getLiteral(); 163cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver if (literal == null) { 164cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver return 0; 165cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver } 166cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver return (int)literal.getIntegralValue(); 167cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver } 168cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver 169cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver public long getWideLiteral() { 170cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver SmaliLiteral literal = psiInstruction.getLiteral(); 171cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver if (literal == null) { 172cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver return 0; 173cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver } 174cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver return literal.getIntegralValue(); 175cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver } 176cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver 177cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver @Nonnull public Reference getReference() { 178cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver switch (getReferenceType()) { 179cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver case ReferenceType.STRING: 1804645cc437d23bc9ca0ab4aeed10c7ff79ad229a3Ben Gruver return new ImmutableStringReference(StringUtils.parseQuotedString( 1814645cc437d23bc9ca0ab4aeed10c7ff79ad229a3Ben Gruver psiInstruction.getLiteral().getText())); 182cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver case ReferenceType.TYPE: 183cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver SmaliTypeElement typeReference = psiInstruction.getTypeReference(); 184cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver assert typeReference != null; 185cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver return new ImmutableTypeReference(typeReference.getText()); 186cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver case ReferenceType.METHOD: 187cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver SmaliMethodReference methodReference = psiInstruction.getMethodReference(); 188cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver assert methodReference != null; 189762bf07e3596b175a2faab476e07e55e990c8156Ben Gruver String containingClass = methodReference.getContainingType().getText(); 190cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver List<String> paramTypes = 191cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver Lists.transform(methodReference.getParameterTypes(), new Function<PsiType, String>() { 192cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver @Nullable @Override public String apply(@Nullable PsiType psiType) { 193cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver if (psiType == null) { 194cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver return null; 195cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver } 19682f031210ea1913abdb2a26b1f461826ee9980faBen Gruver return NameUtils.javaToSmaliType(psiType); 197cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver } 198cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver }); 199cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver 200cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver return new ImmutableMethodReference(containingClass, 201cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver methodReference.getName(), 202cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver paramTypes, 203cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver methodReference.getReturnType().getText()); 204cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver case ReferenceType.FIELD: 205cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver SmaliFieldReference fieldReference = psiInstruction.getFieldReference(); 206cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver assert fieldReference != null; 2074645cc437d23bc9ca0ab4aeed10c7ff79ad229a3Ben Gruver containingClass = fieldReference.getContainingType().getText(); 208cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver return new ImmutableFieldReference(containingClass, 209cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver fieldReference.getName(), 210cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver fieldReference.getFieldType().getText()); 211cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver } 212cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver assert false; 213cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver return null; 214cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver } 215cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver 216cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver public int getReferenceType() { 217cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver return psiInstruction.getOpcode().referenceType; 218cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver } 219cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver 220cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver}