def list_type(cls):
        """
        Return an ASTNode subclass that represent a list of "cls".
        """
        element_type = cls

        def add_to_context(cls):
            if cls in get_context().types:
                return
            get_context().types.add(cls)
            get_context().list_types.add(cls.element_type())

            # Make sure the type this list contains is already declared
            cls.element_type().add_to_context()

        return type(
            '{}ListType'.format(element_type.name()),
            (StructMetaClass.root_grammar_class, ), {
                'is_ptr':
                True,
                'name':
                classmethod(
                    lambda cls: names.Name('List') + cls.element_type().name()
                ),
                'add_to_context':
                classmethod(add_to_context),
                'nullexpr':
                classmethod(lambda cls: null_constant()),
                'is_list_type':
                True,
                'is_collection':
                classmethod(lambda cls: True),
                'element_type':
                classmethod(lambda cls: element_type),
            })
 def nullexpr(cls):
     """
     Return a value that can be considered as "null" for this AST node type.
     It indicates the absence of AST node.
     """
     if cls.is_ptr:
         return null_constant()
     else:
         return names.Name('No') + cls.name()
 def nullexpr(cls):
     null_constant()