From a428e7bb2c2ce1c13b47d1e43128a1c67c397f21 Mon Sep 17 00:00:00 2001 From: gak Date: Sun, 25 Jan 2015 20:29:15 -0800 Subject: Add a method to MoreTypes that does the same operation as Types.asElement, but can be called statically. Then, clean up all of the places that callers to MoreTypes.asTypeElement were passing through a Types instance just for that reason. ------------- Created by MOE: http://code.google.com/p/moe-java MOE_MIGRATED_REVID=84753119 --- .../java/com/google/auto/common/MoreTypes.java | 58 ++++++++++++++-------- .../java/com/google/auto/common/MoreTypesTest.java | 34 +++++++++++-- 2 files changed, 66 insertions(+), 26 deletions(-) (limited to 'common') diff --git a/common/src/main/java/com/google/auto/common/MoreTypes.java b/common/src/main/java/com/google/auto/common/MoreTypes.java index 67c0a4cf..05f9d6d7 100644 --- a/common/src/main/java/com/google/auto/common/MoreTypes.java +++ b/common/src/main/java/com/google/auto/common/MoreTypes.java @@ -15,7 +15,6 @@ */ package com.google.auto.common; -import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.collect.Iterables.getOnlyElement; import static com.google.common.base.Preconditions.checkState; @@ -59,7 +58,6 @@ import javax.lang.model.type.TypeVariable; import javax.lang.model.type.TypeVisitor; import javax.lang.model.type.WildcardType; import javax.lang.model.util.Elements; -import javax.lang.model.util.SimpleElementVisitor6; import javax.lang.model.util.SimpleTypeVisitor6; import javax.lang.model.util.Types; @@ -460,30 +458,48 @@ public final class MoreTypes { return elements.build(); } - public static TypeElement asTypeElement(Types types, TypeMirror mirror) { - checkNotNull(types); - checkNotNull(mirror); - Element element = types.asElement(mirror); - checkArgument(element != null); - return element.accept(new SimpleElementVisitor6() { - @Override - protected TypeElement defaultAction(Element e, Void p) { - throw new IllegalArgumentException(); - } + /** + * An alternate implementation of {@link Types#asElement} that does not require a {@link Types} + * instance with the notable difference that it will throw {@link IllegalArgumentException} + * instead of returning null if the {@link TypeMirror} can not be converted to an {@link Element}. + * + * @throws NullPointerException if {@code typeMirror} is {@code null} + * @throws IllegalArgumentException if {@code typeMirror} cannot be converted to an + * {@link Element} + */ + public static Element asElement(TypeMirror typeMirror) { + return typeMirror.accept(AS_ELEMENT_VISITOR, null); + } - @Override public TypeElement visitType(TypeElement e, Void p) { - return e; - } - }, null); + private static final TypeVisitor AS_ELEMENT_VISITOR = + new SimpleTypeVisitor6() { + @Override protected Element defaultAction(TypeMirror e, Void p) { + throw new IllegalArgumentException(e + "cannot be converted to an Element"); + } + + @Override public Element visitDeclared(DeclaredType t, Void p) { + return t.asElement(); + } + + @Override public Element visitError(ErrorType t, Void p) { + return t.asElement(); + } + + @Override public Element visitTypeVariable(TypeVariable t, Void p) { + return t.asElement(); + } + }; + + // TODO(gak): consider removing these two methods as they're pretty trivial now + public static TypeElement asTypeElement(TypeMirror mirror) { + return MoreElements.asType(asElement(mirror)); } - public static ImmutableSet asTypeElements(Types types, - Iterable mirrors) { - checkNotNull(types); + public static ImmutableSet asTypeElements(Iterable mirrors) { checkNotNull(mirrors); ImmutableSet.Builder builder = ImmutableSet.builder(); for (TypeMirror mirror : mirrors) { - builder.add(asTypeElement(types, mirror)); + builder.add(asTypeElement(mirror)); } return builder.build(); } @@ -716,7 +732,7 @@ public final class MoreTypes { ? Optional.of(MoreTypes.asDeclared(superclass)) : Optional.absent(); } - + /** * Resolves a {@link VariableElement} parameter to a method or constructor based on the given * container, or a member of a class. For parameters to a method or constructor, the variable's diff --git a/common/src/test/java/com/google/auto/common/MoreTypesTest.java b/common/src/test/java/com/google/auto/common/MoreTypesTest.java index c4fd1470..c2bbe5b9 100644 --- a/common/src/test/java/com/google/auto/common/MoreTypesTest.java +++ b/common/src/test/java/com/google/auto/common/MoreTypesTest.java @@ -18,6 +18,7 @@ package com.google.auto.common; import static com.google.common.truth.Truth.assertThat; import static javax.lang.model.type.TypeKind.NONE; import static javax.lang.model.type.TypeKind.VOID; +import static org.junit.Assert.fail; import com.google.common.base.Function; import com.google.common.base.Optional; @@ -42,6 +43,7 @@ import java.util.Set; import javax.lang.model.element.AnnotationMirror; import javax.lang.model.element.Element; import javax.lang.model.element.TypeElement; +import javax.lang.model.element.TypeParameterElement; import javax.lang.model.element.VariableElement; import javax.lang.model.type.DeclaredType; import javax.lang.model.type.ErrorType; @@ -254,12 +256,34 @@ public class MoreTypesTest { int[] f11; Set f12; } - + private static class Parent {} private static class ChildA extends Parent {} private static class ChildB extends Parent {} private static class GenericChild extends Parent {} - + + @Test + public void asElement_throws() { + TypeMirror javaDotLang = + compilationRule.getElements().getPackageElement("java.lang").asType(); + try { + MoreTypes.asElement(javaDotLang); + fail(); + } catch (IllegalArgumentException expected) {} + + } + + @Test + public void asElement() { + Elements elements = compilationRule.getElements(); + TypeElement stringElement = elements.getTypeElement("java.lang.String"); + assertThat(MoreTypes.asElement(stringElement.asType())).isEqualTo(stringElement); + TypeParameterElement setParameterElement = Iterables.getOnlyElement( + compilationRule.getElements().getTypeElement("java.util.Set").getTypeParameters()); + assertThat(MoreTypes.asElement(setParameterElement.asType())).isEqualTo(setParameterElement); + // we don't test error types because those are very hard to get predictably + } + @Test public void testNonObjectSuperclass() { Types types = compilationRule.getTypes(); @@ -273,10 +297,10 @@ public class MoreTypesTest { TypeElement genericChild = elements.getTypeElement(GenericChild.class.getCanonicalName()); TypeMirror genericChildOfNumber = types.getDeclaredType(genericChild, numberType); TypeMirror genericChildOfInteger = types.getDeclaredType(genericChild, integerType); - + assertThat(MoreTypes.nonObjectSuperclass(types, elements, (DeclaredType) parent.asType())) .isAbsent(); - + Optional parentOfChildA = MoreTypes.nonObjectSuperclass(types, elements, (DeclaredType) childA.asType()); Optional parentOfChildB = @@ -286,7 +310,7 @@ public class MoreTypesTest { Optional parentOfGenericChildOfNumber = MoreTypes.nonObjectSuperclass(types, elements, (DeclaredType) genericChildOfNumber); Optional parentOfGenericChildOfInteger = - MoreTypes.nonObjectSuperclass(types, elements, (DeclaredType) genericChildOfInteger); + MoreTypes.nonObjectSuperclass(types, elements, (DeclaredType) genericChildOfInteger); EquivalenceTester tester = EquivalenceTester.of(MoreTypes.equivalence()) .addEquivalenceGroup(parentOfChildA.get(), -- cgit v1.2.3