Skip to content
This repository was archived by the owner on Dec 23, 2024. It is now read-only.

Commit eafaf6c

Browse files
cartermpnosami
authored andcommitted
Add ConvertToF#LambdaSyntax code fixer (dotnet#10637)
* Add RemoveReturnOrYield code fixer * area: * Update testing, which was frankly wrong
1 parent 00115f8 commit eafaf6c

16 files changed

+128
-0
lines changed
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
// Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information.
2+
3+
namespace Microsoft.VisualStudio.FSharp.Editor
4+
5+
open System.Composition
6+
7+
open Microsoft.CodeAnalysis.Text
8+
open Microsoft.CodeAnalysis.CodeFixes
9+
10+
[<ExportCodeFixProvider(FSharpConstants.FSharpLanguageName, Name = "ConvertCSharpLambdaToFSharpLambda"); Shared>]
11+
type internal FSharpConvertCSharpLambdaToFSharpLambdaCodeFixProvider
12+
[<ImportingConstructor>]
13+
(
14+
checkerProvider: FSharpCheckerProvider,
15+
projectInfoManager: FSharpProjectOptionsManager
16+
) =
17+
inherit CodeFixProvider()
18+
19+
static let userOpName = "ConvertCSharpLambdaToFSharpLambda"
20+
let fixableDiagnosticIds = set ["FS0039"; "FS0043"]
21+
22+
override _.FixableDiagnosticIds = Seq.toImmutableArray fixableDiagnosticIds
23+
24+
override _.RegisterCodeFixesAsync context =
25+
asyncMaybe {
26+
let! sourceText = context.Document.GetTextAsync(context.CancellationToken)
27+
let! parsingOptions, _ = projectInfoManager.TryGetOptionsForEditingDocumentOrProject(context.Document, context.CancellationToken, userOpName)
28+
let! parseResults = checkerProvider.Checker.ParseFile(context.Document.FilePath, sourceText.ToFSharpSourceText(), parsingOptions, userOpName) |> liftAsync
29+
30+
let errorRange = RoslynHelpers.TextSpanToFSharpRange(context.Document.FilePath, context.Span, sourceText)
31+
32+
let! fullParenRange, lambdaArgRange, lambdaBodyRange = parseResults.TryRangeOfParenEnclosingOpEqualsGreaterUsage errorRange.Start
33+
34+
let! fullParenSpan = RoslynHelpers.TryFSharpRangeToTextSpan(sourceText, fullParenRange)
35+
let! lambdaArgSpan = RoslynHelpers.TryFSharpRangeToTextSpan(sourceText, lambdaArgRange)
36+
let! lambdaBodySpan = RoslynHelpers.TryFSharpRangeToTextSpan(sourceText, lambdaBodyRange)
37+
38+
let replacement =
39+
let argText = sourceText.GetSubText(lambdaArgSpan).ToString()
40+
let bodyText = sourceText.GetSubText(lambdaBodySpan).ToString()
41+
TextChange(fullParenSpan, "fun " + argText + " -> " + bodyText)
42+
43+
let diagnostics =
44+
context.Diagnostics
45+
|> Seq.filter (fun x -> fixableDiagnosticIds |> Set.contains x.Id)
46+
|> Seq.toImmutableArray
47+
48+
let title = SR.UseFSharpLambda()
49+
50+
let codeFix =
51+
CodeFixHelpers.createTextChangeCodeFix(
52+
title,
53+
context,
54+
(fun () -> asyncMaybe.Return [| replacement |]))
55+
56+
context.RegisterCodeFix(codeFix, diagnostics)
57+
}
58+
|> Async.Ignore
59+
|> RoslynHelpers.StartAsyncUnitAsTask(context.CancellationToken)

FSharp.Editor.fsproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,7 @@
184184
<Compile Include="Commands\FsiCommandService.fs" />
185185
<Compile Include="Commands\XmlDocCommandService.fs" />
186186
<Compile Include="CodeFix\CodeFixHelpers.fs" />
187+
<Compile Include="CodeFix\ConvertCSharpLambdaToFSharpLambda.fs" />
187188
<Compile Include="CodeFix\RemoveReturnOrYield.fs" />
188189
<Compile Include="CodeFix\ConvertToAnonymousRecord.fs" />
189190
<Compile Include="CodeFix\UseMutationWhenValueIsMutable.fs" />

