@@ -3,6 +3,7 @@ use if_chain::if_chain;
33use rustc:: lint:: in_external_macro;
44use rustc_lint:: { EarlyContext , EarlyLintPass } ;
55use rustc_session:: { declare_lint_pass, declare_tool_lint} ;
6+ use rustc_span:: source_map:: Span ;
67use syntax:: ast:: * ;
78
89declare_clippy_lint ! {
@@ -242,26 +243,31 @@ fn has_unary_equivalent(bin_op: BinOpKind) -> bool {
242243 bin_op == BinOpKind :: And || bin_op == BinOpKind :: Mul || bin_op == BinOpKind :: Sub
243244}
244245
246+ fn indentation ( cx : & EarlyContext < ' _ > , span : Span ) -> usize {
247+ cx. sess . source_map ( ) . lookup_char_pos ( span. lo ( ) ) . col . 0
248+ }
249+
245250/// Implementation of the `POSSIBLE_MISSING_COMMA` lint for array
246251fn check_array ( cx : & EarlyContext < ' _ > , expr : & Expr ) {
247252 if let ExprKind :: Array ( ref array) = expr. kind {
248253 for element in array {
249- if let ExprKind :: Binary ( ref op, ref lhs, _) = element. kind {
250- if has_unary_equivalent ( op. node ) && !differing_macro_contexts ( lhs. span , op. span ) {
251- let space_span = lhs. span . between ( op. span ) ;
252- if let Some ( space_snippet) = snippet_opt ( cx, space_span) {
253- let lint_span = lhs. span . with_lo ( lhs. span . hi ( ) ) ;
254- if space_snippet. contains ( '\n' ) {
255- span_note_and_lint (
256- cx,
257- POSSIBLE_MISSING_COMMA ,
258- lint_span,
259- "possibly missing a comma here" ,
260- lint_span,
261- "to remove this lint, add a comma or write the expr in a single line" ,
262- ) ;
263- }
264- }
254+ if_chain ! {
255+ if let ExprKind :: Binary ( ref op, ref lhs, _) = element. kind;
256+ if has_unary_equivalent( op. node) && !differing_macro_contexts( lhs. span, op. span) ;
257+ let space_span = lhs. span. between( op. span) ;
258+ if let Some ( space_snippet) = snippet_opt( cx, space_span) ;
259+ let lint_span = lhs. span. with_lo( lhs. span. hi( ) ) ;
260+ if space_snippet. contains( '\n' ) ;
261+ if indentation( cx, op. span) <= indentation( cx, lhs. span) ;
262+ then {
263+ span_note_and_lint(
264+ cx,
265+ POSSIBLE_MISSING_COMMA ,
266+ lint_span,
267+ "possibly missing a comma here" ,
268+ lint_span,
269+ "to remove this lint, add a comma or write the expr in a single line" ,
270+ ) ;
265271 }
266272 }
267273 }
0 commit comments