Skip to content

Commit c9c1350

Browse files
committed
Fix qualified field lookup
1 parent d551589 commit c9c1350

File tree

3 files changed

+18
-17
lines changed

3 files changed

+18
-17
lines changed

src/fsharp/NameResolution.fs

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4483,20 +4483,21 @@ let getRecordFieldsInScope nenv =
44834483

44844484
/// allowObsolete - specifies whether we should return obsolete types & modules
44854485
/// as (no other obsolete items are returned)
4486-
let rec ResolvePartialLongIdentToClassOrRecdFields (ncenv: NameResolver) (nenv: NameResolutionEnv) m ad plid (allowObsolete: bool) =
4487-
ResolvePartialLongIdentToClassOrRecdFieldsImpl ncenv nenv OpenQualified m ad plid allowObsolete
4486+
let rec ResolvePartialLongIdentToClassOrRecdFields (ncenv: NameResolver) (nenv: NameResolutionEnv) m ad plid (allowObsolete: bool) (fieldsOnly: bool) =
4487+
ResolvePartialLongIdentToClassOrRecdFieldsImpl ncenv nenv OpenQualified m ad plid allowObsolete fieldsOnly
44884488

4489-
and ResolvePartialLongIdentToClassOrRecdFieldsImpl (ncenv: NameResolver) (nenv: NameResolutionEnv) fullyQualified m ad plid allowObsolete =
4489+
and ResolvePartialLongIdentToClassOrRecdFieldsImpl (ncenv: NameResolver) (nenv: NameResolutionEnv) fullyQualified m ad plid allowObsolete fieldsOnly =
44904490
let g = ncenv.g
44914491

44924492
match plid with
44934493
| id :: plid when id = "global" -> // this is deliberately not the mangled name
44944494
// dive deeper
4495-
ResolvePartialLongIdentToClassOrRecdFieldsImpl ncenv nenv FullyQualified m ad plid allowObsolete
4495+
ResolvePartialLongIdentToClassOrRecdFieldsImpl ncenv nenv FullyQualified m ad plid allowObsolete fieldsOnly
44964496
| [] ->
44974497

44984498
// empty plid - return namespaces\modules\record types\accessible fields
44994499

4500+
if fieldsOnly then getRecordFieldsInScope nenv else
45004501

