@@ -24,17 +24,27 @@ object Formatting {
2424 object Shown :
2525 given [A : Show ]: Conversion [A , Shown ] = Show [A ].show(_)
2626
27+ extension (s : Shown )
28+ def runCtxShow (using Context ): Shown = s match
29+ case cs : CtxShow => cs.run
30+ case _ => s
31+
32+ def toStr (x : Shown )(using Context ): String = x match
33+ case seq : Seq [? ] => seq.map(toStr).mkString(" [" , " , " , " ]" )
34+ case res => res.tryToShow
35+
36+ import Shown .runCtxShow
37+
2738 sealed abstract class Show [- T ]:
2839 /** Show a value T by returning a "shown" result. */
2940 def show (x : T ): Shown
3041
3142 trait CtxShow :
3243 def run (using Context ): Shown
3344
34- extension (s : Shown )
35- def ctxShow (using Context ): Shown = s match
36- case cs : CtxShow => cs.run
37- case _ => s
45+ private inline def CtxShow (inline x : Context ?=> Shown ) = new CtxShow { def run (using Context ) = x(using ctx) }
46+ private def toStr [A : Show ](x : A )(using Context ): String = Shown .toStr(toShown(x))
47+ private def toShown [A : Show ](x : A )(using Context ): Shown = Show [A ].show(x).runCtxShow
3848
3949 /** The base implementation, passing the argument to StringFormatter which will try to `.show` it. */
4050 object ShowAny extends Show [Any ]:
@@ -54,16 +64,26 @@ object Formatting {
5464 object Show extends ShowImplicits1 :
5565 inline def apply [A ](using inline z : Show [A ]): Show [A ] = z
5666
67+ given [X : Show ]: Show [Option [X ]] with
68+ def show (x : Option [X ]) =
69+ CtxShow (x.map(toStr))
70+ end given
71+
5772 given [X : Show ]: Show [Seq [X ]] with
58- def show (x : Seq [X ]) = new CtxShow :
59- def run (using Context ) = x.map(show1)
73+ def show (x : Seq [X ]) = CtxShow (x.map(toStr))
74+
75+ given [K : Show , V : Show ]: Show [Map [K , V ]] with
76+ def show (x : Map [K , V ]) =
77+ CtxShow (x.map((k, v) => s " ${toStr(k)} => ${toStr(v)}" ))
78+ end given
6079
6180 given [H : Show , T <: Tuple : Show ]: Show [H *: T ] with
62- def show (x : H *: T ) = new CtxShow :
63- def run (using Context ) = show1(x.head) *: Show [T ].show(x.tail).ctxShow.asInstanceOf [Tuple ]
81+ def show (x : H *: T ) =
82+ CtxShow (toStr(x.head) *: toShown(x.tail).asInstanceOf [Tuple ])
83+ end given
6484
6585 given [X : Show ]: Show [X | Null ] with
66- def show (x : X | Null ) = if x == null then " null" else Show [ X ].show( x.nn)
86+ def show (x : X | Null ) = if x == null then " null" else CtxShow (toStr( x.nn) )
6787
6888 given Show [FlagSet ] with
6989 def show (x : FlagSet ) = x.flagsString
@@ -79,7 +99,13 @@ object Formatting {
7999 case ast.TreeInfo .Impure => " PurityLevel.Impure"
80100 case ast.TreeInfo .PurePath => " PurityLevel.PurePath"
81101 case ast.TreeInfo .IdempotentPath => " PurityLevel.IdempotentPath"
82- case _ => s " PurityLevel( ${x.x}) "
102+ case _ => s " PurityLevel( ${x.x.toBinaryString}) "
103+
104+ given Show [Atoms ] with
105+ def show (x : Atoms ) = x match
106+ case Atoms .Unknown => " Unknown"
107+ case Atoms .Range (lo, hi) => CtxShow (s " Range( ${toStr(lo.toList)}, ${toStr(hi.toList)}) " )
108+ end given
83109
84110 given Show [Showable ] = ShowAny
85111 given Show [Shown ] = ShowAny
@@ -101,11 +127,6 @@ object Formatting {
101127 given Show [util.Spans .Span ] = ShowAny
102128 given Show [tasty.TreeUnpickler # OwnerTree ] = ShowAny
103129 given Show [typer.ForceDegree .Value ] = ShowAny
104-
105- private def show1 [A : Show ](x : A )(using Context ) = show2(Show [A ].show(x).ctxShow)
106- private def show2 (x : Shown )(using Context ): String = x match
107- case seq : Seq [? ] => seq.map(show2).mkString(" [" , " , " , " ]" )
108- case res => res.tryToShow
109130 end Show
110131 end ShownDef
111132 export ShownDef .{ Show , Shown }
@@ -122,7 +143,7 @@ object Formatting {
122143 class StringFormatter (protected val sc : StringContext ) {
123144 protected def showArg (arg : Any )(using Context ): String = arg.tryToShow
124145
125- private def treatArg (arg : Shown , suffix : String )(using Context ): (String , String ) = arg.ctxShow match {
146+ private def treatArg (arg : Shown , suffix : String )(using Context ): (String , String ) = arg.runCtxShow match {
126147 case arg : Seq [? ] if suffix.indexOf('%' ) == 0 && suffix.indexOf('%' , 1 ) != - 1 =>
127148 val end = suffix.indexOf('%' , 1 )
128149 val sep = StringContext .processEscapes(suffix.substring(1 , end))
0 commit comments