cc: Remove use of PassAs() and constructor-casting with scoped_ptr.

Say you have class A and subclass B.

Previously it was required to PassAs() a scoped_ptr<B> into a
scoped_ptr<A>. This is no longer needed, so just use Pass(). For newly
created scoped_ptrs, you can just use make_scoped_ptr always now.

And when you want to return or assign an empty scoped_ptr(), you can
now use nullptr directly.

Also adds PRESUBMIT checks for:
- return scoped<T>(foo). This should be return make_scoped_ptr(foo).
- bar = scoped<T>(foo). This should be return bar = make_scoped_ptr(foo).
- return scoped<T>(). This should be return nullptr.
- bar = scoped<T>(). This should be return bar = nullptr.

This also replaces p.reset() with p = nullptr; But it does not add a
PRESUBMIT check for that because there are things other than scoped_ptr
with a reset() function.

[email protected]

Committed: https://crrev.com/7bb3dbede19d87f0338797756ffd738adc6bca08
Cr-Commit-Position: refs/heads/master@{#297096}

Review URL: https://codereview.chromium.org/609663003

Cr-Commit-Position: refs/heads/master@{#297121}
diff --git a/cc/PRESUBMIT.py b/cc/PRESUBMIT.py
index 6c08441f..f381684 100644
--- a/cc/PRESUBMIT.py
+++ b/cc/PRESUBMIT.py
@@ -146,6 +146,40 @@
       items=errors)]
   return []
 
+def CheckScopedPtr(input_api, output_api,
+                   white_list=CC_SOURCE_FILES, black_list=None):
+  black_list = tuple(black_list or input_api.DEFAULT_BLACK_LIST)
+  source_file_filter = lambda x: input_api.FilterSourceFile(x,
+                                                            white_list,
+                                                            black_list)
+  errors = []
+  for f in input_api.AffectedSourceFiles(source_file_filter):
+    for line_number, line in f.ChangedContents():
+      # Disallow:
+      # return scoped_ptr<T>(foo);
+      # bar = scoped_ptr<T>(foo);
+      # But allow:
+      # return scoped_ptr<T[]>(foo);
+      # bar = scoped_ptr<T[]>(foo);
+      if re.search(r'(=|\breturn)\s*scoped_ptr<.*?(?<!])>\([^)]+\)', line):
+        errors.append(output_api.PresubmitError(
+          ('%s:%d uses explicit scoped_ptr constructor. ' +
+           'Use make_scoped_ptr() instead.') % (f.LocalPath(), line_number)))
+      # Disallow:
+      # return scoped_ptr<T>();
+      # bar = scoped_ptr<T>();
+      if re.search(r'(=|\breturn)\s*scoped_ptr<.*?>\(\)', line):
+        errors.append(output_api.PresubmitError(
+          '%s:%d uses scoped_ptr<T>(). Use nullptr instead.' %
+          (f.LocalPath(), line_number)))
+      # Disallow:
+      # foo.PassAs<T>();
+      if re.search(r'\bPassAs<.*?>\(\)', line):
+        errors.append(output_api.PresubmitError(
+          '%s:%d uses PassAs<T>(). Use Pass() instead.' %
+          (f.LocalPath(), line_number)))
+  return errors
+
 def FindUnquotedQuote(contents, pos):
   match = re.search(r"(?<!\\)(?P<quote>\")", contents[pos:])
   return -1 if not match else match.start("quote") + pos
@@ -286,6 +320,7 @@
   results += CheckPassByValue(input_api, output_api)
   results += CheckChangeLintsClean(input_api, output_api)
   results += CheckTodos(input_api, output_api)
+  results += CheckScopedPtr(input_api, output_api)
   results += CheckNamespace(input_api, output_api)
   results += CheckForUseOfWrongClock(input_api, output_api)
   results += FindUselessIfdefs(input_api, output_api)