From: Jens Geyer Date: Wed, 31 Jul 2013 11:03:26 +0000 (+0200) Subject: THRIFT-2106 Fix support for namespaces in GO generator X-Git-Tag: 0.9.1~29 X-Git-Url: https://source.supwisdom.com/gerrit/gitweb?a=commitdiff_plain;h=d1257debcfd4e6622a6e12e6545dd01d7bec6a15;p=common%2Fthrift.git THRIFT-2106 Fix support for namespaces in GO generator Patch: Emir Habul --- diff --git a/compiler/cpp/src/generate/t_go_generator.cc b/compiler/cpp/src/generate/t_go_generator.cc index 30be7991..072ec5b0 100644 --- a/compiler/cpp/src/generate/t_go_generator.cc +++ b/compiler/cpp/src/generate/t_go_generator.cc @@ -509,7 +509,7 @@ void t_go_generator::init_generator() f_consts_ << go_package() << - render_includes() << + render_includes() << go_autogen_comment(); f_const_values_ << endl << "func init() {" << endl; @@ -526,8 +526,18 @@ string t_go_generator::render_includes() string unused_prot = ""; for (size_t i = 0; i < includes.size(); ++i) { - result += "\t\"" + gen_package_prefix_ + get_real_go_module(includes[i]) + "\"\n"; - unused_prot += "var _ = " + get_real_go_module(includes[i]) + ".GoUnusedProtection__\n"; + string go_module = get_real_go_module(includes[i]); + size_t found = 0; + for (size_t j = 0; j < go_module.size(); j++) { + // Import statement uses slashes ('/') in namespace + if (go_module[j] == '.') { + go_module[j] = '/'; + found = j + 1; + } + } + + result += "\t\"" + gen_package_prefix_ + go_module + "\"\n"; + unused_prot += "var _ = " + go_module.substr(found) + ".GoUnusedProtection__\n"; } if (includes.size() > 0) { @@ -3092,7 +3102,13 @@ string t_go_generator::type_name(t_type* ttype) t_program* program = ttype->get_program(); if (program != NULL && program != program_) { - return get_real_go_module(program) + "." + ttype->get_name(); + string module(get_real_go_module(program)); + // for namespaced includes, only keep part after dot. + size_t dot = module.rfind('.'); + if (dot != string::npos) { + module = module.substr(dot + 1); + } + return module + "." + ttype->get_name(); } return ttype->get_name(); diff --git a/lib/go/test/IncludesTest.thrift b/lib/go/test/IncludesTest.thrift index 6c7308b0..6f80e6b8 100644 --- a/lib/go/test/IncludesTest.thrift +++ b/lib/go/test/IncludesTest.thrift @@ -18,17 +18,23 @@ # include "ThriftTest.thrift" +include "NamespacedTest.thrift" const ThriftTest.UserId USERID = 42 +const NamespacedTest.UserId USERID1 = 41 const ThriftTest.MapType MAPCONSTANT = {'hello':{}, 'goodnight':{}} +const i32 TWO = NamespacedTest.Stuff.TWO +const i32 THREE = NamespacedTest.THREE + struct testStruct { 1: list listNumbers } struct TestStruct2 { 1: testStruct blah, - 2: ThriftTest.UserId id + 2: ThriftTest.UserId id, + 3: NamespacedTest.Stuff stuff, } service testService extends ThriftTest.SecondService { @@ -42,4 +48,10 @@ service testService extends ThriftTest.SecondService { service ExtendedService extends testService { void extendedMethod(), + NamespacedTest.StuffStruct extendedMethod2(), +} + +service Extended2Service extends NamespacedTest.NamespacedService { + void extendedMethod3(), } + diff --git a/lib/go/test/Makefile.am b/lib/go/test/Makefile.am index b5713c08..9005e991 100644 --- a/lib/go/test/Makefile.am +++ b/lib/go/test/Makefile.am @@ -21,12 +21,13 @@ THRIFT = $(top_srcdir)/compiler/cpp/thrift THRIFTTEST = $(top_srcdir)/test/ThriftTest.thrift # Thrift for GO has problems with complex map keys: THRIFT-2063 -gopath: $(THRIFT) $(THRIFTTEST) IncludesTest.thrift +gopath: $(THRIFT) $(THRIFTTEST) IncludesTest.thrift NamespacedTest.thrift mkdir -p gopath/src grep -v list.*map.*list.*map $(THRIFTTEST) > ThriftTest.thrift $(THRIFT) --gen go:thrift_import=thrift -r IncludesTest.thrift ln -nfs ../../gen-go/ThriftTest gopath/src/ThriftTest ln -nfs ../../gen-go/IncludesTest gopath/src/IncludesTest + ln -nfs ../../gen-go/lib gopath/src/lib ln -nfs ../../../thrift gopath/src/thrift touch gopath diff --git a/lib/go/test/NamespacedTest.thrift b/lib/go/test/NamespacedTest.thrift new file mode 100644 index 00000000..1bb2fc41 --- /dev/null +++ b/lib/go/test/NamespacedTest.thrift @@ -0,0 +1,40 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +include "ThriftTest.thrift" + +namespace go lib.go.test.NamespacedTest + +enum Stuff { + ONE = 1, + TWO = 2, +} + +const i32 THREE = 3; + +typedef i64 UserId + +struct StuffStruct { + 2: Stuff stuff, +} + +service NamespacedService { + ThriftTest.UserId getUserID(), +} +