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__