/** * Returns the field for the key of a map type. Error if type is not a map. */ public Field getMapKeyField() { Preconditions.checkArgument(isMap()); return messageType.getFields().get(0); }
@Override public String toString() { return "message " + getFullName(); }
/** * Construct a field selector by resolving a field path (as in 'a.b.c') against a message. Returns * null if resolution fails. */ public static FieldSelector resolve(MessageType message, String fieldPath) { Iterator<String> path = FIELD_PATH_SPLITTER.split(fieldPath).iterator(); ImmutableList.Builder<Field> fieldsBuilder = ImmutableList.builder(); MessageType currMessage = message; while (path.hasNext()) { String fieldName = path.next(); Field field = currMessage.lookupField(fieldName); if (field == null) { return null; } fieldsBuilder.add(field); if (path.hasNext()) { if (!field.getType().isMessage()) { return null; } currMessage = field.getType().getMessageType(); } } return new FieldSelector(fieldsBuilder.build()); }
private boolean subCyclic(MessageType message) { if (message.isCyclic()) { return true; } for (Field subMessageField : message.getMessageFields()) { if (subCyclic(subMessageField.getType().getMessageType())) { return true; } } return false; } }
private static Set<ProtoFile> getFilesForMessage(MessageType messageType, boolean messageOnly) { Set<ProtoFile> files = newFileSet(); files.add(messageType.getFile()); if (messageOnly) { return files; } for (Field field : messageType.getFields()) { TypeRef type = field.getType(); if (type.isMessage()) { files.addAll(getFilesForMessage(type.getMessageType(), type.isCyclic())); } } return files; }
@VisitsBefore void visit(MessageType message) { // Add the message to the set of known types. addType(message.getLocation(), message.getFullName(), TypeRef.of(message)); // Add the message's package to the set of known packages addPackage(message.getFile().getFullName()); // Build the field-by-name map for this message, and record field simple names. Map<String, Field> fieldByName = Maps.newLinkedHashMap(); for (Field field : message.getFields()) { fieldNames.add(field.getSimpleName()); Field old = fieldByName.put(field.getSimpleName(), field); if (old != null) { model .getDiagReporter() .report( Diag.error( field.getLocation(), "Duplicate declaration of field '%s'. Previous location: %s", field.getSimpleName(), old.getLocation().getDisplayString())); } } message.setFieldByNameMap(ImmutableMap.copyOf(fieldByName)); }
@VisitsBefore void normalize(MessageType message) { Type.Builder coreTypeBuilder = Type.newBuilder().setName(message.getFullName()); coreTypeBuilder.setSourceContext( SourceContext.newBuilder().setFileName(message.getFile().getLocation().getDisplayString())); coreTypeBuilder.setSyntax(message.getSyntax()); for (Field field : message.getReachableFields()) { com.google.protobuf.Field.Builder coreFieldBuilder = com.google.protobuf.Field.newBuilder() DescriptorNormalization.getOptions(message.getProto(), includeDefaults)); coreTypeBuilder.addAllOneofs(DescriptorNormalization.getOneofs(message.getProto())); types.add(coreTypeBuilder.build());
Mockito.when(shelfName.getSimpleName()).thenReturn("name"); Mockito.when(shelfMessage.getFullName()).thenReturn("library.Shelf"); Mockito.when(shelfMessage.getFields()).thenReturn(ImmutableList.of(shelfName, shelfTheme)); Mockito.when(shelfMessage.getSimpleName()).thenReturn("Shelf"); Mockito.when(shelfMessage.getFields()).thenReturn(ImmutableList.of(shelfName, shelfTheme)); Mockito.when(bookName.getType()).thenReturn(TypeRef.fromPrimitiveName("string")); Mockito.when(bookMessage.getFullName()).thenReturn("library.Book"); Mockito.when(bookMessage.getSimpleName()).thenReturn("Book"); Mockito.when(bookMessage.getFields()).thenReturn(ImmutableList.of(bookAuthor, bookName)); Mockito.doReturn(protoFile).when(bookMessage).getParent();
@Test public void testGetEmptyResource() { MessageType book = libraryProtoFile .getMessages() .stream() .filter(m -> m.getSimpleName().equals("Book")) .findFirst() .get(); Field authorBookField = book.getFields().stream().filter(f -> f.getSimpleName().equals("author")).findFirst().get(); assertThat(protoParser.getResource(authorBookField)).isNull(); }
Field nameField = Mockito.mock(Field.class); Mockito.when(nameField.getParent()).thenReturn(createShelvesRequest); Mockito.when(createShelvesRequest.getFullName()).thenReturn("library.CreateShelvesRequest"); Mockito.when(nameField.getType()).thenReturn(TypeRef.fromPrimitiveName("string")); Mockito.when(nameField.getSimpleName()).thenReturn("name"); Mockito.when(createShelvesRequest.lookupField("book")).thenReturn(bookField); Mockito.when(createShelvesRequest.lookupField("name")).thenReturn(nameField); Mockito.when(createShelvesRequest.getFields()) .thenReturn(ImmutableList.of(bookField, nameField));
static ResourceNameMessageConfig createResourceNameMessageConfig( MessageType message, Map<Resource, ProtoFile> allResources, Map<ResourceSet, ProtoFile> allResourceSets, ProtoParser protoParser) { ImmutableMap.Builder<String, String> builder = ImmutableMap.builder(); for (Field field : message.getFields()) { String baseName = protoParser.getResourceOrSetEntityName(field); if (!Strings.isNullOrEmpty(baseName)) { builder.put(field.getSimpleName(), baseName); continue; } String resourceType = protoParser.getResourceReferenceName(field, allResources, allResourceSets); if (!Strings.isNullOrEmpty(resourceType)) { builder.put(field.getSimpleName(), resourceType); } } ImmutableMap<String, String> fieldEntityMap = builder.build(); if (fieldEntityMap.isEmpty()) { // Return a null config when no fields were resource types; this is so empty proto annotations // don't override the GAPIC config resource name configs. return null; } return new AutoValue_ResourceNameMessageConfig(message.getFullName(), fieldEntityMap); }
private List<GrpcElementDocView> generateMessageDocs( GapicProductConfig productConfig, ModelTypeTable typeTable, SurfaceNamer namer, Collection<MessageType> messages) { ImmutableList.Builder<GrpcElementDocView> messageDocs = ImmutableList.builder(); for (MessageType message : messages) { // Doesn't have to document map entries because a dictionary is used. if (message.isMapEntry()) { continue; } GrpcMessageDocView.Builder doc = GrpcMessageDocView.newBuilder(); doc.name(namer.getMessageTypeName(typeTable, message)); doc.fullName(typeTable.getFullNameFor(TypeRef.of(message))); doc.fileUrl(GapicParser.getFileUrl(message.getFile())); doc.lines(namer.getDocLines(GapicParser.getDocString(message))); doc.properties( generateMessagePropertyDocs( typeTable, namer, FieldConfig.toFieldTypeIterableFromField(message.getFields()))); doc.elementDocs(generateElementDocs(productConfig, typeTable, namer, message)); doc.packageName(message.getFile().getFullName()); messageDocs.add(doc.build()); } return messageDocs.build(); }
super(parent, proto.getName(), path); this.proto = proto; buildChildren(proto.getNestedTypeList(), proto.getEnumTypeList(), path, for (int i = 0; i < proto.getOneofDeclCount(); i++) { OneofDescriptorProto oneofProto = proto.getOneofDecl(i); String childPath = buildPath(path, DescriptorProto.ONEOF_DECL_FIELD_NUMBER, i); oneofsBuilder.add(Oneof.create(parent, oneofProto, childPath)); String childPath = buildPath(path, DescriptorProto.FIELD_FIELD_NUMBER, i); Field field = Field.create(this, fieldProtos.get(i), childPath, associatedOneof); fieldsBuilder.add(field); extensionPool.getSortedExtensionsByTypeName(getFullName())) { fieldsBuilder.add(Field.createAsExtension( this, entry.getValue(), entry.getValue().getPath(), entry.getKey()));
public List<GrpcElementDocView> generateElementDocs( GapicProductConfig productConfig, ModelTypeTable typeTable, SurfaceNamer namer, ProtoContainerElement containerElement) { ImmutableList.Builder<GrpcElementDocView> children = ImmutableList.builder(); Set<String> lroTypes = productConfig .getInterfaceConfigMap() .values() .stream() .flatMap(i -> i.getMethodConfigs().stream()) .map(MethodConfig::getLongRunningConfig) .filter(Objects::nonNull) .flatMap(lro -> Stream.of(lro.getReturnType(), lro.getMetadataType())) .map(t -> ((ProtoTypeRef) t).getProtoType()) .map(TypeRef::getMessageType) .map(MessageType::getFullName) .collect(ImmutableSet.toImmutableSet()); Collection<MessageType> messages = containerElement .getMessages() .stream() .filter(m -> m.isReachable() || lroTypes.contains(m.getFullName())) .collect(ImmutableList.toImmutableList()); children.addAll(generateMessageDocs(productConfig, typeTable, namer, messages)); children.addAll(generateEnumDocs(typeTable, namer, containerElement.getEnums())); return children.build(); }
&& method .getInputMessage() .getFields() .stream() .anyMatch( || !Strings.isNullOrEmpty(protoParser.getResourceOrSetEntityName(f)))) { String methodInputPackageName = protoParser.getProtoPackage(((ProtoFile) method.getInputMessage().getParent())); if (defaultPackageName.equals(methodInputPackageName)) { defaultResourceNameTreatment = ResourceNameTreatment.STATIC_TYPES;
@Test public void smokeTestApiConstruction() { Assert.assertEquals(1, testModel.getFiles().size()); ProtoFile file = testModel.getFiles().get(0); Assert.assertEquals(2, file.getMessages().size()); Assert.assertEquals(1, file.getEnums().size()); Assert.assertEquals(3, file.getMessages().get(0).getFields().size()); Assert.assertEquals(1, file.getMessages().get(1).getMessages().size()); Assert.assertEquals(1, file.getInterfaces().size()); }
private List<GrpcElementDocView> generateEnumFileElements( ModelTypeTable typeTable, SurfaceNamer namer, ProtoContainerElement containerElement) { ImmutableList.Builder<GrpcElementDocView> elements = ImmutableList.builder(); elements.addAll( elementDocTransformer.generateEnumDocs(typeTable, namer, containerElement.getEnums())); for (MessageType message : containerElement.getMessages()) { List<GrpcElementDocView> elementDocs = generateEnumFileElements(typeTable, namer, message); if (!elementDocs.isEmpty()) { GrpcMessageDocView.Builder messageView = GrpcMessageDocView.newBuilder(); messageView.name(namer.publicClassName(Name.upperCamel(message.getSimpleName()))); messageView.fullName(typeTable.getFullNameFor(TypeRef.of(message))); messageView.fileUrl(GapicParser.getFileUrl(message.getFile())); messageView.lines(namer.getDocLines(GapicParser.getDocString(message))); messageView.properties(ImmutableList.<ParamDocView>of()); messageView.elementDocs(elementDocs); messageView.packageName(message.getFile().getFullName()); elements.add(messageView.build()); } } return elements.build(); }
private void acceptMessages(Iterable<MessageType> messages) { for (MessageType message : messages) { if (ignoreMapEntry && message.isMapEntry() || !scoper.isReachable(message)) { continue; } visit(message); } }
/** * If this is a message or enum type, return its declaration location, otherwise * SimpleLocation.UNKNOWN. */ public Location getLocation() { return messageType != null ? messageType.getLocation() : enumType != null ? enumType.getLocation() : SimpleLocation.UNKNOWN; }
/** * Return true of this is a cyclic message type. */ public boolean isCyclic() { return getKind() == Type.TYPE_MESSAGE && getMessageType().isCyclic(); }