From 60366d11c7fc12a36df53136e6aac15e2b0586e3 Mon Sep 17 00:00:00 2001 From: dawe Date: Tue, 30 May 2023 11:21:02 +0200 Subject: [PATCH] Fix overrides generation for "naked" single case unions (#530) Co-authored-by: Eugene Auduchinok --- .../src/Generate/GenerateProvider.fs | 21 ++++++++++++++----- .../Repr - Union - No bar - Single 03.fs | 4 ++++ .../Repr - Union - No bar - Single 03.fs.gold | 13 ++++++++++++ .../Repr - Union - No bar - Single 04.fs | 4 ++++ .../Repr - Union - No bar - Single 04.fs.gold | 13 ++++++++++++ .../Generate/FSharpGenerateOverridesTest.fs | 2 ++ 6 files changed, 52 insertions(+), 5 deletions(-) create mode 100644 ReSharper.FSharp/test/data/features/generate/overrides/Repr - Union - No bar - Single 03.fs create mode 100644 ReSharper.FSharp/test/data/features/generate/overrides/Repr - Union - No bar - Single 03.fs.gold create mode 100644 ReSharper.FSharp/test/data/features/generate/overrides/Repr - Union - No bar - Single 04.fs create mode 100644 ReSharper.FSharp/test/data/features/generate/overrides/Repr - Union - No bar - Single 04.fs.gold diff --git a/ReSharper.FSharp/src/FSharp.Psi.Services/src/Generate/GenerateProvider.fs b/ReSharper.FSharp/src/FSharp.Psi.Services/src/Generate/GenerateProvider.fs index 88040accfc..7bb171f273 100644 --- a/ReSharper.FSharp/src/FSharp.Psi.Services/src/Generate/GenerateProvider.fs +++ b/ReSharper.FSharp/src/FSharp.Psi.Services/src/Generate/GenerateProvider.fs @@ -11,12 +11,14 @@ open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Generate open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Util open JetBrains.ReSharper.Plugins.FSharp.Psi.Impl.Cache2 open JetBrains.ReSharper.Plugins.FSharp.Psi.Impl.Tree +open JetBrains.ReSharper.Plugins.FSharp.Psi.Parsing open JetBrains.ReSharper.Plugins.FSharp.Psi.Tree open JetBrains.ReSharper.Plugins.FSharp.Psi.Util open JetBrains.ReSharper.Plugins.FSharp.Util open JetBrains.ReSharper.Psi open JetBrains.ReSharper.Psi.DataContext open JetBrains.ReSharper.Psi.ExtensionsAPI +open JetBrains.ReSharper.Psi.ExtensionsAPI.Tree open JetBrains.ReSharper.Psi.Impl open JetBrains.ReSharper.Psi.Tree open JetBrains.ReSharper.Psi.Util @@ -288,9 +290,10 @@ type FSharpOverridingMembersBuilder() = normalizeReprEnd recordRepr.LeftBrace recordRepr.RightBrace recordRepr.LeftBrace, recordRepr.RightBrace - | :? IUnionRepresentation as unionRepr -> + | :? IUnionRepresentation + | :? ITypeAbbreviationRepresentation as typeRepr -> let diff = origTypeReprIndent - desiredIndent - if diff > 0 then shiftWithWhitespaceBefore -diff unionRepr + if diff > 0 then shiftWithWhitespaceBefore -diff typeRepr null, null | _ -> null, null @@ -317,15 +320,23 @@ type FSharpOverridingMembersBuilder() = use disableFormatter = new DisableCodeFormatter() let typeDecl = context.Root :?> IFSharpTypeDeclaration - let typeRepr = typeDecl.TypeRepresentation - match typeRepr with + match typeDecl.TypeRepresentation with | :? IUnionRepresentation as unionRepr -> unionRepr.UnionCasesEnumerable |> Seq.tryHead - |> Option.iter EnumCaseLikeDeclarationUtil.addBarIfNeeded + |> Option.iter EnumCaseLikeDeclarationUtil.addBarIfNeeded + | :? ITypeAbbreviationRepresentation as abbrRepr when abbrRepr.CanBeUnionCase -> + let factory = typeDecl.CreateElementFactory() + let caseName = FSharpNamingService.mangleNameIfNecessary abbrRepr.AbbreviatedTypeOrUnionCase.SourceName + let declGroup = factory.CreateModuleMember($"type U = | {caseName}") :?> ITypeDeclarationGroup + let typeDeclaration = declGroup.TypeDeclarations[0] :?> IFSharpTypeDeclaration + let repr = typeDeclaration.TypeRepresentation + let newRepr = typeDecl.SetTypeRepresentation(repr) + if context.Anchor == abbrRepr then context.Anchor <- newRepr | _ -> () + let typeRepr = typeDecl.TypeRepresentation addNewLineBeforeReprIfNeeded typeDecl typeRepr let anchor: ITreeNode = diff --git a/ReSharper.FSharp/test/data/features/generate/overrides/Repr - Union - No bar - Single 03.fs b/ReSharper.FSharp/test/data/features/generate/overrides/Repr - Union - No bar - Single 03.fs new file mode 100644 index 0000000000..af28b079a3 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/generate/overrides/Repr - Union - No bar - Single 03.fs @@ -0,0 +1,4 @@ +// ${KIND:Overrides} +// ${SELECT0:ToString():System.String} + +type SingleCaseUnion = Case{caret} diff --git a/ReSharper.FSharp/test/data/features/generate/overrides/Repr - Union - No bar - Single 03.fs.gold b/ReSharper.FSharp/test/data/features/generate/overrides/Repr - Union - No bar - Single 03.fs.gold new file mode 100644 index 0000000000..2b396fb852 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/generate/overrides/Repr - Union - No bar - Single 03.fs.gold @@ -0,0 +1,13 @@ +Provided elements: + 0: ToString():System.String + 1: Equals(System.Object):System.Boolean + 2: GetHashCode():System.Int32 + 3: Finalize():System.Void + +// ${KIND:Overrides} +// ${SELECT0:ToString():System.String} + +type SingleCaseUnion = + | Case + + override this.ToString() = {selstart}failwith "todo"{selend} diff --git a/ReSharper.FSharp/test/data/features/generate/overrides/Repr - Union - No bar - Single 04.fs b/ReSharper.FSharp/test/data/features/generate/overrides/Repr - Union - No bar - Single 04.fs new file mode 100644 index 0000000000..1396d5ce0f --- /dev/null +++ b/ReSharper.FSharp/test/data/features/generate/overrides/Repr - Union - No bar - Single 04.fs @@ -0,0 +1,4 @@ +// ${KIND:Overrides} +// ${SELECT0:ToString():System.String} + +type U = ``A{caret} B`` diff --git a/ReSharper.FSharp/test/data/features/generate/overrides/Repr - Union - No bar - Single 04.fs.gold b/ReSharper.FSharp/test/data/features/generate/overrides/Repr - Union - No bar - Single 04.fs.gold new file mode 100644 index 0000000000..62578b09b4 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/generate/overrides/Repr - Union - No bar - Single 04.fs.gold @@ -0,0 +1,13 @@ +Provided elements: + 0: ToString():System.String + 1: Equals(System.Object):System.Boolean + 2: GetHashCode():System.Int32 + 3: Finalize():System.Void + +// ${KIND:Overrides} +// ${SELECT0:ToString():System.String} + +type U = + | ``A B`` + + override this.ToString() = {selstart}failwith "todo"{selend} diff --git a/ReSharper.FSharp/test/src/FSharp.Tests/Generate/FSharpGenerateOverridesTest.fs b/ReSharper.FSharp/test/src/FSharp.Tests/Generate/FSharpGenerateOverridesTest.fs index abc1958a84..6d6927d360 100644 --- a/ReSharper.FSharp/test/src/FSharp.Tests/Generate/FSharpGenerateOverridesTest.fs +++ b/ReSharper.FSharp/test/src/FSharp.Tests/Generate/FSharpGenerateOverridesTest.fs @@ -104,6 +104,8 @@ type FSharpGenerateOverridesTest() = [] member x.``Repr - Union - No bar - Multiple 03``() = x.DoNamedTest() [] member x.``Repr - Union - No bar - Single 01``() = x.DoNamedTest() [] member x.``Repr - Union - No bar - Single 02``() = x.DoNamedTest() + [] member x.``Repr - Union - No bar - Single 03``() = x.DoNamedTest() + [] member x.``Repr - Union - No bar - Single 04``() = x.DoNamedTest() [] member x.``Repr - Union 01``() = x.DoNamedTest() [] member x.``Repr - Union 02``() = x.DoNamedTest()