Class: Rigor::Environment::ConstantTypeCacheHolder
- Inherits:
-
Object
- Object
- Rigor::Environment::ConstantTypeCacheHolder
- Defined in:
- lib/rigor/environment/constant_type_cache_holder.rb
Overview
Per-key memoization container for #constant_for_name. Held by Rigor::Environment so the otherwise-frozen instance can cache constant-resolution results on first access — the sibling of HktRegistryHolder, generalised from one slot to a name-keyed map.
Why this exists: constant_for_name is a pure function of its name for a given Environment (both the
predefined-constant refinement table and the RBS loader's constant table are fixed for the
Environment's lifetime), yet it is the hottest non-dispatch path on a large Rails app.
ExpressionTyper#resolve_constant_name peels a lexical-candidate ladder per constant reference, so the
same qualified names recur thousands of times across files — and each miss runs a const_get walk
that raises + rescues NameError for every project-defined constant (the common case). Caching the
result collapses the repeats to a hash lookup.
Caches nil results too (a name that resolves to no refined / RBS constant type stays unresolved for
the run), so the const_get-and-rescue is paid at most once per distinct name.
Concurrency: single-threaded use only, the same discipline as HktRegistryHolder — the Ractor pool builds a per-worker Environment and the LSP single-publish invariant serialises the shared-Environment reader path. If a future caller introduces a multi-threaded reader against one Environment, the synchronisation belongs at that caller's seam, not here.
Instance Method Summary collapse
- #fetch(key) ⇒ Object
-
#initialize ⇒ ConstantTypeCacheHolder
constructor
A new instance of ConstantTypeCacheHolder.
Constructor Details
#initialize ⇒ ConstantTypeCacheHolder
Returns a new instance of ConstantTypeCacheHolder.
25 26 27 |
# File 'lib/rigor/environment/constant_type_cache_holder.rb', line 25 def initialize @cache = {} end |
Instance Method Details
#fetch(key) ⇒ Object
29 30 31 32 33 |
# File 'lib/rigor/environment/constant_type_cache_holder.rb', line 29 def fetch(key) return @cache[key] if @cache.key?(key) @cache[key] = yield end |