diff options
author | Martin Odersky <odersky@gmail.com> | 2013-12-09 12:45:21 +0100 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2013-12-09 12:45:21 +0100 |
commit | dc028e709fc36791526ff69d47280c91d1dc36d1 (patch) | |
tree | 768bd52ea85b9b40e5ac7d0c314abee79529f003 | |
parent | 190f44d0c9b91df24a227878b0c9a1f3d14c20a1 (diff) | |
download | dotty-dc028e709fc36791526ff69d47280c91d1dc36d1.tar.gz dotty-dc028e709fc36791526ff69d47280c91d1dc36d1.tar.bz2 dotty-dc028e709fc36791526ff69d47280c91d1dc36d1.zip |
Added desugaring for & and | types.
-rw-r--r-- | src/dotty/tools/dotc/ast/Desugar.scala | 4 | ||||
-rw-r--r-- | src/dotty/tools/dotc/printing/RefinedPrinter.scala | 2 | ||||
-rw-r--r-- | src/dotty/tools/dotc/typer/Typer.scala | 2 | ||||
-rw-r--r-- | tests/pos/sigs.scala | 18 |
4 files changed, 24 insertions, 2 deletions
diff --git a/src/dotty/tools/dotc/ast/Desugar.scala b/src/dotty/tools/dotc/ast/Desugar.scala index da8c892c2..7692d5a95 100644 --- a/src/dotty/tools/dotc/ast/Desugar.scala +++ b/src/dotty/tools/dotc/ast/Desugar.scala @@ -627,7 +627,9 @@ object desugar { Apply(Select(Apply(Ident(nme.StringContext), strs), id), elems) case InfixOp(l, op, r) => if (ctx.mode is Mode.Type) - AppliedTypeTree(Ident(op), l :: r :: Nil) // op[l, r] + if (op == tpnme.raw.AMP) AndTypeTree(l, r) // l & r + else if (op == tpnme.raw.BAR) OrTypeTree(l, r) // l | r + else AppliedTypeTree(Ident(op), l :: r :: Nil) // op[l, r] else if (ctx.mode is Mode.Pattern) Apply(Ident(op), l :: r :: Nil) // op(l, r) else // l.op(r), or val x = r; l.op(x), plus handle named args specially diff --git a/src/dotty/tools/dotc/printing/RefinedPrinter.scala b/src/dotty/tools/dotc/printing/RefinedPrinter.scala index 5328c1d19..050b27587 100644 --- a/src/dotty/tools/dotc/printing/RefinedPrinter.scala +++ b/src/dotty/tools/dotc/printing/RefinedPrinter.scala @@ -260,6 +260,8 @@ class RefinedPrinter(_ctx: Context) extends PlainPrinter(_ctx) { modText(mods, if (mods is Trait) "trait" else "class") ~~ toText(name) ~ toText(impl) case rhs: TypeBoundsTree => typeDefText(toText(rhs)) + case rhs: TypeTree => + typeDefText(toText(rhs)) case _ => typeDefText(optText(rhs)(" = " ~ _)) } diff --git a/src/dotty/tools/dotc/typer/Typer.scala b/src/dotty/tools/dotc/typer/Typer.scala index 24599f7c8..4c44fbafe 100644 --- a/src/dotty/tools/dotc/typer/Typer.scala +++ b/src/dotty/tools/dotc/typer/Typer.scala @@ -740,7 +740,7 @@ class Typer extends Namer with Applications with Implicits { def typedTypeDef(tdef: untpd.TypeDef, sym: Symbol)(implicit ctx: Context): TypeDef = track("typedTypeDef") { val TypeDef(mods, name, rhs) = tdef val mods1 = typedModifiers(mods) - //val rhs1 = typedType(rhs) + val _ = typedType(rhs) // unused, typecheck only to remove from typedTree cpy.TypeDef(tdef, mods1, name, TypeTree(sym.info)).withType(sym.typeRef) } diff --git a/tests/pos/sigs.scala b/tests/pos/sigs.scala index 6f66a02e9..2051ead9a 100644 --- a/tests/pos/sigs.scala +++ b/tests/pos/sigs.scala @@ -20,6 +20,24 @@ object sigs { override def foo(x: Int) = "abc" } + + trait A { self: B => + type AA + val a: AA & BB + + } + + trait B { this: A => + type BB + val b: AA & BB + } + + class C extends A with B { + type AA = String + type BB = AnyRef + val a = "" + val b = "" + } }
\ No newline at end of file |