gccxmlparser.py
来自「Boost provides free peer-reviewed portab」· Python 代码 · 共 475 行 · 第 1/2 页
PY
475 行
instances. The first tuple is the most direct inheritance, and then it goes up in the hierarchy. ''' if bases is None: return [] base_names = bases.split() this_level = [] next_levels = [] for base in base_names: # get the visibility split = base.split(':') if len(split) == 2: visib = split[0] base = split[1] else: visib = Scope.public decl = self.GetDecl(base) if not isinstance(decl, Class): # on windows, there are some classes which "bases" points to an # "Unimplemented" tag, but we are not interested in this classes # anyway continue base = Base(decl.FullName(), visib) this_level.append(base) # normalize with the other levels for index, level in enumerate(decl.hierarchy): if index < len(next_levels): next_levels[index] = next_levels[index] + level else: next_levels.append(level) hierarchy = [] if this_level: hierarchy.append(tuple(this_level)) if next_levels: hierarchy.extend(next_levels) return hierarchy def GetMembers(self, member_list): # members must be a string with the ids of the members if member_list is None: return [] members = [] for member in member_list.split(): decl = self.GetDecl(member) if type(decl) in Class.ValidMemberTypes(): members.append(decl) return members def ParseClass(self, id, element): name = element.get('name') abstract = bool(int(element.get('abstract', '0'))) location = self.GetLocation(element.get('location')) context = self.GetDecl(element.get('context')) incomplete = bool(int(element.get('incomplete', 0))) if isinstance(context, str): class_ = Class(name, context, [], abstract) else: # a nested class visib = element.get('access', Scope.public) class_ = NestedClass( name, context.FullName(), visib, [], abstract) class_.incomplete = incomplete # we have to add the declaration of the class before trying # to parse its members and bases, to avoid recursion. self.AddDecl(class_) class_.location = location self.Update(id, class_) # now we can get the members and the bases class_.hierarchy = self.GetHierarchy(element.get('bases')) if class_.hierarchy: class_.bases = class_.hierarchy[0] members = self.GetMembers(element.get('members')) for member in members: class_.AddMember(member) def ParseStruct(self, id, element): self.ParseClass(id, element) FUNDAMENTAL_RENAME = { 'long long int' : 'boost::int64_t', 'long long unsigned int' : 'boost::uint64_t', } def ParseFundamentalType(self, id, element): name = element.get('name') name = self.FUNDAMENTAL_RENAME.get(name, name) type_ = FundamentalType(name) self.Update(id, type_) def ParseArrayType(self, id, element): type = self.GetType(element.get('type')) min = element.get('min') max = element.get('max') array = ArrayType(type.name, type.const, min, max) self.Update(id, array) def ParseReferenceType(self, id, element): type = self.GetType(element.get('type')) expand = not isinstance(type, FunctionType) ref = ReferenceType(type.name, type.const, None, expand, type.suffix) self.Update(id, ref) def ParsePointerType(self, id, element): type = self.GetType(element.get('type')) expand = not isinstance(type, FunctionType) ref = PointerType(type.name, type.const, None, expand, type.suffix) self.Update(id, ref) def ParseFunctionType(self, id, element): result = self.GetType(element.get('returns')) args = self.GetArguments(element) func = FunctionType(result, args) self.Update(id, func) def ParseMethodType(self, id, element): class_ = self.GetDecl(element.get('basetype')).FullName() result = self.GetType(element.get('returns')) args = self.GetArguments(element) method = MethodType(result, args, class_) self.Update(id, method) def ParseField(self, id, element): name = element.get('name') visib = element.get('access', Scope.public) classname = self.GetDecl(element.get('context')).FullName() type_ = self.GetType(element.get('type')) static = bool(int(element.get('extern', '0'))) location = self.GetLocation(element.get('location')) var = ClassVariable(type_, name, classname, visib, static) var.location = location self.Update(id, var) def ParseMethod(self, id, element, methodType=Method): name = element.get('name') result = self.GetType(element.get('returns')) classname = self.GetDecl(element.get('context')).FullName() visib = element.get('access', Scope.public) static = bool(int(element.get('static', '0'))) virtual = bool(int(element.get('virtual', '0'))) abstract = bool(int(element.get('pure_virtual', '0'))) const = bool(int(element.get('const', '0'))) location = self.GetLocation(element.get('location')) throws = self.GetExceptions(element.get('throw', None)) params = self.GetArguments(element) method = methodType( name, classname, result, params, visib, virtual, abstract, static, const, throws) method.location = location self.Update(id, method) def ParseOperatorMethod(self, id, element): self.ParseMethod(id, element, ClassOperator) def ParseConstructor(self, id, element): name = element.get('name') visib = element.get('access', Scope.public) classname = self.GetDecl(element.get('context')).FullName() location = self.GetLocation(element.get('location')) params = self.GetArguments(element) artificial = element.get('artificial', False) ctor = Constructor(name, classname, params, visib) ctor.location = location self.Update(id, ctor) def ParseDestructor(self, id, element): name = element.get('name') visib = element.get('access', Scope.public) classname = self.GetDecl(element.get('context')).FullName() virtual = bool(int(element.get('virtual', '0'))) location = self.GetLocation(element.get('location')) des = Destructor(name, classname, visib, virtual) des.location = location self.Update(id, des) def ParseConverter(self, id, element): self.ParseMethod(id, element, ConverterOperator) def ParseTypedef(self, id, element): name = element.get('name') type = self.GetType(element.get('type')) context = self.GetDecl(element.get('context')) if isinstance(context, Class): context = context.FullName() typedef = Typedef(type, name, context) self.Update(id, typedef) self.AddDecl(typedef) def ParseEnumeration(self, id, element): name = element.get('name') location = self.GetLocation(element.get('location')) context = self.GetDecl(element.get('context')) incomplete = bool(int(element.get('incomplete', 0))) if isinstance(context, str): enum = Enumeration(name, context) else: visib = element.get('access', Scope.public) enum = ClassEnumeration(name, context.FullName(), visib) self.AddDecl(enum) enum.location = location for child in element: if child.tag == 'EnumValue': name = child.get('name') value = int(child.get('init')) enum.values[name] = value enum.incomplete = incomplete self.Update(id, enum)def ParseDeclarations(filename): 'Returns a list of the top declarations found in the gcc_xml file.' parser = GCCXMLParser() parser.Parse(filename) return parser.Declarations()if __name__ == '__main__': ParseDeclarations(r'D:\Programming\Libraries\boost-cvs\boost\libs\python\pyste\example\test.xml')
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?