summaryrefslogtreecommitdiffstats
path: root/perl_checker.src
diff options
context:
space:
mode:
authorPascal Rigaux <pixel@mandriva.com>2003-04-01 15:18:29 +0000
committerPascal Rigaux <pixel@mandriva.com>2003-04-01 15:18:29 +0000
commit84f4abd64f2f6d1e5afae404d01a8abf36becc01 (patch)
tree9b154b564dc183cf72506525432816ed0dd0400d /perl_checker.src
parent2ca280165adadc0eef3743c9eec4b7b5430d4271 (diff)
downloadperl_checker-84f4abd64f2f6d1e5afae404d01a8abf36becc01.tar
perl_checker-84f4abd64f2f6d1e5afae404d01a8abf36becc01.tar.gz
perl_checker-84f4abd64f2f6d1e5afae404d01a8abf36becc01.tar.bz2
perl_checker-84f4abd64f2f6d1e5afae404d01a8abf36becc01.tar.xz
perl_checker-84f4abd64f2f6d1e5afae404d01a8abf36becc01.zip
- warn !($var =~ /.../)
- warn $a & 0xff == $b better written $a & (0xff == $b) - "not" should not be used, use "!" instead
Diffstat (limited to 'perl_checker.src')
-rw-r--r--perl_checker.src/parser.mly10
-rw-r--r--perl_checker.src/parser_helper.ml12
-rw-r--r--perl_checker.src/parser_helper.mli1
-rw-r--r--perl_checker.src/types.mli1
4 files changed, 19 insertions, 5 deletions
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