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}