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

Commit 4c13bd6

Browse files
authored
Add RemoveReturnOrYield code fixer (dotnet#10530)
1 parent 207c181 commit 4c13bd6

16 files changed

+332
-0
lines changed

CodeFix/RemoveReturnOrYield.fs

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 = "RemoveReturnOrYield"); Shared>]
11+
type internal FSharpRemoveReturnOrYieldCodeFixProvider
12+
[<ImportingConstructor>]
13+
(
14+
checkerProvider: FSharpCheckerProvider,
15+
projectInfoManager: FSharpProjectOptionsManager
16+
) =
17+
inherit CodeFixProvider()
18+
19+
static let userOpName = "RemoveReturnOrYield"
20+
let fixableDiagnosticIds = set ["FS0748"; "FS0747"]
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+
let! exprRange = parseResults.TryRangeOfExprInYieldOrReturn errorRange.Start
32+
let! exprSpan = RoslynHelpers.TryFSharpRangeToTextSpan(sourceText, exprRange)
33+
34+
let diagnostics =
35+
context.Diagnostics
36+
|> Seq.filter (fun x -> fixableDiagnosticIds |> Set.contains x.Id)
37+
|> Seq.toImmutableArray
38+
39+
let title =
40+
let text = sourceText.GetSubText(context.Span).ToString()
41+
if text.StartsWith("return!") then
42+
SR.RemoveReturnBang()
43+
elif text.StartsWith("return") then
44+
SR.RemoveReturn()
45+
elif text.StartsWith("yield!") then
46+
SR.RemoveYieldBang()
47+
else
48+
SR.RemoveYield()
49+
50+
let codeFix =
51+
CodeFixHelpers.createTextChangeCodeFix(
52+
title,
53+
context,
54+
(fun () -> asyncMaybe.Return [| TextChange(context.Span, sourceText.GetSubText(exprSpan).ToString()) |]))
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
@@ -89,6 +89,7 @@
8989
<Compile Include="Commands\FsiCommandService.fs" />
9090
<Compile Include="Commands\XmlDocCommandService.fs" />
9191
<Compile Include="CodeFix\CodeFixHelpers.fs" />
92+
<Compile Include="CodeFix\RemoveReturnOrYield.fs" />
9293
<Compile Include="CodeFix\ConvertToAnonymousRecord.fs" />
9394
<Compile Include="CodeFix\UseMutationWhenValueIsMutable.fs" />
9495
<Compile Include="CodeFix\MakeDeclarationMutable.fs" />

FSharp.Editor.resx

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,18 @@
243243
<data name="ChangePrefixNegationToInfixSubtraction" xml:space="preserve">
244244
<value>Use subtraction instead of negation</value>
245245
</data>
246+
<data name="RemoveReturn" xml:space="preserve">
247+
<value>Remove 'return'</value>
248+
</data>
249+
<data name="RemoveReturnBang" xml:space="preserve">
250+
<value>Remove 'return!'</value>
251+
</data>
252+
<data name="RemoveYield" xml:space="preserve">
253+
<value>Remove 'yield'</value>
254+
</data>
255+
<data name="RemoveYieldBang" xml:space="preserve">
256+
<value>Remove yield!'</value>
257+
</data>
246258
<data name="ConvertToAnonymousRecord" xml:space="preserve">
247259
<value>Convert to Anonymous Record</value>
248260
</data>

xlf/FSharp.Editor.cs.xlf

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,26 @@
6767
<target state="translated">Před {0} vložte podtržítko.</target>
6868
<note />
6969
</trans-unit>
70+
<trans-unit id="RemoveReturn">
71+
<source>Remove 'return'</source>
72+
<target state="new">Remove 'return'</target>
73+
<note />
74+
</trans-unit>
75+
<trans-unit id="RemoveReturnBang">
76+
<source>Remove 'return!'</source>
77+
<target state="new">Remove 'return!'</target>
78+
<note />
79+
</trans-unit>
80+
<trans-unit id="RemoveYield">
81+
<source>Remove 'yield'</source>
82+
<target state="new">Remove 'yield'</target>
83+
<note />
84+
</trans-unit>
85+
<trans-unit id="RemoveYieldBang">
86+
<source>Remove yield!'</source>
87+
<target state="new">Remove yield!'</target>
88+
<note />
89+
</trans-unit>
7090
<trans-unit id="RenameValueToUnderscore">
7191
<source>Rename '{0}' to '_'</source>
7292
<target state="translated">Přejmenujte {0} na _.</target>

xlf/FSharp.Editor.de.xlf

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,26 @@
6767
<target state="translated">"{0}" einen Unterstrich voranstellen</target>
6868
<note />
6969
</trans-unit>
70+
<trans-unit id="RemoveReturn">
71+
<source>Remove 'return'</source>
72+
<target state="new">Remove 'return'</target>
73+
<note />
74+
</trans-unit>
75+
<trans-unit id="RemoveReturnBang">
76+
<source>Remove 'return!'</source>
77+
<target state="new">Remove 'return!'</target>
78+
<note />
79+
</trans-unit>
80+
<trans-unit id="RemoveYield">
81+
<source>Remove 'yield'</source>
82+
<target state="new">Remove 'yield'</target>
83+
<note />
84+
</trans-unit>
85+
<trans-unit id="RemoveYieldBang">
86+
<source>Remove yield!'</source>
87+
<target state="new">Remove yield!'</target>
88+
<note />
89+
</trans-unit>
7090
<trans-unit id="RenameValueToUnderscore">
7191
<source>Rename '{0}' to '_'</source>
7292
<target state="translated">"{0}" in "_" umbenennen</target>

