Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(65)

Unified Diff: PRESUBMIT.py

Issue 2532583002: Presubmit: Warn about useless forward declarations (Closed)
Patch Set: Changed version Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | PRESUBMIT_test.py » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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(
« no previous file with comments | « no previous file | PRESUBMIT_test.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698