Skip to content

Commit de6cae9

Browse files
committed
Add tests for pattern name and override suggestions, fix option check
1 parent 02343bf commit de6cae9

File tree

2 files changed

+60
-16
lines changed

2 files changed

+60
-16
lines changed

src/Compiler/Service/FSharpCheckerResults.fs

Lines changed: 7 additions & 5 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,6 +1468,8 @@ type internal TypeCheckInfo
14681468
|> List.mapi (fun index _ -> Item.UnionCaseField(uci, index) |> ItemWithNoInst |> DefaultCompletionItem)
14691469
| _ -> []
14701470

1471+
if not suggestPatternNames then declaredItems else
1472+
14711473
sResolutions.CapturedNameResolutions
14721474
|> ResizeArray.tryPick (fun r ->
14731475
match r.Item with
@@ -1478,7 +1480,7 @@ type internal TypeCheckInfo
14781480
|> Option.defaultValue []
14791481
|> List.append (fields indexOrName isTheOnlyField uci)
14801482

1481-
Some(SuggestNameForUnionCaseFieldPattern g caseIdRange.End pos uci indexOrName isTheOnlyField list, r.DisplayEnv, r.Range)
1483+
Some(SuggestNameForUnionCaseFieldPattern g caseIdRange.End pos uci indexOrName isTheOnlyField list, r.DisplayEnv, r.Range)
14821484
| _ -> None)
14831485
|> Option.orElse declaredItems
14841486

@@ -1999,7 +2001,7 @@ type internal TypeCheckInfo
19992001
getDeclaredItemsNotInRangeOpWithAllSymbols ()
20002002
|> Option.bind (FilterRelevantItemsBy getItem2 None IsTypeCandidate)
20012003

2002-
| Some(CompletionContext.Pattern patternContext) when options.SuggestPatternNames ->
2004+
| Some(CompletionContext.Pattern patternContext) ->
20032005
match patternContext with
20042006
| PatternContext.UnionCaseFieldIdentifier(referencedFields, caseIdRange) ->
20052007
GetUnionCaseFields caseIdRange referencedFields
@@ -2008,10 +2010,10 @@ type internal TypeCheckInfo
20082010
completions, nenv.DisplayEnv, m)
20092011
| PatternContext.PositionalUnionCaseField(fieldIndex, isTheOnlyField, caseIdRange) ->
20102012
getDeclaredItemsNotInRangeOpWithAllSymbols ()
2011-
|> GetCompletionsForUnionCaseField pos (Choice1Of2 fieldIndex) caseIdRange isTheOnlyField
2013+
|> GetCompletionsForUnionCaseField pos (Choice1Of2 fieldIndex) caseIdRange isTheOnlyField options.SuggestPatternNames
20122014
| PatternContext.NamedUnionCaseField(fieldName, caseIdRange) ->
20132015
getDeclaredItemsNotInRangeOpWithAllSymbols ()
2014-
|> GetCompletionsForUnionCaseField pos (Choice2Of2 fieldName) caseIdRange false
2016+
|> GetCompletionsForUnionCaseField pos (Choice2Of2 fieldName) caseIdRange false options.SuggestPatternNames
20152017
| PatternContext.RecordFieldIdentifier referencedFields ->
20162018
getDeclaredItemsNotInRangeOpWithAllSymbols ()
20172019
|> GetCompletionsForRecordField pos referencedFields

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

Lines changed: 53 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -373,24 +373,29 @@ let test = System.Sp{caret}
373373
#endif
374374

375375
module Options =
376+
let private assertItemWithOptions getOption (options: FSharpCodeCompletionOptions list) name source =
377+
options
378+
|> List.iter (fun options ->
379+
let contains = getOption options
380+
let info = Checker.getCompletionInfoWithOptions options source
381+
assertItemsWithNames contains [name] info
382+
)
383+
376384
module AllowObsolete =
377385
let private allowObsoleteOptions = { FSharpCodeCompletionOptions.Default with SuggestObsoleteSymbols = true }
378386
let private disallowObsoleteOptions = { FSharpCodeCompletionOptions.Default with SuggestObsoleteSymbols = false }
379387

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

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

389-
let assertItem name (source) =
390-
assertItemWithOptions true true name source
394+
let assertItemAllowed name source =
395+
assertItemWithOptions [allowObsoleteOptions] name source
391396

392-
let assertItemAllowed name (source) =
393-
assertItemWithOptions true false name source
397+
let assertItemNotAllowed name source =
398+
assertItemWithOptions [disallowObsoleteOptions] name source
394399

395400
[<Fact>]
396401
let ``Prop - Instance 01`` () =
@@ -680,3 +685,40 @@ exception E
680685
try () with E{caret}
681686
"""
682687

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

0 commit comments

Comments
 (0)