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: Descriptors.java,v 1.1.1.1 2004/05/09 16:57:52 vlad_r Exp $
8f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project */
9f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectpackage com.vladium.util;
10f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
11f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport com.vladium.jcd.cls.IClassDefConstants;
12f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
13f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project// ----------------------------------------------------------------------------
14f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project/**
15f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * @author Vlad Roubtsov, (C) 2003
16f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project */
17f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectpublic
18f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectabstract class Descriptors
19f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project{
20f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    // public: ................................................................
21f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
22f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    // TODO: some overlap with Types in c.v.jcp.lib
23f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
24f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public static final char JAVA_NAME_SEPARATOR = '.';
25f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public static final char VM_NAME_SEPARATOR = '/';
26f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
27f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public static String combine (final String packageName, final String name, final char separator)
28f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
29f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        if ((name == null) || (name.length () == 0))
30f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            throw new IllegalArgumentException ("null or empty input: name");
31f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
32f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        if ((packageName == null) || (packageName.length () == 0))
33f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            return name;
34f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        else
35f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            return new StringBuffer (packageName).append (separator).append (name).toString ();
36f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
37f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
38f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public static String combineJavaName (final String packageName, final String name)
39f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
40f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        return combine (packageName, name, JAVA_NAME_SEPARATOR);
41f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
42f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
43f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public static String combineVMName (final String packageName, final String name)
44f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
45f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        return combine (packageName, name, VM_NAME_SEPARATOR);
46f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
47f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
48f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    /**
49f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * Converts a Java package/class name to how it would be
50f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * represented in the VM.<P>
51f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     *
52f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * Example:
53f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * <PRE><CODE>
54f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * javaNameToVMName("java.lang.Object") = "java/lang/Object"
55f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * </CODE></PRE>
56f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     *
57f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * @see #vmNameToJavaName
58f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     */
59f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public static String javaNameToVMName (final String javaName)
60f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
61f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        if (javaName == null) return null;
62f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
63f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        return javaName.replace ('.', '/');
64f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
65f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
66f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    /**
67f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * Converts a JVM package/class name to how it would be
68f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * represented in Java.<P>
69f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     *
70f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * Example:
71f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * <PRE><CODE>
72f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * vmNameToJavaName("java/lang/Object") = "java.lang.Object"
73f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * </CODE></PRE>
74f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     *
75f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * @see #javaNameToVMName
76f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     */
77f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public static String vmNameToJavaName (final String vmName)
78f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
79f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        if (vmName == null) return null;
80f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
81f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        return vmName.replace ('/', '.');
82f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
83f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
84f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    /**
85f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * NOTE: With 'shortTypeNames'=true the output is potentially lossy (truncates
86f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * package name) and can result in method signature collisions in very rare
87f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * circumstances (e.g., java.awt.List = java.util.List).<P>
88f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     *
89f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * Return type info is also lost.
90f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     *
91f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * @return method name (signature), no package prefix, no return type
92f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     */
93f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public static String methodVMNameToJavaName (final String className,
94f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                                                 final String methodVMName,
95f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                                                 final String descriptor,
96f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                                                 final boolean renameInits,
97f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                                                 final boolean shortTypeNames,
98f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                                                 final boolean appendReturnType)
99f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
100f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        final StringBuffer out = new StringBuffer ();
101f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
102f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        if (renameInits)
103f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
104f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            if (IClassDefConstants.CLINIT_NAME.equals (methodVMName))
105f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                return "<static initializer>";
106f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            else if (IClassDefConstants.INIT_NAME.equals (methodVMName))
107f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                out.append (className);
108f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            else
109f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                out.append (methodVMName);
110f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
111f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        else
112f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
113f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            if (IClassDefConstants.CLINIT_NAME.equals (methodVMName))
114f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                return IClassDefConstants.CLINIT_NAME;
115f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            else
116f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                out.append (methodVMName);
117f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
118f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
119f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        final char [] chars = descriptor.toCharArray ();
120f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        int end;
121f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
122f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        out.append (" (");
123f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
124f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            for (end = chars.length; chars [-- end] != ')'; );
125f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
126f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            for (int start = 1; start < end; )
127f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            {
128f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                if (start > 1) out.append (", ");
129f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                start = typeDescriptorToJavaName (chars, start, shortTypeNames, out);
130f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            }
131f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
132f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
133f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        if (appendReturnType)
134f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
135f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            out.append ("): ");
136f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
137f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            typeDescriptorToJavaName (chars, end + 1, shortTypeNames, out);
138f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
139f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        else
140f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
141f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            out.append (')');
142f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
143f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
144f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        return out.toString ();
145f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
146f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
147f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
148f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
149f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    // protected: .............................................................
150f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
151f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    // package: ...............................................................
152f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
153f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    // private: ...............................................................
154f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
155f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project//    private static int typeSignatureToJavaName (final char [] signature, int start,
156f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project//                                                final boolean shortTypeNames,
157f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project//                                                final StringBuffer out)
158f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project//    {
159f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project//
160f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project//    }
161f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
162f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
163f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    private static int typeDescriptorToJavaName (final char [] descriptor, int start,
164f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                                                 final boolean shortTypeNames,
165f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                                                 final StringBuffer out)
166f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
167f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        int dims;
168f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        for (dims = 0; descriptor [start] == '['; ++ dims, ++ start);
169f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
170f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        char c = descriptor [start ++];
171f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        switch (c)
172f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
173f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            case 'L':
174f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            {
175f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                if (shortTypeNames)
176f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                {
177f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    int lastSlash = -1;
178f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    for (int s = start; descriptor [s] != ';'; ++ s)
179f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    {
180f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                        if (descriptor [s] == '/') lastSlash = s;
181f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    }
182f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
183f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    for (start = lastSlash > 0 ? lastSlash + 1 : start; descriptor [start] != ';'; ++ start)
184f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    {
185f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                        c = descriptor [start];
186f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                        if (RENAME_INNER_CLASSES)
187f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                            out.append (c != '$' ? c : '.');
188f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                        else
189f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                            out.append (c);
190f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    }
191f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                }
192f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                else
193f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                {
194f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    for (; descriptor [start] != ';'; ++ start)
195f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    {
196f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                        c = descriptor [start];
197f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                        out.append (c != '/' ? c : '.');
198f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    }
199f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                }
200f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
201f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                ++ start;
202f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            }
203f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            break;
204f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
205f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            case 'B': out.append ("byte"); break;
206f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            case 'C': out.append ("char"); break;
207f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            case 'D': out.append ("double"); break;
208f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            case 'F': out.append ("float"); break;
209f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            case 'I': out.append ("int"); break;
210f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            case 'J': out.append ("long"); break;
211f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            case 'S': out.append ("short"); break;
212f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            case 'Z': out.append ("boolean"); break;
213f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
214f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            case 'V': out.append ("void"); break;
215f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
216f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            default:
217f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                throw new IllegalStateException ("unknown type descriptor element: " + c);
218f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
219f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        } // end of switch
220f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
221f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        if (dims > 0)
222f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
223f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            out.append (' ');
224f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            for (int d = 0; d < dims; ++ d) out.append ("[]");
225f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
226f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
227f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        return start;
228f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
229f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
230f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
231f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    private Descriptors () {} // prevent subclassing
232f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
233f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
234f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    // note: setting this to 'true' is not 100% reliable because it is legal
235f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    // to have $'s in regular class names as well:
236f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    private static final boolean RENAME_INNER_CLASSES = false;
237f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
238f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project} // end of class
239f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project// ----------------------------------------------------------------------------