Skip to content
Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
GoToDefinition implemented with shims
  • Loading branch information
TIHan committed May 26, 2019
commit acbe40aa17dbe39f35a5b467e4a444ae418aed43
26 changes: 8 additions & 18 deletions vsintegration/src/FSharp.Editor/Navigation/GoToDefinition.fs
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ open Microsoft.CodeAnalysis
open Microsoft.CodeAnalysis.FindSymbols
open Microsoft.CodeAnalysis.Text
open Microsoft.CodeAnalysis.Navigation
open Microsoft.CodeAnalysis.ExternalAccess.FSharp.Navigation

open Microsoft.VisualStudio.Shell.Interop

Expand Down Expand Up @@ -105,16 +106,6 @@ module private ExternalSymbol =

| _ -> []

type internal FSharpNavigableItem(document: Document, textSpan: TextSpan) =
interface INavigableItem with
member __.Glyph = Glyph.BasicFile
member __.DisplayFileLocation = true
member __.IsImplicitlyDeclared = false
member __.Document = document
member __.SourceSpan = textSpan
member __.DisplayTaggedParts = ImmutableArray<TaggedText>.Empty
member __.ChildItems = ImmutableArray<INavigableItem>.Empty

// TODO: Uncomment code when VS has a fix for updating the status bar.
type internal StatusBar(statusBar: IVsStatusbar) =
let mutable _searchIcon = int16 Microsoft.VisualStudio.Shell.Interop.Constants.SBAI_Find :> obj
Expand Down Expand Up @@ -335,7 +326,7 @@ type internal GoToDefinition(checker: FSharpChecker, projectInfoManager: FSharpP
member this.FindDefinitionsForPeekTask(originDocument: Document, position: int, cancellationToken: CancellationToken) =
this.FindDefinitionAtPosition(originDocument, position)
|> Async.map (
Option.map (fun (navItem, _) -> (navItem :> INavigableItem))
Option.map (fun (navItem, _) -> navItem)
>> Option.toArray
>> Array.toSeq)
|> RoslynHelpers.StartAsyncAsTask cancellationToken
Expand All @@ -344,31 +335,30 @@ type internal GoToDefinition(checker: FSharpChecker, projectInfoManager: FSharpP
/// at the provided position in the document.
member this.FindDefinitionTask(originDocument: Document, position: int, cancellationToken: CancellationToken) =
this.FindDefinitionAtPosition(originDocument, position)
|> Async.map (Option.map (fun (navItem, range) -> (navItem :> INavigableItem, range)))
|> RoslynHelpers.StartAsyncAsTask cancellationToken

/// Navigate to the positon of the textSpan in the provided document
/// used by quickinfo link navigation when the tooltip contains the correct destination range.
member __.TryNavigateToTextSpan(document: Document, textSpan: TextSpan, statusBar: StatusBar) =
let navigableItem = FSharpNavigableItem(document, textSpan) :> INavigableItem
let navigableItem = FSharpNavigableItem(document, textSpan)
let workspace = document.Project.Solution.Workspace
let navigationService = workspace.Services.GetService<IDocumentNavigationService>()
let options = workspace.Options.WithChangedOption(NavigationOptions.PreferProvisionalTab, true)
let navigationService = workspace.Services.GetService<IFSharpDocumentNavigationService>()
let options = workspace.Options.WithChangedOption(FSharpNavigationOptions.PreferProvisionalTab, true)
let navigationSucceeded = navigationService.TryNavigateToSpan(workspace, navigableItem.Document.Id, navigableItem.SourceSpan, options)

if not navigationSucceeded then
statusBar.TempMessage (SR.CannotNavigateUnknown())

member __.NavigateToItem(navigableItem: #INavigableItem, statusBar: StatusBar) =
member __.NavigateToItem(navigableItem: FSharpNavigableItem, statusBar: StatusBar) =
use __ = statusBar.Animate()

statusBar.Message (SR.NavigatingTo())

let workspace = navigableItem.Document.Project.Solution.Workspace
let navigationService = workspace.Services.GetService<IDocumentNavigationService>()
let navigationService = workspace.Services.GetService<IFSharpDocumentNavigationService>()

// Prefer open documents in the preview tab.
let options = workspace.Options.WithChangedOption(NavigationOptions.PreferProvisionalTab, true)
let options = workspace.Options.WithChangedOption(FSharpNavigationOptions.PreferProvisionalTab, true)
let result = navigationService.TryNavigateToSpan(workspace, navigableItem.Document.Id, navigableItem.SourceSpan, options)

if result then
Expand Down