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(),
+}
+