Skip to content

Commit 0eb8476

Browse files
authored
Merge pull request #662 from vasily-kirichenko/fix-get-navagation-items
ServiceNavigation: fixed wrong range for member val
2 parents 174875d + 2587d5f commit 0eb8476

File tree

1 file changed

+23
-10
lines changed

1 file changed

+23
-10
lines changed

src/fsharp/vs/ServiceNavigation.fs

Lines changed: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)