Skip to content

Commit 8eadcb4

Browse files
committed
Add tests for pattern name and override suggestions, fix option check
1 parent 158cf08 commit 8eadcb4

File tree

2 files changed

+84
-28
lines changed

2 files changed

+84
-28
lines changed

src/Compiler/Service/FSharpCheckerResults.fs

Lines changed: 24 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1454,7 +1454,7 @@ type internal TypeCheckInfo
14541454
|> Some
14551455
| _ -> None)
14561456

1457-
let GetCompletionsForUnionCaseField pos indexOrName caseIdRange isTheOnlyField declaredItems =
1457+
let GetCompletionsForUnionCaseField pos indexOrName caseIdRange isTheOnlyField suggestPatternNames declaredItems =
14581458
let declaredItems =
14591459
declaredItems
14601460
|> Option.bind (FilterRelevantItemsBy getItem2 None IsPatternCandidate)
@@ -1468,19 +1468,27 @@ type internal TypeCheckInfo
14681468
|> List.mapi (fun index _ -> Item.UnionCaseField(uci, index) |> ItemWithNoInst |> DefaultCompletionItem)
14691469
| _ -> []
14701470

1471-
sResolutions.CapturedNameResolutions
1472-
|> ResizeArray.tryPick (fun r ->
1473-
match r.Item with
1474-
| Item.UnionCase(uci, _) when equals r.Range caseIdRange ->
1475-
let list =
1476-
declaredItems
1477-
|> Option.map p13
1478-
|> Option.defaultValue []
1479-
|> List.append (fields indexOrName isTheOnlyField uci)
1471+
if not suggestPatternNames then
1472+
declaredItems
1473+
else
14801474

1481-
Some(SuggestNameForUnionCaseFieldPattern g caseIdRange.End pos uci indexOrName isTheOnlyField list, r.DisplayEnv, r.Range)
1482-
| _ -> None)
1483-
|> Option.orElse declaredItems
1475+
sResolutions.CapturedNameResolutions
1476+
|> ResizeArray.tryPick (fun r ->
1477+
match r.Item with
1478+
| Item.UnionCase(uci, _) when equals r.Range caseIdRange ->
1479+
let list =
1480+
declaredItems
1481+
|> Option.map p13
1482+
|> Option.defaultValue []
1483+
|> List.append (fields indexOrName isTheOnlyField uci)
1484+
1485+
Some(
1486+
SuggestNameForUnionCaseFieldPattern g caseIdRange.End pos uci indexOrName isTheOnlyField list,
1487+
r.DisplayEnv,
1488+
r.Range
1489+
)
1490+
| _ -> None)
1491+
|> Option.orElse declaredItems
14841492

14851493
let GetCompletionsForRecordField pos referencedFields declaredItems =
14861494
declaredItems
@@ -1999,7 +2007,7 @@ type internal TypeCheckInfo
19992007
getDeclaredItemsNotInRangeOpWithAllSymbols ()
20002008
|> Option.bind (FilterRelevantItemsBy getItem2 None IsTypeCandidate)
20012009

2002-
| Some(CompletionContext.Pattern patternContext) when options.SuggestPatternNames ->
2010+
| Some(CompletionContext.Pattern patternContext) ->
20032011
match patternContext with
20042012
| PatternContext.UnionCaseFieldIdentifier(referencedFields, caseIdRange) ->
20052013
GetUnionCaseFields caseIdRange referencedFields
@@ -2008,10 +2016,10 @@ type internal TypeCheckInfo
20082016
completions, nenv.DisplayEnv, m)
20092017
| PatternContext.PositionalUnionCaseField(fieldIndex, isTheOnlyField, caseIdRange) ->
20102018
getDeclaredItemsNotInRangeOpWithAllSymbols ()
2011-
|> GetCompletionsForUnionCaseField pos (Choice1Of2 fieldIndex) caseIdRange isTheOnlyField
2019+
|> GetCompletionsForUnionCaseField pos (Choice1Of2 fieldIndex) caseIdRange isTheOnlyField options.SuggestPatternNames
20122020
| PatternContext.NamedUnionCaseField(fieldName, caseIdRange) ->
20132021
getDeclaredItemsNotInRangeOpWithAllSymbols ()
2014-
|> GetCompletionsForUnionCaseField pos (Choice2Of2 fieldName) caseIdRange false
2022+
|> GetCompletionsForUnionCaseField pos (Choice2Of2 fieldName) caseIdRange false options.SuggestPatternNames
20152023
| PatternContext.RecordFieldIdentifier referencedFields ->
20162024
getDeclaredItemsNotInRangeOpWithAllSymbols ()
20172025
|> GetCompletionsForRecordField pos referencedFields

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

