Skip to content

Commit

Permalink
Queue the project model transaction after the psi transaction
Browse files Browse the repository at this point in the history
  • Loading branch information
auduchinok committed Apr 19, 2023
1 parent f863085 commit 95b98a0
Show file tree
Hide file tree
Showing 2 changed files with 45 additions and 25 deletions.
Original file line number Diff line number Diff line change
@@ -1,28 +1,28 @@
namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Features

open System.IO
open System.Text
open FSharp.Compiler.Symbols
open JetBrains.ReSharper.Feature.Services.Generate
open JetBrains.ReSharper.Feature.Services.Generate.Workflows
open JetBrains.ReSharper.Plugins.FSharp.Psi
open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Generate
open JetBrains.ReSharper.Plugins.FSharp.Psi.Tree
open JetBrains.ReSharper.Psi.Transactions
open JetBrains.ReSharper.Psi.Tree
open JetBrains.ReSharper.Plugins.FSharp
open System.IO
open JetBrains.Application.Threading
open JetBrains.Application.UI.PopupLayout
open JetBrains.ReSharper.Feature.Services.Navigation
open JetBrains.DocumentManagers.Transactions.ProjectHostActions.Ordering
open JetBrains.ProjectModel.ProjectsHost
open JetBrains.RdBackend.Common.Features.ProjectModel
open JetBrains.ReSharper.Psi
open JetBrains.ReSharper.Resources.Shell
open JetBrains.ReSharper.Feature.Services.Generate
open JetBrains.ReSharper.Feature.Services.Generate.Actions
open JetBrains.ReSharper.Feature.Services.Generate.Workflows
open JetBrains.ReSharper.Feature.Services.Navigation
open JetBrains.ReSharper.Feature.Services.Resources
open JetBrains.ReSharper.Psi.Naming
open JetBrains.ReSharper.Plugins.FSharp
open JetBrains.ReSharper.Plugins.FSharp.Psi
open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Generate
open JetBrains.ReSharper.Plugins.FSharp.Psi.Impl.Tree
open JetBrains.ReSharper.Plugins.FSharp.Psi.Tree
open JetBrains.ReSharper.Psi
open JetBrains.ReSharper.Psi.ExtensionsAPI.Tree
open JetBrains.ReSharper.Psi.Naming
open JetBrains.ReSharper.Psi.Tree
open JetBrains.ReSharper.Resources.Shell

module FSharpGeneratorKinds =
let [<Literal>] SignatureFile = "SignatureFile"
Expand Down Expand Up @@ -202,9 +202,11 @@ type FSharpGenerateSignatureBuilder() =
let node = context.Root :?> IFSharpTreeNode
let currentFSharpFile = node.FSharpFile
if currentFSharpFile.IsFSharpSigFile() then false else

let solution = node.GetSolution()
let isSettingEnabled = solution.IsFSharpExperimentalFeatureEnabled(ExperimentalFeature.GenerateSignatureFile)
if not isSettingEnabled then false else

let fcsService = currentFSharpFile.FcsCheckerService
// TODO: don't check has pair in unit test
let hasSignature = fcsService.FcsProjectProvider.HasPairFile (node.GetSourceFile())
Expand All @@ -213,22 +215,22 @@ type FSharpGenerateSignatureBuilder() =
override this.Process(context) =
let node = context.Root :?> IFSharpTreeNode
use writeCookie = WriteLockCookie.Create(node.IsPhysical())
use transactionCookie =
PsiTransactionCookie.CreateAutoCommitCookieWithCachesUpdate(node.GetPsiServices(), FSharpGeneratorKinds.SignatureFile)

let currentFSharpFile = node.FSharpFile
let projectFile = node.GetSourceFile().ToProjectFile()
let physicalPath = projectFile.Location.FileAccessPath
let fsiFile = Path.ChangeExtension(physicalPath, ".fsi")
let signatureFile = mkSignatureFile currentFSharpFile
let signatureFile = mkSignatureFile node.FSharpFile
File.WriteAllText(fsiFile, signatureFile.GetText())
let solution = node.GetSolution()
solution.InvokeUnderTransaction(fun transactionCookie ->
let virtualPath = FileSystemPath.TryParse(fsiFile).ToVirtualFileSystemPath()
let relativeTo = RelativeTo(projectFile, RelativeToType.Before)
let projectFile = transactionCookie.AddFile(projectFile.ParentFolder, virtualPath, context = OrderingContext(relativeTo))

if (not Shell.Instance.IsTestShell) then
let solution = context.Solution
solution.Locks.ExecuteOrQueue(FSharpGeneratorKinds.SignatureFile, fun _ ->
solution.InvokeUnderTransaction(fun transactionCookie ->
let virtualPath = FileSystemPath.TryParse(fsiFile).ToVirtualFileSystemPath()
let relativeTo = RelativeTo(projectFile, RelativeToType.Before)
let projectFile = transactionCookie.AddFile(projectFile.ParentFolder, virtualPath, context = OrderingContext(relativeTo))

if Shell.Instance.IsTestShell then () else

let navigationOptions = NavigationOptions.FromWindowContext(Shell.Instance.GetComponent<IMainWindowPopupWindowContext>().Source, "")
NavigationManager
.GetInstance(solution)
Expand All @@ -237,7 +239,8 @@ type FSharpGenerateSignatureBuilder() =
navigationOptions
)
|> ignore
)
)
) |> ignore

type FSharpGenerateSignatureWorkflow() =
inherit GenerateCodeWorkflowBase(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,30 @@
namespace JetBrains.ReSharper.Plugins.FSharp.Tests.Features.Generate

open JetBrains.Diagnostics
open JetBrains.IDE
open JetBrains.ProjectModel
open JetBrains.ReSharper.FeaturesTestFramework.Generate
open JetBrains.ReSharper.Plugins.FSharp
open JetBrains.ReSharper.Plugins.FSharp.Tests
open JetBrains.Util
open NUnit.Framework

[<FSharpTest; FSharpExperimentalFeature(ExperimentalFeature.GenerateSignatureFile)>]
type FsharpGenerateSignatureTest() =
inherit GenerateTestBase()

override x.RelativeTestDataPath = "features/generate/signatureFiles"
// override this.DumpTextControl(textControl, dumpCaret, dumpSelection) =

override this.DoTest(lifetime, testProject) =
this.SetAsyncBehaviorAllowed(lifetime)
base.DoTest(lifetime, testProject)

override this.DumpTextControl(_, dumpCaret, dumpSelection) =
let editorManager = this.Solution.GetComponent<IEditorManager>()
let fsiPath = this.GetCaretPosition().FileName.ChangeExtension("fsi")
let textControl = editorManager.OpenFileAsync(fsiPath, OpenFileOptions.DefaultActivate).Result.NotNull()
this.TestLifetime.OnTermination(fun _ -> editorManager.CloseTextControl(textControl)) |> ignore

base.DumpTextControl(textControl, dumpCaret, dumpSelection)

[<Test>] member x.``Sample Test`` () = x.DoNamedTest()

0 comments on commit 95b98a0

Please sign in to comment.