Skip to content

Commit 337d0af

Browse files
authored
Clean up NameResolution.fs (#14722)
* Clean up NameResolution.fs
1 parent ec1f2e2 commit 337d0af

File tree

3 files changed

+56
-133
lines changed

3 files changed

+56
-133
lines changed

src/Compiler/Checking/NameResolution.fs

Lines changed: 54 additions & 131 deletions
Original file line numberDiff line numberDiff line change
@@ -4297,20 +4297,6 @@ let InfosForTyconConstructors (ncenv: NameResolver) m ad (tcref: TyconRef) =
42974297
let inline notFakeContainerModule (tyconNames: HashSet<_>) nm =
42984298
not (tyconNames.Contains nm)
42994299

4300-
let getFakeContainerModulesFromTycons (tycons:#seq<Tycon>) =
4301-
let hashSet = HashSet()
4302-
for tycon in tycons do
4303-
if tycon.IsILTycon then
4304-
hashSet.Add tycon.DisplayName |> ignore
4305-
hashSet
4306-
4307-
let getFakeContainerModulesFromTyconRefs (tyconRefs:#seq<TyconRef>) =
4308-
let hashSet = HashSet()
4309-
for tyconRef in tyconRefs do
4310-
if tyconRef.IsILTycon then
4311-
hashSet.Add tyconRef.DisplayName |> ignore
4312-
hashSet
4313-
43144300
/// Check is a namespace or module contains something accessible
43154301
let rec private EntityRefContainsSomethingAccessible (ncenv: NameResolver) m ad (modref: ModuleOrNamespaceRef) =
43164302
let g = ncenv.g
@@ -4346,6 +4332,54 @@ let rec private EntityRefContainsSomethingAccessible (ncenv: NameResolver) m ad
43464332
let submodref = modref.NestedTyconRef submod
43474333
EntityRefContainsSomethingAccessible ncenv m ad submodref))
43484334

4335+
let GetVisibleNamespacesAndModulesAtPoint (ncenv: NameResolver) (nenv: NameResolutionEnv) fullyQualified m ad =
4336+
protectAssemblyExploration [] (fun () ->
4337+
let items =
4338+
nenv.ModulesAndNamespaces fullyQualified
4339+
|> NameMultiMap.range
4340+
4341+
if isNil items then
4342+
[]
4343+
else
4344+
let ilTyconNames =
4345+
let hashSet = HashSet()
4346+
for tyconRef in nenv.TyconsByAccessNames(fullyQualified).Values do
4347+
if tyconRef.IsILTycon then
4348+
hashSet.Add tyconRef.DisplayName |> ignore
4349+
hashSet
4350+
4351+
items
4352+
|> List.filter (fun x ->
4353+
let demangledName = x.DemangledModuleOrNamespaceName
4354+
IsInterestingModuleName demangledName && notFakeContainerModule ilTyconNames demangledName
4355+
&& EntityRefContainsSomethingAccessible ncenv m ad x
4356+
&& not (IsTyconUnseen ad ncenv.g ncenv.amap m x)))
4357+
4358+
let GetAccessibleSubModules g (ncenv: NameResolver) (modref: ModuleOrNamespaceRef) m ad =
4359+
let moduleOrNamespaces =
4360+
modref.ModuleOrNamespaceType.ModulesAndNamespacesByDemangledName
4361+
|> NameMap.range
4362+
4363+
if isNil moduleOrNamespaces then
4364+
[]
4365+
else
4366+
let ilTyconNames =
4367+
let hashSet = HashSet()
4368+
for tycon in modref.ModuleOrNamespaceType.TypesByAccessNames.Values do
4369+
if tycon.IsILTycon then
4370+
hashSet.Add tycon.DisplayName |> ignore
4371+
hashSet
4372+
4373+
moduleOrNamespaces
4374+
|> List.filter (fun x ->
4375+
let demangledName = x.DemangledModuleOrNamespaceName
4376+
notFakeContainerModule ilTyconNames demangledName && IsInterestingModuleName demangledName)
4377+
|> List.map modref.NestedTyconRef
4378+
|> List.filter (fun tyref ->
4379+
not (IsTyconUnseen ad g ncenv.amap m tyref) &&
4380+
EntityRefContainsSomethingAccessible ncenv m ad tyref)
4381+
|> List.map ItemForModuleOrNamespaceRef
4382+
43494383
let rec ResolvePartialLongIdentInModuleOrNamespace (ncenv: NameResolver) nenv isApplicableMeth m ad (modref: ModuleOrNamespaceRef) plid allowObsolete =
43504384
let g = ncenv.g
43514385
let mty = modref.ModuleOrNamespaceType
@@ -4357,25 +4391,6 @@ let rec ResolvePartialLongIdentInModuleOrNamespace (ncenv: NameResolver) nenv is
43574391
not (tcref.LogicalName.Contains ",") &&
43584392
not (IsTyconUnseen ad g ncenv.amap m (modref.NestedTyconRef tcref)))
43594393

