| Index: testing/gmock/scripts/generator/README.cppclean
 | 
| diff --git a/testing/gmock/scripts/generator/README.cppclean b/testing/gmock/scripts/generator/README.cppclean
 | 
| new file mode 100644
 | 
| index 0000000000000000000000000000000000000000..65431b61759319cd35d80bfd0aa78441c0963e7b
 | 
| --- /dev/null
 | 
| +++ b/testing/gmock/scripts/generator/README.cppclean
 | 
| @@ -0,0 +1,115 @@
 | 
| +Goal:
 | 
| +-----
 | 
| +  CppClean attempts to find problems in C++ source that slow development
 | 
| +  in large code bases, for example various forms of unused code.
 | 
| +  Unused code can be unused functions, methods, data members, types, etc
 | 
| +  to unnecessary #include directives.  Unnecessary #includes can cause
 | 
| +  considerable extra compiles increasing the edit-compile-run cycle.
 | 
| +
 | 
| +  The project home page is:   http://code.google.com/p/cppclean/
 | 
| +
 | 
| +
 | 
| +Features:
 | 
| +---------
 | 
| + * Find and print C++ language constructs: classes, methods, functions, etc.
 | 
| + * Find classes with virtual methods, no virtual destructor, and no bases
 | 
| + * Find global/static data that are potential problems when using threads
 | 
| + * Unnecessary forward class declarations
 | 
| + * Unnecessary function declarations
 | 
| + * Undeclared function definitions
 | 
| + * (planned) Find unnecessary header files #included
 | 
| +   - No direct reference to anything in the header
 | 
| +   - Header is unnecessary if classes were forward declared instead
 | 
| + * (planned) Source files that reference headers not directly #included,
 | 
| +   ie, files that rely on a transitive #include from another header
 | 
| + * (planned) Unused members (private, protected, & public) methods and data
 | 
| + * (planned) Store AST in a SQL database so relationships can be queried
 | 
| +
 | 
| +AST is Abstract Syntax Tree, a representation of parsed source code.
 | 
| +http://en.wikipedia.org/wiki/Abstract_syntax_tree
 | 
| +
 | 
| +
 | 
| +System Requirements:
 | 
| +--------------------
 | 
| + * Python 2.4 or later (2.3 probably works too)
 | 
| + * Works on Windows (untested), Mac OS X, and Unix
 | 
| +
 | 
| +
 | 
| +How to Run:
 | 
| +-----------
 | 
| +  For all examples, it is assumed that cppclean resides in a directory called
 | 
| +  /cppclean.
 | 
| +
 | 
| +  To print warnings for classes with virtual methods, no virtual destructor and
 | 
| +  no base classes:
 | 
| +
 | 
| +      /cppclean/run.sh nonvirtual_dtors.py file1.h file2.h file3.cc ...
 | 
| +
 | 
| +  To print all the functions defined in header file(s):
 | 
| +
 | 
| +      /cppclean/run.sh functions.py file1.h file2.h ...
 | 
| +
 | 
| +  All the commands take multiple files on the command line.  Other programs
 | 
| +  include: find_warnings, headers, methods, and types.  Some other programs
 | 
| +  are available, but used primarily for debugging.
 | 
| +
 | 
| +  run.sh is a simple wrapper that sets PYTHONPATH to /cppclean and then
 | 
| +  runs the program in /cppclean/cpp/PROGRAM.py.  There is currently
 | 
| +  no equivalent for Windows.  Contributions for a run.bat file
 | 
| +  would be greatly appreciated.
 | 
| +
 | 
| +
 | 
| +How to Configure:
 | 
| +-----------------
 | 
| +  You can add a siteheaders.py file in /cppclean/cpp to configure where
 | 
| +  to look for other headers (typically -I options passed to a compiler).
 | 
| +  Currently two values are supported:  _TRANSITIVE and GetIncludeDirs.
 | 
| +  _TRANSITIVE should be set to a boolean value (True or False) indicating
 | 
| +  whether to transitively process all header files.  The default is False.
 | 
| +
 | 
| +  GetIncludeDirs is a function that takes a single argument and returns
 | 
| +  a sequence of directories to include.  This can be a generator or
 | 
| +  return a static list.
 | 
| +
 | 
| +      def GetIncludeDirs(filename):
 | 
| +          return ['/some/path/with/other/headers']
 | 
| +
 | 
| +      # Here is a more complicated example.
 | 
| +      def GetIncludeDirs(filename):
 | 
| +          yield '/path1'
 | 
| +          yield os.path.join('/path2', os.path.dirname(filename))
 | 
| +          yield '/path3'
 | 
| +
 | 
| +
 | 
| +How to Test:
 | 
| +------------
 | 
| +  For all examples, it is assumed that cppclean resides in a directory called
 | 
| +  /cppclean.  The tests require
 | 
| +
 | 
| +  cd /cppclean
 | 
| +  make test
 | 
| +  # To generate expected results after a change:
 | 
| +  make expected
 | 
| +
 | 
| +
 | 
| +Current Status:
 | 
| +---------------
 | 
| +  The parser works pretty well for header files, parsing about 99% of Google's
 | 
| +  header files.  Anything which inspects structure of C++ source files should
 | 
| +  work reasonably well.  Function bodies are not transformed to an AST,
 | 
| +  but left as tokens.  Much work is still needed on finding unused header files
 | 
| +  and storing an AST in a database.
 | 
| +
 | 
| +
 | 
| +Non-goals:
 | 
| +----------
 | 
| + * Parsing all valid C++ source
 | 
| + * Handling invalid C++ source gracefully
 | 
| + * Compiling to machine code (or anything beyond an AST)
 | 
| +
 | 
| +
 | 
| +Contact:
 | 
| +--------
 | 
| +  If you used cppclean, I would love to hear about your experiences
 | 
| +  cppclean@googlegroups.com.  Even if you don't use cppclean, I'd like to
 | 
| +  hear from you.  :-)  (You can contact me directly at:  nnorwitz@gmail.com)
 | 
| 
 |