2017-01-02 9 views
2

Я пытаюсь написать собственный генератор кода для собственного фирменного языка программирования. Я решил, что могу написать генератор на Java, используя путеводитель плагина protoc. Мой главный() делает что-то вроде этого:Как написать пользовательский Protobuf CodeGenerator в Java

public static void main(String[] args) throws IOException { 
    CodeGenerator gen = new CodeGenerator(); 
    PluginProtos.CodeGeneratorRequest codeGeneratorRequest = PluginProtos.CodeGeneratorRequest.parseFrom(args[0].getBytes()); 
    codeGeneratorRequest.getProtoFileList().forEach(gen::handleFile); 
    // get the response and do something with it 
    //PluginProtos.CodeGeneratorResponse response = PluginProtos.CodeGeneratorResponse.newBuilder().build(); 
    //response.writeTo(System.out); 
} 

(Очевидно, я только начал, хотел получить что-то Stubby работает, прежде чем на самом деле написания логики поколения)

Проблема заключается в: Как вызвать protoc с аргументом --plugin для генерации кода на моем пользовательском языке, используя мой плагин? Я пытался писать скрипт, чтобы сделать это следующим образом:

#!/bin/bash 
java -cp ./codegen.jar CodeGeneratorMain "[email protected]" 

И я пытался ссылаться protoc как это: protoc --plugin=protoc-gen-code --code_out=./build hello.proto однако, когда я бегу, я получаю эту ошибку:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0 at CodeGeneratorMain.main(CodeGeneratorMain.java:12) --code_out: protoc-gen-code: Plugin failed with status code 1.

Как будто это не передавая CodeGeneratorRequest на stdin вообще. Как я могу это проверить? Я делаю что-то явно неправильно?

+0

Потенциально немного OT: если вы просто хотите генерировать код Java, возможно, стоит посмотреть на https://github.com/square/javapoet –

+0

Я не хочу генерировать классы Java. ProtoBufs уже может генерировать источник Java. Это Java-плагин для генерации кода, отличного от Java. – FreeMemory

ответ

0

Таким образом, после прочтения и повторного чтения документации я понял, что моя очень глупую ошибку: protoc проходит анализируемый вход через стандартного вводане через ARGV. Это означает, что если я изменю это: PluginProtos.CodeGeneratorRequest codeGeneratorRequest = PluginProtos.CodeGeneratorRequest.parseFrom(args[0].getBytes());: PluginProtos.CodeGeneratorRequest codeGeneratorRequest = PluginProtos.CodeGeneratorRequest.parseFrom(System.in);

это работает.