Skip to content

Commit 32009e2

Browse files
authored
Merge pull request #189 from dsyme/fix-188
fix 188 - Type replacement should apply to static parameter types
2 parents bebf76a + be4c660 commit 32009e2

File tree

3 files changed

+19
-17
lines changed

3 files changed

+19
-17
lines changed

src/ProvidedTypes.fs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1060,7 +1060,7 @@ namespace ProviderImplementation.ProvidedTypes
10601060
override __.GetCustomAttributes(_attributeType, _inherit) = emptyAttributes
10611061
override this.IsDefined(_attributeType, _inherit) = notRequired this "IsDefined" propertyName
10621062

1063-
and ProvidedEvent(isTgt: bool, eventName:string, attrs: EventAttributes, eventHandlerType:Type, isStatic: bool, adder: (unit -> MethodInfo), remover: (unit -> MethodInfo), customAttributesData) =
1063+
and ProvidedEvent(isTgt: bool, eventName:string, attrs: EventAttributes, eventHandlerType:Type, isStatic: bool, adder: (unit -> MethodInfo), remover: (unit -> MethodInfo), customAttributesData) =
10641064
inherit EventInfo()
10651065

10661066
let mutable declaringType : ProvidedTypeDefinition option = None
@@ -8536,9 +8536,9 @@ namespace ProviderImplementation.ProvidedTypes
85368536
newT
85378537
| _ ->
85388538
let msg =
8539-
if toTgt then sprintf "The design-time type '%O' utilized by a type provider was not found in the target reference assembly set '%A'. You may be referencing a profile which contains fewer types than those needed by the type provider you are using." t (getTargetAssemblies())
8539+
if toTgt then sprintf "The design-time type '%O' utilized by a type provider was not found in the target reference assembly set '%A'. You may be referencing a profile which contains fewer types than those needed by the type provider you are using." t (getTargetAssemblies() |> Seq.toList)
85408540
elif getSourceAssemblies() |> Seq.length = 0 then sprintf "A failure occured while determining compilation references"
8541-
else sprintf "The target type '%O' utilized by a type provider was not found in the design-time assembly set '%A'. Please report this problem to the project site for the type provider." t (getSourceAssemblies() |> Seq.toArray)
8541+
else sprintf "The target type '%O' utilized by a type provider was not found in the design-time assembly set '%A'. Please report this problem to the project site for the type provider." t (getSourceAssemblies() |> Seq.toList)
85428542
failwith msg
85438543

85448544

@@ -8815,7 +8815,7 @@ namespace ProviderImplementation.ProvidedTypes
88158815

88168816
and convStaticParameterDefToTgt (x: ProvidedStaticParameter) =
88178817
Debug.Assert (not x.BelongsToTargetModel, "unexpected target ProvidedStaticParameter")
8818-
ProvidedStaticParameter(x.Name, x.ParameterType, ?parameterDefaultValue=x.ParameterDefaultValue)
8818+
ProvidedStaticParameter(x.Name, convTypeToTgt x.ParameterType, ?parameterDefaultValue=x.ParameterDefaultValue)
88198819

88208820
and convMemberDefToTgt declTyT (x: MemberInfo) =
88218821
let xT : MemberInfo =

src/ProvidedTypesTesting.fs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -720,11 +720,12 @@ module internal Targets =
720720
yield fsharpInstalledAssembliesPath fsharp "portable47"
721721
| "net45" ->
722722
yield sysInstalledAssembliesPath profile ++ "mscorlib.dll"
723+
yield sysInstalledAssembliesPath profile ++ "System.Numerics.dll"
723724
yield sysInstalledAssembliesPath profile ++ "System.Xml.dll"
724725
yield sysInstalledAssembliesPath profile ++ "System.Core.dll"
725726
yield sysInstalledAssembliesPath profile ++ "System.Xml.Linq.dll"
726727
yield sysInstalledAssembliesPath profile ++ "System.dll"
727-
| _ -> failwith (sprintf "unimplemented profile, fsharpVersion = %s, profile = %s" fsharp profile)
728+
| _ -> failwith (sprintf "unimplemented profile, fsharpVersion = %s, profile = %s" fsharp profile)
728729
yield FSharpCoreRef fsharp profile
729730
]
730731
let DotNet45FSharp31Refs() = FSharpRefs "3.1" "net45"

tests/BasicErasedProvisionTests.fs

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ open Xunit
1818
#nowarn "760" // IDisposable needs new
1919

2020
[<TypeProvider>]
21-
type ErasingProvider (config : TypeProviderConfig) as this =
21+
type ErasingProvider (config : TypeProviderConfig, hasBigInt: bool) as this =
2222
inherit TypeProviderForNamespaces (config)
2323

