abstract class Crystal::Macros::ASTNode

Overview

This is the base class of all AST nodes. This methods are available to all AST nodes.

Direct Known Subclasses

Defined in:

compiler/crystal/macros.cr

Instance Method Summary

Instance Method Detail

def !=(other : ASTNode) : BoolLiteral #

Returns true if this node's textual representation is not the same as the other node.


[View source]
def ==(other : ASTNode) : BoolLiteral #

Returns true if this node's textual representation is the same as the other node.


[View source]
def class_name : StringLiteral #

Returns a StringLiteral that contains this node's name.

macro test
  {{ "foo".class_name }}
end

puts test # => prints StringLiteral

[View source]
def column_number : StringLiteral | NilLiteral #

Returns the column number where this node begins. Might return nil if the location is not known.

The first column number in a line is 1.


[View source]
def doc : StringLiteral #

Returns a StringLiteral that contains the documentation comments attached to this node, or an empty string if there are none.

WARNING The return value will be an empty string when executed outside of the crystal docs command.


[View source]
def doc_comment : MacroId #

Returns a MacroId that contains the documentation comments attached to this node, or an empty MacroId if there are none. Each line is prefixed with a # character to allow the output to be used directly within another node's documentation comment.

A common use case is combining this method with the @caller macro instance variable in order to allow merging macro expansion and call comments.

WARNING The return value will be empty when executed outside of the crystal docs command.


[View source]
def end_column_number : StringLiteral | NilLiteral #

Returns the column number where this node ends. Might return nil if the location is not known.

The first column number in a line is 1.


[View source]
def end_line_number : StringLiteral | NilLiteral #

Returns the line number where this node ends. Might return nil if the location is not known.

The first line number in a file is 1.


[View source]
def filename : StringLiteral | NilLiteral #

Returns the filename where this node is located. Might return nil if the location is not known.


[View source]
def id : MacroId #

Returns this node as a MacroId. Useful when you need an identifier out of a StringLiteral, SymbolLiteral, Var or Call.

macro define_method(name, content)
  def {{name.id}}
    {{content}}
  end
end

define_method :foo, 1
define_method "bar", 2
define_method baz, 3

puts foo # => prints 1
puts bar # => prints 2
puts baz # => prints 3

[View source]
def is_a?(type : TypeNode) : BoolLiteral #

Returns true if this node's type is the given type or any of its subclasses.

type always refers to an AST node type, never a type in the program.

{{ 1.is_a?(NumberLiteral) }} # => true
{{ 1.is_a?(BoolLiteral) }}   # => false
{{ 1.is_a?(ASTNode) }}       # => true
{{ 1.is_a?(Int32) }}         # => false

NOTE This is a pseudo-method provided directly by the Crystal compiler. It cannot be redefined nor overridden.


[View source]
def line_number : StringLiteral | NilLiteral #

Returns the line number where this node begins. Might return nil if the location is not known.

The first line number in a file is 1.


[View source]
def nil? : BoolLiteral #

Returns true if this node is a NilLiteral or Nop.

NOTE This is a pseudo-method provided directly by the Crystal compiler. It cannot be redefined nor overridden.


[View source]
def raise(message) : NoReturn #

Gives a compile-time error with the given message. This will highlight this node in the error message.


[View source]
def stringify : StringLiteral #

Returns a StringLiteral that contains this node's textual representation. Note that invoking stringify on a string literal will return a StringLiteral that contains a string literal.

macro test
  {{ "foo".stringify }}
end

puts test # prints "foo" (including the double quotes)

[View source]
def symbolize : SymbolLiteral #

Returns a SymbolLiteral that contains this node's textual representation.

{{ "foo".id.symbolize }} # => :foo

[View source]
def warning(message : StringLiteral) : NilLiteral #

Emits a compile-time warning with the given message. This will highlight this node in the warning message.


[View source]