1 /*
2  * Copyright 2013, Google Inc.
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions are
7  * met:
8  *
9  *     * Redistributions of source code must retain the above copyright
10  * notice, this list of conditions and the following disclaimer.
11  *     * Redistributions in binary form must reproduce the above
12  * copyright notice, this list of conditions and the following disclaimer
13  * in the documentation and/or other materials provided with the
14  * distribution.
15  *     * Neither the name of Google Inc. nor the names of its
16  * contributors may be used to endorse or promote products derived from
17  * this software without specific prior written permission.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30  */
31 
32 package org.jf.dexlib2.immutable.util;
33 
34 import org.jf.dexlib2.immutable.ImmutableMethodParameter;
35 
36 import javax.annotation.Nonnull;
37 import java.util.Iterator;
38 
39 public class ParamUtil {
findTypeEnd(@onnull String str, int index)40     private static int findTypeEnd(@Nonnull String str, int index) {
41         char c = str.charAt(index);
42         switch (c) {
43             case 'Z':
44             case 'B':
45             case 'S':
46             case 'C':
47             case 'I':
48             case 'J':
49             case 'F':
50             case 'D':
51                 return index+1;
52             case 'L':
53                 while (str.charAt(index++) != ';') {}
54                 return index;
55             case '[':
56                 while (str.charAt(index++) != '[') {}
57                 return findTypeEnd(str, index);
58             default:
59                 throw new IllegalArgumentException(String.format("Param string \"%s\" contains invalid type prefix: %s",
60                         str, Character.toString(c)));
61         }
62     }
63 
64     @Nonnull
parseParamString(@onnull final String params)65     public static Iterable<ImmutableMethodParameter> parseParamString(@Nonnull final String params) {
66         return new Iterable<ImmutableMethodParameter>() {
67             @Override public Iterator<ImmutableMethodParameter> iterator() {
68                 return new Iterator<ImmutableMethodParameter>() {
69 
70                     private int index = 0;
71 
72                     @Override public boolean hasNext() {
73                         return index < params.length();
74                     }
75 
76                     @Override public ImmutableMethodParameter next() {
77                         int end = findTypeEnd(params, index);
78                         String ret = params.substring(index, end);
79                         index = end;
80                         return new ImmutableMethodParameter(ret, null, null);
81                     }
82 
83                     @Override public void remove() {
84                         throw new UnsupportedOperationException();
85                     }
86                 };
87             }
88         };
89     }
90 }
91