Exactly! This is what happens when all these tools are readily available in the IDE during development. It's often hard to understand the power of these seemingly small things, until you experience their impact on your own problem. Cheers, Doru On Fri, Jul 24, 2015 at 8:57 AM, Marcus Denker <marcus.denker@inria.fr> wrote:
Hi,
Yesterday Alex and me played with using Roassal in combination with reflectivity.
Very quickly (within half an hour, even shorter) we had a view per class that shows coverage for ASTs as trees like this:
this is
| t | t := false. t ifTrue: [ self bar ] ifFalse: [ 'hello' ]. ^ 5
and you directly see that I have not yet added support for annotating optimized blocks⦠will come soon. (These views are nice for debugging reflectivityâ¦)
The code:
1) node-by-node coverage:
getCoverageOf: aPharoClass whileExecuting: aBlock " self new getCoverageOf: CoverageDemoTest whileExecuting: [ CoverageDemoTest new simpleAst ] "
| link | link := MetaLink new metaObject: #node; selector: #tagExecuted. aPharoClass methods do: [ :cm | cm ast nodesDo: [ :node | node link: link ] ]. aBlock value. ^ aPharoClass and the code for visalization:
renderCoverage | b | b := RTMondrian new.
b shape rectangle withTextAbove: #selector. b nodes: self methods forEach: [ :aMethod | b shape label text: [ :astNode | | aName | aName := astNode class name copyFrom: 3 to: astNode class name size. (aName endsWith: 'Node') ifTrue: [ aName copyFrom: 1 to: aName size - 'Node' size ] ifFalse: [ aName ] ] ; color: Color red; if: #hasBeenExecuted color: Color green. b nodes: aMethod ast allChildren. b edges connectFrom: #parent. b layout tree. ].
b layout flow. b build. ^ b view
A second example shows often executed nodes larger (shows another bug⦠the one largest should have the same size as the other large ones):
Code:
renderNodeExecutions | b | b := RTMondrian new.
b shape rectangle withTextAbove: #selector. b nodes: self methods forEach: [ :aMethod | b shape rectangle size: [ :astNode | astNode propertyAt: #nbExecutions ifAbsent: [ 0 ] ]. b nodes: aMethod ast allChildren. b edges connectFrom: #parent. b layout tree. ].
b layout flow. b build. ^ b view
getNodeExecution: aPharoClass whileExecuting: aBlock " self new getNodeExecution: CoverageDemoTest whileExecuting: [ 30 timesRepeat: [ CoverageDemoTest new simpleAst ] ] "
| link | link := MetaLink new metaObject: [ :node | | v | v := node propertyAt: #nbExecutions ifAbsentPut: [ 0 ]. node propertyAt: #nbExecutions put: v + 1 ]; selector: #value:; arguments: #(#node). aPharoClass methods do: [ :cm | cm ast nodesDo: [ :node | node link: link ] ]. aBlock value. ^ aPharoClass
These are just very quick and raw experiments⦠but they got us excited about the possibilities when this is all debugged and readyâ¦
Marcus
-- www.tudorgirba.com "Every thing has its own flow"