mirror of
				https://gitea.invidious.io/iv-org/shard-ameba.git
				synced 2024-08-15 00:53:29 +00:00 
			
		
		
		
	Track issue.end_location properly
This commit is contained in:
		
							parent
							
								
									ad2c6bad0e
								
							
						
					
					
						commit
						9885457227
					
				
					 45 changed files with 90 additions and 20 deletions
				
			
		| 
						 | 
					@ -323,7 +323,7 @@ module Ameba::AST
 | 
				
			||||||
        branch.to_s.should eq branch.node.to_s
 | 
					        branch.to_s.should eq branch.node.to_s
 | 
				
			||||||
      end
 | 
					      end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      it "delegates location to node" do
 | 
					      it "delegates locations to node" do
 | 
				
			||||||
        nodes = as_nodes %(
 | 
					        nodes = as_nodes %(
 | 
				
			||||||
          if true
 | 
					          if true
 | 
				
			||||||
            a = 2
 | 
					            a = 2
 | 
				
			||||||
| 
						 | 
					@ -332,6 +332,7 @@ module Ameba::AST
 | 
				
			||||||
        branchable = Branchable.new nodes.if_nodes.first
 | 
					        branchable = Branchable.new nodes.if_nodes.first
 | 
				
			||||||
        branch = Branch.new nodes.assign_nodes.first, branchable
 | 
					        branch = Branch.new nodes.assign_nodes.first, branchable
 | 
				
			||||||
        branch.location.should eq branch.node.location
 | 
					        branch.location.should eq branch.node.location
 | 
				
			||||||
 | 
					        branch.end_location.should eq branch.node.end_location
 | 
				
			||||||
      end
 | 
					      end
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -16,10 +16,11 @@ module Ameba::AST
 | 
				
			||||||
        branchable.to_s.should eq node.to_s
 | 
					        branchable.to_s.should eq node.to_s
 | 
				
			||||||
      end
 | 
					      end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      it "delegates location to @node" do
 | 
					      it "delegates locations to @node" do
 | 
				
			||||||
        node = as_node %(a = 2 if true)
 | 
					        node = as_node %(a = 2 if true)
 | 
				
			||||||
        branchable = Branchable.new node
 | 
					        branchable = Branchable.new node
 | 
				
			||||||
        branchable.location.should eq node.location
 | 
					        branchable.location.should eq node.location
 | 
				
			||||||
 | 
					        branchable.end_location.should eq node.end_location
 | 
				
			||||||
      end
 | 
					      end
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -17,10 +17,11 @@ module Ameba::AST
 | 
				
			||||||
          flow_expression.to_s.should eq node.to_s
 | 
					          flow_expression.to_s.should eq node.to_s
 | 
				
			||||||
        end
 | 
					        end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        it "delegates location to @node" do
 | 
					        it "delegates locations to @node" do
 | 
				
			||||||
          node = as_node %(break if true)
 | 
					          node = as_node %(break if true)
 | 
				
			||||||
          flow_expression = FlowExpression.new node, false
 | 
					          flow_expression = FlowExpression.new node, false
 | 
				
			||||||
          flow_expression.location.should eq node.location
 | 
					          flow_expression.location.should eq node.location
 | 
				
			||||||
 | 
					          flow_expression.end_location.should eq node.end_location
 | 
				
			||||||
        end
 | 
					        end
 | 
				
			||||||
      end
 | 
					      end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -18,6 +18,21 @@ module Ameba::AST
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  describe "delegation" do
 | 
				
			||||||
 | 
					    it "delegates to_s to node" do
 | 
				
			||||||
 | 
					      node = as_node("def foo; end")
 | 
				
			||||||
 | 
					      scope = Scope.new node
 | 
				
			||||||
 | 
					      scope.to_s.should eq node.to_s
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    it "delegates locations to node" do
 | 
				
			||||||
 | 
					      node = as_node("def foo; end")
 | 
				
			||||||
 | 
					      scope = Scope.new node
 | 
				
			||||||
 | 
					      scope.location.should eq node.location
 | 
				
			||||||
 | 
					      scope.end_location.should eq node.end_location
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  describe "#add_variable" do
 | 
					  describe "#add_variable" do
 | 
				
			||||||
    it "adds a new variable to the scope" do
 | 
					    it "adds a new variable to the scope" do
 | 
				
			||||||
      scope = Scope.new as_node("")
 | 
					      scope = Scope.new as_node("")
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -14,9 +14,10 @@ module Ameba::AST
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    describe "delegation" do
 | 
					    describe "delegation" do
 | 
				
			||||||
      it "delegates location to node" do
 | 
					      it "delegates locations to node" do
 | 
				
			||||||
        argument = Argument.new(arg, variable)
 | 
					        argument = Argument.new(arg, variable)
 | 
				
			||||||
        argument.location.should eq arg.location
 | 
					        argument.location.should eq arg.location
 | 
				
			||||||
 | 
					        argument.end_location.should eq arg.end_location
 | 
				
			||||||
      end
 | 
					      end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      it "delegates to_s to node" do
 | 
					      it "delegates to_s to node" do
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -22,9 +22,10 @@ module Ameba::AST
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    describe "delegation" do
 | 
					    describe "delegation" do
 | 
				
			||||||
      it "delegates location" do
 | 
					      it "delegates locations" do
 | 
				
			||||||
        assignment = Assignment.new(node, variable)
 | 
					        assignment = Assignment.new(node, variable)
 | 
				
			||||||
        assignment.location.should eq node.location
 | 
					        assignment.location.should eq node.location
 | 
				
			||||||
 | 
					        assignment.end_location.should eq node.end_location
 | 
				
			||||||
      end
 | 
					      end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      it "delegates to_s" do
 | 
					      it "delegates to_s" do
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -13,9 +13,10 @@ module Ameba::AST
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    describe "delegation" do
 | 
					    describe "delegation" do
 | 
				
			||||||
      it "delegates location" do
 | 
					      it "delegates locations" do
 | 
				
			||||||
        variable = Variable.new(var_node, scope)
 | 
					        variable = Variable.new(var_node, scope)
 | 
				
			||||||
        variable.location.should eq var_node.location
 | 
					        variable.location.should eq var_node.location
 | 
				
			||||||
 | 
					        variable.end_location.should eq var_node.end_location
 | 
				
			||||||
      end
 | 
					      end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      it "delegates name" do
 | 
					      it "delegates name" do
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -27,6 +27,7 @@ module Ameba::Rule::Layout
 | 
				
			||||||
      issue = source.issues.first
 | 
					      issue = source.issues.first
 | 
				
			||||||
      issue.rule.should eq subject
 | 
					      issue.rule.should eq subject
 | 
				
			||||||
      issue.location.to_s.should eq "source.cr:1:#{subject.max_length + 1}"
 | 
					      issue.location.to_s.should eq "source.cr:1:#{subject.max_length + 1}"
 | 
				
			||||||
 | 
					      issue.end_location.should be_nil
 | 
				
			||||||
      issue.message.should eq "Line too long"
 | 
					      issue.message.should eq "Line too long"
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -31,6 +31,7 @@ module Ameba::Rule::Layout
 | 
				
			||||||
      issue = source.issues.first
 | 
					      issue = source.issues.first
 | 
				
			||||||
      issue.rule.should_not be_nil
 | 
					      issue.rule.should_not be_nil
 | 
				
			||||||
      issue.location.to_s.should eq "source.cr:3:1"
 | 
					      issue.location.to_s.should eq "source.cr:3:1"
 | 
				
			||||||
 | 
					      issue.end_location.should be_nil
 | 
				
			||||||
      issue.message.should eq "Blank lines detected at the end of the file"
 | 
					      issue.message.should eq "Blank lines detected at the end of the file"
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -21,6 +21,7 @@ module Ameba::Rule::Layout
 | 
				
			||||||
      issue = source.issues.first
 | 
					      issue = source.issues.first
 | 
				
			||||||
      issue.rule.should_not be_nil
 | 
					      issue.rule.should_not be_nil
 | 
				
			||||||
      issue.location.to_s.should eq "source.cr:2:7"
 | 
					      issue.location.to_s.should eq "source.cr:2:7"
 | 
				
			||||||
 | 
					      issue.end_location.should be_nil
 | 
				
			||||||
      issue.message.should eq "Trailing whitespace detected"
 | 
					      issue.message.should eq "Trailing whitespace detected"
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -106,6 +106,7 @@ module Ameba::Rule::Lint
 | 
				
			||||||
        issue = source.issues.first
 | 
					        issue = source.issues.first
 | 
				
			||||||
        issue.rule.should_not be_nil
 | 
					        issue.rule.should_not be_nil
 | 
				
			||||||
        issue.location.to_s.should eq "source.cr:1:1"
 | 
					        issue.location.to_s.should eq "source.cr:1:1"
 | 
				
			||||||
 | 
					        issue.end_location.to_s.should eq "source.cr:1:9"
 | 
				
			||||||
        issue.message.should eq "Comparison to a boolean is pointless"
 | 
					        issue.message.should eq "Comparison to a boolean is pointless"
 | 
				
			||||||
      end
 | 
					      end
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -38,6 +38,7 @@ module Ameba::Rule::Lint
 | 
				
			||||||
      issue = s.issues.first
 | 
					      issue = s.issues.first
 | 
				
			||||||
      issue.rule.should_not be_nil
 | 
					      issue.rule.should_not be_nil
 | 
				
			||||||
      issue.location.to_s.should eq "source.cr:1:1"
 | 
					      issue.location.to_s.should eq "source.cr:1:1"
 | 
				
			||||||
 | 
					      issue.end_location.to_s.should eq "source.cr:1:8"
 | 
				
			||||||
      issue.message.should eq "Possible forgotten debugger statement detected"
 | 
					      issue.message.should eq "Possible forgotten debugger statement detected"
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -62,6 +62,7 @@ module Ameba::Rule::Lint
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      issue.rule.should_not be_nil
 | 
					      issue.rule.should_not be_nil
 | 
				
			||||||
      issue.location.to_s.should eq "source.cr:2:3"
 | 
					      issue.location.to_s.should eq "source.cr:2:3"
 | 
				
			||||||
 | 
					      issue.end_location.to_s.should eq "source.cr:6:3"
 | 
				
			||||||
      issue.message.should eq "Empty `ensure` block detected"
 | 
					      issue.message.should eq "Empty `ensure` block detected"
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -104,6 +104,7 @@ module Ameba
 | 
				
			||||||
      issue = s.issues.first
 | 
					      issue = s.issues.first
 | 
				
			||||||
      issue.rule.should_not be_nil
 | 
					      issue.rule.should_not be_nil
 | 
				
			||||||
      issue.location.to_s.should eq "source.cr:1:4"
 | 
					      issue.location.to_s.should eq "source.cr:1:4"
 | 
				
			||||||
 | 
					      issue.end_location.to_s.should eq "source.cr:1:5"
 | 
				
			||||||
      issue.message.should eq "Avoid empty expressions"
 | 
					      issue.message.should eq "Avoid empty expressions"
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -35,6 +35,7 @@ module Ameba::Rule::Lint
 | 
				
			||||||
      issue = s.issues.first
 | 
					      issue = s.issues.first
 | 
				
			||||||
      issue.rule.should_not be_nil
 | 
					      issue.rule.should_not be_nil
 | 
				
			||||||
      issue.location.to_s.should eq "source.cr:1:5"
 | 
					      issue.location.to_s.should eq "source.cr:1:5"
 | 
				
			||||||
 | 
					      issue.end_location.to_s.should eq "source.cr:1:24"
 | 
				
			||||||
      issue.message.should eq %(Duplicated keys in hash literal: "a")
 | 
					      issue.message.should eq %(Duplicated keys in hash literal: "a")
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -66,6 +66,7 @@ module Ameba::Rule::Lint
 | 
				
			||||||
      issue = s.issues.first
 | 
					      issue = s.issues.first
 | 
				
			||||||
      issue.rule.should_not be_nil
 | 
					      issue.rule.should_not be_nil
 | 
				
			||||||
      issue.location.to_s.should eq "source.cr:1:1"
 | 
					      issue.location.to_s.should eq "source.cr:1:1"
 | 
				
			||||||
 | 
					      issue.end_location.to_s.should eq "source.cr:1:20"
 | 
				
			||||||
      issue.message.should eq "Literal value found in conditional"
 | 
					      issue.message.should eq "Literal value found in conditional"
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -35,6 +35,7 @@ module Ameba::Rule::Lint
 | 
				
			||||||
      issue = s.issues.first
 | 
					      issue = s.issues.first
 | 
				
			||||||
      issue.rule.should_not be_nil
 | 
					      issue.rule.should_not be_nil
 | 
				
			||||||
      issue.location.to_s.should eq "source.cr:1:1"
 | 
					      issue.location.to_s.should eq "source.cr:1:1"
 | 
				
			||||||
 | 
					      issue.end_location.to_s.should eq "source.cr:1:6"
 | 
				
			||||||
      issue.message.should eq "Literal value found in interpolation"
 | 
					      issue.message.should eq "Literal value found in interpolation"
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -61,6 +61,7 @@ module Ameba::Rule::Lint
 | 
				
			||||||
      issue = s.issues.first
 | 
					      issue = s.issues.first
 | 
				
			||||||
      issue.rule.should_not be_nil
 | 
					      issue.rule.should_not be_nil
 | 
				
			||||||
      issue.location.to_s.should eq "source.cr:1:1"
 | 
					      issue.location.to_s.should eq "source.cr:1:1"
 | 
				
			||||||
 | 
					      issue.end_location.should be_nil
 | 
				
			||||||
      issue.message.should eq(
 | 
					      issue.message.should eq(
 | 
				
			||||||
        "Symbols `,\"` may be unwanted in %w array literals"
 | 
					        "Symbols `,\"` may be unwanted in %w array literals"
 | 
				
			||||||
      )
 | 
					      )
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -30,6 +30,7 @@ module Ameba::Rule::Lint
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      issue.rule.should_not be_nil
 | 
					      issue.rule.should_not be_nil
 | 
				
			||||||
      issue.location.to_s.should eq "source.cr:1:1"
 | 
					      issue.location.to_s.should eq "source.cr:1:1"
 | 
				
			||||||
 | 
					      issue.end_location.to_s.should eq "source.cr:1:7"
 | 
				
			||||||
      issue.message.should eq "rand(1) always returns 0"
 | 
					      issue.message.should eq "rand(1) always returns 0"
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -159,6 +159,7 @@ module Ameba::Rule::Lint
 | 
				
			||||||
      issue = s.issues.first
 | 
					      issue = s.issues.first
 | 
				
			||||||
      issue.rule.should_not be_nil
 | 
					      issue.rule.should_not be_nil
 | 
				
			||||||
      issue.location.to_s.should eq "source.cr:2:3"
 | 
					      issue.location.to_s.should eq "source.cr:2:3"
 | 
				
			||||||
 | 
					      issue.end_location.to_s.should eq "source.cr:2:10"
 | 
				
			||||||
      issue.message.should eq "Argument `bar` is assigned before it is used"
 | 
					      issue.message.should eq "Argument `bar` is assigned before it is used"
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -167,6 +167,7 @@ module Ameba::Rule::Lint
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      issue.rule.should_not be_nil
 | 
					      issue.rule.should_not be_nil
 | 
				
			||||||
      issue.location.to_s.should eq "source.cr:2:3"
 | 
					      issue.location.to_s.should eq "source.cr:2:3"
 | 
				
			||||||
 | 
					      issue.end_location.to_s.should eq "source.cr:4:3"
 | 
				
			||||||
      issue.message.should eq(
 | 
					      issue.message.should eq(
 | 
				
			||||||
        "Exception handler has shadowed exceptions: IndexError"
 | 
					        "Exception handler has shadowed exceptions: IndexError"
 | 
				
			||||||
      )
 | 
					      )
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -161,6 +161,7 @@ module Ameba::Rule::Lint
 | 
				
			||||||
      issue = source.issues.first
 | 
					      issue = source.issues.first
 | 
				
			||||||
      issue.rule.should_not be_nil
 | 
					      issue.rule.should_not be_nil
 | 
				
			||||||
      issue.location.to_s.should eq "source.cr:2:12"
 | 
					      issue.location.to_s.should eq "source.cr:2:12"
 | 
				
			||||||
 | 
					      issue.end_location.should be_nil
 | 
				
			||||||
      issue.message.should eq "Shadowing outer local variable `foo`"
 | 
					      issue.message.should eq "Shadowing outer local variable `foo`"
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -682,5 +682,20 @@ module Ameba::Rule::Lint
 | 
				
			||||||
        subject.catch(s).should be_valid
 | 
					        subject.catch(s).should be_valid
 | 
				
			||||||
      end
 | 
					      end
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    it "reports message, rule, location" do
 | 
				
			||||||
 | 
					      s = Source.new %(
 | 
				
			||||||
 | 
					        return
 | 
				
			||||||
 | 
					        :unreachable
 | 
				
			||||||
 | 
					      ), "source.cr"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      subject.catch(s).should_not be_valid
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      issue = s.issues.first
 | 
				
			||||||
 | 
					      issue.rule.should_not be_nil
 | 
				
			||||||
 | 
					      issue.location.to_s.should eq "source.cr:2:1"
 | 
				
			||||||
 | 
					      issue.end_location.to_s.should eq "source.cr:2:12"
 | 
				
			||||||
 | 
					      issue.message.should eq "Unreachable code detected"
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -39,6 +39,7 @@ module Ameba::Rule::Lint
 | 
				
			||||||
      issue = s.issues.first
 | 
					      issue = s.issues.first
 | 
				
			||||||
      issue.rule.should_not be_nil
 | 
					      issue.rule.should_not be_nil
 | 
				
			||||||
      issue.location.to_s.should eq "source.cr:5:15"
 | 
					      issue.location.to_s.should eq "source.cr:5:15"
 | 
				
			||||||
 | 
					      issue.end_location.to_s.should eq "source.cr:5:27"
 | 
				
			||||||
      issue.message.should eq "Useless condition in when detected"
 | 
					      issue.message.should eq "Useless condition in when detected"
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -43,6 +43,7 @@ module Ameba
 | 
				
			||||||
      issue = s.issues.first
 | 
					      issue = s.issues.first
 | 
				
			||||||
      issue.rule.should_not be_nil
 | 
					      issue.rule.should_not be_nil
 | 
				
			||||||
      issue.location.to_s.should eq "source.cr:1:1"
 | 
					      issue.location.to_s.should eq "source.cr:1:1"
 | 
				
			||||||
 | 
					      issue.end_location.to_s.should eq "source.cr:1:9"
 | 
				
			||||||
      issue.message.should eq(
 | 
					      issue.message.should eq(
 | 
				
			||||||
        "Constant name should be screaming-cased: CONST, not Const"
 | 
					        "Constant name should be screaming-cased: CONST, not Const"
 | 
				
			||||||
      )
 | 
					      )
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -118,6 +118,7 @@ module Ameba
 | 
				
			||||||
      issue = s.issues.first
 | 
					      issue = s.issues.first
 | 
				
			||||||
      issue.rule.should_not be_nil
 | 
					      issue.rule.should_not be_nil
 | 
				
			||||||
      issue.location.to_s.should eq "source.cr:1:1"
 | 
					      issue.location.to_s.should eq "source.cr:1:1"
 | 
				
			||||||
 | 
					      issue.end_location.should be_nil
 | 
				
			||||||
      issue.message.should match /1_200_000/
 | 
					      issue.message.should match /1_200_000/
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -47,6 +47,7 @@ module Ameba
 | 
				
			||||||
      issue = s.issues.first
 | 
					      issue = s.issues.first
 | 
				
			||||||
      issue.rule.should_not be_nil
 | 
					      issue.rule.should_not be_nil
 | 
				
			||||||
      issue.location.to_s.should eq "source.cr:1:1"
 | 
					      issue.location.to_s.should eq "source.cr:1:1"
 | 
				
			||||||
 | 
					      issue.end_location.to_s.should eq "source.cr:2:3"
 | 
				
			||||||
      issue.message.should eq(
 | 
					      issue.message.should eq(
 | 
				
			||||||
        "Method name should be underscore-cased: bad_name, not bad_Name"
 | 
					        "Method name should be underscore-cased: bad_name, not bad_Name"
 | 
				
			||||||
      )
 | 
					      )
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -62,6 +62,7 @@ module Ameba::Rule::Style
 | 
				
			||||||
      issue = s.issues.first
 | 
					      issue = s.issues.first
 | 
				
			||||||
      issue.rule.should_not be_nil
 | 
					      issue.rule.should_not be_nil
 | 
				
			||||||
      issue.location.to_s.should eq "source.cr:1:1"
 | 
					      issue.location.to_s.should eq "source.cr:1:1"
 | 
				
			||||||
 | 
					      issue.end_location.to_s.should eq "source.cr:1:21"
 | 
				
			||||||
      issue.message.should eq "Avoid negated conditions in unless blocks"
 | 
					      issue.message.should eq "Avoid negated conditions in unless blocks"
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -41,6 +41,7 @@ module Ameba::Rule::Style
 | 
				
			||||||
      issue = s.issues.first
 | 
					      issue = s.issues.first
 | 
				
			||||||
      issue.rule.should_not be_nil
 | 
					      issue.rule.should_not be_nil
 | 
				
			||||||
      issue.location.to_s.should eq "source.cr:2:3"
 | 
					      issue.location.to_s.should eq "source.cr:2:3"
 | 
				
			||||||
 | 
					      issue.end_location.to_s.should eq "source.cr:4:5"
 | 
				
			||||||
      issue.message.should eq(
 | 
					      issue.message.should eq(
 | 
				
			||||||
        "Favour method name 'picture?' over 'has_picture?'")
 | 
					        "Favour method name 'picture?' over 'has_picture?'")
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -220,6 +220,7 @@ module Ameba::Rule::Style
 | 
				
			||||||
      issue = s.issues.first
 | 
					      issue = s.issues.first
 | 
				
			||||||
      issue.rule.should_not be_nil
 | 
					      issue.rule.should_not be_nil
 | 
				
			||||||
      issue.location.to_s.should eq "source.cr:1:1"
 | 
					      issue.location.to_s.should eq "source.cr:1:1"
 | 
				
			||||||
 | 
					      issue.end_location.to_s.should eq "source.cr:7:3"
 | 
				
			||||||
      issue.message.should eq "Redundant `begin` block detected"
 | 
					      issue.message.should eq "Redundant `begin` block detected"
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -52,6 +52,7 @@ module Ameba
 | 
				
			||||||
      issue = s.issues.first
 | 
					      issue = s.issues.first
 | 
				
			||||||
      issue.rule.should_not be_nil
 | 
					      issue.rule.should_not be_nil
 | 
				
			||||||
      issue.location.to_s.should eq "source.cr:1:1"
 | 
					      issue.location.to_s.should eq "source.cr:1:1"
 | 
				
			||||||
 | 
					      issue.end_location.to_s.should eq "source.cr:2:3"
 | 
				
			||||||
      issue.message.should eq(
 | 
					      issue.message.should eq(
 | 
				
			||||||
        "Type name should be camelcased: MyClass, but it was My_class"
 | 
					        "Type name should be camelcased: MyClass, but it was My_class"
 | 
				
			||||||
      )
 | 
					      )
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -38,6 +38,7 @@ module Ameba::Rule::Style
 | 
				
			||||||
      issue.should_not be_nil
 | 
					      issue.should_not be_nil
 | 
				
			||||||
      issue.rule.should_not be_nil
 | 
					      issue.rule.should_not be_nil
 | 
				
			||||||
      issue.location.to_s.should eq "source.cr:1:1"
 | 
					      issue.location.to_s.should eq "source.cr:1:1"
 | 
				
			||||||
 | 
					      issue.end_location.to_s.should eq "source.cr:5:3"
 | 
				
			||||||
      issue.message.should eq "Favour if over unless with else"
 | 
					      issue.message.should eq "Favour if over unless with else"
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -53,6 +53,7 @@ module Ameba
 | 
				
			||||||
      issue = s.issues.first
 | 
					      issue = s.issues.first
 | 
				
			||||||
      issue.rule.should_not be_nil
 | 
					      issue.rule.should_not be_nil
 | 
				
			||||||
      issue.location.to_s.should eq "source.cr:1:1"
 | 
					      issue.location.to_s.should eq "source.cr:1:1"
 | 
				
			||||||
 | 
					      issue.end_location.to_s.should eq "source.cr:1:7"
 | 
				
			||||||
      issue.message.should eq(
 | 
					      issue.message.should eq(
 | 
				
			||||||
        "Var name should be underscore-cased: bad_name, not badName"
 | 
					        "Var name should be underscore-cased: bad_name, not badName"
 | 
				
			||||||
      )
 | 
					      )
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -36,6 +36,7 @@ module Ameba::Rule::Style
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      issue = source.issues.first
 | 
					      issue = source.issues.first
 | 
				
			||||||
      issue.location.to_s.should eq "source.cr:2:1"
 | 
					      issue.location.to_s.should eq "source.cr:2:1"
 | 
				
			||||||
 | 
					      issue.end_location.to_s.should eq "source.cr:5:3"
 | 
				
			||||||
      issue.message.should eq "While statement using true literal as condition"
 | 
					      issue.message.should eq "While statement using true literal as condition"
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -21,6 +21,7 @@ module Ameba::AST
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    delegate to_s, to: @node
 | 
					    delegate to_s, to: @node
 | 
				
			||||||
    delegate location, to: @node
 | 
					    delegate location, to: @node
 | 
				
			||||||
 | 
					    delegate end_location, to: @node
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def_equals_and_hash node, location
 | 
					    def_equals_and_hash node, location
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -25,6 +25,7 @@ module Ameba::AST
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    delegate to_s, to: @node
 | 
					    delegate to_s, to: @node
 | 
				
			||||||
    delegate location, to: @node
 | 
					    delegate location, to: @node
 | 
				
			||||||
 | 
					    delegate end_location, to: @node
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # Creates a new branchable
 | 
					    # Creates a new branchable
 | 
				
			||||||
    #
 | 
					    #
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -26,6 +26,7 @@ module Ameba::AST
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    delegate to_s, to: @node
 | 
					    delegate to_s, to: @node
 | 
				
			||||||
    delegate location, to: @node
 | 
					    delegate location, to: @node
 | 
				
			||||||
 | 
					    delegate end_location, to: @node
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # Creates a new flow expression.
 | 
					    # Creates a new flow expression.
 | 
				
			||||||
    #
 | 
					    #
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -21,6 +21,7 @@ module Ameba::AST
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    delegate to_s, to: node
 | 
					    delegate to_s, to: node
 | 
				
			||||||
    delegate location, to: node
 | 
					    delegate location, to: node
 | 
				
			||||||
 | 
					    delegate end_location, to: node
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def_equals_and_hash node, location
 | 
					    def_equals_and_hash node, location
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -44,7 +45,7 @@ module Ameba::AST
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def add_argument(node)
 | 
					    def add_argument(node)
 | 
				
			||||||
      add_variable Crystal::Var.new(node.name).at(node.location)
 | 
					      add_variable Crystal::Var.new(node.name).at(node)
 | 
				
			||||||
      arguments << Argument.new(node, variables.last)
 | 
					      arguments << Argument.new(node, variables.last)
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -20,6 +20,7 @@ module Ameba::AST
 | 
				
			||||||
    getter variable : Variable
 | 
					    getter variable : Variable
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    delegate location, to: @node
 | 
					    delegate location, to: @node
 | 
				
			||||||
 | 
					    delegate end_location, to: @node
 | 
				
			||||||
    delegate to_s, to: @node
 | 
					    delegate to_s, to: @node
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # Creates a new argument.
 | 
					    # Creates a new argument.
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -17,6 +17,8 @@ module Ameba::AST
 | 
				
			||||||
    getter branch : Branch?
 | 
					    getter branch : Branch?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    delegate to_s, to: @node
 | 
					    delegate to_s, to: @node
 | 
				
			||||||
 | 
					    delegate location, to: @node
 | 
				
			||||||
 | 
					    delegate end_location, to: @node
 | 
				
			||||||
    delegate scope, to: @variable
 | 
					    delegate scope, to: @variable
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # Creates a new assignment.
 | 
					    # Creates a new assignment.
 | 
				
			||||||
| 
						 | 
					@ -58,18 +60,18 @@ module Ameba::AST
 | 
				
			||||||
      !branch.nil?
 | 
					      !branch.nil?
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # Returns the location of the current variable in the assignment.
 | 
					    # Returns the target node of the variable in this assignment.
 | 
				
			||||||
    def location
 | 
					    def target_node
 | 
				
			||||||
      case assign = node
 | 
					      case assign = node
 | 
				
			||||||
      when Crystal::Assign           then assign.target.location
 | 
					      when Crystal::Assign           then assign.target
 | 
				
			||||||
      when Crystal::OpAssign         then assign.target.location
 | 
					      when Crystal::OpAssign         then assign.target
 | 
				
			||||||
      when Crystal::UninitializedVar then assign.var.location
 | 
					      when Crystal::UninitializedVar then assign.var
 | 
				
			||||||
      when Crystal::MultiAssign
 | 
					      when Crystal::MultiAssign
 | 
				
			||||||
        assign.targets.find do |target|
 | 
					        assign.targets.find(node) do |target|
 | 
				
			||||||
          target.is_a?(Crystal::Var) && target.name == variable.name
 | 
					          target.is_a?(Crystal::Var) && target.name == variable.name
 | 
				
			||||||
        end.try &.location
 | 
					        end
 | 
				
			||||||
      else
 | 
					      else
 | 
				
			||||||
        node.location
 | 
					        node
 | 
				
			||||||
      end
 | 
					      end
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -18,6 +18,7 @@ module Ameba::AST
 | 
				
			||||||
    getter assign_before_reference : Crystal::ASTNode?
 | 
					    getter assign_before_reference : Crystal::ASTNode?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    delegate location, to: @node
 | 
					    delegate location, to: @node
 | 
				
			||||||
 | 
					    delegate end_location, to: @node
 | 
				
			||||||
    delegate name, to: @node
 | 
					    delegate name, to: @node
 | 
				
			||||||
    delegate to_s, to: @node
 | 
					    delegate to_s, to: @node
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -11,12 +11,12 @@ module Ameba
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # Adds a new issue for AST *node*.
 | 
					    # Adds a new issue for AST *node*.
 | 
				
			||||||
    def add_issue(rule, node, message, **args)
 | 
					    def add_issue(rule, node : Crystal::ASTNode, message, **args)
 | 
				
			||||||
      add_issue rule, node.location, node.end_location, message, **args
 | 
					      add_issue rule, node.location, node.end_location, message, **args
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # Adds a new issue for Crystal *token*.
 | 
					    # Adds a new issue for Crystal *token*.
 | 
				
			||||||
    def add_issue(rule, token, message, **args)
 | 
					    def add_issue(rule, token : Crystal::Token, message, **args)
 | 
				
			||||||
      add_issue rule, token.location, nil, message, **args
 | 
					      add_issue rule, token.location, nil, message, **args
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -55,7 +55,7 @@ module Ameba::Rule::Lint
 | 
				
			||||||
      scope.arguments.each do |arg|
 | 
					      scope.arguments.each do |arg|
 | 
				
			||||||
        next if arg.ignored?
 | 
					        next if arg.ignored?
 | 
				
			||||||
        if scope.outer_scope.try &.find_variable(arg.name)
 | 
					        if scope.outer_scope.try &.find_variable(arg.name)
 | 
				
			||||||
          issue_for arg, MSG % arg.name
 | 
					          issue_for arg.node, MSG % arg.name
 | 
				
			||||||
        end
 | 
					        end
 | 
				
			||||||
      end
 | 
					      end
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -58,7 +58,7 @@ module Ameba::Rule::Lint
 | 
				
			||||||
        next if argument.ignored? || scope.references?(argument.variable)
 | 
					        next if argument.ignored? || scope.references?(argument.variable)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        name_suggestion = scope.node.is_a?(Crystal::Block) ? '_' : "_#{argument.name}"
 | 
					        name_suggestion = scope.node.is_a?(Crystal::Block) ? '_' : "_#{argument.name}"
 | 
				
			||||||
        issue_for argument, MSG % {argument.name, name_suggestion}
 | 
					        issue_for argument.node, MSG % {argument.name, name_suggestion}
 | 
				
			||||||
      end
 | 
					      end
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -43,7 +43,7 @@ module Ameba::Rule::Lint
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        var.assignments.each do |assign|
 | 
					        var.assignments.each do |assign|
 | 
				
			||||||
          next if assign.referenced?
 | 
					          next if assign.referenced?
 | 
				
			||||||
          issue_for assign, MSG % var.name
 | 
					          issue_for assign.target_node, MSG % var.name
 | 
				
			||||||
        end
 | 
					        end
 | 
				
			||||||
      end
 | 
					      end
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue