From a5976e638b2548ce96b1987926bd6ac6e357aee1 Mon Sep 17 00:00:00 2001 From: nojaf Date: Tue, 20 Jun 2023 14:14:24 +0200 Subject: [PATCH] Add typar to member when parent type contains the same letter. --- src/Compiler/Checking/NicePrint.fs | 15 ++++++++++++++- .../generic-member.fsx | 9 +++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 tests/FSharp.Compiler.ComponentTests/Signatures/TestCasesForGenerationRoundTrip/generic-member.fsx diff --git a/src/Compiler/Checking/NicePrint.fs b/src/Compiler/Checking/NicePrint.fs index db54e06faf6..50a2ca2b44d 100644 --- a/src/Compiler/Checking/NicePrint.fs +++ b/src/Compiler/Checking/NicePrint.fs @@ -1266,8 +1266,21 @@ module PrintTastMemberOrVals = layoutTyconRef denv vref.MemberApparentEntity ^^ SepL.dot ^^ nameL else nameL + + let memberHasSameTyparNameAsParentTypeTypars = + let parentTyparNames = + vref.DeclaringEntity.TyparsNoRange + |> Seq.choose (fun tp -> if tp.typar_id.idText = unassignedTyparName then None else Some tp.typar_id.idText) + |> set + niceMethodTypars + |> Seq.exists (fun tp -> parentTyparNames.Contains tp.typar_id.idText) + let typarOrderMismatch = isTyparOrderMismatch niceMethodTypars argInfos - let nameL = if denv.showTyparBinding || typarOrderMismatch then layoutTyparDecls denv nameL true niceMethodTypars else nameL + let nameL = + if denv.showTyparBinding || typarOrderMismatch || memberHasSameTyparNameAsParentTypeTypars then + layoutTyparDecls denv nameL true niceMethodTypars + else + nameL let nameL = layoutAccessibility denv vref.Accessibility nameL nameL diff --git a/tests/FSharp.Compiler.ComponentTests/Signatures/TestCasesForGenerationRoundTrip/generic-member.fsx b/tests/FSharp.Compiler.ComponentTests/Signatures/TestCasesForGenerationRoundTrip/generic-member.fsx new file mode 100644 index 00000000000..06a8a25c01a --- /dev/null +++ b/tests/FSharp.Compiler.ComponentTests/Signatures/TestCasesForGenerationRoundTrip/generic-member.fsx @@ -0,0 +1,9 @@ +module V + +type 'a Foo = + { + Bar: 'a array + D: int + } + member _.Make1<'b> (array: 'a array) : 'a Foo = failwith "meh" + member _.Make2<'a> (array: 'a array) : 'a Foo = failwith "meh"