Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitfed9b48

Browse files
authored
Deadlock in QuickInfo, again. Fixes #5254 (#5257) (#5288)
* Deadlock in QuickInfo, again. Fixes #5254 (#5257)* call GetService on UI thread* move things around a bit* fix servidceprovider/statusbar
1 parenteb57ff5 commitfed9b48

File tree

3 files changed

+32
-18
lines changed

3 files changed

+32
-18
lines changed

‎vsintegration/src/FSharp.Editor/CodeLens/FSharpCodeLensService.fs‎

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,26 +4,32 @@ namespace rec Microsoft.VisualStudio.FSharp.Editor
44

55

66
openSystem
7+
openSystem.Collections.Generic
8+
openSystem.Threading
9+
openSystem.Windows
710
openSystem.Windows.Controls
811
openSystem.Windows.Media
9-
openMicrosoft.VisualStudio.Text
10-
openMicrosoft.VisualStudio.Text.Formatting
12+
openSystem.Windows.Media.Animation
13+
1114
openMicrosoft.CodeAnalysis
12-
openSystem.Threading
13-
openMicrosoft.FSharp.Compiler.SourceCodeServices
14-
openSystem.Windows
15-
openSystem.Collections.Generic
16-
openMicrosoft.FSharp.Compiler.Range
17-
openMicrosoft.FSharp.Compiler
18-
openMicrosoft.FSharp.Compiler.Ast
1915
openMicrosoft.CodeAnalysis.Editor.Shared.Extensions
2016
openMicrosoft.CodeAnalysis.Editor.Shared.Utilities
2117
openMicrosoft.CodeAnalysis.Classification
22-
openInternal.Utilities.StructuredFormat
23-
openSystem.Windows.Media.Animation
18+
19+
openMicrosoft.FSharp.Compiler
20+
openMicrosoft.FSharp.Compiler.Ast
21+
openMicrosoft.FSharp.Compiler.SourceCodeServices
22+
openMicrosoft.FSharp.Compiler.Range
2423

2524
openMicrosoft.VisualStudio.FSharp.Editor.Logging
25+
26+
openMicrosoft.VisualStudio.Shell.Interop
27+
28+
openMicrosoft.VisualStudio.Text
2629
openMicrosoft.VisualStudio.Text.Classification
30+
openMicrosoft.VisualStudio.Text.Formatting
31+
32+
openInternal.Utilities.StructuredFormat
2733

2834
typeinternalCodeLens(taggedText,computed,fullTypeSignature,uiElement)=
2935
member valTaggedText:Async<(ResizeArray<Layout.TaggedText>* QuickInfoNavigation)option>= taggedText
@@ -172,7 +178,8 @@ type internal FSharpCodeLensService
172178
lettaggedText= ResizeArray()
173179

174180
Layout.renderL(Layout.taggedTextListR taggedText.Add) typeLayout|> ignore
175-
letnavigation= QuickInfoNavigation(serviceProvider, checker, projectInfoManager, document, realPosition)
181+
letstatusBar= StatusBar(serviceProvider.GetService<SVsStatusbar, IVsStatusbar>())
182+
letnavigation= QuickInfoNavigation(statusBar, checker, projectInfoManager, document, realPosition)
176183
// Because the data is available notify that this line should be updated, displaying the results
177184
return Some(taggedText, navigation)
178185
| None->

‎vsintegration/src/FSharp.Editor/QuickInfo/Navigation.fs‎

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ open Microsoft.VisualStudio.Shell.Interop
1313

