Automated IWYU fix for TaskRunner includes.

Pre-requisite to suppress message_loop.h from run_loop.h (issue 703346).

A similar include fix for message_loop.h was done in r471412 but some
targets are the removal as it looks like they properly didn't need
message_loop.h but were relying on it to get task runner includes...

The reasoning for this is the same as was once done in https://codereview.chromium.org/2443103003
(it was then done only on targets that failed to compile instead of via script):
scoped_refptr<Foo> requires full type of Foo to be defined not just fwd-declared.

Script used:

def Fix(file_path):
  content = refactor_lib.ReadFile(file_path)

  if not 'TaskRunner' in content:
    return False

  # Assume fwd-decls are correct in first pass.
  if 'class TaskRunner;' in content:
    return False
  if 'class SequencedTaskRunner;' in content:
    return False
  if 'class SingleThreadTaskRunner;' in content:
    return False

  # Using base:: prefix ensures we don't match fwd-decls and other things.
  # Will require a few fixups for missing includes in //base proper.
  # Complex prefix in regex attempts to skip comments.
  matches = re.compile(r'(private:|protected:|public:)|(\n *[^/\n][^/\n][^/\n]*base::(Sequenced|SingleThread)TaskRunner\b(>&|\*)?)', re.DOTALL).findall(content)

  if not matches:
    return False

  # Ignore instances in private sections (probably members or worst case methods
  # only used by impl which must include header already).
  in_private_section = False

  found_task_runner = False
  found_sequenced_task_runner = False
  found_single_thread_task_runner = False
  for match in matches:
    if match[0] == 'private:':
      in_private_section = True
      continue
    if match[0] == 'protected:':
      in_private_section = False
      continue
    if match[0] == 'public:':
      in_private_section = False
      continue

    # Otherwise match[0] was empty and we have a match[1] for the main thing.
    assert not match[0]

    # Only want to add the include if we don't have a match[3] (which indicates
    # this match is for a ref or a pointer).
    if match[3]:
      continue

    # Not a ref nor a pointer, count it if not in a private section, match[2]
    # tells which TaskRunner type it is.
    if not in_private_section:
      if not match[2]:
        found_task_runner = True
      elif match[2] == 'Sequenced':
        found_sequenced_task_runner = True
      elif match[2] == 'SingleThread':
        found_single_thread_task_runner = True
      else:
        assert False

  updated_content = content

  if found_task_runner:
    updated_content = refactor_lib.AddInclude(file_path, content, "base/task_runner.h")
  if found_sequenced_task_runner:
    updated_content = refactor_lib.AddInclude(file_path, content, "base/sequenced_task_runner.h")
  if found_single_thread_task_runner:
    updated_content = refactor_lib.AddInclude(file_path, content, "base/single_thread_task_runner.h")

  if updated_content == content:
    return False

  # Write updated file
  refactor_lib.WriteFile(file_path, updated_content)

  return True

TBR=gab@chromiu.org
BUG=703346
CQ_INCLUDE_TRYBOTS=master.tryserver.blink:linux_trusty_blink_rel;master.tryserver.chromium.android:android_optional_gpu_tests_rel;master.tryserver.chromium.linux:linux_optional_gpu_tests_rel;master.tryserver.chromium.mac:mac_optional_gpu_tests_rel;master.tryserver.chromium.win:win_optional_gpu_tests_rel

Review-Url: https://codereview.chromium.org/2884763002 .
Cr-Commit-Position: refs/heads/master@{#472157}


CrOS-Libchrome-Original-Commit: 5ff87ceb5f871cfd111b0d057eaf04d25ccb17ec
4 files changed
tree: 6d9fcc3b2d1bff38239ae8ebe114dbf2a20129af
  1. base/
  2. build/
  3. components/
  4. dbus/
  5. device/
  6. ipc/
  7. mojo/
  8. testing/
  9. third_party/
  10. ui/