From 08a4772207c5500cc93b3cdedff8bfb2f4322a66 Mon Sep 17 00:00:00 2001 From: Martin Odersky Date: Tue, 27 Nov 2007 17:57:08 +0000 Subject: Made format compatibkle with JDK 1.4. Fixed #197 --- src/compiler/scala/tools/nsc/symtab/Definitions.scala | 1 + src/library/scala/runtime/StringAdd.scala | 18 ++++++++++++++++-- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/compiler/scala/tools/nsc/symtab/Definitions.scala b/src/compiler/scala/tools/nsc/symtab/Definitions.scala index 04bc33e043..72f6e3882a 100644 --- a/src/compiler/scala/tools/nsc/symtab/Definitions.scala +++ b/src/compiler/scala/tools/nsc/symtab/Definitions.scala @@ -673,6 +673,7 @@ trait Definitions { UnitClass = newClass(ScalaPackageClass, nme.Unit, List(AnyValClass.typeConstructor)) + .setFlag(ABSTRACT | FINAL) abbrvTag(UnitClass) = 'V' BooleanClass = newValueClass(nme.Boolean, 'Z') diff --git a/src/library/scala/runtime/StringAdd.scala b/src/library/scala/runtime/StringAdd.scala index 2ca64538d9..8591ae3313 100644 --- a/src/library/scala/runtime/StringAdd.scala +++ b/src/library/scala/runtime/StringAdd.scala @@ -14,6 +14,13 @@ package scala.runtime import Predef._ +object StringAdd { + // Needed for the format hack. Can be removed once we drop 1.4 + lazy val formatMethod: java.lang.reflect.Method = { + val paramTypes = Array(classOf[String], classOf[Array[Object]]) + classOf[String].getDeclaredMethod("format", paramTypes) + } +} final class StringAdd(self: Any) { def +(other: String) = self.toString + other @@ -21,7 +28,14 @@ final class StringAdd(self: Any) { /** Formats string according to given format string. * Format strings are as for String.format * (@see java.lang.String.format). + * Only works on Java 1.5 or higher! */ - def format(format: String): String = - String.format(format, Array(self.asInstanceOf[Object])) + def format(format: String): String = { + // This should be: + // String.format(format, Array(self.asInstanceOf[Object])) + // However, the line above does not compile on Java 1.4 because String.format exists only in 1.5 + // Therefore, we do the following hack: + val args = Array(self.asInstanceOf[Object]) + StringAdd.formatMethod.invoke(null, Array[Object](format, args)).asInstanceOf[String] + } } -- cgit v1.2.3