Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
105 changes: 105 additions & 0 deletions tests/FSharp.Compiler.Service.Tests/Checker.fs
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
namespace FSharp.Compiler.Service.Tests

open System
open FSharp.Compiler.CodeAnalysis
open FSharp.Compiler.EditorServices
open FSharp.Compiler.Text
open FSharp.Compiler.Tokenization

type SourceContext =
{ Source: string
LineText: string
CaretPos: pos }

type ResolveContext =
{ SourceContext: SourceContext
Pos: pos
Names: string list }

member this.Source = this.SourceContext.Source
member this.LineText = this.SourceContext.LineText

type CodeCompletionContext =
{ SourceContext: SourceContext
Pos: pos
PartialIdentifier: PartialLongName }

member this.Source = this.SourceContext.Source
member this.LineText = this.SourceContext.LineText

[<RequireQualifiedAccess>]
module SourceContext =
let fromMarkedSource (markedSource: string) : SourceContext =
let lines = markedSource.Split([|"\r\n"; "\n"|], StringSplitOptions.None)
let line = lines |> Seq.findIndex _.Contains("{caret}")
let lineText = lines[line]
let column = lineText.IndexOf("{caret}")

let source = markedSource.Replace("{caret}", "")
let pos = Position.mkPos (line + 1) (column - 1)
let lineText = lineText.Replace("{caret}", "")
{ Source = source; CaretPos = pos; LineText = lineText }


[<AutoOpen>]
module CheckResultsExtensions =
type FSharpCheckFileResults with
member this.GetSymbolUses(context: ResolveContext) =
this.GetSymbolUsesAtLocation(context.Pos.Line, context.Pos.Column, context.LineText, context.Names)

member this.GetSymbolUse(context: ResolveContext) =
this.GetSymbolUses(context) |> List.exactlyOne

member this.GetTooltip(context: ResolveContext) =
this.GetToolTip(context.Pos.Line, context.Pos.Column, context.LineText, context.Names, FSharpTokenTag.Identifier)

member this.GetTooltip(context: ResolveContext, width) =
this.GetToolTip(context.Pos.Line, context.Pos.Column, context.LineText, context.Names, FSharpTokenTag.Identifier, width)

member this.GetCodeCompletionSuggestions(context: CodeCompletionContext, parseResults: FSharpParseFileResults) =
this.GetDeclarationListInfo(Some parseResults, context.Pos.Line, context.LineText, context.PartialIdentifier)

[<RequireQualifiedAccess>]
module Checker =
let getResolveContext (markedSource: string) =
let context = SourceContext.fromMarkedSource markedSource
let pos =
match QuickParse.GetCompleteIdentifierIsland false context.LineText context.CaretPos.Column with
| Some(_, column, _) -> Position.mkPos context.CaretPos.Line column
| _ -> context.CaretPos

let plid = QuickParse.GetPartialLongNameEx(context.LineText, pos.Column - 1)
let names = plid.QualifyingIdents @ [plid.PartialIdent]
{ SourceContext = context; Pos = pos; Names = names }

let getCompletionContext (markedSource: string) =
let context = SourceContext.fromMarkedSource markedSource
let plid = QuickParse.GetPartialLongNameEx(context.LineText, context.CaretPos.Column)
let names = plid.QualifyingIdents @ [plid.PartialIdent]
{ SourceContext = context; Pos = context.CaretPos; PartialIdentifier = plid }

let getCheckedResolveContext (markedSource: string) =
let context = getResolveContext markedSource
let _, checkResults = getParseAndCheckResults context.Source
context, checkResults

let getCompletionInfo (markedSource: string) =
let context = getCompletionContext markedSource
let parseResults, checkResults = getParseAndCheckResults context.Source
checkResults.GetCodeCompletionSuggestions(context, parseResults)

let getSymbolUses (markedSource: string) =
let context, checkResults = getCheckedResolveContext markedSource
checkResults.GetSymbolUses(context)

let getSymbolUse (markedSource: string) =
let symbolUses = getSymbolUses markedSource
symbolUses |> List.exactlyOne

let getTooltipWithOptions (options: string array) (markedSource: string) =
let context = getResolveContext markedSource
let _, checkResults = getParseAndCheckResultsWithOptions options context.Source
checkResults.GetToolTip(context.Pos.Line, context.Pos.Column, context.LineText, context.Names, FSharpTokenTag.Identifier)

let getTooltip (markedSource: string) =
getTooltipWithOptions [||] markedSource
21 changes: 3 additions & 18 deletions tests/FSharp.Compiler.Service.Tests/Common.fs
Original file line number Diff line number Diff line change
Expand Up @@ -342,24 +342,6 @@ let rec allSymbolsInEntities compGen (entities: IList<FSharpEntity>) =
yield! allSymbolsInEntities compGen entity.NestedEntities ]


let getCursorPosAndPrepareSource (source: string) : string * string * pos =
let lines = source.Split([|"\r\n"; "\n"|], StringSplitOptions.None)
let line = lines |> Seq.findIndex _.Contains("{caret}")
let lineText = lines[line]
let column = lineText.IndexOf("{caret}")

let source = source.Replace("{caret}", "")
let lineText = lineText.Replace("{caret}", "")
source, lineText, Position.mkPos (line + 1) (column - 1)

let getPartialIdentifierAndPrepareSource source =
let source, lineText, pos = getCursorPosAndPrepareSource source
let _, column, _ = QuickParse.GetCompleteIdentifierIsland false lineText pos.Column |> Option.get
let pos = Position.mkPos pos.Line column
let plid = QuickParse.GetPartialLongNameEx(lineText, column - 1)
let names = plid.QualifyingIdents @ [plid.PartialIdent]
source, lineText, pos, plid, names

let getParseResults (source: string) =
parseSourceCode("Test.fsx", source)

Expand All @@ -369,6 +351,9 @@ let getParseResultsOfSignatureFile (source: string) =
let getParseAndCheckResults (source: string) =
parseAndCheckScript("Test.fsx", source)

let getParseAndCheckResultsWithOptions options source =
parseAndCheckScriptWithOptions ("Test.fsx", source, options)

let getParseAndCheckResultsOfSignatureFile (source: string) =
parseAndCheckScript("Test.fsi", source)

Expand Down
Loading
Loading