mirror of
				https://gitea.invidious.io/iv-org/shard-ameba.git
				synced 2024-08-15 00:53:29 +00:00 
			
		
		
		
	Few refactors
This commit is contained in:
		
							parent
							
								
									6d0b12c70f
								
							
						
					
					
						commit
						e99a69765f
					
				
					 9 changed files with 73 additions and 57 deletions
				
			
		|  | @ -57,13 +57,15 @@ module Ameba::AST | ||||||
|           end |           end | ||||||
|         end |         end | ||||||
|         CRYSTAL |         CRYSTAL | ||||||
|       scope = Scope.new nodes.def_nodes.first | 
 | ||||||
|       var_node = nodes.var_nodes.first |       var_node = nodes.var_nodes.first | ||||||
|       scope.add_variable var_node | 
 | ||||||
|  |       scope = Scope.new nodes.def_nodes.first | ||||||
|  |       scope.add_variable(var_node) | ||||||
|       scope.inner_scopes << Scope.new(nodes.block_nodes.first, scope) |       scope.inner_scopes << Scope.new(nodes.block_nodes.first, scope) | ||||||
| 
 | 
 | ||||||
|       variable = Variable.new(var_node, scope) |       variable = Variable.new(var_node, scope) | ||||||
|       variable.reference nodes.var_nodes.first, scope.inner_scopes.first |       variable.reference(nodes.var_nodes.first, scope.inner_scopes.first) | ||||||
| 
 | 
 | ||||||
|       scope.references?(variable).should be_true |       scope.references?(variable).should be_true | ||||||
|     end |     end | ||||||
|  | @ -77,13 +79,15 @@ module Ameba::AST | ||||||
|           end |           end | ||||||
|         end |         end | ||||||
|         CRYSTAL |         CRYSTAL | ||||||
|       scope = Scope.new nodes.def_nodes.first | 
 | ||||||
|       var_node = nodes.var_nodes.first |       var_node = nodes.var_nodes.first | ||||||
|       scope.add_variable var_node | 
 | ||||||
|  |       scope = Scope.new nodes.def_nodes.first | ||||||
|  |       scope.add_variable(var_node) | ||||||
|       scope.inner_scopes << Scope.new(nodes.block_nodes.first, scope) |       scope.inner_scopes << Scope.new(nodes.block_nodes.first, scope) | ||||||
| 
 | 
 | ||||||
|       variable = Variable.new(var_node, scope) |       variable = Variable.new(var_node, scope) | ||||||
|       variable.reference nodes.var_nodes.first, scope.inner_scopes.first |       variable.reference(nodes.var_nodes.first, scope.inner_scopes.first) | ||||||
| 
 | 
 | ||||||
|       scope.references?(variable, check_inner_scopes: false).should be_false |       scope.references?(variable, check_inner_scopes: false).should be_false | ||||||
|     end |     end | ||||||
|  | @ -98,9 +102,11 @@ module Ameba::AST | ||||||
|           end |           end | ||||||
|         end |         end | ||||||
|         CRYSTAL |         CRYSTAL | ||||||
|       scope = Scope.new nodes.def_nodes.first | 
 | ||||||
|       var_node = nodes.var_nodes.first |       var_node = nodes.var_nodes.first | ||||||
|       scope.add_variable var_node | 
 | ||||||
|  |       scope = Scope.new nodes.def_nodes.first | ||||||
|  |       scope.add_variable(var_node) | ||||||
|       scope.inner_scopes << Scope.new(nodes.block_nodes.first, scope) |       scope.inner_scopes << Scope.new(nodes.block_nodes.first, scope) | ||||||
| 
 | 
 | ||||||
|       variable = Variable.new(var_node, scope) |       variable = Variable.new(var_node, scope) | ||||||
|  | @ -120,7 +126,7 @@ module Ameba::AST | ||||||
|   describe "#find_variable" do |   describe "#find_variable" do | ||||||
|     it "returns the variable in the scope by name" do |     it "returns the variable in the scope by name" do | ||||||
|       scope = Scope.new as_node("foo = 1") |       scope = Scope.new as_node("foo = 1") | ||||||
|       scope.add_variable Crystal::Var.new "foo" |       scope.add_variable(Crystal::Var.new "foo") | ||||||
|       scope.find_variable("foo").should_not be_nil |       scope.find_variable("foo").should_not be_nil | ||||||
|     end |     end | ||||||
| 
 | 
 | ||||||
