from dataclasses import dataclass from enum import Enum, auto from typing import ClassVar, DefaultDict from .location import Range from .tokenize import BaseToken class ContextType(Enum): Use = auto() Assign = auto() Declare = auto() Unbind = auto() @dataclass(frozen=True) class Context: lookup: ClassVar[dict[ContextType, list["Context"]]] = {} typ: ContextType token: list[BaseToken] def __post_init__(self): type(self).lookup.setdefault(self.typ, []) type(self).lookup[self.typ].append(self) @property def range(self) -> Range: new_range = self.token[0].range for token in self.token[1:]: new_range += token.range return new_range