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