1 19 20 package edu.umd.cs.findbugs.ba; 21 22 import java.util.Iterator ; 23 import java.util.NoSuchElementException ; 24 25 import org.apache.bcel.generic.ConstantPoolGen; 26 import org.apache.bcel.generic.InvokeInstruction; 27 28 33 public class SignatureParser { 34 private class ParameterSignatureIterator implements Iterator <String > { 35 private int index = 1; 36 37 public boolean hasNext() { 38 return index < signature.length() 39 && signature.charAt(index) != ')'; 40 } 41 42 public String next() { 43 if (!hasNext()) throw new NoSuchElementException (); 44 StringBuffer result = new StringBuffer (); 45 boolean done; 46 do { 47 done = true; 48 int ch = signature.charAt(index); 49 switch (ch) { 50 case 'B': 51 case 'C': 52 case 'D': 53 case 'F': 54 case 'I': 55 case 'J': 56 case 'S': 57 case 'Z': 58 result.append(signature.charAt(index)); 59 ++index; 60 break; 61 62 case 'L': 63 int semi = signature.indexOf(';', index + 1); 64 if (semi < 0) 65 throw new IllegalStateException ("Invalid method signature: " + signature); 66 result.append(signature.substring(index, semi + 1)); 67 index = semi + 1; 68 break; 69 70 case '[': 71 result.append('['); 72 ++index; 73 done = false; 74 break; 75 76 case 'V': 77 default: 78 throw new IllegalStateException ("Invalid method signature: " + signature); 79 } 80 } while (!done); 81 82 return result.toString(); 83 } 84 85 public void remove() { 86 throw new UnsupportedOperationException (); 87 } 88 } 89 90 private final String signature; 91 92 97 public SignatureParser(String signature) { 98 if (!signature.startsWith("(")) 99 throw new IllegalArgumentException ("Bad method signature: " + signature); 100 this.signature = signature; 101 } 102 103 108 public Iterator <String > parameterSignatureIterator() { 109 return new ParameterSignatureIterator(); 110 } 111 112 117 public String getReturnTypeSignature() { 118 int endOfParams = signature.lastIndexOf(')'); 119 if (endOfParams < 0) 120 throw new IllegalArgumentException ("Bad method signature: " + signature); 121 return signature.substring(endOfParams + 1); 122 } 123 124 129 public int getNumParameters() { 130 int count = 0; 131 for (Iterator <String > i = parameterSignatureIterator(); i.hasNext();) { 132 i.next(); 133 ++count; 134 } 135 return count; 136 } 137 138 145 public static int getNumParametersForInvocation(InvokeInstruction inv, ConstantPoolGen cpg) { 146 SignatureParser sigParser = new SignatureParser(inv.getSignature(cpg)); 147 return sigParser.getNumParameters(); 148 } 149 150 public static void main(String [] args) { 151 if (args.length != 1) { 152 System.err.println("Usage: " + SignatureParser.class.getName() + " '<method signature>'"); 153 System.exit(1); 154 } 155 SignatureParser parser = new SignatureParser(args[0]); 156 for (Iterator <String > i = parser.parameterSignatureIterator(); i.hasNext();){ 157 System.out.println(i.next()); 158 } 159 System.out.println(parser.getNumParameters() + " parameter(s)"); 160 } 161 } 162 163 | Popular Tags |