Basic implementation of UnreachableCode rule

This commit is contained in:
Vitalii Elenhaupt 2018-11-05 20:56:54 +02:00
parent d7952204a2
commit 67d76116f7
No known key found for this signature in database
GPG key ID: 7558EF3A4056C706
7 changed files with 415 additions and 0 deletions

View file

@ -0,0 +1,61 @@
require "../../spec_helper"
module Ameba::AST
describe FlowExpression do
describe "#initialize" do
it "creates a new flow expression" do
node = as_node("return 22")
parent_node = as_node("def foo; return 22; end")
flow_expression = FlowExpression.new node, parent_node
flow_expression.node.should_not be_nil
flow_expression.parent_node.should_not be_nil
end
describe "#delegation" do
it "delegates to_s to @node" do
node = as_node("return 22")
parent_node = as_node("def foo; return 22; end")
flow_expression = FlowExpression.new node, parent_node
flow_expression.to_s.should eq node.to_s
end
it "delegates location to @node" do
node = as_node %(break if true)
parent_node = as_node("def foo; return 22 if true; end")
flow_expression = FlowExpression.new node, parent_node
flow_expression.location.should eq node.location
end
end
describe "#find_unreachable_node" do
it "returns first unreachable node" do
nodes = as_nodes %(
def foobar
return
a = 1
a + 1
end
)
node = nodes.control_expression_nodes.first
assign_node = nodes.assign_nodes.first
def_node = nodes.def_nodes.first
flow_expression = FlowExpression.new node, def_node
flow_expression.find_unreachable_node.should eq assign_node
end
it "returns nil if there is no unreachable node" do
nodes = as_nodes %(
def foobar
a = 1
return a
end
)
node = nodes.control_expression_nodes.first
def_node = nodes.def_nodes.first
flow_expression = FlowExpression.new node, def_node
flow_expression.find_unreachable_node.should eq nil
end
end
end
end
end

View file

@ -0,0 +1,66 @@
require "../../../spec_helper"
module Ameba::AST
source = Source.new ""
describe FlowExpressionVisitor do
it "creates an expression for return" do
rule = FlowExpressionRule.new
FlowExpressionVisitor.new rule, Source.new %(
def foo
return :bar
end
)
rule.expressions.size.should eq 1
end
it "can create multiple expressions" do
rule = FlowExpressionRule.new
FlowExpressionVisitor.new rule, Source.new %(
def foo
if bar
return :baz
else
return :foobar
end
end
)
rule.expressions.size.should eq 2
end
it "properly creates nested flow expressions" do
rule = FlowExpressionRule.new
FlowExpressionVisitor.new rule, Source.new %(
def foo
return(
loop do
break if a > 1
return a
end
)
end
)
rule.expressions.size.should eq 3
end
it "creates an expression for break" do
rule = FlowExpressionRule.new
FlowExpressionVisitor.new rule, Source.new %(
while true
break
end
)
rule.expressions.size.should eq 1
end
it "creates an expression for next" do
rule = FlowExpressionRule.new
FlowExpressionVisitor.new rule, Source.new %(
while true
next if something
end
)
rule.expressions.size.should eq 1
end
end
end