阶段 2 完成
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -6,7 +6,6 @@ import re
|
||||
import llvmlite.ir as ir
|
||||
|
||||
from lib.core.LlvmCodeGenerator import LlvmCodeGenerator
|
||||
from lib.core.SymbolNode import SymbolNode
|
||||
from lib.core.Handles.HandlesBase import CTypeInfo
|
||||
from lib.includes import t
|
||||
from lib.constants.config import mode as _config_mode
|
||||
@@ -368,15 +367,13 @@ class LlvmGeneratorMixin:
|
||||
|
||||
if IsTypedef:
|
||||
TypedefKey = TypedefName if TypedefName else ClassName
|
||||
TypedefNode = SymbolNode.CreateClass(
|
||||
name=TypedefKey,
|
||||
TypeKind='typedef',
|
||||
lineno=0
|
||||
)
|
||||
TypedefNode.set('OriginalType', f'struct {ClassName}')
|
||||
TypedefNode = CTypeInfo()
|
||||
TypedefNode.Name = TypedefKey
|
||||
TypedefNode.IsTypedef = True
|
||||
TypedefNode.OriginalType = f'struct {ClassName}'
|
||||
TypedefNode.set('IsComplete', True)
|
||||
TypedefNode.set('file', '<stdin>')
|
||||
self.SymbolTable[TypedefKey] = TypedefNode.attributes
|
||||
TypedefNode.file = '<stdin>'
|
||||
self.SymbolTable[TypedefKey] = TypedefNode
|
||||
|
||||
for item in Node.body:
|
||||
if isinstance(item, ast.AnnAssign) and isinstance(item.target, ast.Name):
|
||||
@@ -412,27 +409,23 @@ class LlvmGeneratorMixin:
|
||||
self.LogWarning(f"异常被忽略: {_e}")
|
||||
|
||||
if not IsTypedef:
|
||||
StructNode = SymbolNode.CreateClass(
|
||||
name=ClassName,
|
||||
TypeKind='struct',
|
||||
members=members,
|
||||
lineno=0
|
||||
)
|
||||
StructNode.set('file', '<stdin>')
|
||||
StructNode = CTypeInfo()
|
||||
StructNode.Name = ClassName
|
||||
StructNode.IsStruct = True
|
||||
StructNode.Members = members or {}
|
||||
StructNode.file = '<stdin>'
|
||||
if ClassName in self.SymbolTable:
|
||||
existing = self.SymbolTable[ClassName]
|
||||
if hasattr(existing, 'IsCpythonObject') and existing.IsCpythonObject:
|
||||
StructNode.set('IsCpythonObject', True)
|
||||
self.SymbolTable[ClassName] = StructNode.attributes
|
||||
StructNode.IsCpythonObject = True
|
||||
self.SymbolTable[ClassName] = StructNode
|
||||
elif isinstance(Node, ast.FunctionDef):
|
||||
FuncName = Node.name
|
||||
FuncNode = SymbolNode.CreateClass(
|
||||
name=FuncName,
|
||||
TypeKind='function',
|
||||
lineno=0
|
||||
)
|
||||
FuncNode.set('file', '<stdin>')
|
||||
self.SymbolTable[FuncName] = FuncNode.attributes
|
||||
FuncNode = CTypeInfo()
|
||||
FuncNode.Name = FuncName
|
||||
FuncNode.IsFunction = True
|
||||
FuncNode.file = '<stdin>'
|
||||
self.SymbolTable[FuncName] = FuncNode
|
||||
elif isinstance(Node, ast.AnnAssign):
|
||||
if isinstance(Node.target, ast.Name):
|
||||
VarName = Node.target.id
|
||||
@@ -470,39 +463,33 @@ class LlvmGeneratorMixin:
|
||||
else:
|
||||
actual_type = 'struct'
|
||||
if actual_type == 'enum':
|
||||
TypedefNode = SymbolNode.CreateClass(
|
||||
name=VarName,
|
||||
TypeKind='typedef',
|
||||
lineno=0
|
||||
)
|
||||
TypedefNode.set('OriginalType', f'enum {OriginalType}')
|
||||
TypedefNode.set('file', '<stdin>')
|
||||
self.SymbolTable[VarName] = TypedefNode.attributes
|
||||
TypedefNode = CTypeInfo()
|
||||
TypedefNode.Name = VarName
|
||||
TypedefNode.IsTypedef = True
|
||||
TypedefNode.OriginalType = f'enum {OriginalType}'
|
||||
TypedefNode.file = '<stdin>'
|
||||
self.SymbolTable[VarName] = TypedefNode
|
||||
elif actual_type == 'typedef':
|
||||
TypedefNode = SymbolNode.CreateClass(
|
||||
name=VarName,
|
||||
TypeKind='typedef',
|
||||
lineno=0
|
||||
)
|
||||
TypedefNode = CTypeInfo()
|
||||
TypedefNode.Name = VarName
|
||||
TypedefNode.IsTypedef = True
|
||||
if isinstance(OriginalInfo, dict):
|
||||
TypedefNode.set('OriginalType', OriginalInfo.get('OriginalType', f'struct {OriginalType}'))
|
||||
TypedefNode.OriginalType = OriginalInfo.get('OriginalType', f'struct {OriginalType}')
|
||||
elif isinstance(OriginalInfo, CTypeInfo) and OriginalInfo.OriginalType:
|
||||
TypedefNode.set('OriginalType', OriginalInfo.OriginalType)
|
||||
TypedefNode.OriginalType = OriginalInfo.OriginalType
|
||||
else:
|
||||
TypedefNode.set('OriginalType', f'struct {OriginalType}')
|
||||
TypedefNode.OriginalType = f'struct {OriginalType}'
|
||||
TypedefNode.set('PendingTypedef', True)
|
||||
TypedefNode.set('file', '<stdin>')
|
||||
self.SymbolTable[VarName] = TypedefNode.attributes
|
||||
TypedefNode.file = '<stdin>'
|
||||
self.SymbolTable[VarName] = TypedefNode
|
||||
else:
|
||||
TypedefNode = SymbolNode.CreateClass(
|
||||
name=VarName,
|
||||
TypeKind='typedef',
|
||||
lineno=0
|
||||
)
|
||||
TypedefNode.set('OriginalType', f'struct {OriginalType}')
|
||||
TypedefNode = CTypeInfo()
|
||||
TypedefNode.Name = VarName
|
||||
TypedefNode.IsTypedef = True
|
||||
TypedefNode.OriginalType = f'struct {OriginalType}'
|
||||
TypedefNode.set('PendingTypedef', True)
|
||||
TypedefNode.set('file', '<stdin>')
|
||||
self.SymbolTable[VarName] = TypedefNode.attributes
|
||||
TypedefNode.file = '<stdin>'
|
||||
self.SymbolTable[VarName] = TypedefNode
|
||||
self.GeneratedTypes.add(VarName)
|
||||
continue
|
||||
else:
|
||||
@@ -522,48 +509,42 @@ class LlvmGeneratorMixin:
|
||||
else:
|
||||
actual_type = 'struct'
|
||||
if actual_type == 'typedef':
|
||||
TypedefNode = SymbolNode.CreateClass(
|
||||
name=VarName,
|
||||
TypeKind='typedef',
|
||||
lineno=0
|
||||
)
|
||||
TypedefNode = CTypeInfo()
|
||||
TypedefNode.Name = VarName
|
||||
TypedefNode.IsTypedef = True
|
||||
if isinstance(OriginalInfo, dict):
|
||||
TypedefNode.set('OriginalType', OriginalInfo.get('OriginalType', f'struct {OriginalType}'))
|
||||
TypedefNode.OriginalType = OriginalInfo.get('OriginalType', f'struct {OriginalType}')
|
||||
elif isinstance(OriginalInfo, CTypeInfo) and OriginalInfo.OriginalType:
|
||||
TypedefNode.set('OriginalType', OriginalInfo.OriginalType)
|
||||
TypedefNode.OriginalType = OriginalInfo.OriginalType
|
||||
else:
|
||||
TypedefNode.set('OriginalType', f'struct {OriginalType}')
|
||||
TypedefNode.OriginalType = f'struct {OriginalType}'
|
||||
TypedefNode.set('PendingTypedef', True)
|
||||
TypedefNode.set('file', '<stdin>')
|
||||
self.SymbolTable[VarName] = TypedefNode.attributes
|
||||
TypedefNode.file = '<stdin>'
|
||||
self.SymbolTable[VarName] = TypedefNode
|
||||
self.GeneratedTypes.add(VarName)
|
||||
if isinstance(OriginalInfo, dict):
|
||||
OriginalInfo['skip_generation'] = True
|
||||
continue
|
||||
elif actual_type == 'struct':
|
||||
TypedefNode = SymbolNode.CreateClass(
|
||||
name=VarName,
|
||||
TypeKind='typedef',
|
||||
lineno=0
|
||||
)
|
||||
TypedefNode.set('OriginalType', f'struct {OriginalType}')
|
||||
TypedefNode = CTypeInfo()
|
||||
TypedefNode.Name = VarName
|
||||
TypedefNode.IsTypedef = True
|
||||
TypedefNode.OriginalType = f'struct {OriginalType}'
|
||||
TypedefNode.set('PendingTypedef', True)
|
||||
TypedefNode.set('file', '<stdin>')
|
||||
self.SymbolTable[VarName] = TypedefNode.attributes
|
||||
TypedefNode.file = '<stdin>'
|
||||
self.SymbolTable[VarName] = TypedefNode
|
||||
self.GeneratedTypes.add(VarName)
|
||||
if isinstance(OriginalInfo, dict):
|
||||
OriginalInfo['skip_generation'] = True
|
||||
continue
|
||||
elif actual_type == 'enum':
|
||||
TypedefNode = SymbolNode.CreateClass(
|
||||
name=VarName,
|
||||
TypeKind='typedef',
|
||||
lineno=0
|
||||
)
|
||||
TypedefNode.set('OriginalType', f'enum {OriginalType}')
|
||||
TypedefNode = CTypeInfo()
|
||||
TypedefNode.Name = VarName
|
||||
TypedefNode.IsTypedef = True
|
||||
TypedefNode.OriginalType = f'enum {OriginalType}'
|
||||
TypedefNode.set('PendingTypedef', True)
|
||||
TypedefNode.set('file', '<stdin>')
|
||||
self.SymbolTable[VarName] = TypedefNode.attributes
|
||||
TypedefNode.file = '<stdin>'
|
||||
self.SymbolTable[VarName] = TypedefNode
|
||||
self.GeneratedTypes.add(VarName)
|
||||
if isinstance(OriginalInfo, dict):
|
||||
OriginalInfo['skip_generation'] = True
|
||||
@@ -572,14 +553,12 @@ class LlvmGeneratorMixin:
|
||||
from lib.core.Handles.HandlesBase import CTypeHelper
|
||||
CName = CTypeHelper.GetCName(Node.value.attr)
|
||||
if CName:
|
||||
TypedefNode = SymbolNode.CreateClass(
|
||||
name=VarName,
|
||||
TypeKind='typedef',
|
||||
lineno=0
|
||||
)
|
||||
TypedefNode.set('OriginalType', CName)
|
||||
TypedefNode.set('file', '<stdin>')
|
||||
self.SymbolTable[VarName] = TypedefNode.attributes
|
||||
TypedefNode = CTypeInfo()
|
||||
TypedefNode.Name = VarName
|
||||
TypedefNode.IsTypedef = True
|
||||
TypedefNode.OriginalType = CName
|
||||
TypedefNode.file = '<stdin>'
|
||||
self.SymbolTable[VarName] = TypedefNode
|
||||
self.GeneratedTypes.add(VarName)
|
||||
continue
|
||||
|
||||
@@ -590,14 +569,12 @@ class LlvmGeneratorMixin:
|
||||
except Exception as _e:
|
||||
if __import__('lib.constants.config', fromlist=['mode']).mode == "strict":
|
||||
self.LogWarning(f"异常被忽略: {_e}")
|
||||
var_node = SymbolNode.CreateClass(
|
||||
name=VarName,
|
||||
TypeKind='variable',
|
||||
lineno=0
|
||||
)
|
||||
var_node.set('IsPtr', IsPtr)
|
||||
var_node.set('file', '<stdin>')
|
||||
self.SymbolTable[VarName] = var_node.attributes
|
||||
var_node = CTypeInfo()
|
||||
var_node.Name = VarName
|
||||
var_node.IsVariable = True
|
||||
var_node.PtrCount = 1 if IsPtr else 0
|
||||
var_node.file = '<stdin>'
|
||||
self.SymbolTable[VarName] = var_node
|
||||
|
||||
self.LlvmGen = LlvmCodeGenerator(
|
||||
triple=getattr(self, 'triple', None),
|
||||
|
||||
@@ -7,7 +7,6 @@ import json
|
||||
import struct
|
||||
|
||||
from lib.utils.helpers import DetectFileType
|
||||
from lib.core.SymbolNode import SymbolNode
|
||||
from lib.core.Handles.HandlesBase import CTypeInfo
|
||||
from lib.includes import t
|
||||
from lib.constants.config import mode as _ConfigMode
|
||||
@@ -325,13 +324,11 @@ class PythonParserMixin:
|
||||
|
||||
if IsCenum:
|
||||
# 注册为 enum 类型
|
||||
EnumNode = SymbolNode.CreateClass(
|
||||
name=ClassName,
|
||||
TypeKind='enum',
|
||||
lineno=0
|
||||
)
|
||||
EnumNode = CTypeInfo()
|
||||
EnumNode.Name = ClassName
|
||||
EnumNode.IsEnum = True
|
||||
EnumNode.set('file', '<stdin>')
|
||||
self.SymbolTable[ClassName] = EnumNode.attributes
|
||||
self.SymbolTable[ClassName] = EnumNode
|
||||
|
||||
# 注册 enum 成员
|
||||
for item in node.body:
|
||||
@@ -393,25 +390,21 @@ class PythonParserMixin:
|
||||
if _ConfigMode == "strict":
|
||||
raise
|
||||
_vlog().warning(f"解析结构体成员失败: {_e}", "Exception")
|
||||
StructNode = SymbolNode.CreateClass(
|
||||
name=ClassName,
|
||||
TypeKind='struct',
|
||||
members=members,
|
||||
lineno=0,
|
||||
IsCpythonObject=IsCpythonObject
|
||||
)
|
||||
StructNode = CTypeInfo()
|
||||
StructNode.Name = ClassName
|
||||
StructNode.IsStruct = True
|
||||
StructNode.Members = members or {}
|
||||
StructNode.set('file', '<stdin>')
|
||||
StructNode.set('IsAnonymous', IsAnonymous)
|
||||
self.SymbolTable[ClassName] = StructNode.attributes
|
||||
StructNode.set('IsCpythonObject', IsCpythonObject)
|
||||
self.SymbolTable[ClassName] = StructNode
|
||||
elif isinstance(node, ast.FunctionDef):
|
||||
FuncName = node.name
|
||||
FuncNode = SymbolNode.CreateClass(
|
||||
name=FuncName,
|
||||
TypeKind='function',
|
||||
lineno=0
|
||||
)
|
||||
FuncNode = CTypeInfo()
|
||||
FuncNode.Name = FuncName
|
||||
FuncNode.IsFunction = True
|
||||
FuncNode.set('file', '<stdin>')
|
||||
self.SymbolTable[FuncName] = FuncNode.attributes
|
||||
self.SymbolTable[FuncName] = FuncNode
|
||||
elif isinstance(node, ast.AnnAssign):
|
||||
if isinstance(node.target, ast.Name):
|
||||
VarName = node.target.id
|
||||
@@ -445,14 +438,12 @@ class PythonParserMixin:
|
||||
if _ConfigMode == "strict":
|
||||
raise
|
||||
_vlog().warning(f"获取类型信息失败(ParsePythonFile): {_e}", "Exception")
|
||||
var_node = SymbolNode.CreateClass(
|
||||
name=VarName,
|
||||
TypeKind='variable',
|
||||
lineno=0
|
||||
)
|
||||
var_node = CTypeInfo()
|
||||
var_node.Name = VarName
|
||||
var_node.IsVariable = True
|
||||
var_node.set('IsPtr', IsPtr)
|
||||
var_node.set('file', '<stdin>')
|
||||
self.SymbolTable[VarName] = var_node.attributes
|
||||
self.SymbolTable[VarName] = var_node
|
||||
except Exception as e:
|
||||
print(f'Warning: Failed to parse Python file {FilePath}: {e}')
|
||||
|
||||
|
||||
Reference in New Issue
Block a user