| 251 | |
| 252 | |
| 253 | class ParsedItem(namedtuple('ParsedItem', 'file kind parent name data')): |
| 254 | |
| 255 | @classmethod |
| 256 | def from_raw(cls, raw): |
| 257 | if isinstance(raw, cls): |
| 258 | return raw |
| 259 | elif isinstance(raw, tuple): |
| 260 | return cls(*raw) |
| 261 | else: |
| 262 | raise TypeError(f'unsupported "raw": {raw:!r}') |
| 263 | |
| 264 | @classmethod |
| 265 | def from_row(cls, row, columns=None): |
| 266 | if not columns: |
| 267 | colnames = 'filename funcname name kind data'.split() |
| 268 | else: |
| 269 | colnames = list(columns) |
| 270 | for i, column in enumerate(colnames): |
| 271 | if column == 'file': |
| 272 | colnames[i] = 'filename' |
| 273 | elif column == 'funcname': |
| 274 | colnames[i] = 'parent' |
| 275 | if len(row) != len(set(colnames)): |
| 276 | raise NotImplementedError(columns, row) |
| 277 | kwargs = {} |
| 278 | for column, value in zip(colnames, row): |
| 279 | if column == 'filename': |
| 280 | kwargs['file'] = FileInfo.from_raw(value) |
| 281 | elif column == 'kind': |
| 282 | kwargs['kind'] = KIND(value) |
| 283 | elif column in cls._fields: |
| 284 | kwargs[column] = value |
| 285 | else: |
| 286 | raise NotImplementedError(column) |
| 287 | return cls(**kwargs) |
| 288 | |
| 289 | @property |
| 290 | def id(self): |
| 291 | try: |
| 292 | return self._id |
| 293 | except AttributeError: |
| 294 | if self.kind is KIND.STATEMENT: |
| 295 | self._id = None |
| 296 | else: |
| 297 | self._id = DeclID(str(self.file), self.funcname, self.name) |
| 298 | return self._id |
| 299 | |
| 300 | @property |
| 301 | def filename(self): |
| 302 | if not self.file: |
| 303 | return None |
| 304 | return self.file.filename |
| 305 | |
| 306 | @property |
| 307 | def lno(self): |
| 308 | if not self.file: |
| 309 | return -1 |
| 310 | return self.file.lno |
no test coverage detected
searching dependent graphs…