Skip to content

Commit ad1a017

Browse files
Khakim-em
authored andcommitted
fix: panic in delabPRange
1 parent e838c0c commit ad1a017

File tree

2 files changed

+52
-38
lines changed

2 files changed

+52
-38
lines changed

src/Lean/PrettyPrinter/Delaborator/Builtins.lean

Lines changed: 50 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1276,50 +1276,65 @@ def delabMProdMk : Delab := delabPProdMkCore ``MProd.mk
12761276

12771277
@[builtin_delab app.Std.Range.mk]
12781278
def delabRange : Delab := do
1279-
-- Std.Range.mk : Nat → Nat → (step : Nat) → 0 < step → Std.Range
1280-
let_expr Std.Range.mk start _stop step _prf := (← getExpr) | failure
1281-
let start_zero := Lean.Expr.nat? start == some 0
1282-
let step_one := Lean.Expr.nat? step == some 1
1283-
withAppFn do -- skip the proof
1284-
let step ← withAppArg delab
1285-
withAppFn do
1286-
let stop ← withAppArg delab
1287-
withAppFn do
1288-
let start ← withAppArg delab
1289-
match start_zero, step_one with
1290-
| false, false => `([$start : $stop : $step])
1291-
| false, true => `([$start : $stop])
1292-
| true, false => `([: $stop : $step])
1293-
| true, true => `([: $stop])
1279+
-- Std.Range.mk : (start : Nat) → (stop : Nat) → (step : Nat) → 0 < step → Std.Range
1280+
guard <| (← getExpr).getAppNumArgs == 4
1281+
-- `none` if the start is `0`
1282+
let start? ← withNaryArg 0 do
1283+
if Lean.Expr.nat? (← getExpr) == some 0 then
1284+
return none
1285+
else
1286+
some <$> delab
1287+
let stop ← withNaryArg 1 delab
1288+
-- `none` if the step is `1`
1289+
let step? ← withNaryArg 2 do
1290+
if Lean.Expr.nat? (← getExpr) == some 1 then
1291+
return none
1292+
else
1293+
some <$> delab
1294+
match start?, step? with
1295+
| some start, some step => `([$start : $stop : $step])
1296+
| some start, none => `([$start : $stop])
1297+
| none, some step => `([: $stop : $step])
1298+
| none, none => `([: $stop])
12941299