FSharp.Editor.resx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -261,4 +261,7 @@
261261
<data name="UseMutationWhenValueIsMutable" xml:space="preserve">
262262
<value>Use '&lt;-' to mutate value</value>
263263
</data>
264+
<data name="UseFSharpLambda" xml:space="preserve">
265+
<value>Use F# lambda syntax</value>
266+
</data>
264267
</root>

xlf/FSharp.Editor.cs.xlf

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,11 @@
217217
<target state="translated">Formátování</target>
218218
<note />
219219
</trans-unit>
220+
<trans-unit id="UseFSharpLambda">
221+
<source>Use F# lambda syntax</source>
222+
<target state="new">Use F# lambda syntax</target>
223+
<note />
224+
</trans-unit>
220225
<trans-unit id="UseMutationWhenValueIsMutable">
221226
<source>Use '&lt;-' to mutate value</source>
222227
<target state="new">Use '&lt;-' to mutate value</target>

xlf/FSharp.Editor.de.xlf

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,11 @@
217217
<target state="translated">Formatierung</target>
218218
<note />
219219
</trans-unit>
220+
<trans-unit id="UseFSharpLambda">
221+
<source>Use F# lambda syntax</source>
222+
<target state="new">Use F# lambda syntax</target>
223+
<note />
224+
</trans-unit>
220225
<trans-unit id="UseMutationWhenValueIsMutable">
221226
<source>Use '&lt;-' to mutate value</source>
222227
<target state="new">Use '&lt;-' to mutate value</target>

xlf/FSharp.Editor.es.xlf

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,11 @@
217217
<target state="translated">Formato</target>
218218
<note />
219219
</trans-unit>
220+
<trans-unit id="UseFSharpLambda">
221+
<source>Use F# lambda syntax</source>
222+
<target state="new">Use F# lambda syntax</target>
223+
<note />
224+
</trans-unit>
220225
<trans-unit id="UseMutationWhenValueIsMutable">
221226
<source>Use '&lt;-' to mutate value</source>
222227
<target state="new">Use '&lt;-' to mutate value</target>

xlf/FSharp.Editor.fr.xlf

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,11 @@
217217
<target state="translated">Mise en forme</target>
218218
<note />
219219
</trans-unit>
220+
<trans-unit id="UseFSharpLambda">
221+
<source>Use F# lambda syntax</source>
222+
<target state="new">Use F# lambda syntax</target>
223+
<note />
224+
</trans-unit>
220225
<trans-unit id="UseMutationWhenValueIsMutable">
221226
<source>Use '&lt;-' to mutate value</source>
222227
<target state="new">Use '&lt;-' to mutate value</target>

xlf/FSharp.Editor.it.xlf

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,11 @@
217217
<target state="translated">Formattazione</target>
218218
<note />
219219
</trans-unit>
220+
<trans-unit id="UseFSharpLambda">
221+
<source>Use F# lambda syntax</source>
222+
<target state="new">Use F# lambda syntax</target>
223+
<note />
224+
</trans-unit>
220225
<trans-unit id="UseMutationWhenValueIsMutable">
221226
<source>Use '&lt;-' to mutate value</source>
222227
<target state="new">Use '&lt;-' to mutate value</target>

xlf/FSharp.Editor.ja.xlf

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,11 @@
217217
<target state="translated">書式設定</target>
218218
<note />
219219
</trans-unit>
220+
<trans-unit id="UseFSharpLambda">
221+
<source>Use F# lambda syntax</source>
222+
<target state="new">Use F# lambda syntax</target>
223+
<note />
224+
</trans-unit>
220225
<trans-unit id="UseMutationWhenValueIsMutable">
221226
<source>Use '&lt;-' to mutate value</source>
222227
<target state="new">Use '&lt;-' to mutate value</target>

