Scope context for scope-aware completion resolution.
When present, type resolution uses the scope chain at the cursor position
instead of the flat first-wins name_to_type map.
Extract the trailing node id from a typeIdentifier string.
e.g. t_struct$_PoolKey_$8887_storage_ptr → Some(8887)
t_contract$_IHooks_$2248 → Some(2248)
t_uint256 → None
Find the innermost scope node that contains the given byte position and file.
scope_ranges must be sorted by span size ascending (smallest first).
Returns the node_id of the smallest scope enclosing the position.
Parse the expression chain before the dot into segments.
e.g. poolManager.swap(key, params). → [(“poolManager”, Plain), (“swap”, Call)]
_pools[poolId].fee. → [(“_pools”, Index), (“fee”, Plain)]
msg. → [(“msg”, Plain)]
True when the cursor is in a member-access completion.