|  | @ -133,7 +139,7 @@ module Ameba::AST | ||||||
|   describe "#assign_variable" do |   describe "#assign_variable" do | ||||||
|     it "creates a new assignment" do |     it "creates a new assignment" do | ||||||
|       scope = Scope.new as_node("foo = 1") |       scope = Scope.new as_node("foo = 1") | ||||||
|       scope.add_variable Crystal::Var.new "foo" |       scope.add_variable(Crystal::Var.new "foo") | ||||||
|       scope.assign_variable("foo", Crystal::Var.new "foo") |       scope.assign_variable("foo", Crystal::Var.new "foo") | ||||||
|       var = scope.find_variable("foo").should_not be_nil |       var = scope.find_variable("foo").should_not be_nil | ||||||
|       var.assignments.size.should eq 1 |       var.assignments.size.should eq 1 | ||||||
|  | @ -141,7 +147,7 @@ module Ameba::AST | ||||||
| 
 | 
 | ||||||
|     it "does not create the assignment if variable is wrong" do |     it "does not create the assignment if variable is wrong" do | ||||||
|       scope = Scope.new as_node("foo = 1") |       scope = Scope.new as_node("foo = 1") | ||||||
|       scope.add_variable Crystal::Var.new "foo" |       scope.add_variable(Crystal::Var.new "foo") | ||||||
|       scope.assign_variable("bar", Crystal::Var.new "bar") |       scope.assign_variable("bar", Crystal::Var.new "bar") | ||||||
|       var = scope.find_variable("foo").should_not be_nil |       var = scope.find_variable("foo").should_not be_nil | ||||||
|       var.assignments.size.should eq 0 |       var.assignments.size.should eq 0 | ||||||
|  |  | ||||||
|  | @ -85,13 +85,16 @@ module Ameba::AST | ||||||
|             3.times { |i| a = a + i } |             3.times { |i| a = a + i } | ||||||
|           end |           end | ||||||
|           CRYSTAL |           CRYSTAL | ||||||
|         scope = Scope.new nodes.def_nodes.first | 
 | ||||||
|         var_node = nodes.var_nodes.first |         var_node = nodes.var_nodes.first | ||||||
|         scope.add_variable var_node | 
 | ||||||
|  |         scope = Scope.new(nodes.def_nodes.first) | ||||||
|  |         scope.add_variable(var_node) | ||||||
|         scope.inner_scopes << Scope.new(nodes.block_nodes.first, scope) |         scope.inner_scopes << Scope.new(nodes.block_nodes.first, scope) | ||||||
| 
 | 
 | ||||||
|         variable = Variable.new(var_node, scope) |         variable = Variable.new(var_node, scope) | ||||||
|         variable.reference nodes.var_nodes.last, scope.inner_scopes.last |         variable.reference(nodes.var_nodes.last, scope.inner_scopes.last) | ||||||
|  | 
 | ||||||
|         variable.captured_by_block?.should be_truthy |         variable.captured_by_block?.should be_truthy | ||||||
|       end |       end | ||||||
| 
 | 
 | ||||||
|  | @ -101,8 +104,10 @@ module Ameba::AST | ||||||
|             a = 1 |             a = 1 | ||||||
|           end |           end | ||||||
|           CRYSTAL |           CRYSTAL | ||||||
|         scope.add_variable Crystal::Var.new "a" | 
 | ||||||
|  |         scope.add_variable(Crystal::Var.new "a") | ||||||
|         variable = scope.variables.first |         variable = scope.variables.first | ||||||
|  | 
 | ||||||
|         variable.captured_by_block?.should be_falsey |         variable.captured_by_block?.should be_falsey | ||||||
|       end |       end | ||||||
|     end |     end | ||||||
|  |  | ||||||
|  | @ -85,7 +85,7 @@ module Ameba | ||||||
|       end |       end | ||||||
| 
 | 
 | ||||||
