private TypeName fieldType(Field field) { ProtoType type = field.type(); if (type.isMap()) { return ParameterizedTypeName.get(ClassName.get(Map.class), typeName(type.keyType()), typeName(type.valueType())); } TypeName messageType = typeName(type); return field.isRepeated() ? listOf(messageType) : messageType; }
adapter.addField(FieldSpec.builder(adapterType, field.name(), PRIVATE, FINAL) .initializer("$T.newMapAdapter($L, $L)", ADAPTER, singleAdapterFor(field.type().keyType()), singleAdapterFor(field.type().valueType())) .build());
@Test public void linkMessage() throws Exception { Schema schema = new RepoBuilder() .add("message.proto", "" + "import \"foo.proto\";\n" + "message Message {\n" + " optional foo_package.Foo field = 1;\n" + " map<string, foo_package.Bar> bars = 2;\n" + "}\n") .add("foo.proto", "" + "package foo_package;\n" + "message Foo {\n" + "}\n" + "message Bar {\n" + "}\n") .schema(); MessageType message = (MessageType) schema.getType("Message"); Field field = message.field("field"); assertThat(field.type()).isEqualTo(schema.getType("foo_package.Foo").type()); ProtoType bars = message.field("bars").type(); assertThat(bars.keyType()).isEqualTo(ProtoType.STRING); assertThat(bars.valueType()).isEqualTo(schema.getType("foo_package.Bar").type()); }
private ProtoType resolveType(String name, boolean messageOnly) { ProtoType type = ProtoType.get(name); if (type.isScalar()) { if (messageOnly) { addError("expected a message but was %s", name); } return type; } if (type.isMap()) { if (messageOnly) { addError("expected a message but was %s", name); } ProtoType keyType = resolveType(type.keyType().toString(), false); ProtoType valueType = resolveType(type.valueType().toString(), false); return new ProtoType(keyType, valueType, name); } Type resolved = resolve(name, protoTypeNames); if (resolved == null) { addError("unable to resolve %s", name); return ProtoType.BYTES; // Just return any placeholder. } if (messageOnly && !(resolved instanceof MessageType)) { addError("expected a message but was %s", name); return ProtoType.BYTES; // Just return any placeholder. } return resolved.type(); }
private AnnotationSpec wireFieldAnnotation(Field field) { AnnotationSpec.Builder result = AnnotationSpec.builder(WireField.class); int tag = field.tag(); result.addMember("tag", String.valueOf(tag)); if (field.type().isMap()) { result.addMember("keyAdapter", "$S", adapterString(field.type().keyType())); result.addMember("adapter", "$S", adapterString(field.type().valueType())); } else { result.addMember("adapter", "$S", adapterString(field.type())); } if (!field.isOptional()) { if (field.isPacked()) { result.addMember("label", "$T.PACKED", WireField.Label.class); } else if (field.label() != null) { result.addMember("label", "$T.$L", WireField.Label.class, field.label()); } } if (field.isRedacted()) { result.addMember("redacted", "true"); } return result.build(); }
private TypeName fieldType(Field field) { ProtoType type = field.type(); if (type.isMap()) { return ParameterizedTypeName.get(ClassName.get(Map.class), typeName(type.keyType()), typeName(type.valueType())); } TypeName messageType = typeName(type); return field.isRepeated() ? listOf(messageType) : messageType; }
private TypeName fieldType(Field field) { ProtoType type = field.type(); if (type.isMap()) { return ParameterizedTypeName.get(ClassName.get(Map.class), typeName(type.keyType()), typeName(type.valueType())); } TypeName messageType = typeName(type); if (messageType.equals(BYTE_STRING)) { messageType = ArrayTypeName.of(byte.class); } return field.isRepeated() ? listOf(messageType) : messageType; }
private TypeSpec messageAdapter(NameAllocator nameAllocator, MessageType type, ClassName javaType, ClassName adapterJavaType, ClassName builderJavaType) { TypeSpec.Builder adapter = TypeSpec.classBuilder(adapterJavaType.simpleName()) .addModifiers(PRIVATE, STATIC, FINAL) .superclass(adapterOf(javaType)); adapter.addMethod(MethodSpec.constructorBuilder() .addStatement("super($T.LENGTH_DELIMITED, $T.class)", FieldEncoding.class, javaType) .build()); adapter.addMethod(messageAdapterEncodedSize(nameAllocator, type, javaType)); adapter.addMethod(messageAdapterEncode(nameAllocator, type, javaType)); adapter.addMethod(messageAdapterDecode(nameAllocator, type, javaType, builderJavaType)); adapter.addMethod(messageAdapterRedact(nameAllocator, type, javaType, builderJavaType)); for (Field field : type.fieldsAndOneOfFields()) { if (field.type().isMap()) { TypeName adapterType = adapterOf(fieldType(field)); adapter.addField(FieldSpec.builder(adapterType, field.name(), PRIVATE, FINAL) .initializer("$T.newMapAdapter($L, $L)", ADAPTER, singleAdapterFor(field.type().keyType()), singleAdapterFor(field.type().valueType())) .build()); } } return adapter.build(); }
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(); }
private ProtoType resolveType(String name, boolean messageOnly) { ProtoType type = ProtoType.get(name); if (type.isScalar()) { if (messageOnly) { addError("expected a message but was %s", name); } return type; } if (type.isMap()) { if (messageOnly) { addError("expected a message but was %s", name); } ProtoType keyType = resolveType(type.keyType().toString(), false); ProtoType valueType = resolveType(type.valueType().toString(), false); return new ProtoType(keyType, valueType, name); } Type resolved = resolve(name, protoTypeNames); if (resolved == null) { addError("unable to resolve %s", name); return ProtoType.BYTES; // Just return any placeholder. } if (messageOnly && !(resolved instanceof MessageType)) { addError("expected a message but was %s", name); return ProtoType.BYTES; // Just return any placeholder. } return resolved.type(); }
private AnnotationSpec wireFieldAnnotation(Field field) { AnnotationSpec.Builder result = AnnotationSpec.builder(WireField.class); int tag = field.tag(); result.addMember("tag", String.valueOf(tag)); if (field.type().isMap()) { result.addMember("keyAdapter", "$S", adapterString(field.type().keyType())); result.addMember("adapter", "$S", adapterString(field.type().valueType())); } else { result.addMember("adapter", "$S", adapterString(field.type())); } if (!field.isOptional()) { if (field.isPacked()) { result.addMember("label", "$T.PACKED", WireField.Label.class); } else if (field.label() != null) { result.addMember("label", "$T.$L", WireField.Label.class, field.label()); } } if (field.isRedacted()) { result.addMember("redacted", "true"); } return result.build(); }
private ProtoType resolveType(String name, boolean messageOnly) { ProtoType type = ProtoType.get(name); if (type.isScalar()) { if (messageOnly) { addError("expected a message but was %s", name); } return type; } if (type.isMap()) { if (messageOnly) { addError("expected a message but was %s", name); } ProtoType keyType = resolveType(type.keyType().toString(), false); ProtoType valueType = resolveType(type.valueType().toString(), false); return new ProtoType(keyType, valueType, name); } Type resolved = resolve(name, protoTypeNames); if (resolved == null) { addError("unable to resolve %s", name); return ProtoType.BYTES; // Just return any placeholder. } if (messageOnly && !(resolved instanceof MessageType)) { addError("expected a message but was %s", name); return ProtoType.BYTES; // Just return any placeholder. } return resolved.type(); }