class Crystal::Macros::TypeNode

Overview

Represents a type in the program, likeInt32 orString.

Defined in:

compiler/crystal/macros.cr

Instance Method Summary

Instance methods inherited from class Crystal::Macros::ASTNode

!=(other : ASTNode) : BoolLiteral !=, ==(other : ASTNode) : BoolLiteral ==, class_name : StringLiteral class_name, column_number : StringLiteral | NilLiteral column_number, doc : StringLiteral doc, doc_comment : MacroId doc_comment, end_column_number : StringLiteral | NilLiteral end_column_number, end_line_number : StringLiteral | NilLiteral end_line_number, filename : StringLiteral | NilLiteral filename, id : MacroId id, is_a?(type : TypeNode) : BoolLiteral is_a?, line_number : StringLiteral | NilLiteral line_number, nil? : BoolLiteral nil?, raise(message) : NoReturn raise, stringify : StringLiteral stringify, symbolize : SymbolLiteral symbolize, warning(message : StringLiteral) : NilLiteral warning

Instance Method Detail

def <(other : TypeNode) : BoolLiteral #

Returnstrue ifother is an ancestor ofself.


def <=(other : TypeNode) : BoolLiteral #

Returnstrue ifself is the same asother or if other is an ancestor ofself.


def >(other : TypeNode) : BoolLiteral #

Returnstrue ifself is an ancestor ofother.


def >=(other : TypeNode) : BoolLiteral #

Returnstrue ifother is the same asself or if self is an ancestor ofother.


def [](key : SymbolLiteral | MacroId) : TypeNode | NilLiteral #

Returns the type for the given key in this named tuple type. Gives a compile error if this is not a named tuple type.


def abstract? : BoolLiteral #

Returnstrue ifself is abstract, otherwisefalse.

module One; end

abstract struct Two; end

class Three; end

abstract class Four; end

{{One.abstract?}}   # => false
{{Two.abstract?}}   # => true
{{Three.abstract?}} # => false
{{Four.abstract?}}  # => true

def all_subclasses : ArrayLiteral(TypeNode) #

Returns all subclasses of this type.


def ancestors : ArrayLiteral(TypeNode) #

Returns all ancestors of this type.


def annotation(type : TypeNode) : Annotation | NilLiteral #

Returns the lastAnnotation with the giventype attached to this type orNilLiteral if there are none.


def annotations(type : TypeNode) : ArrayLiteral(Annotation) #

Returns an array of annotations with the giventype attached to this type, or an emptyArrayLiteral if there are none.


def annotations : ArrayLiteral(Annotation) #

Returns an array of all annotations attached to this type, or an emptyArrayLiteral if there are none.


def class : TypeNode #

Returns the class of this type. With this you can, for example, obtain class methods by invokingtype.class.methods.


def class? : BoolLiteral #

Returnstrue ifself is a#class, otherwisefalse.

module One; end

class Two; end

struct Three; end

{{One.class?}}   # => false
{{Two.class?}}   # => true
{{Three.class?}} # => false

def class_vars : ArrayLiteral(MetaVar) #

Returns the class variables of this type.


def constant(name : StringLiteral | SymbolLiteral | MacroId) : ASTNode #

Returns a constant defined in this type.

If the constant is a constant (likeA = 1), then its value as anASTNode is returned. If the constant is a type, the type is returned as aTypeNode. Otherwise,NilLiteral is returned.


def constants : ArrayLiteral(MacroId) #

Returns the constants and types defined by this type.


def has_constant?(name : StringLiteral | SymbolLiteral) : BoolLiteral #

Returnstrue if this type has a constant. For exampleDEFAULT_OPTIONS (the name you pass to this method is"DEFAULT_OPTIONS" or:DEFAULT_OPTIONS in this cases).


def has_inner_pointers? : BoolLiteral #

Returns whetherself contains any inner pointers.

Primitive types, exceptVoid, are expected to not contain inner pointers. Proc andPointer contain inner pointers. Unions, structs and collection types (tuples, static arrays) have inner pointers if any of their contained types has inner pointers. All other types, including classes, are expected to contain inner pointers.

