Skip to content

Commit

Permalink
Avoid ClassCastException resulting from premature casting from Elemen…
Browse files Browse the repository at this point in the history
…t to TypeElement.
  • Loading branch information
christian-schlichtherle committed Aug 1, 2023
1 parent ebdf308 commit 58cbb02
Showing 1 changed file with 14 additions and 10 deletions.
24 changes: 14 additions & 10 deletions java/src/main/java/bali/java/AnnotationProcessor.java
Original file line number Diff line number Diff line change
Expand Up @@ -252,7 +252,11 @@ private MethodVisitor methodVisitor(final ExecutableElement e) {
}

private TypeElement typeElement(TypeMirror t) {
return (TypeElement) getTypes().asElement(t);
return (TypeElement) element(t);
}

private Element element(TypeMirror t) {
return getTypes().asElement(t);
}

private boolean error(final CharSequence message, final Element e) {
Expand Down Expand Up @@ -387,7 +391,7 @@ abstract class ModuleMethod extends Method {
private final Name localMakeElementName =
getMakeElementPackage().equals(getPackageElement())
? getMakeElement().getSimpleName()
: getMakeElement().getQualifiedName();
: ((QualifiedNameable) getMakeElement()).getQualifiedName();

@Getter(lazy = true)
private final String localMakeType =
Expand All @@ -402,33 +406,33 @@ abstract class ModuleMethod extends Method {
private final boolean makeTypeInterface = isInterface(getMakeElement());

@Getter(lazy = true)
private final TypeElement makeElement = typeElement(getMakeType());
private final Element makeElement = element(getMakeType());

@Getter(lazy = true)
private final PackageElement makeElementPackage = packageOf(getMakeElement());

@Getter(lazy = true)
private final DeclaredType makeType = resolveMakeType();
private final TypeMirror makeType = resolveMakeType();

private DeclaredType resolveMakeType() {
private TypeMirror resolveMakeType() {
val declaredMakeType = AnnotationProcessor
.this
.makeType(getMethodElement())
.flatMap(this::parameterizedReturnType)
.filter(t -> isSubtype(t, getMethodReturnType(), getMethodElement()))
.map(TypeMirror.class::cast);
final TypeMirror declaredReturnType = declaredMakeType.orElseGet(this::getMethodReturnType);
val declaredReturnElement = typeElement(declaredReturnType);
val declaredReturnElement = element(declaredReturnType);
if (isModule(declaredReturnElement)) {
val moduleType = Optional
.ofNullable(getElements().getTypeElement(companionClassName(declaredReturnElement)))
.ofNullable(getElements().getTypeElement(companionClassName((TypeElement) declaredReturnElement)))
.map(Element::asType)
.flatMap(this::parameterizedReturnType);
if (moduleType.isPresent()) {
return moduleType.get();
}
}
return (DeclaredType) declaredReturnType;
return declaredReturnType;
}

private Optional<DeclaredType> parameterizedReturnType(final TypeMirror makeType) {
Expand Down Expand Up @@ -479,7 +483,7 @@ boolean resolveNullable() {
private final String companionInterfaceRef = getElement().getSimpleName() + "$.super";

Consumer<Output> forAllDependencyMethods() {
return out -> filteredOverridableMethods(getMakeElement())
return out -> filteredOverridableMethods((TypeElement) getMakeElement())
// HC SVNT DRACONES!
.map(e -> new Tuple2<>(newDependencyMethod(e), e))
.filter(t -> t.getT1().isCachingDisabled() || checkCacheableReturnType(t.getT2()))
Expand Down Expand Up @@ -611,7 +615,7 @@ boolean resolveNullable() {

@Override
ExecutableType resolveMethodType() {
return (ExecutableType) getTypes().asMemberOf(getMakeType(), getMethodElement());
return (ExecutableType) getTypes().asMemberOf((DeclaredType) getMakeType(), getMethodElement());
}

@Getter(lazy = true)
Expand Down

0 comments on commit 58cbb02

Please sign in to comment.