# 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

- Crystal::Macros::Alias
- Crystal::Macros::Annotation
- Crystal::Macros::AnnotationDef
- Crystal::Macros::Arg
- Crystal::Macros::ArrayLiteral
- Crystal::Macros::Asm
- Crystal::Macros::AsmOperand
- Crystal::Macros::Assign
- Crystal::Macros::BinaryOp
- Crystal::Macros::Block
- Crystal::Macros::BoolLiteral
- Crystal::Macros::Call
- Crystal::Macros::Case
- Crystal::Macros::Cast
- Crystal::Macros::CharLiteral
- Crystal::Macros::ClassDef
- Crystal::Macros::ClassVar
- Crystal::Macros::ControlExpression
- Crystal::Macros::CStructOrUnionDef
- Crystal::Macros::Def
- Crystal::Macros::EnumDef
- Crystal::Macros::ExceptionHandler
- Crystal::Macros::Expressions
- Crystal::Macros::Extend
- Crystal::Macros::ExternalVar
- Crystal::Macros::FunDef
- Crystal::Macros::Generic
- Crystal::Macros::Global
- Crystal::Macros::HashLiteral
- Crystal::Macros::If
- Crystal::Macros::ImplicitObj
- Crystal::Macros::Include
- Crystal::Macros::InstanceVar
- Crystal::Macros::IsA
- Crystal::Macros::LibDef
- Crystal::Macros::Macro
- Crystal::Macros::MacroExpression
- Crystal::Macros::MacroFor
- Crystal::Macros::MacroId
- Crystal::Macros::MacroIf
- Crystal::Macros::MacroLiteral
- Crystal::Macros::MacroVar
- Crystal::Macros::MagicConstant
- Crystal::Macros::Metaclass
- Crystal::Macros::MetaVar
- Crystal::Macros::ModuleDef
- Crystal::Macros::MultiAssign
- Crystal::Macros::NamedArgument
- Crystal::Macros::NamedTupleLiteral
- Crystal::Macros::NilableCast
- Crystal::Macros::NilLiteral
- Crystal::Macros::Nop
- Crystal::Macros::NumberLiteral
- Crystal::Macros::OffsetOf
- Crystal::Macros::Path
- Crystal::Macros::Primitive
- Crystal::Macros::ProcLiteral
- Crystal::Macros::ProcNotation
- Crystal::Macros::ProcPointer
- Crystal::Macros::RangeLiteral
- Crystal::Macros::ReadInstanceVar
- Crystal::Macros::RegexLiteral
- Crystal::Macros::Require
- Crystal::Macros::Rescue
- Crystal::Macros::RespondsTo
- Crystal::Macros::Select
- Crystal::Macros::Self
- Crystal::Macros::StringInterpolation
- Crystal::Macros::StringLiteral
- Crystal::Macros::SymbolLiteral
- Crystal::Macros::TupleLiteral
- Crystal::Macros::TypeDeclaration
- Crystal::Macros::TypeDef
- Crystal::Macros::TypeNode
- Crystal::Macros::TypeOf
- Crystal::Macros::UnaryExpression
- Crystal::Macros::Underscore
- Crystal::Macros::UninitializedVar
- Crystal::Macros::Union
- Crystal::Macros::Var
- Crystal::Macros::VisibilityModifier
- Crystal::Macros::When
- Crystal::Macros::While
- Crystal::Macros::Yield

##
Defined in:

compiler/crystal/macros.cr

##
Instance Method Summary

- #!=(other : ASTNode) : BoolLiteral

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

- #==(other : ASTNode) : BoolLiteral

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

- #class_name : StringLiteral

  Returns a `StringLiteral` that contains this node's name.

- #column_number : StringLiteral | NilLiteral

  Returns the column number where this node begins.

- #doc : StringLiteral

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

- #doc_comment : MacroId

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

- #end_column_number : StringLiteral | NilLiteral

  Returns the column number where this node ends.

- #end_line_number : StringLiteral | NilLiteral

  Returns the line number where this node ends.

- #filename : StringLiteral | NilLiteral

  Returns the filename where this node is located.

- #id : MacroId

  Returns this node as a `MacroId`.

- #is_a?(type : TypeNode) : BoolLiteral

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

- #line_number : StringLiteral | NilLiteral

  Returns the line number where this node begins.

- #nil? : BoolLiteral

  Returns `true` if this node is a `NilLiteral` or `Nop`.

- #raise(message) : NoReturn

  Gives a compile-time error with the given message.

- #stringify : StringLiteral

  Returns a `StringLiteral` that contains this node's textual representation.

- #symbolize : SymbolLiteral

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

- #warning(message : StringLiteral) : NilLiteral

  Emits a compile-time warning with the given message.

##
Instance Method Detail

def !=(other : ASTNode) : BoolLiteral #

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

def ==(other : ASTNode) : BoolLiteral #

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

def class_name : StringLiteral #

Returns a `StringLiteral` that contains this node's name.

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

    puts test # => prints StringLiteral

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`.

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.

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.

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`.

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`.

def filename : StringLiteral | NilLiteral #

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

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

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.

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.

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.

def raise(message) : NoReturn #

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

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)

def symbolize : SymbolLiteral #

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

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

def warning(message : StringLiteral) : NilLiteral #

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