145 def visit(self, typename, visitor=None, ctx=None):
146 self.msg.
verbose(
"=== visiting %s", typename)
147 if ctx is None:
149 if isinstance (typename, str):
150 rflx_type = self.load_type (typename)
151 typename = rflx_type.Name (RflxEnums.DICTSCOPE)
152 else:
153 rflx_type = typename
154
155 if not rflx_type:
156 self.msg.
verbose(
"**warning** no dict for [%s] !!", typename)
157 return ctx
158
159 ctx.add (typename)
160 if visitor:
161 visitor (rflx_type)
162
163 if rflx_type.IsClass() or rflx_type.IsStruct():
164 for i in range(rflx_type.BaseSize()):
165 itype = rflx_type.BaseAt(i).ToType()
166 itype_name = itype.Name(RflxEnums.DICTSCOPE)
167 if itype_name != '' and not (itype_name in ctx):
168 self.load_type (itype_name)
169 ctx.add (itype_name)
170 ctx.update (self.visit (itype, visitor, ctx))
171
172 for i in range(rflx_type.DataMemberSize()):
173 itype = rflx_type.DataMemberAt (i).TypeOf()
174 itype = itype.RawType() if itype.IsPointer() else itype
175 itype_name = itype.Name(RflxEnums.DICTSCOPE)
176 if itype_name != '' and not (itype_name in ctx):
177 self.load_type (itype_name)
178 ctx.add (itype_name)
179
180 itype = rflx_type.DataMemberAt (i).TypeOf()
181 itype_name = itype.Name(RflxEnums.DICTSCOPE)
182 ctx.update (self.visit (itype, visitor, ctx))
183 return ctx
184