diff --git a/spec/compiler/macro/macro_methods_spec.cr b/spec/compiler/macro/macro_methods_spec.cr index 5142ad86c5bd..133fc6982877 100644 --- a/spec/compiler/macro/macro_methods_spec.cr +++ b/spec/compiler/macro/macro_methods_spec.cr @@ -2611,6 +2611,18 @@ module Crystal end end + describe Alias do + node = Alias.new("Foo".path, Generic.new(Path.new(["Bar", "Baz"], global: true), ["T".path] of ASTNode)) + + it "executes name" do + assert_macro %({{x.name}}), %(Foo), {x: node} + end + + it "executes type" do + assert_macro %({{x.type}}), %(::Bar::Baz(T)), {x: node} + end + end + describe "visibility modifier methods" do node = VisibilityModifier.new(Visibility::Protected, Def.new("some_def")) diff --git a/src/compiler/crystal/macros.cr b/src/compiler/crystal/macros.cr index c18782dac954..dd6a71c88e01 100644 --- a/src/compiler/crystal/macros.cr +++ b/src/compiler/crystal/macros.cr @@ -2213,8 +2213,22 @@ module Crystal::Macros end end - # class Alias < ASTNode - # end + # An `alias` statement. + # + # Every statement `node` is equivalent to: + # + # ``` + # alias {{ node.name }} = {{ node.type }} + # ``` + class Alias < ASTNode + # Returns the name of the alias. + def name : Path + end + + # Returns the name of the type this alias is equivalent to. + def type : ASTNode + end + end # A metaclass in a type expression: `T.class` class Metaclass < ASTNode diff --git a/src/compiler/crystal/macros/methods.cr b/src/compiler/crystal/macros/methods.cr index 39ec31828328..bc41539719e1 100644 --- a/src/compiler/crystal/macros/methods.cr +++ b/src/compiler/crystal/macros/methods.cr @@ -1549,6 +1549,19 @@ module Crystal end end + class Alias + def interpret(method : String, args : Array(ASTNode), named_args : Hash(String, ASTNode)?, block : Crystal::Block?, interpreter : Crystal::MacroInterpreter, name_loc : Location?) + case method + when "name" + interpret_check_args { @name } + when "type" + interpret_check_args { @value } + else + super + end + end + end + class OffsetOf def interpret(method : String, args : Array(ASTNode), named_args : Hash(String, ASTNode)?, block : Crystal::Block?, interpreter : Crystal::MacroInterpreter, name_loc : Location?) case method