45014502
let mods =
45024503
let moduleOrNamespaceRefs =
@@ -4524,7 +4525,8 @@ and ResolvePartialLongIdentToClassOrRecdFieldsImpl (ncenv: NameResolver) (nenv:
45244525
|> Seq.map (ItemOfTyconRef ncenv m)
45254526
|> Seq.toList
45264527

4527-
let recdFields = getRecordFieldsInScope nenv
4528+
let recdFields =
4529+
getRecordFieldsInScope nenv
45284530

45294531
mods @ recdTyCons @ recdFields
45304532

@@ -4540,7 +4542,7 @@ and ResolvePartialLongIdentToClassOrRecdFieldsImpl (ncenv: NameResolver) (nenv:
45404542

45414543
let qualifiedFields =
45424544
match rest with
4543-
| [] ->
4545+
| [] when not fieldsOnly ->
45444546
// get record types accessible in given nenv
45454547
let tycons = LookupTypeNameInEnvNoArity OpenQualified id nenv
45464548
tycons

src/fsharp/NameResolution.fsi

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -560,7 +560,7 @@ val internal ResolveExprLongIdent : TcResultsSink -> NameResolver -
560560
val internal getRecordFieldsInScope: NameResolutionEnv -> Item list
561561

562562
/// Resolve a (possibly incomplete) long identifier to a loist of possible class or record fields
563-
val internal ResolvePartialLongIdentToClassOrRecdFields: NameResolver -> NameResolutionEnv -> range -> AccessorDomain -> string list -> bool -> Item list
563+
val internal ResolvePartialLongIdentToClassOrRecdFields: NameResolver -> NameResolutionEnv -> range -> AccessorDomain -> string list -> bool -> bool -> Item list
564564

565565
/// Return the fields for the given class or record
566566
val internal ResolveRecordOrClassFieldsOfType : NameResolver -> range -> AccessorDomain -> TType -> bool -> Item list

src/fsharp/service/FSharpCheckerResults.fs

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -633,9 +633,9 @@ type internal TypeCheckInfo
633633
GetEnvironmentLookupResolutions(nenv, ad, m, plid, filterCtors, showObsolete)
634634

635635
/// Find record fields in the best naming environment.
636-
let GetClassOrRecordFieldsEnvironmentLookupResolutions(cursorPos, plid) =
636+
let GetClassOrRecordFieldsEnvironmentLookupResolutions(cursorPos, plid, fieldsOnly) =
637637
let (nenv, ad),m = GetBestEnvForPos cursorPos
638-
let items = ResolvePartialLongIdentToClassOrRecdFields ncenv nenv m ad plid false
638+
let items = ResolvePartialLongIdentToClassOrRecdFields ncenv nenv m ad plid false fieldsOnly
639639
let items = items |> List.map ItemWithNoInst
640640
let items = items |> RemoveDuplicateItems g
641641
let items = items |> RemoveExplicitlySuppressed g
@@ -909,14 +909,14 @@ type internal TypeCheckInfo
909909
items |> List.map DefaultCompletionItem, denv, m
910910

911911
/// Find record fields in the best naming environment.
912-
let GetEnvironmentLookupResolutionsIncludingRecordFieldsAtPosition cursorPos envItems =
912+
let GetEnvironmentLookupResolutionsIncludingRecordFieldsAtPosition cursorPos plid envItems =
913913
// An empty record expression may be completed into something like these:
914914
// { XXX = ... }
915915
// { xxx with XXX ... }
916916
// Provide both expression items in scope and available record fields.
917917
let (nenv, _), m = GetBestEnvForPos cursorPos
918918

919-
let fieldItems = getRecordFieldsInScope nenv |> List.map ItemWithNoInst
919+
let fieldItems, _, _ = GetClassOrRecordFieldsEnvironmentLookupResolutions(cursorPos, plid, true)
920920
let fieldCompletionItems, _, _ as fieldsResult = (fieldItems, nenv.DisplayEnv, m) |> toCompletionItems
921921

922922
match envItems with
@@ -970,10 +970,10 @@ type internal TypeCheckInfo
970970
if isFirstField then
971971
let cursorPos = mkPos line loc
972972
let envItems = GetDeclaredItems (parseResultsOpt, lineStr, origLongIdentOpt, colAtEndOfNamesAndResidue, residueOpt, lastDotPos, line, loc, filterCtors,resolveOverloads, false, fun () -> [])
973-
GetEnvironmentLookupResolutionsIncludingRecordFieldsAtPosition cursorPos envItems
973+
GetEnvironmentLookupResolutionsIncludingRecordFieldsAtPosition cursorPos plid envItems
974974
else
975975
// { x. } can be either record construction or computation expression. Try to get all visible record fields first
976-
match GetClassOrRecordFieldsEnvironmentLookupResolutions(mkPos line loc, plid) |> toCompletionItems with
976+
match GetClassOrRecordFieldsEnvironmentLookupResolutions(mkPos line loc, plid, false) |> toCompletionItems with
977977
| [],_,_ ->
978978
// no record fields found, return completion list as if we were outside any computation expression
979979
GetDeclaredItems (parseResultsOpt, lineStr, origLongIdentOpt, colAtEndOfNamesAndResidue, residueOpt, lastDotPos, line, loc, filterCtors,resolveOverloads, false, fun() -> [])
@@ -983,22 +983,21 @@ type internal TypeCheckInfo
983983
| Some(CompletionContext.RecordField RecordContext.Empty) ->
984984
let cursorPos = mkPos line loc
985985
let envItems = GetDeclaredItems (parseResultsOpt, lineStr, origLongIdentOpt, colAtEndOfNamesAndResidue, residueOpt, lastDotPos, line, loc, filterCtors,resolveOverloads, false, fun () -> [])
986-
GetEnvironmentLookupResolutionsIncludingRecordFieldsAtPosition cursorPos envItems
987-
986+
GetEnvironmentLookupResolutionsIncludingRecordFieldsAtPosition cursorPos [] envItems
988987

989988
// Completion at ' { XXX = ... with ... } "
990989
| Some(CompletionContext.RecordField(RecordContext.CopyOnUpdate(r, (plid, _)))) ->
991990
match GetRecdFieldsForExpr(r) with
992991
| None ->
993-
Some (GetClassOrRecordFieldsEnvironmentLookupResolutions(mkPos line loc, plid))
992+
Some (GetClassOrRecordFieldsEnvironmentLookupResolutions(mkPos line loc, plid, false))
994993
|> Option.map toCompletionItems
995994
| Some (items, denv, m) ->
996995
Some (List.map ItemWithNoInst items, denv, m)
997996
|> Option.map toCompletionItems
998997

999998
// Completion at ' { XXX = ... with ... } "
1000999
| Some(CompletionContext.RecordField(RecordContext.Constructor(typeName))) ->
1001-
Some(GetClassOrRecordFieldsEnvironmentLookupResolutions(mkPos line loc, [typeName]))
1000+
Some(GetClassOrRecordFieldsEnvironmentLookupResolutions(mkPos line loc, [typeName], false))
10021001
|> Option.map toCompletionItems
10031002

10041003
// No completion at '...: string'

0 commit comments

Comments
 (0)