@@ 3051-3125 (lines=75) @@ | ||
3048 | 'Zero-parameter constructors should not be marked explicit.') |
|
3049 | ||
3050 | ||
3051 | def CheckSpacingForFunctionCall(filename, clean_lines, linenum, error): |
|
3052 | """Checks for the correctness of various spacing around function calls. |
|
3053 | ||
3054 | Args: |
|
3055 | filename: The name of the current file. |
|
3056 | clean_lines: A CleansedLines instance containing the file. |
|
3057 | linenum: The number of the line to check. |
|
3058 | error: The function to call with any errors found. |
|
3059 | """ |
|
3060 | line = clean_lines.elided[linenum] |
|
3061 | ||
3062 | # Since function calls often occur inside if/for/while/switch |
|
3063 | # expressions - which have their own, more liberal conventions - we |
|
3064 | # first see if we should be looking inside such an expression for a |
|
3065 | # function call, to which we can apply more strict standards. |
|
3066 | fncall = line # if there's no control flow construct, look at whole line |
|
3067 | for pattern in (r'\bif\s*\((.*)\)\s*{', |
|
3068 | r'\bfor\s*\((.*)\)\s*{', |
|
3069 | r'\bwhile\s*\((.*)\)\s*[{;]', |
|
3070 | r'\bswitch\s*\((.*)\)\s*{'): |
|
3071 | match = Search(pattern, line) |
|
3072 | if match: |
|
3073 | fncall = match.group(1) # look inside the parens for function calls |
|
3074 | break |
|
3075 | ||
3076 | # Except in if/for/while/switch, there should never be space |
|
3077 | # immediately inside parens (eg "f( 3, 4 )"). We make an exception |
|
3078 | # for nested parens ( (a+b) + c ). Likewise, there should never be |
|
3079 | # a space before a ( when it's a function argument. I assume it's a |
|
3080 | # function argument when the char before the whitespace is legal in |
|
3081 | # a function name (alnum + _) and we're not starting a macro. Also ignore |
|
3082 | # pointers and references to arrays and functions coz they're too tricky: |
|
3083 | # we use a very simple way to recognize these: |
|
3084 | # " (something)(maybe-something)" or |
|
3085 | # " (something)(maybe-something," or |
|
3086 | # " (something)[something]" |
|
3087 | # Note that we assume the contents of [] to be short enough that |
|
3088 | # they'll never need to wrap. |
|
3089 | if ( # Ignore control structures. |
|
3090 | not Search(r'\b(if|for|while|switch|return|new|delete|catch|sizeof)\b', |
|
3091 | fncall) and |
|
3092 | # Ignore pointers/references to functions. |
|
3093 | not Search(r' \([^)]+\)\([^)]*(\)|,$)', fncall) and |
|
3094 | # Ignore pointers/references to arrays. |
|
3095 | not Search(r' \([^)]+\)\[[^\]]+\]', fncall)): |
|
3096 | if Search(r'\w\s*\(\s(?!\s*\\$)', fncall): # a ( used for a fn call |
|
3097 | error(filename, linenum, 'whitespace/parens', 4, |
|
3098 | 'Extra space after ( in function call') |
|
3099 | elif Search(r'\(\s+(?!(\s*\\)|\()', fncall): |
|
3100 | error(filename, linenum, 'whitespace/parens', 2, |
|
3101 | 'Extra space after (') |
|
3102 | if (Search(r'\w\s+\(', fncall) and |
|
3103 | not Search(r'_{0,2}asm_{0,2}\s+_{0,2}volatile_{0,2}\s+\(', fncall) and |
|
3104 | not Search(r'#\s*define|typedef|using\s+\w+\s*=', fncall) and |
|
3105 | not Search(r'\w\s+\((\w+::)*\*\w+\)\(', fncall) and |
|
3106 | not Search(r'\bcase\s+\(', fncall)): |
|
3107 | # TODO(unknown): Space after an operator function seem to be a common |
|
3108 | # error, silence those for now by restricting them to highest verbosity. |
|
3109 | if Search(r'\boperator_*\b', line): |
|
3110 | error(filename, linenum, 'whitespace/parens', 0, |
|
3111 | 'Extra space before ( in function call') |
|
3112 | else: |
|
3113 | error(filename, linenum, 'whitespace/parens', 4, |
|
3114 | 'Extra space before ( in function call') |
|
3115 | # If the ) is followed only by a newline or a { + newline, assume it's |
|
3116 | # part of a control statement (if/while/etc), and don't complain |
|
3117 | if Search(r'[^)]\s+\)\s*[^{\s]', fncall): |
|
3118 | # If the closing parenthesis is preceded by only whitespaces, |
|
3119 | # try to give a more descriptive error message. |
|
3120 | if Search(r'^\s+\)', fncall): |
|
3121 | error(filename, linenum, 'whitespace/parens', 2, |
|
3122 | 'Closing ) should be moved to the previous line') |
|
3123 | else: |
|
3124 | error(filename, linenum, 'whitespace/parens', 2, |
|
3125 | 'Extra space before )') |
|
3126 | ||
3127 | ||
3128 | def IsBlankLine(line): |
@@ 3051-3125 (lines=75) @@ | ||
3048 | 'Zero-parameter constructors should not be marked explicit.') |
|
3049 | ||
3050 | ||
3051 | def CheckSpacingForFunctionCall(filename, clean_lines, linenum, error): |
|
3052 | """Checks for the correctness of various spacing around function calls. |
|
3053 | ||
3054 | Args: |
|
3055 | filename: The name of the current file. |
|
3056 | clean_lines: A CleansedLines instance containing the file. |
|
3057 | linenum: The number of the line to check. |
|
3058 | error: The function to call with any errors found. |
|
3059 | """ |
|
3060 | line = clean_lines.elided[linenum] |
|
3061 | ||
3062 | # Since function calls often occur inside if/for/while/switch |
|
3063 | # expressions - which have their own, more liberal conventions - we |
|
3064 | # first see if we should be looking inside such an expression for a |
|
3065 | # function call, to which we can apply more strict standards. |
|
3066 | fncall = line # if there's no control flow construct, look at whole line |
|
3067 | for pattern in (r'\bif\s*\((.*)\)\s*{', |
|
3068 | r'\bfor\s*\((.*)\)\s*{', |
|
3069 | r'\bwhile\s*\((.*)\)\s*[{;]', |
|
3070 | r'\bswitch\s*\((.*)\)\s*{'): |
|
3071 | match = Search(pattern, line) |
|
3072 | if match: |
|
3073 | fncall = match.group(1) # look inside the parens for function calls |
|
3074 | break |
|
3075 | ||
3076 | # Except in if/for/while/switch, there should never be space |
|
3077 | # immediately inside parens (eg "f( 3, 4 )"). We make an exception |
|
3078 | # for nested parens ( (a+b) + c ). Likewise, there should never be |
|
3079 | # a space before a ( when it's a function argument. I assume it's a |
|
3080 | # function argument when the char before the whitespace is legal in |
|
3081 | # a function name (alnum + _) and we're not starting a macro. Also ignore |
|
3082 | # pointers and references to arrays and functions coz they're too tricky: |
|
3083 | # we use a very simple way to recognize these: |
|
3084 | # " (something)(maybe-something)" or |
|
3085 | # " (something)(maybe-something," or |
|
3086 | # " (something)[something]" |
|
3087 | # Note that we assume the contents of [] to be short enough that |
|
3088 | # they'll never need to wrap. |
|
3089 | if ( # Ignore control structures. |
|
3090 | not Search(r'\b(if|for|while|switch|return|new|delete|catch|sizeof)\b', |
|
3091 | fncall) and |
|
3092 | # Ignore pointers/references to functions. |
|
3093 | not Search(r' \([^)]+\)\([^)]*(\)|,$)', fncall) and |
|
3094 | # Ignore pointers/references to arrays. |
|
3095 | not Search(r' \([^)]+\)\[[^\]]+\]', fncall)): |
|
3096 | if Search(r'\w\s*\(\s(?!\s*\\$)', fncall): # a ( used for a fn call |
|
3097 | error(filename, linenum, 'whitespace/parens', 4, |
|
3098 | 'Extra space after ( in function call') |
|
3099 | elif Search(r'\(\s+(?!(\s*\\)|\()', fncall): |
|
3100 | error(filename, linenum, 'whitespace/parens', 2, |
|
3101 | 'Extra space after (') |
|
3102 | if (Search(r'\w\s+\(', fncall) and |
|
3103 | not Search(r'_{0,2}asm_{0,2}\s+_{0,2}volatile_{0,2}\s+\(', fncall) and |
|
3104 | not Search(r'#\s*define|typedef|using\s+\w+\s*=', fncall) and |
|
3105 | not Search(r'\w\s+\((\w+::)*\*\w+\)\(', fncall) and |
|
3106 | not Search(r'\bcase\s+\(', fncall)): |
|
3107 | # TODO(unknown): Space after an operator function seem to be a common |
|
3108 | # error, silence those for now by restricting them to highest verbosity. |
|
3109 | if Search(r'\boperator_*\b', line): |
|
3110 | error(filename, linenum, 'whitespace/parens', 0, |
|
3111 | 'Extra space before ( in function call') |
|
3112 | else: |
|
3113 | error(filename, linenum, 'whitespace/parens', 4, |
|
3114 | 'Extra space before ( in function call') |
|
3115 | # If the ) is followed only by a newline or a { + newline, assume it's |
|
3116 | # part of a control statement (if/while/etc), and don't complain |
|
3117 | if Search(r'[^)]\s+\)\s*[^{\s]', fncall): |
|
3118 | # If the closing parenthesis is preceded by only whitespaces, |
|
3119 | # try to give a more descriptive error message. |
|
3120 | if Search(r'^\s+\)', fncall): |
|
3121 | error(filename, linenum, 'whitespace/parens', 2, |
|
3122 | 'Closing ) should be moved to the previous line') |
|
3123 | else: |
|
3124 | error(filename, linenum, 'whitespace/parens', 2, |
|
3125 | 'Extra space before )') |
|
3126 | ||
3127 | ||
3128 | def IsBlankLine(line): |