func recognizeDirLanguages()

in internal/platform/commoncontext/configurator.go [58:142]


func recognizeDirLanguages(projectPath string) ([]string, error) {
	const limitKb = 64
	out := make(map[string]int)
	err := filepath.Walk(
		projectPath, func(path string, f os.FileInfo, err error) error {
			if err != nil {
				return filepath.SkipDir
			}

			if f.Mode().IsDir() && !f.Mode().IsRegular() {
				return nil
			}

			relpath, err := filepath.Rel(projectPath, path)
			relpath = filepath.ToSlash(relpath) // enry always uses forward slashes for regex matching
			if err != nil {
				return nil
			}

			if relpath == "." {
				return nil
			}

			if f.IsDir() {
				relpath += "/"
			}
			if isInIgnoredDirectory(path) || enry.IsVendor(relpath) || enry.IsDotFile(relpath) ||
				enry.IsDocumentation(relpath) || enry.IsConfiguration(relpath) ||
				enry.IsGenerated(relpath, nil) {
				if f.IsDir() {
					return filepath.SkipDir
				}
				return nil
			}

			if f.IsDir() {
				return nil
			}

			content, err := readFile(path, limitKb)
			if err != nil {
				return nil
			}

			if enry.IsGenerated(relpath, content) {
				return nil
			}

			language := enry.GetLanguage(filepath.Base(path), content)
			if language == enry.OtherLanguage {
				return nil
			}

			if enry.GetLanguageType(language) != enry.Programming {
				return nil
			}

			out[language] += 1
			return nil
		},
	)
	if err != nil {
		return nil, err
	}
	type languageCount struct {
		Language string
		Count    int
	}
	langCounts := make([]languageCount, 0, len(out))
	for language, count := range out {
		langCounts = append(langCounts, languageCount{Language: language, Count: count})
	}
	sort.Slice(
		langCounts, func(i, j int) bool {
			return langCounts[i].Count > langCounts[j].Count
		},
	)
	languages := make([]string, 0, len(langCounts))
	for _, langCount := range langCounts {
		languages = append(languages, langCount.Language)
	}

	slices.Sort(languages)
	return languages, nil
}