From 15e580f23ea33e7c9875acdb4ab17ca96626aeff Mon Sep 17 00:00:00 2001 From: 7000pctAUTO Date: Mon, 2 Feb 2026 02:38:27 +0000 Subject: [PATCH] Add parsers module --- src/parsers/base.py | 70 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 src/parsers/base.py diff --git a/src/parsers/base.py b/src/parsers/base.py new file mode 100644 index 0000000..ac6a7c8 --- /dev/null +++ b/src/parsers/base.py @@ -0,0 +1,70 @@ +from abc import ABC, abstractmethod +from dataclasses import dataclass, field +from enum import Enum +from pathlib import Path +from typing import Optional + + +class EntityType(Enum): + FILE = "file" + FUNCTION = "function" + CLASS = "class" + METHOD = "method" + IMPORT = "import" + VARIABLE = "variable" + CONSTANT = "constant" + + +@dataclass +class Entity: + name: str + entity_type: EntityType + file_path: Path + start_line: int + end_line: int + code: str = "" + attributes: dict = field(default_factory=dict) + parent: Optional["Entity"] = None + children: list["Entity"] = field(default_factory=list) + imports: list[str] = field(default_factory=list) + calls: list[str] = field(default_factory=list) + + +@dataclass +class ParserResult: + file_path: Path + entities: list[Entity] = field(default_factory=list) + imports: list[str] = field(default_factory=list) + errors: list[str] = field(default_factory=list) + language: str = "" + + +class BaseParser(ABC): + SUPPORTED_EXTENSIONS: list[str] = [] + + @abstractmethod + def parse(self, file_path: Path, content: str) -> ParserResult: + pass + + @abstractmethod + def extract_entities(self, tree, file_path: Path) -> list[Entity]: + pass + + @abstractmethod + def extract_imports(self, tree, file_path: Path) -> list[str]: + pass + + @abstractmethod + def extract_calls(self, tree, file_path: Path) -> list[str]: + pass + + @classmethod + def can_parse(cls, file_path: Path) -> bool: + return file_path.suffix in cls.SUPPORTED_EXTENSIONS + + @classmethod + def get_parser_for_file(cls, file_path: Path) -> Optional["BaseParser"]: + for parser_class in cls.__subclasses__(): + if parser_class.can_parse(file_path): + return parser_class() + return None