static ImmutableList<Field> retainAll( Schema schema, MarkSet markSet, ProtoType enclosingType, Collection<Field> fields) { ImmutableList.Builder<Field> result = ImmutableList.builder(); for (Field field : fields) { Field retainedField = field.retainAll(schema, markSet); if (retainedField != null && markSet.contains(ProtoMember.get(enclosingType, field.name()))) { result.add(retainedField); } } return result.build(); }
public Field getField(ProtoMember protoMember) { Type type = getType(protoMember.type()); if (!(type instanceof MessageType)) return null; Field field = ((MessageType) type).field(protoMember.member()); if (field == null) { field = ((MessageType) type).extensionField(protoMember.member()); } return field; }
public static ProtoMember get(ProtoType type, String member) { return new ProtoMember(type, member); }
@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"); }
/** * Marks a member as transitively reachable by the includes set. Returns true if the mark is new, * the member will be retained, and its own dependencies should be traversed. */ boolean mark(ProtoMember protoMember) { if (protoMember == null) throw new NullPointerException("type == null"); if (identifierSet.excludes(protoMember)) return false; return members.containsKey(protoMember.type()) ? members.put(protoMember.type(), protoMember) : types.add(protoMember.type()); }
/** * Returns true if any of the options in {@code options} matches both of the regular expressions * provided: its name matches the option's name and its value matches the option's value. */ public boolean optionMatches(String namePattern, String valuePattern) { Matcher nameMatcher = Pattern.compile(namePattern).matcher(""); Matcher valueMatcher = Pattern.compile(valuePattern).matcher(""); for (Map.Entry<ProtoMember, Object> entry : map.entrySet()) { if (nameMatcher.reset(entry.getKey().member()).matches() && valueMatcher.reset(String.valueOf(entry.getValue())).matches()) { return true; } } return false; }
/** Returns true if {@code protoMember} should be excluded. */ public boolean excludes(ProtoMember protoMember) { return exclude(protoMember.toString()); }
private FieldSpec optionsField(ProtoType optionsType, String fieldName, Options options) { TypeName optionsJavaType = typeName(optionsType); CodeBlock.Builder initializer = CodeBlock.builder(); initializer.add("$[new $T.Builder()", optionsJavaType); boolean empty = true; for (Map.Entry<ProtoMember, ?> entry : options.map().entrySet()) { if (entry.getKey().equals(FIELD_DEPRECATED) || entry.getKey().equals(PACKED)) { continue; } Field optionField = schema.getField(entry.getKey()); initializer.add("\n.$L($L)", fieldName(optionsType, optionField), fieldInitializer(optionField.type(), entry.getValue())); empty = false; } initializer.add("\n.build()$]"); if (empty) return null; return FieldSpec.builder(optionsJavaType, fieldName) .addModifiers(PUBLIC, STATIC, FINAL) .initializer(initializer.build()) .build(); }
/** Returns true if {@code member} is marked and should be retained. */ boolean contains(ProtoMember protoMember) { if (protoMember == null) throw new NullPointerException("protoMember == null"); if (identifierSet.excludes(protoMember)) return false; return members.containsKey(protoMember.type()) ? members.containsEntry(protoMember.type(), protoMember) : types.contains(protoMember.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"); }
/** Returns true if {@code protoMember} is a root. */ public boolean includes(ProtoMember protoMember) { return includes(protoMember.toString()); }
private FieldSpec optionsField(ProtoType optionsType, String fieldName, Options options) { TypeName optionsJavaType = typeName(optionsType); CodeBlock.Builder initializer = CodeBlock.builder(); initializer.add("$[new $T.Builder()", optionsJavaType); boolean empty = true; for (Map.Entry<ProtoMember, ?> entry : options.map().entrySet()) { if (entry.getKey().equals(FIELD_DEPRECATED) || entry.getKey().equals(PACKED)) { continue; } Field optionField = schema.getField(entry.getKey()); initializer.add("\n.$L($L)", fieldName(optionsType, optionField), fieldInitializer(optionField.type(), entry.getValue())); empty = false; } initializer.add("\n.build()$]"); if (empty) return null; return FieldSpec.builder(optionsJavaType, fieldName) .addModifiers(PUBLIC, STATIC, FINAL) .initializer(initializer.build()) .build(); }
@Override Type retainAll(Schema schema, MarkSet markSet) { // If this type is not retained, prune it. if (!markSet.contains(protoType)) return null; ImmutableList.Builder<EnumConstant> retainedConstants = ImmutableList.builder(); for (EnumConstant constant : constants) { if (markSet.contains(ProtoMember.get(protoType, constant.name()))) { retainedConstants.add(constant.retainAll(schema, markSet)); } } EnumType result = new EnumType(protoType, location, documentation, name, retainedConstants.build(), options.retainAll(schema, markSet)); result.allowAlias = allowAlias; return result; }
if (root instanceof ProtoMember) { ProtoMember protoMember = (ProtoMember) root; mark(protoMember.type()); String member = ((ProtoMember) root).member(); Type type = schema.getType(protoMember.type()); if (type instanceof MessageType) { Field field = ((MessageType) type).field(member); Service service = schema.getService(protoMember.type()); if (service != null) { Rpc rpc = service.rpc(member);
/** * Marks {@code protoMember}, throwing if it is explicitly excluded, or if its enclosing type is * also specifically included. This implicitly excludes other members of the same type. */ void root(ProtoMember protoMember) { if (protoMember == null) throw new NullPointerException("protoMember == null"); checkArgument(!identifierSet.excludes(protoMember)); checkArgument(!types.contains(protoMember.type())); members.put(protoMember.type(), protoMember); }
public static ProtoMember get(String typeAndMember) { int hash = typeAndMember.indexOf('#'); if (hash == -1) throw new IllegalArgumentException("expected a '#' in " + typeAndMember); ProtoType type = ProtoType.get(typeAndMember.substring(0, hash)); String member = typeAndMember.substring(hash + 1); return new ProtoMember(type, member); }
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");
/** Returns true if {@code protoMember} is a root. */ public boolean includes(ProtoMember protoMember) { return includes(protoMember.toString()); }
private FieldSpec optionsField(ProtoType optionsType, String fieldName, Options options) { TypeName optionsJavaType = typeName(optionsType); CodeBlock.Builder initializer = CodeBlock.builder(); initializer.add("$[new $T.Builder()", optionsJavaType); boolean empty = true; for (Map.Entry<ProtoMember, ?> entry : options.map().entrySet()) { if (entry.getKey().equals(FIELD_DEPRECATED) || entry.getKey().equals(PACKED)) { continue; } Field optionField = schema.getField(entry.getKey()); initializer.add("\n.$L($L)", fieldName(optionsType, optionField), fieldInitializer(optionField.type(), entry.getValue())); empty = false; } initializer.add("\n.build()$]"); if (empty) { return null; } return FieldSpec.builder(optionsJavaType, fieldName) .addModifiers(PUBLIC, STATIC, FINAL) .initializer(initializer.build()) .build(); }
Service retainAll(Schema schema, MarkSet markSet) { // If this service is not retained, prune it. if (!markSet.contains(protoType)) { return null; } ImmutableList.Builder<Rpc> retainedRpcs = ImmutableList.builder(); for (Rpc rpc : rpcs) { Rpc retainedRpc = rpc.retainAll(schema, markSet); if (retainedRpc != null && markSet.contains(ProtoMember.get(protoType, rpc.name()))) { retainedRpcs.add(retainedRpc); } } return new Service(protoType, location, documentation, name, retainedRpcs.build(), options.retainAll(schema, markSet)); }