public ImmutableList<Field> fieldsAndOneOfFields() { ImmutableList.Builder<Field> result = ImmutableList.builder(); result.addAll(declaredFields); result.addAll(extensionFields); for (OneOf oneOf : oneOfs) { result.addAll(oneOf.fields()); } return result.build(); }
OneOf retainAll(Schema schema, MarkSet markSet, ProtoType enclosingType) { ImmutableList<Field> retainedFields = Field.retainAll(schema, markSet, enclosingType, fields); if (retainedFields.isEmpty()) return null; return new OneOf(name, documentation, retainedFields); }
static MessageType fromElement(String packageName, ProtoType protoType, MessageElement messageElement) { if (!messageElement.groups().isEmpty()) { GroupElement group = messageElement.groups().get(0); throw new IllegalStateException(group.location() + ": 'group' is not supported"); } ImmutableList<Field> declaredFields = Field.fromElements(packageName, messageElement.fields(), false); // Extension fields be populated during linking. List<Field> extensionFields = new ArrayList<>(); ImmutableList<OneOf> oneOfs = OneOf.fromElements(packageName, messageElement.oneOfs(), false); ImmutableList.Builder<Type> nestedTypes = ImmutableList.builder(); for (TypeElement nestedType : messageElement.nestedTypes()) { nestedTypes.add(Type.get(packageName, protoType.nestedType(nestedType.name()), nestedType)); } ImmutableList<Extensions> extensionsList = Extensions.fromElements(messageElement.extensions()); ImmutableList<Reserved> reserveds = Reserved.fromElements(messageElement.reserveds()); Options options = new Options(Options.MESSAGE_OPTIONS, messageElement.options()); return new MessageType(protoType, messageElement.location(), messageElement.documentation(), messageElement.name(), declaredFields, extensionFields, oneOfs, nestedTypes.build(), extensionsList, reserveds, options); }
@Test public void retainFieldRetainsOneOf() throws Exception { Schema schema = new RepoBuilder() .add("service.proto", "" + "message Message {\n" + " oneof selection {\n" + " string a = 1;\n" + " string b = 2;\n" + " }\n" + " optional string c = 3;\n" + "}\n") .schema(); Schema pruned = schema.prune(new IdentifierSet.Builder() .include("Message#b") .build()); MessageType message = (MessageType) pruned.getType("Message"); OneOf onlyOneOf = getOnlyElement(message.oneOfs()); assertThat(onlyOneOf.name()).isEqualTo("selection"); assertThat(getOnlyElement(onlyOneOf.fields()).name()).isEqualTo("b"); assertThat(message.field("a")).isNull(); assertThat(message.field("c")).isNull(); }
MessageElement toElement() { return MessageElement.builder(location) .documentation(documentation) .name(name) .options(options.toElements()) .fields(Field.toElements(declaredFields)) .nestedTypes(Type.toElements(nestedTypes)) .oneOfs(OneOf.toElements(oneOfs)) .extensions(Extensions.toElements(extensionsList)) .reserveds(Reserved.toElements(reserveds)) .build(); } }
void link(Linker linker) { linker = linker.withContext(this); for (Field field : declaredFields) { field.link(linker); } for (Field field : extensionFields) { field.link(linker); } for (OneOf oneOf : oneOfs) { oneOf.link(linker); } for (Type type : nestedTypes) { type.link(linker); } }
void linkOptions(Linker linker) { linker = linker.withContext(this); for (Type type : nestedTypes) { type.linkOptions(linker); } for (Field field : declaredFields) { field.linkOptions(linker); } for (Field field : extensionFields) { field.linkOptions(linker); } for (OneOf oneOf : oneOfs) { oneOf.linkOptions(linker); } options.link(linker); }
@Override Type retainAll(Schema schema, MarkSet markSet) { ImmutableList.Builder<Type> retainedNestedTypesBuilder = ImmutableList.builder(); for (Type nestedType : nestedTypes) { Type retainedNestedType = nestedType.retainAll(schema, markSet); if (retainedNestedType != null) { retainedNestedTypesBuilder.add(retainedNestedType); } } ImmutableList<Type> retainedNestedTypes = retainedNestedTypesBuilder.build(); if (!markSet.contains(protoType)) { // If this type is not retained, and none of its nested types are retained, prune it. if (retainedNestedTypes.isEmpty()) { return null; } // If this type is not retained but retained nested types, replace it with an enclosing type. return new EnclosingType(location, protoType, documentation, retainedNestedTypes); } ImmutableList.Builder<OneOf> retainedOneOfsBuilder = ImmutableList.builder(); for (OneOf oneOf : oneOfs) { OneOf retainedOneOf = oneOf.retainAll(schema, markSet, protoType); if (retainedOneOf != null) { retainedOneOfsBuilder.add(retainedOneOf); } } ImmutableList<OneOf> retainedOneOfs = retainedOneOfsBuilder.build(); return new MessageType(protoType, location, documentation, name, Field.retainAll(schema, markSet, protoType, declaredFields), Field.retainAll(schema, markSet, protoType, extensionFields), retainedOneOfs, retainedNestedTypes, extensionsList, reserveds, options.retainAll(schema, markSet)); }
private AnnotationSpec wireFieldAnnotation(Field field, ImmutableList<OneOf> oneOVES) { AnnotationSpec.Builder result = AnnotationSpec.builder(RaptorField.class); ProtoType type = field.type(); result.addMember("fieldType", "$S", getTypeString(type)); if (type.isMap()) { result.addMember("keyType", "$S", getTypeString(type.keyType())); } int tag = field.tag(); result.addMember("order", String.valueOf(tag)); result.addMember("name", "$S", field.name()); if (type.isMap()) { result.addMember("isMap", "true"); } if (field.isRepeated()) { result.addMember("repeated", "true"); } for (OneOf oneOF : oneOVES) { if (oneOF.fields().contains(field)) { result.addMember("oneof", "$S", oneOF.name()); } } return result.build(); }
MessageElement toElement() { return MessageElement.builder(location) .documentation(documentation) .name(name) .options(options.toElements()) .fields(Field.toElements(declaredFields)) .nestedTypes(Type.toElements(nestedTypes)) .oneOfs(OneOf.toElements(oneOfs)) .extensions(Extensions.toElements(extensionsList)) .reserveds(Reserved.toElements(reserveds)) .build(); } }
void link(Linker linker) { linker = linker.withContext(this); for (Field field : declaredFields) { field.link(linker); } for (Field field : extensionFields) { field.link(linker); } for (OneOf oneOf : oneOfs) { oneOf.link(linker); } for (Type type : nestedTypes) { type.link(linker); } }
void linkOptions(Linker linker) { linker = linker.withContext(this); for (Type type : nestedTypes) { type.linkOptions(linker); } for (Field field : declaredFields) { field.linkOptions(linker); } for (Field field : extensionFields) { field.linkOptions(linker); } for (OneOf oneOf : oneOfs) { oneOf.linkOptions(linker); } options.link(linker); }
@Override Type retainAll(Schema schema, MarkSet markSet) { ImmutableList.Builder<Type> retainedNestedTypesBuilder = ImmutableList.builder(); for (Type nestedType : nestedTypes) { Type retainedNestedType = nestedType.retainAll(schema, markSet); if (retainedNestedType != null) { retainedNestedTypesBuilder.add(retainedNestedType); } } ImmutableList<Type> retainedNestedTypes = retainedNestedTypesBuilder.build(); if (!markSet.contains(protoType)) { // If this type is not retained, and none of its nested types are retained, prune it. if (retainedNestedTypes.isEmpty()) { return null; } // If this type is not retained but retained nested types, replace it with an enclosing type. return new EnclosingType(location, protoType, documentation, retainedNestedTypes); } ImmutableList.Builder<OneOf> retainedOneOfsBuilder = ImmutableList.builder(); for (OneOf oneOf : oneOfs) { OneOf retainedOneOf = oneOf.retainAll(schema, markSet, protoType); if (retainedOneOf != null) { retainedOneOfsBuilder.add(retainedOneOf); } } ImmutableList<OneOf> retainedOneOfs = retainedOneOfsBuilder.build(); return new MessageType(protoType, location, documentation, name, Field.retainAll(schema, markSet, protoType, declaredFields), Field.retainAll(schema, markSet, protoType, extensionFields), retainedOneOfs, retainedNestedTypes, extensionsList, reserveds, options.retainAll(schema, markSet)); }
/** Returns the field named {@code name}, or null if this type has no such field. */ public Field field(String name) { for (Field field : declaredFields) { if (field.name().equals(name)) { return field; } } for (OneOf oneOf : oneOfs) { for (Field field : oneOf.fields()) { if (field.name().equals(name)) { return field; } } } return null; }
static ImmutableList<OneOf> fromElements(String packageName, ImmutableList<OneOfElement> elements, boolean extension) { ImmutableList.Builder<OneOf> oneOfs = ImmutableList.builder(); for (OneOfElement oneOf : elements) { if (!oneOf.groups().isEmpty()) { GroupElement group = oneOf.groups().get(0); throw new IllegalStateException(group.location() + ": 'group' is not supported"); } oneOfs.add(new OneOf(oneOf.name(), oneOf.documentation(), Field.fromElements(packageName, oneOf.fields(), extension))); } return oneOfs.build(); }
MessageElement toElement() { return MessageElement.builder(location) .documentation(documentation) .name(name) .options(options.toElements()) .fields(Field.toElements(declaredFields)) .nestedTypes(Type.toElements(nestedTypes)) .oneOfs(OneOf.toElements(oneOfs)) .extensions(Extensions.toElements(extensionsList)) .reserveds(Reserved.toElements(reserveds)) .build(); } }
void link(Linker linker) { linker = linker.withContext(this); for (Field field : declaredFields) { field.link(linker); } for (Field field : extensionFields) { field.link(linker); } for (OneOf oneOf : oneOfs) { oneOf.link(linker); } for (Type type : nestedTypes) { type.link(linker); } }
void linkOptions(Linker linker) { linker = linker.withContext(this); for (Type type : nestedTypes) { type.linkOptions(linker); } for (Field field : declaredFields) { field.linkOptions(linker); } for (Field field : extensionFields) { field.linkOptions(linker); } for (OneOf oneOf : oneOfs) { oneOf.linkOptions(linker); } options.link(linker); }
static MessageType fromElement(String packageName, ProtoType protoType, MessageElement messageElement) { if (!messageElement.groups().isEmpty()) { throw new IllegalStateException("'group' is not supported"); } ImmutableList<Field> declaredFields = Field.fromElements(packageName, messageElement.fields(), false); // Extension fields be populated during linking. List<Field> extensionFields = new ArrayList<>(); ImmutableList<OneOf> oneOfs = OneOf.fromElements(packageName, messageElement.oneOfs(), false); ImmutableList.Builder<Type> nestedTypes = ImmutableList.builder(); for (TypeElement nestedType : messageElement.nestedTypes()) { nestedTypes.add(Type.get(packageName, protoType.nestedType(nestedType.name()), nestedType)); } ImmutableList<Extensions> extensionsList = Extensions.fromElements(messageElement.extensions()); ImmutableList<Reserved> reserveds = Reserved.fromElements(messageElement.reserveds()); Options options = new Options(Options.MESSAGE_OPTIONS, messageElement.options()); return new MessageType(protoType, messageElement.location(), messageElement.documentation(), messageElement.name(), declaredFields, extensionFields, oneOfs, nestedTypes.build(), extensionsList, reserveds, options); }
@Override Type retainAll(Schema schema, MarkSet markSet) { ImmutableList.Builder<Type> retainedNestedTypesBuilder = ImmutableList.builder(); for (Type nestedType : nestedTypes) { Type retainedNestedType = nestedType.retainAll(schema, markSet); if (retainedNestedType != null) { retainedNestedTypesBuilder.add(retainedNestedType); } } ImmutableList<Type> retainedNestedTypes = retainedNestedTypesBuilder.build(); if (!markSet.contains(protoType)) { // If this type is not retained, and none of its nested types are retained, prune it. if (retainedNestedTypes.isEmpty()) { return null; } // If this type is not retained but retained nested types, replace it with an enclosing type. return new EnclosingType(location, protoType, documentation, retainedNestedTypes); } ImmutableList.Builder<OneOf> retainedOneOfsBuilder = ImmutableList.builder(); for (OneOf oneOf : oneOfs) { OneOf retainedOneOf = oneOf.retainAll(schema, markSet, protoType); if (retainedOneOf != null) { retainedOneOfsBuilder.add(retainedOneOf); } } ImmutableList<OneOf> retainedOneOfs = retainedOneOfsBuilder.build(); return new MessageType(protoType, location, documentation, name, Field.retainAll(schema, markSet, protoType, declaredFields), Field.retainAll(schema, markSet, protoType, extensionFields), retainedOneOfs, retainedNestedTypes, extensionsList, reserveds, options.retainAll(schema, markSet)); }