You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by sr...@apache.org on 2021/10/22 16:59:52 UTC
[plc4x] 02/02: fix(plc4j/codgen): enum wip
This is an automated email from the ASF dual-hosted git repository.
sruehl pushed a commit to branch feature/mspec-ng
in repository https://gitbox.apache.org/repos/asf/plc4x.git
commit 5753d784f091e03de2b60cb05b84037567c3286b
Author: Sebastian Rühl <sr...@apache.org>
AuthorDate: Fri Oct 22 18:59:41 2021 +0200
fix(plc4j/codgen): enum wip
---
.../plc4x/language/java/JavaLanguageTemplateHelper.java | 6 +++++-
.../src/main/resources/templates/java/io-template.java.ftlh | 10 +++-------
.../plc4x/plugins/codegenerator/language/mspec/MSpec.g4 | 2 +-
.../language/mspec/model/fields/DefaultEnumField.java | 7 +++----
.../apache/plc4x/java/spi/codegen/fields/FieldReaderEnum.java | 11 ++++++++---
.../plc4x/java/spi/codegen/io/DataReaderEnumDefault.java | 3 +--
6 files changed, 21 insertions(+), 18 deletions(-)
diff --git a/code-generation/language-java/src/main/java/org/apache/plc4x/language/java/JavaLanguageTemplateHelper.java b/code-generation/language-java/src/main/java/org/apache/plc4x/language/java/JavaLanguageTemplateHelper.java
index cac5ea2..88b8a4a 100644
--- a/code-generation/language-java/src/main/java/org/apache/plc4x/language/java/JavaLanguageTemplateHelper.java
+++ b/code-generation/language-java/src/main/java/org/apache/plc4x/language/java/JavaLanguageTemplateHelper.java
@@ -367,10 +367,14 @@ public class JavaLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHe
}
public String getDataReaderCall(TypeReference typeReference) {
+ return getDataReaderCall(typeReference, "enumForValue");
+ }
+
+ public String getDataReaderCall(TypeReference typeReference, String resolverMethod) {
if (isEnumTypeReference(typeReference)) {
final String languageTypeName = getLanguageTypeNameForTypeReference(typeReference);
final SimpleTypeReference enumBaseTypeReference = getEnumBaseTypeReference(typeReference);
- return "new DataReaderEnumDefault<>(" + languageTypeName + "::enumForValue, " + getDataReaderCall(enumBaseTypeReference) + ")";
+ return "new DataReaderEnumDefault<>(" + languageTypeName + "::" + resolverMethod + ", " + getDataReaderCall(enumBaseTypeReference) + ")";
} else if (typeReference.isSimpleTypeReference()) {
SimpleTypeReference simpleTypeReference = typeReference.asSimpleTypeReference().orElseThrow(IllegalStateException::new);
return getDataReaderCall(simpleTypeReference);
diff --git a/code-generation/language-java/src/main/resources/templates/java/io-template.java.ftlh b/code-generation/language-java/src/main/resources/templates/java/io-template.java.ftlh
index af61334..2bab6b3 100644
--- a/code-generation/language-java/src/main/resources/templates/java/io-template.java.ftlh
+++ b/code-generation/language-java/src/main/resources/templates/java/io-template.java.ftlh
@@ -257,15 +257,11 @@ public class ${type.name}IO implements <#if outputFlavor != "passive">MessageIO<
<#-- TODO: Port this -->
<#case "enum">
<#assign enumField = field.asEnumField().orElseThrow()>
+ <#assign typedField = field.asTypedField().orElseThrow()>
+ <#assign namedField = field.asNamedField().orElseThrow()>
- readBuffer.pullContext("${enumField.name}");
// Enum field (${enumField.name})
- <#if enumField.fieldName.isPresent()>
- ${helper.getLanguageTypeNameForField(field)} ${enumField.name} = ${helper.getLanguageTypeNameForField(field)}.firstEnumForField${enumField.fieldName.orElseThrow()?cap_first}(${helper.getReadBufferReadMethodCall(helper.getTypeDefinitionForTypeReference(enumField.type).name, helper.getEnumBaseTypeReference(enumField.type), "", enumField)});
- <#else>
- ${helper.getLanguageTypeNameForField(field)} ${enumField.name} = ${helper.getLanguageTypeNameForField(field)}.enumForValue(${helper.getReadBufferReadMethodCall(helper.getTypeDefinitionForTypeReference(enumField.type).name, helper.getEnumBaseTypeReference(enumField.type), "", enumField)});
- </#if>
- readBuffer.closeContext("${enumField.name}");
+ ${helper.getLanguageTypeNameForField(field)} ${namedField.name} = read${field.typeName?cap_first}Field("${namedField.name}", "${helper.getTypeDefinitionForTypeReference(enumField.type).name}", ${helper.getDataReaderCall(helper.getEnumBaseTypeReference(enumField.type))});
<#break>
<#case "implicit">
<#assign implicitField = field.asImplicitField().orElseThrow()>
diff --git a/code-generation/protocol-base-mspec/src/main/antlr4/org/apache/plc4x/plugins/codegenerator/language/mspec/MSpec.g4 b/code-generation/protocol-base-mspec/src/main/antlr4/org/apache/plc4x/plugins/codegenerator/language/mspec/MSpec.g4
index 9ad01ec..2475013 100644
--- a/code-generation/protocol-base-mspec/src/main/antlr4/org/apache/plc4x/plugins/codegenerator/language/mspec/MSpec.g4
+++ b/code-generation/protocol-base-mspec/src/main/antlr4/org/apache/plc4x/plugins/codegenerator/language/mspec/MSpec.g4
@@ -86,7 +86,7 @@ discriminatorField
;
enumField
- : 'enum' type=typeReference name=idExpression (fieldName=idExpression)?
+ : 'enum' type=typeReference name=idExpression fieldName=idExpression
;
implicitField
diff --git a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultEnumField.java b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultEnumField.java
index 795a55b..019beb4 100644
--- a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultEnumField.java
+++ b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultEnumField.java
@@ -24,7 +24,6 @@ import org.apache.plc4x.plugins.codegenerator.types.terms.Term;
import java.util.Map;
import java.util.Objects;
-import java.util.Optional;
public class DefaultEnumField extends DefaultField implements EnumField {
@@ -36,7 +35,7 @@ public class DefaultEnumField extends DefaultField implements EnumField {
super(attributes);
this.type = Objects.requireNonNull(type);
this.name = Objects.requireNonNull(name);
- this.fieldName = fieldName;
+ this.fieldName = Objects.requireNonNull(fieldName);
}
public TypeReference getType() {
@@ -47,8 +46,8 @@ public class DefaultEnumField extends DefaultField implements EnumField {
return name;
}
- public Optional<String> getFieldName() {
- return Optional.ofNullable(fieldName);
+ public String getFieldName() {
+ return fieldName;
}
}
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldReaderEnum.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldReaderEnum.java
index 2225c30..8e61f71 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldReaderEnum.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldReaderEnum.java
@@ -18,9 +18,11 @@
*/
package org.apache.plc4x.java.spi.codegen.fields;
+import org.apache.commons.lang3.NotImplementedException;
import org.apache.plc4x.java.spi.codegen.io.DataReader;
import org.apache.plc4x.java.spi.generation.ParseException;
import org.apache.plc4x.java.spi.generation.WithReaderArgs;
+import org.apache.plc4x.java.spi.generation.WithReaderWriterArgs;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -30,11 +32,14 @@ public class FieldReaderEnum<T> implements FieldReader<T> {
@Override
public T readField(String logicalName, DataReader<T> dataReader, WithReaderArgs... readerArgs) throws ParseException {
- throw new IllegalStateException("not possible with checksum field");
+ throw new NotImplementedException();
}
- public T readField(String logicalName, DataReader<T> dataReader, String propertyName, WithReaderArgs... readerArgs) throws ParseException {
- return switchByteOrderIfNecessary(() -> dataReader.read(logicalName, readerArgs), dataReader, extractByteOder(readerArgs).orElse(null));
+ public T readField(String logicalName, String innerName, DataReader<T> dataReader, WithReaderArgs... readerArgs) throws ParseException {
+ dataReader.pullContext(logicalName, WithReaderWriterArgs.WithRenderAsList(true));
+ T result = switchByteOrderIfNecessary(() -> dataReader.read(innerName, readerArgs), dataReader, extractByteOder(readerArgs).orElse(null));
+ dataReader.closeContext(logicalName, WithReaderWriterArgs.WithRenderAsList(true));
+ return result;
}
}
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataReaderEnumDefault.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataReaderEnumDefault.java
index e3f758e..ce9b3cb 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataReaderEnumDefault.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataReaderEnumDefault.java
@@ -60,8 +60,7 @@ public class DataReaderEnumDefault<T, I> implements DataReaderEnum<T> {
}
public T read(String logicalName, Function<I, T> enumResolver, WithReaderArgs... readerArgs) throws ParseException {
- // TODO: ensure type safety
- I rawValue = (I) dataReader.read(logicalName, readerArgs);
+ I rawValue = dataReader.read(logicalName, readerArgs);
return enumResolver.apply(rawValue);
}