@@ -15,6 +15,7 @@ import dotty.tools.dotc.core.Contexts._
15
15
import dotty .tools .dotc .core .Symbols ._
16
16
import dotty .tools .dotc .core .Types ._
17
17
import dotty .tools .dotc .core .Phases .typerPhase
18
+ import dotty .tools .dotc .util .Spans .Span
18
19
19
20
/** Formatter string checker. */
20
21
class TypedFormatChecker (partsElems : List [Tree ], parts : List [String ], args : List [Tree ])(using Context ):
@@ -33,7 +34,7 @@ class TypedFormatChecker(partsElems: List[Tree], parts: List[String], args: List
33
34
types.find(t => argConformsTo(argi, tpe, t))
34
35
.orElse(types.find(t => argConvertsTo(argi, tpe, t)))
35
36
.getOrElse {
36
- report.argError(s " Found: ${tpe.show}, Required: ${types.mkString(" , " )}" , argi)
37
+ report.argError(s " Found: ${tpe.show}, Required: ${types.map(_.show). mkString(" , " )}" , argi)
37
38
actuals += args(argi)
38
39
types.head
39
40
}
@@ -118,6 +119,7 @@ class TypedFormatChecker(partsElems: List[Tree], parts: List[String], args: List
118
119
119
120
extension (descriptor : Match )
120
121
def at (g : SpecGroup ): Int = descriptor.start(g.ordinal)
122
+ def end (g : SpecGroup ): Int = descriptor.end(g.ordinal)
121
123
def offset (g : SpecGroup , i : Int = 0 ): Int = at(g) + i
122
124
def group (g : SpecGroup ): Option [String ] = Option (descriptor.group(g.ordinal))
123
125
def stringOf (g : SpecGroup ): String = group(g).getOrElse(" " )
@@ -243,8 +245,8 @@ class TypedFormatChecker(partsElems: List[Tree], parts: List[String], args: List
243
245
val i = flags.indexOf(f) match { case - 1 => 0 case j => j }
244
246
errorAt(Flags , i)(msg)
245
247
246
- def errorAt (g : SpecGroup , i : Int = 0 )(msg : String ) = report.partError(msg, argi, descriptor.offset(g, i))
247
- def warningAt (g : SpecGroup , i : Int = 0 )(msg : String ) = report.partWarning(msg, argi, descriptor.offset(g, i))
248
+ def errorAt (g : SpecGroup , i : Int = 0 )(msg : String ) = report.partError(msg, argi, descriptor.offset(g, i), descriptor.end(g) )
249
+ def warningAt (g : SpecGroup , i : Int = 0 )(msg : String ) = report.partWarning(msg, argi, descriptor.offset(g, i), descriptor.end(g) )
248
250
249
251
object Conversion :
250
252
def apply (m : Match , i : Int ): Conversion =
@@ -272,12 +274,14 @@ class TypedFormatChecker(partsElems: List[Tree], parts: List[String], args: List
272
274
273
275
var reported = false
274
276
275
- private def partPosAt (index : Int , offset : Int ) =
277
+ private def partPosAt (index : Int , offset : Int , end : Int ) =
276
278
val pos = partsElems(index).sourcePos
277
- pos.withSpan(pos.span.shift(offset))
279
+ val bgn = pos.span.start + offset
280
+ val fin = if end < 0 then pos.span.end else pos.span.start + end
281
+ pos.withSpan(Span (bgn, fin, bgn))
278
282
279
283
extension (r : report.type )
280
284
def argError (message : String , index : Int ): Unit = r.error(message, args(index).srcPos).tap(_ => reported = true )
281
- def partError (message : String , index : Int , offset : Int ): Unit = r.error(message, partPosAt(index, offset)).tap(_ => reported = true )
282
- def partWarning (message : String , index : Int , offset : Int ): Unit = r.warning(message, partPosAt(index, offset)).tap(_ => reported = true )
285
+ def partError (message : String , index : Int , offset : Int , end : Int = - 1 ): Unit = r.error(message, partPosAt(index, offset, end )).tap(_ => reported = true )
286
+ def partWarning (message : String , index : Int , offset : Int , end : Int = - 1 ): Unit = r.warning(message, partPosAt(index, offset, end )).tap(_ => reported = true )
283
287
end TypedFormatChecker
0 commit comments