From 7c839e724571d91cc59fe71ccf00c35296b182b2 Mon Sep 17 00:00:00 2001 From: Richard Simison Date: Sun, 3 May 2026 14:27:52 -0400 Subject: [PATCH 1/3] Added the ability to supply your own languages.json file which is then used to override any internal language or augment it. To run SCC with the new flag input ./scc --languages-file custom.json (filename) --- main.go | 7 +++++++ processor/processor.go | 19 +++++++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/main.go b/main.go index dac0c57c0..886a7d955 100644 --- a/main.go +++ b/main.go @@ -538,6 +538,13 @@ func main() { "start as an MCP (Model Context Protocol) server over stdio", ) + flags.StringVar( + &processor.LanguagesFile, + "languages-file", + "", + "path to a custom languages.json file to augment or override built-in languages", + ) + // If invoked in the format of "scc completion --shell [name of shell]", generate command line completions instead. // With the --shell option, unintentionally triggering shell completions should be highly unlikely. args := os.Args diff --git a/processor/processor.go b/processor/processor.go index 2ac57a4b0..c8771cecc 100644 --- a/processor/processor.go +++ b/processor/processor.go @@ -3,6 +3,7 @@ package processor import ( + "encoding/json" "fmt" "io" "os" @@ -146,6 +147,9 @@ var RemapUnknown = "" // RemapAll allows remapping of all files with a string to search the content for var RemapAll = "" +// LanguagesFile is the path to a custom languages.json file +var LanguagesFile = "" + type remapRule struct { pattern []byte language string @@ -324,6 +328,21 @@ func ConfigureLazy(lazy bool) { // Needs to be called at least once in order for anything to actually happen func ProcessConstants() { startTime := makeTimestampNano() + if LanguagesFile != "" { + data, err := os.ReadFile(LanguagesFile) + if err != nil { + printError("failed to read languages file: " + err.Error()) + } else { + var customLanguages map[string]Language + if err := json.Unmarshal(data, &customLanguages); err != nil { + printError("failed to parse languages file: " + err.Error()) + } else { + for name, lang := range customLanguages { + languageDatabase[name] = lang + } + } + } + } for name, value := range languageDatabase { for _, ext := range value.Extensions { ExtensionToLanguage[ext] = append(ExtensionToLanguage[ext], name) From 11639f3b5464e393eaa73769781de601f3246fc2 Mon Sep 17 00:00:00 2001 From: Rayze-B Date: Tue, 5 May 2026 20:31:21 -0400 Subject: [PATCH 2/3] Added test to confirm languages.json files. --- processor/processor_test.go | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/processor/processor_test.go b/processor/processor_test.go index b469ff5d7..6069192de 100644 --- a/processor/processor_test.go +++ b/processor/processor_test.go @@ -3,6 +3,8 @@ package processor import ( + "encoding/json" + "os" "strings" "testing" ) @@ -154,3 +156,14 @@ func TestSetupCountAsMultiple(t *testing.T) { CountAs = "" } +func TestLanguagesFileIsValidJSON(t *testing.T) { + data, err := os.ReadFile("../languages.json") + if err != nil { + t.Fatal("failed to read languages.json", err) + } + + var languages map[string]Language + if err := json.Unmarshal(data, &languages); err != nil { + t.Error("languages.json is not valid JSON", err) + } +} From 2ae311195cc1d75876979d6fd58bb976355f501f Mon Sep 17 00:00:00 2001 From: m39johnsonm Date: Tue, 5 May 2026 20:36:23 -0400 Subject: [PATCH 3/3] Add test case for invalid JSON in languages.json file --- processor/processor_test.go | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/processor/processor_test.go b/processor/processor_test.go index 6069192de..2b11ca9df 100644 --- a/processor/processor_test.go +++ b/processor/processor_test.go @@ -5,6 +5,7 @@ package processor import ( "encoding/json" "os" + "path/filepath" "strings" "testing" ) @@ -167,3 +168,13 @@ func TestLanguagesFileIsValidJSON(t *testing.T) { t.Error("languages.json is not valid JSON", err) } } + +func TestLanguagesFileInvalidJSON(t *testing.T) { + dir, _ := os.MkdirTemp("", "test-languages") + langFile := filepath.Join(dir, "languages.json") + _ = os.WriteFile(langFile, []byte(`not valid json`), 0644) + + LanguagesFile = langFile + // should not panic + ProcessConstants() +}