class Steep::TypeInference::ConstantEnv

def initialize(builder:, context:)

Any namespace is a module or class.
ConstantEnv receives an optional Names::Module, not a Namespace, because this is a simulation of Ruby.
def initialize(builder:, context:)
  @cache = {}
  @builder = builder
  @context = context
end

def lookup(name)

def lookup(name)
  cache[name] ||= lookup0(name, namespace: namespace)
end

def lookup0(name, namespace:)

@type method lookup0: (Names::Module, namespace: AST::Namespace) -> Type
def lookup0(name, namespace:)
  full_name = name.in_namespace(namespace)
  case
  when signatures.module_name?(full_name)
    AST::Types::Name::Module.new(name: full_name)
  when signatures.class_name?(full_name)
    AST::Types::Name::Class.new(name: full_name, constructor: true)
  when signatures.const_name?(full_name)
    builder.absolute_type(signatures.find_const(name, current_module: namespace).type,
                          current: namespace)
  else
    unless namespace.empty?
      lookup0(name, namespace: namespace.parent)
    end
  end
end

def namespace

def namespace
  @namespace ||= if context
                   context.namespace.append(context.name)
                 else
                   AST::Namespace.root
                 end
end

def signatures

def signatures
  builder.signatures
end