diff --git a/googlemock/scripts/generator/cpp/ast.py b/googlemock/scripts/generator/cpp/ast.py index cc9f89aa5..db20de49a 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 488cc1537..c4d279347 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). - 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 527182cc3..7d5e2f17e 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 -class MockTest : public Test { +template +class MockTest : public Test { public: MOCK_METHOD(void, Foo, (), (override)); }; @@ -450,6 +450,24 @@ class MockTest : public Test { public: MOCK_METHOD(void, Bar, (const FooType& test_arg), (override)); }; +""" + self.assertEqualIgnoreLeadingWhitespace(expected, + self.GenerateMocks(source)) + + def testTemplatedClassWithTemplatedArguments(self): + source = """ +template +class Test { + public: + virtual U Foo(T some_arg); +}; +""" + expected = """\ +template +class MockTest : public Test { +public: +MOCK_METHOD(U, Foo, (T some_arg), (override)); +}; """ self.assertEqualIgnoreLeadingWhitespace(expected, self.GenerateMocks(source))