Skip to content

Commit fe274cb

Browse files
committed
feat: make fixes/suggestions opt-in
1 parent 71f9af8 commit fe274cb

File tree

5 files changed

+61
-28
lines changed

5 files changed

+61
-28
lines changed

cmd/tsgolint/headless.go

Lines changed: 35 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -63,8 +63,8 @@ type headlessDiagnostic struct {
6363
Range headlessRange `json:"range"`
6464
Rule string `json:"rule"`
6565
Message headlessRuleMessage `json:"message"`
66-
Fixes []headlessFix `json:"fixes"`
67-
Suggestions []headlessSuggestion `json:"suggestions"`
66+
Fixes []headlessFix `json:"fixes,omitempty"`
67+
Suggestions []headlessSuggestion `json:"suggestions,omitempty"`
6868
FilePath string `json:"file_path"`
6969
}
7070

@@ -102,15 +102,19 @@ func runHeadless(args []string) int {
102102
logLevel := utils.GetLogLevel()
103103

104104
var (
105-
traceOut string
106-
cpuprofOut string
107-
heapOut string
108-
allocsOut string
105+
traceOut string
106+
cpuprofOut string
107+
heapOut string
108+
allocsOut string
109+
fix bool
110+
fixSuggestions bool
109111
)
110112
flag.StringVar(&traceOut, "trace", "", "file to put trace to")
111113
flag.StringVar(&cpuprofOut, "cpuprof", "", "file to put cpu profiling to")
112114
flag.StringVar(&heapOut, "heap", "", "file to put heap profiling to")
113115
flag.StringVar(&allocsOut, "allocs", "", "file to put allocs profiling to")
116+
flag.BoolVar(&fix, "fix", false, "generate fixes for code problems")
117+
flag.BoolVar(&fixSuggestions, "fix-suggestions", false, "generate suggestions for code problems")
114118
flag.CommandLine.Parse(args)
115119

116120
log.SetOutput(os.Stderr)
@@ -236,28 +240,34 @@ func runHeadless(args []string) int {
236240
Range: headlessRangeFromRange(d.Range),
237241
Rule: d.RuleName,
238242
Message: headlessRuleMessageFromRuleMessage(d.Message),
239-
Fixes: make([]headlessFix, len(d.Fixes())),
240-
Suggestions: make([]headlessSuggestion, len(d.GetSuggestions())),
243+
Fixes: nil,
244+
Suggestions: nil,
241245
FilePath: d.SourceFile.FileName(),
242246
}
243-
for i, fix := range d.Fixes() {
244-
hd.Fixes[i] = headlessFix{
245-
Text: fix.Text,
246-
Range: headlessRangeFromRange(fix.Range),
247-
}
248-
}
249-
for i, suggestion := range d.GetSuggestions() {
250-
hd.Suggestions[i] = headlessSuggestion{
251-
Message: headlessRuleMessageFromRuleMessage(d.Message),
252-
Fixes: make([]headlessFix, len(suggestion.Fixes())),
253-
}
254-
for j, fix := range suggestion.Fixes() {
255-
hd.Suggestions[i].Fixes[j] = headlessFix{
247+
if fix {
248+
hd.Fixes = make([]headlessFix, len(d.Fixes()))
249+
for i, fix := range d.Fixes() {
250+
hd.Fixes[i] = headlessFix{
256251
Text: fix.Text,
257252
Range: headlessRangeFromRange(fix.Range),
258253
}
259254
}
260255
}
256+
if fixSuggestions {
257+
hd.Suggestions = make([]headlessSuggestion, len(d.GetSuggestions()))
258+
for i, suggestion := range d.GetSuggestions() {
259+
hd.Suggestions[i] = headlessSuggestion{
260+
Message: headlessRuleMessageFromRuleMessage(d.Message),
261+
Fixes: make([]headlessFix, len(suggestion.Fixes())),
262+
}
263+
for j, fix := range suggestion.Fixes() {
264+
hd.Suggestions[i].Fixes[j] = headlessFix{
265+
Text: fix.Text,
266+
Range: headlessRangeFromRange(fix.Range),
267+
}
268+
}
269+
}
270+
}
261271
writeMessage(w, headlessMessageTypeDiagnostic, hd)
262272
if w.Available() < 4096 {
263273
w.Flush()
@@ -297,6 +307,10 @@ func runHeadless(args []string) int {
297307
func(d rule.RuleDiagnostic) {
298308
diagnosticsChan <- d
299309
},
310+
linter.Fixes{
311+
Fix: fix,
312+
FixSuggestions: fixSuggestions,
313+
},
300314
)
301315

302316
close(diagnosticsChan)

cmd/tsgolint/main.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -470,6 +470,10 @@ func runMain() int {
470470
func(d rule.RuleDiagnostic) {
471471
diagnosticsChan <- d
472472
},
473+
linter.Fixes{
474+
Fix: true,
475+
FixSuggestions: true,
476+
},
473477
)
474478

475479
close(diagnosticsChan)

internal/linter/linter.go

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,12 @@ type Workload struct {
2828
UnmatchedFiles []string
2929
}
3030

31-
func RunLinter(logLevel utils.LogLevel, currentDirectory string, workload Workload, workers int, fs vfs.FS, getRulesForFile func(sourceFile *ast.SourceFile) []ConfiguredRule, onDiagnostic func(diagnostic rule.RuleDiagnostic)) error {
31+
type Fixes struct {
32+
Fix bool
33+
FixSuggestions bool
34+
}
35+
36+
func RunLinter(logLevel utils.LogLevel, currentDirectory string, workload Workload, workers int, fs vfs.FS, getRulesForFile func(sourceFile *ast.SourceFile) []ConfiguredRule, onDiagnostic func(diagnostic rule.RuleDiagnostic), fixState Fixes) error {
3237

3338
idx := 0
3439
for configFileName, filePaths := range workload.Programs {
@@ -75,7 +80,7 @@ func RunLinter(logLevel utils.LogLevel, currentDirectory string, workload Worklo
7580
panic(fmt.Sprintf("Expected file '%s' to be in program '%s'", unmatchedFilesString, configFileName))
7681
}
7782

78-
err = RunLinterOnProgram(logLevel, program, sourceFiles, workers, getRulesForFile, onDiagnostic)
83+
err = RunLinterOnProgram(logLevel, program, sourceFiles, workers, getRulesForFile, onDiagnostic, fixState)
7984
if err != nil {
8085
return err
8186
}
@@ -100,7 +105,7 @@ func RunLinter(logLevel utils.LogLevel, currentDirectory string, workload Worklo
100105
files = append(files, sf)
101106
}
102107

103-
err = RunLinterOnProgram(logLevel, program, files, workers, getRulesForFile, onDiagnostic)
108+
err = RunLinterOnProgram(logLevel, program, files, workers, getRulesForFile, onDiagnostic, fixState)
104109
if err != nil {
105110
return err
106111
}
@@ -110,7 +115,7 @@ func RunLinter(logLevel utils.LogLevel, currentDirectory string, workload Worklo
110115

111116
}
112117

113-
func RunLinterOnProgram(logLevel utils.LogLevel, program *compiler.Program, files []*ast.SourceFile, workers int, getRulesForFile func(sourceFile *ast.SourceFile) []ConfiguredRule, onDiagnostic func(diagnostic rule.RuleDiagnostic)) error {
118+
func RunLinterOnProgram(logLevel utils.LogLevel, program *compiler.Program, files []*ast.SourceFile, workers int, getRulesForFile func(sourceFile *ast.SourceFile) []ConfiguredRule, onDiagnostic func(diagnostic rule.RuleDiagnostic), fixState Fixes) error {
114119
type checkerWorkload struct {
115120
checker *checker.Checker
116121
program *compiler.Program
@@ -162,7 +167,10 @@ func RunLinterOnProgram(logLevel utils.LogLevel, program *compiler.Program, file
162167
})
163168
},
164169
ReportRangeWithSuggestions: func(textRange core.TextRange, msg rule.RuleMessage, suggestionsFn func() []rule.RuleSuggestion) {
165-
suggestions := suggestionsFn()
170+
var suggestions []rule.RuleSuggestion = nil
171+
if fixState.FixSuggestions {
172+
suggestions = suggestionsFn()
173+
}
166174
onDiagnostic(rule.RuleDiagnostic{
167175
RuleName: r.Name,
168176
Range: textRange,
@@ -180,7 +188,10 @@ func RunLinterOnProgram(logLevel utils.LogLevel, program *compiler.Program, file
180188
})
181189
},
182190
ReportNodeWithFixes: func(node *ast.Node, msg rule.RuleMessage, fixesFn func() []rule.RuleFix) {
183-
fixes := fixesFn()
191+
var fixes []rule.RuleFix = nil
192+
if fixState.Fix {
193+
fixes = fixesFn()
194+
}
184195
onDiagnostic(rule.RuleDiagnostic{
185196
RuleName: r.Name,
186197
Range: utils.TrimNodeTextRange(file, node),

internal/rule_tester/rule_tester.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,10 @@ func RunRuleTester(rootDir string, tsconfigPath string, t *testing.T, r *rule.Ru
9797

9898
diagnostics = append(diagnostics, diagnostic)
9999
},
100+
linter.Fixes{
101+
Fix: true,
102+
FixSuggestions: true,
103+
},
100104
)
101105

102106
assert.NilError(t, err, "error running linter. code:\n", code)

typescript-go

0 commit comments

Comments
 (0)