private void generateVarData( final StringBuilder sb, final String typeName, final List<Token> tokens) { for (int i = 0, size = tokens.size(); i < size;) { final Token token = tokens.get(i); if (token.signal() != Signal.BEGIN_VAR_DATA) { throw new IllegalStateException("tokens must begin with BEGIN_VAR_DATA: token=" + token); } final String propertyName = toUpperFirstChar(token.name()); final Token lengthToken = Generators.findFirst("length", tokens, i); final int lengthOfLengthField = lengthToken.encodedLength(); final Token varDataToken = Generators.findFirst("varData", tokens, i); final String characterEncoding = varDataToken.encoding().characterEncoding(); generateFieldMetaAttributeMethod(sb, typeName, propertyName, token); generateVarDataDescriptors(sb, token, typeName, propertyName, characterEncoding, lengthOfLengthField); i += token.componentTokenCount(); } }
private static PrimitiveValue constOrNotPresentValue(final Token token, final int actingVersion) { if (token.isConstantEncoding()) { return token.encoding().constValue(); } else if (token.isOptionalEncoding() && actingVersion < token.version()) { return token.encoding().applicableNullValue(); } return null; }
public Token build() { return new Token( signal, name, referencedName, description, id, version, deprecated, size, offset, componentTokenCount, encoding); } }
private void generateSinceActingDeprecated( final StringBuilder sb, final String indent, final String propertyName, final Token token) { sb.append(String.format( indent + "public const int %1$sSinceVersion = %2$d;\n" + indent + "public const int %1$sDeprecated = %3$d;\n" + indent + "public bool %1$sInActingVersion()\n" + indent + "{\n" + indent + INDENT + "return _actingVersion >= %1$sSinceVersion;\n" + indent + "}\n", propertyName, token.version(), token.deprecated())); }
final String propertyName = formatPropertyName(signalToken.name()); switch (encodingToken.signal()) gap = signalToken.offset() - currentOffset; encode.append(generateEncodeOffset(gap, "")); decode.append(generateDecodeOffset(gap, "")); if (signalToken.isConstantEncoding()) varName, propertyName, signalToken.encoding().constValue())); init.append(String.format( "\t%1$s.%2$s = %3$s\n", varName, propertyName, signalToken.encoding().constValue())); if (encodingToken.signal() == Signal.BEGIN_ENUM) gap = encodingToken.offset() - currentOffset; encode.append(generateEncodeOffset(gap, "")); decode.append(generateDecodeOffset(gap, "")); if (encodingToken.isConstantEncoding()) generateEncodePrimitive(encode, varName, formatPropertyName(signalToken.name()), encodingToken); if (signalToken.isOptionalEncoding()) generateRangeCheckPrimitive(rc, primitive, encodingToken, signalToken.isOptionalEncoding()); break;
private void assertEqual(final Token lhs, final Token rhs) { assertThat(lhs.name(), is(rhs.name())); assertThat(lhs.version(), is(rhs.version())); assertThat(lhs.offset(), is(rhs.offset())); assertThat((long)lhs.id(), is((long)rhs.id())); assertThat(lhs.signal(), is(rhs.signal())); assertThat(lhs.encodedLength(), is(rhs.encodedLength())); assertThat(lhs.encoding().byteOrder(), is(rhs.encoding().byteOrder())); assertThat(lhs.encoding().primitiveType(), is(rhs.encoding().primitiveType())); assertThat(lhs.encoding().presence(), is(rhs.encoding().presence())); assertThat(lhs.encoding().constValue(), is(rhs.encoding().constValue())); assertThat(lhs.encoding().minValue(), is(rhs.encoding().minValue())); assertThat(lhs.encoding().maxValue(), is(rhs.encoding().maxValue())); assertThat(lhs.encoding().nullValue(), is(rhs.encoding().nullValue())); assertThat(lhs.encoding().characterEncoding(), is(rhs.encoding().characterEncoding())); assertThat(lhs.encoding().epoch(), is(rhs.encoding().epoch())); assertThat(lhs.encoding().timeUnit(), is(rhs.encoding().timeUnit())); assertThat(lhs.encoding().semanticType(), is(rhs.encoding().semanticType())); }
final String propertyName = formatPropertyName(token.name()); switch (token.signal()) case BEGIN_VAR_DATA: longest = Math.max(longest, propertyName.length()); i += token.componentTokenCount() - 1; break; final String propertyName = formatPropertyName(token.name()); final String propertyType = formatPropertyName(token.applicableTypeName()); int arrayLength = token.arrayLength(); switch (token.signal()) if (token.isConstantEncoding() && token.encoding().primitiveType() == CHAR) arrayLength = token.encoding().constValue().size(); // can be 1 sb.append("\t").append(propertyName) .append(String.format(String.format("%%%ds", longest - propertyName.length() + 1), " ")) .append("[").append(arrayLength).append("]") .append(golangTypeName(token.encoding().primitiveType())).append("\n"); .append(String.format(String.format("%%%ds", longest - propertyName.length() + 1), " ")) .append((arrayLength > 1) ? ("[" + arrayLength + "]") : "") .append(golangTypeName(token.encoding().primitiveType())).append("\n"); i += token.componentTokenCount() - 2;
final String propertyName = formatPropertyName(signalToken.name()); switch (signalToken.signal()) currentOffset += generatePropertyEncodeDecode( signalToken, typeName, encode, decode, currentOffset); i += signalToken.componentTokenCount() - 1; break; currentOffset += generatePropertyEncodeDecode( signalToken, typeName, encode, decode, currentOffset); i += signalToken.componentTokenCount() - 1; if (tokens.get(i + 1).signal() == Signal.ENCODING) i += signalToken.componentTokenCount() - 1; gap = signalToken.offset() - currentOffset; encode.append(generateEncodeOffset(gap, "")); decode.append(generateDecodeOffset(gap, "")); currentOffset += signalToken.encodedLength() + gap; final String primitive = varName + "." + propertyName; if (signalToken.isConstantEncoding()) generateEncodePrimitive(encode, varName, formatPropertyName(signalToken.name()), signalToken); if (signalToken.isOptionalEncoding())
@Test public void shouldGenerateCorrectIrForMultipleVarDataInRepeatingGroup() throws Exception { final MessageSchema schema = parse(getLocalResource("group-with-data-schema.xml"), ParserOptions.DEFAULT); final IrGenerator irg = new IrGenerator(); final Ir ir = irg.generate(schema); final List<Token> tokens = ir.getMessage(2); /* 0=msg, 1=field, 2=enc, 3=fieldend, 4=group, 5=comp, 6=enc, 7=enc, 8=compend, ... */ final Token groupToken = tokens.get(4); final Token varDataField1Token = tokens.get(15); final Token varDataField2Token = tokens.get(21); /* assert on the group token */ assertThat(groupToken.signal(), is(Signal.BEGIN_GROUP)); assertThat(groupToken.name(), is("Entries")); assertThat(valueOf(groupToken.id()), is(valueOf(2))); assertThat(varDataField1Token.signal(), is(Signal.BEGIN_VAR_DATA)); assertThat(varDataField1Token.name(), is("varDataField1")); assertThat(valueOf(varDataField1Token.id()), is(valueOf(5))); assertThat(varDataField2Token.signal(), is(Signal.BEGIN_VAR_DATA)); assertThat(varDataField2Token.name(), is("varDataField2")); assertThat(valueOf(varDataField2Token.id()), is(valueOf(6))); }
@Test public void shouldGenerateCorrectIrForMessageWithVariableLengthFieldWithEmbeddedLength() throws Exception { final MessageSchema schema = parse(getLocalResource( "embedded-length-and-count-schema.xml"), ParserOptions.DEFAULT); final IrGenerator irg = new IrGenerator(); final Ir ir = irg.generate(schema); /* 0=msg, 1=field, 2=enc, 3=fieldend, 4=field, 5=comp, 6=enc, 7=enc, 8=compend, 9=fieldend */ final int lengthFieldIdx = 4; final int lengthEncIdx = 6; final int dataEncIdx = 7; final List<Token> tokens = ir.getMessage(2); /* assert the varDataEncoding field node is formed correctly */ assertThat(tokens.get(lengthFieldIdx).signal(), is(Signal.BEGIN_VAR_DATA)); assertThat(tokens.get(lengthFieldIdx).name(), is("EncryptedPassword")); assertThat(valueOf(tokens.get(lengthFieldIdx).id()), is(valueOf(1402))); /* assert the length node has correct values */ assertThat(tokens.get(lengthEncIdx).signal(), is(Signal.ENCODING)); assertThat(tokens.get(lengthEncIdx).encoding().primitiveType(), is(PrimitiveType.UINT8)); /* assert the group node has the right IrId and xRefIrId, etc. */ assertThat(tokens.get(dataEncIdx).signal(), is(Signal.ENCODING)); assertThat(tokens.get(dataEncIdx).encoding().primitiveType(), is(PrimitiveType.CHAR)); } }
final Token endCompositeToken = tokens.get(9); assertThat(beginCompositeToken.signal(), is(Signal.BEGIN_COMPOSITE)); assertThat(beginCompositeToken.name(), is("futuresPrice")); assertThat(beginCompositeToken.encodedLength(), is(11)); assertThat(mantissaToken.signal(), is(Signal.ENCODING)); assertThat(mantissaToken.name(), is("mantissa")); assertThat(mantissaToken.offset(), is(0)); assertThat(mantissaToken.encoding().primitiveType(), is(PrimitiveType.INT64)); assertThat(exponentToken.signal(), is(Signal.ENCODING)); assertThat(exponentToken.name(), is("exponent")); assertThat(exponentToken.offset(), is(8)); assertThat(exponentToken.encoding().primitiveType(), is(PrimitiveType.INT8)); assertThat(enumToken.signal(), is(Signal.BEGIN_ENUM)); assertThat(enumToken.encodedLength(), is(1)); assertThat(enumToken.encoding().primitiveType(), is(PrimitiveType.UINT8)); assertThat(enumToken.offset(), is(10)); assertThat(endCompositeToken.signal(), is(Signal.END_COMPOSITE)); assertThat(endCompositeToken.name(), is("futuresPrice"));
if (typeToken.encodedLength() <= 0 || typeToken.isConstantEncoding()) switch (typeToken.signal()) if (typeToken.arrayLength() > 1) if (typeToken.encoding().primitiveType() == PrimitiveType.CHAR)
private CharSequence generateSingleValueProperty( final String containingClassName, final String propertyName, final Token token, final String indent) final PrimitiveType primitiveType = token.encoding().primitiveType(); final String cppTypeName = cppTypeName(primitiveType); final int offset = token.offset(); final StringBuilder sb = new StringBuilder(); cppTypeName, propertyName, generateFieldNotPresentCondition(token.version(), token.encoding(), indent), generateLoadValue(primitiveType, Integer.toString(offset), token.encoding().byteOrder(), indent))); primitiveType, Integer.toString(offset), token.encoding().byteOrder(), indent);
private CharSequence generateEnumEncoder( final String containingClassName, final String propertyName, final Token token, final String indent) { if (token.isConstantEncoding()) { return ""; } final String enumName = formatClassName(token.applicableTypeName()); final Encoding encoding = token.encoding(); final int offset = token.offset(); return String.format("\n" + indent + " public %s %s(final %s value)\n" + indent + " {\n" + indent + " %s;\n" + indent + " return this;\n" + indent + " }\n", formatClassName(containingClassName), propertyName, enumName, generatePut(encoding.primitiveType(), "offset + " + offset, "value.value()", byteOrderString(encoding))); }
if (typeToken.isConstantEncoding()) indent(appendable).append("pub ").append(propertyName).append(":"); switch (typeToken.signal()) final String rustPrimitiveType = RustUtil.rustTypeName(typeToken.encoding().primitiveType()); final String rustFieldType = getRustTypeForPrimitivePossiblyArray(typeToken, rustPrimitiveType); appendable.append(rustFieldType); case BEGIN_SET: case BEGIN_COMPOSITE: appendable.append(formatTypeName(typeToken.applicableTypeName())); break; format("Unsupported struct property from %s", typeToken.toString()));
final String indent) final String typeName = cSharpTypeName(token.encoding().primitiveType()); final String typePrefix = toUpperFirstChar(token.encoding().primitiveType().primitiveName()); final int offset = token.offset(); final ByteOrder byteOrder = token.encoding().byteOrder(); final String byteOrderStr = generateByteOrder(byteOrder, token.encoding().primitiveType().size()); final int fieldLength = token.arrayLength(); final int typeSize = token.encoding().primitiveType().size(); final String propName = toUpperFirstChar(propertyName); indent + "}\n", typeName, propName, fieldLength, generateFieldNotPresentCondition(token.version(), token.encoding(), indent), typePrefix, offset, typeSize, byteOrderStr)); if (token.encoding().primitiveType() == PrimitiveType.CHAR) generateCharacterEncodingMethod(sb, propertyName, token.encoding().characterEncoding(), indent); indent + INDENT + "return Get%1$s(new Span<byte>(dst, dstOffset, length));\n" + indent + "}\n", propName, fieldLength, generateArrayFieldNotPresentCondition(token.version(), indent), offset)); indent + INDENT + "return length;\n" + indent + "}\n", propName, fieldLength, generateArrayFieldNotPresentCondition(token.version(), indent), offset));
if (fieldToken.isConstantEncoding()) final String refValue = fieldToken.encoding().constValue().toString(); final int indexOfDot = refValue.indexOf('.'); value = -1 == indexOfDot ? refValue : refValue.substring(indexOfDot + 1); if (encodedValue == tokens.get(i).encoding().constValue().longValue()) value = tokens.get(i).name(); break;
private void generateCharacterEncoding( final StringBuilder sb, final String typeName, final String propertyName, final Token token) { if (token.encoding().primitiveType() == CHAR && token.arrayLength() > 1) { sb.append(String.format( "\nfunc (%1$s *%2$s) %3$sCharacterEncoding() string {\n" + "\treturn \"%4$s\"\n" + "}\n", Character.toLowerCase(typeName.charAt(0)), typeName, propertyName, token.encoding().characterEncoding())); } }
private String generateBitSetProperty(final String propertyName, final Token token, final String indent) { final String bitSetName = formatClassName(token.applicableTypeName()); final int offset = token.offset(); final String typePrefix = toUpperFirstChar(token.encoding().primitiveType().primitiveName()); final ByteOrder byteOrder = token.encoding().byteOrder(); final String byteOrderStr = generateByteOrder(byteOrder, token.encoding().primitiveType().size()); final String typeName = cSharpTypeName(token.encoding().primitiveType()); return String.format("\n" + indent + INDENT + "public %1$s %2$s\n" + indent + INDENT + "{\n" + indent + INDENT + INDENT + "get\n" + indent + INDENT + INDENT + "{\n" + "%3$s" + indent + INDENT + INDENT + INDENT + "return (%4$s)_buffer.%5$sGet%7$s(_offset + %6$d);\n" + indent + INDENT + INDENT + "}\n" + indent + INDENT + INDENT + "set\n" + indent + INDENT + INDENT + "{\n" + indent + INDENT + INDENT + INDENT + "_buffer.%5$sPut%7$s(_offset + %6$d, (%8$s)value);\n" + indent + INDENT + INDENT + "}\n" + indent + INDENT + "}\n", bitSetName, toUpperFirstChar(propertyName), generateTypeFieldNotPresentCondition(token.version(), indent), bitSetName, typePrefix, offset, byteOrderStr, typeName); }