blob: e7579229b20f6bc8f692fef1b3f32b1b274bcf97 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
|
package scala.reflect
package internal
package util
trait StripMarginInterpolator {
def stringContext: StringContext
/**
* A safe combination of `[[scala.collection.immutable.StringLike#stripMargin]]
* and [[scala.StringContext#raw]].
*
* The margin of each line is defined by whitespace leading up to a '|' character.
* This margin is stripped '''before''' the arguments are interpolated into to string.
*
* String escape sequences are '''not''' processed; this interpolater is designed to
* be used with triple quoted Strings.
*
* {{{
* scala> val foo = "f|o|o"
* foo: String = f|o|o
* scala> sm"""|${foo}
* |"""
* res0: String =
* "f|o|o
* "
* }}}
*/
final def sm(args: Any*): String = {
def isLineBreak(c: Char) = c == '\n' || c == '\f' // compatible with StringLike#isLineBreak
def stripTrailingPart(s: String) = {
val (pre, post) = s.span(c => !isLineBreak(c))
pre + post.stripMargin
}
val stripped: List[String] = stringContext.parts.toList match {
case head :: tail => head.stripMargin :: (tail map stripTrailingPart)
case Nil => Nil
}
new StringContext(stripped: _*).raw(args: _*)
}
}
|