ReferenceFormatter.java revision 0b2f7d6a57e90424b3ee455c041aab3996c05f2c
1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/*
2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * [The "BSD licence"]
3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * Copyright (c) 2010 Ben Gruver
4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * All rights reserved.
5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) *
6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without
7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * modification, are permitted provided that the following conditions
8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * are met:
9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * 1. Redistributions of source code must retain the above copyright
10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) *    notice, this list of conditions and the following disclaimer.
11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * 2. Redistributions in binary form must reproduce the above copyright
12eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch *    notice, this list of conditions and the following disclaimer in the
13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) *    documentation and/or other materials provided with the distribution.
14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * 3. The name of the author may not be used to endorse or promote products
15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) *    derived from this software without specific prior written permission.
16b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) *
17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
2246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) */
28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)package org.jf.baksmali.Adaptors;
30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)import org.jf.baksmali.IndentingWriter;
32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)import org.jf.dexlib.*;
33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)import org.jf.dexlib.Util.Utf8Utils;
34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)import java.io.IOException;
36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)public class ReferenceFormatter {
38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    public static void writeReference(IndentingWriter writer, Item item) throws IOException {
39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        switch (item.getItemType()) {
40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            case TYPE_METHOD_ID_ITEM:
41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                writeMethodReference(writer, (MethodIdItem)item);
42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                return;
43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            case TYPE_FIELD_ID_ITEM:
44868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                writeFieldReference(writer, (FieldIdItem)item);
45868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                return;
46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            case TYPE_STRING_ID_ITEM:
47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                writeStringReference(writer, (StringIdItem)item);
48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                return;
49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            case TYPE_TYPE_ID_ITEM:
50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                writeTypeReference(writer, (TypeIdItem)item);
51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                return;
52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        }
53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    public static void writeMethodReference(IndentingWriter writer, MethodIdItem item) throws IOException {
56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        writer.write(item.getContainingClass().getTypeDescriptor());
57868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        writer.write("->");
58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        writer.write(item.getMethodName().getStringValue());
59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        writer.write(item.getPrototype().getPrototypeString());
60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    public static void writeFieldReference(IndentingWriter writer, FieldIdItem item) throws IOException {
63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        writer.write(item.getContainingClass().getTypeDescriptor());
64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        writer.write("->");
65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        writer.write(item.getFieldName().getStringValue());
66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        writer.write(':');
67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        writer.write(item.getFieldType().getTypeDescriptor());
68b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    }
697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    public static void writeStringReference(IndentingWriter writer, StringIdItem item) throws IOException {
71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        writer.write('"');
72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        Utf8Utils.writeEscapedString(writer, item.getStringValue());
73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        writer.write('"');
74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    public static void writeTypeReference(IndentingWriter writer, TypeIdItem item) throws IOException {
77eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        writer.write(item.getTypeDescriptor());
78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)