2424
let ns = "StaticProperty.Provided"
@@ -27,12 +27,13 @@ type ErasingProvider (config : TypeProviderConfig) as this =
2727
let createTypes () =
2828
let myType = ProvidedTypeDefinition(asm, ns, "MyType", Some typeof<obj>)
2929
let myStaticGetterProp = ProvidedProperty("MyStaticGetterProperty", typeof<string list>, isStatic = true, getterCode = (fun _args -> <@@ Set.ofList [ "Hello world" ] @@>))
30+
let myStaticGetterProp2 = ProvidedProperty("MyStaticGetterProperty2", (if hasBigInt then typeof<bigint> else typeof<int>), isStatic = true, getterCode = (fun _args -> if hasBigInt then <@@ 34L @@> else <@@ 34 @@>))
3031
let myStaticSetterProp = ProvidedProperty("MyStaticSetterProperty", typeof<string list>, isStatic = true, getterCode = (fun _args -> <@@ Set.ofList [ "Hello world" ] @@>), setterCode = (fun _args -> <@@ () @@>))
3132
let myStaticMethod = ProvidedMethod("MyStaticMethod", [ ProvidedParameter("paramName",typeof<string list>) ], typeof<string list>, isStatic = true, invokeCode = (fun _args -> <@@ Set.ofList [ "Hello world" ] @@>))
3233
let myGetterProp = ProvidedProperty("MyGetterProperty", typeof<string list>, getterCode = (fun _args -> <@@ Set.ofList [ "Hello world" ] @@>))
3334
let mySetterProp = ProvidedProperty("MySetterProperty", typeof<string list>, getterCode = (fun _args -> <@@ Set.ofList [ "Hello world" ] @@>), setterCode = (fun _args -> <@@ () @@>))
3435
let myMethod = ProvidedMethod("MyMethod", [ ProvidedParameter("paramName",typeof<string list>) ], typeof<string list>, invokeCode = (fun _args -> <@@ Set.ofList [ "Hello world" ] @@>))
35-
myType.AddMembers [myStaticGetterProp; myStaticSetterProp; myGetterProp; mySetterProp]
36+
myType.AddMembers [myStaticGetterProp; myStaticGetterProp2; myStaticSetterProp; myGetterProp; mySetterProp]
3637
myType.AddMembers [myStaticMethod; myMethod ]
3738

3839
[myType]
@@ -72,7 +73,7 @@ type ErasingProviderWithStaticParams (config : TypeProviderConfig) as this =
7273
let ns = "StaticProperty.Provided"
7374
let asm = Assembly.GetExecutingAssembly()
7475

75-
let createType (typeName, _n:int) =
76+
let createType (typeName, _n:int, _dayOfWeekInt: int) =
7677
let myType = ProvidedTypeDefinition(asm, ns, typeName, Some typeof<obj>)
7778
let myProp = ProvidedProperty("MyGetterProperty", typeof<string list>, isStatic = true, getterCode = (fun _args -> <@@ Set.ofList [ "Hello world" ] @@>))
7879
myType.AddMember(myProp)
@@ -84,8 +85,8 @@ type ErasingProviderWithStaticParams (config : TypeProviderConfig) as this =
8485

8586
do
8687
let myType = ProvidedTypeDefinition(asm, ns, "MyType", Some typeof<obj>)
87-
let parameters = [ ProvidedStaticParameter("Count", typeof<int>) ]
88-
myType.DefineStaticParameters(parameters, (fun typeName args -> createType(typeName, args.[0] :?> int)))
88+
let parameters = [ ProvidedStaticParameter("Count", typeof<int>); ProvidedStaticParameter("Day", typeof<System.DayOfWeek>) ]
89+
myType.DefineStaticParameters(parameters, (fun typeName args -> createType(typeName, (args.[0] :?> int), (args.[1] :?> int))))
8990

9091
this.AddNamespace(ns, [myType])
9192

@@ -97,15 +98,15 @@ let testCrossTargeting (refs: string list) provider args =
9798

9899
[<Fact>]
99100
let ``ErasingProvider generates for .NET 4.5 F# 3.1 correctly``() : unit =
100-
let res = testCrossTargeting (Targets.DotNet45FSharp31Refs()) (fun args -> new ErasingProvider(args)) [| |]
101+
let res = testCrossTargeting (Targets.DotNet45FSharp31Refs()) (fun args -> new ErasingProvider(args, true)) [| |]
101102
Assert.False(res.Contains "[FSharp.Core, Version=3.259.3.1")
102103
Assert.True(res.Contains "[FSharp.Core, Version=4.3.1.0")
103104
Assert.False(res.Contains "[FSharp.Core, Version=4.4.0.0")
104105