Types that do not have inner pointers may opt to use atomic allocations, i.e.GC.malloc_atomic rather thanGC.malloc. The compiler ensures that, for any typeT:

  • Pointer(T).malloc is atomic if and only ifT has no inner pointers;
  • T.allocate is atomic if and only ifT is a reference type and ReferenceStorage(T) has no inner pointers.

NOTE Like#instance_vars this method must be called from within a method. The result may be incorrect when used in top-level code.


def has_method?(name : StringLiteral | SymbolLiteral) : BoolLiteral #

Returnstrue if this type has a method. For exampledefault_options (the name you pass to this method is"default_options" or:default_options in this cases).


def includers : ArrayLiteral(TypeNode) #

Returns all the typesself is directly included in.


def instance : TypeNode #

Returns the instance type of this type, if it's a class type, orself otherwise. This is the opposite of#class.


def instance_vars : ArrayLiteral(MetaVar) #

Returns the instance variables of this type. Can only be called from within methods (not top-level code), otherwise will return an empty list.


def keys : ArrayLiteral(MacroId) #

Returns the keys in this named tuple type. Gives a compile error if this is not a named tuple type.


def methods : ArrayLiteral(Def) #

Returns the instance methods defined by this type, without including inherited methods.


def module? : BoolLiteral #

Returnstrue ifself is amodule, otherwisefalse.

module One; end

class Two; end

struct Three; end

{{One.module?}}   # => true
{{Two.module?}}   # => false
{{Three.module?}} # => false

def name(*, generic_args : BoolLiteral = true) : MacroId #

Returns the fully qualified name of this type. Optionally withoutgeneric_args ifself is a generic type; see#type_vars.

class Foo(T); end

module Bar::Baz; end

{{Bar::Baz.name}}                 # => Bar::Baz
{{Foo.name}}                      # => Foo(T)
{{Foo.name(generic_args: false)}} # => Foo

def nilable? : BoolLiteral #

Returnstrue ifnil is an instance ofself, otherwisefalse.

{{String.nilable?}}                   # => false
{{String?.nilable?}}                  # => true
{{Union(String, Bool, Nil).nilable?}} # => true
{{NoReturn.nilable?}}                 # => false
{{Value.nilable?}}                    # => true

def overrides?(type : TypeNode, method : StringLiteral | SymbolLiteral | MacroId) : BoolLiteral #

Determines ifself overrides any method namedmethod from typetype.

class Foo
  def one
    1
  end

  def two
    2
  end
end

class Bar < Foo
  def one
    11
  end
end

{{ Bar.overrides?(Foo, "one") }} # => true
{{ Bar.overrides?(Foo, "two") }} # => false

def private? : BoolLiteral #

Returntrue ifself is private andfalse otherwise.


def public? : BoolLiteral #

Returntrue ifself is public andfalse otherwise.


def resolve : TypeNode #

Returnsself. This method exists so you can safely call#resolve on a node and resolve it to a type, even if it's a type already.


def resolve? : TypeNode #

Returnsself. This method exists so you can safely call#resolve on a node and resolve it to a type, even if it's a type already.


def size : NumberLiteral #

Returns the number of elements in this tuple type or tuple metaclass type. Gives a compile error if this is not one of those types.


def struct? : BoolLiteral #

Returnstrue ifself is astruct, otherwisefalse.

module One; end

class Two; end

struct Three; end

{{One.struct?}}   # => false
{{Two.struct?}}   # => false
{{Three.struct?}} # => true

def subclasses : ArrayLiteral(TypeNode) #

Returns the direct subclasses of this type.


def superclass : TypeNode | NilLiteral #

Returns the direct superclass of this type.


def type_vars : ArrayLiteral(TypeNode) #

Returns the type variables of the generic type. If the type is not generic, an empty array is returned.


def union? : BoolLiteral #

Returnstrue ifself is a union type, otherwisefalse.

See also:#union_types.

{{String.union?}}              # => false
{{String?.union?}}             # => true
{{Union(String, Bool).union?}} # => true

def union_types : ArrayLiteral(TypeNode) #

Returns the types forming a union type, if this is a union type. Otherwise returns this single type inside an array literal (so you can safely call#union_types on any type and treat all types uniformly).

See also:#union?.


def visibility : SymbolLiteral #

Returns visibility ofself as:public or:private?