File tree Expand file tree Collapse file tree 2 files changed +29
-4
lines changed Expand file tree Collapse file tree 2 files changed +29
-4
lines changed Original file line number Diff line number Diff line change @@ -18,7 +18,9 @@ class MustUse:
18
18
def __new__ (cls , * args , src_loc_at = 0 , ** kwargs ):
19
19
frame = sys ._getframe (1 + src_loc_at )
20
20
self = super ().__new__ (cls )
21
- self ._MustUse__used = False
21
+
22
+ self ._MustUse__used = False
23
+ self ._MustUse__frame = frame
22
24
self ._MustUse__context = dict (
23
25
filename = frame .f_code .co_filename ,
24
26
lineno = frame .f_lineno ,
@@ -31,7 +33,7 @@ def __del__(self):
31
33
if getattr (self ._MustUse__warning , "_MustUse__silence" , False ):
32
34
return
33
35
if hasattr (self , "_MustUse__used" ) and not self ._MustUse__used :
34
- if get_linter_option (self ._MustUse__context [ "filename" ] ,
36
+ if get_linter_option (self ._MustUse__frame ,
35
37
self ._MustUse__warning .__qualname__ , bool , True ):
36
38
warnings .warn_explicit (
37
39
f"{ self !r} created but never used" , self ._MustUse__warning ,
Original file line number Diff line number Diff line change @@ -75,6 +75,7 @@ def decorator_like(*args, **kwargs):
75
75
return decorator_like
76
76
77
77
78
+
78
79
def get_linter_options (filename ):
79
80
first_line = linecache .getline (filename , 1 )
80
81
if first_line :
@@ -84,8 +85,30 @@ def get_linter_options(filename):
84
85
return dict ()
85
86
86
87
87
- def get_linter_option (filename , name , type , default ):
88
- options = get_linter_options (filename )
88
+ def get_linter_option (frame , name , type , default ):
89
+ """
90
+ Get given linter option for a given stack frame. This iterates down the frames, collating options of the form:
91
+
92
+ .. code::
93
+ # amaranth: {name}=value
94
+
95
+ The earliest option value in the stack takes precedence
96
+
97
+ Returns
98
+ -------
99
+ :class:`bool` or :class:`int`
100
+ Option value
101
+ """
102
+
103
+ options = {}
104
+ while frame :
105
+ f_opts = get_linter_options (frame .f_code .co_filename )
106
+ options = f_opts | options
107
+ if frame .f_back is None :
108
+ break
109
+ else :
110
+ frame = frame .f_back
111
+
89
112
if name not in options :
90
113
return default
91
114
You can’t perform that action at this time.
0 commit comments