/** * Format a String as a property name. * * @param str to be formatted. * @return the string formatted as a property name. */ public static String formatPropertyName(final String str) { return toUpperFirstChar(str); }
public CodeGenerator newInstance(final Ir ir, final String outputDir) { return new CSharpGenerator(ir, new CSharpNamespaceOutputManager(outputDir, ir.applicableNamespace())); } }
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 ""; }
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 generateEnum(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, false)); out.append(generateEnumValues(tokens.subList(1, tokens.size() - 1), enumToken)); out.append(INDENT + "}\n"); out.append("}\n"); } }
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).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"); } }
private Object generateCompositeProperty(final String propertyName, final Token token, final String indent) { final String compositeName = CSharpUtil.formatClassName(token.applicableTypeName()); final int offset = token.offset(); final StringBuilder sb = new StringBuilder(); sb.append(String.format("\n" + indent + INDENT + "private readonly %1$s _%2$s = new %3$s();\n", compositeName, toLowerFirstChar(propertyName), compositeName)); sb.append(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 + "_%4$s.Wrap(_buffer, _offset + %5$d, _actingVersion);\n" + indent + INDENT + INDENT + INDENT + "return _%4$s;\n" + indent + INDENT + INDENT + "}\n" + indent + INDENT + "}\n", compositeName, toUpperFirstChar(propertyName), generateTypeFieldNotPresentCondition(token.version(), indent), toLowerFirstChar(propertyName), offset)); return sb; }
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 String className = CSharpUtil.formatClassName(groupName); toLowerFirstChar(groupName), className)); toUpperFirstChar(groupName), token.id())); generateSinceActingDeprecated(sb, indent, toUpperFirstChar(groupName), token); indent + "}\n", className, toUpperFirstChar(groupName), toLowerFirstChar(groupName))); indent + "}\n", className, toUpperFirstChar(groupName), toLowerFirstChar(groupName)));
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 CharSequence generatePrimitiveProperty(final String propertyName, final Token token, final String indent) { final StringBuilder sb = new StringBuilder(); sb.append(generatePrimitiveFieldMetaData(propertyName, token, indent + INDENT)); if (token.isConstantEncoding()) { sb.append(generateConstPropertyMethods(propertyName, token, indent)); } else { sb.append(generatePrimitivePropertyMethods(propertyName, token, indent)); } return sb; }
private CharSequence generatePrimitiveFieldMetaData( final String propertyName, final Token token, final String indent) { final PrimitiveType primitiveType = token.encoding().primitiveType(); final String typeName = cSharpTypeName(primitiveType); return String.format( "\n" + indent + "public const %1$s %2$sNullValue = %3$s;\n" + indent + "public const %1$s %2$sMinValue = %4$s;\n" + indent + "public const %1$s %2$sMaxValue = %5$s;\n", typeName, toUpperFirstChar(propertyName), generateLiteral(primitiveType, token.encoding().applicableNullValue().toString()), generateLiteral(primitiveType, token.encoding().applicableMinValue().toString()), generateLiteral(primitiveType, token.encoding().applicableMaxValue().toString())); }
private void generateFieldIdMethod(final StringBuilder sb, final Token token, final String indent) { sb.append(String.format("\n" + indent + "public const int %sId = %d;\n", CSharpUtil.formatPropertyName(token.name()), token.id())); generateSinceActingDeprecated(sb, indent, CSharpUtil.formatPropertyName(token.name()), token); }
private void generateCharacterEncodingMethod( final StringBuilder sb, final String propertyName, final String encoding, final String indent) { sb.append(String.format("\n" + indent + "public const string %sCharacterEncoding = \"%s\";\n\n", formatPropertyName(propertyName), encoding)); }
private void generateGroupEnumerator(final StringBuilder sb, final String groupName, final String indent) { sb.append( indent + INDENT + "public int ActingBlockLength { get { return _blockLength; } }\n\n" + indent + INDENT + "public int Count { get { return _count; } }\n\n" + indent + INDENT + "public bool HasNext { get { return (_index + 1) < _count; } }\n"); sb.append(String.format("\n" + indent + INDENT + "public %sGroup Next()\n" + indent + INDENT + "{\n" + indent + INDENT + INDENT + "if (_index + 1 >= _count)\n" + indent + INDENT + INDENT + "{\n" + indent + INDENT + INDENT + INDENT + "throw new InvalidOperationException();\n" + indent + INDENT + INDENT + "}\n\n" + indent + INDENT + INDENT + "_offset = _parentMessage.Limit;\n" + indent + INDENT + INDENT + "_parentMessage.Limit = _offset + _blockLength;\n" + indent + INDENT + INDENT + "++_index;\n\n" + indent + INDENT + INDENT + "return this;\n" + indent + INDENT + "}\n", formatClassName(groupName))); sb.append("\n" + indent + INDENT + "public System.Collections.IEnumerator GetEnumerator()\n" + indent + INDENT + "{\n" + indent + INDENT + INDENT + "while (this.HasNext)\n" + indent + INDENT + INDENT + "{\n" + indent + INDENT + INDENT + INDENT + "yield return this.Next();\n" + indent + INDENT + INDENT + "}\n" + indent + INDENT + "}\n"); }
public void generateMessageHeaderStub() throws IOException { generateComposite(ir.headerStructure().tokens()); }
private void generateMetaAttributeEnum() throws IOException { try (Writer out = outputManager.createOutput(META_ATTRIBUTE_ENUM)) { out.append(generateFileHeader(ir.applicableNamespace())); out.append( INDENT + "public enum MetaAttribute\n" + INDENT + "{\n" + INDENT + INDENT + "Epoch,\n" + INDENT + INDENT + "TimeUnit,\n" + INDENT + INDENT + "SemanticType,\n" + INDENT + INDENT + "Presence\n" + INDENT + "}\n" + "}\n"); } }
/** * Format a String as a class name. * * @param str to be formatted. * @return the string formatted as a class name. */ public static String formatClassName(final String str) { return toUpperFirstChar(str); } }
private CharSequence generateFileHeader(final String packageName) { String[] tokens = packageName.split("\\."); final StringBuilder sb = new StringBuilder(); for (final String t : tokens) { sb.append(toUpperFirstChar(t)).append("."); } if (sb.length() > 0) { sb.setLength(sb.length() - 1); } tokens = sb.toString().split("-"); sb.setLength(0); for (final String t : tokens) { sb.append(toUpperFirstChar(t)); } return String.format( "/* Generated SBE (Simple Binary Encoding) message codec */\n\n" + "#pragma warning disable 1591 // disable warning on missing comments\n" + "using System;\n" + "using Org.SbeTool.Sbe.Dll;\n\n" + "namespace %s\n" + "{\n", sb); }