Skip to content

Commit 3062db5

Browse files
committed
Add SecondaryMessage lint replacements
1 parent c14e459 commit 3062db5

2 files changed

Lines changed: 55 additions & 0 deletions

File tree

internal/cadence/lint_test.go

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,33 @@ func Test_Lint(t *testing.T) {
189189
)
190190
})
191191

192+
t.Run("generates synthetic replacement for replacement category diagnostics", func(t *testing.T) {
193+
t.Parallel()
194+
195+
state := setupMockState(t)
196+
197+
results, err := lintFiles(state, "ReplacementHint.cdc")
198+
require.NoError(t, err)
199+
200+
require.Len(t, results.Results, 1)
201+
require.Len(t, results.Results[0].Diagnostics, 1)
202+
203+
diagnostic := results.Results[0].Diagnostics[0]
204+
205+
// Should have the replacement category
206+
require.Equal(t, "replacement-hint", diagnostic.Category)
207+
208+
// Should have a secondary message with the replacement suggestion
209+
require.Equal(t, "consider replacing with:", diagnostic.Message)
210+
require.Equal(t, "1.0", diagnostic.SecondaryMessage)
211+
212+
// Should have synthetic suggested fixes generated from secondary message
213+
require.Len(t, diagnostic.SuggestedFixes, 1)
214+
require.Equal(t, "consider replacing with: `1.0`", diagnostic.SuggestedFixes[0].Message)
215+
require.Len(t, diagnostic.SuggestedFixes[0].TextEdits, 1)
216+
require.Equal(t, "1.0", diagnostic.SuggestedFixes[0].TextEdits[0].Replacement)
217+
})
218+
192219
t.Run("linter resolves imports from flowkit state", func(t *testing.T) {
193220
t.Parallel()
194221

@@ -476,6 +503,12 @@ func setupMockState(t *testing.T) *flowkit.State {
476503
qqq
477504
}
478505
}`), 0644)
506+
_ = afero.WriteFile(mockFs, "ReplacementHint.cdc", []byte(`
507+
access(all) contract ReplacementHint {
508+
access(all) fun test() {
509+
let x = UFix64(1)
510+
}
511+
}`), 0644)
479512
_ = afero.WriteFile(mockFs, "CadenceV1Error.cdc", []byte(`
480513
access(all) contract CadenceV1Error {
481514
init() {

internal/cadence/linter.go

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,28 @@ func (l *linter) lintFile(
156156
}
157157
analysisProgram.Run(analyzers, report)
158158

159+
// Generate synthetic replacements for replacement category diagnostics
160+
// that don't have suggested fixes
161+
for i := range diagnostics {
162+
diagnostic := &diagnostics[i]
163+
if diagnostic.Category == cdclint.ReplacementCategory &&
164+
len(diagnostic.SuggestedFixes) == 0 &&
165+
diagnostic.SecondaryMessage != "" {
166+
// Create a synthetic suggested fix from the secondary message
167+
diagnostic.SuggestedFixes = []cdcerrors.SuggestedFix[ast.TextEdit]{
168+
{
169+
Message: fmt.Sprintf("%s `%s`", diagnostic.Message, diagnostic.SecondaryMessage),
170+
TextEdits: []ast.TextEdit{
171+
{
172+
Range: diagnostic.Range,
173+
Replacement: diagnostic.SecondaryMessage,
174+
},
175+
},
176+
},
177+
}
178+
}
179+
}
180+
159181
return diagnostics, nil
160182
}
161183

0 commit comments

Comments
 (0)