| Index: PRESUBMIT.py
|
| diff --git a/PRESUBMIT.py b/PRESUBMIT.py
|
| index d78629a6d802bea59f45596784536cb99aeb33a9..d4b30dd8dadfb9cb11083ffa814a02c558a97847 100644
|
| --- a/PRESUBMIT.py
|
| +++ b/PRESUBMIT.py
|
| @@ -1584,6 +1584,46 @@ def _CheckMojoUsesNewWrapperTypes(input_api, output_api):
|
| return []
|
|
|
|
|
| +def _CheckUselessForwardDeclarations(input_api, output_api):
|
| + """Checks that added or removed lines in affected header files
|
| + do not lead to new useless class or struct forward declaration.
|
| + """
|
| + results = []
|
| + class_pattern = input_api.re.compile(r'^class\s+(\w+);$',
|
| + input_api.re.MULTILINE)
|
| + struct_pattern = input_api.re.compile(r'^struct\s+(\w+);$',
|
| + input_api.re.MULTILINE)
|
| + for f in input_api.AffectedFiles(include_deletes=False):
|
| + if not f.LocalPath().endswith('.h'):
|
| + continue
|
| +
|
| + contents = input_api.ReadFile(f)
|
| + fwd_decls = input_api.re.findall(class_pattern, contents)
|
| + fwd_decls.extend(input_api.re.findall(struct_pattern, contents))
|
| +
|
| + useless_fwd_decls = []
|
| + for decl in fwd_decls:
|
| + count = sum(1 for _ in input_api.re.finditer(
|
| + r'\b%s\b' % input_api.re.escape(decl), contents))
|
| + if count == 1:
|
| + useless_fwd_decls.append(decl)
|
| +
|
| + if not useless_fwd_decls:
|
| + continue
|
| +
|
| + for line in f.GenerateScmDiff().splitlines():
|
| + if (line.startswith('-') and not line.startswith('--') or
|
| + line.startswith('+') and not line.startswith('++')):
|
| + for decl in useless_fwd_decls:
|
| + if input_api.re.search(r'\b%s\b' % decl, line[1:]):
|
| + results.append(output_api.PresubmitPromptWarning(
|
| + '%s: %s forward declaration is becoming useless' %
|
| + (f.LocalPath(), decl)))
|
| + useless_fwd_decls.remove(decl)
|
| +
|
| + return results
|
| +
|
| +
|
| def _CheckAndroidToastUsage(input_api, output_api):
|
| """Checks that code uses org.chromium.ui.widget.Toast instead of
|
| android.widget.Toast (Chromium Toast doesn't force hardware
|
| @@ -2033,6 +2073,7 @@ def _CommonChecks(input_api, output_api):
|
| results.extend(_CheckJavaStyle(input_api, output_api))
|
| results.extend(_CheckIpcOwners(input_api, output_api))
|
| results.extend(_CheckMojoUsesNewWrapperTypes(input_api, output_api))
|
| + results.extend(_CheckUselessForwardDeclarations(input_api, output_api))
|
|
|
| if any('PRESUBMIT.py' == f.LocalPath() for f in input_api.AffectedFiles()):
|
| results.extend(input_api.canned_checks.RunUnitTestsInDirectory(
|
|
|