func (p *port) RemoveObject(tree tr.TreeIf, cursor tr.Cursor) (removed []tr.IdWithObject) { parent := tree.Parent(cursor) if p != tree.Object(parent) { log.Fatal("port.RemoveObject error: not removing child of mine.") } obj := tree.Object(cursor) switch obj.(type) { case bh.ConnectionIf: conn := obj.(bh.ConnectionIf) var thisPort, otherPort bh.PortIf if p.Direction() == gr.InPort { otherPort = conn.From() thisPort = conn.To() if p != thisPort { log.Fatal("port.RemoveObject error: invalid connection ", conn) } } else { otherPort = conn.To() thisPort = conn.From() if p != thisPort { log.Fatal("port.RemoveObject error: invalid connection ", conn) } } contextCursor := tree.Parent(tree.Parent(tree.Parent(cursor))) removed = p.treeRemoveObject(tree, cursor, conn, otherPort) context := tree.Object(contextCursor) switch context.(type) { case bh.SignalGraphIf: case bh.ImplementationIf: // propagate removed edge to all instances of embracing type nt := tree.Object(tree.Parent(contextCursor)) for _, nn := range nt.(bh.NodeTypeIf).Instances() { nCursor := tree.Cursor(nn) tCursor := tree.CursorAt(nCursor, context) pCursor := tree.CursorAt(tCursor, p) cCursor := tree.CursorAt(pCursor, conn) p.treeRemoveObject(tree, cCursor, conn, otherPort) } default: log.Fatalf("port.RemoveObject error: wrong context type %T: %v\n", context, context) } p.RemoveConnection(otherPort) otherPort.RemoveConnection(p) default: log.Fatalf("bh.PortIf.RemoveObject error: invalid type %T: %v\n", obj, obj) } return }