未验证 提交 30b3a8fa 编写于 作者: P Petr 提交者: GitHub

First steps towards reviving CodeLens

上级 a312dc6b
...@@ -28,51 +28,43 @@ type internal CodeLensProvider ...@@ -28,51 +28,43 @@ type internal CodeLensProvider
settings: EditorOptions settings: EditorOptions
) = ) =
let lineLensProvider = ResizeArray() let tryGetTextDocument (buffer: ITextBuffer) (factory: ITextDocumentFactoryService) =
match factory.TryGetTextDocument buffer with
| true, document -> Some document
| _ -> None
let taggers = ResizeArray() let taggers = ResizeArray()
let lineLensProviders = ResizeArray()
let componentModel = Package.GetGlobalService(typeof<ComponentModelHost.SComponentModel>) :?> ComponentModelHost.IComponentModel let componentModel = Package.GetGlobalService(typeof<ComponentModelHost.SComponentModel>) :?> ComponentModelHost.IComponentModel
let workspace = componentModel.GetService<VisualStudioWorkspace>() let workspace = componentModel.GetService<VisualStudioWorkspace>()
/// Returns an provider for the textView if already one has been created. Else create one. let tryGetCodeLensTagger wpfView buffer =
let addCodeLensProviderOnce wpfView buffer = taggers
let res = taggers |> Seq.tryFind(fun (view, _) -> view = wpfView) |> Seq.tryFind (fun (view, _) -> view = wpfView)
match res with |> Option.map (fun (_, (tagger, _)) -> tagger)
| Some (_, (tagger, _)) -> tagger |> Option.orElse
| None -> (textDocumentFactory
let documentId = |> tryGetTextDocument buffer
lazy ( |> Option.map (fun document -> workspace.CurrentSolution.GetDocumentIdsWithFilePath document.FilePath)
match textDocumentFactory.TryGetTextDocument(buffer) with |> Option.bind Seq.tryHead
| true, textDocument -> |> Option.map (fun documentId ->
Seq.tryHead (workspace.CurrentSolution.GetDocumentIdsWithFilePath(textDocument.FilePath)) let tagger = CodeLensGeneralTagger(wpfView, buffer)
| _ -> None let service = FSharpCodeLensService(serviceProvider, workspace, documentId, buffer, metadataAsSource, componentModel.GetService(), typeMap, tagger, settings)
|> Option.get let provider = (wpfView, (tagger, service))
) wpfView.Closed.Add (fun _ -> taggers.Remove provider |> ignore)
taggers.Add provider
let tagger = CodeLensGeneralTagger(wpfView, buffer) tagger))
let service = FSharpCodeLensService(serviceProvider, workspace, documentId, buffer, metadataAsSource, componentModel.GetService(), typeMap, tagger, settings)
let provider = (wpfView, (tagger, service))
wpfView.Closed.Add (fun _ -> taggers.Remove provider |> ignore)
taggers.Add((wpfView, (tagger, service)))
tagger
/// Returns an provider for the textView if already one has been created. Else create one. let addLineLensProvider wpfView buffer =
let addLineLensProviderOnce wpfView buffer = textDocumentFactory
let res = lineLensProvider |> Seq.tryFind(fun (view, _) -> view = wpfView) |> tryGetTextDocument buffer
match res with |> Option.map (fun document -> workspace.CurrentSolution.GetDocumentIdsWithFilePath(document.FilePath))
| None -> |> Option.bind Seq.tryHead
let documentId = |> Option.map (fun documentId ->
lazy (
match textDocumentFactory.TryGetTextDocument(buffer) with
| true, textDocument ->
Seq.tryHead (workspace.CurrentSolution.GetDocumentIdsWithFilePath(textDocument.FilePath))
| _ -> None
|> Option.get
)
let service = FSharpCodeLensService(serviceProvider, workspace, documentId, buffer, metadataAsSource, componentModel.GetService(), typeMap, LineLensDisplayService(wpfView, buffer), settings) let service = FSharpCodeLensService(serviceProvider, workspace, documentId, buffer, metadataAsSource, componentModel.GetService(), typeMap, LineLensDisplayService(wpfView, buffer), settings)
let provider = (wpfView, service) let provider = (wpfView, service)
wpfView.Closed.Add (fun _ -> lineLensProvider.Remove provider |> ignore) wpfView.Closed.Add (fun _ -> lineLensProviders.Remove provider |> ignore)
lineLensProvider.Add(provider) lineLensProviders.Add(provider))
| _ -> ()
[<Export(typeof<AdornmentLayerDefinition>); Name("CodeLens"); [<Export(typeof<AdornmentLayerDefinition>); Name("CodeLens");
Order(Before = PredefinedAdornmentLayers.Text); Order(Before = PredefinedAdornmentLayers.Text);
...@@ -92,11 +84,18 @@ type internal CodeLensProvider ...@@ -92,11 +84,18 @@ type internal CodeLensProvider
| :? IWpfTextView as view -> view | :? IWpfTextView as view -> view
| _ -> failwith "error" | _ -> failwith "error"
box(addCodeLensProviderOnce wpfView buffer) :?> _ match tryGetCodeLensTagger wpfView buffer with
| Some tagger -> box tagger :?> _
| None -> null
else else
null null
interface IWpfTextViewCreationListener with interface IWpfTextViewCreationListener with
override _.TextViewCreated view = override _.TextViewCreated view =
if settings.CodeLens.Enabled && settings.CodeLens.ReplaceWithLineLens then if settings.CodeLens.Enabled && settings.CodeLens.ReplaceWithLineLens then
addLineLensProviderOnce view (view.TextBuffer) |> ignore let provider =
\ No newline at end of file lineLensProviders
|> Seq.tryFind (fun (v, _) -> v = view)
if provider.IsNone then
addLineLensProvider view (view.TextBuffer) |> ignore
\ No newline at end of file
...@@ -42,7 +42,7 @@ type internal FSharpCodeLensService ...@@ -42,7 +42,7 @@ type internal FSharpCodeLensService
( (
serviceProvider: IServiceProvider, serviceProvider: IServiceProvider,
workspace: Workspace, workspace: Workspace,
documentId: Lazy<DocumentId>, documentId: DocumentId,
buffer: ITextBuffer, buffer: ITextBuffer,
metadataAsSource: FSharpMetadataAsSourceService, metadataAsSource: FSharpMetadataAsSourceService,
classificationFormatMapService: IClassificationFormatMapService, classificationFormatMapService: IClassificationFormatMapService,
...@@ -153,7 +153,7 @@ type internal FSharpCodeLensService ...@@ -153,7 +153,7 @@ type internal FSharpCodeLensService
#if DEBUG #if DEBUG
logInfof "Rechecking code due to buffer edit!" logInfof "Rechecking code due to buffer edit!"
#endif #endif
let! document = workspace.CurrentSolution.GetDocument(documentId.Value) |> Option.ofObj let! document = workspace.CurrentSolution.GetDocument documentId |> Option.ofObj
let! parseFileResults, checkFileResults = document.GetFSharpParseAndCheckResultsAsync(nameof(FSharpUseMutationWhenValueIsMutableFixProvider)) |> liftAsync let! parseFileResults, checkFileResults = document.GetFSharpParseAndCheckResultsAsync(nameof(FSharpUseMutationWhenValueIsMutableFixProvider)) |> liftAsync
let parsedInput = parseFileResults.ParseTree let parsedInput = parseFileResults.ParseTree
#if DEBUG #if DEBUG
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册