Here is an example of using the ast to remove -all- halts from the code if one or more is encountered during execution.

------------------------------------------------------------

| haltTypes haltingMethods testCode |

 

haltTypes := #( halt halt: haltIf: haltIfNil haltOnCount: haltOnce).

haltingMethods := IdentitySet new.

 

"example code"

Object compile: 'aMethod | a | self halt. a := 42. self haltIf: a = 42; haltOnCount: 2; yourself. self haltOnce; halt: ''Halting!''. self yourself; haltIfNil; yourself. [ 1 halt ] value.  ^ a'.

testCode := (Object >> #aMethod) ast formattedCode.

 

[ "do stuff here"

             

              Object new perform: #aMethod

             

] on: Halt do: [ :ex |

              haltingMethods add: ex signalerContext method.

              "ex debug" "<- show debugger on a halt"

              ex resume.

].

 

haltingMethods do: [ :method | | ast cascades |

              ast := method ast copy.

              cascades := IdentitySet new.

             

              ast allChildren

                             select: [ :child | child isMessage and: [ haltTypes includes: child selector ] ]

                             thenDo: [ :child | | parent |

                                           parent := child parent.

                                           parent isCascade

                                                          ifTrue: [

                                                                        parent messages remove: child.

                                                                        cascades add: parent

                                                          ]

                                                          ifFalse: [ parent removeNode: child ].

                             ].

                            

              cascades

                             select: [ :cascadeNode | cascadeNode messages isEmpty]

                             thenDo: [ :cascadeNode | cascadeNode parent removeNode: cascadeNode ].

             

              method origin

                             compile: ast formattedCode

                             classified: method protocol.

 

].

 

(

DiffMorph

              from: testCode

              to: (Object >>#aMethod) sourceCode

              contextClass: Object

) openInWindow            

------------------------------------------------------------

 

Best regards,

Henrik

 

Fra: Pharo-dev [mailto:pharo-dev-bounces@lists.pharo.org] P�� vegne av Stephane Ducasse
Sendt: 19 January 2017 18:46
Til: Pharo Development List <pharo-dev@lists.pharo.org>
Emne: [Pharo-dev] In the need of Pharo magic

 

 

I would love to get a functionality that dynamically removes from my code all the self halt that are encountered during test execution. 

This way I will not need to run the test, walk the stack, edit the code and retart the process. 

 

It would be really cool