From 6e909d44670534fda8147f9e610025daef0c4fc1 Mon Sep 17 00:00:00 2001 From: rusefillc Date: Sat, 23 Oct 2021 22:34:08 -0400 Subject: [PATCH] generate java enum from C enum? generate both C and java from yaml? #2102 --- .../java/com/rusefi/ConfigDefinition.java | 91 +++++------------- .../src/main/java/com/rusefi/ConfigField.java | 1 - .../src/main/java/com/rusefi/ReaderState.java | 22 ++--- .../rusefi/output/BaseCHeaderConsumer.java | 2 +- .../com/rusefi/output/CHeaderConsumer.java | 2 +- .../output/FileFsioSettingsConsumer.java | 5 +- .../rusefi/output/FileJavaFieldsConsumer.java | 11 ++- .../com/rusefi/output/JavaFieldsConsumer.java | 4 +- .../com/rusefi/output/SignatureConsumer.java | 5 +- .../com/rusefi/output/TSProjectConsumer.java | 22 ++--- .../com/rusefi/test/ConfigDefinitionTest.java | 3 +- .../rusefi/test/ConfigFieldParserTest.java | 2 +- java_tools/enum2string.jar | Bin 85493 -> 92545 bytes .../src/main/java/com/rusefi/EnumsReader.java | 4 +- .../main/java/com/rusefi/InvokeReader.java | 32 ++++-- .../src/main/java/com/rusefi/ToJavaEnum.java | 10 +- .../src/main/java/com/rusefi/ToolUtil.java | 51 ++++++++++ .../java/com/rusefi/VariableRegistry.java | 78 ++++++++++----- .../java/com/rusefi/enum_reader/Value.java | 11 +++ .../java/com/rusefi/EnumToStringTest.java | 29 +++++- 20 files changed, 232 insertions(+), 153 deletions(-) create mode 100644 java_tools/enum_to_string/src/main/java/com/rusefi/ToolUtil.java rename java_tools/{configuration_definition => enum_to_string}/src/main/java/com/rusefi/VariableRegistry.java (80%) diff --git a/java_tools/configuration_definition/src/main/java/com/rusefi/ConfigDefinition.java b/java_tools/configuration_definition/src/main/java/com/rusefi/ConfigDefinition.java index cd4d8fd202..fde6aaf1ef 100644 --- a/java_tools/configuration_definition/src/main/java/com/rusefi/ConfigDefinition.java +++ b/java_tools/configuration_definition/src/main/java/com/rusefi/ConfigDefinition.java @@ -29,11 +29,9 @@ import java.util.zip.CRC32; */ @SuppressWarnings("StringConcatenationInsideStringBufferAppend") public class ConfigDefinition { - public static final String EOL = "\n"; private static final String SIGNATURE_HASH = "SIGNATURE_HASH"; public static String MESSAGE; - public static String TOOL = "(unknown script)"; private static final String ROM_RAIDER_XML_TEMPLATE = "rusefi_template.xml"; public static final String KEY_DEFINITION = "-definition"; private static final String KEY_ROMRAIDER_INPUT = "-romraider"; @@ -66,10 +64,6 @@ public class ConfigDefinition { public static boolean needZeroInit = true; public static String definitionInputFile = null; - public static String getGeneratedAutomaticallyTag() { - return LazyFile.LAZY_FILE_TAG + "ConfigDefinition.jar based on " + TOOL + " "; - } - public static void main(String[] args) { try { doJob(args); @@ -127,7 +121,7 @@ public class ConfigDefinition { String key = args[i]; switch (key) { case "-tool": - ConfigDefinition.TOOL = args[i + 1]; + ToolUtil.TOOL = args[i + 1]; break; case KEY_DEFINITION: definitionInputFile = args[i + 1]; @@ -240,12 +234,12 @@ public class ConfigDefinition { handleFiringOrder(firingEnumFileName, state.variableRegistry); - MESSAGE = getGeneratedAutomaticallyTag() + definitionInputFile + " " + new Date(); + MESSAGE = ToolUtil.getGeneratedAutomaticallyTag() + definitionInputFile + " " + new Date(); SystemOut.println("Reading definition from " + definitionInputFile); for (String prependFile : prependFiles) - readPrependValues(state.variableRegistry, prependFile); + state.variableRegistry.readPrependValues(prependFile); if (yamlFiles != null) { processYamls(state.variableRegistry, yamlFiles, state); @@ -267,8 +261,8 @@ public class ConfigDefinition { parseState.setDefinitionPolicy(Definition.OverwritePolicy.IgnoreNew); //for (String prependFile : prependFiles) { - // TODO: fix signature define file parsing - //parseFile(listener, prependFile); + // TODO: fix signature define file parsing + //parseFile(listener, prependFile); //} } @@ -299,7 +293,7 @@ public class ConfigDefinition { VariableRegistry tmpRegistry = new VariableRegistry(); // store the CRC32 as a built-in variable tmpRegistry.register(SIGNATURE_HASH, "" + crc32); - readPrependValues(tmpRegistry, signaturePrependFile); + tmpRegistry.readPrependValues(signaturePrependFile); destinations.add(new SignatureConsumer(signatureDestination, tmpRegistry)); } if (needToUpdateOtherFiles) { @@ -329,7 +323,7 @@ public class ConfigDefinition { if (destCDefinesFileName != null && needToUpdateOtherFiles) - state.variableRegistry.writeDefinesToFile(destCDefinesFileName); + writeDefinesToFile(state.variableRegistry, destCDefinesFileName); if (romRaiderDestination != null && romRaiderInputFile != null && needToUpdateOtherFiles) { processTextTemplate(state, romRaiderInputFile, romRaiderDestination); @@ -376,22 +370,6 @@ public class ConfigDefinition { return needToUpdateTsFiles; } - public static void readPrependValues(VariableRegistry registry, String prependFile) throws IOException { - BufferedReader definitionReader = new BufferedReader(new FileReader(prependFile)); - String line; - while ((line = definitionReader.readLine()) != null) { - line = trimLine(line); - /** - * we should ignore empty lines and comments - */ - if (ReaderState.isEmptyDefinitionLine(line)) - continue; - if (startsWithToken(line, ReaderState.DEFINE)) { - processDefine(registry, line.substring(ReaderState.DEFINE.length()).trim()); - } - } - } - public static void processYamls(VariableRegistry registry, File[] yamlFiles, ReaderState state) throws IOException { ArrayList> listPins = new ArrayList<>(); for (File yamlFile : yamlFiles) { @@ -524,7 +502,7 @@ public class ConfigDefinition { SystemOut.println("Reading from " + inputFileName); SystemOut.println("Writing to " + outputFileName); - state.variableRegistry.put("generator_message", ConfigDefinition.getGeneratedAutomaticallyTag() + new Date()); + state.variableRegistry.put("generator_message", ToolUtil.getGeneratedAutomaticallyTag() + new Date()); File inputFile = new File(inputFileName); @@ -534,30 +512,19 @@ public class ConfigDefinition { String line; while ((line = fr.readLine()) != null) { line = state.variableRegistry.applyVariables(line); - fw.write(line + ConfigDefinition.EOL); + fw.write(line + ToolUtil.EOL); } fw.close(); } - static String trimLine(String line) { - line = line.trim(); - line = line.replaceAll("\\s+", " "); - return line; - } - - static boolean startsWithToken(String line, String token) { - return line.startsWith(token + " ") || line.startsWith(token + "\t"); - } - - public static String getComment(String comment, int currentOffset, String units) { String start = "\t/**"; String packedComment = packComment(comment, "\t"); - String unitsComment = units.isEmpty() ? "" : "\t" + units + EOL; - return start + EOL + + String unitsComment = units.isEmpty() ? "" : "\t" + units + ToolUtil.EOL; + return start + ToolUtil.EOL + packedComment + unitsComment + - "\t * offset " + currentOffset + EOL + "\t */" + EOL; + "\t * offset " + currentOffset + ToolUtil.EOL + "\t */" + ToolUtil.EOL; } public static String packComment(String comment, String linePrefix) { @@ -567,7 +534,7 @@ public class ConfigDefinition { return ""; String result = ""; for (String line : comment.split("\\\\n")) { - result += linePrefix + " * " + line + EOL; + result += linePrefix + " * " + line + ToolUtil.EOL; } return result; } @@ -579,28 +546,6 @@ public class ConfigDefinition { return Integer.parseInt(s); } - static void processDefine(VariableRegistry registry, String line) { - int index = line.indexOf(' '); - String name; - if (index == -1) { - name = line; - line = ""; - } else { - name = line.substring(0, index); - line = line.substring(index).trim(); - } - if (VariableRegistry.isNumeric(line)) { - int v = Integer.parseInt(line); - registry.register(name, v); - } else { - if (line.contains(" ") && !VariableRegistry.isQuoted(line, '\"') && !VariableRegistry.isQuoted(line, '\'')) { - throw new IllegalStateException("Unexpected space in unquoted " + line); - } - - registry.register(name, line); - } - } - private static long getCrc32(String fileName) throws IOException { File file = new File(fileName); byte[] fileContent = Files.readAllBytes(file.toPath()); @@ -614,6 +559,16 @@ public class ConfigDefinition { return c.getValue(); } + public static void writeDefinesToFile(VariableRegistry variableRegistry, String fileName) throws IOException { + + SystemOut.println("Writing to " + fileName); + LazyFile cHeader = new LazyFile(fileName); + + cHeader.write("//\n// " + ToolUtil.getGeneratedAutomaticallyTag() + definitionInputFile + "\n//\n\n"); + cHeader.write(variableRegistry.getDefinesSection()); + cHeader.close(); + } + public static class RusefiParseErrorStrategy extends DefaultErrorStrategy { private boolean hadError = false; diff --git a/java_tools/configuration_definition/src/main/java/com/rusefi/ConfigField.java b/java_tools/configuration_definition/src/main/java/com/rusefi/ConfigField.java index 497124f926..bfa3abb4e7 100644 --- a/java_tools/configuration_definition/src/main/java/com/rusefi/ConfigField.java +++ b/java_tools/configuration_definition/src/main/java/com/rusefi/ConfigField.java @@ -24,7 +24,6 @@ public class ConfigField { private static final Pattern DIRECTIVE = Pattern.compile("#(if\\s" + namePattern + "|else|elif\\s\" + namePattern + \"|endif)"); public static final char TS_COMMENT_TAG = '+'; - public static final String ENUM_SUFFIX = "_enum"; public static final String VOID_NAME = ""; public static final String BOOLEAN_T = "boolean"; public static final String DIRECTIVE_T = "directive"; diff --git a/java_tools/configuration_definition/src/main/java/com/rusefi/ReaderState.java b/java_tools/configuration_definition/src/main/java/com/rusefi/ReaderState.java index 3b5fe00372..83aabbab1e 100644 --- a/java_tools/configuration_definition/src/main/java/com/rusefi/ReaderState.java +++ b/java_tools/configuration_definition/src/main/java/com/rusefi/ReaderState.java @@ -21,13 +21,11 @@ import static com.rusefi.ConfigField.BOOLEAN_T; */ public class ReaderState { public static final String BIT = "bit"; - public static final String DEFINE = "#define"; private static final String CUSTOM = "custom"; private static final String END_STRUCT = "end_struct"; private static final String STRUCT_NO_PREFIX = "struct_no_prefix "; private static final String STRUCT = "struct "; private static final String DEFINE_CONSTRUCTOR = "define_constructor"; - public static final char MULT_TOKEN = '*'; public final Stack stack = new Stack<>(); public final Map tsCustomSize = new HashMap<>(); public final Map tsCustomLine = new HashMap<>(); @@ -61,14 +59,6 @@ public class ReaderState { structure.addBitField(bitField); } - static boolean isEmptyDefinitionLine(String line) { - /** - * historically somehow '!' was the start of comment line - * '//' is the later added alternative. - */ - return line.length() == 0 || line.startsWith("!") || line.startsWith("//"); - } - public void read(Reader reader) throws IOException { Map newEnums = EnumsReader.readStatic(reader); @@ -129,7 +119,7 @@ public class ReaderState { customSize = customSize.replaceAll("x", "*"); line = variableRegistry.applyVariables(line); - int multPosition = customSize.indexOf(MULT_TOKEN); + int multPosition = customSize.indexOf(VariableRegistry.MULT_TOKEN); if (multPosition != -1) { String firstPart = customSize.substring(0, multPosition).trim(); int first; @@ -169,11 +159,11 @@ public class ReaderState { String line; while ((line = definitionReader.readLine()) != null) { lineIndex++; - line = ConfigDefinition.trimLine(line); + line = ToolUtil.trimLine(line); /** * we should ignore empty lines and comments */ - if (isEmptyDefinitionLine(line)) + if (ToolUtil.isEmptyDefinitionLine(line)) continue; if (line.startsWith(STRUCT)) { @@ -186,15 +176,15 @@ public class ReaderState { } else if (line.startsWith(BIT)) { handleBitLine(this, line); - } else if (ConfigDefinition.startsWithToken(line, CUSTOM)) { + } else if (ToolUtil.startsWithToken(line, CUSTOM)) { handleCustomLine(line); - } else if (ConfigDefinition.startsWithToken(line, DEFINE)) { + } else if (ToolUtil.startsWithToken(line, VariableRegistry.DEFINE)) { /** * for example * #define CLT_CURVE_SIZE 16 */ - ConfigDefinition.processDefine(variableRegistry, line.substring(DEFINE.length()).trim()); + variableRegistry.processDefine(line.substring(VariableRegistry.DEFINE.length()).trim()); } else { if (stack.isEmpty()) throw new IllegalStateException("Expected to be within structure at line " + lineIndex + ": " + line); diff --git a/java_tools/configuration_definition/src/main/java/com/rusefi/output/BaseCHeaderConsumer.java b/java_tools/configuration_definition/src/main/java/com/rusefi/output/BaseCHeaderConsumer.java index db57b265e2..f630d76b22 100644 --- a/java_tools/configuration_definition/src/main/java/com/rusefi/output/BaseCHeaderConsumer.java +++ b/java_tools/configuration_definition/src/main/java/com/rusefi/output/BaseCHeaderConsumer.java @@ -2,7 +2,7 @@ package com.rusefi.output; import com.rusefi.*; -import static com.rusefi.ConfigDefinition.EOL; +import static com.rusefi.ToolUtil.EOL; public abstract class BaseCHeaderConsumer implements ConfigurationConsumer { private static final String BOOLEAN_TYPE = "bool"; diff --git a/java_tools/configuration_definition/src/main/java/com/rusefi/output/CHeaderConsumer.java b/java_tools/configuration_definition/src/main/java/com/rusefi/output/CHeaderConsumer.java index a70a7ccac7..044608f5f1 100644 --- a/java_tools/configuration_definition/src/main/java/com/rusefi/output/CHeaderConsumer.java +++ b/java_tools/configuration_definition/src/main/java/com/rusefi/output/CHeaderConsumer.java @@ -6,7 +6,7 @@ import com.rusefi.util.SystemOut; import java.io.IOException; -import static com.rusefi.ConfigDefinition.EOL; +import static com.rusefi.ToolUtil.EOL; /** * Configuration consumer which writes C header file diff --git a/java_tools/configuration_definition/src/main/java/com/rusefi/output/FileFsioSettingsConsumer.java b/java_tools/configuration_definition/src/main/java/com/rusefi/output/FileFsioSettingsConsumer.java index f06fc819d4..b1e45376b6 100644 --- a/java_tools/configuration_definition/src/main/java/com/rusefi/output/FileFsioSettingsConsumer.java +++ b/java_tools/configuration_definition/src/main/java/com/rusefi/output/FileFsioSettingsConsumer.java @@ -2,12 +2,13 @@ package com.rusefi.output; import com.rusefi.ConfigDefinition; import com.rusefi.ReaderState; +import com.rusefi.ToolUtil; import com.rusefi.util.LazyFile; import java.io.IOException; import java.util.Arrays; -import static com.rusefi.ConfigDefinition.EOL; +import static com.rusefi.ToolUtil.EOL; public class FileFsioSettingsConsumer extends FsioSettingsConsumer { private final LazyFile enumFile; @@ -30,7 +31,7 @@ public class FileFsioSettingsConsumer extends FsioSettingsConsumer { @Override public void startFile() { for (LazyFile file : Arrays.asList(enumFile, gettersFile, stringsFile, namesFile)) { - file.write("// this file " + ConfigDefinition.MESSAGE + ConfigDefinition.EOL + EOL); + file.write("// this file " + ConfigDefinition.MESSAGE + ToolUtil.EOL + EOL); file.write("// by " + getClass() + EOL); } } diff --git a/java_tools/configuration_definition/src/main/java/com/rusefi/output/FileJavaFieldsConsumer.java b/java_tools/configuration_definition/src/main/java/com/rusefi/output/FileJavaFieldsConsumer.java index 84207ce1aa..a471c39887 100644 --- a/java_tools/configuration_definition/src/main/java/com/rusefi/output/FileJavaFieldsConsumer.java +++ b/java_tools/configuration_definition/src/main/java/com/rusefi/output/FileJavaFieldsConsumer.java @@ -2,12 +2,13 @@ package com.rusefi.output; import com.rusefi.ConfigDefinition; import com.rusefi.ReaderState; +import com.rusefi.ToolUtil; import com.rusefi.util.LazyFile; import java.io.File; import java.io.IOException; -import static com.rusefi.ConfigDefinition.EOL; +import static com.rusefi.ToolUtil.EOL; /** * This class generates java representation of rusEfi data structures used by rusEfi console @@ -27,11 +28,11 @@ public class FileJavaFieldsConsumer extends JavaFieldsConsumer { @Override public void startFile() { - javaFields.write("package " + JAVA_PACKAGE + ";" + ConfigDefinition.EOL + ConfigDefinition.EOL); - javaFields.write("// this file " + ConfigDefinition.MESSAGE + ConfigDefinition.EOL + EOL); + javaFields.write("package " + JAVA_PACKAGE + ";" + ToolUtil.EOL + ToolUtil.EOL); + javaFields.write("// this file " + ConfigDefinition.MESSAGE + ToolUtil.EOL + EOL); javaFields.write("// by " + getClass() + EOL); javaFields.write("import com.rusefi.config.*;" + EOL + EOL); - javaFields.write("public class " + className + " {" + ConfigDefinition.EOL); + javaFields.write("public class " + className + " {" + ToolUtil.EOL); } @Override @@ -42,7 +43,7 @@ public class FileJavaFieldsConsumer extends JavaFieldsConsumer { allFields.append("\t};" + EOL); javaFields.write(allFields.toString()); - javaFields.write("}" + ConfigDefinition.EOL); + javaFields.write("}" + ToolUtil.EOL); javaFields.close(); } } diff --git a/java_tools/configuration_definition/src/main/java/com/rusefi/output/JavaFieldsConsumer.java b/java_tools/configuration_definition/src/main/java/com/rusefi/output/JavaFieldsConsumer.java index 1408f08e76..c280d2aee1 100644 --- a/java_tools/configuration_definition/src/main/java/com/rusefi/output/JavaFieldsConsumer.java +++ b/java_tools/configuration_definition/src/main/java/com/rusefi/output/JavaFieldsConsumer.java @@ -9,7 +9,7 @@ import java.util.HashSet; import java.util.List; import java.util.Set; -import static com.rusefi.ConfigDefinition.EOL; +import static com.rusefi.ToolUtil.EOL; public abstract class JavaFieldsConsumer implements ConfigurationConsumer { // todo: why is this field 'static'? @@ -74,7 +74,7 @@ public abstract class JavaFieldsConsumer implements ConfigurationConsumer { writeJavaFieldName(nameWithPrefix, tsPosition); javaFieldsWriter.write("FieldType.FLOAT);" + EOL); } else { - String enumOptions = state.variableRegistry.get(configField.getType() + ConfigField.ENUM_SUFFIX); + String enumOptions = state.variableRegistry.get(configField.getType() + VariableRegistry.ENUM_SUFFIX); if (enumOptions != null && !javaEnums.contains(configField.getType())) { javaEnums.add(configField.getType()); diff --git a/java_tools/configuration_definition/src/main/java/com/rusefi/output/SignatureConsumer.java b/java_tools/configuration_definition/src/main/java/com/rusefi/output/SignatureConsumer.java index e147fa428a..8c93858513 100644 --- a/java_tools/configuration_definition/src/main/java/com/rusefi/output/SignatureConsumer.java +++ b/java_tools/configuration_definition/src/main/java/com/rusefi/output/SignatureConsumer.java @@ -1,13 +1,10 @@ package com.rusefi.output; import com.rusefi.*; -import com.rusefi.util.LazyFile; import com.rusefi.util.SystemOut; import java.io.IOException; -import static com.rusefi.ConfigDefinition.EOL; - /** * Configuration consumer which writes Signature header file */ @@ -27,7 +24,7 @@ public class SignatureConsumer implements ConfigurationConsumer { @Override public void handleEndStruct(ConfigStructure structure) throws IOException { - registry.writeDefinesToFile(destHeader); + ConfigDefinition.writeDefinesToFile(registry, destHeader); } @Override diff --git a/java_tools/configuration_definition/src/main/java/com/rusefi/output/TSProjectConsumer.java b/java_tools/configuration_definition/src/main/java/com/rusefi/output/TSProjectConsumer.java index bb07059556..1501ac8059 100644 --- a/java_tools/configuration_definition/src/main/java/com/rusefi/output/TSProjectConsumer.java +++ b/java_tools/configuration_definition/src/main/java/com/rusefi/output/TSProjectConsumer.java @@ -9,7 +9,7 @@ import com.rusefi.util.SystemOut; import java.io.*; import static com.rusefi.util.IoUtils.CHARSET; -import static com.rusefi.ConfigDefinition.EOL; +import static com.rusefi.ToolUtil.EOL; public class TSProjectConsumer implements ConfigurationConsumer { private static final String TS_FILE_INPUT_NAME = "rusefi.input"; @@ -167,17 +167,17 @@ public class TSProjectConsumer implements ConfigurationConsumer { protected void writeContent(String fieldsSection, TsFileContent tsContent, Output tsHeader) throws IOException { tsHeader.write(tsContent.getPrefix()); - tsHeader.write("; " + CONFIG_DEFINITION_START + ConfigDefinition.EOL); - tsHeader.write("; this section " + ConfigDefinition.MESSAGE + ConfigDefinition.EOL + ConfigDefinition.EOL); - tsHeader.write("pageSize = " + totalTsSize + ConfigDefinition.EOL); - tsHeader.write("page = 1" + ConfigDefinition.EOL); + tsHeader.write("; " + CONFIG_DEFINITION_START + ToolUtil.EOL); + tsHeader.write("; this section " + ConfigDefinition.MESSAGE + ToolUtil.EOL + ToolUtil.EOL); + tsHeader.write("pageSize = " + totalTsSize + ToolUtil.EOL); + tsHeader.write("page = 1" + ToolUtil.EOL); tsHeader.write(fieldsSection); if (settingContextHelp.length() > 0) { - tsHeader.write("[" + SETTING_CONTEXT_HELP + "]" + ConfigDefinition.EOL); - tsHeader.write(settingContextHelp.toString() + ConfigDefinition.EOL + ConfigDefinition.EOL); - tsHeader.write("; " + SETTING_CONTEXT_HELP_END + ConfigDefinition.EOL); + tsHeader.write("[" + SETTING_CONTEXT_HELP + "]" + ToolUtil.EOL); + tsHeader.write(settingContextHelp.toString() + ToolUtil.EOL + ToolUtil.EOL); + tsHeader.write("; " + SETTING_CONTEXT_HELP_END + ToolUtil.EOL); } - tsHeader.write("; " + CONFIG_DEFINITION_END + ConfigDefinition.EOL); + tsHeader.write("; " + CONFIG_DEFINITION_END + ToolUtil.EOL); tsHeader.write(tsContent.getPostfix()); tsHeader.close(); } @@ -218,10 +218,10 @@ public class TSProjectConsumer implements ConfigurationConsumer { line = state.variableRegistry.applyVariables(line); if (isBeforeStartTag) - prefix.append(line + ConfigDefinition.EOL); + prefix.append(line + ToolUtil.EOL); if (isAfterEndTag) - postfix.append(state.variableRegistry.applyVariables(line) + ConfigDefinition.EOL); + postfix.append(state.variableRegistry.applyVariables(line) + ToolUtil.EOL); } r.close(); return new TsFileContent(prefix.toString(), postfix.toString()); diff --git a/java_tools/configuration_definition/src/main/java/com/rusefi/test/ConfigDefinitionTest.java b/java_tools/configuration_definition/src/main/java/com/rusefi/test/ConfigDefinitionTest.java index 5d7e0b2ab4..70801d1a6b 100644 --- a/java_tools/configuration_definition/src/main/java/com/rusefi/test/ConfigDefinitionTest.java +++ b/java_tools/configuration_definition/src/main/java/com/rusefi/test/ConfigDefinitionTest.java @@ -1,6 +1,5 @@ package com.rusefi.test; -import com.rusefi.ConfigDefinition; import com.rusefi.EnumsReader; import com.rusefi.VariableRegistry; import org.junit.Test; @@ -21,7 +20,7 @@ public class ConfigDefinitionTest { VariableRegistry variableRegistry = new VariableRegistry(); - ConfigDefinition.readPrependValues(variableRegistry, FIRMWARE + File.separator + "integration/rusefi_config.txt"); + variableRegistry.readPrependValues(FIRMWARE + File.separator + "integration/rusefi_config.txt"); String sb = variableRegistry.getEnumOptionsForTunerStudio(enumsReader, "engine_type_e"); diff --git a/java_tools/configuration_definition/src/main/java/com/rusefi/test/ConfigFieldParserTest.java b/java_tools/configuration_definition/src/main/java/com/rusefi/test/ConfigFieldParserTest.java index 4b5495f2ce..25f2ab9f4c 100644 --- a/java_tools/configuration_definition/src/main/java/com/rusefi/test/ConfigFieldParserTest.java +++ b/java_tools/configuration_definition/src/main/java/com/rusefi/test/ConfigFieldParserTest.java @@ -118,7 +118,7 @@ public class ConfigFieldParserTest { @Test(expected = IllegalStateException.class) public void invalidDefine() throws IOException { String test = "struct pid_s\n" + - ReaderState.DEFINE + " show show_Hellen121vag_presets true\n" + + VariableRegistry.DEFINE + " show show_Hellen121vag_presets true\n" + "end_struct\n" + ""; BufferedReader reader = new BufferedReader(new StringReader(test)); diff --git a/java_tools/enum2string.jar b/java_tools/enum2string.jar index dcfdc4708e7a6b8e3c9bada28c5608c03a3ead69..707a09704bceab352e901cd196b67239bd21f572 100644 GIT binary patch delta 14976 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 enums = new TreeMap<>(); @NotNull - static List getSortedByOrder(Map brain_pin_e) { - Set byOrdinal = new TreeSet<>(Comparator.comparingInt(Value::getIntValue)); + static List getSortedByOrder(VariableRegistry registry, Map brain_pin_e) { + Set byOrdinal = new TreeSet<>(Comparator.comparingInt(value -> value.getIntValueMaybeResolve(registry))); byOrdinal.addAll(brain_pin_e.values()); return new ArrayList<>(byOrdinal); } diff --git a/java_tools/enum_to_string/src/main/java/com/rusefi/InvokeReader.java b/java_tools/enum_to_string/src/main/java/com/rusefi/InvokeReader.java index 632d6b1d64..150bcf6112 100644 --- a/java_tools/enum_to_string/src/main/java/com/rusefi/InvokeReader.java +++ b/java_tools/enum_to_string/src/main/java/com/rusefi/InvokeReader.java @@ -11,10 +11,12 @@ class InvokeReader { private final static String KEY_INPUT_PATH = "-enumInputPath"; private final static String KEY_OUTPUT = "-outputPath"; private final static String KEY_OUTPUT_FILE = "-generatedFile"; + private static final String KEY_DEFINITION = "-definition"; public static String fileSuffix = "enums"; private String[] args; private String outputPath; + private List definitionInputFiles = new ArrayList<>(); private List inputFiles = new ArrayList<>(); private String inputPath = "."; @@ -34,6 +36,10 @@ class InvokeReader { return inputPath; } + public List getDefinitionInputFiles() { + return definitionInputFiles; + } + public String getOutputPath() { return outputPath; } @@ -46,15 +52,23 @@ class InvokeReader { outputPath = null; for (int i = 0; i < args.length - 1; i += 2) { String key = args[i]; - if (key.equals(KEY_INPUT_PATH)) { - inputPath = Objects.requireNonNull(args[i + 1], KEY_INPUT_PATH); - } else if (key.equals(EnumToString.KEY_ENUM_INPUT_FILE)) { - String headerInputFile = args[i + 1]; - inputFiles.add(headerInputFile); - } else if (key.equals(KEY_OUTPUT_FILE)) { - fileSuffix = args[i + 1]; - } else if (key.equals(KEY_OUTPUT)) { - outputPath = args[i + 1]; + switch (key) { + case KEY_DEFINITION: + definitionInputFiles.add(args[i + 1]); + break; + case KEY_INPUT_PATH: + inputPath = Objects.requireNonNull(args[i + 1], KEY_INPUT_PATH); + break; + case EnumToString.KEY_ENUM_INPUT_FILE: + String headerInputFile = args[i + 1]; + inputFiles.add(headerInputFile); + break; + case KEY_OUTPUT_FILE: + fileSuffix = args[i + 1]; + break; + case KEY_OUTPUT: + outputPath = args[i + 1]; + break; } } return this; diff --git a/java_tools/enum_to_string/src/main/java/com/rusefi/ToJavaEnum.java b/java_tools/enum_to_string/src/main/java/com/rusefi/ToJavaEnum.java index ade58e73dc..de76983fd2 100644 --- a/java_tools/enum_to_string/src/main/java/com/rusefi/ToJavaEnum.java +++ b/java_tools/enum_to_string/src/main/java/com/rusefi/ToJavaEnum.java @@ -18,6 +18,10 @@ public class ToJavaEnum { EnumsReader enumsReader = new EnumsReader(); + VariableRegistry registry = new VariableRegistry(); + for (String fileName : invokeReader.getDefinitionInputFiles()) + registry.readPrependValues(fileName); + for (String inputFile : invokeReader.getInputFiles()) { File f = new File(invokeReader.getInputPath() + File.separator + inputFile); SystemOut.println("Reading enums from " + f); @@ -26,7 +30,7 @@ public class ToJavaEnum { } for (Map.Entry e : enumsReader.getEnums().entrySet()) { - String java = generate(e.getKey(), e.getValue()); + String java = generate(registry, e.getKey(), e.getValue()); String fullFileName = outputPath + File.separator + e.getKey() + ".java"; BufferedWriter br = new BufferedWriter(new FileWriter(fullFileName)); @@ -35,12 +39,12 @@ public class ToJavaEnum { } } - public static String generate(String key, EnumsReader.EnumState enumState) { + public static String generate(VariableRegistry registry, String key, EnumsReader.EnumState enumState) { StringBuilder sb = new StringBuilder("package com.rusefi.enums;\n"); sb.append("//auto-generated by ToJavaEnum.java\n\n\n\n"); sb.append("public enum " + key + " {\n"); - List sorted = EnumsReader.getSortedByOrder(enumState.values); + List sorted = EnumsReader.getSortedByOrder(registry, enumState.values); for (Value value : sorted) { sb.append("\t" + value.getName() + ",\n"); diff --git a/java_tools/enum_to_string/src/main/java/com/rusefi/ToolUtil.java b/java_tools/enum_to_string/src/main/java/com/rusefi/ToolUtil.java new file mode 100644 index 0000000000..c74752a112 --- /dev/null +++ b/java_tools/enum_to_string/src/main/java/com/rusefi/ToolUtil.java @@ -0,0 +1,51 @@ +package com.rusefi; + +import com.rusefi.util.LazyFile; + +import java.net.URISyntaxException; + +public class ToolUtil { + public static final String EOL = "\n"; + public static String TOOL = "(unknown script)"; + + static String getJarFileName() { + try { + + // Get path of the JAR file + String jarPath = VariableRegistry.class + .getProtectionDomain() + .getCodeSource() + .getLocation() + .toURI() + .getPath(); + System.out.println("JAR Path : " + jarPath); + + // Get name of the JAR file + return jarPath.substring(jarPath.lastIndexOf("/") + 1); + } catch (URISyntaxException e) { + return "(unknown jar)"; + } + } + + public static String getGeneratedAutomaticallyTag() { + return LazyFile.LAZY_FILE_TAG + getJarFileName() + " based on " + TOOL + " "; + } + + static boolean isEmptyDefinitionLine(String line) { + /** + * historically somehow '!' was the start of comment line + * '//' is the later added alternative. + */ + return line.length() == 0 || line.startsWith("!") || line.startsWith("//"); + } + + static boolean startsWithToken(String line, String token) { + return line.startsWith(token + " ") || line.startsWith(token + "\t"); + } + + static String trimLine(String line) { + line = line.trim(); + line = line.replaceAll("\\s+", " "); + return line; + } +} diff --git a/java_tools/configuration_definition/src/main/java/com/rusefi/VariableRegistry.java b/java_tools/enum_to_string/src/main/java/com/rusefi/VariableRegistry.java similarity index 80% rename from java_tools/configuration_definition/src/main/java/com/rusefi/VariableRegistry.java rename to java_tools/enum_to_string/src/main/java/com/rusefi/VariableRegistry.java index f7daeb6ec5..4ed6cdcf0d 100644 --- a/java_tools/configuration_definition/src/main/java/com/rusefi/VariableRegistry.java +++ b/java_tools/enum_to_string/src/main/java/com/rusefi/VariableRegistry.java @@ -1,18 +1,19 @@ package com.rusefi; import com.rusefi.enum_reader.Value; -import com.rusefi.util.LazyFile; import com.rusefi.util.SystemOut; import org.jetbrains.annotations.Nullable; +import java.io.BufferedReader; +import java.io.FileReader; import java.io.IOException; -import java.util.*; +import java.io.Reader; +import java.util.HashMap; +import java.util.Map; +import java.util.TreeMap; import java.util.regex.Matcher; import java.util.regex.Pattern; -import static com.rusefi.ConfigDefinition.EOL; -import static com.rusefi.ReaderState.MULT_TOKEN; - /** * 3/30/2015 */ @@ -20,9 +21,11 @@ public class VariableRegistry { public static final String _16_HEX_SUFFIX = "_16_hex"; public static final String _HEX_SUFFIX = "_hex"; public static final String CHAR_SUFFIX = "_char"; + public static final String ENUM_SUFFIX = "_enum"; + public static final char MULT_TOKEN = '*'; + public static final String DEFINE = "#define"; private static final String HEX_PREFIX = "0x"; private final TreeMap data = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); - public static final VariableRegistry INSTANCE = new VariableRegistry(); // todo: smarter regex! See TsWriter.VAR which is a bit better but still not perfect // todo: https://github.com/rusefi/rusefi/issues/3053 ? @@ -33,7 +36,46 @@ public class VariableRegistry { private final Map cAllDefinitions = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); private final Map javaDefinitions = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); - public VariableRegistry() { + public void readPrependValues(String prependFile) throws IOException { + readPrependValues(new FileReader(prependFile)); + } + + public void readPrependValues(Reader fileReader) throws IOException { + BufferedReader definitionReader = new BufferedReader(fileReader); + String line; + while ((line = definitionReader.readLine()) != null) { + line = ToolUtil.trimLine(line); + /** + * we should ignore empty lines and comments + */ + if (ToolUtil.isEmptyDefinitionLine(line)) + continue; + if (ToolUtil.startsWithToken(line, DEFINE)) { + processDefine(line.substring(DEFINE.length()).trim()); + } + } + } + + void processDefine(String line) { + int index = line.indexOf(' '); + String name; + if (index == -1) { + name = line; + line = ""; + } else { + name = line.substring(0, index); + line = line.substring(index).trim(); + } + if (isNumeric(line)) { + int v = Integer.parseInt(line); + register(name, v); + } else { + if (line.contains(" ") && !isQuoted(line, '\"') && !isQuoted(line, '\'')) { + throw new IllegalStateException("Unexpected space in unquoted " + line); + } + + register(name, line); + } } /** @@ -129,7 +171,7 @@ public class VariableRegistry { if (!value.contains("\n")) { // multi-lines are not supported in C headers if (!var.endsWith(_16_HEX_SUFFIX) && !var.endsWith(_HEX_SUFFIX)) { - cAllDefinitions.put(var, "#define " + var + " " + value + EOL); + cAllDefinitions.put(var, "#define " + var + " " + value + ToolUtil.EOL); } } return value; @@ -149,7 +191,7 @@ public class VariableRegistry { if (value.trim().startsWith(HEX_PREFIX)) { int intValue = Integer.parseInt(value.trim().substring(HEX_PREFIX.length()), 16); intValues.put(var, intValue); - javaDefinitions.put(var, "\tpublic static final int " + var + " = " + value + ";" + EOL); + javaDefinitions.put(var, "\tpublic static final int " + var + " = " + value + ";" + ToolUtil.EOL); return; } @@ -158,18 +200,18 @@ public class VariableRegistry { SystemOut.println("key [" + var + "] value: " + intValue); intValues.put(var, intValue); if (!var.endsWith(_HEX_SUFFIX)) { - javaDefinitions.put(var, "\tpublic static final int " + var + " = " + intValue + ";" + EOL); + javaDefinitions.put(var, "\tpublic static final int " + var + " = " + intValue + ";" + ToolUtil.EOL); } } catch (NumberFormatException e) { SystemOut.println("Not an integer: " + value); - if (!var.trim().endsWith(ConfigField.ENUM_SUFFIX)) { + if (!var.trim().endsWith(ENUM_SUFFIX)) { if (isQuoted(value, '"')) { // quoted and not with enum suffix means plain string define statement - javaDefinitions.put(var, "\tpublic static final String " + var + " = " + value + ";" + EOL); + javaDefinitions.put(var, "\tpublic static final String " + var + " = " + value + ";" + ToolUtil.EOL); } else if (isQuoted(value, '\'')) { // quoted and not with enum suffix means plain string define statement - javaDefinitions.put(var, "\tpublic static final char " + var + " = " + value + ";" + EOL); + javaDefinitions.put(var, "\tpublic static final char " + var + " = " + value + ";" + ToolUtil.EOL); char charValue = value.charAt(1); registerHex(var + CHAR_SUFFIX, charValue); doRegister(var + CHAR_SUFFIX, Character.toString(charValue)); @@ -205,16 +247,6 @@ public class VariableRegistry { register(name + _16_HEX_SUFFIX, _16_hex); } - public void writeDefinesToFile(String fileName) throws IOException { - - SystemOut.println("Writing to " + fileName); - LazyFile cHeader = new LazyFile(fileName); - - cHeader.write("//\n// " + ConfigDefinition.getGeneratedAutomaticallyTag() + ConfigDefinition.definitionInputFile + "\n//\n\n"); - cHeader.write(getDefinesSection()); - cHeader.close(); - } - public String getDefinesSection() { StringBuilder sb = new StringBuilder(); for (String value : cAllDefinitions.values()) diff --git a/java_tools/enum_to_string/src/main/java/com/rusefi/enum_reader/Value.java b/java_tools/enum_to_string/src/main/java/com/rusefi/enum_reader/Value.java index 71d94ec271..4abf77409b 100644 --- a/java_tools/enum_to_string/src/main/java/com/rusefi/enum_reader/Value.java +++ b/java_tools/enum_to_string/src/main/java/com/rusefi/enum_reader/Value.java @@ -1,5 +1,7 @@ package com.rusefi.enum_reader; +import com.rusefi.VariableRegistry; + public class Value implements Comparable { private final String name; private final String value; @@ -33,4 +35,13 @@ public class Value implements Comparable { ", value='" + value + '\'' + '}'; } + + public int getIntValueMaybeResolve(VariableRegistry registry) { + try { + return getIntValue(); + } catch (NumberFormatException e) { + String resolvedValue = registry.get(value); + return Integer.parseInt(resolvedValue); + } + } } diff --git a/java_tools/enum_to_string/src/test/java/com/rusefi/EnumToStringTest.java b/java_tools/enum_to_string/src/test/java/com/rusefi/EnumToStringTest.java index 9b890872c3..b2410b5433 100644 --- a/java_tools/enum_to_string/src/test/java/com/rusefi/EnumToStringTest.java +++ b/java_tools/enum_to_string/src/test/java/com/rusefi/EnumToStringTest.java @@ -118,12 +118,13 @@ public class EnumToStringTest { EnumsReader.EnumState brain_pin_e = enumsReader.getEnums().get("brain_pin_e"); assertEquals(2, brain_pin_e.values.get("GPIO_HEX").getIntValue()); - List listByOrdinal = EnumsReader.getSortedByOrder(brain_pin_e.values); + VariableRegistry registry = new VariableRegistry(); + List listByOrdinal = EnumsReader.getSortedByOrder(registry, brain_pin_e.values); assertEquals(0, listByOrdinal.get(0).getIntValue()); for (Map.Entry e : enumsReader.getEnums().entrySet()) { - String a = new ToJavaEnum().generate(e.getKey(), e.getValue()); + String a = ToJavaEnum.generate(registry, e.getKey(), e.getValue()); assertEquals("package com.rusefi.enums;\n" + "//auto-generated by ToJavaEnum.java\n" + @@ -178,4 +179,28 @@ public class EnumToStringTest { " return NULL;\n" + "}\n", enumToString.getCppFileContent()); } + + @Test + public void testWithInput() throws IOException { + final StringReader reader = new StringReader( + "typedef enum {\n" + + "\tGPIO_UNASSIGNED = XXXX,\n" + + "}brain_pin_e; // hello"); + + VariableRegistry registry = new VariableRegistry(); + registry.readPrependValues(new StringReader("#define XXXX 12")); + + EnumsReader enumsReader = new EnumsReader().read(reader); + for (Map.Entry e : enumsReader.getEnums().entrySet()) { + String java = ToJavaEnum.generate(registry, e.getKey(), e.getValue()); + assertEquals("package com.rusefi.enums;\n" + + "//auto-generated by ToJavaEnum.java\n" + + "\n" + + "\n" + + "\n" + + "public enum brain_pin_e {\n" + + "\tGPIO_UNASSIGNED,\n" + + "}\n", java); + } + } }