Skip to content

Commit

Permalink
Add a method to MoreTypes that does the same operation as Types.asEle…
Browse files Browse the repository at this point in the history
…ment, 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
  • Loading branch information
gk5885 authored and cgruber committed Feb 3, 2015
1 parent 168ce2a commit a428e7b
Show file tree
Hide file tree
Showing 3 changed files with 67 additions and 29 deletions.
58 changes: 37 additions & 21 deletions common/src/main/java/com/google/auto/common/MoreTypes.java
Expand Up @@ -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;
Expand Down Expand Up @@ -59,7 +58,6 @@
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;

Expand Down Expand Up @@ -460,30 +458,48 @@ public Void visitWildcard(WildcardType t, Builder<TypeElement> p) {
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();
}
Expand Down Expand Up @@ -716,7 +732,7 @@ public static Optional<DeclaredType> nonObjectSuperclass(final Types types, Elem
? 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
Expand Down
34 changes: 29 additions & 5 deletions common/src/test/java/com/google/auto/common/MoreTypesTest.java
Expand Up @@ -18,6 +18,7 @@
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;
Expand All @@ -42,6 +43,7 @@
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;
Expand Down Expand Up @@ -254,12 +256,34 @@ private static final class ReferencedTypesTestData {
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();
Expand All @@ -273,10 +297,10 @@ public void testNonObjectSuperclass() {
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 =
Expand All @@ -286,7 +310,7 @@ public void testNonObjectSuperclass() {
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(),
Expand Down
Expand Up @@ -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;

Expand All @@ -68,7 +67,6 @@ class BuilderSpec {
ProcessingEnvironment processingEnv,
ErrorReporter errorReporter) {
this.autoValueClass = autoValueClass;
this.typeUtils = processingEnv.getTypeUtils();
this.elementUtils = processingEnv.getElementUtils();
this.errorReporter = errorReporter;
}
Expand Down Expand Up @@ -431,7 +429,7 @@ private void addAbstractMethods(
return;
}

TypeElement typeElement = MoreTypes.asTypeElement(typeUtils, typeMirror);
TypeElement typeElement = MoreTypes.asTypeElement(typeMirror);
addAbstractMethods(typeElement.getSuperclass(), abstractMethods);
for (TypeMirror interfaceMirror : typeElement.getInterfaces()) {
addAbstractMethods(interfaceMirror, abstractMethods);
Expand Down

0 comments on commit a428e7b

Please sign in to comment.