aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/dotty/tools/dotc/ast/TypedTrees.scala3
-rw-r--r--src/dotty/tools/dotc/typer/Typer.scala19
2 files changed, 22 insertions, 0 deletions
diff --git a/src/dotty/tools/dotc/ast/TypedTrees.scala b/src/dotty/tools/dotc/ast/TypedTrees.scala
index cce2f6ab6..4f0f80255 100644
--- a/src/dotty/tools/dotc/ast/TypedTrees.scala
+++ b/src/dotty/tools/dotc/ast/TypedTrees.scala
@@ -68,6 +68,9 @@ object tpd extends Trees.Instance[Type] with TypedTreeInfo {
def Literal(const: Constant)(implicit ctx: Context): Literal =
untpd.Literal(const).withType(const.tpe).checked
+ def unitLiteral(implicit ctx: Context): Literal =
+ Literal(Constant(()))
+
def New(tpt: Tree)(implicit ctx: Context): New =
untpd.New(tpt).withType(tpt.tpe).checked
diff --git a/src/dotty/tools/dotc/typer/Typer.scala b/src/dotty/tools/dotc/typer/Typer.scala
index 32bb4f4d1..554884382 100644
--- a/src/dotty/tools/dotc/typer/Typer.scala
+++ b/src/dotty/tools/dotc/typer/Typer.scala
@@ -482,6 +482,25 @@ class Typer extends Namer with Applications with Implicits {
cpy.Match(tree, sel1, cases1).withType(ctx.lub(cases1.tpes))
}
+ def typedReturn(tree: untpd.Return)(implicit ctx: Context): Return = {
+ def enclMethInfo(cx: Context): (Tree, Type) =
+ if (cx == NoContext || cx.tree.isInstanceOf[Trees.TypeDef[_]]) {
+ ctx.error(s"return outside method definition")
+ (EmptyTree, WildcardType)
+ }
+ else cx.tree match {
+ case ddef: DefDef =>
+ val meth = ddef.symbol
+ (Ident(TermRef.withSym(NoPrefix, meth.asTerm)),
+ if (meth.isConstructor) defn.UnitType else ddef.tpt.tpe)
+ case _ =>
+ enclMethInfo(cx.outer)
+ }
+ val (from, proto) = enclMethInfo(ctx)
+ val expr1 = typedExpr(if (tree.expr.isEmpty) untpd.unitLiteral else tree.expr, proto)
+ cpy.Return(tree, expr1, from) withType defn.NothingType
+ }
+
def typedModifiers(mods: untpd.Modifiers)(implicit ctx: Context): Modifiers = {
val annotations1 = mods.annotations mapconserve typedAnnotation
if (annotations1 eq mods.annotations) mods.asInstanceOf[Modifiers]