rusefi/java_tools/configuration_definition_base/src/main/java/com/rusefi/output/JavaFieldsConsumer.java

129 lines
5.3 KiB
Java
Raw Normal View History

2019-05-18 14:10:28 -07:00
package com.rusefi.output;
2020-07-18 16:12:47 -07:00
import com.opensr5.ini.IniFileModel;
2019-05-18 14:10:28 -07:00
import com.rusefi.*;
import com.rusefi.parse.TypesHelper;
2019-05-18 14:10:28 -07:00
2019-09-08 19:46:47 -07:00
import java.io.IOException;
2019-05-18 14:10:28 -07:00
import java.util.HashSet;
import java.util.Set;
import static com.rusefi.ToolUtil.EOL;
2019-05-18 14:10:28 -07:00
2019-09-08 19:46:47 -07:00
public abstract class JavaFieldsConsumer implements ConfigurationConsumer {
2022-05-09 05:12:16 -07:00
protected final Set<String> existingJavaEnums = new HashSet<>();
2019-05-18 14:10:28 -07:00
2022-04-17 11:48:00 -07:00
private final StringBuilder content = new StringBuilder();
protected final StringBuffer allFields = new StringBuffer();
2023-01-06 09:23:24 -08:00
protected final ReaderState state;
private final int baseOffset;
2019-05-18 14:10:28 -07:00
2023-01-06 09:28:42 -08:00
public JavaFieldsConsumer(ReaderState state, int baseOffset) {
2019-05-18 14:10:28 -07:00
this.state = state;
this.baseOffset = baseOffset;
2019-09-08 19:46:47 -07:00
}
2019-05-18 14:10:28 -07:00
2022-04-17 11:48:00 -07:00
public String getContent() {
return content.toString();
2019-05-18 14:10:28 -07:00
}
2022-11-25 21:21:29 -08:00
private void writeJavaFieldName(String nameWithPrefix, int tsPosition) {
2019-09-08 19:46:47 -07:00
allFields.append("\t" + nameWithPrefix.toUpperCase() + "," + EOL);
2022-11-25 21:21:29 -08:00
content.append("\tpublic static final Field ");
2022-04-17 11:48:00 -07:00
content.append(nameWithPrefix.toUpperCase());
content.append(" = Field.create(\"" + nameWithPrefix.toUpperCase() + "\", "
2019-09-08 19:46:47 -07:00
+ tsPosition + ", ");
}
public static String getJavaType(int elementSize) {
if (elementSize == 1) {
return ("FieldType.INT8");
} else if (elementSize == 2) {
return "FieldType.INT16";
} else {
return "FieldType.INT";
}
}
2023-01-06 09:00:30 -08:00
private boolean isStringField(ConfigField configField) {
String custom = state.getTsCustomLine().get(configField.getTypeName());
2020-07-18 16:12:47 -07:00
return custom != null && custom.toLowerCase().startsWith(IniFileModel.FIELD_TYPE_STRING);
}
2023-01-06 08:08:23 -08:00
@Override
2023-01-06 08:55:59 -08:00
public void handleEndStruct(ReaderState readerState, ConfigStructure structure) throws IOException {
2022-04-16 22:43:46 -07:00
FieldsStrategy fieldsStrategy = new FieldsStrategy() {
2022-04-17 21:22:36 -07:00
protected int writeOneField(FieldIterator iterator, String prefix, int tsPosition) {
2023-01-06 09:00:30 -08:00
ConfigField prev = iterator.getPrev();
ConfigField configField = iterator.cf;
ConfigField next = iterator.next;
2022-04-17 11:00:54 -07:00
int bitIndex = iterator.bitState.get();
2022-04-16 22:43:46 -07:00
if (configField.isDirective())
return tsPosition;
// skip duplicate names which happens in case of conditional compilation
if (configField.getName().equals(prev.getName())) {
return tsPosition;
}
2023-01-06 08:08:23 -08:00
ConfigStructure cs = configField.getStructureType();
2022-04-16 22:43:46 -07:00
if (cs != null) {
2023-01-06 07:54:29 -08:00
String extraPrefix = cs.isWithPrefix() ? configField.getName() + "_" : "";
return writeFields(cs.getTsFields(), prefix + extraPrefix, tsPosition);
2022-04-16 22:43:46 -07:00
}
String nameWithPrefix = prefix + configField.getName();
if (configField.isBit()) {
2023-01-06 09:28:42 -08:00
if (!configField.getName().startsWith(ConfigStructure.UNUSED_ANYTHING_PREFIX)) {
writeJavaFieldName(nameWithPrefix, tsPosition);
content.append("FieldType.BIT, " + bitIndex + ")" + terminateField());
}
2022-04-16 22:43:46 -07:00
tsPosition += configField.getSize(next);
return tsPosition;
}
if (TypesHelper.isFloat(configField.getTypeName())) {
2022-11-25 21:21:29 -08:00
writeJavaFieldName(nameWithPrefix, tsPosition);
content.append("FieldType.FLOAT)" + terminateField());
2022-04-16 22:43:46 -07:00
} else {
String enumOptions = state.getVariableRegistry().get(configField.getTypeName() + VariableRegistry.ARRAY_FORMAT_ENUM);
2022-05-09 05:12:16 -07:00
if (enumOptions == null)
enumOptions = state.getVariableRegistry().get(configField.getTypeName() + VariableRegistry.KEY_VALUE_FORMAT_ENUM);
2022-04-16 22:43:46 -07:00
if (enumOptions != null && !existingJavaEnums.contains(configField.getTypeName())) {
existingJavaEnums.add(configField.getTypeName());
content.append("\tpublic static final String[] " + configField.getTypeName() + " = {" + enumOptions + "};" + EOL);
2022-04-16 22:43:46 -07:00
}
2022-11-25 21:21:29 -08:00
writeJavaFieldName(nameWithPrefix, tsPosition);
2022-04-16 22:43:46 -07:00
if (isStringField(configField)) {
String custom = state.getTsCustomLine().get(configField.getTypeName());
2022-04-16 22:43:46 -07:00
String[] tokens = custom.split(",");
String stringSize = tokens[3].trim();
2022-04-17 11:48:00 -07:00
content.append(stringSize + ", FieldType.STRING");
2022-04-16 22:43:46 -07:00
} else {
2022-04-17 11:48:00 -07:00
content.append(getJavaType(configField.getElementSize()));
2022-04-16 22:43:46 -07:00
}
if (enumOptions != null) {
content.append(", " + configField.getTypeName());
2022-04-16 22:43:46 -07:00
}
2022-04-17 11:48:00 -07:00
content.append(")" + ".setScale(" + configField.autoscaleSpecNumber() + ")" +
terminateField());
2022-04-16 22:43:46 -07:00
}
tsPosition += configField.getSize(next);
return tsPosition;
}
};
fieldsStrategy.run(state, structure, 0);
2019-05-18 14:10:28 -07:00
}
private String terminateField() {
return ".setBaseOffset(" + baseOffset + ")" +
";" + EOL;
}
2019-05-18 14:10:28 -07:00
}