# encoding: utf-8moduleRuboCopmoduleCopmoduleStyle# Checks the spacing inside and after block parameters pipes.## @example## # bad# {}.each { | x, y |puts x }## # good# {}.each { |x, y| puts x }classSpaceAroundBlockParameters<CopincludeConfigurableEnforcedStyledefon_block(node)_method,args,body=*nodeopening_pipe=args.loc.beginclosing_pipe=args.loc.endreturnunless!args.children.empty?&&opening_pipecheck_inside_pipes(args.children,opening_pipe,closing_pipe)ifbodycheck_space(closing_pipe.end_pos,body.loc.expression.begin_pos,closing_pipe,'after closing `|`')endcheck_each_arg(args)endprivatedefparameter_name'EnforcedStyleInsidePipes'enddefcheck_inside_pipes(args,opening_pipe,closing_pipe)ifstyle==:no_spacecheck_no_space_style_inside_pipes(args,opening_pipe,closing_pipe)elsifstyle==:spacecheck_space_style_inside_pipes(args,opening_pipe,closing_pipe)endenddefcheck_no_space_style_inside_pipes(args,opening_pipe,closing_pipe)first=args.first.loc.expressionlast=args.last.loc.expressioncheck_no_space(opening_pipe.end_pos,first.begin_pos,'Space before first')check_no_space(last_end_pos_inside_pipes(last.end_pos),closing_pipe.begin_pos,'Space after last')enddefcheck_space_style_inside_pipes(args,opening_pipe,closing_pipe)first=args.first.loc.expressionlast=args.last.loc.expressionlast_end_pos=last_end_pos_inside_pipes(last.end_pos)check_space(opening_pipe.end_pos,first.begin_pos,first,'before first block parameter')check_space(last_end_pos,closing_pipe.begin_pos,last,'after last block parameter')check_no_space(opening_pipe.end_pos,first.begin_pos-1,'Extra space before first')check_no_space(last_end_pos+1,closing_pipe.begin_pos,'Extra space after last')enddeflast_end_pos_inside_pipes(pos)processed_source.buffer.source[pos]==','?pos+1:posenddefcheck_each_arg(args)args.children[1..-1].eachdo|arg|expr=arg.loc.expressioncheck_no_space(range_with_surrounding_space(expr,:left).begin_pos,expr.begin_pos-1,'Extra space before')endenddefcheck_space(space_begin_pos,space_end_pos,range,msg)returnifspace_begin_pos!=space_end_posadd_offense(range,range,"Space #{msg} missing.")enddefcheck_no_space(space_begin_pos,space_end_pos,msg)returnifspace_begin_pos>=space_end_posrange=Parser::Source::Range.new(processed_source.buffer,space_begin_pos,space_end_pos)add_offense(range,range,"#{msg} block parameter detected.")enddefautocorrect(range)lambdado|corrector|caserange.sourcewhen/^\s+$/thencorrector.remove(range)elsecorrector.insert_after(range,' ')endendendendendendend