@@ -44,6 +44,12 @@ func buildToolLanguageInfoFromAPI() (map[string]domain.ToolLanguageInfo, error)
4444 languageExtensionsMap [strings .ToLower (langTool .Name )] = langTool .FileExtensions
4545 }
4646
47+ // Create map of language name to files
48+ languageFilesMap := make (map [string ][]string )
49+ for _ , langTool := range languageTools {
50+ languageFilesMap [strings .ToLower (langTool .Name )] = langTool .Files
51+ }
52+
4753 // Build tool language configurations from API data
4854 result := make (map [string ]domain.ToolLanguageInfo )
4955 supportedToolNames := make (map [string ]bool )
@@ -72,22 +78,33 @@ func buildToolLanguageInfoFromAPI() (map[string]domain.ToolLanguageInfo, error)
7278 Extensions : []string {},
7379 }
7480
75- // Build extensions from API language data
81+ // Build extensions and files from API language data
7682 extensionsSet := make (map [string ]struct {})
83+ filesSet := make (map [string ]struct {})
84+
7785 for _ , apiLang := range tool .Languages {
7886 lowerLang := strings .ToLower (apiLang )
7987 if extensions , exists := languageExtensionsMap [lowerLang ]; exists {
8088 for _ , ext := range extensions {
8189 extensionsSet [ext ] = struct {}{}
8290 }
8391 }
92+ if files , exists := languageFilesMap [lowerLang ]; exists {
93+ for _ , file := range files {
94+ filesSet [file ] = struct {}{}
95+ }
96+ }
8497 }
8598
86- // Convert set to sorted slice
99+ // Convert sets to sorted slices
87100 for ext := range extensionsSet {
88101 configTool .Extensions = append (configTool .Extensions , ext )
89102 }
90103 slices .Sort (configTool .Extensions )
104+ for file := range filesSet {
105+ configTool .Files = append (configTool .Files , file )
106+ }
107+ slices .Sort (configTool .Files )
91108
92109 // Sort languages alphabetically
93110 slices .Sort (configTool .Languages )
@@ -201,18 +218,6 @@ func CreateLanguagesConfigFile(apiTools []domain.Tool, toolsConfigDir string, to
201218
202219// buildRemoteModeLanguagesConfig builds the languages config for remote mode using repository languages as source of truth
203220func buildRemoteModeLanguagesConfig (apiTools []domain.Tool , toolIDMap map [string ]string , initFlags domain.InitFlags ) ([]domain.ToolLanguageInfo , error ) {
204- // Get language file extensions from API
205- languageTools , err := codacyclient .GetLanguageTools ()
206- if err != nil {
207- return nil , fmt .Errorf ("failed to get language tools from API: %w" , err )
208- }
209-
210- // Create map of language name to file extensions
211- languageExtensionsMap := make (map [string ][]string )
212- for _ , langTool := range languageTools {
213- languageExtensionsMap [strings .ToLower (langTool .Name )] = langTool .FileExtensions
214- }
215-
216221 // Get repository languages - this is the single source of truth for remote mode
217222 repositoryLanguages , err := getRepositoryLanguages (initFlags )
218223 if err != nil {
@@ -232,18 +237,36 @@ func buildRemoteModeLanguagesConfig(apiTools []domain.Tool, toolIDMap map[string
232237 Name : shortName ,
233238 Languages : []string {},
234239 Extensions : []string {},
240+ Files : []string {},
235241 }
236242
237243 // Use only languages that exist in the repository
238244 extensionsSet := make (map [string ]struct {})
245+ filesSet := make (map [string ]struct {})
239246
240247 for _ , lang := range tool .Languages {
241248 lowerLang := strings .ToLower (lang )
242- if repoExts , exists := repositoryLanguages [lowerLang ]; exists && len (repoExts ) > 0 {
243- configTool .Languages = append (configTool .Languages , lang )
244- // Add repository-specific extensions
245- for _ , ext := range repoExts {
246- extensionsSet [ext ] = struct {}{}
249+ if repoLang , exists := repositoryLanguages [lowerLang ]; exists {
250+ // Check if this language has either extensions or files
251+ hasExtensions := len (repoLang .Extensions ) > 0
252+ hasFiles := len (repoLang .Files ) > 0
253+
254+ if hasExtensions || hasFiles {
255+ configTool .Languages = append (configTool .Languages , lang )
256+
257+ // Add repository-specific extensions if they exist
258+ if hasExtensions {
259+ for _ , ext := range repoLang .Extensions {
260+ extensionsSet [ext ] = struct {}{}
261+ }
262+ }
263+
264+ // Add repository-specific files if they exist
265+ if hasFiles {
266+ for _ , file := range repoLang .Files {
267+ filesSet [file ] = struct {}{}
268+ }
269+ }
247270 }
248271 }
249272 }
@@ -254,6 +277,12 @@ func buildRemoteModeLanguagesConfig(apiTools []domain.Tool, toolIDMap map[string
254277 }
255278 slices .Sort (configTool .Extensions )
256279
280+ // Convert files set to sorted slice
281+ for file := range filesSet {
282+ configTool .Files = append (configTool .Files , file )
283+ }
284+ slices .Sort (configTool .Files )
285+
257286 // Sort languages alphabetically
258287 slices .Sort (configTool .Languages )
259288
@@ -264,14 +293,14 @@ func buildRemoteModeLanguagesConfig(apiTools []domain.Tool, toolIDMap map[string
264293 return configTools , nil
265294}
266295
267- func getRepositoryLanguages (initFlags domain.InitFlags ) (map [string ][] string , error ) {
296+ func getRepositoryLanguages (initFlags domain.InitFlags ) (map [string ]domain. Language , error ) {
268297 response , err := codacyclient .GetRepositoryLanguages (initFlags )
269298 if err != nil {
270299 return nil , fmt .Errorf ("failed to get repository languages: %w" , err )
271300 }
272301
273- // Create map to store language name -> combined extensions
274- result := make (map [string ][] string )
302+ // Create map to store language name -> Language struct
303+ result := make (map [string ]domain. Language )
275304
276305 // Filter and process languages
277306 for _ , lang := range response {
@@ -285,17 +314,32 @@ func getRepositoryLanguages(initFlags domain.InitFlags) (map[string][]string, er
285314 extensions [ext ] = struct {}{}
286315 }
287316
288- // Convert map to slice
317+ // Combine and deduplicate files
318+ files := make (map [string ]struct {})
319+ for _ , file := range lang .DefaultFiles {
320+ files [file ] = struct {}{}
321+ }
322+
323+ // Convert extension map to slice
289324 extSlice := make ([]string , 0 , len (extensions ))
290325 for ext := range extensions {
291326 extSlice = append (extSlice , ext )
292327 }
293-
294- // Sort extensions for consistent ordering in the config file
295328 slices .Sort (extSlice )
296329
330+ // Convert files map to slice
331+ fileSlice := make ([]string , 0 , len (files ))
332+ for file := range files {
333+ fileSlice = append (fileSlice , file )
334+ }
335+ slices .Sort (fileSlice )
336+
297337 // Add to result map with lowercase key for case-insensitive matching
298- result [strings .ToLower (lang .Name )] = extSlice
338+ result [strings .ToLower (lang .Name )] = domain.Language {
339+ Name : lang .Name ,
340+ Extensions : extSlice ,
341+ Files : fileSlice ,
342+ }
299343 }
300344 }
301345
0 commit comments