4360-
let accessibleSubModules =
4361-
let moduleOrNamespaces =
4362-
mty.ModulesAndNamespacesByDemangledName
4363-
|> NameMap.range
4364-
4365-
if isNil moduleOrNamespaces then [] else
4366-
4367-
let ilTyconNames = getFakeContainerModulesFromTycons mty.TypesByAccessNames.Values
4368-
4369-
moduleOrNamespaces
4370-
|> List.filter (fun x ->
4371-
let demangledName = x.DemangledModuleOrNamespaceName
4372-
notFakeContainerModule ilTyconNames demangledName && IsInterestingModuleName demangledName)
4373-
|> List.map modref.NestedTyconRef
4374-
|> List.filter (fun tyref ->
4375-
not (IsTyconUnseen ad g ncenv.amap m tyref) &&
4376-
EntityRefContainsSomethingAccessible ncenv m ad tyref)
4377-
|> List.map ItemForModuleOrNamespaceRef
4378-
43794394
// Collect up the accessible values in the module, excluding the members
43804395
(mty.AllValsAndMembers
43814396
|> Seq.toList
@@ -4402,7 +4417,7 @@ let rec ResolvePartialLongIdentInModuleOrNamespace (ncenv: NameResolver) nenv is
44024417
|> List.filter (IsTyconUnseen ad g ncenv.amap m >> not)
44034418
|> List.map Item.ExnCase)
44044419

4405-
@ accessibleSubModules
4420+
@ GetAccessibleSubModules g ncenv modref m ad
44064421