|       it "raises when custom config file doesn't exist" do |       it "raises when custom config file doesn't exist" do | ||||||
|         expect_raises(Exception, "Unable to load config file: Config file does not exist foo.yml") do |         expect_raises(Exception, "Unable to load config file: Config file does not exist") do | ||||||
|           Config.load "foo.yml" |           Config.load "foo.yml" | ||||||
|         end |         end | ||||||
|       end |       end | ||||||
|  |  | ||||||
|  | @ -10,6 +10,8 @@ module Ameba::Rule::Lint | ||||||
|         ["foo"] === [foo] |         ["foo"] === [foo] | ||||||
|         "foo" == foo |         "foo" == foo | ||||||
|         "foo" != foo |         "foo" != foo | ||||||
|  |         "foo" == FOO | ||||||
|  |         FOO == "foo" | ||||||
|         foo == "foo" |         foo == "foo" | ||||||
|         foo != "foo" |         foo != "foo" | ||||||
|         CRYSTAL |         CRYSTAL | ||||||
|  |  | ||||||
|  | @ -52,7 +52,7 @@ module Ameba::AST | ||||||
|     # |     # | ||||||
|     # ``` |     # ``` | ||||||
|     # variable = Variable.new(node, scope) |     # variable = Variable.new(node, scope) | ||||||
|     # variable.reference(var_node) |     # variable.reference(var_node, some_scope) | ||||||
|     # variable.referenced? # => true |     # variable.referenced? # => true | ||||||
|     # ``` |     # ``` | ||||||
|     def referenced? |     def referenced? | ||||||
|  | @ -206,9 +206,9 @@ module Ameba::AST | ||||||
|       return if references.size > assignments.size |       return if references.size > assignments.size | ||||||
|       return if assignments.any?(&.op_assign?) |       return if assignments.any?(&.op_assign?) | ||||||
| 
 | 
 | ||||||
|       @assign_before_reference = assignments.find { |ass| |       @assign_before_reference = assignments | ||||||
|         !ass.in_branch? |         .find(&.in_branch?.!) | ||||||
|       }.try &.node |         .try(&.node) | ||||||
|     end |     end | ||||||
|   end |   end | ||||||
| end | end | ||||||
|  |  | ||||||
|  | @ -153,7 +153,7 @@ module Ameba::AST | ||||||
| 
 | 
 | ||||||
|     # :nodoc: |     # :nodoc: | ||||||
|     def visit(node : Crystal::Var) |     def visit(node : Crystal::Var) | ||||||
|       variable = @current_scope.find_variable node.name |       variable = @current_scope.find_variable(node.name) | ||||||
| 
 | 
 | ||||||
|       case |       case | ||||||
|       when @current_scope.arg?(node) # node is an argument |       when @current_scope.arg?(node) # node is an argument | ||||||
|  | @ -161,7 +161,7 @@ module Ameba::AST | ||||||
|       when variable.nil? && @current_assign # node is a variable |       when variable.nil? && @current_assign # node is a variable | ||||||
|         @current_scope.add_variable(node) |         @current_scope.add_variable(node) | ||||||
|       when variable # node is a reference |       when variable # node is a reference | ||||||
|         reference = variable.reference node, @current_scope |         reference = variable.reference(node, @current_scope) | ||||||
|         if @current_assign.is_a?(Crystal::OpAssign) || !reference.target_of?(@current_assign) |         if @current_assign.is_a?(Crystal::OpAssign) || !reference.target_of?(@current_assign) | ||||||
|           variable.reference_assignments! |           variable.reference_assignments! | ||||||
|         end |         end | ||||||
|  |  | ||||||
|  | @ -97,9 +97,10 @@ class Ameba::Config | ||||||
|     @excluded = load_array_section(config, "Excluded") |     @excluded = load_array_section(config, "Excluded") | ||||||
|     @globs = load_array_section(config, "Globs", DEFAULT_GLOBS) |     @globs = load_array_section(config, "Globs", DEFAULT_GLOBS) | ||||||
| 
 | 
 | ||||||
|     return unless formatter_name = load_formatter_name(config) |     if formatter_name = load_formatter_name(config) | ||||||
|       self.formatter = formatter_name |       self.formatter = formatter_name | ||||||
|     end |     end | ||||||
|  |   end | ||||||
| 
 | 
 | ||||||
|   # Loads YAML configuration file by `path`. |   # Loads YAML configuration file by `path`. | ||||||
|   # |   # | ||||||
|  | @ -120,8 +121,8 @@ class Ameba::Config | ||||||
| 
 | 
 | ||||||