105106
[<Fact>]
106107
let ``ErasingProvider generates for .NET 4.5 F# 4.0 correctly``() : unit =
107108
if (try File.Exists (Targets.FSharpCore40Ref()) with _ -> false) then
108-
let res = testCrossTargeting (Targets.DotNet45FSharp40Refs()) (fun args -> new ErasingProvider(args)) [| |]
109+
let res = testCrossTargeting (Targets.DotNet45FSharp40Refs()) (fun args -> new ErasingProvider(args, true)) [| |]
109110
Assert.False(res.Contains "[FSharp.Core, Version=3.259.3.1")
110111
Assert.False(res.Contains "[FSharp.Core, Version=4.3.1.0")
111112
Assert.True(res.Contains "[FSharp.Core, Version=4.4.0.0")
@@ -115,15 +116,15 @@ let ``ErasingProvider generates for .NET 4.5 F# 4.0 correctly``() : unit =
115116
[<Fact>]
116117
let ``ErasingProvider generates for Portable Profile 259 F# 3.1 correctly``() : unit =
117118
if Targets.hasPortable259Assemblies() then
118-
let res = testCrossTargeting (Targets.Portable259FSharp31Refs()) (fun args -> new ErasingProvider(args)) [| |]
119+
let res = testCrossTargeting (Targets.Portable259FSharp31Refs()) (fun args -> new ErasingProvider(args, false)) [| |]
119120
Assert.True(res.Contains "[FSharp.Core, Version=3.259.3.1")
120121
Assert.False(res.Contains "[FSharp.Core, Version=4.3.1.0")
121122
Assert.False(res.Contains "[FSharp.Core, Version=4.4.4.0")
122123

123124
[<Fact>]
124125
let ``ErasingProvider generates for Portable Profile 259 F# 4.0 correctly``() : unit =
125126
if Targets.hasPortable259Assemblies() then
126-
let res = testCrossTargeting (Targets.Portable259FSharp40Refs()) (fun args -> new ErasingProvider(args)) [| |]
127+
let res = testCrossTargeting (Targets.Portable259FSharp40Refs()) (fun args -> new ErasingProvider(args, false)) [| |]
127128
Assert.True(res.Contains "[FSharp.Core, Version=3.259.4.0")
128129
Assert.False(res.Contains "[FSharp.Core, Version=4.3.1.0")
129130
Assert.False(res.Contains "[FSharp.Core, Version=4.4.4.0")
@@ -132,15 +133,15 @@ let ``ErasingProvider generates for Portable Profile 259 F# 4.0 correctly``() :
132133
[<Fact>]
133134
let ``ErasingProvider generates for Portable Profile 7 F# 4.0 correctly``() : unit =
134135
if Targets.hasPortable7Assemblies() then
135-
let res = testCrossTargeting (Targets.Portable7FSharp40Refs()) (fun args -> new ErasingProvider(args)) [| |]
136+
let res = testCrossTargeting (Targets.Portable7FSharp40Refs()) (fun args -> new ErasingProvider(args, false)) [| |]
136137
Assert.True(res.Contains "[FSharp.Core, Version=3.7.4.0")
137138
Assert.False(res.Contains "[FSharp.Core, Version=4.3.1.0")
138139
Assert.False(res.Contains "[FSharp.Core, Version=4.4.4.0")
139140

140141
[<Fact>]
141142
let ``ErasingProviderWithStaticParams generates for .NET 4.5 F# 4.0 correctly``() : unit =
142143
if (try File.Exists (Targets.FSharpCore40Ref()) with _ -> false) then
143-
let res = testCrossTargeting (Targets.DotNet45FSharp40Refs()) (fun args -> new ErasingProviderWithStaticParams(args)) [| box 3 |]
144+
let res = testCrossTargeting (Targets.DotNet45FSharp40Refs()) (fun args -> new ErasingProviderWithStaticParams(args)) [| box 3; box 4 |]
144145
printfn "res = %s" res
145146
Assert.False(res.Contains "[FSharp.Core, Version=3.259.3.1")
146147
Assert.False(res.Contains "[FSharp.Core, Version=4.3.1.0")
@@ -151,7 +152,7 @@ let ``ErasingProviderWithStaticParams generates for .NET 4.5 F# 4.0 correctly``(
151152
[<Fact>]
152153
let ``ErasingProviderWithStaticParams generates for Portable Profile 7 F# 4.0 correctly``() : unit =
153154
if Targets.hasPortable7Assemblies() then
154-
let res = testCrossTargeting (Targets.Portable7FSharp40Refs()) (fun args -> new ErasingProviderWithStaticParams(args)) [| box 3 |]
155+
let res = testCrossTargeting (Targets.Portable7FSharp40Refs()) (fun args -> new ErasingProviderWithStaticParams(args)) [| box 3; box 4 |]
155156
printfn "res = %s" res
156157
Assert.True(res.Contains "[FSharp.Core, Version=3.7.4.0")
157158
Assert.False(res.Contains "[FSharp.Core, Version=4.3.1.0")

0 commit comments

Comments
 (0)