mirror of
https://github.com/KevinMidboe/linguist.git
synced 2025-10-29 09:40:21 +00:00
516 lines
9.8 KiB
Crystal
516 lines
9.8 KiB
Crystal
module Crystal
|
|
class ASTNode
|
|
def transform(transformer)
|
|
transformer.before_transform self
|
|
node = transformer.transform self
|
|
transformer.after_transform self
|
|
node
|
|
end
|
|
end
|
|
|
|
class Transformer
|
|
def before_transform(node)
|
|
end
|
|
|
|
def after_transform(node)
|
|
end
|
|
|
|
def transform(node : Expressions)
|
|
exps = [] of ASTNode
|
|
node.expressions.each do |exp|
|
|
new_exp = exp.transform(self)
|
|
if new_exp
|
|
if new_exp.is_a?(Expressions)
|
|
exps.concat new_exp.expressions
|
|
else
|
|
exps << new_exp
|
|
end
|
|
end
|
|
end
|
|
|
|
if exps.length == 1
|
|
exps[0]
|
|
else
|
|
node.expressions = exps
|
|
node
|
|
end
|
|
end
|
|
|
|
def transform(node : Call)
|
|
if node_obj = node.obj
|
|
node.obj = node_obj.transform(self)
|
|
end
|
|
transform_many node.args
|
|
|
|
if node_block = node.block
|
|
node.block = node_block.transform(self)
|
|
end
|
|
|
|
if node_block_arg = node.block_arg
|
|
node.block_arg = node_block_arg.transform(self)
|
|
end
|
|
|
|
node
|
|
end
|
|
|
|
def transform(node : And)
|
|
node.left = node.left.transform(self)
|
|
node.right = node.right.transform(self)
|
|
node
|
|
end
|
|
|
|
def transform(node : Or)
|
|
node.left = node.left.transform(self)
|
|
node.right = node.right.transform(self)
|
|
node
|
|
end
|
|
|
|
def transform(node : StringInterpolation)
|
|
transform_many node.expressions
|
|
node
|
|
end
|
|
|
|
def transform(node : ArrayLiteral)
|
|
transform_many node.elements
|
|
|
|
if node_of = node.of
|
|
node.of = node_of.transform(self)
|
|
end
|
|
|
|
node
|
|
end
|
|
|
|
def transform(node : HashLiteral)
|
|
transform_many node.keys
|
|
transform_many node.values
|
|
|
|
if of_key = node.of_key
|
|
node.of_key = of_key.transform(self)
|
|
end
|
|
|
|
if of_value = node.of_value
|
|
node.of_value = of_value.transform(self)
|
|
end
|
|
|
|
node
|
|
end
|
|
|
|
def transform(node : If)
|
|
node.cond = node.cond.transform(self)
|
|
node.then = node.then.transform(self)
|
|
node.else = node.else.transform(self)
|
|
node
|
|
end
|
|
|
|
def transform(node : Unless)
|
|
node.cond = node.cond.transform(self)
|
|
node.then = node.then.transform(self)
|
|
node.else = node.else.transform(self)
|
|
node
|
|
end
|
|
|
|
def transform(node : IfDef)
|
|
node.cond = node.cond.transform(self)
|
|
node.then = node.then.transform(self)
|
|
node.else = node.else.transform(self)
|
|
node
|
|
end
|
|
|
|
def transform(node : MultiAssign)
|
|
transform_many node.targets
|
|
transform_many node.values
|
|
node
|
|
end
|
|
|
|
def transform(node : SimpleOr)
|
|
node.left = node.left.transform(self)
|
|
node.right = node.right.transform(self)
|
|
node
|
|
end
|
|
|
|
def transform(node : Def)
|
|
transform_many node.args
|
|
node.body = node.body.transform(self)
|
|
|
|
if receiver = node.receiver
|
|
node.receiver = receiver.transform(self)
|
|
end
|
|
|
|
if block_arg = node.block_arg
|
|
node.block_arg = block_arg.transform(self)
|
|
end
|
|
|
|
node
|
|
end
|
|
|
|
def transform(node : Macro)
|
|
transform_many node.args
|
|
node.body = node.body.transform(self)
|
|
|
|
if receiver = node.receiver
|
|
node.receiver = receiver.transform(self)
|
|
end
|
|
|
|
if block_arg = node.block_arg
|
|
node.block_arg = block_arg.transform(self)
|
|
end
|
|
|
|
node
|
|
end
|
|
|
|
def transform(node : PointerOf)
|
|
node.exp = node.exp.transform(self)
|
|
node
|
|
end
|
|
|
|
def transform(node : SizeOf)
|
|
node.exp = node.exp.transform(self)
|
|
node
|
|
end
|
|
|
|
def transform(node : InstanceSizeOf)
|
|
node.exp = node.exp.transform(self)
|
|
node
|
|
end
|
|
|
|
def transform(node : IsA)
|
|
node.obj = node.obj.transform(self)
|
|
node.const = node.const.transform(self)
|
|
node
|
|
end
|
|
|
|
def transform(node : RespondsTo)
|
|
node.obj = node.obj.transform(self)
|
|
node
|
|
end
|
|
|
|
def transform(node : Case)
|
|
node.cond = node.cond.transform(self)
|
|
transform_many node.whens
|
|
|
|
if node_else = node.else
|
|
node.else = node_else.transform(self)
|
|
end
|
|
|
|
node
|
|
end
|
|
|
|
def transform(node : When)
|
|
transform_many node.conds
|
|
node.body = node.body.transform(self)
|
|
node
|
|
end
|
|
|
|
def transform(node : ImplicitObj)
|
|
node
|
|
end
|
|
|
|
def transform(node : ClassDef)
|
|
node.body = node.body.transform(self)
|
|
|
|
if superclass = node.superclass
|
|
node.superclass = superclass.transform(self)
|
|
end
|
|
|
|
node
|
|
end
|
|
|
|
def transform(node : ModuleDef)
|
|
node.body = node.body.transform(self)
|
|
node
|
|
end
|
|
|
|
def transform(node : While)
|
|
node.cond = node.cond.transform(self)
|
|
node.body = node.body.transform(self)
|
|
node
|
|
end
|
|
|
|
def transform(node : Generic)
|
|
node.name = node.name.transform(self)
|
|
transform_many node.type_vars
|
|
node
|
|
end
|
|
|
|
def transform(node : ExceptionHandler)
|
|
node.body = node.body.transform(self)
|
|
transform_many node.rescues
|
|
|
|
if node_ensure = node.ensure
|
|
node.ensure = node_ensure.transform(self)
|
|
end
|
|
|
|
node
|
|
end
|
|
|
|
def transform(node : Rescue)
|
|
node.body = node.body.transform(self)
|
|
transform_many node.types
|
|
node
|
|
end
|
|
|
|
def transform(node : Union)
|
|
transform_many node.types
|
|
node
|
|
end
|
|
|
|
def transform(node : Hierarchy)
|
|
node.name = node.name.transform(self)
|
|
node
|
|
end
|
|
|
|
def transform(node : Metaclass)
|
|
node.name = node.name.transform(self)
|
|
node
|
|
end
|
|
|
|
def transform(node : Arg)
|
|
if default_value = node.default_value
|
|
node.default_value = default_value.transform(self)
|
|
end
|
|
|
|
if restriction = node.restriction
|
|
node.restriction = restriction.transform(self)
|
|
end
|
|
|
|
node
|
|
end
|
|
|
|
def transform(node : BlockArg)
|
|
node.fun = node.fun.transform(self)
|
|
node
|
|
end
|
|
|
|
def transform(node : Fun)
|
|
transform_many node.inputs
|
|
|
|
if output = node.output
|
|
node.output = output.transform(self)
|
|
end
|
|
|
|
node
|
|
end
|
|
|
|
def transform(node : Block)
|
|
node.args.map! { |exp| exp.transform(self) as Var }
|
|
node.body = node.body.transform(self)
|
|
node
|
|
end
|
|
|
|
def transform(node : FunLiteral)
|
|
node.def.body = node.def.body.transform(self)
|
|
node
|
|
end
|
|
|
|
def transform(node : FunPointer)
|
|
if obj = node.obj
|
|
node.obj = obj.transform(self)
|
|
end
|
|
node
|
|
end
|
|
|
|
def transform(node : Return)
|
|
transform_many node.exps
|
|
node
|
|
end
|
|
|
|
def transform(node : Break)
|
|
transform_many node.exps
|
|
node
|
|
end
|
|
|
|
def transform(node : Next)
|
|
transform_many node.exps
|
|
node
|
|
end
|
|
|
|
def transform(node : Yield)
|
|
if scope = node.scope
|
|
node.scope = scope.transform(self)
|
|
end
|
|
transform_many node.exps
|
|
node
|
|
end
|
|
|
|
def transform(node : Include)
|
|
node.name = node.name.transform(self)
|
|
node
|
|
end
|
|
|
|
def transform(node : Extend)
|
|
node.name = node.name.transform(self)
|
|
node
|
|
end
|
|
|
|
def transform(node : RangeLiteral)
|
|
node.from = node.from.transform(self)
|
|
node.to = node.to.transform(self)
|
|
node
|
|
end
|
|
|
|
def transform(node : Assign)
|
|
node.target = node.target.transform(self)
|
|
node.value = node.value.transform(self)
|
|
node
|
|
end
|
|
|
|
def transform(node : Nop)
|
|
node
|
|
end
|
|
|
|
def transform(node : NilLiteral)
|
|
node
|
|
end
|
|
|
|
def transform(node : BoolLiteral)
|
|
node
|
|
end
|
|
|
|
def transform(node : NumberLiteral)
|
|
node
|
|
end
|
|
|
|
def transform(node : CharLiteral)
|
|
node
|
|
end
|
|
|
|
def transform(node : StringLiteral)
|
|
node
|
|
end
|
|
|
|
def transform(node : SymbolLiteral)
|
|
node
|
|
end
|
|
|
|
def transform(node : RegexLiteral)
|
|
node
|
|
end
|
|
|
|
def transform(node : Var)
|
|
node
|
|
end
|
|
|
|
def transform(node : MetaVar)
|
|
node
|
|
end
|
|
|
|
def transform(node : InstanceVar)
|
|
node
|
|
end
|
|
|
|
def transform(node : ClassVar)
|
|
node
|
|
end
|
|
|
|
def transform(node : Global)
|
|
node
|
|
end
|
|
|
|
def transform(node : Require)
|
|
node
|
|
end
|
|
|
|
def transform(node : Path)
|
|
node
|
|
end
|
|
|
|
def transform(node : Self)
|
|
node
|
|
end
|
|
|
|
def transform(node : LibDef)
|
|
node.body = node.body.transform(self)
|
|
node
|
|
end
|
|
|
|
def transform(node : FunDef)
|
|
if body = node.body
|
|
node.body = body.transform(self)
|
|
end
|
|
node
|
|
end
|
|
|
|
def transform(node : TypeDef)
|
|
node
|
|
end
|
|
|
|
def transform(node : StructDef)
|
|
node
|
|
end
|
|
|
|
def transform(node : UnionDef)
|
|
node
|
|
end
|
|
|
|
def transform(node : EnumDef)
|
|
node
|
|
end
|
|
|
|
def transform(node : ExternalVar)
|
|
node
|
|
end
|
|
|
|
def transform(node : IndirectRead)
|
|
node.obj = node.obj.transform(self)
|
|
node
|
|
end
|
|
|
|
def transform(node : IndirectWrite)
|
|
node.obj = node.obj.transform(self)
|
|
node.value = node.value.transform(self)
|
|
node
|
|
end
|
|
|
|
def transform(node : TypeOf)
|
|
transform_many node.expressions
|
|
node
|
|
end
|
|
|
|
def transform(node : Primitive)
|
|
node
|
|
end
|
|
|
|
def transform(node : Not)
|
|
node
|
|
end
|
|
|
|
def transform(node : TypeFilteredNode)
|
|
node
|
|
end
|
|
|
|
def transform(node : TupleLiteral)
|
|
transform_many node.exps
|
|
node
|
|
end
|
|
|
|
def transform(node : Cast)
|
|
node.obj = node.obj.transform(self)
|
|
node.to = node.to.transform(self)
|
|
node
|
|
end
|
|
|
|
def transform(node : DeclareVar)
|
|
node.var = node.var.transform(self)
|
|
node.declared_type = node.declared_type.transform(self)
|
|
node
|
|
end
|
|
|
|
def transform(node : Alias)
|
|
node.value = node.value.transform(self)
|
|
node
|
|
end
|
|
|
|
def transform(node : TupleIndexer)
|
|
node
|
|
end
|
|
|
|
def transform(node : Attribute)
|
|
node
|
|
end
|
|
|
|
def transform_many(exps)
|
|
exps.map! { |exp| exp.transform(self) } if exps
|
|
end
|
|
end
|
|
end
|