11# Copyright (c) 2023, NumPy Developers.
22# All rights reserved.
3-
4- import typing as T
53import re
4+ from typing import (
5+ Dict , Set , Tuple , List , Callable , Optional ,
6+ Union , Any , Iterable , cast , TYPE_CHECKING
7+ )
68from dataclasses import dataclass , field
7-
89from ...mesonlib import File , MesonException
910from ...interpreter .type_checking import NoneType
1011from ...interpreterbase .decorators import (
1314)
1415from .. import ModuleObject
1516
16- if T . TYPE_CHECKING :
17+ if TYPE_CHECKING :
1718 from typing import TypedDict
1819 from typing_extensions import NotRequired
1920 from ...interpreterbase import TYPE_var , TYPE_kwargs
@@ -40,19 +41,19 @@ class ConflictAttr:
4041
4142 """
4243 val : str = field (hash = True , compare = True )
43- match : T . Union [re .Pattern , None ] = field (
44+ match : Union [re .Pattern , None ] = field (
4445 default = None , hash = False , compare = False
4546 )
46- mfilter : T . Union [re .Pattern , None ] = field (
47+ mfilter : Union [re .Pattern , None ] = field (
4748 default = None , hash = False , compare = False
4849 )
4950 mjoin : str = field (default = '' , hash = False , compare = False )
5051
5152 def copy (self ) -> 'ConflictAttr' :
5253 return ConflictAttr (** self .__dict__ )
5354
54- def to_dict (self ) -> T . Dict [str , str ]:
55- ret : T . Dict [str , str ] = {}
55+ def to_dict (self ) -> Dict [str , str ]:
56+ ret : Dict [str , str ] = {}
5657 for attr in ('val' , 'mjoin' ):
5758 ret [attr ] = getattr (self , attr )
5859 for attr in ('match' , 'mfilter' ):
@@ -65,7 +66,7 @@ def to_dict(self) -> T.Dict[str, str]:
6566 return ret
6667
6768class KwargConfilctAttr (KwargInfo ):
68- def __init__ (self , func_name : str , opt_name : str , default : T . Any = None ):
69+ def __init__ (self , func_name : str , opt_name : str , default : Any = None ):
6970 types = (
7071 NoneType , str , ContainerTypeInfo (dict , str ),
7172 ContainerTypeInfo (list , (dict , str ))
@@ -80,10 +81,10 @@ def __init__(self, func_name: str, opt_name: str, default: T.Any = None):
8081
8182 @staticmethod
8283 def convert (func_name :str , opt_name : str , values : 'IMPLIED_ATTR' ,
83- ) -> T . Union [None , T . List [ConflictAttr ]]:
84+ ) -> Union [None , List [ConflictAttr ]]:
8485 if values is None :
8586 return None
86- ret : T . List [ConflictAttr ] = []
87+ ret : List [ConflictAttr ] = []
8788 values = [values ] if isinstance (values , (str , dict )) else values
8889 accepted_keys = ('val' , 'match' , 'mfilter' , 'mjoin' )
8990 for edict in values :
@@ -124,20 +125,20 @@ def convert(func_name:str, opt_name: str, values: 'IMPLIED_ATTR',
124125 ret .append (implattr )
125126 return ret
126127
127- if T . TYPE_CHECKING :
128- IMPLIED_ATTR = T . Union [
129- None , str , T . Dict [str , str ], T . List [
130- T . Union [str , T . Dict [str , str ]]
128+ if TYPE_CHECKING :
129+ IMPLIED_ATTR = Union [
130+ None , str , Dict [str , str ], List [
131+ Union [str , Dict [str , str ]]
131132 ]
132133 ]
133134 class FeatureKwArgs (TypedDict ):
134- #implies: T. Optional[T. List['FeatureObject']]
135- implies : NotRequired [T . List [T . Any ]]
136- group : NotRequired [T . List [str ]]
137- detect : NotRequired [T . List [ConflictAttr ]]
138- args : NotRequired [T . List [ConflictAttr ]]
139- test_code : NotRequired [T . Union [str , File ]]
140- extra_tests : NotRequired [T . Dict [str , T . Union [str , File ]]]
135+ #implies: Optional[List['FeatureObject']]
136+ implies : NotRequired [List [Any ]]
137+ group : NotRequired [List [str ]]
138+ detect : NotRequired [List [ConflictAttr ]]
139+ args : NotRequired [List [ConflictAttr ]]
140+ test_code : NotRequired [Union [str , File ]]
141+ extra_tests : NotRequired [Dict [str , Union [str , File ]]]
141142 disable : NotRequired [str ]
142143
143144 class FeatureUpdateKwArgs (FeatureKwArgs ):
@@ -147,16 +148,16 @@ class FeatureUpdateKwArgs(FeatureKwArgs):
147148class FeatureObject (ModuleObject ):
148149 name : str
149150 interest : int
150- implies : T . Set ['FeatureObject' ]
151- group : T . List [str ]
152- detect : T . List [ConflictAttr ]
153- args : T . List [ConflictAttr ]
154- test_code : T . Union [str , File ]
155- extra_tests : T . Dict [str , T . Union [str , File ]]
151+ implies : Set ['FeatureObject' ]
152+ group : List [str ]
153+ detect : List [ConflictAttr ]
154+ args : List [ConflictAttr ]
155+ test_code : Union [str , File ]
156+ extra_tests : Dict [str , Union [str , File ]]
156157 disable : str
157158
158159 def __init__ (self , state : 'ModuleState' ,
159- args : T . List ['TYPE_var' ],
160+ args : List ['TYPE_var' ],
160161 kwargs : 'TYPE_kwargs' ) -> None :
161162
162163 super ().__init__ ()
@@ -182,7 +183,7 @@ def __init__(self, state: 'ModuleState',
182183 KwargInfo ('disable' , (str ), default = '' ),
183184 )
184185 def init_attrs (state : 'ModuleState' ,
185- args : T . Tuple [str , int ],
186+ args : Tuple [str , int ],
186187 kwargs : 'FeatureKwArgs' ) -> None :
187188 self .name = args [0 ]
188189 self .interest = args [1 ]
@@ -205,7 +206,7 @@ def init_attrs(state: 'ModuleState',
205206 'get' : self .get_method ,
206207 })
207208
208- def update_method (self , state : 'ModuleState' , args : T . List ['TYPE_var' ],
209+ def update_method (self , state : 'ModuleState' , args : List ['TYPE_var' ],
209210 kwargs : 'TYPE_kwargs' ) -> 'FeatureObject' :
210211 @noPosargs
211212 @typed_kwargs ('features.FeatureObject.update' ,
@@ -231,7 +232,7 @@ def update_method(self, state: 'ModuleState', args: T.List['TYPE_var'],
231232 ),
232233 KwargInfo ('disable' , (NoneType , str )),
233234 )
234- def update (state : 'ModuleState' , args : T . List ['TYPE_var' ],
235+ def update (state : 'ModuleState' , args : List ['TYPE_var' ],
235236 kwargs : 'FeatureUpdateKwArgs' ) -> None :
236237 for k , v in kwargs .items ():
237238 if v is not None and k != 'implies' :
@@ -244,7 +245,7 @@ def update(state: 'ModuleState', args: T.List['TYPE_var'],
244245
245246 @noKwargs
246247 @typed_pos_args ('features.FeatureObject.get' , str )
247- def get_method (self , state : 'ModuleState' , args : T . Tuple [str ],
248+ def get_method (self , state : 'ModuleState' , args : Tuple [str ],
248249 kwargs : 'TYPE_kwargs' ) -> 'TYPE_var' :
249250
250251 impl_lst = lambda lst : [v .to_dict () for v in lst ]
@@ -260,14 +261,14 @@ def get_method(self, state: 'ModuleState', args: T.Tuple[str],
260261 'extra_tests' : noconv ,
261262 'disable' : noconv
262263 }
263- cfunc : T . Optional [T . Callable [[str ], 'TYPE_var' ]] = dfunc .get (args [0 ])
264+ cfunc : Optional [Callable [[str ], 'TYPE_var' ]] = dfunc .get (args [0 ])
264265 if cfunc is None :
265266 raise MesonException (f'Key { args [0 ]!r} is not in the feature.' )
266267 val = getattr (self , args [0 ])
267268 return cfunc (val )
268269
269- def get_implicit (self , _caller : T . Set ['FeatureObject' ] = None
270- ) -> T . Set ['FeatureObject' ]:
270+ def get_implicit (self , _caller : Set ['FeatureObject' ] = None
271+ ) -> Set ['FeatureObject' ]:
271272 # infinity recursive guard since
272273 # features can imply each other
273274 _caller = {self , } if not _caller else _caller .union ({self , })
@@ -278,19 +279,19 @@ def get_implicit(self, _caller: T.Set['FeatureObject'] = None
278279 return ret
279280
280281 @staticmethod
281- def get_implicit_multi (features : T . Iterable ['FeatureObject' ]) -> T . Set ['FeatureObject' ]:
282+ def get_implicit_multi (features : Iterable ['FeatureObject' ]) -> Set ['FeatureObject' ]:
282283 implies = set ().union (* [f .get_implicit () for f in features ])
283284 return implies
284285
285286 @staticmethod
286- def get_implicit_combine_multi (features : T . Iterable ['FeatureObject' ]) -> T . Set ['FeatureObject' ]:
287+ def get_implicit_combine_multi (features : Iterable ['FeatureObject' ]) -> Set ['FeatureObject' ]:
287288 return FeatureObject .get_implicit_multi (features ).union (features )
288289
289290 @staticmethod
290- def sorted_multi (features : T . Iterable [T . Union ['FeatureObject' , T . Iterable ['FeatureObject' ]]],
291+ def sorted_multi (features : Iterable [Union ['FeatureObject' , Iterable ['FeatureObject' ]]],
291292 reverse : bool = False
292- ) -> T . List [T . Union ['FeatureObject' , T . Iterable ['FeatureObject' ]]]:
293- def sort_cb (k : T . Union [FeatureObject , T . Iterable [FeatureObject ]]) -> int :
293+ ) -> List [Union ['FeatureObject' , Iterable ['FeatureObject' ]]]:
294+ def sort_cb (k : Union [FeatureObject , Iterable [FeatureObject ]]) -> int :
294295 if isinstance (k , FeatureObject ):
295296 return k .interest
296297 # keep prevalent features and erase any implied features
@@ -310,8 +311,8 @@ def sort_cb(k: T.Union[FeatureObject, T.Iterable[FeatureObject]]) -> int:
310311 return sorted (features , reverse = reverse , key = sort_cb )
311312
312313 @staticmethod
313- def features_names (features : T . Iterable [T . Union ['FeatureObject' , T . Iterable ['FeatureObject' ]]]
314- ) -> T . List [T . Union [str , T . List [str ]]]:
314+ def features_names (features : Iterable [Union ['FeatureObject' , Iterable ['FeatureObject' ]]]
315+ ) -> List [Union [str , List [str ]]]:
315316 return [
316317 fet .name if isinstance (fet , FeatureObject )
317318 else [f .name for f in fet ]
@@ -338,18 +339,18 @@ def __eq__(self, robj: object) -> bool:
338339 return False
339340 return self is robj and self .name == robj .name
340341
341- def __lt__ (self , robj : object ) -> T . Any :
342+ def __lt__ (self , robj : object ) -> Any :
342343 if not isinstance (robj , FeatureObject ):
343344 return NotImplemented
344345 return self .interest < robj .interest
345346
346- def __le__ (self , robj : object ) -> T . Any :
347+ def __le__ (self , robj : object ) -> Any :
347348 if not isinstance (robj , FeatureObject ):
348349 return NotImplemented
349350 return self .interest <= robj .interest
350351
351- def __gt__ (self , robj : object ) -> T . Any :
352+ def __gt__ (self , robj : object ) -> Any :
352353 return robj < self
353354
354- def __ge__ (self , robj : object ) -> T . Any :
355+ def __ge__ (self , robj : object ) -> Any :
355356 return robj <= self
0 commit comments