code: def viable_source_types_for_generator_real (generator):
      
      assert isinstance(generator, Generator)
      source_types = generator.source_types ()
  
      if not source_types:
          # If generator does not specify any source types,
          # it might be special generator like builtin.lib-generator
          # which just relays to other generators. Return '*' to
          # indicate that any source type is possibly OK, since we don't
          # know for sure.
          return ['*']
  
      else:
          result = []
          for s in source_types:
              viable_sources = viable_source_types(s)
              if viable_sources == "*":
                  result = ["*"]
                  break
              else:
                  result.extend(type.all_derived(s) + viable_sources)
          return unique(result)
docs: Returns the list of source types, which, when passed to 'run'
          method of 'generator', has some change of being eventually used
          (probably after conversion by other generators)