Skip to content

Commit

Permalink
Showing 2 changed files with 35 additions and 0 deletions.
14 changes: 14 additions & 0 deletions spec/compiler/macro/macro_methods_spec.cr
Original file line number Diff line number Diff line change
@@ -993,6 +993,20 @@ describe "macro methods" do
end
end

describe "generic methods" do
it "executes name" do
assert_macro "x", %({{x.name}}), [Generic.new("Foo".path, ["T".path] of ASTNode)] of ASTNode, "Foo"
end

it "executes type_vars" do
assert_macro "x", %({{x.type_vars}}), [Generic.new("Foo".path, ["T".path, "U".path] of ASTNode)] of ASTNode, "[T, U]"
end

it "executes named_args" do
assert_macro "x", %({{x.named_args}}), [Generic.new("Foo".path, [] of ASTNode, named_args: [NamedArgument.new("x", "U".path), NamedArgument.new("y", "V".path)])] of ASTNode, "{x: U, y: V}"
end
end

describe "range methods" do
it "executes begin" do
assert_macro "x", %({{x.begin}}), [RangeLiteral.new(1.int32, 2.int32, true)] of ASTNode, "1"
21 changes: 21 additions & 0 deletions src/compiler/crystal/macros/methods.cr
Original file line number Diff line number Diff line change
@@ -1306,6 +1306,27 @@ module Crystal
end
end
end

class Generic
def interpret(method, args, block, interpreter)
case method
when "name"
interpret_argless_method(method, args) { name }
when "type_vars"
interpret_argless_method(method, args) { ArrayLiteral.new(type_vars) }
when "named_args"
interpret_argless_method(method, args) do
if named_args = @named_args
NamedTupleLiteral.new(named_args.map { |arg| NamedTupleLiteral::Entry.new(arg.name, arg.value) })
else
NilLiteral.new
end
end
else
super
end
end
end
end

private def intepret_array_or_tuple_method(object, klass, method, args, block, interpreter)

0 comments on commit b7262c4

Please sign in to comment.