is_enabled()) { continue; } // Filter based on manifest scan requirements $is_manifest_scan_rule = $rule->is_called_during_manifest_scan(); if ($only_manifest_scan && !$is_manifest_scan_rule) { continue; // Skip non-manifest-scan rules when only wanting manifest-scan rules } if ($exclude_manifest_scan && $is_manifest_scan_rule) { continue; // Skip manifest-scan rules when excluding them (e.g., during rsx:check) } $rules[] = $rule; } return $rules; } /** * Extract basic class metadata from a PHP file using token parsing * This is a simplified version that doesn't require Manifest * * @param string $file_path Path to the PHP file * @return array Metadata array with namespace, class, fqcn, extends */ protected static function extract_class_metadata(string $file_path): array { $content = file_get_contents($file_path); $tokens = token_get_all($content); $metadata = []; $namespace = ''; $class = ''; $extends = ''; $i = 0; $count = count($tokens); while ($i < $count) { // Look for namespace if ($tokens[$i][0] === T_NAMESPACE) { $i++; while ($i < $count && $tokens[$i][0] === T_WHITESPACE) { $i++; } // PHP 8.4+ uses T_NAME_QUALIFIED for fully qualified names if ($i < $count && (defined('T_NAME_QUALIFIED') && $tokens[$i][0] === T_NAME_QUALIFIED)) { $namespace = $tokens[$i][1]; $i++; } else { // Fallback for older PHP versions while ($i < $count && ($tokens[$i][0] === T_STRING || $tokens[$i][0] === T_NS_SEPARATOR)) { $namespace .= is_array($tokens[$i]) ? $tokens[$i][1] : $tokens[$i]; $i++; } } } // Look for class if ($tokens[$i][0] === T_CLASS) { $i++; while ($i < $count && $tokens[$i][0] === T_WHITESPACE) { $i++; } if ($i < $count && $tokens[$i][0] === T_STRING) { $class = $tokens[$i][1]; $i++; // Look for extends while ($i < $count && $tokens[$i][0] === T_WHITESPACE) { $i++; } if ($i < $count && $tokens[$i][0] === T_EXTENDS) { $i++; while ($i < $count && $tokens[$i][0] === T_WHITESPACE) { $i++; } if ($i < $count && $tokens[$i][0] === T_STRING) { $extends = $tokens[$i][1]; } } break; // Found the class, stop parsing } } $i++; } if ($class) { $metadata['class'] = $class; $metadata['namespace'] = $namespace; $metadata['fqcn'] = $namespace ? $namespace . '\\' . $class : $class; $metadata['extends'] = $extends; } return $metadata; } }