@@ -4297,20 +4297,6 @@ let InfosForTyconConstructors (ncenv: NameResolver) m ad (tcref: TyconRef) =
42974297let 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
43154301let 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+
43494383let 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- )
0 commit comments