12951300
@[builtin_delab app.Std.PRange.mk]
12961301
def delabPRange : Delab := do
1297-
-- Std.PRange.mk : {shape : Std.PRange.RangeShape} → {α : Type u} → Std.PRange.Bound shape.lower α → Std.PRange.Bound shape.upper α → Std.PRange shape α
1298-
let_expr Std.PRange.mk shape _α lower upper := (← getExpr) | failure
1302+
-- Std.PRange.mk : {shape : Std.PRange.RangeShape} → {α : Type u} →
1303+
-- (lower : Std.PRange.Bound shape.lower α) → (upper : Std.PRange.Bound shape.upper α) → Std.PRange shape α
1304+
guard <| (← getExpr).getAppNumArgs == 4
12991305
let reflectBoundShape (e : Expr) : Option Std.PRange.BoundShape := match e.constName? with
1300-
| some `Std.PRange.BoundShape.closed => Std.PRange.BoundShape.closed
1301-
| some `Std.PRange.BoundShape.open => Std.PRange.BoundShape.open
1302-
| some `Std.PRange.BoundShape.unbounded => Std.PRange.BoundShape.unbounded
1306+
| some ``Std.PRange.BoundShape.closed => Std.PRange.BoundShape.closed
1307+
| some ``Std.PRange.BoundShape.open => Std.PRange.BoundShape.open
1308+
| some ``Std.PRange.BoundShape.unbounded => Std.PRange.BoundShape.unbounded
13031309
| _ => failure
13041310
let reflectRangeShape (e : Expr) : Option Std.PRange.RangeShape := do
1305-
let_expr Std.PRange.RangeShape.mk lower upper := e | failure
1311+
-- Std.PRange.RangeShape.mk (lower upper : Std.PRange.BoundShape) : Std.PRange.RangeShape
1312+
guard <| e.isAppOfArity ``Std.PRange.RangeShape.mk 2
1313+
let lower := e.appFn!.appArg!
1314+
let upper := e.appArg!
13061315
return ⟨← reflectBoundShape lower, ← reflectBoundShape upper⟩
1307-
let some shape := reflectRangeShape shape | failure
1308-
let a ← withAppArg <| withAppArg <| delab
1309-
let b ← withAppArg <| delab
1310-
match (shape, lower.constName?, upper.constName?) with
1311-
| (⟨.closed, .closed⟩, _, _) => `($a...=$b)
1312-
| (⟨.unbounded, .closed⟩, some `PUnit.unit, _) => `(*...=$b)
1313-
| (⟨.closed, .unbounded⟩, _, some `PUnit.unit) => `($a...*)
1314-
| (⟨.unbounded, .unbounded⟩, some `PUnit.unit, some `PUnit.unit) => `(*...*)
1315-
| (⟨.open, .closed⟩, _, _) => `($a<...=$b)
1316-
| (⟨.open, .unbounded⟩, _, some `PUnit.unit) => `($a<...*)
1317-
| (⟨.closed, .open⟩, _, _) => `($a...$b)
1318-
| (⟨.unbounded, .open⟩, some `PUnit.unit, _) => `(*...$b)
1319-
| (⟨.open, .open⟩, _, _) => `($a<...$b)
1316+
let some shape := reflectRangeShape ((← getExpr).getArg! 0) | failure
1317+
-- Lower bound
1318+
let (aStar, a) ← withAppFn <| withAppArg do
1319+
let isUnit := (← getExpr).isConstOf ``PUnit.unit
1320+
return (isUnit, ← delab)
1321+
-- Upper bound
1322+
let (bStar, b) ← withAppArg do
1323+
let isUnit := (← getExpr).isConstOf ``PUnit.unit
1324+
return (isUnit, ← delab)
1325+
match (shape, aStar, bStar) with
1326+
| (⟨.closed, .closed⟩, _, _) => `($a...=$b)
1327+
| (⟨.unbounded, .closed⟩, true, _) => `(*...=$b)
1328+
| (⟨.closed, .unbounded⟩, _, true) => `($a...*)
1329+
| (⟨.unbounded, .unbounded⟩, true, true) => `(*...*)
1330+
| (⟨.open, .closed⟩, _, _) => `($a<...=$b)
1331+
| (⟨.open, .unbounded⟩, _, true) => `($a<...*)
1332+
| (⟨.closed, .open⟩, _, _) => `($a...$b)
1333+
| (⟨.unbounded, .open⟩, true, _) => `(*...$b)
1334+
| (⟨.open, .open⟩, _, _) => `($a<...$b)
13201335
-- The remaining cases are aliases for explicit `<` upper bound notation:
13211336
-- | (⟨.closed, .open⟩, _, _) => `($a...<$b)
1322-
-- | (⟨.unbounded, .open⟩, some `PUnit.unit, _) => `(*...<$b)
1337+
-- | (⟨.unbounded, .open⟩, true, _) => `(*...<$b)
13231338
-- | (⟨.open, .open⟩, _, _) => `($a<...<$b)
13241339
| _ => failure
13251340

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
11
ellipsisProjIssue.lean:1:18-1:22: error(lean.unknownIdentifier): Unknown identifier `succ`
2-
(Function.const Lean.Name ()
3-
`[email protected]._hyg.11)...sorry : Std.PRange
4-
{ lower := Std.PRange.BoundShape.closed, upper := Std.PRange.BoundShape.open } (Nat → Nat → Nat)
2+
Nat.add...sorry : Std.PRange { lower := Std.PRange.BoundShape.closed, upper := Std.PRange.BoundShape.open }
3+
(Nat → Nat → Nat)

0 commit comments

Comments
 (0)