diff --git a/spec/compiler/codegen/macro_spec.cr b/spec/compiler/codegen/macro_spec.cr index 34e7d6ae4dcff8878e3dc64f3426a656cb5beb29..f4a9a9d0236fb409ee37baafeb1c44d85694a8be 100755 --- a/spec/compiler/codegen/macro_spec.cr +++ b/spec/compiler/codegen/macro_spec.cr @@ -238,6 +238,42 @@ describe "Code gen: macro" do )).to_i.should eq(1) end + it "expands def macro with @class_name with hierarchy" do + run(%( + class Reference + def to_s : String + {{ @class_name }} + end + end + + class Foo + end + + class Bar < Foo + end + + (Bar.new || Foo.new).to_s + )).to_string.should eq("Bar") + end + + it "expands def macro with @class_name with hierarchy (2)" do + run(%( + class Reference + def to_s : String + {{ @class_name }} + end + end + + class Foo + end + + class Bar < Foo + end + + (Foo.new || Bar.new).to_s + )).to_string.should eq("Foo") + end + it "allows overriding macro definition when redefining base class" do run(%( class Foo diff --git a/src/compiler/crystal/macros.cr b/src/compiler/crystal/macros.cr index 3a3b6134b7544b02f89470e1dbd78962599b44fd..7eec353aaedb92b9002b1e80ce2152c37a07453e 100644 --- a/src/compiler/crystal/macros.cr +++ b/src/compiler/crystal/macros.cr @@ -24,6 +24,7 @@ module Crystal the_macro.location = target_def.location owner = target_def.owner.not_nil! + owner = owner.base_type if owner.is_a?(HierarchyType) begin generated_source = @program.expand_macro owner, target_def.body