# encoding: utf-8moduleRuboCopmoduleCopmoduleStyle# This cop looks for trivial reader/writer methods, that could# have been created with the attr_* family of functions automatically.classTrivialAccessors<CopincludeOnMethodDefMSG='Use `attr_%s` to define trivial %s methods.'privatedefon_method_def(node,method_name,args,body)kind=iftrivial_reader?(method_name,args,body)'reader'elsiftrivial_writer?(method_name,args,body)'writer'endreturnunlesskindadd_offense(node,:keyword,format(MSG,kind,kind))enddefexact_name_match?cop_config['ExactNameMatch']enddefallow_predicates?cop_config['AllowPredicates']enddefallow_dsl_writers?cop_config['AllowDSLWriters']enddefwhitelistwhitelist=cop_config['Whitelist']Array(whitelist).map(&:to_sym)+[:initialize]enddefpredicate?(method_name)method_name[-1]=='?'enddefdsl_writer?(method_name)!method_name.to_s.end_with?('=')enddeftrivial_reader?(method_name,args,body)looks_like_trivial_reader?(args,body)&&!allowed_method?(method_name,body)&&!allowed_reader?(method_name)enddeflooks_like_trivial_reader?(args,body)args.children.size==0&&body&&body.type==:ivarenddeftrivial_writer?(method_name,args,body)looks_like_trivial_writer?(args,body)&&!allowed_method?(method_name,body)&&!allowed_writer?(method_name)enddeflooks_like_trivial_writer?(args,body)args.children.size==1&&args.children[0].type!=:restarg&&body&&body.type==:ivasgn&&body.children[1]&&body.children[1].type==:lvarenddefallowed_method?(method_name,body)whitelist.include?(method_name)||exact_name_match?&&!names_match?(method_name,body)enddefallowed_writer?(method_name)allow_dsl_writers?&&dsl_writer?(method_name)enddefallowed_reader?(method_name)allow_predicates?&&predicate?(method_name)enddefnames_match?(method_name,body)ivar_name,=*bodymethod_name.to_s.chomp('=')==ivar_name[1..-1]enddeftrivial_accessor_kind(method_name,args,body)iftrivial_writer?(method_name,args,body)&&!dsl_writer?(method_name)'writer'elsiftrivial_reader?(method_name,args,body)'reader'endenddefaccessor(kind,method_name)"attr_#{kind} :#{method_name.to_s.chomp('=')}"enddefautocorrect(node)ifnode.type==:defautocorrect_instance(node)elsifnode.type==:defs&&node.children.first.type==:selfautocorrect_class(node)endenddefautocorrect_instance(node)method_name,args,body=*nodereturnunlessnames_match?(method_name,body)returnunless(kind=trivial_accessor_kind(method_name,args,body))@corrections<<lambdado|corrector|corrector.replace(node.loc.expression,accessor(kind,method_name))endenddefautocorrect_class(node)_,method_name,args,body=*nodereturnunlessnames_match?(method_name,body)returnunless(kind=trivial_accessor_kind(method_name,args,body))@corrections<<lambdado|corrector|indent=' '*node.loc.columncorrector.replace(node.loc.expression,['class << self',"#{indent}#{accessor(kind,method_name)}","#{indent}end"].join("\n"))endendendendendend