diff options
author | Martin Odersky <odersky@gmail.com> | 2005-06-09 18:45:48 +0000 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2005-06-09 18:45:48 +0000 |
commit | 4ae459ef755dccc8230a884bf6f462c4dadc96b8 (patch) | |
tree | 3d27d19a37680d452c4b52b84e809174a86fba5f /sources/scala/tools/nsc/transform/UnCurry.scala | |
parent | d7499538cc0da7beb331a4550b7a6e85cd132876 (diff) | |
download | scala-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-x | sources/scala/tools/nsc/transform/UnCurry.scala | 131 |
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 + } + } +} |