@@ -24,23 +24,48 @@ type FSharpNavigationDeclarationItemKind =
2424 | FieldDecl
2525 | OtherDecl
2626
27+ [<RequireQualifiedAccess>]
28+ type FSharpEnclosingEntityKind =
29+ | Namespace
30+ | Module
31+ | Class
32+ | Exception
33+ | Interface
34+ | Record
35+ | Enum
36+ | DU
37+
2738/// Represents an item to be displayed in the navigation bar
2839[<Sealed>]
29- type FSharpNavigationDeclarationItem ( uniqueName : string , name : string , kind : FSharpNavigationDeclarationItemKind , glyph : int , range : range , bodyRange : range , singleTopLevel : bool ) =
40+ type FSharpNavigationDeclarationItem
41+ (
42+ uniqueName: string,
43+ name: string,
44+ kind: FSharpNavigationDeclarationItemKind,
45+ glyph: int,
46+ range: range,
47+ bodyRange: range,
48+ singleTopLevel: bool,
49+ enclosingEntityKind: FSharpEnclosingEntityKind,
50+ isAbstract: bool
51+ ) =
3052
3153 member x.bodyRange = bodyRange
32-
3354 member x.UniqueName = uniqueName
3455 member x.Name = name
3556 member x.Glyph = glyph
3657 member x.Kind = kind
3758 member x.Range = range
3859 member x.BodyRange = bodyRange
3960 member x.IsSingleTopLevel = singleTopLevel
61+ member x.EnclosingEntityKind = enclosingEntityKind
62+ member x.IsAbstract = isAbstract
63+
4064 member x.WithUniqueName ( uniqueName : string ) =
41- FSharpNavigationDeclarationItem( uniqueName, name, kind, glyph, range, bodyRange, singleTopLevel)
42- static member Create ( name : string , kind , glyph : int , range : range , bodyRange : range , singleTopLevel : bool ) =
43- FSharpNavigationDeclarationItem( " " , name, kind, glyph, range, bodyRange, singleTopLevel)
65+ FSharpNavigationDeclarationItem ( uniqueName, name, kind, glyph, range, bodyRange, singleTopLevel, enclosingEntityKind, isAbstract)
66+
67+ static member Create ( name : string , kind , glyph : int , range : range , bodyRange : range , singleTopLevel : bool , enclosingEntityKind , isAbstract ) =
68+ FSharpNavigationDeclarationItem( " " , name, kind, glyph, range, bodyRange, singleTopLevel, enclosingEntityKind, isAbstract)
4469
4570/// Represents top-level declarations (that should be in the type drop-down)
4671/// with nested declarations (that can be shown in the member drop-down)
@@ -92,26 +117,29 @@ module NavigationImpl =
92117 sprintf " %s _%d _of_%d " name idx total
93118
94119 // Create declaration (for the left dropdown)
95- let createDeclLid ( baseName , lid , kind , baseGlyph , m , bodym , nested ) =
120+ let createDeclLid ( baseName , lid , kind , baseGlyph , m , bodym , nested , enclosingEntityKind , isAbstract ) =
96121 let name = ( if baseName <> " " then baseName + " ." else " " ) + ( textOfLid lid)
97122 FSharpNavigationDeclarationItem.Create
98- ( name, kind, baseGlyph * 6 , m, bodym, false ), ( addItemName name), nested
123+ ( name, kind, baseGlyph * 6 , m, bodym, false , enclosingEntityKind , isAbstract ), ( addItemName name), nested
99124
100- let createDecl ( baseName , ( id : Ident ), kind , baseGlyph , m , bodym , nested ) =
125+ let createDecl ( baseName , ( id : Ident ), kind , baseGlyph , m , bodym , nested , enclosingEntityKind , isAbstract ) =
101126 let name = ( if baseName <> " " then baseName + " ." else " " ) + ( id.idText)
102127 FSharpNavigationDeclarationItem.Create
103- ( name, kind, baseGlyph * 6 , m, bodym, false ), ( addItemName name), nested
128+ ( name, kind, baseGlyph * 6 , m, bodym, false , enclosingEntityKind , isAbstract ), ( addItemName name), nested
104129
105130 // Create member-kind-of-thing for the right dropdown
106- let createMemberLid ( lid , kind , baseGlyph , m ) =
107- FSharpNavigationDeclarationItem.Create( textOfLid lid, kind, baseGlyph * 6 , m, m, false ), ( addItemName( textOfLid lid))
131+ let createMemberLid ( lid , kind , baseGlyph , m , enclosingEntityKind , isAbstract ) =
132+ FSharpNavigationDeclarationItem.Create( textOfLid lid, kind, baseGlyph * 6 , m, m, false , enclosingEntityKind, isAbstract),
133+ ( addItemName( textOfLid lid))
108134
109- let createMember (( id : Ident ), kind , baseGlyph , m ) =
110- FSharpNavigationDeclarationItem.Create( id.idText, kind, baseGlyph * 6 , m, m, false ), ( addItemName ( id.idText ))
111-
135+ let createMember (( id : Ident ), kind , baseGlyph , m , enclosingEntityKind , isAbstract ) =
136+ FSharpNavigationDeclarationItem.Create( id.idText, kind, baseGlyph * 6 , m, m, false , enclosingEntityKind , isAbstract ),
137+ ( addItemName ( id.idText ))
112138
113139 // Process let-binding
114- let processBinding isMember ( Binding ( _ , _ , _ , _ , _ , _ , SynValData ( memebrOpt , _ , _ ), synPat , _ , synExpr , _ , _ )) =
140+ let processBinding isMember enclosingEntityKind isAbstract
141+ ( Binding ( _ , _ , _ , _ , _ , _ , SynValData ( memebrOpt , _ , _ ), synPat , _ , synExpr , _ , _ )) =
142+
115143 let m = match synExpr with
116144 | SynExpr.Typed( e, _, _) -> e.Range // fix range for properties with type annotations
117145 | _ -> synExpr.Range
@@ -131,91 +159,101 @@ module NavigationImpl =
131159 | _ thisVar:: nm::_ -> ( List.tail lid, nm.idRange)
132160 | hd::_ -> ( lid, hd.idRange)
133161 | _ -> ( lid, m)
134- [ createMemberLid( lidShow, kind, icon, unionRanges rangeMerge m) ]
135- | SynPat.LongIdent( LongIdentWithDots( lid,_), _,_, _, _, _), _ -> [ createMemberLid( lid, FieldDecl, iIconGroupConstant, unionRanges ( List.head lid) .idRange m) ]
162+ [ createMemberLid( lidShow, kind, icon, unionRanges rangeMerge m, enclosingEntityKind, isAbstract) ]
163+ | SynPat.LongIdent( LongIdentWithDots( lid,_), _,_, _, _, _), _ ->
164+ [ createMemberLid( lid, FieldDecl, iIconGroupConstant, unionRanges ( List.head lid) .idRange m, enclosingEntityKind, isAbstract) ]
136165 | SynPat.Named (_, ident,_,_, r), _ ->
137- [ createMemberLid([ ident], FieldDecl, iIconGroupConstant, r)]
166+ [ createMemberLid([ ident], FieldDecl, iIconGroupConstant, r, enclosingEntityKind , isAbstract )]
138167 | _ -> []
139168
140169 // Process a class declaration or F# type declaration
141170 let rec processExnDefnRepr baseName nested ( SynExceptionDefnRepr ( _ , ( UnionCase ( _ , id , fldspec , _ , _ , _ )), _ , _ , _ , m )) =
142171 // Exception declaration
143- [ createDecl( baseName, id, ExnDecl, iIconGroupException, m, fldspecRange fldspec, nested) ]
172+ [ createDecl( baseName, id, ExnDecl, iIconGroupException, m, fldspecRange fldspec, nested,
173+ FSharpEnclosingEntityKind.Exception, false ) ]
144174
145175 // Process a class declaration or F# type declaration
146176 and processExnDefn baseName ( SynExceptionDefn ( repr , membDefns , _ )) =
147- let nested = processMembers membDefns |> snd
177+ let nested = processMembers membDefns FSharpEnclosingEntityKind.Exception |> snd
148178 processExnDefnRepr baseName nested repr
149179
150180 and processTycon baseName ( TypeDefn ( ComponentInfo ( _ , _ , _ , lid , _ , _ , _ , _ ), repr , membDefns , m )) =
151- let topMembers = processMembers membDefns |> snd
181+ let topMembers = processMembers membDefns FSharpEnclosingEntityKind.Class |> snd
152182 match repr with
153183 | SynTypeDefnRepr.Exception repr -> processExnDefnRepr baseName [] repr
154184 | SynTypeDefnRepr.ObjectModel(_, membDefns, mb) ->
155185 // F# class declaration
156- let members = processMembers membDefns |> snd
186+ let members = processMembers membDefns FSharpEnclosingEntityKind.Class |> snd
157187 let nested = members@ topMembers
158- ([ createDeclLid( baseName, lid, TypeDecl, iIconGroupClass, m, bodyRange mb nested, nested) ]: (( FSharpNavigationDeclarationItem * int * _) list))
188+ ([ createDeclLid( baseName, lid, TypeDecl, iIconGroupClass, m, bodyRange mb nested, nested,
189+ FSharpEnclosingEntityKind.Class, false ) ]: (( FSharpNavigationDeclarationItem * int * _) list))
159190 | SynTypeDefnRepr.Simple( simple, _) ->
160191 // F# type declaration
161192 match simple with
162193 | SynTypeDefnSimpleRepr.Union(_, cases, mb) ->
163194 let cases =
164195 [ for ( UnionCase(_, id, fldspec, _, _, _)) in cases ->
165- createMember( id, OtherDecl, iIconGroupValueType, unionRanges ( fldspecRange fldspec) id.idRange) ]
196+ createMember( id, OtherDecl, iIconGroupValueType, unionRanges ( fldspecRange fldspec) id.idRange,
197+ FSharpEnclosingEntityKind.DU, false ) ]
166198 let nested = cases@ topMembers
167- [ createDeclLid( baseName, lid, TypeDecl, iIconGroupUnion, m, bodyRange mb nested, nested) ]
199+ [ createDeclLid( baseName, lid, TypeDecl, iIconGroupUnion, m, bodyRange mb nested, nested,
200+ FSharpEnclosingEntityKind.DU, false ) ]
168201 | SynTypeDefnSimpleRepr.Enum( cases, mb) ->
169202 let cases =
170203 [ for ( EnumCase(_, id, _, _, m)) in cases ->
171- createMember( id, FieldDecl, iIconGroupEnumMember, m) ]
204+ createMember( id, FieldDecl, iIconGroupEnumMember, m, FSharpEnclosingEntityKind.Enum , false ) ]
172205 let nested = cases@ topMembers
173- [ createDeclLid( baseName, lid, TypeDecl, iIconGroupEnum, m, bodyRange mb nested, nested) ]
206+ [ createDeclLid( baseName, lid, TypeDecl, iIconGroupEnum, m, bodyRange mb nested, nested,
207+ FSharpEnclosingEntityKind.Enum, false ) ]
174208 | SynTypeDefnSimpleRepr.Record(_, fields, mb) ->
175209 let fields =
176210 [ for ( Field(_, _, id, _, _, _, _, m)) in fields do
177211 if ( id.IsSome) then
178- yield createMember( id.Value, FieldDecl, iIconGroupFieldBlue, m) ]
212+ yield createMember( id.Value, FieldDecl, iIconGroupFieldBlue, m, FSharpEnclosingEntityKind.Record , false ) ]
179213 let nested = fields@ topMembers
180- [ createDeclLid( baseName, lid, TypeDecl, iIconGroupType, m, bodyRange mb nested, nested) ]
214+ [ createDeclLid( baseName, lid, TypeDecl, iIconGroupType, m, bodyRange mb nested, nested,
215+ FSharpEnclosingEntityKind.Record, false ) ]
181216 | SynTypeDefnSimpleRepr.TypeAbbrev(_, _, mb) ->
182- [ createDeclLid( baseName, lid, TypeDecl, iIconGroupTypedef, m, bodyRange mb topMembers, topMembers) ]
217+ [ createDeclLid( baseName, lid, TypeDecl, iIconGroupTypedef, m, bodyRange mb topMembers, topMembers,
218+ FSharpEnclosingEntityKind.Class, false ) ]
183219
184220 //| SynTypeDefnSimpleRepr.General of TyconKind * (SynType * range * ident option) list * (valSpfn * MemberFlags) list * fieldDecls * bool * bool * range
185221 //| SynTypeDefnSimpleRepr.LibraryOnlyILAssembly of ILType * range
186222 //| TyconCore_repr_hidden of range
187223 | _ -> []
188224
189225 // Returns class-members for the right dropdown
190- and processMembers members : ( range * list < FSharpNavigationDeclarationItem * int >) =
226+ and processMembers ( members : SynMemberDefns ) ( enclosingEntityKind : FSharpEnclosingEntityKind )
227+ : ( range * list < FSharpNavigationDeclarationItem * int >) =
228+
191229 let members = members |> List.map ( fun memb ->
192230 ( memb.Range,
193231 match memb with
194- | SynMemberDefn.LetBindings( binds, _, _, _) -> List.collect ( processBinding false ) binds
195- | SynMemberDefn.Member( bind, _) -> processBinding true bind
232+ | SynMemberDefn.LetBindings( binds, _, _, _) -> List.collect ( processBinding false enclosingEntityKind false ) binds
233+ | SynMemberDefn.Member( bind, _) -> processBinding true enclosingEntityKind false bind
196234 | SynMemberDefn.ValField( Field(_, _, Some( rcid), ty, _, _, _, _), _) ->
197- [ createMember( rcid, FieldDecl, iIconGroupFieldBlue, ty.Range) ]
235+ [ createMember( rcid, FieldDecl, iIconGroupFieldBlue, ty.Range, enclosingEntityKind , false ) ]
198236 | SynMemberDefn.AutoProperty(_ attribs,_ isStatic, id,_ tyOpt,_ propKind,_,_ xmlDoc,_ access,_ synExpr, _, _) ->
199- [ createMember( id, FieldDecl, iIconGroupFieldBlue, id.idRange) ]
237+ [ createMember( id, FieldDecl, iIconGroupFieldBlue, id.idRange, enclosingEntityKind , false ) ]
200238 | SynMemberDefn.AbstractSlot( ValSpfn(_, id, _, ty, _, _, _, _, _, _, _), _, _) ->
201- [ createMember( id, MethodDecl, iIconGroupMethod2, ty.Range) ]
239+ [ createMember( id, MethodDecl, iIconGroupMethod2, ty.Range, enclosingEntityKind , true ) ]
202240 | SynMemberDefn.NestedType _ -> failwith " tycon as member????" //processTycon tycon
203241 | SynMemberDefn.Interface(_, Some( membs), _) ->
204- processMembers membs |> snd
242+ processMembers membs FSharpEnclosingEntityKind.Interface |> snd
205243 | _ -> [] ))
206244 (( members |> Seq.map fst |> Seq.fold unionRangesChecked range.Zero),
207245 ( members |> List.map snd |> List.concat))
208246
209247 // Process declarations in a module that belong to the right drop-down (let bindings)
210248 let processNestedDeclarations decls = decls |> List.collect ( function
211- | SynModuleDecl.Let(_, binds, _) -> List.collect ( processBinding false ) binds
249+ | SynModuleDecl.Let(_, binds, _) -> List.collect ( processBinding false FSharpEnclosingEntityKind.Module false ) binds
212250 | _ -> [] )
213251
214252 // Process declarations nested in a module that should be displayed in the left dropdown
215253 // (such as type declarations, nested modules etc.)
216254 let rec processFSharpNavigationTopLevelDeclarations ( baseName , decls ) = decls |> List.collect ( function
217255 | SynModuleDecl.ModuleAbbrev( id, lid, m) ->
218- [ createDecl( baseName, id, ModuleDecl, iIconGroupModule, m, rangeOfLid lid, []) ]
256+ [ createDecl( baseName, id, ModuleDecl, iIconGroupModule, m, rangeOfLid lid, [], FSharpEnclosingEntityKind.Namespace , false ) ]
219257
220258 | SynModuleDecl.NestedModule( ComponentInfo(_, _, _, lid, _, _, _, _), _ isRec, decls, _, m) ->
221259 // Find let bindings (for the right dropdown)
@@ -224,7 +262,8 @@ module NavigationImpl =
224262
225263 // Get nested modules and types (for the left dropdown)
226264 let other = processFSharpNavigationTopLevelDeclarations( newBaseName, decls)
227- createDeclLid( baseName, lid, ModuleDecl, iIconGroupModule, m, unionRangesChecked ( rangeOfDecls nested) ( moduleRange ( rangeOfLid lid) other), nested):: other
265+ createDeclLid( baseName, lid, ModuleDecl, iIconGroupModule, m, unionRangesChecked ( rangeOfDecls nested)
266+ ( moduleRange ( rangeOfLid lid) other), nested, FSharpEnclosingEntityKind.Module, false ):: other
228267
229268 | SynModuleDecl.Types( tydefs, _) -> tydefs |> List.collect ( processTycon baseName)
230269 | SynModuleDecl.Exception ( defn,_) -> processExnDefn baseName defn
@@ -247,7 +286,7 @@ module NavigationImpl =
247286 ( textOfLid id, ( if isModule then ModuleFileDecl else NamespaceDecl),
248287 iIconGroupModule * 6 , m,
249288 unionRangesChecked ( rangeOfDecls nested) ( moduleRange ( rangeOfLid id) other),
250- singleTopLevel), ( addItemName( textOfLid id)), nested
289+ singleTopLevel, FSharpEnclosingEntityKind.Module , false ), ( addItemName( textOfLid id)), nested
251290 decl:: other )
252291
253292 let items =
0 commit comments