#!/usr/bin/python
# Copyright (c) 2011 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.
# based on an almost identical script by: jyrki@google.com (Jyrki Alakuijala)
#
# This script prints out include dependencies in chrome. Since it ignores
# defines, it gives just a rough estimation of file size.
#
# Usage:
#   python tools/include_tracer.py chrome/browser/ui/browser.h

import os
import sys

# Created by copying the command line for prerender_browsertest.cc, replacing
# spaces with newlines, and dropping everything except -F and -I switches.
# TODO(port): Add windows, linux directories.
INCLUDE_PATHS = [
  '',
  'gpu',
  'skia/config',
  'skia/ext',
  'testing/gmock/include',
  'testing/gtest/include',
  'third_party/GTM',
  'third_party/WebKit/Source',
  'third_party/WebKit/Source/JavaScriptCore',
  'third_party/WebKit/Source/JavaScriptCore/wtf',
  'third_party/WebKit/Source/ThirdParty/glu',
  'third_party/WebKit/Source/WebCore',
  'third_party/WebKit/Source/WebCore/accessibility',
  'third_party/WebKit/Source/WebCore/accessibility/chromium',
  'third_party/WebKit/Source/WebCore/bindings',
  'third_party/WebKit/Source/WebCore/bindings/generic',
  'third_party/WebKit/Source/WebCore/bindings/v8',
  'third_party/WebKit/Source/WebCore/bindings/v8/custom',
  'third_party/WebKit/Source/WebCore/bindings/v8/specialization',
  'third_party/WebKit/Source/WebCore/bridge',
  'third_party/WebKit/Source/WebCore/bridge/jni',
  'third_party/WebKit/Source/WebCore/bridge/jni/v8',
  'third_party/WebKit/Source/WebCore/css',
  'third_party/WebKit/Source/WebCore/dom',
  'third_party/WebKit/Source/WebCore/dom/default',
  'third_party/WebKit/Source/WebCore/editing',
  'third_party/WebKit/Source/WebCore/fileapi',
  'third_party/WebKit/Source/WebCore/history',
  'third_party/WebKit/Source/WebCore/html',
  'third_party/WebKit/Source/WebCore/html/canvas',
  'third_party/WebKit/Source/WebCore/html/parser',
  'third_party/WebKit/Source/WebCore/html/shadow',
  'third_party/WebKit/Source/WebCore/inspector',
  'third_party/WebKit/Source/WebCore/loader',
  'third_party/WebKit/Source/WebCore/loader/appcache',
  'third_party/WebKit/Source/WebCore/loader/archive',
  'third_party/WebKit/Source/WebCore/loader/cache',
  'third_party/WebKit/Source/WebCore/loader/icon',
  'third_party/WebKit/Source/WebCore/mathml',
  'third_party/WebKit/Source/WebCore/notifications',
  'third_party/WebKit/Source/WebCore/page',
  'third_party/WebKit/Source/WebCore/page/animation',
  'third_party/WebKit/Source/WebCore/page/chromium',
  'third_party/WebKit/Source/WebCore/platform',
  'third_party/WebKit/Source/WebCore/platform/animation',
  'third_party/WebKit/Source/WebCore/platform/audio',
  'third_party/WebKit/Source/WebCore/platform/audio/chromium',
  'third_party/WebKit/Source/WebCore/platform/audio/mac',
  'third_party/WebKit/Source/WebCore/platform/chromium',
  'third_party/WebKit/Source/WebCore/platform/cocoa',
  'third_party/WebKit/Source/WebCore/platform/graphics',
  'third_party/WebKit/Source/WebCore/platform/graphics/cg',
  'third_party/WebKit/Source/WebCore/platform/graphics/chromium',
  'third_party/WebKit/Source/WebCore/platform/graphics/cocoa',
  'third_party/WebKit/Source/WebCore/platform/graphics/filters',
  'third_party/WebKit/Source/WebCore/platform/graphics/gpu',
  'third_party/WebKit/Source/WebCore/platform/graphics/mac',
  'third_party/WebKit/Source/WebCore/platform/graphics/opentype',
  'third_party/WebKit/Source/WebCore/platform/graphics/skia',
  'third_party/WebKit/Source/WebCore/platform/graphics/transforms',
  'third_party/WebKit/Source/WebCore/platform/image-decoders',
  'third_party/WebKit/Source/WebCore/platform/image-decoders/bmp',
  'third_party/WebKit/Source/WebCore/platform/image-decoders/gif',
  'third_party/WebKit/Source/WebCore/platform/image-decoders/ico',
  'third_party/WebKit/Source/WebCore/platform/image-decoders/jpeg',
  'third_party/WebKit/Source/WebCore/platform/image-decoders/png',
  'third_party/WebKit/Source/WebCore/platform/image-decoders/skia',
  'third_party/WebKit/Source/WebCore/platform/image-decoders/webp',
  'third_party/WebKit/Source/WebCore/platform/image-decoders/xbm',
  'third_party/WebKit/Source/WebCore/platform/image-encoders/skia',
  'third_party/WebKit/Source/WebCore/platform/mac',
  'third_party/WebKit/Source/WebCore/platform/mock',
  'third_party/WebKit/Source/WebCore/platform/network',
  'third_party/WebKit/Source/WebCore/platform/network/chromium',
  'third_party/WebKit/Source/WebCore/platform/sql',
  'third_party/WebKit/Source/WebCore/platform/text',
  'third_party/WebKit/Source/WebCore/platform/text/mac',
  'third_party/WebKit/Source/WebCore/platform/text/transcoder',
  'third_party/WebKit/Source/WebCore/plugins',
  'third_party/WebKit/Source/WebCore/plugins/chromium',
  'third_party/WebKit/Source/WebCore/rendering',
  'third_party/WebKit/Source/WebCore/rendering/style',
  'third_party/WebKit/Source/WebCore/rendering/svg',
  'third_party/WebKit/Source/WebCore/storage',
  'third_party/WebKit/Source/WebCore/storage/chromium',
  'third_party/WebKit/Source/WebCore/svg',
  'third_party/WebKit/Source/WebCore/svg/animation',
  'third_party/WebKit/Source/WebCore/svg/graphics',
  'third_party/WebKit/Source/WebCore/svg/graphics/filters',
  'third_party/WebKit/Source/WebCore/svg/properties',
  'third_party/WebKit/Source/WebCore/webaudio',
  'third_party/WebKit/Source/WebCore/websockets',
  'third_party/WebKit/Source/WebCore/workers',
  'third_party/WebKit/Source/WebCore/xml',
  'third_party/WebKit/Source/WebKit/chromium/public',
  'third_party/WebKit/Source/WebKit/chromium/src',
  'third_party/WebKit/Source/WebKit/mac/WebCoreSupport',
  'third_party/WebKit/WebKitLibraries',
  'third_party/cld',
  'third_party/icu/public/common',
  'third_party/icu/public/i18n',
  'third_party/npapi',
  'third_party/npapi/bindings',
  'third_party/protobuf',
  'third_party/protobuf/src',
  'third_party/skia/gpu/include',
  'third_party/skia/include/config',
  'third_party/skia/include/core',
  'third_party/skia/include/effects',
  'third_party/skia/include/gpu',
  'third_party/skia/include/pdf',
  'third_party/skia/include/ports',
  'v8/include',
  'xcodebuild/Debug/include',
  'xcodebuild/DerivedSources/Debug/chrome',
  'xcodebuild/DerivedSources/Debug/policy',
  'xcodebuild/DerivedSources/Debug/protoc_out',
  'xcodebuild/DerivedSources/Debug/webkit',
  'xcodebuild/DerivedSources/Debug/webkit/bindings',
]


