public CodeGenerator newInstance(final Ir ir, final String outputDir) { return new CSharpGenerator(ir, new CSharpNamespaceOutputManager(outputDir, ir.applicableNamespace())); } }
if (token.signal() == Signal.BEGIN_VAR_DATA) generateFieldIdMethod(sb, token, indent); generateCharacterEncodingMethod(sb, token.name(), characterEncoding, indent); generateFieldMetaAttributeMethod(sb, token, indent); final String lengthTypePrefix = toUpperFirstChar(lengthEncoding.primitiveType().primitiveName()); final ByteOrder byteOrder = lengthEncoding.byteOrder(); final String byteOrderStr = generateByteOrder(byteOrder, lengthEncoding.primitiveType().size()); indent + "}\n", propertyName, generateArrayFieldNotPresentCondition(token.version(), indent), sizeOfLengthField, lengthTypePrefix,
private CharSequence generatePrimitivePropertyMethods( final String propertyName, final Token token, final String indent) { final int arrayLength = token.arrayLength(); if (arrayLength == 1) { return generateSingleValueProperty(propertyName, token, indent + INDENT); } else if (arrayLength > 1) { return generateArrayProperty(propertyName, token, indent + INDENT); } return ""; }
public void generateTypeStubs() throws IOException { generateMetaAttributeEnum(); for (final List<Token> tokens : ir.types()) { switch (tokens.get(0).signal()) { case BEGIN_ENUM: generateEnum(tokens); break; case BEGIN_SET: generateBitSet(tokens); break; case BEGIN_COMPOSITE: generateComposite(tokens); break; } } }
private void generateComposite(final List<Token> tokens) throws IOException { final String compositeName = CSharpUtil.formatClassName(tokens.get(0).applicableTypeName()); try (Writer out = outputManager.createOutput(compositeName)) { out.append(generateFileHeader(ir.applicableNamespace())); out.append(generateClassDeclaration(compositeName)); out.append(generateFixedFlyweightCode(tokens.get(0).encodedLength())); out.append(generateCompositePropertyElements(tokens.subList(1, tokens.size() - 1), BASE_INDENT)); out.append(INDENT + "}\n"); out.append("}\n"); } }
public void generate() throws IOException generateMessageHeaderStub(); generateTypeStubs(); out.append(generateFileHeader(ir.applicableNamespace())); out.append(generateClassDeclaration(className)); out.append(generateMessageFlyweightCode(className, msgToken, BASE_INDENT)); out.append(generateFields(fields, BASE_INDENT)); generateGroups(sb, className, groups, BASE_INDENT); out.append(sb); out.append(generateVarData(varData, BASE_INDENT + INDENT));
final String propertyName = signalToken.name(); generateFieldIdMethod(sb, signalToken, indent + INDENT); generateFieldMetaAttributeMethod(sb, signalToken, indent + INDENT); sb.append(generatePrimitiveProperty(propertyName, encodingToken, indent)); break; sb.append(generateEnumProperty(propertyName, encodingToken, signalToken, indent)); break; sb.append(generateBitSetProperty(propertyName, encodingToken, indent)); break; sb.append(generateCompositeProperty(propertyName, encodingToken, indent)); break;
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(); indent + "}\n", typeName, propName, fieldLength, generateFieldNotPresentCondition(token.version(), token.encoding(), indent), typePrefix, offset, typeSize, byteOrderStr)); 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));
private CharSequence generateCompositePropertyElements(final List<Token> tokens, final String indent) { final StringBuilder sb = new StringBuilder(); for (int i = 0; i < tokens.size();) { final Token token = tokens.get(i); final String propertyName = formatPropertyName(token.name()); // FIXME: do I need to pass classname down here for disambiguation switch (token.signal()) { case ENCODING: sb.append(generatePrimitiveProperty(propertyName, token, indent)); break; case BEGIN_ENUM: sb.append(generateEnumProperty(propertyName, token, null, indent)); break; case BEGIN_SET: sb.append(generateBitSetProperty(propertyName, token, indent)); break; case BEGIN_COMPOSITE: sb.append(generateCompositeProperty(propertyName, token, indent)); break; } i += tokens.get(i).componentTokenCount(); } return sb; }
private void generateBitSet(final List<Token> tokens) throws IOException { final Token enumToken = tokens.get(0); final String enumName = CSharpUtil.formatClassName(enumToken.applicableTypeName()); try (Writer out = outputManager.createOutput(enumName)) { out.append(generateFileHeader(ir.applicableNamespace())); final String enumPrimitiveType = cSharpTypeName(enumToken.encoding().primitiveType()); out.append(generateEnumDeclaration(enumName, enumPrimitiveType, true)); out.append(generateChoices(tokens.subList(1, tokens.size() - 1))); out.append(INDENT + "}\n"); out.append("}\n"); } }
private void generateComposite(final List<Token> tokens) throws IOException { final String compositeName = CSharpUtil.formatClassName(tokens.get(0).name()); try (final Writer out = outputManager.createOutput(compositeName)) { out.append(generateFileHeader(ir.applicableNamespace())); out.append(generateClassDeclaration(compositeName)); out.append(generateFixedFlyweightCode(tokens.get(0).encodedLength())); out.append(generatePrimitivePropertyEncodings(tokens.subList(1, tokens.size() - 1), BASE_INDENT)); out.append(" }\n"); out.append("}\n"); } }
private CharSequence generateSingleValueProperty( final String propertyName, final Token token, 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()); return String.format("\n" + indent + "public %1$s %2$s\n" + indent + "{\n" + indent + INDENT + "get\n" + indent + INDENT + "{\n" + "%3$s" + indent + INDENT + INDENT + "return _buffer.%4$sGet%6$s(_offset + %5$d);\n" + indent + INDENT + "}\n" + indent + INDENT + "set\n" + indent + INDENT + "{\n" + indent + INDENT + INDENT + "_buffer.%4$sPut%6$s(_offset + %5$d, value);\n" + indent + INDENT + "}\n" + indent + "}\n\n", typeName, toUpperFirstChar(propertyName), generateFieldNotPresentCondition(token.version(), token.encoding(), indent), typePrefix, offset, byteOrderStr); }
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); }
cSharpTypeName(token.encoding().primitiveType()), toUpperFirstChar(propertyName), generateLiteral(token.encoding().primitiveType(), token.encoding().constValue().toString())); final CharSequence values = generateByteLiteralList( token.encoding().constValue().byteArrayValue(token.encoding().primitiveType()));
final int offset = token.offset(); final ByteOrder byteOrder = token.encoding().byteOrder(); final String byteOrderStr = generateByteOrder(byteOrder, token.encoding().primitiveType().size()); enumName, toUpperFirstChar(propertyName), generateEnumFieldNotPresentCondition(token.version(), enumName, indent), enumName, typePrefix,
@Test(expected = IllegalArgumentException.class) public void shouldThrowWhenUsingATypeThatIsNotConstrainedToFitInAnIntAsTheGroupSize() throws Exception { final ParserOptions options = ParserOptions.builder().stopOnError(true).build(); final MessageSchema schema = parse(TestUtil.getLocalResource("issue567-invalid.xml"), options); final IrGenerator irg = new IrGenerator(); final Ir ir = irg.generate(schema); final StringWriterOutputManager outputManager = new StringWriterOutputManager(); outputManager.setPackageName(ir.applicableNamespace()); final CSharpGenerator generator = new CSharpGenerator(ir, outputManager); // Act + Assert (exception thrown) generator.generate(); }
public void generate() throws IOException { generateMessageHeaderStub(); generateTypeStubs(); for (final List<Token> tokens : ir.messages()) { final Token msgToken = tokens.get(0); final String className = formatClassName(msgToken.name()); try (final Writer out = outputManager.createOutput(className)) { out.append(generateFileHeader(ir.applicableNamespace())); out.append(generateClassDeclaration(className)); out.append(generateMessageFlyweightCode(className, msgToken)); final List<Token> messageBody = tokens.subList(1, tokens.size() - 1); int offset = 0; final List<Token> rootFields = new ArrayList<>(); offset = collectRootFields(messageBody, offset, rootFields); out.append(generateFields(rootFields, BASE_INDENT)); final List<Token> groups = new ArrayList<>(); offset = collectGroups(messageBody, offset, groups); final StringBuilder sb = new StringBuilder(); generateGroups(sb, className, groups, 0, BASE_INDENT); out.append(sb); final List<Token> varData = messageBody.subList(offset, messageBody.size()); out.append(generateVarData(varData)); out.append(" }\n"); out.append("}\n"); } } }
final String propertyName = signalToken.name(); generateFieldIdMethod(sb, signalToken, indent + INDENT); generateFieldMetaAttributeMethod(sb, signalToken, indent + INDENT); sb.append(generatePrimitiveProperty(propertyName, encodingToken, indent)); break; sb.append(generateEnumProperty(propertyName, encodingToken, signalToken, indent)); break; sb.append(generateBitSetProperty(propertyName, encodingToken, indent)); break; sb.append(generateCompositeProperty(propertyName, encodingToken, indent)); break;
public void generateTypeStubs() throws IOException { generateMetaAttributeEnum(); for (final List<Token> tokens : ir.types()) { switch (tokens.get(0).signal()) { case BEGIN_ENUM: generateEnum(tokens); break; case BEGIN_SET: generateBitSet(tokens); break; case BEGIN_COMPOSITE: generateComposite(tokens); break; } } }
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(); indent + "}\n", typeName, propName, fieldLength, generateFieldNotPresentCondition(token.version(), token.encoding(), indent), typePrefix, offset, typeSize, byteOrderStr)); 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));