Skip to content

Commit 6f1397d

Browse files
Merge pull request #654 from google/sync-master-2018/07/23
Moe Sync
2 parents 43321e9 + 19474fc commit 6f1397d

File tree

2 files changed

+50
-0
lines changed

2 files changed

+50
-0
lines changed

Diff for: common/src/main/java/com/google/auto/common/MoreElements.java

+28
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
import javax.lang.model.element.Modifier;
3838
import javax.lang.model.element.PackageElement;
3939
import javax.lang.model.element.TypeElement;
40+
import javax.lang.model.element.TypeParameterElement;
4041
import javax.lang.model.element.VariableElement;
4142
import javax.lang.model.type.TypeKind;
4243
import javax.lang.model.type.TypeMirror;
@@ -129,6 +130,33 @@ public static TypeElement asType(Element element) {
129130
return element.accept(TypeElementVisitor.INSTANCE, null);
130131
}
131132

133+
/**
134+
* Returns the given {@link Element} instance as {@link TypeParameterElement}.
135+
*
136+
* <p>This method is functionally equivalent to an {@code instanceof} check and a cast, but should
137+
* always be used over that idiom as instructed in the documentation for {@link Element}.
138+
*
139+
* @throws NullPointerException if {@code element} is {@code null}
140+
* @throws IllegalArgumentException if {@code element} isn't a {@link TypeParameterElement}.
141+
*/
142+
public static TypeParameterElement asTypeParameter(Element element) {
143+
return element.accept(TypeParameterElementVisitor.INSTANCE, null);
144+
}
145+
146+
private static final class TypeParameterElementVisitor
147+
extends CastingElementVisitor<TypeParameterElement> {
148+
private static final TypeParameterElementVisitor INSTANCE = new TypeParameterElementVisitor();
149+
150+
TypeParameterElementVisitor() {
151+
super("type parameter element");
152+
}
153+
154+
@Override
155+
public TypeParameterElement visitTypeParameter(TypeParameterElement e, Void ignore) {
156+
return e;
157+
}
158+
}
159+
132160
private static final class VariableElementVisitor extends CastingElementVisitor<VariableElement> {
133161
private static final VariableElementVisitor INSTANCE = new VariableElementVisitor();
134162

Diff for: common/src/test/java/com/google/auto/common/MoreElementsTest.java

+22
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
*/
1616
package com.google.auto.common;
1717

18+
import static com.google.common.collect.Iterables.getOnlyElement;
1819
import static com.google.common.truth.Truth.assertThat;
1920
import static com.google.common.truth.Truth.assertWithMessage;
2021
import static org.junit.Assert.assertFalse;
@@ -32,6 +33,7 @@
3233
import java.util.AbstractList;
3334
import java.util.Arrays;
3435
import java.util.HashSet;
36+
import java.util.List;
3537
import java.util.NoSuchElementException;
3638
import java.util.Set;
3739
import javax.lang.model.element.AnnotationMirror;
@@ -110,6 +112,26 @@ public void asPackage_illegalArgument() {
110112
}
111113
}
112114

115+
@Test
116+
public void asTypeParameterElement() {
117+
Element typeParameterElement =
118+
getOnlyElement(
119+
compilation
120+
.getElements()
121+
.getTypeElement(List.class.getCanonicalName())
122+
.getTypeParameters());
123+
assertThat(MoreElements.asTypeParameter(typeParameterElement)).isEqualTo(typeParameterElement);
124+
}
125+
126+
@Test
127+
public void asTypeParameterElement_illegalArgument() {
128+
try {
129+
MoreElements.asTypeParameter(javaLangPackageElement);
130+
fail();
131+
} catch (IllegalArgumentException expected) {
132+
}
133+
}
134+
113135
@Test
114136
public void asType() {
115137
assertThat(MoreElements.asType(stringElement)).isEqualTo(stringElement);

0 commit comments

Comments
 (0)