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