1f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project/* Copyright (C) 2003 Vladimir Roubtsov. All rights reserved.
2f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project *
3f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * This program and the accompanying materials are made available under
4f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * the terms of the Common Public License v1.0 which accompanies this distribution,
5f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * and is available at http://www.eclipse.org/legal/cpl-v10.html
6f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project *
7f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * $Id: Types.java,v 1.1.1.1 2004/05/09 16:57:50 vlad_r Exp $
8f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project */
9f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectpackage com.vladium.jcd.lib;
10f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
11f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport java.io.IOException;
12f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport java.lang.reflect.*;
13f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
14f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport com.vladium.jcd.cls.IAccessFlags;
15f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
16f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project// ----------------------------------------------------------------------------
17f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project/**
18f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * Utility methods for manipulating type signatures and descriptors.
19f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project *
20f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * TODO: fix usage of chars in parsers
21f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project *
22f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * @author (C) 2001, Vlad Roubtsov
23f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project */
24f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectpublic abstract class Types
25f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project{
26f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    // public: ................................................................
27f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
28f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    /**
29f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * Returns 'c''s package name [does not include trailing '.'] or ""
30f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * if 'c' is in the default package.
31f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     */
32f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public static String getClassPackageName (final Class c)
33f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
34f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        // TODO: handle array and other types
35f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
36f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        final String className = c.getName ();
37f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        final int lastDot = className.lastIndexOf ('.');
38f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        return lastDot >= 0 ? className.substring (0, lastDot) : "";
39f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
40f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
41f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
42f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public static String accessFlagsToString (final int flags, final boolean isClass)
43f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
44f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        final StringBuffer result = new StringBuffer ();
45f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
46f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        boolean first = true;
47f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
48f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        if (isClass)
49f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
50f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            for (int f = 0; f < IAccessFlags.ALL_ACC.length; ++ f)
51f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            {
52f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                final int bit = IAccessFlags.ALL_ACC [f];
53f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
54f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                if ((flags & bit) != 0)
55f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                {
56f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    if (first)
57f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                        first = false;
58f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    else
59f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                        result.append (" ");
60f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
61f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    if (bit == IAccessFlags.ACC_SUPER)
62f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                        result.append ("super");
63f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    else
64f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                        result.append (IAccessFlags.ALL_ACC_NAMES [f]);
65f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                }
66f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            }
67f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
68f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        else
69f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
70f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            for (int f = 0; f < IAccessFlags.ALL_ACC.length; ++ f)
71f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            {
72f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                final int bit = IAccessFlags.ALL_ACC [f];
73f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
74f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                if ((flags & bit) != 0)
75f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                {
76f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    if (first)
77f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                        first = false;
78f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    else
79f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                        result.append (" ");
80f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
81f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    result.append (IAccessFlags.ALL_ACC_NAMES [f]);
82f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                }
83f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            }
84f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
85f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
86f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        return result.toString ();
87f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
88f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
89f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
90f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    /**
91f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * Converts Java-styled package/class name to how it would be
92f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * represented in the VM.<P>
93f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     *
94f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * Example:<BR>
95f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * javaNameToVMName("java.lang.Object") = "java/lang/Object"
96f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     *
97f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * @see #vmNameToJavaName
98f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     */
99f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public static String javaNameToVMName (final String javaName)
100f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
101f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        if (javaName == null) return null;
102f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        return javaName.replace ('.', '/');
103f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
104f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
105f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
106f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    /**
107f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * Converts a VM-styled package/class name to how it would be
108f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * represented in Java.<P>
109f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     *
110f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * Example:<BR>
111f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * vmNameToJavaName("java/lang/Object") = "java.lang.Object"
112f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     *
113f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * @see #javaNameToVMName
114f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     */
115f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public static String vmNameToJavaName (final String vmName)
116f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
117f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        if (vmName == null) return null;
118f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        return vmName.replace ('/', '.');
119f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
120f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
121f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
122f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    /**
123f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * Converts a method signature to its VM descriptor representation.
124f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * See $4.3 of the VM spec 1.0 for the descriptor grammar.<P>
125f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     *
126f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * Example:<BR>
127f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * signatureToDescriptor(new Object().getClass().getMethod("equals" ,new Class[0])) = "(Ljava/lang/Object;)Z"
128f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * <P>
129f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     *
130f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * Equivalent to
131f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * <CODE>signatureToDescriptor(method.getParameterTypes (), method.getReturnType ())</CODE>.
132f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     */
133f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public static String signatureToDescriptor (Method method)
134f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
135f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        if (method == null) throw new IllegalArgumentException ("null input: method");
136f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        return signatureToDescriptor (method.getParameterTypes (), method.getReturnType ());
137f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
138f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
139f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
140f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    /**
141f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * Converts a method signature (parameter types + return type) to its VM descriptor
142f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * representation. See $4.3 of the VM spec 1.0 for the descriptor grammar.<P>
143f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     */
144f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public static String signatureToDescriptor (Class [] parameterTypes, Class returnType)
145f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
146f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        return new signatureCompiler ().signatureDescriptor (parameterTypes, returnType);
147f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
148f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
149f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
150f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    /**
151f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * Converts a type (a Class) to its VM descriptor representation.<P>
152f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     *
153f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * Example:<BR>
154f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * typeToDescriptor(Object.class) = "Ljava/lang/Object;" <BR>
155f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * typeToDescriptor(boolean.class) = "Z"
156f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * <P>
157f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * Note the invariant typeToDescriptor(descriptorToType(desc)) == desc.
158f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     *
159f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * @see #descriptorToType
160f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     */
161f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public static String typeToDescriptor (Class type)
162f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
163f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        return new signatureCompiler ().typeDescriptor (type);
164f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
165f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
166f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
167f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    /**
168f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * Converts a VM descriptor to the corresponding type.<P>
169f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     *
170f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * Example:<BR>
171f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * descriptorToType("[[I") = int[][].class <BR>
172f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * descriptorToType("B") = byte.class
173f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * <P>
174f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * Note the invariant descriptorToType(typeToDescriptor(c)) == c.
175f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     *
176f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * @see #descriptorToType
177f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     */
178f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public static Class descriptorToType (String typedescriptor) throws ClassNotFoundException
179f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
180f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        return new typeDescriptorCompiler ().descriptorToClass (typedescriptor);
181f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
182f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
183f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
184f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
185f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public static String descriptorToReturnType (String methoddescriptor)
186f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
187f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        final int i1 = methoddescriptor.indexOf ('(');
188f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        final int i2 = methoddescriptor.lastIndexOf (')');
189f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
190f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        if ((i1 < 0) || (i2 <= 0) || (i1 >= i2) || (i2 >= methoddescriptor.length () - 1))
191f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            throw new IllegalArgumentException ("malformed method descriptor: [" + methoddescriptor + "]");
192f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
193f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        return methoddescriptor.substring (i2 + 1);
194f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
195f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
196f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
197f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public static String [] descriptorToParameterTypes (String methoddescriptor)
198f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
199f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        //System.out.println ("METHOD DESCRIPTOR: [" + methoddescriptor + "]");
200f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
201f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        try
202f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
203f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            final methodDescriptorCompiler compiler = new methodDescriptorCompiler (methoddescriptor);
204f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            compiler.methodDescriptor ();
205f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            return compiler.getResult ();
206f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
207f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        catch (IOException e)
208f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
209f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            throw new IllegalArgumentException ("error parsing [" + methoddescriptor + "]: " + e.toString ());
210f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
211f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
212f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        /*
213f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        final java.util.Vector _result = new java.util.Vector ();
214f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        final StringBuffer token = new StringBuffer ();
215f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
216f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        char c = '*';
217f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        int scan = 0;
218f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
219f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        for (int state = 0; state != 4; )
220f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
221f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            try
222f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            {
223f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                switch (state)
224f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                {
225f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                case 0:
226f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    c = methoddescriptor.charAt (scan++);
227f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    if (c == '(')
228f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                        state = 1;
229f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    else
230f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                        throw new IllegalArgumentException ("malformed method descriptor: [" + methoddescriptor + "]");
231f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    break;
232f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
233f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                case 1:
234f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    c = methoddescriptor.charAt (scan);
235f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    switch (c)
236f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    {
237f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    case 'B':
238f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    case 'C':
239f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    case 'D':
240f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    case 'F':
241f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    case 'I':
242f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    case 'J':
243f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    case 'S':
244f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    case 'Z':
245f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                        token.append (c);
246f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                        _result.addElement (token.toString ());
247f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                        token.setLength (0);
248f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                        scan++;
249f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                        break;
250f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
251f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    case 'L':
252f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                        state = 2;
253f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                        token.append (c);
254f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                        scan++;
255f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                        break;
256f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
257f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    case '[':
258f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                        state = 3;
259f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                        token.append (c);
260f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                        scan++;
261f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                        break;
262f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
263f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    case ')':
264f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                        if (token.length () > 0)
265f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                        {
266f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                            _result.addElement (token.toString ());
267f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                            token.setLength (0);
268f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                        }
269f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                        state = 4;
270f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                        break;
271f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
272f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
273f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    default:
274f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                        throw new IllegalArgumentException ("[state = " + state + ", c = " + c + "] malformed method descriptor: [" + methoddescriptor + "]");
275f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
276f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    } // end of nested switch
277f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    break;
278f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
279f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                case 2:
280f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    c = methoddescriptor.charAt (scan++);
281f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    token.append (c);
282f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    if (c == ';')
283f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    {
284f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                        _result.addElement (token.toString ());
285f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                        token.setLength (0);
286f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                        state = 1;
287f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    }
288f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    break;
289f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
290f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                case 3:
291f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    c = methoddescriptor.charAt (scan++);
292f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    token.append (c);
293f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    if (c != '[')
294f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    {
295f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                        state = 1;
296f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    }
297f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    break;
298f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
299f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                } // end of switch
300f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
301f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                //System.out.println ("[state = " + state + ", c = " + c + "]");
302f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            }
303f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            catch (StringIndexOutOfBoundsException e)
304f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            {
305f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                throw new IllegalArgumentException ("malformed method descriptor: [" + methoddescriptor + "]");
306f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            }
307f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
308f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
309f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        String [] result = new String [_result.size ()];
310f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        _result.copyInto (result);
311f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
312f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        return result;
313f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        */
314f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
315f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
316f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
317f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public static String signatureToMethodDescriptor (final String [] parameterTypeDescriptors, final String returnTypeDescriptor)
318f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
319f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        final StringBuffer result = new StringBuffer ("(");
320f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
321f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        for (int p = 0; p < parameterTypeDescriptors.length; p++)
322f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
323f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            result.append (parameterTypeDescriptors [p]);
324f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
325f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
326f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        result.append (')');
327f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        result.append (returnTypeDescriptor);
328f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
329f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        return result.toString ();
330f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
331f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
332f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
333f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public static String typeDescriptorToUserName (final String typedescriptor)
334f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
335f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        return new typeDescriptorCompiler2 ().descriptorToClass (typedescriptor);
336f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
337f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
338f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public static String methodDescriptorToUserName (final String methoddescriptor)
339f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
340f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        final String [] parameterTypes = descriptorToParameterTypes (methoddescriptor);
341f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
342f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        final StringBuffer result = new StringBuffer ("(");
343f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
344f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        for (int p = 0; p < parameterTypes.length; p++)
345f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
346f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            //System.out.println ("DESCRIPTOR: [" + parameterTypes [p] + "]");
347f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
348f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            if (p > 0) result.append (", ");
349f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
350f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            final String typeUserName = typeDescriptorToUserName (parameterTypes [p]);
351f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            int lastDot = typeUserName.lastIndexOf ('.');
352f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
353f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            if ((lastDot < 0) || ! "java.lang.".equals (typeUserName.substring (0, lastDot + 1)))
354f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                result.append (typeUserName);
355f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            else
356f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                result.append (typeUserName.substring (lastDot + 1));
357f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
358f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
359f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        result.append (')');
360f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        return result.toString ();
361f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
362f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
363f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public static String fullMethodDescriptorToUserName (final String classJavaName, String methodName, final String methoddescriptor)
364f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
365f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        if ("<init>".equals (methodName))
366f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            methodName = simpleClassName (classJavaName);
367f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        if ("<clinit>".equals (methodName))
368f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            methodName = "<static class initializer>";
369f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
370f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        return methodName + ' ' + methodDescriptorToUserName (methoddescriptor);
371f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
372f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
373f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    // TODO: added most recently
374f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public static String fullMethodDescriptorToFullUserName (final String classJavaName, String methodName, final String methoddescriptor)
375f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
376f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        if ("<init>".equals (methodName))
377f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            methodName = simpleClassName (classJavaName);
378f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        if ("<clinit>".equals (methodName))
379f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            methodName = "<static class initializer>";
380f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
381f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        return classJavaName + '.' + methodName + ' ' + methodDescriptorToUserName (methoddescriptor);
382f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
383f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
384f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    // protected: .............................................................
385f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
386f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    // package: ...............................................................
387f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
388f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    // private: ...............................................................
389f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
390f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
391f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    private static String simpleClassName (final String classJavaName)
392f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
393f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        int lastDot = classJavaName.lastIndexOf ('.');
394f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
395f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        if (lastDot < 0)
396f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            return classJavaName;
397f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        else
398f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            return classJavaName.substring (lastDot + 1);
399f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
400f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
401f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
402f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
403f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    private static final class signatureCompiler
404f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
405f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        String signatureDescriptor (Class [] _parameterTypes, Class _returnType)
406f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
407f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            emit ('(');    parameterTypes (_parameterTypes); emit (')'); returnType (_returnType);
408f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
409f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            return m_desc.toString ();
410f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
411f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
412f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        String typeDescriptor (Class type)
413f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
414f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            parameterType (type);
415f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
416f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            return m_desc.toString ();
417f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
418f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
419f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
420f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        private void parameterTypes (Class [] _parameterTypes)
421f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
422f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            if (_parameterTypes != null)
423f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            {
424f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                for (int p = 0; p < _parameterTypes.length; p++)
425f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                {
426f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    parameterType (_parameterTypes [p]);
427f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                }
428f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            }
429f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
430f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
431f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
432f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        private void returnType (Class _returnType)
433f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
434f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            if ((_returnType == null) || (_returnType == Void.TYPE))
435f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                emit ('V');
436f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            else
437f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                parameterType (_returnType);
438f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
439f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
440f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
441f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        private void parameterType (Class _parameterType)
442f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
443f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            if (_parameterType != null)
444f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            {
445f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                if (_parameterType.isPrimitive ()) // base type:
446f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                {
447f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    if (byte.class == _parameterType)            emit ('B');
448f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    else if (char.class == _parameterType)        emit ('C');
449f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    else if (double.class == _parameterType)    emit ('D');
450f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    else if (float.class == _parameterType)        emit ('F');
451f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    else if (int.class == _parameterType)        emit ('I');
452f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    else if (long.class == _parameterType)        emit ('J');
453f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    else if (short.class == _parameterType)        emit ('S');
454f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    else if (boolean.class == _parameterType)    emit ('Z');
455f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                }
456f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                else if (_parameterType.isArray ()) // array type:
457f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                {
458f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    emit ('[');    parameterType (_parameterType.getComponentType ());
459f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                }
460f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                else // object type:
461f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                {
462f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    emit ('L');    emit (javaNameToVMName (_parameterType.getName ())); emit (';');
463f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                }
464f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            }
465f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
466f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
467f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
468f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        private void emit (String s)
469f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
470f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            m_desc.append (s);
471f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
472f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
473f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        private void emit (char c)
474f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
475f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            m_desc.append (c);
476f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
477f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
478f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
479f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        private StringBuffer m_desc = new StringBuffer ();
480f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
481f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    } // end of static class
482f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
483f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
484f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
485f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    private static class typeDescriptorCompiler
486f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
487f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        /*
488f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        NOTE: the following would be a very simple solution to this problem
489f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
490f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            Class.forName ('[' + descriptor).getComponentType ();
491f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
492f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        except it only works in MS VM.
493f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        */
494f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
495f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        Class descriptorToClass (String typedescriptor) throws ClassNotFoundException
496f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
497f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            char first = typedescriptor.charAt (0);
498f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
499f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            if (first == '[')
500f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                // array type:
501f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                return arrayOf (typedescriptor.substring (1));
502f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            else if (first == 'L')
503f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                // object type:
504f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                return Class.forName (vmNameToJavaName (typedescriptor.substring (1, typedescriptor.length() - 1)));
505f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            else // primitive type
506f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            {
507f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                return primitive (first);
508f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            }
509f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
510f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
511f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
512f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        Class arrayOf (String typedescriptor) throws ClassNotFoundException
513f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
514f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            char first = typedescriptor.charAt (0);
515f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            Class component;
516f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
517f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            if (first == '[')
518f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                // array type:
519f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                component = arrayOf (typedescriptor.substring (1));
520f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            else if (first == 'L')
521f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                // object type:
522f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                component =  Class.forName (vmNameToJavaName (typedescriptor.substring (1, typedescriptor.length() - 1)));
523f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            else // primitive type
524f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            {
525f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                component = primitive (first);
526f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            }
527f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
528f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            Object array = Array.newInstance (component, 0);
529f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            return array.getClass ();
530f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
531f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
532f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
533f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        Class primitive (char c) throws ClassNotFoundException
534f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
535f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            if (c == 'B') return byte.class;
536f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            else if (c == 'C') return char.class;
537f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            else if (c == 'D') return double.class;
538f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            else if (c == 'F') return float.class;
539f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            else if (c == 'I') return int.class;
540f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            else if (c == 'J') return long.class;
541f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            else if (c == 'S') return short.class;
542f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            else if (c == 'Z') return boolean.class;
543f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            else throw new ClassNotFoundException ("unknown base type: " + c);
544f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
545f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
546f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    } // end of static class
547f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
548f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
549f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    private static class typeDescriptorCompiler2
550f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
551f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        String descriptorToClass (String typedescriptor)
552f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
553f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            //System.out.println ("typedesc1 -> " + typedescriptor);
554f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
555f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            char first = typedescriptor.charAt (0);
556f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
557f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            if (first == '[')
558f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                // array type:
559f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                return arrayOf (typedescriptor.substring (1));
560f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            else if (first == 'L')
561f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                // object type:
562f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                return vmNameToJavaName (typedescriptor.substring (1, typedescriptor.length() - 1));
563f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            else // primitive type
564f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                return primitive (first);
565f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
566f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
567f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
568f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        String arrayOf (String typedescriptor)
569f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
570f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            //System.out.println ("typedesc2 -> " + typedescriptor);
571f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
572f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            char first = typedescriptor.charAt (0);
573f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            String component;
574f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
575f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            if (first == '[')
576f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                // array type:
577f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                component = arrayOf (typedescriptor.substring (1));
578f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            else if (first == 'L')
579f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                // object type:
580f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                component = vmNameToJavaName (typedescriptor.substring (1, typedescriptor.length() - 1));
581f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            else // primitive type
582f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                component = primitive (first);
583f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
584f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            String array = component + " []";
585f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            return array;
586f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
587f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
588f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
589f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        String primitive (char c)
590f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
591f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            switch (c)
592f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            {
593f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            case 'B': return "byte";
594f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            case 'C': return "char";
595f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            case 'D': return "double";
596f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            case 'F': return "float";
597f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            case 'I': return "int";
598f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            case 'J': return "long";
599f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            case 'S': return "short";
600f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            case 'Z': return "boolean";
601f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            default:
602f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                throw new IllegalArgumentException ("unknown primitive: " + c);
603f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            }
604f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
605f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
606f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    } // end of static class
607f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
608f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
609f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    private static class methodDescriptorCompiler
610f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
611f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        methodDescriptorCompiler (String methoddescriptor)
612f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
613f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            m_in = new java.io.PushbackReader (new java.io.StringReader (methoddescriptor));
614f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
615f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
616f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        String [] getResult ()
617f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
618f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            final String [] result = new String [m_result.size ()];
619f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            m_result.toArray (result);
620f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
621f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            return result;
622f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
623f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
624f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        void methodDescriptor () throws IOException
625f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
626f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            consume ('(');
627f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
628f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            char c;
629f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            while ((c = (char) m_in.read ()) != ')')
630f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            {
631f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                m_in.unread (c);
632f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                parameterDescriptor ();
633f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            }
634f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            returnDescriptor ();
635f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
636f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
637f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        void parameterDescriptor () throws IOException
638f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
639f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            fieldType ();
640f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            newToken ();
641f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
642f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
643f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        void returnDescriptor () throws IOException
644f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
645f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            char c = (char) m_in.read ();
646f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
647f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            switch (c)
648f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            {
649f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            case 'V':
650f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                m_token.append (c);
651f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                break;
652f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
653f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            default:
654f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                m_in.unread (c);
655f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                fieldType ();
656f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
657f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            }
658f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            // ignore return type for now: newToken ();
659f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
660f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
661f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        void componentType () throws IOException
662f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
663f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            fieldType ();
664f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
665f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
666f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        void objectType () throws IOException
667f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
668f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            consume ('L');
669f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            m_token.append ('L');
670f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
671f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            char c;
672f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            while ((c = (char) m_in.read ()) != ';')
673f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            {
674f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                m_token.append (c);
675f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            }
676f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            m_token.append (';');
677f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
678f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
679f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        void arrayType () throws IOException
680f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
681f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            consume ('[');
682f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            m_token.append ('[');
683f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
684f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            componentType ();
685f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
686f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
687f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        void fieldType () throws IOException
688f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
689f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            char c = (char) m_in.read ();
690f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            m_in.unread (c);
691f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
692f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            switch (c)
693f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            {
694f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            case 'L':
695f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                objectType ();
696f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                break;
697f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
698f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            case '[':
699f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                arrayType ();
700f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                break;
701f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
702f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            default:
703f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                baseType ();
704f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                break;
705f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            }
706f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
707f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
708f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
709f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        void baseType () throws IOException
710f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
711f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            char c = (char) m_in.read ();
712f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
713f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            switch (c)
714f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            {
715f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            case 'B':
716f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            case 'C':
717f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            case 'D':
718f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            case 'F':
719f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            case 'I':
720f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            case 'J':
721f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            case 'S':
722f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            case 'Z':
723f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                m_token.append (c);
724f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                break;
725f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
726f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            default:
727f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                throw new IllegalArgumentException ("unknown base type: " + c);
728f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            }
729f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
730f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
731f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
732f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        private void consume (char expected) throws IOException
733f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
734f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            char c = (char) m_in.read ();
735f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
736f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            if (c != expected)
737f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                throw new IllegalArgumentException ("consumed '" + c + "' while expecting '" + expected + "'");
738f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
739f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
740f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
741f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
742f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        private void newToken ()
743f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
744f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            //System.out.println ("NEW TOKEN [" + m_token.toString () + "]");
745f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
746f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            m_result.add (m_token.toString ());
747f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            m_token.setLength (0);
748f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
749f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
750f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        final java.util.List m_result = new java.util.ArrayList ();
751f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        private StringBuffer m_token = new StringBuffer ();
752f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        private java.io.PushbackReader m_in;
753f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    } // end of nested class
754f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
755f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project} // end of class
756f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project// ----------------------------------------------------------------------------
757