Skip to content

Commit a2cf26b

Browse files
* feat(FSharpParseFileResults.fs): add RangeOfReturnTypeDefinition method
* refactor(RemoveExplicitReturnType.fs, RefactorTestFramework.fs): replace local RangeOfReturnTypeDefinition with FSharpParseFileResults method
1 parent de5b47a commit a2cf26b

File tree

4 files changed

+37
-36
lines changed

4 files changed

+37
-36
lines changed

src/Compiler/Service/FSharpParseFileResults.fs

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1064,3 +1064,35 @@ type FSharpParseFileResults(diagnostics: FSharpDiagnostic[], input: ParsedInput,
10641064
member scope.ValidateBreakpointLocation pos =
10651065
// This does not need to be run on the background thread
10661066
scope.ValidateBreakpointLocationImpl pos
1067+
1068+
member _.RangeOfReturnTypeDefinition(symbolUseStart: pos, ?skipLambdas) =
1069+
let skipLambdas = defaultArg skipLambdas true
1070+
1071+
SyntaxTraversal.Traverse(
1072+
symbolUseStart,
1073+
input,
1074+
{ new SyntaxVisitorBase<_>() with
1075+
member _.VisitExpr(_path, _traverseSynExpr, defaultTraverse, expr) = defaultTraverse expr
1076+
1077+
override _.VisitBinding(_path, defaultTraverse, binding) =
1078+
match binding with
1079+
| SynBinding(expr = SynExpr.Lambda _) when skipLambdas -> defaultTraverse binding
1080+
| SynBinding(expr = SynExpr.DotLambda _) when skipLambdas -> defaultTraverse binding
1081+
////I need the : before the Return Info
1082+
//| SynBinding(expr = SynExpr.Typed _) -> defaultTraverse binding
1083+
1084+
// Dont skip manually type-annotated bindings
1085+
| SynBinding(returnInfo = Some (SynBindingReturnInfo (_, r, _, _))) -> Some r
1086+
1087+
// Let binding
1088+
| SynBinding (trivia = { EqualsRange = Some equalsRange }; range = range) when range.Start = symbolUseStart ->
1089+
Some equalsRange.StartRange
1090+
1091+
// Member binding
1092+
| SynBinding (headPat = SynPat.LongIdent(longDotId = SynLongIdent(id = _ :: ident :: _))
1093+
trivia = { EqualsRange = Some equalsRange }) when ident.idRange.Start = symbolUseStart ->
1094+
Some equalsRange.StartRange
1095+
1096+
| _ -> defaultTraverse binding
1097+
}
1098+
)

src/Compiler/Service/FSharpParseFileResults.fsi

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,8 @@ type public FSharpParseFileResults =
9595
/// Indicates if any errors occurred during the parse
9696
member ParseHadErrors: bool
9797

98+
member RangeOfReturnTypeDefinition: symbolUseStart: pos * ?skipLambdas: bool -> range option
99+
98100
internal new:
99101
diagnostics: FSharpDiagnostic[] * input: ParsedInput * parseHadErrors: bool * dependencyFiles: string[] ->
100102
FSharpParseFileResults

vsintegration/src/FSharp.Editor/Refactor/RemoveExplicitReturnType.fs

Lines changed: 2 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -25,38 +25,6 @@ open InternalOptionBuilder
2525
type internal RemoveExplicitReturnType [<ImportingConstructor>] () =
2626
inherit CodeRefactoringProvider()
2727

28-
static member RangeOfReturnTypeDefinition(input: ParsedInput, symbolUseStart: pos, ?skipLambdas) =
29-
let skipLambdas = defaultArg skipLambdas true
30-
31-
SyntaxTraversal.Traverse(
32-
symbolUseStart,
33-
input,
34-
{ new SyntaxVisitorBase<_>() with
35-
member _.VisitExpr(_path, _traverseSynExpr, defaultTraverse, expr) = defaultTraverse expr
36-
37-
override _.VisitBinding(_path, defaultTraverse, binding) =
38-
match binding with
39-
| SynBinding(expr = SynExpr.Lambda _) when skipLambdas -> defaultTraverse binding
40-
| SynBinding(expr = SynExpr.DotLambda _) when skipLambdas -> defaultTraverse binding
41-
////I need the : before the Return Info
42-
//| SynBinding(expr = SynExpr.Typed _) -> defaultTraverse binding
43-
44-
// Dont skip manually type-annotated bindings
45-
| SynBinding(returnInfo = Some (SynBindingReturnInfo (_, r, _, _))) -> Some r
46-
47-
// Let binding
48-
| SynBinding (trivia = { EqualsRange = Some equalsRange }; range = range) when range.Start = symbolUseStart ->
49-
Some equalsRange.StartRange
50-
51-
// Member binding
52-
| SynBinding (headPat = SynPat.LongIdent(longDotId = SynLongIdent(id = _ :: ident :: _))
53-
trivia = { EqualsRange = Some equalsRange }) when ident.idRange.Start = symbolUseStart ->
54-
Some equalsRange.StartRange
55-
56-
| _ -> defaultTraverse binding
57-
}
58-
)
59-
6028
static member RangeIncludingColon(range: TextSpan, sourceText: SourceText) =
6129

6230
let lineUntilType = TextSpan.FromBounds(0, range.Start)
@@ -71,7 +39,7 @@ type internal RemoveExplicitReturnType [<ImportingConstructor>] () =
7139
(funcOrValue: FSharpMemberOrFunctionOrValue)
7240
=
7341
let returnTypeHintAlreadyPresent =
74-
RemoveExplicitReturnType.RangeOfReturnTypeDefinition(parseFileResults.ParseTree, symbolUse.Range.Start, false)
42+
parseFileResults.RangeOfReturnTypeDefinition(symbolUse.Range.Start, false)
7543
|> Option.isSome
7644

7745
let isLambdaIfFunction =
@@ -97,7 +65,7 @@ type internal RemoveExplicitReturnType [<ImportingConstructor>] () =
9765
let getChangedText (sourceText: SourceText) =
9866

9967
let newSourceText =
100-
RemoveExplicitReturnType.RangeOfReturnTypeDefinition(parseFileResults.ParseTree, symbolUse.Range.Start, false)
68+
parseFileResults.RangeOfReturnTypeDefinition(symbolUse.Range.Start, false)
10169
|> Option.map (fun range -> RoslynHelpers.FSharpRangeToTextSpan(sourceText, range))
10270
|> Option.map (fun textSpan -> RemoveExplicitReturnType.RangeIncludingColon(textSpan, sourceText))
10371
|> Option.map (fun textSpan -> sourceText.Replace(textSpan, ""))

vsintegration/tests/FSharp.Editor.Tests/Refactors/RefactorTestFramework.fs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,7 @@ let TryGetRangeOfExplicitReturnType (symbolName: string) (document: Document) ct
6464

6565
let range =
6666
symbol
67-
|> Option.bind (fun sym ->
68-
RemoveExplicitReturnType.RangeOfReturnTypeDefinition(parseFileResults.ParseTree, sym.DeclarationLocation.Start, false))
67+
|> Option.bind (fun sym -> parseFileResults.RangeOfReturnTypeDefinition(sym.DeclarationLocation.Start, false))
6968

7069
return range
7170
}

0 commit comments

Comments
 (0)