@Override protected PropertyGenerator getPropertyGenerator(VariableElement field, DeclaredTypeName fieldType) { // We know it's an EnumProperty, so extract the type arg List<? extends TypeName> typeArgs = fieldType.getTypeArgs(); if (typeArgs != null && typeArgs.size() == 1 && typeArgs.get(0) instanceof DeclaredTypeName) { return new EnumPropertyGenerator(modelSpec, field, utils, (DeclaredTypeName) typeArgs.get(0)); } utils.getMessager().printMessage(Kind.WARNING, "EnumProperty must use a declared type argument; it cannot be raw or use a generic type argument", field); return null; } }
@Override protected PropertyGenerator getPropertyGenerator(VariableElement field, DeclaredTypeName fieldType) { // We know it's a JSONProperty, so extract the type arg List<? extends TypeName> typeArgs = fieldType.getTypeArgs(); if (typeArgs != null && typeArgs.size() == 1 && typeArgs.get(0) instanceof DeclaredTypeName) { return new JSONPropertyGenerator(modelSpec, field, (DeclaredTypeName) typeArgs.get(0), utils); } utils.getMessager().printMessage(Diagnostic.Kind.WARNING, "JSONProperty must use a declared type argument; it cannot be raw or use a generic type argument", field); return new JSONPropertyGenerator(modelSpec, field, fieldType, utils); } }
@Override protected void registerAdditionalImports(Set<DeclaredTypeName> imports) { super.registerAdditionalImports(imports); imports.add(JSONTypes.JSON_PROPERTY_SUPPORT); imports.add(JSONTypes.JSON_PROPERTY); if (!AptUtils.isEmpty(fieldType.getTypeArgs())) { imports.add(JSONTypes.PARAMETERIZED_TYPE_BUILDER); } fieldType.accept(new ImportGatheringTypeNameVisitor(), imports); }
private boolean recursivelyCheckTypes(VariableElement field, TypeName rootType, AtomicBoolean showedError) { if (!(rootType instanceof DeclaredTypeName)) { return false; } List<? extends TypeName> typeArgs = ((DeclaredTypeName) rootType).getTypeArgs(); if (AptUtils.isEmpty(typeArgs)) { return true; } for (TypeName typeArg : typeArgs) { if (!recursivelyCheckTypes(field, typeArg, showedError)) { if (!showedError.getAndSet(true)) { modelSpec.logError( "@JSONField fields with type arguments" + " must not use generic or otherwise non-concrete types", field); } return false; } } return true; }
private Expression getTypeExpression(DeclaredTypeName fieldType) { List<? extends TypeName> typeArgs = fieldType.getTypeArgs(); if (AptUtils.isEmpty(typeArgs)) { return Expressions.classObject(fieldType); } else { List<Expression> parameterizedTypeBuilderArgs = new ArrayList<>(); parameterizedTypeBuilderArgs.add(Expressions.classObject(fieldType)); for (TypeName typeArg : typeArgs) { // The cast to DeclaredTypeName is safe because we recursively check all type args before constructing // an instance of this property generator parameterizedTypeBuilderArgs.add(getTypeExpression((DeclaredTypeName) typeArg)); } return Expressions.staticMethod(JSONTypes.PARAMETERIZED_TYPE_BUILDER, "build", parameterizedTypeBuilderArgs); } }
@Override protected PropertyGenerator getPropertyGenerator(VariableElement field, DeclaredTypeName fieldType) { // We know it's an EnumProperty, so extract the type arg List<? extends TypeName> typeArgs = fieldType.getTypeArgs(); if (typeArgs != null && typeArgs.size() == 1 && typeArgs.get(0) instanceof DeclaredTypeName) { return new EnumPropertyGenerator(modelSpec, field, utils, (DeclaredTypeName) typeArgs.get(0)); } utils.getMessager().printMessage(Kind.WARNING, "EnumProperty must use a declared type argument; it cannot be raw or use a generic type argument", field); return null; } }