class
Crystal::MatchContext
Overview
Context information about a method lookup match.
For example, given:
class Foo
class Baz
end
def method
Baz.new
end
end
class Bar < Foo
class Baz
end
end
Bar.new.method # => #<Foo::Baz:0x10c1a2fc0>
we have that:
#defining_typeisFoo, because it's the type that define the method#instantiated_typeisBar, because the method was invoked, and thus instantiated there
#defining_type is needed because when we search types in method,
we must search them starting from Foo, not from Bar.
#instantiated_type is needed because method resolution will start
from Bar.
TODO this might slightly change in the future, we should probably instantiate
the method on Foo+ to avoid having duplicated methods, at least for reference
types, even though that might lead to broader method resolutions (because
a method call in method will now be searched in Foo+, not in Bar)
Defined in:
compiler/crystal/semantic/match.crConstructors
Instance Method Summary
- #bind_free_var(name, type)
- #bound_free_var?(name)
-
#bound_free_vars : Hash(String, TypeVar) | Nil
Any instance variables associated with the method instantiation
- #clone
-
#def_free_vars : Array(String) | Nil
Def free variables (`def ...
-
#def_free_vars=(def_free_vars : Array(String) | Nil)
Def free variables (`def ...
-
#defining_type : Type
The type that defines the method
-
#defining_type=(defining_type : Type)
The type that defines the method
- #has_unbound_free_var?(name)
-
#instantiated_type : Type
The type where the method was instantiated
-
#instantiated_type=(instantiated_type : Type)
The type where the method was instantiated
-
#self_restriction_type : Type | Nil
The type that represents
self(overriding#instantiated_type), used to resolve restrictions properly when a macro def is about to be copied to a subtype -
#self_restriction_type=(self_restriction_type : Type | Nil)
The type that represents
self(overriding#instantiated_type), used to resolve restrictions properly when a macro def is about to be copied to a subtype -
#self_type : Type
Returns the type that corresponds to using
selfwhen looking a type relative to this context.
Instance methods inherited from class Reference
==(other : self)==(other : JSON::Any)
==(other : YAML::Any)
==(other) ==, dup dup, hash(hasher) hash, initialize initialize, inspect(io : IO) : Nil inspect, object_id : UInt64 object_id, pretty_print(pp) : Nil pretty_print, same?(other : Reference) : Bool
same?(other : Nil) same?, to_s(io : IO) : Nil to_s
Constructor methods inherited from class Reference
new
new,
unsafe_construct(address : Pointer, *args, **opts) : self
unsafe_construct
Class methods inherited from class Reference
pre_initialize(address : Pointer)
pre_initialize
Instance methods inherited from class Object
! : Bool
!,
!=(other)
!=,
!~(other)
!~,
==(other)
==,
===(other : JSON::Any)===(other : YAML::Any)
===(other) ===, =~(other) =~, as(type : Class) as, as?(type : Class) as?, class class, dup dup, hash(hasher)
hash hash, in?(collection : Object) : Bool
in?(*values : Object) : Bool in?, inspect(io : IO) : Nil
inspect : String inspect, is_a?(type : Class) : Bool is_a?, itself itself, nil? : Bool nil?, not_nil!(message)
not_nil! not_nil!, pretty_inspect(width = 79, newline = "\n", indent = 0) : String pretty_inspect, pretty_print(pp : PrettyPrint) : Nil pretty_print, responds_to?(name : Symbol) : Bool responds_to?, tap(&) tap, to_json(io : IO) : Nil
to_json : String to_json, to_pretty_json(indent : String = " ") : String
to_pretty_json(io : IO, indent : String = " ") : Nil to_pretty_json, to_s(io : IO) : Nil
to_s : String to_s, to_yaml(io : IO) : Nil
to_yaml : String to_yaml, try(&) try, unsafe_as(type : T.class) forall T unsafe_as
Class methods inherited from class Object
from_json(string_or_io : String | IO, root : String)from_json(string_or_io : String | IO) from_json, from_yaml(string_or_io : String | IO) from_yaml
Macros inherited from class Object
class_getter(*names, &block)
class_getter,
class_getter!(*names)
class_getter!,
class_getter?(*names, &block)
class_getter?,
class_property(*names, &block)
class_property,
class_property!(*names)
class_property!,
class_property?(*names, &block)
class_property?,
class_setter(*names)
class_setter,
def_clone
def_clone,
def_equals(*fields)
def_equals,
def_equals_and_hash(*fields)
def_equals_and_hash,
def_hash(*fields)
def_hash,
delegate(*methods, to object)
delegate,
forward_missing_to(delegate)
forward_missing_to,
getter(*names, &block)
getter,
getter!(*names)
getter!,
getter?(*names, &block)
getter?,
property(*names, &block)
property,
property!(*names)
property!,
property?(*names, &block)
property?,
setter(*names)
setter
Constructor Detail
Instance Method Detail
Any instance variables associated with the method instantiation
Def free variables (def ... forall X, Y)
The type where the method was instantiated
The type that represents self (overriding #instantiated_type), used to
resolve restrictions properly when a macro def is about to be copied to a
subtype
The type that represents self (overriding #instantiated_type), used to
resolve restrictions properly when a macro def is about to be copied to a
subtype
Returns the type that corresponds to using self when looking
a type relative to this context.
For example, given:
class Foo
def foo(&block : self ->)
...
end
end
class Bar < Foo
end
Bar.new.foo { |x| }
it's expected that the block argument x will be of type Bar, not Foo.