11namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Features.ContextActions
22
3- open System
43open System.IO
4+ open JetBrains.ProjectModel .ProjectsHost
5+ open JetBrains.RdBackend .Common .Features .ProjectModel
6+ open JetBrains.RdBackend .Common .Features .ProjectModel .View .Ordering
57open JetBrains.ReSharper .Feature .Services .ContextActions
68open JetBrains.ReSharper .Plugins .FSharp .Psi .Features .Intentions
79open type JetBrains.ReSharper .Psi .PsiSourceFileExtensions
@@ -20,22 +22,32 @@ type GenerateSignatureFileAction(dataProvider: FSharpContextActionDataProvider)
2022 not hasSignature
2123
2224 override this.ExecutePsiTransaction ( solution , _ ) =
23- let project = dataProvider.SourceFile.GetProject()
24-
25+ let projectFile = dataProvider.SourceFile.ToProjectFile()
2526 let physicalPath = dataProvider.SourceFile.ToProjectFile() .Location.FileAccessPath
26- let fsiFile = Path.ChangeExtension( physicalPath, " .fsi" )
27- let currentFSharpFile = dataProvider.PsiFile
28- let fcsService = currentFSharpFile.FcsCheckerService
29- let checkResult = fcsService.ParseAndCheckFile( currentFSharpFile.GetSourceFile(), " for signature file" , true )
30- do
31- match checkResult with
32- | None -> ()
33- | Some { CheckResults = checkResult } ->
34-
35- match checkResult.GenerateSignature() with
36- | None -> ()
37- | Some signatureSourceText ->
38- let content = string signatureSourceText
39- File.WriteAllText( fsiFile, content)
27+ let fsiFile = Path.ChangeExtension( physicalPath, " .fsi" )
28+
29+ try
30+ let currentFSharpFile = dataProvider.PsiFile
31+ let fcsService = currentFSharpFile.FcsCheckerService
32+ let checkResult = fcsService.ParseAndCheckFile( currentFSharpFile.GetSourceFile(), " for signature file" , true )
33+ do
34+ match checkResult with
35+ | None -> ()
36+ | Some { CheckResults = checkResult } ->
37+
38+ match checkResult.GenerateSignature() with
39+ | None -> ()
40+ | Some signatureSourceText ->
41+ let content = string signatureSourceText
42+ File.WriteAllText( fsiFile, content)
43+ with ex ->
44+ // TODO: show some balloon thing?
45+ ()
46+
47+ solution.InvokeUnderTransaction( fun transactionCookie ->
48+ let virtualPath = FileSystemPath.TryParse( fsiFile) .ToVirtualFileSystemPath()
49+ let relativeTo = RelativeTo( projectFile, RelativeToType.Before)
50+ transactionCookie.AddFile( projectFile.ParentFolder, virtualPath, context = OrderingContext( relativeTo))
51+ |> ignore)
4052
41- Action <_>( ignore )
53+ null
0 commit comments