Skip to content

Instantly share code, notes, and snippets.

@mavnn
Last active August 29, 2015 14:11
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mavnn/8cf7e29ba446e5372db5 to your computer and use it in GitHub Desktop.
Save mavnn/8cf7e29ba446e5372db5 to your computer and use it in GitHub Desktop.
Trying member ordering...
module Provider
#if INTERACTIVE
#load "paket-files/fsprojects/FSharp.TypeProviders.StarterPack/src/ProvidedTypes.fsi"
#load "paket-files/fsprojects/FSharp.TypeProviders.StarterPack/src/ProvidedTypes.fs"
#endif
open System.Reflection
open ProviderImplementation.ProvidedTypes
open Microsoft.FSharp.Core.CompilerServices
open Microsoft.FSharp.Quotations
[<TypeProvider>]
type AdventProvider (cfg : TypeProviderConfig) as this =
inherit TypeProviderForNamespaces ()
let ns = "Examples.Provided"
let asm = Assembly.GetExecutingAssembly()
let tempAsmPath = System.IO.Path.ChangeExtension(System.IO.Path.GetTempFileName(), ".dll")
let tempAsm = ProvidedAssembly tempAsmPath
let t = ProvidedTypeDefinition(asm, ns, "PType", Some typeof<obj>, IsErased = false)
let parameters = [ProvidedStaticParameter("AString", typeof<string>)]
do
t.DefineStaticParameters(parameters,
fun typeName args ->
let returnType = ProvidedTypeDefinition("ReturnType", Some typeof<obj>, IsErased = false)
let ctor = ProvidedConstructor([])
ctor.InvokeCode <- fun _ -> <@@ () @@>
returnType.AddMember ctor
let nestedType = ProvidedTypeDefinition("NestedType", Some typeof<obj>, IsErased = false)
let field = ProvidedField("_property", returnType)
field.SetFieldAttributes FieldAttributes.Private
nestedType.AddMember field
let prop = ProvidedProperty("Property", returnType)
prop.GetterCode <-
fun args ->
Expr.FieldGet(args.[0], field)
nestedType.AddMember prop
let ctor' = ProvidedConstructor([ProvidedParameter("Return", returnType)])
ctor'.InvokeCode <- fun args -> Expr.FieldSet(args.[0], field, args.[1])
nestedType.AddMember ctor'
nestedType.AddMember returnType
let mainType = ProvidedTypeDefinition(asm, ns, typeName, Some typeof<obj>, IsErased = false)
let typeParameter = args.[0] :?> string
let parameterString = ProvidedProperty("StringParameter", typeof<string>)
parameterString.IsStatic <- true
parameterString.GetterCode <- fun _ -> <@@ typeParameter @@>
mainType.AddMember parameterString
mainType.AddMembers[nestedType]
tempAsm.AddTypes [mainType]
mainType)
do
this.RegisterRuntimeAssemblyLocationAsProbingFolder cfg
tempAsm.AddTypes [t]
this.AddNamespace(ns, [t])
[<assembly:TypeProviderAssembly>]
do ()
#!/usr/bin/env fsharpi
#r "Provider.dll"
open Examples.Provided
type Test = Examples.Provided.PType<"A string here">
let propValue = Test.NestedType.ReturnType()
let thing = Test.NestedType(propValue)
printfn "%A" thing.Property
printfn "%s" Test.StringParameter
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment