@@ -56,9 +56,12 @@ use std::sync::LazyLock;
56
56
use uv_pep440:: { release_specifier_to_range, Operator , Version , VersionSpecifier } ;
57
57
use version_ranges:: Ranges ;
58
58
59
+ use crate :: marker:: lowering:: {
60
+ LoweredMarkerValueExtra , LoweredMarkerValueString , LoweredMarkerValueVersion ,
61
+ } ;
59
62
use crate :: marker:: MarkerValueExtra ;
60
63
use crate :: ExtraOperator ;
61
- use crate :: { MarkerExpression , MarkerOperator , MarkerValueString , MarkerValueVersion } ;
64
+ use crate :: { MarkerExpression , MarkerOperator , MarkerValueVersion } ;
62
65
63
66
/// The global node interner.
64
67
pub ( crate ) static INTERNER : LazyLock < Interner > = LazyLock :: new ( Interner :: default) ;
@@ -161,7 +164,7 @@ impl InternerGuard<'_> {
161
164
specifier,
162
165
} => match python_version_to_full_version ( normalize_specifier ( specifier) ) {
163
166
Ok ( specifier) => (
164
- Variable :: Version ( MarkerValueVersion :: PythonFullVersion ) ,
167
+ Variable :: Version ( LoweredMarkerValueVersion :: PythonFullVersion ) ,
165
168
Edges :: from_specifier ( specifier) ,
166
169
) ,
167
170
Err ( node) => return node,
@@ -172,24 +175,25 @@ impl InternerGuard<'_> {
172
175
negated,
173
176
} => match Edges :: from_python_versions ( versions, negated) {
174
177
Ok ( edges) => (
175
- Variable :: Version ( MarkerValueVersion :: PythonFullVersion ) ,
178
+ Variable :: Version ( LoweredMarkerValueVersion :: PythonFullVersion ) ,
176
179
edges,
177
180
) ,
178
181
Err ( node) => return node,
179
182
} ,
180
183
// A variable representing the output of a version key. Edges correspond
181
184
// to disjoint version ranges.
182
- MarkerExpression :: Version { key, specifier } => {
183
- ( Variable :: Version ( key) , Edges :: from_specifier ( specifier) )
184
- }
185
+ MarkerExpression :: Version { key, specifier } => (
186
+ Variable :: Version ( key. into ( ) ) ,
187
+ Edges :: from_specifier ( specifier) ,
188
+ ) ,
185
189
// A variable representing the output of a version key. Edges correspond
186
190
// to disjoint version ranges.
187
191
MarkerExpression :: VersionIn {
188
192
key,
189
193
versions,
190
194
negated,
191
195
} => (
192
- Variable :: Version ( key) ,
196
+ Variable :: Version ( key. into ( ) ) ,
193
197
Edges :: from_versions ( & versions, negated) ,
194
198
) ,
195
199
// The `in` and `contains` operators are a bit different than other operators.
@@ -206,38 +210,76 @@ impl InternerGuard<'_> {
206
210
key,
207
211
operator : MarkerOperator :: In ,
208
212
value,
209
- } => ( Variable :: In { key, value } , Edges :: from_bool ( true ) ) ,
213
+ } => (
214
+ Variable :: In {
215
+ key : key. into ( ) ,
216
+ value,
217
+ } ,
218
+ Edges :: from_bool ( true ) ,
219
+ ) ,
210
220
MarkerExpression :: String {
211
221
key,
212
222
operator : MarkerOperator :: NotIn ,
213
223
value,
214
- } => ( Variable :: In { key, value } , Edges :: from_bool ( false ) ) ,
224
+ } => (
225
+ Variable :: In {
226
+ key : key. into ( ) ,
227
+ value,
228
+ } ,
229
+ Edges :: from_bool ( false ) ,
230
+ ) ,
215
231
MarkerExpression :: String {
216
232
key,
217
233
operator : MarkerOperator :: Contains ,
218
234
value,
219
- } => ( Variable :: Contains { key, value } , Edges :: from_bool ( true ) ) ,
235
+ } => (
236
+ Variable :: Contains {
237
+ key : key. into ( ) ,
238
+ value,
239
+ } ,
240
+ Edges :: from_bool ( true ) ,
241
+ ) ,
220
242
MarkerExpression :: String {
221
243
key,
222
244
operator : MarkerOperator :: NotContains ,
223
245
value,
224
- } => ( Variable :: Contains { key, value } , Edges :: from_bool ( false ) ) ,
246
+ } => (
247
+ Variable :: Contains {
248
+ key : key. into ( ) ,
249
+ value,
250
+ } ,
251
+ Edges :: from_bool ( false ) ,
252
+ ) ,
225
253
// A variable representing the output of a string key. Edges correspond
226
254
// to disjoint string ranges.
227
255
MarkerExpression :: String {
228
256
key,
229
257
operator,
230
258
value,
231
- } => ( Variable :: String ( key) , Edges :: from_string ( operator, value) ) ,
259
+ } => (
260
+ Variable :: String ( key. into ( ) ) ,
261
+ Edges :: from_string ( operator, value) ,
262
+ ) ,
232
263
// A variable representing the existence or absence of a particular extra.
233
264
MarkerExpression :: Extra {
234
- name,
265
+ name : MarkerValueExtra :: Extra ( extra ) ,
235
266
operator : ExtraOperator :: Equal ,
236
- } => ( Variable :: Extra ( name) , Edges :: from_bool ( true ) ) ,
267
+ } => (
268
+ Variable :: Extra ( LoweredMarkerValueExtra :: Extra ( extra) ) ,
269
+ Edges :: from_bool ( true ) ,
270
+ ) ,
237
271
MarkerExpression :: Extra {
238
- name,
272
+ name : MarkerValueExtra :: Extra ( extra ) ,
239
273
operator : ExtraOperator :: NotEqual ,
240
- } => ( Variable :: Extra ( name) , Edges :: from_bool ( false ) ) ,
274
+ } => (
275
+ Variable :: Extra ( LoweredMarkerValueExtra :: Extra ( extra) ) ,
276
+ Edges :: from_bool ( false ) ,
277
+ ) ,
278
+ // Invalid extras are always `false`.
279
+ MarkerExpression :: Extra {
280
+ name : MarkerValueExtra :: Arbitrary ( _) ,
281
+ ..
282
+ } => return NodeId :: FALSE ,
241
283
} ;
242
284
243
285
self . create_node ( var, children)
@@ -391,7 +433,7 @@ impl InternerGuard<'_> {
391
433
// Look for a `python_full_version` expression, otherwise
392
434
// we recursively simplify.
393
435
let Node {
394
- var : Variable :: Version ( MarkerValueVersion :: PythonFullVersion ) ,
436
+ var : Variable :: Version ( LoweredMarkerValueVersion :: PythonFullVersion ) ,
395
437
children : Edges :: Version { ref edges } ,
396
438
} = node
397
439
else {
@@ -464,7 +506,7 @@ impl InternerGuard<'_> {
464
506
return NodeId :: FALSE ;
465
507
}
466
508
if matches ! ( i, NodeId :: TRUE ) {
467
- let var = Variable :: Version ( MarkerValueVersion :: PythonFullVersion ) ;
509
+ let var = Variable :: Version ( LoweredMarkerValueVersion :: PythonFullVersion ) ;
468
510
let edges = Edges :: Version {
469
511
edges : Edges :: from_range ( & py_range) ,
470
512
} ;
@@ -473,7 +515,7 @@ impl InternerGuard<'_> {
473
515
474
516
let node = self . shared . node ( i) ;
475
517
let Node {
476
- var : Variable :: Version ( MarkerValueVersion :: PythonFullVersion ) ,
518
+ var : Variable :: Version ( LoweredMarkerValueVersion :: PythonFullVersion ) ,
477
519
children : Edges :: Version { ref edges } ,
478
520
} = node
479
521
else {
@@ -569,26 +611,26 @@ pub(crate) enum Variable {
569
611
///
570
612
/// This is the highest order variable as it typically contains the most complex
571
613
/// ranges, allowing us to merge ranges at the top-level.
572
- Version ( MarkerValueVersion ) ,
614
+ Version ( LoweredMarkerValueVersion ) ,
573
615
/// A string marker, such as `os_name`.
574
- String ( MarkerValueString ) ,
616
+ String ( LoweredMarkerValueString ) ,
575
617
/// A variable representing a `<key> in <value>` expression for a particular
576
618
/// string marker and value.
577
619
In {
578
- key : MarkerValueString ,
620
+ key : LoweredMarkerValueString ,
579
621
value : String ,
580
622
} ,
581
623
/// A variable representing a `<value> in <key>` expression for a particular
582
624
/// string marker and value.
583
625
Contains {
584
- key : MarkerValueString ,
626
+ key : LoweredMarkerValueString ,
585
627
value : String ,
586
628
} ,
587
629
/// A variable representing the existence or absence of a given extra.
588
630
///
589
631
/// We keep extras at the leaves of the tree, so when simplifying extras we can
590
632
/// trivially remove the leaves without having to reconstruct the entire tree.
591
- Extra ( MarkerValueExtra ) ,
633
+ Extra ( LoweredMarkerValueExtra ) ,
592
634
}
593
635
594
636
/// A decision node in an Algebraic Decision Diagram.
0 commit comments