Neos\Flow\Aop\Pointcut\PointcutClassTypeFilter::reduceTargetClassNames PHP Method

reduceTargetClassNames() public method

This method is used to optimize the matching process.
public reduceTargetClassNames ( ClassNameIndex $classNameIndex ) : ClassNameIndex
$classNameIndex Neos\Flow\Aop\Builder\ClassNameIndex
return Neos\Flow\Aop\Builder\ClassNameIndex
    public function reduceTargetClassNames(ClassNameIndex $classNameIndex)
    {
        if (interface_exists($this->interfaceOrClassName)) {
            $classNames = $this->reflectionService->getAllImplementationClassNamesForInterface($this->interfaceOrClassName);
        } elseif (class_exists($this->interfaceOrClassName)) {
            $classNames = $this->reflectionService->getAllSubClassNamesForClass($this->interfaceOrClassName);
            $classNames[] = $this->interfaceOrClassName;
        } else {
            $classNames = [];
        }
        $filteredIndex = new ClassNameIndex();
        $filteredIndex->setClassNames($classNames);
        return $classNameIndex->intersect($filteredIndex);
    }

Usage Example

 /**
  * @test
  */
 public function reduceTargetClassNamesFiltersAllClassesExceptTheClassItselfAndAllItsSubclasses()
 {
     $testClassName = uniqid('someTestInterface');
     eval('class ' . $testClassName . ' {}');
     $availableClassNames = [$testClassName, 'TestPackage\\Subpackage\\Class1', 'TestPackage\\Class2', 'TestPackage\\Subpackage\\SubSubPackage\\Class3', 'TestPackage\\Subpackage2\\Class4'];
     sort($availableClassNames);
     $availableClassNamesIndex = new Aop\Builder\ClassNameIndex();
     $availableClassNamesIndex->setClassNames($availableClassNames);
     $mockReflectionService = $this->getMockBuilder(ReflectionService::class)->disableOriginalConstructor()->getMock();
     $mockReflectionService->expects($this->any())->method('getAllSubClassNamesForClass')->with($testClassName)->will($this->returnValue(['TestPackage\\Subpackage\\Class1', 'TestPackage\\Subpackage\\SubSubPackage\\Class3', 'SomeMoreClass']));
     $classTypeFilter = new Aop\Pointcut\PointcutClassTypeFilter($testClassName);
     $classTypeFilter->injectReflectionService($mockReflectionService);
     $expectedClassNames = [$testClassName, 'TestPackage\\Subpackage\\Class1', 'TestPackage\\Subpackage\\SubSubPackage\\Class3'];
     sort($expectedClassNames);
     $expectedClassNamesIndex = new Aop\Builder\ClassNameIndex();
     $expectedClassNamesIndex->setClassNames($expectedClassNames);
     $result = $classTypeFilter->reduceTargetClassNames($availableClassNamesIndex);
     $this->assertEquals($expectedClassNamesIndex, $result, 'The wrong class names have been filtered');
 }