修复了大量存在的问题,增加了假鸭子类型等等机制
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
"""Pass 3: SymbolInserter — 将解析后的符号插入 SymbolTable(主命名空间)"""
|
||||
from __future__ import annotations
|
||||
from typing import TYPE_CHECKING, List
|
||||
from typing import TYPE_CHECKING
|
||||
if TYPE_CHECKING:
|
||||
from lib.core.SymbolTable import SymbolTable
|
||||
|
||||
@@ -10,13 +10,20 @@ from lib.core.SymbolData import ModuleSymbols
|
||||
class SymbolInserter:
|
||||
"""将解析后的符号插入 SymbolTable 的主命名空间(无前缀)"""
|
||||
|
||||
def __init__(self, symbol_table: SymbolTable):
|
||||
self._symtab = symbol_table
|
||||
def __init__(self, symbol_table: SymbolTable) -> None:
|
||||
self._symtab: SymbolTable = symbol_table
|
||||
self._namespace: str | None = None
|
||||
|
||||
def insert(self, module_symbols: ModuleSymbols) -> List[str]:
|
||||
def set_namespace(self, namespace: str) -> None:
|
||||
"""设置当前模块的命名空间"""
|
||||
self._namespace = namespace
|
||||
self._symtab.register_namespace(namespace)
|
||||
|
||||
def insert(self, module_symbols: ModuleSymbols) -> list[str]:
|
||||
"""插入所有符号到主命名空间,返回已加载的符号名列表"""
|
||||
loaded = []
|
||||
file_path = module_symbols.file_path
|
||||
loaded: list[str] = []
|
||||
file_path: str = module_symbols.file_path
|
||||
ns: dict[str, object] = self._symtab._namespaces.get(self._namespace, {}) if self._namespace else {}
|
||||
|
||||
# 插入类符号
|
||||
for cls in module_symbols.classes:
|
||||
@@ -25,13 +32,15 @@ class SymbolInserter:
|
||||
cls.members, cls.is_cpython_object, cls.is_packed
|
||||
)
|
||||
loaded.append(cls.name)
|
||||
if self._namespace:
|
||||
ns[cls.name] = self._symtab._symbols[cls.name]
|
||||
|
||||
# 插入枚举成员(短名 + 类名.成员名)
|
||||
if cls.type_kind == 'enum':
|
||||
for member_name, _member_value, member_lineno in cls.enum_members:
|
||||
self._symtab._InsertEnumMemberSymbol(member_name, cls.name, member_lineno, file_path)
|
||||
loaded.append(member_name)
|
||||
class_member_name = f"{cls.name}.{member_name}"
|
||||
class_member_name: str = f"{cls.name}.{member_name}"
|
||||
self._symtab._InsertEnumMemberSymbol(class_member_name, cls.name, member_lineno, file_path)
|
||||
loaded.append(class_member_name)
|
||||
|
||||
@@ -42,14 +51,20 @@ class SymbolInserter:
|
||||
td.lineno, file_path, td.members
|
||||
)
|
||||
loaded.append(td.name)
|
||||
if self._namespace:
|
||||
ns[td.name] = self._symtab._symbols[td.name]
|
||||
|
||||
# 插入函数符号
|
||||
for func in module_symbols.functions:
|
||||
# 优先使用 CTypeInfo(保留符号性),回退到 LLVM 类型字符串
|
||||
ret_type = func.ret_ctype if func.ret_ctype else func.ret_type
|
||||
self._symtab._InsertFuncSymbol(
|
||||
func.name, func.ret_type, func.param_types,
|
||||
func.name, ret_type, func.param_types,
|
||||
func.lineno, file_path, func.is_variadic, func.is_inline
|
||||
)
|
||||
loaded.append(func.name)
|
||||
if self._namespace:
|
||||
ns[func.name] = self._symtab._symbols[func.name]
|
||||
|
||||
# 插入 define 符号
|
||||
for define in module_symbols.defines:
|
||||
@@ -57,6 +72,8 @@ class SymbolInserter:
|
||||
define.name, define.value, define.lineno, file_path
|
||||
)
|
||||
loaded.append(define.name)
|
||||
if self._namespace:
|
||||
ns[define.name] = self._symtab._symbols[define.name]
|
||||
|
||||
# 插入匿名类型符号(短名)
|
||||
for anon_name, anon_data in module_symbols.anonymous_types.items():
|
||||
|
||||
Reference in New Issue
Block a user