@Override public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) { Set<Element> elements = Sets.newLinkedHashSet(); for (TypeElement annotation : annotations) { elements.addAll(roundEnv.getElementsAnnotatedWith(annotation)); } for (Element element : elements) { TypeElement targetClass = (TypeElement) element; if (applicable(targetClass)) { generateClass(targetClass); } } return false; }
private void generateClass(TypeElement targetClass) { Map<String, ExecutableElement> propertiesMap = getProperties(targetClass); List<Property> properties = readProperties(propertiesMap); createValidator(simpleName, targetClassName, genericTypeNames, properties);
ImmutableMap<Property, FieldSpec> validators = createFields(properties); Set<TypeElement> validatorClasses = getValueFieldOfClasses(validatedBy).stream() .map(MoreTypes::asTypeElement) .collect(toImmutableSet()); typeName.rawType, type, getTypeIndexInArray(genericTypeNames, typeName.typeArguments.get(0))); } else if (genericTypeNames != null && getTypeIndexInArray(genericTypeNames, prop.type) >= 0) { constructor.addStatement("this.$N = $N.validator($N[$L])", field, inspector, type, getTypeIndexInArray(genericTypeNames, prop.type)); } else { constructor.addStatement("this.$N = $N.validator($L)", field, inspector, makeType(prop.type)); .addFields(validators.values()) .addMethod(constructor.build()) .addMethod(createValidationMethod(targetClassName, validators)); classBuilder.addMethod(createAdapterMethod(targetClassName));
private boolean applicable(TypeElement type) { boolean isSelfValidating = implementsSelfValidating(type); TypeName returnType = TypeName.get(rType); if (returnType.equals(validatorType)) { return checkSelfValidating(isSelfValidating, type); ParameterizedTypeName pTypeName = (ParameterizedTypeName) typeName; if (pTypeName.rawType.equals(argument)) { return checkSelfValidating(isSelfValidating, type);
@Test public void shouldIgnoreIfImplementsSelfValidating() { Compilation compilation = javac().withClasspathFrom(getClass().getClassLoader()) .withProcessors(new InspectorProcessor()) .compile(JavaFileObjects.forSourceLines("test.SelfValidatingFoo", "package test;\n"
ImmutableMap<Property, FieldSpec> validators = createFields(properties); Set<TypeElement> validatorClasses = getValueFieldOfClasses(validatedBy).stream() .map(MoreTypes::asTypeElement) .collect(toImmutableSet()); typeName.rawType, type, getTypeIndexInArray(genericTypeNames, typeName.typeArguments.get(0))); } else if (genericTypeNames != null && getTypeIndexInArray(genericTypeNames, prop.type) >= 0) { constructor.addStatement("this.$N = $N.validator($N[$L])", field, inspector, type, getTypeIndexInArray(genericTypeNames, prop.type)); } else { constructor.addStatement("this.$N = $N.validator($L)", field, inspector, makeType(prop.type)); .addFields(validators.values()) .addMethod(constructor.build()) .addMethod(createValidationMethod(targetClassName, validators)); classBuilder.addMethod(createAdapterMethod(targetClassName));
private boolean applicable(TypeElement type) { boolean isSelfValidating = implementsSelfValidating(type); TypeName returnType = TypeName.get(rType); if (returnType.equals(validatorType)) { return checkSelfValidating(isSelfValidating, type); ParameterizedTypeName pTypeName = (ParameterizedTypeName) typeName; if (pTypeName.rawType.equals(argument)) { return checkSelfValidating(isSelfValidating, type);
@Test public void test() { JavaFileObject person = JavaFileObjects.forResource("Person.java"); JavaFileObject dataValidator = JavaFileObjects.forResource("DateValidator.java"); assertAbout(javaSources()).that(Arrays.asList(person, dataValidator)) .withClasspathFrom(getClass().getClassLoader()) .processedWith(new InspectorProcessor()) .compilesWithoutError() .and() .generatesSources(JavaFileObjects.forResource("Validator_Person.java")); }
private void generateClass(TypeElement targetClass) { Map<String, ExecutableElement> propertiesMap = getProperties(targetClass); List<Property> properties = readProperties(propertiesMap); createValidator(simpleName, targetClassName, genericTypeNames, properties);
@Override public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) { Set<Element> elements = Sets.newLinkedHashSet(); for (TypeElement annotation : annotations) { elements.addAll(roundEnv.getElementsAnnotatedWith(annotation)); } for (Element element : elements) { TypeElement targetClass = (TypeElement) element; if (applicable(targetClass)) { generateClass(targetClass); } } return false; }
@Test public void smokeTest() { JavaFileObject factory = JavaFileObjects.forResource("MyFactory.java"); JavaFileObject person = JavaFileObjects.forResource("Person.java"); JavaFileObject person2 = JavaFileObjects.forResource("PersonTwo.java"); // Person 3 has no validator method, but that's a-ok! We should just ignore it JavaFileObject person3 = JavaFileObjects.forResource("PersonThree.java"); // Person 4 has a validator method with no args JavaFileObject person4 = JavaFileObjects.forResource("PersonFour.java"); // Person 5 is generic JavaFileObject person5 = JavaFileObjects.forResource("PersonFive.java"); assertAbout(javaSources()).that(asList(factory, person, person2, person3, person4, person5)) .withClasspathFrom(getClass().getClassLoader()) .processedWith(new InspectorProcessor(), new AutoValueProcessor(), new InspectorFactoryProcessor()) .compilesWithoutError() .and() .generatesSources(JavaFileObjects.forResource("InspectorFactory_MyFactory.java")); } }