补充
This commit is contained in:
177
lib/core/export_table.py
Normal file
177
lib/core/export_table.py
Normal file
@@ -0,0 +1,177 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
导出表模块 - 用于收集和存储文件的公开符号信息
|
||||
"""
|
||||
from dataclasses import dataclass, field
|
||||
from typing import Dict, List, Optional, Any
|
||||
|
||||
|
||||
@dataclass
|
||||
class EnumMember:
|
||||
"""枚举成员信息"""
|
||||
name: str
|
||||
value: int
|
||||
lineno: int
|
||||
|
||||
|
||||
@dataclass
|
||||
class EnumInfo:
|
||||
"""枚举类型信息"""
|
||||
name: str
|
||||
members: List[EnumMember] = field(default_factory=list)
|
||||
lineno: int = 0
|
||||
is_public: bool = True
|
||||
|
||||
|
||||
@dataclass
|
||||
class FunctionParam:
|
||||
"""函数参数信息"""
|
||||
name: str
|
||||
type_name: str
|
||||
is_pointer: bool = False
|
||||
|
||||
|
||||
@dataclass
|
||||
class FunctionInfo:
|
||||
"""函数信息"""
|
||||
name: str
|
||||
return_type: str
|
||||
params: List[FunctionParam] = field(default_factory=list)
|
||||
lineno: int = 0
|
||||
is_public: bool = True
|
||||
|
||||
|
||||
@dataclass
|
||||
class StructMember:
|
||||
"""结构体成员信息"""
|
||||
name: str
|
||||
type_name: str
|
||||
is_pointer: bool = False
|
||||
array_size: Optional[int] = None
|
||||
|
||||
|
||||
@dataclass
|
||||
class StructInfo:
|
||||
"""结构体类型信息"""
|
||||
name: str
|
||||
members: List[StructMember] = field(default_factory=list)
|
||||
lineno: int = 0
|
||||
is_public: bool = True
|
||||
|
||||
|
||||
@dataclass
|
||||
class TypedefInfo:
|
||||
"""类型别名信息"""
|
||||
name: str
|
||||
original_type: str
|
||||
lineno: int = 0
|
||||
is_public: bool = True
|
||||
|
||||
|
||||
@dataclass
|
||||
class ExportTable:
|
||||
"""导出表 - 存储文件的所有公开符号"""
|
||||
filename: str
|
||||
enums: List[EnumInfo] = field(default_factory=list)
|
||||
functions: List[FunctionInfo] = field(default_factory=list)
|
||||
structs: List[StructInfo] = field(default_factory=list)
|
||||
typedefs: List[TypedefInfo] = field(default_factory=list)
|
||||
|
||||
def add_enum(self, name: str, lineno: int, is_public: bool = True) -> EnumInfo:
|
||||
"""添加枚举类型"""
|
||||
enum_info = EnumInfo(name=name, lineno=lineno, is_public=is_public)
|
||||
self.enums.append(enum_info)
|
||||
return enum_info
|
||||
|
||||
def add_function(self, name: str, return_type: str, lineno: int, is_public: bool = True) -> FunctionInfo:
|
||||
"""添加函数"""
|
||||
func_info = FunctionInfo(name=name, return_type=return_type, lineno=lineno, is_public=is_public)
|
||||
self.functions.append(func_info)
|
||||
return func_info
|
||||
|
||||
def add_struct(self, name: str, lineno: int, is_public: bool = True) -> StructInfo:
|
||||
"""添加结构体"""
|
||||
struct_info = StructInfo(name=name, lineno=lineno, is_public=is_public)
|
||||
self.structs.append(struct_info)
|
||||
return struct_info
|
||||
|
||||
def add_typedef(self, name: str, original_type: str, lineno: int, is_public: bool = True) -> TypedefInfo:
|
||||
"""添加类型别名"""
|
||||
typedef_info = TypedefInfo(name=name, original_type=original_type, lineno=lineno, is_public=is_public)
|
||||
self.typedefs.append(typedef_info)
|
||||
return typedef_info
|
||||
|
||||
def to_dict(self) -> Dict[str, Any]:
|
||||
"""转换为字典格式"""
|
||||
return {
|
||||
'filename': self.filename,
|
||||
'enums': [
|
||||
{
|
||||
'name': enum.name,
|
||||
'lineno': enum.lineno,
|
||||
'is_public': enum.is_public,
|
||||
'members': [
|
||||
{'name': m.name, 'value': m.value, 'lineno': m.lineno}
|
||||
for m in enum.members
|
||||
]
|
||||
}
|
||||
for enum in self.enums
|
||||
],
|
||||
'functions': [
|
||||
{
|
||||
'name': func.name,
|
||||
'return_type': func.return_type,
|
||||
'lineno': func.lineno,
|
||||
'is_public': func.is_public,
|
||||
'params': [
|
||||
{'name': p.name, 'type_name': p.type_name, 'is_pointer': p.is_pointer}
|
||||
for p in func.params
|
||||
]
|
||||
}
|
||||
for func in self.functions
|
||||
],
|
||||
'structs': [
|
||||
{
|
||||
'name': struct.name,
|
||||
'lineno': struct.lineno,
|
||||
'is_public': struct.is_public,
|
||||
'members': [
|
||||
{
|
||||
'name': m.name,
|
||||
'type_name': m.type_name,
|
||||
'is_pointer': m.is_pointer,
|
||||
'array_size': m.array_size
|
||||
}
|
||||
for m in struct.members
|
||||
]
|
||||
}
|
||||
for struct in self.structs
|
||||
],
|
||||
'typedefs': [
|
||||
{
|
||||
'name': typedef.name,
|
||||
'original_type': typedef.original_type,
|
||||
'lineno': typedef.lineno,
|
||||
'is_public': typedef.is_public
|
||||
}
|
||||
for typedef in self.typedefs
|
||||
]
|
||||
}
|
||||
|
||||
def merge(self, other: 'ExportTable') -> None:
|
||||
"""合并另一个导出表"""
|
||||
self.enums.extend(other.enums)
|
||||
self.functions.extend(other.functions)
|
||||
self.structs.extend(other.structs)
|
||||
self.typedefs.extend(other.typedefs)
|
||||
|
||||
def get_public_symbols(self) -> 'ExportTable':
|
||||
"""获取仅包含公开符号的导出表"""
|
||||
result = ExportTable(filename=self.filename)
|
||||
|
||||
result.enums = [e for e in self.enums if e.is_public]
|
||||
result.functions = [f for f in self.functions if f.is_public]
|
||||
result.structs = [s for s in self.structs if s.is_public]
|
||||
result.typedefs = [t for t in self.typedefs if t.is_public]
|
||||
|
||||
return result
|
||||
Reference in New Issue
Block a user