修复了大量存在的问题,增加了假鸭子类型等等机制
This commit is contained in:
@@ -1,11 +1,15 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from typing import Dict
|
||||
import ast
|
||||
from typing import Any, Callable, Dict, TYPE_CHECKING
|
||||
import sys
|
||||
import os
|
||||
|
||||
from lib.core.Exportable import Exportable
|
||||
|
||||
if TYPE_CHECKING:
|
||||
import llvmlite.ir as ir
|
||||
|
||||
sys.path.append(os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(__file__)))), 'lib', 'includes'))
|
||||
from lib.includes import c
|
||||
from lib.includes import t
|
||||
@@ -27,10 +31,11 @@ from lib.core.Handles.HandlesBase import CTypeInfo
|
||||
from lib.core.SymbolTable import SymbolTable
|
||||
from lib.core.SymbolNode import SymbolNode
|
||||
from lib.constants.config import mode as _ConfigMode
|
||||
from lib.core.VLogger import get_logger as _vlog
|
||||
from lib.core.LlvmCodeGenerator import LlvmCodeGenerator
|
||||
|
||||
|
||||
def _StrictLog(logger, msg):
|
||||
def _StrictLog(logger: Callable[[str], None], msg: str) -> None:
|
||||
"""在 strict 模式下记录异常日志"""
|
||||
if _ConfigMode == "strict":
|
||||
logger(msg)
|
||||
@@ -42,11 +47,11 @@ class BaseTranslatorMixin:
|
||||
提供 __init__、日志、调试输出与表达式处理等基础能力。
|
||||
"""
|
||||
|
||||
def __init__(self):
|
||||
def __init__(self) -> None:
|
||||
self.VarScopes: list[Dict[str, SymbolNode]] = [{}] # 跟踪变量作用域,第一个是全局作用域
|
||||
self.FunctionReturnTypes: Dict[str, CTypeInfo] = {} # 记录函数名和其返回类型
|
||||
self.CurrentCReturnTypes: list[CTypeInfo] = None # 当前函数的 CReturn 类型列表
|
||||
self._CurrentCpythonObjectClass: str = None # 当前正在处理的 CPython 对象类名
|
||||
self.CurrentCReturnTypes: list[CTypeInfo] | None = None # 当前函数的 CReturn 类型列表
|
||||
self._CurrentCpythonObjectClass: str | None = None # 当前正在处理的 CPython 对象类名
|
||||
self.FunctionDefCache: dict = {} # 函数定义缓存
|
||||
self.OriginalLines: list[str] = [] # 原始代码行
|
||||
self.Content: str = ''
|
||||
@@ -54,20 +59,20 @@ class BaseTranslatorMixin:
|
||||
self.IsHeader: bool = False # 是否生成头文件(仅处理定义、宏、导入等,忽略函数体)
|
||||
self.AnnotationModules: set[str] = set() # 注解模块集合,用于识别类型定义模块
|
||||
self.Warnings: list[str] = [] # 警告日志
|
||||
self._ErrorStack = [] # 错误栈,按顺序收集错误位置
|
||||
self.Errors = [] # 错误日志
|
||||
self.SliceCount = 0 # 切片计数
|
||||
self.SliceInfos = [] # 切片信息列表
|
||||
self.SliceLevel = 3 # 切片优化级别
|
||||
self.GeneratedTypes = set() # 在当前代码中生成的类型(struct/typedef)
|
||||
self.EmbeddedAssignments = {} # {ClassName: [var1, var2, ...]} 嵌入的实例化变量
|
||||
self.TypedefAssignments = {} # {ClassName: [(var1, IsPtr), ...]} 嵌入的 typedef/指针变量
|
||||
self.ChainAssignmentArrays = [] # 链式赋值数组形式 [(ClassName, VarName, ArraySize_node), ...]
|
||||
self.tree = None # 保存解析后的 AST 树
|
||||
self.LibraryPaths = ['.'] # 库搜索路径列表,默认包含当前目录
|
||||
self.InClass = False # 是否正在处理 class 定义
|
||||
self._UserTypeModules = {}
|
||||
self._source_module_sig_files = {}
|
||||
self._ErrorStack: list[tuple[str, str, str]] = [] # 错误栈,按顺序收集错误位置
|
||||
self.Errors: list[dict[str, str | None]] = [] # 错误日志
|
||||
self.SliceCount: int = 0 # 切片计数
|
||||
self.SliceInfos: list = [] # 切片信息列表
|
||||
self.SliceLevel: int = 3 # 切片优化级别
|
||||
self.GeneratedTypes: set[str] = set() # 在当前代码中生成的类型(struct/typedef)
|
||||
self.EmbeddedAssignments: dict[str, list] = {} # {ClassName: [var1, var2, ...]} 嵌入的实例化变量
|
||||
self.TypedefAssignments: dict[str, list] = {} # {ClassName: [(var1, IsPtr), ...]} 嵌入的 typedef/指针变量
|
||||
self.ChainAssignmentArrays: list = [] # 链式赋值数组形式 [(ClassName, VarName, ArraySize_node), ...]
|
||||
self.tree: ast.AST | None = None # 保存解析后的 AST 树
|
||||
self.LibraryPaths: list[str] = ['.'] # 库搜索路径列表,默认包含当前目录
|
||||
self.InClass: bool = False # 是否正在处理 class 定义
|
||||
self._UserTypeModules: dict = {}
|
||||
self._source_module_sig_files: dict = {}
|
||||
self._global_function_default_args: dict = {}
|
||||
self.exception_registry: dict = {}
|
||||
self.exception_parents: dict = {}
|
||||
@@ -107,7 +112,7 @@ class BaseTranslatorMixin:
|
||||
self.RaiseHandler = RaiseHandle(self)
|
||||
self.MatchHandler = MatchHandle(self)
|
||||
|
||||
def LogWarning(self, message: str, LineNum: int = None):
|
||||
def LogWarning(self, message: str, LineNum: int | None = None) -> None:
|
||||
"""记录警告
|
||||
|
||||
Args:
|
||||
@@ -119,36 +124,36 @@ class BaseTranslatorMixin:
|
||||
warning += f" (line {LineNum})"
|
||||
self.Warnings.append(warning)
|
||||
|
||||
def LogError(self, message: str, LineNum: int = None):
|
||||
def LogError(self, message: str, LineNum: int | None = None) -> None:
|
||||
"""记录错误
|
||||
|
||||
Args:
|
||||
message: 错误消息
|
||||
LineNum: 行号
|
||||
"""
|
||||
print(f"[ERROR] {message}")
|
||||
entry = {'message': message, 'line': LineNum}
|
||||
_vlog().error(message)
|
||||
entry: dict[str, str | int | None] = {'message': message, 'line': LineNum}
|
||||
self.Errors.append(entry)
|
||||
|
||||
# 检查 config 中是否有 debug 文件
|
||||
DebugFile = None
|
||||
DebugFile: str | None = None
|
||||
if hasattr(self, 'config') and self.config:
|
||||
DebugFile = getattr(self.config, 'debug', None)
|
||||
|
||||
if DebugFile:
|
||||
with open(DebugFile, 'a', encoding='utf-8') as f:
|
||||
LineInfo = f' line {LineNum}' if LineNum else ''
|
||||
LineInfo: str = f' line {LineNum}' if LineNum else ''
|
||||
f.write(f'[ERROR]{LineInfo}: {message}\n')
|
||||
|
||||
def SetDebugFile(self, FilePath):
|
||||
def SetDebugFile(self, FilePath: str) -> None:
|
||||
"""设置调试输出文件"""
|
||||
self.DebugFile = FilePath
|
||||
|
||||
def DebugPrint(self, *args, **kwargs):
|
||||
def DebugPrint(self, *args: Any, **kwargs: Any) -> None:
|
||||
"""输出调试信息到文件"""
|
||||
if self.DebugFile:
|
||||
with open(self.DebugFile, 'a', encoding='utf-8') as f:
|
||||
print(*args, file=f, **kwargs)
|
||||
|
||||
def HandleExpr(self, Node, UseSingleQuote=False, VarType=None):
|
||||
def HandleExpr(self, Node: ast.AST, UseSingleQuote: bool = False, VarType: ir.Type | None = None) -> Any:
|
||||
return self.ExprHandler.HandleExpr(Node, UseSingleQuote, VarType)
|
||||
|
||||
Reference in New Issue
Block a user