private void addImports(Proto proto) { imports.add(proto.getFilename()); for (Message message : proto.getMessages()) { messages.add(message.getCanonicalName()); } }
public String protoToString() { StringBuilder sb = new StringBuilder(); appendLine(sb, "syntax = \"%s\";", proto.getSyntax()); for (Import importValue : proto.getImports()) { appendLine(sb, "import \"%s\";", importValue.getValue()); } appendLine(sb, "package %s;\n", proto.getPackage().getValue()); for (Message message : proto.getMessages()) { messageToString(message, sb); } for (Enum enumValue : proto.getEnums()) { enumToString(enumValue, sb); } for (Service service : proto.getServices()) { serviceToString(service, sb); } return sb.toString(); }
private void registerUserTypes(ProtoContext context) { final Proto proto = context.getProto(); List<Message> messages = new ArrayList<>(); messages.addAll(proto.getMessages()); for (Extension extension : proto.getDeclaredExtensions()) { messages.addAll(extension.getGroups()); String fullyQualifiedName = proto.getNamespace() + type.getName(); type.setFullyQualifiedName(fullyQualifiedName); context.register(fullyQualifiedName, type); List<io.protostuff.compiler.model.Enum> enums = proto.getEnums(); for (Enum type : enums) { type.setProto(proto); String fullyQualifiedName = proto.getNamespace() + type.getName(); type.setFullyQualifiedName(fullyQualifiedName); context.register(fullyQualifiedName, type); List<Service> services = proto.getServices(); for (Service type : services) { type.setProto(proto); String fullyQualifiedName = proto.getNamespace() + type.getName(); type.setFullyQualifiedName(fullyQualifiedName); context.register(fullyQualifiedName, type);
private void process(Module module, Proto proto) { String name = proto.getCanonicalName(); ImmutableProtoDescriptor descriptor = ImmutableProtoDescriptor.builder() .name(proto.getName()) .type(NodeType.PROTO) .canonicalName(proto.getCanonicalName()) .filename(proto.getFilename()) .description(markdownProcessor.toHtml(proto.getComments())) .options(proto.getOptions().toMap()) .build(); write(module, "data/proto/" + name + ".json", descriptor); } }
@Override public void compile(Module module) { module.getProtos() .forEach(proto -> proto.getServices() .forEach(service -> process(module, service))); }
/** * Create new empty context instance for a given filename. */ public ProtoContext(String filename) { this.filename = filename; symbolTable = new HashMap<>(); declarationStack = new ArrayDeque<>(); imports = new ArrayList<>(); publicImports = new ArrayList<>(); proto = new Proto(); proto.setContext(this); proto.setFilename(filename); proto.setName(getFilenameWithoutExtension(filename)); push(proto); extensionRegistry = new ProtoExtensionRegistry(this); }
@Override public void compile(Module module) { List<JsonTreeNode> root = new ArrayList<>(); module.getProtos() .forEach(proto -> root.add(ImmutableJsonTreeNode.builder() .label(proto.getFilename()) .data(ImmutableNodeData.builder() .ref(proto.getCanonicalName()) .type(NodeType.PROTO) .build()) .children(processProto(proto)) .build())); String output = "data/index.json"; write(module, output, root); }
public Message getMessageFromCanonicaName(String messageCanonicalName) { for (Message message : proto.getMessages()) { if (message.getCanonicalName().equals(messageCanonicalName)) { return message; } } return null; }
/** * Returns java package name. */ public static String getPackage(Proto proto) { DynamicMessage.Value javaPackage = proto.getOptions().get(OPTION_JAVA_PACKAGE); if (javaPackage != null) { return javaPackage.getString(); } return proto.getPackage().getValue(); }
protected SourceCodeLocation getSourceCodeLocation(ParserRuleContext ctx) { String file = context.getProto().getFilename(); int line = ctx.getStart().getLine(); return new SourceCodeLocation(file, line); }
@Override public Collection<Extension> getExtensions(String fullMessageName) { return extensionCache.computeIfAbsent(fullMessageName, name -> { Collection<Extension> result = new ArrayList<>(); result.addAll(localExtensionRegistry.getExtensions(name)); Deque<Import> queue = new ArrayDeque<>(); queue.addAll(context.getProto().getImports()); while (!queue.isEmpty()) { Import anImport = queue.poll(); Proto proto = anImport.getProto(); Collection<Extension> extensions = getExtensions(proto, name); result.addAll(extensions); queue.addAll(proto.getPublicImports()); } return result; }); }
/** * Returns all public imports in this proto file. */ public List<Import> getPublicImports() { return getImports() .stream() .filter(Import::isPublic) .collect(Collectors.toList()); }
@Override public void exitImportStatement(ProtoParser.ImportStatementContext ctx) { Proto proto = context.peek(Proto.class); String text = ctx.fileReference().getText(); String fileName = Util.removeFirstAndLastChar(text); Import anImport = new Import(proto, fileName, ctx.PUBLIC() != null); anImport.setSourceCodeLocation(getSourceCodeLocation(ctx)); proto.addImport(anImport); } }
@Override public void exitProto(ProtoParser.ProtoContext ctx) { int i = 0; List<String> comments = new ArrayList<>(); while (i < tokens.size() && isWhitespace(tokens.get(i))) { // skip whitespaces until we reach line comments i++; } while (i < tokens.size() && isComment(tokens.get(i))) { // consume all consecutive line comments Token token = tokens.get(i); // skip processed LINE_COMMENT and following NL i += 2; String text = getTextFromLineCommentToken(token); comments.add(text); } if (i < tokens.size()) { // check if next token is not element that is owner of our comment block Token token = tokens.get(i); if (isCommentBlockOwner(token)) { return; } } List<String> trimComments = trim(comments); for (String comment : trimComments) { context.getProto().addComment(comment); } }
private void registerUserTypes(ProtoContext context) { final Proto proto = context.getProto(); List<Message> messages = new ArrayList<>(); messages.addAll(proto.getMessages()); for (Extension extension : proto.getDeclaredExtensions()) { messages.addAll(extension.getGroups()); String fullyQualifiedName = proto.getNamespace() + type.getName(); type.setFullyQualifiedName(fullyQualifiedName); context.register(fullyQualifiedName, type); List<io.protostuff.compiler.model.Enum> enums = proto.getEnums(); for (Enum type : enums) { type.setProto(proto); String fullyQualifiedName = proto.getNamespace() + type.getName(); type.setFullyQualifiedName(fullyQualifiedName); context.register(fullyQualifiedName, type); List<Service> services = proto.getServices(); for (Service type : services) { type.setProto(proto); String fullyQualifiedName = proto.getNamespace() + type.getName(); type.setFullyQualifiedName(fullyQualifiedName); context.register(fullyQualifiedName, type);
private void process(Module module, Proto proto) { String name = proto.getCanonicalName(); ImmutableProtoDescriptor descriptor = ImmutableProtoDescriptor.builder() .name(proto.getName()) .type(NodeType.PROTO) .canonicalName(proto.getCanonicalName()) .filename(proto.getFilename()) .description(markdownProcessor.toHtml(proto.getComments())) .options(proto.getOptions().toMap()) .build(); write(module, "data/proto/" + name + ".json", descriptor); } }
@Override public void compile(Module module) { module.getProtos() .forEach(proto -> proto.getServices() .forEach(service -> process(module, service))); }
/** * Create new empty context instance for a given filename. */ public ProtoContext(String filename) { this.filename = filename; symbolTable = new HashMap<>(); declarationStack = new ArrayDeque<>(); imports = new ArrayList<>(); publicImports = new ArrayList<>(); proto = new Proto(); proto.setContext(this); proto.setFilename(filename); proto.setName(getFilenameWithoutExtension(filename)); push(proto); extensionRegistry = new ProtoExtensionRegistry(this); }
@Override public void compile(Module module) { List<JsonTreeNode> root = new ArrayList<>(); module.getProtos() .forEach(proto -> root.add(ImmutableJsonTreeNode.builder() .label(proto.getFilename()) .data(ImmutableNodeData.builder() .ref(proto.getCanonicalName()) .type(NodeType.PROTO) .build()) .children(processProto(proto)) .build())); String output = "data/index.json"; write(module, output, root); }
public Message getMessageFromCanonicaName(String messageCanonicalName) { for (Message message : proto.getMessages()) { if (message.getCanonicalName().equals(messageCanonicalName)) { return message; } } return null; }