This is an automated email from the ASF dual-hosted git repository.

yuxuan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/thrift.git


The following commit(s) were added to refs/heads/master by this push:
     new 2c78047  THRIFT-4797: Go import improvements
2c78047 is described below

commit 2c78047fcbd2783e88cab0ebc7245598695477ae
Author: Yuxuan 'fishy' Wang <[email protected]>
AuthorDate: Sat Jul 31 13:44:41 2021 -0700

    THRIFT-4797: Go import improvements
    
    This change improves two problems in go code imports:
    
    1. Always rename import the thrift package into "thrift", as we allow
       the user to use a different library to replace the official one from
       the compiler command line, this makes sure that in compiler generated
       go code we can always blindly use "thrift.*".
    
    2. We added auto rename import dedup in d9019fc5a4, but in that change
       for system packages we always use the full import path as the dedup
       identifier, so system package "database/sql/driver" would not be
       detected as a conflict against a thrift go namespace of
       "foo.bar.driver". Use the part after the last "/" in system packages
       as the dedup identifier instead.
---
 CHANGES.md                                         |  5 ++-
 compiler/cpp/src/thrift/generate/t_go_generator.cc | 48 +++++++++++++++++++---
 ...rThing.thrift => ConflictNamespaceTestE.thrift} | 12 ++----
 ...rThing.thrift => ConflictNamespaceTestF.thrift} | 12 ++----
 lib/go/test/ConflictNamespaceTestSuperThing.thrift | 12 ++++++
 lib/go/test/Makefile.am                            |  6 ++-
 lib/go/test/tests/conflict_namespace_test.go       | 27 ++++++++++++
 7 files changed, 95 insertions(+), 27 deletions(-)

diff --git a/CHANGES.md b/CHANGES.md
index 98d889d..5ab945b 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -11,8 +11,9 @@
 
 ### Go
 
