summaryrefslogtreecommitdiff
path: root/sources/scala/tools/nsc/transform/UnCurry.scala
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2005-06-09 18:45:48 +0000
committerMartin Odersky <odersky@gmail.com>2005-06-09 18:45:48 +0000
commit4ae459ef755dccc8230a884bf6f462c4dadc96b8 (patch)
tree3d27d19a37680d452c4b52b84e809174a86fba5f /sources/scala/tools/nsc/transform/UnCurry.scala
parentd7499538cc0da7beb331a4550b7a6e85cd132876 (diff)
downloadscala-4ae459ef755dccc8230a884bf6f462c4dadc96b8.tar.gz
scala-4ae459ef755dccc8230a884bf6f462c4dadc96b8.tar.bz2
scala-4ae459ef755dccc8230a884bf6f462c4dadc96b8.zip
Repository : /home/cvslamp/repositories/scala
Module : scala Working dir: ~/scala/ In directory .: Unknown META-INF Unknown Test.symbl Unknown VERSION-1.1.0-b1 Unknown collection Unknown expr.exe.stackdump Unknown importing Unknown iq.symbl Unknown java.io.Writer Unknown make Unknown rm Unknown scalac.symtab.Symbol Unknown testcast Unknown x Unknown xmake Unknown y Unknown z In directory bin: Unknown bin/dtd2scala.lnk Unknown bin/scala-debug.lnk Unknown bin/scala-info.lnk Unknown bin/scala.lnkMa Unknown bin/scalac-debug.lnk Unknown bin/scalac.lnk Unknown bin/scaladoc-debug.lnk Unknown bin/scaladoc.lnk Unknown bin/scalaint-debug.lnk Unknown bin/scalaint.lnk Unknown bin/scalap.lnk Unknown bin/scalarun-debug.lnk Unknown bin/scalarun.lnk Unknown bin/scalatest.lnk In directory config: In directory config/list: Modified config/list/nsc.lst In directory doc: Unknown doc/announcement.txt In directory doc/papers: Message: cvs update: cannot open directory /home/cvslamp/repositories/scala/scala/doc/papers: No such file or directory Message: cvs update: skipping directory doc/papers In directory doc/reference: Unknown doc/reference/R1.tex Unknown doc/reference/ScalaReference.tex.1 Unknown doc/reference/ScalaReference.tex.new Unknown doc/reference/ScalaVersion.tex Unknown doc/reference/lecture.tex Unknown doc/reference/math.sty Unknown doc/reference/modefs.sty Unknown doc/reference/prooftree.sty Unknown doc/reference/sbe-talk.tex Unknown doc/reference/scaladefs.sty Unknown doc/reference/scaladefs.tex Unknown doc/reference/scaladoc.sty Unknown doc/reference/tweaklist.sty Unknown doc/reference/vquote.sty Unknown doc/reference/x In directory doc/reports: Message: cvs update: cannot open directory /home/cvslamp/repositories/scala/scala/doc/reports: No such file or directory Message: cvs update: skipping directory doc/reports In directory doc/talks: Message: cvs update: cannot open directory /home/cvslamp/repositories/scala/scala/doc/talks: No such file or directory Message: cvs update: skipping directory doc/talks In directory sources: Unknown sources/new Unknown sources/scala.zip Unknown sources/scalac.own Unknown sources/ziDeLBjS In directory sources/examples: Unknown sources/examples/BibTree.scala Unknown sources/examples/BibTree1.scala Unknown sources/examples/BinTree.scala Unknown sources/examples/concurrent Unknown sources/examples/epl Unknown sources/examples/epl.zip Unknown sources/examples/examples Unknown sources/examples/fs Unknown sources/examples/graphs.scala Unknown sources/examples/implicit Unknown sources/examples/interpreters.scala Unknown sources/examples/parsers2a.scala Unknown sources/examples/parsers3.scala Unknown sources/examples/pubsub.scala Unknown sources/examples/pubsub.scala.notyet Unknown sources/examples/pubsub1.scala Unknown sources/examples/shapes.scala Unknown sources/examples/stacks.scala Unknown sources/examples/teletrans.scala Unknown sources/examples/teletrans1.scala Unknown sources/examples/xpath.scala Unknown sources/examples/xpath1.scala In directory sources/examples/expressions: Unknown sources/examples/expressions/abstract-data-1.scala Unknown sources/examples/expressions/abstract-data-2.scala Unknown sources/examples/expressions/abstract-data-mixin-1.scala Unknown sources/examples/expressions/abstract-data-mixin-bad.scala Unknown sources/examples/expressions/abstract-data-mixin-neg.scala Unknown sources/examples/expressions/abstract-data-mixin.scala Unknown sources/examples/expressions/abstract-data.scala Unknown sources/examples/expressions/abstract-operation-1.scala Unknown sources/examples/expressions/abstract-operation-2.scala Unknown sources/examples/expressions/abstract-operation-mixin.scala Unknown sources/examples/expressions/abstract-operation.scala Unknown sources/examples/expressions/expressions-constr-abstypes.scala Unknown sources/examples/expressions/expressions-oo.scala Unknown sources/examples/expressions/expressions-visitors.scala Unknown sources/examples/expressions/expressions-visitos.scala Unknown sources/examples/expressions/generic-data.scala Unknown sources/examples/expressions/generic-operation-factory.scala Unknown sources/examples/expressions/generic-operation-simple.scala Unknown sources/examples/expressions/generic-operation.scala Unknown sources/examples/expressions/scala Unknown sources/examples/expressions/test Unknown sources/examples/expressions/x In directory sources/scala: Unknown sources/scala/$colon$colon.scala.disabled Unknown sources/scala/.latest-compiler Unknown sources/scala/Array.java.notyet Unknown sources/scala/ArrayIterator.java.notyet Modified sources/scala/CaseClass.scala Modified sources/scala/List.scala Unknown sources/scala/NoValue Unknown sources/scala/ScalaObject.scala Unknown sources/scala/bootclasses Unknown sources/scala/cls Unknown sources/scala/new Unknown sources/scala/newclasses Unknown sources/scala/nsc-build Unknown sources/scala/nsc-build.bat Unknown sources/scala/nscnew Unknown sources/scala/nscnew.bat Unknown sources/scala/nx Unknown sources/scala/old Unknown sources/scala/ox Unknown sources/scala/predef Unknown sources/scala/scala.Ordered![a!])scala.Ordered![scala.List![a!]] Unknown sources/scala/test.scala Unknown sources/scala/x In directory sources/scala/runtime: Unknown sources/scala/runtime/CaseOps.scala In directory sources/scala/tools: Unknown sources/scala/tools/nsc.zip Unknown sources/scala/tools/nsc1 Unknown sources/scala/tools/nscnew In directory sources/scala/tools/nsc: Modified sources/scala/tools/nsc/Global.scala Modified sources/scala/tools/nsc/Phase.scala Added sources/scala/tools/nsc/SubComponent.scala Unknown sources/scala/tools/nsc/typechecker.new In directory sources/scala/tools/nsc/ast: Modified sources/scala/tools/nsc/ast/TreeGen.scala Modified sources/scala/tools/nsc/ast/Trees.scala In directory sources/scala/tools/nsc/ast/parser: Modified sources/scala/tools/nsc/ast/parser/Parsers.scala Modified sources/scala/tools/nsc/ast/parser/Scanners.scala Added sources/scala/tools/nsc/ast/parser/SyntaxAnalyzer.scala Modified sources/scala/tools/nsc/ast/parser/Tokens.scala Modified sources/scala/tools/nsc/ast/parser/TreeBuilder.scala In directory sources/scala/tools/nsc/matching: Modified sources/scala/tools/nsc/matching/PatternUtil.scala In directory sources/scala/tools/nsc/symtab: Modified sources/scala/tools/nsc/symtab/Definitions.scala Modified sources/scala/tools/nsc/symtab/Flags.scala Modified sources/scala/tools/nsc/symtab/Names.scala Modified sources/scala/tools/nsc/symtab/Scopes.scala Modified sources/scala/tools/nsc/symtab/StdNames.scala Modified sources/scala/tools/nsc/symtab/SymbolTable.scala Modified sources/scala/tools/nsc/symtab/Symbols.scala Modified sources/scala/tools/nsc/symtab/Types.scala In directory sources/scala/tools/nsc/symtab/classfile: Modified sources/scala/tools/nsc/symtab/classfile/ClassfileConstants.scala Modified sources/scala/tools/nsc/symtab/classfile/PickleFormat.scala Modified sources/scala/tools/nsc/symtab/classfile/Pickler.scala In directory sources/scala/tools/nsc/transform: Modified sources/scala/tools/nsc/transform/SampleTransform.scala Modified sources/scala/tools/nsc/transform/Transform.scala Removed sources/scala/tools/nsc/transform/TypesAsValues.scala In directory sources/scala/tools/nsc/typechecker: Modified sources/scala/tools/nsc/typechecker/Analyzer.scala Modified sources/scala/tools/nsc/typechecker/Contexts.scala Modified sources/scala/tools/nsc/typechecker/Infer.scala Modified sources/scala/tools/nsc/typechecker/Namers.scala Added sources/scala/tools/nsc/typechecker/RefChecks.scala Modified sources/scala/tools/nsc/typechecker/TreeCheckers.scala Modified sources/scala/tools/nsc/typechecker/Typers.scala In directory sources/scala/xml: In directory sources/scala/xml/parsing: Modified sources/scala/xml/parsing/MarkupHandler.scala Modified sources/scala/xml/parsing/MarkupParser.scala In directory sources/scalac: In directory sources/scalac/symtab: In directory sources/scalac/symtab/classfile: Unknown sources/scalac/symtab/classfile/PackageParser.java.1 In directory test: Unknown test/absobs.scala Unknown test/attr.scala Unknown test/bug363.scala Unknown test/mixin.scala Unknown test/nsc Unknown test/nsc.scala Unknown test/nsc1.scala Unknown test/nsc2.scala Unknown test/sabin.scala Unknown test/sabin2.scala Unknown test/selftypes.scala Unknown test/single.scala Unknown test/testmatch.scala In directory test/files: Unknown test/files/bug320.scala In directory test/files/neg: Unknown test/files/neg/bug356.check Unknown test/files/neg/bug356.scala Unknown test/files/neg/bug363.check Unknown test/files/neg/bug363.scala Unknown test/files/neg/bug369.check Unknown test/files/neg/bug369.scala Unknown test/files/neg/bug370.check Unknown test/files/neg/bug370.scala Unknown test/files/neg/bug373.check Unknown test/files/neg/bug373.scala Unknown test/files/neg/bug375.check Unknown test/files/neg/bug375.scala Unknown test/files/neg/escapes.scala Unknown test/files/neg/test In directory test/files/pos: Unknown test/files/pos/A.symbl Unknown test/files/pos/B.symbl Unknown test/files/pos/C.symbl Unknown test/files/pos/D.symbl Unknown test/files/pos/O.symbl Unknown test/files/pos/S.symbl Unknown test/files/pos/T.symbl Unknown test/files/pos/arrays2.symbl Unknown test/files/pos/bug348plus.scala Unknown test/files/pos/lists.symbl Unknown test/files/pos/main.symbl Unknown test/files/pos/test.symbl In directory test/new: Message: cvs update: cannot open directory /home/cvslamp/repositories/scala/scala/test/new: No such file or directory Message: cvs update: skipping directory test/new In directory test/pos: Unknown test/pos/valparams.scala Unknown test/pos/vincent.scala In directory website: Message: cvs update: cannot open directory /home/cvslamp/repositories/scala/scala/website: No such file or directory Message: cvs update: skipping directory website --------------------- End --------------------- -- last cmd: cvs -f update -d -P --
Diffstat (limited to 'sources/scala/tools/nsc/transform/UnCurry.scala')
-rwxr-xr-xsources/scala/tools/nsc/transform/UnCurry.scala131
1 files changed, 131 insertions, 0 deletions
diff --git a/sources/scala/tools/nsc/transform/UnCurry.scala b/sources/scala/tools/nsc/transform/UnCurry.scala
new file mode 100755
index 0000000000..f1bc9027f4
--- /dev/null
+++ b/sources/scala/tools/nsc/transform/UnCurry.scala
@@ -0,0 +1,131 @@
+/* NSC -- new scala compiler
+ * Copyright 2005 LAMP/EPFL
+ * @author
+ */
+// $Id$
+package scala.tools.nsc.transform;
+
+/*<export>*/
+/** - uncurry all symbol and tree types (@see UnCurryPhase)
+ * - for every curried parameter list: (ps_1) ... (ps_n) ==> (ps_1, ..., ps_n)
+ * - for every curried application: f(args_1)...(args_n) ==> f(args_1, ..., args_n)
+ * - for every type application: f[Ts] ==> f[Ts]() unless followed by parameters
+ * - for every use of a parameterless function: f ==> f() and q.f ==> q.f()
+ * - for every def-parameter: x: => T ==> x: () => T
+ * - for every use of a def-parameter: x ==> x.apply()
+ * - for every argument to a def parameter `x: => T':
+ * if argument is not a reference to a def parameter:
+ * convert argument `e' to (expansion of) `() => e'
+ * - for every repated parameter `x: T*' --> x: Seq[a].
+ * - for every argument list that corresponds to a repeated parameter
+ * (a_1, ..., a_n) => (Seq(a_1, ..., a_n))
+ * - for every argument list that is an escaped sequence
+ * (a_1:_*) => (a_1)
+ * - convert implicit method types to method types
+ * - todo: check-no-double-def in erasure
+ */
+/*</export>*/
+abstract class UnCurry extends InfoTransform {
+ import global._; // the global environment
+ import definitions._; // standard classes and methods
+ import typer.{typed}; // methods to type trees
+ import posAssigner.atPos; // for filling in tree positions
+
+ protected val phaseName: String = "uncurry";
+ protected def newTransformer(unit: CompilationUnit): Transformer = new UnCurryTransformer(unit);
+
+ private val uncurry = new TypeMap {
+ def apply(tp: Type): Type = tp match {
+ case MethodType(formals, MethodType(formals1, restpe)) =>
+ apply(MethodType(formals ::: formals1, restpe))
+ case mt: ImplicitMethodType =>
+ apply(MethodType(mt.paramTypes, mt.resultType))
+ case PolyType(List(), restpe) =>
+ apply(MethodType(List(), restpe))
+ case PolyType(tparams, restpe) =>
+ PolyType(tparams, apply(MethodType(List(), restpe)))
+ case TypeRef(pre, sym, List(arg)) if (sym == ByNameParamClass) =>
+ apply(functionType(List(), arg))
+ case TypeRef(pre, sym, args) if (sym == RepeatedParamClass) =>
+ apply(TypeRef(pre, SeqClass, args));
+ case _ =>
+ mapOver(tp)
+ }
+ }
+
+ /** - return symbol's transformed type,
+ * - if symbol is a def parameter with transformed type T, return () => T
+ */
+ def transformInfo(sym: Symbol, tp: Type): Type = uncurry(tp);
+
+ class UnCurryTransformer(unit: CompilationUnit) extends Transformer {
+
+ private var inPattern = false;
+
+ override def transform(tree: Tree): Tree = {
+ def transformArgs(args: List[Tree], formals: List[Type]) = {
+ if (formals.isEmpty) {
+ assert(args.isEmpty); List()
+ } else {
+ def mkSequence(args: List[Tree], pt: Type): Tree = typed { atPos(tree.pos) {
+ if (inPattern) Sequence(args) setType pt
+ else Apply(gen.mkRef(SeqFactory), args)
+ }}
+ val args1 =
+ formals.last match {
+ case TypeRef(pre, sym, List(pt)) if (sym == RepeatedParamClass) =>
+ if (args.isEmpty) List(mkSequence(args, pt))
+ else {
+ val suffix = args.last match {
+ case Typed(arg, Ident(name)) if name == nme.WILDCARD_STAR.toTypeName =>
+ arg setType seqType(arg.tpe)
+ case _ =>
+ mkSequence(args.drop(formals.length - 1), pt)
+ }
+ args.take(formals.length - 1) ::: List(suffix)
+ }
+ case _ => args
+ }
+ List.map2(formals, args1) ((formal, arg) =>
+ if (formal.symbol == ByNameParamClass)
+ arg.tpe match {
+ case TypeRef(pre, sym, List(targ)) if (sym == ByNameParamClass) =>
+ arg setType functionType(List(), targ)
+ case _ =>
+ typed(Function(List(), arg) setPos arg.pos)
+ }
+ else arg)
+ }
+ }
+ val prevtpe = tree.tpe;
+ var result = tree match {
+ case Apply(fn, args) =>
+ copy.Apply(tree, super.transform(fn),
+ super.transformTrees(transformArgs(args, fn.tpe.paramTypes)))
+ case CaseDef(pat, guard, body) =>
+ inPattern = true;
+ val pat1 = super.transform(pat);
+ inPattern = false;
+ copy.CaseDef(tree, pat1, super.transform(guard), super.transform(body))
+ case _ =>
+ super.transform(tree)
+ } setType uncurry(tree.tpe);
+ result match {
+ case Apply(Apply(fn, args), args1) =>
+ result = copy.Apply(result, fn, args ::: args1)
+ case Ident(name) =>
+ if (name == nme.WILDCARD_STAR.toTypeName)
+ unit.error(tree.pos, " argument does not correspond to `*'-parameter");
+ else if (prevtpe.symbol == ByNameParamClass)
+ result = typed(atPos(result.pos)(Select(result, nme.apply)))
+ case _ =>
+ }
+ result.tpe match {
+ case MethodType(List(), restpe) =>
+ if (!prevtpe.isInstanceOf[MethodType])
+ result = typed(atPos(result.pos)(Apply(result, List())))
+ }
+ result
+ }
+ }
+}