From df6f4ec56f123764a17933ceaf294050178c438a Mon Sep 17 00:00:00 2001 From: kerams Date: Wed, 23 Mar 2022 19:08:43 +0100 Subject: [PATCH] Improve record completions --- src/fsharp/service/ServiceParsedInputOps.fs | 7 +++++-- .../tests/UnitTests/CompletionProviderTests.fs | 14 ++++++++++++++ 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/fsharp/service/ServiceParsedInputOps.fs b/src/fsharp/service/ServiceParsedInputOps.fs index bf027df2038..2dc3cfe798d 100644 --- a/src/fsharp/service/ServiceParsedInputOps.fs +++ b/src/fsharp/service/ServiceParsedInputOps.fs @@ -1095,12 +1095,15 @@ module ParsedInput = Some CompletionContext.PatternType | _ -> defaultTraverse ty - member _.VisitRecordDefn(_path, fields, _range) = - fields |> List.tryPick (fun (SynField (idOpt = idOpt; range = fieldRange)) -> + member _.VisitRecordDefn(_path, fields, range) = + fields + |> List.tryPick (fun (SynField (idOpt = idOpt; range = fieldRange)) -> match idOpt with | Some id when rangeContainsPos id.idRange pos -> Some(CompletionContext.RecordField(RecordContext.Declaration true)) | _ when rangeContainsPos fieldRange pos -> Some(CompletionContext.RecordField(RecordContext.Declaration false)) | _ -> None) + // No completions in a record outside of all fields + |> Option.orElseWith (fun () -> if rangeContainsPos range pos then Some CompletionContext.Invalid else None) member _.VisitUnionDefn(_path, cases, _range) = cases |> List.tryPick (fun (SynUnionCase (ident = id; caseType = caseType)) -> diff --git a/vsintegration/tests/UnitTests/CompletionProviderTests.fs b/vsintegration/tests/UnitTests/CompletionProviderTests.fs index 0f362943d66..0238c1cc1a5 100644 --- a/vsintegration/tests/UnitTests/CompletionProviderTests.fs +++ b/vsintegration/tests/UnitTests/CompletionProviderTests.fs @@ -750,6 +750,20 @@ type A = { Field: l } """ VerifyCompletionList(fileContents, "Field: l", ["LanguagePrimitives"; "List"], ["let"; "log"]) +[] +let ``No completion on record stub with no fields at declaration site``() = + let fileContents = """ +type A = { } +""" + VerifyNoCompletionList(fileContents, "{ ") + +[] +let ``No completion on record outside of all fields at declaration site``() = + let fileContents = """ +type A = { Field: string; } +""" + VerifyNoCompletionList(fileContents, "; ") + [] let ``No completion on union case identifier at declaration site``() = let fileContents = """