44074422
// Get all the types and .NET constructor groups accessible from here
44084423
@ (tycons
@@ -4496,20 +4511,7 @@ let rec ResolvePartialLongIdentPrim (ncenv: NameResolver) (nenv: NameResolutionE
44964511
|> List.filter (function Item.ActivePatternCase _v -> true | _ -> false)
44974512

44984513
let moduleAndNamespaceItems =
4499-
let moduleOrNamespaceRefs =
4500-
nenv.ModulesAndNamespaces fullyQualified
4501-
|> NameMultiMap.range
4502-
4503-
if isNil moduleOrNamespaceRefs then [] else
4504-
let ilTyconNames = getFakeContainerModulesFromTyconRefs (nenv.TyconsByAccessNames(fullyQualified).Values)
4505-
4506-
moduleOrNamespaceRefs
4507-
|> List.filter (fun modref ->
4508-
let demangledName = modref.DemangledModuleOrNamespaceName
4509-
IsInterestingModuleName demangledName && notFakeContainerModule ilTyconNames demangledName &&
4510-
EntityRefContainsSomethingAccessible ncenv m ad modref &&
4511-
not (IsTyconUnseen ad g ncenv.amap m modref))
4512-
|> List.map ItemForModuleOrNamespaceRef
4514+
GetVisibleNamespacesAndModulesAtPoint ncenv nenv fullyQualified m ad |> List.map ItemForModuleOrNamespaceRef
45134515

45144516
let tycons =
45154517
nenv.TyconsByDemangledNameAndArity(fullyQualified).Values
@@ -4599,26 +4601,7 @@ let rec ResolvePartialLongIdentInModuleOrNamespaceForRecordFields (ncenv: NameRe
45994601
not (IsTyconUnseen ad g ncenv.amap m (modref.NestedTyconRef tcref)))
46004602

46014603

4602-
let accessibleSubModules =
4603-
let moduleOrNamespaces =
4604-
mty.ModulesAndNamespacesByDemangledName
4605-
|> NameMap.range
4606-
4607-
if isNil moduleOrNamespaces then [] else
4608-
4609-
let ilTyconNames = getFakeContainerModulesFromTycons mty.TypesByAccessNames.Values
4610-
4611-
moduleOrNamespaces
4612-
|> List.filter (fun x ->
4613-
let demangledName = x.DemangledModuleOrNamespaceName
4614-
notFakeContainerModule ilTyconNames demangledName && IsInterestingModuleName demangledName)
4615-
|> List.map modref.NestedTyconRef
4616-
|> List.filter (fun tcref ->
4617-
not (IsTyconUnseen ad g ncenv.amap m tcref) &&
4618-
EntityRefContainsSomethingAccessible ncenv m ad tcref)
4619-
|> List.map ItemForModuleOrNamespaceRef
4620-
4621-
accessibleSubModules
4604+
GetAccessibleSubModules g ncenv modref m ad
46224605

46234606
// Collect all accessible record types
46244607
@ (tycons |> List.map (modref.NestedTyconRef >> ItemOfTyconRef ncenv m) )
@@ -4682,21 +4665,7 @@ and ResolvePartialLongIdentToClassOrRecdFieldsImpl (ncenv: NameResolver) (nenv:
46824665
if fieldsOnly then getRecordFieldsInScope nenv else
46834666

46844667
let mods =
4685-
let moduleOrNamespaceRefs =
4686-
nenv.ModulesAndNamespaces fullyQualified
4687-
|> NameMultiMap.range
4688-
4689-
if isNil moduleOrNamespaceRefs then [] else
4690-
4691-
let ilTyconNames = getFakeContainerModulesFromTyconRefs (nenv.TyconsByAccessNames(fullyQualified).Values)
4692-
4693-
moduleOrNamespaceRefs
4694-
|> List.filter (fun modref ->
4695-
let demangledName = modref.DemangledModuleOrNamespaceName
4696-
IsInterestingModuleName demangledName && notFakeContainerModule ilTyconNames demangledName &&
4697-
EntityRefContainsSomethingAccessible ncenv m ad modref &&
4698-
not (IsTyconUnseen ad g ncenv.amap m modref))
4699-
|> List.map ItemForModuleOrNamespaceRef
4668+
GetVisibleNamespacesAndModulesAtPoint ncenv nenv fullyQualified m ad |> List.map ItemForModuleOrNamespaceRef
47004669

47014670
let recdTyCons =
47024671
nenv.TyconsByDemangledNameAndArity(fullyQualified).Values
@@ -5023,23 +4992,7 @@ let rec ResolvePartialLongIdentInModuleOrNamespaceForItem (ncenv: NameResolver)
50234992
// Collect up the accessible sub-modules. We must yield them even though `item` is not a module or namespace,
50244993
// otherwise we would not resolve long idents which have modules and namespaces in the middle (i.e. all long idents)
50254994

5026-
let moduleOrNamespaces =
5027-
mty.ModulesAndNamespacesByDemangledName
5028-
|> NameMap.range
5029-
5030-
if not (isNil moduleOrNamespaces) then
5031-
let ilTyconNames = getFakeContainerModulesFromTycons mty.TypesByAccessNames.Values
5032-
5033-
yield!
5034-
moduleOrNamespaces
5035-
|> List.filter (fun x ->
5036-
let demangledName = x.DemangledModuleOrNamespaceName
5037-
notFakeContainerModule ilTyconNames demangledName && IsInterestingModuleName demangledName)
5038-
|> List.map modref.NestedTyconRef
5039-
|> List.filter (fun tcref ->
5040-
not (IsTyconUnseen ad g ncenv.amap m tcref) &&
5041-
EntityRefContainsSomethingAccessible ncenv m ad tcref)
5042-
|> List.map ItemForModuleOrNamespaceRef
4995+
yield! GetAccessibleSubModules g ncenv modref m ad
50434996

50444997
let tycons =
50454998
mty.TypeDefinitions
@@ -5117,19 +5070,7 @@ let rec GetCompletionForItem (ncenv: NameResolver) (nenv: NameResolutionEnv) m a
51175070

51185071
match item with
51195072
| Item.ModuleOrNamespaces _ ->
5120-
let moduleOrNamespaceRefs =
5121-
nenv.ModulesAndNamespaces OpenQualified
5122-
|> NameMultiMap.range
5123-
5124-
if not (isNil moduleOrNamespaceRefs) then
5125-
let ilTyconNames = getFakeContainerModulesFromTyconRefs (nenv.TyconsByAccessNames(OpenQualified).Values)
5126-
5127-
for ns in moduleOrNamespaceRefs do
5128-
let demangledName = ns.DemangledModuleOrNamespaceName
5129-
if IsInterestingModuleName demangledName && notFakeContainerModule ilTyconNames demangledName
5130-
&& EntityRefContainsSomethingAccessible ncenv m ad ns
5131-
&& not (IsTyconUnseen ad g ncenv.amap m ns)
5132-
then yield ItemForModuleOrNamespaceRef ns
5073+
yield! GetVisibleNamespacesAndModulesAtPoint ncenv nenv OpenQualified m ad |> List.map ItemForModuleOrNamespaceRef
51335074

51345075
| Item.Types _ ->
51355076
for tcref in nenv.TyconsByDemangledNameAndArity(OpenQualified).Values do
@@ -5183,21 +5124,3 @@ let IsItemResolvable (ncenv: NameResolver) (nenv: NameResolutionEnv) m ad plid (
51835124
GetCompletionForItem ncenv nenv m ad plid item
51845125
|> Seq.exists (ItemsAreEffectivelyEqual ncenv.g item)
51855126
)
5186-
5187-
let GetVisibleNamespacesAndModulesAtPoint (ncenv: NameResolver) (nenv: NameResolutionEnv) m ad =
5188-
protectAssemblyExploration [] (fun () ->
5189-
let items =
5190-
nenv.ModulesAndNamespaces FullyQualifiedFlag.OpenQualified
5191-
|> NameMultiMap.range
5192-
5193-
if isNil items then [] else
5194-
5195-
let ilTyconNames = getFakeContainerModulesFromTyconRefs (nenv.TyconsByAccessNames(FullyQualifiedFlag.OpenQualified).Values)
5196-
5197-
items
5198-
|> List.filter (fun x ->
5199-
let demangledName = x.DemangledModuleOrNamespaceName
5200-
IsInterestingModuleName demangledName && notFakeContainerModule ilTyconNames demangledName
5201-
&& EntityRefContainsSomethingAccessible ncenv m ad x
5202-
&& not (IsTyconUnseen ad ncenv.g ncenv.amap m x))
5203-
)

src/Compiler/Checking/NameResolution.fsi

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -822,7 +822,7 @@ val ResolveCompletionsInType:
822822
Item list
823823

824824
val GetVisibleNamespacesAndModulesAtPoint:
825-
NameResolver -> NameResolutionEnv -> range -> AccessorDomain -> ModuleOrNamespaceRef list
825+
NameResolver -> NameResolutionEnv -> FullyQualifiedFlag -> range -> AccessorDomain -> ModuleOrNamespaceRef list
826826

827827
val IsItemResolvable: NameResolver -> NameResolutionEnv -> range -> AccessorDomain -> string list -> Item -> bool
828828

src/Compiler/Service/FSharpCheckerResults.fs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1435,7 +1435,7 @@ type internal TypeCheckInfo
14351435

14361436
member _.GetVisibleNamespacesAndModulesAtPosition(cursorPos: pos) : ModuleOrNamespaceRef list =
14371437
let (nenv, ad), m = GetBestEnvForPos cursorPos
1438-
GetVisibleNamespacesAndModulesAtPoint ncenv nenv m ad
1438+
GetVisibleNamespacesAndModulesAtPoint ncenv nenv OpenQualified m ad
14391439

14401440
/// Determines if a long ident is resolvable at a specific point.
14411441
member _.IsRelativeNameResolvable(cursorPos: pos, plid: string list, item: Item) : bool =

0 commit comments

Comments
 (0)