|   protected def self.read_config(path = nil) |   protected def self.read_config(path = nil) | ||||||
|     if path |     if path | ||||||
|       raise ArgumentError.new("Config file does not exist #{path}") unless File.exists?(path) |       return File.read(path) if File.exists?(path) | ||||||
|       return File.read(path) |       raise "Config file does not exist" | ||||||
|     end |     end | ||||||
|     each_config_path do |config_path| |     each_config_path do |config_path| | ||||||
|       return File.read(config_path) if File.exists?(config_path) |       return File.read(config_path) if File.exists?(config_path) | ||||||
|  |  | ||||||
|  | @ -26,16 +26,21 @@ module Ameba::Formatter | ||||||
|     end |     end | ||||||
| 
 | 
 | ||||||
|     private def generate_todo_config(issues) |     private def generate_todo_config(issues) | ||||||
|       file = File.new(@config_path, mode: "w") |       File.open(@config_path, mode: "w") do |file| | ||||||
|         file << header |         file << header | ||||||
|  | 
 | ||||||
|         rule_issues_map(issues).each do |rule, rule_issues| |         rule_issues_map(issues).each do |rule, rule_issues| | ||||||
|  |           rule_todo = rule_todo(rule, rule_issues) | ||||||
|  |           rule_todo = | ||||||
|  |             {rule_todo.name => rule_todo} | ||||||
|  |               .to_yaml.gsub("---", "") | ||||||
|  | 
 | ||||||
|           file << "\n# Problems found: #{rule_issues.size}" |           file << "\n# Problems found: #{rule_issues.size}" | ||||||
|           file << "\n# Run `ameba --only #{rule.name}` for details" |           file << "\n# Run `ameba --only #{rule.name}` for details" | ||||||
|         file << rule_todo(rule, rule_issues).gsub("---", "") |           file << rule_todo | ||||||
|         end |         end | ||||||
|         file |         file | ||||||
|     ensure |       end | ||||||
|       file.close if file |  | ||||||
|     end |     end | ||||||
| 
 | 
 | ||||||
|     private def rule_issues_map(issues) |     private def rule_issues_map(issues) | ||||||
|  | @ -60,11 +65,11 @@ module Ameba::Formatter | ||||||
|     end |     end | ||||||
| 
 | 
 | ||||||
|     private def rule_todo(rule, issues) |     private def rule_todo(rule, issues) | ||||||
|       rule.excluded = issues |       rule.dup.tap do |rule_todo| | ||||||
|  |         rule_todo.excluded = issues | ||||||
|           .compact_map(&.location.try &.filename.try &.to_s) |           .compact_map(&.location.try &.filename.try &.to_s) | ||||||
|           .uniq! |           .uniq! | ||||||
| 
 |       end | ||||||
|       {rule.name => rule}.to_yaml |  | ||||||
|     end |     end | ||||||
|   end |   end | ||||||
| end | end | ||||||
|  |  | ||||||
|  | @ -110,8 +110,8 @@ module Ameba::Rule::Style | ||||||
|       i |       i | ||||||
|     end |     end | ||||||
| 
 | 
 | ||||||
|     protected def args_to_s(io : IO, node : Crystal::Call, short_block = nil, skip_last_arg = false) |     protected def args_to_s(io : IO, node : Crystal::Call, short_block = nil, skip_last_arg = false) : Nil | ||||||
|       node.args.dup.tap do |args| |       args = node.args.dup | ||||||
|       args.pop? if skip_last_arg |       args.pop? if skip_last_arg | ||||||
|       args.join io, ", " |       args.join io, ", " | ||||||
| 
 | 
 | ||||||
|  | @ -128,7 +128,6 @@ module Ameba::Rule::Style | ||||||
|         io << short_block |         io << short_block | ||||||
|       end |       end | ||||||
|     end |     end | ||||||
|     end |  | ||||||
| 
 | 
 | ||||||
|     protected def node_to_s(source, node : Crystal::Call) |     protected def node_to_s(source, node : Crystal::Call) | ||||||
|       String.build do |str| |       String.build do |str| | ||||||
|  | @ -164,9 +163,7 @@ module Ameba::Rule::Style | ||||||
|       return unless block_end_location = block.body.end_location |       return unless block_end_location = block.body.end_location | ||||||
| 
 | 
 | ||||||
|       block_code = source_between(block_location, block_end_location, source.lines) |       block_code = source_between(block_location, block_end_location, source.lines) | ||||||
|       return unless block_code.try(&.starts_with?("&.")) |       block_code if block_code.try(&.starts_with?("&.")) | ||||||
| 
 |  | ||||||
|       block_code |  | ||||||
|     end |     end | ||||||
| 
 | 
 | ||||||
|     protected def call_code(source, call, body) |     protected def call_code(source, call, body) | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue