diff options
author | Paul Phillips <paulp@improving.org> | 2011-03-19 00:31:59 +0000 |
---|---|---|
committer | Paul Phillips <paulp@improving.org> | 2011-03-19 00:31:59 +0000 |
commit | e7c2ab469c44894a9523d9660fd5fe32147a8996 (patch) | |
tree | ca6bde9b6f478b23c3e30d1dc1526bd6bb5ae16b /src | |
parent | a7d2d13732df77e67fad790d3df9674082e7169d (diff) | |
download | scala-e7c2ab469c44894a9523d9660fd5fe32147a8996.tar.gz scala-e7c2ab469c44894a9523d9660fd5fe32147a8996.tar.bz2 scala-e7c2ab469c44894a9523d9660fd5fe32147a8996.zip |
rytz's patch for making our crazy long names a ...
rytz's patch for making our crazy long names a bit less crazy. You can
now use -Xmax-classfile-name to limit your filenames to as few as 72
characters. Watch out, nanotube gardens, we'll be stepping on your tiny
flowers before you know it. No review.
Diffstat (limited to 'src')
-rw-r--r-- | src/compiler/scala/tools/nsc/settings/ScalaSettings.scala | 1 | ||||
-rw-r--r-- | src/compiler/scala/tools/nsc/symtab/NameManglers.scala | 23 | ||||
-rw-r--r-- | src/compiler/scala/tools/nsc/symtab/Names.scala | 23 |
3 files changed, 19 insertions, 28 deletions
diff --git a/src/compiler/scala/tools/nsc/settings/ScalaSettings.scala b/src/compiler/scala/tools/nsc/settings/ScalaSettings.scala index 1670dfb94a..7405ca0b3d 100644 --- a/src/compiler/scala/tools/nsc/settings/ScalaSettings.scala +++ b/src/compiler/scala/tools/nsc/settings/ScalaSettings.scala @@ -57,6 +57,7 @@ trait ScalaSettings extends AbsScalaSettings with StandardScalaSettings { val future = BooleanSetting ("-Xfuture", "Turn on future language features.") val genPhaseGraph = StringSetting ("-Xgenerate-phase-graph", "file", "Generate the phase graphs (outputs .dot files) to fileX.dot.", "") val XlogImplicits = BooleanSetting ("-Xlog-implicits", "Show more detail on why some implicits are not applicable.") + val maxClassfileName = IntSetting ("-Xmax-classfile-name", "Maximum filename length for generated classes", 255, Some(72, 255), _ => None) val Xmigration28 = BooleanSetting ("-Xmigration", "Warn about constructs whose behavior may have changed between 2.7 and 2.8.") val nouescape = BooleanSetting ("-Xno-uescape", "Disable handling of \\u unicode escapes.") val Xnojline = BooleanSetting ("-Xnojline", "Do not use JLine for editing.") diff --git a/src/compiler/scala/tools/nsc/symtab/NameManglers.scala b/src/compiler/scala/tools/nsc/symtab/NameManglers.scala index b24a064139..dae07a29d5 100644 --- a/src/compiler/scala/tools/nsc/symtab/NameManglers.scala +++ b/src/compiler/scala/tools/nsc/symtab/NameManglers.scala @@ -22,15 +22,28 @@ trait NameManglers { def flattenedName(segments: Name*): NameType = compactedString(segments mkString "$") - private final val MaxFileNameLength = 255 - private final val MaxNameLength = MaxFileNameLength - 6 // leave space for ".class" - - /** "COMPACTIFY" */ + /** + * COMPACTIFY + * + * The hashed name has the form (prefix + marker + md5 + marker + suffix), where + * - prefix/suffix.length = MaxNameLength / 4 + * - md5.length = 32 + * + * We obtain the formula: + * + * FileNameLength = 2*(MaxNameLength / 4) + 2.marker.length + 32 + 6 + * + * (+6 for ".class"). MaxNameLength can therefore be computed as follows: + */ + private final val marker = "$$$$" + private final val MaxNameLength = math.min( + settings.maxClassfileName.value - 6, + 2 * (settings.maxClassfileName.value - 6 - 2*marker.length - 32) + 6 + ) private lazy val md5 = MessageDigest.getInstance("MD5") private def toMD5(s: String, edge: Int) = { val prefix = s take edge val suffix = s takeRight edge - val marker = "$$$$" val cs = s.toArray val bytes = Codec toUTF8 cs diff --git a/src/compiler/scala/tools/nsc/symtab/Names.scala b/src/compiler/scala/tools/nsc/symtab/Names.scala index 9e0348c2e3..a046058faf 100644 --- a/src/compiler/scala/tools/nsc/symtab/Names.scala +++ b/src/compiler/scala/tools/nsc/symtab/Names.scala @@ -23,9 +23,6 @@ trait Names extends reflect.generic.Names { private final val HASH_MASK = 0x7FFF private final val NAME_SIZE = 0x20000 - private final val MaxFileNameLength = 255 - private final val MaxClassNameLength = MaxFileNameLength - 6 // leave space for ".class" - final val nameDebug = false /** memory to store all names sequentially @@ -78,26 +75,6 @@ trait Names extends reflect.generic.Names { else nc = nc + len } - private lazy val md5 = MessageDigest.getInstance("MD5") - - /** "COMPACTIFY" */ - private def toMD5(s: String, edge: Int) = { - val prefix = s take edge - val suffix = s takeRight edge - val marker = "$$$$" - - val cs = s.toArray - val bytes = Codec toUTF8 cs - md5 update bytes - val md5chars = md5.digest() map (b => (b & 0xFF).toHexString) mkString - - prefix + marker + md5chars + marker + suffix - } - - def compactify(s: String): String = - if (s.length <= MaxClassNameLength) s - else toMD5(s, MaxClassNameLength / 4) - /** Create a term name from the characters in cs[offset..offset+len-1]. */ def newTermName(cs: Array[Char], offset: Int, len: Int): TermName = { |