summaryrefslogtreecommitdiffstats
path: root/googlemock/scripts/generator/cpp
diff options
context:
space:
mode:
authorAbseil Team <absl-team@google.com>2020-12-29 07:26:08 -0500
committerDerek Mauro <dmauro@google.com>2021-01-13 20:58:49 -0500
commit95a9bdd9f91222e34d7ef50757e24351d73927b9 (patch)
treee94b0aadc9f8e700147293332524477dfc6deaa7 /googlemock/scripts/generator/cpp
parentd72813110ce1d52820227ea0377462d4552d00d1 (diff)
downloadgoogletest-95a9bdd9f91222e34d7ef50757e24351d73927b9.tar.gz
googletest-95a9bdd9f91222e34d7ef50757e24351d73927b9.zip
Googletest export
Use an OrderedDict to store templated_types in the AST so that gmock knows how to properly construct the templated Mock class. This is necessary for functions that make use of the templated typename as an argument or return type. PiperOrigin-RevId: 349405731
Diffstat (limited to 'googlemock/scripts/generator/cpp')
-rwxr-xr-xgooglemock/scripts/generator/cpp/ast.py3
-rwxr-xr-xgooglemock/scripts/generator/cpp/gmock_class.py9
-rwxr-xr-xgooglemock/scripts/generator/cpp/gmock_class_test.py22
3 files changed, 27 insertions, 7 deletions
diff --git a/googlemock/scripts/generator/cpp/ast.py b/googlemock/scripts/generator/cpp/ast.py
index cc9f89aa..db20de49 100755
--- a/googlemock/scripts/generator/cpp/ast.py
+++ b/googlemock/scripts/generator/cpp/ast.py
@@ -36,6 +36,7 @@ except ImportError:
# Python 2.x
import __builtin__ as builtins
+import collections
import sys
import traceback
@@ -1433,7 +1434,7 @@ class AstBuilder(object):
pass # Not needed yet.
def _GetTemplatedTypes(self):
- result = {}
+ result = collections.OrderedDict()
tokens = list(self._GetMatchingChar('<', '>'))
len_tokens = len(tokens) - 1 # Ignore trailing '>'.
i = 0
diff --git a/googlemock/scripts/generator/cpp/gmock_class.py b/googlemock/scripts/generator/cpp/gmock_class.py
index 488cc153..c4d27934 100755
--- a/googlemock/scripts/generator/cpp/gmock_class.py
+++ b/googlemock/scripts/generator/cpp/gmock_class.py
@@ -159,12 +159,13 @@ def _GenerateMocks(filename, source, ast_list, desired_class_names):
# Add template args for templated classes.
if class_node.templated_types:
- # TODO(paulchang): The AST doesn't preserve template argument order,
- # so we have to make up names here.
# TODO(paulchang): Handle non-type template arguments (e.g.
# template<typename T, int N>).
- template_arg_count = len(class_node.templated_types.keys())
- template_args = ['T%d' % n for n in range(template_arg_count)]
+
+ # class_node.templated_types is an OrderedDict from strings to a tuples.
+ # The key is the name of the template, and the value is
+ # (type_name, default). Both type_name and default could be None.
+ template_args = class_node.templated_types.keys()
template_decls = ['typename ' + arg for arg in template_args]
lines.append('template <' + ', '.join(template_decls) + '>')
parent_name += '<' + ', '.join(template_args) + '>'
diff --git a/googlemock/scripts/generator/cpp/gmock_class_test.py b/googlemock/scripts/generator/cpp/gmock_class_test.py
index 527182cc..7d5e2f17 100755
--- a/googlemock/scripts/generator/cpp/gmock_class_test.py
+++ b/googlemock/scripts/generator/cpp/gmock_class_test.py
@@ -428,8 +428,8 @@ class Test {
};
"""
expected = """\
-template <typename T0, typename T1>
-class MockTest : public Test<T0, T1> {
+template <typename S, typename T>
+class MockTest : public Test<S, T> {
public:
MOCK_METHOD(void, Foo, (), (override));
};
@@ -454,6 +454,24 @@ MOCK_METHOD(void, Bar, (const FooType& test_arg), (override));
self.assertEqualIgnoreLeadingWhitespace(expected,
self.GenerateMocks(source))
+ def testTemplatedClassWithTemplatedArguments(self):
+ source = """
+template <typename S, typename T, typename U, typename V, typename W>
+class Test {
+ public:
+ virtual U Foo(T some_arg);
+};
+"""
+ expected = """\
+template <typename S, typename T, typename U, typename V, typename W>
+class MockTest : public Test<S, T, U, V, W> {
+public:
+MOCK_METHOD(U, Foo, (T some_arg), (override));
+};
+"""
+ self.assertEqualIgnoreLeadingWhitespace(expected,
+ self.GenerateMocks(source))
+
def testTemplateInATemplateTypedefWithComma(self):
source = """
class Test {
OpenPOWER on IntegriCloud