aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--common/src/main/java/com/google/auto/common/MoreTypes.java58
-rw-r--r--common/src/test/java/com/google/auto/common/MoreTypesTest.java34
-rw-r--r--value/src/main/java/com/google/auto/value/processor/BuilderSpec.java4
3 files changed, 67 insertions, 29 deletions
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<TypeElement, Void>() {
- @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<Element, Void> AS_ELEMENT_VISITOR =
+ new SimpleTypeVisitor6<Element, Void>() {
+ @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<TypeElement> asTypeElements(Types types,
- Iterable<? extends TypeMirror> mirrors) {
- checkNotNull(types);
+ public static ImmutableSet<TypeElement> asTypeElements(Iterable<? extends TypeMirror> mirrors) {
checkNotNull(mirrors);
ImmutableSet.Builder<TypeElement> 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.<DeclaredType>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<? super String> f12;
}
-
+
private static class Parent<T> {}
private static class ChildA extends Parent<Number> {}
private static class ChildB extends Parent<String> {}
private static class GenericChild<T> extends Parent<T> {}
-
+
+ @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<DeclaredType> parentOfChildA =
MoreTypes.nonObjectSuperclass(types, elements, (DeclaredType) childA.asType());
Optional<DeclaredType> parentOfChildB =
@@ -286,7 +310,7 @@ public class MoreTypesTest {
Optional<DeclaredType> parentOfGenericChildOfNumber =
MoreTypes.nonObjectSuperclass(types, elements, (DeclaredType) genericChildOfNumber);
Optional<DeclaredType> parentOfGenericChildOfInteger =
- MoreTypes.nonObjectSuperclass(types, elements, (DeclaredType) genericChildOfInteger);
+ MoreTypes.nonObjectSuperclass(types, elements, (DeclaredType) genericChildOfInteger);
EquivalenceTester<TypeMirror> tester = EquivalenceTester.<TypeMirror>of(MoreTypes.equivalence())
.addEquivalenceGroup(parentOfChildA.get(),
diff --git a/value/src/main/java/com/google/auto/value/processor/BuilderSpec.java b/value/src/main/java/com/google/auto/value/processor/BuilderSpec.java
index 8adad16d..e676287b 100644
--- a/value/src/main/java/com/google/auto/value/processor/BuilderSpec.java
+++ b/value/src/main/java/com/google/auto/value/processor/BuilderSpec.java
@@ -59,7 +59,6 @@ class BuilderSpec {
private static final Equivalence<TypeMirror> TYPE_EQUIVALENCE = MoreTypes.equivalence();
private final TypeElement autoValueClass;
- private final Types typeUtils;
private final Elements elementUtils;
private final ErrorReporter errorReporter;
@@ -68,7 +67,6 @@ class BuilderSpec {
ProcessingEnvironment processingEnv,
ErrorReporter errorReporter) {
this.autoValueClass = autoValueClass;
- this.typeUtils = processingEnv.getTypeUtils();
this.elementUtils = processingEnv.getElementUtils();
this.errorReporter = errorReporter;
}
@@ -431,7 +429,7 @@ class BuilderSpec {
return;
}
- TypeElement typeElement = MoreTypes.asTypeElement(typeUtils, typeMirror);
+ TypeElement typeElement = MoreTypes.asTypeElement(typeMirror);
addAbstractMethods(typeElement.getSuperclass(), abstractMethods);
for (TypeMirror interfaceMirror : typeElement.getInterfaces()) {
addAbstractMethods(interfaceMirror, abstractMethods);