1
1
namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Features
2
2
3
+ open System.IO
3
4
open System.Text
4
5
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
14
7
open JetBrains.Application .UI .PopupLayout
15
- open JetBrains.ReSharper .Feature .Services .Navigation
16
8
open JetBrains.DocumentManagers .Transactions .ProjectHostActions .Ordering
17
9
open JetBrains.ProjectModel .ProjectsHost
18
10
open JetBrains.RdBackend .Common .Features .ProjectModel
19
- open JetBrains.ReSharper .Psi
20
- open JetBrains.ReSharper .Resources .Shell
11
+ open JetBrains.ReSharper .Feature .Services .Generate
21
12
open JetBrains.ReSharper .Feature .Services .Generate .Actions
13
+ open JetBrains.ReSharper .Feature .Services .Generate .Workflows
14
+ open JetBrains.ReSharper .Feature .Services .Navigation
22
15
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
24
19
open JetBrains.ReSharper .Plugins .FSharp .Psi .Impl .Tree
20
+ open JetBrains.ReSharper .Plugins .FSharp .Psi .Tree
21
+ open JetBrains.ReSharper .Psi
25
22
open JetBrains.ReSharper .Psi .ExtensionsAPI .Tree
23
+ open JetBrains.ReSharper .Psi .Naming
24
+ open JetBrains.ReSharper .Psi .Tree
25
+ open JetBrains.ReSharper .Resources .Shell
26
26
27
27
module FSharpGeneratorKinds =
28
28
let [<Literal>] SignatureFile = " SignatureFile"
@@ -202,9 +202,11 @@ type FSharpGenerateSignatureBuilder() =
202
202
let node = context.Root :?> IFSharpTreeNode
203
203
let currentFSharpFile = node.FSharpFile
204
204
if currentFSharpFile.IsFSharpSigFile() then false else
205
+
205
206
let solution = node.GetSolution()
206
207
let isSettingEnabled = solution.IsFSharpExperimentalFeatureEnabled( ExperimentalFeature.GenerateSignatureFile)
207
208
if not isSettingEnabled then false else
209
+
208
210
let fcsService = currentFSharpFile.FcsCheckerService
209
211
// TODO: don't check has pair in unit test
210
212
let hasSignature = fcsService.FcsProjectProvider.HasPairFile ( node.GetSourceFile())
@@ -213,22 +215,22 @@ type FSharpGenerateSignatureBuilder() =
213
215
override this.Process ( context ) =
214
216
let node = context.Root :?> IFSharpTreeNode
215
217
use writeCookie = WriteLockCookie.Create( node.IsPhysical())
216
- use transactionCookie =
217
- PsiTransactionCookie.CreateAutoCommitCookieWithCachesUpdate( node.GetPsiServices(), FSharpGeneratorKinds.SignatureFile)
218
218
219
- let currentFSharpFile = node.FSharpFile
220
219
let projectFile = node.GetSourceFile() .ToProjectFile()
221
220
let physicalPath = projectFile.Location.FileAccessPath
222
221
let fsiFile = Path.ChangeExtension( physicalPath, " .fsi" )
223
- let signatureFile = mkSignatureFile currentFSharpFile
222
+ let signatureFile = mkSignatureFile node.FSharpFile
224
223
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))
230
224
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
+
232
234
let navigationOptions = NavigationOptions.FromWindowContext( Shell.Instance.GetComponent< IMainWindowPopupWindowContext>() .Source, " " )
233
235
NavigationManager
234
236
.GetInstance( solution)
@@ -237,7 +239,8 @@ type FSharpGenerateSignatureBuilder() =
237
239
navigationOptions
238
240
)
239
241
|> ignore
240
- )
242
+ )
243
+ ) |> ignore
241
244
242
245
type FSharpGenerateSignatureWorkflow () =
243
246
inherit GenerateCodeWorkflowBase(
0 commit comments