Protokoll #10415

ID10415
Zeitstempel2025-12-23 15:17:40.645233
Clientroot
IP
Warning: Undefined array key "request_ip" in /var/www/dev.campus.systemische-tools.de/src/View/protokoll/show.php on line 13

Deprecated: htmlspecialchars(): Passing null to parameter #1 ($string) of type string is deprecated in /var/www/dev.campus.systemische-tools.de/src/View/protokoll/show.php on line 13
Modellclaude-sonnet-4-20250514
Statuscompleted
Tokens6,334 (Input: 0, Output: 0)
Dauer105 ms
Request-Zeit
Warning: Undefined array key "request_timestamp" in /var/www/dev.campus.systemische-tools.de/src/View/protokoll/show.php on line 18
Response-Zeit-

Warning: Undefined array key "error_message" in /var/www/dev.campus.systemische-tools.de/src/View/protokoll/show.php on line 22

Request

{
    "event": "PreToolUse",
    "tool_name": "Edit",
    "tool_input": {
        "file_path": "\/var\/www\/dev.campus.systemische-tools.de\/src\/Infrastructure\/Persistence\/CodeAnalysisRepository.php",
        "old_string": "    \/**\n     * @param array<array<string, mixed>> $items\n     *\/\n    public function saveBatch(array $items, string $scanId): int\n    {\n        if (empty($items)) {\n            return 0;\n        }\n\n        $this->pdo->beginTransaction();\n\n        try {\n            $stmt = $this->pdo->prepare('\n                INSERT INTO code_analysis\n                (scan_id, file_path, file_name, extension, directory, file_size, line_count,\n                 modified_at, namespace, classes, functions, parse_error, triggered_by)\n                VALUES\n                (:scan_id, :file_path, :file_name, :extension, :directory, :file_size, :line_count,\n                 :modified_at, :namespace, :classes, :functions, :parse_error, :triggered_by)\n            ');\n\n            $count = 0;\n            foreach ($items as $item) {\n                $stmt->execute([\n                    'scan_id' => $scanId,\n                    'file_path' => $item['file_path'],\n                    'file_name' => $item['file_name'],\n                    'extension' => $item['extension'],\n                    'directory' => $item['directory'],\n                    'file_size' => $item['file_size'],\n                    'line_count' => $item['line_count'],\n                    'modified_at' => $item['modified_at'],\n                    'namespace' => $item['namespace'],\n                    'classes' => json_encode($item['classes'] ?? [], JSON_UNESCAPED_UNICODE),\n                    'functions' => json_encode($item['functions'] ?? [], JSON_UNESCAPED_UNICODE),\n                    'parse_error' => $item['parse_error'],\n                    'triggered_by' => $item['triggered_by'] ?? 'web',\n                ]);\n                $count++;\n            }\n\n            $this->pdo->commit();\n\n            return $count;\n        } catch (\\Throwable $e) {\n            $this->pdo->rollBack();\n\n            throw $e;\n        }\n    }",
        "new_string": "    \/**\n     * @param array<array<string, mixed>> $items\n     *\/\n    public function saveBatch(array $items, string $scanId): int\n    {\n        if (empty($items)) {\n            return 0;\n        }\n\n        $this->pdo->beginTransaction();\n\n        try {\n            $analysisStmt = $this->pdo->prepare('\n                INSERT INTO code_analysis\n                (scan_id, file_path, file_name, extension, directory, file_size, line_count,\n                 modified_at, namespace, classes, functions, uses, extends_class,\n                 implements_interfaces, traits_used, constructor_deps, parse_error, triggered_by)\n                VALUES\n                (:scan_id, :file_path, :file_name, :extension, :directory, :file_size, :line_count,\n                 :modified_at, :namespace, :classes, :functions, :uses, :extends_class,\n                 :implements_interfaces, :traits_used, :constructor_deps, :parse_error, :triggered_by)\n            ');\n\n            $depStmt = $this->pdo->prepare('\n                INSERT INTO code_dependencies (analysis_id, dependency_type, target_fqcn)\n                VALUES (:analysis_id, :dep_type, :target_fqcn)\n            ');\n\n            $count = 0;\n            foreach ($items as $item) {\n                $analysisStmt->execute([\n                    'scan_id' => $scanId,\n                    'file_path' => $item['file_path'],\n                    'file_name' => $item['file_name'],\n                    'extension' => $item['extension'],\n                    'directory' => $item['directory'],\n                    'file_size' => $item['file_size'],\n                    'line_count' => $item['line_count'],\n                    'modified_at' => $item['modified_at'],\n                    'namespace' => $item['namespace'],\n                    'classes' => json_encode($item['classes'] ?? [], JSON_UNESCAPED_UNICODE),\n                    'functions' => json_encode($item['functions'] ?? [], JSON_UNESCAPED_UNICODE),\n                    'uses' => json_encode($item['uses'] ?? [], JSON_UNESCAPED_UNICODE),\n                    'extends_class' => $item['extends_class'],\n                    'implements_interfaces' => json_encode($item['implements_interfaces'] ?? [], JSON_UNESCAPED_UNICODE),\n                    'traits_used' => json_encode($item['traits_used'] ?? [], JSON_UNESCAPED_UNICODE),\n                    'constructor_deps' => json_encode($item['constructor_deps'] ?? [], JSON_UNESCAPED_UNICODE),\n                    'parse_error' => $item['parse_error'],\n                    'triggered_by' => $item['triggered_by'] ?? 'web',\n                ]);\n\n                $analysisId = (int) $this->pdo->lastInsertId();\n\n                \/\/ Save dependencies to normalized table\n                $this->saveDependencies($depStmt, $analysisId, $item);\n\n                $count++;\n            }\n\n            $this->pdo->commit();\n\n            return $count;\n        } catch (\\Throwable $e) {\n            $this->pdo->rollBack();\n\n            throw $e;\n        }\n    }\n\n    \/**\n     * @param array<string, mixed> $item\n     *\/\n    private function saveDependencies(\\PDOStatement $stmt, int $analysisId, array $item): void\n    {\n        \/\/ Use statements\n        foreach ($item['uses'] ?? [] as $fqcn) {\n            $stmt->execute(['analysis_id' => $analysisId, 'dep_type' => 'use', 'target_fqcn' => $fqcn]);\n        }\n\n        \/\/ Extends\n        if (!empty($item['extends_class'])) {\n            $stmt->execute(['analysis_id' => $analysisId, 'dep_type' => 'extends', 'target_fqcn' => $item['extends_class']]);\n        }\n\n        \/\/ Implements\n        foreach ($item['implements_interfaces'] ?? [] as $fqcn) {\n            $stmt->execute(['analysis_id' => $analysisId, 'dep_type' => 'implements', 'target_fqcn' => $fqcn]);\n        }\n\n        \/\/ Traits\n        foreach ($item['traits_used'] ?? [] as $fqcn) {\n            $stmt->execute(['analysis_id' => $analysisId, 'dep_type' => 'trait', 'target_fqcn' => $fqcn]);\n        }\n\n        \/\/ Constructor dependencies\n        foreach ($item['constructor_deps'] ?? [] as $fqcn) {\n            $stmt->execute(['analysis_id' => $analysisId, 'dep_type' => 'constructor', 'target_fqcn' => $fqcn]);\n        }\n    }"
    }
}

Response

{
    "tool_response": {
        "filePath": "\/var\/www\/dev.campus.systemische-tools.de\/src\/Infrastructure\/Persistence\/CodeAnalysisRepository.php",
        "oldString": "    \/**\n     * @param array<array<string, mixed>> $items\n     *\/\n    public function saveBatch(array $items, string $scanId): int\n    {\n        if (empty($items)) {\n            return 0;\n        }\n\n        $this->pdo->beginTransaction();\n\n        try {\n            $stmt = $this->pdo->prepare('\n                INSERT INTO code_analysis\n                (scan_id, file_path, file_name, extension, directory, file_size, line_count,\n                 modified_at, namespace, classes, functions, parse_error, triggered_by)\n                VALUES\n                (:scan_id, :file_path, :file_name, :extension, :directory, :file_size, :line_count,\n                 :modified_at, :namespace, :classes, :functions, :parse_error, :triggered_by)\n            ');\n\n            $count = 0;\n            foreach ($items as $item) {\n                $stmt->execute([\n                    'scan_id' => $scanId,\n                    'file_path' => $item['file_path'],\n                    'file_name' => $item['file_name'],\n                    'extension' => $item['extension'],\n                    'directory' => $item['directory'],\n                    'file_size' => $item['file_size'],\n                    'line_count' => $item['line_count'],\n                    'modified_at' => $item['modified_at'],\n                    'namespace' => $item['namespace'],\n                    'classes' => json_encode($item['classes'] ?? [], JSON_UNESCAPED_UNICODE),\n                    'functions' => json_encode($item['functions'] ?? [], JSON_UNESCAPED_UNICODE),\n                    'parse_error' => $item['parse_error'],\n                    'triggered_by' => $item['triggered_by'] ?? 'web',\n                ]);\n                $count++;\n            }\n\n            $this->pdo->commit();\n\n            return $count;\n        } catch (\\Throwable $e) {\n            $this->pdo->rollBack();\n\n            throw $e;\n        }\n    }",
        "newString": "    \/**\n     * @param array<array<string, mixed>> $items\n     *\/\n    public function saveBatch(array $items, string $scanId): int\n    {\n        if (empty($items)) {\n            return 0;\n        }\n\n        $this->pdo->beginTransaction();\n\n        try {\n            $analysisStmt = $this->pdo->prepare('\n                INSERT INTO code_analysis\n                (scan_id, file_path, file_name, extension, directory, file_size, line_count,\n                 modified_at, namespace, classes, functions, uses, extends_class,\n                 implements_interfaces, traits_used, constructor_deps, parse_error, triggered_by)\n                VALUES\n                (:scan_id, :file_path, :file_name, :extension, :directory, :file_size, :line_count,\n                 :modified_at, :namespace, :classes, :functions, :uses, :extends_class,\n                 :implements_interfaces, :traits_used, :constructor_deps, :parse_error, :triggered_by)\n            ');\n\n            $depStmt = $this->pdo->prepare('\n                INSERT INTO code_dependencies (analysis_id, dependency_type, target_fqcn)\n                VALUES (:analysis_id, :dep_type, :target_fqcn)\n            ');\n\n            $count = 0;\n            foreach ($items as $item) {\n                $analysisStmt->execute([\n                    'scan_id' => $scanId,\n                    'file_path' => $item['file_path'],\n                    'file_name' => $item['file_name'],\n                    'extension' => $item['extension'],\n                    'directory' => $item['directory'],\n                    'file_size' => $item['file_size'],\n                    'line_count' => $item['line_count'],\n                    'modified_at' => $item['modified_at'],\n                    'namespace' => $item['namespace'],\n                    'classes' => json_encode($item['classes'] ?? [], JSON_UNESCAPED_UNICODE),\n                    'functions' => json_encode($item['functions'] ?? [], JSON_UNESCAPED_UNICODE),\n                    'uses' => json_encode($item['uses'] ?? [], JSON_UNESCAPED_UNICODE),\n                    'extends_class' => $item['extends_class'],\n                    'implements_interfaces' => json_encode($item['implements_interfaces'] ?? [], JSON_UNESCAPED_UNICODE),\n                    'traits_used' => json_encode($item['traits_used'] ?? [], JSON_UNESCAPED_UNICODE),\n                    'constructor_deps' => json_encode($item['constructor_deps'] ?? [], JSON_UNESCAPED_UNICODE),\n                    'parse_error' => $item['parse_error'],\n                    'triggered_by' => $item['triggered_by'] ?? 'web',\n                ]);\n\n                $analysisId = (int) $this->pdo->lastInsertId();\n\n                \/\/ Save dependencies to normalized table\n                $this->saveDependencies($depStmt, $analysisId, $item);\n\n                $count++;\n            }\n\n            $this->pdo->commit();\n\n            return $count;\n        } catch (\\Throwable $e) {\n            $this->pdo->rollBack();\n\n            throw $e;\n        }\n    }\n\n    \/**\n     * @param array<string, mixed> $item\n     *\/\n    private function saveDependencies(\\PDOStatement $stmt, int $analysisId, array $item): void\n    {\n        \/\/ Use statements\n        foreach ($item['uses'] ?? [] as $fqcn) {\n            $stmt->execute(['analysis_id' => $analysisId, 'dep_type' => 'use', 'target_fqcn' => $fqcn]);\n        }\n\n        \/\/ Extends\n        if (!empty($item['extends_class'])) {\n            $stmt->execute(['analysis_id' => $analysisId, 'dep_type' => 'extends', 'target_fqcn' => $item['extends_class']]);\n        }\n\n        \/\/ Implements\n        foreach ($item['implements_interfaces'] ?? [] as $fqcn) {\n            $stmt->execute(['analysis_id' => $analysisId, 'dep_type' => 'implements', 'target_fqcn' => $fqcn]);\n        }\n\n        \/\/ Traits\n        foreach ($item['traits_used'] ?? [] as $fqcn) {\n            $stmt->execute(['analysis_id' => $analysisId, 'dep_type' => 'trait', 'target_fqcn' => $fqcn]);\n        }\n\n        \/\/ Constructor dependencies\n        foreach ($item['constructor_deps'] ?? [] as $fqcn) {\n            $stmt->execute(['analysis_id' => $analysisId, 'dep_type' => 'constructor', 'target_fqcn' => $fqcn]);\n        }\n    }",
        "originalFile": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Infrastructure\\Persistence;\n\n\/\/ @responsibility: Persistenz für Code-Analyse-Ergebnisse\n\nuse Domain\\Repository\\CodeAnalysisRepositoryInterface;\nuse PDO;\n\nclass CodeAnalysisRepository implements CodeAnalysisRepositoryInterface\n{\n    private PDO $pdo;\n\n    public function __construct(PDO $pdo)\n    {\n        $this->pdo = $pdo;\n    }\n\n    \/**\n     * @param array<string, mixed> $filters\n     * @return array<array<string, mixed>>\n     *\/\n    public function findAll(array $filters = [], int $limit = 100, int $offset = 0): array\n    {\n        $sql = 'SELECT * FROM code_analysis WHERE 1=1';\n        $params = [];\n\n        if (!empty($filters['scan_id'])) {\n            $sql .= ' AND scan_id = :scan_id';\n            $params['scan_id'] = $filters['scan_id'];\n        }\n\n        if (!empty($filters['directory'])) {\n            $sql .= ' AND directory = :directory';\n            $params['directory'] = $filters['directory'];\n        }\n\n        if (!empty($filters['namespace'])) {\n            $sql .= ' AND namespace = :namespace';\n            $params['namespace'] = $filters['namespace'];\n        }\n\n        if (!empty($filters['extension'])) {\n            $sql .= ' AND extension = :extension';\n            $params['extension'] = $filters['extension'];\n        }\n\n        if (!empty($filters['search'])) {\n            $sql .= ' AND (file_name LIKE :search OR namespace LIKE :search2)';\n            $params['search'] = '%' . $filters['search'] . '%';\n            $params['search2'] = '%' . $filters['search'] . '%';\n        }\n\n        if (isset($filters['has_classes']) && $filters['has_classes'] !== '') {\n            if ($filters['has_classes'] === '1') {\n                $sql .= \" AND classes IS NOT NULL AND classes != '[]'\";\n            } else {\n                $sql .= \" AND (classes IS NULL OR classes = '[]')\";\n            }\n        }\n\n        if (isset($filters['has_error']) && $filters['has_error'] === '1') {\n            $sql .= ' AND parse_error IS NOT NULL';\n        }\n\n        $sql .= ' ORDER BY directory, file_name LIMIT :limit OFFSET :offset';\n\n        $stmt = $this->pdo->prepare($sql);\n        foreach ($params as $key => $value) {\n            $stmt->bindValue(':' . $key, $value);\n        }\n        $stmt->bindValue(':limit', $limit, PDO::PARAM_INT);\n        $stmt->bindValue(':offset', $offset, PDO::PARAM_INT);\n        $stmt->execute();\n\n        return $stmt->fetchAll(PDO::FETCH_ASSOC);\n    }\n\n    \/**\n     * @return array<string, mixed>|null\n     *\/\n    public function findById(int $id): ?array\n    {\n        $stmt = $this->pdo->prepare('SELECT * FROM code_analysis WHERE id = :id');\n        $stmt->execute(['id' => $id]);\n        $result = $stmt->fetch(PDO::FETCH_ASSOC);\n\n        return $result ?: null;\n    }\n\n    \/**\n     * @param array<array<string, mixed>> $items\n     *\/\n    public function saveBatch(array $items, string $scanId): int\n    {\n        if (empty($items)) {\n            return 0;\n        }\n\n        $this->pdo->beginTransaction();\n\n        try {\n            $stmt = $this->pdo->prepare('\n                INSERT INTO code_analysis\n                (scan_id, file_path, file_name, extension, directory, file_size, line_count,\n                 modified_at, namespace, classes, functions, parse_error, triggered_by)\n                VALUES\n                (:scan_id, :file_path, :file_name, :extension, :directory, :file_size, :line_count,\n                 :modified_at, :namespace, :classes, :functions, :parse_error, :triggered_by)\n            ');\n\n            $count = 0;\n            foreach ($items as $item) {\n                $stmt->execute([\n                    'scan_id' => $scanId,\n                    'file_path' => $item['file_path'],\n                    'file_name' => $item['file_name'],\n                    'extension' => $item['extension'],\n                    'directory' => $item['directory'],\n                    'file_size' => $item['file_size'],\n                    'line_count' => $item['line_count'],\n                    'modified_at' => $item['modified_at'],\n                    'namespace' => $item['namespace'],\n                    'classes' => json_encode($item['classes'] ?? [], JSON_UNESCAPED_UNICODE),\n                    'functions' => json_encode($item['functions'] ?? [], JSON_UNESCAPED_UNICODE),\n                    'parse_error' => $item['parse_error'],\n                    'triggered_by' => $item['triggered_by'] ?? 'web',\n                ]);\n                $count++;\n            }\n\n            $this->pdo->commit();\n\n            return $count;\n        } catch (\\Throwable $e) {\n            $this->pdo->rollBack();\n\n            throw $e;\n        }\n    }\n\n    public function deleteByNotScanId(string $currentScanId): int\n    {\n        $stmt = $this->pdo->prepare('DELETE FROM code_analysis WHERE scan_id != :scan_id');\n        $stmt->execute(['scan_id' => $currentScanId]);\n\n        return $stmt->rowCount();\n    }\n\n    public function getLatestScanId(): ?string\n    {\n        $stmt = $this->pdo->query('SELECT scan_id FROM code_analysis ORDER BY scanned_at DESC LIMIT 1');\n        $result = $stmt->fetchColumn();\n\n        return $result ?: null;\n    }\n\n    \/**\n     * @return array<string, mixed>\n     *\/\n    public function getStatistics(?string $scanId = null): array\n    {\n        $where = $scanId ? 'WHERE scan_id = :scan_id' : '';\n        $params = $scanId ? ['scan_id' => $scanId] : [];\n\n        $stmt = $this->pdo->prepare(\"\n            SELECT\n                COUNT(*) as total_files,\n                SUM(line_count) as total_lines,\n                SUM(file_size) as total_size,\n                COUNT(CASE WHEN parse_error IS NOT NULL THEN 1 END) as files_with_errors,\n                MAX(scanned_at) as last_scan\n            FROM code_analysis {$where}\n        \");\n        $stmt->execute($params);\n        $stats = $stmt->fetch(PDO::FETCH_ASSOC);\n\n        $stmt = $this->pdo->prepare(\"SELECT classes, functions FROM code_analysis {$where}\");\n        $stmt->execute($params);\n        $rows = $stmt->fetchAll(PDO::FETCH_ASSOC);\n\n        $totalClasses = 0;\n        $totalFunctions = 0;\n        foreach ($rows as $row) {\n            $classes = json_decode($row['classes'] ?? '[]', true);\n            $functions = json_decode($row['functions'] ?? '[]', true);\n            $totalClasses += count($classes);\n            $totalFunctions += count($functions);\n        }\n\n        return [\n            'total_files' => (int) ($stats['total_files'] ?? 0),\n            'total_lines' => (int) ($stats['total_lines'] ?? 0),\n            'total_size' => (int) ($stats['total_size'] ?? 0),\n            'total_classes' => $totalClasses,\n            'total_functions' => $totalFunctions,\n            'files_with_errors' => (int) ($stats['files_with_errors'] ?? 0),\n            'last_scan' => $stats['last_scan'],\n        ];\n    }\n\n    \/**\n     * @return array<string>\n     *\/\n    public function getDistinctDirectories(): array\n    {\n        $stmt = $this->pdo->query('SELECT DISTINCT directory FROM code_analysis ORDER BY directory');\n\n        return $stmt->fetchAll(PDO::FETCH_COLUMN);\n    }\n\n    \/**\n     * @return array<string>\n     *\/\n    public function getDistinctNamespaces(): array\n    {\n        $stmt = $this->pdo->query('SELECT DISTINCT namespace FROM code_analysis WHERE namespace IS NOT NULL ORDER BY namespace');\n\n        return $stmt->fetchAll(PDO::FETCH_COLUMN);\n    }\n\n    \/**\n     * @return array<array<string, mixed>>\n     *\/\n    public function getConfiguredDirectories(): array\n    {\n        $stmt = $this->pdo->query('SELECT * FROM code_scan_config WHERE enabled = 1 ORDER BY label');\n\n        return $stmt->fetchAll(PDO::FETCH_ASSOC);\n    }\n}\n",
        "structuredPatch": [
            {
                "oldStart": 102,
                "oldLines": 18,
                "newStart": 102,
                "newLines": 25,
                "lines": [
                    "         $this->pdo->beginTransaction();",
                    " ",
                    "         try {",
                    "-            $stmt = $this->pdo->prepare('",
                    "+            $analysisStmt = $this->pdo->prepare('",
                    "                 INSERT INTO code_analysis",
                    "                 (scan_id, file_path, file_name, extension, directory, file_size, line_count,",
                    "-                 modified_at, namespace, classes, functions, parse_error, triggered_by)",
                    "+                 modified_at, namespace, classes, functions, uses, extends_class,",
                    "+                 implements_interfaces, traits_used, constructor_deps, parse_error, triggered_by)",
                    "                 VALUES",
                    "                 (:scan_id, :file_path, :file_name, :extension, :directory, :file_size, :line_count,",
                    "-                 :modified_at, :namespace, :classes, :functions, :parse_error, :triggered_by)",
                    "+                 :modified_at, :namespace, :classes, :functions, :uses, :extends_class,",
                    "+                 :implements_interfaces, :traits_used, :constructor_deps, :parse_error, :triggered_by)",
                    "             ');",
                    " ",
                    "+            $depStmt = $this->pdo->prepare('",
                    "+                INSERT INTO code_dependencies (analysis_id, dependency_type, target_fqcn)",
                    "+                VALUES (:analysis_id, :dep_type, :target_fqcn)",
                    "+            ');",
                    "+",
                    "             $count = 0;",
                    "             foreach ($items as $item) {",
                    "-                $stmt->execute([",
                    "+                $analysisStmt->execute([",
                    "                     'scan_id' => $scanId,",
                    "                     'file_path' => $item['file_path'],",
                    "                     'file_name' => $item['file_name'],"
                ]
            },
            {
                "oldStart": 125,
                "oldLines": 9,
                "newStart": 132,
                "newLines": 20,
                "lines": [
                    "                     'namespace' => $item['namespace'],",
                    "                     'classes' => json_encode($item['classes'] ?? [], JSON_UNESCAPED_UNICODE),",
                    "                     'functions' => json_encode($item['functions'] ?? [], JSON_UNESCAPED_UNICODE),",
                    "+                    'uses' => json_encode($item['uses'] ?? [], JSON_UNESCAPED_UNICODE),",
                    "+                    'extends_class' => $item['extends_class'],",
                    "+                    'implements_interfaces' => json_encode($item['implements_interfaces'] ?? [], JSON_UNESCAPED_UNICODE),",
                    "+                    'traits_used' => json_encode($item['traits_used'] ?? [], JSON_UNESCAPED_UNICODE),",
                    "+                    'constructor_deps' => json_encode($item['constructor_deps'] ?? [], JSON_UNESCAPED_UNICODE),",
                    "                     'parse_error' => $item['parse_error'],",
                    "                     'triggered_by' => $item['triggered_by'] ?? 'web',",
                    "                 ]);",
                    "+",
                    "+                $analysisId = (int) $this->pdo->lastInsertId();",
                    "+",
                    "+                \/\/ Save dependencies to normalized table",
                    "+                $this->saveDependencies($depStmt, $analysisId, $item);",
                    "+",
                    "                 $count++;",
                    "             }",
                    " "
                ]
            },
            {
                "oldStart": 141,
                "oldLines": 6,
                "newStart": 159,
                "newLines": 37,
                "lines": [
                    "         }",
                    "     }",
                    " ",
                    "+    \/**",
                    "+     * @param array<string, mixed> $item",
                    "+     *\/",
                    "+    private function saveDependencies(\\PDOStatement $stmt, int $analysisId, array $item): void",
                    "+    {",
                    "+        \/\/ Use statements",
                    "+        foreach ($item['uses'] ?? [] as $fqcn) {",
                    "+            $stmt->execute(['analysis_id' => $analysisId, 'dep_type' => 'use', 'target_fqcn' => $fqcn]);",
                    "+        }",
                    "+",
                    "+        \/\/ Extends",
                    "+        if (!empty($item['extends_class'])) {",
                    "+            $stmt->execute(['analysis_id' => $analysisId, 'dep_type' => 'extends', 'target_fqcn' => $item['extends_class']]);",
                    "+        }",
                    "+",
                    "+        \/\/ Implements",
                    "+        foreach ($item['implements_interfaces'] ?? [] as $fqcn) {",
                    "+            $stmt->execute(['analysis_id' => $analysisId, 'dep_type' => 'implements', 'target_fqcn' => $fqcn]);",
                    "+        }",
                    "+",
                    "+        \/\/ Traits",
                    "+        foreach ($item['traits_used'] ?? [] as $fqcn) {",
                    "+            $stmt->execute(['analysis_id' => $analysisId, 'dep_type' => 'trait', 'target_fqcn' => $fqcn]);",
                    "+        }",
                    "+",
                    "+        \/\/ Constructor dependencies",
                    "+        foreach ($item['constructor_deps'] ?? [] as $fqcn) {",
                    "+            $stmt->execute(['analysis_id' => $analysisId, 'dep_type' => 'constructor', 'target_fqcn' => $fqcn]);",
                    "+        }",
                    "+    }",
                    "+",
                    "     public function deleteByNotScanId(string $currentScanId): int",
                    "     {",
                    "         $stmt = $this->pdo->prepare('DELETE FROM code_analysis WHERE scan_id != :scan_id');"
                ]
            }
        ],
        "userModified": false,
        "replaceAll": false
    }
}
← Vorheriger Zur Liste Nächster →