Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(223)

Unified Diff: tools/unused-grit-header.py

Issue 524743002: More unused grit header script improvements: (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@grit_clean_chromium_strings_401588_a_remove
Patch Set: Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « tools/resources/list_unused_grit_header.py ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: tools/unused-grit-header.py
diff --git a/tools/unused-grit-header.py b/tools/unused-grit-header.py
deleted file mode 100755
index 79c329d2fc7e350183626ceb6977d905c4bd6f35..0000000000000000000000000000000000000000
--- a/tools/unused-grit-header.py
+++ /dev/null
@@ -1,209 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2014 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.
-
-"""A tool to scan source files for unneeded grit includes."""
-
-import os
-import sys
-import xml.etree.ElementTree
-
-IF_ELSE_TAGS = ('if', 'else')
-
-
-def Usage(prog_name):
- print prog_name, 'GRD_FILE DIRS_TO_SCAN'
-
-
-def GetResourcesForNode(node, parent_file, resource_tag):
- """Recursively iterate through a node and extract resource names.
-
- Args:
- node: The node to iterate through.
- parent_file: The file that contains node.
- resource_tag: The resource tag to extract names from.
-
- Returns:
- A list of resource names.
- """
- resources = []
- for child in node.getchildren():
- if child.tag == resource_tag:
- resources.append(child.attrib['name'])
- elif child.tag in IF_ELSE_TAGS:
- resources.extend(GetResourcesForNode(child, parent_file, resource_tag))
- elif child.tag == 'part':
- parent_dir = os.path.dirname(parent_file)
- part_file = os.path.join(parent_dir, child.attrib['file'])
- part_tree = xml.etree.ElementTree.parse(part_file)
- part_root = part_tree.getroot()
- assert part_root.tag == 'grit-part'
- resources.extend(GetResourcesForNode(part_root, part_file, resource_tag))
- else:
- raise Exception('unknown tag:', child.tag)
- return resources
-
-
-def FindNodeWithTag(node, tag):
- """Look through a node's children for a child node with a given tag.
-
- Args:
- root: The node to examine.
- tag: The tag on a child node to look for.
-
- Returns:
- A child node with the given tag, or None.
- """
- result = None
- for n in node.getchildren():
- if n.tag == tag:
- assert not result
- result = n
- return result
-
-
-def GetResourcesForGrdFile(tree, grd_file):
- """Find all the message and include resources from a given grit file.
-
- Args:
- tree: The XML tree.
- grd_file: The file that contains the XML tree.
-
- Returns:
- A list of resource names.
- """
- root = tree.getroot()
- assert root.tag == 'grit'
- release_node = FindNodeWithTag(root, 'release')
- assert release_node != None
-
- resources = set()
- for node_type in ('message', 'include', 'structure'):
- resources_node = FindNodeWithTag(release_node, node_type + 's')
- if resources_node != None:
- resources = resources.union(
- set(GetResourcesForNode(resources_node, grd_file, node_type)))
- return resources
-
-
-def GetOutputFileForNode(node):
- """Find the output file starting from a given node.
-
- Args:
- node: The root node to scan from.
-
- Returns:
- A grit header file name.
- """
- output_file = None
- for child in node.getchildren():
- if child.tag == 'output':
- if child.attrib['type'] == 'rc_header':
- assert output_file is None
- output_file = child.attrib['filename']
- elif child.tag in IF_ELSE_TAGS:
- child_output_file = GetOutputFileForNode(child)
- if not child_output_file:
- continue
- assert output_file is None
- output_file = child_output_file
- else:
- raise Exception('unknown tag:', child.tag)
- return output_file
-
-
-def GetOutputHeaderFile(tree):
- """Find the output file for a given tree.
-
- Args:
- tree: The tree to scan.
-
- Returns:
- A grit header file name.
- """
- root = tree.getroot()
- assert root.tag == 'grit'
- output_node = FindNodeWithTag(root, 'outputs')
- assert output_node != None
- return GetOutputFileForNode(output_node)
-
-
-def ShouldScanFile(filename):
- """Return if the filename has one of the extensions below."""
- extensions = ['.cc', '.cpp', '.h', '.mm']
- file_extension = os.path.splitext(filename)[1]
- return file_extension in extensions
-
-
-def NeedsGritInclude(grit_header, resources, filename):
- """Return whether a file needs a given grit header or not.
-
- Args:
- grit_header: The grit header file name.
- resources: The list of resource names in grit_header.
- filename: The file to scan.
-
- Returns:
- True if the file should include the grit header.
- """
- # A list of special keywords that implies the file needs grit headers.
- # To be more thorough, one would need to run a pre-processor.
- SPECIAL_KEYWORDS = (
- 'IMAGE_GRID(', # Macro in nine_image_painter_factory.h
- '#include "ui_localizer_table.h"', # ui_localizer.mm
- 'DEFINE_RESOURCE_ID', # chrome/browser/android/resource_mapper.cc
- )
- with open(filename, 'rb') as f:
- grit_header_line = grit_header + '"\n'
- has_grit_header = False
- while True:
- line = f.readline()
- if not line:
- break
- if line.endswith(grit_header_line):
- has_grit_header = True
- break
-
- if not has_grit_header:
- return True
- rest_of_the_file = f.read()
- return (any(resource in rest_of_the_file for resource in resources) or
- any(keyword in rest_of_the_file for keyword in SPECIAL_KEYWORDS))
-
-
-def main(argv):
- if len(argv) < 3:
- Usage(argv[0])
- return 1
- grd_file = argv[1]
- dirs_to_scan = argv[2:]
- for f in dirs_to_scan:
- if not os.path.exists(f):
- print 'Error: %s does not exist' % f
- return 1
-
- tree = xml.etree.ElementTree.parse(grd_file)
- grit_header = GetOutputHeaderFile(tree)
- if not grit_header:
- print 'Error: %s does not generate any output headers.' % grit_header
- return 1
- resources = GetResourcesForGrdFile(tree, grd_file)
-
- files_with_unneeded_grit_includes = []
- for dir_to_scan in dirs_to_scan:
- for root, dirs, files in os.walk(dir_to_scan):
- if '.git' in dirs:
- dirs.remove('.git')
- full_paths = [os.path.join(root, f) for f in files if ShouldScanFile(f)]
- files_with_unneeded_grit_includes.extend(
- [f for f in full_paths
- if not NeedsGritInclude(grit_header, resources, f)])
- if files_with_unneeded_grit_includes:
- print '\n'.join(files_with_unneeded_grit_includes)
- return 2
- return 0
-
-
-if __name__ == '__main__':
- sys.exit(main(sys.argv))
« no previous file with comments | « tools/resources/list_unused_grit_header.py ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698