public EnumMeta(Field protoField, JavaType javaType) { io.protostuff.compiler.model.Enum enumType = (io.protostuff.compiler.model.Enum) protoField.getType(); for (EnumConstant enumConstant : enumType.getConstants()) { enumNameToValueMap.put(enumConstant.getName(), enumConstant.getValue()); enumValues.put(enumConstant.getValue(), null); } if (!javaType.isEnumType()) { return; } try { Method method = javaType.getRawClass().getMethod("values"); method.setAccessible(true); Object[] values = (Object[]) method.invoke(null); for (Object value : values) { Enum<?> enumValue = (Enum<?>) value; enumValues.put(enumNameToValueMap.get(enumValue.name()), enumValue); } } catch (Throwable e) { throw new IllegalStateException( "Failed to collect enum values, class=" + javaType.getRawClass().getName(), e); } }
protected void enumToString(Enum enumValue, StringBuilder sb) { appendLine(sb, "enum %s {", enumValue.getName()); for (EnumConstant enumConstant : enumValue.getConstants()) { appendLine(sb, " %s = %s;", enumConstant.getName(), enumConstant.getValue()); } sb.append("}\n\n"); }
private void process(Module module, Enum anEnum) { ImmutableEnumDescriptor descriptor = ImmutableEnumDescriptor.builder() .type(NodeType.ENUM) .name(anEnum.getName()) .canonicalName(anEnum.getCanonicalName()) .description(markdownProcessor.toHtml(anEnum.getComments())) .options(anEnum.getOptions().toMap()) .usages(module.usageIndex().getUsages(anEnum).stream() .map(type -> ImmutableUsageItem.builder() .ref(type.getCanonicalName()) .type(UsageType.from(type)) .build()) .collect(Collectors.toList())) .addAllConstants(anEnum.getConstants().stream() .map(enumConstant -> ImmutableEnumConstant.builder() .name(enumConstant.getName()) .value(enumConstant.getValue()) .description(markdownProcessor.toHtml(enumConstant.getComments())) .options(enumConstant.getOptions().toMap()) .build()) .collect(Collectors.toList())) .build(); String output = "data/type/" + anEnum.getCanonicalName() + ".json"; write(module, output, descriptor); } }
type.setProto(proto); String fullyQualifiedName = proto.getNamespace() + type.getName(); type.setFullyQualifiedName(fullyQualifiedName); context.register(fullyQualifiedName, type);
private List<JsonTreeNode> processContainer(UserTypeContainer proto) { List<JsonTreeNode> result = new ArrayList<>(); proto.getEnums() .forEach(anEnum -> result.add(ImmutableJsonTreeNode.builder() .label(anEnum.getName()) .data(ImmutableNodeData.builder() .type(NodeType.ENUM) .ref(anEnum.getCanonicalName()) .build()) .build())); proto.getMessages().stream() .filter(message -> !message.isMapEntry()) .forEach(message -> { ImmutableJsonTreeNode.Builder builder = ImmutableJsonTreeNode.builder(); builder.label(message.getName()); builder.data(ImmutableNodeData.builder() .type(NodeType.MESSAGE) .ref(message.getCanonicalName()) .build()); List<JsonTreeNode> children = processContainer(message); if (!children.isEmpty()) { builder.children(children); } result.add(builder.build()); }); return result; } }
/** * Get enum that is declared under this container. * * @param name the enum short name * * @return enum instance or null if message with given name is not declared under * this container */ @Nullable default Enum getEnum(String name) { for (Enum anEnum : getEnums()) { if (name.equals(anEnum.getName())) { return anEnum; } } return null; }
private void checkDuplicateEnumConstantValues(Enum anEnum, List<EnumConstant> constants) { DynamicMessage.Value allowAlias = anEnum.getOptions().get(ALLOW_ALIAS); if (allowAlias != null && allowAlias.isBooleanType() && allowAlias.getBoolean()) { // skip this check if aliases are allowed return; } Map<Integer, EnumConstant> constantByValue = new HashMap<>(); for (EnumConstant constant : constants) { Integer value = constant.getValue(); if (constantByValue.containsKey(value)) { throw new ParserException(constant, "Duplicate enum constant value: %d", value); } constantByValue.put(value, constant); } }
@Override public void enterEnumBlock(ProtoParser.EnumBlockContext ctx) { UserTypeContainer parent = context.peek(UserTypeContainer.class); Enum enumBuilder = new Enum(parent); context.push(enumBuilder); }
private String copyDescriptionFromFieldType(Field field) { String comments; FieldType type = field.getType(); if (type instanceof Message) { comments = ((Message) type).getComments(); } else if (type instanceof Enum) { comments = ((Enum) type).getComments(); } else { comments = ""; } return comments; }
@Override public void exitEnumField(ProtoParser.EnumFieldContext ctx) { EnumConstant enumConstant = context.pop(EnumConstant.class); final Enum e = context.peek(Enum.class); String name = ctx.enumFieldName().getText(); int number = Integer.decode(ctx.enumFieldValue().getText()); enumConstant.setName(name); enumConstant.setValue(number); enumConstant.setSourceCodeLocation(getSourceCodeLocation(ctx)); e.addConstant(enumConstant); attachComments(ctx, enumConstant, true); }
private void process(Module module, Enum anEnum) { ImmutableEnumDescriptor descriptor = ImmutableEnumDescriptor.builder() .type(NodeType.ENUM) .name(anEnum.getName()) .canonicalName(anEnum.getCanonicalName()) .description(markdownProcessor.toHtml(anEnum.getComments())) .options(anEnum.getOptions().toMap()) .usages(module.usageIndex().getUsages(anEnum).stream() .map(type -> ImmutableUsageItem.builder() .ref(type.getCanonicalName()) .type(UsageType.from(type)) .build()) .collect(Collectors.toList())) .addAllConstants(anEnum.getConstants().stream() .map(enumConstant -> ImmutableEnumConstant.builder() .name(enumConstant.getName()) .value(enumConstant.getValue()) .description(markdownProcessor.toHtml(enumConstant.getComments())) .options(enumConstant.getOptions().toMap()) .build()) .collect(Collectors.toList())) .build(); String output = "data/type/" + anEnum.getCanonicalName() + ".json"; write(module, output, descriptor); } }
type.setProto(proto); String fullyQualifiedName = proto.getNamespace() + type.getName(); type.setFullyQualifiedName(fullyQualifiedName); context.register(fullyQualifiedName, type);
private List<JsonTreeNode> processContainer(UserTypeContainer proto) { List<JsonTreeNode> result = new ArrayList<>(); proto.getEnums() .forEach(anEnum -> result.add(ImmutableJsonTreeNode.builder() .label(anEnum.getName()) .data(ImmutableNodeData.builder() .type(NodeType.ENUM) .ref(anEnum.getCanonicalName()) .build()) .build())); proto.getMessages().stream() .filter(message -> !message.isMapEntry()) .forEach(message -> { ImmutableJsonTreeNode.Builder builder = ImmutableJsonTreeNode.builder(); builder.label(message.getName()); builder.data(ImmutableNodeData.builder() .type(NodeType.MESSAGE) .ref(message.getCanonicalName()) .build()); List<JsonTreeNode> children = processContainer(message); if (!children.isEmpty()) { builder.children(children); } result.add(builder.build()); }); return result; } }
/** * Get enum that is declared under this container. * * @param name the enum short name * * @return enum instance or null if message with given name is not declared under * this container */ @Nullable default Enum getEnum(String name) { for (Enum anEnum : getEnums()) { if (name.equals(anEnum.getName())) { return anEnum; } } return null; }
private void checkDuplicateEnumConstantValues(Enum anEnum, List<EnumConstant> constants) { DynamicMessage.Value allowAlias = anEnum.getOptions().get(ALLOW_ALIAS); if (allowAlias != null && allowAlias.isBooleanType() && allowAlias.getBoolean()) { // skip this check if aliases are allowed return; } Map<Integer, EnumConstant> constantByValue = new HashMap<>(); for (EnumConstant constant : constants) { Integer value = constant.getValue(); if (constantByValue.containsKey(value)) { throw new ParserException(constant, "Duplicate enum constant value: %d", value); } constantByValue.put(value, constant); } }
@Override public void enterEnumBlock(ProtoParser.EnumBlockContext ctx) { UserTypeContainer parent = context.peek(UserTypeContainer.class); Enum enumBuilder = new Enum(parent); context.push(enumBuilder); }
private String copyDescriptionFromFieldType(Field field) { String comments; FieldType type = field.getType(); if (type instanceof Message) { comments = ((Message) type).getComments(); } else if (type instanceof Enum) { comments = ((Enum) type).getComments(); } else { comments = ""; } return comments; }
@Override public void exitEnumField(ProtoParser.EnumFieldContext ctx) { EnumConstant enumConstant = context.pop(EnumConstant.class); final Enum e = context.peek(Enum.class); String name = ctx.enumFieldName().getText(); int number = Integer.decode(ctx.enumFieldValue().getText()); enumConstant.setName(name); enumConstant.setValue(number); enumConstant.setSourceCodeLocation(getSourceCodeLocation(ctx)); e.addConstant(enumConstant); attachComments(ctx, enumConstant, true); }
private void walk(Enum anEnum) { for (Processor<EnumConstant> enumConstantProcessor : enumConstantProcessors) { for (EnumConstant enumConstant : anEnum.getConstants()) { enumConstantProcessor.run(context, enumConstant); } } }
protected void enumToString(Enum enumValue, StringBuilder sb) { appendLine(sb, "enum %s {", enumValue.getName()); for (EnumConstant enumConstant : enumValue.getConstants()) { appendLine(sb, " %s = %s;", enumConstant.getName(), enumConstant.getValue()); } sb.append("}\n\n"); }