diff options
author | Martin Odersky <odersky@gmail.com> | 2014-03-26 18:51:16 +0100 |
---|---|---|
committer | Dmitry Petrashko <dmitry.petrashko@gmail.com> | 2014-03-29 09:16:09 +0100 |
commit | 0871953f2278d0f4f9797fd8e9dac25857c499fd (patch) | |
tree | 36004931eb0e84186e882e968e694191a5a4ba4b /src/dotty/tools | |
parent | 5c36442c4781fac97edfd196c9aa15dd35084a65 (diff) | |
download | dotty-0871953f2278d0f4f9797fd8e9dac25857c499fd.tar.gz dotty-0871953f2278d0f4f9797fd8e9dac25857c499fd.tar.bz2 dotty-0871953f2278d0f4f9797fd8e9dac25857c499fd.zip |
More flexible () applications.
New method ensureApplied which will add a () parameter list if
a tree's widened type takes parameters.
Used in numericConversion, so that we are independent whether we
run before () insertion or after. With that change TypeTestCasts can stay enabled for
the whole build.
Conflicts:
src/dotty/tools/dotc/ast/tpd.scala
Diffstat (limited to 'src/dotty/tools')
-rw-r--r-- | src/dotty/tools/dotc/Compiler.scala | 9 | ||||
-rw-r--r-- | src/dotty/tools/dotc/ast/tpd.scala | 41 |
2 files changed, 44 insertions, 6 deletions
diff --git a/src/dotty/tools/dotc/Compiler.scala b/src/dotty/tools/dotc/Compiler.scala index 26c01b039..8ed8b6dce 100644 --- a/src/dotty/tools/dotc/Compiler.scala +++ b/src/dotty/tools/dotc/Compiler.scala @@ -9,20 +9,21 @@ import Scopes._ import typer.{FrontEnd, Typer, Mode, ImportInfo} import reporting.ConsoleReporter import dotty.tools.dotc.core.Phases.Phase -import dotty.tools.dotc.transform.{UncurryTreeTransform, LazyValsCreateCompanionObjects, LazyValTranformContext} +import dotty.tools.dotc.transform._ import dotty.tools.dotc.transform.TreeTransforms.{TreeTransform, TreeTransformer} import dotty.tools.dotc.transform.PostTyperTransformers.PostTyperTransformer import dotty.tools.dotc.core.DenotTransformers.DenotTransformer import dotty.tools.dotc.core.Denotations.SingleDenotation -import dotty.tools.dotc.transform.TreeTransforms.Separator class Compiler { def phases: List[List[Phase]] = List( List(new FrontEnd), List(new LazyValsCreateCompanionObjects), //force separataion between lazyVals and LVCreateCO - List(new LazyValTranformContext().transformer, new UncurryTreeTransform) - ) + List(new LazyValTranformContext().transformer, new TypeTestsCasts), + // List(new Erasure), + List(new UncurryTreeTransform) + ) var runId = 1 def nextRunId = { diff --git a/src/dotty/tools/dotc/ast/tpd.scala b/src/dotty/tools/dotc/ast/tpd.scala index 9d4ec21de..173f81894 100644 --- a/src/dotty/tools/dotc/ast/tpd.scala +++ b/src/dotty/tools/dotc/ast/tpd.scala @@ -5,7 +5,7 @@ package ast import core._ import util.Positions._, Types._, Contexts._, Constants._, Names._, Flags._ import SymDenotations._, Symbols._, StdNames._, Annotations._, Trees._ -import CheckTrees._, Denotations._ +import CheckTrees._, Denotations._, Decorators._ import config.Printers._ /** Some creators for typed trees */ @@ -27,6 +27,9 @@ object tpd extends Trees.Instance[Type] with TypedTreeInfo { def Select(qualifier: Tree, tp: NamedType)(implicit ctx: Context): Select = untpd.Select(qualifier, tp.name).withType(tp) + def Select(qualifier: Tree, sym: Symbol)(implicit ctx: Context): Select = + untpd.Select(qualifier, sym.name).withType(qualifier.tpe select sym) + def SelectWithSig(qualifier: Tree, name: Name, sig: Signature)(implicit ctx: Context) = untpd.SelectWithSig(qualifier, name, sig) .withType(TermRef.withSig(qualifier.tpe, name.asTermName, sig)) @@ -46,6 +49,9 @@ object tpd extends Trees.Instance[Type] with TypedTreeInfo { def Apply(fn: Tree, args: List[Tree])(implicit ctx: Context): Apply = ta.assignType(untpd.Apply(fn, args), fn, args) + def ensureApplied(fn: Tree)(implicit ctx: Context): Tree = + if (fn.tpe.widen.isParameterless) fn else Apply(fn, Nil) + def TypeApply(fn: Tree, args: List[Tree])(implicit ctx: Context): TypeApply = ta.assignType(untpd.TypeApply(fn, args), fn, args) @@ -165,6 +171,9 @@ object tpd extends Trees.Instance[Type] with TypedTreeInfo { def ValDef(sym: TermSymbol, rhs: Tree = EmptyTree)(implicit ctx: Context): ValDef = ta.assignType(untpd.ValDef(Modifiers(sym), sym.name, TypeTree(sym.info), rhs), sym) + def SyntheticValDef(name: TermName, rhs: Tree)(implicit ctx: Context): ValDef = + ValDef(ctx.newSymbol(ctx.owner, name, Synthetic, rhs.tpe, coord = rhs.pos), rhs) + def DefDef(sym: TermSymbol, rhs: Tree = EmptyTree)(implicit ctx: Context): DefDef = ta.assignType(DefDef(sym, Function.const(rhs) _), sym) @@ -234,9 +243,16 @@ object tpd extends Trees.Instance[Type] with TypedTreeInfo { case pre => SelectFromTypeTree(TypeTree(pre), tp) } // no checks necessary - def ref(sym: Symbol)(implicit ctx: Context): tpd.NameTree = + def ref(sym: Symbol)(implicit ctx: Context): NameTree = ref(NamedType(sym.owner.thisType, sym.name, sym.denot)) + def singleton(tp: Type)(implicit ctx: Context): Tree = tp match { + case tp: TermRef => ref(tp) + case ThisType(cls) => This(cls) + case SuperType(qual, _) => singleton(qual) + case ConstantType(value) => Literal(value) + } + // ------ Creating typed equivalents of trees that exist only in untyped form ------- /** new C(args) */ @@ -383,6 +399,27 @@ object tpd extends Trees.Instance[Type] with TypedTreeInfo { ownerMap andThen (from zip to).toMap) } + // convert a numeric with a toXXX method + def numericConversion(tree: Tree, numericCls: Symbol)(implicit ctx: Context): Tree = { + val mname = ("to" + numericCls.name).toTermName + val conversion = tree.tpe member mname + assert(conversion.symbol.exists, s"$tree => $numericCls") + ensureApplied(Select(tree, conversion.symbol.termRef)) + } + + def evalOnce(tree: Tree)(within: Tree => Tree)(implicit ctx: Context) = { + if (isIdempotentExpr(tree)) within(tree) + else { + val vdef = SyntheticValDef(ctx.freshName("ev$").toTermName, tree) + Block(vdef :: Nil, within(Ident(vdef.namedType))) + } + } + + def runtimeCall(name: TermName, args: List[Tree])(implicit ctx: Context): Tree = ??? + + def mkAnd(tree1: Tree, tree2: Tree)(implicit ctx: Context) = + Apply(Select(tree1, defn.Boolean_and), tree2 :: Nil) + // ensure that constructors are fully applied? // ensure that normal methods are fully applied? |