diff options
| author | Jack Koenig | 2019-01-31 17:10:50 -0800 |
|---|---|---|
| committer | GitHub | 2019-01-31 17:10:50 -0800 |
| commit | 4e77c5e14a05cedda621a4acdbc435bed23a202d (patch) | |
| tree | a54366e038a33c051d1021f28e0d55748c531437 /src | |
| parent | 905b4a709efb0acdf5a4ba8fe7b9e03a9caa4d8e (diff) | |
Use apache commons for string escaping instead of reflection (#1008)
Diffstat (limited to 'src')
| -rw-r--r-- | src/main/scala/firrtl/ir/IR.scala | 14 | ||||
| -rw-r--r-- | src/test/scala/firrtlTests/StringSpec.scala | 10 |
2 files changed, 11 insertions, 13 deletions
diff --git a/src/main/scala/firrtl/ir/IR.scala b/src/main/scala/firrtl/ir/IR.scala index 19ee56ca..4f647c0c 100644 --- a/src/main/scala/firrtl/ir/IR.scala +++ b/src/main/scala/firrtl/ir/IR.scala @@ -58,15 +58,13 @@ trait HasInfo { trait IsDeclaration extends HasName with HasInfo case class StringLit(string: String) extends FirrtlNode { + import org.apache.commons.text.StringEscapeUtils /** Returns an escaped and quoted String */ def escape: String = { - import scala.reflect.runtime.universe._ - Literal(Constant(string)).toString - } - def serialize: String = { - val str = escape - str.slice(1, str.size - 1) + "\"" + serialize + "\"" } + def serialize: String = StringEscapeUtils.escapeJava(string) + /** Format the string for Verilog */ def verilogFormat: StringLit = { StringLit(string.replaceAll("%x", "%h")) @@ -81,6 +79,7 @@ case class StringLit(string: String) extends FirrtlNode { } } object StringLit { + import org.apache.commons.text.StringEscapeUtils /** Maps characters to ASCII for Verilog emission */ private def toASCII(char: Char): List[Char] = char match { case nonASCII if !nonASCII.isValidByte => List('?') @@ -94,8 +93,7 @@ object StringLit { /** Create a StringLit from a raw parsed String */ def unescape(raw: String): StringLit = { - val str = StringContext.processEscapes(raw) - StringLit(str) + StringLit(StringEscapeUtils.unescapeJava(raw)) } } diff --git a/src/test/scala/firrtlTests/StringSpec.scala b/src/test/scala/firrtlTests/StringSpec.scala index f1f0bbde..208d9e6c 100644 --- a/src/test/scala/firrtlTests/StringSpec.scala +++ b/src/test/scala/firrtlTests/StringSpec.scala @@ -59,16 +59,16 @@ class StringSpec extends FirrtlPropSpec { // Whitelist is [0x20 - 0x7e] val whitelist = - """ !\"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ""" + + """ !\"#$%&\''()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ""" + """[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~""" property(s"Character whitelist should be supported: [$whitelist] ") { val lit = StringLit.unescape(whitelist) + // We accept \' but don't bother escaping it ourselves + val res = whitelist.replaceAll("""\\'""", "'") // Check result - assert(lit.serialize == whitelist) - // Scala likes to escape ' as \', Verilog doesn't - val verilogWhitelist = whitelist.replaceAll("""\\'""", "'") - assert(lit.verilogEscape.tail.init == verilogWhitelist) + assert(lit.serialize == res) + assert(lit.verilogEscape.tail.init == res) } // Valid escapes = \n, \t, \\, \", \' |