Lines changed: 60 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,18 @@
33
open FSharp.Compiler.CodeAnalysis
44
open FSharp.Compiler.EditorServices
55
open FSharp.Test.Assert
6+
open FSharp.Test.Compiler.Assertions.TextBasedDiagnosticAsserts
67
open Xunit
78

89
let private assertItemsWithNames contains names (completionInfo: DeclarationListInfo) =
9-
let itemNames = completionInfo.Items |> Array.map _.NameInCode |> set
10+
let itemNames =
11+
completionInfo.Items
12+
|> Array.map _.NameInCode
13+
|> Array.map normalizeNewLines
14+
|> set
1015

1116
for name in names do
17+
let name = normalizeNewLines name
1218
Set.contains name itemNames |> shouldEqual contains
1319

1420
let assertHasItemWithNames names (completionInfo: DeclarationListInfo) =
@@ -373,24 +379,29 @@ let test = System.Sp{caret}
373379
#endif
374380

375381
module Options =
382+
let private assertItemWithOptions getOption (options: FSharpCodeCompletionOptions list) name source =
383+
options
384+
|> List.iter (fun options ->
385+
let contains = getOption options
386+
let info = Checker.getCompletionInfoWithOptions options source
387+
assertItemsWithNames contains [name] info
388+
)
389+
376390
module AllowObsolete =
377391
let private allowObsoleteOptions = { FSharpCodeCompletionOptions.Default with SuggestObsoleteSymbols = true }
378392
let private disallowObsoleteOptions = { FSharpCodeCompletionOptions.Default with SuggestObsoleteSymbols = false }
379393

380-
let private assertItemWithOptions assertAllowed assertDisallowed name source =
381-
if assertAllowed then
382-
let info = Checker.getCompletionInfoWithOptions allowObsoleteOptions source
383-
assertHasItemWithNames [name] info
394+
let private assertItemWithOptions =
395+
assertItemWithOptions _.SuggestObsoleteSymbols
384396

385-
if assertDisallowed then
386-
let info = Checker.getCompletionInfoWithOptions disallowObsoleteOptions source
387-
assertHasNoItemsWithNames [name] info
397+
let assertItem (name: string) source =
398+
assertItemWithOptions [allowObsoleteOptions; disallowObsoleteOptions] name source
388399

389-
let assertItem name (source) =
390-
assertItemWithOptions true true name source
400+
let assertItemAllowed name source =
401+
assertItemWithOptions [allowObsoleteOptions] name source
391402

392-
let assertItemAllowed name (source) =
393-
assertItemWithOptions true false name source
403+
let assertItemNotAllowed name source =
404+
assertItemWithOptions [disallowObsoleteOptions] name source
394405

395406
[<Fact>]
396407
let ``Prop - Instance 01`` () =
@@ -680,3 +691,40 @@ exception E
680691
try () with E{caret}
681692
"""
682693

694+
695+
module PatternNameSuggestions =
696+
let private suggestPatternNames = { FSharpCodeCompletionOptions.Default with SuggestPatternNames = true }
697+
let private doNotSuggestPatternNames = { FSharpCodeCompletionOptions.Default with SuggestPatternNames = false }
698+
699+
let assertItemWithOptions =
700+
assertItemWithOptions _.SuggestPatternNames
701+
702+
let assertItem name source =
703+
assertItemWithOptions [suggestPatternNames; doNotSuggestPatternNames] name source
704+
705+
[<Fact>]
706+
let ``Union case field 01`` () =
707+
assertItem "named" """
708+
type U =
709+
| A of named: int
710+
711+
match A 1 with
712+
| A n{caret}
713+
"""
714+
715+
module OverrideSuggestions =
716+
let private suggestOverrides = { FSharpCodeCompletionOptions.Default with SuggestGeneratedOverrides = true }
717+
let private doNotSuggestOverrides = { FSharpCodeCompletionOptions.Default with SuggestGeneratedOverrides = false }
718+
719+
let assertItemWithOptions =
720+
assertItemWithOptions _.SuggestGeneratedOverrides
721+
722+
let assertItem name source =
723+
assertItemWithOptions [suggestOverrides; doNotSuggestOverrides] name source
724+
725+
[<Fact>]
726+
let ``Override 01`` () =
727+
assertItem "this.ToString (): string = \n base.ToString()" """
728+
type T() =
729+
override {caret}
730+
"""

0 commit comments

Comments
 (0)