code: private static int scanTypeArgumentSignatures(String string, int start) {
  		// need a minimum 2 char "<>"
  		if (start >= string.length() - 1) {
  			throw new IllegalArgumentException();
  		}
  		char c = string.charAt(start);
  		if (c != C_GENERIC_START) {
  			throw new IllegalArgumentException();
  		}
  		int p = start + 1;
  		while (true) {
  			if (p >= string.length()) {
  				throw new IllegalArgumentException();
  			}
  			c = string.charAt(p);
  			if (c == C_GENERIC_END) {
  				return p;
  			}
  			int e = scanTypeArgumentSignature(string, p);
  			p = e + 1;
  		}
  	}
docs: Scans the given string for a list of type argument signatures starting at
  the given index and returns the index of the last character.
  <pre>
  TypeArgumentSignatures:
  <b>&lt;</b> TypeArgumentSignature* <b>&gt;</b>
  </pre>
  Note that although there is supposed to be at least one type argument, there
  is no syntactic ambiguity if there are none. This method will accept zero
  type argument signatures without complaint.
  
  @param string the signature string
  @param start the 0-based character index of the first character
  @return the 0-based character index of the last character
  @exception IllegalArgumentException if this is not a list of type arguments
  signatures