From 0894d3be180aa28f43eed557d29e7b997a78fcfc Mon Sep 17 00:00:00 2001 From: Paul Phillips Date: Sat, 18 Feb 2012 16:56:10 -0800 Subject: Cleanup in aisle New. More trees created more uniformly. --- src/compiler/scala/reflect/internal/Trees.scala | 9 +++++---- src/compiler/scala/tools/nsc/ast/Reifiers.scala | 2 +- src/compiler/scala/tools/nsc/ast/TreeDSL.scala | 6 +++--- src/compiler/scala/tools/nsc/ast/TreeGen.scala | 11 ++++++----- .../scala/tools/nsc/ast/parser/TreeBuilder.scala | 12 ++++-------- .../scala/tools/nsc/backend/icode/GenICode.scala | 5 +++-- src/compiler/scala/tools/nsc/javac/JavaParsers.scala | 3 +-- .../scala/tools/nsc/transform/Constructors.scala | 11 +++-------- src/compiler/scala/tools/nsc/transform/LambdaLift.scala | 2 +- .../scala/tools/nsc/transform/SpecializeTypes.scala | 16 ++++++---------- src/compiler/scala/tools/nsc/transform/UnCurry.scala | 6 ++---- 11 files changed, 35 insertions(+), 48 deletions(-) (limited to 'src/compiler') diff --git a/src/compiler/scala/reflect/internal/Trees.scala b/src/compiler/scala/reflect/internal/Trees.scala index 958d04732b..b6b7e3cbda 100644 --- a/src/compiler/scala/reflect/internal/Trees.scala +++ b/src/compiler/scala/reflect/internal/Trees.scala @@ -224,18 +224,19 @@ trait Trees extends api.Trees { self: SymbolTable => LabelDef(sym.name.toTermName, params map Ident, rhs) setSymbol sym } - /** casedef shorthand */ def CaseDef(pat: Tree, body: Tree): CaseDef = CaseDef(pat, EmptyTree, body) def Bind(sym: Symbol, body: Tree): Bind = Bind(sym.name, body) setSymbol sym - /** 0-1 argument list new, based on a symbol. + /** 0-1 argument list new, based on a symbol or type. */ def New(sym: Symbol, args: Tree*): Tree = - if (args.isEmpty) New(TypeTree(sym.tpe)) - else New(TypeTree(sym.tpe), List(args.toList)) + New(sym.tpe, args: _*) + + def New(tpe: Type, args: Tree*): Tree = + New(TypeTree(tpe), List(args.toList)) def Apply(sym: Symbol, args: Tree*): Tree = Apply(Ident(sym), args.toList) diff --git a/src/compiler/scala/tools/nsc/ast/Reifiers.scala b/src/compiler/scala/tools/nsc/ast/Reifiers.scala index 21e075950f..7ece8bbd31 100644 --- a/src/compiler/scala/tools/nsc/ast/Reifiers.scala +++ b/src/compiler/scala/tools/nsc/ast/Reifiers.scala @@ -580,7 +580,7 @@ trait Reifiers { self: Global => ann.assocs map { case (nme, arg) => AssignOrNamedArg(Ident(nme), toScalaAnnotation(arg)) } } - New(TypeTree(ann.atp), List(args)) + New(ann.atp, args: _*) } } diff --git a/src/compiler/scala/tools/nsc/ast/TreeDSL.scala b/src/compiler/scala/tools/nsc/ast/TreeDSL.scala index 2cfd21ecc8..f361d45018 100644 --- a/src/compiler/scala/tools/nsc/ast/TreeDSL.scala +++ b/src/compiler/scala/tools/nsc/ast/TreeDSL.scala @@ -253,10 +253,10 @@ trait TreeDSL { } /** Top level accessible. */ - def MATCHERROR(arg: Tree) = Throw(New(TypeTree(MatchErrorClass.tpe), List(List(arg)))) + def MATCHERROR(arg: Tree) = Throw(New(MatchErrorClass, arg)) /** !!! should generalize null guard from match error here. */ - def THROW(sym: Symbol): Throw = Throw(New(TypeTree(sym.tpe), List(Nil))) - def THROW(sym: Symbol, msg: Tree): Throw = Throw(New(TypeTree(sym.tpe), List(List(msg.TOSTRING())))) + def THROW(sym: Symbol): Throw = Throw(New(sym)) + def THROW(sym: Symbol, msg: Tree): Throw = Throw(New(sym, msg.TOSTRING())) def NEW(tpt: Tree, args: Tree*): Tree = New(tpt, List(args.toList)) def NEW(sym: Symbol, args: Tree*): Tree = New(sym, args: _*) diff --git a/src/compiler/scala/tools/nsc/ast/TreeGen.scala b/src/compiler/scala/tools/nsc/ast/TreeGen.scala index 3467292f28..c7414bf34b 100644 --- a/src/compiler/scala/tools/nsc/ast/TreeGen.scala +++ b/src/compiler/scala/tools/nsc/ast/TreeGen.scala @@ -57,7 +57,7 @@ abstract class TreeGen extends reflect.internal.TreeGen with TreeDSL { // annotate the expression with @unchecked def mkUnchecked(expr: Tree): Tree = atPos(expr.pos) { // This can't be "Annotated(New(UncheckedClass), expr)" because annotations - // are very pick about things and it crashes the compiler with "unexpected new". + // are very picky about things and it crashes the compiler with "unexpected new". Annotated(New(scalaDot(UncheckedClass.name), List(Nil)), expr) } // if it's a Match, mark the selector unchecked; otherwise nothing. @@ -181,10 +181,11 @@ abstract class TreeGen extends reflect.internal.TreeGen with TreeDSL { def mkModuleAccessDef(accessor: Symbol, msym: Symbol) = DefDef(accessor, Select(This(msym.owner), msym)) - def newModule(accessor: Symbol, tpe: Type) = - New(TypeTree(tpe), - List(for (pt <- tpe.typeSymbol.primaryConstructor.info.paramTypes) - yield This(accessor.owner.enclClass))) + def newModule(accessor: Symbol, tpe: Type) = { + val ps = tpe.typeSymbol.primaryConstructor.info.paramTypes + if (ps.isEmpty) New(tpe) + else New(tpe, This(accessor.owner.enclClass)) + } // def m: T; def mkModuleAccessDcl(accessor: Symbol) = diff --git a/src/compiler/scala/tools/nsc/ast/parser/TreeBuilder.scala b/src/compiler/scala/tools/nsc/ast/parser/TreeBuilder.scala index 13f608ed4e..ad93b4753f 100644 --- a/src/compiler/scala/tools/nsc/ast/parser/TreeBuilder.scala +++ b/src/compiler/scala/tools/nsc/ast/parser/TreeBuilder.scala @@ -470,15 +470,11 @@ abstract class TreeBuilder { def makeVisitor(cases: List[CaseDef], checkExhaustive: Boolean): Tree = makeVisitor(cases, checkExhaustive, "x$") - private def makeUnchecked(expr: Tree): Tree = atPos(expr.pos) { - Annotated(New(scalaDot(definitions.UncheckedClass.name), List(Nil)), expr) - } - /** Create visitor x match cases> */ def makeVisitor(cases: List[CaseDef], checkExhaustive: Boolean, prefix: String): Tree = { - val x = freshTermName(prefix) - val id = Ident(x) - val sel = if (checkExhaustive) id else makeUnchecked(id) + val x = freshTermName(prefix) + val id = Ident(x) + val sel = if (checkExhaustive) id else gen.mkUnchecked(id) Function(List(makeSyntheticParam(x)), Match(sel, cases)) } @@ -563,7 +559,7 @@ abstract class TreeBuilder { val vars = getVariables(pat1) val matchExpr = atPos((pat1.pos union rhs.pos).makeTransparent) { Match( - makeUnchecked(rhs), + gen.mkUnchecked(rhs), List( atPos(pat1.pos) { CaseDef(pat1, EmptyTree, makeTupleTerm(vars map (_._1) map Ident, true)) diff --git a/src/compiler/scala/tools/nsc/backend/icode/GenICode.scala b/src/compiler/scala/tools/nsc/backend/icode/GenICode.scala index f2c725a5c2..9e801e3ea8 100644 --- a/src/compiler/scala/tools/nsc/backend/icode/GenICode.scala +++ b/src/compiler/scala/tools/nsc/backend/icode/GenICode.scala @@ -94,7 +94,7 @@ abstract class GenICode extends SubComponent { // !! modules should be eliminated by refcheck... or not? case ModuleDef(mods, name, impl) => - abort("Modules should not reach backend!") + abort("Modules should not reach backend! " + tree) case ValDef(mods, name, tpt, rhs) => ctx // we use the symbol to add fields @@ -704,7 +704,8 @@ abstract class GenICode extends SubComponent { ctx1 case New(tpt) => - abort("Unexpected New") + abort("Unexpected New(" + tpt.summaryString + "/" + tpt + ") received in icode.\n" + + " Call was genLoad" + ((tree, ctx, expectedType))) case Apply(TypeApply(fun, targs), _) => val sym = fun.symbol diff --git a/src/compiler/scala/tools/nsc/javac/JavaParsers.scala b/src/compiler/scala/tools/nsc/javac/JavaParsers.scala index 0c94e40d68..3490c1f5a8 100644 --- a/src/compiler/scala/tools/nsc/javac/JavaParsers.scala +++ b/src/compiler/scala/tools/nsc/javac/JavaParsers.scala @@ -393,8 +393,7 @@ trait JavaParsers extends ast.parser.ParsersCommon with JavaScanners { // assumed true unless we see public/private/protected var isPackageAccess = true var annots: List[Tree] = Nil - def addAnnot(sym: Symbol) = - annots :+= New(TypeTree(sym.tpe), List(Nil)) + def addAnnot(sym: Symbol) = annots :+= New(sym) while (true) { in.token match { diff --git a/src/compiler/scala/tools/nsc/transform/Constructors.scala b/src/compiler/scala/tools/nsc/transform/Constructors.scala index d1c71faf1e..820a8d7773 100644 --- a/src/compiler/scala/tools/nsc/transform/Constructors.scala +++ b/src/compiler/scala/tools/nsc/transform/Constructors.scala @@ -516,14 +516,9 @@ abstract class Constructors extends Transform with ast.TreeDSL { } } - def delayedInitCall(closure: Tree) = - localTyper.typed { - atPos(impl.pos) { - Apply( - Select(This(clazz), delayedInitMethod), - List(New(TypeTree(closure.symbol.tpe), List(List(This(clazz)))))) - } - } + def delayedInitCall(closure: Tree) = localTyper.typedPos(impl.pos) { + gen.mkMethodCall(This(clazz), delayedInitMethod, Nil, List(New(closure.symbol, This(clazz)))) + } /** Return a pair consisting of (all statements up to and including superclass and trait constr calls, rest) */ def splitAtSuper(stats: List[Tree]) = { diff --git a/src/compiler/scala/tools/nsc/transform/LambdaLift.scala b/src/compiler/scala/tools/nsc/transform/LambdaLift.scala index 4fc7b9f92f..5c015944c8 100644 --- a/src/compiler/scala/tools/nsc/transform/LambdaLift.scala +++ b/src/compiler/scala/tools/nsc/transform/LambdaLift.scala @@ -420,7 +420,7 @@ abstract class LambdaLift extends InfoTransform { case Try(block, catches, finalizer) => Try(refConstr(block), catches map refConstrCase, finalizer) case _ => - Apply(Select(New(TypeTree(sym.tpe)), nme.CONSTRUCTOR), List(expr)) + New(sym, expr) } def refConstrCase(cdef: CaseDef): CaseDef = CaseDef(cdef.pat, cdef.guard, refConstr(cdef.body)) diff --git a/src/compiler/scala/tools/nsc/transform/SpecializeTypes.scala b/src/compiler/scala/tools/nsc/transform/SpecializeTypes.scala index 8b1d5b3295..b0eb6c4e0c 100644 --- a/src/compiler/scala/tools/nsc/transform/SpecializeTypes.scala +++ b/src/compiler/scala/tools/nsc/transform/SpecializeTypes.scala @@ -1302,17 +1302,13 @@ abstract class SpecializeTypes extends InfoTransform with TypingTransformers { curTree = tree tree match { case Apply(Select(New(tpt), nme.CONSTRUCTOR), args) => - // log("Attempting to specialize new %s(%s)".format(tpt, args.mkString(", "))) - if (findSpec(tpt.tpe).typeSymbol ne tpt.tpe.typeSymbol) { + log("Attempting to specialize new %s(%s)".format(tpt, args.mkString(", "))) + val found = findSpec(tpt.tpe) + if (found.typeSymbol ne tpt.tpe.typeSymbol) { // the ctor can be specialized - log("** instantiated specialized type: " + findSpec(tpt.tpe)) - try { - atPos(tree.pos)( - localTyper.typed( - Apply( - Select(New(TypeTree(findSpec(tpt.tpe))), nme.CONSTRUCTOR), - transformTrees(args)))) - } catch { + log("** instantiated specialized type: " + found) + try localTyper.typedPos(tree.pos)(New(found, transformTrees(args): _*)) + catch { case te: TypeError => reporter.error(tree.pos, te.msg) super.transform(tree) diff --git a/src/compiler/scala/tools/nsc/transform/UnCurry.scala b/src/compiler/scala/tools/nsc/transform/UnCurry.scala index 841cd4a204..c4b70c672c 100644 --- a/src/compiler/scala/tools/nsc/transform/UnCurry.scala +++ b/src/compiler/scala/tools/nsc/transform/UnCurry.scala @@ -189,7 +189,7 @@ abstract class UnCurry extends InfoTransform List(TypeTree(meth.tpe.finalResultType))), List()), Throw(Ident(ex))) - val keyDef = ValDef(key, New(TypeTree(ObjectClass.tpe), List(List()))) + val keyDef = ValDef(key, New(ObjectClass)) val tryCatch = Try(body, List(CaseDef(pat, EmptyTree, rhs)), EmptyTree) Block(List(keyDef), tryCatch) } @@ -357,9 +357,7 @@ abstract class UnCurry extends InfoTransform localTyper.typedPos(fun.pos) { Block( List(ClassDef(anonClass, NoMods, List(List()), List(List()), members, fun.pos)), - Typed( - New(TypeTree(anonClass.tpe), List(List())), - TypeTree(fun.tpe))) + Typed(New(anonClass), TypeTree(fun.tpe))) } } } -- cgit v1.2.3