code: func (c *Config) ProviderTypes() []string {
  	m := make(map[string]struct{})
  	c.gatherProviderTypes(m)
  
  	ret := make([]string, 0, len(m))
  	for k := range m {
  		ret = append(ret, k)
  	}
  	sort.Strings(ret)
  	return ret
  }
docs: // ProviderTypes returns the names of each distinct provider type referenced
  // in the receiving configuration.
  //
  // This is a helper for easily determining which provider types are required
  // to fully interpret the configuration, though it does not include version
  // information and so callers are expected to have already dealt with
  // provider version selection in an earlier step and have identified suitable
  // versions for each provider.