getTokens(); $classPointers = array_reverse(self::getAllClassPointers($phpcsFile)); foreach ($classPointers as $classPointer) { if ($tokens[$classPointer]['scope_opener'] < $pointer && $tokens[$classPointer]['scope_closer'] > $pointer) { return $classPointer; } } return null; } public static function isFinal(File $phpcsFile, int $classPointer): bool { return $phpcsFile->getTokens()[TokenHelper::findPreviousEffective($phpcsFile, $classPointer - 1)]['code'] === T_FINAL; } public static function getFullyQualifiedName(File $phpcsFile, int $classPointer): string { $className = self::getName($phpcsFile, $classPointer); $tokens = $phpcsFile->getTokens(); if ($tokens[$classPointer]['code'] === T_ANON_CLASS) { return $className; } $name = sprintf('%s%s', NamespaceHelper::NAMESPACE_SEPARATOR, $className); $namespace = NamespaceHelper::findCurrentNamespaceName($phpcsFile, $classPointer); return $namespace !== null ? sprintf('%s%s%s', NamespaceHelper::NAMESPACE_SEPARATOR, $namespace, $name) : $name; } public static function getName(File $phpcsFile, int $classPointer): string { $tokens = $phpcsFile->getTokens(); if ($tokens[$classPointer]['code'] === T_ANON_CLASS) { return 'class@anonymous'; } return $tokens[TokenHelper::findNext($phpcsFile, T_STRING, $classPointer + 1, $tokens[$classPointer]['scope_opener'])]['content']; } /** * @return array */ public static function getAllNames(File $phpcsFile): array { $tokens = $phpcsFile->getTokens(); $names = []; /** @var int $classPointer */ foreach (self::getAllClassPointers($phpcsFile) as $classPointer) { if ($tokens[$classPointer]['code'] === T_ANON_CLASS) { continue; } $names[$classPointer] = self::getName($phpcsFile, $classPointer); } return $names; } /** * @return list */ public static function getTraitUsePointers(File $phpcsFile, int $classPointer): array { $useStatements = []; $tokens = $phpcsFile->getTokens(); $scopeLevel = $tokens[$classPointer]['level'] + 1; for ($i = $tokens[$classPointer]['scope_opener'] + 1; $i < $tokens[$classPointer]['scope_closer']; $i++) { if ($tokens[$i]['code'] !== T_USE) { continue; } if ($tokens[$i]['level'] !== $scopeLevel) { continue; } $useStatements[] = $i; } return $useStatements; } /** * @return list */ private static function getAllClassPointers(File $phpcsFile): array { $lazyValue = static function () use ($phpcsFile): array { return TokenHelper::findNextAll($phpcsFile, TokenHelper::$typeWithAnonymousClassKeywordTokenCodes, 0); }; return SniffLocalCache::getAndSetIfNotCached($phpcsFile, 'classPointers', $lazyValue); } }