Skip to content

Commit

Permalink
Catch TypeNotPresentExceptions
Browse files Browse the repository at this point in the history
  • Loading branch information
kindlich committed Jan 4, 2021
1 parent 87d469d commit 4b04293
Show file tree
Hide file tree
Showing 7 changed files with 135 additions and 80 deletions.
Expand Up @@ -8,6 +8,7 @@
import com.blamejared.crafttweaker_annotation_processors.processors.document.conversion.converter.named_type.ImplementationConverter;
import com.blamejared.crafttweaker_annotation_processors.processors.document.conversion.converter.named_type.SuperTypeConverter;
import com.blamejared.crafttweaker_annotation_processors.processors.document.conversion.converter.native_registration.member.NativeTypeVirtualMemberConverter;
import com.blamejared.crafttweaker_annotation_processors.processors.document.conversion.element.ClassTypeConverter;
import com.blamejared.crafttweaker_annotation_processors.processors.document.conversion.mods.KnownModList;
import com.blamejared.crafttweaker_annotation_processors.processors.document.page.info.DocumentationPageInfo;
import com.blamejared.crafttweaker_annotation_processors.processors.document.page.info.TypeName;
Expand All @@ -23,10 +24,9 @@
import com.blamejared.crafttweaker_annotations.annotations.NativeTypeRegistration;

