package Ġmutation _ operators Ċ Ċ import Ġcom . github . g um tre ed iff . actions . model . Action Ċ import Ġg um tree . sp oon . diff . operations .* Ċ import Ġspo on . reflect . code . Ct Binary Operator Ċ import Ġspo on . reflect . code . Ct Expression Ċ import Ġspo on . reflect . code . Ct Variable Read Ċ import Ġspo on . reflect . declaration . Ct Element Ċ import Ġutils . is Arithmetic Ċ import Ġutils . is TypeString Ċ import Ġutils . simple Expr Ċ Ċ class ĠArithmetic Operator Insertion () Ġ: ĠMutation Operator < Arithmetic Operator Insertion >() Ġ{ ĊĠĠĠ Ġlateinit Ġvar Ġfrom Elem : ĠC t Element ĊĠĠĠ Ġlateinit Ġvar Ġto Elem : ĠC t Element ĊĊĠĠĠ Ġconstructor ( from Elem : ĠC t Element , Ġto Elem : ĠC t Element ): Ġthis () Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . from Elem Ġ= Ġfrom Elem ĊĠĠĠĠĠĠĠ Ġthis . to Elem Ġ= Ġto Elem ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcheck ( op 1 : ĠOperation < Action >, Ġop 2 : ĠOperation < Action >): ĠMutation Operator < Arithmetic Operator Insertion >? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġop 1 Ġis ĠDelete Operation Ġ&& Ġop 2 Ġis ĠInsert Operation Ġ-> Ġcheck Delete And Insert ( op 1 , Ġop 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġop 1 Ġis ĠInsert Operation Ġ&& Ġop 2 Ġis ĠMove Operation Ġ-> Ġcheck Insert And Move ( op 1 , Ġop 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck Insert And Move ( ins Op : ĠInsert Operation , Ġmov Op : ĠMove Operation ): ĠMutation Operator < Arithmetic Operator Insertion >? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( ins Src , Ġmov Src ) Ġ= ĠPair ( ins Op . src Node , Ġmov Op . src Node ) ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( ins Src Ġis ĠC t Binary Operator < *> Ġ&& Ġis Arithmetic ( ins Src . kind ) Ġ&& Ġins Src Ġ== Ġmov Op . parent ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( ins Left Op , Ġins Right Op ) Ġ= ĠPair ( ins Src . left Hand Operand , Ġins Src . right Hand Operand ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( is TypeString ( ins Left Op ) Ġ|| Ġis TypeString ( ins Right Op )) Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĠArithmetic Operator Insertion ( mov Src , Ġins Src ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck Delete And Insert ( del Op : ĠDelete Operation , Ġins Op : ĠInsert Operation ): ĠMutation Operator < Arithmetic Operator Insertion >? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( del Src , Ġins Src ) Ġ= ĠPair ( del Op . src Node , Ġins Op . src Node ) ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( del Src Ġis ĠC t Expression < *> Ġ&& Ġins Src Ġis ĠC t Binary Operator < *> Ġ&& Ġis Arithmetic ( ins Src . kind )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( ins Left Op , Ġins Right Op ) Ġ= ĠPair ( ins Src . left Hand Operand , Ġins Src . right Hand Operand ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is TypeString ( ins Left Op ) Ġ|| Ġis TypeString ( ins Right Op )) Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ( del Src Ġ== Ġins Left Op Ġ|| Ġdel Src Ġ== Ġins Right Op ) ĠArithmetic Operator Insertion ( del Src , Ġins Src ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ( simple Expr ( del Src ) Ġ== Ġsimple Expr ( ins Left Op ) Ġ|| Ġsimple Expr ( del Src ) Ġ== Ġsimple Expr ( ins Right Op )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠArithmetic Operator Insertion ( del Src , Ġins Src ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġnull ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcheck ( op 1 : ĠOperation < Action >, Ġop 2 : ĠOperation < Action >, Ġop 3 : ĠOperation < Action >): ĠMutation Operator < Arithmetic Operator Insertion >? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġop 1 Ġis ĠUpdate Operation Ġ&& Ġop 2 Ġis ĠInsert Operation Ġ&& Ġop 3 Ġis ĠMove Operation -> Ġcheck Update Insert Move ( op 1 , Ġop 2 , Ġop 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck Update Insert Move ( up Op : ĠUpdate Operation , Ġins Op : ĠInsert Operation , Ġmov Op : ĠMove Operation ): ĠMutation Operator < Arithmetic Operator Insertion >? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( up Src , Ġup Dst ) Ġ= ĠPair ( up Op . src Node , Ġup Op . dst Node ) ĊĠĠĠĠĠĠĠ Ġval Ġ( ins Src , Ġmov Src ) Ġ= ĠPair ( ins Op . src Node , Ġmov Op . src Node ) ĊĠĠĠĠĠĠĠ Ġreturn Ġif ( up Dst Ġis ĠC t Binary Operator < *> Ġ&& Ġup Src Ġis ĠC t Binary Operator < *> Ġ&& Ġis Arithmetic ( up Dst . kind ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġup Src Ġ=== Ġmov Src Ġ&& Ġins Src Ġ=== Ġmov Op . parent ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmov Op Parent Ġ= Ġmov Op . parent Ġas ? ĠC t Binary Operator < *> Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( up Src Left , Ġup Src Right ) Ġ= ĠPair ( up Src . left Hand Operand , Ġup Src . right Hand Operand ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( up Src Left Ġ== Ġmov Op Parent . left Hand Operand Ġ|| Ġup Src Right Ġ== Ġmov Op Parent . right Hand Operand ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠArithmetic Operator Insertion ( up Src , Ġins Src ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġnull ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ" AO I ( from =$ from Elem , to =$ to Elem )" ĊĠĠĠ Ġ} Ċ } Ċ