# encoding: utf-8moduleRuboCopmoduleCopmoduleStyle# This cop enforces the consistent usage of `%`-literal delimiters.classPercentLiteralDelimiters<CopincludePercentLiteraldefon_array(node)process(node,'%w','%W','%i')enddefon_regexp(node)process(node,'%r')enddefon_str(node)process(node,'%','%Q','%q')endalias_method:on_dstr,:on_strdefon_sym(node)process(node,'%s')enddefon_xstr(node)process(node,'%x')enddefmessage(node)type=type(node)delimiters=preferred_delimiters(type)"`#{type}`-literals should be delimited by "\"`#{delimiters[0]}` and `#{delimiters[1]}`"endprivatedefautocorrect(node)type=type(node)opening_delimiter,closing_delimiter=preferred_delimiters(type)first_child,*_middle,last_child=*nodeopening_newline=new_line(node.loc.begin,first_child)expression_indentation=leading_whitespace(first_child,:expression)closing_newline=new_line(node.loc.end,last_child)closing_indentation=leading_whitespace(node,:end)expression,reg_opt=*contents(node)corrected_source=type+opening_delimiter+opening_newline+expression_indentation+expression+closing_newline+closing_indentation+closing_delimiter+reg_opt@corrections<<lambdado|corrector|corrector.replace(node.loc.expression,corrected_source)endenddefon_percent_literal(node)type=type(node)returnifuses_preferred_delimiter?(node,type)||contains_preferred_delimiter?(node,type)add_offense(node,:expression)enddefpreferred_delimiters(type)cop_config['PreferredDelimiters'][type].split(//)enddefleading_whitespace(object,part)caseobjectwhenString''whenParser::AST::Nodepart_range=object.loc.send(part)left_of_part=part_range.source_line[0...part_range.column]/^(\s*)$/.match(left_of_part)?left_of_part:''elsefail"Unsupported object #{object}"endenddefcontents(node)first_child,*middle,last_child=*nodelast_child||=first_childifnode.type==:regexp*_,next_to_last_child=*middlenext_to_last_child||=first_child[source(node,first_child,next_to_last_child),last_child.loc.expression.source]else[iffirst_child.is_a?(Parser::AST::Node)source(node,first_child,last_child)elsefirst_child.to_send,'']endenddefsource(node,begin_node,end_node)Parser::Source::Range.new(node.loc.expression.source_buffer,begin_node.loc.expression.begin_pos,end_node.loc.expression.end_pos).sourceenddefuses_preferred_delimiter?(node,type)preferred_delimiters(type)[0]==begin_source(node)[-1]enddefcontains_preferred_delimiter?(node,type)preferred_delimiters=preferred_delimiters(type)node.children.map{|n|string_source(n)}.compact.any?{|s|preferred_delimiters.any?{|d|s.include?(d)}}enddefstring_source(node)ifnode.is_a?(String)nodeelsifnode.respond_to?(:type)&&node.type==:strnode.loc.expression.sourceendenddefnew_line(range,child_node)same_line?(range,child_node)?'':"\n"enddefsame_line?(range,child_node)!child_node.is_a?(Parser::AST::Node)||range.begin.line==child_node.loc.lineendendendendend