Skip to content

Commit 08c9c23

Browse files
committed
Migrate code to FSharpGenerateSignatureProvider
1 parent ca70826 commit 08c9c23

File tree

8 files changed

+110
-46
lines changed

8 files changed

+110
-46
lines changed

ReSharper.FSharp/src/FSharp.Psi.Intentions/FSharp.Psi.Intentions.fsproj

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@
2626
<Compile Include="src\Intentions\SetNameAction.fs" />
2727
<Compile Include="src\Intentions\LetToUseAction.fs" />
2828
<Compile Include="src\Intentions\RenameFileToMatchTypeNameAction.fs" />
29-
<Compile Include="src\Intentions\GenerateSignatureFileAction.fs" />
3029
<Compile Include="src\QuickFixes\FSharpQuickFixBase.fs" />
3130
<Compile Include="src\QuickFixes\RemoveUnusedOpensFix.fs" />
3231
<Compile Include="src\QuickFixes\ReplaceUseWithLetFix.fs" />

ReSharper.FSharp/src/FSharp.Psi.Services/FSharp.Psi.Services.fsproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@
6464
<Compile Include="src\Generate\FSharpGeneratorContext.fs" />
6565
<Compile Include="src\Generate\GenerateOverrides.fs" />
6666
<Compile Include="src\Generate\GenerateProvider.fs" />
67+
<Compile Include="src\Generate\GenerateSignatureProvider.fs" />
6768
<Compile Include="src\Refactorings\Rename.fs" />
6869
<Compile Include="src\Refactorings\IntroduceVariable.fs" />
6970
<Compile Include="src\Refactorings\FSharpInlineVariable.fs" />

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ type FSharpGeneratorContext(kind, [<NotNull>] treeNode: ITreeNode, [<CanBeNull>]
2626

2727
override x.Language = FSharpLanguage.Instance :> _
2828

29-
override x.Root = typeDecl :> _
29+
override x.Root = treeNode
3030
override val Anchor = null with get, set
3131

3232
override x.PsiModule = treeNode.GetPsiModule()

ReSharper.FSharp/src/FSharp.Psi.Intentions/src/Intentions/GenerateSignatureFileAction.fs renamed to ReSharper.FSharp/src/FSharp.Psi.Services/src/Generate/GenerateSignatureProvider.fs

Lines changed: 84 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,61 @@
1-
namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Features.ContextActions
1+
namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Features
22

3-
open System.IO
43
open System.Text
54
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
614
open JetBrains.Application.UI.PopupLayout
715
open JetBrains.ReSharper.Feature.Services.Navigation
8-
open JetBrains.ReSharper.Psi.Naming
9-
open JetBrains.ReSharper.Psi.Tree
1016
open JetBrains.DocumentManagers.Transactions.ProjectHostActions.Ordering
1117
open JetBrains.ProjectModel.ProjectsHost
1218
open JetBrains.RdBackend.Common.Features.ProjectModel
13-
open JetBrains.ReSharper.Feature.Services.ContextActions
14-
open JetBrains.ReSharper.Plugins.FSharp.Psi
15-
open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Intentions
16-
open JetBrains.ReSharper.Plugins.FSharp
17-
open JetBrains.ReSharper.Plugins.FSharp.Psi.Impl.Tree
18-
open JetBrains.ReSharper.Plugins.FSharp.Psi.Tree
1919
open JetBrains.ReSharper.Psi
20-
open JetBrains.ReSharper.Psi.ExtensionsAPI.Tree
2120
open JetBrains.ReSharper.Resources.Shell
21+
open JetBrains.ReSharper.Feature.Services.Generate.Actions
22+
open JetBrains.ReSharper.Feature.Services.Resources
23+
open JetBrains.ReSharper.Psi.Naming
24+
open JetBrains.ReSharper.Plugins.FSharp.Psi.Impl.Tree
25+
open JetBrains.ReSharper.Psi.ExtensionsAPI.Tree
2226

23-
// extract value -> ctrl alt v
24-
// undo that -> ctrl alt n
25-
26-
// TODO: what about attributes, type parameters, delegates, exceptions
27-
28-
// FSharpTokenType.AND.CreateLeafElement()
29-
30-
[<ContextAction(Group = "F#", Name = "Generate signature file for current file", Priority = 1s,
31-
Description = "Generate signature file for current file.")>]
32-
type GenerateSignatureFileAction(dataProvider: FSharpContextActionDataProvider) =
33-
inherit FSharpContextActionBase(dataProvider)
34-
27+
module FSharpGeneratorKinds =
28+
let [<Literal>] SignatureFile = "SignatureFile"
29+
30+
type FSharpGeneratorSignatureElement(fsFile: IFSharpFile) =
31+
inherit GeneratorElementBase()
32+
33+
override this.GetPresentationObject() = fsFile
34+
override this.Matches(_searchText, matcher) = matcher.Matches(this.TestDescriptor)
35+
override this.TestDescriptor = "Generate signature file title" // fsFile.GetSourceFile().Name
36+
37+
interface IGeneratorElementPresenter with
38+
member this.InitGeneratorPresenter(presenter) =
39+
presenter.Present<FSharpGeneratorSignatureElement>(fun value item structureelement state ->
40+
item.RichText <-
41+
// Text seen in the popup of the selectable item.
42+
JetBrains.UI.RichText.RichText(fsFile.GetSourceFile().Name)
43+
item.Images.Add(PsiServicesThemedIcons.HasImplementations.Id))
44+
45+
[<GeneratorElementProvider(FSharpGeneratorKinds.SignatureFile, typeof<FSharpLanguage>)>]
46+
type FSharpGenerateSignatureProvider() =
47+
inherit GeneratorProviderBase<FSharpGeneratorContext>()
48+
49+
override this.Populate(context: FSharpGeneratorContext): unit =
50+
let node = context.Root :?> IFSharpTreeNode
51+
context.ProvidedElements.Add(FSharpGeneratorSignatureElement(node.FSharpFile))
52+
53+
[<GeneratorBuilder(FSharpGeneratorKinds.SignatureFile, typeof<FSharpLanguage>)>]
54+
type FSharpGenerateSignatureBuilder() =
55+
inherit GeneratorBuilderBase<FSharpGeneratorContext>()
56+
57+
// TODO: what about attributes, type parameters, delegates, exceptions
58+
3559
let mkSignatureFile (fsharpFile: IFSharpFile): IFSharpFile =
3660
let factory : IFSharpElementFactory = fsharpFile.CreateElementFactory(extension = FSharpSignatureProjectFileType.FsiExtension)
3761
let signatureFile : IFSharpFile = factory.CreateEmptyFile()
@@ -174,26 +198,31 @@ type GenerateSignatureFileAction(dataProvider: FSharpContextActionDataProvider)
174198

175199
signatureFile
176200

177-
override this.Text = "Generate signature file for current file"
178-
179-
override this.IsAvailable _ =
180-
let solution = dataProvider.Solution
201+
override this.IsAvailable(context: FSharpGeneratorContext): bool =
202+
let node = context.Root :?> IFSharpTreeNode
203+
let currentFSharpFile = node.FSharpFile
204+
if currentFSharpFile.IsFSharpSigFile() then false else
205+
let solution = node.GetSolution()
181206
let isSettingEnabled = solution.IsFSharpExperimentalFeatureEnabled(ExperimentalFeature.GenerateSignatureFile)
182207
if not isSettingEnabled then false else
183-
let currentFSharpFile = dataProvider.PsiFile
184208
let fcsService = currentFSharpFile.FcsCheckerService
185209
// TODO: don't check has pair in unit test
186-
let hasSignature = fcsService.FcsProjectProvider.HasPairFile dataProvider.SourceFile
210+
let hasSignature = fcsService.FcsProjectProvider.HasPairFile (node.GetSourceFile())
187211
not hasSignature
188212

189-
override this.ExecutePsiTransaction(solution, _) =
190-
let projectFile = dataProvider.SourceFile.ToProjectFile()
191-
let fsharpFile = projectFile.GetPrimaryPsiFile().AsFSharpFile()
192-
let physicalPath = dataProvider.SourceFile.ToProjectFile().Location.FileAccessPath
213+
override this.Process(context) =
214+
let node = context.Root :?> IFSharpTreeNode
215+
use writeCookie = WriteLockCookie.Create(node.IsPhysical())
216+
use transactionCookie =
217+
PsiTransactionCookie.CreateAutoCommitCookieWithCachesUpdate(node.GetPsiServices(), FSharpGeneratorKinds.SignatureFile)
218+
219+
let currentFSharpFile = node.FSharpFile
220+
let projectFile = node.GetSourceFile().ToProjectFile()
221+
let physicalPath = projectFile.Location.FileAccessPath
193222
let fsiFile = Path.ChangeExtension(physicalPath, ".fsi")
194-
let signatureFile = mkSignatureFile fsharpFile
223+
let signatureFile = mkSignatureFile currentFSharpFile
195224
File.WriteAllText(fsiFile, signatureFile.GetText())
196-
225+
let solution = node.GetSolution()
197226
solution.InvokeUnderTransaction(fun transactionCookie ->
198227
let virtualPath = FileSystemPath.TryParse(fsiFile).ToVirtualFileSystemPath()
199228
let relativeTo = RelativeTo(projectFile, RelativeToType.Before)
@@ -210,8 +239,23 @@ type GenerateSignatureFileAction(dataProvider: FSharpContextActionDataProvider)
210239
|> ignore
211240
)
212241

213-
null
214-
215-
// First test name would be: ``ModuleStructure 01`` , ``NamespaceStructure 01``
216-
217-
// TODO: raise parser issue.
242+
type FSharpGenerateSignatureWorkflow() =
243+
inherit GenerateCodeWorkflowBase(
244+
FSharpGeneratorKinds.SignatureFile,
245+
PsiServicesThemedIcons.Implements.Id,
246+
// Seen in the dropdown menu when alt + insert is pressed.
247+
"Generate signature file",
248+
GenerateActionGroup.CLR_LANGUAGE,
249+
// Title of the window that opens up when the workflow is started.
250+
"Generate signature file",
251+
// Description of the window that opens up when the workflow is started.
252+
$"Generate a signature file for the current file.",
253+
FSharpGeneratorKinds.SignatureFile)
254+
255+
override this.Order = 10. // See GeneratorStandardOrder.cs
256+
257+
[<GenerateProvider>]
258+
type FSharpGenerateSignatureWorkflowProvider() =
259+
interface IGenerateImplementationsWorkflowProvider with
260+
member this.CreateWorkflow _ =
261+
[| FSharpGenerateSignatureWorkflow() |]
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
// ${KIND:SignatureFile}
2+
// ${SELECT0:Generate signature file title}
3+
module Foo
4+
5+
open System
6+
{caret}

ReSharper.FSharp/test/src/FSharp.Intentions.Tests/src/Intentions/GenerateSignatureFileTest.fs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,9 @@ open JetBrains.ReSharper.Plugins.FSharp.Services.Formatter
99
open JetBrains.ReSharper.TestFramework
1010
open NUnit.Framework
1111

12-
type GenerateSignatureFileTest() =
13-
inherit FSharpContextActionExecuteTestBase<GenerateSignatureFileAction>()
14-
15-
override this.ExtraPath = "generateSignatureFile"
12+
// type GenerateSignatureFileTest() =
13+
// inherit FSharpContextActionExecuteTestBase<GenerateSignatureFileAction>()
14+
//
15+
// override this.ExtraPath = "generateSignatureFile"
1616

1717
// [<Test>] member x.``ModuleStructure - 01`` () = x.DoNamedTestWithSignature()

ReSharper.FSharp/test/src/FSharp.Tests/FSharp.Tests.fsproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
<Compile Include="Actions\TypingAssistTest.fs" />
3333
<Compile Include="Actions\FSharpExtendSelectionTest.fs" />
3434
<Compile Include="Generate\FSharpGenerateOverridesTest.fs" />
35+
<Compile Include="Generate\FsharpGenerateSignatureTest.fs" />
3536
<Compile Include="Refactorings\RenameTest.fs" />
3637
<Compile Include="Refactorings\IntroduceVarTest.fs" />
3738
<Compile Include="Refactorings\InlineVarTest.fs" />
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
namespace JetBrains.ReSharper.Plugins.FSharp.Tests.Features.Generate
2+
3+
open JetBrains.ReSharper.FeaturesTestFramework.Generate
4+
open JetBrains.ReSharper.Plugins.FSharp
5+
open JetBrains.ReSharper.Plugins.FSharp.Tests
6+
open NUnit.Framework
7+
8+
[<FSharpTest; FSharpExperimentalFeature(ExperimentalFeature.GenerateSignatureFile)>]
9+
type FsharpGenerateSignatureTest() =
10+
inherit GenerateTestBase()
11+
override x.RelativeTestDataPath = "features/generate/signatureFiles"
12+
// override this.DumpTextControl(textControl, dumpCaret, dumpSelection) =
13+
[<Test>] member x.``Sample Test`` () = x.DoNamedTest()

0 commit comments

Comments
 (0)