diff options
author | Martin Odersky <odersky@gmail.com> | 2014-05-16 14:00:49 +0200 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2014-05-30 14:38:30 +0200 |
commit | 996f47d48c3c10c51da58558643ec02844e45687 (patch) | |
tree | 26b21d97932b4d5b0c96480009e66688bc4b6faa /tests/pos/t267.scala | |
parent | 772d57cd0874d992b3d5bad12e8f30746b24f5d6 (diff) | |
download | dotty-996f47d48c3c10c51da58558643ec02844e45687.tar.gz dotty-996f47d48c3c10c51da58558643ec02844e45687.tar.bz2 dotty-996f47d48c3c10c51da58558643ec02844e45687.zip |
tests t26xx
Diffstat (limited to 'tests/pos/t267.scala')
-rw-r--r-- | tests/pos/t267.scala | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/tests/pos/t267.scala b/tests/pos/t267.scala new file mode 100644 index 000000000..7e5876eae --- /dev/null +++ b/tests/pos/t267.scala @@ -0,0 +1,55 @@ +package expAbstractData + +/** A base class consisting of + * - a root trait (i.e. abstract class) `Exp' with an `eval' function + * - an abstract type `exp' bounded by `Exp' + * - a concrete instance class `Num' of `Exp' for numeric literals + */ +trait Base { + type exp <: Exp + + trait Exp { + def eval: Int + } + class Num(v: Int) extends Exp { self: exp => + val value = v + def eval = value + } +} + +object testBase extends App with Base { + type exp = Exp + val term = new Num(2); + Console.println(term.eval) +} + +/** Data extension: An extension of `Base' with `Plus' expressions + */ +trait BasePlus extends Base { + class Plus(l: exp, r: exp) extends Exp { self: exp => + val left = l + val right = r + def eval = left.eval + right.eval + } +} + +/** Operation extension: An extension of `Base' with 'show' methods. + */ +trait Show extends Base { + type exp <: Exp1 + + trait Exp1 extends Exp { + def show: String + } + class Num1(v: Int) extends Num(v) with Exp1 { self: exp with Num1 => + def show = value.toString() + } +} + +/** Operation extension: An extension of `BasePlus' with 'show' methods. + */ +trait ShowPlus extends BasePlus with Show { + class Plus1(l: exp, r: exp) extends Plus(l, r) with Exp1 { self: exp with Plus1 => + def show = left.show + " + " + right.show + } +} |