private static String getPath(ProtoFile file) { return file.getFullName() + "." + file.getSimpleName(); } }
private static String getShortName(ProtoElement elem) { return elem.getFullName().substring(elem.getFile().getFullName().length() + 1); }
public String getLinkedElementName(ProtoElement element) { String simpleName = element.getSimpleName(); String packageName = element.getFile().getFullName(); return String.format("[%s]{@link %s.%s}", simpleName, packageName, simpleName); } }
private String getOutputPath(SurfaceNamer namer, ProtoFile file) { String version = namer.getApiWrapperModuleVersion(); boolean hasVersion = version != null && !version.isEmpty(); String path = hasVersion ? "src/" + version + "/doc/" : "src/doc/"; String packageDirPath = file.getFullName().replace('.', '/'); if (!Strings.isNullOrEmpty(packageDirPath)) { packageDirPath += "/"; } else { packageDirPath = ""; } return path + packageDirPath + "doc_" + namer.getProtoFileName(file.getSimpleName()); } }
public static String getJavaPackage(ProtoFile file) { String packageName = file.getProto().getOptions().getJavaPackage(); if (Strings.isNullOrEmpty(packageName)) { return DEFAULT_JAVA_PACKAGE_PREFIX + "." + file.getFullName(); } return packageName; }
/** * For each ProtoFile dependency, put its TypeAlias in allTypeTable; and if it is a local import, * then put it in the given localImportNames, otherwise if it is a shared import, but it in the * given sharedImportNames. */ private void populateTypeTable( Iterable<ProtoFile> protoFileDependencies, ModelTypeTable allTypeTable, Set<String> localImportNames, Set<String> sharedImportNames, Collection<ProtoFile> localImportFiles) { for (ProtoFile protoFile : protoFileDependencies) { // For python, adding a single message from the proto file to the type table will populate // the type table with the correct imports. ImmutableList<MessageType> messages = protoFile.getMessages(); if (!messages.isEmpty()) { TypeRef typeRef = TypeRef.of(messages.get(0)); allTypeTable.getAndSaveNicknameFor(typeRef); if (localImportFiles .stream() .anyMatch(f -> f.getFullName().equals(protoFile.getFullName()))) { localImportNames.add(allTypeTable.getFullNameFor(typeRef)); } else { sharedImportNames.add(allTypeTable.getFullNameFor(typeRef)); } } } }
/** Returns a base package name for an API's client. */ @Nullable public static String getPackageName(Model model) { if (model.getServiceConfig().getApisCount() > 0) { Api api = model.getServiceConfig().getApis(0); Interface apiInterface = model.getSymbolTable().lookupInterface(api.getName()); if (apiInterface != null) { return apiInterface.getFile().getFullName(); } } return null; } }
+ " no name defined in proto file %s. %s.name is required.", fileExtension.getDescriptor().getFullName(), protoFile.getFullName(), fileExtension.getDescriptor().getFullName())); fieldExtension.getDescriptor().getFullName(), baseName, protoFile.getFullName(), fieldExtension.getDescriptor().getFullName())); fieldExtension.getDescriptor().getFullName(), baseName, protoFile.getFullName(), fieldExtension.getDescriptor().getFullName()));
private void merge(Interface iface) { Api api = iface.getConfig(); if (api == null) { return; } // Get user-defined api version, which is optional. String apiVersion = api.getVersion(); String packageName = iface.getFile().getFullName(); if (Strings.isNullOrEmpty(apiVersion)) { // If version is not provided by user, extract major version from package name. apiVersion = ApiVersionUtil.extractDefaultMajorVersionFromPackageName(packageName); } iface.setConfig(api.toBuilder().setVersion(apiVersion).build()); iface.putAttribute(VersionAttribute.KEY, VersionAttribute.create(apiVersion)); }
private void merge(Interface iface) { Api api = iface.getConfig(); if (api == null) { return; } // Get user-defined api version, which is optional. String apiVersion = api.getVersion(); String packageName = iface.getFile().getFullName(); if (Strings.isNullOrEmpty(apiVersion)) { // If version is not provided by user, extract major version from package name. apiVersion = ApiVersionUtil.extractDefaultMajorVersionFromPackageName(packageName); } iface.setConfig(api.toBuilder().setVersion(apiVersion).build()); iface.putAttribute(VersionAttribute.KEY, VersionAttribute.create(apiVersion)); }
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(); }
@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 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)); }
RubyPackageMetadataNamer packageNamer = new RubyPackageMetadataNamer(productConfig.getPackageName()); String packageFilePath = file.getFullName().replace(".", File.separator); ImmutableList.Builder<TocContentView> tocContents = ImmutableList.builder(); for (Interface apiInterface : file.getReachableInterfaces()) {
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(); }
/** Return a list of enums, sorted alphabetically by name. */ public List<GrpcEnumDocView> generateEnumDocs( ModelTypeTable typeTable, SurfaceNamer namer, Collection<EnumType> enumElements) { ImmutableSortedSet.Builder<GrpcEnumDocView> enumDocs = ImmutableSortedSet.orderedBy(Comparator.comparing(GrpcEnumDocView::name)); for (EnumType enumElement : enumElements) { if (!enumElement.isReachable()) { continue; } GrpcEnumDocView.Builder doc = GrpcEnumDocView.newBuilder(); doc.name(namer.getEnumTypeName(typeTable, enumElement)); doc.lines(namer.getDocLines(GapicParser.getDocString(enumElement))); doc.values(generateEnumValueDocs(namer, enumElement.getValues())); doc.packageName(enumElement.getFile().getFullName()); enumDocs.add(doc.build()); } return enumDocs.build().asList(); }
private ViewModel generateDoc(ProtoFile file, GapicProductConfig productConfig) { ModelTypeTable typeTable = new ModelTypeTable( new RubyTypeTable(productConfig.getPackageName()), new RubyModelTypeNameConverter(productConfig.getPackageName())); // Use file path for package name to get file-specific package instead of package for the API. SurfaceNamer namer = new RubySurfaceNamer(typeTable.getFullNameFor(file)); String subPath = pathMapper.getOutputPath(file.getFullName(), productConfig); String baseFilename = namer.getProtoFileName(file.getSimpleName()); GrpcDocView.Builder doc = GrpcDocView.newBuilder(); doc.templateFileName(DOC_TEMPLATE_FILENAME); doc.outputPath(subPath + "/doc/" + baseFilename); doc.fileHeader( fileHeaderTransformer.generateFileHeader( productConfig, ImportSectionView.newBuilder().build(), namer)); doc.elementDocs( elementDocTransformer.generateElementDocs(productConfig, typeTable, namer, file)); doc.modules( generateModuleViews( new ProtoApiModel(file.getModel()), productConfig, namer, isSourceApiInterfaceFile(file) ? file : null)); return doc.build(); }