Support JPMS.
ci/woodpecker/push/woodpecker Pipeline was successful
Details
ci/woodpecker/push/woodpecker Pipeline was successful
Details
Since that seems to be incompatible with manifold, that has been removed. Contains breaking changes!
This commit is contained in:
parent
f8a7c43559
commit
6805ff6b6f
|
@ -1,5 +1,5 @@
|
||||||
group = "io.gitlab.jfronny.gson"
|
group = "io.gitlab.jfronny.gson"
|
||||||
version = "1.2-SNAPSHOT"
|
version = "1.3-SNAPSHOT"
|
||||||
|
|
||||||
subprojects {
|
subprojects {
|
||||||
group = rootProject.group
|
group = rootProject.group
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
module io.gitlab.jfronny.gson.compile.annotations {
|
||||||
|
exports io.gitlab.jfronny.gson.compile.annotations;
|
||||||
|
}
|
|
@ -9,8 +9,8 @@ repositories {
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
implementation("io.gitlab.jfronny:commons:1.0-SNAPSHOT")
|
implementation("io.gitlab.jfronny:commons:1.1-SNAPSHOT")
|
||||||
api("io.gitlab.jfronny:commons-gson:1.0-SNAPSHOT")
|
api("io.gitlab.jfronny:commons-gson:1.1-SNAPSHOT")
|
||||||
}
|
}
|
||||||
|
|
||||||
publishing {
|
publishing {
|
||||||
|
|
|
@ -0,0 +1,7 @@
|
||||||
|
module io.gitlab.jfronny.gson.compile.core {
|
||||||
|
requires io.gitlab.jfronny.commons.gson;
|
||||||
|
requires io.gitlab.jfronny.gson;
|
||||||
|
requires io.gitlab.jfronny.commons;
|
||||||
|
exports io.gitlab.jfronny.gson.compile.core;
|
||||||
|
exports io.gitlab.jfronny.gson.compile.util;
|
||||||
|
}
|
|
@ -1,4 +1,4 @@
|
||||||
package io.gitlab.jfronny.gson;
|
package io.gitlab.jfronny.gson.compile.example.manifold;
|
||||||
|
|
||||||
import io.gitlab.jfronny.gson.compile.annotations.GSerializable;
|
import io.gitlab.jfronny.gson.compile.annotations.GSerializable;
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
package io.gitlab.jfronny.gson;
|
package io.gitlab.jfronny.gson.compile.example;
|
||||||
|
|
||||||
import io.gitlab.jfronny.gson.annotations.SerializedName;
|
import io.gitlab.jfronny.gson.annotations.SerializedName;
|
||||||
import io.gitlab.jfronny.gson.compile.annotations.*;
|
import io.gitlab.jfronny.gson.compile.annotations.*;
|
|
@ -1,4 +1,4 @@
|
||||||
package io.gitlab.jfronny.gson;
|
package io.gitlab.jfronny.gson.compile.example;
|
||||||
|
|
||||||
import io.gitlab.jfronny.gson.compile.annotations.GSerializable;
|
import io.gitlab.jfronny.gson.compile.annotations.GSerializable;
|
||||||
|
|
|
@ -0,0 +1,5 @@
|
||||||
|
module io.gitlab.jfronny.gson.compile.example {
|
||||||
|
requires static io.gitlab.jfronny.gson.compile.annotations;
|
||||||
|
requires io.gitlab.jfronny.gson;
|
||||||
|
exports io.gitlab.jfronny.gson.compile.example;
|
||||||
|
}
|
|
@ -1,7 +1,6 @@
|
||||||
plugins {
|
plugins {
|
||||||
`java-library`
|
`java-library`
|
||||||
id("jf.maven-publish")
|
id("jf.maven-publish")
|
||||||
id("jf.manifold")
|
|
||||||
}
|
}
|
||||||
|
|
||||||
repositories {
|
repositories {
|
||||||
|
@ -11,7 +10,7 @@ repositories {
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
implementation("org.jetbrains:annotations:24.0.0")
|
implementation("org.jetbrains:annotations:24.0.0")
|
||||||
implementation("io.gitlab.jfronny:commons:1.0-SNAPSHOT")
|
implementation("io.gitlab.jfronny:commons:1.1-SNAPSHOT")
|
||||||
}
|
}
|
||||||
|
|
||||||
publishing {
|
publishing {
|
||||||
|
|
|
@ -31,14 +31,14 @@ public abstract class AbstractProcessor2 extends AbstractProcessor {
|
||||||
} catch (ClassNotFoundException e) {
|
} catch (ClassNotFoundException e) {
|
||||||
hasManifold = false;
|
hasManifold = false;
|
||||||
}
|
}
|
||||||
options = processingEnv.options;
|
options = processingEnv.getOptions();
|
||||||
message = processingEnv.messager;
|
message = processingEnv.getMessager();
|
||||||
filer = processingEnv.filer;
|
filer = processingEnv.getFiler();
|
||||||
elements = processingEnv.elementUtils;
|
elements = processingEnv.getElementUtils();
|
||||||
types = processingEnv.typeUtils;
|
types = processingEnv.getTypeUtils();
|
||||||
sourceVersion = processingEnv.sourceVersion;
|
sourceVersion = processingEnv.getSourceVersion();
|
||||||
locale = processingEnv.locale;
|
locale = processingEnv.getLocale();
|
||||||
isPreviewEnabled = processingEnv.isPreviewEnabled;
|
isPreviewEnabled = processingEnv.isPreviewEnabled();
|
||||||
valueCreator = new ValueCreator(processingEnv);
|
valueCreator = new ValueCreator(processingEnv);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -10,11 +10,11 @@ public class TypeHelper {
|
||||||
public static boolean isComplexType(TypeMirror type, Types typeUtils) {
|
public static boolean isComplexType(TypeMirror type, Types typeUtils) {
|
||||||
Element element = typeUtils.asElement(type);
|
Element element = typeUtils.asElement(type);
|
||||||
if (!(element instanceof TypeElement typeElement)) return false;
|
if (!(element instanceof TypeElement typeElement)) return false;
|
||||||
return !typeElement.typeParameters.isEmpty;
|
return !typeElement.getTypeParameters().isEmpty();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean isGenericType(TypeMirror type) {
|
public static boolean isGenericType(TypeMirror type) {
|
||||||
return type.kind == TypeKind.TYPEVAR;
|
return type.getKind() == TypeKind.TYPEVAR;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static List<? extends TypeMirror> getGenericTypes(TypeMirror type) {
|
public static List<? extends TypeMirror> getGenericTypes(TypeMirror type) {
|
||||||
|
@ -23,8 +23,8 @@ public class TypeHelper {
|
||||||
return Collections.emptyList();
|
return Collections.emptyList();
|
||||||
}
|
}
|
||||||
ArrayList<TypeMirror> result = new ArrayList<>();
|
ArrayList<TypeMirror> result = new ArrayList<>();
|
||||||
for (TypeMirror argType : declaredType.typeArguments) {
|
for (TypeMirror argType : declaredType.getTypeArguments()) {
|
||||||
if (argType.kind == TypeKind.TYPEVAR) {
|
if (argType.getKind() == TypeKind.TYPEVAR) {
|
||||||
result.add(argType);
|
result.add(argType);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -52,10 +52,10 @@ public class TypeHelper {
|
||||||
public static boolean isInstance(DeclaredType type, String parentClassName, Types typeUtils) {
|
public static boolean isInstance(DeclaredType type, String parentClassName, Types typeUtils) {
|
||||||
if (type == null) return false;
|
if (type == null) return false;
|
||||||
TypeElement element = (TypeElement) type.asElement();
|
TypeElement element = (TypeElement) type.asElement();
|
||||||
for (TypeMirror interfaceType : element.interfaces) {
|
for (TypeMirror interfaceType : element.getInterfaces()) {
|
||||||
if (typeUtils.erasure(interfaceType).toString().equals(parentClassName)) return true;
|
if (typeUtils.erasure(interfaceType).toString().equals(parentClassName)) return true;
|
||||||
}
|
}
|
||||||
TypeMirror superclassType = element.superclass;
|
TypeMirror superclassType = element.getSuperclass();
|
||||||
if (superclassType != null) {
|
if (superclassType != null) {
|
||||||
if (typeUtils.erasure(superclassType).toString().equals(parentClassName)) {
|
if (typeUtils.erasure(superclassType).toString().equals(parentClassName)) {
|
||||||
return true;
|
return true;
|
||||||
|
@ -67,7 +67,7 @@ public class TypeHelper {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String getDefaultValue(TypeMirror type) {
|
public static String getDefaultValue(TypeMirror type) {
|
||||||
return switch (type.kind) {
|
return switch (type.getKind()) {
|
||||||
case BYTE, SHORT, INT, LONG, FLOAT, CHAR, DOUBLE -> "0";
|
case BYTE, SHORT, INT, LONG, FLOAT, CHAR, DOUBLE -> "0";
|
||||||
case BOOLEAN -> "false";
|
case BOOLEAN -> "false";
|
||||||
default -> "null";
|
default -> "null";
|
||||||
|
|
|
@ -46,7 +46,7 @@ public sealed interface ConstructionSource {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public TypeElement getTargetClass() {
|
public TypeElement getTargetClass() {
|
||||||
return targetClass != null ? targetClass : (targetClass = (TypeElement) constructor.enclosingElement);
|
return targetClass != null ? targetClass : (targetClass = (TypeElement) constructor.getEnclosingElement());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -82,7 +82,7 @@ public sealed interface ConstructionSource {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public TypeElement getTargetClass() {
|
public TypeElement getTargetClass() {
|
||||||
return targetClass != null ? targetClass : (targetClass = (TypeElement) types.asElement(method.returnType));
|
return targetClass != null ? targetClass : (targetClass = (TypeElement) types.asElement(method.getReturnType()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -135,7 +135,7 @@ public sealed interface ConstructionSource {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public TypeElement getTargetClass() {
|
public TypeElement getTargetClass() {
|
||||||
return targetClass != null ? targetClass : (targetClass = (TypeElement) types.asElement(getBuildMethod().returnType));
|
return targetClass != null ? targetClass : (targetClass = (TypeElement) types.asElement(getBuildMethod().getReturnType()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -150,12 +150,12 @@ public sealed interface ConstructionSource {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public TypeElement getBuilderClass() {
|
public TypeElement getBuilderClass() {
|
||||||
return builderClass != null ? builderClass : (builderClass = (TypeElement) constructor.enclosingElement);
|
return builderClass != null ? builderClass : (builderClass = (TypeElement) constructor.getEnclosingElement());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ExecutableElement getBuildMethod() {
|
public ExecutableElement getBuildMethod() {
|
||||||
return buildMethod != null ? buildMethod : (buildMethod = findBuildMethod((TypeElement) constructor.enclosingElement));
|
return buildMethod != null ? buildMethod : (buildMethod = findBuildMethod((TypeElement) constructor.getEnclosingElement()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -173,7 +173,7 @@ public sealed interface ConstructionSource {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public TypeElement getTargetClass() {
|
public TypeElement getTargetClass() {
|
||||||
return targetClass != null ? targetClass : (targetClass = (TypeElement) types.asElement(getBuildMethod().returnType));
|
return targetClass != null ? targetClass : (targetClass = (TypeElement) types.asElement(getBuildMethod().getReturnType()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -188,12 +188,12 @@ public sealed interface ConstructionSource {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public TypeElement getBuilderClass() {
|
public TypeElement getBuilderClass() {
|
||||||
return builderClass != null ? builderClass : (builderClass = (TypeElement) types.asElement(method.returnType));
|
return builderClass != null ? builderClass : (builderClass = (TypeElement) types.asElement(method.getReturnType()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ExecutableElement getBuildMethod() {
|
public ExecutableElement getBuildMethod() {
|
||||||
return buildMethod != null ? buildMethod : (buildMethod = findBuildMethod((TypeElement) types.asElement(method.returnType)));
|
return buildMethod != null ? buildMethod : (buildMethod = findBuildMethod((TypeElement) types.asElement(method.getReturnType())));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -237,7 +237,7 @@ public sealed interface ConstructionSource {
|
||||||
ExecutableElement candidate = null;
|
ExecutableElement candidate = null;
|
||||||
boolean foundMultipleCandidates = false;
|
boolean foundMultipleCandidates = false;
|
||||||
boolean isCandidateReasonableBuilderMethodName = false;
|
boolean isCandidateReasonableBuilderMethodName = false;
|
||||||
for (ExecutableElement method : ElementFilter.methodsIn(builderClass.enclosedElements)) {
|
for (ExecutableElement method : ElementFilter.methodsIn(builderClass.getEnclosedElements())) {
|
||||||
if (isPossibleBuilderMethod(method, builderClass)) {
|
if (isPossibleBuilderMethod(method, builderClass)) {
|
||||||
if (candidate == null) {
|
if (candidate == null) {
|
||||||
candidate = method;
|
candidate = method;
|
||||||
|
@ -263,10 +263,10 @@ public sealed interface ConstructionSource {
|
||||||
}
|
}
|
||||||
// Last try, check to see if the immediate parent class makes sense.
|
// Last try, check to see if the immediate parent class makes sense.
|
||||||
{
|
{
|
||||||
Element candidate = builderClass.enclosingElement;
|
Element candidate = builderClass.getEnclosingElement();
|
||||||
if (candidate.kind == ElementKind.CLASS) {
|
if (candidate.getKind() == ElementKind.CLASS) {
|
||||||
for (ExecutableElement method : ElementFilter.methodsIn(builderClass.enclosedElements)) {
|
for (ExecutableElement method : ElementFilter.methodsIn(builderClass.getEnclosedElements())) {
|
||||||
if (method.returnType.equals(candidate.asType()) && method.parameters.isEmpty) {
|
if (method.getReturnType().equals(candidate.asType()) && method.getParameters().isEmpty()) {
|
||||||
return method;
|
return method;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -283,10 +283,10 @@ public sealed interface ConstructionSource {
|
||||||
*/
|
*/
|
||||||
@ApiStatus.Internal
|
@ApiStatus.Internal
|
||||||
static boolean isPossibleBuilderMethod(ExecutableElement method, TypeElement builderClass) {
|
static boolean isPossibleBuilderMethod(ExecutableElement method, TypeElement builderClass) {
|
||||||
if (!method.parameters.isEmpty) return false;
|
if (!method.getParameters().isEmpty()) return false;
|
||||||
TypeMirror returnType = method.returnType;
|
TypeMirror returnType = method.getReturnType();
|
||||||
if (returnType.kind == TypeKind.VOID) return false;
|
if (returnType.getKind() == TypeKind.VOID) return false;
|
||||||
if (returnType.kind.isPrimitive) return false;
|
if (returnType.getKind().isPrimitive()) return false;
|
||||||
if (returnType.equals(builderClass.asType())) return false;
|
if (returnType.equals(builderClass.asType())) return false;
|
||||||
String returnTypeName = returnType.toString();
|
String returnTypeName = returnType.toString();
|
||||||
return !(returnTypeName.startsWith("java.") || returnTypeName.startsWith("javax.") || returnTypeName.startsWith("android."));
|
return !(returnTypeName.startsWith("java.") || returnTypeName.startsWith("javax.") || returnTypeName.startsWith("android."));
|
||||||
|
@ -294,7 +294,7 @@ public sealed interface ConstructionSource {
|
||||||
|
|
||||||
@ApiStatus.Internal
|
@ApiStatus.Internal
|
||||||
static boolean isReasonableBuilderMethodName(ExecutableElement method) {
|
static boolean isReasonableBuilderMethodName(ExecutableElement method) {
|
||||||
String methodName = method.simpleName.toString().toLowerCase(Locale.ROOT);
|
String methodName = method.getSimpleName().toString().toLowerCase(Locale.ROOT);
|
||||||
return methodName.startsWith("build") || methodName.startsWith("create");
|
return methodName.startsWith("build") || methodName.startsWith("create");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,20 +21,20 @@ public class Properties extends DelegateList.Simple<Property<?>> {
|
||||||
public static Properties build(Types types, ConstructionSource constructionSource, boolean isStatic) throws ElementException {
|
public static Properties build(Types types, ConstructionSource constructionSource, boolean isStatic) throws ElementException {
|
||||||
Builder builder = new Builder(types, isStatic);
|
Builder builder = new Builder(types, isStatic);
|
||||||
// constructor params
|
// constructor params
|
||||||
if (constructionSource.constructionElement != null) {
|
if (constructionSource.getConstructionElement() != null) {
|
||||||
for (VariableElement param : constructionSource.constructionElement.parameters) {
|
for (VariableElement param : constructionSource.getConstructionElement().getParameters()) {
|
||||||
builder.addConstructorParam(param);
|
builder.addConstructorParam(param);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (constructionSource instanceof ConstructionSource.Builder csb) {
|
if (constructionSource instanceof ConstructionSource.Builder csb) {
|
||||||
var builderClass = csb.builderClass;
|
var builderClass = csb.getBuilderClass();
|
||||||
for (ExecutableElement method : ElementFilter.methodsIn(builderClass.enclosedElements)) {
|
for (ExecutableElement method : ElementFilter.methodsIn(builderClass.getEnclosedElements())) {
|
||||||
builder.addBuilderParam(method);
|
builder.addBuilderParam(method);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var targetClass = constructionSource.targetClass;
|
var targetClass = constructionSource.getTargetClass();
|
||||||
builder.addFieldsAndAccessors(targetClass);
|
builder.addFieldsAndAccessors(targetClass);
|
||||||
|
|
||||||
return builder.build();
|
return builder.build();
|
||||||
|
@ -94,32 +94,32 @@ public class Properties extends DelegateList.Simple<Property<?>> {
|
||||||
|
|
||||||
public void addFieldsAndAccessors(TypeElement targetClass) {
|
public void addFieldsAndAccessors(TypeElement targetClass) {
|
||||||
// accessors
|
// accessors
|
||||||
for (ExecutableElement method : ElementFilter.methodsIn(targetClass.enclosedElements)) {
|
for (ExecutableElement method : ElementFilter.methodsIn(targetClass.getEnclosedElements())) {
|
||||||
addGetter(targetClass, method);
|
addGetter(targetClass, method);
|
||||||
addSetter(targetClass, method);
|
addSetter(targetClass, method);
|
||||||
}
|
}
|
||||||
|
|
||||||
// fields
|
// fields
|
||||||
for (VariableElement field : ElementFilter.fieldsIn(targetClass.enclosedElements)) {
|
for (VariableElement field : ElementFilter.fieldsIn(targetClass.getEnclosedElements())) {
|
||||||
addField(field);
|
addField(field);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (TypeMirror superInterface : targetClass.interfaces) {
|
for (TypeMirror superInterface : targetClass.getInterfaces()) {
|
||||||
addFieldsAndAccessors((TypeElement) types.asElement(superInterface));
|
addFieldsAndAccessors((TypeElement) types.asElement(superInterface));
|
||||||
}
|
}
|
||||||
|
|
||||||
TypeMirror superclass = targetClass.superclass;
|
TypeMirror superclass = targetClass.getSuperclass();
|
||||||
if (superclass.kind != TypeKind.NONE && !superclass.toString().equals("java.lang.Object")) {
|
if (superclass.getKind() != TypeKind.NONE && !superclass.toString().equals("java.lang.Object")) {
|
||||||
addFieldsAndAccessors((TypeElement) types.asElement(superclass));
|
addFieldsAndAccessors((TypeElement) types.asElement(superclass));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addGetter(TypeElement classElement, ExecutableElement method) {
|
public void addGetter(TypeElement classElement, ExecutableElement method) {
|
||||||
Set<Modifier> modifiers = method.modifiers;
|
Set<Modifier> modifiers = method.getModifiers();
|
||||||
if (modifiers.contains(Modifier.PRIVATE)
|
if (modifiers.contains(Modifier.PRIVATE)
|
||||||
|| (isStatic != modifiers.contains(Modifier.STATIC))
|
|| (isStatic != modifiers.contains(Modifier.STATIC))
|
||||||
|| method.returnType.kind == TypeKind.VOID
|
|| method.getReturnType().getKind() == TypeKind.VOID
|
||||||
|| !method.parameters.isEmpty
|
|| !method.getParameters().isEmpty()
|
||||||
|| isMethodToSkip(classElement, method)) {
|
|| isMethodToSkip(classElement, method)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -127,20 +127,20 @@ public class Properties extends DelegateList.Simple<Property<?>> {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addSetter(TypeElement classElement, ExecutableElement method) {
|
public void addSetter(TypeElement classElement, ExecutableElement method) {
|
||||||
Set<Modifier> modifiers = method.modifiers;
|
Set<Modifier> modifiers = method.getModifiers();
|
||||||
if (modifiers.contains(Modifier.PRIVATE)
|
if (modifiers.contains(Modifier.PRIVATE)
|
||||||
|| (isStatic != modifiers.contains(Modifier.STATIC))
|
|| (isStatic != modifiers.contains(Modifier.STATIC))
|
||||||
|| method.returnType.kind != TypeKind.VOID
|
|| method.getReturnType().getKind() != TypeKind.VOID
|
||||||
|| method.parameters.size() != 1
|
|| method.getParameters().size() != 1
|
||||||
|| isMethodToSkip(classElement, method)
|
|| isMethodToSkip(classElement, method)
|
||||||
|| !method.simpleName.toString().startsWith("set")) {
|
|| !method.getSimpleName().toString().startsWith("set")) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
setters.add(new Property.Setter(method));
|
setters.add(new Property.Setter(method));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addField(VariableElement field) {
|
public void addField(VariableElement field) {
|
||||||
Set<Modifier> modifiers = field.modifiers;
|
Set<Modifier> modifiers = field.getModifiers();
|
||||||
if (isStatic != modifiers.contains(Modifier.STATIC)) return;
|
if (isStatic != modifiers.contains(Modifier.STATIC)) return;
|
||||||
fields.add(new Property.Field(field));
|
fields.add(new Property.Field(field));
|
||||||
}
|
}
|
||||||
|
@ -152,7 +152,7 @@ public class Properties extends DelegateList.Simple<Property<?>> {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addBuilderParam(ExecutableElement method) {
|
public void addBuilderParam(ExecutableElement method) {
|
||||||
if (method.getParameters().size() == 1 && method.simpleName.toString().startsWith("set")) {
|
if (method.getParameters().size() == 1 && method.getSimpleName().toString().startsWith("set")) {
|
||||||
Property.Setter prop = new Property.Setter(method);
|
Property.Setter prop = new Property.Setter(method);
|
||||||
builderParams.add(prop);
|
builderParams.add(prop);
|
||||||
params.add(prop);
|
params.add(prop);
|
||||||
|
@ -198,7 +198,7 @@ public class Properties extends DelegateList.Simple<Property<?>> {
|
||||||
|
|
||||||
private void removeExtraFields() {
|
private void removeExtraFields() {
|
||||||
fields.removeIf(field -> {
|
fields.removeIf(field -> {
|
||||||
Set<Modifier> modifiers = field.element.modifiers;
|
Set<Modifier> modifiers = field.element.getModifiers();
|
||||||
return modifiers.contains(Modifier.PRIVATE) || modifiers.contains(Modifier.TRANSIENT);
|
return modifiers.contains(Modifier.PRIVATE) || modifiers.contains(Modifier.TRANSIENT);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -206,19 +206,19 @@ public class Properties extends DelegateList.Simple<Property<?>> {
|
||||||
private void removeGettersForTransientFields() {
|
private void removeGettersForTransientFields() {
|
||||||
getters.removeIf(getter -> {
|
getters.removeIf(getter -> {
|
||||||
Property<?> field = findName(fields, getter);
|
Property<?> field = findName(fields, getter);
|
||||||
return field != null && field.element.modifiers.contains(Modifier.TRANSIENT);
|
return field != null && field.element.getModifiers().contains(Modifier.TRANSIENT);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private void removeSettersForTransientFields() {
|
private void removeSettersForTransientFields() {
|
||||||
getters.removeIf(getter -> {
|
getters.removeIf(getter -> {
|
||||||
Property<?> field = findName(fields, getter);
|
Property<?> field = findName(fields, getter);
|
||||||
return field != null && field.element.modifiers.contains(Modifier.TRANSIENT);
|
return field != null && field.element.getModifiers().contains(Modifier.TRANSIENT);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean isMethodToSkip(TypeElement classElement, ExecutableElement method) {
|
private boolean isMethodToSkip(TypeElement classElement, ExecutableElement method) {
|
||||||
String name = method.simpleName.toString();
|
String name = method.getSimpleName().toString();
|
||||||
if (METHODS_TO_SKIP.contains(name)) {
|
if (METHODS_TO_SKIP.contains(name)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -231,10 +231,10 @@ public class Properties extends DelegateList.Simple<Property<?>> {
|
||||||
List<AnnotationMirror> annotations = null;
|
List<AnnotationMirror> annotations = null;
|
||||||
for (Property<?> name : properties) {
|
for (Property<?> name : properties) {
|
||||||
if (name == null) continue;
|
if (name == null) continue;
|
||||||
if (!name.annotations.isEmpty) {
|
if (!name.getAnnotations().isEmpty()) {
|
||||||
if (annotations == null) annotations = new ArrayList<>(name.annotations);
|
if (annotations == null) annotations = new ArrayList<>(name.getAnnotations());
|
||||||
else {
|
else {
|
||||||
for (AnnotationMirror annotation : name.annotations) {
|
for (AnnotationMirror annotation : name.getAnnotations()) {
|
||||||
if (annotations.contains(annotation)) {
|
if (annotations.contains(annotation)) {
|
||||||
throw new ElementException("Duplicate annotation " + annotation + " found on " + name, name.element);
|
throw new ElementException("Duplicate annotation " + annotation + " found on " + name, name.element);
|
||||||
} else annotations.add(annotation);
|
} else annotations.add(annotation);
|
||||||
|
@ -264,7 +264,7 @@ public class Properties extends DelegateList.Simple<Property<?>> {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static <N extends Property<?>> N findName(List<N> names, Property<?> property) {
|
public static <N extends Property<?>> N findName(List<N> names, Property<?> property) {
|
||||||
return names.stream().filter(n -> n.name.equals(property.name)).findFirst().orElse(null);
|
return names.stream().filter(n -> n.getName().equals(property.getName())).findFirst().orElse(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean containsName(List<? extends Property<?>> properties, Property<?> property) {
|
public static boolean containsName(List<? extends Property<?>> properties, Property<?> property) {
|
||||||
|
@ -272,6 +272,7 @@ public class Properties extends DelegateList.Simple<Property<?>> {
|
||||||
}
|
}
|
||||||
|
|
||||||
private static boolean isKotlinClass(TypeElement element) {
|
private static boolean isKotlinClass(TypeElement element) {
|
||||||
return element.annotationMirrors.stream().anyMatch(m -> m.annotationType.toString().equals("kotlin.Metadata"));
|
return element.getAnnotationMirrors().stream()
|
||||||
|
.anyMatch(m -> m.getAnnotationType().toString().equals("kotlin.Metadata"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,7 +13,7 @@ public abstract sealed class Property<T extends Element> {
|
||||||
|
|
||||||
public Property(T element) {
|
public Property(T element) {
|
||||||
this.element = element;
|
this.element = element;
|
||||||
this.annotations = element.annotationMirrors;
|
this.annotations = element.getAnnotationMirrors();
|
||||||
}
|
}
|
||||||
|
|
||||||
public T getElement() {
|
public T getElement() {
|
||||||
|
@ -26,7 +26,7 @@ public abstract sealed class Property<T extends Element> {
|
||||||
* @see #getCallableName()
|
* @see #getCallableName()
|
||||||
*/
|
*/
|
||||||
public String getName() {
|
public String getName() {
|
||||||
return element.simpleName.toString();
|
return element.getSimpleName().toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -113,7 +113,7 @@ public abstract sealed class Property<T extends Element> {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public TypeMirror getType() {
|
public TypeMirror getType() {
|
||||||
return element.returnType;
|
return element.getReturnType();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ApiStatus.Internal
|
@ApiStatus.Internal
|
||||||
|
@ -123,7 +123,7 @@ public abstract sealed class Property<T extends Element> {
|
||||||
|
|
||||||
private String getBeanPrefix() {
|
private String getBeanPrefix() {
|
||||||
String name = super.getName();
|
String name = super.getName();
|
||||||
if (element.returnType.kind == TypeKind.BOOLEAN) {
|
if (element.getReturnType().getKind() == TypeKind.BOOLEAN) {
|
||||||
if (name.length() > BEAN_PREFIX_BOOL.length() && name.startsWith(BEAN_PREFIX_BOOL)) {
|
if (name.length() > BEAN_PREFIX_BOOL.length() && name.startsWith(BEAN_PREFIX_BOOL)) {
|
||||||
return BEAN_PREFIX_BOOL;
|
return BEAN_PREFIX_BOOL;
|
||||||
}
|
}
|
||||||
|
@ -151,7 +151,7 @@ public abstract sealed class Property<T extends Element> {
|
||||||
public Setter(ExecutableElement method) {
|
public Setter(ExecutableElement method) {
|
||||||
super(method.getParameters().get(0));
|
super(method.getParameters().get(0));
|
||||||
this.method = method;
|
this.method = method;
|
||||||
name = Character.toLowerCase(method.simpleName.toString().charAt(3)) + method.simpleName.toString().substring(4);
|
name = Character.toLowerCase(method.getSimpleName().toString().charAt(3)) + method.getSimpleName().toString().substring(4);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -161,7 +161,7 @@ public abstract sealed class Property<T extends Element> {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getCallableName() {
|
public String getCallableName() {
|
||||||
return method.simpleName.toString();
|
return method.getSimpleName().toString();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,11 +14,11 @@ public class Value {
|
||||||
public Value(ProcessingEnvironment env, ConstructionSource constructionSource) {
|
public Value(ProcessingEnvironment env, ConstructionSource constructionSource) {
|
||||||
this.env = env;
|
this.env = env;
|
||||||
this.constructionSource = constructionSource;
|
this.constructionSource = constructionSource;
|
||||||
this.element = constructionSource.targetClass;
|
this.element = constructionSource.getTargetClass();
|
||||||
}
|
}
|
||||||
|
|
||||||
public Properties getProperties() throws ElementException {
|
public Properties getProperties() throws ElementException {
|
||||||
return properties != null ? properties : (properties = Properties.build(env.typeUtils, constructionSource, constructionSource.isStatic));
|
return properties != null ? properties : (properties = Properties.build(env.getTypeUtils(), constructionSource, constructionSource.isStatic()));
|
||||||
}
|
}
|
||||||
|
|
||||||
public ConstructionSource getConstructionSource() {
|
public ConstructionSource getConstructionSource() {
|
||||||
|
|
|
@ -60,7 +60,7 @@ public class ValueCreator {
|
||||||
*/
|
*/
|
||||||
public Value fromBuilderConstructor(ExecutableElement constructor) {
|
public Value fromBuilderConstructor(ExecutableElement constructor) {
|
||||||
checkKind(constructor, ElementKind.CONSTRUCTOR);
|
checkKind(constructor, ElementKind.CONSTRUCTOR);
|
||||||
return create(new ConstructionSource.BuilderConstructor(env.typeUtils, constructor));
|
return create(new ConstructionSource.BuilderConstructor(env.getTypeUtils(), constructor));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -73,7 +73,7 @@ public class ValueCreator {
|
||||||
*/
|
*/
|
||||||
public Value fromFactory(ExecutableElement factory) {
|
public Value fromFactory(ExecutableElement factory) {
|
||||||
checkKind(factory, ElementKind.METHOD);
|
checkKind(factory, ElementKind.METHOD);
|
||||||
return create(new ConstructionSource.Factory(env.typeUtils, factory));
|
return create(new ConstructionSource.Factory(env.getTypeUtils(), factory));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -87,7 +87,7 @@ public class ValueCreator {
|
||||||
*/
|
*/
|
||||||
public Value fromBuilderFactory(ExecutableElement builderFactory) {
|
public Value fromBuilderFactory(ExecutableElement builderFactory) {
|
||||||
checkKind(builderFactory, ElementKind.METHOD);
|
checkKind(builderFactory, ElementKind.METHOD);
|
||||||
return create(new ConstructionSource.BuilderFactory(env.typeUtils, builderFactory));
|
return create(new ConstructionSource.BuilderFactory(env.getTypeUtils(), builderFactory));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -120,27 +120,27 @@ public class ValueCreator {
|
||||||
|
|
||||||
private static ExecutableElement findConstructorOrFactory(TypeElement klazz) throws ElementException {
|
private static ExecutableElement findConstructorOrFactory(TypeElement klazz) throws ElementException {
|
||||||
ExecutableElement noArgConstructor = null;
|
ExecutableElement noArgConstructor = null;
|
||||||
List<ExecutableElement> constructors = ElementFilter.constructorsIn(klazz.enclosedElements);
|
List<ExecutableElement> constructors = ElementFilter.constructorsIn(klazz.getEnclosedElements());
|
||||||
if (constructors.size() == 1) {
|
if (constructors.size() == 1) {
|
||||||
ExecutableElement constructor = constructors[0];
|
ExecutableElement constructor = constructors.get(0);
|
||||||
if (constructor.parameters.isEmpty) {
|
if (constructor.getParameters().isEmpty()) {
|
||||||
noArgConstructor = constructor;
|
noArgConstructor = constructor;
|
||||||
constructors.remove(0);
|
constructors.remove(0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (ExecutableElement method : ElementFilter.methodsIn(klazz.enclosedElements)) {
|
for (ExecutableElement method : ElementFilter.methodsIn(klazz.getEnclosedElements())) {
|
||||||
Set<Modifier> modifiers = method.modifiers;
|
Set<Modifier> modifiers = method.getModifiers();
|
||||||
if (modifiers.contains(Modifier.STATIC)
|
if (modifiers.contains(Modifier.STATIC)
|
||||||
&& !modifiers.contains(Modifier.PRIVATE)
|
&& !modifiers.contains(Modifier.PRIVATE)
|
||||||
&& method.returnType.equals(klazz.asType())) {
|
&& method.getReturnType().equals(klazz.asType())) {
|
||||||
constructors.add(method);
|
constructors.add(method);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (constructors.isEmpty) {
|
if (constructors.isEmpty()) {
|
||||||
if (noArgConstructor != null) return noArgConstructor;
|
if (noArgConstructor != null) return noArgConstructor;
|
||||||
else throw new ElementException("Lacking constructor or factory method", klazz);
|
else throw new ElementException("Lacking constructor or factory method", klazz);
|
||||||
}
|
}
|
||||||
if (constructors.size() == 1) return constructors[0];
|
if (constructors.size() == 1) return constructors.get(0);
|
||||||
if (noArgConstructor != null) constructors.add(noArgConstructor);
|
if (noArgConstructor != null) constructors.add(noArgConstructor);
|
||||||
if (preferAnnotation != null) {
|
if (preferAnnotation != null) {
|
||||||
List<ExecutableElement> preferred = new ArrayList<>();
|
List<ExecutableElement> preferred = new ArrayList<>();
|
||||||
|
@ -149,7 +149,7 @@ public class ValueCreator {
|
||||||
preferred.add(constructor);
|
preferred.add(constructor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (preferred.size() == 1) return preferred[0];
|
if (preferred.size() == 1) return preferred.get(0);
|
||||||
}
|
}
|
||||||
List<ElementException.Message> messages = new ArrayList<>();
|
List<ElementException.Message> messages = new ArrayList<>();
|
||||||
messages.add(new ElementException.Message("More than one constructor or factory method found.", klazz));
|
messages.add(new ElementException.Message("More than one constructor or factory method found.", klazz));
|
||||||
|
@ -158,7 +158,7 @@ public class ValueCreator {
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void checkKind(Element element, ElementKind kind) {
|
private static void checkKind(Element element, ElementKind kind) {
|
||||||
if (element.kind != kind) {
|
if (element.getKind() != kind) {
|
||||||
throw new IllegalArgumentException("Expected " + kind + " but got: " + element);
|
throw new IllegalArgumentException("Expected " + kind + " but got: " + element);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,7 @@
|
||||||
|
module io.gitlab.jfronny.gson.compile.processor.core {
|
||||||
|
requires java.compiler;
|
||||||
|
requires static org.jetbrains.annotations;
|
||||||
|
requires io.gitlab.jfronny.commons;
|
||||||
|
exports io.gitlab.jfronny.gson.compile.processor.core;
|
||||||
|
exports io.gitlab.jfronny.gson.compile.processor.core.value;
|
||||||
|
}
|
|
@ -1,7 +1,6 @@
|
||||||
plugins {
|
plugins {
|
||||||
`java-library`
|
`java-library`
|
||||||
id("jf.maven-publish")
|
id("jf.maven-publish")
|
||||||
id("jf.manifold")
|
|
||||||
}
|
}
|
||||||
|
|
||||||
repositories {
|
repositories {
|
||||||
|
@ -13,7 +12,7 @@ dependencies {
|
||||||
implementation(project(":gson-compile-processor-core"))
|
implementation(project(":gson-compile-processor-core"))
|
||||||
implementation(project(":gson-compile-annotations"))
|
implementation(project(":gson-compile-annotations"))
|
||||||
implementation("org.jetbrains:annotations:24.0.0")
|
implementation("org.jetbrains:annotations:24.0.0")
|
||||||
implementation("io.gitlab.jfronny:commons:1.0-SNAPSHOT")
|
implementation("io.gitlab.jfronny:commons:1.1-SNAPSHOT")
|
||||||
implementation("com.squareup:javapoet:1.13.0")
|
implementation("com.squareup:javapoet:1.13.0")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,22 +0,0 @@
|
||||||
package extensions.com.squareup.javapoet.ClassName;
|
|
||||||
|
|
||||||
import com.squareup.javapoet.ClassName;
|
|
||||||
import manifold.ext.rt.api.Extension;
|
|
||||||
import manifold.ext.rt.api.This;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
@Extension
|
|
||||||
public class ClassNameExt {
|
|
||||||
public static String getSimpleName(@This ClassName thiz) {
|
|
||||||
return thiz.simpleName();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static String getPackageName(@This ClassName thiz) {
|
|
||||||
return thiz.packageName();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static List<String> getSimpleNames(@This ClassName thiz) {
|
|
||||||
return thiz.simpleNames();
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -8,8 +8,8 @@ public class Cl {
|
||||||
public static final ClassName GSON_ELEMENT = ClassName.get("io.gitlab.jfronny.gson", "JsonElement");
|
public static final ClassName GSON_ELEMENT = ClassName.get("io.gitlab.jfronny.gson", "JsonElement");
|
||||||
public static final ClassName GSON_WRITER = ClassName.get("io.gitlab.jfronny.gson.stream", "JsonWriter");
|
public static final ClassName GSON_WRITER = ClassName.get("io.gitlab.jfronny.gson.stream", "JsonWriter");
|
||||||
public static final ClassName GSON_READER = ClassName.get("io.gitlab.jfronny.gson.stream", "JsonReader");
|
public static final ClassName GSON_READER = ClassName.get("io.gitlab.jfronny.gson.stream", "JsonReader");
|
||||||
public static final ClassName GSON_TREE_READER = ClassName.get("io.gitlab.jfronny.gson.internal.bind", "JsonTreeReader");
|
public static final ClassName GSON_TREE_READER = ClassName.get("io.gitlab.jfronny.gson.stream", "JsonTreeReader");
|
||||||
public static final ClassName GSON_TREE_WRITER = ClassName.get("io.gitlab.jfronny.gson.internal.bind", "JsonTreeWriter");
|
public static final ClassName GSON_TREE_WRITER = ClassName.get("io.gitlab.jfronny.gson.stream", "JsonTreeWriter");
|
||||||
public static final ClassName JSON_ADAPTER = ClassName.get("io.gitlab.jfronny.gson.annotations", "JsonAdapter");
|
public static final ClassName JSON_ADAPTER = ClassName.get("io.gitlab.jfronny.gson.annotations", "JsonAdapter");
|
||||||
public static final ClassName TYPE_TOKEN = ClassName.get("io.gitlab.jfronny.gson.reflect", "TypeToken");
|
public static final ClassName TYPE_TOKEN = ClassName.get("io.gitlab.jfronny.gson.reflect", "TypeToken");
|
||||||
public static final ClassName GSON_TOKEN = ClassName.get("io.gitlab.jfronny.gson.stream", "JsonToken");
|
public static final ClassName GSON_TOKEN = ClassName.get("io.gitlab.jfronny.gson.stream", "JsonToken");
|
||||||
|
@ -17,7 +17,7 @@ public class Cl {
|
||||||
public static final ClassName GSON_SYNTAX_EXCEPTION = ClassName.get("io.gitlab.jfronny.gson", "JsonSyntaxException");
|
public static final ClassName GSON_SYNTAX_EXCEPTION = ClassName.get("io.gitlab.jfronny.gson", "JsonSyntaxException");
|
||||||
|
|
||||||
public static final ClassName GCOMMENT = ClassName.get("io.gitlab.jfronny.gson.compile.annotations", "GComment");
|
public static final ClassName GCOMMENT = ClassName.get("io.gitlab.jfronny.gson.compile.annotations", "GComment");
|
||||||
public static final ClassName GISO8601UTILS = ClassName.get("io.gitlab.jfronny.gson.internal.bind.util", "ISO8601Utils");
|
public static final ClassName GISO8601UTILS = ClassName.get("io.gitlab.jfronny.gson.util", "ISO8601Utils");
|
||||||
public static final ClassName CCORE = ClassName.get("io.gitlab.jfronny.gson.compile.core", "CCore");
|
public static final ClassName CCORE = ClassName.get("io.gitlab.jfronny.gson.compile.core", "CCore");
|
||||||
|
|
||||||
public static final ClassName MANIFOLD_EXTENSION = ClassName.get("manifold.ext.rt.api", "Extension");
|
public static final ClassName MANIFOLD_EXTENSION = ClassName.get("manifold.ext.rt.api", "Extension");
|
||||||
|
|
|
@ -48,9 +48,9 @@ public class GsonCompileProcessor extends AbstractProcessor2 {
|
||||||
// Gather all serializable types
|
// Gather all serializable types
|
||||||
for (TypeElement annotation : annotations) {
|
for (TypeElement annotation : annotations) {
|
||||||
for (Element element : roundEnvironment.getElementsAnnotatedWith(annotation)) {
|
for (Element element : roundEnvironment.getElementsAnnotatedWith(annotation)) {
|
||||||
for (AnnotationMirror mirror : element.annotationMirrors) {
|
for (AnnotationMirror mirror : element.getAnnotationMirrors()) {
|
||||||
try {
|
try {
|
||||||
if (mirror.annotationType.toString().equals(GSerializable.class.getCanonicalName())) {
|
if (mirror.getAnnotationType().toString().equals(GSerializable.class.getCanonicalName())) {
|
||||||
var bld = new Object() {
|
var bld = new Object() {
|
||||||
TypeMirror with = null;
|
TypeMirror with = null;
|
||||||
TypeMirror builder = null;
|
TypeMirror builder = null;
|
||||||
|
@ -59,27 +59,27 @@ public class GsonCompileProcessor extends AbstractProcessor2 {
|
||||||
Boolean isStatic = null;
|
Boolean isStatic = null;
|
||||||
};
|
};
|
||||||
elements.getElementValuesWithDefaults(mirror).forEach((executableElement, value) -> {
|
elements.getElementValuesWithDefaults(mirror).forEach((executableElement, value) -> {
|
||||||
String name = executableElement.simpleName.toString();
|
String name = executableElement.getSimpleName().toString();
|
||||||
switch (name) {
|
switch (name) {
|
||||||
case "with" -> {
|
case "with" -> {
|
||||||
if (bld.with != null) throw new IllegalArgumentException("Duplicate annotation parameter: with");
|
if (bld.with != null) throw new IllegalArgumentException("Duplicate annotation parameter: with");
|
||||||
bld.with = (TypeMirror) value.value;
|
bld.with = (TypeMirror) value.getValue();
|
||||||
}
|
}
|
||||||
case "builder" -> {
|
case "builder" -> {
|
||||||
if (bld.builder != null) throw new IllegalArgumentException("Duplicate annotation parameter: builder");
|
if (bld.builder != null) throw new IllegalArgumentException("Duplicate annotation parameter: builder");
|
||||||
bld.builder = (TypeMirror) value.value;
|
bld.builder = (TypeMirror) value.getValue();
|
||||||
}
|
}
|
||||||
case "configure" -> {
|
case "configure" -> {
|
||||||
if (bld.configure != null) throw new IllegalArgumentException("Duplicate annotation parameter: configure");
|
if (bld.configure != null) throw new IllegalArgumentException("Duplicate annotation parameter: configure");
|
||||||
bld.configure = (TypeMirror) value.value;
|
bld.configure = (TypeMirror) value.getValue();
|
||||||
}
|
}
|
||||||
case "generateAdapter" -> {
|
case "generateAdapter" -> {
|
||||||
if (bld.generateAdapter != null) throw new IllegalArgumentException("Duplicate annotation parameter: generateAdapter");
|
if (bld.generateAdapter != null) throw new IllegalArgumentException("Duplicate annotation parameter: generateAdapter");
|
||||||
bld.generateAdapter = (Boolean) value.value;
|
bld.generateAdapter = (Boolean) value.getValue();
|
||||||
}
|
}
|
||||||
case "isStatic" -> {
|
case "isStatic" -> {
|
||||||
if (bld.isStatic != null) throw new IllegalArgumentException("Duplicate annotation parameter: isStatic");
|
if (bld.isStatic != null) throw new IllegalArgumentException("Duplicate annotation parameter: isStatic");
|
||||||
bld.isStatic = (Boolean) value.value;
|
bld.isStatic = (Boolean) value.getValue();
|
||||||
}
|
}
|
||||||
default -> throw new IllegalArgumentException("Unexpected annotation parameter: " + name);
|
default -> throw new IllegalArgumentException("Unexpected annotation parameter: " + name);
|
||||||
}
|
}
|
||||||
|
@ -109,7 +109,7 @@ public class GsonCompileProcessor extends AbstractProcessor2 {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (var entry : seen.keySet().stream().collect(Collectors.groupingBy(ClassName::packageName)).entrySet()) {
|
for (var entry : seen.keySet().stream().collect(Collectors.groupingBy(ClassName::packageName)).entrySet()) {
|
||||||
Map<List<String>, TypeSpec.Builder> known = entry.value.stream()
|
Map<List<String>, TypeSpec.Builder> known = entry.getValue().stream()
|
||||||
.collect(Collectors.toMap(
|
.collect(Collectors.toMap(
|
||||||
ClassName::simpleNames,
|
ClassName::simpleNames,
|
||||||
seen::get,
|
seen::get,
|
||||||
|
@ -132,8 +132,8 @@ public class GsonCompileProcessor extends AbstractProcessor2 {
|
||||||
}
|
}
|
||||||
// Add to parent class
|
// Add to parent class
|
||||||
for (var entry1 : known.entrySet()) {
|
for (var entry1 : known.entrySet()) {
|
||||||
if (entry1.key.size() == 1) continue;
|
if (entry1.getKey().size() == 1) continue;
|
||||||
find(known, entry1.key.subList(0, entry1.key.size() - 1)).addType(entry1.value.build());
|
find(known, entry1.getKey().subList(0, entry1.getKey().size() - 1)).addType(entry1.getValue().build());
|
||||||
}
|
}
|
||||||
// Print
|
// Print
|
||||||
// System.out.println("Got " + known.size() + " classes");
|
// System.out.println("Got " + known.size() + " classes");
|
||||||
|
@ -145,8 +145,8 @@ public class GsonCompileProcessor extends AbstractProcessor2 {
|
||||||
// }
|
// }
|
||||||
// Write top-level classes
|
// Write top-level classes
|
||||||
for (var entry1 : known.entrySet()) {
|
for (var entry1 : known.entrySet()) {
|
||||||
if (entry1.key.size() == 1) {
|
if (entry1.getKey().size() == 1) {
|
||||||
JavaFile javaFile = JavaFile.builder(entry.key, entry1.value.build())
|
JavaFile javaFile = JavaFile.builder(entry.getKey(), entry1.getValue().build())
|
||||||
.skipJavaLangImports(true)
|
.skipJavaLangImports(true)
|
||||||
.indent(" ")
|
.indent(" ")
|
||||||
.build();
|
.build();
|
||||||
|
@ -163,35 +163,35 @@ public class GsonCompileProcessor extends AbstractProcessor2 {
|
||||||
}
|
}
|
||||||
|
|
||||||
private <K, V> V find(Map<List<K>, V> map, List<K> key) {
|
private <K, V> V find(Map<List<K>, V> map, List<K> key) {
|
||||||
for (var entry : map.entrySet()) if (entry.key.equals(key)) return entry.value;
|
for (var entry : map.entrySet()) if (entry.getKey().equals(key)) return entry.getValue();
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void process(SerializableClass toProcess, Set<SerializableClass> other) throws ElementException {
|
private void process(SerializableClass toProcess, Set<SerializableClass> other) throws ElementException {
|
||||||
if (seen.containsKey(toProcess.generatedClassName)) return; // Don't process the same class more than once
|
if (seen.containsKey(toProcess.generatedClassName())) return; // Don't process the same class more than once
|
||||||
|
|
||||||
TypeName classType = toProcess.typeName;
|
TypeName classType = toProcess.getTypeName();
|
||||||
List<TypeVariableName> typeVariables = new ArrayList<>();
|
List<TypeVariableName> typeVariables = new ArrayList<>();
|
||||||
if (!toProcess.isStatic && classType instanceof ParameterizedTypeName type) {
|
if (!toProcess.isStatic() && classType instanceof ParameterizedTypeName type) {
|
||||||
for (TypeName argument : type.typeArguments) {
|
for (TypeName argument : type.typeArguments) {
|
||||||
typeVariables.add(TypeVariableName.get(argument.toString()));
|
typeVariables.add(TypeVariableName.get(argument.toString()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
TypeSpec.Builder spec = TypeSpec.classBuilder(toProcess.generatedClassName.simpleName())
|
TypeSpec.Builder spec = TypeSpec.classBuilder(toProcess.generatedClassName().simpleName())
|
||||||
.addOriginatingElement(toProcess.classElement)
|
.addOriginatingElement(toProcess.classElement())
|
||||||
.addModifiers(Modifier.PUBLIC)
|
.addModifiers(Modifier.PUBLIC)
|
||||||
.addTypeVariables(typeVariables);
|
.addTypeVariables(typeVariables);
|
||||||
|
|
||||||
seen.put(toProcess.generatedClassName, spec);
|
seen.put(toProcess.generatedClassName(), spec);
|
||||||
|
|
||||||
GProcessor processor = toProcess.isStatic ? staticProcessor : instanceProcessor;
|
GProcessor processor = toProcess.isStatic() ? staticProcessor : instanceProcessor;
|
||||||
|
|
||||||
if (toProcess.adapter != null) {
|
if (toProcess.adapter() != null) {
|
||||||
processor.generateDelegateToAdapter(spec, classType, toProcess.adapter);
|
processor.generateDelegateToAdapter(spec, classType, toProcess.adapter());
|
||||||
} else {
|
} else {
|
||||||
if (toProcess.generateAdapter) {
|
if (toProcess.generateAdapter()) {
|
||||||
processor.generateDelegatingAdapter(spec, classType, toProcess.generatedClassName);
|
processor.generateDelegatingAdapter(spec, classType, toProcess.generatedClassName());
|
||||||
}
|
}
|
||||||
processor.generateSerialisation(spec, toProcess, typeVariables, other);
|
processor.generateSerialisation(spec, toProcess, typeVariables, other);
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,8 +11,8 @@ import javax.lang.model.type.TypeMirror;
|
||||||
public record SerializableClass(TypeElement classElement, ClassName generatedClassName, @Nullable TypeMirror adapter, @Nullable TypeMirror builder, @Nullable TypeMirror configure, boolean generateAdapter, boolean isStatic) {
|
public record SerializableClass(TypeElement classElement, ClassName generatedClassName, @Nullable TypeMirror adapter, @Nullable TypeMirror builder, @Nullable TypeMirror configure, boolean generateAdapter, boolean isStatic) {
|
||||||
public static SerializableClass of(TypeElement element, @Nullable TypeMirror with, @Nullable TypeMirror builder, @Nullable TypeMirror configure, boolean generateAdapter, boolean isStatic, boolean manifold) throws ElementException {
|
public static SerializableClass of(TypeElement element, @Nullable TypeMirror with, @Nullable TypeMirror builder, @Nullable TypeMirror configure, boolean generateAdapter, boolean isStatic, boolean manifold) throws ElementException {
|
||||||
ClassName className = ClassName.get(element);
|
ClassName className = ClassName.get(element);
|
||||||
String pkg = manifold ? "gsoncompile.extensions." + className.packageName + '.' + className.simpleNames[0] : className.packageName;
|
String pkg = manifold ? "gsoncompile.extensions." + className.packageName() + '.' + className.simpleNames().get(0) : className.packageName();
|
||||||
ClassName generatedClassName = ClassName.get(pkg, "GC_" + className.simpleNames[0], className.simpleNames.subList(1, className.simpleNames.size()).toArray(String[]::new));
|
ClassName generatedClassName = ClassName.get(pkg, "GC_" + className.simpleNames().get(0), className.simpleNames().subList(1, className.simpleNames().size()).toArray(String[]::new));
|
||||||
return new SerializableClass(element, generatedClassName, voidToNull(with), voidToNull(builder), voidToNull(configure), generateAdapter, isStatic).validate();
|
return new SerializableClass(element, generatedClassName, voidToNull(with), voidToNull(builder), voidToNull(configure), generateAdapter, isStatic).validate();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -38,7 +38,7 @@ public abstract class AdapterAdapter<T extends AdapterAdapter<T>.Hydrated> exten
|
||||||
if (TypeHelper.isComplexType(type, typeUtils)) {
|
if (TypeHelper.isComplexType(type, typeUtils)) {
|
||||||
TypeName typeTokenType = ParameterizedTypeName.get(Cl.TYPE_TOKEN, typeName);
|
TypeName typeTokenType = ParameterizedTypeName.get(Cl.TYPE_TOKEN, typeName);
|
||||||
List<? extends TypeMirror> typeParams = TypeHelper.getGenericTypes(type);
|
List<? extends TypeMirror> typeParams = TypeHelper.getGenericTypes(type);
|
||||||
if (typeParams.isEmpty) {
|
if (typeParams.isEmpty()) {
|
||||||
code.add("new $T() {}", typeTokenType);
|
code.add("new $T() {}", typeTokenType);
|
||||||
} else {
|
} else {
|
||||||
code.add("($T) $T.getParameterized($T.class, ", typeTokenType, Cl.TYPE_TOKEN, typeUtils.erasure(type));
|
code.add("($T) $T.getParameterized($T.class, ", typeTokenType, Cl.TYPE_TOKEN, typeUtils.erasure(type));
|
||||||
|
|
|
@ -37,7 +37,7 @@ public class Adapters {
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void withAdapter(Property<?> prop, TypeSpec.Builder klazz, CodeBlock.Builder code, List<TypeVariableName> typeVariables, Set<SerializableClass> otherAdapters, Messager message, Consumer<Adapter<?>.Hydrated> action) {
|
private static void withAdapter(Property<?> prop, TypeSpec.Builder klazz, CodeBlock.Builder code, List<TypeVariableName> typeVariables, Set<SerializableClass> otherAdapters, Messager message, Consumer<Adapter<?>.Hydrated> action) {
|
||||||
withAdapter(klazz, code, typeVariables, otherAdapters, prop.type, prop.name, prop.annotations, prop.element, message, action);
|
withAdapter(klazz, code, typeVariables, otherAdapters, prop.getType(), prop.getName(), prop.getAnnotations(), prop.getElement(), message, action);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void generateRead(TypeSpec.Builder klazz, CodeBlock.Builder code, List<TypeVariableName> typeVariables, Set<SerializableClass> other, TypeMirror type, String propName, List<? extends AnnotationMirror> annotations, Element sourceElement, Messager message) {
|
public static void generateRead(TypeSpec.Builder klazz, CodeBlock.Builder code, List<TypeVariableName> typeVariables, Set<SerializableClass> other, TypeMirror type, String propName, List<? extends AnnotationMirror> annotations, Element sourceElement, Messager message) {
|
||||||
|
|
|
@ -30,7 +30,7 @@ public class ArrayAdapter extends Adapter<ArrayAdapter.Hydrated> {
|
||||||
@Override
|
@Override
|
||||||
protected void afterHydrate() {
|
protected void afterHydrate() {
|
||||||
type = TypeHelper.asArrayType(super.type);
|
type = TypeHelper.asArrayType(super.type);
|
||||||
componentType = type == null ? null : type.componentType;
|
componentType = type == null ? null : type.getComponentType();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -41,7 +41,7 @@ public class ArrayAdapter extends Adapter<ArrayAdapter.Hydrated> {
|
||||||
.beginControlFlow("if ($N == null)", argName)
|
.beginControlFlow("if ($N == null)", argName)
|
||||||
.addStatement("if (writer.getSerializeNulls()) writer.nullValue()")
|
.addStatement("if (writer.getSerializeNulls()) writer.nullValue()")
|
||||||
.nextControlFlow("else");
|
.nextControlFlow("else");
|
||||||
generateWrite(code, componentType, argName, componentType.annotationMirrors, () -> code.add(argName));
|
generateWrite(code, componentType, argName, componentType.getAnnotationMirrors(), () -> code.add(argName));
|
||||||
code.endControlFlow().endControlFlow();
|
code.endControlFlow().endControlFlow();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -51,7 +51,7 @@ public class ArrayAdapter extends Adapter<ArrayAdapter.Hydrated> {
|
||||||
// Coerce
|
// Coerce
|
||||||
kode.beginControlFlow("if (reader.isLenient() && reader.peek() != $T.BEGIN_ARRAY)", Cl.GSON_TOKEN)
|
kode.beginControlFlow("if (reader.isLenient() && reader.peek() != $T.BEGIN_ARRAY)", Cl.GSON_TOKEN)
|
||||||
.add("return new $T[] { ", componentType);
|
.add("return new $T[] { ", componentType);
|
||||||
generateRead(kode, componentType, argName, componentType.annotationMirrors);
|
generateRead(kode, componentType, argName, componentType.getAnnotationMirrors());
|
||||||
kode.add(" };\n").endControlFlow();
|
kode.add(" };\n").endControlFlow();
|
||||||
|
|
||||||
kode.addStatement("$T<$T> list = new $T<>()", List.class, componentType, ArrayList.class)
|
kode.addStatement("$T<$T> list = new $T<>()", List.class, componentType, ArrayList.class)
|
||||||
|
@ -62,7 +62,7 @@ public class ArrayAdapter extends Adapter<ArrayAdapter.Hydrated> {
|
||||||
.addStatement("list.add(null)")
|
.addStatement("list.add(null)")
|
||||||
.nextControlFlow("else")
|
.nextControlFlow("else")
|
||||||
.add("list.add(");
|
.add("list.add(");
|
||||||
generateRead(kode, componentType, argName, componentType.annotationMirrors);
|
generateRead(kode, componentType, argName, componentType.getAnnotationMirrors());
|
||||||
kode.add(");\n")
|
kode.add(");\n")
|
||||||
.endControlFlow()
|
.endControlFlow()
|
||||||
.endControlFlow()
|
.endControlFlow()
|
||||||
|
|
|
@ -40,15 +40,15 @@ public class CollectionAdapter extends Adapter<CollectionAdapter.Hydrated> {
|
||||||
type = TypeHelper.asDeclaredType(super.type);
|
type = TypeHelper.asDeclaredType(super.type);
|
||||||
componentType = null;
|
componentType = null;
|
||||||
if (type == null) return;
|
if (type == null) return;
|
||||||
List<? extends TypeMirror> typeArguments = type.typeArguments;
|
List<? extends TypeMirror> typeArguments = type.getTypeArguments();
|
||||||
if (typeArguments.size() == 0) {
|
if (typeArguments.size() == 0) {
|
||||||
type = null;
|
type = null;
|
||||||
} else {
|
} else {
|
||||||
componentType = typeArguments.get(0);
|
componentType = typeArguments.get(0);
|
||||||
String ts = TypeHelper.asDeclaredType(typeUtils.erasure(type)).asElement().toString();
|
String ts = TypeHelper.asDeclaredType(typeUtils.erasure(type)).asElement().toString();
|
||||||
for (Map.Entry<Class<?>, List<Class<?>>> entry : SUPPORTED.entrySet()) {
|
for (Map.Entry<Class<?>, List<Class<?>>> entry : SUPPORTED.entrySet()) {
|
||||||
if (entry.key.getCanonicalName().equals(ts)) {
|
if (entry.getKey().getCanonicalName().equals(ts)) {
|
||||||
implType = TypeName.get(entry.value[0]);
|
implType = TypeName.get(entry.getValue().get(0));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
for (Class<?> klazz : entry.getValue()) {
|
for (Class<?> klazz : entry.getValue()) {
|
||||||
|
@ -72,7 +72,7 @@ public class CollectionAdapter extends Adapter<CollectionAdapter.Hydrated> {
|
||||||
.beginControlFlow("if ($N == null)", argName)
|
.beginControlFlow("if ($N == null)", argName)
|
||||||
.addStatement("if (writer.getSerializeNulls()) writer.nullValue()")
|
.addStatement("if (writer.getSerializeNulls()) writer.nullValue()")
|
||||||
.nextControlFlow("else");
|
.nextControlFlow("else");
|
||||||
generateWrite(code, componentType, argName, componentType.annotationMirrors, () -> code.add(argName));
|
generateWrite(code, componentType, argName, componentType.getAnnotationMirrors(), () -> code.add(argName));
|
||||||
code.endControlFlow().endControlFlow().addStatement("writer.endArray()");
|
code.endControlFlow().endControlFlow().addStatement("writer.endArray()");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -83,7 +83,7 @@ public class CollectionAdapter extends Adapter<CollectionAdapter.Hydrated> {
|
||||||
// Coerce
|
// Coerce
|
||||||
kode.beginControlFlow("if (reader.isLenient() && reader.peek() != $T.BEGIN_ARRAY)", Cl.GSON_TOKEN)
|
kode.beginControlFlow("if (reader.isLenient() && reader.peek() != $T.BEGIN_ARRAY)", Cl.GSON_TOKEN)
|
||||||
.add("list.add(");
|
.add("list.add(");
|
||||||
generateRead(kode, componentType, argName, componentType.annotationMirrors);
|
generateRead(kode, componentType, argName, componentType.getAnnotationMirrors());
|
||||||
kode.add(");\n").addStatement("return list").endControlFlow();
|
kode.add(");\n").addStatement("return list").endControlFlow();
|
||||||
|
|
||||||
kode.addStatement("reader.beginArray()")
|
kode.addStatement("reader.beginArray()")
|
||||||
|
@ -93,7 +93,7 @@ public class CollectionAdapter extends Adapter<CollectionAdapter.Hydrated> {
|
||||||
.addStatement("list.add(null)")
|
.addStatement("list.add(null)")
|
||||||
.nextControlFlow("else")
|
.nextControlFlow("else")
|
||||||
.add("list.add(");
|
.add("list.add(");
|
||||||
generateRead(kode, componentType, argName, componentType.annotationMirrors);
|
generateRead(kode, componentType, argName, componentType.getAnnotationMirrors());
|
||||||
kode.add(");\n")
|
kode.add(");\n")
|
||||||
.endControlFlow()
|
.endControlFlow()
|
||||||
.endControlFlow()
|
.endControlFlow()
|
||||||
|
|
|
@ -57,10 +57,10 @@ public class DeclaredAdapter extends AdapterAdapter<DeclaredAdapter.Hydrated> {
|
||||||
|
|
||||||
private static DeclaredType findTypeAdapterClass(List<? extends AnnotationMirror> annotations) {
|
private static DeclaredType findTypeAdapterClass(List<? extends AnnotationMirror> annotations) {
|
||||||
for (AnnotationMirror annotation : annotations) {
|
for (AnnotationMirror annotation : annotations) {
|
||||||
String typeName = annotation.annotationType.toString();
|
String typeName = annotation.getAnnotationType().toString();
|
||||||
if (typeName.equals(Cl.JSON_ADAPTER.toString())) {
|
if (typeName.equals(Cl.JSON_ADAPTER.toString())) {
|
||||||
Map<? extends ExecutableElement, ? extends AnnotationValue> elements = annotation.elementValues;
|
Map<? extends ExecutableElement, ? extends AnnotationValue> elements = annotation.getElementValues();
|
||||||
if (!elements.isEmpty) {
|
if (!elements.isEmpty()) {
|
||||||
AnnotationValue value = elements.values().iterator().next();
|
AnnotationValue value = elements.values().iterator().next();
|
||||||
return (DeclaredType) value.getValue();
|
return (DeclaredType) value.getValue();
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,7 +23,7 @@ public class EnumAdapter extends Adapter<EnumAdapter.Hydrated> {
|
||||||
tel = null;
|
tel = null;
|
||||||
DeclaredType declared = TypeHelper.asDeclaredType(type);
|
DeclaredType declared = TypeHelper.asDeclaredType(type);
|
||||||
if (declared == null) return;
|
if (declared == null) return;
|
||||||
if (declared.asElement().kind != ElementKind.ENUM) return;
|
if (declared.asElement().getKind() != ElementKind.ENUM) return;
|
||||||
tel = declared;
|
tel = declared;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -36,20 +36,20 @@ public class MapAdapter extends Adapter<MapAdapter.Hydrated> {
|
||||||
type = TypeHelper.asDeclaredType(super.type);
|
type = TypeHelper.asDeclaredType(super.type);
|
||||||
componentType1 = componentType2 = null;
|
componentType1 = componentType2 = null;
|
||||||
if (type == null) return;
|
if (type == null) return;
|
||||||
List<? extends TypeMirror> typeArguments = type.typeArguments;
|
List<? extends TypeMirror> typeArguments = type.getTypeArguments();
|
||||||
if (typeArguments.size() != 2) {
|
if (typeArguments.size() != 2) {
|
||||||
type = null;
|
type = null;
|
||||||
} else {
|
} else {
|
||||||
componentType1 = typeArguments[0];
|
componentType1 = typeArguments.get(0);
|
||||||
if (!isValidKey(componentType1)) {
|
if (!isValidKey(componentType1)) {
|
||||||
type = null;
|
type = null;
|
||||||
componentType1 = null;
|
componentType1 = null;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
componentType2 = typeArguments[1];
|
componentType2 = typeArguments.get(1);
|
||||||
String ts = TypeHelper.asDeclaredType(typeUtils.erasure(type)).asElement().toString();
|
String ts = TypeHelper.asDeclaredType(typeUtils.erasure(type)).asElement().toString();
|
||||||
if (Map.class.getCanonicalName().equals(ts)) {
|
if (Map.class.getCanonicalName().equals(ts)) {
|
||||||
implType = TypeName.get(SUPPORTED[0]);
|
implType = TypeName.get(SUPPORTED.get(0));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
for (Class<?> klazz : SUPPORTED) {
|
for (Class<?> klazz : SUPPORTED) {
|
||||||
|
@ -66,7 +66,7 @@ public class MapAdapter extends Adapter<MapAdapter.Hydrated> {
|
||||||
private boolean isValidKey(TypeMirror tm) {
|
private boolean isValidKey(TypeMirror tm) {
|
||||||
if (tm.toString().equals(String.class.getCanonicalName())) return true;
|
if (tm.toString().equals(String.class.getCanonicalName())) return true;
|
||||||
if (tm.toString().equals(UUID.class.getCanonicalName())) return true;
|
if (tm.toString().equals(UUID.class.getCanonicalName())) return true;
|
||||||
if (unbox(tm).kind.isPrimitive) return true;
|
if (unbox(tm).getKind().isPrimitive()) return true;
|
||||||
if (isEnum(tm)) return true;
|
if (isEnum(tm)) return true;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -78,8 +78,8 @@ public class MapAdapter extends Adapter<MapAdapter.Hydrated> {
|
||||||
else if (componentType1.toString().equals(UUID.class.getCanonicalName())) {
|
else if (componentType1.toString().equals(UUID.class.getCanonicalName())) {
|
||||||
kode.add("name == null ? null : $T.fromString(name)", UUID.class);
|
kode.add("name == null ? null : $T.fromString(name)", UUID.class);
|
||||||
}
|
}
|
||||||
else if (unbox(componentType1).kind.isPrimitive) {
|
else if (unbox(componentType1).getKind().isPrimitive()) {
|
||||||
kode.add("name == null ? null : " + switch (unbox(componentType1).kind) {
|
kode.add("name == null ? null : " + switch (unbox(componentType1).getKind()) {
|
||||||
case BOOLEAN -> "Boolean.parseBoolean(name)";
|
case BOOLEAN -> "Boolean.parseBoolean(name)";
|
||||||
case BYTE -> "Byte.parseByte(name)";
|
case BYTE -> "Byte.parseByte(name)";
|
||||||
case SHORT -> "Short.parseShort(name)";
|
case SHORT -> "Short.parseShort(name)";
|
||||||
|
@ -88,7 +88,7 @@ public class MapAdapter extends Adapter<MapAdapter.Hydrated> {
|
||||||
case CHAR -> "name.length() == 0 ? '\\0' : name.charAt(0)";
|
case CHAR -> "name.length() == 0 ? '\\0' : name.charAt(0)";
|
||||||
case FLOAT -> "Float.parseFloat(name)";
|
case FLOAT -> "Float.parseFloat(name)";
|
||||||
case DOUBLE -> "Double.parseDouble(name)";
|
case DOUBLE -> "Double.parseDouble(name)";
|
||||||
default -> throw new IllegalArgumentException("Unsupported primitive: " + unbox(componentType1).kind);
|
default -> throw new IllegalArgumentException("Unsupported primitive: " + unbox(componentType1).getKind());
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
else if (isEnum(componentType1)) {
|
else if (isEnum(componentType1)) {
|
||||||
|
@ -123,7 +123,7 @@ public class MapAdapter extends Adapter<MapAdapter.Hydrated> {
|
||||||
|
|
||||||
private boolean isEnum(TypeMirror tm) {
|
private boolean isEnum(TypeMirror tm) {
|
||||||
DeclaredType declared = TypeHelper.asDeclaredType(tm);
|
DeclaredType declared = TypeHelper.asDeclaredType(tm);
|
||||||
return declared != null && declared.asElement().kind == ElementKind.ENUM;
|
return declared != null && declared.asElement().getKind() == ElementKind.ENUM;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -144,7 +144,7 @@ public class MapAdapter extends Adapter<MapAdapter.Hydrated> {
|
||||||
.beginControlFlow("if (value$N == null)", argName)
|
.beginControlFlow("if (value$N == null)", argName)
|
||||||
.addStatement("if (writer.getSerializeNulls()) writer.nullValue()")
|
.addStatement("if (writer.getSerializeNulls()) writer.nullValue()")
|
||||||
.nextControlFlow("else");
|
.nextControlFlow("else");
|
||||||
generateWrite(code, componentType2, "value" + argName, componentType2.annotationMirrors, () -> code.add("value" + argName));
|
generateWrite(code, componentType2, "value" + argName, componentType2.getAnnotationMirrors(), () -> code.add("value" + argName));
|
||||||
code.endControlFlow().endControlFlow().endControlFlow().addStatement("writer.endObject()");
|
code.endControlFlow().endControlFlow().endControlFlow().addStatement("writer.endObject()");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -165,7 +165,7 @@ public class MapAdapter extends Adapter<MapAdapter.Hydrated> {
|
||||||
.add("map.put(");
|
.add("map.put(");
|
||||||
generateConvertKey(kode);
|
generateConvertKey(kode);
|
||||||
kode.add(", ");
|
kode.add(", ");
|
||||||
generateRead(kode, componentType2, argName, componentType2.annotationMirrors);
|
generateRead(kode, componentType2, argName, componentType2.getAnnotationMirrors());
|
||||||
kode.addStatement(")")
|
kode.addStatement(")")
|
||||||
.endControlFlow()
|
.endControlFlow()
|
||||||
.endControlFlow()
|
.endControlFlow()
|
||||||
|
|
|
@ -26,9 +26,9 @@ public class OtherSerializableAdapter extends AdapterAdapter<OtherSerializableAd
|
||||||
@Override
|
@Override
|
||||||
protected void afterHydrate() {
|
protected void afterHydrate() {
|
||||||
for (SerializableClass adapter : other) {
|
for (SerializableClass adapter : other) {
|
||||||
if (TypeName.get(adapter.classElement.asType()).equals(typeName)) {
|
if (TypeName.get(adapter.classElement().asType()).equals(typeName)) {
|
||||||
// Use self-made adapter
|
// Use self-made adapter
|
||||||
this.adapter = adapter.generatedClassName.toString();
|
this.adapter = adapter.generatedClassName().toString();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,7 +11,7 @@ public class PrimitiveAdapter extends Adapter<PrimitiveAdapter.Hydrated> {
|
||||||
public class Hydrated extends Adapter<Hydrated>.Hydrated {
|
public class Hydrated extends Adapter<Hydrated>.Hydrated {
|
||||||
@Override
|
@Override
|
||||||
public boolean applies() {
|
public boolean applies() {
|
||||||
return unboxedType.kind.isPrimitive;
|
return unboxedType.getKind().isPrimitive();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -23,7 +23,7 @@ public class PrimitiveAdapter extends Adapter<PrimitiveAdapter.Hydrated> {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void generateRead() {
|
public void generateRead() {
|
||||||
code.add(switch (unboxedType.kind) {
|
code.add(switch (unboxedType.getKind()) {
|
||||||
case BOOLEAN -> "reader.nextBoolean()";
|
case BOOLEAN -> "reader.nextBoolean()";
|
||||||
case BYTE -> "(byte) reader.nextInt()";
|
case BYTE -> "(byte) reader.nextInt()";
|
||||||
case SHORT -> "(short) reader.nextInt()";
|
case SHORT -> "(short) reader.nextInt()";
|
||||||
|
@ -32,7 +32,7 @@ public class PrimitiveAdapter extends Adapter<PrimitiveAdapter.Hydrated> {
|
||||||
case CHAR -> "(char) reader.nextInt()";
|
case CHAR -> "(char) reader.nextInt()";
|
||||||
case FLOAT -> "(float) reader.nextDouble()";
|
case FLOAT -> "(float) reader.nextDouble()";
|
||||||
case DOUBLE -> "reader.nextDouble()";
|
case DOUBLE -> "reader.nextDouble()";
|
||||||
default -> throw new IllegalArgumentException("Unsupported primitive: " + unboxedType.kind);
|
default -> throw new IllegalArgumentException("Unsupported primitive: " + unboxedType.getKind());
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -38,12 +38,12 @@ public abstract class GProcessor {
|
||||||
public abstract void generateSerialisation(TypeSpec.Builder spec, SerializableClass self, List<TypeVariableName> typeVariables, Set<SerializableClass> otherAdapters) throws ElementException;
|
public abstract void generateSerialisation(TypeSpec.Builder spec, SerializableClass self, List<TypeVariableName> typeVariables, Set<SerializableClass> otherAdapters) throws ElementException;
|
||||||
|
|
||||||
protected String getSerializedName(Property<?> property) {
|
protected String getSerializedName(Property<?> property) {
|
||||||
for (AnnotationMirror annotationMirror : property.annotations) {
|
for (AnnotationMirror annotationMirror : property.getAnnotations()) {
|
||||||
if (annotationMirror.annotationType.asElement().toString().equals(Cl.SERIALIZED_NAME.toString())) {
|
if (annotationMirror.getAnnotationType().asElement().toString().equals(Cl.SERIALIZED_NAME.toString())) {
|
||||||
return (String) annotationMirror.elementValues.values().iterator().next().value;
|
return (String) annotationMirror.getElementValues().values().iterator().next().getValue();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return property.name;
|
return property.getName();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected MethodSpec.Builder extension(MethodSpec.Builder method) {
|
protected MethodSpec.Builder extension(MethodSpec.Builder method) {
|
||||||
|
@ -64,9 +64,9 @@ public abstract class GProcessor {
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void generateComments(Property<?> prop, CodeBlock.Builder code) {
|
protected void generateComments(Property<?> prop, CodeBlock.Builder code) {
|
||||||
for (AnnotationMirror annotation : prop.annotations) {
|
for (AnnotationMirror annotation : prop.getAnnotations()) {
|
||||||
if (annotation.annotationType.asElement().toString().equals(Cl.GCOMMENT.toString())) {
|
if (annotation.getAnnotationType().asElement().toString().equals(Cl.GCOMMENT.toString())) {
|
||||||
String comment = (String) annotation.elementValues.values().iterator().next().value;
|
String comment = (String) annotation.getElementValues().values().iterator().next().getValue();
|
||||||
code.addStatement("if (writer.isLenient()) writer.comment($S)", comment);
|
code.addStatement("if (writer.isLenient()) writer.comment($S)", comment);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -31,7 +31,7 @@ public class InstanceProcessor extends GProcessor {
|
||||||
.addParameter(Cl.GSON_WRITER, "writer")
|
.addParameter(Cl.GSON_WRITER, "writer")
|
||||||
.addParameter(classType, "value")
|
.addParameter(classType, "value")
|
||||||
.addException(IOException.class)
|
.addException(IOException.class)
|
||||||
.addCode(generatedClassName.simpleName + ".write(value, writer);")
|
.addCode(generatedClassName.simpleName() + ".write(value, writer);")
|
||||||
.build())
|
.build())
|
||||||
.addMethod(MethodSpec.methodBuilder("read")
|
.addMethod(MethodSpec.methodBuilder("read")
|
||||||
.addAnnotation(Override.class)
|
.addAnnotation(Override.class)
|
||||||
|
@ -39,7 +39,7 @@ public class InstanceProcessor extends GProcessor {
|
||||||
.addParameter(Cl.GSON_READER, "reader")
|
.addParameter(Cl.GSON_READER, "reader")
|
||||||
.addException(IOException.class)
|
.addException(IOException.class)
|
||||||
.returns(classType)
|
.returns(classType)
|
||||||
.addCode("return " + generatedClassName.simpleName + ".read(reader);")
|
.addCode("return " + generatedClassName.simpleName() + ".read(reader);")
|
||||||
.build())
|
.build())
|
||||||
.build()
|
.build()
|
||||||
);
|
);
|
||||||
|
@ -52,9 +52,9 @@ public class InstanceProcessor extends GProcessor {
|
||||||
// !!!WARNING!!!
|
// !!!WARNING!!!
|
||||||
@Override
|
@Override
|
||||||
public void generateSerialisation(TypeSpec.Builder spec, SerializableClass self, List<TypeVariableName> typeVariables, Set<SerializableClass> otherAdapters) throws ElementException {
|
public void generateSerialisation(TypeSpec.Builder spec, SerializableClass self, List<TypeVariableName> typeVariables, Set<SerializableClass> otherAdapters) throws ElementException {
|
||||||
Value value = self.builder == null ? valueCreator.from(self.classElement, false) : valueCreator.from(TypeHelper.asDeclaredType(self.builder).asElement(), true);
|
Value value = self.builder() == null ? valueCreator.from(self.classElement(), false) : valueCreator.from(TypeHelper.asDeclaredType(self.builder()).asElement(), true);
|
||||||
ConstructionSource constructionSource = value.constructionSource;
|
ConstructionSource constructionSource = value.getConstructionSource();
|
||||||
Properties properties = value.properties;
|
Properties properties = value.getProperties();
|
||||||
|
|
||||||
// public static void write(JsonWriter writer, T value) throws IOException
|
// public static void write(JsonWriter writer, T value) throws IOException
|
||||||
{
|
{
|
||||||
|
@ -67,16 +67,16 @@ public class InstanceProcessor extends GProcessor {
|
||||||
code.addStatement("writer.beginObject()");
|
code.addStatement("writer.beginObject()");
|
||||||
for (Property.Field param : properties.fields) {
|
for (Property.Field param : properties.fields) {
|
||||||
if (Properties.containsName(properties.getters, param)) continue;
|
if (Properties.containsName(properties.getters, param)) continue;
|
||||||
Runnable writeGet = () -> code.add("value.$N", param.callableName);
|
Runnable writeGet = () -> code.add("value.$N", param.getCallableName());
|
||||||
if (param.type.kind.isPrimitive) {
|
if (param.getType().getKind().isPrimitive()) {
|
||||||
generateComments(param, code);
|
generateComments(param, code);
|
||||||
code.addStatement("writer.name($S)", getSerializedName(param));
|
code.addStatement("writer.name($S)", getSerializedName(param));
|
||||||
Adapters.generateWrite(param, spec, code, typeVariables, otherAdapters, message, writeGet);
|
Adapters.generateWrite(param, spec, code, typeVariables, otherAdapters, message, writeGet);
|
||||||
} else {
|
} else {
|
||||||
code.beginControlFlow("if (value.$N != null || writer.getSerializeNulls())", param.callableName);
|
code.beginControlFlow("if (value.$N != null || writer.getSerializeNulls())", param.getCallableName());
|
||||||
generateComments(param, code);
|
generateComments(param, code);
|
||||||
code.addStatement("writer.name($S)", getSerializedName(param));
|
code.addStatement("writer.name($S)", getSerializedName(param));
|
||||||
code.addStatement("if (value.$N == null) writer.nullValue()", param.callableName);
|
code.addStatement("if (value.$N == null) writer.nullValue()", param.getCallableName());
|
||||||
code.beginControlFlow("else");
|
code.beginControlFlow("else");
|
||||||
Adapters.generateWrite(param, spec, code, typeVariables, otherAdapters, message, writeGet);
|
Adapters.generateWrite(param, spec, code, typeVariables, otherAdapters, message, writeGet);
|
||||||
code.endControlFlow();
|
code.endControlFlow();
|
||||||
|
@ -84,25 +84,25 @@ public class InstanceProcessor extends GProcessor {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (Property.Getter param : properties.getters) {
|
for (Property.Getter param : properties.getters) {
|
||||||
if (param.type.kind.isPrimitive) {
|
if (param.getType().getKind().isPrimitive()) {
|
||||||
generateComments(param, code);
|
generateComments(param, code);
|
||||||
code.addStatement("writer.name($S)", getSerializedName(param));
|
code.addStatement("writer.name($S)", getSerializedName(param));
|
||||||
Adapters.generateWrite(param, spec, code, typeVariables, otherAdapters, message, () -> code.add("value.$N()", param.callableName));
|
Adapters.generateWrite(param, spec, code, typeVariables, otherAdapters, message, () -> code.add("value.$N()", param.getCallableName()));
|
||||||
} else {
|
} else {
|
||||||
code.addStatement("$T $L$N = value.$N()", param.type, "$", param.callableName, param.callableName);
|
code.addStatement("$T $L$N = value.$N()", param.getType(), "$", param.getCallableName(), param.getCallableName());
|
||||||
code.beginControlFlow("if ($L$N != null || writer.getSerializeNulls())", "$", param.callableName);
|
code.beginControlFlow("if ($L$N != null || writer.getSerializeNulls())", "$", param.getCallableName());
|
||||||
generateComments(param, code);
|
generateComments(param, code);
|
||||||
code.addStatement("writer.name($S)", getSerializedName(param));
|
code.addStatement("writer.name($S)", getSerializedName(param));
|
||||||
code.addStatement("if ($L$N == null) writer.nullValue()", "$", param.callableName);
|
code.addStatement("if ($L$N == null) writer.nullValue()", "$", param.getCallableName());
|
||||||
code.beginControlFlow("else");
|
code.beginControlFlow("else");
|
||||||
Adapters.generateWrite(param, spec, code, typeVariables, otherAdapters, message, () -> code.add("$L$N", "$", param.callableName));
|
Adapters.generateWrite(param, spec, code, typeVariables, otherAdapters, message, () -> code.add("$L$N", "$", param.getCallableName()));
|
||||||
code.endControlFlow();
|
code.endControlFlow();
|
||||||
code.endControlFlow();
|
code.endControlFlow();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
code.addStatement("writer.endObject()");
|
code.addStatement("writer.endObject()");
|
||||||
|
|
||||||
spec.addMethod(extension(MethodSpec.methodBuilder("write"), self.typeName)
|
spec.addMethod(extension(MethodSpec.methodBuilder("write"), self.getTypeName())
|
||||||
.addModifiers(Modifier.PUBLIC, Modifier.STATIC)
|
.addModifiers(Modifier.PUBLIC, Modifier.STATIC)
|
||||||
.addParameter(Cl.GSON_WRITER, "writer")
|
.addParameter(Cl.GSON_WRITER, "writer")
|
||||||
.addException(IOException.class)
|
.addException(IOException.class)
|
||||||
|
@ -121,7 +121,7 @@ public class InstanceProcessor extends GProcessor {
|
||||||
boolean isEmpty = true;
|
boolean isEmpty = true;
|
||||||
for (Property<?> param : properties.names) {
|
for (Property<?> param : properties.names) {
|
||||||
isEmpty = false;
|
isEmpty = false;
|
||||||
code.addStatement("$T _$N = $L", param.type, param.name, TypeHelper.getDefaultValue(param.type));
|
code.addStatement("$T _$N = $L", param.getType(), param.getName(), TypeHelper.getDefaultValue(param.getType()));
|
||||||
}
|
}
|
||||||
if (isEmpty) {
|
if (isEmpty) {
|
||||||
code.addStatement("reader.skipValue()");
|
code.addStatement("reader.skipValue()");
|
||||||
|
@ -130,16 +130,16 @@ public class InstanceProcessor extends GProcessor {
|
||||||
.beginControlFlow("while (reader.hasNext())")
|
.beginControlFlow("while (reader.hasNext())")
|
||||||
.beginControlFlow("switch (reader.nextName())");
|
.beginControlFlow("switch (reader.nextName())");
|
||||||
for (Property<?> param : properties.names) {
|
for (Property<?> param : properties.names) {
|
||||||
if (param.type.kind.isPrimitive) {
|
if (param.getType().getKind().isPrimitive()) {
|
||||||
code.add("case $S -> _$N = ", getSerializedName(param), param.name);
|
code.add("case $S -> _$N = ", getSerializedName(param), param.getName());
|
||||||
Adapters.generateRead(param, spec, code, typeVariables, otherAdapters, message);
|
Adapters.generateRead(param, spec, code, typeVariables, otherAdapters, message);
|
||||||
code.add(";\n");
|
code.add(";\n");
|
||||||
} else {
|
} else {
|
||||||
code.beginControlFlow("case $S ->", getSerializedName(param))
|
code.beginControlFlow("case $S ->", getSerializedName(param))
|
||||||
.beginControlFlow("if (reader.peek() == $T.NULL)", Cl.GSON_TOKEN)
|
.beginControlFlow("if (reader.peek() == $T.NULL)", Cl.GSON_TOKEN)
|
||||||
.addStatement("reader.nextNull()")
|
.addStatement("reader.nextNull()")
|
||||||
.addStatement("_$N = null", param.name);
|
.addStatement("_$N = null", param.getName());
|
||||||
code.unindent().add("} else _$N = ", param.name);
|
code.unindent().add("} else _$N = ", param.getName());
|
||||||
Adapters.generateRead(param, spec, code, typeVariables, otherAdapters, message);
|
Adapters.generateRead(param, spec, code, typeVariables, otherAdapters, message);
|
||||||
code.add(";\n")
|
code.add(";\n")
|
||||||
.endControlFlow();
|
.endControlFlow();
|
||||||
|
@ -153,48 +153,48 @@ public class InstanceProcessor extends GProcessor {
|
||||||
.addStatement("reader.endObject()");
|
.addStatement("reader.endObject()");
|
||||||
}
|
}
|
||||||
|
|
||||||
code.addStatement("$T result", self.typeName);
|
code.addStatement("$T result", self.getTypeName());
|
||||||
ClassName creatorName = ClassName.get((TypeElement) constructionSource.constructionElement.enclosingElement);
|
ClassName creatorName = ClassName.get((TypeElement) constructionSource.getConstructionElement().getEnclosingElement());
|
||||||
if (constructionSource instanceof ConstructionSource.Builder builder) {
|
if (constructionSource instanceof ConstructionSource.Builder builder) {
|
||||||
StringBuilder args = new StringBuilder();
|
StringBuilder args = new StringBuilder();
|
||||||
for (Property.ConstructorParam param : properties.constructorParams) {
|
for (Property.ConstructorParam param : properties.constructorParams) {
|
||||||
args.append(", _").append(param.name);
|
args.append(", _").append(param.getName());
|
||||||
}
|
}
|
||||||
code.add("$T builder = ", builder.builderClass);
|
code.add("$T builder = ", builder.getBuilderClass());
|
||||||
if (constructionSource.isConstructor) {
|
if (constructionSource.isConstructor()) {
|
||||||
code.add("new $T($L)", builder.builderClass, args.length() > 0 ? args.substring(2) : "");
|
code.add("new $T($L)", builder.getBuilderClass(), args.length() > 0 ? args.substring(2) : "");
|
||||||
} else {
|
} else {
|
||||||
code.add("$T.$N($L)", creatorName, self.classElement.simpleName, args.length() > 0 ? args.substring(2) : "");
|
code.add("$T.$N($L)", creatorName, self.classElement().getSimpleName(), args.length() > 0 ? args.substring(2) : "");
|
||||||
}
|
}
|
||||||
code.add(";\n");
|
code.add(";\n");
|
||||||
for (Property.Setter param : properties.builderParams) {
|
for (Property.Setter param : properties.builderParams) {
|
||||||
code.addStatement("builder.$N(_$N)", param.callableName, param.name);
|
code.addStatement("builder.$N(_$N)", param.getCallableName(), param.getName());
|
||||||
}
|
}
|
||||||
code.addStatement("result = builder.$N()", builder.buildMethod.simpleName);
|
code.addStatement("result = builder.$N()", builder.getBuildMethod().getSimpleName());
|
||||||
} else {
|
} else {
|
||||||
StringBuilder args = new StringBuilder();
|
StringBuilder args = new StringBuilder();
|
||||||
for (Property.Param param : properties.params) {
|
for (Property.Param param : properties.params) {
|
||||||
args.append(", _").append(param.name);
|
args.append(", _").append(param.getName());
|
||||||
}
|
}
|
||||||
if (constructionSource.isConstructor) {
|
if (constructionSource.isConstructor()) {
|
||||||
code.addStatement("result = new $T($L)", self.typeName, args.length() > 0 ? args.substring(2) : "");
|
code.addStatement("result = new $T($L)", self.getTypeName(), args.length() > 0 ? args.substring(2) : "");
|
||||||
} else {
|
} else {
|
||||||
code.addStatement("result = $T.$N($L)", creatorName, constructionSource.constructionElement.simpleName, args.length() > 0 ? args.substring(2) : "");
|
code.addStatement("result = $T.$N($L)", creatorName, constructionSource.getConstructionElement().getSimpleName(), args.length() > 0 ? args.substring(2) : "");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (Property.Setter setter : properties.setters) {
|
for (Property.Setter setter : properties.setters) {
|
||||||
code.addStatement("result.$N(_$N)", setter.callableName, setter.name);
|
code.addStatement("result.$N(_$N)", setter.getCallableName(), setter.getName());
|
||||||
}
|
}
|
||||||
for (Property.Field field : properties.fields) {
|
for (Property.Field field : properties.fields) {
|
||||||
if (Properties.containsName(properties.setters, field)) continue;
|
if (Properties.containsName(properties.setters, field)) continue;
|
||||||
if (Properties.containsName(properties.params, field)) continue;
|
if (Properties.containsName(properties.params, field)) continue;
|
||||||
code.addStatement("result.$N = _$N", field.name, field.callableName);
|
code.addStatement("result.$N = _$N", field.getName(), field.getCallableName());
|
||||||
}
|
}
|
||||||
code.addStatement("return result");
|
code.addStatement("return result");
|
||||||
|
|
||||||
spec.addMethod(extension(MethodSpec.methodBuilder("read"))
|
spec.addMethod(extension(MethodSpec.methodBuilder("read"))
|
||||||
.addModifiers(Modifier.PUBLIC, Modifier.STATIC)
|
.addModifiers(Modifier.PUBLIC, Modifier.STATIC)
|
||||||
.returns(self.typeName)
|
.returns(self.getTypeName())
|
||||||
.addParameter(Cl.GSON_READER, "reader")
|
.addParameter(Cl.GSON_READER, "reader")
|
||||||
.addException(IOException.class)
|
.addException(IOException.class)
|
||||||
.addCode(code.build())
|
.addCode(code.build())
|
||||||
|
|
|
@ -30,8 +30,8 @@ public class StaticProcessor extends GProcessor {
|
||||||
// !!!WARNING!!!
|
// !!!WARNING!!!
|
||||||
@Override
|
@Override
|
||||||
public void generateSerialisation(TypeSpec.Builder spec, SerializableClass self, List<TypeVariableName> typeVariables, Set<SerializableClass> otherAdapters) throws ElementException {
|
public void generateSerialisation(TypeSpec.Builder spec, SerializableClass self, List<TypeVariableName> typeVariables, Set<SerializableClass> otherAdapters) throws ElementException {
|
||||||
Value value = valueCreator.fromStatic(self.classElement);
|
Value value = valueCreator.fromStatic(self.classElement());
|
||||||
Properties properties = value.properties;
|
Properties properties = value.getProperties();
|
||||||
|
|
||||||
// public static void write(JsonWriter writer) throws IOException
|
// public static void write(JsonWriter writer) throws IOException
|
||||||
{
|
{
|
||||||
|
@ -39,16 +39,16 @@ public class StaticProcessor extends GProcessor {
|
||||||
code.addStatement("writer.beginObject()");
|
code.addStatement("writer.beginObject()");
|
||||||
for (Property.Field param : properties.fields) {
|
for (Property.Field param : properties.fields) {
|
||||||
if (Properties.containsName(properties.getters, param)) continue;
|
if (Properties.containsName(properties.getters, param)) continue;
|
||||||
Runnable writeGet = () -> code.add("$T.$N", self.typeName, param.callableName);
|
Runnable writeGet = () -> code.add("$T.$N", self.getTypeName(), param.getCallableName());
|
||||||
if (param.type.kind.isPrimitive) {
|
if (param.getType().getKind().isPrimitive()) {
|
||||||
generateComments(param, code);
|
generateComments(param, code);
|
||||||
code.addStatement("writer.name($S)", getSerializedName(param));
|
code.addStatement("writer.name($S)", getSerializedName(param));
|
||||||
Adapters.generateWrite(param, spec, code, typeVariables, otherAdapters, message, writeGet);
|
Adapters.generateWrite(param, spec, code, typeVariables, otherAdapters, message, writeGet);
|
||||||
} else {
|
} else {
|
||||||
code.beginControlFlow("if ($T.$N != null || writer.getSerializeNulls())", self.typeName, param.callableName);
|
code.beginControlFlow("if ($T.$N != null || writer.getSerializeNulls())", self.getTypeName(), param.getCallableName());
|
||||||
generateComments(param, code);
|
generateComments(param, code);
|
||||||
code.addStatement("writer.name($S)", getSerializedName(param));
|
code.addStatement("writer.name($S)", getSerializedName(param));
|
||||||
code.addStatement("if ($T.$N == null) writer.nullValue()", self.typeName, param.callableName);
|
code.addStatement("if ($T.$N == null) writer.nullValue()", self.getTypeName(), param.getCallableName());
|
||||||
code.beginControlFlow("else");
|
code.beginControlFlow("else");
|
||||||
Adapters.generateWrite(param, spec, code, typeVariables, otherAdapters, message, writeGet);
|
Adapters.generateWrite(param, spec, code, typeVariables, otherAdapters, message, writeGet);
|
||||||
code.endControlFlow();
|
code.endControlFlow();
|
||||||
|
@ -56,18 +56,18 @@ public class StaticProcessor extends GProcessor {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (Property.Getter param : properties.getters) {
|
for (Property.Getter param : properties.getters) {
|
||||||
if (param.type.kind.isPrimitive) {
|
if (param.getType().getKind().isPrimitive()) {
|
||||||
generateComments(param, code);
|
generateComments(param, code);
|
||||||
code.addStatement("writer.name($S)", getSerializedName(param));
|
code.addStatement("writer.name($S)", getSerializedName(param));
|
||||||
Adapters.generateWrite(param, spec, code, typeVariables, otherAdapters, message, () -> code.add("$T.$N()", self.typeName, param.callableName));
|
Adapters.generateWrite(param, spec, code, typeVariables, otherAdapters, message, () -> code.add("$T.$N()", self.getTypeName(), param.getCallableName()));
|
||||||
} else {
|
} else {
|
||||||
code.addStatement("$T $L$N = $T.$N()", param.type, "$", param.callableName, self.typeName, param.callableName);
|
code.addStatement("$T $L$N = $T.$N()", param.getType(), "$", param.getCallableName(), self.getTypeName(), param.getCallableName());
|
||||||
code.beginControlFlow("if ($L$N != null || writer.getSerializeNulls())", "$", param.callableName);
|
code.beginControlFlow("if ($L$N != null || writer.getSerializeNulls())", "$", param.getCallableName());
|
||||||
generateComments(param, code);
|
generateComments(param, code);
|
||||||
code.addStatement("writer.name($S)", getSerializedName(param));
|
code.addStatement("writer.name($S)", getSerializedName(param));
|
||||||
code.addStatement("if ($L$N == null) writer.nullValue()", "$", param.callableName);
|
code.addStatement("if ($L$N == null) writer.nullValue()", "$", param.getCallableName());
|
||||||
code.beginControlFlow("else");
|
code.beginControlFlow("else");
|
||||||
Adapters.generateWrite(param, spec, code, typeVariables, otherAdapters, message, () -> code.add("$L$N", "$", param.callableName));
|
Adapters.generateWrite(param, spec, code, typeVariables, otherAdapters, message, () -> code.add("$L$N", "$", param.getCallableName()));
|
||||||
code.endControlFlow();
|
code.endControlFlow();
|
||||||
code.endControlFlow();
|
code.endControlFlow();
|
||||||
}
|
}
|
||||||
|
@ -93,7 +93,7 @@ public class StaticProcessor extends GProcessor {
|
||||||
boolean isEmpty = true;
|
boolean isEmpty = true;
|
||||||
for (Property<?> param : properties.names) {
|
for (Property<?> param : properties.names) {
|
||||||
isEmpty = false;
|
isEmpty = false;
|
||||||
code.addStatement("$T.$N = $L", self.typeName, param.name, TypeHelper.getDefaultValue(param.type));
|
code.addStatement("$T.$N = $L", self.getTypeName(), param.getName(), TypeHelper.getDefaultValue(param.getType()));
|
||||||
}
|
}
|
||||||
if (isEmpty) {
|
if (isEmpty) {
|
||||||
code.addStatement("reader.skipValue()");
|
code.addStatement("reader.skipValue()");
|
||||||
|
@ -102,16 +102,16 @@ public class StaticProcessor extends GProcessor {
|
||||||
.beginControlFlow("while (reader.hasNext())")
|
.beginControlFlow("while (reader.hasNext())")
|
||||||
.beginControlFlow("switch (reader.nextName())");
|
.beginControlFlow("switch (reader.nextName())");
|
||||||
for (Property<?> param : properties.names) {
|
for (Property<?> param : properties.names) {
|
||||||
if (param.type.kind.isPrimitive) {
|
if (param.getType().getKind().isPrimitive()) {
|
||||||
code.add("case $S -> $T.$N = ", getSerializedName(param), self.typeName, param.name);
|
code.add("case $S -> $T.$N = ", getSerializedName(param), self.getTypeName(), param.getName());
|
||||||
Adapters.generateRead(param, spec, code, typeVariables, otherAdapters, message);
|
Adapters.generateRead(param, spec, code, typeVariables, otherAdapters, message);
|
||||||
code.add(";\n");
|
code.add(";\n");
|
||||||
} else {
|
} else {
|
||||||
code.beginControlFlow("case $S ->", getSerializedName(param))
|
code.beginControlFlow("case $S ->", getSerializedName(param))
|
||||||
.beginControlFlow("if (reader.peek() == $T.NULL)", Cl.GSON_TOKEN)
|
.beginControlFlow("if (reader.peek() == $T.NULL)", Cl.GSON_TOKEN)
|
||||||
.addStatement("reader.nextNull()")
|
.addStatement("reader.nextNull()")
|
||||||
.addStatement("$T.$N = null", self.typeName, param.name);
|
.addStatement("$T.$N = null", self.getTypeName(), param.getName());
|
||||||
code.unindent().add("} else $T.$N = ", self.typeName, param.name);
|
code.unindent().add("} else $T.$N = ", self.getTypeName(), param.getName());
|
||||||
Adapters.generateRead(param, spec, code, typeVariables, otherAdapters, message);
|
Adapters.generateRead(param, spec, code, typeVariables, otherAdapters, message);
|
||||||
code.add(";\n")
|
code.add(";\n")
|
||||||
.endControlFlow();
|
.endControlFlow();
|
||||||
|
|
|
@ -0,0 +1,8 @@
|
||||||
|
module io.gitlab.jfronny.gson.compile.processor {
|
||||||
|
requires com.squareup.javapoet;
|
||||||
|
requires java.compiler;
|
||||||
|
requires io.gitlab.jfronny.gson.compile.processor.core;
|
||||||
|
requires io.gitlab.jfronny.commons;
|
||||||
|
requires io.gitlab.jfronny.gson.compile.annotations;
|
||||||
|
requires static org.jetbrains.annotations;
|
||||||
|
}
|
Loading…
Reference in New Issue