class Crystal::Macros::TypeNode
inherits Crystal::Macros::ASTNode
¶
Represents a type in the program, like Int32
or String
.
Methods¶
#<=(other : TypeNode) : BoolLiteral
¶
(other : TypeNode) : BoolLiteral
Returns true
if self
is the same as other or if
other is an ancestor of self
.
#>=(other : TypeNode) : BoolLiteral
¶
(other : TypeNode) : BoolLiteral
Returns true
if other is the same as self
or if
self
is an ancestor of other.
#[](key : SymbolLiteral | MacroId) : TypeNode | NilLiteral
¶
(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.
#abstract? : BoolLiteral
¶
: BoolLiteral
Returns true
if self
is abstract, otherwise false
.
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
#annotation(type : TypeNode) : Annotation | NilLiteral
¶
(type : TypeNode) : Annotation | NilLiteral
Returns the last Annotation
with the given type
attached to this variable or NilLiteral
if there are none.
#annotations(type : TypeNode) : ArrayLiteral(Annotation)
¶
(type : TypeNode) : ArrayLiteral(Annotation)
Returns an array of annotations with the given type
attached to this variable, or an empty ArrayLiteral
if there are none.
#class : TypeNode
¶
: TypeNode
Returns the class of this type. With this you can, for example, obtain class
methods by invoking type.class.methods
.
#class? : BoolLiteral
¶
: BoolLiteral
Returns true
if self
is a class
, otherwise false
.
module One; end
class Two; end
struct Three; end
{{One.class?}} # => false
{{Two.class?}} # => true
{{Three.class?}} # => false
#constant(name : StringLiteral | SymbolLiteral | MacroId) : ASTNode
¶
(name : StringLiteral | SymbolLiteral | MacroId) : ASTNode
Returns a constant defined in this type.
If the constant is a constant (like A = 1
), then its value
as an ASTNode
is returned. If the constant is a type, the
type is returned as a TypeNode
. Otherwise, NilLiteral
is returned.
#constants : ArrayLiteral(MacroId)
¶
: ArrayLiteral(MacroId)
Returns the constants and types defined by this type.
#has_constant?(name : StringLiteral | SymbolLiteral) : BoolLiteral
¶
(name : StringLiteral | SymbolLiteral) : BoolLiteral
Returns true
if this type has a constant. For example DEFAULT_OPTIONS
(the name you pass to this method is "DEFAULT_OPTIONS"
or :DEFAULT_OPTIONS
in this cases).
#has_method?(name : StringLiteral | SymbolLiteral) : BoolLiteral
¶
(name : StringLiteral | SymbolLiteral) : BoolLiteral
Returns true
if this type has a method. For example default_options
(the name you pass to this method is "default_options"
or :default_options
in this cases).
#includers : ArrayLiteral(TypeNode)
¶
: ArrayLiteral(TypeNode)
Returns all the types self
is directly included in.
#instance : TypeNode
¶
: TypeNode
Returns the instance type of this type, if it's a class type,
or self
otherwise. This is the opposite of #class
.
#keys : ArrayLiteral(MacroId)
¶
: ArrayLiteral(MacroId)
Returns the keys in this named tuple type. Gives a compile error if this is not a named tuple type.
#methods : ArrayLiteral(Def)
¶
: ArrayLiteral(Def)
Returns the instance methods defined by this type, without including inherited methods.
#module? : BoolLiteral
¶
: BoolLiteral
Returns true
if self
is a module
, otherwise false
.
module One; end
class Two; end
struct Three; end
{{One.module?}} # => true
{{Two.module?}} # => false
{{Three.module?}} # => false
#name(*, generic_args : BoolLiteral = true) : MacroId
¶
(*, generic_args : BoolLiteral = true) : MacroId
Returns the fully qualified name of this type. Optionally without generic_args if self
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
#nilable? : BoolLiteral
¶
: BoolLiteral
Returns true
if self
is nilable (if it has Nil
amongst its types), otherwise false
.
{{String.nilable?}} # => false
{{String?.nilable?}} # => true
{{Union(String, Bool, Nil).nilable?}} # => true
#overrides?(type : TypeNode, method : StringLiteral | SymbolLiteral | MacroId) : Bool
¶
(type : TypeNode, method : StringLiteral | SymbolLiteral | MacroId) : Bool
Determines if self
overrides any method named method from type type.
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
#resolve : TypeNode
¶
: TypeNode
Returns self
. 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.
#resolve? : TypeNode
¶
: TypeNode
Returns self
. 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.
#size : NumberLiteral
¶
: 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.
#struct? : BoolLiteral
¶
: BoolLiteral
Returns true
if self
is a struct
, otherwise false
.
module One; end
class Two; end
struct Three; end
{{One.struct?}} # => false
{{Two.struct?}} # => false
{{Three.struct?}} # => true
#type_vars : ArrayLiteral(TypeNode)
¶
: ArrayLiteral(TypeNode)
Returns the type variables of the generic type. If the type is not generic, an empty array is returned.
#union? : BoolLiteral
¶
: BoolLiteral
Returns true
if self
is a union type, otherwise false
.
See also: #union_types
.
{{String.union?}} # => false
{{String?.union?}} # => true
{{Union(String, Bool).union?}} # => true
#union_types : ArrayLiteral(TypeNode)
¶
: 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?
.