修复了大量存在的问题,增加了假鸭子类型等等机制

This commit is contained in:
2026-06-25 14:49:46 +08:00
parent 19f2787db0
commit d88d11b646
827 changed files with 32617 additions and 18316 deletions

View File

@@ -1,8 +1,7 @@
from __future__ import annotations
from typing import Any, Dict, Optional, TYPE_CHECKING
if TYPE_CHECKING:
from lib.core.Handles.HandlesBase import CTypeInfo
from typing import Any, Dict, Optional
from lib.core.Handles.HandlesBase import CTypeInfo
from lib.includes import t
@@ -13,7 +12,6 @@ class SymbolNode:
"""
def __init__(self, name: str, NodeType: str, lineno: int = 0, file: str = '', parent: SymbolNode | None = None):
from lib.core.Handles.HandlesBase import CTypeInfo
self.name: str = name
self.type: str = NodeType
self.lineno: int = lineno
@@ -30,10 +28,10 @@ class SymbolNode:
return getattr(self.attributes, key)
return self.attributes._extra.get(key, default)
def set(self, key: str, value: Any):
def set(self, key: str, value: Any) -> None:
"""设置属性值"""
if hasattr(self.attributes, key):
attr = getattr(type(self.attributes), key, None)
attr: Any = getattr(type(self.attributes), key, None)
if isinstance(attr, property) and attr.fset is None:
return
setattr(self.attributes, key, value)
@@ -62,8 +60,8 @@ class SymbolNode:
def find(self, path: str, separator: str = '.') -> Optional[SymbolNode]:
"""根据路径查找节点,如 'test.ClassA'"""
parts = path.split(separator)
current = self
parts: list[str] = path.split(separator)
current: SymbolNode = self
for part in parts:
if current.HasChild(part):
@@ -75,13 +73,13 @@ class SymbolNode:
def ToDict(self) -> Dict[str, Any]:
"""转换为字典格式"""
result = {
result: dict[str, Any] = {
'type': self.type,
'lineno': self.lineno,
'file': self.file,
}
# 序列化 CTypeInfo 属性
attrs = self.attributes
attrs: CTypeInfo = self.attributes
if attrs.BaseType:
result['BaseType'] = str(attrs.BaseType)
if attrs.PtrCount:
@@ -130,7 +128,6 @@ class SymbolNode:
@classmethod
def CreateMember(cls, name: str, TypeName: str | None = None, TypeInfo: 'CTypeInfo | None' = None, IsPtr: bool = False, dims: list[int] | None = None, lineno: int = 0, file: str = '') -> SymbolNode:
"""创建成员节点(工厂函数)"""
from lib.core.Handles.HandlesBase import CTypeInfo
node = cls(name=name, NodeType='member', lineno=lineno, file=file)
node.attributes = CTypeInfo()
node.attributes.Name = name
@@ -151,8 +148,7 @@ class SymbolNode:
@classmethod
def CreateClass(cls, name: str, TypeKind: type, members: dict | None = None, lineno: int = 0, file: str = '', IsCpythonObject: bool = False, IsPacked: bool = False) -> SymbolNode:
"""创建类节点(工厂函数)"""
from lib.core.Handles.HandlesBase import CTypeInfo
node = cls(name=name, NodeType=TypeKind, lineno=lineno, file=file)
node: SymbolNode = cls(name=name, NodeType=TypeKind, lineno=lineno, file=file)
node.attributes = CTypeInfo()
node.attributes.Name = name
node.attributes.Lineno = lineno
@@ -163,12 +159,12 @@ class SymbolNode:
if isinstance(MemberInfo, CTypeInfo):
node.attributes.Members[MemberName] = MemberInfo
elif isinstance(MemberInfo, dict):
CTypeMember = CTypeInfo()
type_str = MemberInfo.get('type', 'int')
IsPtr = MemberInfo.get('IsPtr', False)
CTypeMember: CTypeInfo = CTypeInfo()
type_str: str = MemberInfo.get('type', 'int')
IsPtr: bool = MemberInfo.get('IsPtr', False)
if isinstance(type_str, str):
try:
resolved = CTypeInfo.FromTypeName(type_str)
resolved: CTypeInfo | None = CTypeInfo.FromTypeName(type_str)
if resolved and resolved.BaseType:
CTypeMember = resolved
else:
@@ -193,9 +189,8 @@ class SymbolNode:
return node
@classmethod
def CreateTypedef(cls, name: str, OriginalType, members: dict | None = None, lineno: int = 0, file: str = '') -> SymbolNode:
from lib.core.Handles.HandlesBase import CTypeInfo
node = cls(name=name, NodeType='typedef', lineno=lineno, file=file)
def CreateTypedef(cls, name: str, OriginalType: CTypeInfo | str | None, members: dict | None = None, lineno: int = 0, file: str = '') -> SymbolNode:
node: SymbolNode = cls(name=name, NodeType='typedef', lineno=lineno, file=file)
node.attributes = CTypeInfo()
node.attributes.Name = name
node.attributes.Lineno = lineno
@@ -211,9 +206,8 @@ class SymbolNode:
@classmethod
def CreateAnonymous(cls, name: str, IsUnion: bool, members: dict, lineno: int = 0, file: str = '') -> SymbolNode:
"""创建匿名类型节点(工厂函数)"""
from lib.core.Handles.HandlesBase import CTypeInfo
NodeType = t.CUnion if IsUnion else t.CStruct
node = cls(name=name, NodeType=NodeType, lineno=lineno, file=file)
NodeType: type = t.CUnion if IsUnion else t.CStruct
node: SymbolNode = cls(name=name, NodeType=NodeType, lineno=lineno, file=file)
node.attributes = CTypeInfo()
node.attributes.Name = name
node.attributes.Lineno = lineno