@@ -397,17 +397,19 @@ public instance : ToString Comparator := ⟨Comparator.toString⟩
397397end Comparator
398398
399399public structure VerComparator where
400- ver : StdVer
401- op : Comparator
402- deriving Repr
400+ private innerMk ::
401+ private ver : StdVer
402+ private op : Comparator
403+ private includePrereleases : Bool := false
404+ deriving Repr
403405
404406namespace VerComparator
405407
406- /-- A version comparator that matches any version (i.e., `≥0.0.0`). -/
407- def any : VerComparator :=
408+ /-- A version comparator that matches any non-prerelease version (i.e., `*` , `≥0.0.0`). -/
409+ public def wild : VerComparator :=
408410 {op := .ge, ver := .ofSemVerCore {}}
409411
410- instance : Inhabited VerComparator := ⟨.any ⟩
412+ public instance : Inhabited VerComparator := ⟨.wild ⟩
411413
412414def parseM (s : String) : EStateM String s.ValidPos VerComparator := do
413415 let op ← Comparator.parseM s
@@ -418,28 +420,34 @@ def parseM (s : String) : EStateM String s.ValidPos VerComparator := do
418420 runVerParse s parseM
419421
420422public def test (self : VerComparator) (ver : StdVer) : Bool :=
421- match self.ver.specialDescr, ver.specialDescr with
422- | _, "" =>
423- match self.op with
424- | .lt => ver < self.ver
425- | .le => ver ≤ self.ver
426- | .gt => ver > self.ver
427- | .ge => ver ≥ self.ver
428- | .eq => ver = self.ver
429- | .ne => ver ≠ self.ver
430- | "" , _ =>
431- false
432- | selfDescr, verDescr =>
433- if self.ver.toSemVerCore = ver.toSemVerCore then
434- match self.op with
435- | .lt => verDescr < selfDescr
436- | .le => verDescr ≤ selfDescr
437- | .gt => verDescr > selfDescr
438- | .ge => verDescr ≥ selfDescr
439- | .eq => verDescr = selfDescr
440- | .ne => verDescr ≠ selfDescr
441- else
423+ let fullCheck op selfVer ver :=
424+ match op with
425+ | .lt => ver < selfVer
426+ | .le => ver ≤ selfVer
427+ | .gt => ver > selfVer
428+ | .ge => ver ≥ selfVer
429+ | .eq => ver = selfVer
430+ | .ne => ver ≠ selfVer
431+ let {op, ver := selfVer, includePrereleases} := self
432+ if includePrereleases then
433+ fullCheck op selfVer ver
434+ else
435+ match selfVer.specialDescr, ver.specialDescr with
436+ | _, "" =>
437+ fullCheck op selfVer ver
438+ | "" , _ =>
442439 false
440+ | selfDescr, verDescr =>
441+ if selfVer.toSemVerCore = ver.toSemVerCore then
442+ match op with
443+ | .lt => verDescr < selfDescr
444+ | .le => verDescr ≤ selfDescr
445+ | .gt => verDescr > selfDescr
446+ | .ge => verDescr ≥ selfDescr
447+ | .eq => verDescr = selfDescr
448+ | .ne => verDescr ≠ selfDescr
449+ else
450+ false
443451
444452public protected def toString (self : VerComparator) : String :=
445453 s! "{ self.op}{ self.ver} "
@@ -526,7 +534,7 @@ where
526534 @[inline] appendRange ands minVer maxVer (specialDescr := "" ) :=
527535 let minVer := StdVer.mk minVer specialDescr
528536 let maxVer := StdVer.ofSemVerCore maxVer
529- ands.push {op := .ge, ver := minVer} |>.push {op := .lt, ver := maxVer}
537+ ands.push {op := .ge, ver := minVer} |>.push {op := .lt, ver := maxVer, includePrereleases := true }
530538 parseWild (s : String) ands : EStateM String s.ValidPos _ := do
531539 let cs ← parseVerComponents s
532540 if (← get).get?.any (· == '-' ) then
@@ -551,7 +559,7 @@ where
551559 if you want to fix a specific version, use '=' before the full version; \
552560 otherwise, use '≥' to support it and future versions"
553561 | _, _, _ =>
554- return ands.push .any
562+ return ands.push .wild
555563 parseTilde (s : String) ands : EStateM String s.ValidPos _ := do
556564 let cs ← parseVerComponents s
557565 let specialDescr ← parseSpecialDescr s
0 commit comments