summaryrefslogtreecommitdiffstats
path: root/components/tools/metrics/count_ifdefs.py
diff options
context:
space:
mode:
Diffstat (limited to 'components/tools/metrics/count_ifdefs.py')
-rwxr-xr-xcomponents/tools/metrics/count_ifdefs.py77
1 files changed, 77 insertions, 0 deletions
diff --git a/components/tools/metrics/count_ifdefs.py b/components/tools/metrics/count_ifdefs.py
new file mode 100755
index 0000000..2e3c2ad
--- /dev/null
+++ b/components/tools/metrics/count_ifdefs.py
@@ -0,0 +1,77 @@
+#!/usr/bin/env python
+# Copyright (c) 2012 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""Counts the number of #if or #ifdef lines containing at least one
+preprocessor token that is a full match for the given pattern, in the
+given directory.
+"""
+
+
+import optparse
+import os
+import re
+import sys
+
+
+# Filename extensions we know will be handled by the C preprocessor.
+# We ignore files not matching these.
+CPP_EXTENSIONS = [
+ '.h',
+ '.cc',
+ '.m',
+ '.mm',
+]
+
+
+def _IsTestFile(filename):
+ """Does a rudimentary check to try to skip test files; this could be
+ improved but is good enough for basic metrics generation.
+ """
+ return re.match('(test|mock|dummy)_.*|.*_[a-z]*test\.(h|cc|mm)', filename)
+
+
+def CountIfdefs(token_pattern, directory, skip_tests=False):
+ """Returns the number of lines in files in |directory| and its
+ subdirectories that have an extension from |CPP_EXTENSIONS| and are
+ an #if or #ifdef line with a preprocessor token fully matching
+ the string |token_pattern|.
+
+ If |skip_tests| is true, a best effort is made to ignore test files.
+ """
+ token_line_re = re.compile(r'^#if(def)?.*\b(%s)\b.*$' % token_pattern)
+ count = 0
+ for root, dirs, files in os.walk(directory):
+ for filename in files:
+ if os.path.splitext(filename)[1] in CPP_EXTENSIONS:
+ if not skip_tests or not _IsTestFile(filename):
+ with open(os.path.join(root, filename)) as f:
+ for line in f:
+ line = line.strip()
+ if token_line_re.match(line):
+ count += 1
+ return count
+
+
+def PrintUsage():
+ print "Usage: %s [--skip-tests] TOKEN_PATTERN DIRECTORY" % sys.argv[0]
+
+
+def main():
+ option_parser = optparse.OptionParser()
+ option_parser.add_option('', '--skip-tests', action='store_true',
+ dest='skip_tests', default=False,
+ help='Skip test files.')
+ options, args = option_parser.parse_args()
+
+ if len(args) < 2:
+ PrintUsage()
+ return 1
+ else:
+ print CountIfdefs(args[0], args[1], options.skip_tests)
+ return 0
+
+
+if __name__ == '__main__':
+ sys.exit(main())