public class AllApis { private final List apis; private final Filer filer; private final Elements elements; public AllApis(List apis, Filer filer, Elements elements) { this.apis = apis; this.filer = filer; this.elements = elements; } public void generate() { TypeSpec.Builder classBuilder = TypeSpec.classBuilder("SynoApi").addModifiers(Modifier.PUBLIC); classBuilder.addField(FieldSpec.builder(TypeName.get(Retrofit.class), "retrofit", Modifier.PRIVATE, Modifier.FINAL).build()); classBuilder.addMethod(MethodSpec.constructorBuilder().addParameter(TypeName.get(Retrofit.class), "retrofit").addModifiers(Modifier.PUBLIC) .addStatement("this.$N = $N", "retrofit", "retrofit") .build()); for (InterfaceElement api : apis) { classBuilder.addField(createField(api)); classBuilder.addMethod(createMethod(api)); } saveGeneratedFile(classBuilder.build()); } private FieldSpec createField(InterfaceElement api) { return FieldSpec.builder(ClassName.bestGuess(api.IMPL_NAME), "m" + api.IMPL_NAME) .addModifiers(Modifier.PRIVATE) .build(); } private MethodSpec createMethod(InterfaceElement api) { MethodSpec.Builder builder = MethodSpec.methodBuilder(Character.toLowerCase(api.name.charAt(0)) + api.name.substring(1)) .addModifiers(Modifier.PUBLIC) .addStatement("if($N == null) $N = new $N(retrofit)", "m" + api.IMPL_NAME, "m" + api.IMPL_NAME, api.IMPL_NAME) .addStatement("return $N", "m" + api.IMPL_NAME) .returns(ClassName.bestGuess(api.IMPL_NAME)); return builder.build(); } private void saveGeneratedFile(TypeSpec typeSpec) { if (apis.isEmpty()) return; PackageElement pkg = elements.getPackageOf(apis.get(0).typeElement); String packageName = pkg.isUnnamed() ? null : pkg.getQualifiedName().toString(); try { JavaFile.builder(getPackageName(), typeSpec).build().writeTo(filer); } catch (IOException e) { e.printStackTrace(); } } private String getPackageName() { if (apis.isEmpty()) return null; PackageElement pkg = elements.getPackageOf(apis.get(0).typeElement); return pkg.isUnnamed() ? null : pkg.getQualifiedName().toString(); } }