shard-ameba/src/ameba/ast/visitors/node_visitor.cr

62 lines
1.2 KiB
Crystal
Raw Normal View History

require "./base_visitor"
module Ameba::AST
# List of nodes to be visited by Ameba's rules.
NODES = [
Alias,
2020-03-29 10:31:24 +00:00
IsA,
Assign,
Call,
2020-03-24 16:01:23 +00:00
Block,
Case,
ClassDef,
ClassVar,
Def,
EnumDef,
ExceptionHandler,
Expressions,
HashLiteral,
If,
InstanceVar,
LibDef,
ModuleDef,
NilLiteral,
StringInterpolation,
Unless,
Var,
When,
While,
2020-03-26 08:27:00 +00:00
Until,
]
# An AST Visitor that traverses the source and allows all nodes
# to be inspected by rules.
#
# ```
# visitor = Ameba::AST::NodeVisitor.new(rule, source)
# ```
#
class NodeVisitor < BaseVisitor
@skip : Array(Crystal::ASTNode.class)?
def initialize(@rule, @source, skip = nil)
2021-01-17 17:12:10 +00:00
@skip = skip.try &.map(&.as(Crystal::ASTNode.class))
super @rule, @source
end
{% for name in NODES %}
# A visit callback for `Crystal::{{name}}` node.
# Returns true meaning that child nodes will be traversed as well.
def visit(node : Crystal::{{name}})
@rule.test @source, node
true
end
{% end %}
def visit(node)
2021-01-17 17:12:10 +00:00
return true unless skip = @skip
!skip.includes?(node.class)
end
end
end