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 30be799..072ec5b 100644
--- a/compiler/cpp/src/generate/t_go_generator.cc
+++ b/compiler/cpp/src/generate/t_go_generator.cc
@@ -509,7 +509,7 @@
f_consts_ <<
go_package() <<
- render_includes() <<
+ render_includes() <<
go_autogen_comment();
f_const_values_ << endl << "func init() {" << endl;
@@ -526,8 +526,18 @@
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 @@
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 6c7308b..6f80e6b 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<ThriftTest.Numberz> 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 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 b5713c0..9005e99 100644
--- a/lib/go/test/Makefile.am
+++ b/lib/go/test/Makefile.am
@@ -21,12 +21,13 @@
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 0000000..1bb2fc4
--- /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(),
+}
+