Skip to content

Commit 95b98a0

Browse files
committed
Queue the project model transaction after the psi transaction
1 parent f863085 commit 95b98a0

File tree

2 files changed

+45
-25
lines changed

2 files changed

+45
-25
lines changed

ReSharper.FSharp/src/FSharp.Psi.Services/src/Generate/GenerateSignatureProvider.fs

Lines changed: 27 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,28 @@
11
namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Features
22

3+
open System.IO
34
open System.Text
45
open FSharp.Compiler.Symbols
5-
open JetBrains.ReSharper.Feature.Services.Generate
6-
open JetBrains.ReSharper.Feature.Services.Generate.Workflows
7-
open JetBrains.ReSharper.Plugins.FSharp.Psi
8-
open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Generate
9-
open JetBrains.ReSharper.Plugins.FSharp.Psi.Tree
10-
open JetBrains.ReSharper.Psi.Transactions
11-
open JetBrains.ReSharper.Psi.Tree
12-
open JetBrains.ReSharper.Plugins.FSharp
13-
open System.IO
6+
open JetBrains.Application.Threading
147
open JetBrains.Application.UI.PopupLayout
15-
open JetBrains.ReSharper.Feature.Services.Navigation
168
open JetBrains.DocumentManagers.Transactions.ProjectHostActions.Ordering
179
open JetBrains.ProjectModel.ProjectsHost
1810
open JetBrains.RdBackend.Common.Features.ProjectModel
19-
open JetBrains.ReSharper.Psi
20-
open JetBrains.ReSharper.Resources.Shell
11+
open JetBrains.ReSharper.Feature.Services.Generate
2112
open JetBrains.ReSharper.Feature.Services.Generate.Actions
13+
open JetBrains.ReSharper.Feature.Services.Generate.Workflows
14+
open JetBrains.ReSharper.Feature.Services.Navigation
2215
open JetBrains.ReSharper.Feature.Services.Resources
23-
open JetBrains.ReSharper.Psi.Naming
16+
open JetBrains.ReSharper.Plugins.FSharp
17+
open JetBrains.ReSharper.Plugins.FSharp.Psi
18+
open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Generate
2419
open JetBrains.ReSharper.Plugins.FSharp.Psi.Impl.Tree
20+
open JetBrains.ReSharper.Plugins.FSharp.Psi.Tree
21+
open JetBrains.ReSharper.Psi
2522
open JetBrains.ReSharper.Psi.ExtensionsAPI.Tree
23+
open JetBrains.ReSharper.Psi.Naming
24+
open JetBrains.ReSharper.Psi.Tree
25+
open JetBrains.ReSharper.Resources.Shell
2626

2727
module FSharpGeneratorKinds =
2828
let [<Literal>] SignatureFile = "SignatureFile"
@@ -202,9 +202,11 @@ type FSharpGenerateSignatureBuilder() =
202202
let node = context.Root :?> IFSharpTreeNode
203203
let currentFSharpFile = node.FSharpFile
204204
if currentFSharpFile.IsFSharpSigFile() then false else
205+
205206
let solution = node.GetSolution()
206207
let isSettingEnabled = solution.IsFSharpExperimentalFeatureEnabled(ExperimentalFeature.GenerateSignatureFile)
207208
if not isSettingEnabled then false else
209+
208210
let fcsService = currentFSharpFile.FcsCheckerService
209211
// TODO: don't check has pair in unit test
210212
let hasSignature = fcsService.FcsProjectProvider.HasPairFile (node.GetSourceFile())
@@ -213,22 +215,22 @@ type FSharpGenerateSignatureBuilder() =
213215
override this.Process(context) =
214216
let node = context.Root :?> IFSharpTreeNode
215217
use writeCookie = WriteLockCookie.Create(node.IsPhysical())
216-
use transactionCookie =
217-
PsiTransactionCookie.CreateAutoCommitCookieWithCachesUpdate(node.GetPsiServices(), FSharpGeneratorKinds.SignatureFile)
218218

