Skip to content

Commit

Permalink
* feat(FSharpParseFileResults.fs): add RangeOfReturnTypeDefinition me…
Browse files Browse the repository at this point in the history
…thod

* refactor(RemoveExplicitReturnType.fs, RefactorTestFramework.fs): replace local RangeOfReturnTypeDefinition with FSharpParseFileResults method
  • Loading branch information
SebastianAtWork committed Nov 2, 2023
1 parent b3ce31a commit 1065f22
Show file tree
Hide file tree
Showing 4 changed files with 37 additions and 36 deletions.
32 changes: 32 additions & 0 deletions src/Compiler/Service/FSharpParseFileResults.fs
Original file line number Diff line number Diff line change
Expand Up @@ -1064,3 +1064,35 @@ type FSharpParseFileResults(diagnostics: FSharpDiagnostic[], input: ParsedInput,
member scope.ValidateBreakpointLocation pos =
// This does not need to be run on the background thread
scope.ValidateBreakpointLocationImpl pos

member _.RangeOfReturnTypeDefinition(symbolUseStart: pos, ?skipLambdas) =
let skipLambdas = defaultArg skipLambdas true

SyntaxTraversal.Traverse(
symbolUseStart,
input,
{ new SyntaxVisitorBase<_>() with
member _.VisitExpr(_path, _traverseSynExpr, defaultTraverse, expr) = defaultTraverse expr

override _.VisitBinding(_path, defaultTraverse, binding) =
match binding with
| SynBinding(expr = SynExpr.Lambda _) when skipLambdas -> defaultTraverse binding
| SynBinding(expr = SynExpr.DotLambda _) when skipLambdas -> defaultTraverse binding
////I need the : before the Return Info
//| SynBinding(expr = SynExpr.Typed _) -> defaultTraverse binding

// Dont skip manually type-annotated bindings
| SynBinding(returnInfo = Some (SynBindingReturnInfo (_, r, _, _))) -> Some r

// Let binding
| SynBinding (trivia = { EqualsRange = Some equalsRange }; range = range) when range.Start = symbolUseStart ->
Some equalsRange.StartRange

// Member binding
| SynBinding (headPat = SynPat.LongIdent(longDotId = SynLongIdent(id = _ :: ident :: _))
trivia = { EqualsRange = Some equalsRange }) when ident.idRange.Start = symbolUseStart ->
Some equalsRange.StartRange

| _ -> defaultTraverse binding
}
)
2 changes: 2 additions & 0 deletions src/Compiler/Service/FSharpParseFileResults.fsi
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,8 @@ type public FSharpParseFileResults =
/// Indicates if any errors occurred during the parse
member ParseHadErrors: bool

member RangeOfReturnTypeDefinition: symbolUseStart: pos * ?skipLambdas: bool -> range option

internal new:
diagnostics: FSharpDiagnostic[] * input: ParsedInput * parseHadErrors: bool * dependencyFiles: string[] ->
FSharpParseFileResults
Original file line number Diff line number Diff line change
Expand Up @@ -25,38 +25,6 @@ open InternalOptionBuilder
type internal RemoveExplicitReturnType [<ImportingConstructor>] () =
inherit CodeRefactoringProvider()

static member RangeOfReturnTypeDefinition(input: ParsedInput, symbolUseStart: pos, ?skipLambdas) =
let skipLambdas = defaultArg skipLambdas true

SyntaxTraversal.Traverse(
symbolUseStart,
input,
{ new SyntaxVisitorBase<_>() with
member _.VisitExpr(_path, _traverseSynExpr, defaultTraverse, expr) = defaultTraverse expr

override _.VisitBinding(_path, defaultTraverse, binding) =
match binding with
| SynBinding(expr = SynExpr.Lambda _) when skipLambdas -> defaultTraverse binding
| SynBinding(expr = SynExpr.DotLambda _) when skipLambdas -> defaultTraverse binding
////I need the : before the Return Info
//| SynBinding(expr = SynExpr.Typed _) -> defaultTraverse binding

// Dont skip manually type-annotated bindings
| SynBinding(returnInfo = Some (SynBindingReturnInfo (_, r, _, _))) -> Some r

// Let binding
| SynBinding (trivia = { EqualsRange = Some equalsRange }; range = range) when range.Start = symbolUseStart ->
Some equalsRange.StartRange

// Member binding
| SynBinding (headPat = SynPat.LongIdent(longDotId = SynLongIdent(id = _ :: ident :: _))
trivia = { EqualsRange = Some equalsRange }) when ident.idRange.Start = symbolUseStart ->
Some equalsRange.StartRange

| _ -> defaultTraverse binding
}
)

static member RangeIncludingColon(range: TextSpan, sourceText: SourceText) =

let lineUntilType = TextSpan.FromBounds(0, range.Start)
Expand All @@ -71,7 +39,7 @@ type internal RemoveExplicitReturnType [<ImportingConstructor>] () =
(funcOrValue: FSharpMemberOrFunctionOrValue)
=
let returnTypeHintAlreadyPresent =
RemoveExplicitReturnType.RangeOfReturnTypeDefinition(parseFileResults.ParseTree, symbolUse.Range.Start, false)
parseFileResults.RangeOfReturnTypeDefinition(symbolUse.Range.Start, false)
|> Option.isSome

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

let newSourceText =
RemoveExplicitReturnType.RangeOfReturnTypeDefinition(parseFileResults.ParseTree, symbolUse.Range.Start, false)
parseFileResults.RangeOfReturnTypeDefinition(symbolUse.Range.Start, false)
|> Option.map (fun range -> RoslynHelpers.FSharpRangeToTextSpan(sourceText, range))
|> Option.map (fun textSpan -> RemoveExplicitReturnType.RangeIncludingColon(textSpan, sourceText))
|> Option.map (fun textSpan -> sourceText.Replace(textSpan, ""))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -64,8 +64,7 @@ let TryGetRangeOfExplicitReturnType (symbolName: string) (document: Document) ct

let range =
symbol
|> Option.bind (fun sym ->
RemoveExplicitReturnType.RangeOfReturnTypeDefinition(parseFileResults.ParseTree, sym.DeclarationLocation.Start, false))
|> Option.bind (fun sym -> parseFileResults.RangeOfReturnTypeDefinition(sym.DeclarationLocation.Start, false))

return range
}
Expand Down

0 comments on commit 1065f22

Please sign in to comment.