Add parsers module
This commit is contained in:
70
src/parsers/base.py
Normal file
70
src/parsers/base.py
Normal file
@@ -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
|
||||||
Reference in New Issue
Block a user