From 84f4abd64f2f6d1e5afae404d01a8abf36becc01 Mon Sep 17 00:00:00 2001 From: Pascal Rigaux Date: Tue, 1 Apr 2003 15:18:29 +0000 Subject: - warn !($var =~ /.../) - warn $a & 0xff == $b better written $a & (0xff == $b) - "not" should not be used, use "!" instead --- perl_checker.src/parser.mly | 10 +++++----- perl_checker.src/parser_helper.ml | 12 ++++++++++++ perl_checker.src/parser_helper.mli | 1 + perl_checker.src/types.mli | 1 + 4 files changed, 19 insertions(+), 5 deletions(-) (limited to 'perl_checker.src') diff --git a/perl_checker.src/parser.mly b/perl_checker.src/parser.mly index 5b78351..ecdc4da 100644 --- a/perl_checker.src/parser.mly +++ b/perl_checker.src/parser.mly @@ -205,9 +205,9 @@ term: | term GT term {let pri = P_cmp in call_op_(op_p pri ">" $2, $3, [prio_lo pri $1; prio_lo_after pri $3]) (sp_pos_range $1 $3)} | term EQ_OP term {let pri = P_eq in call_op_(op_p pri (fst $2) $2, $3, [prio_lo pri $1; prio_lo_after pri $3]) (sp_pos_range $1 $3)} | term POWER term {let pri = P_tight in call_op_(op pri "**" $2, $3, [prio_lo pri $1; prio_lo_after pri $3]) (sp_pos_range $1 $3)} -| term BIT_AND term {let pri = P_expr in call_op_(op_p pri "&" $2, $3, [prio_lo pri $1; prio_lo_after pri $3]) (sp_pos_range $1 $3)} -| term BIT_OR term {let pri = P_expr in call_op_(op pri "|" $2, $3, [prio_lo pri $1; prio_lo_after pri $3]) (sp_pos_range $1 $3)} -| term BIT_XOR term {let pri = P_expr in call_op_(op_p pri "^" $2, $3, [prio_lo pri $1; prio_lo_after pri $3]) (sp_pos_range $1 $3)} +| term BIT_AND term {let pri = P_bit in call_op_(op_p pri "&" $2, $3, [prio_lo pri $1; prio_lo_after pri $3]) (sp_pos_range $1 $3)} +| term BIT_OR term {let pri = P_bit in call_op_(op pri "|" $2, $3, [prio_lo pri $1; prio_lo_after pri $3]) (sp_pos_range $1 $3)} +| term BIT_XOR term {let pri = P_bit in call_op_(op_p pri "^" $2, $3, [prio_lo pri $1; prio_lo_after pri $3]) (sp_pos_range $1 $3)} | term AND_TIGHT term {let pri = P_tight_and in call_op_(op_p pri "&&" $2, $3, [prio_lo pri $1; prio_lo_after pri $3]) (sp_pos_range $1 $3)} | term OR_TIGHT term {let pri = P_tight_or in call_op_(op_p pri "||" $2, $3, [prio_lo pri $1; prio_lo_after pri $3]) (sp_pos_range $1 $3)} | term MULT term {let pri = P_mul in call_op_(op pri (fst $2) $2, $3, [prio_lo_concat $1; prio_lo_after pri $3]) (sp_pos_range $1 $3)} @@ -253,13 +253,13 @@ term: to_Call_op_(P_tight, "- unary", [sndfst $2]) (sp_pos_range $1 $2) | _ -> die_rule "syntax error" } -| TIGHT_NOT term {to_Call_op_(P_tight, "not", [sndfst $2]) (sp_pos_range $1 $2)} +| TIGHT_NOT term {check_negatable_expr $2; to_Call_op_(P_tight, "not", [sndfst $2]) (sp_pos_range $1 $2)} | BIT_NEG term {to_Call_op_(P_expr, "~", [sndfst $2]) (sp_pos_range $1 $2)} | INCR term {sp_0($2); to_Call_op_(P_tight, "++", [sndfst $2]) (sp_pos_range $1 $2)} | DECR term {sp_0($2); to_Call_op_(P_tight, "--", [sndfst $2]) (sp_pos_range $1 $2)} | term INCR {sp_0($2); to_Call_op_(P_tight, "++ post", [sndfst $1]) (sp_pos_range $1 $2)} | term DECR {sp_0($2); to_Call_op_(P_tight, "-- post", [sndfst $1]) (sp_pos_range $1 $2)} -| NOT argexpr {to_Call_op_(P_and, "not", sndfst $2) (sp_pos_range $1 $2)} +| NOT argexpr {warn_rule "don't use \"not\", use \"!\" instead"; to_Call_op_(P_and, "not", sndfst $2) (sp_pos_range $1 $2)} | ONE_SCALAR_PARA RAW_STRING {call_one_scalar_para $1 [to_Raw_string $2], sp_pos_range $1 $2} | ONE_SCALAR_PARA STRING {call_one_scalar_para $1 [to_String true $2], sp_pos_range $1 $2} diff --git a/perl_checker.src/parser_helper.ml b/perl_checker.src/parser_helper.ml index 7665eee..1f2a1c3 100644 --- a/perl_checker.src/parser_helper.ml +++ b/perl_checker.src/parser_helper.ml @@ -69,6 +69,7 @@ let is_always_false = function | Num(n, _) -> float_of_string n = 0. | Raw_string(s, _) -> s = "" | String(l, _) -> l = [] + | List [] -> true | _ -> false let not_complex e = @@ -176,6 +177,9 @@ let rec prio_less = function | _, P_tight_and -> true | P_tight_and, _ -> false + | P_bit, P_bit -> true + | P_bit, _ -> false + | _, P_expr -> true | P_expr, _ -> false @@ -336,6 +340,14 @@ let check_scalar_subscripted (e, _) = | Deref(I_scalar, Deref _) -> warn_rule "for complex dereferencing, use \"->\"" | _ -> () +let check_negatable_expr ((_, e), _) = + match un_parenthesize_full e with + | Call_op("m//", var :: _, _) when not (is_var_dollar_ var) -> + warn_rule "!($var =~ /.../) is better written $var !~ /.../" + | Call_op("!m//", var :: _, _) when not (is_var_dollar_ var) -> + warn_rule "!($var !~ /.../) is better written $var =~ /.../" + | _ -> () + let check_ternary_paras(cond, a, b) = let rec dont_need_short_circuit_rec = function | Num _ diff --git a/perl_checker.src/parser_helper.mli b/perl_checker.src/parser_helper.mli index adb7a05..691efdc 100644 --- a/perl_checker.src/parser_helper.mli +++ b/perl_checker.src/parser_helper.mli @@ -72,6 +72,7 @@ val check_hash_subscript : val check_arrow_needed : ('a * Types.fromparser) * 'b -> 'c * ('d * (int * int)) -> unit val check_scalar_subscripted : Types.fromparser * 'a -> unit +val check_negatable_expr : ('a * Types.fromparser) * 'b -> unit val check_ternary_paras : Types.fromparser * Types.fromparser * Types.fromparser -> Types.fromparser list diff --git a/perl_checker.src/types.mli b/perl_checker.src/types.mli index 2aeb4b7..4c94d47 100644 --- a/perl_checker.src/types.mli +++ b/perl_checker.src/types.mli @@ -52,6 +52,7 @@ type priority = | P_cmp | P_eq | P_expr +| P_bit | P_tight_and | P_tight_or | P_ternary -- cgit v1.2.1