xlf/FSharp.Editor.ko.xlf

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,11 @@
217217
<target state="translated">서식</target>
218218
<note />
219219
</trans-unit>
220+
<trans-unit id="UseFSharpLambda">
221+
<source>Use F# lambda syntax</source>
222+
<target state="new">Use F# lambda syntax</target>
223+
<note />
224+
</trans-unit>
220225
<trans-unit id="UseMutationWhenValueIsMutable">
221226
<source>Use '&lt;-' to mutate value</source>
222227
<target state="new">Use '&lt;-' to mutate value</target>

xlf/FSharp.Editor.pl.xlf

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,11 @@
217217
<target state="translated">Formatowanie</target>
218218
<note />
219219
</trans-unit>
220+
<trans-unit id="UseFSharpLambda">
221+
<source>Use F# lambda syntax</source>
222+
<target state="new">Use F# lambda syntax</target>
223+
<note />
224+
</trans-unit>
220225
<trans-unit id="UseMutationWhenValueIsMutable">
221226
<source>Use '&lt;-' to mutate value</source>
222227
<target state="new">Use '&lt;-' to mutate value</target>

xlf/FSharp.Editor.pt-BR.xlf

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,11 @@
217217
<target state="translated">Formatação</target>
218218
<note />
219219
</trans-unit>
220+
<trans-unit id="UseFSharpLambda">
221+
<source>Use F# lambda syntax</source>
222+
<target state="new">Use F# lambda syntax</target>
223+
<note />
224+
</trans-unit>
220225
<trans-unit id="UseMutationWhenValueIsMutable">
221226
<source>Use '&lt;-' to mutate value</source>
222227
<target state="new">Use '&lt;-' to mutate value</target>

xlf/FSharp.Editor.ru.xlf

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,11 @@
217217
<target state="translated">Форматирование</target>
218218
<note />
219219
</trans-unit>
220+
<trans-unit id="UseFSharpLambda">
221+
<source>Use F# lambda syntax</source>
222+
<target state="new">Use F# lambda syntax</target>
223+
<note />
224+
</trans-unit>
220225
<trans-unit id="UseMutationWhenValueIsMutable">
221226
<source>Use '&lt;-' to mutate value</source>
222227
<target state="new">Use '&lt;-' to mutate value</target>

xlf/FSharp.Editor.tr.xlf

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,11 @@
217217
<target state="translated">Biçimlendirme</target>
218218
<note />
219219
</trans-unit>
220+
<trans-unit id="UseFSharpLambda">
221+
<source>Use F# lambda syntax</source>
222+
<target state="new">Use F# lambda syntax</target>
223+
<note />
224+
</trans-unit>
220225
<trans-unit id="UseMutationWhenValueIsMutable">
221226
<source>Use '&lt;-' to mutate value</source>
222227
<target state="new">Use '&lt;-' to mutate value</target>

xlf/FSharp.Editor.zh-Hans.xlf

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,11 @@
217217
<target state="translated">正在格式化</target>
218218
<note />
219219
</trans-unit>
220+
<trans-unit id="UseFSharpLambda">
221+
<source>Use F# lambda syntax</source>
222+
<target state="new">Use F# lambda syntax</target>
223+
<note />
224+
</trans-unit>
220225
<trans-unit id="UseMutationWhenValueIsMutable">
221226
<source>Use '&lt;-' to mutate value</source>
222227
<target state="new">Use '&lt;-' to mutate value</target>

xlf/FSharp.Editor.zh-Hant.xlf

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,11 @@
217217
<target state="translated">格式化</target>
218218
<note />
219219
</trans-unit>
220+
<trans-unit id="UseFSharpLambda">
221+
<source>Use F# lambda syntax</source>
222+
<target state="new">Use F# lambda syntax</target>
223+
<note />
224+
</trans-unit>
220225
<trans-unit id="UseMutationWhenValueIsMutable">
221226
<source>Use '&lt;-' to mutate value</source>
222227
<target state="new">Use '&lt;-' to mutate value</target>

0 commit comments

Comments
 (0)