修复了大量存在的问题,增加了假鸭子类型等等机制
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user