aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2013-12-18 11:29:13 +0100
committerMartin Odersky <odersky@gmail.com>2013-12-18 11:29:13 +0100
commit15d8a2e9804fe55c9261e195088da55c0eaa6803 (patch)
treec9cfbfe068b7f301c43e9987959f29843cf715dc
parent6b106397a683b9de4bf05da7e768ebf747085c55 (diff)
downloaddotty-15d8a2e9804fe55c9261e195088da55c0eaa6803.tar.gz
dotty-15d8a2e9804fe55c9261e195088da55c0eaa6803.tar.bz2
dotty-15d8a2e9804fe55c9261e195088da55c0eaa6803.zip
Making sure New's always end in an application.
-rw-r--r--src/dotty/tools/dotc/ast/Desugar.scala4
-rw-r--r--src/dotty/tools/dotc/ast/untpd.scala7
-rw-r--r--src/dotty/tools/dotc/parsing/Parsers.scala4
-rw-r--r--tests/pos/overloaded.scala12
4 files changed, 22 insertions, 5 deletions
diff --git a/src/dotty/tools/dotc/ast/Desugar.scala b/src/dotty/tools/dotc/ast/Desugar.scala
index 2e1aa48bf..70c3e76f6 100644
--- a/src/dotty/tools/dotc/ast/Desugar.scala
+++ b/src/dotty/tools/dotc/ast/Desugar.scala
@@ -417,7 +417,7 @@ object desugar {
* tree @cls
*/
def makeAnnotated(cls: Symbol, tree: Tree)(implicit ctx: Context) =
- Annotated(TypedSplice(tpd.New(cls.typeRef)), tree)
+ Annotated(TypedSplice(tpd.New(cls.typeRef, Nil)), tree)
private def derivedValDef(mods: Modifiers, named: NameTree, tpt: Tree, rhs: Tree) =
ValDef(mods, named.name.asTermName, tpt, rhs).withPos(named.pos)
@@ -700,7 +700,7 @@ object desugar {
* The result is used for validity checking, is thrown away afterwards.
*/
def refinedTypeToClass(tree: RefinedTypeTree)(implicit ctx: Context): TypeDef = {
- val parent = Select(New(tree.tpt), nme.CONSTRUCTOR)
+ val parent = New(tree.tpt, Nil)
val impl = Template(emptyConstructor, parent :: Nil, EmptyValDef, tree.refinements)
TypeDef(Modifiers(), tpnme.REFINE_CLASS, impl)
}
diff --git a/src/dotty/tools/dotc/ast/untpd.scala b/src/dotty/tools/dotc/ast/untpd.scala
index 351548d91..740e8f110 100644
--- a/src/dotty/tools/dotc/ast/untpd.scala
+++ b/src/dotty/tools/dotc/ast/untpd.scala
@@ -107,7 +107,7 @@ object untpd extends Trees.Instance[Untyped] with TreeInfo[Untyped] {
}
var prefix: Tree = Select(New(tycon), nme.CONSTRUCTOR)
if (targs.nonEmpty) prefix = TypeApply(prefix, targs)
- (prefix /: argss)(Apply(_, _))
+ ensureApplied((prefix /: argss)(Apply(_, _)))
}
def Block(stat: Tree, expr: Tree): Block =
@@ -116,6 +116,11 @@ object untpd extends Trees.Instance[Untyped] with TreeInfo[Untyped] {
def Apply(fn: Tree, arg: Tree): Apply =
Apply(fn, arg :: Nil)
+ def ensureApplied(tpt: Tree) = tpt match {
+ case _: Apply => tpt
+ case _ => Apply(tpt, Nil)
+ }
+
def AppliedTypeTree(tpt: Tree, arg: Tree): AppliedTypeTree =
AppliedTypeTree(tpt, arg :: Nil)
diff --git a/src/dotty/tools/dotc/parsing/Parsers.scala b/src/dotty/tools/dotc/parsing/Parsers.scala
index ccb7d26bf..ae066e9a9 100644
--- a/src/dotty/tools/dotc/parsing/Parsers.scala
+++ b/src/dotty/tools/dotc/parsing/Parsers.scala
@@ -1423,7 +1423,7 @@ object Parsers {
/** Annotation ::= `@' SimpleType {ArgumentExprs}
*/
def annot() =
- adjustStart(accept(AT)) { argumentExprss(wrapNew(simpleType())) }
+ adjustStart(accept(AT)) { ensureApplied(argumentExprss(wrapNew(simpleType()))) }
def annotations(skipNewLines: Boolean = false): List[Tree] = {
if (skipNewLines) newLineOptWhenFollowedBy(AT)
@@ -1824,7 +1824,7 @@ object Parsers {
/** ConstrApp ::= SimpleType {ParArgumentExprs}
*/
val constrApp = () =>
- parArgumentExprss(wrapNew(simpleType()))
+ ensureApplied(parArgumentExprss(wrapNew(simpleType())))
/** Template ::= ConstrApps [TemplateBody] | TemplateBody
* ConstrApps ::= ConstrApp {`with' ConstrApp}
diff --git a/tests/pos/overloaded.scala b/tests/pos/overloaded.scala
index d76585f93..ba5d8c205 100644
--- a/tests/pos/overloaded.scala
+++ b/tests/pos/overloaded.scala
@@ -6,5 +6,17 @@ object overloaded {
val x1 = f("abc")
val x2 = f(new Integer(1))
val x3 = f(null)
+
+ val x4: String => String = f
+ val x5: String => Any = f
+ val x6: Any = f _
+
+ def g(): Int = 1
+ def g(x: Int): Int = 2
+
+ val y1: Int => Int = g
+ val y2: Any = g _
+
+ println(g)
}