Skip to content

Commit 7356953

Browse files
move InfoString from ErrorReporting to Decorators and
remove all isSensical/SuppressedMessage logic from InfoString
1 parent 7c5dd00 commit 7356953

File tree

7 files changed

+36
-44
lines changed

7 files changed

+36
-44
lines changed

src/dotty/tools/dotc/ast/Desugar.scala

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import Decorators._
99
import language.higherKinds
1010
import collection.mutable.ListBuffer
1111
import config.Printers._
12-
import typer.ErrorReporting.InfoString
1312
import typer.Mode
1413

1514
object desugar {

src/dotty/tools/dotc/core/Decorators.scala

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ package core
33

44
import annotation.tailrec
55
import Symbols._
6-
import Contexts._, Names._, Phases._, printing.Texts._, printing.Printer
6+
import Contexts._, Names._, Phases._, printing.Texts._, printing.Printer, printing.Showable
77
import util.Positions.Position, util.SourcePosition
88
import collection.mutable.ListBuffer
99
import scala.language.implicitConversions
@@ -133,5 +133,36 @@ object Decorators {
133133

134134
implicit def sourcePos(pos: Position)(implicit ctx: Context): SourcePosition =
135135
ctx.source.atPos(pos)
136+
137+
/** The i"..." string interpolator adds two features to the s interpolator:
138+
* 1) On all Showables, `show` is called instead of `toString`
139+
* 2) Lists can be formatted using the desired separator between two `%` signs,
140+
* eg `i"myList = (${myList}%, %)"`
141+
*/
142+
implicit class InfoString(val sc: StringContext) extends AnyVal {
143+
144+
def i(args: Any*)(implicit ctx: Context): String = {
145+
146+
def treatArg(arg: Any, suffix: String): (Any, String) = arg match {
147+
case arg: List[_] if suffix.nonEmpty && suffix.head == '%' =>
148+
val (rawsep, rest) = suffix.tail.span(_ != '%')
149+
val sep = StringContext.treatEscapes(rawsep)
150+
if (rest.nonEmpty) (arg map treatSingleArg mkString sep, rest.tail)
151+
else (arg, suffix)
152+
case _ =>
153+
(treatSingleArg(arg), suffix)
154+
}
155+
156+
def treatSingleArg(arg: Any) : Any = arg match {
157+
case arg: Showable => arg.show
158+
case _ => arg
159+
}
160+
161+
val prefix :: suffixes = sc.parts.toList
162+
val (args1, suffixes1) = (args, suffixes).zipped.map(treatArg(_, _)).unzip
163+
new StringContext(prefix :: suffixes1.toList: _*).s(args1: _*)
164+
}
165+
}
166+
136167
}
137168

src/dotty/tools/dotc/typer/Checking.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import util.{Stats, SimpleMap}
1414
import util.common._
1515
import Decorators._
1616
import Uniques._
17-
import ErrorReporting.{errorType, InfoString}
17+
import ErrorReporting.errorType
1818
import config.Printers._
1919
import collection.mutable
2020

src/dotty/tools/dotc/typer/ErrorReporting.scala

Lines changed: 0 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -105,42 +105,4 @@ object ErrorReporting {
105105

106106
def err(implicit ctx: Context): Errors = new Errors
107107

108-
/** Implementation of i"..." string interpolator */
109-
implicit class InfoString(val sc: StringContext) extends AnyVal {
110-
111-
def i(args: Any*)(implicit ctx: Context): String = {
112-
113-
def isSensical(arg: Any): Boolean = arg match {
114-
case tpe: Type if tpe.isErroneous => false
115-
case NoType => false
116-
case sym: Symbol if sym.isCompleted =>
117-
sym.info != ErrorType && sym.info != TypeAlias(ErrorType) && sym.info != NoType
118-
case _ => true
119-
}
120-
121-
def treatArg(arg: Any, suffix: String): (Any, String) = arg match {
122-
case arg: List[_] if suffix.nonEmpty && suffix.head == '%' =>
123-
val (rawsep, rest) = suffix.tail.span(_ != '%')
124-
val sep = StringContext.treatEscapes(rawsep)
125-
if (rest.nonEmpty) (arg map treatSingleArg mkString sep, rest.tail)
126-
else (arg, suffix)
127-
case _ =>
128-
(treatSingleArg(arg), suffix)
129-
}
130-
131-
def treatSingleArg(arg: Any) : Any = arg match {
132-
case arg: Showable => arg.show
133-
case _ => arg
134-
}
135-
136-
if (ctx.reporter.hasErrors &&
137-
ctx.suppressNonSensicalErrors &&
138-
!ctx.settings.YshowSuppressedErrors.value &&
139-
!args.forall(isSensical(_)))
140-
throw new SuppressedMessage
141-
val prefix :: suffixes = sc.parts.toList
142-
val (args1, suffixes1) = (args, suffixes).zipped.map(treatArg(_, _)).unzip
143-
new StringContext(prefix :: suffixes1.toList: _*).s(args1: _*)
144-
}
145-
}
146108
}

src/dotty/tools/dotc/typer/ImportInfo.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import ast.Trees._
77
import core._
88
import util.SimpleMap
99
import Symbols._, Names._, Denotations._, Types._, Contexts._, StdNames._, Flags._
10-
import typer.ErrorReporting.InfoString
10+
import Decorators.InfoString
1111

1212
object ImportInfo {
1313
/** The import info for a root import from given symbol `sym` */

src/dotty/tools/dotc/typer/Inferencing.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import util.{Stats, SimpleMap}
1515
import util.common._
1616
import Decorators._
1717
import Uniques._
18-
import ErrorReporting.{errorType, InfoString}
18+
import ErrorReporting.errorType
1919
import config.Printers._
2020
import collection.mutable
2121

src/dotty/tools/dotc/typer/ProtoTypes.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import util.{Stats, SimpleMap}
1414
import util.common._
1515
import Decorators._
1616
import Uniques._
17-
import ErrorReporting.{errorType, InfoString}
17+
import ErrorReporting.errorType
1818
import config.Printers._
1919
import collection.mutable
2020

0 commit comments

Comments
 (0)