| 252 | |
| 253 | @dataclass(slots=True, frozen=True) |
| 254 | class Token: |
| 255 | filename: str |
| 256 | kind: str |
| 257 | text: str |
| 258 | begin: tuple[int, int] |
| 259 | end: tuple[int, int] |
| 260 | |
| 261 | @property |
| 262 | def line(self) -> int: |
| 263 | return self.begin[0] |
| 264 | |
| 265 | @property |
| 266 | def column(self) -> int: |
| 267 | return self.begin[1] |
| 268 | |
| 269 | @property |
| 270 | def end_line(self) -> int: |
| 271 | return self.end[0] |
| 272 | |
| 273 | @property |
| 274 | def end_column(self) -> int: |
| 275 | return self.end[1] |
| 276 | |
| 277 | @property |
| 278 | def width(self) -> int: |
| 279 | return self.end[1] - self.begin[1] |
| 280 | |
| 281 | def replaceText(self, txt: str) -> "Token": |
| 282 | assert isinstance(txt, str) |
| 283 | return Token(self.filename, self.kind, txt, self.begin, self.end) |
| 284 | |
| 285 | def __repr__(self) -> str: |
| 286 | b0, b1 = self.begin |
| 287 | e0, e1 = self.end |
| 288 | if b0 == e0: |
| 289 | return f"{self.kind}({self.text!r}, {b0}:{b1}:{e1})" |
| 290 | else: |
| 291 | return f"{self.kind}({self.text!r}, {b0}:{b1}, {e0}:{e1})" |
| 292 | |
| 293 | |
| 294 | def tokenize(src: str, line: int = 1, filename: str = "") -> Iterator[Token]: |
no outgoing calls
no test coverage detected
searching dependent graphs…