Skip to content

Commit 4330bc6

Browse files
committed
Detect Forth over F#
1 parent ab3d4e7 commit 4330bc6

File tree

6 files changed

+19
-115
lines changed

6 files changed

+19
-115
lines changed

pkg/language/forth.go

Lines changed: 0 additions & 33 deletions
This file was deleted.

pkg/language/fsharp.go

Lines changed: 0 additions & 26 deletions
This file was deleted.

pkg/language/language.go

Lines changed: 12 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,10 @@ package language
33
import (
44
"context"
55
"fmt"
6-
"io"
76
"os"
87
"path/filepath"
98
"strings"
109

11-
"github.com/wakatime/wakatime-cli/pkg/file"
1210
"github.com/wakatime/wakatime-cli/pkg/heartbeat"
1311
"github.com/wakatime/wakatime-cli/pkg/log"
1412
)
@@ -63,6 +61,8 @@ func WithDetection(config Config) heartbeat.HandleOption {
6361
// Detect detects the language of a specific file. If guessLanguage is true,
6462
// Chroma will be used to detect a language from the file contents.
6563
func Detect(ctx context.Context, fp string, guessLanguage bool) (heartbeat.Language, error) {
64+
logger := log.Extract(ctx)
65+
6666
if language, ok := detectSpecialCases(ctx, fp); ok {
6767
return language, nil
6868
}
@@ -74,7 +74,16 @@ func Detect(ctx context.Context, fp string, guessLanguage bool) (heartbeat.Langu
7474
language = languageChroma
7575
}
7676

77-
language = detectOverrideCases(ctx, fp, language, weight)
77+
head, err := fileHead(ctx, fp)
78+
if err != nil {
79+
logger.Warnf("failed to load head from file %q: %s", fp, err)
80+
}
81+
82+
languageVim, weightVim, okVim := detectVimModeline(string(head))
83+
if okVim && weightVim > weight {
84+
// use language from vim modeline, if weight is higher
85+
language = languageVim
86+
}
7887

7988
if language == heartbeat.LanguageUnknown {
8089
return heartbeat.LanguageUnknown, fmt.Errorf("could not detect the language of file %q", fp)
@@ -129,54 +138,6 @@ func detectSpecialCases(ctx context.Context, fp string) (heartbeat.Language, boo
129138
return heartbeat.LanguageUnknown, false
130139
}
131140

132-
// detectOverrideCases overwrides the Chroma detected language based on file contents.
133-
func detectOverrideCases(ctx context.Context, fp string, language heartbeat.Language, weight float32) heartbeat.Language {
134-
logger := log.Extract(ctx)
135-
136-
f, err := file.OpenNoLock(fp) // nolint:gosec
137-
if err != nil {
138-
logger.Debugf("failed to open file: %s", err)
139-
return language
140-
}
141-
142-
defer func() {
143-
if err := f.Close(); err != nil {
144-
logger.Debugf("failed to close file: %s", err)
145-
}
146-
}()
147-
148-
buf := make([]byte, 4096)
149-
c, err := f.Read(buf)
150-
if err != nil && err != io.EOF {
151-
logger.Debugf("failed to open file: %s", err)
152-
return language
153-
}
154-
155-
text := string(buf[:c])
156-
157-
languageVim, weightVim, okVim := detectVimModeline(text)
158-
if okVim && weightVim > weight {
159-
language = languageVim
160-
}
161-
162-
_, file := filepath.Split(fp)
163-
ext := strings.ToLower(filepath.Ext(file))
164-
165-
if ext == ".fs" {
166-
languageForth, weightForth, okForth := detectForthFromContents(text)
167-
if okForth && weightForth >= weight {
168-
language = languageForth
169-
}
170-
171-
languageFSharp, weightFSharp, okFSharp := detectFSharpFromContents(text)
172-
if okFSharp && weightFSharp >= weight {
173-
language = languageFSharp
174-
}
175-
}
176-
177-
return language
178-
}
179-
180141
// folderContainsCFiles returns true, if filder contains c files.
181142
func folderContainsCFiles(ctx context.Context, dir string) bool {
182143
if dir == "" {

pkg/language/language_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -250,11 +250,11 @@ func TestDetect_Perl_Over_Prolog(t *testing.T) {
250250
assert.Equal(t, heartbeat.LanguagePerl, lang)
251251
}
252252

253-
func TestDetect_FSharp_Over_Forth(t *testing.T) {
253+
func TestDetect_Forth_Over_FSharp(t *testing.T) {
254254
lang, err := language.Detect(t.Context(), "testdata/codefiles/fsharp.fs", false)
255255
require.NoError(t, err)
256256

257-
assert.Equal(t, heartbeat.LanguageFSharp, lang)
257+
assert.Equal(t, heartbeat.LanguageForth, lang)
258258
}
259259

260260
func TestDetect_ChromaTopLanguagesRetrofit(t *testing.T) {

pkg/language/priority.go

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,18 @@ package language
33
func priority(lang string) (float32, bool) {
44
prios := map[string]float32{
55
"FSharp": 0.01,
6-
// Higher priority than the ca 65 assembler and ArmAsm
6+
// Higher priority than FSharp
7+
"Forth": 0.05,
8+
// Higher priority than ca 65 assembler and ArmAsm
79
"GAS": 0.1,
8-
// Higher priority than the ca Inform 6
10+
// Higher priority than ca Inform 6
911
"INI": 0.1,
1012
// TASM uses the same file endings, but TASM is not as common as NASM, so we prioritize NASM higher by default.
1113
"NASM": 0.1,
1214
"Perl": 0.01,
1315
// Higher priority than Rebol
1416
"R": 0.1,
15-
// Higher priority than the TypoScript, as TypeScript is far more
17+
// Higher priority than TypoScript, as TypeScript is far more
1618
// common these days
1719
"TypeScript": 0.5,
1820
}

0 commit comments

Comments
 (0)