From 09c81c6a2e10d1b36f25bfee1be534dbfe00dc31 Mon Sep 17 00:00:00 2001 From: rusefillc Date: Sat, 11 Dec 2021 04:42:56 -0500 Subject: [PATCH] generator refactoring --- java_tools/ConfigDefinition.jar | Bin 3572453 -> 3575191 bytes .../com/rusefi/output/DataLogConsumer.java | 32 ++------------- .../java/com/rusefi/output/GaugeConsumer.java | 25 ++---------- .../PerFieldWithStructuresIterator.java | 37 ++++++++++++++++++ 4 files changed, 44 insertions(+), 50 deletions(-) create mode 100644 java_tools/configuration_definition/src/main/java/com/rusefi/output/PerFieldWithStructuresIterator.java diff --git a/java_tools/ConfigDefinition.jar b/java_tools/ConfigDefinition.jar index 9617102ba59c8b4048ed973be59c211f09b5e0b3..0889fc0ea79010a7dfef3eeba064089f374e2764 100644 GIT binary patch delta 44379 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 delta 43190 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 diff --git a/java_tools/configuration_definition/src/main/java/com/rusefi/output/DataLogConsumer.java b/java_tools/configuration_definition/src/main/java/com/rusefi/output/DataLogConsumer.java index 734c94acd8..d9de403447 100644 --- a/java_tools/configuration_definition/src/main/java/com/rusefi/output/DataLogConsumer.java +++ b/java_tools/configuration_definition/src/main/java/com/rusefi/output/DataLogConsumer.java @@ -9,7 +9,6 @@ import org.jetbrains.annotations.NotNull; import java.io.CharArrayWriter; import java.io.FileWriter; import java.io.IOException; -import java.util.List; import java.util.TreeSet; import static com.rusefi.ConfigField.unquote; @@ -41,7 +40,8 @@ public class DataLogConsumer implements ConfigurationConsumer { @Override public void handleEndStruct(ConfigStructure structure) throws IOException { if (state.stack.isEmpty()) { - DataLogFieldIterator iterator = new DataLogFieldIterator(structure.tsFields, ""); + PerFieldWithStructuresIterator iterator = new PerFieldWithStructuresIterator(structure.tsFields, "", + this::handle); iterator.loop(); String content = iterator.sb.toString(); tsWriter.append(content); @@ -54,36 +54,10 @@ public class DataLogConsumer implements ConfigurationConsumer { } } - class DataLogFieldIterator extends FieldIterator { - private final String prefix; - StringBuilder sb = new StringBuilder(); - - public DataLogFieldIterator(List fields, String prefix) { - super(fields); - this.prefix = prefix; - } - - @Override - public void end() { - String content = handle(cf, prefix); - sb.append(content); - super.end(); - } - } - private String handle(ConfigField configField, String prefix) { if (configField.getName().contains("unused")) return ""; - ConfigStructure cs = configField.getState().structures.get(configField.getType()); - if (cs != null) { - String extraPrefix = cs.withPrefix ? configField.getName() + "_" : ""; - DataLogFieldIterator fieldIterator = new DataLogFieldIterator(cs.tsFields, extraPrefix); - fieldIterator.loop(); - return fieldIterator.sb.toString(); - } - - if (configField.isArray()) { return ""; @@ -114,7 +88,7 @@ public class DataLogConsumer implements ConfigurationConsumer { comment = (comments.length > 0) ? comments[0] : ""; if (comment.isEmpty()) - comment = prefix + unquote(configField.getName()); + comment = prefix + unquote(configField.getName()); if (comment.charAt(0) != '"') comment = quote(comment); diff --git a/java_tools/configuration_definition/src/main/java/com/rusefi/output/GaugeConsumer.java b/java_tools/configuration_definition/src/main/java/com/rusefi/output/GaugeConsumer.java index 3872fa9f3c..7f01f7f5f0 100644 --- a/java_tools/configuration_definition/src/main/java/com/rusefi/output/GaugeConsumer.java +++ b/java_tools/configuration_definition/src/main/java/com/rusefi/output/GaugeConsumer.java @@ -35,8 +35,10 @@ public class GaugeConsumer implements ConfigurationConsumer { @Override public void handleEndStruct(ConfigStructure structure) throws IOException { if (state.stack.isEmpty()) { - FieldIterator iterator = new FieldIterator(structure.tsFields); - String content = handleFields(structure, iterator, ""); + PerFieldWithStructuresIterator iterator = new PerFieldWithStructuresIterator(structure.tsFields, "", + this::handle); + iterator.loop(); + String content = iterator.sb.toString(); charArrayWriter.append(content); } @@ -47,26 +49,7 @@ public class GaugeConsumer implements ConfigurationConsumer { } } - private String handleFields(ConfigStructure structure, FieldIterator iterator, String prefix) { - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < structure.tsFields.size(); i++) { - iterator.start(i); - - String content = handle(iterator.cf, prefix); - sb.append(content); - iterator.end(); - - } - return sb.toString(); - } - private String handle(ConfigField configField, String prefix) { - ConfigStructure cs = configField.getState().structures.get(configField.getType()); - if (cs != null) { - String extraPrefix = cs.withPrefix ? configField.getName() + "_" : ""; - return handleFields(cs, new FieldIterator(cs.tsFields), extraPrefix); - } - String comment = getComment("", configField, state.variableRegistry); comment = ConfigField.unquote(comment); if (!prefix.isEmpty()) { diff --git a/java_tools/configuration_definition/src/main/java/com/rusefi/output/PerFieldWithStructuresIterator.java b/java_tools/configuration_definition/src/main/java/com/rusefi/output/PerFieldWithStructuresIterator.java new file mode 100644 index 0000000000..88389887e9 --- /dev/null +++ b/java_tools/configuration_definition/src/main/java/com/rusefi/output/PerFieldWithStructuresIterator.java @@ -0,0 +1,37 @@ +package com.rusefi.output; + +import com.rusefi.ConfigField; + +import java.util.List; + +class PerFieldWithStructuresIterator extends FieldIterator { + private final String prefix; + private final Strategy strategy; + StringBuilder sb = new StringBuilder(); + + public PerFieldWithStructuresIterator(List fields, String prefix, Strategy strategy) { + super(fields); + this.prefix = prefix; + this.strategy = strategy; + } + + @Override + public void end() { + ConfigStructure cs = cf.getState().structures.get(cf.getType()); + String content; + if (cs != null) { + String extraPrefix = cs.withPrefix ? cf.getName() + "_" : ""; + PerFieldWithStructuresIterator fieldIterator = new PerFieldWithStructuresIterator(cs.tsFields, extraPrefix, strategy); + fieldIterator.loop(); + content = fieldIterator.sb.toString(); + } else { + content = strategy.process(cf, prefix); + } + sb.append(content); + super.end(); + } + + interface Strategy { + String process(ConfigField configField, String prefix); + } +}