nmigen.cli: fix file type autodetection code.
[nmigen.git] / nmigen / _unused.py
1 import sys
2 import warnings
3
4 from ._utils import get_linter_option
5
6
7 __all__ = ["UnusedMustUse", "MustUse"]
8
9
10 class UnusedMustUse(Warning):
11 pass
12
13
14 class MustUse:
15 _MustUse__silence = False
16 _MustUse__warning = UnusedMustUse
17
18 def __new__(cls, *args, src_loc_at=0, **kwargs):
19 frame = sys._getframe(1 + src_loc_at)
20 self = super().__new__(cls)
21 self._MustUse__used = False
22 self._MustUse__context = dict(
23 filename=frame.f_code.co_filename,
24 lineno=frame.f_lineno,
25 source=self)
26 return self
27
28 def __del__(self):
29 if self._MustUse__silence:
30 return
31 if hasattr(self, "_MustUse__used") and not self._MustUse__used:
32 if get_linter_option(self._MustUse__context["filename"],
33 self._MustUse__warning.__name__, bool, True):
34 warnings.warn_explicit(
35 "{!r} created but never used".format(self), self._MustUse__warning,
36 **self._MustUse__context)
37
38
39 _old_excepthook = sys.excepthook
40 def _silence_elaboratable(type, value, traceback):
41 # Don't show anything if the interpreter crashed; that'd just obscure the exception
42 # traceback instead of helping.
43 MustUse._MustUse__silence = True
44 _old_excepthook(type, value, traceback)
45 sys.excepthook = _silence_elaboratable