Guest User

Untitled

a guest
May 20th, 2018
124
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.62 KB | None | 0 0
  1. open System
  2. open System.IO
  3. open System.Reflection
  4.  
  5. let rec extractDll opts =
  6. match opts with
  7. | "-d"::s::t -> Some s
  8. | h::t -> extractDll t
  9. | [] -> None
  10.  
  11. let dllName =
  12. match extractDll (System.Environment.GetCommandLineArgs() |> List.ofSeq) with
  13. | Some s -> s
  14. | None -> System.Console.WriteLine "must provide -d dllFileName option"; exit 0
  15.  
  16. let resolve _ (y: ResolveEventArgs) : Assembly =
  17. try
  18. Assembly.ReflectionOnlyLoad(y.Name) |> ignore
  19. with
  20. | :? System.IO.FileNotFoundException as xy -> printfn "got exception %A" xy
  21. null
  22.  
  23. let domain = AppDomain.CurrentDomain
  24.  
  25. domain.add_ReflectionOnlyAssemblyResolve (ResolveEventHandler resolve)
  26.  
  27. let r = Assembly.ReflectionOnlyLoadFrom dllName
  28.  
  29. let types = r.GetExportedTypes ()
  30.  
  31. let parametersToArgStrings (ps: ParameterInfo seq) =
  32. let fn (p: ParameterInfo) =
  33. match p.ParameterType.IsGenericParameter with
  34. | true -> p.Name + ": " + "'" + p.ParameterType.ToString()
  35. | false -> p.Name + ": " + p.ParameterType.ToString()
  36. let vals = ps |> Seq.map fn |> Seq.map (fun f -> "(" + f + ")")
  37. String.Join(" ", vals)
  38.  
  39. let parametersToGenerics (ps: ParameterInfo seq) =
  40. let fn (p: ParameterInfo) =
  41. match p.ParameterType.IsGenericParameter with
  42. | true -> Some ("'" + p.Name)
  43. | false -> None
  44. let vals = ps |> Seq.choose fn
  45. let result = String.Join(", ", vals)
  46. if String.length result > 0
  47. then "<" + result + ">"
  48. else ""
  49.  
  50. let parametersToCallStrings (ps: ParameterInfo seq) =
  51. String.Join(", ", ps |> Seq.map (fun p -> p.Name))
  52.  
  53. let printParameters (ps: ParameterInfo seq) t m =
  54. ps |> Seq.iter (fun p -> printfn "type: %A; method: %A; paramter: %A" t m p)
  55.  
  56. let printMethod t (m: MethodInfo) =
  57. let ps = (m.GetParameters())
  58. let argsParametersString = parametersToArgStrings ps
  59. let callParametersString = parametersToCallStrings ps
  60. let genericsString = parametersToGenerics ps
  61. match m.IsStatic with
  62. | false -> printfn " let %sFn%s (obj: %A) %s = obj.%s(%s)" m.Name genericsString t argsParametersString m.Name callParametersString
  63. | true -> ()
  64.  
  65. let printMemberInfo t (m: MemberInfo) =
  66. match m with
  67. | :? System.Reflection.MethodInfo as mi -> printMethod t mi
  68. | _ -> printfn "// doing nothing with %A" m
  69.  
  70. let printMemberInfos (ms: MemberInfo seq) t =
  71. ms |> Seq.iter (printMemberInfo t)
  72.  
  73. let printTypes (ts: Type seq) =
  74. let toModuleName (t: Type) =
  75. t.FullName.Replace(".", "_").Replace("`","_").Replace('+', '_')
  76. ts |> Seq.iter (fun t -> printfn ""; printfn "module %sFn = " (toModuleName t); printMemberInfos (t.GetMembers()) t)
  77. printfn " let HackHackHackMakeSureTheresAtLeastOneFunctionHere() = ()"
  78.  
  79. printfn "namespace com.restphone"
  80.  
  81. printTypes types
Add Comment
Please, Sign In to add comment