import javax.annotation.Nonnull;
import javax.lang.model.element.Element;
import javax.lang.model.element.TypeElement;
import javax.lang.model.type.MirroredTypeException;
import javax.lang.model.type.TypeMirror;
import javax.lang.model.util.Elements;
import javax.lang.model.util.Types;
import java.util.List;
import java.util.stream.Collectors;
Expand All @@ -39,19 +39,19 @@ public class NativeRegistrationConverter extends DocumentConverter {
private final ImplementationConverter implementationConverter;
private final GenericParameterConverter genericParameterConverter;
private final NativeConversionRegistry nativeConversionRegistry;
private final Elements elementUtils;
private final Types typeUtils;
private final ClassTypeConverter classTypeConverter;

public NativeRegistrationConverter(KnownModList knownModList, CommentConverter commentConverter, StaticMemberConverter staticMemberConverter, NativeTypeVirtualMemberConverter virtualMemberConverter, SuperTypeConverter superTypeConverter, ImplementationConverter implementationConverter, GenericParameterConverter genericParameterConverter, NativeConversionRegistry nativeConversionRegistry, Elements elementUtils, Types typeUtils) {
public NativeRegistrationConverter(KnownModList knownModList, CommentConverter commentConverter, StaticMemberConverter staticMemberConverter, NativeTypeVirtualMemberConverter virtualMemberConverter, SuperTypeConverter superTypeConverter, ImplementationConverter implementationConverter, GenericParameterConverter genericParameterConverter, NativeConversionRegistry nativeConversionRegistry, Types typeUtils, ClassTypeConverter classTypeConverter) {
super(knownModList, commentConverter);
this.staticMemberConverter = staticMemberConverter;
this.virtualMemberConverter = virtualMemberConverter;
this.superTypeConverter = superTypeConverter;
this.implementationConverter = implementationConverter;
this.genericParameterConverter = genericParameterConverter;
this.nativeConversionRegistry = nativeConversionRegistry;
this.elementUtils = elementUtils;
this.typeUtils = typeUtils;
this.classTypeConverter = classTypeConverter;
}

@Override
Expand Down Expand Up @@ -84,17 +84,18 @@ private void registerNativeType(TypeElement element, TypePageInfo typePageInfo)
}

private TypeElement getNativeType(TypeElement element) {
try {
final NativeTypeRegistration nativeAnnotation = getNativeAnnotation(element);
return getNativeTypeFromClass(nativeAnnotation.value());
} catch(MirroredTypeException exception) {
final TypeMirror typeMirror = exception.getTypeMirror();
return (TypeElement) typeUtils.asElement(typeMirror);
}
final NativeTypeRegistration annotation = getNativeAnnotation(element);
final TypeMirror nativeType = classTypeConverter.getTypeMirror(annotation, NativeTypeRegistration::value);
return getTypeElementFromMirror(nativeType);
}

private TypeElement getNativeTypeFromClass(Class<?> cls) {
return elementUtils.getTypeElement(cls.getCanonicalName());
private TypeElement getTypeElementFromMirror(TypeMirror nativeType) {
final Element element = typeUtils.asElement(nativeType);
if(element instanceof TypeElement) {
return (TypeElement) element;
}

throw new IllegalArgumentException("Could not get typeElement from mirror: " + nativeType);
}

@Nonnull
Expand Down
Expand Up @@ -2,6 +2,7 @@

import com.blamejared.crafttweaker_annotation_processors.processors.document.conversion.converter.expansion.member.ExpansionVirtualMemberConverter;
import com.blamejared.crafttweaker_annotation_processors.processors.document.conversion.converter.type.TypeConverter;
import com.blamejared.crafttweaker_annotation_processors.processors.document.conversion.element.ClassTypeConverter;
import com.blamejared.crafttweaker_annotation_processors.processors.document.dependencies.DependencyContainer;
import com.blamejared.crafttweaker_annotation_processors.processors.document.page.comment.DocumentationComment;
import com.blamejared.crafttweaker_annotation_processors.processors.document.page.info.DocumentationPageInfo;
Expand All @@ -20,9 +21,7 @@

import javax.annotation.Nonnull;
import javax.lang.model.element.TypeElement;
import javax.lang.model.type.MirroredTypeException;
import javax.lang.model.type.TypeMirror;
import javax.lang.model.util.Elements;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
Expand All @@ -31,12 +30,12 @@
public class NativeTypeVirtualMemberConverter extends ExpansionVirtualMemberConverter {

private final TypeConverter typeConverter;
private final Elements elementUtils;
private final ClassTypeConverter classTypeConverter;

public NativeTypeVirtualMemberConverter(DependencyContainer dependencyContainer, TypeConverter typeConverter, Elements elementUtils) {
public NativeTypeVirtualMemberConverter(DependencyContainer dependencyContainer, TypeConverter typeConverter, ClassTypeConverter classTypeConverter) {
super(dependencyContainer);
this.typeConverter = typeConverter;
this.elementUtils = elementUtils;
this.classTypeConverter = classTypeConverter;
}

@Override
Expand Down Expand Up @@ -99,8 +98,8 @@ private DocumentedParameter convertParameter(NativeConstructor.ConstructorParame
}

private AbstractTypeInfo getParameterType(NativeConstructor.ConstructorParameter constructorParameter) {
final TypeMirror mirror = getParameterTypeMirror(constructorParameter);
return typeConverter.convertType(mirror);
final TypeMirror nativeType = classTypeConverter.getTypeMirror(constructorParameter, NativeConstructor.ConstructorParameter::type);
return typeConverter.convertType(nativeType);
}

private DocumentationComment getParameterDescription(NativeConstructor.ConstructorParameter constructorParameter) {
Expand All @@ -124,19 +123,6 @@ private Example getParameterExample(NativeConstructor.ConstructorParameter const
return result;
}

private TypeMirror getParameterTypeMirror(NativeConstructor.ConstructorParameter constructorParameter) {
try {
final Class<?> type = constructorParameter.type();
return getTypeMirrorFromClass(type);
} catch(MirroredTypeException exception) {
return exception.getTypeMirror();
}
}

private TypeMirror getTypeMirrorFromClass(Class<?> type) {
return elementUtils.getTypeElement(type.getCanonicalName()).asType();
}

private String getParameterName(NativeConstructor.ConstructorParameter constructorParameter) {
return constructorParameter.name();
}
Expand Down
@@ -0,0 +1,39 @@
package com.blamejared.crafttweaker_annotation_processors.processors.document.conversion.element;

import javax.lang.model.type.MirroredTypeException;
import javax.lang.model.type.TypeMirror;
import javax.lang.model.util.Elements;
import java.lang.annotation.Annotation;
import java.util.function.Function;

public class ClassTypeConverter {

private final Elements elementUtils;

public ClassTypeConverter(Elements elementUtils) {
this.elementUtils = elementUtils;
}

public <T extends Annotation> TypeMirror getTypeMirror(T annotation, Function<T, Class<?>> classGetter) {
try {
return getNativeTypeFromClass(classGetter.apply(annotation));
} catch(MirroredTypeException exception) {
return getFromMirroredTypeException(exception);
} catch(TypeNotPresentException exception) {
return getFromTypeNotPresentException(exception);
}
}

private TypeMirror getFromTypeNotPresentException(TypeNotPresentException exception) {
final String typeName = exception.typeName();
return elementUtils.getTypeElement(typeName).asType();
}

private TypeMirror getFromMirroredTypeException(MirroredTypeException exception) {
return exception.getTypeMirror();
}

private TypeMirror getNativeTypeFromClass(Class<?> cls) {
return elementUtils.getTypeElement(cls.getCanonicalName()).asType();
}
}
@@ -1,17 +1,21 @@
package com.blamejared.crafttweaker_annotation_processors.processors.document.native_types.dependency_rule;

import com.blamejared.crafttweaker_annotation_processors.processors.document.page.info.*;
import com.blamejared.crafttweaker_annotation_processors.processors.document.page.type.*;
import com.blamejared.crafttweaker_annotations.annotations.*;
import org.jetbrains.annotations.*;
import org.openzen.zencode.java.*;
import org.reflections.*;
import com.blamejared.crafttweaker_annotation_processors.processors.document.page.info.TypeName;
import com.blamejared.crafttweaker_annotation_processors.processors.document.page.info.TypePageInfo;
import com.blamejared.crafttweaker_annotation_processors.processors.document.page.type.AbstractTypeInfo;
import com.blamejared.crafttweaker_annotation_processors.processors.document.page.type.TypePageTypeInfo;
import com.blamejared.crafttweaker_annotations.annotations.Document;
import org.jetbrains.annotations.NotNull;
import org.openzen.zencode.java.ZenCodeType;
import org.reflections.Reflections;

import javax.lang.model.element.*;
import javax.lang.model.util.*;
import java.util.*;
import java.util.function.*;
import java.util.stream.*;
import javax.lang.model.element.TypeElement;
import javax.lang.model.util.Elements;
import java.util.Map;
import java.util.Set;
import java.util.function.Function;
import java.util.stream.Collector;
import java.util.stream.Collectors;

public class NamedTypeConversionRule implements ModDependencyConversionRule {

Expand All @@ -25,12 +29,15 @@ public NamedTypeConversionRule(Reflections reflections, Elements elements) {

@Override
public Map<TypeElement, AbstractTypeInfo> getAll() {
return getClasses().stream().filter(this::isDocumented).collect(createTypeInfoMap());
return getClasses().stream()
.map(this::getTypeElementFromClass)
.filter(this::isDocumented)
.collect(createTypeInfoMap());
}

private Collector<Class<?>, ?, Map<TypeElement, AbstractTypeInfo>> createTypeInfoMap() {
final Function<Class<?>, TypeElement> keyMapper = this::getTypeElementFromClass;
final Function<Class<?>, AbstractTypeInfo> valueMapper = this::getTypeInfoFromClass;
private Collector<TypeElement, ?, Map<TypeElement, AbstractTypeInfo>> createTypeInfoMap() {
final Function<TypeElement, TypeElement> keyMapper = Function.identity();
final Function<TypeElement, AbstractTypeInfo> valueMapper = this::getTypeInfoFromClass;

return Collectors.toMap(keyMapper, valueMapper);
}
Expand All @@ -39,30 +46,30 @@ private TypeElement getTypeElementFromClass(Class<?> documentedClass) {
return elements.getTypeElement(documentedClass.getCanonicalName());
}

private AbstractTypeInfo getTypeInfoFromClass(Class<?> documentedClass) {
private AbstractTypeInfo getTypeInfoFromClass(TypeElement documentedClass) {
final TypePageInfo pageInfo = getPageInfoFromClass(documentedClass);
return new TypePageTypeInfo(pageInfo);
}

@NotNull
private TypePageInfo getPageInfoFromClass(Class<?> documentedClass) {
private TypePageInfo getPageInfoFromClass(TypeElement documentedClass) {
final TypeName typeName = getTypeNameFromClass(documentedClass);
final String path = getDocPathFromClass(documentedClass);

return new TypePageInfo("unknown", path, typeName);
}

private TypeName getTypeNameFromClass(Class<?> documentedClass) {
private TypeName getTypeNameFromClass(TypeElement documentedClass) {
final ZenCodeType.Name annotation = documentedClass.getAnnotation(ZenCodeType.Name.class);
return new TypeName(annotation.value());
}

private String getDocPathFromClass(Class<?> documentedClass) {
private String getDocPathFromClass(TypeElement documentedClass) {
return documentedClass.getAnnotation(Document.class).value();
}

private boolean isDocumented(Class<?> aClass) {
return aClass.isAnnotationPresent(Document.class);
private boolean isDocumented(TypeElement element) {
return element.getAnnotation(Document.class) != null;
}


Expand Down
@@ -1,75 +1,94 @@
package com.blamejared.crafttweaker_annotation_processors.processors.document.native_types.dependency_rule;

import com.blamejared.crafttweaker_annotation_processors.processors.document.page.info.*;
import com.blamejared.crafttweaker_annotation_processors.processors.document.page.type.*;
import com.blamejared.crafttweaker_annotations.annotations.*;
import org.jetbrains.annotations.*;
import org.reflections.*;
import com.blamejared.crafttweaker_annotation_processors.processors.document.conversion.element.ClassTypeConverter;
import com.blamejared.crafttweaker_annotation_processors.processors.document.page.info.TypeName;
import com.blamejared.crafttweaker_annotation_processors.processors.document.page.info.TypePageInfo;
import com.blamejared.crafttweaker_annotation_processors.processors.document.page.type.AbstractTypeInfo;
import com.blamejared.crafttweaker_annotation_processors.processors.document.page.type.TypePageTypeInfo;
import com.blamejared.crafttweaker_annotations.annotations.Document;
import com.blamejared.crafttweaker_annotations.annotations.NativeTypeRegistration;
import org.jetbrains.annotations.NotNull;
import org.reflections.Reflections;

import javax.lang.model.element.*;
import javax.lang.model.util.*;
import java.util.*;
import java.util.function.*;
import java.util.stream.*;
import javax.lang.model.element.TypeElement;
import javax.lang.model.type.TypeMirror;
import javax.lang.model.util.Elements;
import javax.lang.model.util.Types;
import java.util.Map;
import java.util.Set;
import java.util.function.Function;
import java.util.stream.Collector;
import java.util.stream.Collectors;

public class NativeTypeConversionRule implements ModDependencyConversionRule {

private final Reflections reflections;
private final Elements elementUtils;
private final Types typeUtils;
private final ClassTypeConverter classTypeConverter;

public NativeTypeConversionRule(Reflections reflections, Elements elementUtils) {
public NativeTypeConversionRule(Reflections reflections, Elements elementUtils, Types typeUtils, ClassTypeConverter classTypeConverter) {
this.reflections = reflections;
this.elementUtils = elementUtils;
this.typeUtils = typeUtils;
this.classTypeConverter = classTypeConverter;
}

@Override
public Map<TypeElement, AbstractTypeInfo> getAll() {
return getNativeExpansionClasses().stream().filter(this::isDocumented).collect(createTypeInfoMap());
return getNativeExpansionClasses().stream()
.map(this::getTypeElementFromClass)
.filter(this::isDocumented)
.collect(createTypeInfoMap());
}

private Collector<Class<?>, ?, Map<TypeElement, AbstractTypeInfo>> createTypeInfoMap() {
final Function<Class<?>, TypeElement> keyMapper = this::getTypeElementFromClass;
final Function<Class<?>, AbstractTypeInfo> valueMapper = this::getTypeInfoFromClass;
private Collector<TypeElement, ?, Map<TypeElement, AbstractTypeInfo>> createTypeInfoMap() {
final Function<TypeElement, TypeElement> keyMapper = Function.identity();
final Function<TypeElement, AbstractTypeInfo> valueMapper = this::getTypeInfoFromClass;

return Collectors.toMap(keyMapper, valueMapper);
}

private TypeElement getTypeElementFromClass(Class<?> documentedClass) {
final NativeTypeRegistration nativeAnnotation = getNativeAnnotation(documentedClass);
return elementUtils.getTypeElement(nativeAnnotation.value().getCanonicalName());
final TypeElement expansionTypeElement = elementUtils.getTypeElement(documentedClass.getCanonicalName());

final NativeTypeRegistration nativeAnnotation = getNativeAnnotation(expansionTypeElement);
final TypeMirror nativeType = classTypeConverter.getTypeMirror(nativeAnnotation, NativeTypeRegistration::value);

return (TypeElement) typeUtils.asElement(nativeType);
}

private AbstractTypeInfo getTypeInfoFromClass(Class<?> documentedClass) {
private AbstractTypeInfo getTypeInfoFromClass(TypeElement documentedClass) {
final TypePageInfo pageInfo = getPageInfoFromClass(documentedClass);
return new TypePageTypeInfo(pageInfo);
}

@NotNull
private TypePageInfo getPageInfoFromClass(Class<?> documentedClass) {
private TypePageInfo getPageInfoFromClass(TypeElement documentedClass) {
final TypeName typeName = getTypeNameFromClass(documentedClass);
final String path = getDocPathFromClass(documentedClass);

return new TypePageInfo("unknown", path, typeName);
}

private TypeName getTypeNameFromClass(Class<?> documentedClass) {
private TypeName getTypeNameFromClass(TypeElement documentedClass) {
final NativeTypeRegistration annotation = getNativeAnnotation(documentedClass);
return new TypeName(annotation.zenCodeName());
}

private NativeTypeRegistration getNativeAnnotation(Class<?> documentedClass) {
private NativeTypeRegistration getNativeAnnotation(TypeElement documentedClass) {
return documentedClass.getAnnotation(NativeTypeRegistration.class);
}

private String getDocPathFromClass(Class<?> documentedClass) {
private String getDocPathFromClass(TypeElement documentedClass) {
return documentedClass.getAnnotation(Document.class).value();
}

private Set<Class<?>> getNativeExpansionClasses() {
return reflections.getTypesAnnotatedWith(NativeTypeRegistration.class);
}

private boolean isDocumented(Class<?> nativeRegistrationClass) {
return nativeRegistrationClass.isAnnotationPresent(Document.class);
private boolean isDocumented(TypeElement nativeRegistrationClass) {
return getNativeAnnotation(nativeRegistrationClass) != null;
}
}

0 comments on commit 4b04293

Please sign in to comment.