@@ -343,20 +343,20 @@ type NameResolutionEnv =
343343}
344344
345345/// The initial, empty name resolution environment. The mother of all things.
346- static member Empty ( g ) =
347- { eDisplayEnv= DisplayEnv.Empty g
348- eModulesAndNamespaces= Map.empty
346+ static member Empty g =
347+ { eDisplayEnv= DisplayEnv.Empty g
348+ eModulesAndNamespaces= Map.empty
349349 eFullyQualifiedModulesAndNamespaces= Map.empty
350- eFieldLabels= Map.empty
351- eUnqualifiedItems= LayeredMap.Empty
352- ePatItems= Map.empty
353- eTyconsByAccessNames= LayeredMultiMap.Empty
354- eTyconsByDemangledNameAndArity= LayeredMap.Empty
355- eFullyQualifiedTyconsByAccessNames= LayeredMultiMap.Empty
356- eFullyQualifiedTyconsByDemangledNameAndArity= LayeredMap.Empty
357- eIndexedExtensionMembers= TyconRefMultiMap<_>. Empty
358- eUnindexedExtensionMembers= []
359- eTypars= Map.empty}
350+ eFieldLabels= Map.empty
351+ eUnqualifiedItems= LayeredMap.Empty
352+ ePatItems= Map.empty
353+ eTyconsByAccessNames= LayeredMultiMap.Empty
354+ eTyconsByDemangledNameAndArity= LayeredMap.Empty
355+ eFullyQualifiedTyconsByAccessNames= LayeredMultiMap.Empty
356+ eFullyQualifiedTyconsByDemangledNameAndArity= LayeredMap.Empty
357+ eIndexedExtensionMembers= TyconRefMultiMap<_>. Empty
358+ eUnindexedExtensionMembers= []
359+ eTypars= Map.empty}
360360
361361member nenv.DisplayEnv = nenv.eDisplayEnv
362362
@@ -400,7 +400,12 @@ let private GetCSharpStyleIndexedExtensionMembersForTyconRef (amap:Import.Import
400400let minfos = GetImmediateIntrinsicMethInfosOfType( None, AccessorDomain.AccessibleFromSomeFSharpCode) g amap m typ
401401[ for minfoin minfosdo
402402// Method must be static, have 'Extension' attribute, must not be curried, must have at least one argument
403- if not minfo.IsInstance&& not minfo.IsExtensionMember&& MethInfoHasAttribute g m g.attrib_ ExtensionAttribute minfo&& minfo.NumArgs.Length= 1 && minfo.NumArgs.Head>= 1 then
403+ if not minfo.IsInstance&&
404+ not minfo.IsExtensionMember&&
405+ minfo.NumArgs.Length= 1 &&
406+ minfo.NumArgs.Head>= 1 &&
407+ MethInfoHasAttribute g m g.attrib_ ExtensionAttribute minfo
408+ then
404409let ilExtMem = ILExtMem( tcrefOfStaticClass, minfo, pri)
405410
406411// The results are indexed by the TyconRef of the first 'this' argument, if any.
@@ -443,7 +448,7 @@ let private GetCSharpStyleIndexedExtensionMembersForTyconRef (amap:Import.Import
443448match thisTyconRefwith
444449| None-> ()
445450| Some( Some tcref) -> yield Choice1Of2( tcref, ilExtMem)
446- | Some None-> yield Choice2Of2 ilExtMem]
451+ | Some None-> yield Choice2Of2 ilExtMem]
447452else
448453[]
449454
@@ -488,16 +493,17 @@ let AddValRefToExtensionMembers pri (eIndexedExtensionMembers: TyconRefMultiMap<
488493
489494/// This entrypoint is used to add some extra items to the environment for Visual Studio, e.g. static members
490495let AddFakeNamedValRefToNameEnv nm nenv vref =
491- { nenvwith eUnqualifiedItems= nenv.eUnqualifiedItems.Add( nm, Item.Value vref) }
496+ { nenvwith eUnqualifiedItems= nenv.eUnqualifiedItems.Add( nm, Item.Value vref) }
492497
493498/// This entrypoint is used to add some extra items to the environment for Visual Studio, e.g. record members
494499let AddFakeNameToNameEnv nm nenv item =
495- { nenvwith eUnqualifiedItems= nenv.eUnqualifiedItems.Add( nm, item) }
500+ { nenvwith eUnqualifiedItems= nenv.eUnqualifiedItems.Add( nm, item) }
496501
497502/// Add an F# value to the table of available active patterns
498503let AddValRefsToActivePatternsNameEnv ePatItems ( vref : ValRef ) =
499504let ePatItems =
500- ( ActivePatternElemsOfValRef vref, ePatItems) ||> List.foldBack( fun apref tab ->
505+ ( ActivePatternElemsOfValRef vref, ePatItems)
506+ ||> List.foldBack( fun apref tab ->
501507 NameMap.add apref.Name( Item.ActivePatternCase apref) tab)
502508
503509// Add literal constants to the environment available for resolving items in patterns
@@ -531,12 +537,12 @@ let AddValRefToNameEnv nenv (vref:ValRef) =
531537
532538/// Add a set of active pattern result tags to the environment.
533539let AddActivePatternResultTagsToNameEnv ( apinfo : PrettyNaming.ActivePatternInfo ) nenv ty m =
534- let nms = apinfo.Names
535- let apresl = nms |> List.mapi ( fun j nm -> nm , j )
540+ if apinfo.Names.Length = 0 then nenv else
541+ let apresl = List.indexed apinfo.Names
536542{ nenvwith
537543 eUnqualifiedItems=
538544( apresl, nenv.eUnqualifiedItems)
539- ||> List.foldBack( fun ( nm , j ) acc -> acc.Add( nm, Item.ActivePatternResult( apinfo, ty, j, m))) }
545+ ||> List.foldBack( fun ( j , nm ) acc -> acc.Add( nm, Item.ActivePatternResult( apinfo, ty, j, m))) }
540546
541547/// Generalize a union case, from Cons --> List<T>.Cons
542548let GeneralizeUnionCaseRef ( ucref : UnionCaseRef ) =
@@ -545,14 +551,22 @@ let GeneralizeUnionCaseRef (ucref:UnionCaseRef) =
545551
546552/// Add type definitions to the sub-table of the environment indexed by name and arity
547553let AddTyconsByDemangledNameAndArity ( bulkAddMode : BulkAdd ) ( tcrefs : TyconRef []) ( tab : LayeredMap < NameArityPair , TyconRef >) =
548- let entries = tcrefs|> Array.map( fun tcref -> KeyTyconByDemangledNameAndArity tcref.LogicalName tcref.TyparsNoRange tcref)
554+ if tcrefs.Length= 0 then tabelse
555+ let entries =
556+ tcrefs
557+ |> Array.map( fun tcref -> KeyTyconByDemangledNameAndArity tcref.LogicalName tcref.TyparsNoRange tcref)
558+
549559match bulkAddModewith
550560| BulkAdd.Yes-> tab.AddAndMarkAsCollapsible entries
551561| BulkAdd.No-> ( tab, entries) ||> Array.fold( fun tab ( KeyValue ( k , v )) -> tab.Add( k, v))
552562
553563/// Add type definitions to the sub-table of the environment indexed by access name
554- let AddTyconByAccessNames bulkAddMode ( tcrefs : TyconRef []) ( tab : LayeredMultiMap < string , _ >) =
555- let entries = tcrefs|> Array.collect( fun tcref -> KeyTyconByAccessNames tcref.LogicalName tcref)
564+ let AddTyconByAccessNames bulkAddMode ( tcrefs : TyconRef []) ( tab : LayeredMultiMap < string , _ >) =
565+ if tcrefs.Length= 0 then tabelse
566+ let entries =
567+ tcrefs
568+ |> Array.collect( fun tcref -> KeyTyconByAccessNames tcref.LogicalName tcref)
569+
556570match bulkAddModewith
557571| BulkAdd.Yes-> tab.AddAndMarkAsCollapsible entries
558572| BulkAdd.No-> ( tab, entries) ||> Array.fold( fun tab ( KeyValue ( k , v )) -> tab.Add( k, v))
@@ -652,27 +666,33 @@ let TryFindPatternByName name {ePatItems = patternMap} =
652666 NameMap.tryFind name patternMap
653667
654668/// Add a set of type definitions to the name resolution environment
655- let AddTyconRefsToNameEnv bulkAddMode ownDefinition g amap m root nenv tcrefs =
669+ let AddTyconRefsToNameEnv bulkAddMode ownDefinition g amap m root nenv tcrefs =
656670if isNil tcrefsthen nenvelse
657671let env = List.fold( AddPartsOfTyconRefToNameEnv bulkAddMode ownDefinition g amap m) nenv tcrefs
658672// Add most of the contents of the tycons en-masse, then flatten the tables if we're opening a module or namespace
659673let tcrefs = Array.ofList tcrefs
660674{ envwith
661- eFullyQualifiedTyconsByDemangledNameAndArity=
662- ( if rootthen AddTyconsByDemangledNameAndArity bulkAddMode tcrefs nenv.eFullyQualifiedTyconsByDemangledNameAndArityelse nenv.eFullyQualifiedTyconsByDemangledNameAndArity)
663- eFullyQualifiedTyconsByAccessNames=
664- ( if rootthen AddTyconByAccessNames bulkAddMode tcrefs nenv.eFullyQualifiedTyconsByAccessNameselse nenv.eFullyQualifiedTyconsByAccessNames)
665- eTyconsByDemangledNameAndArity=
675+ eFullyQualifiedTyconsByDemangledNameAndArity=
676+ if rootthen
677+ AddTyconsByDemangledNameAndArity bulkAddMode tcrefs nenv.eFullyQualifiedTyconsByDemangledNameAndArity
678+ else
679+ nenv.eFullyQualifiedTyconsByDemangledNameAndArity
680+ eFullyQualifiedTyconsByAccessNames=
681+ if rootthen
682+ AddTyconByAccessNames bulkAddMode tcrefs nenv.eFullyQualifiedTyconsByAccessNames
683+ else
684+ nenv.eFullyQualifiedTyconsByAccessNames
685+ eTyconsByDemangledNameAndArity=
666686 AddTyconsByDemangledNameAndArity bulkAddMode tcrefs nenv.eTyconsByDemangledNameAndArity
667- eTyconsByAccessNames=
687+ eTyconsByAccessNames=
668688 AddTyconByAccessNames bulkAddMode tcrefs nenv.eTyconsByAccessNames}
669689
670690/// Add an F# exception definition to the name resolution environment
671691let AddExceptionDeclsToNameEnv bulkAddMode nenv ( ecref : TyconRef ) =
672692assert ecref.IsExceptionDecl
673693let item = Item.ExnCase ecref
674694{ nenvwith
675- eUnqualifiedItems=
695+ eUnqualifiedItems=
676696match bulkAddModewith
677697| BulkAdd.Yes->
678698 nenv.eUnqualifiedItems.AddAndMarkAsCollapsible[| KeyValuePair( ecref.LogicalName, item) |]
@@ -682,9 +702,9 @@ let AddExceptionDeclsToNameEnv bulkAddMode nenv (ecref:TyconRef) =
682702 ePatItems= nenv.ePatItems.Add( ecref.LogicalName, item) }
683703
684704/// Add a module abbreviation to the name resolution environment
685- let AddModuleAbbrevToNameEnv ( id : Ident ) nenv modrefs =
705+ let AddModuleAbbrevToNameEnv ( id : Ident ) nenv modrefs =
686706{ nenvwith
687- eModulesAndNamespaces=
707+ eModulesAndNamespaces=
688708let add old nw = nw@ old
689709 NameMap.layerAdditive add( Map.add id.idText modrefs Map.empty) nenv.eModulesAndNamespaces}
690710
@@ -701,6 +721,7 @@ let MakeNestedModuleRefs (modref: ModuleOrNamespaceRef) =
701721//
702722// Recursive because of "AutoOpen", i.e. adding a module reference may automatically open further modules
703723let rec AddModuleOrNamespaceRefsToNameEnv g amap m root ad nenv ( modrefs : ModuleOrNamespaceRef list ) =
724+ if isNil modrefsthen nenvelse
704725let modrefsMap = modrefs|> NameMap.ofKeyedList( fun modref -> modref.DemangledModuleOrNamespaceName)
705726let addModrefs tab =
706727let add old nw =
@@ -711,11 +732,12 @@ let rec AddModuleOrNamespaceRefsToNameEnv g amap m root ad nenv (modrefs: Module
711732 NameMap.layerAdditive add modrefsMap tab
712733let nenv =
713734{ nenvwith
714- eModulesAndNamespaces= addModrefs nenv.eModulesAndNamespaces
735+ eModulesAndNamespaces= addModrefs nenv.eModulesAndNamespaces
715736 eFullyQualifiedModulesAndNamespaces=
716- ( if root
717- then addModrefs nenv.eFullyQualifiedModulesAndNamespaces
718- else nenv.eFullyQualifiedModulesAndNamespaces) }
737+ if rootthen
738+ addModrefs nenv.eFullyQualifiedModulesAndNamespaces
739+ else
740+ nenv.eFullyQualifiedModulesAndNamespaces}
719741let nenv =
720742( nenv, modrefs) ||> List.fold( fun nenv modref ->
721743if modref.IsModule&& TryFindFSharpBoolAttribute g g.attrib_ AutoOpenAttribute modref.Attribs= Sometrue then
@@ -751,7 +773,8 @@ and AddModuleOrNamespaceContentsToNameEnv (g:TcGlobals) amap (ad:AccessorDomain)
751773|> List.choose( fun x -> if IsAccessible ad x.Accessibilitythen TryMkValRefInModRef modref xelse None)
752774|> List.toArray
753775let nenv = AddValRefsToNameEnvWithPriority BulkAdd.Yes pri nenv vrefs
754- let nenv = ( nenv, MakeNestedModuleRefs modref) ||> AddModuleOrNamespaceRefsToNameEnv g amap m root ad
776+ let nestedModules = MakeNestedModuleRefs modref
777+ let nenv = ( nenv, nestedModules) ||> AddModuleOrNamespaceRefsToNameEnv g amap m root ad
755778 nenv
756779
757780/// Add a set of modules or namespaces to the name resolution environment
@@ -781,14 +804,14 @@ let AddDeclaredTyparsToNameEnv check nenv typars =
781804let typarmap =
782805 List.foldBack
783806( fun ( tp : Typar ) sofar ->
784- begin match checkwith
807+ match checkwith
785808| CheckForDuplicateTypars->
786- if Map.containsKey tp.Name sofarthen errorR ( Duplicate ( " type parameter " , tp.DisplayName , tp.Range ))
787- | NoCheckForDuplicateTypars ->
788- ()
789- end
809+ if Map.containsKey tp.Name sofarthen
810+ errorR ( Duplicate ( " type parameter " , tp.DisplayName , tp.Range ))
811+ | NoCheckForDuplicateTypars -> ()
812+
790813 Map.add tp.Name tp sofar) typars Map.empty
791- { nenvwith eTypars= NameMap.layer typarmap nenv.eTypars}
814+ { nenvwith eTypars= NameMap.layer typarmap nenv.eTypars}
792815
793816
794817//-------------------------------------------------------------------------
@@ -989,11 +1012,11 @@ let LookupTypeNameNoArity nm (byDemangledNameAndArity: LayeredMap<NameArityPair,
9891012
9901013/// Qualified lookup of type names in the environment
9911014let LookupTypeNameInEnvNoArity fq nm ( nenv : NameResolutionEnv ) =
992- LookupTypeNameNoArity nm( nenv.TyconsByDemangledNameAndArity( fq)) ( nenv.TyconsByAccessNames( fq ) )
1015+ LookupTypeNameNoArity nm( nenv.TyconsByDemangledNameAndArity fq) ( nenv.TyconsByAccessNames fq )
9931016
9941017/// Qualified lookup of type names in an entity
9951018let LookupTypeNameInEntityNoArity m nm ( mtyp : ModuleOrNamespaceType ) =
996- LookupTypeNameNoArity nm( mtyp.TypesByDemangledNameAndArity( m ) ) mtyp.TypesByAccessNames
1019+ LookupTypeNameNoArity nm( mtyp.TypesByDemangledNameAndArity m ) mtyp.TypesByAccessNames
9971020
9981021/// Qualified lookup of type names in an entity where we may know a generic argument count
9991022let LookupTypeNameInEnvMaybeHaveArity fq nm ( typeNameResInfo : TypeNameResolutionInfo ) nenv =
@@ -1042,8 +1065,8 @@ let ResolveProvidedTypeNameInEntity (amap, m, typeName, modref: ModuleOrNamespac
10421065match modref.TypeReprInfowith
10431066| TProvidedNamespaceExtensionPoint( resolutionEnvironment, resolvers) ->
10441067match modref.Deref.PublicPathwith
1045- | Some( PubPath( path) )->
1046- let matches = resolvers|> List.map( fun r -> ExtensionTyping.TryResolveProvidedType( r, m, path, typeName))
1068+ | Some( PubPath path) ->
1069+ let matches = resolvers|> List.map( fun r -> ExtensionTyping.TryResolveProvidedType( r, m, path, typeName))
10471070let tcrefs =
10481071[ for stin matchesdo
10491072match stwith
@@ -1079,9 +1102,8 @@ let LookupTypeNameInEntityMaybeHaveArity (amap, m, ad, nm, staticResInfo:TypeNam
10791102let tcrefs =
10801103match staticResInfowith
10811104| TypeNameResolutionStaticArgsInfo.Indefinite->
1082- match LookupTypeNameInEntityNoArity m nm mtypwith
1083- | [] -> []
1084- | tycons-> tycons|> List.map modref.NestedTyconRef
1105+ LookupTypeNameInEntityNoArity m nm mtyp
1106+ |> List.map modref.NestedTyconRef
10851107| TypeNameResolutionStaticArgsInfo.Definite_ ->
10861108match LookupTypeNameInEntityHaveArity nm staticResInfo mtypwith
10871109| Some tycon-> [ modref.NestedTyconRef tycon]
@@ -1111,8 +1133,8 @@ let MakeNestedType (ncenv:NameResolver) (tinst:TType list) m (tcrefNested:TyconR
11111133let GetNestedTypesOfType ( ad , ncenv : NameResolver , optFilter , staticResInfo , checkForGenerated , m ) typ =
11121134let g = ncenv.g
11131135 ncenv.InfoReader.GetPrimaryTypeHierachy( AllowMultiIntfInstantiations.Yes, m, typ) |> List.collect( fun typ ->
1114- if isAppTy g typthen
1115- let tcref , tinst = destAppTy g typ
1136+ match typwith
1137+ | AppTy g ( tcref, tinst) ->
11161138let tycon = tcref.Deref
11171139let mty = tycon.ModuleOrNamespaceType
11181140// No dotting through type generators to get to a nested type!
@@ -1139,9 +1161,10 @@ let GetNestedTypesOfType (ad, ncenv:NameResolver, optFilter, staticResInfo, chec
11391161| _ ->
11401162#endif
11411163 mty.TypesByAccessNames.Values
1142- |> List.map( tcref.NestedTyconRef>> MakeNestedType ncenv tinst m)
1143- |> List.filter( IsTypeAccessible g ncenv.amap m ad)
1144- else [])
1164+ |> List.choose( fun entity ->
1165+ let typ = tcref.NestedTyconRef entity|> MakeNestedType ncenv tinst m
1166+ if IsTypeAccessible g ncenv.amap m ad typthen Some typelse None)
1167+ | _ -> [])
11451168
11461169//-------------------------------------------------------------------------
11471170// Report environments to visual studio. We stuff intermediary results
@@ -3286,10 +3309,10 @@ let PartialResolveLongIndentAsModuleOrNamespaceThen (nenv:NameResolutionEnv) pli
32863309[]
32873310| [] -> []
32883311
3289- ///returns fields for the given class or record
3312+ ///Returns fields for the given class or record
32903313let ResolveRecordOrClassFieldsOfType ( ncenv : NameResolver ) m ad typ statics =
32913314 ncenv.InfoReader.GetRecordOrClassFieldsOfType( None, ad, m, typ)
3292- |> List.filter( fun rfref -> rfref.IsStatic= statics&& IsFieldInfoAccessible ad rfref)
3315+ |> List.filter( fun rfref -> rfref.IsStatic= statics&& IsFieldInfoAccessible ad rfref)
32933316|> List.map Item.RecdField
32943317
32953318[<RequireQualifiedAccess>]
@@ -3308,10 +3331,10 @@ let ResolveCompletionsInType (ncenv: NameResolver) nenv (completionTargets: Reso
33083331
33093332let rfinfos =
33103333 ncenv.InfoReader.GetRecordOrClassFieldsOfType( None, ad, m, typ)
3311- |> List.filter( fun rfref -> rfref.IsStatic= statics&& IsFieldInfoAccessible ad rfref)
3334+ |> List.filter( fun rfref -> rfref.IsStatic= statics&& IsFieldInfoAccessible ad rfref)
33123335
33133336let ucinfos =
3314- if completionTargets.ResolveAll&& statics&& isAppTy g typthen
3337+ if completionTargets.ResolveAll&& statics&& isAppTy g typthen
33153338let tc , tinst = destAppTy g typ
33163339 tc.UnionCasesAsRefList
33173340|> List.filter( IsUnionCaseUnseen ad g ncenv.amap m>> not )