abstract class Savi::Compiler::Infer::Phi

Overview

TODO add some kind of logic for analyzing exhausted choices, as well as necessary/sufficient conditions for each branch to be in play letting us better specialize the codegen later by eliminating impossible branches in particular reifications of this type or function.

Direct Known Subclasses

Defined in:

savi/compiler/infer/info.cr

Constructors

Instance Method Summary

Instance methods inherited from class Savi::Compiler::Infer::DynamicInfo

add_downstream(use_pos : Source::Pos, info : Info) add_downstream, adds_alias adds_alias, after_add_downstream(use_pos : Source::Pos, info : Info) after_add_downstream, describe_downstream_constraints(ctx : Context, type_check : TypeCheck::ForReifiedFunc) describe_downstream_constraints, describe_kind : String describe_kind, described_kind described_kind, downstream_tethers(querent : Info) : Array(Tether) downstream_tethers, downstream_use_pos downstream_use_pos, downstreams_each downstreams_each, downstreams_empty? downstreams_empty?, list_downstream_constraints(ctx : Context, type_check : TypeCheck::ForReifiedFunc) list_downstream_constraints, tether_constraint_spans(ctx : Context, infer : Visitor) tether_constraint_spans, tethers(querent : Info) : Array(Tether) tethers, this_would_be_possible_if : Tuple(Source::Pos, String) | Nil this_would_be_possible_if, this_would_be_possible_if=(this_would_be_possible_if : Tuple(Source::Pos, String) | Nil) this_would_be_possible_if=, total_downstream_constraint(ctx : Context, type_check : TypeCheck::ForReifiedFunc) total_downstream_constraint

Instance methods inherited from class Savi::Compiler::Infer::Info

add_downstream(use_pos : Source::Pos, info : Info) add_downstream, add_peer_hint(peer : Info) add_peer_hint, as_conduit? : Conduit | Nil as_conduit?, as_downstream_constraint_meta_type(ctx : Context, type_check : TypeCheck::ForReifiedFunc) : MetaType | Nil as_downstream_constraint_meta_type, as_multiple_downstream_constraints(ctx : Context, type_check : TypeCheck::ForReifiedFunc) : Array(Tuple(Source::Pos, MetaType)) | Nil as_multiple_downstream_constraints, as_upstream_conduits : Array(Conduit) as_upstream_conduits, layer_index : Int32 layer_index, layer_index=(layer_index : Int32) layer_index=, layer_index? : Int32 | Nil layer_index?, override_describe_kind : String | Nil override_describe_kind, override_describe_kind=(override_describe_kind : String | Nil) override_describe_kind=, pos : Source::Pos pos, pos=(pos : Source::Pos) pos=, resolve_span!(ctx : Context, infer : Visitor) resolve_span!, tether_resolve_span(ctx : Context, infer : Visitor) tether_resolve_span, tether_terminal? tether_terminal?, tether_upward_transform_span(ctx : Context, infer : Visitor, span : Span) : Span tether_upward_transform_span, tethers(querent : Info) : Array(Tether) tethers, to_s to_s

Constructor Detail

def self.new(pos, layer_index, branches : Array(Tuple(Savi::Compiler::Infer::Info | Nil, Savi::Compiler::Infer::Info, Bool)), fixed_bool : Savi::Compiler::Infer::Info) #

[View source]

Instance Method Detail

def as_conduit? : Conduit | Nil #

[View source]
def as_downstream_constraint_meta_type(ctx : Context, type_check : TypeCheck::ForReifiedFunc) : MetaType #
Description copied from class Savi::Compiler::Infer::Info

In the rare case that an Info subclass needs to dynamically pretend to be a different downstream constraint, it can override this method. If you need to report multiple positions, also override the other method below called as_multiple_downstream_constraints. This will prevent upstream DynamicInfos from eagerly resolving you.


[View source]
def as_multiple_downstream_constraints(ctx : Context, type_check : TypeCheck::ForReifiedFunc) : Array(Tuple(Source::Pos, MetaType)) | Nil #
Description copied from class Savi::Compiler::Infer::Info

In the rare case that an Info subclass needs to dynamically pretend to be multiple different downstream constraints, it can override this method. This is only used to report positions in more detail, and it is expected that the intersection of all MetaTypes here is the same as the resolve.


[View source]
def branches : Array(Tuple(Info | Nil, Info, Bool)) #

[View source]
def describe_kind : String #
Description copied from class Savi::Compiler::Infer::DynamicInfo

Must be implemented by the child class as an required hook.


[View source]
def fixed_bool : Info #

[View source]
def tether_upward_transform_span(ctx : Context, infer : Visitor, span : Span) : Span #

[View source]