grpc bindings generator for Java and a few minor supporting changes i… (#4553)

* grpc bindings generator for Java and a few minor supporting changes in improvements

* restored formatting before my previous changes for ease of review

* Fixed grpc java code generation bug resulting in duplicate extractor declarations in case the same is used in more than a single RPC method
This commit is contained in:
Yuri Finkelstein
2017-12-21 07:55:57 -10:00
committed by Wouter van Oortmerssen
parent 61f4a46c43
commit 8518b3fb4e
8 changed files with 1288 additions and 6 deletions

View File

@@ -18,7 +18,8 @@
#include <list>
#define FLATC_VERSION "1.8.0 (" __DATE__ ")"
#define FLATC_VERSION "1.8.0 (" __DATE__ " " __TIME__ ")"
namespace flatbuffers {

View File

@@ -67,7 +67,7 @@ int main(int argc, const char *argv[]) {
"Generate Go files for tables/structs",
flatbuffers::GeneralMakeRule },
{ flatbuffers::GenerateGeneral, "-j", "--java", "Java", true,
nullptr,
flatbuffers::GenerateJavaGRPC,
flatbuffers::IDLOptions::kJava,
"Generate Java classes for tables/structs",
flatbuffers::GeneralMakeRule },

View File

@@ -23,6 +23,7 @@
#include "src/compiler/cpp_generator.h"
#include "src/compiler/go_generator.h"
#include "src/compiler/java_generator.h"
#if defined(_MSC_VER)
#pragma warning(push)
@@ -53,7 +54,7 @@ class FlatBufMethod : public grpc_generator::Method {
return "";
}
std::vector<grpc::string> GetAllComments() const {
return std::vector<grpc::string>();
return method_->rpc_comment;
}
std::string name() const { return method_->name; }
@@ -110,7 +111,7 @@ class FlatBufService : public grpc_generator::Service {
return "";
}
std::vector<grpc::string> GetAllComments() const {
return std::vector<grpc::string>();
return service_->doc_comment;
}
std::string name() const { return service_->name; }
@@ -187,7 +188,8 @@ class FlatBufFile : public grpc_generator::File {
public:
enum Language {
kLanguageGo,
kLanguageCpp
kLanguageCpp,
kLanguageJava
};
FlatBufFile(
@@ -229,6 +231,9 @@ class FlatBufFile : public grpc_generator::File {
case kLanguageGo: {
return "import \"github.com/google/flatbuffers/go\"";
}
case kLanguageJava: {
return "import com.google.flatbuffers.grpc.FlatbuffersUtils;";
}
}
return "";
}
@@ -328,9 +333,50 @@ bool GenerateCppGRPC(const Parser &parser,
source_code, false);
}
class JavaGRPCGenerator : public flatbuffers::BaseGenerator {
public:
JavaGRPCGenerator(const Parser& parser, const std::string& path,
const std::string& file_name)
: BaseGenerator(parser, path, file_name, "", "." /*separator*/),
parser_(parser),
path_(path),
file_name_(file_name) {}
bool generate() {
FlatBufFile file(parser_, file_name_, FlatBufFile::kLanguageJava);
grpc_java_generator::Parameters p;
for (int i = 0; i < file.service_count(); i++) {
auto service = file.service(i);
const Definition* def = parser_.services_.vec[i];
p.package_name =
def->defined_namespace->GetFullyQualifiedName(""); // file.package();
std::string output =
grpc_java_generator::GenerateServiceSource(&file, service.get(), &p);
std::string filename =
NamespaceDir(*def->defined_namespace) + def->name + "Grpc.java";
if (!flatbuffers::SaveFile(filename.c_str(), output, false)) return false;
}
return true;
}
protected:
const Parser& parser_;
const std::string &path_, &file_name_;
};
bool GenerateJavaGRPC(const Parser& parser, const std::string& path,
const std::string& file_name) {
int nservices = 0;
for (auto it = parser.services_.vec.begin(); it != parser.services_.vec.end();
++it) {
if (!(*it)->generated) nservices++;
}
if (!nservices) return true;
return JavaGRPCGenerator(parser, path, file_name).generate();
}
} // namespace flatbuffers
#if defined(_MSC_VER)
#pragma warning(pop)
#endif

View File

@@ -1645,6 +1645,7 @@ CheckedError Parser::ParseService() {
ECHECK(ParseMetaData(&service_def.attributes));
EXPECT('{');
do {
std::vector<std::string> rpc_comment = doc_comment_;
auto rpc_name = attribute_;
EXPECT(kTokenIdentifier);
EXPECT('(');
@@ -1660,6 +1661,7 @@ CheckedError Parser::ParseService() {
rpc.name = rpc_name;
rpc.request = reqtype.struct_def;
rpc.response = resptype.struct_def;
rpc.rpc_comment = rpc_comment;
if (service_def.calls.Add(rpc_name, &rpc))
return Error("rpc already exists: " + rpc_name);
ECHECK(ParseMetaData(&rpc.attributes));