Quintiq file version 2.0
#parent: #root
Method GetLeafTypes (
  internal[Type] root,
  internal[Type] excludetype
) as structured[internal[Type]] id:Method_LibOpt_DialogConditionalTypes_GetLeafTypes
{
  #keys: '[143908.0.758167613]'
  Body:
  [*
    // Get all leaf types of the 'root' type. 
    // A type is a leaf type of some root type if the leaf type is non-abstract and if the type is an (indirect) subtype of the root type. 
    // The 'excludetype' type (and all subclasses of that type) are excluded from the set of leaf types.  
    
    leafs := construct( structured[internal[Type]] );
    
    // The LibOpt_Breakpoint type and all LibOpt_DatasetCopyConditionalNotSelectable subtypes (e.g. LibOpt_DatasetCopyUnconditional) are excluded because of this if-statement.
    if( root <> excludetype )
    {
      // recursion end: roottype is a leaf.
      if( root.Specializations( relsize ) = 0 )
      {
        leafs.Add( root );
      }
      else
      {
        // recursive calls: the root's leafs are the union of its childrens' leafs:
        traverse( root, Specializations, child )
        {
          leafs := leafs.Union( this.GetLeafTypes( child, excludetype ) );
        }
      }
    }
    return & leafs;
  *]
  ReturnsOwning: true
}
