@@ -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 ]:
@@ -55,26 +65,25 @@ object Formatting {
5565 inline def apply [A ](using inline z : Show [A ]): Show [A ] = z
5666
5767 given [X : Show ]: Show [Option [X ]] with
58- def show (x : Option [X ]) = new CtxShow :
59- def run ( using Context ) = x.map(show1 )
68+ def show (x : Option [X ]) =
69+ CtxShow ( x.map(toStr) )
6070 end given
6171
6272 given [X : Show ]: Show [Seq [X ]] with
63- def show (x : Seq [X ]) = new CtxShow :
64- def run (using Context ) = x.map(show1)
73+ def show (x : Seq [X ]) = CtxShow (x.map(toStr))
6574
6675 given [K : Show , V : Show ]: Show [Map [K , V ]] with
67- def show (x : Map [K , V ]) = new CtxShow :
68- def run (using Context ) =
69- x.map((k, v) => s " ${show1(k)} => ${show1(v)}" )
76+ def show (x : Map [K , V ]) =
77+ CtxShow (x.map((k, v) => s " ${toStr(k)} => ${toStr(v)}" ))
7078 end given
7179
7280 given [H : Show , T <: Tuple : Show ]: Show [H *: T ] with
73- def show (x : H *: T ) = new CtxShow :
74- 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
7584
7685 given [X : Show ]: Show [X | Null ] with
77- 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) )
7887
7988 given Show [FlagSet ] with
8089 def show (x : FlagSet ) = x.flagsString
@@ -90,7 +99,13 @@ object Formatting {
9099 case ast.TreeInfo .Impure => " PurityLevel.Impure"
91100 case ast.TreeInfo .PurePath => " PurityLevel.PurePath"
92101 case ast.TreeInfo .IdempotentPath => " PurityLevel.IdempotentPath"
93- 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
94109
95110 given Show [Showable ] = ShowAny
96111 given Show [Shown ] = ShowAny
@@ -112,11 +127,6 @@ object Formatting {
112127 given Show [util.Spans .Span ] = ShowAny
113128 given Show [tasty.TreeUnpickler # OwnerTree ] = ShowAny
114129 given Show [typer.ForceDegree .Value ] = ShowAny
115-
116- private def show1 [A : Show ](x : A )(using Context ) = show2(Show [A ].show(x).ctxShow)
117- private def show2 (x : Shown )(using Context ): String = x match
118- case seq : Seq [? ] => seq.map(show2).mkString(" [" , " , " , " ]" )
119- case res => res.tryToShow
120130 end Show
121131 end ShownDef
122132 export ShownDef .{ Show , Shown }
@@ -133,7 +143,7 @@ object Formatting {
133143 class StringFormatter (protected val sc : StringContext ) {
134144 protected def showArg (arg : Any )(using Context ): String = arg.tryToShow
135145
136- 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 {
137147 case arg : Seq [? ] if suffix.indexOf('%' ) == 0 && suffix.indexOf('%' , 1 ) != - 1 =>
138148 val end = suffix.indexOf('%' , 1 )
139149 val sep = StringContext .processEscapes(suffix.substring(1 , end))
0 commit comments