diff options
Diffstat (limited to 'scripts')
| -rw-r--r-- | scripts/generator/README | 2 | ||||
| -rwxr-xr-x | scripts/generator/cpp/gmock_class.py | 51 | 
2 files changed, 31 insertions, 22 deletions
| diff --git a/scripts/generator/README b/scripts/generator/README index 2fc695a6..ddaa9d44 100644 --- a/scripts/generator/README +++ b/scripts/generator/README @@ -14,7 +14,7 @@ to generate a Google Mock class.  Make sure to install the scripts somewhere in your path.  Then you can  run the program. -  gmock_gen.py header-file.h [ClassName1] [ClassName2] ... +  gmock_gen.py header-file.h [ClassName]...  If no ClassNames are specified, all classes in the file are emitted. diff --git a/scripts/generator/cpp/gmock_class.py b/scripts/generator/cpp/gmock_class.py index ab2da32d..ba11f9e6 100755 --- a/scripts/generator/cpp/gmock_class.py +++ b/scripts/generator/cpp/gmock_class.py @@ -14,13 +14,14 @@  # See the License for the specific language governing permissions and  # limitations under the License. -"""Generate a Google Mock class from a production class. +"""Generate Google Mock classes from base classes. -This program will read in a C++ source file and output the Google Mock class -for the specified class. +This program will read in a C++ source file and output the Google Mock +classes for the specified classes.  If no class is specified, all +classes in the source file are emitted.  Usage: -  gmock_class.py header-file.h [ClassName1] [ClassName2] ... +  gmock_class.py header-file.h [ClassName]...  Output is sent to stdout.  """ @@ -35,7 +36,8 @@ import sys  from cpp import ast  from cpp import utils -# How many spaces to indent.  Can set me with INDENT environment variable. +_VERSION = (1, 0, 1)  # The version of this script. +# How many spaces to indent.  Can set me with the INDENT environment variable.  _INDENT = 2 @@ -54,7 +56,7 @@ def _GenerateMethods(output_lines, source, class_node):          const = 'CONST_'        return_type = 'void'        if node.return_type: -        # Add modifier bits like const. +        # Add modifiers like 'const'.          modifiers = ''          if node.return_type.modifiers:            modifiers = ' '.join(node.return_type.modifiers) + ' ' @@ -79,12 +81,15 @@ def _GenerateMethods(output_lines, source, class_node):        output_lines.append(line) -def _GenerateMock(filename, source, ast_list, desired_class_names): +def _GenerateMocks(filename, source, ast_list, desired_class_names): +  processed_class_names = set()    lines = []    for node in ast_list: -    if (isinstance(node, ast.Class) and node.body and  -        (desired_class_names is None or node.name in desired_class_names)): +    if (isinstance(node, ast.Class) and node.body and +        # desired_class_names being None means that all classes are selected. +        (not desired_class_names or node.name in desired_class_names)):        class_name = node.name +      processed_class_names.add(class_name)        class_node = node        # Add namespace before the class.        if class_node.namespace: @@ -114,19 +119,23 @@ def _GenerateMock(filename, source, ast_list, desired_class_names):            lines.append('}  // namespace %s' % class_node.namespace[i])          lines.append('')  # Add an extra newline. -  if lines: -    sys.stdout.write('\n'.join(lines)) -  else: -    if desired_class_names is None: -      sys.stderr.write('No classes not found\n') -    else: -      class_names = ', '.join(sorted(desired_class_names)) -      sys.stderr.write('Class(es) not found: %s\n' % class_names) +  sys.stdout.write('\n'.join(lines)) + +  if desired_class_names: +    missing_class_names = ', '.join( +        sorted(desired_class_names - processed_class_names)) +    if missing_class_names: +      sys.stderr.write('Class(es) not found in %s: %s\n' % +                       (filename, missing_class_names)) +  elif not processed_class_names: +      sys.stderr.write('No class found in %s\n' % filename)  def main(argv=sys.argv):    if len(argv) < 2: -    sys.stdout.write(__doc__) +    sys.stderr.write('Google Mock Class Generator v%s\n\n' % +                     '.'.join(map(str, _VERSION))) +    sys.stderr.write(__doc__)      return 1    global _INDENT @@ -138,9 +147,9 @@ def main(argv=sys.argv):      sys.stderr.write('Unable to use indent of %s\n' % os.environ.get('INDENT'))    filename = argv[1] -  class_name = None +  desired_class_names = None  # None means all classes in the source file.    if len(argv) >= 3: -    class_name = set(argv[2:]) +    desired_class_names = set(argv[2:])    source = utils.ReadFile(filename)    if source is None:      return 1 @@ -154,7 +163,7 @@ def main(argv=sys.argv):      # An error message was already printed since we couldn't parse.      pass    else: -    _GenerateMock(filename, source, entire_ast, class_name) +    _GenerateMocks(filename, source, entire_ast, desired_class_names)  if __name__ == '__main__': | 
