You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@thrift.apache.org by je...@apache.org on 2015/03/14 15:39:11 UTC

thrift git commit: THRIFT-3027 Go compiler does not ensure common initialisms have consistent case Client: Go Patch: Magrath

Repository: thrift
Updated Branches:
  refs/heads/master 28c1c19f9 -> 1d1bca273


THRIFT-3027 Go compiler does not ensure common initialisms have consistent case
Client: Go
Patch: Magrath <pa...@paulmagrath.com>

This closes #394


Project: http://git-wip-us.apache.org/repos/asf/thrift/repo
Commit: http://git-wip-us.apache.org/repos/asf/thrift/commit/1d1bca27
Tree: http://git-wip-us.apache.org/repos/asf/thrift/tree/1d1bca27
Diff: http://git-wip-us.apache.org/repos/asf/thrift/diff/1d1bca27

Branch: refs/heads/master
Commit: 1d1bca2738febb87bf132d041a73cd8da5a6328b
Parents: 28c1c19
Author: Jens Geyer <je...@apache.org>
Authored: Sat Mar 14 16:28:27 2015 +0200
Committer: Jens Geyer <je...@apache.org>
Committed: Sat Mar 14 16:38:43 2015 +0200

----------------------------------------------------------------------
 compiler/cpp/src/generate/t_go_generator.cc | 44 +++++++++++++++++-------
 lib/go/test/InitialismsTest.thrift          | 23 +++++++++++++
 lib/go/test/Makefile.am                     | 10 ++++--
 lib/go/test/tests/initialisms_test.go       | 39 +++++++++++++++++++++
 4 files changed, 101 insertions(+), 15 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/thrift/blob/1d1bca27/compiler/cpp/src/generate/t_go_generator.cc
----------------------------------------------------------------------
diff --git a/compiler/cpp/src/generate/t_go_generator.cc b/compiler/cpp/src/generate/t_go_generator.cc
index 74960da..4826114 100644
--- a/compiler/cpp/src/generate/t_go_generator.cc
+++ b/compiler/cpp/src/generate/t_go_generator.cc
@@ -35,6 +35,7 @@
 #include <sys/types.h>
 #include <sstream>
 #include <algorithm>
+#include <clocale>
 #include "t_generator.h"
 #include "platform.h"
 #include "version.h"
@@ -292,6 +293,7 @@ private:
   std::string package_name_;
   std::string package_dir_;
 
+  static std::string camelcase(const std::string& value);
   static std::string publicize(const std::string& value, bool is_args_or_result = false);
   static std::string new_prefix(const std::string& value);
   static std::string privatize(const std::string& value);
@@ -406,6 +408,34 @@ bool t_go_generator::is_pointer_field(t_field* tfield, bool in_container_value)
   throw "INVALID TYPE IN type_to_go_type: " + type->get_name();
 }
 
