1- from typing import Callable as _Callable , Dict as _Dict
1+ from typing import Callable as _Callable , Dict as _Dict , ClassVar as _ClassVar
22from misc .codegen .lib import schema as _schema
33import inspect as _inspect
44from dataclasses import dataclass as _dataclass
@@ -62,11 +62,14 @@ def include(source: str):
6262 _inspect .currentframe ().f_back .f_locals .setdefault ("includes" , []).append (source )
6363
6464
65+ @_dataclass
6566class _Namespace :
6667 """ simple namespacing mechanism """
68+ name : str
6769
68- def __init__ (self , ** kwargs ):
69- self .__dict__ .update (kwargs )
70+ def add (self , pragma : "_PragmaBase" ):
71+ self .__dict__ [pragma .pragma ] = pragma
72+ pragma .pragma = f"{ self .name } _{ pragma .pragma } "
7073
7174
7275@_dataclass
@@ -77,35 +80,27 @@ def modify(self, prop: _schema.Property):
7780 prop .synth = self .synth
7881
7982 def negate (self ) -> "PropertyModifier" :
80- return _SynthModifier (False )
83+ return _SynthModifier (self . name , False )
8184
8285
83- qltest = _Namespace ()
84- ql = _Namespace ()
85- cpp = _Namespace ()
86- rust = _Namespace ()
87- synth = _SynthModifier ()
86+ qltest = _Namespace ("qltest" )
87+ ql = _Namespace ("ql" )
88+ cpp = _Namespace ("cpp" )
89+ rust = _Namespace ("rust" )
90+ synth = _SynthModifier ("synth" )
8891
8992
9093@_dataclass
91- class _Pragma (_schema .PropertyModifier ):
92- """ A class or property pragma.
93- For properties, it functions similarly to a `_PropertyModifier` with `|`, adding the pragma.
94- For schema classes it acts as a python decorator with `@`.
95- """
94+ class _PragmaBase :
9695 pragma : str
97- value : object = None
98- remove : bool = False
99-
100- def __post_init__ (self ):
101- namespace , _ , name = self .pragma .partition ('_' )
102- setattr (globals ()[namespace ], name , self )
10396
104- def modify (self , prop : _schema .Property ):
105- self ._apply (prop .pragmas )
10697
107- def negate (self ) -> "PropertyModifier" :
108- return _Pragma (self .pragma , remove = True )
98+ @_dataclass
99+ class _ClassPragma (_PragmaBase ):
100+ """ A class pragma.
101+ For schema classes it acts as a python decorator with `@`.
102+ """
103+ value : object = None
109104
110105 def __call__ (self , cls : type ) -> type :
111106 """ use this pragma as a decorator on classes """
@@ -115,23 +110,53 @@ def __call__(self, cls: type) -> type:
115110 self ._apply (cls ._pragmas )
116111 return cls
117112
113+ def _apply (self , pragmas : _Dict [str , object ]) -> None :
114+ pragmas [self .pragma ] = self .value
115+
116+
117+ @_dataclass
118+ class _Pragma (_ClassPragma , _schema .PropertyModifier ):
119+ """ A class or property pragma.
120+ For properties, it functions similarly to a `_PropertyModifier` with `|`, adding the pragma.
121+ For schema classes it acts as a python decorator with `@`.
122+ """
123+ remove : bool = False
124+
125+ def modify (self , prop : _schema .Property ):
126+ self ._apply (prop .pragmas )
127+
128+ def negate (self ) -> "PropertyModifier" :
129+ return _Pragma (self .pragma , remove = True )
130+
118131 def _apply (self , pragmas : _Dict [str , object ]) -> None :
119132 if self .remove :
120133 pragmas .pop (self .pragma , None )
121134 else :
122- pragmas [ self . pragma ] = self . value
135+ super (). _apply ( pragmas )
123136
124137
125138@_dataclass
126- class _ParametrizedPragma :
127- """ A class or property parametrized pragma.
128- Needs to be applied to a parameter to give a pragma.
139+ class _ParametrizedClassPragma ( _PragmaBase ) :
140+ """ A class parametrized pragma.
141+ Needs to be applied to a parameter to give a class pragma.
129142 """
130- pragma : str
143+ _pragma_class : _ClassVar [type ] = _ClassPragma
144+
131145 function : _Callable [[...], object ] = None
132146
133- def __call__ (self , * args , ** kwargs ) -> _Pragma :
134- return _Pragma (self .pragma , value = self .function (* args , ** kwargs ))
147+ def __post_init__ (self ):
148+ self .__signature__ = _inspect .signature (self .function ).replace (return_annotation = self ._pragma_class )
149+
150+ def __call__ (self , * args , ** kwargs ) -> _pragma_class :
151+ return self ._pragma_class (self .pragma , value = self .function (* args , ** kwargs ))
152+
153+
154+ @_dataclass
155+ class _ParametrizedPragma (_ParametrizedClassPragma ):
156+ """ A class or property parametrized pragma.
157+ Needs to be applied to a parameter to give a pragma.
158+ """
159+ _pragma_class : _ClassVar [type ] = _Pragma
135160
136161 def __invert__ (self ) -> _Pragma :
137162 return _Pragma (self .pragma , remove = True )
@@ -203,18 +228,18 @@ def f(cls: type) -> type:
203228
204229use_for_null = _annotate (null = True )
205230
206- _Pragma ("qltest_skip" )
207- _Pragma ( "qltest_collapse_hierarchy" )
208- _Pragma ( "qltest_uncollapse_hierarchy" )
209- qltest .test_with = lambda cls : _annotate (test_with = cls )
231+ qltest . add ( _Pragma ("skip" ) )
232+ qltest . add ( _ClassPragma ( "collapse_hierarchy" ) )
233+ qltest . add ( _ClassPragma ( "uncollapse_hierarchy" ) )
234+ qltest .test_with = lambda cls : _annotate (test_with = cls ) # inheritable
210235
211- ql .default_doc_name = lambda doc : _annotate ( doc_name = doc )
212- ql .hideable = _annotate (hideable = True )
213- _Pragma ("ql_internal" )
236+ ql .add ( _ParametrizedClassPragma ( " default_doc_name" , lambda doc : doc ) )
237+ ql .hideable = _annotate (hideable = True ) # inheritable
238+ ql . add ( _Pragma ("internal" ) )
214239
215- _Pragma ("cpp_skip" )
240+ cpp . add ( _Pragma ("skip" ) )
216241
217- _Pragma ("rust_skip_doc_test" )
242+ rust . add ( _Pragma ("skip_doc_test" ) )
218243
219244rust .doc_test_signature = lambda signature : _annotate (rust_doc_test_function = signature )
220245
0 commit comments