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

Unified Diff: Tools/Scripts/webkitpy/style/checkers/cpp.py

Issue 23654034: Add code style check error for using static_cast instead of toFoo function. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Created 7 years, 3 months 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 | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Tools/Scripts/webkitpy/style/checkers/cpp.py
diff --git a/Tools/Scripts/webkitpy/style/checkers/cpp.py b/Tools/Scripts/webkitpy/style/checkers/cpp.py
index e1543ce6de265494883bd35190b7eeee93161228..80c4e3490988845a141eaa46264287228a9da08d 100644
--- a/Tools/Scripts/webkitpy/style/checkers/cpp.py
+++ b/Tools/Scripts/webkitpy/style/checkers/cpp.py
@@ -3284,11 +3284,9 @@ def check_language(filename, clean_lines, line_number, file_extension, include_s
error(line_number, 'runtime/unsigned', 1,
'Omit int when using unsigned')
- # Check that we're not using static_cast<Text*>.
- if search(r'\bstatic_cast<Text\*>', line):
- error(line_number, 'readability/check', 4,
- 'Consider using toText helper function in WebCore/dom/Text.h '
- 'instead of static_cast<Text*>')
+ # Check whether using static_cast<Classname*>. If yes, suggest to use toClassname().
+ check_for_object_static_cast(line_number, line, error)
+
def check_identifier_name_in_declaration(filename, line_number, line, file_state, error):
"""Checks if identifier names contain any underscores.
@@ -3421,6 +3419,77 @@ def check_identifier_name_in_declaration(filename, line_number, line, file_state
number_of_identifiers += 1
line = line[matched.end():]
+
+def check_for_toFoo_definition(filename, pattern, error):
+ """ Reports for using static_cast instead of toFoo convenience function.
+
+ This function will output warnings to make sure you are actually using
+ the added toFoo conversion functions rather than directly hard coding
+ the static_cast<Classname*> call. For example, you should toHTMLELement(Node*)
+ to convert Node* to HTMLElement*, instead of static_cast<HTMLElement*>(Node*)
+
+ Args:
+ filename: The name of the file.
+ pattern: The conversion function pattern to grep for.
+ error: The function to call with any errors found.
+ """
+
+ def get_abs_filepath(filename, subdirectory=None):
+ if subdirectory:
+ start_dir = subdirectory
+ else:
+ start_dir = os.path.dirname(os.path.abspath(filename))
+
+ for root, dirs, names in os.walk(start_dir):
+ if filename in names:
+ return os.path.join(root, filename)
+ return filename
+
+ def grep(filename, pattern):
+ # List of all geninuine alternatives to static_cast.
Dirk Pranke 2013/09/17 01:54:55 Nit: typo, "genuine".
r.kasibhatla 2013/09/18 09:12:41 Done.
+ matches = []
+ for n, line in enumerate(open(filename)):
+ if pattern in line:
+ # We should exclude the match for dummy conversion function.
+ # The dummy conversion function is to catch invalid conversions
+ # and shouldn't be part of listing possible alternatives.
+ #r = re.compile(r'%s(\s+)%s(\(\w+)%s(\*+\))' % ("void", pattern, object_class))
Dirk Pranke 2013/09/17 01:54:55 Delete this commented-out line?
r.kasibhatla 2013/09/18 09:12:41 Done.
+ result = re.search(r'%s(\s+)%s' % ("void", pattern), line)
+ if not result:
+ matches.append([line, n])
+ return matches
+
+ matches = grep(get_abs_filepath(filename), pattern)
+ if matches:
+ return True
+
+ return False
+
+
+def check_for_object_static_cast(line_number, line, error):
+ """Checks for a C-style cast by looking for the pattern.
+ Args:
+ line_number: The number of the line to check.
+ line: The line of code to check.
+ raw_line: The raw line of code to check, with comments.
+ error: The function to call with any errors found.
+ """
+ matched = search(r'\bstatic_cast<(\w+\s?\*+\s?)>', line)
inferno 2013/09/16 16:56:46 I think you should cover other variants like stati
r.kasibhatla 2013/09/18 09:12:41 I was looking at including static_pointer_cast in
+ if not matched:
+ return
+
+ # We have atleast one hit for static_cast<Classname> pattern.
+ class_object = matched.group(1)
+ class_name = re.sub('[\*]', '', class_object)
+ header = ''.join((class_name, '.h'))
+ is_func_defined = check_for_toFoo_definition(header, ''.join(('to', class_name)), error)
+
+ if is_func_defined:
inferno 2013/09/16 16:56:46 We are showing the error only if toFoo* function i
r.kasibhatla 2013/09/18 09:12:41 Done.
+ error(line_number, 'readability/check', 4,
+ 'Consider using to%s helper function in %s instead of static_cast<%s>' %
inferno 2013/09/16 16:56:46 change "Consider using" to a more stronger message
r.kasibhatla 2013/09/18 09:12:41 Done.
+ (class_name, header, class_object))
+
+
def check_c_style_cast(line_number, line, raw_line, cast_type, pattern,
error):
"""Checks for a C-style cast by looking for the pattern.
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698