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,8 +97,9 @@ 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|
|
|
||||||
file << "\n# Problems found: #{rule_issues.size}"
|
rule_issues_map(issues).each do |rule, rule_issues|
|
||||||
file << "\n# Run `ameba --only #{rule.name}` for details"
|
rule_todo = rule_todo(rule, rule_issues)
|
||||||
file << rule_todo(rule, rule_issues).gsub("---", "")
|
rule_todo =
|
||||||
|
{rule_todo.name => rule_todo}
|
||||||
|
.to_yaml.gsub("---", "")
|
||||||
|
|
||||||
|
file << "\n# Problems found: #{rule_issues.size}"
|
||||||
|
file << "\n# Run `ameba --only #{rule.name}` for details"
|
||||||
|
file << rule_todo
|
||||||
|
end
|
||||||
|
file
|
||||||
end
|
end
|
||||||
file
|
|
||||||
ensure
|
|
||||||
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|
|
||||||
.compact_map(&.location.try &.filename.try &.to_s)
|
rule_todo.excluded = issues
|
||||||
.uniq!
|
.compact_map(&.location.try &.filename.try &.to_s)
|
||||||
|
.uniq!
|
||||||
{rule.name => rule}.to_yaml
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -110,23 +110,22 @@ 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, ", "
|
||||||
|
|
||||||
named_args = node.named_args
|
named_args = node.named_args
|
||||||
if named_args
|
if named_args
|
||||||
io << ", " unless args.empty? || named_args.empty?
|
io << ", " unless args.empty? || named_args.empty?
|
||||||
named_args.join io, ", " do |arg, inner_io|
|
named_args.join io, ", " do |arg, inner_io|
|
||||||
inner_io << arg.name << ": " << arg.value
|
inner_io << arg.name << ": " << arg.value
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
end
|
||||||
|
|
||||||
if short_block
|
if short_block
|
||||||
io << ", " unless args.empty? && (named_args.nil? || named_args.empty?)
|
io << ", " unless args.empty? && (named_args.nil? || named_args.empty?)
|
||||||
io << short_block
|
io << short_block
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -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…
Reference in a new issue