219-
let currentFSharpFile = node.FSharpFile
220219
let projectFile = node.GetSourceFile().ToProjectFile()
221220
let physicalPath = projectFile.Location.FileAccessPath
222221
let fsiFile = Path.ChangeExtension(physicalPath, ".fsi")
223-
let signatureFile = mkSignatureFile currentFSharpFile
222+
let signatureFile = mkSignatureFile node.FSharpFile
224223
File.WriteAllText(fsiFile, signatureFile.GetText())
225-
let solution = node.GetSolution()
226-
solution.InvokeUnderTransaction(fun transactionCookie ->
227-
let virtualPath = FileSystemPath.TryParse(fsiFile).ToVirtualFileSystemPath()
228-
let relativeTo = RelativeTo(projectFile, RelativeToType.Before)
229-
let projectFile = transactionCookie.AddFile(projectFile.ParentFolder, virtualPath, context = OrderingContext(relativeTo))
230224

231-
if (not Shell.Instance.IsTestShell) then
225+
let solution = context.Solution
226+
solution.Locks.ExecuteOrQueue(FSharpGeneratorKinds.SignatureFile, fun _ ->
227+
solution.InvokeUnderTransaction(fun transactionCookie ->
228+
let virtualPath = FileSystemPath.TryParse(fsiFile).ToVirtualFileSystemPath()
229+
let relativeTo = RelativeTo(projectFile, RelativeToType.Before)
230+
let projectFile = transactionCookie.AddFile(projectFile.ParentFolder, virtualPath, context = OrderingContext(relativeTo))
231+
232+
if Shell.Instance.IsTestShell then () else
233+
232234
let navigationOptions = NavigationOptions.FromWindowContext(Shell.Instance.GetComponent<IMainWindowPopupWindowContext>().Source, "")
233235
NavigationManager
234236
.GetInstance(solution)
@@ -237,7 +239,8 @@ type FSharpGenerateSignatureBuilder() =
237239
navigationOptions
238240
)
239241
|> ignore
240-
)
242+
)
243+
) |> ignore
241244

242245
type FSharpGenerateSignatureWorkflow() =
243246
inherit GenerateCodeWorkflowBase(
Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,30 @@
11
namespace JetBrains.ReSharper.Plugins.FSharp.Tests.Features.Generate
22

3+
open JetBrains.Diagnostics
4+
open JetBrains.IDE
5+
open JetBrains.ProjectModel
36
open JetBrains.ReSharper.FeaturesTestFramework.Generate
47
open JetBrains.ReSharper.Plugins.FSharp
58
open JetBrains.ReSharper.Plugins.FSharp.Tests
9+
open JetBrains.Util
610
open NUnit.Framework
711

812
[<FSharpTest; FSharpExperimentalFeature(ExperimentalFeature.GenerateSignatureFile)>]
913
type FsharpGenerateSignatureTest() =
1014
inherit GenerateTestBase()
15+
1116
override x.RelativeTestDataPath = "features/generate/signatureFiles"
12-
// override this.DumpTextControl(textControl, dumpCaret, dumpSelection) =
17+
18+
override this.DoTest(lifetime, testProject) =
19+
this.SetAsyncBehaviorAllowed(lifetime)
20+
base.DoTest(lifetime, testProject)
21+
22+
override this.DumpTextControl(_, dumpCaret, dumpSelection) =
23+
let editorManager = this.Solution.GetComponent<IEditorManager>()
24+
let fsiPath = this.GetCaretPosition().FileName.ChangeExtension("fsi")
25+
let textControl = editorManager.OpenFileAsync(fsiPath, OpenFileOptions.DefaultActivate).Result.NotNull()
26+
this.TestLifetime.OnTermination(fun _ -> editorManager.CloseTextControl(textControl)) |> ignore
27+
28+
base.DumpTextControl(textControl, dumpCaret, dumpSelection)
29+
1330
[<Test>] member x.``Sample Test`` () = x.DoNamedTest()

0 commit comments

Comments
 (0)