+// This set is taken from https://github.com/golang/lint/blob/master/lint.go#L692
+const std::set<std::string> commonInitialisms = {"API", "ASCII", "CPU", "CSS",
+"DNS", "EOF", "GUID", "HTML", "HTTP", "HTTPS", "ID", "IP", "JSON", "LHS", 
+"QPS", "RAM", "RHS", "RPC", "SLA", "SMTP", "SSH", "TCP", "TLS", "TTL", "UDP", 
+"UI", "UID", "UUID", "URI", "URL", "UTF8", "VM", "XML", "XSRF", "XSS",}; 
+
+std::string t_go_generator::camelcase(const std::string& value) {
+  
+  std::string value2(value);
+  std::setlocale(LC_ALL, "C"); // set locale to classic
+  
+  // as long as we are changing things, let's change _ followed by lowercase to capital and fix common initialisms
+  for (std::string::size_type i = 1; i < value2.size() - 1; ++i) {
+    if (value2[i] == '_'){
+      if (islower(value2[i + 1])) {
+        value2.replace(i, 2, 1, toupper(value2[i + 1]));
+      }
+      std::string word = value2.substr(i,value2.find('_', i));
+      std::transform(word.begin(), word.end(), word.begin(), ::toupper);
+      if (commonInitialisms.find(word) != commonInitialisms.end()) {
+        value2.replace(i, word.length(), word); 
+      }
+    }
+  }
+  
+  return value2;
+}
+
 std::string t_go_generator::publicize(const std::string& value, bool is_args_or_result) {
   if (value.size() <= 0) {
     return value;
@@ -423,12 +453,7 @@ std::string t_go_generator::publicize(const std::string& value, bool is_args_or_
     value2[0] = toupper(value2[0]);
   }
 
-  // as long as we are changing things, let's change _ followed by lowercase to capital
-  for (string::size_type i = 1; i < value2.size() - 1; ++i) {
-    if (value2[i] == '_' && islower(value2[i + 1])) {
-      value2.replace(i, 2, 1, toupper(value2[i + 1]));
-    }
-  }
+  value2 = camelcase(value2);
 
   // final length before further checks, the string may become longer
   size_t len_before = value2.length();
@@ -477,12 +502,7 @@ std::string t_go_generator::privatize(const std::string& value) {
     value2[0] = tolower(value2[0]);
   }
 
-  // as long as we are changing things, let's change _ followed by lowercase to capital
-  for (string::size_type i = 1; i < value2.size() - 1; ++i) {
-    if (value2[i] == '_' && isalpha(value2[i + 1])) {
-      value2.replace(i, 2, 1, toupper(value2[i + 1]));
-    }
-  }
+  value2 = camelcase(value2);
 
   return value2;
 }

http://git-wip-us.apache.org/repos/asf/thrift/blob/1d1bca27/lib/go/test/InitialismsTest.thrift
----------------------------------------------------------------------
diff --git a/lib/go/test/InitialismsTest.thrift b/lib/go/test/InitialismsTest.thrift
new file mode 100644
index 0000000..68b6350
--- /dev/null
+++ b/lib/go/test/InitialismsTest.thrift
@@ -0,0 +1,23 @@
+#
+# 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.
+#
+
+struct InitialismsTest {
+    1: string user_id,
+    2: string server_url,
+}

http://git-wip-us.apache.org/repos/asf/thrift/blob/1d1bca27/lib/go/test/Makefile.am
----------------------------------------------------------------------
diff --git a/lib/go/test/Makefile.am b/lib/go/test/Makefile.am
index f34b577..ef61249 100644
--- a/lib/go/test/Makefile.am
+++ b/lib/go/test/Makefile.am
@@ -32,7 +32,8 @@ gopath: $(top_srcdir)/compiler/cpp/thrift $(THRIFTTEST) \
 				TypedefFieldTest.thrift \
 				RefAnnotationFieldsTest.thrift \
 				ErrorTest.thrift \
-				NamesTest.thrift
+				NamesTest.thrift \
+				InitialismsTest.thrift
 	mkdir -p gopath/src
 	grep -v list.*map.*list.*map $(THRIFTTEST) | grep -v 'set<Insanity>' > ThriftTest.thrift
 	$(THRIFT) -r IncludesTest.thrift
@@ -46,6 +47,7 @@ gopath: $(top_srcdir)/compiler/cpp/thrift $(THRIFTTEST) \
 	$(THRIFT) RefAnnotationFieldsTest.thrift
 	$(THRIFT) ErrorTest.thrift
 	$(THRIFT) NamesTest.thrift
+	$(THRIFT) InitialismsTest.thrift
 	GOPATH=`pwd`/gopath $(GO) get code.google.com/p/gomock/gomock
 	ln -nfs ../../../thrift gopath/src/thrift
 	ln -nfs ../../tests gopath/src/tests
@@ -59,7 +61,8 @@ check: gopath
 				typedeffieldtest \
 				refannotationfieldstest \
 				errortest	\
-				namestest
+				namestest \
+				initialismstest
 	GOPATH=`pwd`/gopath $(GO) test thrift tests
 
 clean-local:
@@ -81,4 +84,5 @@ EXTRA_DIST = \
 	ServicesTest.thrift \
 	TypedefFieldTest.thrift \
 	ErrorTest.thrift \
-	NamesTest.thrift
+	NamesTest.thrift \
+	InitialismsTest.thrift

http://git-wip-us.apache.org/repos/asf/thrift/blob/1d1bca27/lib/go/test/tests/initialisms_test.go
----------------------------------------------------------------------
diff --git a/lib/go/test/tests/initialisms_test.go b/lib/go/test/tests/initialisms_test.go
new file mode 100644
index 0000000..1d13b97
--- /dev/null
+++ b/lib/go/test/tests/initialisms_test.go
@@ -0,0 +1,39 @@
+/*
+ * 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 (
+	"initialismstest"
+	"reflect"
+	"testing"
+)
+
+func TestThatCommonInitialismsAreFixed(t *testing.T) {
+	s := initialismstest.InitialismsTest{}
+	st := reflect.TypeOf(s)
+	_, ok := st.FieldByName("UserID")
+	if !ok {
+		t.Error("UserID attribute is missing!")
+	}
+	_, ok = st.FieldByName("ServerURL")
+	if !ok {
+		t.Error("ServerURL attribute is missing!")
+	}
+}