Skip to content

Commit

Permalink
renaming annotation + reorganizing work
Browse files Browse the repository at this point in the history
Signed-off-by: mxtartaglia <maxi@swirldslabs.com>
  • Loading branch information
mxtartaglia-sl committed Apr 25, 2024
1 parent 34a1057 commit 5ab42b9
Show file tree
Hide file tree
Showing 4 changed files with 58 additions and 46 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -104,9 +104,9 @@ private void handleTypeElement(
final JavaFileObject constantsSourceFile =
getConstantSourceFile(packageName, simpleClassName, typeElement);
log("generating config constants file: " + constantsSourceFile.getName());
ConstantClassFactory.doWork(recordDefinitions.get(0), constantsSourceFile);
ConstantClassFactory.doWork(recordDefinitions.getFirst(), constantsSourceFile);
log("generating config doc file: " + configDocumentationFile.getFileName());
DocumentationFactory.doWork(recordDefinitions.get(0), configDocumentationFile);
DocumentationFactory.doWork(recordDefinitions.getFirst(), configDocumentationFile);
}
} catch (final Exception e) {
throw new RuntimeException("Error handling " + typeElement, e);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
import com.squareup.javapoet.FieldSpec;
import com.squareup.javapoet.JavaFile;
import com.squareup.javapoet.TypeSpec;
import com.swirlds.config.api.ConfigProperty;
import edu.umd.cs.findbugs.annotations.NonNull;
import java.io.IOException;
import java.io.Writer;
Expand All @@ -34,6 +35,12 @@
*/
public final class ConstantClassFactory {

/**
* Property name of:
* {@link ConfigProperty#defaultValue()}
*/
public static final String DEFAULT_VALUE = "defaultValue";

/**
* private constructor to prevent instantiation
*/
Expand Down Expand Up @@ -90,7 +97,8 @@ public static void doWork(
"Error processing record:"
+ configDataRecordDefinition.simpleClassName() + " field:"
+ propertyDefinition.fieldName() + " annotation value:\"" + propertyDefinition.name()
+ "\" cannot be used as a valid constant. Check if should be a defaultValue instead.",
+ "\" cannot be used as a valid constant name. Check if should be a " + DEFAULT_VALUE
+ " instead.",
e);
}
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,17 @@

public final class AntlrConfigRecordParser {

/**
* Property name for:
* {@link ConfigProperty#defaultValue()}
*/
private static final String DEFAULT_VALUE = "defaultValue";
/**
* Property name for:
* {@link ConfigProperty#value()}}
*/
private static final String VALUE = "value";

private static boolean isAnnotatedWith(
@NonNull final RecordDeclarationContext ctx,
@NonNull String packageName,
Expand Down Expand Up @@ -84,34 +95,41 @@ private static String getAnnotationPropertyOrElse(
}

@NonNull
private static ConfigDataPropertyDefinition createPropertyDefinition(
private static ConfigDataPropertyDefinition createDefinitionFromConfigProperty(
@NonNull final RecordComponentContext ctx,
@NonNull final String configPropertyNamePrefix,
@NonNull final String packageName,
@NonNull final List<String> imports,
@NonNull final Map<String, String> javadocParams,
@NonNull final Class<? extends Annotation> annotation,
@NonNull final String annotationNameProperty,
@NonNull final String annotationDefaultNameProperty,
@NonNull final String defaultValueIfPropertyIsNotSet) {
@NonNull final Map<String, String> javadocParams) {
final String componentName = ctx.identifier().getText();
final String configPropertyNameSuffix = getAnnotationPropertyOrElse(
ctx, packageName, imports, annotation, annotationNameProperty, componentName);
final String name = createPropertyName(configPropertyNamePrefix, configPropertyNameSuffix);
final String defaultValue = getAnnotationPropertyOrElse(
ctx, packageName, imports, annotation, annotationDefaultNameProperty, defaultValueIfPropertyIsNotSet);
final String type = Optional.ofNullable(ctx.typeType().classOrInterfaceType())
.map(RuleContext::getText)
.map(typeText -> imports.stream()
.filter(importText -> importText.endsWith(typeText))
.findAny()
.orElse(typeText))
.map(AntlrConfigRecordParser::getTypeForJavaLang)
.orElseGet(() -> ctx.typeType().primitiveType().getText());
final String description =
Optional.ofNullable(javadocParams.get(componentName)).orElse("");

return new ConfigDataPropertyDefinition(componentName, name, type, defaultValue, description);
String name = "not-yet-known";
try {
final String configPropertyNameSuffix =
getAnnotationPropertyOrElse(ctx, packageName, imports, ConfigProperty.class, VALUE, componentName);
name = createPropertyName(configPropertyNamePrefix, configPropertyNameSuffix);
final String defaultValue = getAnnotationPropertyOrElse(
ctx,
packageName,
imports,
ConfigProperty.class,
DEFAULT_VALUE,
ConfigProperty.UNDEFINED_DEFAULT_VALUE);
final String type = Optional.ofNullable(ctx.typeType().classOrInterfaceType())
.map(RuleContext::getText)
.map(typeText -> imports.stream()
.filter(importText -> importText.endsWith(typeText))
.findAny()
.orElse(typeText))
.map(AntlrConfigRecordParser::getTypeForJavaLang)
.orElseGet(() -> ctx.typeType().primitiveType().getText());
final String description =
Optional.ofNullable(javadocParams.get(componentName)).orElse("");

return new ConfigDataPropertyDefinition(componentName, name, type, defaultValue, description);
} catch (Exception e) {
throw new IllegalArgumentException(ConfigProperty.class.getTypeName() + " is not correctly defined for "
+ componentName + " property");
}
}

@NonNull
Expand Down Expand Up @@ -151,11 +169,9 @@ private static ConfigDataRecordDefinition createDefinition(
@NonNull final List<String> imports) {
final String recordName = recordContext.identifier().getText();

final Class<ConfigData> configDataAnnotation = ConfigData.class;
final Class<ConfigProperty> configPropertyAnnotation = ConfigProperty.class;
try {
final String configPropertyNamePrefix =
getAnnotationValue(recordContext, packageName, imports, configDataAnnotation);
getAnnotationValue(recordContext, packageName, imports, ConfigData.class);
final Map<String, String> javadocParams = unitContext.children.stream()
.filter(AntlrUtils::isJavaDocNode)
.map(ParseTree::getText)
Expand All @@ -167,26 +183,13 @@ private static ConfigDataRecordDefinition createDefinition(
.orElse(Map.of());
final Set<ConfigDataPropertyDefinition> propertyDefinitions =
recordContext.recordHeader().recordComponentList().recordComponent().stream()
.map(c -> createPropertyDefinition(
c,
configPropertyNamePrefix,
packageName,
imports,
javadocParams,
configPropertyAnnotation,
"value",
"defaultValue",
ConfigProperty.UNDEFINED_DEFAULT_VALUE))
.map(c -> createDefinitionFromConfigProperty(
c, configPropertyNamePrefix, packageName, imports, javadocParams))
.collect(Collectors.toSet());
return new ConfigDataRecordDefinition(
packageName, recordName, configPropertyNamePrefix, propertyDefinitions);
} catch (Exception e) {
throw new IllegalArgumentException(
"Could not process " + packageName + "."
+ recordName + " check that: " + configDataAnnotation.getTypeName()
+ " and all: " + configPropertyAnnotation.getTypeName()
+ " annotations are correctly defined for the type",
e);
throw new IllegalArgumentException("Could not process " + packageName + "." + recordName, e);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@
public final class AntlrUtils {

public static final String JAVADOC_PARAM = "param";
public static final String ANNOTATION_VALUE_PROPERTY_NAME = "value";

private AntlrUtils() {}

Expand Down Expand Up @@ -192,7 +193,7 @@ public static String getPackage(@NonNull final ParserRuleContext ctx) {
@NonNull
public static Optional<String> getAnnotationValue(
@NonNull final AnnotationContext annotationContext, @NonNull final String identifier) {
if ("value".equals(identifier)) {
if (ANNOTATION_VALUE_PROPERTY_NAME.equals(identifier)) {
final ElementValueContext elementValueContext = annotationContext.elementValue();
if (elementValueContext != null) {
return Optional.of(elementValueContext.getText()).map(text -> {
Expand Down

0 comments on commit 5ab42b9

Please sign in to comment.