@@ -24,17 +24,27 @@ object Formatting {
24
24
object Shown :
25
25
given [A : Show ]: Conversion [A , Shown ] = Show [A ].show(_)
26
26
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
+
27
38
sealed abstract class Show [- T ]:
28
39
/** Show a value T by returning a "shown" result. */
29
40
def show (x : T ): Shown
30
41
31
42
trait CtxShow :
32
43
def run (using Context ): Shown
33
44
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
38
48
39
49
/** The base implementation, passing the argument to StringFormatter which will try to `.show` it. */
40
50
object ShowAny extends Show [Any ]:
@@ -54,16 +64,26 @@ object Formatting {
54
64
object Show extends ShowImplicits1 :
55
65
inline def apply [A ](using inline z : Show [A ]): Show [A ] = z
56
66
67
+ given [X : Show ]: Show [Option [X ]] with
68
+ def show (x : Option [X ]) =
69
+ CtxShow (x.map(toStr))
70
+ end given
71
+
57
72
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
60
79
61
80
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
64
84
65
85
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) )
67
87
68
88
given Show [FlagSet ] with
69
89
def show (x : FlagSet ) = x.flagsString
@@ -79,7 +99,13 @@ object Formatting {
79
99
case ast.TreeInfo .Impure => " PurityLevel.Impure"
80
100
case ast.TreeInfo .PurePath => " PurityLevel.PurePath"
81
101
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
83
109
84
110
given Show [Showable ] = ShowAny
85
111
given Show [Shown ] = ShowAny
@@ -101,11 +127,6 @@ object Formatting {
101
127
given Show [util.Spans .Span ] = ShowAny
102
128
given Show [tasty.TreeUnpickler # OwnerTree ] = ShowAny
103
129
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
109
130
end Show
110
131
end ShownDef
111
132
export ShownDef .{ Show , Shown }
@@ -122,7 +143,7 @@ object Formatting {
122
143
class StringFormatter (protected val sc : StringContext ) {
123
144
protected def showArg (arg : Any )(using Context ): String = arg.tryToShow
124
145
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 {
126
147
case arg : Seq [? ] if suffix.indexOf('%' ) == 0 && suffix.indexOf('%' , 1 ) != - 1 =>
127
148
val end = suffix.indexOf('%' , 1 )
128
149
val sep = StringContext .processEscapes(suffix.substring(1 , end))
0 commit comments