summaryrefslogtreecommitdiff
path: root/test/files/pos
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2006-05-16 11:27:18 +0000
committerMartin Odersky <odersky@gmail.com>2006-05-16 11:27:18 +0000
commitddfe2e74ecf827a0659696c3a21756f3038d585a (patch)
tree19c061053ead65ced0b730133677797935beb266 /test/files/pos
parentbc46a1b53603f1ecfa9061466c36909c51a19a55 (diff)
downloadscala-ddfe2e74ecf827a0659696c3a21756f3038d585a.tar.gz
scala-ddfe2e74ecf827a0659696c3a21756f3038d585a.tar.bz2
scala-ddfe2e74ecf827a0659696c3a21756f3038d585a.zip
Fixed bug 592
Diffstat (limited to 'test/files/pos')
-rw-r--r--test/files/pos/bug592.scala71
1 files changed, 71 insertions, 0 deletions
diff --git a/test/files/pos/bug592.scala b/test/files/pos/bug592.scala
new file mode 100644
index 0000000000..4d41f112ee
--- /dev/null
+++ b/test/files/pos/bug592.scala
@@ -0,0 +1,71 @@
+trait Graph {
+ type Edge;
+ type Node <: NodeIntf;
+
+ trait NodeIntf {
+ def connectWith(node: Node): Edge;
+ }
+
+ def nodes: List[Node];
+ def edges: List[Edge];
+ def addNode: Node;
+
+ protected var ids = 0;
+}
+
+abstract class DirectedGraph extends Graph {
+ type Edge <: EdgeImpl;
+
+ class EdgeImpl(origin: Node, dest: Node) {
+ def from = origin;
+ def to = dest;
+ override def toString = ""+origin+" --> "+dest
+ }
+
+ class NodeImpl requires Node extends NodeIntf {
+ val id = ids
+ ids = ids + 1
+ def connectWith(node: Node): Edge = {
+ val edge = newEdge(this, node);
+ edges = edge :: edges;
+ edge;
+ }
+ override def toString = "Node "+id
+ }
+
+ protected def newNode: Node;
+ protected def newEdge(from: Node, to: Node): Edge;
+ var nodes: List[Node] = Nil;
+ var edges: List[Edge] = Nil;
+
+ def addNode: Node = {
+ val node = newNode;
+ nodes = node :: nodes;
+ node;
+ }
+}
+
+class ConcreteDirectedGraph extends DirectedGraph {
+ type Edge = EdgeImpl;
+ type Node = NodeImpl;
+
+ protected def newNode: Node = {
+ new NodeImpl;
+ }
+
+ protected def newEdge(f: Node, t: Node): Edge = {
+ new EdgeImpl(f, t);
+ }
+}
+
+object ExplicitThis {
+ def main(args: Array[String]): Unit = {
+ val g: Graph = new ConcreteDirectedGraph;
+ val n1 = g.addNode;
+ val n2 = g.addNode;
+ val n3 = g.addNode;
+ Console.println(n1.connectWith(n2))
+ Console.println(n2.connectWith(n3))
+ Console.println(n1.connectWith(n3))
+ }
+}