Skip to content

Commit ffc3f46

Browse files
authored
Tests: introduce resolve and code completion contexts (#18647)
1 parent a3e5190 commit ffc3f46

File tree

6 files changed

+315
-359
lines changed

6 files changed

+315
-359
lines changed
Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
namespace FSharp.Compiler.Service.Tests
2+
3+
open System
4+
open FSharp.Compiler.CodeAnalysis
5+
open FSharp.Compiler.EditorServices
6+
open FSharp.Compiler.Text
7+
open FSharp.Compiler.Tokenization
8+
9+
type SourceContext =
10+
{ Source: string
11+
LineText: string
12+
CaretPos: pos }
13+
14+
type ResolveContext =
15+
{ SourceContext: SourceContext
16+
Pos: pos
17+
Names: string list }
18+
19+
member this.Source = this.SourceContext.Source
20+
member this.LineText = this.SourceContext.LineText
21+
22+
type CodeCompletionContext =
23+
{ SourceContext: SourceContext
24+
Pos: pos
25+
PartialIdentifier: PartialLongName }
26+
27+
member this.Source = this.SourceContext.Source
28+
member this.LineText = this.SourceContext.LineText
29+
30+
[<RequireQualifiedAccess>]
31+
module SourceContext =
32+
let fromMarkedSource (markedSource: string) : SourceContext =
33+
let lines = markedSource.Split([|"\r\n"; "\n"|], StringSplitOptions.None)
34+
let line = lines |> Seq.findIndex _.Contains("{caret}")
35+
let lineText = lines[line]
36+
let column = lineText.IndexOf("{caret}")
37+
38+
let source = markedSource.Replace("{caret}", "")
39+
let pos = Position.mkPos (line + 1) (column - 1)
40+
let lineText = lineText.Replace("{caret}", "")
41+
{ Source = source; CaretPos = pos; LineText = lineText }
42+
43+
44+
[<AutoOpen>]
45+
module CheckResultsExtensions =
46+
type FSharpCheckFileResults with
47+
member this.GetSymbolUses(context: ResolveContext) =
48+
this.GetSymbolUsesAtLocation(context.Pos.Line, context.Pos.Column, context.LineText, context.Names)
49+
50+
member this.GetSymbolUse(context: ResolveContext) =
51+
this.GetSymbolUses(context) |> List.exactlyOne
52+
53+
member this.GetTooltip(context: ResolveContext) =
54+
this.GetToolTip(context.Pos.Line, context.Pos.Column, context.LineText, context.Names, FSharpTokenTag.Identifier)
55+
56+
member this.GetTooltip(context: ResolveContext, width) =
57+
this.GetToolTip(context.Pos.Line, context.Pos.Column, context.LineText, context.Names, FSharpTokenTag.Identifier, width)
58+
59+
member this.GetCodeCompletionSuggestions(context: CodeCompletionContext, parseResults: FSharpParseFileResults) =
60+
this.GetDeclarationListInfo(Some parseResults, context.Pos.Line, context.LineText, context.PartialIdentifier)
61+
62+
[<RequireQualifiedAccess>]
63+
module Checker =
64+
let getResolveContext (markedSource: string) =
65+
let context = SourceContext.fromMarkedSource markedSource
66+
let pos =
67+
match QuickParse.GetCompleteIdentifierIsland false context.LineText context.CaretPos.Column with
68+
| Some(_, column, _) -> Position.mkPos context.CaretPos.Line column
69+
| _ -> context.CaretPos
70+
71+
let plid = QuickParse.GetPartialLongNameEx(context.LineText, pos.Column - 1)
72+
let names = plid.QualifyingIdents @ [plid.PartialIdent]
73+
{ SourceContext = context; Pos = pos; Names = names }
74+
75+
let getCompletionContext (markedSource: string) =
76+
let context = SourceContext.fromMarkedSource markedSource
77+
let plid = QuickParse.GetPartialLongNameEx(context.LineText, context.CaretPos.Column)
78+
let names = plid.QualifyingIdents @ [plid.PartialIdent]
79+
{ SourceContext = context; Pos = context.CaretPos; PartialIdentifier = plid }
80+
81+
let getCheckedResolveContext (markedSource: string) =
82+
let context = getResolveContext markedSource
83+
let _, checkResults = getParseAndCheckResults context.Source
84+
context, checkResults
85+
86+
let getCompletionInfo (markedSource: string) =
87+
let context = getCompletionContext markedSource
88+
let parseResults, checkResults = getParseAndCheckResults context.Source
89+
checkResults.GetCodeCompletionSuggestions(context, parseResults)
90+
91+
let getSymbolUses (markedSource: string) =
92+
let context, checkResults = getCheckedResolveContext markedSource
93+
checkResults.GetSymbolUses(context)
94+
95+
let getSymbolUse (markedSource: string) =
96+
let symbolUses = getSymbolUses markedSource
97+
symbolUses |> List.exactlyOne
98+
99+
let getTooltipWithOptions (options: string array) (markedSource: string) =
100+
let context = getResolveContext markedSource
101+
let _, checkResults = getParseAndCheckResultsWithOptions options context.Source
102+
checkResults.GetToolTip(context.Pos.Line, context.Pos.Column, context.LineText, context.Names, FSharpTokenTag.Identifier)
103+
104+
let getTooltip (markedSource: string) =
105+
getTooltipWithOptions [||] markedSource

tests/FSharp.Compiler.Service.Tests/Common.fs

Lines changed: 3 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -342,24 +342,6 @@ let rec allSymbolsInEntities compGen (entities: IList<FSharpEntity>) =
342342
yield! allSymbolsInEntities compGen entity.NestedEntities ]
343343

344344

345-
let getCursorPosAndPrepareSource (source: string) : string * string * pos =
346-
let lines = source.Split([|"\r\n"; "\n"|], StringSplitOptions.None)
347-
let line = lines |> Seq.findIndex _.Contains("{caret}")
348-
let lineText = lines[line]
349-
let column = lineText.IndexOf("{caret}")
350-
351-
let source = source.Replace("{caret}", "")
352-
let lineText = lineText.Replace("{caret}", "")
353-
source, lineText, Position.mkPos (line + 1) (column - 1)
354-
355-
let getPartialIdentifierAndPrepareSource source =
356-
let source, lineText, pos = getCursorPosAndPrepareSource source
357-
let _, column, _ = QuickParse.GetCompleteIdentifierIsland false lineText pos.Column |> Option.get
358-
let pos = Position.mkPos pos.Line column
359-
let plid = QuickParse.GetPartialLongNameEx(lineText, column - 1)
360-
let names = plid.QualifyingIdents @ [plid.PartialIdent]
361-
source, lineText, pos, plid, names
362-
363345
let getParseResults (source: string) =
364346
parseSourceCode("Test.fsx", source)
365347

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

354+
let getParseAndCheckResultsWithOptions options source =
355+
parseAndCheckScriptWithOptions ("Test.fsx", source, options)
356+
372357
let getParseAndCheckResultsOfSignatureFile (source: string) =
373358
parseAndCheckScript("Test.fsi", source)
374359

0 commit comments

Comments
 (0)