public function testGroupStack()
 {
     $log = new ArrayList();
     $listener = function (GroupEvent $event) use($log) {
         $log->add($event->getName() . ' ' . $event->getGroup()->type);
     };
     $parser = new Parser();
     $parser->getContext()->addListener(Context::EVENT_GROUP_ENTER, $listener);
     $parser->getContext()->addListener(Context::EVENT_GROUP_LEAVE, $listener);
     $parser->parse($this->getCode());
     $this->assertEquals(['context.group_enter block', 'context.group_leave block', 'context.group_enter block', 'context.group_leave block', 'context.group_enter call', 'context.group_leave call', 'context.group_enter block', 'context.group_leave block', 'context.group_enter block', 'context.group_enter group', 'context.group_leave group', 'context.group_leave block'], $log->toArray());
 }
 public function __construct(Parser $parser, Config $config, Writer $writer)
 {
     $this->config = $config;
     $this->writer = $writer;
     $this->parser = $parser;
     $this->context = $parser->getContext();
     $this->matcher = $parser->getMatcher();
     $this->init();
 }
 public function onRoutineClosed(BlockEvent $event)
 {
     if ($this->parser->getContext()->getCurrentContext() == Context::CONTEXT_STRUCT) {
         $block = $event->getBlock();
         if ($this->currentUnit === null || $block->start != $this->currentUnit->start) {
             $this->detectedUnit = $block->start;
             $this->detectedUnitType = Unit::UNIT_METHODS;
             $this->flushDetection($event->getToken());
         }
         $this->dumpCurrentUnit();
     }
 }