Created TableCodeGenerator

Created and implemented TableCodeGenerator
Added stack trace printing for SchemaProcessor file io errors
Created Table#indexed
This commit is contained in:
Collin Smith
2020-12-16 00:22:47 -08:00
parent 77532fe576
commit d12a301703
4 changed files with 108 additions and 13 deletions

View File

@ -30,7 +30,7 @@ abstract class CodeGenerator {
.skipJavaLangImports(true)
.addFileComment(
"automatically generated by $L, do not modify",
getClass().getCanonicalName())
getClass().getSimpleName())
.build();
}

View File

@ -45,6 +45,8 @@ public class SchemaProcessor extends AbstractProcessor {
}
}
TableCodeGenerator tableCodeGenerator = new TableCodeGenerator(
context, "com.riiablo.excel.table");
SerializerCodeGenerator serializerCodeGenerator = new SerializerCodeGenerator(
context, "com.riiablo.excel.serializer");
for (Element element : roundEnv.getElementsAnnotatedWith(Schema.class)) {
@ -54,26 +56,26 @@ public class SchemaProcessor extends AbstractProcessor {
}
SchemaElement schemaElement = SchemaElement.get(context, element);
if (schemaElement.tableElement.declaredType != null) {
try {
tableCodeGenerator.generate(schemaElement)
.writeTo(processingEnv.getFiler());
// .writeTo(System.out);
} catch (Throwable t) {
context.error(ExceptionUtils.getRootCauseMessage(t));
t.printStackTrace(System.err);
}
}
if (schemaElement.serializerElement.declaredType != null) {
try {
serializerCodeGenerator.generate(schemaElement)
.writeTo(processingEnv.getFiler());
} catch (Throwable t) {
context.error(ExceptionUtils.getRootCauseMessage(t));
t.printStackTrace(System.err);
}
}
// if (schemaElement.serializerElement.serializerElement != null) {
// SerializerElement serializerElement = schemaElement.serializerElement;
// ExecutableElement readRecordElement = serializerElement.getMethod("readRecord");
// MethodSpec readRecord = MethodSpec
// .overriding(readRecordElement, serializerElement.declaredType, typeUtils)
// .build();
// System.out.println(readRecord);
// System.out.println(readRecord.parameters.get(0));
// System.out.println(readRecord.parameters.get(1));
// }
}
return true;

View File

@ -0,0 +1,89 @@
package com.riiablo.table.annotation;
import com.squareup.javapoet.ClassName;
import com.squareup.javapoet.CodeBlock;
import com.squareup.javapoet.MethodSpec;
import com.squareup.javapoet.TypeSpec;
import javax.lang.model.element.Modifier;
class TableCodeGenerator extends CodeGenerator {
TableCodeGenerator(Context context, String tablePackage) {
super(context, tablePackage);
}
@Override
String formatName(SchemaElement schemaElement) {
return ClassName.get(schemaElement.element).simpleName() + Table.class.getSimpleName();
}
@Override
TypeSpec.Builder newTypeSpec(SchemaElement schemaElement) {
return super.newTypeSpec(schemaElement)
.addModifiers(Modifier.PUBLIC, Modifier.FINAL)
.superclass(schemaElement.tableElement.declaredType)
.addMethod(constructor(schemaElement))
.addMethod(newRecord(schemaElement))
.addMethod(offset(schemaElement))
.addMethod(indexed(schemaElement))
.addMethod(primaryKey(schemaElement))
;
}
MethodSpec newRecord(SchemaElement schemaElement) {
TableElement tableElement = schemaElement.tableElement;
return MethodSpec
.overriding(
tableElement.getMethod("newRecord"),
tableElement.declaredType,
context.typeUtils)
.addStatement("return new $T()", schemaElement.element)
.build();
}
MethodSpec constructor(SchemaElement schemaElement) {
Schema config = schemaElement.annotation;
return MethodSpec
.constructorBuilder()
.addStatement("super($T.class, $L, $Lf)", // does not append "f" automatically for float literals
schemaElement.element, config.initialCapacity(), config.loadFactor())
.build();
}
MethodSpec offset(SchemaElement schemaElement) {
Schema config = schemaElement.annotation;
TableElement tableElement = schemaElement.tableElement;
return MethodSpec
.overriding(
tableElement.getMethod("offset"),
tableElement.declaredType,
context.typeUtils)
.addStatement("return $L", config.offset())
.build();
}
MethodSpec indexed(SchemaElement schemaElement) {
Schema config = schemaElement.annotation;
TableElement tableElement = schemaElement.tableElement;
return MethodSpec
.overriding(
tableElement.getMethod("indexed"),
tableElement.declaredType,
context.typeUtils)
.addStatement("return $L", config.indexed())
.build();
}
MethodSpec primaryKey(SchemaElement schemaElement) {
Schema config = schemaElement.annotation;
TableElement tableElement = schemaElement.tableElement;
return MethodSpec
.overriding(
tableElement.getMethod("primaryKey"),
tableElement.declaredType,
context.typeUtils)
.addStatement("return $L", config.indexed()
? null
: CodeBlock.of("$S", schemaElement.primaryKeyFieldElement.element))
.build();
}
}

View File

@ -57,6 +57,10 @@ public abstract class Table<R> implements Iterable<R> {
return 0;
}
protected boolean indexed() {
return false;
}
protected String primaryKey() {
return null;
}