Skip to content

Commit dca9742

Browse files
Fix issues in generic resolution
1 parent 2e3363f commit dca9742

File tree

3 files changed

+32
-20
lines changed

3 files changed

+32
-20
lines changed

RELEASE_NOTES_COMPILER.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
### 0.7.16
2+
3+
* Fix issues in generic resolution
4+
15
### 0.7.15
26

37
* Issue warning when calling `typeof` on a generic parameter

src/fable/Fable.Compiler/FSharp2Fable.Util.fs

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1001,13 +1001,17 @@ module Util =
10011001
let genParam = t.GenericParameter
10021002
ctx.typeArgs |> List.tryFind (fun (name,_) -> name = genParam.Name)
10031003
|> function Some (_,t) -> t | None -> t
1004-
let genArgs =
1005-
if meth.IsModuleValueOrMember then
1006-
([], meth.EnclosingEntity.GenericParameters, typArgs)
1007-
|||> Seq.fold2 (fun acc genPar (ResolveGeneric ctx t) -> acc@[genPar.Name, t])
1008-
else []
1009-
(genArgs, meth.GenericParameters, methTypArgs)
1010-
|||> Seq.fold2 (fun acc genPar (ResolveGeneric ctx t) -> acc@[genPar.Name, t])
1004+
// Seems that, contrary to what I believed, `meth.GenericParameters`
1005+
// contains both the type and meth generic arguments, so this first
1006+
// folding is not necessary
1007+
// let genArgs =
1008+
// if meth.IsModuleValueOrMember then
1009+
// ([], meth.EnclosingEntity.GenericParameters, typArgs)
1010+
// |||> Seq.fold2 (fun acc genPar (ResolveGeneric ctx t) -> acc@[genPar.Name, t])
1011+
// else []
1012+
([], meth.GenericParameters, typArgs@methTypArgs)
1013+
|||> Seq.fold2 (fun acc genPar (ResolveGeneric ctx t) -> (genPar.Name, t)::acc)
1014+
|> List.rev
10111015

10121016
let (|Replaced|_|) (com: IFableCompiler) i (meth: FSharpMemberOrFunctionOrValue) =
10131017
tryReplace com (Some meth.EnclosingEntity) i

src/fable/Fable.Compiler/Replacements.fs

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,19 @@ module Util =
7272
if i=0 then (makeDelegate com (Some info.lambdaArgArity) x) else x) args
7373
else args
7474

75+
let resolveTypeRef com (info: Fable.ApplyInfo) generic t =
76+
let genInfo =
77+
{ makeGeneric = generic
78+
; genericAvailability = info.genericAvailability }
79+
match t with
80+
| Fable.GenericParam _ when not info.genericAvailability ->
81+
"`typeof` is being called on a generic parameter, "
82+
+ "consider inlining the method (for `internal` members) "
83+
+ "or using `PassGenericsAttribute`."
84+
|> addWarning com info
85+
makeTypeRef genInfo t
86+
| t -> makeTypeRef genInfo t
87+
7588
let instanceArgs (callee: Fable.Expr option) (args: Fable.Expr list) =
7689
match callee with
7790
| Some callee -> (callee, args)
@@ -569,18 +582,9 @@ module private AstPass =
569582
Fable.Throw (newError None Fable.Any args, typ, r) |> Some
570583
// Type ref
571584
| "typeOf" | "typeDefOf" ->
572-
let genInfo =
573-
{ makeGeneric = info.methodName = "typeOf"
574-
; genericAvailability = info.genericAvailability }
575-
match info.methodTypeArgs with
576-
| [Fable.GenericParam _ as t] when not info.genericAvailability ->
577-
"`typeof` is being called on a generic parameter, "
578-
+ "consider inlining the method (for `internal` members) "
579-
+ "or using `PassGenericsAttribute`."
580-
|> addWarning com info
581-
makeTypeRef genInfo t |> Some
582-
| [t] -> makeTypeRef genInfo t |> Some
583-
| _ -> None
585+
info.methodTypeArgs.Head
586+
|> resolveTypeRef com info (info.methodName = "typeOf")
587+
|> Some
584588
// Concatenates two lists
585589
| "op_Append" ->
586590
CoreLibCall("List", Some "append", false, args)
@@ -796,7 +800,7 @@ module private AstPass =
796800
| "typeTestGeneric", (None, [expr]) ->
797801
makeTypeTest i.range i.methodTypeArgs.Head expr |> Some
798802
| "createInstance", (None, _) ->
799-
let typRef, args = makeNonGenTypeRef i.methodTypeArgs.Head, []
803+
let typRef, args = resolveTypeRef com i false i.methodTypeArgs.Head, []
800804
Fable.Apply (typRef, args, Fable.ApplyCons, i.returnType, i.range) |> Some
801805
| _ -> None
802806

0 commit comments

Comments
 (0)