1da998c529e122ed7be535f6ea105a39b81ecb958Ben Gruver/*
2da998c529e122ed7be535f6ea105a39b81ecb958Ben Gruver * Copyright 2014, Google Inc.
3da998c529e122ed7be535f6ea105a39b81ecb958Ben Gruver * All rights reserved.
4da998c529e122ed7be535f6ea105a39b81ecb958Ben Gruver *
5da998c529e122ed7be535f6ea105a39b81ecb958Ben Gruver * Redistribution and use in source and binary forms, with or without
6da998c529e122ed7be535f6ea105a39b81ecb958Ben Gruver * modification, are permitted provided that the following conditions are
7da998c529e122ed7be535f6ea105a39b81ecb958Ben Gruver * met:
8da998c529e122ed7be535f6ea105a39b81ecb958Ben Gruver *
9da998c529e122ed7be535f6ea105a39b81ecb958Ben Gruver *     * Redistributions of source code must retain the above copyright
10da998c529e122ed7be535f6ea105a39b81ecb958Ben Gruver * notice, this list of conditions and the following disclaimer.
11da998c529e122ed7be535f6ea105a39b81ecb958Ben Gruver *     * Redistributions in binary form must reproduce the above
12da998c529e122ed7be535f6ea105a39b81ecb958Ben Gruver * copyright notice, this list of conditions and the following disclaimer
13da998c529e122ed7be535f6ea105a39b81ecb958Ben Gruver * in the documentation and/or other materials provided with the
14da998c529e122ed7be535f6ea105a39b81ecb958Ben Gruver * distribution.
15da998c529e122ed7be535f6ea105a39b81ecb958Ben Gruver *     * Neither the name of Google Inc. nor the names of its
16da998c529e122ed7be535f6ea105a39b81ecb958Ben Gruver * contributors may be used to endorse or promote products derived from
17da998c529e122ed7be535f6ea105a39b81ecb958Ben Gruver * this software without specific prior written permission.
18da998c529e122ed7be535f6ea105a39b81ecb958Ben Gruver *
19da998c529e122ed7be535f6ea105a39b81ecb958Ben Gruver * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20da998c529e122ed7be535f6ea105a39b81ecb958Ben Gruver * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21da998c529e122ed7be535f6ea105a39b81ecb958Ben Gruver * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22da998c529e122ed7be535f6ea105a39b81ecb958Ben Gruver * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23da998c529e122ed7be535f6ea105a39b81ecb958Ben Gruver * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24da998c529e122ed7be535f6ea105a39b81ecb958Ben Gruver * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25da998c529e122ed7be535f6ea105a39b81ecb958Ben Gruver * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26da998c529e122ed7be535f6ea105a39b81ecb958Ben Gruver * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27da998c529e122ed7be535f6ea105a39b81ecb958Ben Gruver * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28da998c529e122ed7be535f6ea105a39b81ecb958Ben Gruver * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29da998c529e122ed7be535f6ea105a39b81ecb958Ben Gruver * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30da998c529e122ed7be535f6ea105a39b81ecb958Ben Gruver */
31da998c529e122ed7be535f6ea105a39b81ecb958Ben Gruver
32da998c529e122ed7be535f6ea105a39b81ecb958Ben Gruverpackage org.jf.smalidea.psi.impl;
33da998c529e122ed7be535f6ea105a39b81ecb958Ben Gruver
34cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruverimport org.jetbrains.annotations.Nullable;
35da998c529e122ed7be535f6ea105a39b81ecb958Ben Gruverimport org.jf.smalidea.psi.SmaliCompositeElementFactory;
36da998c529e122ed7be535f6ea105a39b81ecb958Ben Gruverimport org.jf.smalidea.psi.SmaliElementTypes;
37da998c529e122ed7be535f6ea105a39b81ecb958Ben Gruver
38da998c529e122ed7be535f6ea105a39b81ecb958Ben Gruverpublic class SmaliLabel extends SmaliCompositeElement {
39da998c529e122ed7be535f6ea105a39b81ecb958Ben Gruver    public static final SmaliCompositeElementFactory FACTORY = new SmaliCompositeElementFactory() {
40da998c529e122ed7be535f6ea105a39b81ecb958Ben Gruver        @Override public SmaliCompositeElement createElement() {
41da998c529e122ed7be535f6ea105a39b81ecb958Ben Gruver            return new SmaliLabel();
42da998c529e122ed7be535f6ea105a39b81ecb958Ben Gruver        }
43da998c529e122ed7be535f6ea105a39b81ecb958Ben Gruver    };
44da998c529e122ed7be535f6ea105a39b81ecb958Ben Gruver
45da998c529e122ed7be535f6ea105a39b81ecb958Ben Gruver    public SmaliLabel() {
46da998c529e122ed7be535f6ea105a39b81ecb958Ben Gruver        super(SmaliElementTypes.LABEL);
47da998c529e122ed7be535f6ea105a39b81ecb958Ben Gruver    }
48ec63d20bb8cce01d3a07819c1416fac994e77e46Ben Gruver
49ec63d20bb8cce01d3a07819c1416fac994e77e46Ben Gruver    @Override public String getName() {
50ec63d20bb8cce01d3a07819c1416fac994e77e46Ben Gruver        return getText().substring(1);
51ec63d20bb8cce01d3a07819c1416fac994e77e46Ben Gruver    }
52cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver
53cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver    @Nullable
54cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver    public SmaliInstruction getInstruction() {
55cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver        return findNextSiblingByClass(SmaliInstruction.class);
56cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver    }
57cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver
58cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver    @Nullable
59cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver    private SmaliInstruction getPreviousInstruction() {
60cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver        return findPrevSiblingByClass(SmaliInstruction.class);
61cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver    }
62cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver
63cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver    public int getOffset() {
64cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver        SmaliInstruction instruction = getInstruction();
65cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver        if (instruction == null) {
66cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver            instruction = getPreviousInstruction();
67cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver            if (instruction == null) {
68cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver                return 0;
69cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver            }
70cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver            // TODO: handle variable size instructions
71cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver            return instruction.getOffset() + instruction.getOpcode().format.size;
72cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver        }
73cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver        return instruction.getOffset();
74cbd87b904e15c63d06f25b03b0eadf003780ec6cBen Gruver    }
75da998c529e122ed7be535f6ea105a39b81ecb958Ben Gruver}
76