| 553 | // TODO(benyu): Once we are on Java 8, delete this abstraction |
| 554 | |
| 555 | enum JavaVersion { |
| 556 | JAVA6 { |
| 557 | @Override |
| 558 | GenericArrayType newArrayType(Type componentType) { |
| 559 | return new GenericArrayTypeImpl(componentType); |
| 560 | } |
| 561 | |
| 562 | @Override |
| 563 | Type usedInGenericType(Type type) { |
| 564 | checkNotNull(type); |
| 565 | if (type instanceof Class) { |
| 566 | Class<?> cls = (Class<?>) type; |
| 567 | if (cls.isArray()) { |
| 568 | return new GenericArrayTypeImpl(cls.getComponentType()); |
| 569 | } |
| 570 | } |
| 571 | return type; |
| 572 | } |
| 573 | }, |
| 574 | |
| 575 | JAVA7 { |
| 576 | @Override |
| 577 | Type newArrayType(Type componentType) { |
| 578 | if (componentType instanceof Class) { |
| 579 | return getArrayClass((Class<?>) componentType); |
| 580 | } else { |
| 581 | return new GenericArrayTypeImpl(componentType); |
| 582 | } |
| 583 | } |
| 584 | |
| 585 | @Override |
| 586 | Type usedInGenericType(Type type) { |
| 587 | return checkNotNull(type); |
| 588 | } |
| 589 | }, |
| 590 | |
| 591 | JAVA8 { |
| 592 | @Override |
| 593 | Type newArrayType(Type componentType) { |
| 594 | return JAVA7.newArrayType(componentType); |
| 595 | } |
| 596 | |
| 597 | @Override |
| 598 | Type usedInGenericType(Type type) { |
| 599 | return JAVA7.usedInGenericType(type); |
| 600 | } |
| 601 | |
| 602 | @Override |
| 603 | String typeName(Type type) { |
| 604 | try { |
| 605 | Method getTypeName = Type.class.getMethod("getTypeName"); |
| 606 | return (String) getTypeName.invoke(type); |
| 607 | } catch (NoSuchMethodException e) { |
| 608 | throw new AssertionError("Type.getTypeName should be available in Java 8"); |
| 609 | } catch (InvocationTargetException e) { |
| 610 | throw new RuntimeException(e); |
| 611 | } catch (IllegalAccessException e) { |
| 612 | throw new RuntimeException(e); |