Class: Yoda::Model::Environment

Inherits:
Object
  • Object
show all
Defined in:
lib/yoda/model/environment.rb,
lib/yoda/model/environment/with_cache.rb,
lib/yoda/model/environment/value_factory.rb,
lib/yoda/model/environment/instance_accessor.rb,
lib/yoda/model/environment/namespace_members.rb,
lib/yoda/model/environment/accessor_interface.rb,
lib/yoda/model/environment/singleton_accessor.rb,
lib/yoda/model/environment/value_resolve_context.rb

Overview

Environment can resolve constants from type expressions.

Defined Under Namespace

Modules: AccessorInterface, WithCache Classes: InstanceAccessor, NamespaceMembers, SingletonAccessor, ValueFactory, ValueResolveContext

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(registry:, rbs_environment:) ⇒ Environment

Returns a new instance of Environment.

Parameters:



39
40
41
42
# File 'lib/yoda/model/environment.rb', line 39

def initialize(registry:, rbs_environment:)
  @registry = registry
  @rbs_environment = rbs_environment
end

Instance Attribute Details

#rbs_environment ⇒ RBS::Environment (readonly)

Returns:

  • (RBS::Environment)


35
36
37
# File 'lib/yoda/model/environment.rb', line 35

def rbs_environment
  @rbs_environment
end

#registry ⇒ Store::Registry::ProjectRegistry (readonly)



32
33
34
# File 'lib/yoda/model/environment.rb', line 32

def registry
  @registry
end

Class Method Details

.build(registry: nil, rbs_environment: nil) ⇒ Environment

Parameters:

Returns:



24
25
26
27
28
29
# File 'lib/yoda/model/environment.rb', line 24

def self.build(registry: nil, rbs_environment: nil)
  # TODO: Allow to make registry parameter empty
  registry ||= Yoda::Store::Project.temporal.registry
  rbs_environment ||= RBS::Environment.new
  new(registry: registry, rbs_environment: rbs_environment)
end

.from_project(project) ⇒ Object

Parameters:



17
18
19
# File 'lib/yoda/model/environment.rb', line 17

def self.from_project(project)
  new(registry: project.registry, rbs_environment: project.rbs_environment)
end

Instance Method Details

#pretty_print(pp) ⇒ Object

Parameters:

  • pp (PP)


98
99
100
101
102
103
104
105
106
107
# File 'lib/yoda/model/environment.rb', line 98

def pretty_print(pp)
  pp.object_group(self) do
    pp.breakable
    pp.text "@rbs_environment="
    pp.pp rbs_environment
    pp.comma_breakable
    pp.text "@registry="
    pp.pp registry
  end
end

#resolve_constant(key) ⇒ Store::Objects::Base?

Parameters:

Returns:



69
70
71
# File 'lib/yoda/model/environment.rb', line 69

def resolve_constant(key)
  Store::Query::FindConstant.new(registry).find(key)&.with_connection(registry: registry)
end

#resolve_rbs_class_decl(type_name) ⇒ Object

Parameters:

  • type_name (RBS::TypeName)
  • return (RBS::AST::Declarations::Class, nil)


81
82
83
# File 'lib/yoda/model/environment.rb', line 81

def resolve_rbs_class_decl(type_name)
  rbs_environment.class_decls[type_name]
end

#resolve_rbs_constant_decl(type_name) ⇒ Object

Parameters:

  • type_name (RBS::TypeName)
  • return (RBS::AST::Declarations::Constant, nil)


93
94
95
# File 'lib/yoda/model/environment.rb', line 93

def resolve_rbs_constant_decl(type_name)
  environment.rbs_environment.constant_decls[type_name]&.decl
end

#resolve_rbs_interface_decl(type_name) ⇒ Object

Parameters:

  • type_name (RBS::TypeName)
  • return (RBS::AST::Declarations::Interface, nil)


87
88
89
# File 'lib/yoda/model/environment.rb', line 87

def resolve_rbs_interface_decl(type_name)
  rbs_environment.interface_decls[type_name]&.decl
end

#resolve_rbs_type(type_expression) ⇒ RBS::Types::Bases::Base, ...

Parameters:

  • type_expression (TypeExpression)

Returns:

  • (RBS::Types::Bases::Base, RBS::Types::Variable, RBS::Types::ClassSingleton, RBS::Types::Interface, RBS::Types::ClassInstance, RBS::Types::Alias, RBS::Types::Tuple, RBS::Types::Record, RBS::Types::Optional, RBS::Types::Union, RBS::Types::Intersection, RBS::Types::Function, RBS::Types::Block, RBS::Types::Proc, RBS::Types::Literal)


52
53
54
# File 'lib/yoda/model/environment.rb', line 52

def resolve_rbs_type(type_expression)
  type_expression.to_rbs_type(self)
end

#resolve_rbs_type_name(path) ⇒ RBS::TypeName?

Return RBS::TypeName for the instance of the given path.

Parameters:

Returns:

  • (RBS::TypeName, nil)


59
60
61
62
63
64
65
# File 'lib/yoda/model/environment.rb', line 59

def resolve_rbs_type_name(path)
  scoped_path = ScopedPath.build(path)
  # TODO: ask both registry in lexical priority
  object = resolve_constant(scoped_path)
  return TypeName(object.path).absolute! if object
  rbs_type_name_resolver.resolve(TypeName(scoped_path.path.to_s), context: scoped_path.lexical_context.to_rbs_context)
end

#resolve_singleton_class(key) ⇒ Store::Objects::MetaClassObject?

Parameters:

Returns:



75
76
77
# File 'lib/yoda/model/environment.rb', line 75

def resolve_singleton_class(key)
  Store::Query::FindMetaClass.new(registry).find(key)&.with_connection(registry: registry)
end

#resolve_value_by_rbs_type(rbs_type) ⇒ Values::Base?

Parameters:

  • rbs_type (RBS::Types::Bases::Base, RBS::Types::Variable, RBS::Types::ClassSingleton, RBS::Types::Interface, RBS::Types::ClassInstance, RBS::Types::Alias, RBS::Types::Tuple, RBS::Types::Record, RBS::Types::Optional, RBS::Types::Union, RBS::Types::Intersection, RBS::Types::Function, RBS::Types::Block, RBS::Types::Proc, RBS::Types::Literal)

Returns:



46
47
48
# File 'lib/yoda/model/environment.rb', line 46

def resolve_value_by_rbs_type(rbs_type)
  ValueFactory.from_environment(self).resolve_value_by_rbs_type(rbs_type)
end