public static int collect( final Signal signal, final List<Token> tokens, final int index, final List<Token> collected) { int i = index; while (i < tokens.size()) { final Token token = tokens.get(i); if (signal != token.signal()) { break; } final int tokenCount = token.componentTokenCount(); for (final int limit = i + tokenCount; i < limit; i++) { collected.add(tokens.get(i)); } } return i; }
/** * For each field found in a list of field {@link Token}s take the field token and following type token to * a {@link BiConsumer}. * * @param tokens to be iterated over. * @param consumer to for the field and encoding token pair. */ public static void forEachField(final List<Token> tokens, final BiConsumer<Token, Token> consumer) { for (int i = 0, size = tokens.size(); i < size;) { final Token fieldToken = tokens.get(i); if (fieldToken.signal() == Signal.BEGIN_FIELD) { final Token typeToken = tokens.get(i + 1); consumer.accept(fieldToken, typeToken); i += fieldToken.componentTokenCount(); } else { ++i; } } }
static List<VarDataSummary> gatherVarDataSummaries(final List<Token> tokens) { final List<VarDataSummary> summaries = new ArrayList<>(); for (int i = 0; i < tokens.size(); i++) { final Token beginToken = tokens.get(i); if (beginToken.signal() != Signal.BEGIN_VAR_DATA) { throw new IllegalStateException("tokens must begin with BEGIN_VAR_DATA: token=" + beginToken); } ++i; final Token dimensionsToken = tokens.get(i); final int headerTokenCount = dimensionsToken.componentTokenCount(); final List<Token> currentEncodingTokens = tokens.subList(i, i + headerTokenCount); final PrimitiveType lengthType = findPrimitiveByTokenName(currentEncodingTokens, "length"); final PrimitiveType dataType = findPrimitiveByTokenName(currentEncodingTokens, "varData"); summaries.add(new VarDataSummary(beginToken.name(), lengthType, dataType)); i += headerTokenCount; } return summaries; } }
/** * Iterate over a list of {@link Token}s and update their counts of how many tokens make up each component. * * @param tokens not be updated. */ public static void updateComponentTokenCounts(final List<Token> tokens) { final Map<String, Deque<Integer>> map = new HashMap<>(); for (int i = 0, size = tokens.size(); i < size; i++) { final Token token = tokens.get(i); final Signal signal = token.signal(); if (signal.name().startsWith("BEGIN_")) { final String componentType = signal.name().substring(6); map.computeIfAbsent(componentType, (key) -> new LinkedList<>()).push(i); } else if (signal.name().startsWith("END_")) { final String componentType = signal.name().substring(4); final int beginIndex = map.get(componentType).pop(); final int componentTokenCount = (i - beginIndex) + 1; tokens.get(beginIndex).componentTokenCount(componentTokenCount); token.componentTokenCount(componentTokenCount); } } }
public static SplitCompositeTokens splitInnerTokens(final List<Token> tokens) { final List<Token> constantTokens = new ArrayList<>(); final List<NamedToken> namedNonConstantTokens = new ArrayList<>(); for (int i = 1, end = tokens.size() - 1; i < end; ) { final Token encodingToken = tokens.get(i); if (encodingToken.isConstantEncoding()) { constantTokens.add(encodingToken); } else { namedNonConstantTokens.add(new NamedToken(encodingToken.name(), encodingToken)); } i += encodingToken.componentTokenCount(); } return new SplitCompositeTokens(constantTokens, namedNonConstantTokens); } }
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 generateGroupProperties( final StringBuilder sb, final List<Token> tokens, final String prefix) { for (int i = 0, size = tokens.size(); i < size; i++) { final Token token = tokens.get(i); if (token.signal() == Signal.BEGIN_GROUP) { final String propertyName = formatPropertyName(token.name()); generateId(sb, prefix, propertyName, token); generateSinceActingDeprecated(sb, prefix, propertyName, token); generateExtensibilityMethods(sb, prefix + propertyName, token); // Look inside for nested groups with extra prefix generateGroupProperties( sb, tokens.subList(i + 1, i + token.componentTokenCount() - 1), prefix + propertyName); i += token.componentTokenCount() - 1; } } }
private void generateGroups( final StringBuilder sb, final String parentMessageClassName, final List<Token> tokens, final String indent) { for (int i = 0, size = tokens.size(); i < size; i++) { final Token groupToken = tokens.get(i); if (groupToken.signal() != Signal.BEGIN_GROUP) { throw new IllegalStateException("tokens must begin with BEGIN_GROUP: token=" + groupToken); } final String groupName = groupToken.name(); sb.append(generateGroupProperty(groupName, groupToken, indent + INDENT)); generateGroupClassHeader(sb, groupName, parentMessageClassName, tokens, i, indent + INDENT); i++; i += tokens.get(i).componentTokenCount(); final List<Token> fields = new ArrayList<>(); i = collectFields(tokens, i, fields); sb.append(generateFields(fields, indent + INDENT)); final List<Token> groups = new ArrayList<>(); i = collectGroups(tokens, i, groups); generateGroups(sb, parentMessageClassName, groups, indent + INDENT); final List<Token> varData = new ArrayList<>(); i = collectVarData(tokens, i, varData); sb.append(generateVarData(varData, indent + INDENT + INDENT)); sb.append(indent).append(INDENT + "}\n"); } }
private CharSequence generateCompositePropertyElements( final String containingClassName, final List<Token> tokens, final String indent) { final StringBuilder sb = new StringBuilder(); for (int i = 0; i < tokens.size();) { final Token fieldToken = tokens.get(i); final String propertyName = formatPropertyName(fieldToken.name()); generateFieldMetaAttributeMethod(sb, fieldToken, indent); generateFieldCommonMethods(indent, sb, fieldToken, fieldToken, propertyName); switch (fieldToken.signal()) { case ENCODING: sb.append(generatePrimitiveProperty(containingClassName, propertyName, fieldToken, indent)); break; case BEGIN_ENUM: sb.append(generateEnumProperty(containingClassName, fieldToken, propertyName, fieldToken, indent)); break; case BEGIN_SET: sb.append(generateBitsetProperty(propertyName, fieldToken, indent)); break; case BEGIN_COMPOSITE: sb.append(generateCompositeProperty(propertyName, fieldToken, indent)); break; } i += tokens.get(i).componentTokenCount(); } return sb; }
private void generateGroups(final StringBuilder sb, final List<Token> tokens, final String prefix) { for (int i = 0, size = tokens.size(); i < size; i++) { final Token groupToken = tokens.get(i); if (groupToken.signal() != Signal.BEGIN_GROUP) { throw new IllegalStateException("tokens must begin with BEGIN_GROUP: token=" + groupToken); } // Make a unique Group name by adding our parent final String groupName = prefix + formatTypeName(groupToken.name()); ++i; final int groupHeaderTokenCount = tokens.get(i).componentTokenCount(); i += groupHeaderTokenCount; final List<Token> fields = new ArrayList<>(); i = collectFields(tokens, i, fields); generateFields(sb, groupName, fields); final List<Token> groups = new ArrayList<>(); i = collectGroups(tokens, i, groups); generateGroups(sb, groups, groupName); final List<Token> varData = new ArrayList<>(); i = collectVarData(tokens, i, varData); generateVarData(sb, formatTypeName(groupName), varData); } }
private CharSequence generateCompositeDecoderDisplay(final List<Token> tokens, final String baseIndent) { final String indent = baseIndent + INDENT; final StringBuilder sb = new StringBuilder(); appendToString(sb, indent); sb.append('\n'); append(sb, indent, "public StringBuilder appendTo(final StringBuilder builder)"); append(sb, indent, "{"); Separators.BEGIN_COMPOSITE.appendToGeneratedBuilder(sb, indent + INDENT, "builder"); int lengthBeforeLastGeneratedSeparator = -1; for (int i = 1, end = tokens.size() - 1; i < end;) { final Token encodingToken = tokens.get(i); final String propertyName = formatPropertyName(encodingToken.name()); lengthBeforeLastGeneratedSeparator = writeTokenDisplay(propertyName, encodingToken, sb, indent + INDENT); i += encodingToken.componentTokenCount(); } if (-1 != lengthBeforeLastGeneratedSeparator) { sb.setLength(lengthBeforeLastGeneratedSeparator); } Separators.END_COMPOSITE.appendToGeneratedBuilder(sb, indent + INDENT, "builder"); sb.append('\n'); append(sb, indent, " return builder;"); append(sb, indent, "}"); return sb.toString(); }
final int groupHeaderTokenCount = tokens.get(i).componentTokenCount(); i += groupHeaderTokenCount;
final int groupHeaderTokenCount = tokens.get(i).componentTokenCount(); i += groupHeaderTokenCount;
private void generateGroups(final StringBuilder sb, final List<Token> tokens, final String indent) { for (int i = 0, size = tokens.size(); i < size; i++) { final Token groupToken = tokens.get(i); if (groupToken.signal() != Signal.BEGIN_GROUP) { throw new IllegalStateException("tokens must begin with BEGIN_GROUP: token=" + groupToken); } final String groupName = groupToken.name(); final Token numInGroupToken = Generators.findFirst("numInGroup", tokens, i); final String cppTypeForNumInGroup = cppTypeName(numInGroupToken.encoding().primitiveType()); generateGroupClassHeader(sb, groupName, tokens, i, indent + INDENT); ++i; final int groupHeaderTokenCount = tokens.get(i).componentTokenCount(); i += groupHeaderTokenCount; final List<Token> fields = new ArrayList<>(); i = collectFields(tokens, i, fields); sb.append(generateFields(formatClassName(groupName), fields, indent + INDENT)); final List<Token> groups = new ArrayList<>(); i = collectGroups(tokens, i, groups); generateGroups(sb, groups, indent + INDENT); final List<Token> varData = new ArrayList<>(); i = collectVarData(tokens, i, varData); sb.append(generateVarData(formatClassName(groupName), varData, indent + INDENT)); sb.append(indent).append(" };\n"); sb.append(generateGroupProperty(groupName, groupToken, cppTypeForNumInGroup, indent)); } }
private void generateCompositePropertyElements( final StringBuilder sb, final String containingTypeName, final List<Token> tokens) { for (int i = 0; i < tokens.size();) { final Token token = tokens.get(i); final String propertyName = formatPropertyName(token.name()); // Write {Min,Max,Null}Value if (token.signal() == Signal.ENCODING) { generateMinMaxNull(sb, containingTypeName, propertyName, token); generateCharacterEncoding(sb, containingTypeName, propertyName, token); } switch (token.signal()) { case ENCODING: case BEGIN_ENUM: case BEGIN_SET: case BEGIN_COMPOSITE: generateSinceActingDeprecated(sb, containingTypeName, propertyName, token); break; default: break; } i += tokens.get(i).componentTokenCount(); } }
final int nextFieldIdx = i + typeToken.componentTokenCount(); i += typeToken.componentTokenCount();
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(); } }
tokenIdx += token.componentTokenCount();
sb, token, propertyName, sizeOfLengthField, lengthType, byteOrderStr, characterEncoding, indent); i += token.componentTokenCount();
indent); i += token.componentTokenCount();