xlf/FSharp.Editor.es.xlf

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,26 @@
6767
<target state="translated">Colocar un carácter de subrayado delante de "{0}"</target>
6868
<note />
6969
</trans-unit>
70+
<trans-unit id="RemoveReturn">
71+
<source>Remove 'return'</source>
72+
<target state="new">Remove 'return'</target>
73+
<note />
74+
</trans-unit>
75+
<trans-unit id="RemoveReturnBang">
76+
<source>Remove 'return!'</source>
77+
<target state="new">Remove 'return!'</target>
78+
<note />
79+
</trans-unit>
80+
<trans-unit id="RemoveYield">
81+
<source>Remove 'yield'</source>
82+
<target state="new">Remove 'yield'</target>
83+
<note />
84+
</trans-unit>
85+
<trans-unit id="RemoveYieldBang">
86+
<source>Remove yield!'</source>
87+
<target state="new">Remove yield!'</target>
88+
<note />
89+
</trans-unit>
7090
<trans-unit id="RenameValueToUnderscore">
7191
<source>Rename '{0}' to '_'</source>
7292
<target state="translated">Cambiar nombre de "{0}" por "_"</target>

xlf/FSharp.Editor.fr.xlf

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,26 @@
6767
<target state="translated">Faire précéder '{0}' d'un trait de soulignement</target>
6868
<note />
6969
</trans-unit>
70+
<trans-unit id="RemoveReturn">
71+
<source>Remove 'return'</source>
72+
<target state="new">Remove 'return'</target>
73+
<note />
74+
</trans-unit>
75+
<trans-unit id="RemoveReturnBang">
76+
<source>Remove 'return!'</source>
77+
<target state="new">Remove 'return!'</target>
78+
<note />
79+
</trans-unit>
80+
<trans-unit id="RemoveYield">
81+
<source>Remove 'yield'</source>
82+
<target state="new">Remove 'yield'</target>
83+
<note />
84+
</trans-unit>
85+
<trans-unit id="RemoveYieldBang">
86+
<source>Remove yield!'</source>
87+
<target state="new">Remove yield!'</target>
88+
<note />
89+
</trans-unit>
7090
<trans-unit id="RenameValueToUnderscore">
7191
<source>Rename '{0}' to '_'</source>
7292
<target state="translated">Renommer '{0}' en '_'</target>

xlf/FSharp.Editor.it.xlf

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,26 @@
6767
<target state="translated">Anteponi a '{0}' un carattere di sottolineatura</target>
6868
<note />
6969
</trans-unit>
70+
<trans-unit id="RemoveReturn">
71+
<source>Remove 'return'</source>
72+
<target state="new">Remove 'return'</target>
73+
<note />
74+
</trans-unit>
75+
<trans-unit id="RemoveReturnBang">
76+
<source>Remove 'return!'</source>
77+
<target state="new">Remove 'return!'</target>
78+
<note />
79+
</trans-unit>
80+
<trans-unit id="RemoveYield">
81+
<source>Remove 'yield'</source>
82+
<target state="new">Remove 'yield'</target>
83+
<note />
84+
</trans-unit>
85+
<trans-unit id="RemoveYieldBang">
86+
<source>Remove yield!'</source>
87+
<target state="new">Remove yield!'</target>
88+
<note />
89+
</trans-unit>
7090
<trans-unit id="RenameValueToUnderscore">
7191
<source>Rename '{0}' to '_'</source>
7292
<target state="translated">Rinomina '{0}' in '_'</target>

xlf/FSharp.Editor.ja.xlf

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,26 @@
6767
<target state="translated">アンダースコアが含まれているプレフィックス '{0}'</target>
6868
<note />
6969
</trans-unit>
70+
<trans-unit id="RemoveReturn">
71+
<source>Remove 'return'</source>
72+
<target state="new">Remove 'return'</target>
73+
<note />
74+
</trans-unit>
75+
<trans-unit id="RemoveReturnBang">
76+
<source>Remove 'return!'</source>
77+
<target state="new">Remove 'return!'</target>
78+
<note />
79+
</trans-unit>
80+
<trans-unit id="RemoveYield">
81+
<source>Remove 'yield'</source>
82+
<target state="new">Remove 'yield'</target>
83+
<note />
84+
</trans-unit>
85+
<trans-unit id="RemoveYieldBang">
86+
<source>Remove yield!'</source>
87+
<target state="new">Remove yield!'</target>
88+
<note />
89+
</trans-unit>
7090
<trans-unit id="RenameValueToUnderscore">
7191
<source>Rename '{0}' to '_'</source>
7292
<target state="translated">'{0}' から '_' に名前を変更する</target>

xlf/FSharp.Editor.ko.xlf

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,26 @@
6767
<target state="translated">밑줄이 있는 '{0}' 접두사</target>
6868
<note />
6969
</trans-unit>
70+
<trans-unit id="RemoveReturn">
71+
<source>Remove 'return'</source>
72+
<target state="new">Remove 'return'</target>
73+
<note />
74+
</trans-unit>
75+
<trans-unit id="RemoveReturnBang">
76+
<source>Remove 'return!'</source>
77+
<target state="new">Remove 'return!'</target>
78+
<note />
79+
</trans-unit>
80+
<trans-unit id="RemoveYield">
81+
<source>Remove 'yield'</source>
82+
<target state="new">Remove 'yield'</target>
83+
<note />
84+
</trans-unit>
85+
<trans-unit id="RemoveYieldBang">
86+
<source>Remove yield!'</source>
87+
<target state="new">Remove yield!'</target>
88+
<note />
89+
</trans-unit>
7090
<trans-unit id="RenameValueToUnderscore">
7191
<source>Rename '{0}' to '_'</source>
7292
<target state="translated">'{0}'의 이름을 '_'로 바꾸기</target>

0 commit comments

Comments
 (0)