MessageElement.Builder builder = MessageElement.builder(location) .name(name) .documentation(documentation);
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 addMultipleExtensions() { ExtensionsElement fives = ExtensionsElement.create(location, 500, 501, ""); ExtensionsElement sixes = ExtensionsElement.create(location, 600, 601, ""); MessageElement element = MessageElement.builder(location) .name("Message") .fields(ImmutableList.of( FieldElement.builder(location) .label(REQUIRED) .type("string") .name("name") .tag(1) .build())) .extensions(ImmutableList.of(fives, sixes)) .build(); assertThat(element.extensions()).hasSize(2); }
@Test public void addMultipleOptions() { FieldElement field = FieldElement.builder(location) .label(REQUIRED) .type("string") .name("name") .tag(1) .build(); OptionElement kitKat = OptionElement.create("kit", Kind.STRING, "kat"); OptionElement fooBar = OptionElement.create("foo", Kind.STRING, "bar"); MessageElement element = MessageElement.builder(location) .name("Message") .fields(ImmutableList.of(field)) .options(ImmutableList.of(kitKat, fooBar)) .build(); assertThat(element.options()).hasSize(2); }
@Test public void addMultipleFields() { FieldElement firstName = FieldElement.builder(location) .label(REQUIRED) .type("string") .name("first_name") .tag(1) .build(); FieldElement lastName = FieldElement.builder(location) .label(REQUIRED) .type("string") .name("last_name") .tag(2) .build(); MessageElement element = MessageElement.builder(location) .name("Message") .fields(ImmutableList.of(firstName, lastName)) .build(); assertThat(element.fields()).hasSize(2); }
@Test public void addMultipleOneOfs() { OneOfElement hi = OneOfElement.builder() .name("hi") .fields(ImmutableList.of( FieldElement.builder(location) .type("string") .name("name") .tag(1) .build())) .build(); OneOfElement hey = OneOfElement.builder() .name("hey") .fields(ImmutableList.of( FieldElement.builder(location) .type("string") .name("city") .tag(2) .build())) .build(); MessageElement element = MessageElement.builder(location) .name("Message") .oneOfs(ImmutableList.of(hi, hey)) .build(); assertThat(element.oneOfs()).hasSize(2); }
@Test public void trailingCommentNotAssignedToFollowingField() { String proto = "" + "message Test {\n" + " optional string first_name = 1; // Testing!\n" + " optional string last_name = 2;\n" + "}"; ProtoFileElement parsed = ProtoParser.parse(location, proto); MessageElement message = (MessageElement) parsed.types().get(0); FieldElement field1 = message.fields().get(0); assertThat(field1.documentation()).isEqualTo("Testing!"); FieldElement field2 = message.fields().get(1); assertThat(field2.documentation()).isEqualTo(""); }
@Test public void messageFieldLeadingAndTrailingCommentAreCombined() { String proto = "" + "message Test {\n" + " // Test all...\n" + " optional string name = 1; // ...the things!\n" + "}"; ProtoFileElement parsed = ProtoParser.parse(location, proto); MessageElement message = (MessageElement) parsed.types().get(0); FieldElement field = message.fields().get(0); assertThat(field.documentation()).isEqualTo("Test all...\n...the things!"); }
@Override public final String toSchema() { StringBuilder builder = new StringBuilder(); appendDocumentation(builder, documentation()); builder.append("message ") .append(name()) .append(" {"); if (!reserveds().isEmpty()) { builder.append('\n'); for (ReservedElement reserved : reserveds()) { appendIndented(builder, reserved.toSchema()); if (!options().isEmpty()) { builder.append('\n'); for (OptionElement option : options()) { appendIndented(builder, option.toSchemaDeclaration()); if (!fields().isEmpty()) { builder.append('\n'); for (FieldElement field : fields()) { appendIndented(builder, field.toSchema()); if (!oneOfs().isEmpty()) { builder.append('\n'); for (OneOfElement oneOf : oneOfs()) { appendIndented(builder, oneOf.toSchema()); if (!groups().isEmpty()) { builder.append('\n'); for (GroupElement group : groups()) { appendIndented(builder, group.toSchema());
MessageElement toElement() { return MessageElement.builder(location) .name(type.simpleName()) .nestedTypes(Type.toElements(nestedTypes)) .build(); } }
@Test public void messageFieldTrailingComment() { // Trailing message field comment. String proto = "" + "message Test {\n" + " optional string name = 1; // Test all the things!\n" + "}"; ProtoFileElement parsed = ProtoParser.parse(location, proto); MessageElement message = (MessageElement) parsed.types().get(0); FieldElement field = message.fields().get(0); assertThat(field.documentation()).isEqualTo("Test all the things!"); }
Builder(MessageElement source) { this.location = source.location(); this.name = source.name(); this.documentation = source.documentation(); this.nestedTypes = source.nestedTypes(); this.options = source.options(); this.reserveds = source.reserveds(); this.fields = source.fields(); this.oneOfs = source.oneOfs(); this.extensions = source.extensions(); this.groups = source.groups(); } @Override
@Test public void emptyToSchema() { TypeElement element = MessageElement.builder(location).name("Message").build(); String expected = "message Message {}\n"; assertThat(element.toSchema()).isEqualTo(expected); }
@Override public boolean equals(Object o) { if (o == this) { return true; } if (o instanceof MessageElement) { MessageElement that = (MessageElement) o; return (this.location.equals(that.location())) && (this.name.equals(that.name())) && (this.documentation.equals(that.documentation())) && (this.nestedTypes.equals(that.nestedTypes())) && (this.options.equals(that.options())) && (this.reserveds.equals(that.reserveds())) && (this.fields.equals(that.fields())) && (this.oneOfs.equals(that.oneOfs())) && (this.extensions.equals(that.extensions())) && (this.groups.equals(that.groups())); } return false; }
@Test public void reservedToSchema() { TypeElement element = MessageElement.builder(location) .name("Message") .reserveds(ImmutableList.of( ReservedElement.create(location, "", ImmutableList.<Object>of(10, Range.closed(12, 14), "foo")), ReservedElement.create(location, "", ImmutableList.<Object>of(10)), ReservedElement.create(location, "", ImmutableList.<Object>of(Range.closed(12, 14))), ReservedElement.create(location, "", ImmutableList.<Object>of("foo")))) .build(); String expected = "" + "message Message {\n" + " reserved 10, 12 to 14, \"foo\";\n" + " reserved 10;\n" + " reserved 12 to 14;\n" + " reserved \"foo\";\n" + "}\n"; assertThat(element.toSchema()).isEqualTo(expected); }
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); }
@Test public void addMultiplePublicDependencies() { TypeElement element = MessageElement.builder(location).name("Message").build(); ProtoFileElement file = ProtoFileElement.builder(location) .publicImports(ImmutableList.of("example.other", "example.another")) .types(ImmutableList.of(element)) .build(); assertThat(file.publicImports()).hasSize(2); }
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); }
@Test public void addMultipleDependencies() { TypeElement element = MessageElement.builder(location).name("Message").build(); ProtoFileElement file = ProtoFileElement.builder(location) .imports(ImmutableList.of("example.other", "example.another")) .types(ImmutableList.of(element)) .build(); assertThat(file.imports()).hasSize(2); }
@Override public final String toSchema() { StringBuilder builder = new StringBuilder(); appendDocumentation(builder, documentation()); builder.append("message ") .append(name()) .append(" {"); if (!reserveds().isEmpty()) { builder.append('\n'); for (ReservedElement reserved : reserveds()) { appendIndented(builder, reserved.toSchema()); if (!options().isEmpty()) { builder.append('\n'); for (OptionElement option : options()) { appendIndented(builder, option.toSchemaDeclaration()); if (!fields().isEmpty()) { builder.append('\n'); for (FieldElement field : fields()) { appendIndented(builder, field.toSchema()); if (!oneOfs().isEmpty()) { builder.append('\n'); for (OneOfElement oneOf : oneOfs()) { appendIndented(builder, oneOf.toSchema()); if (!groups().isEmpty()) { builder.append('\n'); for (GroupElement group : groups()) { appendIndented(builder, group.toSchema());