parserImport XOCL; import Walkers; context Walkers @Class RelinkOwner extends Walker @Operation defaultWalk(e:Element,arg:Element):Element null end @Operation reWalk(v:Element,arg:Element):Element null end @Operation walkBoolean(b:Boolean,arg:Element):Element null end @Operation walkInteger(i:Integer,arg:Element):Element null end @Operation walkNull(arg:Element):Element null end @Operation walkOperation (o:Operation,arg:Element):Element null end @Operation walkObject(o:Object,arg:Element):Element if o <> self then if o.isKindOf(Contained) then if o.owner <> null then if not o.owner.contents()->includes(o) then format(stdout,"[ Relinking owner ~S and owned ~S ]~%",Seq{o.owner,o}); o.owner.add(o) end end end; super(o,arg) else o end end @Operation walkSeq(s:SeqOfElement,arg:Element):Element if not s->isEmpty then self.walk(s->head,arg); self.walk(s->tail,arg) end; s end @Operation walkSet(s:SetOfElement,arg:Element):Element @For e in s do self.walk(e,arg) end end @Operation walkSlot(o:Object,s:String,value,arg:Element) self.walk(value,arg) end @Operation walkString(s:String,arg:Element):Element null end @Operation walkSymbol(s:Symbol,arg:Element):Element null end @Operation walkTable(t:Table,arg:Element):Element gc(); @For key in t.keys() do self.walk(key,arg); self.walk(t.get(key),arg) end end end