Fix unique_ptr<>() PRESUBMIT.
Three directories had a PRESUBMIT designed to catch "std::unique_ptr<T>()" and
require nullptr instead. In two directories, the match was overbroad, catching
things like "std::vector<std::unique_ptr<T>>()". In ui/, ricea attempted a fix
(in https://codereview.chromium.org/2311783002 ) that made the regex too
conservative, failing to catch std::unique_ptr<Foo<T>>().
Instead, fail to match std::unique_ptr<T>() if it's immediately preceded by '<'.
This moves the check to the global PRESUBMIT to avoid duplication.
BUG=none
TEST=none
TBR=sky
Cq-Include-Trybots: master.tryserver.blink:linux_trusty_blink_rel;master.tryserver.chromium.android:android_optional_gpu_tests_rel
Change-Id: Ia8888408683b2de3bbe60e0e43409d72475ea169
Reviewed-on: https://chromium-review.googlesource.com/933547
Reviewed-by: Peter Kasting <[email protected]>
Reviewed-by: Daniel Cheng <[email protected]>
Commit-Queue: Peter Kasting <[email protected]>
Cr-Commit-Position: refs/heads/master@{#538723}
diff --git a/PRESUBMIT.py b/PRESUBMIT.py
index 927ec2b..48493fc 100644
--- a/PRESUBMIT.py
+++ b/PRESUBMIT.py
@@ -1400,6 +1400,40 @@
return []
+def _CheckUniquePtr(input_api, output_api):
+ file_inclusion_pattern = r'.+%s' % _IMPLEMENTATION_EXTENSIONS
+ sources = lambda affected_file: input_api.FilterSourceFile(
+ affected_file,
+ black_list=(_EXCLUDED_PATHS + _TEST_CODE_EXCLUDED_PATHS +
+ input_api.DEFAULT_BLACK_LIST),
+ white_list=(file_inclusion_pattern,))
+ return_construct_pattern = input_api.re.compile(
+ r'(=|\breturn)\s*std::unique_ptr<.*?(?<!])>\([^)]+\)')
+ null_construct_pattern = input_api.re.compile(
+ r'\b(?<!<)std::unique_ptr<.*?>\(\)')
+ errors = []
+ for f in input_api.AffectedSourceFiles(sources):
+ for line_number, line in f.ChangedContents():
+ # Disallow:
+ # return std::unique_ptr<T>(foo);
+ # bar = std::unique_ptr<T>(foo);
+ # But allow:
+ # return std::unique_ptr<T[]>(foo);
+ # bar = std::unique_ptr<T[]>(foo);
+ if return_construct_pattern.search(line):
+ errors.append(output_api.PresubmitError(
+ ('%s:%d uses explicit std::unique_ptr constructor. ' +
+ 'Use std::make_unique<T>() instead.') %
+ (f.LocalPath(), line_number)))
+ # Disallow:
+ # std::unique_ptr<T>()
+ if null_construct_pattern.search(line):
+ errors.append(output_api.PresubmitError(
+ '%s:%d uses std::unique_ptr<T>(). Use nullptr instead.' %
+ (f.LocalPath(), line_number)))
+ return errors
+
+
def _CheckUserActionUpdate(input_api, output_api):
"""Checks if any new user action has been added."""
if any('actions.xml' == input_api.os_path.basename(f) for f in
@@ -2531,6 +2565,7 @@
source_file_filter=lambda x: x.LocalPath().endswith('.grd')))
results.extend(_CheckSpamLogging(input_api, output_api))
results.extend(_CheckForAnonymousVariables(input_api, output_api))
+ results.extend(_CheckUniquePtr(input_api, output_api))
results.extend(_CheckUserActionUpdate(input_api, output_api))
results.extend(_CheckNoDeprecatedCss(input_api, output_api))
results.extend(_CheckNoDeprecatedJs(input_api, output_api))
diff --git a/cc/PRESUBMIT.py b/cc/PRESUBMIT.py
index d160eac..26909c0b 100644
--- a/cc/PRESUBMIT.py
+++ b/cc/PRESUBMIT.py
@@ -144,34 +144,6 @@
return [output_api.PresubmitError('Use >> instead of > >:', items=errors)]
return []
-def CheckUniquePtr(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 std::unique_ptr<T>(foo);
- # bar = std::unique_ptr<T>(foo);
- # But allow:
- # return std::unique_ptr<T[]>(foo);
- # bar = std::unique_ptr<T[]>(foo);
- if re.search(r'(=|\breturn)\s*std::unique_ptr<.*?(?<!])>\([^)]+\)', line):
- errors.append(output_api.PresubmitError(
- ('%s:%d uses explicit std::unique_ptr constructor. ' +
- 'Use std::make_unique<T>() instead.') %
- (f.LocalPath(), line_number)))
- # Disallow:
- # std::unique_ptr<T>()
- if re.search(r'\bstd::unique_ptr<.*?>\(\)', line):
- errors.append(output_api.PresubmitError(
- '%s:%d uses std::unique_ptr<T>(). Use nullptr 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
@@ -330,7 +302,6 @@
results += CheckChangeLintsClean(input_api, output_api)
results += CheckTodos(input_api, output_api)
results += CheckDoubleAngles(input_api, output_api)
- results += CheckUniquePtr(input_api, output_api)
results += CheckNamespace(input_api, output_api)
results += CheckForUseOfWrongClock(input_api, output_api)
results += FindUselessIfdefs(input_api, output_api)
diff --git a/components/viz/presubmit_checks.py b/components/viz/presubmit_checks.py
index ec43826f..e73bdfc 100644
--- a/components/viz/presubmit_checks.py
+++ b/components/viz/presubmit_checks.py
@@ -138,34 +138,6 @@
return [output_api.PresubmitError('Use >> instead of > >:', items=errors)]
return []
-def CheckUniquePtr(input_api, output_api,
- white_list, 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 std::unique_ptr<T>(foo);
- # bar = std::unique_ptr<T>(foo);
- # But allow:
- # return std::unique_ptr<T[]>(foo);
- # bar = std::unique_ptr<T[]>(foo);
- if re.search(r'(=|\breturn)\s*std::unique_ptr<.*?(?<!])>\([^)]+\)', line):
- errors.append(output_api.PresubmitError(
- ('%s:%d uses explicit std::unique_ptr constructor. ' +
- 'Use std::make_unique<T>() instead.') %
- (f.LocalPath(), line_number)))
- # Disallow:
- # std::unique_ptr<T>()
- if re.search(r'\bstd::unique_ptr<.*?>\(\)', line):
- errors.append(output_api.PresubmitError(
- '%s:%d uses std::unique_ptr<T>(). Use nullptr 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
@@ -331,7 +303,6 @@
results += CheckChangeLintsClean(input_api, output_api, white_list)
results += CheckTodos(input_api, output_api)
results += CheckDoubleAngles(input_api, output_api, white_list)
- results += CheckUniquePtr(input_api, output_api, white_list)
results += CheckNamespace(input_api, output_api)
results += CheckMojoms(input_api, output_api)
results += CheckForUseOfWrongClock(input_api, output_api, white_list)
diff --git a/ui/PRESUBMIT.py b/ui/PRESUBMIT.py
index 7c0c787..810c0919 100644
--- a/ui/PRESUBMIT.py
+++ b/ui/PRESUBMIT.py
@@ -8,39 +8,6 @@
for more details about the presubmit API built into depot_tools.
"""
-INCLUDE_CPP_FILES_ONLY = (
- r'.*\.(cc|h|mm)$',
-)
-
-def CheckUniquePtr(input_api, output_api,
- white_list=INCLUDE_CPP_FILES_ONLY, 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 std::unique_ptr<T>(foo);
- # bar = std::unique_ptr<T>(foo);
- # But allow:
- # return std::unique_ptr<T[]>(foo);
- # bar = std::unique_ptr<T[]>(foo);
- if input_api.re.search(
- r'(=|\breturn)\s*std::unique_ptr<[^\[\]>]+>\([^)]+\)', line):
- errors.append(output_api.PresubmitError(
- ('%s:%d uses explicit std::unique_ptr constructor. ' +
- 'Use std::make_unique<T>() or base::WrapUnique() instead.') %
- (f.LocalPath(), line_number)))
- # Disallow:
- # std::unique_ptr<T>()
- if input_api.re.search(r'\bstd::unique_ptr<[^<>]+>\(\)', line):
- errors.append(output_api.PresubmitError(
- '%s:%d uses std::unique_ptr<T>(). Use nullptr instead.' %
- (f.LocalPath(), line_number)))
- return errors
-
def CheckX11HeaderUsage(input_api, output_api):
"""X11 headers pollute the global namespace with macros for common
names so instead code should include "ui/gfx/x/x11.h" which hide the
@@ -68,7 +35,6 @@
def CheckChange(input_api, output_api):
results = []
- results += CheckUniquePtr(input_api, output_api)
results += CheckX11HeaderUsage(input_api, output_api)
return results