diff options
-rw-r--r-- | src/compiler/scala/tools/ant/templates/tool-unix.tmpl | 22 | ||||
-rw-r--r-- | src/compiler/scala/tools/nsc/backend/jvm/GenJVM.scala | 14 | ||||
-rw-r--r-- | src/compiler/scala/tools/nsc/transform/LiftCode.scala | 2 | ||||
-rw-r--r-- | test/disabled/presentation/akka.check (renamed from test/files/presentation/akka.check) | 0 | ||||
-rw-r--r-- | test/disabled/presentation/akka.flags (renamed from test/files/presentation/akka.flags) | 0 | ||||
-rw-r--r-- | test/disabled/presentation/akka/Runner.scala (renamed from test/files/presentation/akka/Runner.scala) | 0 | ||||
-rw-r--r-- | test/disabled/presentation/akka/src/akka/AkkaException.scala (renamed from test/files/presentation/akka/src/akka/AkkaException.scala) | 0 | ||||
-rw-r--r-- | test/disabled/presentation/akka/src/akka/actor/Actor.scala (renamed from test/files/presentation/akka/src/akka/actor/Actor.scala) | 0 | ||||
-rw-r--r-- | test/disabled/presentation/akka/src/akka/actor/ActorRef.scala (renamed from test/files/presentation/akka/src/akka/actor/ActorRef.scala) | 0 | ||||
-rw-r--r-- | test/disabled/presentation/akka/src/akka/actor/ActorRegistry.scala (renamed from test/files/presentation/akka/src/akka/actor/ActorRegistry.scala) | 0 | ||||
-rw-r--r-- | test/disabled/presentation/akka/src/akka/actor/Actors.java (renamed from test/files/presentation/akka/src/akka/actor/Actors.java) | 0 | ||||
-rw-r--r-- | test/disabled/presentation/akka/src/akka/actor/BootableActorLoaderService.scala (renamed from test/files/presentation/akka/src/akka/actor/BootableActorLoaderService.scala) | 0 | ||||
-rw-r--r-- | test/disabled/presentation/akka/src/akka/actor/FSM.scala (renamed from test/files/presentation/akka/src/akka/actor/FSM.scala) | 0 | ||||
-rw-r--r-- | test/disabled/presentation/akka/src/akka/actor/Scheduler.scala (renamed from test/files/presentation/akka/src/akka/actor/Scheduler.scala) | 0 | ||||
-rw-r--r-- | test/disabled/presentation/akka/src/akka/actor/Supervisor.scala (renamed from test/files/presentation/akka/src/akka/actor/Supervisor.scala) | 0 | ||||
-rw-r--r-- | test/disabled/presentation/akka/src/akka/actor/UntypedActor.scala (renamed from test/files/presentation/akka/src/akka/actor/UntypedActor.scala) | 0 | ||||
-rw-r--r-- | test/disabled/presentation/akka/src/akka/actor/package.scala (renamed from test/files/presentation/akka/src/akka/actor/package.scala) | 0 | ||||
-rw-r--r-- | test/disabled/presentation/akka/src/akka/config/Config.scala (renamed from test/files/presentation/akka/src/akka/config/Config.scala) | 0 | ||||
-rw-r--r-- | test/disabled/presentation/akka/src/akka/config/ConfigParser.scala (renamed from test/files/presentation/akka/src/akka/config/ConfigParser.scala) | 0 | ||||
-rw-r--r-- | test/disabled/presentation/akka/src/akka/config/Configuration.scala (renamed from test/files/presentation/akka/src/akka/config/Configuration.scala) | 0 | ||||
-rw-r--r-- | test/disabled/presentation/akka/src/akka/config/Configurator.scala (renamed from test/files/presentation/akka/src/akka/config/Configurator.scala) | 0 | ||||
-rw-r--r-- | test/disabled/presentation/akka/src/akka/config/Importer.scala (renamed from test/files/presentation/akka/src/akka/config/Importer.scala) | 0 | ||||
-rw-r--r-- | test/disabled/presentation/akka/src/akka/config/SupervisionConfig.scala (renamed from test/files/presentation/akka/src/akka/config/SupervisionConfig.scala) | 0 | ||||
-rw-r--r-- | test/disabled/presentation/akka/src/akka/dataflow/DataFlow.scala (renamed from test/files/presentation/akka/src/akka/dataflow/DataFlow.scala) | 0 | ||||
-rw-r--r-- | test/disabled/presentation/akka/src/akka/dispatch/Dispatchers.scala (renamed from test/files/presentation/akka/src/akka/dispatch/Dispatchers.scala) | 0 | ||||
-rw-r--r-- | test/disabled/presentation/akka/src/akka/dispatch/ExecutorBasedEventDrivenDispatcher.scala (renamed from test/files/presentation/akka/src/akka/dispatch/ExecutorBasedEventDrivenDispatcher.scala) | 0 | ||||
-rw-r--r-- | test/disabled/presentation/akka/src/akka/dispatch/ExecutorBasedEventDrivenWorkStealingDispatcher.scala (renamed from test/files/presentation/akka/src/akka/dispatch/ExecutorBasedEventDrivenWorkStealingDispatcher.scala) | 0 | ||||
-rw-r--r-- | test/disabled/presentation/akka/src/akka/dispatch/Future.scala (renamed from test/files/presentation/akka/src/akka/dispatch/Future.scala) | 0 | ||||
-rw-r--r-- | test/disabled/presentation/akka/src/akka/dispatch/MailboxHandling.scala (renamed from test/files/presentation/akka/src/akka/dispatch/MailboxHandling.scala) | 0 | ||||
-rw-r--r-- | test/disabled/presentation/akka/src/akka/dispatch/MessageHandling.scala (renamed from test/files/presentation/akka/src/akka/dispatch/MessageHandling.scala) | 0 | ||||
-rw-r--r-- | test/disabled/presentation/akka/src/akka/dispatch/ThreadBasedDispatcher.scala (renamed from test/files/presentation/akka/src/akka/dispatch/ThreadBasedDispatcher.scala) | 0 | ||||
-rw-r--r-- | test/disabled/presentation/akka/src/akka/dispatch/ThreadPoolBuilder.scala (renamed from test/files/presentation/akka/src/akka/dispatch/ThreadPoolBuilder.scala) | 0 | ||||
-rw-r--r-- | test/disabled/presentation/akka/src/akka/event/EventHandler.scala (renamed from test/files/presentation/akka/src/akka/event/EventHandler.scala) | 0 | ||||
-rw-r--r-- | test/disabled/presentation/akka/src/akka/event/JavaEventHandler.java (renamed from test/files/presentation/akka/src/akka/event/JavaEventHandler.java) | 0 | ||||
-rw-r--r-- | test/disabled/presentation/akka/src/akka/japi/JavaAPI.scala (renamed from test/files/presentation/akka/src/akka/japi/JavaAPI.scala) | 0 | ||||
-rw-r--r-- | test/disabled/presentation/akka/src/akka/remoteinterface/RemoteEventHandler.scala (renamed from test/files/presentation/akka/src/akka/remoteinterface/RemoteEventHandler.scala) | 0 | ||||
-rw-r--r-- | test/disabled/presentation/akka/src/akka/remoteinterface/RemoteInterface.scala (renamed from test/files/presentation/akka/src/akka/remoteinterface/RemoteInterface.scala) | 0 | ||||
-rw-r--r-- | test/disabled/presentation/akka/src/akka/routing/Iterators.scala (renamed from test/files/presentation/akka/src/akka/routing/Iterators.scala) | 0 | ||||
-rw-r--r-- | test/disabled/presentation/akka/src/akka/routing/Listeners.scala (renamed from test/files/presentation/akka/src/akka/routing/Listeners.scala) | 0 | ||||
-rw-r--r-- | test/disabled/presentation/akka/src/akka/routing/Pool.scala (renamed from test/files/presentation/akka/src/akka/routing/Pool.scala) | 0 | ||||
-rw-r--r-- | test/disabled/presentation/akka/src/akka/routing/Routers.scala (renamed from test/files/presentation/akka/src/akka/routing/Routers.scala) | 0 | ||||
-rw-r--r-- | test/disabled/presentation/akka/src/akka/routing/Routing.scala (renamed from test/files/presentation/akka/src/akka/routing/Routing.scala) | 0 | ||||
-rw-r--r-- | test/disabled/presentation/akka/src/akka/util/Address.scala (renamed from test/files/presentation/akka/src/akka/util/Address.scala) | 0 | ||||
-rw-r--r-- | test/disabled/presentation/akka/src/akka/util/AkkaLoader.scala (renamed from test/files/presentation/akka/src/akka/util/AkkaLoader.scala) | 0 | ||||
-rw-r--r-- | test/disabled/presentation/akka/src/akka/util/Bootable.scala (renamed from test/files/presentation/akka/src/akka/util/Bootable.scala) | 0 | ||||
-rw-r--r-- | test/disabled/presentation/akka/src/akka/util/BoundedBlockingQueue.scala (renamed from test/files/presentation/akka/src/akka/util/BoundedBlockingQueue.scala) | 0 | ||||
-rw-r--r-- | test/disabled/presentation/akka/src/akka/util/Crypt.scala (renamed from test/files/presentation/akka/src/akka/util/Crypt.scala) | 0 | ||||
-rw-r--r-- | test/disabled/presentation/akka/src/akka/util/Duration.scala (renamed from test/files/presentation/akka/src/akka/util/Duration.scala) | 0 | ||||
-rw-r--r-- | test/disabled/presentation/akka/src/akka/util/HashCode.scala (renamed from test/files/presentation/akka/src/akka/util/HashCode.scala) | 0 | ||||
-rw-r--r-- | test/disabled/presentation/akka/src/akka/util/Helpers.scala (renamed from test/files/presentation/akka/src/akka/util/Helpers.scala) | 0 | ||||
-rw-r--r-- | test/disabled/presentation/akka/src/akka/util/ListenerManagement.scala (renamed from test/files/presentation/akka/src/akka/util/ListenerManagement.scala) | 0 | ||||
-rw-r--r-- | test/disabled/presentation/akka/src/akka/util/LockUtil.scala (renamed from test/files/presentation/akka/src/akka/util/LockUtil.scala) | 0 | ||||
-rw-r--r-- | test/disabled/presentation/akka/src/akka/util/ReflectiveAccess.scala (renamed from test/files/presentation/akka/src/akka/util/ReflectiveAccess.scala) | 0 | ||||
-rw-r--r-- | test/disabled/presentation/akka/src/akka/util/package.scala (renamed from test/files/presentation/akka/src/akka/util/package.scala) | 0 | ||||
-rw-r--r-- | test/disabled/presentation/akka/src/com/eaio/util/lang/Hex.java (renamed from test/files/presentation/akka/src/com/eaio/util/lang/Hex.java) | 0 | ||||
-rw-r--r-- | test/disabled/presentation/akka/src/com/eaio/uuid/MACAddressParser.java (renamed from test/files/presentation/akka/src/com/eaio/uuid/MACAddressParser.java) | 0 | ||||
-rw-r--r-- | test/disabled/presentation/akka/src/com/eaio/uuid/UUID.java (renamed from test/files/presentation/akka/src/com/eaio/uuid/UUID.java) | 0 | ||||
-rw-r--r-- | test/disabled/presentation/akka/src/com/eaio/uuid/UUIDGen.java (renamed from test/files/presentation/akka/src/com/eaio/uuid/UUIDGen.java) | 0 | ||||
-rw-r--r-- | test/disabled/presentation/akka/src/com/eaio/uuid/UUIDHelper.java (renamed from test/files/presentation/akka/src/com/eaio/uuid/UUIDHelper.java) | 0 | ||||
-rw-r--r-- | test/disabled/presentation/akka/src/com/eaio/uuid/UUIDHolder.java (renamed from test/files/presentation/akka/src/com/eaio/uuid/UUIDHolder.java) | 0 | ||||
-rw-r--r-- | test/disabled/presentation/akka/src/pi.scala (renamed from test/files/presentation/akka/src/pi.scala) | 0 | ||||
-rw-r--r-- | test/disabled/presentation/timeofday.check (renamed from test/files/presentation/timeofday.check) | 0 | ||||
-rw-r--r-- | test/disabled/presentation/timeofday/Runner.scala (renamed from test/files/presentation/timeofday/Runner.scala) | 0 | ||||
-rw-r--r-- | test/disabled/presentation/timeofday/src/timeofday.scala (renamed from test/files/presentation/timeofday/src/timeofday.scala) | 0 | ||||
-rw-r--r-- | test/files/run/reify_for1.check | 0 | ||||
-rw-r--r-- | test/files/run/reify_for1.scala | 16 | ||||
-rw-r--r-- | test/files/run/reify_varargs.check | 1 | ||||
-rw-r--r-- | test/files/run/reify_varargs.scala | 17 | ||||
-rw-r--r-- | test/pending/run/reify_addressbook.check | 30 | ||||
-rw-r--r-- | test/pending/run/reify_addressbook.scala | 71 | ||||
-rw-r--r-- | test/pending/run/reify_brainf_ck.check | 4 | ||||
-rw-r--r-- | test/pending/run/reify_brainf_ck.scala | 85 | ||||
-rw-r--r-- | test/pending/run/reify_callccinterpreter.check | 3 | ||||
-rw-r--r-- | test/pending/run/reify_callccinterpreter.scala | 94 | ||||
-rw-r--r-- | test/pending/run/reify_complex.check | 1 | ||||
-rw-r--r-- | test/pending/run/reify_complex.scala | 31 | ||||
-rw-r--r-- | test/pending/run/reify_extendbuiltins.check | 1 | ||||
-rw-r--r-- | test/pending/run/reify_extendbuiltins.scala | 21 | ||||
-rw-r--r-- | test/pending/run/reify_fors.check | 5 | ||||
-rw-r--r-- | test/pending/run/reify_fors.scala | 107 | ||||
-rw-r--r-- | test/pending/run/reify_gadts.check | 1 | ||||
-rw-r--r-- | test/pending/run/reify_gadts.scala | 45 | ||||
-rw-r--r-- | test/pending/run/reify_implicits.check | 1 | ||||
-rw-r--r-- | test/pending/run/reify_implicits.scala | 21 | ||||
-rw-r--r-- | test/pending/run/reify_lazyevaluation.check | 8 | ||||
-rw-r--r-- | test/pending/run/reify_lazyevaluation.scala | 65 | ||||
-rw-r--r-- | test/pending/run/reify_maps.check | 4 | ||||
-rw-r--r-- | test/pending/run/reify_maps.scala | 26 | ||||
-rw-r--r-- | test/pending/run/reify_properties.check | 2 | ||||
-rw-r--r-- | test/pending/run/reify_properties.scala | 63 | ||||
-rw-r--r-- | test/pending/run/reify_simpleinterpreter.check | 2 | ||||
-rw-r--r-- | test/pending/run/reify_simpleinterpreter.scala | 82 | ||||
-rw-r--r-- | test/pending/run/reify_sort.check | 2 | ||||
-rw-r--r-- | test/pending/run/reify_sort.scala | 57 | ||||
-rw-r--r-- | test/pending/run/reify_sort1.check | 2 | ||||
-rw-r--r-- | test/pending/run/reify_sort1.scala | 27 | ||||
-rw-r--r-- | test/pending/run/reify_timeofday.check | 1 | ||||
-rw-r--r-- | test/pending/run/reify_timeofday.scala | 48 | ||||
-rw-r--r-- | test/pending/run/t5229_1_nolift.scala | 1 | ||||
-rw-r--r-- | test/pending/run/t5271_1.check | 0 | ||||
-rw-r--r-- | test/pending/run/t5271_1.scala | 14 | ||||
-rw-r--r-- | test/pending/run/t5271_2.check | 1 | ||||
-rw-r--r-- | test/pending/run/t5271_2.scala | 16 | ||||
-rw-r--r-- | test/pending/run/t5272.check | 1 | ||||
-rw-r--r-- | test/pending/run/t5272.scala | 17 | ||||
-rw-r--r-- | test/pending/run/t5273_1.check | 1 | ||||
-rw-r--r-- | test/pending/run/t5273_1.scala | 16 | ||||
-rw-r--r-- | test/pending/run/t5273_2.check | 1 | ||||
-rw-r--r-- | test/pending/run/t5273_2.scala | 17 | ||||
-rw-r--r-- | test/pending/run/t5274_1.check | 3 | ||||
-rw-r--r-- | test/pending/run/t5274_1.scala | 20 | ||||
-rw-r--r-- | test/pending/run/t5274_2.check | 2 | ||||
-rw-r--r-- | test/pending/run/t5274_2.scala | 57 | ||||
-rw-r--r-- | test/pending/run/t5275.check | 1 | ||||
-rw-r--r-- | test/pending/run/t5275.scala | 15 | ||||
-rw-r--r-- | test/pending/run/t5276.check | 1 | ||||
-rw-r--r-- | test/pending/run/t5276.scala | 15 | ||||
-rw-r--r-- | test/pending/run/t5277_1.check | 1 | ||||
-rw-r--r-- | test/pending/run/t5277_1.scala | 21 | ||||
-rw-r--r-- | test/pending/run/t5277_2.check | 2 | ||||
-rw-r--r-- | test/pending/run/t5277_2.scala | 18 | ||||
-rw-r--r-- | test/pending/run/t5279.check | 1 | ||||
-rw-r--r-- | test/pending/run/t5279.scala | 14 | ||||
-rwxr-xr-x | tools/get-scala-revision | 11 | ||||
-rw-r--r-- | tools/get-scala-revision.bat | 3 |
125 files changed, 1241 insertions, 11 deletions
diff --git a/src/compiler/scala/tools/ant/templates/tool-unix.tmpl b/src/compiler/scala/tools/ant/templates/tool-unix.tmpl index 4275ef7ba1..7e51930fa4 100644 --- a/src/compiler/scala/tools/ant/templates/tool-unix.tmpl +++ b/src/compiler/scala/tools/ant/templates/tool-unix.tmpl @@ -58,12 +58,17 @@ if uname | grep -q ^CYGWIN; then cygwin="$(uname)" fi +unset mingw +if uname | grep -q ^MINGW; then + mingw="$(uname)" +fi + # Finding the root folder for this Scala distribution SCALA_HOME="$(findScalaHome)" SEP=":" # Possible additional command line options -CYGWIN_OPT="" +WINDOWS_OPT="" EMACS_OPT="" [[ -n "$EMACS" ]] && EMACS_OPT="-Denv.emacs=$EMACS" @@ -94,10 +99,16 @@ if [[ -n "$cygwin" ]]; then fi SCALA_HOME="$(cygpath --$format "$SCALA_HOME")" TOOL_CLASSPATH="$(cygpath --path --$format "$TOOL_CLASSPATH")" +elif [[ -n "$mingw" ]]; then + SCALA_HOME="$(cmd //c echo "$SCALA_HOME")" + TOOL_CLASSPATH="$(cmd //c echo "$TOOL_CLASSPATH")" +fi + +if [[ -n "$cygwin$mingw" ]]; then case "$TERM" in rxvt* | xterm*) stty -icanon min 1 -echo - CYGWIN_OPT="-Djline.terminal=scala.tools.jline.UnixTerminal" + WINDOWS_OPT="-Djline.terminal=scala.tools.jline.UnixTerminal" ;; esac fi @@ -110,9 +121,10 @@ fi declare -a java_args declare -a scala_args -# default to the boot classpath for speed, except on cygwin/mingw. +# default to the boot classpath for speed, except on cygwin/mingw because +# JLine on Windows requires a custom DLL to be loaded. unset usebootcp -if [[ -z $cygwin ]]; then +if [[ -z "$cygwin$mingw" ]]; then usebootcp="true" fi @@ -181,7 +193,7 @@ execCommand \ -Dscala.home="$SCALA_HOME" \ -Dscala.usejavacp=true \ $EMACS_OPT \ - $CYGWIN_OPT \ + $WINDOWS_OPT \ @properties@ @class@ @toolflags@ "$@@" # record the exit status lest it be overwritten: diff --git a/src/compiler/scala/tools/nsc/backend/jvm/GenJVM.scala b/src/compiler/scala/tools/nsc/backend/jvm/GenJVM.scala index 3fe5b83515..3fa5158a4a 100644 --- a/src/compiler/scala/tools/nsc/backend/jvm/GenJVM.scala +++ b/src/compiler/scala/tools/nsc/backend/jvm/GenJVM.scala @@ -308,6 +308,18 @@ abstract class GenJVM extends SubComponent with GenJVMUtil with GenAndroid with private var innerClassBuffer = mutable.LinkedHashSet[Symbol]() + /** Drop redundant interfaces (ones which are implemented by some + * other parent) from the immediate parents. This is important on + * android because there is otherwise an interface explosion. + */ + private def minimizeInterfaces(interfaces: List[Symbol]): List[Symbol] = ( + interfaces filterNot (int1 => + interfaces exists (int2 => + (int1 ne int2) && (int2 isSubClass int1) + ) + ) + ) + def genClass(c: IClass) { clasz = c innerClassBuffer.clear() @@ -322,7 +334,7 @@ abstract class GenJVM extends SubComponent with GenJVMUtil with GenAndroid with } val ifaces = superInterfaces match { case Nil => JClass.NO_INTERFACES - case _ => mkArray(superInterfaces map (x => javaName(x.typeSymbol))) + case _ => mkArray(minimizeInterfaces(superInterfaces map (_.typeSymbol)) map javaName) } jclass = fjbgContext.JClass(javaFlags(c.symbol), diff --git a/src/compiler/scala/tools/nsc/transform/LiftCode.scala b/src/compiler/scala/tools/nsc/transform/LiftCode.scala index 68a53e57a1..f3f823d197 100644 --- a/src/compiler/scala/tools/nsc/transform/LiftCode.scala +++ b/src/compiler/scala/tools/nsc/transform/LiftCode.scala @@ -95,7 +95,7 @@ abstract class LiftCode extends Transform with TypingTransformers { buf.append(", " + "List(" + annotations + ")") var s = buf.toString - if (s.endsWith(", Map()")) s = s.substring(0, s.length - ", Map()".length) + if (s.endsWith(", List()")) s = s.substring(0, s.length - ", List()".length) if (s.endsWith(", newTypeName(\"\")")) s = s.substring(0, s.length - ", newTypeName(\"\")".length) if (s.endsWith("Set()")) s = s.substring(0, s.length - "Set()".length) "Modifiers(" + s + ")" diff --git a/test/files/presentation/akka.check b/test/disabled/presentation/akka.check index 9cd20ffb1c..9cd20ffb1c 100644 --- a/test/files/presentation/akka.check +++ b/test/disabled/presentation/akka.check diff --git a/test/files/presentation/akka.flags b/test/disabled/presentation/akka.flags index 56d026a62d..56d026a62d 100644 --- a/test/files/presentation/akka.flags +++ b/test/disabled/presentation/akka.flags diff --git a/test/files/presentation/akka/Runner.scala b/test/disabled/presentation/akka/Runner.scala index 14a6aa8350..14a6aa8350 100644 --- a/test/files/presentation/akka/Runner.scala +++ b/test/disabled/presentation/akka/Runner.scala diff --git a/test/files/presentation/akka/src/akka/AkkaException.scala b/test/disabled/presentation/akka/src/akka/AkkaException.scala index 155a7a16b5..155a7a16b5 100644 --- a/test/files/presentation/akka/src/akka/AkkaException.scala +++ b/test/disabled/presentation/akka/src/akka/AkkaException.scala diff --git a/test/files/presentation/akka/src/akka/actor/Actor.scala b/test/disabled/presentation/akka/src/akka/actor/Actor.scala index b955c4c38b..b955c4c38b 100644 --- a/test/files/presentation/akka/src/akka/actor/Actor.scala +++ b/test/disabled/presentation/akka/src/akka/actor/Actor.scala diff --git a/test/files/presentation/akka/src/akka/actor/ActorRef.scala b/test/disabled/presentation/akka/src/akka/actor/ActorRef.scala index 07fa358744..07fa358744 100644 --- a/test/files/presentation/akka/src/akka/actor/ActorRef.scala +++ b/test/disabled/presentation/akka/src/akka/actor/ActorRef.scala diff --git a/test/files/presentation/akka/src/akka/actor/ActorRegistry.scala b/test/disabled/presentation/akka/src/akka/actor/ActorRegistry.scala index df335dc8b4..df335dc8b4 100644 --- a/test/files/presentation/akka/src/akka/actor/ActorRegistry.scala +++ b/test/disabled/presentation/akka/src/akka/actor/ActorRegistry.scala diff --git a/test/files/presentation/akka/src/akka/actor/Actors.java b/test/disabled/presentation/akka/src/akka/actor/Actors.java index a5ec9f37dc..a5ec9f37dc 100644 --- a/test/files/presentation/akka/src/akka/actor/Actors.java +++ b/test/disabled/presentation/akka/src/akka/actor/Actors.java diff --git a/test/files/presentation/akka/src/akka/actor/BootableActorLoaderService.scala b/test/disabled/presentation/akka/src/akka/actor/BootableActorLoaderService.scala index a54fca9ac7..a54fca9ac7 100644 --- a/test/files/presentation/akka/src/akka/actor/BootableActorLoaderService.scala +++ b/test/disabled/presentation/akka/src/akka/actor/BootableActorLoaderService.scala diff --git a/test/files/presentation/akka/src/akka/actor/FSM.scala b/test/disabled/presentation/akka/src/akka/actor/FSM.scala index d9cd9a9ca2..d9cd9a9ca2 100644 --- a/test/files/presentation/akka/src/akka/actor/FSM.scala +++ b/test/disabled/presentation/akka/src/akka/actor/FSM.scala diff --git a/test/files/presentation/akka/src/akka/actor/Scheduler.scala b/test/disabled/presentation/akka/src/akka/actor/Scheduler.scala index 128584f3c5..128584f3c5 100644 --- a/test/files/presentation/akka/src/akka/actor/Scheduler.scala +++ b/test/disabled/presentation/akka/src/akka/actor/Scheduler.scala diff --git a/test/files/presentation/akka/src/akka/actor/Supervisor.scala b/test/disabled/presentation/akka/src/akka/actor/Supervisor.scala index 4a1309faef..4a1309faef 100644 --- a/test/files/presentation/akka/src/akka/actor/Supervisor.scala +++ b/test/disabled/presentation/akka/src/akka/actor/Supervisor.scala diff --git a/test/files/presentation/akka/src/akka/actor/UntypedActor.scala b/test/disabled/presentation/akka/src/akka/actor/UntypedActor.scala index cbc43f22f8..cbc43f22f8 100644 --- a/test/files/presentation/akka/src/akka/actor/UntypedActor.scala +++ b/test/disabled/presentation/akka/src/akka/actor/UntypedActor.scala diff --git a/test/files/presentation/akka/src/akka/actor/package.scala b/test/disabled/presentation/akka/src/akka/actor/package.scala index fbeeed49cb..fbeeed49cb 100644 --- a/test/files/presentation/akka/src/akka/actor/package.scala +++ b/test/disabled/presentation/akka/src/akka/actor/package.scala diff --git a/test/files/presentation/akka/src/akka/config/Config.scala b/test/disabled/presentation/akka/src/akka/config/Config.scala index 6578c66f77..6578c66f77 100644 --- a/test/files/presentation/akka/src/akka/config/Config.scala +++ b/test/disabled/presentation/akka/src/akka/config/Config.scala diff --git a/test/files/presentation/akka/src/akka/config/ConfigParser.scala b/test/disabled/presentation/akka/src/akka/config/ConfigParser.scala index 73fac5e31b..73fac5e31b 100644 --- a/test/files/presentation/akka/src/akka/config/ConfigParser.scala +++ b/test/disabled/presentation/akka/src/akka/config/ConfigParser.scala diff --git a/test/files/presentation/akka/src/akka/config/Configuration.scala b/test/disabled/presentation/akka/src/akka/config/Configuration.scala index 81c32fce90..81c32fce90 100644 --- a/test/files/presentation/akka/src/akka/config/Configuration.scala +++ b/test/disabled/presentation/akka/src/akka/config/Configuration.scala diff --git a/test/files/presentation/akka/src/akka/config/Configurator.scala b/test/disabled/presentation/akka/src/akka/config/Configurator.scala index 2818339b0f..2818339b0f 100644 --- a/test/files/presentation/akka/src/akka/config/Configurator.scala +++ b/test/disabled/presentation/akka/src/akka/config/Configurator.scala diff --git a/test/files/presentation/akka/src/akka/config/Importer.scala b/test/disabled/presentation/akka/src/akka/config/Importer.scala index eebda1d4fe..eebda1d4fe 100644 --- a/test/files/presentation/akka/src/akka/config/Importer.scala +++ b/test/disabled/presentation/akka/src/akka/config/Importer.scala diff --git a/test/files/presentation/akka/src/akka/config/SupervisionConfig.scala b/test/disabled/presentation/akka/src/akka/config/SupervisionConfig.scala index 40f61f615f..40f61f615f 100644 --- a/test/files/presentation/akka/src/akka/config/SupervisionConfig.scala +++ b/test/disabled/presentation/akka/src/akka/config/SupervisionConfig.scala diff --git a/test/files/presentation/akka/src/akka/dataflow/DataFlow.scala b/test/disabled/presentation/akka/src/akka/dataflow/DataFlow.scala index bca7936116..bca7936116 100644 --- a/test/files/presentation/akka/src/akka/dataflow/DataFlow.scala +++ b/test/disabled/presentation/akka/src/akka/dataflow/DataFlow.scala diff --git a/test/files/presentation/akka/src/akka/dispatch/Dispatchers.scala b/test/disabled/presentation/akka/src/akka/dispatch/Dispatchers.scala index 7dd1bf6218..7dd1bf6218 100644 --- a/test/files/presentation/akka/src/akka/dispatch/Dispatchers.scala +++ b/test/disabled/presentation/akka/src/akka/dispatch/Dispatchers.scala diff --git a/test/files/presentation/akka/src/akka/dispatch/ExecutorBasedEventDrivenDispatcher.scala b/test/disabled/presentation/akka/src/akka/dispatch/ExecutorBasedEventDrivenDispatcher.scala index bc3f29ac68..bc3f29ac68 100644 --- a/test/files/presentation/akka/src/akka/dispatch/ExecutorBasedEventDrivenDispatcher.scala +++ b/test/disabled/presentation/akka/src/akka/dispatch/ExecutorBasedEventDrivenDispatcher.scala diff --git a/test/files/presentation/akka/src/akka/dispatch/ExecutorBasedEventDrivenWorkStealingDispatcher.scala b/test/disabled/presentation/akka/src/akka/dispatch/ExecutorBasedEventDrivenWorkStealingDispatcher.scala index 4cba8eec8b..4cba8eec8b 100644 --- a/test/files/presentation/akka/src/akka/dispatch/ExecutorBasedEventDrivenWorkStealingDispatcher.scala +++ b/test/disabled/presentation/akka/src/akka/dispatch/ExecutorBasedEventDrivenWorkStealingDispatcher.scala diff --git a/test/files/presentation/akka/src/akka/dispatch/Future.scala b/test/disabled/presentation/akka/src/akka/dispatch/Future.scala index 1ad304d726..1ad304d726 100644 --- a/test/files/presentation/akka/src/akka/dispatch/Future.scala +++ b/test/disabled/presentation/akka/src/akka/dispatch/Future.scala diff --git a/test/files/presentation/akka/src/akka/dispatch/MailboxHandling.scala b/test/disabled/presentation/akka/src/akka/dispatch/MailboxHandling.scala index 4c00577157..4c00577157 100644 --- a/test/files/presentation/akka/src/akka/dispatch/MailboxHandling.scala +++ b/test/disabled/presentation/akka/src/akka/dispatch/MailboxHandling.scala diff --git a/test/files/presentation/akka/src/akka/dispatch/MessageHandling.scala b/test/disabled/presentation/akka/src/akka/dispatch/MessageHandling.scala index 20887c3867..20887c3867 100644 --- a/test/files/presentation/akka/src/akka/dispatch/MessageHandling.scala +++ b/test/disabled/presentation/akka/src/akka/dispatch/MessageHandling.scala diff --git a/test/files/presentation/akka/src/akka/dispatch/ThreadBasedDispatcher.scala b/test/disabled/presentation/akka/src/akka/dispatch/ThreadBasedDispatcher.scala index 3169c70ef9..3169c70ef9 100644 --- a/test/files/presentation/akka/src/akka/dispatch/ThreadBasedDispatcher.scala +++ b/test/disabled/presentation/akka/src/akka/dispatch/ThreadBasedDispatcher.scala diff --git a/test/files/presentation/akka/src/akka/dispatch/ThreadPoolBuilder.scala b/test/disabled/presentation/akka/src/akka/dispatch/ThreadPoolBuilder.scala index e847610c4c..e847610c4c 100644 --- a/test/files/presentation/akka/src/akka/dispatch/ThreadPoolBuilder.scala +++ b/test/disabled/presentation/akka/src/akka/dispatch/ThreadPoolBuilder.scala diff --git a/test/files/presentation/akka/src/akka/event/EventHandler.scala b/test/disabled/presentation/akka/src/akka/event/EventHandler.scala index f3176b7c21..f3176b7c21 100644 --- a/test/files/presentation/akka/src/akka/event/EventHandler.scala +++ b/test/disabled/presentation/akka/src/akka/event/EventHandler.scala diff --git a/test/files/presentation/akka/src/akka/event/JavaEventHandler.java b/test/disabled/presentation/akka/src/akka/event/JavaEventHandler.java index 7e6e2d4143..7e6e2d4143 100644 --- a/test/files/presentation/akka/src/akka/event/JavaEventHandler.java +++ b/test/disabled/presentation/akka/src/akka/event/JavaEventHandler.java diff --git a/test/files/presentation/akka/src/akka/japi/JavaAPI.scala b/test/disabled/presentation/akka/src/akka/japi/JavaAPI.scala index f5c4ccdcaa..f5c4ccdcaa 100644 --- a/test/files/presentation/akka/src/akka/japi/JavaAPI.scala +++ b/test/disabled/presentation/akka/src/akka/japi/JavaAPI.scala diff --git a/test/files/presentation/akka/src/akka/remoteinterface/RemoteEventHandler.scala b/test/disabled/presentation/akka/src/akka/remoteinterface/RemoteEventHandler.scala index 1c75618301..1c75618301 100644 --- a/test/files/presentation/akka/src/akka/remoteinterface/RemoteEventHandler.scala +++ b/test/disabled/presentation/akka/src/akka/remoteinterface/RemoteEventHandler.scala diff --git a/test/files/presentation/akka/src/akka/remoteinterface/RemoteInterface.scala b/test/disabled/presentation/akka/src/akka/remoteinterface/RemoteInterface.scala index 0c5da82294..0c5da82294 100644 --- a/test/files/presentation/akka/src/akka/remoteinterface/RemoteInterface.scala +++ b/test/disabled/presentation/akka/src/akka/remoteinterface/RemoteInterface.scala diff --git a/test/files/presentation/akka/src/akka/routing/Iterators.scala b/test/disabled/presentation/akka/src/akka/routing/Iterators.scala index 315e7bea51..315e7bea51 100644 --- a/test/files/presentation/akka/src/akka/routing/Iterators.scala +++ b/test/disabled/presentation/akka/src/akka/routing/Iterators.scala diff --git a/test/files/presentation/akka/src/akka/routing/Listeners.scala b/test/disabled/presentation/akka/src/akka/routing/Listeners.scala index 04f6c1259f..04f6c1259f 100644 --- a/test/files/presentation/akka/src/akka/routing/Listeners.scala +++ b/test/disabled/presentation/akka/src/akka/routing/Listeners.scala diff --git a/test/files/presentation/akka/src/akka/routing/Pool.scala b/test/disabled/presentation/akka/src/akka/routing/Pool.scala index 0fd1bc8f49..0fd1bc8f49 100644 --- a/test/files/presentation/akka/src/akka/routing/Pool.scala +++ b/test/disabled/presentation/akka/src/akka/routing/Pool.scala diff --git a/test/files/presentation/akka/src/akka/routing/Routers.scala b/test/disabled/presentation/akka/src/akka/routing/Routers.scala index a4c34c5c67..a4c34c5c67 100644 --- a/test/files/presentation/akka/src/akka/routing/Routers.scala +++ b/test/disabled/presentation/akka/src/akka/routing/Routers.scala diff --git a/test/files/presentation/akka/src/akka/routing/Routing.scala b/test/disabled/presentation/akka/src/akka/routing/Routing.scala index befc124248..befc124248 100644 --- a/test/files/presentation/akka/src/akka/routing/Routing.scala +++ b/test/disabled/presentation/akka/src/akka/routing/Routing.scala diff --git a/test/files/presentation/akka/src/akka/util/Address.scala b/test/disabled/presentation/akka/src/akka/util/Address.scala index 65b5c0a834..65b5c0a834 100644 --- a/test/files/presentation/akka/src/akka/util/Address.scala +++ b/test/disabled/presentation/akka/src/akka/util/Address.scala diff --git a/test/files/presentation/akka/src/akka/util/AkkaLoader.scala b/test/disabled/presentation/akka/src/akka/util/AkkaLoader.scala index cb246f2ecf..cb246f2ecf 100644 --- a/test/files/presentation/akka/src/akka/util/AkkaLoader.scala +++ b/test/disabled/presentation/akka/src/akka/util/AkkaLoader.scala diff --git a/test/files/presentation/akka/src/akka/util/Bootable.scala b/test/disabled/presentation/akka/src/akka/util/Bootable.scala index d07643e1ac..d07643e1ac 100644 --- a/test/files/presentation/akka/src/akka/util/Bootable.scala +++ b/test/disabled/presentation/akka/src/akka/util/Bootable.scala diff --git a/test/files/presentation/akka/src/akka/util/BoundedBlockingQueue.scala b/test/disabled/presentation/akka/src/akka/util/BoundedBlockingQueue.scala index f8deda746c..f8deda746c 100644 --- a/test/files/presentation/akka/src/akka/util/BoundedBlockingQueue.scala +++ b/test/disabled/presentation/akka/src/akka/util/BoundedBlockingQueue.scala diff --git a/test/files/presentation/akka/src/akka/util/Crypt.scala b/test/disabled/presentation/akka/src/akka/util/Crypt.scala index 3ce2d559a2..3ce2d559a2 100644 --- a/test/files/presentation/akka/src/akka/util/Crypt.scala +++ b/test/disabled/presentation/akka/src/akka/util/Crypt.scala diff --git a/test/files/presentation/akka/src/akka/util/Duration.scala b/test/disabled/presentation/akka/src/akka/util/Duration.scala index 316cb86689..316cb86689 100644 --- a/test/files/presentation/akka/src/akka/util/Duration.scala +++ b/test/disabled/presentation/akka/src/akka/util/Duration.scala diff --git a/test/files/presentation/akka/src/akka/util/HashCode.scala b/test/disabled/presentation/akka/src/akka/util/HashCode.scala index d015f12f5d..d015f12f5d 100644 --- a/test/files/presentation/akka/src/akka/util/HashCode.scala +++ b/test/disabled/presentation/akka/src/akka/util/HashCode.scala diff --git a/test/files/presentation/akka/src/akka/util/Helpers.scala b/test/disabled/presentation/akka/src/akka/util/Helpers.scala index 48477426c9..48477426c9 100644 --- a/test/files/presentation/akka/src/akka/util/Helpers.scala +++ b/test/disabled/presentation/akka/src/akka/util/Helpers.scala diff --git a/test/files/presentation/akka/src/akka/util/ListenerManagement.scala b/test/disabled/presentation/akka/src/akka/util/ListenerManagement.scala index 7065397a45..7065397a45 100644 --- a/test/files/presentation/akka/src/akka/util/ListenerManagement.scala +++ b/test/disabled/presentation/akka/src/akka/util/ListenerManagement.scala diff --git a/test/files/presentation/akka/src/akka/util/LockUtil.scala b/test/disabled/presentation/akka/src/akka/util/LockUtil.scala index 4aaefadc4a..4aaefadc4a 100644 --- a/test/files/presentation/akka/src/akka/util/LockUtil.scala +++ b/test/disabled/presentation/akka/src/akka/util/LockUtil.scala diff --git a/test/files/presentation/akka/src/akka/util/ReflectiveAccess.scala b/test/disabled/presentation/akka/src/akka/util/ReflectiveAccess.scala index f38d1f9b98..f38d1f9b98 100644 --- a/test/files/presentation/akka/src/akka/util/ReflectiveAccess.scala +++ b/test/disabled/presentation/akka/src/akka/util/ReflectiveAccess.scala diff --git a/test/files/presentation/akka/src/akka/util/package.scala b/test/disabled/presentation/akka/src/akka/util/package.scala index 26a24929c9..26a24929c9 100644 --- a/test/files/presentation/akka/src/akka/util/package.scala +++ b/test/disabled/presentation/akka/src/akka/util/package.scala diff --git a/test/files/presentation/akka/src/com/eaio/util/lang/Hex.java b/test/disabled/presentation/akka/src/com/eaio/util/lang/Hex.java index 7794059517..7794059517 100644 --- a/test/files/presentation/akka/src/com/eaio/util/lang/Hex.java +++ b/test/disabled/presentation/akka/src/com/eaio/util/lang/Hex.java diff --git a/test/files/presentation/akka/src/com/eaio/uuid/MACAddressParser.java b/test/disabled/presentation/akka/src/com/eaio/uuid/MACAddressParser.java index c077147470..c077147470 100644 --- a/test/files/presentation/akka/src/com/eaio/uuid/MACAddressParser.java +++ b/test/disabled/presentation/akka/src/com/eaio/uuid/MACAddressParser.java diff --git a/test/files/presentation/akka/src/com/eaio/uuid/UUID.java b/test/disabled/presentation/akka/src/com/eaio/uuid/UUID.java index 6c49bcd1c8..6c49bcd1c8 100644 --- a/test/files/presentation/akka/src/com/eaio/uuid/UUID.java +++ b/test/disabled/presentation/akka/src/com/eaio/uuid/UUID.java diff --git a/test/files/presentation/akka/src/com/eaio/uuid/UUIDGen.java b/test/disabled/presentation/akka/src/com/eaio/uuid/UUIDGen.java index 7b63f65447..7b63f65447 100644 --- a/test/files/presentation/akka/src/com/eaio/uuid/UUIDGen.java +++ b/test/disabled/presentation/akka/src/com/eaio/uuid/UUIDGen.java diff --git a/test/files/presentation/akka/src/com/eaio/uuid/UUIDHelper.java b/test/disabled/presentation/akka/src/com/eaio/uuid/UUIDHelper.java index 7abbe85895..7abbe85895 100644 --- a/test/files/presentation/akka/src/com/eaio/uuid/UUIDHelper.java +++ b/test/disabled/presentation/akka/src/com/eaio/uuid/UUIDHelper.java diff --git a/test/files/presentation/akka/src/com/eaio/uuid/UUIDHolder.java b/test/disabled/presentation/akka/src/com/eaio/uuid/UUIDHolder.java index d5531f5e00..d5531f5e00 100644 --- a/test/files/presentation/akka/src/com/eaio/uuid/UUIDHolder.java +++ b/test/disabled/presentation/akka/src/com/eaio/uuid/UUIDHolder.java diff --git a/test/files/presentation/akka/src/pi.scala b/test/disabled/presentation/akka/src/pi.scala index b4c644052c..b4c644052c 100644 --- a/test/files/presentation/akka/src/pi.scala +++ b/test/disabled/presentation/akka/src/pi.scala diff --git a/test/files/presentation/timeofday.check b/test/disabled/presentation/timeofday.check index 2a09d0bcfc..2a09d0bcfc 100644 --- a/test/files/presentation/timeofday.check +++ b/test/disabled/presentation/timeofday.check diff --git a/test/files/presentation/timeofday/Runner.scala b/test/disabled/presentation/timeofday/Runner.scala index 1c03e3d5ba..1c03e3d5ba 100644 --- a/test/files/presentation/timeofday/Runner.scala +++ b/test/disabled/presentation/timeofday/Runner.scala diff --git a/test/files/presentation/timeofday/src/timeofday.scala b/test/disabled/presentation/timeofday/src/timeofday.scala index d6355097f1..d6355097f1 100644 --- a/test/files/presentation/timeofday/src/timeofday.scala +++ b/test/disabled/presentation/timeofday/src/timeofday.scala diff --git a/test/files/run/reify_for1.check b/test/files/run/reify_for1.check new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/test/files/run/reify_for1.check diff --git a/test/files/run/reify_for1.scala b/test/files/run/reify_for1.scala new file mode 100644 index 0000000000..4b03330293 --- /dev/null +++ b/test/files/run/reify_for1.scala @@ -0,0 +1,16 @@ +import scala.tools.nsc.reporters._ +import scala.tools.nsc.Settings +import reflect.runtime.Mirror.ToolBox + +object Test extends App { + val code = scala.reflect.Code.lift{ + val sumOfSquares1 = (for (i <- 1 to 100; if (i % 3 == 0)) yield Math.pow(i, 2)).sum + val sumOfSquares2 = (1 to 100).filter(_ % 3 == 0).map(Math.pow(_, 2)).sum + assert(sumOfSquares1 == sumOfSquares2) + }; + + val reporter = new ConsoleReporter(new Settings) + val toolbox = new ToolBox(reporter) + val ttree = toolbox.typeCheck(code.tree) + toolbox.runExpr(ttree) +} diff --git a/test/files/run/reify_varargs.check b/test/files/run/reify_varargs.check new file mode 100644 index 0000000000..e300a570a7 --- /dev/null +++ b/test/files/run/reify_varargs.check @@ -0,0 +1 @@ +Message=On the fifth of August there was a disturbance in the Force on planet Hoth. diff --git a/test/files/run/reify_varargs.scala b/test/files/run/reify_varargs.scala new file mode 100644 index 0000000000..d38cbf2aac --- /dev/null +++ b/test/files/run/reify_varargs.scala @@ -0,0 +1,17 @@ +import scala.tools.nsc.reporters._ +import scala.tools.nsc.Settings +import reflect.runtime.Mirror.ToolBox + +object Test extends App { + val code = scala.reflect.Code.lift{ + val msg = java.text.MessageFormat.format( + "On {1} there was {2} on planet {0}.", + "Hoth", "the fifth of August", "a disturbance in the Force") + println("Message="+msg) + }; + + val reporter = new ConsoleReporter(new Settings) + val toolbox = new ToolBox(reporter) + val ttree = toolbox.typeCheck(code.tree) + toolbox.runExpr(ttree) +} diff --git a/test/pending/run/reify_addressbook.check b/test/pending/run/reify_addressbook.check new file mode 100644 index 0000000000..4e12f87bdc --- /dev/null +++ b/test/pending/run/reify_addressbook.check @@ -0,0 +1,30 @@ +<html> + <head> + <title> + My Address Book + </title> + <style type="text/css"> table { border-right: 1px solid #cccccc; } + th { background-color: #cccccc; } + td { border-left: 1px solid #acacac; } + td { border-bottom: 1px solid #acacac; + </style> + </head> + <body> + <table cellspacing="0" cellpadding="2"> + <tr> + <th>Name</th> + <th>Age</th> + </tr> + <tr> + <td> Tom </td> + <td> 20 </td> + </tr><tr> + <td> Bob </td> + <td> 22 </td> + </tr><tr> + <td> James </td> + <td> 19 </td> + </tr> + </table> + </body> + </html> diff --git a/test/pending/run/reify_addressbook.scala b/test/pending/run/reify_addressbook.scala new file mode 100644 index 0000000000..225f26b75e --- /dev/null +++ b/test/pending/run/reify_addressbook.scala @@ -0,0 +1,71 @@ +import scala.tools.nsc.reporters._ +import scala.tools.nsc.Settings +import reflect.runtime.Mirror.ToolBox + +object Test extends App { + val code = scala.reflect.Code.lift{ + case class Person(name: String, age: Int) + + /** An AddressBook takes a variable number of arguments + * which are accessed as a Sequence + */ + class AddressBook(a: Person*) { + private val people: List[Person] = a.toList + + /** Serialize to XHTML. Scala supports XML literals + * which may contain Scala expressions between braces, + * which are replaced by their evaluation + */ + def toXHTML = + <table cellpadding="2" cellspacing="0"> + <tr> + <th>Name</th> + <th>Age</th> + </tr> + { for (p <- people) yield + <tr> + <td> { p.name } </td> + <td> { p.age.toString() } </td> + </tr> + } + </table>; + } + + /** We introduce CSS using raw strings (between triple + * quotes). Raw strings may contain newlines and special + * characters (like \) are not interpreted. + */ + val header = + <head> + <title> + { "My Address Book" } + </title> + <style type="text/css"> { + """table { border-right: 1px solid #cccccc; } + th { background-color: #cccccc; } + td { border-left: 1px solid #acacac; } + td { border-bottom: 1px solid #acacac;"""} + </style> + </head>; + + val people = new AddressBook( + Person("Tom", 20), + Person("Bob", 22), + Person("James", 19)); + + val page = + <html> + { header } + <body> + { people.toXHTML } + </body> + </html>; + + println(page) + }; + + val reporter = new ConsoleReporter(new Settings) + val toolbox = new ToolBox(reporter) + val ttree = toolbox.typeCheck(code.tree) + toolbox.runExpr(ttree) +} diff --git a/test/pending/run/reify_brainf_ck.check b/test/pending/run/reify_brainf_ck.check new file mode 100644 index 0000000000..702bb18394 --- /dev/null +++ b/test/pending/run/reify_brainf_ck.check @@ -0,0 +1,4 @@ +---running--- +Hello World! + +---done--- diff --git a/test/pending/run/reify_brainf_ck.scala b/test/pending/run/reify_brainf_ck.scala new file mode 100644 index 0000000000..3bfb76c9ea --- /dev/null +++ b/test/pending/run/reify_brainf_ck.scala @@ -0,0 +1,85 @@ +import scala.tools.nsc.reporters._ +import scala.tools.nsc.Settings +import reflect.runtime.Mirror.ToolBox + +object Test extends App { + val code = scala.reflect.Code.lift{ + import scala.annotation._ + + trait Func[T] { + val zero: T + def inc(t: T): T + def dec(t: T): T + def in: T + def out(t: T): Unit + } + + object ByteFunc extends Func[Byte] { + override val zero: Byte = 0 + override def inc(t: Byte) = ((t + 1) & 0xFF).toByte + override def dec(t: Byte) = ((t - 1) & 0xFF).toByte + override def in: Byte = readByte + override def out(t: Byte) { print(t.toChar) } + } + + case class Tape[T](left: List[T], cell: T, right: List[T])(implicit func: Func[T]) { + private def headOf(list:List[T]) = if (list.isEmpty) func.zero else list.head + private def tailOf(list:List[T]) = if (list.isEmpty) Nil else list.tail + def isZero = cell == func.zero + def execute(ch: Char) = (ch: @switch) match { + case '+' => copy(cell = func.inc(cell)) + case '-' => copy(cell = func.dec(cell)) + case '<' => Tape(tailOf(left), headOf(left), cell :: right) + case '>' => Tape(cell :: left, headOf(right), tailOf(right)) + case '.' => func.out(cell); this + case ',' => copy(cell = func.in) + case '[' | ']' => this + case _ => error("Unexpected token: " + ch) + } + } + + object Tape { + def empty[T](func: Func[T]) = Tape(Nil, func.zero, Nil)(func) + } + + class Brainfuck[T](func:Func[T]) { + + def execute(p: String) { + val prog = p.replaceAll("[^\\+\\-\\[\\]\\.\\,\\>\\<]", "") + + @tailrec def braceMatcher(pos: Int, stack: List[Int], o2c: Map[Int, Int]): Map[Int,Int] = + if(pos == prog.length) o2c else (prog(pos): @switch) match { + case '[' => braceMatcher(pos + 1, pos :: stack, o2c) + case ']' => braceMatcher(pos + 1, stack.tail, o2c + (stack.head -> pos)) + case _ => braceMatcher(pos + 1, stack, o2c) + } + + val open2close = braceMatcher(0, Nil, Map()) + val close2open = open2close.map(_.swap) + + @tailrec def ex(pos:Int, tape:Tape[T]): Unit = + if(pos < prog.length) ex((prog(pos): @switch) match { + case '[' if tape.isZero => open2close(pos) + case ']' if ! tape.isZero => close2open(pos) + case _ => pos + 1 + }, tape.execute(prog(pos))) + + println("---running---") + ex(0, Tape.empty(func)) + println("\n---done---") + } + } + + val bf = new Brainfuck(ByteFunc) + bf.execute(""">+++++++++[<++++++++>-]<.>+++++++[<++ + ++>-]<+.+++++++..+++.[-]>++++++++[<++++>-] + <.#>+++++++++++[<+++++>-]<.>++++++++[<++ + +>-]<.+++.------.--------.[-]>++++++++[<++++> + -]<+.[-]++++++++++.""") + }; + + val reporter = new ConsoleReporter(new Settings) + val toolbox = new ToolBox(reporter) + val ttree = toolbox.typeCheck(code.tree) + toolbox.runExpr(ttree) +} diff --git a/test/pending/run/reify_callccinterpreter.check b/test/pending/run/reify_callccinterpreter.check new file mode 100644 index 0000000000..ef8fc121df --- /dev/null +++ b/test/pending/run/reify_callccinterpreter.check @@ -0,0 +1,3 @@ +42 +wrong +5 diff --git a/test/pending/run/reify_callccinterpreter.scala b/test/pending/run/reify_callccinterpreter.scala new file mode 100644 index 0000000000..c10f4f0b4e --- /dev/null +++ b/test/pending/run/reify_callccinterpreter.scala @@ -0,0 +1,94 @@ +import scala.tools.nsc.reporters._ +import scala.tools.nsc.Settings +import reflect.runtime.Mirror.ToolBox + +object Test extends App { + val code = scala.reflect.Code.lift{ + type Answer = Value; + + /** + * A continuation monad. + */ + case class M[A](in: (A => Answer) => Answer) { + def bind[B](k: A => M[B]) = M[B](c => in (a => k(a) in c)) + def map[B](f: A => B): M[B] = bind(x => unitM(f(x))) + def flatMap[B](f: A => M[B]): M[B] = bind(f) + } + + def unitM[A](a: A) = M[A](c => c(a)) + + def id[A] = (x: A) => x + def showM(m: M[Value]): String = (m in id).toString() + + def callCC[A](h: (A => M[A]) => M[A]) = + M[A](c => h(a => M[A](d => c(a))) in c) + + type Name = String + + trait Term + case class Var(x: Name) extends Term + case class Con(n: Int) extends Term + case class Add(l: Term, r: Term) extends Term + case class Lam(x: Name, body: Term) extends Term + case class App(fun: Term, arg: Term) extends Term + case class Ccc(x: Name, t: Term) extends Term + + trait Value + case object Wrong extends Value { + override def toString() = "wrong" + } + case class Num(n: Int) extends Value { + override def toString() = n.toString() + } + case class Fun(f: Value => M[Value]) extends Value { + override def toString() = "<function>" + } + + type Environment = List[Pair[Name, Value]]; + + def lookup(x: Name, e: Environment): M[Value] = e match { + case List() => unitM(Wrong) + case Pair(y, b) :: e1 => if (x == y) unitM(b) else lookup(x, e1) + } + + def add(a: Value, b: Value): M[Value] = Pair(a, b) match { + case Pair(Num(m), Num(n)) => unitM(Num(m + n)) + case _ => unitM(Wrong) + } + + def apply(a: Value, b: Value): M[Value] = a match { + case Fun(k) => k(b) + case _ => unitM(Wrong) + } + + def interp(t: Term, e: Environment): M[Value] = t match { + case Var(x) => lookup(x, e) + case Con(n) => unitM(Num(n)) + case Add(l, r) => for (a <- interp(l, e); + b <- interp(r, e); + c <- add(a, b)) + yield c + case Lam(x, t) => unitM(Fun(a => interp(t, Pair(x, a) :: e))) + case App(f, t) => for (a <- interp(f, e); + b <- interp(t, e); + c <- apply(a, b)) + yield c + case Ccc(x, t) => callCC(k => interp(t, Pair(x, Fun(k)) :: e)) + } + + def test(t: Term): String = showM(interp(t, List())) + + val term0 = App(Lam("x", Add(Var("x"), Var("x"))), Add(Con(10), Con(11))) + val term1 = App(Con(1), Con(2)) + val term2 = Add(Con(1), Ccc("k", Add(Con(2), App(Var("k"), Con(4))))) + + println(test(term0)) + println(test(term1)) + println(test(term2)) + }; + + val reporter = new ConsoleReporter(new Settings) + val toolbox = new ToolBox(reporter) + val ttree = toolbox.typeCheck(code.tree) + toolbox.runExpr(ttree) +} diff --git a/test/pending/run/reify_complex.check b/test/pending/run/reify_complex.check new file mode 100644 index 0000000000..7df35e33a0 --- /dev/null +++ b/test/pending/run/reify_complex.check @@ -0,0 +1 @@ +3.0+4.0*i diff --git a/test/pending/run/reify_complex.scala b/test/pending/run/reify_complex.scala new file mode 100644 index 0000000000..aae4d558cf --- /dev/null +++ b/test/pending/run/reify_complex.scala @@ -0,0 +1,31 @@ +import scala.tools.nsc.reporters._ +import scala.tools.nsc.Settings +import reflect.runtime.Mirror.ToolBox + +object Test extends App { + val code = scala.reflect.Code.lift{ + class Complex(val re: Double, val im: Double) { + def + (that: Complex) = + new Complex(re + that.re, im + that.im) + def - (that: Complex) = + new Complex(re - that.re, im - that.im) + def * (that: Complex) = + new Complex(re * that.re - im * that.im, + re * that.im + im * that.re) + def / (that: Complex) = { + val denom = that.re * that.re + that.im * that.im + new Complex((re * that.re + im * that.im) / denom, + (im * that.re - re * that.im) / denom) + } + override def toString = + re + (if (im < 0) "-" + (-im) else "+" + im) + "*i" + } + val x = new Complex(2, 1); val y = new Complex(1, 3) + println(x + y) + }; + + val reporter = new ConsoleReporter(new Settings) + val toolbox = new ToolBox(reporter) + val ttree = toolbox.typeCheck(code.tree) + toolbox.runExpr(ttree) +} diff --git a/test/pending/run/reify_extendbuiltins.check b/test/pending/run/reify_extendbuiltins.check new file mode 100644 index 0000000000..a48033a30d --- /dev/null +++ b/test/pending/run/reify_extendbuiltins.check @@ -0,0 +1 @@ +10! = 3628800 diff --git a/test/pending/run/reify_extendbuiltins.scala b/test/pending/run/reify_extendbuiltins.scala new file mode 100644 index 0000000000..57acd699ff --- /dev/null +++ b/test/pending/run/reify_extendbuiltins.scala @@ -0,0 +1,21 @@ +import scala.tools.nsc.reporters._ +import scala.tools.nsc.Settings +import reflect.runtime.Mirror.ToolBox + +object Test extends App { + val code = scala.reflect.Code.lift{ + def fact(n: Int): BigInt = + if (n == 0) 1 else fact(n-1) * n + class Factorizer(n: Int) { + def ! = fact(n) + } + implicit def int2fact(n: Int) = new Factorizer(n) + + println("10! = " + (10!)) + }; + + val reporter = new ConsoleReporter(new Settings) + val toolbox = new ToolBox(reporter) + val ttree = toolbox.typeCheck(code.tree) + toolbox.runExpr(ttree) +} diff --git a/test/pending/run/reify_fors.check b/test/pending/run/reify_fors.check new file mode 100644 index 0000000000..eefddedc20 --- /dev/null +++ b/test/pending/run/reify_fors.check @@ -0,0 +1,5 @@ +Persons over 20: John Richard +divisors(34) = List(1, 2, 17, 34) +findNums(15) = (4,1) (5,2) (6,1) (7,4) (8,3) (8,5) (9,2) (9,4) (10,1) (10,3) (10,7) (11,2) (11,6) (11,8) (12,1) (12,5) (12,7) (13,4) (13,6) (13,10) (14,3) (14,5) (14,9) +average(List(3.5, 5.0, 4.5)) = 4.333333333333333 +scalProd(List(3.5, 5.0, 4.5), List(2.0, 1.0, 3.0)) = 25.5 diff --git a/test/pending/run/reify_fors.scala b/test/pending/run/reify_fors.scala new file mode 100644 index 0000000000..f3556514a9 --- /dev/null +++ b/test/pending/run/reify_fors.scala @@ -0,0 +1,107 @@ +import scala.tools.nsc.reporters._ +import scala.tools.nsc.Settings +import reflect.runtime.Mirror.ToolBox + +object Test extends App { + val code = scala.reflect.Code.lift{ + object Persons { + /** A list of persons. To create a list, we use Predef.List + * which takes a variable number of arguments and constructs + * a list out of them. + */ + val persons = List( + new Person("Bob", 17), + new Person("John", 40), + new Person("Richard", 68) + ) + + /** A Person class. 'val' constructor parameters become + * public members of the class. + */ + class Person(val name: String, val age: Int) + + /** Return an iterator over persons that are older than 20. + */ + def olderThan20(xs: Seq[Person]): Iterator[String] = + olderThan20(xs.elements) + + /** Return an iterator over persons older than 20, given + * an iterator over persons. + */ + def olderThan20(xs: Iterator[Person]): Iterator[String] = { + + // The first expression is called a 'generator' and makes + // 'p' take values from 'xs'. The second expression is + // called a 'filter' and it is a boolean expression which + // selects only persons older than 20. There can be more than + // one generator and filter. The 'yield' expression is evaluated + // for each 'p' which satisfies the filters and used to assemble + // the resulting iterator + for (p <- xs if p.age > 20) yield p.name + } + } + + /** Some functions over lists of numbers which demonstrate + * the use of for comprehensions. + */ + object Numeric { + + /** Return the divisors of n. */ + def divisors(n: Int): List[Int] = + for (i <- List.range(1, n+1) if n % i == 0) yield i + + /** Is 'n' a prime number? */ + def isPrime(n: Int) = divisors(n).length == 2 + + /** Return pairs of numbers whose sum is prime. */ + def findNums(n: Int): Iterable[(Int, Int)] = { + + // a for comprehension using two generators + for (i <- 1 until n; + j <- 1 until (i-1); + if isPrime(i + j)) yield (i, j) + } + + /** Return the sum of the elements of 'xs'. */ + def sum(xs: List[Double]): Double = + xs.foldLeft(0.0) { (x, y) => x + y } + + /** Return the sum of pairwise product of the two lists. */ + def scalProd(xs: List[Double], ys: List[Double]) = + sum(for((x, y) <- xs zip ys) yield x * y); + + /** Remove duplicate elements in 'xs'. */ + def removeDuplicates[A](xs: List[A]): List[A] = + if (xs.isEmpty) + xs + else + xs.head :: removeDuplicates(for (x <- xs.tail if x != xs.head) yield x) + } + + // import all members of object 'persons' in the current scope + import Persons._ + + print("Persons over 20:") + olderThan20(persons) foreach { x => print(" " + x) } + println + + import Numeric._ + + println("divisors(34) = " + divisors(34)) + + print("findNums(15) =") + findNums(15) foreach { x => print(" " + x) } + println + + val xs = List(3.5, 5.0, 4.5) + println("average(" + xs + ") = " + sum(xs) / xs.length) + + val ys = List(2.0, 1.0, 3.0) + println("scalProd(" + xs + ", " + ys +") = " + scalProd(xs, ys)) + }; + + val reporter = new ConsoleReporter(new Settings) + val toolbox = new ToolBox(reporter) + val ttree = toolbox.typeCheck(code.tree) + toolbox.runExpr(ttree) +} diff --git a/test/pending/run/reify_gadts.check b/test/pending/run/reify_gadts.check new file mode 100644 index 0000000000..d81cc0710e --- /dev/null +++ b/test/pending/run/reify_gadts.check @@ -0,0 +1 @@ +42 diff --git a/test/pending/run/reify_gadts.scala b/test/pending/run/reify_gadts.scala new file mode 100644 index 0000000000..7077de735c --- /dev/null +++ b/test/pending/run/reify_gadts.scala @@ -0,0 +1,45 @@ +import scala.tools.nsc.reporters._ +import scala.tools.nsc.Settings +import reflect.runtime.Mirror.ToolBox + +object Test extends App { + val code = scala.reflect.Code.lift{ + /* The syntax tree of a toy language */ + abstract class Term[T] + + /* An integer literal */ + case class Lit(x: Int) extends Term[Int] + + /* Successor of a number */ + case class Succ(t: Term[Int]) extends Term[Int] + + /* Is 't' equal to zero? */ + case class IsZero(t: Term[Int]) extends Term[Boolean] + + /* An 'if' expression. */ + case class If[T](c: Term[Boolean], + t1: Term[T], + t2: Term[T]) extends Term[T] + + /** A type-safe eval function. The right-hand sides can + * make use of the fact that 'T' is a more precise type, + * constraint by the pattern type. + */ + def eval[T](t: Term[T]): T = t match { + case Lit(n) => n + + // the right hand side makes use of the fact + // that T = Int and so it can use '+' + case Succ(u) => eval(u) + 1 + case IsZero(u) => eval(u) == 0 + case If(c, u1, u2) => eval(if (eval(c)) u1 else u2) + } + println( + eval(If(IsZero(Lit(1)), Lit(41), Succ(Lit(41))))) + }; + + val reporter = new ConsoleReporter(new Settings) + val toolbox = new ToolBox(reporter) + val ttree = toolbox.typeCheck(code.tree) + toolbox.runExpr(ttree) +} diff --git a/test/pending/run/reify_implicits.check b/test/pending/run/reify_implicits.check new file mode 100644 index 0000000000..e3aeb20f6b --- /dev/null +++ b/test/pending/run/reify_implicits.check @@ -0,0 +1 @@ +x = List(1, 2, 3, 4) diff --git a/test/pending/run/reify_implicits.scala b/test/pending/run/reify_implicits.scala new file mode 100644 index 0000000000..a15cef9c97 --- /dev/null +++ b/test/pending/run/reify_implicits.scala @@ -0,0 +1,21 @@ +import scala.tools.nsc.reporters._ +import scala.tools.nsc.Settings +import reflect.runtime.Mirror.ToolBox + +object Test extends App { + val code = scala.reflect.Code.lift{ + implicit def arrayWrapper[A : ClassManifest](x: Array[A]) = + new { + def sort(p: (A, A) => Boolean) = { + util.Sorting.stableSort(x, p); x + } + } + val x = Array(2, 3, 1, 4) + println("x = "+ x.sort((x: Int, y: Int) => x < y).toList) + }; + + val reporter = new ConsoleReporter(new Settings) + val toolbox = new ToolBox(reporter) + val ttree = toolbox.typeCheck(code.tree) + toolbox.runExpr(ttree) +} diff --git a/test/pending/run/reify_lazyevaluation.check b/test/pending/run/reify_lazyevaluation.check new file mode 100644 index 0000000000..1c7f96cd96 --- /dev/null +++ b/test/pending/run/reify_lazyevaluation.check @@ -0,0 +1,8 @@ +s = Susp(?) +evaluating... +s() = 3 +s = Susp(3) +2 + s = 5 +sl2 = Susp(?) +sl2() = Some(3) +sl2 = Susp(Some(3)) diff --git a/test/pending/run/reify_lazyevaluation.scala b/test/pending/run/reify_lazyevaluation.scala new file mode 100644 index 0000000000..f38af76751 --- /dev/null +++ b/test/pending/run/reify_lazyevaluation.scala @@ -0,0 +1,65 @@ +import scala.tools.nsc.reporters._ +import scala.tools.nsc.Settings +import reflect.runtime.Mirror.ToolBox + +object Test extends App { + val code = scala.reflect.Code.lift{ + object lazyLib { + + /** Delay the evaluation of an expression until it is needed. */ + def delay[A](value: => A): Susp[A] = new SuspImpl[A](value) + + /** Get the value of a delayed expression. */ + implicit def force[A](s: Susp[A]): A = s() + + /** + * Data type of suspended computations. (The name froms from ML.) + */ + abstract class Susp[+A] extends Function0[A] + + /** + * Implementation of suspended computations, separated from the + * abstract class so that the type parameter can be invariant. + */ + class SuspImpl[A](lazyValue: => A) extends Susp[A] { + private var maybeValue: Option[A] = None + + override def apply() = maybeValue match { + case None => + val value = lazyValue + maybeValue = Some(value) + value + case Some(value) => + value + } + + override def toString() = maybeValue match { + case None => "Susp(?)" + case Some(value) => "Susp(" + value + ")" + } + } + } + + import lazyLib._ + + val s: Susp[Int] = delay { println("evaluating..."); 3 } + + println("s = " + s) // show that s is unevaluated + println("s() = " + s()) // evaluate s + println("s = " + s) // show that the value is saved + println("2 + s = " + (2 + s)) // implicit call to force() + + val sl = delay { Some(3) } + val sl1: Susp[Some[Int]] = sl + val sl2: Susp[Option[Int]] = sl1 // the type is covariant + + println("sl2 = " + sl2) + println("sl2() = " + sl2()) + println("sl2 = " + sl2) + }; + + val reporter = new ConsoleReporter(new Settings) + val toolbox = new ToolBox(reporter) + val ttree = toolbox.typeCheck(code.tree) + toolbox.runExpr(ttree) +} diff --git a/test/pending/run/reify_maps.check b/test/pending/run/reify_maps.check new file mode 100644 index 0000000000..08cbbb1359 --- /dev/null +++ b/test/pending/run/reify_maps.check @@ -0,0 +1,4 @@ +red has code: 16711680 +Unknown color: green +Unknown color: blue +turquoise has code: 65535 diff --git a/test/pending/run/reify_maps.scala b/test/pending/run/reify_maps.scala new file mode 100644 index 0000000000..589b28d049 --- /dev/null +++ b/test/pending/run/reify_maps.scala @@ -0,0 +1,26 @@ +import scala.tools.nsc.reporters._ +import scala.tools.nsc.Settings +import reflect.runtime.Mirror.ToolBox + +object Test extends App { + val code = scala.reflect.Code.lift{ + val colors = Map("red" -> 0xFF0000, + "turquoise" -> 0x00FFFF, + "black" -> 0x000000, + "orange" -> 0xFF8040, + "brown" -> 0x804000) + for (name <- List("red", "green", "blue", "turquoise")) println( + colors.get(name) match { + case Some(code) => + name + " has code: " + code + case None => + "Unknown color: " + name + } + ) + }; + + val reporter = new ConsoleReporter(new Settings) + val toolbox = new ToolBox(reporter) + val ttree = toolbox.typeCheck(code.tree) + toolbox.runExpr(ttree) +} diff --git a/test/pending/run/reify_properties.check b/test/pending/run/reify_properties.check new file mode 100644 index 0000000000..d769bea4b0 --- /dev/null +++ b/test/pending/run/reify_properties.check @@ -0,0 +1,2 @@ +user1: MR. ROBERT <noname> +user2: MR. BOB KUZ diff --git a/test/pending/run/reify_properties.scala b/test/pending/run/reify_properties.scala new file mode 100644 index 0000000000..2115a96715 --- /dev/null +++ b/test/pending/run/reify_properties.scala @@ -0,0 +1,63 @@ +import scala.tools.nsc.reporters._ +import scala.tools.nsc.Settings +import reflect.runtime.Mirror.ToolBox + +object Test extends App { + val code = scala.reflect.Code.lift{ + /** A mutable property whose getter and setter may be customized. */ + case class Property[T](init: T) { + private var value: T = init + + /** The getter function, defaults to identity. */ + private var setter: T => T = identity[T] + + /** The setter function, defaults to identity. */ + private var getter: T => T = identity[T] + + /** Retrive the value held in this property. */ + def apply(): T = getter(value) + + /** Update the value held in this property, through the setter. */ + def update(newValue: T) = value = setter(newValue) + + /** Change the getter. */ + def get(newGetter: T => T) = { getter = newGetter; this } + + /** Change the setter */ + def set(newSetter: T => T) = { setter = newSetter; this } + } + + class User { + // Create a property with custom getter and setter + val firstname = Property("") + .get { v => v.toUpperCase() } + .set { v => "Mr. " + v } + val lastname = Property("<noname>") + + /** Scala provides syntactic sugar for calling 'apply'. Simply + * adding a list of arguments between parenthesis (in this case, + * an empty list) is translated to a call to 'apply' with those + * arguments. + */ + override def toString() = firstname() + " " + lastname() + } + + val user1 = new User + + // Syntactic sugar for 'update': an assignment is translated to a + // call to method 'update' + user1.firstname() = "Robert" + + val user2 = new User + user2.firstname() = "bob" + user2.lastname() = "KUZ" + + println("user1: " + user1) + println("user2: " + user2) + }; + + val reporter = new ConsoleReporter(new Settings) + val toolbox = new ToolBox(reporter) + val ttree = toolbox.typeCheck(code.tree) + toolbox.runExpr(ttree) +} diff --git a/test/pending/run/reify_simpleinterpreter.check b/test/pending/run/reify_simpleinterpreter.check new file mode 100644 index 0000000000..4344dc9009 --- /dev/null +++ b/test/pending/run/reify_simpleinterpreter.check @@ -0,0 +1,2 @@ +42 +wrong diff --git a/test/pending/run/reify_simpleinterpreter.scala b/test/pending/run/reify_simpleinterpreter.scala new file mode 100644 index 0000000000..b39f5583bb --- /dev/null +++ b/test/pending/run/reify_simpleinterpreter.scala @@ -0,0 +1,82 @@ +import scala.tools.nsc.reporters._ +import scala.tools.nsc.Settings +import reflect.runtime.Mirror.ToolBox + +object Test extends App { + val code = scala.reflect.Code.lift{ + case class M[A](value: A) { + def bind[B](k: A => M[B]): M[B] = k(value) + def map[B](f: A => B): M[B] = bind(x => unitM(f(x))) + def flatMap[B](f: A => M[B]): M[B] = bind(f) + } + + def unitM[A](a: A): M[A] = M(a) + + def showM(m: M[Value]): String = m.value.toString(); + + type Name = String + + trait Term; + case class Var(x: Name) extends Term + case class Con(n: Int) extends Term + case class Add(l: Term, r: Term) extends Term + case class Lam(x: Name, body: Term) extends Term + case class App(fun: Term, arg: Term) extends Term + + trait Value + case object Wrong extends Value { + override def toString() = "wrong" + } + case class Num(n: Int) extends Value { + override def toString() = n.toString() + } + case class Fun(f: Value => M[Value]) extends Value { + override def toString() = "<function>" + } + + type Environment = List[Pair[Name, Value]] + + def lookup(x: Name, e: Environment): M[Value] = e match { + case List() => unitM(Wrong) + case Pair(y, b) :: e1 => if (x == y) unitM(b) else lookup(x, e1) + } + + def add(a: Value, b: Value): M[Value] = Pair(a, b) match { + case Pair(Num(m), Num(n)) => unitM(Num(m + n)) + case _ => unitM(Wrong) + } + + def apply(a: Value, b: Value): M[Value] = a match { + case Fun(k) => k(b) + case _ => unitM(Wrong) + } + + def interp(t: Term, e: Environment): M[Value] = t match { + case Var(x) => lookup(x, e) + case Con(n) => unitM(Num(n)) + case Add(l, r) => for (a <- interp(l, e); + b <- interp(r, e); + c <- add(a, b)) + yield c + case Lam(x, t) => unitM(Fun(a => interp(t, Pair(x, a) :: e))) + case App(f, t) => for (a <- interp(f, e); + b <- interp(t, e); + c <- apply(a, b)) + yield c + } + + def test(t: Term): String = + showM(interp(t, List())) + + val term0 = App(Lam("x", Add(Var("x"), Var("x"))), Add(Con(10), Con(11))) + val term1 = App(Con(1), Con(2)) + + println(test(term0)) + println(test(term1)) + }; + + val reporter = new ConsoleReporter(new Settings) + val toolbox = new ToolBox(reporter) + val ttree = toolbox.typeCheck(code.tree) + toolbox.runExpr(ttree) +} diff --git a/test/pending/run/reify_sort.check b/test/pending/run/reify_sort.check new file mode 100644 index 0000000000..375536cc29 --- /dev/null +++ b/test/pending/run/reify_sort.check @@ -0,0 +1,2 @@ +[6,2,8,5,1] +[1,2,5,6,8] diff --git a/test/pending/run/reify_sort.scala b/test/pending/run/reify_sort.scala new file mode 100644 index 0000000000..42991fe5d2 --- /dev/null +++ b/test/pending/run/reify_sort.scala @@ -0,0 +1,57 @@ +import scala.tools.nsc.reporters._ +import scala.tools.nsc.Settings +import reflect.runtime.Mirror.ToolBox + +object Test extends App { + val code = scala.reflect.Code.lift{ + /** Nested methods can use and even update everything + * visible in their scope (including local variables or + * arguments of enclosing methods). + */ + def sort(a: Array[Int]) { + + def swap(i: Int, j: Int) { + val t = a(i); a(i) = a(j); a(j) = t + } + + def sort1(l: Int, r: Int) { + val pivot = a((l + r) / 2) + var i = l + var j = r + while (i <= j) { + while (a(i) < pivot) i += 1 + while (a(j) > pivot) j -= 1 + if (i <= j) { + swap(i, j) + i += 1 + j -= 1 + } + } + if (l < j) sort1(l, j) + if (j < r) sort1(i, r) + } + + if (a.length > 0) + sort1(0, a.length - 1) + } + + def println(ar: Array[Int]) { + def print1 = { + def iter(i: Int): String = + ar(i) + (if (i < ar.length-1) "," + iter(i+1) else "") + if (ar.length == 0) "" else iter(0) + } + Console.println("[" + print1 + "]") + } + + val ar = Array(6, 2, 8, 5, 1) + println(ar) + sort(ar) + println(ar) + }; + + val reporter = new ConsoleReporter(new Settings) + val toolbox = new ToolBox(reporter) + val ttree = toolbox.typeCheck(code.tree) + toolbox.runExpr(ttree) +} diff --git a/test/pending/run/reify_sort1.check b/test/pending/run/reify_sort1.check new file mode 100644 index 0000000000..0d30805141 --- /dev/null +++ b/test/pending/run/reify_sort1.check @@ -0,0 +1,2 @@ +List(6, 2, 8, 5, 1) +List(1, 2, 5, 6, 8) diff --git a/test/pending/run/reify_sort1.scala b/test/pending/run/reify_sort1.scala new file mode 100644 index 0000000000..42f4c824a5 --- /dev/null +++ b/test/pending/run/reify_sort1.scala @@ -0,0 +1,27 @@ +import scala.tools.nsc.reporters._ +import scala.tools.nsc.Settings +import reflect.runtime.Mirror.ToolBox + +object Test extends App { + val code = scala.reflect.Code.lift{ + def sort(a: List[Int]): List[Int] = { + if (a.length < 2) + a + else { + val pivot = a(a.length / 2) + sort(a.filter(_ < pivot)) ::: + a.filter(_ == pivot) ::: + sort(a.filter(_ > pivot)) + } + } + + val xs = List(6, 2, 8, 5, 1) + println(xs) + println(sort(xs)) + }; + + val reporter = new ConsoleReporter(new Settings) + val toolbox = new ToolBox(reporter) + val ttree = toolbox.typeCheck(code.tree) + toolbox.runExpr(ttree) +} diff --git a/test/pending/run/reify_timeofday.check b/test/pending/run/reify_timeofday.check new file mode 100644 index 0000000000..3fd3b76a62 --- /dev/null +++ b/test/pending/run/reify_timeofday.check @@ -0,0 +1 @@ +DateError diff --git a/test/pending/run/reify_timeofday.scala b/test/pending/run/reify_timeofday.scala new file mode 100644 index 0000000000..6bd11b0d30 --- /dev/null +++ b/test/pending/run/reify_timeofday.scala @@ -0,0 +1,48 @@ +import scala.tools.nsc.reporters._ +import scala.tools.nsc.Settings +import reflect.runtime.Mirror.ToolBox + +object Test extends App { + val code = scala.reflect.Code.lift{ + class DateError extends Exception + + /** Simulating properties in Scala + * (example 4.2.1 in ScalaReference.pdf) + */ + class TimeOfDayVar { + private var h, m, s: Int = 0 + + def hours = h + + /** A method 'ident_=' is a setter for 'ident'. 'code.ident = ...' will + * be translated to a call to 'ident_=' + */ + def hours_= (h: Int) = + if (0 <= h && h < 24) this.h = h + else throw new DateError() + + def minutes = m + def minutes_= (m: Int) = + if (0 <= m && m < 60) this.m = m + else throw new DateError() + + def seconds = s + def seconds_= (s: Int) = + if (0 <= s && s < 60) this.s = s + else throw new DateError() + } + + val d = new TimeOfDayVar + d.hours = 8; d.minutes = 30; d.seconds = 0 + try { d.hours = 25 // throws a DateError exception + } catch { + case de: DateError => println("DateError") + case e: Exception => println("Exception") + } + }; + + val reporter = new ConsoleReporter(new Settings) + val toolbox = new ToolBox(reporter) + val ttree = toolbox.typeCheck(code.tree) + toolbox.runExpr(ttree) +} diff --git a/test/pending/run/t5229_1_nolift.scala b/test/pending/run/t5229_1_nolift.scala new file mode 100644 index 0000000000..33855d2e4f --- /dev/null +++ b/test/pending/run/t5229_1_nolift.scala @@ -0,0 +1 @@ +object C diff --git a/test/pending/run/t5271_1.check b/test/pending/run/t5271_1.check new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/test/pending/run/t5271_1.check diff --git a/test/pending/run/t5271_1.scala b/test/pending/run/t5271_1.scala new file mode 100644 index 0000000000..5f10e64528 --- /dev/null +++ b/test/pending/run/t5271_1.scala @@ -0,0 +1,14 @@ +import scala.tools.nsc.reporters._ +import scala.tools.nsc.Settings +import reflect.runtime.Mirror.ToolBox + +object Test extends App { + val code = scala.reflect.Code.lift{ + case class C(foo: Int, bar: Int) + }; + + val reporter = new ConsoleReporter(new Settings) + val toolbox = new ToolBox(reporter) + val ttree = toolbox.typeCheck(code.tree) + toolbox.runExpr(ttree) +} diff --git a/test/pending/run/t5271_2.check b/test/pending/run/t5271_2.check new file mode 100644 index 0000000000..b8626c4cff --- /dev/null +++ b/test/pending/run/t5271_2.check @@ -0,0 +1 @@ +4 diff --git a/test/pending/run/t5271_2.scala b/test/pending/run/t5271_2.scala new file mode 100644 index 0000000000..71967c04ed --- /dev/null +++ b/test/pending/run/t5271_2.scala @@ -0,0 +1,16 @@ +import scala.tools.nsc.reporters._ +import scala.tools.nsc.Settings +import reflect.runtime.Mirror.ToolBox + +object Test extends App { + val code = scala.reflect.Code.lift{ + case class C(foo: Int, bar: Int) + val c = C(2, 2) + println(c.foo * c.bar) + }; + + val reporter = new ConsoleReporter(new Settings) + val toolbox = new ToolBox(reporter) + val ttree = toolbox.typeCheck(code.tree) + toolbox.runExpr(ttree) +} diff --git a/test/pending/run/t5272.check b/test/pending/run/t5272.check new file mode 100644 index 0000000000..dcf02b2fb6 --- /dev/null +++ b/test/pending/run/t5272.check @@ -0,0 +1 @@ +okay diff --git a/test/pending/run/t5272.scala b/test/pending/run/t5272.scala new file mode 100644 index 0000000000..3f44d05fb3 --- /dev/null +++ b/test/pending/run/t5272.scala @@ -0,0 +1,17 @@ +import scala.tools.nsc.reporters._ +import scala.tools.nsc.Settings +import reflect.runtime.Mirror.ToolBox + +object Test extends App { + val code = scala.reflect.Code.lift{ + 2 match { + case 2 => println("okay") + case _ => println("not okay") + } + }; + + val reporter = new ConsoleReporter(new Settings) + val toolbox = new ToolBox(reporter) + val ttree = toolbox.typeCheck(code.tree) + toolbox.runExpr(ttree) +} diff --git a/test/pending/run/t5273_1.check b/test/pending/run/t5273_1.check new file mode 100644 index 0000000000..c551774ca5 --- /dev/null +++ b/test/pending/run/t5273_1.check @@ -0,0 +1 @@ +name = American Dollar, shortname = USD, value = 2,8567 diff --git a/test/pending/run/t5273_1.scala b/test/pending/run/t5273_1.scala new file mode 100644 index 0000000000..8b75084463 --- /dev/null +++ b/test/pending/run/t5273_1.scala @@ -0,0 +1,16 @@ +import scala.tools.nsc.reporters._ +import scala.tools.nsc.Settings +import reflect.runtime.Mirror.ToolBox + +object Test extends App { + val code = scala.reflect.Code.lift{ + val RegexParser = """(.*) \d+([A-Z]+) \| (.*) \|.*""".r + val RegexParser(name, shortname, value) = "American Dollar 1USD | 2,8567 | sometext" + println("name = %s, shortname = %s, value = %s".format(name, shortname, value)) + }; + + val reporter = new ConsoleReporter(new Settings) + val toolbox = new ToolBox(reporter) + val ttree = toolbox.typeCheck(code.tree) + toolbox.runExpr(ttree) +} diff --git a/test/pending/run/t5273_2.check b/test/pending/run/t5273_2.check new file mode 100644 index 0000000000..0cfbf08886 --- /dev/null +++ b/test/pending/run/t5273_2.check @@ -0,0 +1 @@ +2 diff --git a/test/pending/run/t5273_2.scala b/test/pending/run/t5273_2.scala new file mode 100644 index 0000000000..1175881c9f --- /dev/null +++ b/test/pending/run/t5273_2.scala @@ -0,0 +1,17 @@ +import scala.tools.nsc.reporters._ +import scala.tools.nsc.Settings +import reflect.runtime.Mirror.ToolBox + +object Test extends App { + val code = scala.reflect.Code.lift{ + List(1, 2, 3) match { + case foo :: bar :: _ => println(foo * bar) + case _ => println("this is getting out of hand!") + } + }; + + val reporter = new ConsoleReporter(new Settings) + val toolbox = new ToolBox(reporter) + val ttree = toolbox.typeCheck(code.tree) + toolbox.runExpr(ttree) +} diff --git a/test/pending/run/t5274_1.check b/test/pending/run/t5274_1.check new file mode 100644 index 0000000000..fca8bc3d3e --- /dev/null +++ b/test/pending/run/t5274_1.check @@ -0,0 +1,3 @@ +50! = 30414093201713378043612608166064768844377641568960512000000000000 +49! = 608281864034267560872252163321295376887552831379210240000000000 +50!/49! = 50 diff --git a/test/pending/run/t5274_1.scala b/test/pending/run/t5274_1.scala new file mode 100644 index 0000000000..c501172518 --- /dev/null +++ b/test/pending/run/t5274_1.scala @@ -0,0 +1,20 @@ +import scala.tools.nsc.reporters._ +import scala.tools.nsc.Settings +import reflect.runtime.Mirror.ToolBox + +object Test extends App { + val code = scala.reflect.Code.lift{ + def factorial(n: BigInt): BigInt = + if (n == 0) 1 else n * factorial(n-1) + + val f50 = factorial(50); val f49 = factorial(49) + println("50! = " + f50) + println("49! = " + f49) + println("50!/49! = " + (f50 / f49)) + }; + + val reporter = new ConsoleReporter(new Settings) + val toolbox = new ToolBox(reporter) + val ttree = toolbox.typeCheck(code.tree) + toolbox.runExpr(ttree) +} diff --git a/test/pending/run/t5274_2.check b/test/pending/run/t5274_2.check new file mode 100644 index 0000000000..375536cc29 --- /dev/null +++ b/test/pending/run/t5274_2.check @@ -0,0 +1,2 @@ +[6,2,8,5,1] +[1,2,5,6,8] diff --git a/test/pending/run/t5274_2.scala b/test/pending/run/t5274_2.scala new file mode 100644 index 0000000000..42991fe5d2 --- /dev/null +++ b/test/pending/run/t5274_2.scala @@ -0,0 +1,57 @@ +import scala.tools.nsc.reporters._ +import scala.tools.nsc.Settings +import reflect.runtime.Mirror.ToolBox + +object Test extends App { + val code = scala.reflect.Code.lift{ + /** Nested methods can use and even update everything + * visible in their scope (including local variables or + * arguments of enclosing methods). + */ + def sort(a: Array[Int]) { + + def swap(i: Int, j: Int) { + val t = a(i); a(i) = a(j); a(j) = t + } + + def sort1(l: Int, r: Int) { + val pivot = a((l + r) / 2) + var i = l + var j = r + while (i <= j) { + while (a(i) < pivot) i += 1 + while (a(j) > pivot) j -= 1 + if (i <= j) { + swap(i, j) + i += 1 + j -= 1 + } + } + if (l < j) sort1(l, j) + if (j < r) sort1(i, r) + } + + if (a.length > 0) + sort1(0, a.length - 1) + } + + def println(ar: Array[Int]) { + def print1 = { + def iter(i: Int): String = + ar(i) + (if (i < ar.length-1) "," + iter(i+1) else "") + if (ar.length == 0) "" else iter(0) + } + Console.println("[" + print1 + "]") + } + + val ar = Array(6, 2, 8, 5, 1) + println(ar) + sort(ar) + println(ar) + }; + + val reporter = new ConsoleReporter(new Settings) + val toolbox = new ToolBox(reporter) + val ttree = toolbox.typeCheck(code.tree) + toolbox.runExpr(ttree) +} diff --git a/test/pending/run/t5275.check b/test/pending/run/t5275.check new file mode 100644 index 0000000000..0cfbf08886 --- /dev/null +++ b/test/pending/run/t5275.check @@ -0,0 +1 @@ +2 diff --git a/test/pending/run/t5275.scala b/test/pending/run/t5275.scala new file mode 100644 index 0000000000..d419834ded --- /dev/null +++ b/test/pending/run/t5275.scala @@ -0,0 +1,15 @@ +import scala.tools.nsc.reporters._ +import scala.tools.nsc.Settings +import reflect.runtime.Mirror.ToolBox + +object Test extends App { + val code = scala.reflect.Code.lift{ + class C(val foo: Int) + println(new C(2).foo) + }; + + val reporter = new ConsoleReporter(new Settings) + val toolbox = new ToolBox(reporter) + val ttree = toolbox.typeCheck(code.tree) + toolbox.runExpr(ttree) +} diff --git a/test/pending/run/t5276.check b/test/pending/run/t5276.check new file mode 100644 index 0000000000..0cfbf08886 --- /dev/null +++ b/test/pending/run/t5276.check @@ -0,0 +1 @@ +2 diff --git a/test/pending/run/t5276.scala b/test/pending/run/t5276.scala new file mode 100644 index 0000000000..432fdb91e4 --- /dev/null +++ b/test/pending/run/t5276.scala @@ -0,0 +1,15 @@ +import scala.tools.nsc.reporters._ +import scala.tools.nsc.Settings +import reflect.runtime.Mirror.ToolBox + +object Test extends App { + val code = scala.reflect.Code.lift{ + lazy x = 2 + println(x) + }; + + val reporter = new ConsoleReporter(new Settings) + val toolbox = new ToolBox(reporter) + val ttree = toolbox.typeCheck(code.tree) + toolbox.runExpr(ttree) +} diff --git a/test/pending/run/t5277_1.check b/test/pending/run/t5277_1.check new file mode 100644 index 0000000000..a48033a30d --- /dev/null +++ b/test/pending/run/t5277_1.check @@ -0,0 +1 @@ +10! = 3628800 diff --git a/test/pending/run/t5277_1.scala b/test/pending/run/t5277_1.scala new file mode 100644 index 0000000000..57acd699ff --- /dev/null +++ b/test/pending/run/t5277_1.scala @@ -0,0 +1,21 @@ +import scala.tools.nsc.reporters._ +import scala.tools.nsc.Settings +import reflect.runtime.Mirror.ToolBox + +object Test extends App { + val code = scala.reflect.Code.lift{ + def fact(n: Int): BigInt = + if (n == 0) 1 else fact(n-1) * n + class Factorizer(n: Int) { + def ! = fact(n) + } + implicit def int2fact(n: Int) = new Factorizer(n) + + println("10! = " + (10!)) + }; + + val reporter = new ConsoleReporter(new Settings) + val toolbox = new ToolBox(reporter) + val ttree = toolbox.typeCheck(code.tree) + toolbox.runExpr(ttree) +} diff --git a/test/pending/run/t5277_2.check b/test/pending/run/t5277_2.check new file mode 100644 index 0000000000..5f1d0ecea5 --- /dev/null +++ b/test/pending/run/t5277_2.check @@ -0,0 +1,2 @@ +2 +1 diff --git a/test/pending/run/t5277_2.scala b/test/pending/run/t5277_2.scala new file mode 100644 index 0000000000..67b6b000bc --- /dev/null +++ b/test/pending/run/t5277_2.scala @@ -0,0 +1,18 @@ +import scala.tools.nsc.reporters._ +import scala.tools.nsc.Settings +import reflect.runtime.Mirror.ToolBox + +object Test extends App { + val code = scala.reflect.Code.lift{ + def p(implicit i: Int) = print(i) + implicit val v = 2 + + println(p) + println(p(1)) + }; + + val reporter = new ConsoleReporter(new Settings) + val toolbox = new ToolBox(reporter) + val ttree = toolbox.typeCheck(code.tree) + toolbox.runExpr(ttree) +} diff --git a/test/pending/run/t5279.check b/test/pending/run/t5279.check new file mode 100644 index 0000000000..f599e28b8a --- /dev/null +++ b/test/pending/run/t5279.check @@ -0,0 +1 @@ +10 diff --git a/test/pending/run/t5279.scala b/test/pending/run/t5279.scala new file mode 100644 index 0000000000..39e7dd2c66 --- /dev/null +++ b/test/pending/run/t5279.scala @@ -0,0 +1,14 @@ +import scala.tools.nsc.reporters._ +import scala.tools.nsc.Settings +import reflect.runtime.Mirror.ToolBox + +object Test extends App { + val code = scala.reflect.Code.lift{ + println(new Integer(10)) + }; + + val reporter = new ConsoleReporter(new Settings) + val toolbox = new ToolBox(reporter) + val ttree = toolbox.typeCheck(code.tree) + toolbox.runExpr(ttree) +} diff --git a/tools/get-scala-revision b/tools/get-scala-revision index 23b216aa2b..e8597844cc 100755 --- a/tools/get-scala-revision +++ b/tools/get-scala-revision @@ -5,8 +5,15 @@ # # If no dir is given, current working dir is used. -[[ -n "$1" ]] && cd "$1" +[ -n "$1" ] && cd "$1" # dev should be a tag at the merge-base of master and the # most recent release. -git describe head --abbrev=7 --match dev +if [ -z $(git tag -l dev) ]; then + # no dev tag available - this will generate dev-g<sha> + echo "dev-g$(git describe HEAD --abbrev=7 --always)" +else + # dev tag exists - this generates dev-NNNN-g<sha> + # where NNNN is the number of commits since dev. + git describe HEAD --abbrev=7 --match dev +fi diff --git a/tools/get-scala-revision.bat b/tools/get-scala-revision.bat index ed3ade8a3e..f4dc24b71f 100644 --- a/tools/get-scala-revision.bat +++ b/tools/get-scala-revision.bat @@ -15,8 +15,7 @@ if "%*"=="" ( cd %_DIR% if exist .git\NUL ( - git describe head --abbrev=7 --match dev - echo 0 + git describe HEAD --abbrev=7 --match dev ) :end |