[CastXML] Parsing class with nested struct definition.

Michka Popoff michkapopoff at gmail.com
Sat Mar 26 06:59:19 EDT 2016


Just a small comment on my code, the "if isinstance(var, declarations.variable_t)” checks
are not needed. I was on an experimental branch, were some stuff was broken.
The variables() method only returns variables; this check is superfluous.

Michka

> On 26 Mar 2016, at 11:27, Michka Popoff <michkapopoff at gmail.com> wrote:
> 
> Hi
> 
> as you discovered, the variables() method will return all the variables found
> under a specific node in the declarations tree.
> 
> I wrote a small example showing how to access the parent declaration of a variable.
> The loops at the end show how you could filter out the variables from the different
> classes/structs. The last one shows how to use the recursive=False option to get
> variables from the first level only.
> 
> I hope this helps.
> 
> Michka
> 
> 
> 
> 
> from pygccxml import utils
> from pygccxml import parser
> from pygccxml import declarations
> 
> generator_path, generator_name = utils.find_xml_generator()
> xml_generator_config = parser.xml_generator_configuration_t(
>    xml_generator_path=generator_path,
>    xml_generator=generator_name)
> 
> code = """class MyClass {
>   struct SomeStruct {
>      int structmem;
>   };
> 
>   SomeStruct classmem;
> };
>        """
> 
> decls = parser.parse_string(code, xml_generator_config)
> ns = declarations.get_global_namespace(decls)
> myclass = ns.classes()[0]
> somestruct = ns.classes()[0].classes()[0]
> 
> # MyClass [class]
> print(myclass)
> 
> # MyClass::SomeStruct [struct]
> print(somestruct)
> 
> # MyClass::SomeStruct::structmem [variable]
> print(myclass.classes()[0].variables()[0])
> 
> # MyClass::SomeStruct::structmem [variable]
> # MyClass::classmem [variable]
> for var in myclass.variables():
>    if isinstance(var, declarations.variable_t):
>        print(var)
> 
> # MyClass::SomeStruct [struct]
> print(myclass.classes()[0].variables()[0].parent)
> 
> # Found: MyClass::SomeStruct::structmem [variable]
> for var in myclass.variables():
>    if isinstance(var, declarations.variable_t):
>        if var.parent == somestruct:
>            print("Found: " + str(var))
> 
> # Found: MyClass::classmem [variable]
> for var in myclass.variables():
>    if isinstance(var, declarations.variable_t):
>        if var.parent == myclass:
>            print("Found: " + str(var))
> 
> # Found: MyClass::classmem [variable]
> for var in myclass.variables(recursive=False):
>    if isinstance(var, declarations.variable_t):
>        print("Found: " + str(var))
> 
>> On 26 Mar 2016, at 09:13, seshu yamajala <syamajala at gmail.com> wrote:
>> 
>> I'm trying to use pygccxml to auto-generate some C++. The problem I'm having is if I have a class like:
>> 
>> class MyClass {
>>   struct SomeStruct {
>>      int structmem;
>>   };
>> 
>>   SomeStruct classmem;
>> };
>> 
>> When I look at the variables of the MyClass declaration, its listing both structmem and classmem as members. Is there a way to tell that structmem is a member of SomeStruct and that SomeStruct was defined inside of MyClass?
>> 
>> _______________________________________________
>> CastXML mailing list
>> CastXML at public.kitware.com
>> http://public.kitware.com/mailman/listinfo/castxml
> 



More information about the CastXML mailing list