diff --git a/spec/compiler/codegen/macro_spec.cr b/spec/compiler/codegen/macro_spec.cr index 8295f95aac6fd796646465001c2d53281f61de8e..49e11ab7bb17e3a1667130513d7856784b2a35a4 100755 --- a/spec/compiler/codegen/macro_spec.cr +++ b/spec/compiler/codegen/macro_spec.cr @@ -426,4 +426,24 @@ describe "Code gen: macro" do foo(1.5).to_i )).to_i.should eq(2) end + + it "can use constants" do + run(%( + A = 1 + {{ A }} + )).to_i.should eq(1) + end + + it "can refer to types" do + run(%( + class Foo + def initialize(@x, @y) + end + end + + Foo.new(1, 2) + + {{ Foo.instance_vars.last.name }} + )).to_string.should eq("y") + end end diff --git a/src/compiler/crystal/macros.cr b/src/compiler/crystal/macros.cr index b8c18b169a1737606e65089dfe73c2f56883b270..d3404356514ae0b17799a5c030399baa51639620 100644 --- a/src/compiler/crystal/macros.cr +++ b/src/compiler/crystal/macros.cr @@ -368,6 +368,26 @@ module Crystal false end + def visit(node : Path) + matched_type = @scope.lookup_type(node) + unless matched_type + node.raise "undefined constant #{node}" + end + + case matched_type + when Const + @last = matched_type.value + when Type + @last = MacroType.new(matched_type) + when ASTNode + @last = matched_type + else + node.raise "can't interpret #{node}" + end + + false + end + class ReplaceBlockVarsTransformer < Transformer def initialize(@vars) end