From 4d30755029ddfe79a367b9cbfc660995ddf33478 Mon Sep 17 00:00:00 2001 From: Don Syme Date: Tue, 1 Dec 2015 16:55:31 +0000 Subject: [PATCH 01/23] Fix expressions for type providers --- FSharp.Compiler.Service.sln | 24 +- src/fsharp/vs/Exprs.fs | 79 +- tests/service/ExprTests.fs | 22 + tests/service/TestProject/AssemblyInfo.fs | 41 + tests/service/TestProject/Library.fs | 6 + tests/service/TestProject/TestProject.fsproj | 80 + tests/service/TestTP/App.config | 6 + tests/service/TestTP/Library.fs | 82 + tests/service/TestTP/ProvidedTypes.fs | 2736 ++++++++++++++++++ tests/service/TestTP/ProvidedTypes.fsi | 467 +++ tests/service/TestTP/TestTP.fsproj | 79 + tests/service/TestTP/packages.config | 4 + 12 files changed, 3618 insertions(+), 8 deletions(-) create mode 100644 tests/service/TestProject/AssemblyInfo.fs create mode 100644 tests/service/TestProject/Library.fs create mode 100644 tests/service/TestProject/TestProject.fsproj create mode 100644 tests/service/TestTP/App.config create mode 100644 tests/service/TestTP/Library.fs create mode 100644 tests/service/TestTP/ProvidedTypes.fs create mode 100644 tests/service/TestTP/ProvidedTypes.fsi create mode 100644 tests/service/TestTP/TestTP.fsproj create mode 100644 tests/service/TestTP/packages.config diff --git a/FSharp.Compiler.Service.sln b/FSharp.Compiler.Service.sln index d00e651dc0..99549e8cca 100644 --- a/FSharp.Compiler.Service.sln +++ b/FSharp.Compiler.Service.sln @@ -1,6 +1,6 @@ Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 2013 -VisualStudioVersion = 12.0.31101.0 +# Visual Studio 14 +VisualStudioVersion = 14.0.23107.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "project", "project", "{B6B68AE6-E7A4-4D43-9B34-FFA74BFE192B}" ProjectSection(SolutionItems) = preProject @@ -57,6 +57,8 @@ Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "Fsc", "samples\FscExe\Fsc.f EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CSharp_Analysis", "tests\service\data\CSharp_Analysis\CSharp_Analysis.csproj", "{887630A3-4B1D-40EA-B8B3-2D842E9C40DB}" EndProject +Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "TestTP", "tests\service\TestTP\TestTP.fsproj", "{FF76BD3C-5E0A-4752-B6C3-044F6E15719B}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -190,6 +192,24 @@ Global {887630A3-4B1D-40EA-B8B3-2D842E9C40DB}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU {887630A3-4B1D-40EA-B8B3-2D842E9C40DB}.Release|Mixed Platforms.Build.0 = Release|Any CPU {887630A3-4B1D-40EA-B8B3-2D842E9C40DB}.Release|x86.ActiveCfg = Release|Any CPU + {FF76BD3C-5E0A-4752-B6C3-044F6E15719B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FF76BD3C-5E0A-4752-B6C3-044F6E15719B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FF76BD3C-5E0A-4752-B6C3-044F6E15719B}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {FF76BD3C-5E0A-4752-B6C3-044F6E15719B}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {FF76BD3C-5E0A-4752-B6C3-044F6E15719B}.Debug|x86.ActiveCfg = Debug|Any CPU + {FF76BD3C-5E0A-4752-B6C3-044F6E15719B}.Debug|x86.Build.0 = Debug|Any CPU + {FF76BD3C-5E0A-4752-B6C3-044F6E15719B}.Proto|Any CPU.ActiveCfg = Release|Any CPU + {FF76BD3C-5E0A-4752-B6C3-044F6E15719B}.Proto|Any CPU.Build.0 = Release|Any CPU + {FF76BD3C-5E0A-4752-B6C3-044F6E15719B}.Proto|Mixed Platforms.ActiveCfg = Release|Any CPU + {FF76BD3C-5E0A-4752-B6C3-044F6E15719B}.Proto|Mixed Platforms.Build.0 = Release|Any CPU + {FF76BD3C-5E0A-4752-B6C3-044F6E15719B}.Proto|x86.ActiveCfg = Release|Any CPU + {FF76BD3C-5E0A-4752-B6C3-044F6E15719B}.Proto|x86.Build.0 = Release|Any CPU + {FF76BD3C-5E0A-4752-B6C3-044F6E15719B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FF76BD3C-5E0A-4752-B6C3-044F6E15719B}.Release|Any CPU.Build.0 = Release|Any CPU + {FF76BD3C-5E0A-4752-B6C3-044F6E15719B}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {FF76BD3C-5E0A-4752-B6C3-044F6E15719B}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {FF76BD3C-5E0A-4752-B6C3-044F6E15719B}.Release|x86.ActiveCfg = Release|Any CPU + {FF76BD3C-5E0A-4752-B6C3-044F6E15719B}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/src/fsharp/vs/Exprs.fs b/src/fsharp/vs/Exprs.fs index 212f564694..a6e0c8ede4 100644 --- a/src/fsharp/vs/Exprs.fs +++ b/src/fsharp/vs/Exprs.fs @@ -16,8 +16,80 @@ open Microsoft.FSharp.Compiler.TypeRelations open Internal.Utilities +[] +module ExprUtilsImpl = + + // ILCall nodes arise from calls to .NET methods, and provided calls to + // F# methods. This method attempts to take the information in a ILMethodRef + // and bind it to a symbol. This is not fool proof when the ILCall refers to + // an F# method, but is a good approximation. + let bindILMethodRefToSymbol (cenv:Impl.cenv) m (ilMethRef: ILMethodRef) = + let tcref = Import.ImportILTypeRef cenv.amap m ilMethRef.EnclosingTypeRef + let enclosingType = generalizedTyconRef tcref + // First try to resolve it to IL metadata + let try1 = + if tcref.IsILTycon then + try + let mdef = resolveILMethodRefWithRescope (rescopeILType (p13 tcref.ILTyconInfo)) tcref.ILTyconRawMetadata ilMethRef + let minfo = MethInfo.CreateILMeth(cenv.amap, m, enclosingType, mdef) + Some (FSharpMemberOrFunctionOrValue(cenv, minfo)) + with _ -> None + else None + + // Otherwise try to bind it to an F# symbol + match try1 with + | Some res -> res + | None -> + try + // Try to bind the call to an F# method call + let memberParentName = if tcref.IsModuleOrNamespace then None else Some tcref.LogicalName + // TODO: this logical name is not correct in the presence of CompiledName + let logicalName = ilMethRef.Name + let isMember = memberParentName.IsSome + if isMember then + let isCtor = (ilMethRef.Name = ".ctor") + let isStatic = isCtor || ilMethRef.CallingConv.IsStatic + let scoref = ilMethRef.EnclosingTypeRef.Scope + let typars1 = tcref.Typars(m) + let typars2 = [ 1 .. ilMethRef.GenericArity ] |> List.map (fun _ -> NewRigidTypar "T" m) + let tinst1 = typars1 |> generalizeTypars + let tinst2 = typars2 |> generalizeTypars + // TODO: this will not work for curried methods in F# classes. + // This is difficult to solve as the information in the ILMethodRef + // is not sufficient to resolve to a symbol unambiguously in these cases. + let argtys = [ ilMethRef.ArgTypes |> List.map (ImportTypeFromMetadata cenv.amap m scoref tinst1 tinst2) ] + let rty = + match ImportReturnTypeFromMetaData cenv.amap m ilMethRef.ReturnType scoref tinst1 tinst2 with + | None -> if isCtor then enclosingType else cenv.g.unit_ty + | Some ty -> ty + + let linkageType = + let ty = mkIteratedFunTy (List.map (mkTupledTy cenv.g) argtys) rty + let ty = if isStatic then ty else mkFunTy enclosingType ty + tryMkForallTy (typars1 @ typars2) ty + + let argCount = List.sum (List.map List.length argtys) + (if isStatic then 0 else 1) + let key = ValLinkageFullKey({ MemberParentMangledName=memberParentName; MemberIsOverride=false; LogicalName=logicalName; TotalArgCount= argCount },Some linkageType) + + let enclosingNonLocalRef = mkNonLocalEntityRef tcref.nlr.Ccu tcref.PublicPath.Value.EnclosingPath + let vref = mkNonLocalValRef enclosingNonLocalRef key + vref.Deref |> ignore // check we can dereference the value + let minfo = MethInfo.FSMeth(cenv.g, enclosingType, vref, None) + FSharpMemberOrFunctionOrValue(cenv, minfo) + else + let key = ValLinkageFullKey({ MemberParentMangledName=memberParentName; MemberIsOverride=false; LogicalName=logicalName; TotalArgCount= 0 },None) + let vref = mkNonLocalValRef tcref.nlr key + vref.Deref |> ignore // check we can dereference the value + FSharpMemberOrFunctionOrValue(cenv, vref) + + with _ -> + failwith (sprintf "A call to '%s' could not be resolved" (ilMethRef.ToString())) + + + [] module ExprTranslationImpl = + type ExprTranslationEnv = { //Map from Val to binding index vs: ValMap; @@ -612,12 +684,7 @@ module FSharpExprConvert = | _ -> failwith "unexpected for-loop form" | TOp.ILCall(_,_,_,isNewObj,_valUseFlags,_isProp,_,ilMethRef,enclTypeArgs,methTypeArgs,_tys),[],callArgs -> - let tcref = Import.ImportILTypeRef cenv.amap m ilMethRef.EnclosingTypeRef - let mdef = - try resolveILMethodRefWithRescope (rescopeILType (p13 tcref.ILTyconInfo)) tcref.ILTyconRawMetadata ilMethRef - with _ -> failwith (sprintf "A call to '%s' could not be resolved" (ilMethRef.ToString())) - let minfo = MethInfo.CreateILMeth(cenv.amap, m, generalizedTyconRef tcref, mdef) - let v = FSharpMemberFunctionOrValue(cenv, minfo) + let v = bindILMethodRefToSymbol cenv m ilMethRef ConvObjectModelCallLinear cenv env (isNewObj, v, enclTypeArgs, methTypeArgs, callArgs) (fun e -> e) | TOp.TryFinally _,[_resty],[Expr.Lambda(_,_,_,[_],e1,_,_); Expr.Lambda(_,_,_,[_],e2,_,_)] -> diff --git a/tests/service/ExprTests.fs b/tests/service/ExprTests.fs index bd22ec68c1..3a7446be2f 100644 --- a/tests/service/ExprTests.fs +++ b/tests/service/ExprTests.fs @@ -673,6 +673,28 @@ let ``Test expressions of declarations stress big expressions`` () = printDeclarations None (List.ofSeq file1.Declarations) |> Seq.toList |> ignore + +[] +let ``Check use of type provider that provides calls to F# code`` () = + let res = + checker.GetProjectOptionsFromProjectFile (Path.Combine(__SOURCE_DIRECTORY__, @"TestProject\TestProject.fsproj")) + |> checker.ParseAndCheckProject + |> Async.RunSynchronously + + res.Errors.Length |> shouldEqual 0 + + let results = + [ for f in res.AssemblyContents.ImplementationFiles do + for d in f.Declarations do + for line in d |> printDeclaration None do + yield line ] + results |> shouldEqual + ["type TestProject"; "type AssemblyInfo"; "type TestProject"; "type T"; + "type Class1"; + "member .ctor(unitVar0) = (Object..ctor (); ()) @ (5,5--5,11)"; + """member get_X(this) (unitVar1) = let this: Microsoft.FSharp.Core.obj = ("My internal state" :> Microsoft.FSharp.Core.obj) :> ErasedWithConstructor.Provided.MyType in Helper.doNothing () @ (6,20--6,35)""" ] + + #if SELF_HOST_STRESS [] diff --git a/tests/service/TestProject/AssemblyInfo.fs b/tests/service/TestProject/AssemblyInfo.fs new file mode 100644 index 0000000000..5c62ae5770 --- /dev/null +++ b/tests/service/TestProject/AssemblyInfo.fs @@ -0,0 +1,41 @@ +namespace TestProject.AssemblyInfo + +open System.Reflection +open System.Runtime.CompilerServices +open System.Runtime.InteropServices + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[] +[] +[] +[] +[] +[] +[] +[] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [] +[] +[] + +do + () \ No newline at end of file diff --git a/tests/service/TestProject/Library.fs b/tests/service/TestProject/Library.fs new file mode 100644 index 0000000000..6cc4f4879a --- /dev/null +++ b/tests/service/TestProject/Library.fs @@ -0,0 +1,6 @@ +namespace TestProject + +type T = ErasedWithConstructor.Provided.MyType + +type Class1() = + member this.X = T().DoNothing() diff --git a/tests/service/TestProject/TestProject.fsproj b/tests/service/TestProject/TestProject.fsproj new file mode 100644 index 0000000000..497eb2b1bd --- /dev/null +++ b/tests/service/TestProject/TestProject.fsproj @@ -0,0 +1,80 @@ + + + + + Debug + AnyCPU + 2.0 + ed64425e-b549-439a-b105-6c921a81f31a + Library + TestProject + TestProject + v4.5.2 + 4.4.0.0 + true + TestProject + + + true + full + false + false + bin\Debug\ + DEBUG;TRACE + 3 + bin\Debug\TestProject.XML + + + pdbonly + true + true + bin\Release\ + TRACE + 3 + bin\Release\TestProject.XML + + + + + True + + + + + + + + + + + + + TestTP + {ff76bd3c-5e0a-4752-b6c3-044f6e15719b} + True + + + + 11 + + + + + $(MSBuildExtensionsPath32)\..\Microsoft SDKs\F#\3.0\Framework\v4.0\Microsoft.FSharp.Targets + + + + + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\FSharp\Microsoft.FSharp.Targets + + + + + + \ No newline at end of file diff --git a/tests/service/TestTP/App.config b/tests/service/TestTP/App.config new file mode 100644 index 0000000000..88fa4027bd --- /dev/null +++ b/tests/service/TestTP/App.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/tests/service/TestTP/Library.fs b/tests/service/TestTP/Library.fs new file mode 100644 index 0000000000..39f223375c --- /dev/null +++ b/tests/service/TestTP/Library.fs @@ -0,0 +1,82 @@ +namespace TestTP + +open ProviderImplementation.ProvidedTypes +open Microsoft.FSharp.Core.CompilerServices +open System.Reflection + +module Helper = + let doNothing() = () + let doNothingOneArg(x:int) = () + let doNothingGeneric(x:'T) = () + type C() = + static member DoNothing() = () + static member DoNothingOneArg(x:int) = () + static member DoNothingTwoArg(c:C, x:int) = () + static member DoNothingGeneric(x:'T) = () + member __.InstanceDoNothing() = () + member __.InstanceDoNothingOneArg(x:int) = () + member __.InstanceDoNothingTwoArg(c:C, x:int) = () + member __.InstanceDoNothingGeneric(x:'T) = () + + type G<'U>() = + static member DoNothing() = () + static member DoNothingOneArg(x:int) = () + static member DoNothingTwoArg(c:C, x:int) = () + static member DoNothingGeneric(x:'T) = () + member __.InstanceDoNothing() = () + member __.InstanceDoNothingOneArg(x:int) = () + member __.InstanceDoNothingTwoArg(c:C, x:int) = () + member __.InstanceDoNothingGeneric(x:'U) = () + +[] +type BasicProvider (config : TypeProviderConfig) as this = + inherit TypeProviderForNamespaces () + + let ns = "ErasedWithConstructor.Provided" + let asm = Assembly.GetExecutingAssembly() + + let createTypes () = + let myType = ProvidedTypeDefinition(asm, ns, "MyType", Some typeof) + + let ctor = ProvidedConstructor([], InvokeCode = fun args -> <@@ "My internal state" :> obj @@>) + myType.AddMember(ctor) + + let ctor2 = ProvidedConstructor( + [ProvidedParameter("InnerState", typeof)], + InvokeCode = fun args -> <@@ (%%(args.[0]):string) :> obj @@>) + myType.AddMember(ctor2) + + let innerState = ProvidedProperty("InnerState", typeof, + GetterCode = fun args -> <@@ (%%(args.[0]) :> obj) :?> string @@>) + myType.AddMember(innerState) + + let someMethod = ProvidedMethod("DoNothing", [], typeof, + InvokeCode = fun args -> <@@ Helper.doNothing(); + Helper.doNothingOneArg(3) + Helper.doNothingGeneric(3) + Helper.C.DoNothing() + Helper.C.DoNothingGeneric(3) + Helper.C.DoNothingOneArg(3) + Helper.C.DoNothingTwoArg(Helper.C(), 3) + Helper.C().InstanceDoNothing() + Helper.C().InstanceDoNothingGeneric(3) + Helper.C().InstanceDoNothingOneArg(3) + Helper.C().InstanceDoNothingTwoArg(Helper.C(), 3) + Helper.G.DoNothing() + Helper.G.DoNothingGeneric(3) + Helper.G.DoNothingOneArg(3) + Helper.G.DoNothingTwoArg(Helper.C(), 3) + Helper.G().InstanceDoNothing() + Helper.G().InstanceDoNothingGeneric(3) + Helper.G().InstanceDoNothingOneArg(3) + Helper.G().InstanceDoNothingTwoArg(Helper.C(), 3) @@>) + + myType.AddMember(someMethod) + + [myType] + + do + this.AddNamespace(ns, createTypes()) + +[] +do () \ No newline at end of file diff --git a/tests/service/TestTP/ProvidedTypes.fs b/tests/service/TestTP/ProvidedTypes.fs new file mode 100644 index 0000000000..51cdb0bddd --- /dev/null +++ b/tests/service/TestTP/ProvidedTypes.fs @@ -0,0 +1,2736 @@ +#nowarn "40" +#nowarn "52" +// Based on code for the F# 3.0 Developer Preview release of September 2011, +// Copyright (c) Microsoft Corporation 2005-2012. +// This sample code is provided "as is" without warranty of any kind. +// We disclaim all warranties, either express or implied, including the +// warranties of merchantability and fitness for a particular purpose. + +// This file contains a set of helper types and methods for providing types in an implementation +// of ITypeProvider. + +// This code has been modified and is appropriate for use in conjunction with the F# 3.0, F# 3.1, and F# 3.1.1 releases + +namespace ProviderImplementation.ProvidedTypes + +open System +open System.Text +open System.IO +open System.Reflection +open System.Reflection.Emit +open System.Linq.Expressions +open System.Collections.Generic +open Microsoft.FSharp.Core.CompilerServices + +type E = Quotations.Expr +module P = Quotations.Patterns +module ES = Quotations.ExprShape +module DP = Quotations.DerivedPatterns + +type internal ExpectedStackState = + | Empty = 1 + | Address = 2 + | Value = 3 + +[] +module internal Misc = + + let TypeBuilderInstantiationType = + let runningOnMono = try System.Type.GetType("Mono.Runtime") <> null with e -> false + let typeName = if runningOnMono then "System.Reflection.MonoGenericClass" else "System.Reflection.Emit.TypeBuilderInstantiation" + typeof.Assembly.GetType(typeName) + + let GetTypeFromHandleMethod = typeof.GetMethod("GetTypeFromHandle") + let LanguagePrimitivesType = typedefof>.Assembly.GetType("Microsoft.FSharp.Core.LanguagePrimitives") + let ParseInt32Method = LanguagePrimitivesType.GetMethod "ParseInt32" + let DecimalConstructor = typeof.GetConstructor([| typeof; typeof; typeof; typeof; typeof |]) + let DateTimeConstructor = typeof.GetConstructor([| typeof; typeof |]) + let DateTimeOffsetConstructor = typeof.GetConstructor([| typeof; typeof |]) + let TimeSpanConstructor = typeof.GetConstructor([|typeof|]) + let isEmpty s = s = ExpectedStackState.Empty + let isAddress s = s = ExpectedStackState.Address + + let nonNull str x = if x=null then failwith ("Null in " + str) else x + + let notRequired opname item = + let msg = sprintf "The operation '%s' on item '%s' should not be called on provided type, member or parameter" opname item + System.Diagnostics.Debug.Assert (false, msg) + raise (System.NotSupportedException msg) + + let mkParamArrayCustomAttributeData() = +#if FX_NO_CUSTOMATTRIBUTEDATA + { new IProvidedCustomAttributeData with +#else + { new CustomAttributeData() with +#endif + member __.Constructor = typeof.GetConstructors().[0] + member __.ConstructorArguments = upcast [| |] + member __.NamedArguments = upcast [| |] } + +#if FX_NO_CUSTOMATTRIBUTEDATA + let CustomAttributeTypedArgument(ty,v) = + { new IProvidedCustomAttributeTypedArgument with + member x.ArgumentType = ty + member x.Value = v } + let CustomAttributeNamedArgument(memb,arg:IProvidedCustomAttributeTypedArgument) = + { new IProvidedCustomAttributeNamedArgument with + member x.MemberInfo = memb + member x.ArgumentType = arg.ArgumentType + member x.TypedValue = arg } + type CustomAttributeData = Microsoft.FSharp.Core.CompilerServices.IProvidedCustomAttributeData +#endif + + let mkEditorHideMethodsCustomAttributeData() = +#if FX_NO_CUSTOMATTRIBUTEDATA + { new IProvidedCustomAttributeData with +#else + { new CustomAttributeData() with +#endif + member __.Constructor = typeof.GetConstructors().[0] + member __.ConstructorArguments = upcast [| |] + member __.NamedArguments = upcast [| |] } + + let mkAllowNullLiteralCustomAttributeData value = +#if FX_NO_CUSTOMATTRIBUTEDATA + { new IProvidedCustomAttributeData with +#else + { new CustomAttributeData() with +#endif + member __.Constructor = typeof.GetConstructors().[0] + member __.ConstructorArguments = upcast [| CustomAttributeTypedArgument(typeof, value) |] + member __.NamedArguments = upcast [| |] } + + /// This makes an xml doc attribute w.r.t. an amortized computation of an xml doc string. + /// It is important that the text of the xml doc only get forced when poking on the ConstructorArguments + /// for the CustomAttributeData object. + let mkXmlDocCustomAttributeDataLazy(lazyText: Lazy) = +#if FX_NO_CUSTOMATTRIBUTEDATA + { new IProvidedCustomAttributeData with +#else + { new CustomAttributeData() with +#endif + member __.Constructor = typeof.GetConstructors().[0] + member __.ConstructorArguments = upcast [| CustomAttributeTypedArgument(typeof, lazyText.Force()) |] + member __.NamedArguments = upcast [| |] } + + let mkXmlDocCustomAttributeData(s:string) = mkXmlDocCustomAttributeDataLazy (lazy s) + + let mkDefinitionLocationAttributeCustomAttributeData(line:int,column:int,filePath:string) = +#if FX_NO_CUSTOMATTRIBUTEDATA + { new IProvidedCustomAttributeData with +#else + { new CustomAttributeData() with +#endif + member __.Constructor = typeof.GetConstructors().[0] + member __.ConstructorArguments = upcast [| |] + member __.NamedArguments = + upcast [| CustomAttributeNamedArgument(typeof.GetProperty("FilePath"), CustomAttributeTypedArgument(typeof, filePath)); + CustomAttributeNamedArgument(typeof.GetProperty("Line"), CustomAttributeTypedArgument(typeof, line)) ; + CustomAttributeNamedArgument(typeof.GetProperty("Column"), CustomAttributeTypedArgument(typeof, column)) + |] } + let mkObsoleteAttributeCustomAttributeData(message:string, isError: bool) = +#if FX_NO_CUSTOMATTRIBUTEDATA + { new IProvidedCustomAttributeData with +#else + { new CustomAttributeData() with +#endif + member __.Constructor = typeof.GetConstructors() |> Array.find (fun x -> x.GetParameters().Length = 1) + member __.ConstructorArguments = upcast [|CustomAttributeTypedArgument(typeof, message) ; CustomAttributeTypedArgument(typeof, isError) |] + member __.NamedArguments = upcast [| |] } + + type CustomAttributesImpl() = + let customAttributes = ResizeArray() + let mutable hideObjectMethods = false + let mutable nonNullable = false + let mutable obsoleteMessage = None + let mutable xmlDocDelayed = None + let mutable xmlDocAlwaysRecomputed = None + let mutable hasParamArray = false + + // XML doc text that we only compute once, if any. This must _not_ be forced until the ConstructorArguments + // property of the custom attribute is foced. + let xmlDocDelayedText = + lazy + (match xmlDocDelayed with None -> assert false; "" | Some f -> f()) + + // Custom atttributes that we only compute once + let customAttributesOnce = + lazy + [| if hideObjectMethods then yield mkEditorHideMethodsCustomAttributeData() + if nonNullable then yield mkAllowNullLiteralCustomAttributeData false + match xmlDocDelayed with None -> () | Some _ -> customAttributes.Add(mkXmlDocCustomAttributeDataLazy xmlDocDelayedText) + match obsoleteMessage with None -> () | Some s -> customAttributes.Add(mkObsoleteAttributeCustomAttributeData s) + if hasParamArray then yield mkParamArrayCustomAttributeData() + yield! customAttributes |] + + member __.AddDefinitionLocation(line:int,column:int,filePath:string) = customAttributes.Add(mkDefinitionLocationAttributeCustomAttributeData(line, column, filePath)) + member __.AddObsolete(message : string, isError) = obsoleteMessage <- Some (message,isError) + member __.HasParamArray with get() = hasParamArray and set(v) = hasParamArray <- v + member __.AddXmlDocComputed xmlDocFunction = xmlDocAlwaysRecomputed <- Some xmlDocFunction + member __.AddXmlDocDelayed xmlDocFunction = xmlDocDelayed <- Some xmlDocFunction + member __.AddXmlDoc xmlDoc = xmlDocDelayed <- Some (fun () -> xmlDoc) + member __.HideObjectMethods with set v = hideObjectMethods <- v + member __.NonNullable with set v = nonNullable <- v + member __.AddCustomAttribute(attribute) = customAttributes.Add(attribute) + member __.GetCustomAttributesData() = + [| yield! customAttributesOnce.Force() + match xmlDocAlwaysRecomputed with None -> () | Some f -> customAttributes.Add(mkXmlDocCustomAttributeData (f())) |] + :> IList<_> + + let transExpr isGenerated q = + let rec trans q = + match q with + // convert NewTuple to the call to the constructor of the Tuple type (only for generated types) + | Quotations.Patterns.NewTuple(items) when isGenerated -> + let rec mkCtor args ty = + let ctor, restTyOpt = Reflection.FSharpValue.PreComputeTupleConstructorInfo ty + match restTyOpt with + | None -> Quotations.Expr.NewObject(ctor, List.map trans args) + | Some restTy -> + let curr = [for a in Seq.take 7 args -> trans a] + let rest = List.ofSeq (Seq.skip 7 args) + Quotations.Expr.NewObject(ctor, curr @ [mkCtor rest restTy]) + let tys = [| for e in items -> e.Type |] + let tupleTy = Reflection.FSharpType.MakeTupleType tys + trans (mkCtor items tupleTy) + // convert TupleGet to the chain of PropertyGet calls (only for generated types) + | Quotations.Patterns.TupleGet(e, i) when isGenerated -> + let rec mkGet ty i (e : Quotations.Expr) = + let pi, restOpt = Reflection.FSharpValue.PreComputeTuplePropertyInfo(ty, i) + let propGet = Quotations.Expr.PropertyGet(e, pi) + match restOpt with + | None -> propGet + | Some (restTy, restI) -> mkGet restTy restI propGet + trans (mkGet e.Type i (trans e)) + | Quotations.Patterns.Value(value, ty) -> + if value <> null then + let tyOfValue = value.GetType() + transValue(value, tyOfValue, ty) + else q + // Eliminate F# property gets to method calls + | Quotations.Patterns.PropertyGet(obj,propInfo,args) -> + match obj with + | None -> trans (Quotations.Expr.Call(propInfo.GetGetMethod(),args)) + | Some o -> trans (Quotations.Expr.Call(trans o,propInfo.GetGetMethod(),args)) + // Eliminate F# property sets to method calls + | Quotations.Patterns.PropertySet(obj,propInfo,args,v) -> + match obj with + | None -> trans (Quotations.Expr.Call(propInfo.GetSetMethod(),args@[v])) + | Some o -> trans (Quotations.Expr.Call(trans o,propInfo.GetSetMethod(),args@[v])) + // Eliminate F# function applications to FSharpFunc<_,_>.Invoke calls + | Quotations.Patterns.Application(f,e) -> + trans (Quotations.Expr.Call(trans f, f.Type.GetMethod "Invoke", [ e ]) ) + | Quotations.Patterns.NewUnionCase(ci, es) -> + trans (Quotations.Expr.Call(Reflection.FSharpValue.PreComputeUnionConstructorInfo ci, es) ) + | Quotations.Patterns.NewRecord(ci, es) -> + trans (Quotations.Expr.NewObject(Reflection.FSharpValue.PreComputeRecordConstructorInfo ci, es) ) + | Quotations.Patterns.UnionCaseTest(e,uc) -> + let tagInfo = Reflection.FSharpValue.PreComputeUnionTagMemberInfo uc.DeclaringType + let tagExpr = + match tagInfo with + | :? PropertyInfo as tagProp -> + trans (Quotations.Expr.PropertyGet(e,tagProp) ) + | :? MethodInfo as tagMeth -> + if tagMeth.IsStatic then trans (Quotations.Expr.Call(tagMeth, [e])) + else trans (Quotations.Expr.Call(e,tagMeth,[])) + | _ -> failwith "unreachable: unexpected result from PreComputeUnionTagMemberInfo" + let tagNumber = uc.Tag + trans <@@ (%%(tagExpr) : int) = tagNumber @@> + + // Explicitly handle weird byref variables in lets (used to populate out parameters), since the generic handlers can't deal with byrefs + | Quotations.Patterns.Let(v,vexpr,bexpr) when v.Type.IsByRef -> + + // the binding must have leaves that are themselves variables (due to the limited support for byrefs in expressions) + // therefore, we can perform inlining to translate this to a form that can be compiled + inlineByref v vexpr bexpr + + // Eliminate recursive let bindings (which are unsupported by the type provider API) to regular let bindings + | Quotations.Patterns.LetRecursive(bindings, expr) -> + // This uses a "lets and sets" approach, converting something like + // let rec even = function + // | 0 -> true + // | n -> odd (n-1) + // and odd = function + // | 0 -> false + // | n -> even (n-1) + // X + // to something like + // let even = ref Unchecked.defaultof<_> + // let odd = ref Unchecked.defaultof<_> + // even := function + // | 0 -> true + // | n -> !odd (n-1) + // odd := function + // | 0 -> false + // | n -> !even (n-1) + // X' + // where X' is X but with occurrences of even/odd substituted by !even and !odd (since now even and odd are references) + // Translation relies on typedefof<_ ref> - does this affect ability to target different runtime and design time environments? + let vars = List.map fst bindings + let vars' = vars |> List.map (fun v -> Quotations.Var(v.Name, typedefof<_ ref>.MakeGenericType(v.Type))) + + // init t generates the equivalent of <@ ref Unchecked.defaultof @> + let init (t:Type) = + let r = match <@ ref 1 @> with Quotations.Patterns.Call(None, r, [_]) -> r | _ -> failwith "Extracting MethodInfo from <@ 1 @> failed" + let d = match <@ Unchecked.defaultof<_> @> with Quotations.Patterns.Call(None, d, []) -> d | _ -> failwith "Extracting MethodInfo from <@ Unchecked.defaultof<_> @> failed" + Quotations.Expr.Call(r.GetGenericMethodDefinition().MakeGenericMethod(t), [Quotations.Expr.Call(d.GetGenericMethodDefinition().MakeGenericMethod(t),[])]) + + // deref v generates the equivalent of <@ !v @> + // (so v's type must be ref) + let deref (v:Quotations.Var) = + let m = match <@ !(ref 1) @> with Quotations.Patterns.Call(None, m, [_]) -> m | _ -> failwith "Extracting MethodInfo from <@ !(ref 1) @> failed" + let tyArgs = v.Type.GetGenericArguments() + Quotations.Expr.Call(m.GetGenericMethodDefinition().MakeGenericMethod(tyArgs), [Quotations.Expr.Var v]) + + // substitution mapping a variable v to the expression <@ !v' @> using the corresponding new variable v' of ref type + let subst = + let map = + vars' + |> List.map deref + |> List.zip vars + |> Map.ofList + fun v -> Map.tryFind v map + + let expr' = expr.Substitute(subst) + + // maps variables to new variables + let varDict = List.zip vars vars' |> dict + + // given an old variable v and an expression e, returns a quotation like <@ v' := e @> using the corresponding new variable v' of ref type + let setRef (v:Quotations.Var) e = + let m = match <@ (ref 1) := 2 @> with Quotations.Patterns.Call(None, m, [_;_]) -> m | _ -> failwith "Extracting MethodInfo from <@ (ref 1) := 2 @> failed" + Quotations.Expr.Call(m.GetGenericMethodDefinition().MakeGenericMethod(v.Type), [Quotations.Expr.Var varDict.[v]; e]) + + // Something like + // <@ + // v1 := e1' + // v2 := e2' + // ... + // expr' + // @> + // Note that we must substitute our new variable dereferences into the bound expressions + let body = + bindings + |> List.fold (fun b (v,e) -> Quotations.Expr.Sequential(setRef v (e.Substitute subst), b)) expr' + + // Something like + // let v1 = ref Unchecked.defaultof + // let v2 = ref Unchecked.defaultof + // ... + // body + vars + |> List.fold (fun b v -> Quotations.Expr.Let(varDict.[v], init v.Type, b)) body + |> trans + + // Handle the generic cases + | Quotations.ExprShape.ShapeLambda(v,body) -> + Quotations.Expr.Lambda(v, trans body) + | Quotations.ExprShape.ShapeCombination(comb,args) -> + Quotations.ExprShape.RebuildShapeCombination(comb,List.map trans args) + | Quotations.ExprShape.ShapeVar _ -> q + and inlineByref v vexpr bexpr = + match vexpr with + | Quotations.Patterns.Sequential(e',vexpr') -> + (* let v = (e'; vexpr') in bexpr => e'; let v = vexpr' in bexpr *) + Quotations.Expr.Sequential(e', inlineByref v vexpr' bexpr) + |> trans + | Quotations.Patterns.IfThenElse(c,b1,b2) -> + (* let v = if c then b1 else b2 in bexpr => if c then let v = b1 in bexpr else let v = b2 in bexpr *) + Quotations.Expr.IfThenElse(c, inlineByref v b1 bexpr, inlineByref v b2 bexpr) + |> trans + | Quotations.Patterns.Var _ -> + (* let v = v1 in bexpr => bexpr[v/v1] *) + bexpr.Substitute(fun v' -> if v = v' then Some vexpr else None) + |> trans + | _ -> + failwith (sprintf "Unexpected byref binding: %A = %A" v vexpr) + and transValue (v : obj, tyOfValue : Type, expectedTy : Type) = + let rec transArray (o : Array, ty : Type) = + let elemTy = ty.GetElementType() + let converter = getConverterForType elemTy + let elements = + [ + for el in o do + yield converter el + ] + Quotations.Expr.NewArray(elemTy, elements) + and transList(o, ty : Type, nil, cons) = + let converter = getConverterForType (ty.GetGenericArguments().[0]) + o + |> Seq.cast + |> List.ofSeq + |> fun l -> List.foldBack(fun o s -> Quotations.Expr.NewUnionCase(cons, [ converter(o); s ])) l (Quotations.Expr.NewUnionCase(nil, [])) + |> trans + and getConverterForType (ty : Type) = + if ty.IsArray then + fun (v : obj) -> transArray(v :?> Array, ty) + elif ty.IsGenericType && ty.GetGenericTypeDefinition() = typedefof<_ list> then + let nil, cons = + let cases = Reflection.FSharpType.GetUnionCases(ty) + let a = cases.[0] + let b = cases.[1] + if a.Name = "Empty" then a,b + else b,a + + fun v -> transList (v :?> System.Collections.IEnumerable, ty, nil, cons) + else + fun v -> Quotations.Expr.Value(v, ty) + let converter = getConverterForType tyOfValue + let r = converter v + if tyOfValue <> expectedTy then Quotations.Expr.Coerce(r, expectedTy) + else r + trans q + + let getFastFuncType (args : list) resultType = + let types = + [| + for arg in args -> arg.Type + yield resultType + |] + let fastFuncTy = + match List.length args with + | 2 -> typedefof>.MakeGenericType(types) + | 3 -> typedefof>.MakeGenericType(types) + | 4 -> typedefof>.MakeGenericType(types) + | 5 -> typedefof>.MakeGenericType(types) + | _ -> invalidArg "args" "incorrect number of arguments" + fastFuncTy.GetMethod("Adapt") + + let inline (===) a b = LanguagePrimitives.PhysicalEquality a b + + let traverse f = + let rec fallback e = + match e with + | P.Let(v, value, body) -> + let fixedValue = f fallback value + let fixedBody = f fallback body + if fixedValue === value && fixedBody === body then + e + else + E.Let(v, fixedValue, fixedBody) + | ES.ShapeVar _ -> e + | ES.ShapeLambda(v, body) -> + let fixedBody = f fallback body + if fixedBody === body then + e + else + E.Lambda(v, fixedBody) + | ES.ShapeCombination(shape, exprs) -> + let exprs1 = List.map (f fallback) exprs + if List.forall2 (===) exprs exprs1 then + e + else + ES.RebuildShapeCombination(shape, exprs1) + fun e -> f fallback e + + let RightPipe = <@@ (|>) @@> + let inlineRightPipe expr = + let rec loop expr = traverse loopCore expr + and loopCore fallback orig = + match orig with + | DP.SpecificCall RightPipe (None, _, [operand; applicable]) -> + let fixedOperand = loop operand + match loop applicable with + | P.Lambda(arg, body) -> + let v = Quotations.Var("__temp", operand.Type) + let ev = E.Var v + + let fixedBody = loop body + E.Let(v, fixedOperand, fixedBody.Substitute(fun v1 -> if v1 = arg then Some ev else None)) + | fixedApplicable -> E.Application(fixedApplicable, fixedOperand) + | x -> fallback x + loop expr + + let inlineValueBindings e = + let map = Dictionary(HashIdentity.Reference) + let rec loop expr = traverse loopCore expr + and loopCore fallback orig = + match orig with + | P.Let(id, (P.Value(_) as v), body) when not id.IsMutable -> + map.[id] <- v + let fixedBody = loop body + map.Remove(id) |> ignore + fixedBody + | ES.ShapeVar v -> + match map.TryGetValue v with + | true, e -> e + | _ -> orig + | x -> fallback x + loop e + + + let optimizeCurriedApplications expr = + let rec loop expr = traverse loopCore expr + and loopCore fallback orig = + match orig with + | P.Application(e, arg) -> + let e1 = tryPeelApplications e [loop arg] + if e1 === e then + orig + else + e1 + | x -> fallback x + and tryPeelApplications orig args = + let n = List.length args + match orig with + | P.Application(e, arg) -> + let e1 = tryPeelApplications e ((loop arg)::args) + if e1 === e then + orig + else + e1 + | P.Let(id, applicable, (P.Lambda(_) as body)) when n > 0 -> + let numberOfApplication = countPeelableApplications body id 0 + if numberOfApplication = 0 then orig + elif n = 1 then E.Application(applicable, List.head args) + elif n <= 5 then + let resultType = + applicable.Type + |> Seq.unfold (fun t -> + if not t.IsGenericType then None + else + let args = t.GetGenericArguments() + if args.Length <> 2 then None + else + Some (args.[1], args.[1]) + ) + |> Seq.item (n - 1) + + let adaptMethod = getFastFuncType args resultType + let adapted = E.Call(adaptMethod, [loop applicable]) + let invoke = adapted.Type.GetMethod("Invoke", [| for arg in args -> arg.Type |]) + E.Call(adapted, invoke, args) + else + (applicable, args) ||> List.fold (fun e a -> E.Application(e, a)) + | _ -> + orig + and countPeelableApplications expr v n = + match expr with + // v - applicable entity obtained on the prev step + // \arg -> let v1 = (f arg) in rest ==> f + | P.Lambda(arg, P.Let(v1, P.Application(P.Var f, P.Var arg1), rest)) when v = f && arg = arg1 -> countPeelableApplications rest v1 (n + 1) + // \arg -> (f arg) ==> f + | P.Lambda(arg, P.Application(P.Var f, P.Var arg1)) when v = f && arg = arg1 -> n + | _ -> n + loop expr + + // FSharp.Data change: use the real variable names instead of indices, to improve output of Debug.fs + let transQuotationToCode isGenerated qexprf (paramNames: string[]) (argExprs: Quotations.Expr[]) = + // add let bindings for arguments to ensure that arguments will be evaluated + let vars = argExprs |> Array.mapi (fun i e -> Quotations.Var(paramNames.[i], e.Type)) + let expr = qexprf ([for v in vars -> Quotations.Expr.Var v]) + + let pairs = Array.zip argExprs vars + let expr = Array.foldBack (fun (arg, var) e -> Quotations.Expr.Let(var, arg, e)) pairs expr + let expr = + if isGenerated then + let e1 = inlineRightPipe expr + let e2 = optimizeCurriedApplications e1 + let e3 = inlineValueBindings e2 + e3 + else + expr + + transExpr isGenerated expr + + let adjustTypeAttributes attributes isNested = + let visibilityAttributes = + match attributes &&& TypeAttributes.VisibilityMask with + | TypeAttributes.Public when isNested -> TypeAttributes.NestedPublic + | TypeAttributes.NotPublic when isNested -> TypeAttributes.NestedAssembly + | TypeAttributes.NestedPublic when not isNested -> TypeAttributes.Public + | TypeAttributes.NestedAssembly + | TypeAttributes.NestedPrivate + | TypeAttributes.NestedFamORAssem + | TypeAttributes.NestedFamily + | TypeAttributes.NestedFamANDAssem when not isNested -> TypeAttributes.NotPublic + | a -> a + (attributes &&& ~~~TypeAttributes.VisibilityMask) ||| visibilityAttributes + +type ProvidedStaticParameter(parameterName:string,parameterType:Type,?parameterDefaultValue:obj) = + inherit System.Reflection.ParameterInfo() + + let customAttributesImpl = CustomAttributesImpl() + + member __.AddXmlDocDelayed xmlDocFunction = customAttributesImpl.AddXmlDocDelayed xmlDocFunction + member __.AddXmlDocComputed xmlDocFunction = customAttributesImpl.AddXmlDocComputed xmlDocFunction + member __.AddXmlDoc xmlDoc = customAttributesImpl.AddXmlDoc xmlDoc + + override __.RawDefaultValue = defaultArg parameterDefaultValue null + override __.Attributes = if parameterDefaultValue.IsNone then enum 0 else ParameterAttributes.Optional + override __.Position = 0 + override __.ParameterType = parameterType + override __.Name = parameterName + + override __.GetCustomAttributes(_inherit) = ignore(_inherit); notRequired "GetCustomAttributes" parameterName + override __.GetCustomAttributes(_attributeType, _inherit) = notRequired "GetCustomAttributes" parameterName + +type ProvidedParameter(name:string,parameterType:Type,?isOut:bool,?optionalValue:obj) = + inherit System.Reflection.ParameterInfo() + let customAttributesImpl = CustomAttributesImpl() + let isOut = defaultArg isOut false + member __.IsParamArray with get() = customAttributesImpl.HasParamArray and set(v) = customAttributesImpl.HasParamArray <- v + override __.Name = name + override __.ParameterType = parameterType + override __.Attributes = (base.Attributes ||| (if isOut then ParameterAttributes.Out else enum 0) + ||| (match optionalValue with None -> enum 0 | Some _ -> ParameterAttributes.Optional ||| ParameterAttributes.HasDefault)) + override __.RawDefaultValue = defaultArg optionalValue null + member __.HasDefaultParameterValue = Option.isSome optionalValue + member __.GetCustomAttributesDataImpl() = customAttributesImpl.GetCustomAttributesData() +#if FX_NO_CUSTOMATTRIBUTEDATA +#else + override __.GetCustomAttributesData() = customAttributesImpl.GetCustomAttributesData() +#endif + +type ProvidedConstructor(parameters : ProvidedParameter list) = + inherit ConstructorInfo() + let parameters = parameters |> List.map (fun p -> p :> ParameterInfo) + let mutable baseCall = None + + let mutable declaringType = null : System.Type + let mutable invokeCode = None : option Quotations.Expr> + let mutable isImplicitCtor = false + let mutable ctorAttributes = MethodAttributes.Public ||| MethodAttributes.RTSpecialName + let nameText () = sprintf "constructor for %s" (if declaringType=null then "" else declaringType.FullName) + let isStatic() = ctorAttributes.HasFlag(MethodAttributes.Static) + + let customAttributesImpl = CustomAttributesImpl() + member __.IsTypeInitializer + with get() = isStatic() && ctorAttributes.HasFlag(MethodAttributes.Private) + and set(v) = + let typeInitializerAttributes = MethodAttributes.Static ||| MethodAttributes.Private + ctorAttributes <- if v then ctorAttributes ||| typeInitializerAttributes else ctorAttributes &&& ~~~typeInitializerAttributes + + member __.AddXmlDocComputed xmlDocFunction = customAttributesImpl.AddXmlDocComputed xmlDocFunction + member __.AddXmlDocDelayed xmlDocFunction = customAttributesImpl.AddXmlDocDelayed xmlDocFunction + member __.AddXmlDoc xmlDoc = customAttributesImpl.AddXmlDoc xmlDoc + member __.AddObsoleteAttribute (message,?isError) = customAttributesImpl.AddObsolete (message,defaultArg isError false) + member __.AddDefinitionLocation(line,column,filePath) = customAttributesImpl.AddDefinitionLocation(line, column, filePath) + member __.GetCustomAttributesDataImpl() = customAttributesImpl.GetCustomAttributesData() +#if FX_NO_CUSTOMATTRIBUTEDATA +#else + override __.GetCustomAttributesData() = customAttributesImpl.GetCustomAttributesData() +#endif + + member __.DeclaringTypeImpl + with set x = + if declaringType<>null then failwith (sprintf "ProvidedConstructor: declaringType already set on '%s'" (nameText())); + declaringType <- x + + member __.InvokeCode + with set (q:Quotations.Expr list -> Quotations.Expr) = + match invokeCode with + | None -> invokeCode <- Some q + | Some _ -> failwith (sprintf "ProvidedConstructor: code already given for '%s'" (nameText())) + + member __.BaseConstructorCall + with set (d:Quotations.Expr list -> (ConstructorInfo * Quotations.Expr list)) = + match baseCall with + | None -> baseCall <- Some d + | Some _ -> failwith (sprintf "ProvidedConstructor: base call already given for '%s'" (nameText())) + + member __.GetInvokeCodeInternal isGenerated = + match invokeCode with + | Some f -> + // FSharp.Data change: use the real variable names instead of indices, to improve output of Debug.fs + let paramNames = + parameters + |> List.map (fun p -> p.Name) + |> List.append (if not isGenerated || isStatic() then [] else ["this"]) + |> Array.ofList + transQuotationToCode isGenerated f paramNames + | None -> failwith (sprintf "ProvidedConstructor: no invoker for '%s'" (nameText())) + + member __.GetBaseConstructorCallInternal isGenerated = + match baseCall with + | Some f -> Some(fun ctorArgs -> let c,baseCtorArgExprs = f ctorArgs in c, List.map (transExpr isGenerated) baseCtorArgExprs) + | None -> None + member __.IsImplicitCtor with get() = isImplicitCtor and set v = isImplicitCtor <- v + + // Implement overloads + override __.GetParameters() = parameters |> List.toArray + override __.Attributes = ctorAttributes + override __.Name = if isStatic() then ".cctor" else ".ctor" + override __.DeclaringType = declaringType |> nonNull "ProvidedConstructor.DeclaringType" + override __.IsDefined(_attributeType, _inherit) = true + + override __.Invoke(_invokeAttr, _binder, _parameters, _culture) = notRequired "Invoke" (nameText()) + override __.Invoke(_obj, _invokeAttr, _binder, _parameters, _culture) = notRequired "Invoke" (nameText()) + override __.ReflectedType = notRequired "ReflectedType" (nameText()) + override __.GetMethodImplementationFlags() = notRequired "GetMethodImplementationFlags" (nameText()) + override __.MethodHandle = notRequired "MethodHandle" (nameText()) + override __.GetCustomAttributes(_inherit) = notRequired "GetCustomAttributes" (nameText()) + override __.GetCustomAttributes(_attributeType, _inherit) = notRequired "GetCustomAttributes" (nameText()) + +type ProvidedMethod(methodName: string, parameters: ProvidedParameter list, returnType: Type) = + inherit System.Reflection.MethodInfo() + let argParams = parameters |> List.map (fun p -> p :> ParameterInfo) + + // State + let mutable declaringType : Type = null + let mutable methodAttrs = MethodAttributes.Public + let mutable invokeCode = None : option Quotations.Expr> + let mutable staticParams = [ ] + let mutable staticParamsApply = None + let isStatic() = methodAttrs.HasFlag(MethodAttributes.Static) + let customAttributesImpl = CustomAttributesImpl() + + member __.AddXmlDocComputed xmlDocFunction = customAttributesImpl.AddXmlDocComputed xmlDocFunction + member __.AddXmlDocDelayed xmlDocFunction = customAttributesImpl.AddXmlDocDelayed xmlDocFunction + member __.AddXmlDoc xmlDoc = customAttributesImpl.AddXmlDoc xmlDoc + member __.AddObsoleteAttribute (message,?isError) = customAttributesImpl.AddObsolete (message,defaultArg isError false) + member __.AddDefinitionLocation(line,column,filePath) = customAttributesImpl.AddDefinitionLocation(line, column, filePath) + member __.AddCustomAttribute(attribute) = customAttributesImpl.AddCustomAttribute(attribute) + member __.GetCustomAttributesDataImpl() = customAttributesImpl.GetCustomAttributesData() +#if FX_NO_CUSTOMATTRIBUTEDATA +#else + override __.GetCustomAttributesData() = customAttributesImpl.GetCustomAttributesData() +#endif + + member __.SetMethodAttrs m = methodAttrs <- m + member __.AddMethodAttrs m = methodAttrs <- methodAttrs ||| m + member __.DeclaringTypeImpl with set x = declaringType <- x // check: not set twice + member __.IsStaticMethod + with get() = isStatic() + and set x = if x then methodAttrs <- methodAttrs ||| MethodAttributes.Static + else methodAttrs <- methodAttrs &&& (~~~ MethodAttributes.Static) + + member __.InvokeCode + with set (q:Quotations.Expr list -> Quotations.Expr) = + match invokeCode with + | None -> invokeCode <- Some q + | Some _ -> failwith (sprintf "ProvidedConstructor: code already given for %s on type %s" methodName (if declaringType=null then "" else declaringType.FullName)) + + + /// Abstract a type to a parametric-type. Requires "formal parameters" and "instantiation function". + member __.DefineStaticParameters(staticParameters : list, apply : (string -> obj[] -> ProvidedMethod)) = + staticParams <- staticParameters + staticParamsApply <- Some apply + + /// Get ParameterInfo[] for the parametric type parameters (//s GetGenericParameters) + member __.GetStaticParameters() = [| for p in staticParams -> p :> ParameterInfo |] + + /// Instantiate parametrics type + member __.ApplyStaticArguments(mangledName:string, args:obj[]) = + if staticParams.Length>0 then + if staticParams.Length <> args.Length then + failwith (sprintf "ProvidedTypeDefinition: expecting %d static parameters but given %d for method %s" staticParams.Length args.Length methodName) + match staticParamsApply with + | None -> failwith "ProvidedTypeDefinition: DefineStaticParameters was not called" + | Some f -> f mangledName args + else + failwith (sprintf "ProvidedTypeDefinition: static parameters supplied but not expected for method %s" methodName) + + member __.GetInvokeCodeInternal isGenerated = + match invokeCode with + | Some f -> + // FSharp.Data change: use the real variable names instead of indices, to improve output of Debug.fs + let paramNames = + parameters + |> List.map (fun p -> p.Name) + |> List.append (if isStatic() then [] else ["this"]) + |> Array.ofList + transQuotationToCode isGenerated f paramNames + | None -> failwith (sprintf "ProvidedMethod: no invoker for %s on type %s" methodName (if declaringType=null then "" else declaringType.FullName)) + + // Implement overloads + override __.GetParameters() = argParams |> Array.ofList + override __.Attributes = methodAttrs + override __.Name = methodName + override __.DeclaringType = declaringType |> nonNull "ProvidedMethod.DeclaringType" + override __.IsDefined(_attributeType, _inherit) : bool = true + override __.MemberType = MemberTypes.Method + override __.CallingConvention = + let cc = CallingConventions.Standard + let cc = if not (isStatic()) then cc ||| CallingConventions.HasThis else cc + cc + override __.ReturnType = returnType + override __.ReturnParameter = null // REVIEW: Give it a name and type? + override __.ToString() = "Method " + methodName + + // These don't have to return fully accurate results - they are used + // by the F# Quotations library function SpecificCall as a pre-optimization + // when comparing methods + override __.MetadataToken = hash declaringType + hash methodName + override __.MethodHandle = RuntimeMethodHandle() + + override __.ReturnTypeCustomAttributes = notRequired "ReturnTypeCustomAttributes" methodName + override __.GetBaseDefinition() = notRequired "GetBaseDefinition" methodName + override __.GetMethodImplementationFlags() = notRequired "GetMethodImplementationFlags" methodName + override __.Invoke(_obj, _invokeAttr, _binder, _parameters, _culture) = notRequired "Invoke" methodName + override __.ReflectedType = notRequired "ReflectedType" methodName + override __.GetCustomAttributes(_inherit) = notRequired "GetCustomAttributes" methodName + override __.GetCustomAttributes(_attributeType, _inherit) = notRequired "GetCustomAttributes" methodName + + +type ProvidedProperty(propertyName: string, propertyType: Type, ?parameters: ProvidedParameter list) = + inherit System.Reflection.PropertyInfo() + // State + + let parameters = defaultArg parameters [] + let mutable declaringType = null + let mutable isStatic = false + let mutable getterCode = None : option Quotations.Expr> + let mutable setterCode = None : option Quotations.Expr> + + let hasGetter() = getterCode.IsSome + let hasSetter() = setterCode.IsSome + + // Delay construction - to pick up the latest isStatic + let markSpecialName (m:ProvidedMethod) = m.AddMethodAttrs(MethodAttributes.SpecialName); m + let getter = lazy (ProvidedMethod("get_" + propertyName,parameters,propertyType,IsStaticMethod=isStatic,DeclaringTypeImpl=declaringType,InvokeCode=getterCode.Value) |> markSpecialName) + let setter = lazy (ProvidedMethod("set_" + propertyName,parameters @ [ProvidedParameter("value",propertyType)],typeof,IsStaticMethod=isStatic,DeclaringTypeImpl=declaringType,InvokeCode=setterCode.Value) |> markSpecialName) + + let customAttributesImpl = CustomAttributesImpl() + member __.AddXmlDocComputed xmlDocFunction = customAttributesImpl.AddXmlDocComputed xmlDocFunction + member __.AddXmlDocDelayed xmlDocFunction = customAttributesImpl.AddXmlDocDelayed xmlDocFunction + member __.AddXmlDoc xmlDoc = customAttributesImpl.AddXmlDoc xmlDoc + member __.AddObsoleteAttribute (message,?isError) = customAttributesImpl.AddObsolete (message,defaultArg isError false) + member __.AddDefinitionLocation(line,column,filePath) = customAttributesImpl.AddDefinitionLocation(line, column, filePath) + member __.GetCustomAttributesDataImpl() = customAttributesImpl.GetCustomAttributesData() + member __.AddCustomAttribute attribute = customAttributesImpl.AddCustomAttribute attribute +#if FX_NO_CUSTOMATTRIBUTEDATA +#else + override __.GetCustomAttributesData() = customAttributesImpl.GetCustomAttributesData() +#endif + + member __.DeclaringTypeImpl with set x = declaringType <- x // check: not set twice + + member __.IsStatic + with get() = isStatic + and set x = isStatic <- x + + member __.GetterCode + with set (q:Quotations.Expr list -> Quotations.Expr) = + if not getter.IsValueCreated then getterCode <- Some q else failwith "ProvidedProperty: getter MethodInfo has already been created" + + member __.SetterCode + with set (q:Quotations.Expr list -> Quotations.Expr) = + if not (setter.IsValueCreated) then setterCode <- Some q else failwith "ProvidedProperty: setter MethodInfo has already been created" + + // Implement overloads + override __.PropertyType = propertyType + override __.SetValue(_obj, _value, _invokeAttr, _binder, _index, _culture) = notRequired "SetValue" propertyName + override __.GetAccessors _nonPublic = notRequired "nonPublic" propertyName + override __.GetGetMethod _nonPublic = if hasGetter() then getter.Force() :> MethodInfo else null + override __.GetSetMethod _nonPublic = if hasSetter() then setter.Force() :> MethodInfo else null + override __.GetIndexParameters() = [| for p in parameters -> upcast p |] + override __.Attributes = PropertyAttributes.None + override __.CanRead = hasGetter() + override __.CanWrite = hasSetter() + override __.GetValue(_obj, _invokeAttr, _binder, _index, _culture) : obj = notRequired "GetValue" propertyName + override __.Name = propertyName + override __.DeclaringType = declaringType |> nonNull "ProvidedProperty.DeclaringType" + override __.MemberType : MemberTypes = MemberTypes.Property + + override __.ReflectedType = notRequired "ReflectedType" propertyName + override __.GetCustomAttributes(_inherit) = notRequired "GetCustomAttributes" propertyName + override __.GetCustomAttributes(_attributeType, _inherit) = notRequired "GetCustomAttributes" propertyName + override __.IsDefined(_attributeType, _inherit) = notRequired "IsDefined" propertyName + +type ProvidedEvent(eventName:string,eventHandlerType:Type) = + inherit System.Reflection.EventInfo() + // State + + let mutable declaringType = null + let mutable isStatic = false + let mutable adderCode = None : option Quotations.Expr> + let mutable removerCode = None : option Quotations.Expr> + + // Delay construction - to pick up the latest isStatic + let markSpecialName (m:ProvidedMethod) = m.AddMethodAttrs(MethodAttributes.SpecialName); m + let adder = lazy (ProvidedMethod("add_" + eventName, [ProvidedParameter("handler", eventHandlerType)],typeof,IsStaticMethod=isStatic,DeclaringTypeImpl=declaringType,InvokeCode=adderCode.Value) |> markSpecialName) + let remover = lazy (ProvidedMethod("remove_" + eventName, [ProvidedParameter("handler", eventHandlerType)],typeof,IsStaticMethod=isStatic,DeclaringTypeImpl=declaringType,InvokeCode=removerCode.Value) |> markSpecialName) + + let customAttributesImpl = CustomAttributesImpl() + member __.AddXmlDocComputed xmlDocFunction = customAttributesImpl.AddXmlDocComputed xmlDocFunction + member __.AddXmlDocDelayed xmlDocFunction = customAttributesImpl.AddXmlDocDelayed xmlDocFunction + member __.AddXmlDoc xmlDoc = customAttributesImpl.AddXmlDoc xmlDoc + member __.AddDefinitionLocation(line,column,filePath) = customAttributesImpl.AddDefinitionLocation(line, column, filePath) + member __.GetCustomAttributesDataImpl() = customAttributesImpl.GetCustomAttributesData() +#if FX_NO_CUSTOMATTRIBUTEDATA +#else + override __.GetCustomAttributesData() = customAttributesImpl.GetCustomAttributesData() +#endif + + member __.DeclaringTypeImpl with set x = declaringType <- x // check: not set twice + member __.IsStatic + with get() = isStatic + and set x = isStatic <- x + + member __.AdderCode + with get() = adderCode.Value + and set f = + if not adder.IsValueCreated then adderCode <- Some f else failwith "ProvidedEvent: Add MethodInfo has already been created" + + member __.RemoverCode + with get() = removerCode.Value + and set f = + if not (remover.IsValueCreated) then removerCode <- Some f else failwith "ProvidedEvent: Remove MethodInfo has already been created" + + // Implement overloads + override __.EventHandlerType = eventHandlerType + override __.GetAddMethod _nonPublic = adder.Force() :> MethodInfo + override __.GetRemoveMethod _nonPublic = remover.Force() :> MethodInfo + override __.Attributes = EventAttributes.None + override __.Name = eventName + override __.DeclaringType = declaringType |> nonNull "ProvidedEvent.DeclaringType" + override __.MemberType : MemberTypes = MemberTypes.Event + + override __.GetRaiseMethod _nonPublic = notRequired "GetRaiseMethod" eventName + override __.ReflectedType = notRequired "ReflectedType" eventName + override __.GetCustomAttributes(_inherit) = notRequired "GetCustomAttributes" eventName + override __.GetCustomAttributes(_attributeType, _inherit) = notRequired "GetCustomAttributes" eventName + override __.IsDefined(_attributeType, _inherit) = notRequired "IsDefined" eventName + +type ProvidedLiteralField(fieldName:string,fieldType:Type,literalValue:obj) = + inherit System.Reflection.FieldInfo() + // State + + let mutable declaringType = null + + let customAttributesImpl = CustomAttributesImpl() + member __.AddXmlDocComputed xmlDocFunction = customAttributesImpl.AddXmlDocComputed xmlDocFunction + member __.AddXmlDocDelayed xmlDocFunction = customAttributesImpl.AddXmlDocDelayed xmlDocFunction + member __.AddXmlDoc xmlDoc = customAttributesImpl.AddXmlDoc xmlDoc + member __.AddObsoleteAttribute (message,?isError) = customAttributesImpl.AddObsolete (message,defaultArg isError false) + member __.AddDefinitionLocation(line,column,filePath) = customAttributesImpl.AddDefinitionLocation(line, column, filePath) + member __.GetCustomAttributesDataImpl() = customAttributesImpl.GetCustomAttributesData() +#if FX_NO_CUSTOMATTRIBUTEDATA +#else + override __.GetCustomAttributesData() = customAttributesImpl.GetCustomAttributesData() +#endif + + member __.DeclaringTypeImpl with set x = declaringType <- x // check: not set twice + + + // Implement overloads + override __.FieldType = fieldType + override __.GetRawConstantValue() = literalValue + override __.Attributes = FieldAttributes.Static ||| FieldAttributes.Literal ||| FieldAttributes.Public + override __.Name = fieldName + override __.DeclaringType = declaringType |> nonNull "ProvidedLiteralField.DeclaringType" + override __.MemberType : MemberTypes = MemberTypes.Field + + override __.ReflectedType = notRequired "ReflectedType" fieldName + override __.GetCustomAttributes(_inherit) = notRequired "GetCustomAttributes" fieldName + override __.GetCustomAttributes(_attributeType, _inherit) = notRequired "GetCustomAttributes" fieldName + override __.IsDefined(_attributeType, _inherit) = notRequired "IsDefined" fieldName + + override __.SetValue(_obj, _value, _invokeAttr, _binder, _culture) = notRequired "SetValue" fieldName + override __.GetValue(_obj) : obj = notRequired "GetValue" fieldName + override __.FieldHandle = notRequired "FieldHandle" fieldName + +type ProvidedField(fieldName:string,fieldType:Type) = + inherit System.Reflection.FieldInfo() + // State + + let mutable declaringType = null + + let customAttributesImpl = CustomAttributesImpl() + let mutable fieldAttrs = FieldAttributes.Private + member __.AddXmlDocComputed xmlDocFunction = customAttributesImpl.AddXmlDocComputed xmlDocFunction + member __.AddXmlDocDelayed xmlDocFunction = customAttributesImpl.AddXmlDocDelayed xmlDocFunction + member __.AddXmlDoc xmlDoc = customAttributesImpl.AddXmlDoc xmlDoc + member __.AddObsoleteAttribute (message,?isError) = customAttributesImpl.AddObsolete (message,defaultArg isError false) + member __.AddDefinitionLocation(line,column,filePath) = customAttributesImpl.AddDefinitionLocation(line, column, filePath) + member __.GetCustomAttributesDataImpl() = customAttributesImpl.GetCustomAttributesData() +#if FX_NO_CUSTOMATTRIBUTEDATA +#else + override __.GetCustomAttributesData() = customAttributesImpl.GetCustomAttributesData() +#endif + + member __.DeclaringTypeImpl with set x = declaringType <- x // check: not set twice + + member __.SetFieldAttributes attrs = fieldAttrs <- attrs + // Implement overloads + override __.FieldType = fieldType + override __.GetRawConstantValue() = null + override __.Attributes = fieldAttrs + override __.Name = fieldName + override __.DeclaringType = declaringType |> nonNull "ProvidedField.DeclaringType" + override __.MemberType : MemberTypes = MemberTypes.Field + + override __.ReflectedType = notRequired "ReflectedType" fieldName + override __.GetCustomAttributes(_inherit) = notRequired "GetCustomAttributes" fieldName + override __.GetCustomAttributes(_attributeType, _inherit) = notRequired "GetCustomAttributes" fieldName + override __.IsDefined(_attributeType, _inherit) = notRequired "IsDefined" fieldName + + override __.SetValue(_obj, _value, _invokeAttr, _binder, _culture) = notRequired "SetValue" fieldName + override __.GetValue(_obj) : obj = notRequired "GetValue" fieldName + override __.FieldHandle = notRequired "FieldHandle" fieldName + +/// Represents the type constructor in a provided symbol type. +[] +type SymbolKind = + | SDArray + | Array of int + | Pointer + | ByRef + | Generic of System.Type + | FSharpTypeAbbreviation of (System.Reflection.Assembly * string * string[]) + + +/// Represents an array or other symbolic type involving a provided type as the argument. +/// See the type provider spec for the methods that must be implemented. +/// Note that the type provider specification does not require us to implement pointer-equality for provided types. +type ProvidedSymbolType(kind: SymbolKind, args: Type list) = + inherit Type() + + let rec isEquivalentTo (thisTy: Type) (otherTy: Type) = + match thisTy, otherTy with + | (:? ProvidedSymbolType as thisTy), (:? ProvidedSymbolType as thatTy) -> (thisTy.Kind,thisTy.Args) = (thatTy.Kind, thatTy.Args) + | (:? ProvidedSymbolType as thisTy), otherTy | otherTy, (:? ProvidedSymbolType as thisTy) -> + match thisTy.Kind, thisTy.Args with + | SymbolKind.SDArray, [ty] | SymbolKind.Array _, [ty] when otherTy.IsArray-> ty.Equals(otherTy.GetElementType()) + | SymbolKind.ByRef, [ty] when otherTy.IsByRef -> ty.Equals(otherTy.GetElementType()) + | SymbolKind.Pointer, [ty] when otherTy.IsPointer -> ty.Equals(otherTy.GetElementType()) + | SymbolKind.Generic baseTy, args -> otherTy.IsGenericType && isEquivalentTo baseTy (otherTy.GetGenericTypeDefinition()) && Seq.forall2 isEquivalentTo args (otherTy.GetGenericArguments()) + | _ -> false + | a, b -> a.Equals b + + let nameText() = + match kind,args with + | SymbolKind.SDArray,[arg] -> arg.Name + "[]" + | SymbolKind.Array _,[arg] -> arg.Name + "[*]" + | SymbolKind.Pointer,[arg] -> arg.Name + "*" + | SymbolKind.ByRef,[arg] -> arg.Name + "&" + | SymbolKind.Generic gty, args -> gty.Name + (sprintf "%A" args) + | SymbolKind.FSharpTypeAbbreviation (_,_,path),_ -> path.[path.Length-1] + | _ -> failwith "unreachable" + + static member convType (parameters: Type list) (ty:Type) = + if ty = null then null + elif ty.IsGenericType then + let args = Array.map (ProvidedSymbolType.convType parameters) (ty.GetGenericArguments()) + ProvidedSymbolType(Generic (ty.GetGenericTypeDefinition()), Array.toList args) :> Type + elif ty.HasElementType then + let ety = ProvidedSymbolType.convType parameters (ty.GetElementType()) + if ty.IsArray then + let rank = ty.GetArrayRank() + if rank = 1 then ProvidedSymbolType(SDArray,[ety]) :> Type + else ProvidedSymbolType(Array rank,[ety]) :> Type + elif ty.IsPointer then ProvidedSymbolType(Pointer,[ety]) :> Type + elif ty.IsByRef then ProvidedSymbolType(ByRef,[ety]) :> Type + else ty + elif ty.IsGenericParameter then + if ty.GenericParameterPosition <= parameters.Length - 1 then + parameters.[ty.GenericParameterPosition] + else + ty + else ty + + override __.FullName = + match kind,args with + | SymbolKind.SDArray,[arg] -> arg.FullName + "[]" + | SymbolKind.Array _,[arg] -> arg.FullName + "[*]" + | SymbolKind.Pointer,[arg] -> arg.FullName + "*" + | SymbolKind.ByRef,[arg] -> arg.FullName + "&" + | SymbolKind.Generic gty, args -> gty.FullName + "[" + (args |> List.map (fun arg -> arg.ToString()) |> String.concat ",") + "]" + | SymbolKind.FSharpTypeAbbreviation (_,nsp,path),args -> String.concat "." (Array.append [| nsp |] path) + args.ToString() + | _ -> failwith "unreachable" + + /// Although not strictly required by the type provider specification, this is required when doing basic operations like FullName on + /// .NET symbolic types made from this type, e.g. when building Nullable.FullName + override __.DeclaringType = + match kind,args with + | SymbolKind.SDArray,[arg] -> arg + | SymbolKind.Array _,[arg] -> arg + | SymbolKind.Pointer,[arg] -> arg + | SymbolKind.ByRef,[arg] -> arg + | SymbolKind.Generic gty,_ -> gty + | SymbolKind.FSharpTypeAbbreviation _,_ -> null + | _ -> failwith "unreachable" + + override __.IsAssignableFrom(otherTy) = + match kind with + | Generic gtd -> + if otherTy.IsGenericType then + let otherGtd = otherTy.GetGenericTypeDefinition() + let otherArgs = otherTy.GetGenericArguments() + let yes = gtd.Equals(otherGtd) && Seq.forall2 isEquivalentTo args otherArgs + yes + else + base.IsAssignableFrom(otherTy) + | _ -> base.IsAssignableFrom(otherTy) + + override __.Name = nameText() + + override __.BaseType = + match kind with + | SymbolKind.SDArray -> typeof + | SymbolKind.Array _ -> typeof + | SymbolKind.Pointer -> typeof + | SymbolKind.ByRef -> typeof + | SymbolKind.Generic gty -> + if gty.BaseType = null then null else + ProvidedSymbolType.convType args gty.BaseType + | SymbolKind.FSharpTypeAbbreviation _ -> typeof + + override __.GetArrayRank() = (match kind with SymbolKind.Array n -> n | SymbolKind.SDArray -> 1 | _ -> invalidOp "non-array type") + override __.IsArrayImpl() = (match kind with SymbolKind.Array _ | SymbolKind.SDArray -> true | _ -> false) + override __.IsByRefImpl() = (match kind with SymbolKind.ByRef _ -> true | _ -> false) + override __.IsPointerImpl() = (match kind with SymbolKind.Pointer _ -> true | _ -> false) + override __.IsPrimitiveImpl() = false + override __.IsGenericType = (match kind with SymbolKind.Generic _ -> true | _ -> false) + override __.GetGenericArguments() = (match kind with SymbolKind.Generic _ -> args |> List.toArray | _ -> invalidOp "non-generic type") + override __.GetGenericTypeDefinition() = (match kind with SymbolKind.Generic e -> e | _ -> invalidOp "non-generic type") + override __.IsCOMObjectImpl() = false + override __.HasElementTypeImpl() = (match kind with SymbolKind.Generic _ -> false | _ -> true) + override __.GetElementType() = (match kind,args with (SymbolKind.Array _ | SymbolKind.SDArray | SymbolKind.ByRef | SymbolKind.Pointer),[e] -> e | _ -> invalidOp "not an array, pointer or byref type") + override this.ToString() = this.FullName + + override __.Assembly = + match kind with + | SymbolKind.FSharpTypeAbbreviation (assembly,_nsp,_path) -> assembly + | SymbolKind.Generic gty -> gty.Assembly + | _ -> notRequired "Assembly" (nameText()) + + override __.Namespace = + match kind with + | SymbolKind.FSharpTypeAbbreviation (_assembly,nsp,_path) -> nsp + | _ -> notRequired "Namespace" (nameText()) + + override __.GetHashCode() = + match kind,args with + | SymbolKind.SDArray,[arg] -> 10 + hash arg + | SymbolKind.Array _,[arg] -> 163 + hash arg + | SymbolKind.Pointer,[arg] -> 283 + hash arg + | SymbolKind.ByRef,[arg] -> 43904 + hash arg + | SymbolKind.Generic gty,_ -> 9797 + hash gty + List.sumBy hash args + | SymbolKind.FSharpTypeAbbreviation _,_ -> 3092 + | _ -> failwith "unreachable" + + override __.Equals(other: obj) = + match other with + | :? ProvidedSymbolType as otherTy -> (kind, args) = (otherTy.Kind, otherTy.Args) + | _ -> false + + member __.Kind = kind + member __.Args = args + + override __.Module : Module = notRequired "Module" (nameText()) + override __.GetConstructors _bindingAttr = notRequired "GetConstructors" (nameText()) + override __.GetMethodImpl(_name, _bindingAttr, _binderBinder, _callConvention, _types, _modifiers) = + match kind with + | Generic gtd -> + let ty = gtd.GetGenericTypeDefinition().MakeGenericType(Array.ofList args) + ty.GetMethod(_name, _bindingAttr) + | _ -> notRequired "GetMethodImpl" (nameText()) + override __.GetMembers _bindingAttr = notRequired "GetMembers" (nameText()) + override __.GetMethods _bindingAttr = notRequired "GetMethods" (nameText()) + override __.GetField(_name, _bindingAttr) = notRequired "GetField" (nameText()) + override __.GetFields _bindingAttr = notRequired "GetFields" (nameText()) + override __.GetInterface(_name, _ignoreCase) = notRequired "GetInterface" (nameText()) + override __.GetInterfaces() = notRequired "GetInterfaces" (nameText()) + override __.GetEvent(_name, _bindingAttr) = notRequired "GetEvent" (nameText()) + override __.GetEvents _bindingAttr = notRequired "GetEvents" (nameText()) + override __.GetProperties _bindingAttr = notRequired "GetProperties" (nameText()) + override __.GetPropertyImpl(_name, _bindingAttr, _binder, _returnType, _types, _modifiers) = notRequired "GetPropertyImpl" (nameText()) + override __.GetNestedTypes _bindingAttr = notRequired "GetNestedTypes" (nameText()) + override __.GetNestedType(_name, _bindingAttr) = notRequired "GetNestedType" (nameText()) + override __.GetAttributeFlagsImpl() = notRequired "GetAttributeFlagsImpl" (nameText()) + override this.UnderlyingSystemType = + match kind with + | SymbolKind.SDArray + | SymbolKind.Array _ + | SymbolKind.Pointer + | SymbolKind.FSharpTypeAbbreviation _ + | SymbolKind.ByRef -> upcast this + | SymbolKind.Generic gty -> gty.UnderlyingSystemType +#if FX_NO_CUSTOMATTRIBUTEDATA +#else + override __.GetCustomAttributesData() = ([| |] :> IList<_>) +#endif + override __.MemberType = notRequired "MemberType" (nameText()) + override __.GetMember(_name,_mt,_bindingAttr) = notRequired "GetMember" (nameText()) + override __.GUID = notRequired "GUID" (nameText()) + override __.InvokeMember(_name, _invokeAttr, _binder, _target, _args, _modifiers, _culture, _namedParameters) = notRequired "InvokeMember" (nameText()) + override __.AssemblyQualifiedName = notRequired "AssemblyQualifiedName" (nameText()) + override __.GetConstructorImpl(_bindingAttr, _binder, _callConvention, _types, _modifiers) = notRequired "GetConstructorImpl" (nameText()) + override __.GetCustomAttributes(_inherit) = [| |] + override __.GetCustomAttributes(_attributeType, _inherit) = [| |] + override __.IsDefined(_attributeType, _inherit) = false + // FSharp.Data addition: this was added to support arrays of arrays + override this.MakeArrayType() = ProvidedSymbolType(SymbolKind.SDArray, [this]) :> Type + override this.MakeArrayType arg = ProvidedSymbolType(SymbolKind.Array arg, [this]) :> Type + +type ProvidedSymbolMethod(genericMethodDefinition: MethodInfo, parameters: Type list) = + inherit System.Reflection.MethodInfo() + + let convParam (p:ParameterInfo) = + { new System.Reflection.ParameterInfo() with + override __.Name = p.Name + override __.ParameterType = ProvidedSymbolType.convType parameters p.ParameterType + override __.Attributes = p.Attributes + override __.RawDefaultValue = p.RawDefaultValue +#if FX_NO_CUSTOMATTRIBUTEDATA +#else + override __.GetCustomAttributesData() = p.GetCustomAttributesData() +#endif + } + + override this.IsGenericMethod = + (if this.DeclaringType.IsGenericType then this.DeclaringType.GetGenericArguments().Length else 0) < parameters.Length + + override this.GetGenericArguments() = + Seq.skip (if this.DeclaringType.IsGenericType then this.DeclaringType.GetGenericArguments().Length else 0) parameters |> Seq.toArray + + override __.GetGenericMethodDefinition() = genericMethodDefinition + + override __.DeclaringType = ProvidedSymbolType.convType parameters genericMethodDefinition.DeclaringType + override __.ToString() = "Method " + genericMethodDefinition.Name + override __.Name = genericMethodDefinition.Name + override __.MetadataToken = genericMethodDefinition.MetadataToken + override __.Attributes = genericMethodDefinition.Attributes + override __.CallingConvention = genericMethodDefinition.CallingConvention + override __.MemberType = genericMethodDefinition.MemberType + + override __.IsDefined(_attributeType, _inherit) : bool = notRequired "IsDefined" genericMethodDefinition.Name + override __.ReturnType = ProvidedSymbolType.convType parameters genericMethodDefinition.ReturnType + override __.GetParameters() = genericMethodDefinition.GetParameters() |> Array.map convParam + override __.ReturnParameter = genericMethodDefinition.ReturnParameter |> convParam + override __.ReturnTypeCustomAttributes = notRequired "ReturnTypeCustomAttributes" genericMethodDefinition.Name + override __.GetBaseDefinition() = notRequired "GetBaseDefinition" genericMethodDefinition.Name + override __.GetMethodImplementationFlags() = notRequired "GetMethodImplementationFlags" genericMethodDefinition.Name + override __.MethodHandle = notRequired "MethodHandle" genericMethodDefinition.Name + override __.Invoke(_obj, _invokeAttr, _binder, _parameters, _culture) = notRequired "Invoke" genericMethodDefinition.Name + override __.ReflectedType = notRequired "ReflectedType" genericMethodDefinition.Name + override __.GetCustomAttributes(_inherit) = notRequired "GetCustomAttributes" genericMethodDefinition.Name + override __.GetCustomAttributes(_attributeType, _inherit) = notRequired "GetCustomAttributes" genericMethodDefinition.Name + + + +type ProvidedTypeBuilder() = + static member MakeGenericType(genericTypeDefinition, genericArguments) = ProvidedSymbolType(Generic genericTypeDefinition, genericArguments) :> Type + static member MakeGenericMethod(genericMethodDefinition, genericArguments) = ProvidedSymbolMethod(genericMethodDefinition, genericArguments) :> MethodInfo + +[] +type ProvidedMeasureBuilder() = + + // TODO: this shouldn't be hardcoded, but without creating a dependency on FSharp.Compiler.Service + // there seems to be no way to check if a type abbreviation exists + let unitNamesTypeAbbreviations = + [ "meter"; "hertz"; "newton"; "pascal"; "joule"; "watt"; "coulomb"; + "volt"; "farad"; "ohm"; "siemens"; "weber"; "tesla"; "henry" + "lumen"; "lux"; "becquerel"; "gray"; "sievert"; "katal" ] + |> Set.ofList + + let unitSymbolsTypeAbbreviations = + [ "m"; "kg"; "s"; "A"; "K"; "mol"; "cd"; "Hz"; "N"; "Pa"; "J"; "W"; "C" + "V"; "F"; "S"; "Wb"; "T"; "lm"; "lx"; "Bq"; "Gy"; "Sv"; "kat"; "H" ] + |> Set.ofList + + static let theBuilder = ProvidedMeasureBuilder() + static member Default = theBuilder + member __.One = typeof + member __.Product (m1,m2) = typedefof>.MakeGenericType [| m1;m2 |] + member __.Inverse m = typedefof>.MakeGenericType [| m |] + member b.Ratio (m1, m2) = b.Product(m1, b.Inverse m2) + member b.Square m = b.Product(m, m) + + // FSharp.Data change: if the unit is not a valid type, instead + // of assuming it's a type abbreviation, which may not be the case and cause a + // problem later on, check the list of valid abbreviations + member __.SI (m:string) = + let mLowerCase = m.ToLowerInvariant() + let abbreviation = + if unitNamesTypeAbbreviations.Contains mLowerCase then + Some ("Microsoft.FSharp.Data.UnitSystems.SI.UnitNames", mLowerCase) + elif unitSymbolsTypeAbbreviations.Contains m then + Some ("Microsoft.FSharp.Data.UnitSystems.SI.UnitSymbols", m) + else + None + match abbreviation with + | Some (ns, unitName) -> + ProvidedSymbolType + (SymbolKind.FSharpTypeAbbreviation + (typeof.Assembly, + ns, + [| unitName |]), + []) :> Type + | None -> + typedefof>.Assembly.GetType("Microsoft.FSharp.Data.UnitSystems.SI.UnitNames." + mLowerCase) + + member __.AnnotateType (basicType, annotation) = ProvidedSymbolType(Generic basicType, annotation) :> Type + + + +[] +type TypeContainer = + | Namespace of Assembly * string // namespace + | Type of System.Type + | TypeToBeDecided + +module GlobalProvidedAssemblyElementsTable = + let theTable = Dictionary>() + +type ProvidedTypeDefinition(container:TypeContainer,className : string, baseType : Type option) as this = + inherit Type() + + do match container, !ProvidedTypeDefinition.Logger with + | TypeContainer.Namespace _, Some logger -> logger (sprintf "Creating ProvidedTypeDefinition %s [%d]" className (System.Runtime.CompilerServices.RuntimeHelpers.GetHashCode this)) + | _ -> () + + // state + let mutable attributes = + TypeAttributes.Public ||| + TypeAttributes.Class ||| + TypeAttributes.Sealed ||| + enum (int32 TypeProviderTypeAttributes.IsErased) + + + let mutable enumUnderlyingType = typeof + let mutable baseType = lazy baseType + let mutable membersKnown = ResizeArray() + let mutable membersQueue = ResizeArray<(unit -> list)>() + let mutable staticParams = [ ] + let mutable staticParamsApply = None + let mutable container = container + let mutable interfaceImpls = ResizeArray() + let mutable interfaceImplsDelayed = ResizeArray list>() + let mutable methodOverrides = ResizeArray() + + // members API + let getMembers() = + if membersQueue.Count > 0 then + let elems = membersQueue |> Seq.toArray // take a copy in case more elements get added + membersQueue.Clear() + for f in elems do + for i in f() do + membersKnown.Add i + match i with + | :? ProvidedProperty as p -> + if p.CanRead then membersKnown.Add (p.GetGetMethod true) + if p.CanWrite then membersKnown.Add (p.GetSetMethod true) + | :? ProvidedEvent as e -> + membersKnown.Add (e.GetAddMethod true) + membersKnown.Add (e.GetRemoveMethod true) + | _ -> () + + membersKnown.ToArray() + + // members API + let getInterfaces() = + if interfaceImplsDelayed.Count > 0 then + let elems = interfaceImplsDelayed |> Seq.toArray // take a copy in case more elements get added + interfaceImplsDelayed.Clear() + for f in elems do + for i in f() do + interfaceImpls.Add i + + interfaceImpls.ToArray() + + let mutable theAssembly = + lazy + match container with + | TypeContainer.Namespace (theAssembly, rootNamespace) -> + if theAssembly = null then failwith "Null assemblies not allowed" + if rootNamespace<>null && rootNamespace.Length=0 then failwith "Use 'null' for global namespace" + theAssembly + | TypeContainer.Type superTy -> superTy.Assembly + | TypeContainer.TypeToBeDecided -> failwith (sprintf "type '%s' was not added as a member to a declaring type" className) + + let rootNamespace = + lazy + match container with + | TypeContainer.Namespace (_,rootNamespace) -> rootNamespace + | TypeContainer.Type enclosingTyp -> enclosingTyp.Namespace + | TypeContainer.TypeToBeDecided -> failwith (sprintf "type '%s' was not added as a member to a declaring type" className) + + let declaringType = + lazy + match container with + | TypeContainer.Namespace _ -> null + | TypeContainer.Type enclosingTyp -> enclosingTyp + | TypeContainer.TypeToBeDecided -> failwith (sprintf "type '%s' was not added as a member to a declaring type" className) + + let fullName = + lazy + match container with + | TypeContainer.Type declaringType -> declaringType.FullName + "+" + className + | TypeContainer.Namespace (_,namespaceName) -> + if namespaceName="" then failwith "use null for global namespace" + match namespaceName with + | null -> className + | _ -> namespaceName + "." + className + | TypeContainer.TypeToBeDecided -> failwith (sprintf "type '%s' was not added as a member to a declaring type" className) + + let patchUpAddedMemberInfo (this:Type) (m:MemberInfo) = + match m with + | :? ProvidedConstructor as c -> c.DeclaringTypeImpl <- this // patch up "declaring type" on provided MethodInfo + | :? ProvidedMethod as m -> m.DeclaringTypeImpl <- this // patch up "declaring type" on provided MethodInfo + | :? ProvidedProperty as p -> p.DeclaringTypeImpl <- this // patch up "declaring type" on provided MethodInfo + | :? ProvidedEvent as e -> e.DeclaringTypeImpl <- this // patch up "declaring type" on provided MethodInfo + | :? ProvidedTypeDefinition as t -> t.DeclaringTypeImpl <- this + | :? ProvidedLiteralField as l -> l.DeclaringTypeImpl <- this + | :? ProvidedField as l -> l.DeclaringTypeImpl <- this + | _ -> () + + let customAttributesImpl = CustomAttributesImpl() + + member __.AddXmlDocComputed xmlDocFunction = customAttributesImpl.AddXmlDocComputed xmlDocFunction + member __.AddXmlDocDelayed xmlDocFunction = customAttributesImpl.AddXmlDocDelayed xmlDocFunction + member __.AddXmlDoc xmlDoc = customAttributesImpl.AddXmlDoc xmlDoc + member __.AddObsoleteAttribute (message,?isError) = customAttributesImpl.AddObsolete (message,defaultArg isError false) + member __.AddDefinitionLocation(line,column,filePath) = customAttributesImpl.AddDefinitionLocation(line, column, filePath) + member __.HideObjectMethods with set v = customAttributesImpl.HideObjectMethods <- v + member __.NonNullable with set v = customAttributesImpl.NonNullable <- v + member __.GetCustomAttributesDataImpl() = customAttributesImpl.GetCustomAttributesData() + member __.AddCustomAttribute attribute = customAttributesImpl.AddCustomAttribute attribute +#if FX_NO_CUSTOMATTRIBUTEDATA +#else + override __.GetCustomAttributesData() = customAttributesImpl.GetCustomAttributesData() +#endif + + member __.ResetEnclosingType (ty) = + container <- TypeContainer.Type ty + new (assembly:Assembly,namespaceName,className,baseType) = new ProvidedTypeDefinition(TypeContainer.Namespace (assembly,namespaceName), className, baseType) + new (className,baseType) = new ProvidedTypeDefinition(TypeContainer.TypeToBeDecided, className, baseType) + // state ops + + override __.UnderlyingSystemType = typeof + + member __.SetEnumUnderlyingType(ty) = enumUnderlyingType <- ty + + override __.GetEnumUnderlyingType() = if this.IsEnum then enumUnderlyingType else invalidOp "not enum type" + + member __.SetBaseType t = baseType <- lazy Some t + + member __.SetBaseTypeDelayed baseTypeFunction = baseType <- lazy (Some (baseTypeFunction())) + + member __.SetAttributes x = attributes <- x + + // Add MemberInfos + member __.AddMembersDelayed(membersFunction : unit -> list<#MemberInfo>) = + membersQueue.Add (fun () -> membersFunction() |> List.map (fun x -> patchUpAddedMemberInfo this x; x :> MemberInfo )) + + member __.AddMembers(memberInfos:list<#MemberInfo>) = (* strict *) + memberInfos |> List.iter (patchUpAddedMemberInfo this) // strict: patch up now + membersQueue.Add (fun () -> memberInfos |> List.map (fun x -> x :> MemberInfo)) + + member __.AddMember(memberInfo:MemberInfo) = + this.AddMembers [memberInfo] + + member __.AddMemberDelayed(memberFunction : unit -> #MemberInfo) = + this.AddMembersDelayed(fun () -> [memberFunction()]) + + member __.AddAssemblyTypesAsNestedTypesDelayed (assemblyf : unit -> System.Reflection.Assembly) = + let bucketByPath nodef tipf (items: (string list * 'Value) list) = + // Find all the items with an empty key list and call 'tipf' + let tips = + [ for (keylist,v) in items do + match keylist with + | [] -> yield tipf v + | _ -> () ] + + // Find all the items with a non-empty key list. Bucket them together by + // the first key. For each bucket, call 'nodef' on that head key and the bucket. + let nodes = + let buckets = new Dictionary<_,_>(10) + for (keylist,v) in items do + match keylist with + | [] -> () + | key::rest -> + buckets.[key] <- (rest,v) :: (if buckets.ContainsKey key then buckets.[key] else []); + + [ for (KeyValue(key,items)) in buckets -> nodef key items ] + + tips @ nodes + this.AddMembersDelayed (fun _ -> + let topTypes = [ for ty in assemblyf().GetTypes() do + if not ty.IsNested then + let namespaceParts = match ty.Namespace with null -> [] | s -> s.Split '.' |> Array.toList + yield namespaceParts, ty ] + let rec loop types = + types + |> bucketByPath + (fun namespaceComponent typesUnderNamespaceComponent -> + let t = ProvidedTypeDefinition(namespaceComponent, baseType = Some typeof) + t.AddMembers (loop typesUnderNamespaceComponent) + (t :> Type)) + (fun ty -> ty) + loop topTypes) + + /// Abstract a type to a parametric-type. Requires "formal parameters" and "instantiation function". + member __.DefineStaticParameters(staticParameters : list, apply : (string -> obj[] -> ProvidedTypeDefinition)) = + staticParams <- staticParameters + staticParamsApply <- Some apply + + /// Get ParameterInfo[] for the parametric type parameters (//s GetGenericParameters) + member __.GetStaticParameters() = [| for p in staticParams -> p :> ParameterInfo |] + + /// Instantiate parametrics type + member __.MakeParametricType(name:string,args:obj[]) = + if staticParams.Length>0 then + if staticParams.Length <> args.Length then + failwith (sprintf "ProvidedTypeDefinition: expecting %d static parameters but given %d for type %s" staticParams.Length args.Length (fullName.Force())) + match staticParamsApply with + | None -> failwith "ProvidedTypeDefinition: DefineStaticParameters was not called" + | Some f -> f name args + + else + failwith (sprintf "ProvidedTypeDefinition: static parameters supplied but not expected for %s" (fullName.Force())) + + member __.DeclaringTypeImpl + with set x = + match container with TypeContainer.TypeToBeDecided -> () | _ -> failwith (sprintf "container type for '%s' was already set to '%s'" this.FullName x.FullName); + container <- TypeContainer.Type x + + // Implement overloads + override __.Assembly = theAssembly.Force() + + member __.SetAssembly assembly = theAssembly <- lazy assembly + + member __.SetAssemblyLazy assembly = theAssembly <- assembly + + override __.FullName = fullName.Force() + + override __.Namespace = rootNamespace.Force() + + override __.BaseType = match baseType.Value with Some ty -> ty | None -> null + + // Constructors + override __.GetConstructors bindingAttr = + [| for m in this.GetMembers bindingAttr do + if m.MemberType = MemberTypes.Constructor then + yield (m :?> ConstructorInfo) |] + // Methods + override __.GetMethodImpl(name, bindingAttr, _binderBinder, _callConvention, _types, _modifiers) : MethodInfo = + let membersWithName = + [ for m in this.GetMembers(bindingAttr) do + if m.MemberType.HasFlag(MemberTypes.Method) && m.Name = name then + yield m ] + match membersWithName with + | [] -> null + | [meth] -> meth :?> MethodInfo + | _several -> failwith "GetMethodImpl. not support overloads" + + override __.GetMethods bindingAttr = + this.GetMembers bindingAttr + |> Array.filter (fun m -> m.MemberType.HasFlag(MemberTypes.Method)) + |> Array.map (fun m -> m :?> MethodInfo) + + // Fields + override __.GetField(name, bindingAttr) = + let fields = [| for m in this.GetMembers bindingAttr do + if m.MemberType.HasFlag(MemberTypes.Field) && (name = null || m.Name = name) then // REVIEW: name = null. Is that a valid query?! + yield m |] + if fields.Length > 0 then fields.[0] :?> FieldInfo else null + + override __.GetFields bindingAttr = + [| for m in this.GetMembers bindingAttr do if m.MemberType.HasFlag(MemberTypes.Field) then yield m :?> FieldInfo |] + + override __.GetInterface(_name, _ignoreCase) = notRequired "GetInterface" this.Name + + override __.GetInterfaces() = + [| yield! getInterfaces() |] + + member __.GetInterfaceImplementations() = + [| yield! getInterfaces() |] + + member __.AddInterfaceImplementation ityp = interfaceImpls.Add ityp + + member __.AddInterfaceImplementationsDelayed itypf = interfaceImplsDelayed.Add itypf + + member __.GetMethodOverrides() = + [| yield! methodOverrides |] + + member __.DefineMethodOverride (bodyMethInfo,declMethInfo) = methodOverrides.Add (bodyMethInfo, declMethInfo) + + // Events + override __.GetEvent(name, bindingAttr) = + let events = this.GetMembers bindingAttr + |> Array.filter(fun m -> m.MemberType.HasFlag(MemberTypes.Event) && (name = null || m.Name = name)) + if events.Length > 0 then events.[0] :?> EventInfo else null + + override __.GetEvents bindingAttr = + [| for m in this.GetMembers bindingAttr do if m.MemberType.HasFlag(MemberTypes.Event) then yield downcast m |] + + // Properties + override __.GetProperties bindingAttr = + [| for m in this.GetMembers bindingAttr do if m.MemberType.HasFlag(MemberTypes.Property) then yield downcast m |] + + override __.GetPropertyImpl(name, bindingAttr, binder, returnType, types, modifiers) = + if returnType <> null then failwith "Need to handle specified return type in GetPropertyImpl" + if types <> null then failwith "Need to handle specified parameter types in GetPropertyImpl" + if modifiers <> null then failwith "Need to handle specified modifiers in GetPropertyImpl" + if binder <> null then failwith "Need to handle binder in GetPropertyImpl" + let props = this.GetMembers bindingAttr |> Array.filter(fun m -> m.MemberType.HasFlag(MemberTypes.Property) && (name = null || m.Name = name)) // Review: nam = null, valid query!? + if props.Length > 0 then + props.[0] :?> PropertyInfo + else + null + // Nested Types + override __.MakeArrayType() = ProvidedSymbolType(SymbolKind.SDArray, [this]) :> Type + override __.MakeArrayType arg = ProvidedSymbolType(SymbolKind.Array arg, [this]) :> Type + override __.MakePointerType() = ProvidedSymbolType(SymbolKind.Pointer, [this]) :> Type + override __.MakeByRefType() = ProvidedSymbolType(SymbolKind.ByRef, [this]) :> Type + + // FSharp.Data addition: this method is used by Debug.fs and QuotationBuilder.fs + // Emulate the F# type provider type erasure mechanism to get the + // actual (erased) type. We erase ProvidedTypes to their base type + // and we erase array of provided type to array of base type. In the + // case of generics all the generic type arguments are also recursively + // replaced with the erased-to types + static member EraseType(t:Type) = + match t with + | :? ProvidedTypeDefinition -> ProvidedTypeDefinition.EraseType t.BaseType + | :? ProvidedSymbolType as sym -> + match sym.Kind, sym.Args with + | SymbolKind.SDArray, [typ] -> + let (t:Type) = ProvidedTypeDefinition.EraseType typ + t.MakeArrayType() + | SymbolKind.Generic genericTypeDefinition, _ when not genericTypeDefinition.IsGenericTypeDefinition -> + // Unit of measure parameters can match here, but not really generic types. + genericTypeDefinition.UnderlyingSystemType + | SymbolKind.Generic genericTypeDefinition, typeArgs -> + let genericArguments = + typeArgs + |> List.toArray + |> Array.map ProvidedTypeDefinition.EraseType + genericTypeDefinition.MakeGenericType(genericArguments) + | _ -> failwith "getTypeErasedTo: Unsupported ProvidedSymbolType" + | t when t.IsGenericType && not t.IsGenericTypeDefinition -> + let genericTypeDefinition = t.GetGenericTypeDefinition() + let genericArguments = + t.GetGenericArguments() + |> Array.map ProvidedTypeDefinition.EraseType + genericTypeDefinition.MakeGenericType(genericArguments) + | t -> t + + static member Logger : (string -> unit) option ref = ref None + + // The binding attributes are always set to DeclaredOnly ||| Static ||| Instance ||| Public when GetMembers is called directly by the F# compiler + // However, it's possible for the framework to generate other sets of flags in some corner cases (e.g. via use of `enum` with a provided type as the target) + override __.GetMembers bindingAttr = + let mems = + getMembers() + |> Array.filter (fun mem -> + let isStatic, isPublic = + match mem with + | :? FieldInfo as f -> f.IsStatic, f.IsPublic + | :? MethodInfo as m -> m.IsStatic, m.IsPublic + | :? ConstructorInfo as c -> c.IsStatic, c.IsPublic + | :? PropertyInfo as p -> + let m = if p.CanRead then p.GetGetMethod() else p.GetSetMethod() + m.IsStatic, m.IsPublic + | :? EventInfo as e -> + let m = e.GetAddMethod() + m.IsStatic, m.IsPublic + | :? Type as ty -> + true, ty.IsNestedPublic + | _ -> failwith (sprintf "Member %O is of unexpected type" mem) + bindingAttr.HasFlag(if isStatic then BindingFlags.Static else BindingFlags.Instance) && + ( + (bindingAttr.HasFlag(BindingFlags.Public) && isPublic) || (bindingAttr.HasFlag(BindingFlags.NonPublic) && not isPublic) + )) + + if bindingAttr.HasFlag(BindingFlags.DeclaredOnly) || this.BaseType = null then mems + else + // FSharp.Data change: just using this.BaseType is not enough in the case of CsvProvider, + // because the base type is CsvRow, so we have to erase recursively to CsvRow + let baseMems = (ProvidedTypeDefinition.EraseType this.BaseType).GetMembers bindingAttr + Array.append mems baseMems + + override __.GetNestedTypes bindingAttr = + this.GetMembers bindingAttr + |> Array.filter(fun m -> + m.MemberType.HasFlag(MemberTypes.NestedType) || + // Allow 'fake' nested types that are actually real .NET types + m.MemberType.HasFlag(MemberTypes.TypeInfo)) |> Array.map(fun m -> m :?> Type) + + override __.GetMember(name,mt,_bindingAttr) = + let mt = + if mt &&& MemberTypes.NestedType = MemberTypes.NestedType then + mt ||| MemberTypes.TypeInfo + else + mt + getMembers() |> Array.filter(fun m->0<>(int(m.MemberType &&& mt)) && m.Name = name) + + override __.GetNestedType(name, bindingAttr) = + let nt = this.GetMember(name, MemberTypes.NestedType ||| MemberTypes.TypeInfo, bindingAttr) + match nt.Length with + | 0 -> null + | 1 -> downcast nt.[0] + | _ -> failwith (sprintf "There is more than one nested type called '%s' in type '%s'" name this.FullName) + + // Attributes, etc.. + override __.GetAttributeFlagsImpl() = adjustTypeAttributes attributes this.IsNested + override __.IsArrayImpl() = false + override __.IsByRefImpl() = false + override __.IsPointerImpl() = false + override __.IsPrimitiveImpl() = false + override __.IsCOMObjectImpl() = false + override __.HasElementTypeImpl() = false + override __.Name = className + override __.DeclaringType = declaringType.Force() + override __.MemberType = if this.IsNested then MemberTypes.NestedType else MemberTypes.TypeInfo + override __.GetHashCode() = rootNamespace.GetHashCode() ^^^ className.GetHashCode() + override __.Equals(that:obj) = + match that with + | null -> false + | :? ProvidedTypeDefinition as ti -> System.Object.ReferenceEquals(this,ti) + | _ -> false + + override __.GetGenericArguments() = [||] + override __.ToString() = this.Name + + + override __.Module : Module = notRequired "Module" this.Name + override __.GUID = Guid.Empty + override __.GetConstructorImpl(_bindingAttr, _binder, _callConvention, _types, _modifiers) = null + override __.GetCustomAttributes(_inherit) = [| |] + override __.GetCustomAttributes(_attributeType, _inherit) = [| |] + override __.IsDefined(_attributeType: Type, _inherit) = false + + override __.GetElementType() = notRequired "Module" this.Name + override __.InvokeMember(_name, _invokeAttr, _binder, _target, _args, _modifiers, _culture, _namedParameters) = notRequired "Module" this.Name + override __.AssemblyQualifiedName = notRequired "Module" this.Name + member __.IsErased + with get() = (attributes &&& enum (int32 TypeProviderTypeAttributes.IsErased)) <> enum 0 + and set v = + if v then attributes <- attributes ||| enum (int32 TypeProviderTypeAttributes.IsErased) + else attributes <- attributes &&& ~~~(enum (int32 TypeProviderTypeAttributes.IsErased)) + + member __.SuppressRelocation + with get() = (attributes &&& enum (int32 TypeProviderTypeAttributes.SuppressRelocate)) <> enum 0 + and set v = + if v then attributes <- attributes ||| enum (int32 TypeProviderTypeAttributes.SuppressRelocate) + else attributes <- attributes &&& ~~~(enum (int32 TypeProviderTypeAttributes.SuppressRelocate)) + +type AssemblyGenerator(assemblyFileName) = + let assemblyShortName = Path.GetFileNameWithoutExtension assemblyFileName + let assemblyName = AssemblyName assemblyShortName +#if FX_NO_LOCAL_FILESYSTEM + let assembly = + System.AppDomain.CurrentDomain.DefineDynamicAssembly(name=assemblyName,access=AssemblyBuilderAccess.Run) + let assemblyMainModule = + assembly.DefineDynamicModule("MainModule") +#else + let assembly = + System.AppDomain.CurrentDomain.DefineDynamicAssembly(name=assemblyName,access=(AssemblyBuilderAccess.Save ||| AssemblyBuilderAccess.Run),dir=Path.GetDirectoryName assemblyFileName) + let assemblyMainModule = + assembly.DefineDynamicModule("MainModule", Path.GetFileName assemblyFileName) +#endif + let typeMap = Dictionary(HashIdentity.Reference) + let typeMapExtra = Dictionary(HashIdentity.Structural) + let uniqueLambdaTypeName() = + // lambda name should be unique across all types that all type provider might contribute in result assembly + sprintf "Lambda%O" (Guid.NewGuid()) + + member __.Assembly = assembly :> Assembly + + /// Emit the given provided type definitions into an assembly and adjust 'Assembly' property of all type definitions to return that + /// assembly. + member __.Generate(providedTypeDefinitions:(ProvidedTypeDefinition * string list option) list) = + let ALL = BindingFlags.Public ||| BindingFlags.NonPublic ||| BindingFlags.Static ||| BindingFlags.Instance + // phase 1 - set assembly fields and emit type definitions + begin + let rec typeMembers (tb:TypeBuilder) (td : ProvidedTypeDefinition) = + for ntd in td.GetNestedTypes(ALL) do + nestedType tb ntd + + and nestedType (tb:TypeBuilder) (ntd : Type) = + match ntd with + | :? ProvidedTypeDefinition as pntd -> + if pntd.IsErased then invalidOp ("The nested provided type "+pntd.Name+"is marked as erased and cannot be converted to a generated type. Set 'IsErased' to false on the ProvidedTypeDefinition") + // Adjust the attributes - we're codegen'ing this type as nested + let attributes = adjustTypeAttributes ntd.Attributes true + let ntb = tb.DefineNestedType(pntd.Name,attr=attributes) + pntd.SetAssembly null + typeMap.[pntd] <- ntb + typeMembers ntb pntd + | _ -> () + + for (pt,enclosingGeneratedTypeNames) in providedTypeDefinitions do + match enclosingGeneratedTypeNames with + | None -> + // Filter out the additional TypeProviderTypeAttributes flags + let attributes = pt.Attributes &&& ~~~(enum (int32 TypeProviderTypeAttributes.SuppressRelocate)) + &&& ~~~(enum (int32 TypeProviderTypeAttributes.IsErased)) + // Adjust the attributes - we're codegen'ing as non-nested + let attributes = adjustTypeAttributes attributes false + let tb = assemblyMainModule.DefineType(name=pt.FullName,attr=attributes) + pt.SetAssembly null + typeMap.[pt] <- tb + typeMembers tb pt + | Some ns -> + let otb,_ = + ((None,""),ns) ||> List.fold (fun (otb:TypeBuilder option,fullName) n -> + let fullName = if fullName = "" then n else fullName + "." + n + let priorType = if typeMapExtra.ContainsKey(fullName) then Some typeMapExtra.[fullName] else None + let tb = + match priorType with + | Some tbb -> tbb + | None -> + // OK, the implied nested type is not defined, define it now + let attributes = + TypeAttributes.Public ||| + TypeAttributes.Class ||| + TypeAttributes.Sealed + // Filter out the additional TypeProviderTypeAttributes flags + let attributes = adjustTypeAttributes attributes otb.IsSome + let tb = + match otb with + | None -> assemblyMainModule.DefineType(name=n,attr=attributes) + | Some (otb:TypeBuilder) -> otb.DefineNestedType(name=n,attr=attributes) + typeMapExtra.[fullName] <- tb + tb + (Some tb, fullName)) + nestedType otb.Value pt + end + let rec convType (ty:Type) = + match ty with + | :? ProvidedTypeDefinition as ptd -> + if typeMap.ContainsKey ptd then typeMap.[ptd] :> Type else ty + | _ -> + if ty.IsGenericType then ty.GetGenericTypeDefinition().MakeGenericType (Array.map convType (ty.GetGenericArguments())) + elif ty.HasElementType then + let ety = convType (ty.GetElementType()) + if ty.IsArray then + let rank = ty.GetArrayRank() + if rank = 1 then ety.MakeArrayType() + else ety.MakeArrayType rank + elif ty.IsPointer then ety.MakePointerType() + elif ty.IsByRef then ety.MakeByRefType() + else ty + else ty + + let ctorMap = Dictionary(HashIdentity.Reference) + let methMap = Dictionary(HashIdentity.Reference) + let fieldMap = Dictionary(HashIdentity.Reference) + + let iterateTypes f = + let rec typeMembers (ptd : ProvidedTypeDefinition) = + let tb = typeMap.[ptd] + f tb (Some ptd) + for ntd in ptd.GetNestedTypes(ALL) do + nestedType ntd + + and nestedType (ntd : Type) = + match ntd with + | :? ProvidedTypeDefinition as pntd -> typeMembers pntd + | _ -> () + + for (pt,enclosingGeneratedTypeNames) in providedTypeDefinitions do + match enclosingGeneratedTypeNames with + | None -> + typeMembers pt + | Some ns -> + let _fullName = + ("",ns) ||> List.fold (fun fullName n -> + let fullName = if fullName = "" then n else fullName + "." + n + f typeMapExtra.[fullName] None + fullName) + nestedType pt + + + // phase 1b - emit base types + iterateTypes (fun tb ptd -> + match ptd with + | None -> () + | Some ptd -> + match ptd.BaseType with null -> () | bt -> tb.SetParent(convType bt)) + + let defineCustomAttrs f (cattrs: IList) = + for attr in cattrs do + let constructorArgs = [ for x in attr.ConstructorArguments -> x.Value ] + let namedProps,namedPropVals = [ for x in attr.NamedArguments do match x.MemberInfo with :? PropertyInfo as pi -> yield (pi, x.TypedValue.Value) | _ -> () ] |> List.unzip + let namedFields,namedFieldVals = [ for x in attr.NamedArguments do match x.MemberInfo with :? FieldInfo as pi -> yield (pi, x.TypedValue.Value) | _ -> () ] |> List.unzip + let cab = CustomAttributeBuilder(attr.Constructor, Array.ofList constructorArgs, Array.ofList namedProps, Array.ofList namedPropVals, Array.ofList namedFields, Array.ofList namedFieldVals) + f cab + + // phase 2 - emit member definitions + iterateTypes (fun tb ptd -> + match ptd with + | None -> () + | Some ptd -> + for cinfo in ptd.GetConstructors(ALL) do + match cinfo with + | :? ProvidedConstructor as pcinfo when not (ctorMap.ContainsKey pcinfo) -> + let cb = + if pcinfo.IsTypeInitializer then + if (cinfo.GetParameters()).Length <> 0 then failwith "Type initializer should not have parameters" + tb.DefineTypeInitializer() + else + let cb = tb.DefineConstructor(cinfo.Attributes, CallingConventions.Standard, [| for p in cinfo.GetParameters() -> convType p.ParameterType |]) + for (i,p) in cinfo.GetParameters() |> Seq.mapi (fun i x -> (i,x)) do + cb.DefineParameter(i+1, ParameterAttributes.None, p.Name) |> ignore + cb + ctorMap.[pcinfo] <- cb + | _ -> () + + if ptd.IsEnum then + tb.DefineField("value__", ptd.GetEnumUnderlyingType(), FieldAttributes.Public ||| FieldAttributes.SpecialName ||| FieldAttributes.RTSpecialName) + |> ignore + + for finfo in ptd.GetFields(ALL) do + let fieldInfo = + match finfo with + | :? ProvidedField as pinfo -> + Some (pinfo.Name, convType finfo.FieldType, finfo.Attributes, pinfo.GetCustomAttributesDataImpl(), None) + | :? ProvidedLiteralField as pinfo -> + Some (pinfo.Name, convType finfo.FieldType, finfo.Attributes, pinfo.GetCustomAttributesDataImpl(), Some (pinfo.GetRawConstantValue())) + | _ -> None + match fieldInfo with + | Some (name, ty, attr, cattr, constantVal) when not (fieldMap.ContainsKey finfo) -> + let fb = tb.DefineField(name, ty, attr) + if constantVal.IsSome then + fb.SetConstant constantVal.Value + defineCustomAttrs fb.SetCustomAttribute cattr + fieldMap.[finfo] <- fb + | _ -> () + for minfo in ptd.GetMethods(ALL) do + match minfo with + | :? ProvidedMethod as pminfo when not (methMap.ContainsKey pminfo) -> + let mb = tb.DefineMethod(minfo.Name, minfo.Attributes, convType minfo.ReturnType, [| for p in minfo.GetParameters() -> convType p.ParameterType |]) + for (i, p) in minfo.GetParameters() |> Seq.mapi (fun i x -> (i,x :?> ProvidedParameter)) do + // TODO: check why F# compiler doesn't emit default value when just p.Attributes is used (thus bad metadata is emitted) +// let mutable attrs = ParameterAttributes.None +// +// if p.IsOut then attrs <- attrs ||| ParameterAttributes.Out +// if p.HasDefaultParameterValue then attrs <- attrs ||| ParameterAttributes.Optional + + let pb = mb.DefineParameter(i+1, p.Attributes, p.Name) + if p.HasDefaultParameterValue then + do + let ctor = typeof.GetConstructor([|typeof|]) + let builder = new CustomAttributeBuilder(ctor, [|p.RawDefaultValue|]) + pb.SetCustomAttribute builder + do + let ctor = typeof.GetConstructor([||]) + let builder = new CustomAttributeBuilder(ctor, [||]) + pb.SetCustomAttribute builder + pb.SetConstant p.RawDefaultValue + methMap.[pminfo] <- mb + | _ -> () + + for ityp in ptd.GetInterfaceImplementations() do + tb.AddInterfaceImplementation ityp) + + // phase 3 - emit member code + iterateTypes (fun tb ptd -> + match ptd with + | None -> () + | Some ptd -> + let cattr = ptd.GetCustomAttributesDataImpl() + defineCustomAttrs tb.SetCustomAttribute cattr + // Allow at most one constructor, and use its arguments as the fields of the type + let ctors = + ptd.GetConstructors(ALL) // exclude type initializer + |> Seq.choose (function :? ProvidedConstructor as pcinfo when not pcinfo.IsTypeInitializer -> Some pcinfo | _ -> None) + |> Seq.toList + let implictCtorArgs = + match ctors |> List.filter (fun x -> x.IsImplicitCtor) with + | [] -> [] + | [ pcinfo ] -> [ for p in pcinfo.GetParameters() -> p ] + | _ -> failwith "at most one implicit constructor allowed" + + let implicitCtorArgsAsFields = + [ for ctorArg in implictCtorArgs -> + tb.DefineField(ctorArg.Name, convType ctorArg.ParameterType, FieldAttributes.Private) ] + + let rec emitLambda(callSiteIlg : ILGenerator, v : Quotations.Var, body : Quotations.Expr, freeVars : seq, locals : Dictionary<_, LocalBuilder>, parameters) = + let lambda = assemblyMainModule.DefineType(uniqueLambdaTypeName(), TypeAttributes.Class) + let baseType = typedefof>.MakeGenericType(v.Type, body.Type) + lambda.SetParent(baseType) + let ctor = lambda.DefineDefaultConstructor(MethodAttributes.Public) + let decl = baseType.GetMethod "Invoke" + let paramTypes = [| for p in decl.GetParameters() -> p.ParameterType |] + let invoke = lambda.DefineMethod("Invoke", MethodAttributes.Virtual ||| MethodAttributes.Final ||| MethodAttributes.Public, decl.ReturnType, paramTypes) + lambda.DefineMethodOverride(invoke, decl) + + // promote free vars to fields + let fields = ResizeArray() + for v in freeVars do + let f = lambda.DefineField(v.Name, v.Type, FieldAttributes.Assembly) + fields.Add(v, f) + + let copyOfLocals = Dictionary() + + let ilg = invoke.GetILGenerator() + for (v, f) in fields do + let l = ilg.DeclareLocal(v.Type) + ilg.Emit(OpCodes.Ldarg_0) + ilg.Emit(OpCodes.Ldfld, f) + ilg.Emit(OpCodes.Stloc, l) + copyOfLocals.[v] <- l + + let expectedState = if (invoke.ReturnType = typeof) then ExpectedStackState.Empty else ExpectedStackState.Value + emitExpr (ilg, copyOfLocals, [| Quotations.Var("this", lambda); v|]) expectedState body + ilg.Emit(OpCodes.Ret) + + lambda.CreateType() |> ignore + + callSiteIlg.Emit(OpCodes.Newobj, ctor) + for (v, f) in fields do + callSiteIlg.Emit(OpCodes.Dup) + match locals.TryGetValue v with + | true, loc -> + callSiteIlg.Emit(OpCodes.Ldloc, loc) + | false, _ -> + let index = parameters |> Array.findIndex ((=) v) + callSiteIlg.Emit(OpCodes.Ldarg, index) + callSiteIlg.Emit(OpCodes.Stfld, f) + + and emitExpr (ilg: ILGenerator, locals:Dictionary, parameterVars) expectedState expr = + let pop () = ilg.Emit(OpCodes.Pop) + let popIfEmptyExpected s = if isEmpty s then pop() + let emitConvIfNecessary t1 = + if t1 = typeof then + ilg.Emit(OpCodes.Conv_I2) + elif t1 = typeof then + ilg.Emit(OpCodes.Conv_U2) + elif t1 = typeof then + ilg.Emit(OpCodes.Conv_I1) + elif t1 = typeof then + ilg.Emit(OpCodes.Conv_U1) + /// emits given expression to corresponding IL + let rec emit (expectedState : ExpectedStackState) (expr: Quotations.Expr) = + match expr with + | Quotations.Patterns.ForIntegerRangeLoop(loopVar, first, last, body) -> + // for(loopVar = first..last) body + let lb = + match locals.TryGetValue loopVar with + | true, lb -> lb + | false, _ -> + let lb = ilg.DeclareLocal(convType loopVar.Type) + locals.Add(loopVar, lb) + lb + + // loopVar = first + emit ExpectedStackState.Value first + ilg.Emit(OpCodes.Stloc, lb) + + let before = ilg.DefineLabel() + let after = ilg.DefineLabel() + + ilg.MarkLabel before + ilg.Emit(OpCodes.Ldloc, lb) + + emit ExpectedStackState.Value last + ilg.Emit(OpCodes.Bgt, after) + + emit ExpectedStackState.Empty body + + // loopVar++ + ilg.Emit(OpCodes.Ldloc, lb) + ilg.Emit(OpCodes.Ldc_I4_1) + ilg.Emit(OpCodes.Add) + ilg.Emit(OpCodes.Stloc, lb) + + ilg.Emit(OpCodes.Br, before) + ilg.MarkLabel(after) + + | Quotations.Patterns.NewArray(elementTy, elements) -> + ilg.Emit(OpCodes.Ldc_I4, List.length elements) + ilg.Emit(OpCodes.Newarr, convType elementTy) + + elements + |> List.iteri (fun i el -> + ilg.Emit(OpCodes.Dup) + ilg.Emit(OpCodes.Ldc_I4, i) + emit ExpectedStackState.Value el + ilg.Emit(OpCodes.Stelem, convType elementTy) + ) + + popIfEmptyExpected expectedState + + | Quotations.Patterns.WhileLoop(cond, body) -> + let before = ilg.DefineLabel() + let after = ilg.DefineLabel() + + ilg.MarkLabel before + emit ExpectedStackState.Value cond + ilg.Emit(OpCodes.Brfalse, after) + emit ExpectedStackState.Empty body + ilg.Emit(OpCodes.Br, before) + + ilg.MarkLabel after + + | Quotations.Patterns.Var v -> + if isEmpty expectedState then () else + let methIdx = parameterVars |> Array.tryFindIndex (fun p -> p = v) + match methIdx with + | Some idx -> + ilg.Emit((if isAddress expectedState then OpCodes.Ldarga else OpCodes.Ldarg), idx) + | None -> + let implicitCtorArgFieldOpt = implicitCtorArgsAsFields |> List.tryFind (fun f -> f.Name = v.Name) + match implicitCtorArgFieldOpt with + | Some ctorArgField -> + ilg.Emit(OpCodes.Ldarg_0) + ilg.Emit(OpCodes.Ldfld, ctorArgField) + | None -> + match locals.TryGetValue v with + | true, localBuilder -> + ilg.Emit((if isAddress expectedState then OpCodes.Ldloca else OpCodes.Ldloc), localBuilder.LocalIndex) + | false, _ -> + failwith "unknown parameter/field" + + | Quotations.Patterns.Coerce (arg,ty) -> + // castClass may lead to observable side-effects - InvalidCastException + emit ExpectedStackState.Value arg + let argTy = convType arg.Type + let targetTy = convType ty + if argTy.IsValueType && not targetTy.IsValueType then + ilg.Emit(OpCodes.Box, argTy) + elif not argTy.IsValueType && targetTy.IsValueType then + ilg.Emit(OpCodes.Unbox_Any, targetTy) + // emit castclass if + // - targettype is not obj (assume this is always possible for ref types) + // AND + // - HACK: targettype is TypeBuilderInstantiationType + // (its implementation of IsAssignableFrom raises NotSupportedException so it will be safer to always emit castclass) + // OR + // - not (argTy :> targetTy) + elif targetTy <> typeof && (Misc.TypeBuilderInstantiationType.Equals(targetTy.GetType()) || not (targetTy.IsAssignableFrom(argTy))) then + ilg.Emit(OpCodes.Castclass, targetTy) + + popIfEmptyExpected expectedState + | Quotations.DerivedPatterns.SpecificCall <@ (-) @>(None, [t1; t2; _], [a1; a2]) -> + assert(t1 = t2) + emit ExpectedStackState.Value a1 + emit ExpectedStackState.Value a2 + if t1 = typeof then + ilg.Emit(OpCodes.Call, typeof.GetMethod "op_Subtraction") + else + ilg.Emit(OpCodes.Sub) + emitConvIfNecessary t1 + + popIfEmptyExpected expectedState + + | Quotations.DerivedPatterns.SpecificCall <@ (/) @> (None, [t1; t2; _], [a1; a2]) -> + assert (t1 = t2) + emit ExpectedStackState.Value a1 + emit ExpectedStackState.Value a2 + if t1 = typeof then + ilg.Emit(OpCodes.Call, typeof.GetMethod "op_Division") + else + match Type.GetTypeCode t1 with + | TypeCode.UInt32 + | TypeCode.UInt64 + | TypeCode.UInt16 + | TypeCode.Byte + | _ when t1 = typeof -> ilg.Emit (OpCodes.Div_Un) + | _ -> ilg.Emit(OpCodes.Div) + + emitConvIfNecessary t1 + + popIfEmptyExpected expectedState + + | Quotations.DerivedPatterns.SpecificCall <@ int @>(None, [sourceTy], [v]) -> + emit ExpectedStackState.Value v + match Type.GetTypeCode(sourceTy) with + | TypeCode.String -> + ilg.Emit(OpCodes.Call, Misc.ParseInt32Method) + | TypeCode.Single + | TypeCode.Double + | TypeCode.Int64 + | TypeCode.UInt64 + | TypeCode.UInt16 + | TypeCode.Char + | TypeCode.Byte + | _ when sourceTy = typeof || sourceTy = typeof -> + ilg.Emit(OpCodes.Conv_I4) + | TypeCode.Int32 + | TypeCode.UInt32 + | TypeCode.Int16 + | TypeCode.SByte -> () // no op + | _ -> failwith "TODO: search for op_Explicit on sourceTy" + + | Quotations.DerivedPatterns.SpecificCall <@ LanguagePrimitives.IntrinsicFunctions.GetArray @> (None, [ty], [arr; index]) -> + // observable side-effect - IndexOutOfRangeException + emit ExpectedStackState.Value arr + emit ExpectedStackState.Value index + if isAddress expectedState then + ilg.Emit(OpCodes.Readonly) + ilg.Emit(OpCodes.Ldelema, convType ty) + else + ilg.Emit(OpCodes.Ldelem, convType ty) + + popIfEmptyExpected expectedState + + | Quotations.DerivedPatterns.SpecificCall <@ LanguagePrimitives.IntrinsicFunctions.GetArray2D @> (None, _ty, arr::indices) + | Quotations.DerivedPatterns.SpecificCall <@ LanguagePrimitives.IntrinsicFunctions.GetArray3D @> (None, _ty, arr::indices) + | Quotations.DerivedPatterns.SpecificCall <@ LanguagePrimitives.IntrinsicFunctions.GetArray4D @> (None, _ty, arr::indices) -> + + let meth = + let name = if isAddress expectedState then "Address" else "Get" + arr.Type.GetMethod(name) + + // observable side-effect - IndexOutOfRangeException + emit ExpectedStackState.Value arr + for index in indices do + emit ExpectedStackState.Value index + + if isAddress expectedState then + ilg.Emit(OpCodes.Readonly) + + ilg.Emit(OpCodes.Call, meth) + + popIfEmptyExpected expectedState + + | Quotations.Patterns.FieldGet (objOpt,field) -> + match field with + | :? ProvidedLiteralField as plf when plf.DeclaringType.IsEnum -> + if expectedState <> ExpectedStackState.Empty then + emit expectedState (Quotations.Expr.Value(field.GetRawConstantValue(), field.FieldType.GetEnumUnderlyingType())) + | _ -> + match objOpt with + | None -> () + | Some e -> + let s = if e.Type.IsValueType then ExpectedStackState.Address else ExpectedStackState.Value + emit s e + let field = + match field with + | :? ProvidedField as pf when fieldMap.ContainsKey pf -> fieldMap.[pf] :> FieldInfo + | m -> m + if field.IsStatic then + ilg.Emit(OpCodes.Ldsfld, field) + else + ilg.Emit(OpCodes.Ldfld, field) + + | Quotations.Patterns.FieldSet (objOpt,field,v) -> + match objOpt with + | None -> () + | Some e -> + let s = if e.Type.IsValueType then ExpectedStackState.Address else ExpectedStackState.Value + emit s e + emit ExpectedStackState.Value v + let field = match field with :? ProvidedField as pf when fieldMap.ContainsKey pf -> fieldMap.[pf] :> FieldInfo | m -> m + if field.IsStatic then + ilg.Emit(OpCodes.Stsfld, field) + else + ilg.Emit(OpCodes.Stfld, field) + | Quotations.Patterns.Call (objOpt,meth,args) -> + match objOpt with + | None -> () + | Some e -> + let s = if e.Type.IsValueType then ExpectedStackState.Address else ExpectedStackState.Value + emit s e + for pe in args do + emit ExpectedStackState.Value pe + let getMeth (m:MethodInfo) = match m with :? ProvidedMethod as pm when methMap.ContainsKey pm -> methMap.[pm] :> MethodInfo | m -> m + // Handle the case where this is a generic method instantiated at a type being compiled + let mappedMeth = + if meth.IsGenericMethod then + let args = meth.GetGenericArguments() |> Array.map convType + let gmd = meth.GetGenericMethodDefinition() |> getMeth + gmd.GetGenericMethodDefinition().MakeGenericMethod args + elif meth.DeclaringType.IsGenericType then + let gdty = convType (meth.DeclaringType.GetGenericTypeDefinition()) + let gdtym = gdty.GetMethods() |> Seq.find (fun x -> x.Name = meth.Name) + assert (gdtym <> null) // ?? will never happen - if method is not found - KeyNotFoundException will be raised + let dtym = + match convType meth.DeclaringType with + | :? TypeBuilder as dty -> TypeBuilder.GetMethod(dty, gdtym) + | dty -> MethodBase.GetMethodFromHandle(meth.MethodHandle, dty.TypeHandle) :?> _ + + assert (dtym <> null) + dtym + else + getMeth meth + match objOpt with + | Some obj when mappedMeth.IsAbstract || mappedMeth.IsVirtual -> + if obj.Type.IsValueType then ilg.Emit(OpCodes.Constrained, convType obj.Type) + ilg.Emit(OpCodes.Callvirt, mappedMeth) + | _ -> + ilg.Emit(OpCodes.Call, mappedMeth) + + let returnTypeIsVoid = mappedMeth.ReturnType = typeof + match returnTypeIsVoid, (isEmpty expectedState) with + | false, true -> + // method produced something, but we don't need it + pop() + | true, false when expr.Type = typeof -> + // if we need result and method produce void and result should be unit - push null as unit value on stack + ilg.Emit(OpCodes.Ldnull) + | _ -> () + + | Quotations.Patterns.NewObject (ctor,args) -> + for pe in args do + emit ExpectedStackState.Value pe + let meth = match ctor with :? ProvidedConstructor as pc when ctorMap.ContainsKey pc -> ctorMap.[pc] :> ConstructorInfo | c -> c + ilg.Emit(OpCodes.Newobj, meth) + + popIfEmptyExpected expectedState + + | Quotations.Patterns.Value (obj, _ty) -> + let rec emitC (v:obj) = + match v with + | :? string as x -> ilg.Emit(OpCodes.Ldstr, x) + | :? int8 as x -> ilg.Emit(OpCodes.Ldc_I4, int32 x) + | :? uint8 as x -> ilg.Emit(OpCodes.Ldc_I4, int32 (int8 x)) + | :? int16 as x -> ilg.Emit(OpCodes.Ldc_I4, int32 x) + | :? uint16 as x -> ilg.Emit(OpCodes.Ldc_I4, int32 (int16 x)) + | :? int32 as x -> ilg.Emit(OpCodes.Ldc_I4, x) + | :? uint32 as x -> ilg.Emit(OpCodes.Ldc_I4, int32 x) + | :? int64 as x -> ilg.Emit(OpCodes.Ldc_I8, x) + | :? uint64 as x -> ilg.Emit(OpCodes.Ldc_I8, int64 x) + | :? char as x -> ilg.Emit(OpCodes.Ldc_I4, int32 x) + | :? bool as x -> ilg.Emit(OpCodes.Ldc_I4, if x then 1 else 0) + | :? float32 as x -> ilg.Emit(OpCodes.Ldc_R4, x) + | :? float as x -> ilg.Emit(OpCodes.Ldc_R8, x) +#if FX_NO_GET_ENUM_UNDERLYING_TYPE +#else + | :? System.Enum as x when x.GetType().GetEnumUnderlyingType() = typeof -> ilg.Emit(OpCodes.Ldc_I4, unbox v) +#endif + | :? Type as ty -> + ilg.Emit(OpCodes.Ldtoken, convType ty) + ilg.Emit(OpCodes.Call, Misc.GetTypeFromHandleMethod) + | :? decimal as x -> + let bits = System.Decimal.GetBits x + ilg.Emit(OpCodes.Ldc_I4, bits.[0]) + ilg.Emit(OpCodes.Ldc_I4, bits.[1]) + ilg.Emit(OpCodes.Ldc_I4, bits.[2]) + do + let sign = (bits.[3] &&& 0x80000000) <> 0 + ilg.Emit(if sign then OpCodes.Ldc_I4_1 else OpCodes.Ldc_I4_0) + do + let scale = byte ((bits.[3] >>> 16) &&& 0x7F) + ilg.Emit(OpCodes.Ldc_I4_S, scale) + ilg.Emit(OpCodes.Newobj, Misc.DecimalConstructor) + | :? DateTime as x -> + ilg.Emit(OpCodes.Ldc_I8, x.Ticks) + ilg.Emit(OpCodes.Ldc_I4, int x.Kind) + ilg.Emit(OpCodes.Newobj, Misc.DateTimeConstructor) + | :? DateTimeOffset as x -> + ilg.Emit(OpCodes.Ldc_I8, x.Ticks) + ilg.Emit(OpCodes.Ldc_I8, x.Offset.Ticks) + ilg.Emit(OpCodes.Newobj, Misc.TimeSpanConstructor) + ilg.Emit(OpCodes.Newobj, Misc.DateTimeOffsetConstructor) + | null -> ilg.Emit(OpCodes.Ldnull) + | _ -> failwithf "unknown constant '%A' in generated method" v + if isEmpty expectedState then () + else emitC obj + + | Quotations.Patterns.Let(v,e,b) -> + let lb = ilg.DeclareLocal (convType v.Type) + locals.Add (v, lb) + emit ExpectedStackState.Value e + ilg.Emit(OpCodes.Stloc, lb.LocalIndex) + emit expectedState b + + | Quotations.Patterns.Sequential(e1, e2) -> + emit ExpectedStackState.Empty e1 + emit expectedState e2 + + | Quotations.Patterns.IfThenElse(cond, ifTrue, ifFalse) -> + let ifFalseLabel = ilg.DefineLabel() + let endLabel = ilg.DefineLabel() + + emit ExpectedStackState.Value cond + + ilg.Emit(OpCodes.Brfalse, ifFalseLabel) + + emit expectedState ifTrue + ilg.Emit(OpCodes.Br, endLabel) + + ilg.MarkLabel(ifFalseLabel) + emit expectedState ifFalse + + ilg.Emit(OpCodes.Nop) + ilg.MarkLabel(endLabel) + + | Quotations.Patterns.TryWith(body, _filterVar, _filterBody, catchVar, catchBody) -> + + let stres, ldres = + if isEmpty expectedState then ignore, ignore + else + let local = ilg.DeclareLocal (convType body.Type) + let stres = fun () -> ilg.Emit(OpCodes.Stloc, local) + let ldres = fun () -> ilg.Emit(OpCodes.Ldloc, local) + stres, ldres + + let exceptionVar = ilg.DeclareLocal(convType catchVar.Type) + locals.Add(catchVar, exceptionVar) + + let _exnBlock = ilg.BeginExceptionBlock() + + emit expectedState body + stres() + + ilg.BeginCatchBlock(convType catchVar.Type) + ilg.Emit(OpCodes.Stloc, exceptionVar) + emit expectedState catchBody + stres() + ilg.EndExceptionBlock() + + ldres() + + | Quotations.Patterns.VarSet(v,e) -> + emit ExpectedStackState.Value e + match locals.TryGetValue v with + | true, localBuilder -> + ilg.Emit(OpCodes.Stloc, localBuilder.LocalIndex) + | false, _ -> + failwith "unknown parameter/field in assignment. Only assignments to locals are currently supported by TypeProviderEmit" + | Quotations.Patterns.Lambda(v, body) -> + emitLambda(ilg, v, body, expr.GetFreeVars(), locals, parameterVars) + popIfEmptyExpected expectedState + | n -> + failwith (sprintf "unknown expression '%A' in generated method" n) + emit expectedState expr + + + // Emit the constructor (if any) + for pcinfo in ctors do + assert ctorMap.ContainsKey pcinfo + let cb = ctorMap.[pcinfo] + let cattr = pcinfo.GetCustomAttributesDataImpl() + defineCustomAttrs cb.SetCustomAttribute cattr + let ilg = cb.GetILGenerator() + let locals = Dictionary() + let parameterVars = + [| yield Quotations.Var("this", pcinfo.DeclaringType) + for p in pcinfo.GetParameters() do + yield Quotations.Var(p.Name, p.ParameterType) |] + let parameters = + [| for v in parameterVars -> Quotations.Expr.Var v |] + match pcinfo.GetBaseConstructorCallInternal true with + | None -> + ilg.Emit(OpCodes.Ldarg_0) + let cinfo = ptd.BaseType.GetConstructor(BindingFlags.Public ||| BindingFlags.NonPublic ||| BindingFlags.Instance, null, [| |], null) + ilg.Emit(OpCodes.Call,cinfo) + | Some f -> + // argExprs should always include 'this' + let (cinfo,argExprs) = f (Array.toList parameters) + for argExpr in argExprs do + emitExpr (ilg, locals, parameterVars) ExpectedStackState.Value argExpr + ilg.Emit(OpCodes.Call,cinfo) + + if pcinfo.IsImplicitCtor then + for ctorArgsAsFieldIdx,ctorArgsAsField in List.mapi (fun i x -> (i,x)) implicitCtorArgsAsFields do + ilg.Emit(OpCodes.Ldarg_0) + ilg.Emit(OpCodes.Ldarg, ctorArgsAsFieldIdx+1) + ilg.Emit(OpCodes.Stfld, ctorArgsAsField) + else + let code = pcinfo.GetInvokeCodeInternal true + let code = code parameters + emitExpr (ilg, locals, parameterVars) ExpectedStackState.Empty code + ilg.Emit(OpCodes.Ret) + + match ptd.GetConstructors(ALL) |> Seq.tryPick (function :? ProvidedConstructor as pc when pc.IsTypeInitializer -> Some pc | _ -> None) with + | None -> () + | Some pc -> + let cb = ctorMap.[pc] + let ilg = cb.GetILGenerator() + let cattr = pc.GetCustomAttributesDataImpl() + defineCustomAttrs cb.SetCustomAttribute cattr + let expr = pc.GetInvokeCodeInternal true [||] + emitExpr(ilg, new Dictionary<_, _>(), [||]) ExpectedStackState.Empty expr + ilg.Emit OpCodes.Ret + + // Emit the methods + for minfo in ptd.GetMethods(ALL) do + match minfo with + | :? ProvidedMethod as pminfo -> + let mb = methMap.[pminfo] + let ilg = mb.GetILGenerator() + let cattr = pminfo.GetCustomAttributesDataImpl() + defineCustomAttrs mb.SetCustomAttribute cattr + + let parameterVars = + [| if not pminfo.IsStatic then + yield Quotations.Var("this", pminfo.DeclaringType) + for p in pminfo.GetParameters() do + yield Quotations.Var(p.Name, p.ParameterType) |] + let parameters = + [| for v in parameterVars -> Quotations.Expr.Var v |] + + let expr = pminfo.GetInvokeCodeInternal true parameters + + let locals = Dictionary() + //printfn "Emitting linqCode for %s::%s, code = %s" pminfo.DeclaringType.FullName pminfo.Name (try linqCode.ToString() with _ -> "") + + + let expectedState = if (minfo.ReturnType = typeof) then ExpectedStackState.Empty else ExpectedStackState.Value + emitExpr (ilg, locals, parameterVars) expectedState expr + ilg.Emit OpCodes.Ret + | _ -> () + + for (bodyMethInfo,declMethInfo) in ptd.GetMethodOverrides() do + let bodyMethBuilder = methMap.[bodyMethInfo] + tb.DefineMethodOverride(bodyMethBuilder,declMethInfo) + + for evt in ptd.GetEvents(ALL) |> Seq.choose (function :? ProvidedEvent as pe -> Some pe | _ -> None) do + let eb = tb.DefineEvent(evt.Name, evt.Attributes, evt.EventHandlerType) + defineCustomAttrs eb.SetCustomAttribute (evt.GetCustomAttributesDataImpl()) + eb.SetAddOnMethod(methMap.[evt.GetAddMethod(true) :?> _]) + eb.SetRemoveOnMethod(methMap.[evt.GetRemoveMethod(true) :?> _]) + // TODO: add raiser + + for pinfo in ptd.GetProperties(ALL) |> Seq.choose (function :? ProvidedProperty as pe -> Some pe | _ -> None) do + let pb = tb.DefineProperty(pinfo.Name, pinfo.Attributes, convType pinfo.PropertyType, [| for p in pinfo.GetIndexParameters() -> convType p.ParameterType |]) + let cattr = pinfo.GetCustomAttributesDataImpl() + defineCustomAttrs pb.SetCustomAttribute cattr + if pinfo.CanRead then + let minfo = pinfo.GetGetMethod(true) + pb.SetGetMethod (methMap.[minfo :?> ProvidedMethod ]) + if pinfo.CanWrite then + let minfo = pinfo.GetSetMethod(true) + pb.SetSetMethod (methMap.[minfo :?> ProvidedMethod ])) + + + // phase 4 - complete types + iterateTypes (fun tb _ptd -> tb.CreateType() |> ignore) + +#if FX_NO_LOCAL_FILESYSTEM +#else + assembly.Save (Path.GetFileName assemblyFileName) +#endif + + let assemblyLoadedInMemory = assemblyMainModule.Assembly + + iterateTypes (fun _tb ptd -> + match ptd with + | None -> () + | Some ptd -> ptd.SetAssembly assemblyLoadedInMemory) + +#if FX_NO_LOCAL_FILESYSTEM +#else + member __.GetFinalBytes() = + let assemblyBytes = File.ReadAllBytes assemblyFileName + let _assemblyLoadedInMemory = System.Reflection.Assembly.Load(assemblyBytes,null,System.Security.SecurityContextSource.CurrentAppDomain) + //printfn "final bytes in '%s'" assemblyFileName + //File.Delete assemblyFileName + assemblyBytes +#endif + +type ProvidedAssembly(assemblyFileName: string) = + let theTypes = ResizeArray<_>() + let assemblyGenerator = AssemblyGenerator(assemblyFileName) + let assemblyLazy = + lazy + assemblyGenerator.Generate(theTypes |> Seq.toList) + assemblyGenerator.Assembly +#if FX_NO_LOCAL_FILESYSTEM +#else + let theAssemblyBytesLazy = + lazy + assemblyGenerator.GetFinalBytes() + + do + GlobalProvidedAssemblyElementsTable.theTable.Add(assemblyGenerator.Assembly, theAssemblyBytesLazy) + +#endif + + let add (providedTypeDefinitions:ProvidedTypeDefinition list, enclosingTypeNames: string list option) = + for pt in providedTypeDefinitions do + if pt.IsErased then invalidOp ("The provided type "+pt.Name+"is marked as erased and cannot be converted to a generated type. Set 'IsErased' to false on the ProvidedTypeDefinition") + theTypes.Add(pt,enclosingTypeNames) + pt.SetAssemblyLazy assemblyLazy + + member x.AddNestedTypes (providedTypeDefinitions, enclosingTypeNames) = add (providedTypeDefinitions, Some enclosingTypeNames) + member x.AddTypes (providedTypeDefinitions) = add (providedTypeDefinitions, None) +#if FX_NO_LOCAL_FILESYSTEM +#else + static member RegisterGenerated (fileName:string) = + //printfn "registered assembly in '%s'" fileName + let assemblyBytes = System.IO.File.ReadAllBytes fileName + let assembly = Assembly.Load(assemblyBytes,null,System.Security.SecurityContextSource.CurrentAppDomain) + GlobalProvidedAssemblyElementsTable.theTable.Add(assembly, Lazy<_>.CreateFromValue assemblyBytes) + assembly +#endif + + +module Local = + + let makeProvidedNamespace (namespaceName:string) (types:ProvidedTypeDefinition list) = + let types = [| for ty in types -> ty :> Type |] + {new IProvidedNamespace with + member __.GetNestedNamespaces() = [| |] + member __.NamespaceName = namespaceName + member __.GetTypes() = types |> Array.copy + member __.ResolveTypeName typeName : System.Type = + match types |> Array.tryFind (fun ty -> ty.Name = typeName) with + | Some ty -> ty + | None -> null + } + + +#if FX_NO_LOCAL_FILESYSTEM +type TypeProviderForNamespaces(namespacesAndTypes : list<(string * list)>) = +#else +type TypeProviderForNamespaces(namespacesAndTypes : list<(string * list)>) as this = +#endif + let otherNamespaces = ResizeArray>() + + let providedNamespaces = + lazy [| for (namespaceName,types) in namespacesAndTypes do + yield Local.makeProvidedNamespace namespaceName types + for (namespaceName,types) in otherNamespaces do + yield Local.makeProvidedNamespace namespaceName types |] + + let invalidateE = new Event() + + let disposing = Event() + +#if FX_NO_LOCAL_FILESYSTEM +#else + let probingFolders = ResizeArray() + let handler = ResolveEventHandler(fun _ args -> this.ResolveAssembly(args)) + do AppDomain.CurrentDomain.add_AssemblyResolve handler +#endif + + new (namespaceName:string,types:list) = new TypeProviderForNamespaces([(namespaceName,types)]) + new () = new TypeProviderForNamespaces([]) + + [] + member __.Disposing = disposing.Publish + +#if FX_NO_LOCAL_FILESYSTEM + interface System.IDisposable with + member x.Dispose() = + disposing.Trigger(x, EventArgs.Empty) +#else + abstract member ResolveAssembly : args : System.ResolveEventArgs -> Assembly + + default __.ResolveAssembly(args) = + let expectedName = (AssemblyName(args.Name)).Name + ".dll" + let expectedLocationOpt = + probingFolders + |> Seq.map (fun f -> IO.Path.Combine(f, expectedName)) + |> Seq.tryFind IO.File.Exists + match expectedLocationOpt with + | Some f -> Assembly.LoadFrom f + | None -> null + + member __.RegisterProbingFolder (folder) = + // use GetFullPath to ensure that folder is valid + ignore(IO.Path.GetFullPath folder) + probingFolders.Add folder + + member __.RegisterRuntimeAssemblyLocationAsProbingFolder (config : TypeProviderConfig) = + config.RuntimeAssembly + |> IO.Path.GetDirectoryName + |> this.RegisterProbingFolder + + interface System.IDisposable with + member x.Dispose() = + disposing.Trigger(x, EventArgs.Empty) + AppDomain.CurrentDomain.remove_AssemblyResolve handler +#endif + + member __.AddNamespace (namespaceName,types:list<_>) = otherNamespaces.Add (namespaceName,types) + + // FSharp.Data addition: this method is used by Debug.fs + member __.Namespaces = Seq.readonly otherNamespaces + + member this.Invalidate() = invalidateE.Trigger(this,EventArgs()) + + member __.GetStaticParametersForMethod(mb: MethodBase) = + printfn "In GetStaticParametersForMethod" + match mb with + | :? ProvidedMethod as t -> t.GetStaticParameters() + | _ -> [| |] + + member __.ApplyStaticArgumentsForMethod(mb: MethodBase, mangledName, objs) = + printfn "In ApplyStaticArgumentsForMethod" + match mb with + | :? ProvidedMethod as t -> t.ApplyStaticArguments(mangledName, objs) :> MethodBase + | _ -> failwith (sprintf "ApplyStaticArguments: static parameters for method %s are unexpected" mb.Name) + + interface ITypeProvider with + + [] + override __.Invalidate = invalidateE.Publish + + override __.GetNamespaces() = Array.copy providedNamespaces.Value + + member __.GetInvokerExpression(methodBase, parameters) = + let rec getInvokerExpression (methodBase : MethodBase) parameters = + match methodBase with + | :? ProvidedMethod as m when (match methodBase.DeclaringType with :? ProvidedTypeDefinition as pt -> pt.IsErased | _ -> true) -> + m.GetInvokeCodeInternal false parameters + |> expand + | :? ProvidedConstructor as m when (match methodBase.DeclaringType with :? ProvidedTypeDefinition as pt -> pt.IsErased | _ -> true) -> + m.GetInvokeCodeInternal false parameters + |> expand + // Otherwise, assume this is a generative assembly and just emit a call to the constructor or method + | :? ConstructorInfo as cinfo -> + Quotations.Expr.NewObject(cinfo, Array.toList parameters) + | :? System.Reflection.MethodInfo as minfo -> + if minfo.IsStatic then + Quotations.Expr.Call(minfo, Array.toList parameters) + else + Quotations.Expr.Call(parameters.[0], minfo, Array.toList parameters.[1..]) + | _ -> failwith ("TypeProviderForNamespaces.GetInvokerExpression: not a ProvidedMethod/ProvidedConstructor/ConstructorInfo/MethodInfo, name=" + methodBase.Name + " class=" + methodBase.GetType().FullName) + and expand expr = + match expr with + | Quotations.Patterns.NewObject(ctor, args) -> getInvokerExpression ctor [| for arg in args -> expand arg|] + | Quotations.Patterns.Call(inst, mi, args) -> + let args = + [| + match inst with + | Some inst -> yield expand inst + | _ -> () + yield! List.map expand args + |] + getInvokerExpression mi args + | Quotations.ExprShape.ShapeVar v -> Quotations.Expr.Var v + | Quotations.ExprShape.ShapeLambda(v, body) -> Quotations.Expr.Lambda(v, expand body) + | Quotations.ExprShape.ShapeCombination(shape, args) -> Quotations.ExprShape.RebuildShapeCombination(shape, List.map expand args) + getInvokerExpression methodBase parameters +#if FX_NO_CUSTOMATTRIBUTEDATA + + member __.GetMemberCustomAttributesData(methodBase) = + match methodBase with + | :? ProvidedTypeDefinition as m -> m.GetCustomAttributesDataImpl() + | :? ProvidedMethod as m -> m.GetCustomAttributesDataImpl() + | :? ProvidedProperty as m -> m.GetCustomAttributesDataImpl() + | :? ProvidedConstructor as m -> m.GetCustomAttributesDataImpl() + | :? ProvidedEvent as m -> m.GetCustomAttributesDataImpl() + | :? ProvidedLiteralField as m -> m.GetCustomAttributesDataImpl() + | :? ProvidedField as m -> m.GetCustomAttributesDataImpl() + | _ -> [| |] :> IList<_> + + member __.GetParameterCustomAttributesData(methodBase) = + match methodBase with + | :? ProvidedParameter as m -> m.GetCustomAttributesDataImpl() + | _ -> [| |] :> IList<_> + + +#endif + override __.GetStaticParameters(ty) = + match ty with + | :? ProvidedTypeDefinition as t -> + if ty.Name = t.Name (* REVIEW: use equality? *) then + t.GetStaticParameters() + else + [| |] + | _ -> [| |] + + override __.ApplyStaticArguments(ty,typePathAfterArguments:string[],objs) = + let typePathAfterArguments = typePathAfterArguments.[typePathAfterArguments.Length-1] + match ty with + | :? ProvidedTypeDefinition as t -> (t.MakeParametricType(typePathAfterArguments,objs) :> Type) + | _ -> failwith (sprintf "ApplyStaticArguments: static params for type %s are unexpected" ty.FullName) + +#if FX_NO_LOCAL_FILESYSTEM + override __.GetGeneratedAssemblyContents(_assembly) = + // TODO: this is very fake, we rely on the fact it is never needed + match System.Windows.Application.GetResourceStream(System.Uri("FSharp.Core.dll",System.UriKind.Relative)) with + | null -> failwith "FSharp.Core.dll not found as Manifest Resource, we're just trying to read some random .NET assembly, ok?" + | resStream -> + use stream = resStream.Stream + let len = stream.Length + let buf = Array.zeroCreate (int len) + let rec loop where rem = + let n = stream.Read(buf, 0, int rem) + if n < rem then loop (where + n) (rem - n) + loop 0 (int len) + buf + + //failwith "no file system" +#else + override __.GetGeneratedAssemblyContents(assembly:Assembly) = + //printfn "looking up assembly '%s'" assembly.FullName + match GlobalProvidedAssemblyElementsTable.theTable.TryGetValue assembly with + | true,bytes -> bytes.Force() + | _ -> + let bytes = System.IO.File.ReadAllBytes assembly.ManifestModule.FullyQualifiedName + GlobalProvidedAssemblyElementsTable.theTable.[assembly] <- Lazy<_>.CreateFromValue bytes + bytes +#endif diff --git a/tests/service/TestTP/ProvidedTypes.fsi b/tests/service/TestTP/ProvidedTypes.fsi new file mode 100644 index 0000000000..3eb5025f6d --- /dev/null +++ b/tests/service/TestTP/ProvidedTypes.fsi @@ -0,0 +1,467 @@ +// Copyright (c) Microsoft Corporation 2005-2014 and other contributors. +// This sample code is provided "as is" without warranty of any kind. +// We disclaim all warranties, either express or implied, including the +// warranties of merchantability and fitness for a particular purpose. +// +// This file contains a set of helper types and methods for providing types in an implementation +// of ITypeProvider. +// +// This code has been modified and is appropriate for use in conjunction with the F# 3.0-4.0 releases + + +namespace ProviderImplementation.ProvidedTypes + +open System +open System.Reflection +open System.Linq.Expressions +open Microsoft.FSharp.Core.CompilerServices + +/// Represents an erased provided parameter +type ProvidedParameter = + inherit ParameterInfo + new : parameterName: string * parameterType: Type * ?isOut:bool * ?optionalValue:obj -> ProvidedParameter + member IsParamArray : bool with get,set + +/// Represents a provided static parameter. +type ProvidedStaticParameter = + inherit ParameterInfo + new : parameterName: string * parameterType:Type * ?parameterDefaultValue:obj -> ProvidedStaticParameter + + /// Add XML documentation information to this provided constructor + member AddXmlDoc : xmlDoc: string -> unit + + /// Add XML documentation information to this provided constructor, where the computation of the documentation is delayed until necessary + member AddXmlDocDelayed : xmlDocFunction: (unit -> string) -> unit + +/// Represents an erased provided constructor. +type ProvidedConstructor = + inherit ConstructorInfo + + /// Create a new provided constructor. It is not initially associated with any specific provided type definition. + new : parameters: ProvidedParameter list -> ProvidedConstructor + + /// Add a 'System.Obsolete' attribute to this provided constructor + member AddObsoleteAttribute : message: string * ?isError: bool -> unit + + /// Add XML documentation information to this provided constructor + member AddXmlDoc : xmlDoc: string -> unit + + /// Add XML documentation information to this provided constructor, where the computation of the documentation is delayed until necessary + member AddXmlDocDelayed : xmlDocFunction: (unit -> string) -> unit + + /// Add XML documentation information to this provided constructor, where the documentation is re-computed every time it is required. + member AddXmlDocComputed : xmlDocFunction: (unit -> string) -> unit + + /// Set the quotation used to compute the implementation of invocations of this constructor. + member InvokeCode : (Quotations.Expr list -> Quotations.Expr) with set + + /// FSharp.Data addition: this method is used by Debug.fs + member internal GetInvokeCodeInternal : bool -> (Quotations.Expr [] -> Quotations.Expr) + + /// Set the target and arguments of the base constructor call. Only used for generated types. + member BaseConstructorCall : (Quotations.Expr list -> ConstructorInfo * Quotations.Expr list) with set + + /// Set a flag indicating that the constructor acts like an F# implicit constructor, so the + /// parameters of the constructor become fields and can be accessed using Expr.GlobalVar with the + /// same name. + member IsImplicitCtor : bool with get,set + + /// Add definition location information to the provided constructor. + member AddDefinitionLocation : line:int * column:int * filePath:string -> unit + + member IsTypeInitializer : bool with get,set + +type ProvidedMethod = + inherit MethodInfo + + /// Create a new provided method. It is not initially associated with any specific provided type definition. + new : methodName:string * parameters: ProvidedParameter list * returnType: Type -> ProvidedMethod + + /// Add XML documentation information to this provided method + member AddObsoleteAttribute : message: string * ?isError: bool -> unit + + /// Add XML documentation information to this provided constructor + member AddXmlDoc : xmlDoc: string -> unit + + /// Add XML documentation information to this provided constructor, where the computation of the documentation is delayed until necessary + member AddXmlDocDelayed : xmlDocFunction: (unit -> string) -> unit + + /// Add XML documentation information to this provided constructor, where the computation of the documentation is delayed until necessary + /// The documentation is re-computed every time it is required. + member AddXmlDocComputed : xmlDocFunction: (unit -> string) -> unit + + member AddMethodAttrs : attributes:MethodAttributes -> unit + + /// Set the method attributes of the method. By default these are simple 'MethodAttributes.Public' + member SetMethodAttrs : attributes:MethodAttributes -> unit + + /// Get or set a flag indicating if the property is static. + member IsStaticMethod : bool with get, set + + /// Set the quotation used to compute the implementation of invocations of this method. + member InvokeCode : (Quotations.Expr list -> Quotations.Expr) with set + + /// FSharp.Data addition: this method is used by Debug.fs + member internal GetInvokeCodeInternal : bool -> (Quotations.Expr [] -> Quotations.Expr) + + /// Add definition location information to the provided type definition. + member AddDefinitionLocation : line:int * column:int * filePath:string -> unit + + /// Add a custom attribute to the provided method definition. + member AddCustomAttribute : CustomAttributeData -> unit + + /// Define the static parameters available on a statically parameterized method + member DefineStaticParameters : parameters: ProvidedStaticParameter list * instantiationFunction: (string -> obj[] -> ProvidedMethod) -> unit + +/// Represents an erased provided property. +type ProvidedProperty = + inherit PropertyInfo + + /// Create a new provided type. It is not initially associated with any specific provided type definition. + new : propertyName: string * propertyType: Type * ?parameters:ProvidedParameter list -> ProvidedProperty + + /// Add a 'System.Obsolete' attribute to this provided property + member AddObsoleteAttribute : message: string * ?isError: bool -> unit + + /// Add XML documentation information to this provided constructor + member AddXmlDoc : xmlDoc: string -> unit + + /// Add XML documentation information to this provided constructor, where the computation of the documentation is delayed until necessary + member AddXmlDocDelayed : xmlDocFunction: (unit -> string) -> unit + + /// Add XML documentation information to this provided constructor, where the computation of the documentation is delayed until necessary + /// The documentation is re-computed every time it is required. + member AddXmlDocComputed : xmlDocFunction: (unit -> string) -> unit + + /// Get or set a flag indicating if the property is static. + /// FSharp.Data addition: the getter is used by Debug.fs + member IsStatic : bool with get,set + + /// Set the quotation used to compute the implementation of gets of this property. + member GetterCode : (Quotations.Expr list -> Quotations.Expr) with set + + /// Set the function used to compute the implementation of sets of this property. + member SetterCode : (Quotations.Expr list -> Quotations.Expr) with set + + /// Add definition location information to the provided type definition. + member AddDefinitionLocation : line:int * column:int * filePath:string -> unit + + /// Add a custom attribute to the provided property definition. + member AddCustomAttribute : CustomAttributeData -> unit + +/// Represents an erased provided property. +type ProvidedEvent = + inherit EventInfo + + /// Create a new provided type. It is not initially associated with any specific provided type definition. + new : propertyName: string * eventHandlerType: Type -> ProvidedEvent + + /// Add XML documentation information to this provided constructor + member AddXmlDoc : xmlDoc: string -> unit + + /// Add XML documentation information to this provided constructor, where the computation of the documentation is delayed until necessary + member AddXmlDocDelayed : xmlDocFunction: (unit -> string) -> unit + + /// Add XML documentation information to this provided constructor, where the computation of the documentation is delayed until necessary + /// The documentation is re-computed every time it is required. + member AddXmlDocComputed : xmlDocFunction: (unit -> string) -> unit + + /// Get or set a flag indicating if the property is static. + member IsStatic : bool with set + + /// Set the quotation used to compute the implementation of gets of this property. + member AdderCode : (Quotations.Expr list -> Quotations.Expr) with set + + /// Set the function used to compute the implementation of sets of this property. + member RemoverCode : (Quotations.Expr list -> Quotations.Expr) with set + + /// Add definition location information to the provided type definition. + member AddDefinitionLocation : line:int * column:int * filePath:string -> unit + +/// Represents an erased provided field. +type ProvidedLiteralField = + inherit FieldInfo + + /// Create a new provided field. It is not initially associated with any specific provided type definition. + new : fieldName: string * fieldType: Type * literalValue: obj -> ProvidedLiteralField + + /// Add a 'System.Obsolete' attribute to this provided field + member AddObsoleteAttribute : message: string * ?isError: bool -> unit + + /// Add XML documentation information to this provided field + member AddXmlDoc : xmlDoc: string -> unit + + /// Add XML documentation information to this provided field, where the computation of the documentation is delayed until necessary + member AddXmlDocDelayed : xmlDocFunction: (unit -> string) -> unit + + /// Add XML documentation information to this provided field, where the computation of the documentation is delayed until necessary + /// The documentation is re-computed every time it is required. + member AddXmlDocComputed : xmlDocFunction: (unit -> string) -> unit + + /// Add definition location information to the provided field. + member AddDefinitionLocation : line:int * column:int * filePath:string -> unit + +/// Represents an erased provided field. +type ProvidedField = + inherit FieldInfo + + /// Create a new provided field. It is not initially associated with any specific provided type definition. + new : fieldName: string * fieldType: Type -> ProvidedField + + /// Add a 'System.Obsolete' attribute to this provided field + member AddObsoleteAttribute : message: string * ?isError: bool -> unit + + /// Add XML documentation information to this provided field + member AddXmlDoc : xmlDoc: string -> unit + + /// Add XML documentation information to this provided field, where the computation of the documentation is delayed until necessary + member AddXmlDocDelayed : xmlDocFunction: (unit -> string) -> unit + + /// Add XML documentation information to this provided field, where the computation of the documentation is delayed until necessary + /// The documentation is re-computed every time it is required. + member AddXmlDocComputed : xmlDocFunction: (unit -> string) -> unit + + /// Add definition location information to the provided field definition. + member AddDefinitionLocation : line:int * column:int * filePath:string -> unit + + member SetFieldAttributes : attributes : FieldAttributes -> unit + +/// Represents the type constructor in a provided symbol type. +[] +type SymbolKind = + /// Indicates that the type constructor is for a single-dimensional array + | SDArray + /// Indicates that the type constructor is for a multi-dimensional array + | Array of int + /// Indicates that the type constructor is for pointer types + | Pointer + /// Indicates that the type constructor is for byref types + | ByRef + /// Indicates that the type constructor is for named generic types + | Generic of Type + /// Indicates that the type constructor is for abbreviated types + | FSharpTypeAbbreviation of (Assembly * string * string[]) + +/// Represents an array or other symbolic type involving a provided type as the argument. +/// See the type provider spec for the methods that must be implemented. +/// Note that the type provider specification does not require us to implement pointer-equality for provided types. +[] +type ProvidedSymbolType = + inherit Type + + /// Returns the kind of this symbolic type + member Kind : SymbolKind + + /// Return the provided types used as arguments of this symbolic type + member Args : list + + +/// Helpers to build symbolic provided types +[] +type ProvidedTypeBuilder = + + /// Like typ.MakeGenericType, but will also work with unit-annotated types + static member MakeGenericType: genericTypeDefinition: Type * genericArguments: Type list -> Type + + /// Like methodInfo.MakeGenericMethod, but will also work with unit-annotated types and provided types + static member MakeGenericMethod: genericMethodDefinition: MethodInfo * genericArguments: Type list -> MethodInfo + +/// Helps create erased provided unit-of-measure annotations. +[] +type ProvidedMeasureBuilder = + + /// The ProvidedMeasureBuilder for building measures. + static member Default : ProvidedMeasureBuilder + + /// Gets the measure indicating the "1" unit of measure, that is the unitless measure. + member One : Type + + /// Returns the measure indicating the product of two units of measure, e.g. kg * m + member Product : measure1: Type * measure1: Type -> Type + + /// Returns the measure indicating the inverse of two units of measure, e.g. 1 / s + member Inverse : denominator: Type -> Type + + /// Returns the measure indicating the ratio of two units of measure, e.g. kg / m + member Ratio : numerator: Type * denominator: Type -> Type + + /// Returns the measure indicating the square of a unit of measure, e.g. m * m + member Square : ``measure``: Type -> Type + + /// Returns the measure for an SI unit from the F# core library, where the string is in capitals and US spelling, e.g. Meter + member SI : unitName:string -> Type + + /// Returns a type where the type has been annotated with the given types and/or units-of-measure. + /// e.g. float, Vector + member AnnotateType : basic: Type * argument: Type list -> Type + + +/// Represents a provided type definition. +type ProvidedTypeDefinition = + inherit Type + + /// Create a new provided type definition in a namespace. + new : assembly: Assembly * namespaceName: string * className: string * baseType: Type option -> ProvidedTypeDefinition + + /// Create a new provided type definition, to be located as a nested type in some type definition. + new : className : string * baseType: Type option -> ProvidedTypeDefinition + + /// Add the given type as an implemented interface. + member AddInterfaceImplementation : interfaceType: Type -> unit + + /// Add the given function as a set of on-demand computed interfaces. + member AddInterfaceImplementationsDelayed : interfacesFunction:(unit -> Type list)-> unit + + /// Specifies that the given method body implements the given method declaration. + member DefineMethodOverride : methodInfoBody: ProvidedMethod * methodInfoDeclaration: MethodInfo -> unit + + /// Add a 'System.Obsolete' attribute to this provided type definition + member AddObsoleteAttribute : message: string * ?isError: bool -> unit + + /// Add XML documentation information to this provided constructor + member AddXmlDoc : xmlDoc: string -> unit + + /// Set the base type + member SetBaseType : Type -> unit + + /// Set the base type to a lazily evaluated value. Use this to delay realization of the base type as late as possible. + member SetBaseTypeDelayed : baseTypeFunction:(unit -> Type) -> unit + + /// Set underlying type for generated enums + member SetEnumUnderlyingType : Type -> unit + + /// Add XML documentation information to this provided constructor, where the computation of the documentation is delayed until necessary. + /// The documentation is only computed once. + member AddXmlDocDelayed : xmlDocFunction: (unit -> string) -> unit + + /// Add XML documentation information to this provided constructor, where the computation of the documentation is delayed until necessary + /// The documentation is re-computed every time it is required. + member AddXmlDocComputed : xmlDocFunction: (unit -> string) -> unit + + /// Set the attributes on the provided type. This fully replaces the default TypeAttributes. + member SetAttributes : TypeAttributes -> unit + + /// Reset the enclosing type (for generated nested types) + member ResetEnclosingType: enclosingType:Type -> unit + + /// Add a method, property, nested type or other member to a ProvidedTypeDefinition + member AddMember : memberInfo:MemberInfo -> unit + + /// Add a set of members to a ProvidedTypeDefinition + member AddMembers : memberInfos:list<#MemberInfo> -> unit + + /// Add a member to a ProvidedTypeDefinition, delaying computation of the members until required by the compilation context. + member AddMemberDelayed : memberFunction:(unit -> #MemberInfo) -> unit + + /// Add a set of members to a ProvidedTypeDefinition, delaying computation of the members until required by the compilation context. + member AddMembersDelayed : membersFunction:(unit -> list<#MemberInfo>) -> unit + + /// Add the types of the generated assembly as generative types, where types in namespaces get hierarchically positioned as nested types. + member AddAssemblyTypesAsNestedTypesDelayed : assemblyFunction:(unit -> Assembly) -> unit + + /// Define the static parameters available on a statically parameterized type + member DefineStaticParameters : parameters: ProvidedStaticParameter list * instantiationFunction: (string -> obj[] -> ProvidedTypeDefinition) -> unit + + /// Add definition location information to the provided type definition. + member AddDefinitionLocation : line:int * column:int * filePath:string -> unit + + /// Suppress System.Object entries in intellisense menus in instances of this provided type + member HideObjectMethods : bool with set + + /// Disallows the use of the null literal. + member NonNullable : bool with set + + /// Get or set a flag indicating if the ProvidedTypeDefinition is erased + member IsErased : bool with get,set + + /// Get or set a flag indicating if the ProvidedTypeDefinition has type-relocation suppressed + [] + member SuppressRelocation : bool with get,set + + /// FSharp.Data addition: this method is used by Debug.fs + member MakeParametricType : name:string * args:obj[] -> ProvidedTypeDefinition + + /// Add a custom attribute to the provided type definition. + member AddCustomAttribute : CustomAttributeData -> unit + + /// Emulate the F# type provider type erasure mechanism to get the + /// actual (erased) type. We erase ProvidedTypes to their base type + /// and we erase array of provided type to array of base type. In the + /// case of generics all the generic type arguments are also recursively + /// replaced with the erased-to types + static member EraseType : typ:Type -> Type + + /// Get or set a utility function to log the creation of root Provided Type. Used to debug caching/invalidation. + static member Logger : (string -> unit) option ref + +/// A provided generated assembly +type ProvidedAssembly = + /// Create a provided generated assembly + new : assemblyFileName:string -> ProvidedAssembly + + /// Emit the given provided type definitions as part of the assembly + /// and adjust the 'Assembly' property of all provided type definitions to return that + /// assembly. + /// + /// The assembly is only emitted when the Assembly property on the root type is accessed for the first time. + /// The host F# compiler does this when processing a generative type declaration for the type. + member AddTypes : types : ProvidedTypeDefinition list -> unit + + /// + /// Emit the given nested provided type definitions as part of the assembly. + /// and adjust the 'Assembly' property of all provided type definitions to return that + /// assembly. + /// + /// A path of type names to wrap the generated types. The generated types are then generated as nested types. + member AddNestedTypes : types : ProvidedTypeDefinition list * enclosingGeneratedTypeNames: string list -> unit + +#if FX_NO_LOCAL_FILESYSTEM +#else + /// Register that a given file is a provided generated assembly + static member RegisterGenerated : fileName:string -> Assembly +#endif + + +/// A base type providing default implementations of type provider functionality when all provided +/// types are of type ProvidedTypeDefinition. +type TypeProviderForNamespaces = + + /// Initializes a type provider to provide the types in the given namespace. + new : namespaceName:string * types: ProvidedTypeDefinition list -> TypeProviderForNamespaces + + /// Initializes a type provider + new : unit -> TypeProviderForNamespaces + + /// Invoked by the type provider to add a namespace of provided types in the specification of the type provider. + member AddNamespace : namespaceName:string * types: ProvidedTypeDefinition list -> unit + + /// Invoked by the type provider to get all provided namespaces with their provided types. + member Namespaces : seq + + /// Invoked by the type provider to invalidate the information provided by the provider + member Invalidate : unit -> unit + + /// Invoked by the host of the type provider to get the static parameters for a method. + member GetStaticParametersForMethod : MethodBase -> ParameterInfo[] + + /// Invoked by the host of the type provider to apply the static argumetns for a method. + member ApplyStaticArgumentsForMethod : MethodBase * string * obj[] -> MethodBase + +#if FX_NO_LOCAL_FILESYSTEM +#else + /// AssemblyResolve handler. Default implementation searches .dll file in registered folders + abstract ResolveAssembly : System.ResolveEventArgs -> Assembly + default ResolveAssembly : System.ResolveEventArgs -> Assembly + + /// Registers custom probing path that can be used for probing assemblies + member RegisterProbingFolder : folder: string -> unit + + /// Registers location of RuntimeAssembly (from TypeProviderConfig) as probing folder + member RegisterRuntimeAssemblyLocationAsProbingFolder : config: TypeProviderConfig -> unit + +#endif + + [] + member Disposing : IEvent + + interface ITypeProvider diff --git a/tests/service/TestTP/TestTP.fsproj b/tests/service/TestTP/TestTP.fsproj new file mode 100644 index 0000000000..61cad6a181 --- /dev/null +++ b/tests/service/TestTP/TestTP.fsproj @@ -0,0 +1,79 @@ + + + + + Debug + AnyCPU + 2.0 + ff76bd3c-5e0a-4752-b6c3-044f6e15719b + Library + TestTP + TestTP + v4.5.2 + true + 4.4.0.0 + TestTP + + + true + full + false + false + bin\Debug\ + DEBUG;TRACE + 3 + AnyCPU + bin\Debug\TestTP.XML + true + + + pdbonly + true + true + bin\Release\ + TRACE + 3 + AnyCPU + bin\Release\TestTP.XML + true + + + 11 + + + + + $(MSBuildExtensionsPath32)\..\Microsoft SDKs\F#\3.0\Framework\v4.0\Microsoft.FSharp.Targets + + + + + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\FSharp\Microsoft.FSharp.Targets + + + + + + + + + + + + + + + True + + + + + + + \ No newline at end of file diff --git a/tests/service/TestTP/packages.config b/tests/service/TestTP/packages.config new file mode 100644 index 0000000000..064da4025f --- /dev/null +++ b/tests/service/TestTP/packages.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file From 6d4fe8bd354142654866d8337ec96a63cc454b52 Mon Sep 17 00:00:00 2001 From: Don Syme Date: Tue, 1 Dec 2015 17:14:34 +0000 Subject: [PATCH 02/23] Fix expressions for type providers (2) --- tests/service/TestTP/App.config | 6 ------ tests/service/TestTP/ProvidedTypes.fs | 2 +- tests/service/TestTP/TestTP.fsproj | 7 +++---- tests/service/TestTP/packages.config | 4 ---- 4 files changed, 4 insertions(+), 15 deletions(-) delete mode 100644 tests/service/TestTP/App.config delete mode 100644 tests/service/TestTP/packages.config diff --git a/tests/service/TestTP/App.config b/tests/service/TestTP/App.config deleted file mode 100644 index 88fa4027bd..0000000000 --- a/tests/service/TestTP/App.config +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/tests/service/TestTP/ProvidedTypes.fs b/tests/service/TestTP/ProvidedTypes.fs index 51cdb0bddd..5cf2954749 100644 --- a/tests/service/TestTP/ProvidedTypes.fs +++ b/tests/service/TestTP/ProvidedTypes.fs @@ -494,7 +494,7 @@ module internal Misc = else Some (args.[1], args.[1]) ) - |> Seq.item (n - 1) + |> Seq.nth (n - 1) let adaptMethod = getFastFuncType args resultType let adapted = E.Call(adaptMethod, [loop applicable]) diff --git a/tests/service/TestTP/TestTP.fsproj b/tests/service/TestTP/TestTP.fsproj index 61cad6a181..8820c90403 100644 --- a/tests/service/TestTP/TestTP.fsproj +++ b/tests/service/TestTP/TestTP.fsproj @@ -9,10 +9,11 @@ Library TestTP TestTP - v4.5.2 + v4.5 true - 4.4.0.0 + 4.3.0.0 TestTP + true @@ -54,11 +55,9 @@ - - diff --git a/tests/service/TestTP/packages.config b/tests/service/TestTP/packages.config deleted file mode 100644 index 064da4025f..0000000000 --- a/tests/service/TestTP/packages.config +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file From ea810bd2602ac149545427e3e9d3c4e1ab723c8c Mon Sep 17 00:00:00 2001 From: Don Syme Date: Tue, 1 Dec 2015 17:18:34 +0000 Subject: [PATCH 03/23] elide a test case that doesn't work, likely due to F# compile bug --- tests/service/TestTP/Library.fs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tests/service/TestTP/Library.fs b/tests/service/TestTP/Library.fs index 39f223375c..714fa164c1 100644 --- a/tests/service/TestTP/Library.fs +++ b/tests/service/TestTP/Library.fs @@ -63,11 +63,13 @@ type BasicProvider (config : TypeProviderConfig) as this = Helper.C().InstanceDoNothingOneArg(3) Helper.C().InstanceDoNothingTwoArg(Helper.C(), 3) Helper.G.DoNothing() - Helper.G.DoNothingGeneric(3) + // These do not seem to compile correctly when used in provided expressions: + //Helper.G.DoNothingGeneric(3) Helper.G.DoNothingOneArg(3) Helper.G.DoNothingTwoArg(Helper.C(), 3) Helper.G().InstanceDoNothing() - Helper.G().InstanceDoNothingGeneric(3) + // These do not seem to compile correctly when used in provided expressions: + //Helper.G().InstanceDoNothingGeneric(3) Helper.G().InstanceDoNothingOneArg(3) Helper.G().InstanceDoNothingTwoArg(Helper.C(), 3) @@>) From 0d8433ea1d1d6a7bab14fbd6d69bdce7bc713037 Mon Sep 17 00:00:00 2001 From: Don Syme Date: Tue, 1 Dec 2015 17:54:56 +0000 Subject: [PATCH 04/23] make tests pass --- tests/service/ExprTests.fs | 23 +++-- tests/service/TestProject/Library.fs | 18 +++- tests/service/TestProject/TestProject.fsproj | 1 - tests/service/TestTP/Library.fs | 94 +++++++++++++++----- 4 files changed, 108 insertions(+), 28 deletions(-) diff --git a/tests/service/ExprTests.fs b/tests/service/ExprTests.fs index 3a7446be2f..1ca465921a 100644 --- a/tests/service/ExprTests.fs +++ b/tests/service/ExprTests.fs @@ -689,11 +689,24 @@ let ``Check use of type provider that provides calls to F# code`` () = for line in d |> printDeclaration None do yield line ] results |> shouldEqual - ["type TestProject"; "type AssemblyInfo"; "type TestProject"; "type T"; - "type Class1"; - "member .ctor(unitVar0) = (Object..ctor (); ()) @ (5,5--5,11)"; - """member get_X(this) (unitVar1) = let this: Microsoft.FSharp.Core.obj = ("My internal state" :> Microsoft.FSharp.Core.obj) :> ErasedWithConstructor.Provided.MyType in Helper.doNothing () @ (6,20--6,35)""" ] - + ["type TestProject"; "type AssemblyInfo"; "type TestProject"; "type T"; + """type Class1"""; + """member .ctor(unitVar0) = (Object..ctor (); ()) @ (5,5--5,11)"""; + """member get_X1(this) (unitVar1) = let this: Microsoft.FSharp.Core.obj = ("My internal state" :> Microsoft.FSharp.Core.obj) :> ErasedWithConstructor.Provided.MyType in Helper.doNothing () @ (6,21--6,36)"""; + """member get_X2(this) (unitVar1) = let this: Microsoft.FSharp.Core.obj = ("My internal state" :> Microsoft.FSharp.Core.obj) :> ErasedWithConstructor.Provided.MyType in Helper.doNothingGeneric (3) @ (7,21--7,43)"""; + """member get_X3(this) (unitVar1) = let this: Microsoft.FSharp.Core.obj = ("My internal state" :> Microsoft.FSharp.Core.obj) :> ErasedWithConstructor.Provided.MyType in Helper.doNothingOneArg (3) @ (8,21--8,42)"""; + """member get_X4(this) (unitVar1) = let this: Microsoft.FSharp.Core.obj = ("My internal state" :> Microsoft.FSharp.Core.obj) :> ErasedWithConstructor.Provided.MyType in C.DoNothing () @ (9,21--9,41)"""; + """member get_X5(this) (unitVar1) = let this: Microsoft.FSharp.Core.obj = ("My internal state" :> Microsoft.FSharp.Core.obj) :> ErasedWithConstructor.Provided.MyType in C.DoNothingGeneric (3) @ (10,21--10,48)"""; + """member get_X6(this) (unitVar1) = let this: Microsoft.FSharp.Core.obj = ("My internal state" :> Microsoft.FSharp.Core.obj) :> ErasedWithConstructor.Provided.MyType in C.DoNothingOneArg (3) @ (11,21--11,47)"""; + """member get_X7(this) (unitVar1) = let this: Microsoft.FSharp.Core.obj = ("My internal state" :> Microsoft.FSharp.Core.obj) :> ErasedWithConstructor.Provided.MyType in C.DoNothingTwoArg (new C(),3) @ (12,21--12,47)"""; + """member get_X8(this) (unitVar1) = let this: Microsoft.FSharp.Core.obj = ("My internal state" :> Microsoft.FSharp.Core.obj) :> ErasedWithConstructor.Provided.MyType in new C().InstanceDoNothing() @ (13,21--13,49)"""; + """member get_X9(this) (unitVar1) = let this: Microsoft.FSharp.Core.obj = ("My internal state" :> Microsoft.FSharp.Core.obj) :> ErasedWithConstructor.Provided.MyType in new C().InstanceDoNothingGeneric(3) @ (14,21--14,56)"""; + """member get_X10(this) (unitVar1) = let this: Microsoft.FSharp.Core.obj = ("My internal state" :> Microsoft.FSharp.Core.obj) :> ErasedWithConstructor.Provided.MyType in new C().InstanceDoNothingOneArg(3) @ (15,22--15,56)"""; + """member get_X11(this) (unitVar1) = let this: Microsoft.FSharp.Core.obj = ("My internal state" :> Microsoft.FSharp.Core.obj) :> ErasedWithConstructor.Provided.MyType in new C().InstanceDoNothingTwoArg(new C(),3) @ (16,22--16,56)"""; + """member get_X12(this) (unitVar1) = let this: Microsoft.FSharp.Core.obj = ("My internal state" :> Microsoft.FSharp.Core.obj) :> ErasedWithConstructor.Provided.MyType in G`1.DoNothing () @ (17,22--17,49)"""; + """member get_X13(this) (unitVar1) = let this: Microsoft.FSharp.Core.obj = ("My internal state" :> Microsoft.FSharp.Core.obj) :> ErasedWithConstructor.Provided.MyType in G`1.DoNothingOneArg (3) @ (18,22--18,55)"""; + """member get_X14(this) (unitVar1) = let this: Microsoft.FSharp.Core.obj = ("My internal state" :> Microsoft.FSharp.Core.obj) :> ErasedWithConstructor.Provided.MyType in G`1.DoNothingTwoArg (new C(),3) @ (19,22--19,55)"""] + #if SELF_HOST_STRESS diff --git a/tests/service/TestProject/Library.fs b/tests/service/TestProject/Library.fs index 6cc4f4879a..5983364772 100644 --- a/tests/service/TestProject/Library.fs +++ b/tests/service/TestProject/Library.fs @@ -3,4 +3,20 @@ type T = ErasedWithConstructor.Provided.MyType type Class1() = - member this.X = T().DoNothing() + member this.X1 = T().DoNothing() + member this.X2 = T().DoNothingGeneric() + member this.X3 = T().DoNothingOneArg() + member this.X4 = T().ClassDoNothing() + member this.X5 = T().ClassDoNothingGeneric() + member this.X6 = T().ClassDoNothingOneArg() + member this.X7 = T().ClassDoNothingTwoArg() + member this.X8 = T().ClassInstanceDoNothing() + member this.X9 = T().ClassInstanceDoNothingGeneric() + member this.X10 = T().ClassInstanceDoNothingOneArg() + member this.X11 = T().ClassInstanceDoNothingTwoArg() + member this.X12 = T().GenericClassDoNothing() + member this.X13 = T().GenericClassDoNothingOneArg() + member this.X14 = T().GenericClassDoNothingTwoArg() + + + diff --git a/tests/service/TestProject/TestProject.fsproj b/tests/service/TestProject/TestProject.fsproj index 497eb2b1bd..da40924485 100644 --- a/tests/service/TestProject/TestProject.fsproj +++ b/tests/service/TestProject/TestProject.fsproj @@ -45,7 +45,6 @@ - diff --git a/tests/service/TestTP/Library.fs b/tests/service/TestTP/Library.fs index 714fa164c1..7530913eb4 100644 --- a/tests/service/TestTP/Library.fs +++ b/tests/service/TestTP/Library.fs @@ -51,28 +51,80 @@ type BasicProvider (config : TypeProviderConfig) as this = myType.AddMember(innerState) let someMethod = ProvidedMethod("DoNothing", [], typeof, - InvokeCode = fun args -> <@@ Helper.doNothing(); - Helper.doNothingOneArg(3) - Helper.doNothingGeneric(3) - Helper.C.DoNothing() - Helper.C.DoNothingGeneric(3) - Helper.C.DoNothingOneArg(3) - Helper.C.DoNothingTwoArg(Helper.C(), 3) - Helper.C().InstanceDoNothing() - Helper.C().InstanceDoNothingGeneric(3) - Helper.C().InstanceDoNothingOneArg(3) - Helper.C().InstanceDoNothingTwoArg(Helper.C(), 3) - Helper.G.DoNothing() - // These do not seem to compile correctly when used in provided expressions: - //Helper.G.DoNothingGeneric(3) - Helper.G.DoNothingOneArg(3) - Helper.G.DoNothingTwoArg(Helper.C(), 3) - Helper.G().InstanceDoNothing() - // These do not seem to compile correctly when used in provided expressions: - //Helper.G().InstanceDoNothingGeneric(3) - Helper.G().InstanceDoNothingOneArg(3) - Helper.G().InstanceDoNothingTwoArg(Helper.C(), 3) @@>) + InvokeCode = fun args -> <@@ Helper.doNothing() @@>) + myType.AddMember(someMethod) + + let someMethod = ProvidedMethod("DoNothingOneArg", [], typeof, + InvokeCode = fun args -> <@@ Helper.doNothingOneArg(3) @@>) + myType.AddMember(someMethod) + + let someMethod = ProvidedMethod("DoNothingGeneric", [], typeof, + InvokeCode = fun args -> <@@ Helper.doNothingGeneric(3) @@>) + myType.AddMember(someMethod) + + let someMethod = ProvidedMethod("ClassDoNothing", [], typeof, + InvokeCode = fun args -> <@@ Helper.C.DoNothing() @@>) + myType.AddMember(someMethod) + + let someMethod = ProvidedMethod("ClassDoNothingGeneric", [], typeof, + InvokeCode = fun args -> <@@ Helper.C.DoNothingGeneric(3) @@>) + + myType.AddMember(someMethod) + + let someMethod = ProvidedMethod("ClassDoNothingOneArg", [], typeof, + InvokeCode = fun args -> <@@ Helper.C.DoNothingOneArg(3) @@>) + + myType.AddMember(someMethod) + + let someMethod = ProvidedMethod("ClassDoNothingTwoArg", [], typeof, + InvokeCode = fun args -> <@@ Helper.C.DoNothingTwoArg(Helper.C(), 3) @@>) + myType.AddMember(someMethod) + + let someMethod = ProvidedMethod("ClassInstanceDoNothing", [], typeof, + InvokeCode = fun args -> <@@ Helper.C().InstanceDoNothing() @@>) + myType.AddMember(someMethod) + + let someMethod = ProvidedMethod("ClassInstanceDoNothingGeneric", [], typeof, + InvokeCode = fun args -> <@@ Helper.C().InstanceDoNothingGeneric(3) @@>) + myType.AddMember(someMethod) + + let someMethod = ProvidedMethod("ClassInstanceDoNothingOneArg", [], typeof, + InvokeCode = fun args -> <@@ Helper.C().InstanceDoNothingOneArg(3) @@>) + myType.AddMember(someMethod) + + let someMethod = ProvidedMethod("ClassInstanceDoNothingTwoArg", [], typeof, + InvokeCode = fun args -> <@@ Helper.C().InstanceDoNothingTwoArg(Helper.C(), 3) @@>) + myType.AddMember(someMethod) + + let someMethod = ProvidedMethod("GenericClassDoNothing", [], typeof, + InvokeCode = fun args -> <@@ Helper.G.DoNothing() @@>) + myType.AddMember(someMethod) + + // These do not seem to compile correctly when used in provided expressions: + //Helper.G.DoNothingGeneric(3) + + // These do not seem to compile correctly when used in provided expressions: + //Helper.G().InstanceDoNothingGeneric(3) + + let someMethod = ProvidedMethod("GenericClassDoNothingOneArg", [], typeof, + InvokeCode = fun args -> <@@ Helper.G.DoNothingOneArg(3) @@>) + myType.AddMember(someMethod) + + let someMethod = ProvidedMethod("GenericClassDoNothingTwoArg", [], typeof, + InvokeCode = fun args -> <@@ Helper.G.DoNothingTwoArg(Helper.C(), 3) @@>) + myType.AddMember(someMethod) + + let someMethod = ProvidedMethod("GenericClassInstanceDoNothing", [], typeof, + InvokeCode = fun args -> <@@ Helper.G().InstanceDoNothing() @@>) + myType.AddMember(someMethod) + + + let someMethod = ProvidedMethod("GenericClassInstanceDoNothingOneArg", [], typeof, + InvokeCode = fun args -> <@@ Helper.G().InstanceDoNothingOneArg(3) @@>) + myType.AddMember(someMethod) + let someMethod = ProvidedMethod("GenericClassInstanceDoNothingTwoArg", [], typeof, + InvokeCode = fun args -> <@@ Helper.G().InstanceDoNothingTwoArg(Helper.C(), 3) @@>) myType.AddMember(someMethod) [myType] From d821ab97be6fe220efba488df46951ad8b7c8a30 Mon Sep 17 00:00:00 2001 From: Don Syme Date: Tue, 1 Dec 2015 18:13:52 +0000 Subject: [PATCH 05/23] make tests pass --- tests/service/ExprTests.fs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/service/ExprTests.fs b/tests/service/ExprTests.fs index 1ca465921a..324c1fca4b 100644 --- a/tests/service/ExprTests.fs +++ b/tests/service/ExprTests.fs @@ -673,6 +673,7 @@ let ``Test expressions of declarations stress big expressions`` () = printDeclarations None (List.ofSeq file1.Declarations) |> Seq.toList |> ignore +#if FX_ATLEAST_45 [] let ``Check use of type provider that provides calls to F# code`` () = @@ -707,6 +708,7 @@ let ``Check use of type provider that provides calls to F# code`` () = """member get_X13(this) (unitVar1) = let this: Microsoft.FSharp.Core.obj = ("My internal state" :> Microsoft.FSharp.Core.obj) :> ErasedWithConstructor.Provided.MyType in G`1.DoNothingOneArg (3) @ (18,22--18,55)"""; """member get_X14(this) (unitVar1) = let this: Microsoft.FSharp.Core.obj = ("My internal state" :> Microsoft.FSharp.Core.obj) :> ErasedWithConstructor.Provided.MyType in G`1.DoNothingTwoArg (new C(),3) @ (19,22--19,55)"""] +#endif #if SELF_HOST_STRESS From 220829cd449cb3d8388a3cfeab7ebedeb76c3ab9 Mon Sep 17 00:00:00 2001 From: Don Syme Date: Tue, 1 Dec 2015 18:45:27 +0000 Subject: [PATCH 06/23] make tests pass (3) --- tests/service/ExprTests.fs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/service/ExprTests.fs b/tests/service/ExprTests.fs index 324c1fca4b..90247e8565 100644 --- a/tests/service/ExprTests.fs +++ b/tests/service/ExprTests.fs @@ -678,7 +678,7 @@ let ``Test expressions of declarations stress big expressions`` () = [] let ``Check use of type provider that provides calls to F# code`` () = let res = - checker.GetProjectOptionsFromProjectFile (Path.Combine(__SOURCE_DIRECTORY__, @"TestProject\TestProject.fsproj")) + checker.GetProjectOptionsFromProjectFile (Path.Combine(Path.Combine(__SOURCE_DIRECTORY__, "TestProject"),"TestProject.fsproj")) |> checker.ParseAndCheckProject |> Async.RunSynchronously From aef10af0afe32f878a5faa99b9c4f3b58921f47f Mon Sep 17 00:00:00 2001 From: Don Syme Date: Wed, 2 Dec 2015 00:38:14 +0000 Subject: [PATCH 07/23] Update FSharp.Compiler.Service.sln --- FSharp.Compiler.Service.sln | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/FSharp.Compiler.Service.sln b/FSharp.Compiler.Service.sln index 99549e8cca..b05c9f0672 100644 --- a/FSharp.Compiler.Service.sln +++ b/FSharp.Compiler.Service.sln @@ -1,6 +1,6 @@ Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 14 -VisualStudioVersion = 14.0.23107.0 +# Visual Studio 2013 +VisualStudioVersion = 12.0.31101.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "project", "project", "{B6B68AE6-E7A4-4D43-9B34-FFA74BFE192B}" ProjectSection(SolutionItems) = preProject From f6b24b50bebdbeb7f9c16f0e2d01edaa4dca2d0c Mon Sep 17 00:00:00 2001 From: Don Syme Date: Wed, 2 Dec 2015 01:26:03 +0000 Subject: [PATCH 08/23] fix build after integration --- tests/service/ExprTests.fs | 10 ++++++---- tests/service/ProjectOptionsTests.fs | 1 + 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/tests/service/ExprTests.fs b/tests/service/ExprTests.fs index 90247e8565..0e0ef58fe4 100644 --- a/tests/service/ExprTests.fs +++ b/tests/service/ExprTests.fs @@ -1,6 +1,7 @@  #if INTERACTIVE #r "../../bin/v4.5/FSharp.Compiler.Service.dll" +#r "../../bin/v4.5/FSharp.Compiler.Service.ProjectCracker.dll" #r "../../packages/NUnit/lib/nunit.framework.dll" #load "FsUnit.fs" #load "Common.fs" @@ -16,6 +17,7 @@ open System.IO open System.Collections.Generic open Microsoft.FSharp.Compiler open Microsoft.FSharp.Compiler.SourceCodeServices +open FSharp.Compiler.Service open FSharp.Compiler.Service.Tests.Common // Create an interactive checker instance @@ -678,7 +680,7 @@ let ``Test expressions of declarations stress big expressions`` () = [] let ``Check use of type provider that provides calls to F# code`` () = let res = - checker.GetProjectOptionsFromProjectFile (Path.Combine(Path.Combine(__SOURCE_DIRECTORY__, "TestProject"),"TestProject.fsproj")) + ProjectCracker.GetProjectOptionsFromProjectFile (Path.Combine(Path.Combine(__SOURCE_DIRECTORY__, "TestProject"),"TestProject.fsproj")) |> checker.ParseAndCheckProject |> Async.RunSynchronously @@ -716,7 +718,7 @@ let ``Check use of type provider that provides calls to F# code`` () = let ``Test Declarations selfhost`` () = let projectFile = __SOURCE_DIRECTORY__ + @"/FSharp.Compiler.Service.Tests.fsproj" // Check with Configuration = Release - let options = checker.GetProjectOptionsFromProjectFile(projectFile, [("Configuration", "Debug")]) + let options = ProjectCracker.GetProjectOptionsFromProjectFile(projectFile, [("Configuration", "Debug")]) let wholeProjectResults = checker.ParseAndCheckProject(options) |> Async.RunSynchronously wholeProjectResults.Errors.Length |> shouldEqual 0 @@ -735,7 +737,7 @@ let ``Test Declarations selfhost whole compiler`` () = let projectFile = __SOURCE_DIRECTORY__ + @"/../../src/fsharp/FSharp.Compiler.Service/FSharp.Compiler.Service.fsproj" //let v = FSharpProjectFileInfo.Parse(projectFile, [("Configuration", "Debug"); ("NoFsSrGenTask", "true")],enableLogging=true) - let options = checker.GetProjectOptionsFromProjectFile(projectFile, [("Configuration", "Debug"); ("NoFsSrGenTask", "true")]) + let options = ProjectCracker.GetProjectOptionsFromProjectFile(projectFile, [("Configuration", "Debug"); ("NoFsSrGenTask", "true")]) // For subsets of the compiler: //let options = { options with OtherOptions = options.OtherOptions.[0..51] } @@ -773,7 +775,7 @@ let ``Test Declarations selfhost FSharp.Core`` () = Environment.CurrentDirectory <- __SOURCE_DIRECTORY__ + @"/../../../fsharp/src/fsharp/FSharp.Core" let projectFile = __SOURCE_DIRECTORY__ + @"/../../../fsharp/src/fsharp/FSharp.Core/FSharp.Core.fsproj" - let options = checker.GetProjectOptionsFromProjectFile(projectFile, [("Configuration", "Debug")]) + let options = ProjectCracker.GetProjectOptionsFromProjectFile(projectFile, [("Configuration", "Debug")]) let wholeProjectResults = checker.ParseAndCheckProject(options) |> Async.RunSynchronously diff --git a/tests/service/ProjectOptionsTests.fs b/tests/service/ProjectOptionsTests.fs index a1ee9e2721..474aeac33d 100644 --- a/tests/service/ProjectOptionsTests.fs +++ b/tests/service/ProjectOptionsTests.fs @@ -1,5 +1,6 @@ #if INTERACTIVE #r "../../bin/v4.5/FSharp.Compiler.Service.dll" +#r "../../bin/v4.5/FSharp.Compiler.Service.ProjectCracker.dll" #r "../../packages/NUnit/lib/nunit.framework.dll" #load "FsUnit.fs" #load "Common.fs" From 2e6941857966f3bac57b047830bfec6dbbafd020 Mon Sep 17 00:00:00 2001 From: Don Syme Date: Wed, 2 Dec 2015 01:42:21 +0000 Subject: [PATCH 09/23] Update FSharp.Compiler.Service.sln --- FSharp.Compiler.Service.sln | 4 ---- 1 file changed, 4 deletions(-) diff --git a/FSharp.Compiler.Service.sln b/FSharp.Compiler.Service.sln index 8ea4bc0195..56cf619e1e 100644 --- a/FSharp.Compiler.Service.sln +++ b/FSharp.Compiler.Service.sln @@ -1,9 +1,5 @@ Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 14 -VisualStudioVersion = 14.0.23107.0 # Visual Studio 2013 -VisualStudioVersion = 12.0.30501.0 -# Visual Studio 2013 VisualStudioVersion = 12.0.31101.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "project", "project", "{B6B68AE6-E7A4-4D43-9B34-FFA74BFE192B}" From 7d94a87414c10124120779d021b38d6bd3e13d3d Mon Sep 17 00:00:00 2001 From: Don Syme Date: Wed, 2 Dec 2015 01:42:39 +0000 Subject: [PATCH 10/23] Update FSharp.Compiler.Service.sln --- FSharp.Compiler.Service.sln | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FSharp.Compiler.Service.sln b/FSharp.Compiler.Service.sln index 56cf619e1e..db02d7b0d2 100644 --- a/FSharp.Compiler.Service.sln +++ b/FSharp.Compiler.Service.sln @@ -1,6 +1,6 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 2013 -VisualStudioVersion = 12.0.31101.0 +VisualStudioVersion = 12.0.30501.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "project", "project", "{B6B68AE6-E7A4-4D43-9B34-FFA74BFE192B}" ProjectSection(SolutionItems) = preProject From 5acdfa6eef02d8049c33e7cf0c3cc6c876d21b64 Mon Sep 17 00:00:00 2001 From: Don Syme Date: Wed, 2 Dec 2015 01:53:36 +0000 Subject: [PATCH 11/23] remove warnings, add diagnostics --- tests/service/ExprTests.fs | 3 +++ tests/service/TestTP/TestTP.fsproj | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/tests/service/ExprTests.fs b/tests/service/ExprTests.fs index 0e0ef58fe4..de09b00e0d 100644 --- a/tests/service/ExprTests.fs +++ b/tests/service/ExprTests.fs @@ -684,6 +684,9 @@ let ``Check use of type provider that provides calls to F# code`` () = |> checker.ParseAndCheckProject |> Async.RunSynchronously + for r in res.Errors do + printfn "%d, %d: %s" r.StartLineAlternate r.StartColumn r.Message + res.Errors.Length |> shouldEqual 0 let results = diff --git a/tests/service/TestTP/TestTP.fsproj b/tests/service/TestTP/TestTP.fsproj index 8820c90403..2524be6df2 100644 --- a/tests/service/TestTP/TestTP.fsproj +++ b/tests/service/TestTP/TestTP.fsproj @@ -1,5 +1,5 @@  - + Debug From caf61f14b9f643b8a737f417419741ace8a75916 Mon Sep 17 00:00:00 2001 From: Don Syme Date: Wed, 2 Dec 2015 11:05:51 +0000 Subject: [PATCH 12/23] fix release test --- tests/service/ExprTests.fs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/tests/service/ExprTests.fs b/tests/service/ExprTests.fs index de09b00e0d..6f445c2bbf 100644 --- a/tests/service/ExprTests.fs +++ b/tests/service/ExprTests.fs @@ -679,8 +679,14 @@ let ``Test expressions of declarations stress big expressions`` () = [] let ``Check use of type provider that provides calls to F# code`` () = + let config = +#if DEBUG + ["Configuration", "Debug"] +#else + ["Configuration", "Release"] +#endif let res = - ProjectCracker.GetProjectOptionsFromProjectFile (Path.Combine(Path.Combine(__SOURCE_DIRECTORY__, "TestProject"),"TestProject.fsproj")) + ProjectCracker.GetProjectOptionsFromProjectFile (Path.Combine(Path.Combine(__SOURCE_DIRECTORY__, "TestProject"),"TestProject.fsproj"), config) |> checker.ParseAndCheckProject |> Async.RunSynchronously From 97e76c097974979d97980509fbd1bd05a9e9b234 Mon Sep 17 00:00:00 2001 From: Don Syme Date: Wed, 2 Dec 2015 15:42:50 +0000 Subject: [PATCH 13/23] adjust namespaces and add reference for unittests --- .../Program.fs | 2 +- .../ProjectCracker.fs | 14 ++++++-------- tests/service/ExprTests.fs | 1 + tests/service/FSharp.Compiler.Service.Tests.fsproj | 5 +++++ tests/service/MultiProjectAnalysisTests.fs | 1 - tests/service/ProjectOptionsTests.fs | 1 - 6 files changed, 13 insertions(+), 11 deletions(-) diff --git a/src/fsharp/FSharp.Compiler.Service.ProjectCracker.Exe/Program.fs b/src/fsharp/FSharp.Compiler.Service.ProjectCracker.Exe/Program.fs index 5f1f847f2f..d0db1dc933 100644 --- a/src/fsharp/FSharp.Compiler.Service.ProjectCracker.Exe/Program.fs +++ b/src/fsharp/FSharp.Compiler.Service.ProjectCracker.Exe/Program.fs @@ -1,4 +1,4 @@ -namespace FSharp.Compiler.Service.ProjectCracker.Exe +namespace Microsoft.FSharp.Compiler.SourceCodeServices.ProjectCracker.Exe open Microsoft.Build.Framework open Microsoft.Build.Utilities diff --git a/src/fsharp/FSharp.Compiler.Service.ProjectCracker/ProjectCracker.fs b/src/fsharp/FSharp.Compiler.Service.ProjectCracker/ProjectCracker.fs index fdc314f793..85dcf21dc1 100644 --- a/src/fsharp/FSharp.Compiler.Service.ProjectCracker/ProjectCracker.fs +++ b/src/fsharp/FSharp.Compiler.Service.ProjectCracker/ProjectCracker.fs @@ -1,4 +1,4 @@ -namespace FSharp.Compiler.Service +namespace Microsoft.FSharp.Compiler.SourceCodeServices open System.Diagnostics open System.Text @@ -6,8 +6,6 @@ open System.IO open System open System.Runtime -open Microsoft.FSharp.Compiler.SourceCodeServices - type ProjectCracker = static member GetProjectOptionsFromProjectFileLogged(projectFileName : string, ?properties : (string * string) list, ?loadedTimeStamp, ?enableLogging) = @@ -16,7 +14,7 @@ type ProjectCracker = let enableLogging = defaultArg enableLogging true let logMap = ref Map.empty - let rec convert (opts: FSharp.Compiler.Service.ProjectCracker.Exe.ProjectOptions) : FSharpProjectOptions = + let rec convert (opts: Microsoft.FSharp.Compiler.SourceCodeServices.ProjectCracker.Exe.ProjectOptions) : FSharpProjectOptions = let referencedProjects = Array.map (fun (a, b) -> a, convert b) opts.ReferencedProjectOptions logMap := Map.add opts.ProjectFile opts.LogOutput !logMap { ProjectFileName = opts.ProjectFile @@ -33,10 +31,10 @@ type ProjectCracker = arguments.Append(' ').Append(enableLogging.ToString()) |> ignore for k, v in properties do arguments.Append(' ').Append(k).Append(' ').Append(v) |> ignore - + let codebase = Path.GetDirectoryName(Uri(typeof.Assembly.CodeBase).LocalPath) + let p = new System.Diagnostics.Process() - p.StartInfo.FileName <- Path.Combine(Path.GetDirectoryName(Reflection.Assembly.GetExecutingAssembly().Location), - "FSharp.Compiler.Service.ProjectCracker.Exe.exe") + p.StartInfo.FileName <- Path.Combine(codebase,"FSharp.Compiler.Service.ProjectCracker.Exe.exe") p.StartInfo.Arguments <- arguments.ToString() p.StartInfo.UseShellExecute <- false p.StartInfo.CreateNoWindow <- true @@ -44,7 +42,7 @@ type ProjectCracker = ignore <| p.Start() let fmt = new Serialization.Formatters.Binary.BinaryFormatter() - let opts = fmt.Deserialize(p.StandardOutput.BaseStream) :?> FSharp.Compiler.Service.ProjectCracker.Exe.ProjectOptions + let opts = fmt.Deserialize(p.StandardOutput.BaseStream) :?> Microsoft.FSharp.Compiler.SourceCodeServices.ProjectCracker.Exe.ProjectOptions p.WaitForExit() convert opts, !logMap diff --git a/tests/service/ExprTests.fs b/tests/service/ExprTests.fs index 6f445c2bbf..955566eb57 100644 --- a/tests/service/ExprTests.fs +++ b/tests/service/ExprTests.fs @@ -2,6 +2,7 @@ #if INTERACTIVE #r "../../bin/v4.5/FSharp.Compiler.Service.dll" #r "../../bin/v4.5/FSharp.Compiler.Service.ProjectCracker.dll" +#r "../../bin/v4.5/FSharp.Compiler.Service.ProjectCracker.Exe.exe" #r "../../packages/NUnit/lib/nunit.framework.dll" #load "FsUnit.fs" #load "Common.fs" diff --git a/tests/service/FSharp.Compiler.Service.Tests.fsproj b/tests/service/FSharp.Compiler.Service.Tests.fsproj index f55216f86c..c456d9a2d7 100644 --- a/tests/service/FSharp.Compiler.Service.Tests.fsproj +++ b/tests/service/FSharp.Compiler.Service.Tests.fsproj @@ -86,6 +86,11 @@ + + FSharp.Compiler.Service.ProjectCracker.Exe + {b1bdd96d-47e1-4e65-8107-fbae23a06db4} + True + FSharp.Compiler.Service.ProjectCracker {893c3cd9-5af8-4027-a667-21e62fc2c703} diff --git a/tests/service/MultiProjectAnalysisTests.fs b/tests/service/MultiProjectAnalysisTests.fs index 676f70a4b9..771b240646 100644 --- a/tests/service/MultiProjectAnalysisTests.fs +++ b/tests/service/MultiProjectAnalysisTests.fs @@ -20,7 +20,6 @@ open System open System.Collections.Generic open Microsoft.FSharp.Compiler.SourceCodeServices open FSharp.Compiler.Service.Tests.Common -open FSharp.Compiler.Service let numProjectsForStressTest = 100 let checker = FSharpChecker.Create(projectCacheSize=numProjectsForStressTest + 10) diff --git a/tests/service/ProjectOptionsTests.fs b/tests/service/ProjectOptionsTests.fs index 7427aaeed8..8172f33aae 100644 --- a/tests/service/ProjectOptionsTests.fs +++ b/tests/service/ProjectOptionsTests.fs @@ -15,7 +15,6 @@ open System.IO open NUnit.Framework open FsUnit open Microsoft.FSharp.Compiler.SourceCodeServices -open FSharp.Compiler.Service open FSharp.Compiler.Service.Tests.Common From bfbe42987b12e24bbbf08ba831c3e5ff5c05405c Mon Sep 17 00:00:00 2001 From: Don Syme Date: Wed, 2 Dec 2015 17:00:07 +0000 Subject: [PATCH 14/23] try fix travis --- tests/service/ExprTests.fs | 7 ++++++- tests/service/TestProject/TestProject.fsproj | 6 +++--- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/tests/service/ExprTests.fs b/tests/service/ExprTests.fs index 955566eb57..ec93bbe1ea 100644 --- a/tests/service/ExprTests.fs +++ b/tests/service/ExprTests.fs @@ -686,8 +686,13 @@ let ``Check use of type provider that provides calls to F# code`` () = #else ["Configuration", "Release"] #endif - let res = + let options = ProjectCracker.GetProjectOptionsFromProjectFile (Path.Combine(Path.Combine(__SOURCE_DIRECTORY__, "TestProject"),"TestProject.fsproj"), config) + + printfn "options = %A" options + + let res = + options |> checker.ParseAndCheckProject |> Async.RunSynchronously diff --git a/tests/service/TestProject/TestProject.fsproj b/tests/service/TestProject/TestProject.fsproj index da40924485..2ec53d65b8 100644 --- a/tests/service/TestProject/TestProject.fsproj +++ b/tests/service/TestProject/TestProject.fsproj @@ -1,5 +1,5 @@  - + Debug @@ -9,8 +9,8 @@ Library TestProject TestProject - v4.5.2 - 4.4.0.0 + v4.5 + 4.3.0.0 true TestProject From ea2c82854d160d224120123c6f98b4d3a489ae5c Mon Sep 17 00:00:00 2001 From: Don Syme Date: Wed, 2 Dec 2015 18:01:30 +0000 Subject: [PATCH 15/23] Update FSharp.Compiler.Service.sln --- FSharp.Compiler.Service.sln | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FSharp.Compiler.Service.sln b/FSharp.Compiler.Service.sln index db02d7b0d2..e54909b3d0 100644 --- a/FSharp.Compiler.Service.sln +++ b/FSharp.Compiler.Service.sln @@ -1,6 +1,6 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 2013 -VisualStudioVersion = 12.0.30501.0 +VisualStudioVersion = 12.0.30501.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "project", "project", "{B6B68AE6-E7A4-4D43-9B34-FFA74BFE192B}" ProjectSection(SolutionItems) = preProject From 6bd6d30c83f8d85130528c7c4ee9067cddb6c0a5 Mon Sep 17 00:00:00 2001 From: Don Syme Date: Wed, 2 Dec 2015 18:09:46 +0000 Subject: [PATCH 16/23] move files --- FSharp.Compiler.Service.sln | 41 ++++++++++--------- tests/service/ExprTests.fs | 2 +- .../{ => data}/TestProject/AssemblyInfo.fs | 0 .../service/{ => data}/TestProject/Library.fs | 0 .../{ => data}/TestProject/TestProject.fsproj | 0 tests/service/{ => data}/TestTP/Library.fs | 0 .../{ => data}/TestTP/ProvidedTypes.fs | 0 .../{ => data}/TestTP/ProvidedTypes.fsi | 0 tests/service/{ => data}/TestTP/TestTP.fsproj | 0 9 files changed, 23 insertions(+), 20 deletions(-) rename tests/service/{ => data}/TestProject/AssemblyInfo.fs (100%) rename tests/service/{ => data}/TestProject/Library.fs (100%) rename tests/service/{ => data}/TestProject/TestProject.fsproj (100%) rename tests/service/{ => data}/TestTP/Library.fs (100%) rename tests/service/{ => data}/TestTP/ProvidedTypes.fs (100%) rename tests/service/{ => data}/TestTP/ProvidedTypes.fsi (100%) rename tests/service/{ => data}/TestTP/TestTP.fsproj (100%) diff --git a/FSharp.Compiler.Service.sln b/FSharp.Compiler.Service.sln index e54909b3d0..bae9843aae 100644 --- a/FSharp.Compiler.Service.sln +++ b/FSharp.Compiler.Service.sln @@ -1,6 +1,8 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 2013 VisualStudioVersion = 12.0.30501.0 +# Visual Studio 14 +VisualStudioVersion = 14.0.23107.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "project", "project", "{B6B68AE6-E7A4-4D43-9B34-FFA74BFE192B}" ProjectSection(SolutionItems) = preProject @@ -57,11 +59,12 @@ Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "Fsc", "samples\FscExe\Fsc.f EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CSharp_Analysis", "tests\service\data\CSharp_Analysis\CSharp_Analysis.csproj", "{887630A3-4B1D-40EA-B8B3-2D842E9C40DB}" EndProject -Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "TestTP", "tests\service\TestTP\TestTP.fsproj", "{FF76BD3C-5E0A-4752-B6C3-044F6E15719B}" Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "FSharp.Compiler.Service.ProjectCracker.Exe", "src\fsharp\FSharp.Compiler.Service.ProjectCracker.Exe\FSharp.Compiler.Service.ProjectCracker.Exe.fsproj", "{B1BDD96D-47E1-4E65-8107-FBAE23A06DB4}" EndProject Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "FSharp.Compiler.Service.ProjectCracker", "src\fsharp\FSharp.Compiler.Service.ProjectCracker\FSharp.Compiler.Service.ProjectCracker.fsproj", "{893C3CD9-5AF8-4027-A667-21E62FC2C703}" EndProject +Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "TestTP", "tests\service\data\TestTP\TestTP.fsproj", "{FF76BD3C-5E0A-4752-B6C3-044F6E15719B}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -195,24 +198,6 @@ Global {887630A3-4B1D-40EA-B8B3-2D842E9C40DB}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU {887630A3-4B1D-40EA-B8B3-2D842E9C40DB}.Release|Mixed Platforms.Build.0 = Release|Any CPU {887630A3-4B1D-40EA-B8B3-2D842E9C40DB}.Release|x86.ActiveCfg = Release|Any CPU - {FF76BD3C-5E0A-4752-B6C3-044F6E15719B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {FF76BD3C-5E0A-4752-B6C3-044F6E15719B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {FF76BD3C-5E0A-4752-B6C3-044F6E15719B}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {FF76BD3C-5E0A-4752-B6C3-044F6E15719B}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {FF76BD3C-5E0A-4752-B6C3-044F6E15719B}.Debug|x86.ActiveCfg = Debug|Any CPU - {FF76BD3C-5E0A-4752-B6C3-044F6E15719B}.Debug|x86.Build.0 = Debug|Any CPU - {FF76BD3C-5E0A-4752-B6C3-044F6E15719B}.Proto|Any CPU.ActiveCfg = Release|Any CPU - {FF76BD3C-5E0A-4752-B6C3-044F6E15719B}.Proto|Any CPU.Build.0 = Release|Any CPU - {FF76BD3C-5E0A-4752-B6C3-044F6E15719B}.Proto|Mixed Platforms.ActiveCfg = Release|Any CPU - {FF76BD3C-5E0A-4752-B6C3-044F6E15719B}.Proto|Mixed Platforms.Build.0 = Release|Any CPU - {FF76BD3C-5E0A-4752-B6C3-044F6E15719B}.Proto|x86.ActiveCfg = Release|Any CPU - {FF76BD3C-5E0A-4752-B6C3-044F6E15719B}.Proto|x86.Build.0 = Release|Any CPU - {FF76BD3C-5E0A-4752-B6C3-044F6E15719B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {FF76BD3C-5E0A-4752-B6C3-044F6E15719B}.Release|Any CPU.Build.0 = Release|Any CPU - {FF76BD3C-5E0A-4752-B6C3-044F6E15719B}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {FF76BD3C-5E0A-4752-B6C3-044F6E15719B}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {FF76BD3C-5E0A-4752-B6C3-044F6E15719B}.Release|x86.ActiveCfg = Release|Any CPU - {FF76BD3C-5E0A-4752-B6C3-044F6E15719B}.Release|x86.Build.0 = Release|Any CPU {B1BDD96D-47E1-4E65-8107-FBAE23A06DB4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B1BDD96D-47E1-4E65-8107-FBAE23A06DB4}.Debug|Any CPU.Build.0 = Debug|Any CPU {B1BDD96D-47E1-4E65-8107-FBAE23A06DB4}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU @@ -243,6 +228,24 @@ Global {893C3CD9-5AF8-4027-A667-21E62FC2C703}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU {893C3CD9-5AF8-4027-A667-21E62FC2C703}.Release|Mixed Platforms.Build.0 = Release|Any CPU {893C3CD9-5AF8-4027-A667-21E62FC2C703}.Release|x86.ActiveCfg = Release|Any CPU + {FF76BD3C-5E0A-4752-B6C3-044F6E15719B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FF76BD3C-5E0A-4752-B6C3-044F6E15719B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FF76BD3C-5E0A-4752-B6C3-044F6E15719B}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {FF76BD3C-5E0A-4752-B6C3-044F6E15719B}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {FF76BD3C-5E0A-4752-B6C3-044F6E15719B}.Debug|x86.ActiveCfg = Debug|Any CPU + {FF76BD3C-5E0A-4752-B6C3-044F6E15719B}.Debug|x86.Build.0 = Debug|Any CPU + {FF76BD3C-5E0A-4752-B6C3-044F6E15719B}.Proto|Any CPU.ActiveCfg = Release|Any CPU + {FF76BD3C-5E0A-4752-B6C3-044F6E15719B}.Proto|Any CPU.Build.0 = Release|Any CPU + {FF76BD3C-5E0A-4752-B6C3-044F6E15719B}.Proto|Mixed Platforms.ActiveCfg = Release|Any CPU + {FF76BD3C-5E0A-4752-B6C3-044F6E15719B}.Proto|Mixed Platforms.Build.0 = Release|Any CPU + {FF76BD3C-5E0A-4752-B6C3-044F6E15719B}.Proto|x86.ActiveCfg = Release|Any CPU + {FF76BD3C-5E0A-4752-B6C3-044F6E15719B}.Proto|x86.Build.0 = Release|Any CPU + {FF76BD3C-5E0A-4752-B6C3-044F6E15719B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FF76BD3C-5E0A-4752-B6C3-044F6E15719B}.Release|Any CPU.Build.0 = Release|Any CPU + {FF76BD3C-5E0A-4752-B6C3-044F6E15719B}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {FF76BD3C-5E0A-4752-B6C3-044F6E15719B}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {FF76BD3C-5E0A-4752-B6C3-044F6E15719B}.Release|x86.ActiveCfg = Release|Any CPU + {FF76BD3C-5E0A-4752-B6C3-044F6E15719B}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/tests/service/ExprTests.fs b/tests/service/ExprTests.fs index ec93bbe1ea..79f2f1213c 100644 --- a/tests/service/ExprTests.fs +++ b/tests/service/ExprTests.fs @@ -687,7 +687,7 @@ let ``Check use of type provider that provides calls to F# code`` () = ["Configuration", "Release"] #endif let options = - ProjectCracker.GetProjectOptionsFromProjectFile (Path.Combine(Path.Combine(__SOURCE_DIRECTORY__, "TestProject"),"TestProject.fsproj"), config) + ProjectCracker.GetProjectOptionsFromProjectFile (Path.Combine(Path.Combine(Path.Combine(__SOURCE_DIRECTORY__, "data"),"TestProject","TestProject.fsproj"), config) printfn "options = %A" options diff --git a/tests/service/TestProject/AssemblyInfo.fs b/tests/service/data/TestProject/AssemblyInfo.fs similarity index 100% rename from tests/service/TestProject/AssemblyInfo.fs rename to tests/service/data/TestProject/AssemblyInfo.fs diff --git a/tests/service/TestProject/Library.fs b/tests/service/data/TestProject/Library.fs similarity index 100% rename from tests/service/TestProject/Library.fs rename to tests/service/data/TestProject/Library.fs diff --git a/tests/service/TestProject/TestProject.fsproj b/tests/service/data/TestProject/TestProject.fsproj similarity index 100% rename from tests/service/TestProject/TestProject.fsproj rename to tests/service/data/TestProject/TestProject.fsproj diff --git a/tests/service/TestTP/Library.fs b/tests/service/data/TestTP/Library.fs similarity index 100% rename from tests/service/TestTP/Library.fs rename to tests/service/data/TestTP/Library.fs diff --git a/tests/service/TestTP/ProvidedTypes.fs b/tests/service/data/TestTP/ProvidedTypes.fs similarity index 100% rename from tests/service/TestTP/ProvidedTypes.fs rename to tests/service/data/TestTP/ProvidedTypes.fs diff --git a/tests/service/TestTP/ProvidedTypes.fsi b/tests/service/data/TestTP/ProvidedTypes.fsi similarity index 100% rename from tests/service/TestTP/ProvidedTypes.fsi rename to tests/service/data/TestTP/ProvidedTypes.fsi diff --git a/tests/service/TestTP/TestTP.fsproj b/tests/service/data/TestTP/TestTP.fsproj similarity index 100% rename from tests/service/TestTP/TestTP.fsproj rename to tests/service/data/TestTP/TestTP.fsproj From b5a4736c0a3f76d1db52f40f02eb8e0a3cfc68fd Mon Sep 17 00:00:00 2001 From: Don Syme Date: Wed, 2 Dec 2015 18:11:31 +0000 Subject: [PATCH 17/23] move files (2) --- tests/service/ExprTests.fs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/service/ExprTests.fs b/tests/service/ExprTests.fs index 79f2f1213c..8862a0e846 100644 --- a/tests/service/ExprTests.fs +++ b/tests/service/ExprTests.fs @@ -687,7 +687,7 @@ let ``Check use of type provider that provides calls to F# code`` () = ["Configuration", "Release"] #endif let options = - ProjectCracker.GetProjectOptionsFromProjectFile (Path.Combine(Path.Combine(Path.Combine(__SOURCE_DIRECTORY__, "data"),"TestProject","TestProject.fsproj"), config) + ProjectCracker.GetProjectOptionsFromProjectFile (Path.Combine(Path.Combine(Path.Combine(__SOURCE_DIRECTORY__, "data"),"TestProject"),"TestProject.fsproj"), config) printfn "options = %A" options From 4975b66065b36f2a571487b371ff31b8eb312df5 Mon Sep 17 00:00:00 2001 From: Don Syme Date: Wed, 2 Dec 2015 19:45:21 +0000 Subject: [PATCH 18/23] fix project references --- FSharp.Compiler.Service.sln | 4 +--- .../App.config | 0 ...mpiler.Service.ProjectCracker.Tool.fsproj} | 10 ++++----- .../Program.fs | 18 ++++++++------- ...arp.Compiler.Service.ProjectCracker.fsproj | 4 ++-- .../ProjectCracker.fs | 6 ++--- tests/service/ExprTests.fs | 2 +- .../FSharp.Compiler.Service.Tests.fsproj | 4 ++-- tests/service/ProjectOptionsTests.fs | 22 +++++++++++++++++++ .../data/TestProject/TestProject.fsproj | 2 +- 10 files changed, 47 insertions(+), 25 deletions(-) rename src/fsharp/{FSharp.Compiler.Service.ProjectCracker.Exe => FSharp.Compiler.Service.ProjectCracker.Tool}/App.config (100%) rename src/fsharp/{FSharp.Compiler.Service.ProjectCracker.Exe/FSharp.Compiler.Service.ProjectCracker.Exe.fsproj => FSharp.Compiler.Service.ProjectCracker.Tool/FSharp.Compiler.Service.ProjectCracker.Tool.fsproj} (93%) rename src/fsharp/{FSharp.Compiler.Service.ProjectCracker.Exe => FSharp.Compiler.Service.ProjectCracker.Tool}/Program.fs (97%) diff --git a/FSharp.Compiler.Service.sln b/FSharp.Compiler.Service.sln index bae9843aae..79367e444c 100644 --- a/FSharp.Compiler.Service.sln +++ b/FSharp.Compiler.Service.sln @@ -1,6 +1,4 @@ Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 2013 -VisualStudioVersion = 12.0.30501.0 # Visual Studio 14 VisualStudioVersion = 14.0.23107.0 MinimumVisualStudioVersion = 10.0.40219.1 @@ -59,7 +57,7 @@ Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "Fsc", "samples\FscExe\Fsc.f EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CSharp_Analysis", "tests\service\data\CSharp_Analysis\CSharp_Analysis.csproj", "{887630A3-4B1D-40EA-B8B3-2D842E9C40DB}" EndProject -Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "FSharp.Compiler.Service.ProjectCracker.Exe", "src\fsharp\FSharp.Compiler.Service.ProjectCracker.Exe\FSharp.Compiler.Service.ProjectCracker.Exe.fsproj", "{B1BDD96D-47E1-4E65-8107-FBAE23A06DB4}" +Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "FSharp.Compiler.Service.ProjectCracker.Tool", "src\fsharp\FSharp.Compiler.Service.ProjectCracker.Tool\FSharp.Compiler.Service.ProjectCracker.Tool.fsproj", "{B1BDD96D-47E1-4E65-8107-FBAE23A06DB4}" EndProject Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "FSharp.Compiler.Service.ProjectCracker", "src\fsharp\FSharp.Compiler.Service.ProjectCracker\FSharp.Compiler.Service.ProjectCracker.fsproj", "{893C3CD9-5AF8-4027-A667-21E62FC2C703}" EndProject diff --git a/src/fsharp/FSharp.Compiler.Service.ProjectCracker.Exe/App.config b/src/fsharp/FSharp.Compiler.Service.ProjectCracker.Tool/App.config similarity index 100% rename from src/fsharp/FSharp.Compiler.Service.ProjectCracker.Exe/App.config rename to src/fsharp/FSharp.Compiler.Service.ProjectCracker.Tool/App.config diff --git a/src/fsharp/FSharp.Compiler.Service.ProjectCracker.Exe/FSharp.Compiler.Service.ProjectCracker.Exe.fsproj b/src/fsharp/FSharp.Compiler.Service.ProjectCracker.Tool/FSharp.Compiler.Service.ProjectCracker.Tool.fsproj similarity index 93% rename from src/fsharp/FSharp.Compiler.Service.ProjectCracker.Exe/FSharp.Compiler.Service.ProjectCracker.Exe.fsproj rename to src/fsharp/FSharp.Compiler.Service.ProjectCracker.Tool/FSharp.Compiler.Service.ProjectCracker.Tool.fsproj index bfc08be931..535de51163 100644 --- a/src/fsharp/FSharp.Compiler.Service.ProjectCracker.Exe/FSharp.Compiler.Service.ProjectCracker.Exe.fsproj +++ b/src/fsharp/FSharp.Compiler.Service.ProjectCracker.Tool/FSharp.Compiler.Service.ProjectCracker.Tool.fsproj @@ -7,18 +7,18 @@ 2.0 b1bdd96d-47e1-4e65-8107-fbae23a06db4 Exe - FSharp.Compiler.Service.ProjectCracker.Exe - FSharp.Compiler.Service.ProjectCracker.Exe + FSharp.Compiler.Service.ProjectCracker.Tool + FSharp.Compiler.Service.ProjectCracker.Tool v4.5 4.3.0.0 ..\..\..\ - FSharp.Compiler.Service.ProjectCracker.Exe + FSharp.Compiler.Service.ProjectCracker.Tool $(OtherFlags) --staticlink:FSharp.Core $(NoWarn);40 true - FSharp.Compiler.Service.ProjectCracker.Exe + FSharp.Compiler.Service.ProjectCracker.Tool ..\..\..\bin\$(TargetFrameworkVersion) - ..\..\..\bin\$(TargetFrameworkVersion)\FSharp.Compiler.Service.ProjectCracker.Exe.XML + ..\..\..\bin\$(TargetFrameworkVersion)\FSharp.Compiler.Service.ProjectCracker.Tool.XML true diff --git a/src/fsharp/FSharp.Compiler.Service.ProjectCracker.Exe/Program.fs b/src/fsharp/FSharp.Compiler.Service.ProjectCracker.Tool/Program.fs similarity index 97% rename from src/fsharp/FSharp.Compiler.Service.ProjectCracker.Exe/Program.fs rename to src/fsharp/FSharp.Compiler.Service.ProjectCracker.Tool/Program.fs index d0db1dc933..9609404515 100644 --- a/src/fsharp/FSharp.Compiler.Service.ProjectCracker.Exe/Program.fs +++ b/src/fsharp/FSharp.Compiler.Service.ProjectCracker.Tool/Program.fs @@ -1,4 +1,4 @@ -namespace Microsoft.FSharp.Compiler.SourceCodeServices.ProjectCracker.Exe +namespace Microsoft.FSharp.Compiler.SourceCodeServices.ProjectCracker.Tool open Microsoft.Build.Framework open Microsoft.Build.Utilities @@ -37,7 +37,7 @@ module Program = member x.Log = sb.ToString() type internal HostCompile() = - member th.Compile(_, _, _) = 0 + member th.Compile(_:obj, _:obj, _:obj) = 0 interface ITaskHost //---------------------------------------------------------------------------- @@ -127,17 +127,19 @@ module Program = let host = new HostCompile() engine.HostServices.RegisterHostObject(fsprojFullPath, "CoreCompile", "Fsc", host) + + engine.SetGlobalProperty("BuildingInsideVisualStudio", "true") |> ignore + engine.SetGlobalProperty("VisualStudioVersion", "12.0") |> ignore + engine.SetGlobalProperty("ShouldUnsetParentConfigurationAndPlatform", "false") |> ignore + for (prop, value) in properties do + engine.SetGlobalProperty(prop, value) |> ignore + let projectInstanceFromFullPath (fsprojFullPath: string) = use stream = new IO.StreamReader(fsprojFullPath) use xmlReader = System.Xml.XmlReader.Create(stream) let project = engine.LoadProject(xmlReader, FullPath=fsprojFullPath) - - project.SetGlobalProperty("BuildingInsideVisualStudio", "true") |> ignore - project.SetGlobalProperty("VisualStudioVersion", "12.0") |> ignore - for (prop, value) in properties do - project.SetProperty(prop, value) |> ignore - + project.CreateProjectInstance() let project = projectInstanceFromFullPath fsprojFullPath diff --git a/src/fsharp/FSharp.Compiler.Service.ProjectCracker/FSharp.Compiler.Service.ProjectCracker.fsproj b/src/fsharp/FSharp.Compiler.Service.ProjectCracker/FSharp.Compiler.Service.ProjectCracker.fsproj index 2b1f1e14aa..c2eb8fd3e6 100644 --- a/src/fsharp/FSharp.Compiler.Service.ProjectCracker/FSharp.Compiler.Service.ProjectCracker.fsproj +++ b/src/fsharp/FSharp.Compiler.Service.ProjectCracker/FSharp.Compiler.Service.ProjectCracker.fsproj @@ -48,8 +48,8 @@ - - FSharp.Compiler.Service.ProjectCracker.Exe + + FSharp.Compiler.Service.ProjectCracker.Tool {b1bdd96d-47e1-4e65-8107-fbae23a06db4} True diff --git a/src/fsharp/FSharp.Compiler.Service.ProjectCracker/ProjectCracker.fs b/src/fsharp/FSharp.Compiler.Service.ProjectCracker/ProjectCracker.fs index 85dcf21dc1..a6f96c4bec 100644 --- a/src/fsharp/FSharp.Compiler.Service.ProjectCracker/ProjectCracker.fs +++ b/src/fsharp/FSharp.Compiler.Service.ProjectCracker/ProjectCracker.fs @@ -14,7 +14,7 @@ type ProjectCracker = let enableLogging = defaultArg enableLogging true let logMap = ref Map.empty - let rec convert (opts: Microsoft.FSharp.Compiler.SourceCodeServices.ProjectCracker.Exe.ProjectOptions) : FSharpProjectOptions = + let rec convert (opts: Microsoft.FSharp.Compiler.SourceCodeServices.ProjectCracker.Tool.ProjectOptions) : FSharpProjectOptions = let referencedProjects = Array.map (fun (a, b) -> a, convert b) opts.ReferencedProjectOptions logMap := Map.add opts.ProjectFile opts.LogOutput !logMap { ProjectFileName = opts.ProjectFile @@ -34,7 +34,7 @@ type ProjectCracker = let codebase = Path.GetDirectoryName(Uri(typeof.Assembly.CodeBase).LocalPath) let p = new System.Diagnostics.Process() - p.StartInfo.FileName <- Path.Combine(codebase,"FSharp.Compiler.Service.ProjectCracker.Exe.exe") + p.StartInfo.FileName <- Path.Combine(codebase,"FSharp.Compiler.Service.ProjectCracker.Tool.exe") p.StartInfo.Arguments <- arguments.ToString() p.StartInfo.UseShellExecute <- false p.StartInfo.CreateNoWindow <- true @@ -42,7 +42,7 @@ type ProjectCracker = ignore <| p.Start() let fmt = new Serialization.Formatters.Binary.BinaryFormatter() - let opts = fmt.Deserialize(p.StandardOutput.BaseStream) :?> Microsoft.FSharp.Compiler.SourceCodeServices.ProjectCracker.Exe.ProjectOptions + let opts = fmt.Deserialize(p.StandardOutput.BaseStream) :?> Microsoft.FSharp.Compiler.SourceCodeServices.ProjectCracker.Tool.ProjectOptions p.WaitForExit() convert opts, !logMap diff --git a/tests/service/ExprTests.fs b/tests/service/ExprTests.fs index 8862a0e846..a8185dcc93 100644 --- a/tests/service/ExprTests.fs +++ b/tests/service/ExprTests.fs @@ -2,7 +2,7 @@ #if INTERACTIVE #r "../../bin/v4.5/FSharp.Compiler.Service.dll" #r "../../bin/v4.5/FSharp.Compiler.Service.ProjectCracker.dll" -#r "../../bin/v4.5/FSharp.Compiler.Service.ProjectCracker.Exe.exe" +#r "../../bin/v4.5/FSharp.Compiler.Service.ProjectCracker.Tool.exe" #r "../../packages/NUnit/lib/nunit.framework.dll" #load "FsUnit.fs" #load "Common.fs" diff --git a/tests/service/FSharp.Compiler.Service.Tests.fsproj b/tests/service/FSharp.Compiler.Service.Tests.fsproj index c456d9a2d7..0350be8865 100644 --- a/tests/service/FSharp.Compiler.Service.Tests.fsproj +++ b/tests/service/FSharp.Compiler.Service.Tests.fsproj @@ -86,8 +86,8 @@ - - FSharp.Compiler.Service.ProjectCracker.Exe + + FSharp.Compiler.Service.ProjectCracker.Tool {b1bdd96d-47e1-4e65-8107-fbae23a06db4} True diff --git a/tests/service/ProjectOptionsTests.fs b/tests/service/ProjectOptionsTests.fs index 8172f33aae..38f6d7979e 100644 --- a/tests/service/ProjectOptionsTests.fs +++ b/tests/service/ProjectOptionsTests.fs @@ -1,6 +1,7 @@ #if INTERACTIVE #r "../../bin/v4.5/FSharp.Compiler.Service.dll" #r "../../bin/v4.5/FSharp.Compiler.Service.ProjectCracker.dll" +#r "../../bin/v4.5/FSharp.Compiler.Service.ProjectCracker.Tool.exe" #r "../../packages/NUnit/lib/nunit.framework.dll" #load "FsUnit.fs" #load "Common.fs" @@ -34,6 +35,7 @@ let checkOptionNotPresent (opts:string[]) s = |> shouldEqual notFound let getReferencedFilenames = Array.choose (fun (o:string) -> if o.StartsWith("-r:") then o.[3..] |> (Path.GetFileName >> Some) else None) +let getReferencedFilenamesAndContainingFolders = Array.choose (fun (o:string) -> if o.StartsWith("-r:") then o.[3..] |> (fun r -> ((r |> Path.GetFileName), (r |> Path.GetDirectoryName |> Path.GetFileName)) |> Some) else None) let getOutputFile = Array.pick (fun (o:string) -> if o.StartsWith("--out:") then o.[6..] |> Some else None) let getCompiledFilenames = Array.choose (fun (o:string) -> if o.EndsWith(".fs") then o |> (Path.GetFileName >> Some) else None) @@ -377,5 +379,25 @@ let ``Project file parsing -- Exe with a PCL reference``() = references |> should contain "mscorlib.dll" references |> should contain "System.Reflection.dll" references |> should contain "System.Reflection.Emit.Lightweight.dll" + + +[] +let ``Project file parsing -- project reference in release mode``() = + + let f = normalizePath(__SOURCE_DIRECTORY__ + @"/data/TestProject/TestProject.fsproj") + let p = ProjectCracker.GetProjectOptionsFromProjectFile(f,[("Configuration","Release")]) + let references = getReferencedFilenamesAndContainingFolders p.OtherOptions |> set + references |> should contain ("FSharp.Core.dll", "4.3.0.0") + references |> should contain ("TestTP.dll", "Release") + +[] +let ``Project file parsing -- project reference in debug mode``() = + + let f = normalizePath(__SOURCE_DIRECTORY__ + @"/data/TestProject/TestProject.fsproj") + let p = ProjectCracker.GetProjectOptionsFromProjectFile(f,[("Configuration","Debug")]) + let references = getReferencedFilenamesAndContainingFolders p.OtherOptions |> set + references |> should contain ("FSharp.Core.dll", "4.3.0.0") + references |> should contain ("TestTP.dll", "Debug") + #endif diff --git a/tests/service/data/TestProject/TestProject.fsproj b/tests/service/data/TestProject/TestProject.fsproj index 2ec53d65b8..9cbed99436 100644 --- a/tests/service/data/TestProject/TestProject.fsproj +++ b/tests/service/data/TestProject/TestProject.fsproj @@ -1,5 +1,5 @@  - + Debug From 30842362a7334235cc05ca9e7436891dc39e1833 Mon Sep 17 00:00:00 2001 From: Don Syme Date: Wed, 2 Dec 2015 20:01:07 +0000 Subject: [PATCH 19/23] normalize XML --> xml --- nuget/paket.template | 4 ++-- nuget/projectcracker.template | 8 ++++---- samples/EditorService/EditorService.fsproj | 4 ++-- samples/FscExe/Fsc.fsproj | 4 ++-- samples/FsiExe/FsiExe.fsproj | 4 ++-- samples/InteractiveService/InteractiveService.fsproj | 4 ++-- samples/Tokenizer/Tokenizer.fsproj | 4 ++-- samples/UntypedTree/UntypedTree.fsproj | 4 ++-- .../FSharp.Compiler.Service.ProjectCracker.Tool.fsproj | 2 +- .../FSharp.Compiler.Service.ProjectCracker.fsproj | 4 ++-- .../FSharp.Compiler.Service.fsproj | 4 ++-- .../SampleVisualStudio2010FSharpConsoleApp.fsproj | 4 ++-- .../SampleVisualStudio2010FSharpConsoleApp.fsproj | 4 ++-- .../SampleVisualStudio2010FSharpConsoleApp.fsproj | 4 ++-- .../Sample_VS2012_FSharp_ConsoleApp_net40.fsproj | 4 ++-- ..._VS2012_FSharp_ConsoleApp_net40_upgraded_VS2013.fsproj | 4 ++-- .../Sample_VS2012_FSharp_ConsoleApp_net45.fsproj | 4 ++-- .../Sample_VS2012_FSharp_ConsoleApp_net45.fsproj | 4 ++-- .../Sample_VS2012_FSharp_Portable_Library.fsproj | 4 ++-- ...le_VS2012_FSharp_Portable_Library_upgraded_2013.fsproj | 4 ++-- .../Sample_VS2013_FSharp_ConsoleApp_net40.fsproj | 4 ++-- .../Sample_VS2013_FSharp_ConsoleApp_net45.fsproj | 4 ++-- .../Sample_VS2013_FSharp_ConsoleApp_net451.fsproj | 4 ++-- .../Sample_VS2013_FSharp_Library_net40.fsproj | 4 ++-- .../Sample_VS2013_FSharp_Library_net45.fsproj | 4 ++-- .../Sample_VS2013_FSharp_Library_net451.fsproj | 4 ++-- ...ple_VS2013_FSharp_Portable_Library_Legacy_net40.fsproj | 4 ++-- ...ple_VS2013_FSharp_Portable_Library_Legacy_net45.fsproj | 4 ++-- ...le_VS2013_FSharp_Portable_Library_Legacy_net451.fsproj | 4 ++-- .../Sample_VS2013_FSharp_Portable_Library_net45.fsproj | 4 ++-- .../Sample_VS2013_FSharp_Portable_Library_net451.fsproj | 4 ++-- .../Sample_VS2013_FSharp_Portable_Library_net451.fsproj | 4 ++-- .../Sample_VS2013_FSharp_Portable_Library_net451.fsproj | 4 ++-- .../Sample_VS2015_FSharp_Console_App_net40.fsproj | 4 ++-- .../Sample_VS2015_FSharp_Console_App_net45.fsproj | 4 ++-- .../Sample_VS2015_FSharp_Console_App_net451.fsproj | 4 ++-- .../Sample_VS2015_FSharp_Console_App_net452.fsproj | 4 ++-- .../Sample_VS2015_FSharp_Console_App_net46.fsproj | 4 ++-- .../Sample_VS2015_FSharp_Library_net40.fsproj | 4 ++-- .../Sample_VS2015_FSharp_Library_net45.fsproj | 4 ++-- .../Sample_VS2015_FSharp_Library_net45_fsharp_30.fsproj | 4 ++-- .../Sample_VS2015_FSharp_Library_net45_fsharp_31.fsproj | 4 ++-- .../Sample_VS2015_FSharp_Portable259_Library.fsproj | 4 ++-- .../Sample_VS2015_FSharp_Portable47_Library.fsproj | 4 ++-- .../Sample_VS2015_FSharp_Portable78_Library.fsproj | 4 ++-- .../Sample_VS2015_FSharp_Portable7_Library.fsproj | 4 ++-- tests/service/FSharp.Compiler.Service.Tests.fsproj | 2 +- tests/service/data/DifferingOutputDir/Dir1/Test1.fsproj | 4 ++-- tests/service/data/DifferingOutputDir/Dir2/Test2.fsproj | 4 ++-- .../data/MultiLanguageProject/ConsoleApplication1.fsproj | 4 ++-- .../data/MultiLanguageProject/ConsoleApplication2.fsproj | 4 ++-- tests/service/data/Test1.fsproj | 4 ++-- tests/service/data/Test2.fsproj | 4 ++-- tests/service/data/TestProject/TestProject.fsproj | 4 ++-- tests/service/data/TestTP/TestTP.fsproj | 4 ++-- .../data/TypeProviderConsole/TypeProviderConsole.fsproj | 4 ++-- .../data/TypeProviderLibrary/TypeProviderLibrary.fsproj | 4 ++-- 57 files changed, 114 insertions(+), 114 deletions(-) diff --git a/nuget/paket.template b/nuget/paket.template index 1616b6340d..32cc35a6d9 100644 --- a/nuget/paket.template +++ b/nuget/paket.template @@ -16,10 +16,10 @@ tags F#, fsharp, interactive, compiler, editor files ../bin/v4.0/FSharp.Compiler.Service.dll ==> lib/net40 - ../bin/v4.0/FSharp.Compiler.Service.XML ==> lib/net40 + ../bin/v4.0/FSharp.Compiler.Service.xml ==> lib/net40 ../bin/v4.0/FSharp.Compiler.Service.?db ==> lib/net40 ../bin/v4.0/FSharp.Compiler.Service.dll.?db ==> lib/net40 ../bin/v4.5/FSharp.Compiler.Service.dll ==> lib/net45 - ../bin/v4.5/FSharp.Compiler.Service.XML ==> lib/net45 + ../bin/v4.5/FSharp.Compiler.Service.xml ==> lib/net45 ../bin/v4.5/FSharp.Compiler.Service.?db ==> lib/net45 ../bin/v4.5/FSharp.Compiler.Service.dll.?db ==> lib/net45 \ No newline at end of file diff --git a/nuget/projectcracker.template b/nuget/projectcracker.template index 4a15816b51..fdf0ebcdcc 100644 --- a/nuget/projectcracker.template +++ b/nuget/projectcracker.template @@ -12,10 +12,10 @@ iconurl https://raw.github.com/fsharp/FSharp.Compiler.Service/master/misc/logo.p tags F#, fsharp, msbuild, editor files - ../bin/v4.5/FSharp.Compiler.Service.ProjectCracker.Exe.exe ==> lib/net45 - ../bin/v4.5/FSharp.Compiler.Service.ProjectCracker.Exe.?db ==> lib/net45 - ../bin/v4.5/FSharp.Compiler.Service.ProjectCracker.Exe.exe.?db ==> lib/net45 + ../bin/v4.5/FSharp.Compiler.Service.ProjectCracker.Tool.exe ==> lib/net45 + ../bin/v4.5/FSharp.Compiler.Service.ProjectCracker.Tool.?db ==> lib/net45 + ../bin/v4.5/FSharp.Compiler.Service.ProjectCracker.Tool.exe.?db ==> lib/net45 ../bin/v4.5/FSharp.Compiler.Service.ProjectCracker.dll ==> lib/net45 - ../bin/v4.5/FSharp.Compiler.Service.ProjectCracker.XML ==> lib/net45 + ../bin/v4.5/FSharp.Compiler.Service.ProjectCracker.xml ==> lib/net45 ../bin/v4.5/FSharp.Compiler.Service.ProjectCracker.?db ==> lib/net45 ../bin/v4.5/FSharp.Compiler.Service.ProjectCracker.dll.?db ==> lib/net45 \ No newline at end of file diff --git a/samples/EditorService/EditorService.fsproj b/samples/EditorService/EditorService.fsproj index 88ccf04b86..8969499196 100644 --- a/samples/EditorService/EditorService.fsproj +++ b/samples/EditorService/EditorService.fsproj @@ -22,7 +22,7 @@ DEBUG;TRACE 3 AnyCPU - bin\Debug\EditorService.XML + bin\Debug\EditorService.xml true @@ -33,7 +33,7 @@ TRACE 3 AnyCPU - bin\Release\EditorService.XML + bin\Release\EditorService.xml true diff --git a/samples/FscExe/Fsc.fsproj b/samples/FscExe/Fsc.fsproj index ead811d5c5..e0ed92eb07 100644 --- a/samples/FscExe/Fsc.fsproj +++ b/samples/FscExe/Fsc.fsproj @@ -25,7 +25,7 @@ TRACE;DEBUG 3 AnyCPU - bin\Debug\FsiExe.XML + bin\Debug\FsiExe.xml true @@ -38,7 +38,7 @@ TRACE 3 AnyCPU - bin\Release\FsiExe.XML + bin\Release\FsiExe.xml true diff --git a/samples/FsiExe/FsiExe.fsproj b/samples/FsiExe/FsiExe.fsproj index 7d6e79e09b..51aff4788c 100644 --- a/samples/FsiExe/FsiExe.fsproj +++ b/samples/FsiExe/FsiExe.fsproj @@ -22,7 +22,7 @@ TRACE;DEBUG 3 AnyCPU - bin\Debug\FsiExe.XML + bin\Debug\FsiExe.xml true @@ -35,7 +35,7 @@ TRACE 3 AnyCPU - bin\Release\FsiExe.XML + bin\Release\FsiExe.xml true diff --git a/samples/InteractiveService/InteractiveService.fsproj b/samples/InteractiveService/InteractiveService.fsproj index bf18a6ebd6..68b26c1948 100644 --- a/samples/InteractiveService/InteractiveService.fsproj +++ b/samples/InteractiveService/InteractiveService.fsproj @@ -22,7 +22,7 @@ DEBUG;TRACE 3 AnyCPU - bin\Debug\InteractiveService.XML + bin\Debug\InteractiveService.xml true @@ -33,7 +33,7 @@ TRACE 3 AnyCPU - bin\Release\InteractiveService.XML + bin\Release\InteractiveService.xml true diff --git a/samples/Tokenizer/Tokenizer.fsproj b/samples/Tokenizer/Tokenizer.fsproj index 10bc3840eb..034d23b07e 100644 --- a/samples/Tokenizer/Tokenizer.fsproj +++ b/samples/Tokenizer/Tokenizer.fsproj @@ -22,7 +22,7 @@ DEBUG;TRACE 3 AnyCPU - bin\Debug\Tokenizer.XML + bin\Debug\Tokenizer.xml true @@ -33,7 +33,7 @@ TRACE 3 AnyCPU - bin\Release\Tokenizer.XML + bin\Release\Tokenizer.xml true diff --git a/samples/UntypedTree/UntypedTree.fsproj b/samples/UntypedTree/UntypedTree.fsproj index 823c21a2b7..db293ceabc 100644 --- a/samples/UntypedTree/UntypedTree.fsproj +++ b/samples/UntypedTree/UntypedTree.fsproj @@ -22,7 +22,7 @@ DEBUG;TRACE 3 AnyCPU - bin\Debug\UntypedTree.XML + bin\Debug\UntypedTree.xml true @@ -33,7 +33,7 @@ TRACE 3 AnyCPU - bin\Release\UntypedTree.XML + bin\Release\UntypedTree.xml true diff --git a/src/fsharp/FSharp.Compiler.Service.ProjectCracker.Tool/FSharp.Compiler.Service.ProjectCracker.Tool.fsproj b/src/fsharp/FSharp.Compiler.Service.ProjectCracker.Tool/FSharp.Compiler.Service.ProjectCracker.Tool.fsproj index 535de51163..fc1f92becd 100644 --- a/src/fsharp/FSharp.Compiler.Service.ProjectCracker.Tool/FSharp.Compiler.Service.ProjectCracker.Tool.fsproj +++ b/src/fsharp/FSharp.Compiler.Service.ProjectCracker.Tool/FSharp.Compiler.Service.ProjectCracker.Tool.fsproj @@ -18,7 +18,7 @@ true FSharp.Compiler.Service.ProjectCracker.Tool ..\..\..\bin\$(TargetFrameworkVersion) - ..\..\..\bin\$(TargetFrameworkVersion)\FSharp.Compiler.Service.ProjectCracker.Tool.XML + ..\..\..\bin\$(TargetFrameworkVersion)\FSharp.Compiler.Service.ProjectCracker.Tool.xml true diff --git a/src/fsharp/FSharp.Compiler.Service.ProjectCracker/FSharp.Compiler.Service.ProjectCracker.fsproj b/src/fsharp/FSharp.Compiler.Service.ProjectCracker/FSharp.Compiler.Service.ProjectCracker.fsproj index c2eb8fd3e6..67bffe41d7 100644 --- a/src/fsharp/FSharp.Compiler.Service.ProjectCracker/FSharp.Compiler.Service.ProjectCracker.fsproj +++ b/src/fsharp/FSharp.Compiler.Service.ProjectCracker/FSharp.Compiler.Service.ProjectCracker.fsproj @@ -14,7 +14,7 @@ 4.3.0.0 FSharp.Compiler.Service.ProjectCracker ..\..\..\bin\$(TargetFrameworkVersion) - ..\..\..\bin\$(TargetFrameworkVersion)\FSharp.Compiler.Service.ProjectCracker.XML + ..\..\..\bin\$(TargetFrameworkVersion)\FSharp.Compiler.Service.ProjectCracker.xml true @@ -48,7 +48,7 @@ - + FSharp.Compiler.Service.ProjectCracker.Tool {b1bdd96d-47e1-4e65-8107-fbae23a06db4} True diff --git a/src/fsharp/FSharp.Compiler.Service/FSharp.Compiler.Service.fsproj b/src/fsharp/FSharp.Compiler.Service/FSharp.Compiler.Service.fsproj index 6b492fbcf1..036a26d801 100644 --- a/src/fsharp/FSharp.Compiler.Service/FSharp.Compiler.Service.fsproj +++ b/src/fsharp/FSharp.Compiler.Service/FSharp.Compiler.Service.fsproj @@ -58,11 +58,11 @@ DEBUG; $(DefineConstants) false $(OtherFlags) --no-jit-optimize --jit-tracking - ..\..\..\bin\$(TargetFrameworkVersion)\FSharp.Compiler.Service.XML + ..\..\..\bin\$(TargetFrameworkVersion)\FSharp.Compiler.Service.xml true - ..\..\..\bin\$(TargetFrameworkVersion)\FSharp.Compiler.Service.XML + ..\..\..\bin\$(TargetFrameworkVersion)\FSharp.Compiler.Service.xml diff --git a/tests/projects/Sample_VS2010_FSharp_ConsoleApp_net35/SampleVisualStudio2010FSharpConsoleApp/SampleVisualStudio2010FSharpConsoleApp.fsproj b/tests/projects/Sample_VS2010_FSharp_ConsoleApp_net35/SampleVisualStudio2010FSharpConsoleApp/SampleVisualStudio2010FSharpConsoleApp.fsproj index 46deef94ac..2d832f9337 100644 --- a/tests/projects/Sample_VS2010_FSharp_ConsoleApp_net35/SampleVisualStudio2010FSharpConsoleApp/SampleVisualStudio2010FSharpConsoleApp.fsproj +++ b/tests/projects/Sample_VS2010_FSharp_ConsoleApp_net35/SampleVisualStudio2010FSharpConsoleApp/SampleVisualStudio2010FSharpConsoleApp.fsproj @@ -22,7 +22,7 @@ DEBUG;TRACE 3 x86 - bin\Debug\SampleVisualStudio2010FSharpConsoleApp.XML + bin\Debug\SampleVisualStudio2010FSharpConsoleApp.xml pdbonly @@ -32,7 +32,7 @@ TRACE 3 x86 - bin\Release\SampleVisualStudio2010FSharpConsoleApp.XML + bin\Release\SampleVisualStudio2010FSharpConsoleApp.xml false diff --git a/tests/projects/Sample_VS2010_FSharp_ConsoleApp_net40/SampleVisualStudio2010FSharpConsoleApp/SampleVisualStudio2010FSharpConsoleApp.fsproj b/tests/projects/Sample_VS2010_FSharp_ConsoleApp_net40/SampleVisualStudio2010FSharpConsoleApp/SampleVisualStudio2010FSharpConsoleApp.fsproj index 294e387150..000cf8586c 100644 --- a/tests/projects/Sample_VS2010_FSharp_ConsoleApp_net40/SampleVisualStudio2010FSharpConsoleApp/SampleVisualStudio2010FSharpConsoleApp.fsproj +++ b/tests/projects/Sample_VS2010_FSharp_ConsoleApp_net40/SampleVisualStudio2010FSharpConsoleApp/SampleVisualStudio2010FSharpConsoleApp.fsproj @@ -26,7 +26,7 @@ DEBUG;TRACE 3 x86 - bin\Debug\SampleVisualStudio2010FSharpConsoleApp.XML + bin\Debug\SampleVisualStudio2010FSharpConsoleApp.xml pdbonly @@ -36,7 +36,7 @@ TRACE 3 x86 - bin\Release\SampleVisualStudio2010FSharpConsoleApp.XML + bin\Release\SampleVisualStudio2010FSharpConsoleApp.xml false diff --git a/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net35/SampleVisualStudio2010FSharpConsoleApp/SampleVisualStudio2010FSharpConsoleApp.fsproj b/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net35/SampleVisualStudio2010FSharpConsoleApp/SampleVisualStudio2010FSharpConsoleApp.fsproj index f390d1aa0b..209b54359f 100644 --- a/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net35/SampleVisualStudio2010FSharpConsoleApp/SampleVisualStudio2010FSharpConsoleApp.fsproj +++ b/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net35/SampleVisualStudio2010FSharpConsoleApp/SampleVisualStudio2010FSharpConsoleApp.fsproj @@ -22,7 +22,7 @@ DEBUG;TRACE 3 x86 - bin\Debug\SampleVisualStudio2010FSharpConsoleApp.XML + bin\Debug\SampleVisualStudio2010FSharpConsoleApp.xml pdbonly @@ -32,7 +32,7 @@ TRACE 3 x86 - bin\Release\SampleVisualStudio2010FSharpConsoleApp.XML + bin\Release\SampleVisualStudio2010FSharpConsoleApp.xml false diff --git a/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net40/Sample_VS2012_FSharp_ConsoleApp_net40/Sample_VS2012_FSharp_ConsoleApp_net40.fsproj b/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net40/Sample_VS2012_FSharp_ConsoleApp_net40/Sample_VS2012_FSharp_ConsoleApp_net40.fsproj index 3f4aa6be86..62d6dcdc13 100644 --- a/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net40/Sample_VS2012_FSharp_ConsoleApp_net40/Sample_VS2012_FSharp_ConsoleApp_net40.fsproj +++ b/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net40/Sample_VS2012_FSharp_ConsoleApp_net40/Sample_VS2012_FSharp_ConsoleApp_net40.fsproj @@ -22,7 +22,7 @@ DEBUG;TRACE 3 AnyCPU - bin\Debug\Sample_VS2012_FSharp_ConsoleApp_net40.XML + bin\Debug\Sample_VS2012_FSharp_ConsoleApp_net40.xml true @@ -33,7 +33,7 @@ TRACE 3 AnyCPU - bin\Release\Sample_VS2012_FSharp_ConsoleApp_net40.XML + bin\Release\Sample_VS2012_FSharp_ConsoleApp_net40.xml true False diff --git a/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net40_upgraded_VS2013/Sample_VS2012_FSharp_ConsoleApp_net40_upgraded_VS2013/Sample_VS2012_FSharp_ConsoleApp_net40_upgraded_VS2013.fsproj b/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net40_upgraded_VS2013/Sample_VS2012_FSharp_ConsoleApp_net40_upgraded_VS2013/Sample_VS2012_FSharp_ConsoleApp_net40_upgraded_VS2013.fsproj index db7cfcd4fc..7c4c1da4b4 100644 --- a/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net40_upgraded_VS2013/Sample_VS2012_FSharp_ConsoleApp_net40_upgraded_VS2013/Sample_VS2012_FSharp_ConsoleApp_net40_upgraded_VS2013.fsproj +++ b/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net40_upgraded_VS2013/Sample_VS2012_FSharp_ConsoleApp_net40_upgraded_VS2013/Sample_VS2012_FSharp_ConsoleApp_net40_upgraded_VS2013.fsproj @@ -22,7 +22,7 @@ DEBUG;TRACE 3 AnyCPU - bin\Debug\Sample_VS2012_FSharp_ConsoleApp_net40_upgraded_VS2013.XML + bin\Debug\Sample_VS2012_FSharp_ConsoleApp_net40_upgraded_VS2013.xml true @@ -33,7 +33,7 @@ TRACE 3 AnyCPU - bin\Release\Sample_VS2012_FSharp_ConsoleApp_net40_upgraded_VS2013.XML + bin\Release\Sample_VS2012_FSharp_ConsoleApp_net40_upgraded_VS2013.xml true False diff --git a/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45/Sample_VS2012_FSharp_ConsoleApp_net45/Sample_VS2012_FSharp_ConsoleApp_net45.fsproj b/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45/Sample_VS2012_FSharp_ConsoleApp_net45/Sample_VS2012_FSharp_ConsoleApp_net45.fsproj index f130e19e0e..97948e84f1 100644 --- a/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45/Sample_VS2012_FSharp_ConsoleApp_net45/Sample_VS2012_FSharp_ConsoleApp_net45.fsproj +++ b/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45/Sample_VS2012_FSharp_ConsoleApp_net45/Sample_VS2012_FSharp_ConsoleApp_net45.fsproj @@ -23,7 +23,7 @@ DEBUG;TRACE 3 AnyCPU - bin\Debug\Sample_VS2012_FSharp_ConsoleApp_net45.XML + bin\Debug\Sample_VS2012_FSharp_ConsoleApp_net45.xml true @@ -34,7 +34,7 @@ TRACE 3 AnyCPU - bin\Release\Sample_VS2012_FSharp_ConsoleApp_net45.XML + bin\Release\Sample_VS2012_FSharp_ConsoleApp_net45.xml true False diff --git a/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource/Sample_VS2012_FSharp_ConsoleApp_net45/Sample_VS2012_FSharp_ConsoleApp_net45.fsproj b/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource/Sample_VS2012_FSharp_ConsoleApp_net45/Sample_VS2012_FSharp_ConsoleApp_net45.fsproj index ff12c6c95d..26d0cb5134 100644 --- a/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource/Sample_VS2012_FSharp_ConsoleApp_net45/Sample_VS2012_FSharp_ConsoleApp_net45.fsproj +++ b/tests/projects/Sample_VS2012_FSharp_ConsoleApp_net45_with_resource/Sample_VS2012_FSharp_ConsoleApp_net45/Sample_VS2012_FSharp_ConsoleApp_net45.fsproj @@ -23,7 +23,7 @@ DEBUG;TRACE 3 AnyCPU - bin\Debug\Sample_VS2012_FSharp_ConsoleApp_net45.XML + bin\Debug\Sample_VS2012_FSharp_ConsoleApp_net45.xml true @@ -34,7 +34,7 @@ TRACE 3 AnyCPU - bin\Release\Sample_VS2012_FSharp_ConsoleApp_net45.XML + bin\Release\Sample_VS2012_FSharp_ConsoleApp_net45.xml true False diff --git a/tests/projects/Sample_VS2012_FSharp_Portable_Library/Sample_VS2012_FSharp_Portable_Library.fsproj b/tests/projects/Sample_VS2012_FSharp_Portable_Library/Sample_VS2012_FSharp_Portable_Library.fsproj index 9c499d5f0f..fc24ebae7d 100644 --- a/tests/projects/Sample_VS2012_FSharp_Portable_Library/Sample_VS2012_FSharp_Portable_Library.fsproj +++ b/tests/projects/Sample_VS2012_FSharp_Portable_Library/Sample_VS2012_FSharp_Portable_Library.fsproj @@ -21,7 +21,7 @@ bin\Debug\ DEBUG;TRACE 3 - bin\Debug\Sample_VS2012_FSharp_Portable_Library.XML + bin\Debug\Sample_VS2012_FSharp_Portable_Library.xml pdbonly @@ -30,7 +30,7 @@ bin\Release\ TRACE 3 - bin\Release\Sample_VS2012_FSharp_Portable_Library.XML + bin\Release\Sample_VS2012_FSharp_Portable_Library.xml diff --git a/tests/projects/Sample_VS2012_FSharp_Portable_Library_upgraded_2013/Sample_VS2012_FSharp_Portable_Library_upgraded_2013.fsproj b/tests/projects/Sample_VS2012_FSharp_Portable_Library_upgraded_2013/Sample_VS2012_FSharp_Portable_Library_upgraded_2013.fsproj index a37549b2b2..5259bc2dfc 100644 --- a/tests/projects/Sample_VS2012_FSharp_Portable_Library_upgraded_2013/Sample_VS2012_FSharp_Portable_Library_upgraded_2013.fsproj +++ b/tests/projects/Sample_VS2012_FSharp_Portable_Library_upgraded_2013/Sample_VS2012_FSharp_Portable_Library_upgraded_2013.fsproj @@ -22,7 +22,7 @@ bin\Debug\ DEBUG;TRACE 3 - bin\Debug\Sample_VS2012_FSharp_Portable_Library_upgraded_2013.XML + bin\Debug\Sample_VS2012_FSharp_Portable_Library_upgraded_2013.xml pdbonly @@ -31,7 +31,7 @@ bin\Release\ TRACE 3 - bin\Release\Sample_VS2012_FSharp_Portable_Library_upgraded_2013.XML + bin\Release\Sample_VS2012_FSharp_Portable_Library_upgraded_2013.xml diff --git a/tests/projects/Sample_VS2013_FSharp_ConsoleApp_net40/Sample_VS2013_FSharp_ConsoleApp_net40.fsproj b/tests/projects/Sample_VS2013_FSharp_ConsoleApp_net40/Sample_VS2013_FSharp_ConsoleApp_net40.fsproj index 1f886469b9..ef8cd6e6af 100644 --- a/tests/projects/Sample_VS2013_FSharp_ConsoleApp_net40/Sample_VS2013_FSharp_ConsoleApp_net40.fsproj +++ b/tests/projects/Sample_VS2013_FSharp_ConsoleApp_net40/Sample_VS2013_FSharp_ConsoleApp_net40.fsproj @@ -23,7 +23,7 @@ DEBUG;TRACE 3 AnyCPU - bin\Debug\Sample_VS2013_FSharp_ConsoleApp_net40.XML + bin\Debug\Sample_VS2013_FSharp_ConsoleApp_net40.xml true @@ -34,7 +34,7 @@ TRACE 3 AnyCPU - bin\Release\Sample_VS2013_FSharp_ConsoleApp_net40.XML + bin\Release\Sample_VS2013_FSharp_ConsoleApp_net40.xml true diff --git a/tests/projects/Sample_VS2013_FSharp_ConsoleApp_net45/Sample_VS2013_FSharp_ConsoleApp_net45.fsproj b/tests/projects/Sample_VS2013_FSharp_ConsoleApp_net45/Sample_VS2013_FSharp_ConsoleApp_net45.fsproj index b60f313458..46799adb84 100644 --- a/tests/projects/Sample_VS2013_FSharp_ConsoleApp_net45/Sample_VS2013_FSharp_ConsoleApp_net45.fsproj +++ b/tests/projects/Sample_VS2013_FSharp_ConsoleApp_net45/Sample_VS2013_FSharp_ConsoleApp_net45.fsproj @@ -23,7 +23,7 @@ DEBUG;TRACE 3 AnyCPU - bin\Debug\Sample_VS2013_FSharp_ConsoleApp_net45.XML + bin\Debug\Sample_VS2013_FSharp_ConsoleApp_net45.xml true @@ -34,7 +34,7 @@ TRACE 3 AnyCPU - bin\Release\Sample_VS2013_FSharp_ConsoleApp_net45.XML + bin\Release\Sample_VS2013_FSharp_ConsoleApp_net45.xml true diff --git a/tests/projects/Sample_VS2013_FSharp_ConsoleApp_net451/Sample_VS2013_FSharp_ConsoleApp_net451.fsproj b/tests/projects/Sample_VS2013_FSharp_ConsoleApp_net451/Sample_VS2013_FSharp_ConsoleApp_net451.fsproj index ddff3055df..9a7c157cf9 100644 --- a/tests/projects/Sample_VS2013_FSharp_ConsoleApp_net451/Sample_VS2013_FSharp_ConsoleApp_net451.fsproj +++ b/tests/projects/Sample_VS2013_FSharp_ConsoleApp_net451/Sample_VS2013_FSharp_ConsoleApp_net451.fsproj @@ -23,7 +23,7 @@ DEBUG;TRACE 3 AnyCPU - bin\Debug\Sample_VS2013_FSharp_ConsoleApp_net451.XML + bin\Debug\Sample_VS2013_FSharp_ConsoleApp_net451.xml true @@ -34,7 +34,7 @@ TRACE 3 AnyCPU - bin\Release\Sample_VS2013_FSharp_ConsoleApp_net451.XML + bin\Release\Sample_VS2013_FSharp_ConsoleApp_net451.xml true diff --git a/tests/projects/Sample_VS2013_FSharp_Library_net40/Sample_VS2013_FSharp_Library_net40.fsproj b/tests/projects/Sample_VS2013_FSharp_Library_net40/Sample_VS2013_FSharp_Library_net40.fsproj index 88b8fa069d..8bfe30e8b9 100644 --- a/tests/projects/Sample_VS2013_FSharp_Library_net40/Sample_VS2013_FSharp_Library_net40.fsproj +++ b/tests/projects/Sample_VS2013_FSharp_Library_net40/Sample_VS2013_FSharp_Library_net40.fsproj @@ -21,7 +21,7 @@ bin\Debug\ DEBUG;TRACE 3 - bin\Debug\Sample_VS2013_FSharp_Library_net40.XML + bin\Debug\Sample_VS2013_FSharp_Library_net40.xml pdbonly @@ -30,7 +30,7 @@ bin\Release\ TRACE 3 - bin\Release\Sample_VS2013_FSharp_Library_net40.XML + bin\Release\Sample_VS2013_FSharp_Library_net40.xml diff --git a/tests/projects/Sample_VS2013_FSharp_Library_net45/Sample_VS2013_FSharp_Library_net45.fsproj b/tests/projects/Sample_VS2013_FSharp_Library_net45/Sample_VS2013_FSharp_Library_net45.fsproj index 8dfd6392a2..1b17259a8c 100644 --- a/tests/projects/Sample_VS2013_FSharp_Library_net45/Sample_VS2013_FSharp_Library_net45.fsproj +++ b/tests/projects/Sample_VS2013_FSharp_Library_net45/Sample_VS2013_FSharp_Library_net45.fsproj @@ -21,7 +21,7 @@ bin\Debug\ DEBUG;TRACE 3 - bin\Debug\Sample_VS2013_FSharp_Library_net45.XML + bin\Debug\Sample_VS2013_FSharp_Library_net45.xml pdbonly @@ -30,7 +30,7 @@ bin\Release\ TRACE 3 - bin\Release\Sample_VS2013_FSharp_Library_net45.XML + bin\Release\Sample_VS2013_FSharp_Library_net45.xml diff --git a/tests/projects/Sample_VS2013_FSharp_Library_net451/Sample_VS2013_FSharp_Library_net451.fsproj b/tests/projects/Sample_VS2013_FSharp_Library_net451/Sample_VS2013_FSharp_Library_net451.fsproj index 696aa944da..cced2a0ab6 100644 --- a/tests/projects/Sample_VS2013_FSharp_Library_net451/Sample_VS2013_FSharp_Library_net451.fsproj +++ b/tests/projects/Sample_VS2013_FSharp_Library_net451/Sample_VS2013_FSharp_Library_net451.fsproj @@ -21,7 +21,7 @@ bin\Debug\ DEBUG;TRACE 3 - bin\Debug\Sample_VS2013_FSharp_Library_net451.XML + bin\Debug\Sample_VS2013_FSharp_Library_net451.xml pdbonly @@ -30,7 +30,7 @@ bin\Release\ TRACE 3 - bin\Release\Sample_VS2013_FSharp_Library_net451.XML + bin\Release\Sample_VS2013_FSharp_Library_net451.xml diff --git a/tests/projects/Sample_VS2013_FSharp_Portable_Library_Legacy_net40/Sample_VS2013_FSharp_Portable_Library_Legacy_net40.fsproj b/tests/projects/Sample_VS2013_FSharp_Portable_Library_Legacy_net40/Sample_VS2013_FSharp_Portable_Library_Legacy_net40.fsproj index c43f79290a..fc8aa611b9 100644 --- a/tests/projects/Sample_VS2013_FSharp_Portable_Library_Legacy_net40/Sample_VS2013_FSharp_Portable_Library_Legacy_net40.fsproj +++ b/tests/projects/Sample_VS2013_FSharp_Portable_Library_Legacy_net40/Sample_VS2013_FSharp_Portable_Library_Legacy_net40.fsproj @@ -22,7 +22,7 @@ bin\Debug\ DEBUG;TRACE 3 - bin\Debug\Sample_VS2013_FSharp_Portable_Library_Legacy_net40.XML + bin\Debug\Sample_VS2013_FSharp_Portable_Library_Legacy_net40.xml pdbonly @@ -31,7 +31,7 @@ bin\Release\ TRACE 3 - bin\Release\Sample_VS2013_FSharp_Portable_Library_Legacy_net40.XML + bin\Release\Sample_VS2013_FSharp_Portable_Library_Legacy_net40.xml diff --git a/tests/projects/Sample_VS2013_FSharp_Portable_Library_Legacy_net45/Sample_VS2013_FSharp_Portable_Library_Legacy_net45.fsproj b/tests/projects/Sample_VS2013_FSharp_Portable_Library_Legacy_net45/Sample_VS2013_FSharp_Portable_Library_Legacy_net45.fsproj index 246622fc35..c2537c9cfd 100644 --- a/tests/projects/Sample_VS2013_FSharp_Portable_Library_Legacy_net45/Sample_VS2013_FSharp_Portable_Library_Legacy_net45.fsproj +++ b/tests/projects/Sample_VS2013_FSharp_Portable_Library_Legacy_net45/Sample_VS2013_FSharp_Portable_Library_Legacy_net45.fsproj @@ -22,7 +22,7 @@ bin\Debug\ DEBUG;TRACE 3 - bin\Debug\Sample_VS2013_FSharp_Portable_Library_Legacy_net45.XML + bin\Debug\Sample_VS2013_FSharp_Portable_Library_Legacy_net45.xml pdbonly @@ -31,7 +31,7 @@ bin\Release\ TRACE 3 - bin\Release\Sample_VS2013_FSharp_Portable_Library_Legacy_net45.XML + bin\Release\Sample_VS2013_FSharp_Portable_Library_Legacy_net45.xml diff --git a/tests/projects/Sample_VS2013_FSharp_Portable_Library_Legacy_net451/Sample_VS2013_FSharp_Portable_Library_Legacy_net451.fsproj b/tests/projects/Sample_VS2013_FSharp_Portable_Library_Legacy_net451/Sample_VS2013_FSharp_Portable_Library_Legacy_net451.fsproj index e8d05156f0..4a52624238 100644 --- a/tests/projects/Sample_VS2013_FSharp_Portable_Library_Legacy_net451/Sample_VS2013_FSharp_Portable_Library_Legacy_net451.fsproj +++ b/tests/projects/Sample_VS2013_FSharp_Portable_Library_Legacy_net451/Sample_VS2013_FSharp_Portable_Library_Legacy_net451.fsproj @@ -22,7 +22,7 @@ bin\Debug\ DEBUG;TRACE 3 - bin\Debug\Sample_VS2013_FSharp_Portable_Library_Legacy_net451.XML + bin\Debug\Sample_VS2013_FSharp_Portable_Library_Legacy_net451.xml pdbonly @@ -31,7 +31,7 @@ bin\Release\ TRACE 3 - bin\Release\Sample_VS2013_FSharp_Portable_Library_Legacy_net451.XML + bin\Release\Sample_VS2013_FSharp_Portable_Library_Legacy_net451.xml diff --git a/tests/projects/Sample_VS2013_FSharp_Portable_Library_net45/Sample_VS2013_FSharp_Portable_Library_net45.fsproj b/tests/projects/Sample_VS2013_FSharp_Portable_Library_net45/Sample_VS2013_FSharp_Portable_Library_net45.fsproj index 33a30cec28..754447825c 100644 --- a/tests/projects/Sample_VS2013_FSharp_Portable_Library_net45/Sample_VS2013_FSharp_Portable_Library_net45.fsproj +++ b/tests/projects/Sample_VS2013_FSharp_Portable_Library_net45/Sample_VS2013_FSharp_Portable_Library_net45.fsproj @@ -23,7 +23,7 @@ bin\Debug\ DEBUG;TRACE 3 - bin\Debug\Sample_VS2013_FSharp_Portable_Library_net45.XML + bin\Debug\Sample_VS2013_FSharp_Portable_Library_net45.xml pdbonly @@ -32,7 +32,7 @@ bin\Release\ TRACE 3 - bin\Release\Sample_VS2013_FSharp_Portable_Library_net45.XML + bin\Release\Sample_VS2013_FSharp_Portable_Library_net45.xml diff --git a/tests/projects/Sample_VS2013_FSharp_Portable_Library_net451/Sample_VS2013_FSharp_Portable_Library_net451.fsproj b/tests/projects/Sample_VS2013_FSharp_Portable_Library_net451/Sample_VS2013_FSharp_Portable_Library_net451.fsproj index 7eaf6d3e26..3c7c70625c 100644 --- a/tests/projects/Sample_VS2013_FSharp_Portable_Library_net451/Sample_VS2013_FSharp_Portable_Library_net451.fsproj +++ b/tests/projects/Sample_VS2013_FSharp_Portable_Library_net451/Sample_VS2013_FSharp_Portable_Library_net451.fsproj @@ -23,7 +23,7 @@ bin\Debug\ DEBUG;TRACE 3 - bin\Debug\Sample_VS2013_FSharp_Portable_Library_net451.XML + bin\Debug\Sample_VS2013_FSharp_Portable_Library_net451.xml pdbonly @@ -32,7 +32,7 @@ bin\Release\ TRACE 3 - bin\Release\Sample_VS2013_FSharp_Portable_Library_net451.XML + bin\Release\Sample_VS2013_FSharp_Portable_Library_net451.xml diff --git a/tests/projects/Sample_VS2013_FSharp_Portable_Library_net451_adjusted_to_profile259/Sample_VS2013_FSharp_Portable_Library_net451.fsproj b/tests/projects/Sample_VS2013_FSharp_Portable_Library_net451_adjusted_to_profile259/Sample_VS2013_FSharp_Portable_Library_net451.fsproj index 545b88c336..2c246f4a89 100644 --- a/tests/projects/Sample_VS2013_FSharp_Portable_Library_net451_adjusted_to_profile259/Sample_VS2013_FSharp_Portable_Library_net451.fsproj +++ b/tests/projects/Sample_VS2013_FSharp_Portable_Library_net451_adjusted_to_profile259/Sample_VS2013_FSharp_Portable_Library_net451.fsproj @@ -23,7 +23,7 @@ bin\Debug\ DEBUG;TRACE 3 - bin\Debug\Sample_VS2013_FSharp_Portable_Library_net451.XML + bin\Debug\Sample_VS2013_FSharp_Portable_Library_net451.xml pdbonly @@ -32,7 +32,7 @@ bin\Release\ TRACE 3 - bin\Release\Sample_VS2013_FSharp_Portable_Library_net451.XML + bin\Release\Sample_VS2013_FSharp_Portable_Library_net451.xml diff --git a/tests/projects/Sample_VS2013_FSharp_Portable_Library_net451_adjusted_to_profile78/Sample_VS2013_FSharp_Portable_Library_net451.fsproj b/tests/projects/Sample_VS2013_FSharp_Portable_Library_net451_adjusted_to_profile78/Sample_VS2013_FSharp_Portable_Library_net451.fsproj index 6d630e8d70..9a2072e7d1 100644 --- a/tests/projects/Sample_VS2013_FSharp_Portable_Library_net451_adjusted_to_profile78/Sample_VS2013_FSharp_Portable_Library_net451.fsproj +++ b/tests/projects/Sample_VS2013_FSharp_Portable_Library_net451_adjusted_to_profile78/Sample_VS2013_FSharp_Portable_Library_net451.fsproj @@ -23,7 +23,7 @@ bin\Debug\ DEBUG;TRACE 3 - bin\Debug\Sample_VS2013_FSharp_Portable_Library_net451.XML + bin\Debug\Sample_VS2013_FSharp_Portable_Library_net451.xml pdbonly @@ -32,7 +32,7 @@ bin\Release\ TRACE 3 - bin\Release\Sample_VS2013_FSharp_Portable_Library_net451.XML + bin\Release\Sample_VS2013_FSharp_Portable_Library_net451.xml diff --git a/tests/projects/Sample_VS2015_FSharp_Console_App_net40/Sample_VS2015_FSharp_Console_App_net40.fsproj b/tests/projects/Sample_VS2015_FSharp_Console_App_net40/Sample_VS2015_FSharp_Console_App_net40.fsproj index 61bb835bfa..dd8653972e 100644 --- a/tests/projects/Sample_VS2015_FSharp_Console_App_net40/Sample_VS2015_FSharp_Console_App_net40.fsproj +++ b/tests/projects/Sample_VS2015_FSharp_Console_App_net40/Sample_VS2015_FSharp_Console_App_net40.fsproj @@ -24,7 +24,7 @@ DEBUG;TRACE 3 AnyCPU - bin\Debug\Sample_VS2015_FSharp_Console_App_net40.XML + bin\Debug\Sample_VS2015_FSharp_Console_App_net40.xml true @@ -35,7 +35,7 @@ TRACE 3 AnyCPU - bin\Release\Sample_VS2015_FSharp_Console_App_net40.XML + bin\Release\Sample_VS2015_FSharp_Console_App_net40.xml true diff --git a/tests/projects/Sample_VS2015_FSharp_Console_App_net45/Sample_VS2015_FSharp_Console_App_net45.fsproj b/tests/projects/Sample_VS2015_FSharp_Console_App_net45/Sample_VS2015_FSharp_Console_App_net45.fsproj index 8a00b55ab3..cc03548117 100644 --- a/tests/projects/Sample_VS2015_FSharp_Console_App_net45/Sample_VS2015_FSharp_Console_App_net45.fsproj +++ b/tests/projects/Sample_VS2015_FSharp_Console_App_net45/Sample_VS2015_FSharp_Console_App_net45.fsproj @@ -23,7 +23,7 @@ DEBUG;TRACE 3 AnyCPU - bin\Debug\Sample_VS2015_FSharp_Console_App_net45.XML + bin\Debug\Sample_VS2015_FSharp_Console_App_net45.xml true @@ -34,7 +34,7 @@ TRACE 3 AnyCPU - bin\Release\Sample_VS2015_FSharp_Console_App_net45.XML + bin\Release\Sample_VS2015_FSharp_Console_App_net45.xml true diff --git a/tests/projects/Sample_VS2015_FSharp_Console_App_net451/Sample_VS2015_FSharp_Console_App_net451.fsproj b/tests/projects/Sample_VS2015_FSharp_Console_App_net451/Sample_VS2015_FSharp_Console_App_net451.fsproj index f5267009de..edf290e3d6 100644 --- a/tests/projects/Sample_VS2015_FSharp_Console_App_net451/Sample_VS2015_FSharp_Console_App_net451.fsproj +++ b/tests/projects/Sample_VS2015_FSharp_Console_App_net451/Sample_VS2015_FSharp_Console_App_net451.fsproj @@ -24,7 +24,7 @@ DEBUG;TRACE 3 AnyCPU - bin\Debug\Sample_VS2015_FSharp_Console_App_net451.XML + bin\Debug\Sample_VS2015_FSharp_Console_App_net451.xml true @@ -35,7 +35,7 @@ TRACE 3 AnyCPU - bin\Release\Sample_VS2015_FSharp_Console_App_net451.XML + bin\Release\Sample_VS2015_FSharp_Console_App_net451.xml true diff --git a/tests/projects/Sample_VS2015_FSharp_Console_App_net452/Sample_VS2015_FSharp_Console_App_net452.fsproj b/tests/projects/Sample_VS2015_FSharp_Console_App_net452/Sample_VS2015_FSharp_Console_App_net452.fsproj index 9213a48fb4..b3b4f89b78 100644 --- a/tests/projects/Sample_VS2015_FSharp_Console_App_net452/Sample_VS2015_FSharp_Console_App_net452.fsproj +++ b/tests/projects/Sample_VS2015_FSharp_Console_App_net452/Sample_VS2015_FSharp_Console_App_net452.fsproj @@ -24,7 +24,7 @@ DEBUG;TRACE 3 AnyCPU - bin\Debug\Sample_VS2015_FSharp_Console_App_net452.XML + bin\Debug\Sample_VS2015_FSharp_Console_App_net452.xml true @@ -35,7 +35,7 @@ TRACE 3 AnyCPU - bin\Release\Sample_VS2015_FSharp_Console_App_net452.XML + bin\Release\Sample_VS2015_FSharp_Console_App_net452.xml true diff --git a/tests/projects/Sample_VS2015_FSharp_Console_App_net46/Sample_VS2015_FSharp_Console_App_net46.fsproj b/tests/projects/Sample_VS2015_FSharp_Console_App_net46/Sample_VS2015_FSharp_Console_App_net46.fsproj index af6010f6ea..fecd8cf165 100644 --- a/tests/projects/Sample_VS2015_FSharp_Console_App_net46/Sample_VS2015_FSharp_Console_App_net46.fsproj +++ b/tests/projects/Sample_VS2015_FSharp_Console_App_net46/Sample_VS2015_FSharp_Console_App_net46.fsproj @@ -24,7 +24,7 @@ DEBUG;TRACE 3 AnyCPU - bin\Debug\Sample_VS2015_FSharp_Console_App_net46.XML + bin\Debug\Sample_VS2015_FSharp_Console_App_net46.xml true @@ -35,7 +35,7 @@ TRACE 3 AnyCPU - bin\Release\Sample_VS2015_FSharp_Console_App_net46.XML + bin\Release\Sample_VS2015_FSharp_Console_App_net46.xml true diff --git a/tests/projects/Sample_VS2015_FSharp_Library_net40/Sample_VS2015_FSharp_Library_net40.fsproj b/tests/projects/Sample_VS2015_FSharp_Library_net40/Sample_VS2015_FSharp_Library_net40.fsproj index 7292d5fb70..f99425c2fc 100644 --- a/tests/projects/Sample_VS2015_FSharp_Library_net40/Sample_VS2015_FSharp_Library_net40.fsproj +++ b/tests/projects/Sample_VS2015_FSharp_Library_net40/Sample_VS2015_FSharp_Library_net40.fsproj @@ -23,7 +23,7 @@ bin\Debug\ DEBUG;TRACE 3 - bin\Debug\Sample_VS2015_FSharp_Library_net40.XML + bin\Debug\Sample_VS2015_FSharp_Library_net40.xml pdbonly @@ -32,7 +32,7 @@ bin\Release\ TRACE 3 - bin\Release\Sample_VS2015_FSharp_Library_net40.XML + bin\Release\Sample_VS2015_FSharp_Library_net40.xml diff --git a/tests/projects/Sample_VS2015_FSharp_Library_net45/Sample_VS2015_FSharp_Library_net45.fsproj b/tests/projects/Sample_VS2015_FSharp_Library_net45/Sample_VS2015_FSharp_Library_net45.fsproj index 0462505582..35b040d657 100644 --- a/tests/projects/Sample_VS2015_FSharp_Library_net45/Sample_VS2015_FSharp_Library_net45.fsproj +++ b/tests/projects/Sample_VS2015_FSharp_Library_net45/Sample_VS2015_FSharp_Library_net45.fsproj @@ -22,7 +22,7 @@ bin\Debug\ DEBUG;TRACE 3 - bin\Debug\Sample_VS2015_FSharp_Library_net45.XML + bin\Debug\Sample_VS2015_FSharp_Library_net45.xml pdbonly @@ -31,7 +31,7 @@ bin\Release\ TRACE 3 - bin\Release\Sample_VS2015_FSharp_Library_net45.XML + bin\Release\Sample_VS2015_FSharp_Library_net45.xml diff --git a/tests/projects/Sample_VS2015_FSharp_Library_net45_fsharp_30/Sample_VS2015_FSharp_Library_net45_fsharp_30.fsproj b/tests/projects/Sample_VS2015_FSharp_Library_net45_fsharp_30/Sample_VS2015_FSharp_Library_net45_fsharp_30.fsproj index 2edb2f5f5e..1f0e38aa21 100644 --- a/tests/projects/Sample_VS2015_FSharp_Library_net45_fsharp_30/Sample_VS2015_FSharp_Library_net45_fsharp_30.fsproj +++ b/tests/projects/Sample_VS2015_FSharp_Library_net45_fsharp_30/Sample_VS2015_FSharp_Library_net45_fsharp_30.fsproj @@ -23,7 +23,7 @@ bin\Debug\ DEBUG;TRACE 3 - bin\Debug\Sample_VS2015_FSharp_Library_net45_fsharp_30.XML + bin\Debug\Sample_VS2015_FSharp_Library_net45_fsharp_30.xml pdbonly @@ -32,7 +32,7 @@ bin\Release\ TRACE 3 - bin\Release\Sample_VS2015_FSharp_Library_net45_fsharp_30.XML + bin\Release\Sample_VS2015_FSharp_Library_net45_fsharp_30.xml diff --git a/tests/projects/Sample_VS2015_FSharp_Library_net45_fsharp_31/Sample_VS2015_FSharp_Library_net45_fsharp_31.fsproj b/tests/projects/Sample_VS2015_FSharp_Library_net45_fsharp_31/Sample_VS2015_FSharp_Library_net45_fsharp_31.fsproj index 85bc11fd7f..8e384a7829 100644 --- a/tests/projects/Sample_VS2015_FSharp_Library_net45_fsharp_31/Sample_VS2015_FSharp_Library_net45_fsharp_31.fsproj +++ b/tests/projects/Sample_VS2015_FSharp_Library_net45_fsharp_31/Sample_VS2015_FSharp_Library_net45_fsharp_31.fsproj @@ -23,7 +23,7 @@ bin\Debug\ DEBUG;TRACE 3 - bin\Debug\Sample_VS2015_FSharp_Library_net45_fsharp_31.XML + bin\Debug\Sample_VS2015_FSharp_Library_net45_fsharp_31.xml pdbonly @@ -32,7 +32,7 @@ bin\Release\ TRACE 3 - bin\Release\Sample_VS2015_FSharp_Library_net45_fsharp_31.XML + bin\Release\Sample_VS2015_FSharp_Library_net45_fsharp_31.xml diff --git a/tests/projects/Sample_VS2015_FSharp_Portable259_Library/Sample_VS2015_FSharp_Portable259_Library.fsproj b/tests/projects/Sample_VS2015_FSharp_Portable259_Library/Sample_VS2015_FSharp_Portable259_Library.fsproj index 0224387510..c383bcf6ac 100644 --- a/tests/projects/Sample_VS2015_FSharp_Portable259_Library/Sample_VS2015_FSharp_Portable259_Library.fsproj +++ b/tests/projects/Sample_VS2015_FSharp_Portable259_Library/Sample_VS2015_FSharp_Portable259_Library.fsproj @@ -24,7 +24,7 @@ bin\Debug\ DEBUG;TRACE 3 - bin\Debug\Sample_VS2015_FSharp_Portable259_Library.XML + bin\Debug\Sample_VS2015_FSharp_Portable259_Library.xml pdbonly @@ -33,7 +33,7 @@ bin\Release\ TRACE 3 - bin\Release\Sample_VS2015_FSharp_Portable259_Library.XML + bin\Release\Sample_VS2015_FSharp_Portable259_Library.xml diff --git a/tests/projects/Sample_VS2015_FSharp_Portable47_Library/Sample_VS2015_FSharp_Portable47_Library.fsproj b/tests/projects/Sample_VS2015_FSharp_Portable47_Library/Sample_VS2015_FSharp_Portable47_Library.fsproj index 26f92396f0..c290448293 100644 --- a/tests/projects/Sample_VS2015_FSharp_Portable47_Library/Sample_VS2015_FSharp_Portable47_Library.fsproj +++ b/tests/projects/Sample_VS2015_FSharp_Portable47_Library/Sample_VS2015_FSharp_Portable47_Library.fsproj @@ -23,7 +23,7 @@ bin\Debug\ DEBUG;TRACE 3 - bin\Debug\Sample_VS2015_FSharp_Portable47_Library.XML + bin\Debug\Sample_VS2015_FSharp_Portable47_Library.xml pdbonly @@ -32,7 +32,7 @@ bin\Release\ TRACE 3 - bin\Release\Sample_VS2015_FSharp_Portable47_Library.XML + bin\Release\Sample_VS2015_FSharp_Portable47_Library.xml diff --git a/tests/projects/Sample_VS2015_FSharp_Portable78_Library/Sample_VS2015_FSharp_Portable78_Library.fsproj b/tests/projects/Sample_VS2015_FSharp_Portable78_Library/Sample_VS2015_FSharp_Portable78_Library.fsproj index 6646e9dd8d..bcb234c2fb 100644 --- a/tests/projects/Sample_VS2015_FSharp_Portable78_Library/Sample_VS2015_FSharp_Portable78_Library.fsproj +++ b/tests/projects/Sample_VS2015_FSharp_Portable78_Library/Sample_VS2015_FSharp_Portable78_Library.fsproj @@ -24,7 +24,7 @@ bin\Debug\ DEBUG;TRACE 3 - bin\Debug\Sample_VS2015_FSharp_Portable78_Library.XML + bin\Debug\Sample_VS2015_FSharp_Portable78_Library.xml pdbonly @@ -33,7 +33,7 @@ bin\Release\ TRACE 3 - bin\Release\Sample_VS2015_FSharp_Portable78_Library.XML + bin\Release\Sample_VS2015_FSharp_Portable78_Library.xml diff --git a/tests/projects/Sample_VS2015_FSharp_Portable7_Library/Sample_VS2015_FSharp_Portable7_Library.fsproj b/tests/projects/Sample_VS2015_FSharp_Portable7_Library/Sample_VS2015_FSharp_Portable7_Library.fsproj index 4868cc7dd2..00b4f47c2a 100644 --- a/tests/projects/Sample_VS2015_FSharp_Portable7_Library/Sample_VS2015_FSharp_Portable7_Library.fsproj +++ b/tests/projects/Sample_VS2015_FSharp_Portable7_Library/Sample_VS2015_FSharp_Portable7_Library.fsproj @@ -24,7 +24,7 @@ bin\Debug\ DEBUG;TRACE 3 - bin\Debug\Sample_VS2015_FSharp_Portable7_Library.XML + bin\Debug\Sample_VS2015_FSharp_Portable7_Library.xml pdbonly @@ -33,7 +33,7 @@ bin\Release\ TRACE 3 - bin\Release\Sample_VS2015_FSharp_Portable7_Library.XML + bin\Release\Sample_VS2015_FSharp_Portable7_Library.xml diff --git a/tests/service/FSharp.Compiler.Service.Tests.fsproj b/tests/service/FSharp.Compiler.Service.Tests.fsproj index 0350be8865..f57233d904 100644 --- a/tests/service/FSharp.Compiler.Service.Tests.fsproj +++ b/tests/service/FSharp.Compiler.Service.Tests.fsproj @@ -86,7 +86,7 @@ - + FSharp.Compiler.Service.ProjectCracker.Tool {b1bdd96d-47e1-4e65-8107-fbae23a06db4} True diff --git a/tests/service/data/DifferingOutputDir/Dir1/Test1.fsproj b/tests/service/data/DifferingOutputDir/Dir1/Test1.fsproj index 13ab88be83..39c51e68b2 100644 --- a/tests/service/data/DifferingOutputDir/Dir1/Test1.fsproj +++ b/tests/service/data/DifferingOutputDir/Dir1/Test1.fsproj @@ -23,7 +23,7 @@ DEBUG;TRACE 3 x86 - bin\Debug\Test1.XML + bin\Debug\Test1.xml pdbonly @@ -33,7 +33,7 @@ TRACE 3 x86 - bin\Release\Test1.XML + bin\Release\Test1.xml False diff --git a/tests/service/data/DifferingOutputDir/Dir2/Test2.fsproj b/tests/service/data/DifferingOutputDir/Dir2/Test2.fsproj index 4cfc70bbc7..ccc20f3fa8 100644 --- a/tests/service/data/DifferingOutputDir/Dir2/Test2.fsproj +++ b/tests/service/data/DifferingOutputDir/Dir2/Test2.fsproj @@ -23,7 +23,7 @@ DEBUG;TRACE 3 x86 - bin\Debug\Test2.XML + bin\Debug\Test2.xml pdbonly @@ -33,7 +33,7 @@ TRACE 3 x86 - bin\Release\Test2.XML + bin\Release\Test2.xml False diff --git a/tests/service/data/MultiLanguageProject/ConsoleApplication1.fsproj b/tests/service/data/MultiLanguageProject/ConsoleApplication1.fsproj index 391e425ec6..fdc032e298 100644 --- a/tests/service/data/MultiLanguageProject/ConsoleApplication1.fsproj +++ b/tests/service/data/MultiLanguageProject/ConsoleApplication1.fsproj @@ -23,7 +23,7 @@ DEBUG;TRACE 3 AnyCPU - bin\Debug\ConsoleApplication1.XML + bin\Debug\ConsoleApplication1.xml true @@ -34,7 +34,7 @@ TRACE 3 AnyCPU - bin\Release\ConsoleApplication1.XML + bin\Release\ConsoleApplication1.xml true diff --git a/tests/service/data/MultiLanguageProject/ConsoleApplication2.fsproj b/tests/service/data/MultiLanguageProject/ConsoleApplication2.fsproj index 3d3ac3ec2a..84477a24db 100644 --- a/tests/service/data/MultiLanguageProject/ConsoleApplication2.fsproj +++ b/tests/service/data/MultiLanguageProject/ConsoleApplication2.fsproj @@ -23,7 +23,7 @@ DEBUG;TRACE 3 AnyCPU - bin\Debug\ConsoleApplication2.XML + bin\Debug\ConsoleApplication2.xml true @@ -34,7 +34,7 @@ TRACE 3 AnyCPU - bin\Release\ConsoleApplication2.XML + bin\Release\ConsoleApplication2.xml true diff --git a/tests/service/data/Test1.fsproj b/tests/service/data/Test1.fsproj index 0b7e8dd1bd..352940e792 100644 --- a/tests/service/data/Test1.fsproj +++ b/tests/service/data/Test1.fsproj @@ -23,7 +23,7 @@ DEBUG;TRACE 3 x86 - bin\Debug\Test1.XML + bin\Debug\Test1.xml pdbonly @@ -33,7 +33,7 @@ TRACE 3 x86 - bin\Release\Test1.XML + bin\Release\Test1.xml False diff --git a/tests/service/data/Test2.fsproj b/tests/service/data/Test2.fsproj index 817bf6dba7..92283019b0 100644 --- a/tests/service/data/Test2.fsproj +++ b/tests/service/data/Test2.fsproj @@ -23,7 +23,7 @@ DEBUG;TRACE 3 x86 - bin\Debug\Test2.XML + bin\Debug\Test2.xml pdbonly @@ -33,7 +33,7 @@ TRACE 3 x86 - bin\Release\Test2.XML + bin\Release\Test2.xml False diff --git a/tests/service/data/TestProject/TestProject.fsproj b/tests/service/data/TestProject/TestProject.fsproj index 9cbed99436..c4697f8c5a 100644 --- a/tests/service/data/TestProject/TestProject.fsproj +++ b/tests/service/data/TestProject/TestProject.fsproj @@ -22,7 +22,7 @@ bin\Debug\ DEBUG;TRACE 3 - bin\Debug\TestProject.XML + bin\Debug\TestProject.xml pdbonly @@ -31,7 +31,7 @@ bin\Release\ TRACE 3 - bin\Release\TestProject.XML + bin\Release\TestProject.xml diff --git a/tests/service/data/TestTP/TestTP.fsproj b/tests/service/data/TestTP/TestTP.fsproj index 2524be6df2..1f2b216503 100644 --- a/tests/service/data/TestTP/TestTP.fsproj +++ b/tests/service/data/TestTP/TestTP.fsproj @@ -24,7 +24,7 @@ DEBUG;TRACE 3 AnyCPU - bin\Debug\TestTP.XML + bin\Debug\TestTP.xml true @@ -35,7 +35,7 @@ TRACE 3 AnyCPU - bin\Release\TestTP.XML + bin\Release\TestTP.xml true diff --git a/tests/service/data/TypeProviderConsole/TypeProviderConsole.fsproj b/tests/service/data/TypeProviderConsole/TypeProviderConsole.fsproj index bbadae52c5..0aafd35458 100644 --- a/tests/service/data/TypeProviderConsole/TypeProviderConsole.fsproj +++ b/tests/service/data/TypeProviderConsole/TypeProviderConsole.fsproj @@ -23,7 +23,7 @@ DEBUG;TRACE 3 AnyCPU - bin\Debug\TypeProviderConsole.XML + bin\Debug\TypeProviderConsole.xml true @@ -34,7 +34,7 @@ TRACE 3 AnyCPU - bin\Release\TypeProviderConsole.XML + bin\Release\TypeProviderConsole.xml true diff --git a/tests/service/data/TypeProviderLibrary/TypeProviderLibrary.fsproj b/tests/service/data/TypeProviderLibrary/TypeProviderLibrary.fsproj index 336560aacf..72e19ebb24 100644 --- a/tests/service/data/TypeProviderLibrary/TypeProviderLibrary.fsproj +++ b/tests/service/data/TypeProviderLibrary/TypeProviderLibrary.fsproj @@ -21,7 +21,7 @@ .\ DEBUG;TRACE 3 - bin\Debug\TypeProviderLibrary.XML + bin\Debug\TypeProviderLibrary.xml pdbonly @@ -30,7 +30,7 @@ .\ TRACE 3 - bin\Release\TypeProviderLibrary.XML + bin\Release\TypeProviderLibrary.xml From 785cb826359221bc2c312d3c2afc15cf37e8de19 Mon Sep 17 00:00:00 2001 From: Don Syme Date: Wed, 2 Dec 2015 21:56:04 +0000 Subject: [PATCH 20/23] fix build on Mono --- .../Program.fs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/fsharp/FSharp.Compiler.Service.ProjectCracker.Tool/Program.fs b/src/fsharp/FSharp.Compiler.Service.ProjectCracker.Tool/Program.fs index 9609404515..bf6f6df95b 100644 --- a/src/fsharp/FSharp.Compiler.Service.ProjectCracker.Tool/Program.fs +++ b/src/fsharp/FSharp.Compiler.Service.ProjectCracker.Tool/Program.fs @@ -128,18 +128,18 @@ module Program = engine.HostServices.RegisterHostObject(fsprojFullPath, "CoreCompile", "Fsc", host) - engine.SetGlobalProperty("BuildingInsideVisualStudio", "true") |> ignore - engine.SetGlobalProperty("VisualStudioVersion", "12.0") |> ignore - engine.SetGlobalProperty("ShouldUnsetParentConfigurationAndPlatform", "false") |> ignore - for (prop, value) in properties do - engine.SetGlobalProperty(prop, value) |> ignore - let projectInstanceFromFullPath (fsprojFullPath: string) = use stream = new IO.StreamReader(fsprojFullPath) use xmlReader = System.Xml.XmlReader.Create(stream) let project = engine.LoadProject(xmlReader, FullPath=fsprojFullPath) + project.SetGlobalProperty("BuildingInsideVisualStudio", "true") |> ignore + project.SetGlobalProperty("VisualStudioVersion", "12.0") |> ignore + project.SetGlobalProperty("ShouldUnsetParentConfigurationAndPlatform", "false") |> ignore + for (prop, value) in properties do + project.SetGlobalProperty(prop, value) |> ignore + project.CreateProjectInstance() let project = projectInstanceFromFullPath fsprojFullPath From 555786f5bbfb71c64d88a4662e55ac2b453f3300 Mon Sep 17 00:00:00 2001 From: Don Syme Date: Wed, 2 Dec 2015 22:22:21 +0000 Subject: [PATCH 21/23] add compiled TP files to keep things simpler --- FSharp.Compiler.Service.sln | 20 ------------------ .../service/data/TestTP/bin/Debug/TestTP.dll | Bin 0 -> 274432 bytes .../data/TestTP/bin/Release/TestTP.dll | Bin 0 -> 257536 bytes 3 files changed, 20 deletions(-) create mode 100644 tests/service/data/TestTP/bin/Debug/TestTP.dll create mode 100644 tests/service/data/TestTP/bin/Release/TestTP.dll diff --git a/FSharp.Compiler.Service.sln b/FSharp.Compiler.Service.sln index 79367e444c..5ce4d6ae1d 100644 --- a/FSharp.Compiler.Service.sln +++ b/FSharp.Compiler.Service.sln @@ -61,8 +61,6 @@ Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "FSharp.Compiler.Service.Pro EndProject Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "FSharp.Compiler.Service.ProjectCracker", "src\fsharp\FSharp.Compiler.Service.ProjectCracker\FSharp.Compiler.Service.ProjectCracker.fsproj", "{893C3CD9-5AF8-4027-A667-21E62FC2C703}" EndProject -Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "TestTP", "tests\service\data\TestTP\TestTP.fsproj", "{FF76BD3C-5E0A-4752-B6C3-044F6E15719B}" -EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -226,24 +224,6 @@ Global {893C3CD9-5AF8-4027-A667-21E62FC2C703}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU {893C3CD9-5AF8-4027-A667-21E62FC2C703}.Release|Mixed Platforms.Build.0 = Release|Any CPU {893C3CD9-5AF8-4027-A667-21E62FC2C703}.Release|x86.ActiveCfg = Release|Any CPU - {FF76BD3C-5E0A-4752-B6C3-044F6E15719B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {FF76BD3C-5E0A-4752-B6C3-044F6E15719B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {FF76BD3C-5E0A-4752-B6C3-044F6E15719B}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {FF76BD3C-5E0A-4752-B6C3-044F6E15719B}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {FF76BD3C-5E0A-4752-B6C3-044F6E15719B}.Debug|x86.ActiveCfg = Debug|Any CPU - {FF76BD3C-5E0A-4752-B6C3-044F6E15719B}.Debug|x86.Build.0 = Debug|Any CPU - {FF76BD3C-5E0A-4752-B6C3-044F6E15719B}.Proto|Any CPU.ActiveCfg = Release|Any CPU - {FF76BD3C-5E0A-4752-B6C3-044F6E15719B}.Proto|Any CPU.Build.0 = Release|Any CPU - {FF76BD3C-5E0A-4752-B6C3-044F6E15719B}.Proto|Mixed Platforms.ActiveCfg = Release|Any CPU - {FF76BD3C-5E0A-4752-B6C3-044F6E15719B}.Proto|Mixed Platforms.Build.0 = Release|Any CPU - {FF76BD3C-5E0A-4752-B6C3-044F6E15719B}.Proto|x86.ActiveCfg = Release|Any CPU - {FF76BD3C-5E0A-4752-B6C3-044F6E15719B}.Proto|x86.Build.0 = Release|Any CPU - {FF76BD3C-5E0A-4752-B6C3-044F6E15719B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {FF76BD3C-5E0A-4752-B6C3-044F6E15719B}.Release|Any CPU.Build.0 = Release|Any CPU - {FF76BD3C-5E0A-4752-B6C3-044F6E15719B}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {FF76BD3C-5E0A-4752-B6C3-044F6E15719B}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {FF76BD3C-5E0A-4752-B6C3-044F6E15719B}.Release|x86.ActiveCfg = Release|Any CPU - {FF76BD3C-5E0A-4752-B6C3-044F6E15719B}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/tests/service/data/TestTP/bin/Debug/TestTP.dll b/tests/service/data/TestTP/bin/Debug/TestTP.dll new file mode 100644 index 0000000000000000000000000000000000000000..757d55b47d6f368c863766addb1dc481ddd5baac GIT binary patch literal 274432 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%0DO!LLJ@sB%mMWv>u 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 Date: Wed, 2 Dec 2015 22:34:41 +0000 Subject: [PATCH 22/23] update release notes --- RELEASE_NOTES.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/RELEASE_NOTES.md b/RELEASE_NOTES.md index 00c7a9c7fc..cf32fc0097 100644 --- a/RELEASE_NOTES.md +++ b/RELEASE_NOTES.md @@ -1,3 +1,11 @@ +#### 2.0.0.0-beta +* Feature #470, #478, #479 - Move ProjectCracker to separate nuget package and DLL, used ProjectCracker.Tool.exe to run +* Feature #463 - Expose slot signatures of members in object expressions +* Feature #469, #475 - Add EvalExpressionNonThrowing, EvalInteractionNonThrowing, EvalScriptNonThrowing +* Fix #456 - FCS makes calls to kernel32.dll when running on OSX +* Fix #473 - stack overflow in resolution logic +* Fix #460 - Failure getting expression for a provided method call + #### 1.4.2.1 - * #450 - Correct generation of ReferencedProjects From 2a7509d9b17c904087a220458ca8f4dc109e3505 Mon Sep 17 00:00:00 2001 From: Don Syme Date: Thu, 3 Dec 2015 10:13:26 +0000 Subject: [PATCH 23/23] fix mono test --- tests/service/ProjectOptionsTests.fs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/service/ProjectOptionsTests.fs b/tests/service/ProjectOptionsTests.fs index 38f6d7979e..94b69de513 100644 --- a/tests/service/ProjectOptionsTests.fs +++ b/tests/service/ProjectOptionsTests.fs @@ -382,21 +382,21 @@ let ``Project file parsing -- Exe with a PCL reference``() = [] -let ``Project file parsing -- project reference in release mode``() = +let ``Project file parsing -- project file contains project reference to out-of-solution project and is used in release mode``() = let f = normalizePath(__SOURCE_DIRECTORY__ + @"/data/TestProject/TestProject.fsproj") let p = ProjectCracker.GetProjectOptionsFromProjectFile(f,[("Configuration","Release")]) let references = getReferencedFilenamesAndContainingFolders p.OtherOptions |> set - references |> should contain ("FSharp.Core.dll", "4.3.0.0") + // Check the reference is to a release DLL references |> should contain ("TestTP.dll", "Release") [] -let ``Project file parsing -- project reference in debug mode``() = +let ``Project file parsing -- project file contains project reference to out-of-solution project and is used in debug mode``() = let f = normalizePath(__SOURCE_DIRECTORY__ + @"/data/TestProject/TestProject.fsproj") let p = ProjectCracker.GetProjectOptionsFromProjectFile(f,[("Configuration","Debug")]) let references = getReferencedFilenamesAndContainingFolders p.OtherOptions |> set - references |> should contain ("FSharp.Core.dll", "4.3.0.0") + // Check the reference is to a debug DLL references |> should contain ("TestTP.dll", "Debug") #endif