阶段 2 完成

This commit is contained in:
2026-06-18 12:42:44 +08:00
parent 599335e93d
commit f99666420b
19 changed files with 874 additions and 641 deletions

View File

@@ -4,7 +4,6 @@ import ast
import sys
import os
from lib.core.SymbolNode import SymbolNode
from lib.core.Handles.HandlesBase import CTypeInfo
from lib.includes import t
@@ -48,28 +47,25 @@ class AnnotationLoaderMixin:
# 优先检查是否是 CEnum 子类(枚举)
if isinstance(attr, type) and issubclass(attr, CEnum) and attr is not CEnum:
# 注册枚举类型
EnumNode = SymbolNode.CreateClass(
name=AttrName,
TypeKind='enum',
lineno=0
)
EnumNode = CTypeInfo()
EnumNode.Name = AttrName
EnumNode.BaseType = t.CEnum()
EnumNode.IsEnum = True
EnumNode.set('enum_class', attr)
EnumNode.set('source', 'annotation_module')
EnumNode.set('library_name', lib_name)
EnumNode.set('file', source_file)
self.SymbolTable[AttrName] = EnumNode.attributes
EnumNode.library_name = lib_name
EnumNode.file = source_file
self.SymbolTable[AttrName] = EnumNode
if lib_name:
FullName = f'{lib_name}.{AttrName}'
full_EnumNode = SymbolNode.CreateClass(
name=FullName,
TypeKind='enum',
lineno=0
)
full_EnumNode = CTypeInfo()
full_EnumNode.Name = FullName
full_EnumNode.IsEnum = True
full_EnumNode.set('enum_class', attr)
full_EnumNode.set('source', 'annotation_module')
full_EnumNode.set('library_name', lib_name)
full_EnumNode.set('file', source_file)
self.SymbolTable[FullName] = full_EnumNode.attributes
full_EnumNode.library_name = lib_name
full_EnumNode.file = source_file
self.SymbolTable[FullName] = full_EnumNode
# 枚举成员也需要注册
for MemberName in dir(attr):
if not MemberName.startswith('_'):
@@ -98,27 +94,23 @@ class AnnotationLoaderMixin:
else:
FullName = AttrName
# 同时注册带前缀和不带前缀的名称(都是 typedef 别名)
TypedefNode = SymbolNode.CreateClass(
name=AttrName,
TypeKind='typedef',
lineno=0
)
TypedefNode.set('OriginalType', attr().CName)
TypedefNode = CTypeInfo()
TypedefNode.Name = AttrName
TypedefNode.IsTypedef = True
TypedefNode.OriginalType = attr().CName
TypedefNode.set('source', 'annotation_module')
TypedefNode.set('library_name', lib_name)
TypedefNode.set('file', source_file)
self.SymbolTable[AttrName] = TypedefNode.attributes
TypedefNode.library_name = lib_name
TypedefNode.file = source_file
self.SymbolTable[AttrName] = TypedefNode
if lib_name and FullName != AttrName:
FullTypedef_node = SymbolNode.CreateClass(
name=FullName,
TypeKind='typedef',
lineno=0
)
FullTypedef_node.set('OriginalType', attr().CName)
FullTypedef_node = CTypeInfo()
FullTypedef_node.Name = FullName
FullTypedef_node.IsTypedef = True
FullTypedef_node.OriginalType = attr().CName
FullTypedef_node.set('source', 'annotation_module')
FullTypedef_node.set('library_name', lib_name)
FullTypedef_node.set('file', source_file)
self.SymbolTable[FullName] = FullTypedef_node.attributes
FullTypedef_node.library_name = lib_name
FullTypedef_node.file = source_file
self.SymbolTable[FullName] = FullTypedef_node
count += 1
# 检查是否是下划线前缀的 CType 子类(如 _CTypedef -> CTypedef
elif AttrName.startswith('_') and len(AttrName) > 1:
@@ -132,27 +124,23 @@ class AnnotationLoaderMixin:
FullName = f'{lib_name}.{PublicName}'
else:
FullName = PublicName
TypedefNode = SymbolNode.CreateClass(
name=PublicName,
TypeKind='typedef',
lineno=0
)
TypedefNode.set('OriginalType', attr().CName)
TypedefNode = CTypeInfo()
TypedefNode.Name = PublicName
TypedefNode.IsTypedef = True
TypedefNode.OriginalType = attr().CName
TypedefNode.set('source', 'annotation_module')
TypedefNode.set('library_name', lib_name)
TypedefNode.set('file', source_file)
self.SymbolTable[PublicName] = TypedefNode.attributes
TypedefNode.library_name = lib_name
TypedefNode.file = source_file
self.SymbolTable[PublicName] = TypedefNode
if lib_name and FullName != PublicName:
FullTypedef_node = SymbolNode.CreateClass(
name=FullName,
TypeKind='typedef',
lineno=0
)
FullTypedef_node.set('OriginalType', attr().CName)
FullTypedef_node = CTypeInfo()
FullTypedef_node.Name = FullName
FullTypedef_node.IsTypedef = True
FullTypedef_node.OriginalType = attr().CName
FullTypedef_node.set('source', 'annotation_module')
FullTypedef_node.set('library_name', lib_name)
FullTypedef_node.set('file', source_file)
self.SymbolTable[FullName] = FullTypedef_node.attributes
FullTypedef_node.library_name = lib_name
FullTypedef_node.file = source_file
self.SymbolTable[FullName] = FullTypedef_node
count += 1
return count
@@ -221,15 +209,13 @@ class AnnotationLoaderMixin:
# 这个类继承自 CType是 typedef 别名
# 更新符号表中的类型为 typedef
if ClassName in self.SymbolTable:
TypedefNode = SymbolNode.CreateClass(
name=ClassName,
TypeKind='typedef',
lineno=0
)
TypedefNode.set('OriginalType', self.SymbolTable[ClassName].get('OriginalType', f'struct {ClassName}'))
TypedefNode = CTypeInfo()
TypedefNode.Name = ClassName
TypedefNode.IsTypedef = True
TypedefNode.OriginalType = self.SymbolTable[ClassName].get('OriginalType', f'struct {ClassName}')
TypedefNode.set('source', 'annotation_module')
TypedefNode.set('is_ctype_subclass', True)
self.SymbolTable[ClassName] = TypedefNode.attributes
self.SymbolTable[ClassName] = TypedefNode
except Exception as _e:
from lib.core.VLogger import get_logger as _vlog
from lib.constants.config import mode as _ConfigMode
@@ -332,11 +318,9 @@ class AnnotationLoaderMixin:
if orig_with_prefix in self.SymbolTable:
# 添加带前缀的 typedef 别名
FullTypedef_name = f'{TypePrefix}.{TargetName}'
TypedefNode = SymbolNode.CreateClass(
name=FullTypedef_name,
TypeKind='typedef',
lineno=0
)
TypedefNode = CTypeInfo()
TypedefNode.Name = FullTypedef_name
TypedefNode.IsTypedef = True
orig_entry = self.SymbolTable.get(orig_with_prefix, {})
orig_type_str = f'struct {original_name}'
if isinstance(orig_entry, dict):
@@ -348,10 +332,10 @@ class AnnotationLoaderMixin:
orig_type_str = getattr(orig_entry, 'OriginalType', f'struct {original_name}')
elif hasattr(orig_entry, 'IsEnum') and orig_entry.IsEnum:
orig_type_str = f'enum {original_name}'
TypedefNode.set('OriginalType', orig_type_str)
TypedefNode.OriginalType = orig_type_str
TypedefNode.set('source', 'annotation_module')
TypedefNode.set('original_name', TargetName)
self.SymbolTable[FullTypedef_name] = TypedefNode.attributes
self.SymbolTable[FullTypedef_name] = TypedefNode
count += 1
self.AnnotationModules.add(lib_name)