in code-generation/types-base/src/main/java/org/apache/plc4x/plugins/codegenerator/types/definitions/ComplexTypeDefinition.java [400:451]
default Optional<TypeReference> getTypeReferenceForProperty(String propertyName) {
Objects.requireNonNull(propertyName);
// If this is a built-in type, use that.
if (BuiltIns.builtInFields.containsKey(propertyName)) {
return Optional.of(BuiltIns.builtInFields.get(propertyName));
}
// Check if the expression root is referencing a field
final Optional<PropertyField> propertyFieldOptional = getPropertyFields().stream()
.filter(propertyField -> propertyField.getName().equals(propertyName))
.findFirst();
if (propertyFieldOptional.isPresent()) {
return propertyFieldOptional.map(PropertyField::getType);
}
// Check if the expression is a ImplicitField
final Optional<ImplicitField> implicitFieldOptional = getFields().stream()
.filter(ImplicitField.class::isInstance)
.map(ImplicitField.class::cast)
.filter(implicitField -> implicitField.getName().equals(propertyName))
.findFirst();
if (implicitFieldOptional.isPresent()) {
return implicitFieldOptional.map(ImplicitField::getType);
}
// Check if the expression is a VirtualField
final Optional<VirtualField> virtualFieldOptional = getFields().stream()
.filter(VirtualField.class::isInstance)
.map(VirtualField.class::cast)
.filter(virtualField -> virtualField.getName().equals(propertyName))
.findFirst();
if (virtualFieldOptional.isPresent()) {
return virtualFieldOptional.map(VirtualField::getType);
}
// Check if the expression root is referencing an argument
final Optional<Argument> argumentOptional = getAllParserArguments()
.orElse(Collections.emptyList())
.stream()
.filter(argument -> argument.getName().equals(propertyName))
.findFirst();
if (argumentOptional.isPresent()) {
return argumentOptional.map(Argument::getType);
}
// Check if the expression is a DiscriminatorField
// This is a more theoretical case where the expression is referencing a discriminator value of the current type
final Optional<DiscriminatorField> discriminatorFieldOptional = getFields().stream()
.filter(DiscriminatorField.class::isInstance)
.map(DiscriminatorField.class::cast)
.filter(discriminatorField -> discriminatorField.getName().equals(propertyName))
.findFirst();
if (discriminatorFieldOptional.isPresent()) {
return discriminatorFieldOptional.map(DiscriminatorField::getType);
}
return Optional.empty();
}