| 505 | |
| 506 | public static final class MethodSignature implements PotentialComparable<MethodSignature> { |
| 507 | public static MethodSignature parse(String sig, ClassEnv env) { |
| 508 | // [<TypeParameter+>] '(' JavaTypeSignature* ')' ( 'V' | JavaTypeSignature ) ThrowsSignature* |
| 509 | MethodSignature ret = new MethodSignature(); |
| 510 | MutableInt pos = new MutableInt(); |
| 511 | |
| 512 | if (sig.startsWith("<")) { |
| 513 | pos.val++; |
| 514 | ret.typeParameters = new ArrayList<>(); |
| 515 | |
| 516 | do { |
| 517 | ret.typeParameters.add(TypeParameter.parse(sig, pos, env)); |
| 518 | } while (sig.charAt(pos.val) != '>'); |
| 519 | |
| 520 | pos.val++; |
| 521 | } |
| 522 | |
| 523 | assert sig.charAt(pos.val) == '('; |
| 524 | pos.val++; |
| 525 | |
| 526 | ret.args = new ArrayList<>(); |
| 527 | |
| 528 | while (sig.charAt(pos.val) != ')') { |
| 529 | ret.args.add(JavaTypeSignature.parse(sig, pos, env)); |
| 530 | } |
| 531 | |
| 532 | assert sig.charAt(pos.val) == ')'; |
| 533 | pos.val++; |
| 534 | |
| 535 | if (sig.charAt(pos.val) == 'V') { |
| 536 | pos.val++; |
| 537 | } else { |
| 538 | ret.result = JavaTypeSignature.parse(sig, pos, env); |
| 539 | } |
| 540 | |
| 541 | if (pos.val < sig.length()) { |
| 542 | ret.throwsSignatures = new ArrayList<>(); |
| 543 | |
| 544 | do { |
| 545 | ret.throwsSignatures.add(ThrowsSignature.parse(sig, pos, env)); |
| 546 | } while (pos.val < sig.length()); |
| 547 | } |
| 548 | |
| 549 | assert ret.toString().equals(sig); |
| 550 | |
| 551 | return ret; |
| 552 | } |
| 553 | |
| 554 | public List<TypeParameter> getTypeParameters() { |
| 555 | return typeParameters; |