1414
typeinternalQuickInfoNavigation
1515
(
16-
serviceProvider: IServiceProvider,
16+
statusBar: StatusBar,
1717
checker: FSharpChecker,
1818
projectInfoManager: FSharpProjectOptionsManager,
1919
initialDoc: Document,
@@ -22,7 +22,6 @@ type internal QuickInfoNavigation
2222

2323
letworkspace= initialDoc.Project.Solution.Workspace
2424
letsolution= workspace.CurrentSolution
25-
letstatusBar= StatusBar(serviceProvider.GetService<SVsStatusbar,IVsStatusbar>())
2625

2726
member__.IsTargetValid(range:range)=
2827
range<> rangeStartup&&

‎vsintegration/src/FSharp.Editor/QuickInfo/QuickInfoProvider.fs‎

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,7 @@ module private FSharpQuickInfo =
159159

160160
typeinternalFSharpAsyncQuickInfoSource
161161
(
162-
serviceProvider: IServiceProvider,
162+
statusBar: StatusBar,
163163
xmlMemberIndexService: IVsXMLMemberIndexService,
164164
checkerProvider:FSharpCheckerProvider,
165165
projectInfoManager:FSharpProjectOptionsManager,
@@ -186,6 +186,9 @@ type internal FSharpAsyncQuickInfoSource
186186

187187
interface IAsyncQuickInfoSourcewith
188188
override__.Dispose()=()// no cleanup necessary
189+
190+
// This method can be called from the background thread.
191+
// Do not call IServiceProvider.GetService here.
189192
override__.GetQuickInfoItemAsync(session:IAsyncQuickInfoSession,cancellationToken:CancellationToken):Task<QuickInfoItem>=
190193
lettriggerPoint= session.GetTriggerPoint(textBuffer.CurrentSnapshot)
191194
match triggerPoint.HasValuewith
@@ -211,7 +214,7 @@ type internal FSharpAsyncQuickInfoSource
211214
letmainDescription,documentation,typeParameterMap,usage,exceptions= ResizeArray(), ResizeArray(), ResizeArray(), ResizeArray(), ResizeArray()
212215
XmlDocumentation.BuildDataTipText(documentationBuilder, mainDescription.Add, documentation.Add, typeParameterMap.Add, usage.Add, exceptions.Add, quickInfo.StructuredText)
213216
letimageId= Tokenizer.GetImageIdForSymbol(quickInfo.Symbol, quickInfo.SymbolKind)
214-
letnavigation= QuickInfoNavigation(serviceProvider, checkerProvider.Checker, projectInfoManager, document, symbolUse.RangeAlternate)
217+
letnavigation= QuickInfoNavigation(statusBar, checkerProvider.Checker, projectInfoManager, document, symbolUse.RangeAlternate)
215218
letdocs= joinWithLineBreaks[documentation; typeParameterMap; usage; exceptions]
216219
letcontent= QuickInfoViewProvider.provideContent(imageId, mainDescription, docs, navigation)
217220
letspan= getTrackingSpan quickInfo.Span
@@ -242,7 +245,7 @@ type internal FSharpAsyncQuickInfoSource
242245
]|> ResizeArray
243246
letdocs= joinWithLineBreaks[documentation; typeParameterMap; usage; exceptions]
244247
letimageId= Tokenizer.GetImageIdForSymbol(targetQuickInfo.Symbol, targetQuickInfo.SymbolKind)
245-
letnavigation= QuickInfoNavigation(serviceProvider, checkerProvider.Checker, projectInfoManager, document, symbolUse.RangeAlternate)
248+
letnavigation= QuickInfoNavigation(statusBar, checkerProvider.Checker, projectInfoManager, document, symbolUse.RangeAlternate)
246249
letcontent= QuickInfoViewProvider.provideContent(imageId, mainDescription, docs, navigation)
247250
letspan= getTrackingSpan targetQuickInfo.Span
248251
return QuickInfoItem(span, content)
@@ -260,6 +263,11 @@ type internal FSharpAsyncQuickInfoSourceProvider
260263
checkerProvider:FSharpCheckerProvider,
261264
projectInfoManager:FSharpProjectOptionsManager
262265
)=
266+
263267
interface IAsyncQuickInfoSourceProviderwith
264268
override__.TryCreateQuickInfoSource(textBuffer:ITextBuffer):IAsyncQuickInfoSource=
265-
new FSharpAsyncQuickInfoSource(serviceProvider, serviceProvider.XMLMemberIndexService, checkerProvider, projectInfoManager, textBuffer):> IAsyncQuickInfoSource
269+
// GetService calls must be made on the UI thread
270+
// It is safe to do it here (see #4713)
271+
letstatusBar= StatusBar(serviceProvider.GetService<SVsStatusbar,IVsStatusbar>())
272+
letxmlMemberIndexService= serviceProvider.XMLMemberIndexService
273+
new FSharpAsyncQuickInfoSource(statusBar, xmlMemberIndexService, checkerProvider, projectInfoManager, textBuffer):> IAsyncQuickInfoSource

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp