@@ -1661,7 +1661,7 @@ let rec ResolveLongIndentAsModuleOrNamespace atMostOne amap m fullyQualified (ne
16611661 moduleOrNamespaces
16621662|> Seq.collect( fun kv -> kv.Value)
16631663|> Seq.filter( fun modref -> IsEntityAccessible amap m ad modref)
1664- |> Seq.map ( fun e -> e.DisplayName)
1664+ |> Seq.collect ( fun e -> [ e.DisplayName; e.DemangledModuleOrNamespaceName ] )
16651665|> Set.ofSeq
16661666
16671667 UndefinedName( 0 , FSComp.SR.undefinedNameNamespaceOrModule, id, suggestModulesAndNamespaces))
@@ -1674,7 +1674,7 @@ let rec ResolveLongIndentAsModuleOrNamespace atMostOne amap m fullyQualified (ne
16741674let suggestNames () =
16751675 mty.ModulesAndNamespacesByDemangledName
16761676|> Seq.filter( fun kv -> IsEntityAccessible amap m ad( modref.NestedTyconRef kv.Value))
1677- |> Seq.map ( fun e -> e.Value.DisplayName)
1677+ |> Seq.collect ( fun e -> [ e.Value.DisplayName; e.Value.DemangledModuleOrNamespaceName ] )
16781678|> Set.ofSeq
16791679
16801680let error = raze( UndefinedName( depth, FSComp.SR.undefinedNameNamespace, id, suggestNames))
@@ -2152,7 +2152,7 @@ let rec ResolveExprLongIdentInModuleOrNamespace (ncenv:NameResolver) nenv (typeN
21522152
21532153match tyconSearch+++ moduleSearch+++ unionSearchwith
21542154| Result[] ->
2155- let suggestPossibleTypes () =
2155+ let suggestPossibleTypesAndNames () =
21562156match adwith
21572157| AccessibleFrom_ ->
21582158let types =
@@ -2178,12 +2178,26 @@ let rec ResolveExprLongIdentInModuleOrNamespace (ncenv:NameResolver) nenv (typeN
21782178|> Seq.map( fun uc -> uc.DisplayName)
21792179|> Set.ofSeq
21802180
2181+ let vals =
2182+ modref.ModuleOrNamespaceType.AllValsByLogicalName
2183+ |> Seq.filter( fun e -> IsValAccessible ad( mkNestedValRef modref e.Value))
2184+ |> Seq.map( fun e -> e.Value.DisplayName)
2185+ |> Set.ofSeq
2186+
2187+ let exns =
2188+ modref.ModuleOrNamespaceType.ExceptionDefinitionsByDemangledName
2189+ |> Seq.filter( fun e -> IsTyconReprAccessible ncenv.amap m ad( modref.NestedTyconRef e.Value))
2190+ |> Seq.map( fun e -> e.Value.DisplayName)
2191+ |> Set.ofSeq
2192+
21812193 types
21822194|> Set.union submodules
21832195|> Set.union unions
2196+ |> Set.union vals
2197+ |> Set.union exns
21842198| _ -> Set.empty
21852199
2186- raze( UndefinedName( depth, FSComp.SR.undefinedNameValueConstructorNamespaceOrType, id, suggestPossibleTypes ))
2200+ raze( UndefinedName( depth, FSComp.SR.undefinedNameValueConstructorNamespaceOrType, id, suggestPossibleTypesAndNames ))
21872201| results-> AtMostOneResult id.idRange results
21882202
21892203/// An identifier has resolved to a type name in an expression (corresponding to one or more TyconRefs).
@@ -2203,8 +2217,7 @@ let ChooseTyconRefInExpr (ncenv:NameResolver, m, ad, nenv, id:Ident, typeNameRes
22032217
22042218/// Resolve F# "A.B.C" syntax in expressions
22052219/// Not all of the sequence will necessarily be swallowed, i.e. we return some identifiers
2206- /// that may represent further actions, e.g. further lookups.
2207-
2220+ /// that may represent further actions, e.g. further lookups.
22082221let rec ResolveExprLongIdentPrim sink ( ncenv : NameResolver ) fullyQualified m ad nenv ( typeNameResInfo : TypeNameResolutionInfo ) lid =
22092222let resInfo = ResolutionInfo.Empty
22102223match lidwith
@@ -2267,7 +2280,6 @@ let rec ResolveExprLongIdentPrim sink (ncenv:NameResolver) fullyQualified m ad n
22672280else
22682281 NoResultsOrUsefulErrors
22692282
2270-
22712283 ctorSearch+++ implicitOpSearch
22722284
22732285let resInfo , item , rest =
@@ -2278,11 +2290,20 @@ let rec ResolveExprLongIdentPrim sink (ncenv:NameResolver) fullyQualified m ad n
22782290match ! typeErrorwith
22792291| Some e-> raze e
22802292| _ ->
2281- let suggestNames () =
2282- nenv.eUnqualifiedItems
2283- |> Seq.map( fun e -> e.Value.DisplayName)
2284- |> Set.ofSeq
2285- raze( UndefinedName( 0 , FSComp.SR.undefinedNameValueOfConstructor, id, suggestNames)) // TODO: suggest ctors
2293+ let suggestNamesAndTypes () =
2294+ let suggestedNames =
2295+ nenv.eUnqualifiedItems
2296+ |> Seq.map( fun e -> e.Value.DisplayName)
2297+ |> Set.ofSeq
2298+
2299+ let suggestedTypes =
2300+ nenv.TyconsByDemangledNameAndArity fullyQualified
2301+ |> Seq.map( fun e -> e.Value.DisplayName)
2302+ |> Set.ofSeq
2303+
2304+ Set.union suggestedNames suggestedTypes
2305+
2306+ raze( UndefinedName( 0 , FSComp.SR.undefinedNameValueOfConstructor, id, suggestNamesAndTypes))
22862307 ForceRaise failingCase
22872308
22882309 ResolutionInfo.SendToSink( sink, ncenv, nenv, ItemOccurence.Use, ad, resInfo, ResultTyparChecker( fun () -> CheckAllTyparsInferrable ncenv.amap m item))
@@ -2367,16 +2388,40 @@ let rec ResolveExprLongIdentPrim sink (ncenv:NameResolver) fullyQualified m ad n
23672388
23682389 search+++ moduleSearch+++ tyconSearch
23692390
2391+ let suggestEverythingInScope () =
2392+ let suggestedModulesAndNamespaces =
2393+ nenv.ModulesAndNamespaces fullyQualified
2394+ |> Seq.collect( fun kv -> kv.Value)
2395+ |> Seq.filter( fun modref -> IsEntityAccessible ncenv.amap m ad modref)
2396+ |> Seq.collect( fun e -> [ e.DisplayName; e.DemangledModuleOrNamespaceName])
2397+ |> Set.ofSeq
2398+
2399+ let suggestedTypes =
2400+ nenv.TyconsByDemangledNameAndArity fullyQualified
2401+ |> Seq.map( fun e -> e.Value.DisplayName)
2402+ |> Set.ofSeq
2403+
2404+ let suggestedNames =
2405+ nenv.eUnqualifiedItems
2406+ |> Seq.map( fun e -> e.Value.DisplayName)
2407+ |> Set.ofSeq
2408+
2409+ suggestedNames
2410+ |> Set.union suggestedTypes
2411+ |> Set.union suggestedModulesAndNamespaces
2412+
23702413match innerSearchwith
2414+ | Exception( UndefinedName( 0 ,_, id1, suggestionsF)) when id.idRange= id1.idRange->
2415+ let mergeSuggestions () =
2416+ suggestEverythingInScope()
2417+ |> Set.union( suggestionsF())
2418+
2419+ let failingCase = raze( UndefinedName( 0 , FSComp.SR.undefinedNameValueNamespaceTypeOrModule, id, mergeSuggestions))
2420+ ForceRaise failingCase
23712421| Exception err-> ForceRaise( Exception err)
23722422| Result( res:: _) -> ForceRaise( Result res)
23732423| Result[] ->
2374- let suggestNames () =
2375- nenv.eUnqualifiedItems
2376- |> Seq.map( fun e -> e.Value.DisplayName)
2377- |> Set.ofSeq
2378-
2379- let failingCase = raze( UndefinedName( 0 , FSComp.SR.undefinedNameValueNamespaceTypeOrModule, id, suggestNames)) // TODO: suggest modules and types
2424+ let failingCase = raze( UndefinedName( 0 , FSComp.SR.undefinedNameValueNamespaceTypeOrModule, id, suggestEverythingInScope))
23802425 ForceRaise failingCase
23812426
23822427 ResolutionInfo.SendToSink( sink, ncenv, nenv, ItemOccurence.Use, ad, resInfo, ResultTyparChecker( fun () -> CheckAllTyparsInferrable ncenv.amap m item))
@@ -2462,9 +2507,15 @@ let rec ResolvePatternLongIdentInModuleOrNamespace (ncenv:NameResolver) nenv num
24622507let submodules =
24632508 mty.ModulesAndNamespacesByDemangledName
24642509|> Seq.filter( fun kv -> IsEntityAccessible ncenv.amap m ad( modref.NestedTyconRef kv.Value))
2510+ |> Seq.collect( fun e -> [ e.Value.DisplayName; e.Value.DemangledModuleOrNamespaceName])
2511+ |> Set.ofSeq
2512+
2513+ let suggestedTypes =
2514+ nenv.TyconsByDemangledNameAndArity FullyQualifiedFlag.OpenQualified
24652515|> Seq.map( fun e -> e.Value.DisplayName)
24662516|> Set.ofSeq
2467- submodules// TODO: suggest types and ctors
2517+
2518+ Set.union submodules suggestedTypes
24682519| _ -> Set.empty
24692520
24702521 raze( UndefinedName( depth, FSComp.SR.undefinedNameConstructorModuleOrNamespace, id, suggestPossibleTypes))
@@ -2564,7 +2615,13 @@ let rec ResolveTypeLongIdentInTyconRefPrim (ncenv:NameResolver) (typeNameResInfo
25642615let tcrefs = CheckForTypeLegitimacyAndMultipleGenericTypeAmbiguities( tcrefs, typeNameResInfo, genOk, m)
25652616match tcrefswith
25662617| tcref:: _ -> success tcref
2567- | [] -> raze( UndefinedName( depth, FSComp.SR.undefinedNameType, id, NoSuggestions)) // TODO: suggest types
2618+ | [] ->
2619+ let suggestTypes () =
2620+ tcref.ModuleOrNamespaceType.TypesByDemangledNameAndArity id.idRange
2621+ |> Seq.map( fun e -> e.Value.DisplayName)
2622+ |> Set.ofSeq
2623+
2624+ raze( UndefinedName( depth, FSComp.SR.undefinedNameType, id, suggestTypes))
25682625| id:: rest->
25692626#if EXTENSIONTYPING
25702627// No dotting through type generators to get to a nested type!
@@ -2579,7 +2636,13 @@ let rec ResolveTypeLongIdentInTyconRefPrim (ncenv:NameResolver) (typeNameResInfo
25792636let tcrefs = CheckForTypeLegitimacyAndMultipleGenericTypeAmbiguities( tcrefs, typeNameResInfo.DropStaticArgsInfo, genOk, m)
25802637match tcrefswith
25812638| _ :: _ -> tcrefs|> CollectAtMostOneResult( fun ( resInfo , tcref ) -> ResolveTypeLongIdentInTyconRefPrim ncenv typeNameResInfo ad resInfo genOk( depth+ 1 ) m tcref rest)
2582- | [] -> raze( UndefinedName( depth, FSComp.SR.undefinedNameType, id, NoSuggestions)) // TODO: suggest types
2639+ | [] ->
2640+ let suggestTypes () =
2641+ tcref.ModuleOrNamespaceType.TypesByDemangledNameAndArity id.idRange
2642+ |> Seq.map( fun e -> e.Value.DisplayName)
2643+ |> Set.ofSeq
2644+
2645+ raze( UndefinedName( depth, FSComp.SR.undefinedNameType, id, suggestTypes))
25832646
25842647 AtMostOneResult m tyconSearch
25852648
@@ -2598,7 +2661,7 @@ let SuggestTypeLongIdentInModuleOrNamespace depth (modref:ModuleOrNamespaceRef)
25982661| AccessibleFrom_ ->
25992662 modref.ModuleOrNamespaceType.AllEntities
26002663|> Seq.filter( fun e -> IsEntityAccessible amap m ad( modref.NestedTyconRef e))
2601- |> Seq.map ( fun e -> e.DisplayName)
2664+ |> Seq.collect ( fun e -> [ e.DisplayName; e.DemangledModuleOrNamespaceName ] )
26022665|> Set.ofSeq
26032666| _ -> Set.empty
26042667
@@ -2628,7 +2691,7 @@ let rec private ResolveTypeLongIdentInModuleOrNamespace (ncenv:NameResolver) (ty
26282691| AccessibleFrom_ ->
26292692 modref.ModuleOrNamespaceType.ModulesAndNamespacesByDemangledName
26302693|> Seq.filter( fun kv -> IsEntityAccessible ncenv.amap m ad( modref.NestedTyconRef kv.Value))
2631- |> Seq.map ( fun e -> e.Value.DisplayName)
2694+ |> Seq.collect ( fun e -> [ e.Value.DisplayName; e.Value.DemangledModuleOrNamespaceName ] )
26322695|> Set.ofSeq
26332696| _ -> Set.empty
26342697 raze( UndefinedName( depth, FSComp.SR.undefinedNameNamespaceOrModule, id, suggestPossibleModules))
@@ -2637,7 +2700,13 @@ let rec private ResolveTypeLongIdentInModuleOrNamespace (ncenv:NameResolver) (ty
26372700let tcrefs = LookupTypeNameInEntityMaybeHaveArity( ncenv.amap, id.idRange, ad, id.idText, TypeNameResolutionStaticArgsInfo.Indefinite, modref)
26382701match tcrefswith
26392702| _ :: _ -> tcrefs|> CollectResults( fun tcref -> ResolveTypeLongIdentInTyconRefPrim ncenv typeNameResInfo ad resInfo genOk( depth+ 1 ) m tcref rest)
2640- | [] -> raze( UndefinedName( depth, FSComp.SR.undefinedNameType, id, NoSuggestions)) // TODO: suggest ctors
2703+ | [] ->
2704+ let suggestTypes () =
2705+ modref.ModuleOrNamespaceType.TypesByDemangledNameAndArity id.idRange
2706+ |> Seq.map( fun e -> e.Value.DisplayName)
2707+ |> Set.ofSeq
2708+
2709+ raze( UndefinedName( depth, FSComp.SR.undefinedNameType, id, suggestTypes))
26412710 tyconSearch+++ modulSearch
26422711
26432712/// Resolve a long identifier representing a type
@@ -2676,9 +2745,10 @@ let rec ResolveTypeLongIdentPrim (ncenv:NameResolver) occurence fullyQualified m
26762745match occurencewith
26772746| ItemOccurence.UseInAttribute->
26782747[ yield e.Value.DisplayName
2748+ yield e.Value.DemangledModuleOrNamespaceName
26792749if e.Value.DisplayName.EndsWith" Attribute" then
26802750yield e.Value.DisplayName.Replace( " Attribute" , " " )]
2681- | _ -> [ e.Value.DisplayName])
2751+ | _ -> [ e.Value.DisplayName; e.Value.DemangledModuleOrNamespaceName ])
26822752|> Set.ofSeq
26832753| _ -> Set.empty
26842754