@@ -24,23 +24,48 @@ type FSharpNavigationDeclarationItemKind =
24
24
| FieldDecl
25
25
| OtherDecl
26
26
27
+ [<RequireQualifiedAccess>]
28
+ type FSharpEnclosingEntityKind =
29
+ | Namespace
30
+ | Module
31
+ | Class
32
+ | Exception
33
+ | Interface
34
+ | Record
35
+ | Enum
36
+ | DU
37
+
27
38
/// Represents an item to be displayed in the navigation bar
28
39
[<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
+ ) =
30
52
31
53
member x.bodyRange = bodyRange
32
-
33
54
member x.UniqueName = uniqueName
34
55
member x.Name = name
35
56
member x.Glyph = glyph
36
57
member x.Kind = kind
37
58
member x.Range = range
38
59
member x.BodyRange = bodyRange
39
60
member x.IsSingleTopLevel = singleTopLevel
61
+ member x.EnclosingEntityKind = enclosingEntityKind
62
+ member x.IsAbstract = isAbstract
63
+
40
64
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)
44
69
45
70
/// Represents top-level declarations (that should be in the type drop-down)
46
71
/// with nested declarations (that can be shown in the member drop-down)
@@ -92,26 +117,29 @@ module NavigationImpl =
92
117
sprintf " %s _%d _of_%d " name idx total
93
118
94
119
// 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 ) =
96
121
let name = ( if baseName <> " " then baseName + " ." else " " ) + ( textOfLid lid)
97
122
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
99
124
100
- let createDecl ( baseName , ( id : Ident ), kind , baseGlyph , m , bodym , nested ) =
125
+ let createDecl ( baseName , ( id : Ident ), kind , baseGlyph , m , bodym , nested , enclosingEntityKind , isAbstract ) =
101
126
let name = ( if baseName <> " " then baseName + " ." else " " ) + ( id.idText)
102
127
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
104
129
105
130
// 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))
108
134
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 ))
112
138
113
139
// 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
+
115
143
let m = match synExpr with
116
144
| SynExpr.Typed( e, _, _) -> e.Range // fix range for properties with type annotations
117
145
| _ -> synExpr.Range
@@ -131,89 +159,101 @@ module NavigationImpl =
131
159
| _ thisVar:: nm::_ -> ( List.tail lid, nm.idRange)
132
160
| hd::_ -> ( lid, hd.idRange)
133
161
| _ -> ( 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) ]
165
+ | SynPat.Named (_, ident,_,_, r), _ ->
166
+ [ createMemberLid([ ident], FieldDecl, iIconGroupConstant, r, enclosingEntityKind, isAbstract)]
136
167
| _ -> []
137
168
138
169
// Process a class declaration or F# type declaration
139
170
let rec processExnDefnRepr baseName nested ( SynExceptionDefnRepr ( _ , ( UnionCase ( _ , id , fldspec , _ , _ , _ )), _ , _ , _ , m )) =
140
171
// Exception declaration
141
- [ createDecl( baseName, id, ExnDecl, iIconGroupException, m, fldspecRange fldspec, nested) ]
172
+ [ createDecl( baseName, id, ExnDecl, iIconGroupException, m, fldspecRange fldspec, nested,
173
+ FSharpEnclosingEntityKind.Exception, false ) ]
142
174
143
175
// Process a class declaration or F# type declaration
144
176
and processExnDefn baseName ( SynExceptionDefn ( repr , membDefns , _ )) =
145
- let nested = processMembers membDefns |> snd
177
+ let nested = processMembers membDefns FSharpEnclosingEntityKind.Exception |> snd
146
178
processExnDefnRepr baseName nested repr
147
179
148
180
and processTycon baseName ( TypeDefn ( ComponentInfo ( _ , _ , _ , lid , _ , _ , _ , _ ), repr , membDefns , m )) =
149
- let topMembers = processMembers membDefns |> snd
181
+ let topMembers = processMembers membDefns FSharpEnclosingEntityKind.Class |> snd
150
182
match repr with
151
183
| SynTypeDefnRepr.Exception repr -> processExnDefnRepr baseName [] repr
152
184
| SynTypeDefnRepr.ObjectModel(_, membDefns, mb) ->
153
185
// F# class declaration
154
- let members = processMembers membDefns |> snd
186
+ let members = processMembers membDefns FSharpEnclosingEntityKind.Class |> snd
155
187
let nested = members@ topMembers
156
- ([ 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))
157
190
| SynTypeDefnRepr.Simple( simple, _) ->
158
191
// F# type declaration
159
192
match simple with
160
193
| SynTypeDefnSimpleRepr.Union(_, cases, mb) ->
161
194
let cases =
162
195
[ for ( UnionCase(_, id, fldspec, _, _, _)) in cases ->
163
- createMember( id, OtherDecl, iIconGroupValueType, unionRanges ( fldspecRange fldspec) id.idRange) ]
196
+ createMember( id, OtherDecl, iIconGroupValueType, unionRanges ( fldspecRange fldspec) id.idRange,
197
+ FSharpEnclosingEntityKind.DU, false ) ]
164
198
let nested = cases@ topMembers
165
- [ 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 ) ]
166
201
| SynTypeDefnSimpleRepr.Enum( cases, mb) ->
167
202
let cases =
168
203
[ for ( EnumCase(_, id, _, _, m)) in cases ->
169
- createMember( id, FieldDecl, iIconGroupEnumMember, m) ]
204
+ createMember( id, FieldDecl, iIconGroupEnumMember, m, FSharpEnclosingEntityKind.Enum , false ) ]
170
205
let nested = cases@ topMembers
171
- [ 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 ) ]
172
208
| SynTypeDefnSimpleRepr.Record(_, fields, mb) ->
173
209
let fields =
174
210
[ for ( Field(_, _, id, _, _, _, _, m)) in fields do
175
211
if ( id.IsSome) then
176
- yield createMember( id.Value, FieldDecl, iIconGroupFieldBlue, m) ]
212
+ yield createMember( id.Value, FieldDecl, iIconGroupFieldBlue, m, FSharpEnclosingEntityKind.Record , false ) ]
177
213
let nested = fields@ topMembers
178
- [ 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 ) ]
179
216
| SynTypeDefnSimpleRepr.TypeAbbrev(_, _, mb) ->
180
- [ 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 ) ]
181
219
182
220
//| SynTypeDefnSimpleRepr.General of TyconKind * (SynType * range * ident option) list * (valSpfn * MemberFlags) list * fieldDecls * bool * bool * range
183
221
//| SynTypeDefnSimpleRepr.LibraryOnlyILAssembly of ILType * range
184
222
//| TyconCore_repr_hidden of range
185
223
| _ -> []
186
224
187
225
// Returns class-members for the right dropdown
188
- and processMembers members : ( range * list < FSharpNavigationDeclarationItem * int >) =
226
+ and processMembers ( members : SynMemberDefns ) ( enclosingEntityKind : FSharpEnclosingEntityKind )
227
+ : ( range * list < FSharpNavigationDeclarationItem * int >) =
228
+
189
229
let members = members |> List.map ( fun memb ->
190
230
( memb.Range,
191
231
match memb with
192
- | SynMemberDefn.LetBindings( binds, _, _, _) -> List.collect ( processBinding false ) binds
193
- | 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
194
234
| SynMemberDefn.ValField( Field(_, _, Some( rcid), ty, _, _, _, _), _) ->
195
- [ createMember( rcid, FieldDecl, iIconGroupFieldBlue, ty.Range) ]
235
+ [ createMember( rcid, FieldDecl, iIconGroupFieldBlue, ty.Range, enclosingEntityKind , false ) ]
196
236
| SynMemberDefn.AutoProperty(_ attribs,_ isStatic, id,_ tyOpt,_ propKind,_,_ xmlDoc,_ access,_ synExpr, _, _) ->
197
- [ createMember( id, FieldDecl, iIconGroupFieldBlue, id.idRange) ]
237
+ [ createMember( id, FieldDecl, iIconGroupFieldBlue, id.idRange, enclosingEntityKind , false ) ]
198
238
| SynMemberDefn.AbstractSlot( ValSpfn(_, id, _, ty, _, _, _, _, _, _, _), _, _) ->
199
- [ createMember( id, MethodDecl, iIconGroupMethod2, ty.Range) ]
239
+ [ createMember( id, MethodDecl, iIconGroupMethod2, ty.Range, enclosingEntityKind , true ) ]
200
240
| SynMemberDefn.NestedType _ -> failwith " tycon as member????" //processTycon tycon
201
241
| SynMemberDefn.Interface(_, Some( membs), _) ->
202
- processMembers membs |> snd
242
+ processMembers membs FSharpEnclosingEntityKind.Interface |> snd
203
243
| _ -> [] ))
204
244
(( members |> Seq.map fst |> Seq.fold unionRangesChecked range.Zero),
205
245
( members |> List.map snd |> List.concat))
206
246
207
247
// Process declarations in a module that belong to the right drop-down (let bindings)
208
248
let processNestedDeclarations decls = decls |> List.collect ( function
209
- | SynModuleDecl.Let(_, binds, _) -> List.collect ( processBinding false ) binds
249
+ | SynModuleDecl.Let(_, binds, _) -> List.collect ( processBinding false FSharpEnclosingEntityKind.Module false ) binds
210
250
| _ -> [] )
211
251
212
252
// Process declarations nested in a module that should be displayed in the left dropdown
213
253
// (such as type declarations, nested modules etc.)
214
254
let rec processFSharpNavigationTopLevelDeclarations ( baseName , decls ) = decls |> List.collect ( function
215
255
| SynModuleDecl.ModuleAbbrev( id, lid, m) ->
216
- [ createDecl( baseName, id, ModuleDecl, iIconGroupModule, m, rangeOfLid lid, []) ]
256
+ [ createDecl( baseName, id, ModuleDecl, iIconGroupModule, m, rangeOfLid lid, [], FSharpEnclosingEntityKind.Namespace , false ) ]
217
257
218
258
| SynModuleDecl.NestedModule( ComponentInfo(_, _, _, lid, _, _, _, _), _ isRec, decls, _, m) ->
219
259
// Find let bindings (for the right dropdown)
@@ -222,7 +262,8 @@ module NavigationImpl =
222
262
223
263
// Get nested modules and types (for the left dropdown)
224
264
let other = processFSharpNavigationTopLevelDeclarations( newBaseName, decls)
225
- 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
226
267
227
268
| SynModuleDecl.Types( tydefs, _) -> tydefs |> List.collect ( processTycon baseName)
228
269
| SynModuleDecl.Exception ( defn,_) -> processExnDefn baseName defn
@@ -245,7 +286,7 @@ module NavigationImpl =
245
286
( textOfLid id, ( if isModule then ModuleFileDecl else NamespaceDecl),
246
287
iIconGroupModule * 6 , m,
247
288
unionRangesChecked ( rangeOfDecls nested) ( moduleRange ( rangeOfLid id) other),
248
- singleTopLevel), ( addItemName( textOfLid id)), nested
289
+ singleTopLevel, FSharpEnclosingEntityKind.Module , false ), ( addItemName( textOfLid id)), nested
249
290
decl:: other )
250
291
251
292
let items =
0 commit comments