1
- from typing import Callable as _Callable , Dict as _Dict
1
+ from typing import Callable as _Callable , Dict as _Dict , ClassVar as _ClassVar
2
2
from misc .codegen .lib import schema as _schema
3
3
import inspect as _inspect
4
4
from dataclasses import dataclass as _dataclass
@@ -62,11 +62,14 @@ def include(source: str):
62
62
_inspect .currentframe ().f_back .f_locals .setdefault ("includes" , []).append (source )
63
63
64
64
65
+ @_dataclass
65
66
class _Namespace :
66
67
""" simple namespacing mechanism """
68
+ name : str
67
69
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 } "
70
73
71
74
72
75
@_dataclass
@@ -77,35 +80,27 @@ def modify(self, prop: _schema.Property):
77
80
prop .synth = self .synth
78
81
79
82
def negate (self ) -> "PropertyModifier" :
80
- return _SynthModifier (False )
83
+ return _SynthModifier (self . name , False )
81
84
82
85
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" )
88
91
89
92
90
93
@_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 :
96
95
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 )
103
96
104
- def modify (self , prop : _schema .Property ):
105
- self ._apply (prop .pragmas )
106
97
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
109
104
110
105
def __call__ (self , cls : type ) -> type :
111
106
""" use this pragma as a decorator on classes """
@@ -115,23 +110,53 @@ def __call__(self, cls: type) -> type:
115
110
self ._apply (cls ._pragmas )
116
111
return cls
117
112
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
+
118
131
def _apply (self , pragmas : _Dict [str , object ]) -> None :
119
132
if self .remove :
120
133
pragmas .pop (self .pragma , None )
121
134
else :
122
- pragmas [ self . pragma ] = self . value
135
+ super (). _apply ( pragmas )
123
136
124
137
125
138
@_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.
129
142
"""
130
- pragma : str
143
+ _pragma_class : _ClassVar [type ] = _ClassPragma
144
+
131
145
function : _Callable [[...], object ] = None
132
146
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
135
160
136
161
def __invert__ (self ) -> _Pragma :
137
162
return _Pragma (self .pragma , remove = True )
@@ -203,18 +228,18 @@ def f(cls: type) -> type:
203
228
204
229
use_for_null = _annotate (null = True )
205
230
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
210
235
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" ) )
214
239
215
- _Pragma ("cpp_skip" )
240
+ cpp . add ( _Pragma ("skip" ) )
216
241
217
- _Pragma ("rust_skip_doc_test" )
242
+ rust . add ( _Pragma ("skip_doc_test" ) )
218
243
219
244
rust .doc_test_signature = lambda signature : _annotate (rust_doc_test_function = signature )
220
245
0 commit comments