public function visitToken(File $file)
{
if (!$file->seekTokenType(T_STRING, false, '{')) {
return;
}
$token = $file->current();
$psr0Compliant = true;
if ($token->getNamespace() !== null) {
$fqcn = $token->getNamespace() . '\\' . $token->getLexeme();
$path = str_replace('\\', '/', $token->getNamespace()) . '/' . str_replace('_', '/', $token->getLexeme());
} else {
$fqcn = $token->getLexeme();
$path = str_replace('_', '/', $token->getLexeme());
if ($this->requireVendorNamespace) {
$psr0Compliant = false;
}
}
if ($psr0Compliant) {
$expectedPathParts = array_diff(explode('/', $path), array(''));
$expectedFilename = array_pop($expectedPathParts) . '.php';
$pathParts = explode('/', str_replace('\\', '/', realpath($file->getFilename())));
$filename = array_pop($pathParts);
if ($filename !== $expectedFilename) {
// Class name should match filename.
$psr0Compliant = false;
} elseif (count($expectedPathParts) === 0) {
// Vendor level namespace required.
$psr0Compliant = false;
} else {
// Path should match namespace structure.
$pathParts = array_slice($pathParts, -count($expectedPathParts));
if ($pathParts !== $expectedPathParts) {
$psr0Compliant = false;
}
}
}
if (!$psr0Compliant) {
$this->addViolation($file, $token->getLine(), $token->getColumn(), sprintf('Class name "%s" is not PSR0 compliant', $fqcn));
}
}