{
"event": "PreToolUse",
"tool_name": "Write",
"tool_input": {
"file_path": "\/var\/www\/dev.campus.systemische-tools.de\/src\/Infrastructure\/CodeAnalysis\/InheritanceExtractorTrait.php",
"content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Infrastructure\\CodeAnalysis;\n\n\/\/ @responsibility: Extraktion von Vererbungs-Beziehungen (extends, implements, traits)\n\n\/**\n * Trait for extracting inheritance relationships from PHP token arrays.\n *\n * Extracts parent classes, implemented interfaces, and used traits.\n *\/\ntrait InheritanceExtractorTrait\n{\n \/**\n * Extract the parent class (extends clause).\n *\n * @param array<mixed> $tokens\n *\/\n private function extractExtends(array $tokens): ?string\n {\n $count = count($tokens);\n\n for ($i = 0; $i < $count; $i++) {\n $token = $tokens[$i];\n\n if (!is_array($token) || $token[0] !== T_EXTENDS) {\n continue;\n }\n\n \/\/ Find the class name after extends\n $className = $this->extractTypeName($tokens, $i + 1);\n if ($className !== null) {\n return $this->resolveFqcn($className);\n }\n }\n\n return null;\n }\n\n \/**\n * Extract implemented interfaces.\n *\n * @param array<mixed> $tokens\n * @return array<string>\n *\/\n private function extractImplements(array $tokens): array\n {\n $interfaces = [];\n $count = count($tokens);\n\n for ($i = 0; $i < $count; $i++) {\n $token = $tokens[$i];\n\n if (!is_array($token) || $token[0] !== T_IMPLEMENTS) {\n continue;\n }\n\n \/\/ Collect interface names until { or extends\n for ($j = $i + 1; $j < $count; $j++) {\n if ($tokens[$j] === '{') {\n break;\n }\n\n if ($tokens[$j] === ',') {\n continue;\n }\n\n if (!is_array($tokens[$j])) {\n continue;\n }\n\n if ($tokens[$j][0] === T_EXTENDS) {\n break;\n }\n\n if (in_array($tokens[$j][0], [T_STRING, T_NAME_QUALIFIED, T_NAME_FULLY_QUALIFIED], true)) {\n $interfaces[] = $this->resolveFqcn($tokens[$j][1]);\n }\n }\n\n break;\n }\n\n return array_unique($interfaces);\n }\n\n \/**\n * Extract traits used inside class body.\n *\n * @param array<mixed> $tokens\n * @return array<string>\n *\/\n private function extractTraits(array $tokens): array\n {\n $traits = [];\n $count = count($tokens);\n $braceDepth = 0;\n $inClass = false;\n\n for ($i = 0; $i < $count; $i++) {\n $token = $tokens[$i];\n\n if (!is_array($token)) {\n if ($token === '{') {\n $braceDepth++;\n } elseif ($token === '}') {\n $braceDepth--;\n if ($braceDepth === 0) {\n $inClass = false;\n }\n }\n\n continue;\n }\n\n if (in_array($token[0], [T_CLASS, T_TRAIT, T_ENUM], true)) {\n $inClass = true;\n\n continue;\n }\n\n \/\/ T_USE inside class body = trait use\n if ($token[0] === T_USE && $inClass && $braceDepth === 1) {\n \/\/ Collect trait names until ; or {\n for ($j = $i + 1; $j < $count; $j++) {\n if ($tokens[$j] === ';' || $tokens[$j] === '{') {\n break;\n }\n\n if ($tokens[$j] === ',') {\n continue;\n }\n\n if (!is_array($tokens[$j])) {\n continue;\n }\n\n if (in_array($tokens[$j][0], [T_STRING, T_NAME_QUALIFIED, T_NAME_FULLY_QUALIFIED], true)) {\n $traits[] = $this->resolveFqcn($tokens[$j][1]);\n }\n }\n }\n }\n\n return array_unique($traits);\n }\n\n \/**\n * Required from TokenNavigatorTrait.\n *\n * @param array<mixed> $tokens\n *\/\n abstract private function extractTypeName(array $tokens, int $startIndex): ?string;\n\n \/**\n * Required from main class - resolves short names to FQCN.\n *\/\n abstract private function resolveFqcn(string $name): string;\n}\n"
}
}
{
"tool_response": {
"type": "create",
"filePath": "\/var\/www\/dev.campus.systemische-tools.de\/src\/Infrastructure\/CodeAnalysis\/InheritanceExtractorTrait.php",
"content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Infrastructure\\CodeAnalysis;\n\n\/\/ @responsibility: Extraktion von Vererbungs-Beziehungen (extends, implements, traits)\n\n\/**\n * Trait for extracting inheritance relationships from PHP token arrays.\n *\n * Extracts parent classes, implemented interfaces, and used traits.\n *\/\ntrait InheritanceExtractorTrait\n{\n \/**\n * Extract the parent class (extends clause).\n *\n * @param array<mixed> $tokens\n *\/\n private function extractExtends(array $tokens): ?string\n {\n $count = count($tokens);\n\n for ($i = 0; $i < $count; $i++) {\n $token = $tokens[$i];\n\n if (!is_array($token) || $token[0] !== T_EXTENDS) {\n continue;\n }\n\n \/\/ Find the class name after extends\n $className = $this->extractTypeName($tokens, $i + 1);\n if ($className !== null) {\n return $this->resolveFqcn($className);\n }\n }\n\n return null;\n }\n\n \/**\n * Extract implemented interfaces.\n *\n * @param array<mixed> $tokens\n * @return array<string>\n *\/\n private function extractImplements(array $tokens): array\n {\n $interfaces = [];\n $count = count($tokens);\n\n for ($i = 0; $i < $count; $i++) {\n $token = $tokens[$i];\n\n if (!is_array($token) || $token[0] !== T_IMPLEMENTS) {\n continue;\n }\n\n \/\/ Collect interface names until { or extends\n for ($j = $i + 1; $j < $count; $j++) {\n if ($tokens[$j] === '{') {\n break;\n }\n\n if ($tokens[$j] === ',') {\n continue;\n }\n\n if (!is_array($tokens[$j])) {\n continue;\n }\n\n if ($tokens[$j][0] === T_EXTENDS) {\n break;\n }\n\n if (in_array($tokens[$j][0], [T_STRING, T_NAME_QUALIFIED, T_NAME_FULLY_QUALIFIED], true)) {\n $interfaces[] = $this->resolveFqcn($tokens[$j][1]);\n }\n }\n\n break;\n }\n\n return array_unique($interfaces);\n }\n\n \/**\n * Extract traits used inside class body.\n *\n * @param array<mixed> $tokens\n * @return array<string>\n *\/\n private function extractTraits(array $tokens): array\n {\n $traits = [];\n $count = count($tokens);\n $braceDepth = 0;\n $inClass = false;\n\n for ($i = 0; $i < $count; $i++) {\n $token = $tokens[$i];\n\n if (!is_array($token)) {\n if ($token === '{') {\n $braceDepth++;\n } elseif ($token === '}') {\n $braceDepth--;\n if ($braceDepth === 0) {\n $inClass = false;\n }\n }\n\n continue;\n }\n\n if (in_array($token[0], [T_CLASS, T_TRAIT, T_ENUM], true)) {\n $inClass = true;\n\n continue;\n }\n\n \/\/ T_USE inside class body = trait use\n if ($token[0] === T_USE && $inClass && $braceDepth === 1) {\n \/\/ Collect trait names until ; or {\n for ($j = $i + 1; $j < $count; $j++) {\n if ($tokens[$j] === ';' || $tokens[$j] === '{') {\n break;\n }\n\n if ($tokens[$j] === ',') {\n continue;\n }\n\n if (!is_array($tokens[$j])) {\n continue;\n }\n\n if (in_array($tokens[$j][0], [T_STRING, T_NAME_QUALIFIED, T_NAME_FULLY_QUALIFIED], true)) {\n $traits[] = $this->resolveFqcn($tokens[$j][1]);\n }\n }\n }\n }\n\n return array_unique($traits);\n }\n\n \/**\n * Required from TokenNavigatorTrait.\n *\n * @param array<mixed> $tokens\n *\/\n abstract private function extractTypeName(array $tokens, int $startIndex): ?string;\n\n \/**\n * Required from main class - resolves short names to FQCN.\n *\/\n abstract private function resolveFqcn(string $name): string;\n}\n",
"structuredPatch": [],
"originalFile": null
}
}