Refine inner class detection algorithm
Update the ConfigurationMetadataAnnotationProcessor nested class algorithm to prevent inner classes being added as both groups and properties. Fixes gh-1975
This commit is contained in:
parent
2a9a749329
commit
e56a1ba561
|
|
@ -175,8 +175,9 @@ public class ConfigurationMetadataAnnotationProcessor extends AbstractProcessor
|
|||
ExecutableElement getter = entry.getValue();
|
||||
ExecutableElement setter = members.getPublicSetters().get(name);
|
||||
VariableElement field = members.getFields().get(name);
|
||||
boolean isNested = getAnnotation(field,
|
||||
nestedConfigurationPropertyAnnotation()) != null;
|
||||
Element returnType = this.processingEnv.getTypeUtils().asElement(
|
||||
getter.getReturnType());
|
||||
boolean isNested = isNested(returnType, field, element);
|
||||
boolean isCollection = this.typeUtils.isCollectionOrMap(getter
|
||||
.getReturnType());
|
||||
if (!isNested && (setter != null || isCollection)) {
|
||||
|
|
@ -203,24 +204,27 @@ public class ConfigurationMetadataAnnotationProcessor extends AbstractProcessor
|
|||
getter.getReturnType());
|
||||
AnnotationMirror annotation = getAnnotation(getter,
|
||||
configurationPropertiesAnnotation());
|
||||
boolean isNested = getAnnotation(field,
|
||||
nestedConfigurationPropertyAnnotation()) != null;
|
||||
boolean isNested = isNested(returnType, field, element);
|
||||
if (returnType != null && returnType instanceof TypeElement
|
||||
&& annotation == null) {
|
||||
TypeElement returns = (TypeElement) returnType;
|
||||
if ((this.typeUtils.isEnclosedIn(returnType, element) && returnType
|
||||
.getKind() != ElementKind.ENUM) || isNested) {
|
||||
String nestedPrefix = ConfigurationMetadata
|
||||
.nestedPrefix(prefix, name);
|
||||
this.metadata.add(ItemMetadata.newGroup(nestedPrefix,
|
||||
this.typeUtils.getType(returns),
|
||||
this.typeUtils.getType(element), getter.toString()));
|
||||
processTypeElement(nestedPrefix, returns);
|
||||
}
|
||||
&& annotation == null && isNested) {
|
||||
String nestedPrefix = ConfigurationMetadata.nestedPrefix(prefix, name);
|
||||
this.metadata.add(ItemMetadata.newGroup(nestedPrefix,
|
||||
this.typeUtils.getType(returnType),
|
||||
this.typeUtils.getType(element), getter.toString()));
|
||||
processTypeElement(nestedPrefix, (TypeElement) returnType);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private boolean isNested(Element returnType, VariableElement field,
|
||||
TypeElement element) {
|
||||
if (getAnnotation(field, nestedConfigurationPropertyAnnotation()) != null) {
|
||||
return true;
|
||||
}
|
||||
return this.typeUtils.isEnclosedIn(returnType, element)
|
||||
&& returnType.getKind() != ElementKind.ENUM;
|
||||
}
|
||||
|
||||
private boolean hasDeprecateAnnotation(Element element) {
|
||||
return getAnnotation(element, "java.lang.Deprecated") != null;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -236,17 +236,14 @@ public class ConfigurationMetadataAnnotationProcessorTests {
|
|||
assertThat(metadata, containsProperty("config.first.name"));
|
||||
assertThat(metadata, containsProperty("config.first.bar.name"));
|
||||
assertThat(metadata,
|
||||
containsProperty("config.the-second", InnerClassProperties.Foo.class)
|
||||
containsGroup("config.the-second", InnerClassProperties.Foo.class)
|
||||
.fromSource(InnerClassProperties.class));
|
||||
assertThat(metadata, containsProperty("config.the-second.name"));
|
||||
assertThat(metadata, containsProperty("config.the-second.bar.name"));
|
||||
assertThat(metadata, containsGroup("config.third").ofType(SimplePojo.class)
|
||||
.fromSource(InnerClassProperties.class));
|
||||
assertThat(metadata, containsProperty("config.third.value"));
|
||||
assertThat(
|
||||
metadata,
|
||||
containsProperty("config.fourth").ofType(
|
||||
InnerClassProperties.Fourth.class));
|
||||
assertThat(metadata, containsProperty("config.fourth"));
|
||||
assertThat(metadata, not(containsGroup("config.fourth")));
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -119,10 +119,13 @@ public class ConfigurationMetadataMatchers {
|
|||
ConfigurationMetadata metadata = (ConfigurationMetadata) item;
|
||||
ItemMetadata property = getFirstPropertyWithName(metadata, this.name);
|
||||
if (property == null) {
|
||||
description.appendText("missing property " + this.name);
|
||||
description.appendText("missing "
|
||||
+ this.itemType.toString().toLowerCase() + " " + this.name);
|
||||
}
|
||||
else {
|
||||
description.appendText("was property ").appendValue(property);
|
||||
description.appendText(
|
||||
"was " + this.itemType.toString().toLowerCase() + " ")
|
||||
.appendValue(property);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue