class_info.py

Code Hygiene Score: 100

Keine Issues gefunden.

Dependencies 3

Funktionen 1

Code

"""code_class - Holt Klassen-Details per FQCN."""

import json

from db import execute_query, execute_single


def register_class_tool(mcp):
    """Registriert code_class Tool."""

    @mcp.tool()
    def code_class(fqcn: str) -> dict:
        """
        Holt Klassen-Details per FQCN (Fully Qualified Class Name).

        Args:
            fqcn: Vollstaendiger Klassenname (z.B. Controller\\HomeController)

        Returns:
            Dict mit fqcn, type, file_path, namespace, methods,
            dependencies, dependents_count
        """
        # FQCN in Namespace und Klassennamen aufteilen
        parts = fqcn.rsplit("\\", 1)
        if len(parts) == 2:
            namespace, class_name = parts
        else:
            namespace = None
            class_name = fqcn

        # Klasse finden - SQL aus PHP CodeAnalysisRepository::findById()
        if namespace:
            sql = """
                SELECT id, file_path, file_name, namespace, classes, functions
                FROM code_analysis
                WHERE namespace = %s AND classes LIKE %s
                LIMIT 1
            """
            params = (namespace, f'%"{class_name}"%')
        else:
            sql = """
                SELECT id, file_path, file_name, namespace, classes, functions
                FROM code_analysis
                WHERE namespace IS NULL AND classes LIKE %s
                LIMIT 1
            """
            params = (f'%"{class_name}"%',)

        row = execute_single(sql, params)

        if not row:
            return {"error": f"Klasse nicht gefunden: {fqcn}"}

        classes = json.loads(row["classes"] or "[]")
        functions = json.loads(row["functions"] or "[]")

        # Die richtige Klasse finden (falls mehrere in einer Datei)
        class_info = None
        for cls in classes:
            if cls["name"] == class_name:
                class_info = cls
                break

        if not class_info:
            return {"error": f"Klasse nicht in Datei gefunden: {class_name}"}

        # Dependencies laden - SQL aus PHP CodeAnalysisRepository::getDependencies()
        dep_sql = """
            SELECT dependency_type, target_fqcn
            FROM code_dependencies
            WHERE analysis_id = %s
            ORDER BY dependency_type, target_fqcn
        """
        dependencies = execute_query(dep_sql, (row["id"],))

        # Dependents zaehlen
        dep_count_sql = """
            SELECT COUNT(*) as cnt FROM code_dependencies WHERE target_fqcn = %s
        """
        count_row = execute_single(dep_count_sql, (fqcn,))
        dependents_count = count_row["cnt"] if count_row else 0

        return {
            "fqcn": fqcn,
            "type": class_info.get("type", "class"),
            "file_id": row["id"],
            "file_path": row["file_path"],
            "file_name": row["file_name"],
            "namespace": row["namespace"],
            "methods": functions,
            "dependencies": dependencies,
            "dependents_count": dependents_count,
        }
← Übersicht