-- [THRIFT-5369](https://issues.apache.org/jira/browse/THRIFT-5369) - 
TConfiguration.GetMaxMessageSize() now also applies to container sizes in 
TProtocol implementations provided
 - [THRIFT-5404](https://issues.apache.org/jira/browse/THRIFT-5404) - 
TTransportException.Timeout would correctly return true when it's connect 
timeout during TSocket.Open call
+- [THRIFT-5389](https://issues.apache.org/jira/browse/THRIFT-5389) - The 
compiler now generates correct go code with thrift constant defined on optional 
enum/typedef fields
+- [THRIFT-4797](https://issues.apache.org/jira/browse/THRIFT-4797) - The 
compiler now correctly auto renames import thrift namespaces when they collide 
with system imports
 
 
 ## 0.14.2
@@ -23,7 +24,7 @@
 
 ### Go
 
-- [THRIFT-5369](https://issues.apache.org/jira/browse/THRIFT-5369) - No longer 
pre-allocating the whole container (map/set/list) in compiled go code to avoid 
huge allocations on malformed messages
+- [THRIFT-5369](https://issues.apache.org/jira/browse/THRIFT-5369) - 
TConfiguration.GetMaxMessageSize() now also applies to container sizes in 
TProtocol implementations provided
 
 
 ## 0.14.1
diff --git a/compiler/cpp/src/thrift/generate/t_go_generator.cc 
b/compiler/cpp/src/thrift/generate/t_go_generator.cc
index 4ee0e8f..5c052a1 100644
--- a/compiler/cpp/src/thrift/generate/t_go_generator.cc
+++ b/compiler/cpp/src/thrift/generate/t_go_generator.cc
@@ -854,16 +854,50 @@ string t_go_generator::render_program_import(const 
t_program* program, string& u
   return result;
 }
 
+/**
+ * Render import lines for the system packages.
+ *
+ * The arg system_packages supports the following two options for import auto
+ * rename in case duplications happens:
+ *
+ * 1. The full import path without double quotation marks, with part after the
+ *    last "/" as the import identifier. e.g.:
+ *    - "context" (context)
+ *    - "database/sql/driver" (driver)
+ * 2. A rename import with double quotation marks around the full import path,
+ *    with the part before the first space as the import identifier. e.g.:
+ *    - "thrift \"github.com/apache/thrift/lib/go/thrift\"" (thrift)
+ *
+ * If a system package's package name is different from the last part of its
+ * full import path, please always rename import it for dedup to work 
correctly,
+ * e.g. "package \"github.com/org/go-package\"".
+ *
+ * @param system_packages
+ */
 string t_go_generator::render_system_packages(std::vector<string>& 
system_packages) {
   string result = "";
 
   for (vector<string>::iterator iter = system_packages.begin(); iter != 
system_packages.end(); ++iter) {
     string package = *iter;
-    result += "\t\""+ package +"\"\n";
+    string identifier = package;
+    auto space_pos = package.find(" ");
+    if (space_pos != string::npos) {
+      // This is a rename import line, no need to wrap double quotation marks.
+      result += "\t"+ package +"\n";
+      // The part before the first space is the import identifier.
+      identifier = package.substr(0, space_pos);
+    } else {
+      result += "\t\""+ package +"\"\n";
+      // The part after the last / is the import identifier.
+      auto slash_pos = package.rfind("/");
+      if (slash_pos != string::npos) {
+        identifier = package.substr(slash_pos+1);
+      }
+    }
 
     // Reserve these package names in case the collide with imported Thrift 
packages
-    package_identifiers_set_.insert(package);
-    package_identifiers_.emplace(package, package);
+    package_identifiers_set_.insert(identifier);
+    package_identifiers_.emplace(package, identifier);
   }
   return result;
 }
@@ -929,8 +963,9 @@ string t_go_generator::go_imports_begin(bool consts) {
   }
   system_packages.push_back("fmt");
   system_packages.push_back("time");
-  system_packages.push_back(gen_thrift_import_);
-  return "import(\n" + render_system_packages(system_packages);
+  // For the thrift import, always do rename import to make sure it's called 
thrift.
+  system_packages.push_back("thrift \"" + gen_thrift_import_ + "\"");
+  return "import (\n" + render_system_packages(system_packages);
 }
 
 /**
@@ -2341,12 +2376,13 @@ void t_go_generator::generate_service_remote(t_service* 
tservice) {
   system_packages.push_back("os");
   system_packages.push_back("strconv");
   system_packages.push_back("strings");
+  // For the thrift import, always do rename import to make sure it's called 
thrift.
+  system_packages.push_back("thrift \"" + gen_thrift_import_ + "\"");
 
   f_remote << go_autogen_comment();
   f_remote << indent() << "package main" << endl << endl;
   f_remote << indent() << "import (" << endl;
   f_remote << render_system_packages(system_packages);
-  f_remote << indent() << "\t\"" + gen_thrift_import_ + "\"" << endl;
   f_remote << indent() << render_included_programs(unused_protection);
   f_remote << render_program_import(program_, unused_protection);
   f_remote << indent() << ")" << endl;
diff --git a/lib/go/test/ConflictNamespaceTestSuperThing.thrift 
b/lib/go/test/ConflictNamespaceTestE.thrift
similarity index 69%
copy from lib/go/test/ConflictNamespaceTestSuperThing.thrift
copy to lib/go/test/ConflictNamespaceTestE.thrift
index 2348a62..07d6c01 100644
--- a/lib/go/test/ConflictNamespaceTestSuperThing.thrift
+++ b/lib/go/test/ConflictNamespaceTestE.thrift
@@ -16,14 +16,8 @@
 # specific language governing permissions and limitations
 # under the License.
 #
-include "ConflictNamespaceTestA.thrift"
-include "ConflictNamespaceTestB.thrift"
-include "ConflictNamespaceTestC.thrift"
-include "ConflictNamespaceTestD.thrift"
+namespace go conflicte.driver
 
-struct SuperThing {
-  1: ConflictNamespaceTestA.ThingA thing_a
-  2: ConflictNamespaceTestB.ThingB thing_b
-  3: ConflictNamespaceTestC.ThingC thing_c
-  4: ConflictNamespaceTestD.ThingD thing_d
+struct ThingE {
+  1: bool value
 }
diff --git a/lib/go/test/ConflictNamespaceTestSuperThing.thrift 
b/lib/go/test/ConflictNamespaceTestF.thrift
similarity index 69%
copy from lib/go/test/ConflictNamespaceTestSuperThing.thrift
copy to lib/go/test/ConflictNamespaceTestF.thrift
index 2348a62..6d3ff96 100644
--- a/lib/go/test/ConflictNamespaceTestSuperThing.thrift
+++ b/lib/go/test/ConflictNamespaceTestF.thrift
@@ -16,14 +16,8 @@
 # specific language governing permissions and limitations
 # under the License.
 #
-include "ConflictNamespaceTestA.thrift"
-include "ConflictNamespaceTestB.thrift"
-include "ConflictNamespaceTestC.thrift"
-include "ConflictNamespaceTestD.thrift"
+namespace go conflictf.thrift
 
-struct SuperThing {
-  1: ConflictNamespaceTestA.ThingA thing_a
-  2: ConflictNamespaceTestB.ThingB thing_b
-  3: ConflictNamespaceTestC.ThingC thing_c
-  4: ConflictNamespaceTestD.ThingD thing_d
+struct ThingF {
+  1: bool value
 }
diff --git a/lib/go/test/ConflictNamespaceTestSuperThing.thrift 
b/lib/go/test/ConflictNamespaceTestSuperThing.thrift
index 2348a62..348d8fb 100644
--- a/lib/go/test/ConflictNamespaceTestSuperThing.thrift
+++ b/lib/go/test/ConflictNamespaceTestSuperThing.thrift
@@ -16,14 +16,26 @@
 # specific language governing permissions and limitations
 # under the License.
 #
+namespace go conflict.super
+
 include "ConflictNamespaceTestA.thrift"
 include "ConflictNamespaceTestB.thrift"
 include "ConflictNamespaceTestC.thrift"
 include "ConflictNamespaceTestD.thrift"
+include "ConflictNamespaceTestE.thrift"
+include "ConflictNamespaceTestF.thrift"
 
 struct SuperThing {
   1: ConflictNamespaceTestA.ThingA thing_a
   2: ConflictNamespaceTestB.ThingB thing_b
   3: ConflictNamespaceTestC.ThingC thing_c
   4: ConflictNamespaceTestD.ThingD thing_d
+  5: ConflictNamespaceTestE.ThingE thing_e
+  6: ConflictNamespaceTestF.ThingF thing_f
+}
+
+// Define an enum to force the import of database/sql/driver
+enum Enum {
+  One = 1
+  Two = 2
 }
diff --git a/lib/go/test/Makefile.am b/lib/go/test/Makefile.am
index 9f174bb..cd0f33c 100644
--- a/lib/go/test/Makefile.am
+++ b/lib/go/test/Makefile.am
@@ -44,6 +44,8 @@ gopath: $(THRIFT) $(THRIFTTEST) \
                                ConflictNamespaceTestB.thrift \
                                ConflictNamespaceTestC.thrift \
                                ConflictNamespaceTestD.thrift \
+                               ConflictNamespaceTestE.thrift \
+                               ConflictNamespaceTestF.thrift \
                                ConflictNamespaceTestSuperThing.thrift \
                                ConflictNamespaceServiceTest.thrift \
                                DuplicateImportsTest.thrift \
@@ -74,6 +76,8 @@ gopath: $(THRIFT) $(THRIFTTEST) \
        $(THRIFT) $(THRIFTARGS) ConflictNamespaceTestB.thrift
        $(THRIFT) $(THRIFTARGS) ConflictNamespaceTestC.thrift
        $(THRIFT) $(THRIFTARGS) ConflictNamespaceTestD.thrift
+       $(THRIFT) $(THRIFTARGS) ConflictNamespaceTestE.thrift
+       $(THRIFT) $(THRIFTARGS) ConflictNamespaceTestF.thrift
        $(THRIFT) $(THRIFTARGS) ConflictNamespaceTestSuperThing.thrift
        $(THRIFT) $(THRIFTARGS) ConflictNamespaceServiceTest.thrift
        $(THRIFT) $(THRIFTARGS) -r DuplicateImportsTest.thrift
@@ -97,7 +101,7 @@ check: gopath
                                ./gopath/src/dontexportrwtest \
                                ./gopath/src/ignoreinitialismstest \
                                ./gopath/src/unionbinarytest \
-                               ./gopath/src/conflictnamespacetestsuperthing \
+                               ./gopath/src/conflict/super \
                                
./gopath/src/conflict/context/conflict_service-remote \
                                ./gopath/src/servicestest/container_test-remote 
\
                                ./gopath/src/duplicateimportstest \
diff --git a/lib/go/test/tests/conflict_namespace_test.go 
b/lib/go/test/tests/conflict_namespace_test.go
new file mode 100644
index 0000000..b0b98db
--- /dev/null
+++ b/lib/go/test/tests/conflict_namespace_test.go
@@ -0,0 +1,27 @@
+/*
+ * 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.
+ */
+
+package tests
+
+import (
+       "github.com/apache/thrift/lib/go/test/gopath/src/conflict/super"
+)
+
+// We just want to make sure that the compiler generated package compiles.
+var _ = super.GoUnusedProtection__

Reply via email to