Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions src/Fable.Transforms/Fable2Babel.fs
Original file line number Diff line number Diff line change
Expand Up @@ -1406,6 +1406,9 @@ module Util =
List.append entGenParams info.GenericParameters
|> List.map (fun g -> g.Name)
|> set
// Keep type parameters already in scope (e.g. from an enclosing generic
// function) so nested members/lambdas don't redeclare and shadow them.
|> Set.union ctx.ScopedTypeParams

let declaredTypeParams =
if isAttached then
Expand Down
14 changes: 14 additions & 0 deletions tests/Js/Main/TypeTests.fs
Original file line number Diff line number Diff line change
Expand Up @@ -679,6 +679,16 @@ type GenericMethodEncodableClass() =
interface IGenericMethodEncodable with
member _.Encode<'json>(helpers: IGenericMethodHelpers<'json>) = helpers.encodeString "x"

type IGenericMethodBox<'T> =
abstract Get: unit -> 'T

// The lambda inside `Get` references the outer generic parameter 'item (via the
// captured `value`); it must not redeclare and shadow it.
let mapGenericMethodBox<'item> (value: 'item) : IGenericMethodBox<'item seq> =
{ new IGenericMethodBox<'item seq> with
member _.Get() : 'item seq = Seq.map (fun (x: 'item) -> value) [ value ]
}

type ConcreteClass1() =
inherit MangledAbstractClass5(2)

Expand Down Expand Up @@ -1760,4 +1770,8 @@ let tests =

let encodable = GenericMethodEncodableClass() :> IGenericMethodEncodable
encodable.Encode(helpers) |> equal "S:x"

testCase "Nested lambda does not shadow an outer generic type parameter" <| fun () ->
let box = mapGenericMethodBox 42
box.Get() |> List.ofSeq |> equal [ 42 ]
]
Loading