def Walk(seen, filename, parent, indent):
  """Returns the size of |filename| plus the size of all files included by
  |filename| and prints the include tree of |filename| to stdout. Every file
  is visited at most once.
  """
  total_bytes = 0

  # .proto(devel) filename translation
  if filename.endswith('.pb.h'):
    basename = filename[:-5]
    if os.path.exists(basename + '.proto'):
      filename = basename + '.proto'
    else:
      print 'could not find ', filename

  # Show and count files only once.
  if filename in seen:
    return total_bytes
  seen.add(filename)

  # Display the paths.
  print ' ' * indent + filename

  # Skip system includes.
  if filename[0] == '<':
    return total_bytes

  # Find file in all include paths.
  resolved_filename = filename
  for root in INCLUDE_PATHS + [os.path.dirname(parent)]:
    if os.path.exists(os.path.join(root, filename)):
      resolved_filename = os.path.join(root, filename)
      break

  # Recurse.
  if os.path.exists(resolved_filename):
    lines = open(resolved_filename).readlines()
  else:
    print ' ' * (indent + 2) + "-- not found"
    lines = []
  for line in lines:
    line = line.strip()
    if line.startswith('#include "'):
      total_bytes += Walk(
          seen, line.split('"')[1], resolved_filename, indent + 2)
    elif line.startswith('#include '):
      include = '<' + line.split('<')[1].split('>')[0] + '>'
      total_bytes += Walk(
          seen, include, resolved_filename, indent + 2)
    elif line.startswith('import '):
      total_bytes += Walk(
          seen, line.split('"')[1], resolved_filename, indent + 2)
  return total_bytes + len("".join(lines))


bytes = Walk(set(), sys.argv[1], '', 0)
print
print float(bytes) / (1 << 20), "megabytes of chrome source"