33 lines
735 B
Python
33 lines
735 B
Python
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
|