@@ -141,8 +141,8 @@ module NavigationImpl =
141141 ( Binding ( _ , _ , _ , _ , _ , _ , SynValData ( memebrOpt , _ , _ ), synPat , _ , synExpr , _ , _ )) =
142142
143143 let m = match synExpr with
144- | SynExpr.Typed( e, _, _) -> e.Range // fix range for properties with type annotations
145- | _ -> synExpr.Range
144+ | SynExpr.Typed( e, _, _) -> Some e.Range // fix range for properties with type annotations
145+ | _ -> None
146146 match synPat, memebrOpt with
147147 | SynPat.LongIdent( LongIdentWithDots( lid,_), _,_, _, _, _), Some( flags) when isMember ->
148148 let icon , kind =
@@ -154,14 +154,25 @@ module NavigationImpl =
154154 | MemberKind.PropertyGetSet
155155 | MemberKind.PropertySet
156156 | MemberKind.PropertyGet -> iIconGroupProperty, PropertyDecl
157- let lidShow , rangeMerge =
157+ let lidShowAndrangeMerge =
158158 match lid with
159- | _ thisVar:: nm::_ -> ( List.tail lid, nm.idRange)
160- | hd::_ -> ( lid, hd.idRange)
161- | _ -> ( lid, m)
162- [ createMemberLid( lidShow, kind, icon, unionRanges rangeMerge m, enclosingEntityKind, isAbstract) ]
159+ | _ thisVar:: nm::_ -> Some ( List.tail lid, nm.idRange)
160+ | hd::_ -> Some ( lid, hd.idRange)
161+ | _ -> m |> Option.map ( fun m -> lid, m)
162+ match lidShowAndrangeMerge with
163+ | Some ( lidShow, rangeMerge) ->
164+ let range =
165+ match m with
166+ | Some m -> unionRanges rangeMerge m
167+ | None -> rangeMerge
168+ [ createMemberLid( lidShow, kind, icon, range, enclosingEntityKind, isAbstract) ]
169+ | None -> []
163170 | SynPat.LongIdent( LongIdentWithDots( lid,_), _,_, _, _, _), _ ->
164- [ createMemberLid( lid, FieldDecl, iIconGroupConstant, unionRanges ( List.head lid) .idRange m, enclosingEntityKind, isAbstract) ]
171+ let range =
172+ match m with
173+ | Some m -> unionRanges ( List.head lid) .idRange m
174+ | None -> ( List.head lid) .idRange
175+ [ createMemberLid( lid, FieldDecl, iIconGroupConstant, range, enclosingEntityKind, isAbstract) ]
165176 | SynPat.Named (_, ident,_,_, r), _ ->
166177 [ createMemberLid([ ident], FieldDecl, iIconGroupConstant, r, enclosingEntityKind, isAbstract)]
167178 | _ -> []
@@ -231,8 +242,8 @@ module NavigationImpl =
231242 match memb with
232243 | SynMemberDefn.LetBindings( binds, _, _, _) -> List.collect ( processBinding false enclosingEntityKind false ) binds
233244 | SynMemberDefn.Member( bind, _) -> processBinding true enclosingEntityKind false bind
234- | SynMemberDefn.ValField( Field(_, _, Some( rcid), ty , _, _, _, _), _) ->
235- [ createMember( rcid, FieldDecl, iIconGroupFieldBlue, ty.Range , enclosingEntityKind, false ) ]
245+ | SynMemberDefn.ValField( Field(_, _, Some( rcid), _ , _, _, _, _), _) ->
246+ [ createMember( rcid, FieldDecl, iIconGroupFieldBlue, rcid.idRange , enclosingEntityKind, false ) ]
236247 | SynMemberDefn.AutoProperty(_ attribs,_ isStatic, id,_ tyOpt,_ propKind,_,_ xmlDoc,_ access,_ synExpr, _, _) ->
237248 [ createMember( id, FieldDecl, iIconGroupFieldBlue, id.idRange, enclosingEntityKind, false ) ]
238249 | SynMemberDefn.AbstractSlot( ValSpfn(_, id, _, ty, _, _, _, _, _, _, _), _, _) ->
@@ -295,6 +306,8 @@ module NavigationImpl =
295306 |> Array.map ( fun ( d , idx , nest ) ->
296307 let nest = nest |> Array.ofList |> Array.map ( fun ( decl , idx ) -> decl.WithUniqueName( uniqueName d.Name idx))
297308 nest |> Array.sortInPlaceWith ( fun a b -> compare a.Name b.Name)
309+ let nest = nest |> Array.distinctBy ( fun x -> x.Range, x.BodyRange, x.Name, x.Kind)
310+
298311 { Declaration = d.WithUniqueName( uniqueName d.Name idx); Nested = nest } )
299312 items |> Array.sortInPlaceWith ( fun a b -> compare a.Declaration.Name b.Declaration.Name)
300313 new FSharpNavigationItems( items)
0 commit comments