void linkOptions(Linker linker) { linker = linker.withContext(this); options.link(linker); deprecated = options().get(DEPRECATED); packed = options().get(PACKED); // We allow any package name to be used as long as it ends with '.redacted'. redacted = options().optionMatches(".*\\.redacted", "true"); }
private void markField(ProtoType declaringType, Field field) { if (marks.contains(ProtoMember.get(declaringType, field.name()))) { markOptions(field.options()); mark(field.type()); } }
@Test public void excludedTypePrunesTopLevelOption() throws Exception { Schema schema = new RepoBuilder() .add("service.proto", "" + "import \"google/protobuf/descriptor.proto\";\n" + "message SomeFieldOptions {\n" + " optional string a = 1;\n" + "}\n" + "extend google.protobuf.FieldOptions {\n" + " optional SomeFieldOptions some_field_options = 22001;\n" + " optional string b = 22002;\n" + "}\n" + "message Message {\n" + " optional string f = 1 [some_field_options.a = \"a\", b = \"b\"];\n" + "}\n") .schema(); Schema pruned = schema.prune(new IdentifierSet.Builder() .exclude("SomeFieldOptions") .build()); Field field = ((MessageType) pruned.getType("Message")).field("f"); Map<ProtoMember, Object> map = field.options().map(); Map.Entry<?, ?> onlyOption = getOnlyElement(map.entrySet()); assertThat(((ProtoMember) onlyOption.getKey()).member()).isEqualTo("b"); assertThat(onlyOption.getValue()).isEqualTo("b"); }
@Test public void excludedFieldPrunesNestedOption() throws Exception { Schema schema = new RepoBuilder() .add("service.proto", "" + "import \"google/protobuf/descriptor.proto\";\n" + "message SomeFieldOptions {\n" + " optional string a = 1;\n" + " optional string b = 2;\n" + "}\n" + "extend google.protobuf.FieldOptions {\n" + " optional SomeFieldOptions some_field_options = 22001;\n" + "}\n" + "message Message {\n" + " optional string f = 1 [some_field_options = { a: \"a\", b: \"b\" }];\n" + "}\n") .schema(); Schema pruned = schema.prune(new IdentifierSet.Builder() .exclude("SomeFieldOptions#b") .build()); Field field = ((MessageType) pruned.getType("Message")).field("f"); Map<?, ?> map = (Map<?, ?>) field.options().get( ProtoMember.get(FIELD_OPTIONS, "some_field_options")); Map.Entry<?, ?> onlyOption = getOnlyElement(map.entrySet()); assertThat(((ProtoMember) onlyOption.getKey()).member()).isEqualTo("a"); assertThat(onlyOption.getValue()).isEqualTo("a"); }
.build()); Field field = ((MessageType) pruned.getType("Message")).field("f"); Map<ProtoMember, Object> map = field.options().map(); Map.Entry<?, ?> onlyOption = getOnlyElement(map.entrySet()); assertThat(((ProtoMember) onlyOption.getKey()).member()).isEqualTo("b");
@Test public void fieldOptions() throws Exception { Schema schema = new RepoBuilder() .add("message.proto", "" + "import \"google/protobuf/descriptor.proto\";\n" + "message Message {\n" + " optional int32 a = 1;\n" + " optional int32 b = 2 [color=red, deprecated=true, packed=true];\n" + "}\n" + "extend google.protobuf.FieldOptions {\n" + " optional string color = 60001;\n" + "}\n") .schema(); MessageType message = (MessageType) schema.getType("Message"); Options aOptions = message.field("a").options(); assertThat(aOptions.get(ProtoMember.get(FIELD_OPTIONS, "color"))).isNull(); assertThat(aOptions.get(ProtoMember.get(FIELD_OPTIONS, "deprecated"))).isNull(); assertThat(aOptions.get(ProtoMember.get(FIELD_OPTIONS, "packed"))).isNull(); Options bOptions = message.field("b").options(); assertThat(bOptions.get(ProtoMember.get(FIELD_OPTIONS, "color"))).isEqualTo("red"); assertThat(bOptions.get(ProtoMember.get(FIELD_OPTIONS, "deprecated"))).isEqualTo("true"); assertThat(bOptions.get(ProtoMember.get(FIELD_OPTIONS, "packed"))).isEqualTo("true"); }
@Test public void structuredAndUnstructuredOptions() throws Exception { // From https://developers.google.com/protocol-buffers/docs/proto#options Schema schema = new RepoBuilder() .add("foo.proto", "" + "import \"google/protobuf/descriptor.proto\";\n" + "message FooOptions {\n" + " optional int32 opt1 = 1;\n" + " optional string opt2 = 2;\n" + "}\n" + "\n" + "extend google.protobuf.FieldOptions {\n" + " optional FooOptions foo_options = 1234;\n" + "}\n" + "\n" + "message Bar {\n" + " optional int32 a = 1 [(foo_options).opt1 = 123, (foo_options).opt2 = \"baz\"];\n" + " optional int32 b = 2 [(foo_options) = { opt1: 456 opt2: \"quux\" }];\n" + "}\n") .schema(); ProtoMember fooOptions = ProtoMember.get(Options.FIELD_OPTIONS, "foo_options"); ProtoMember opt1 = ProtoMember.get(ProtoType.get("FooOptions"), "opt1"); ProtoMember opt2 = ProtoMember.get(ProtoType.get("FooOptions"), "opt2"); MessageType bar = (MessageType) schema.getType("Bar"); assertThat(bar.field("a").options().map()).isEqualTo(ImmutableMap.of( fooOptions, ImmutableMap.of(opt1, "123", opt2, "baz"))); assertThat(bar.field("b").options().map()).isEqualTo(ImmutableMap.of( fooOptions, ImmutableMap.of(opt1, "456", opt2, "quux"))); }
@Test public void excludedFieldPrunesTopLevelOption() throws Exception { Schema schema = new RepoBuilder() .add("service.proto", "" + "import \"google/protobuf/descriptor.proto\";\n" + "extend google.protobuf.FieldOptions {\n" + " optional string a = 22001;\n" + " optional string b = 22002;\n" + "}\n" + "message Message {\n" + " optional string f = 1 [a = \"a\", b = \"b\"];\n" + "}\n") .schema(); Schema pruned = schema.prune(new IdentifierSet.Builder() .exclude("google.protobuf.FieldOptions#b") .build()); Field field = ((MessageType) pruned.getType("Message")).field("f"); assertThat(field.options().get(ProtoMember.get(FIELD_OPTIONS, "a"))).isEqualTo("a"); assertThat(field.options().get(ProtoMember.get(FIELD_OPTIONS, "b"))).isNull(); }
@Test public void textFormatCanOmitMapValueSeparator() throws Exception { Schema schema = new RepoBuilder() .add("foo.proto", "" + "import \"google/protobuf/descriptor.proto\";\n" + "message FooOptions {\n" + " optional BarOptions bar = 2;\n" + "}\n" + "message BarOptions {\n" + " optional int32 baz = 2;\n" + "}\n" + "\n" + "extend google.protobuf.FieldOptions {\n" + " optional FooOptions foo = 1234;\n" + "}\n" + "\n" + "message Message {\n" + " optional int32 b = 2 [(foo) = { bar { baz: 123 } }];\n" + "}\n") .schema(); ProtoMember foo = ProtoMember.get(Options.FIELD_OPTIONS, "foo"); ProtoMember bar = ProtoMember.get(ProtoType.get("FooOptions"), "bar"); ProtoMember baz = ProtoMember.get(ProtoType.get("BarOptions"), "baz"); MessageType message = (MessageType) schema.getType("Message"); assertThat(message.field("b").options().map()).isEqualTo(ImmutableMap.of( foo, ImmutableMap.of(bar, ImmutableMap.of(baz, "123")))); }
@Test public void excludeOptions() throws Exception { Schema schema = new RepoBuilder() .add("service.proto", "" + "import \"google/protobuf/descriptor.proto\";\n" + "extend google.protobuf.FieldOptions {\n" + " optional string a = 22001;\n" + " optional string b = 22002;\n" + "}\n" + "message Message {\n" + " optional string f = 1 [ a = \"a\", b = \"b\" ];\n" + "}\n") .schema(); Schema pruned = schema.prune(new IdentifierSet.Builder() .exclude("google.protobuf.FieldOptions") .build()); Field field = ((MessageType) pruned.getType("Message")).field("f"); assertThat(field.options().map()).isEmpty(); }
String fieldName = nameAllocator.get(field); String optionsFieldName = "FIELD_OPTIONS_" + fieldName.toUpperCase(Locale.US); FieldSpec fieldOptions = optionsField(FIELD_OPTIONS, optionsFieldName, field.options()); if (fieldOptions != null) { builder.addField(fieldOptions);
void linkOptions(Linker linker) { linker = linker.withContext(this); options.link(linker); deprecated = options().get(DEPRECATED); packed = options().get(PACKED); // We allow any package name to be used as long as it ends with '.redacted'. redacted = options().optionMatches(".*\\.redacted", "true"); }
void linkOptions(Linker linker) { linker = linker.withContext(this); options.link(linker); deprecated = options().get(DEPRECATED); packed = options().get(PACKED); // We allow any package name to be used as long as it ends with '.redacted'. redacted = options().optionMatches(".*\\.redacted", "true"); }
private void markField(ProtoType declaringType, Field field) { if (marks.contains(ProtoMember.get(declaringType, field.name()))) { markOptions(field.options()); mark(field.type()); } }
private void markField(ProtoType declaringType, Field field) { if (marks.contains(ProtoMember.get(declaringType, field.name()))) { markOptions(field.options()); mark(field.type()); } }
String fieldName = nameAllocator.get(field); String optionsFieldName = "FIELD_OPTIONS_" + fieldName.toUpperCase(Locale.US); FieldSpec fieldOptions = optionsField(FIELD_OPTIONS, optionsFieldName, field.options()); if (fieldOptions != null) { builder.addField(fieldOptions);
String fieldName = nameAllocator.get(field); String optionsFieldName = "FIELD_OPTIONS_" + fieldName.toUpperCase(Locale.US); FieldSpec fieldOptions = optionsField(FIELD_OPTIONS, optionsFieldName, field.options()); if (fieldOptions != null) { builder.addField(fieldOptions);