diff --git a/FSharp.sln b/FSharp.sln index 923255dd35..3311de65dd 100644 --- a/FSharp.sln +++ b/FSharp.sln @@ -3,35 +3,35 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 15 VisualStudioVersion = 15.0.26403.7 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "FSharp.Compiler.Private", "src\fsharp\FSharp.Compiler.Private\FSharp.Compiler.Private.fsproj", "{2E4D67B4-522D-4CF7-97E4-BA940F0B18F3}" +Project("{6EC3EE1D-3C4E-46DD-8F32-0CC8E7565705}") = "FSharp.Compiler.Private", "src\fsharp\FSharp.Compiler.Private\FSharp.Compiler.Private.fsproj", "{2E4D67B4-522D-4CF7-97E4-BA940F0B18F3}" EndProject -Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "FSharp.Compiler.Server.Shared", "src\fsharp\FSharp.Compiler.Server.Shared\FSharp.Compiler.Server.Shared.fsproj", "{D5870CF0-ED51-4CBC-B3D7-6F56DA84AC06}" +Project("{6EC3EE1D-3C4E-46DD-8F32-0CC8E7565705}") = "FSharp.Compiler.Server.Shared", "src\fsharp\FSharp.Compiler.Server.Shared\FSharp.Compiler.Server.Shared.fsproj", "{D5870CF0-ED51-4CBC-B3D7-6F56DA84AC06}" EndProject -Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "FSharp.Core", "src\fsharp\FSharp.Core\FSharp.Core.fsproj", "{DED3BBD7-53F4-428A-8C9F-27968E768605}" +Project("{6EC3EE1D-3C4E-46DD-8F32-0CC8E7565705}") = "FSharp.Core", "src\fsharp\FSharp.Core\FSharp.Core.fsproj", "{DED3BBD7-53F4-428A-8C9F-27968E768605}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{CFE3259A-2D30-4EB0-80D5-E8B5F3D01449}" EndProject -Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "FSharp.Build", "src\fsharp\FSharp.Build\FSharp.Build.fsproj", "{702A7979-BCF9-4C41-853E-3ADFC9897890}" +Project("{6EC3EE1D-3C4E-46DD-8F32-0CC8E7565705}") = "FSharp.Build", "src\fsharp\FSharp.Build\FSharp.Build.fsproj", "{702A7979-BCF9-4C41-853E-3ADFC9897890}" EndProject -Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "Fsc", "src\fsharp\Fsc\Fsc.fsproj", "{C94C257C-3C0A-4858-B5D8-D746498D1F08}" +Project("{6EC3EE1D-3C4E-46DD-8F32-0CC8E7565705}") = "Fsc", "src\fsharp\Fsc\Fsc.fsproj", "{C94C257C-3C0A-4858-B5D8-D746498D1F08}" EndProject -Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "FSharp.Compiler.Interactive.Settings", "src\fsharp\FSharp.Compiler.Interactive.Settings\FSharp.Compiler.Interactive.Settings.fsproj", "{649FA588-F02E-457C-9FCF-87E46407481E}" +Project("{6EC3EE1D-3C4E-46DD-8F32-0CC8E7565705}") = "FSharp.Compiler.Interactive.Settings", "src\fsharp\FSharp.Compiler.Interactive.Settings\FSharp.Compiler.Interactive.Settings.fsproj", "{649FA588-F02E-457C-9FCF-87E46407481E}" EndProject -Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "FsiAnyCPU", "src\fsharp\fsiAnyCpu\FsiAnyCPU.fsproj", "{8B3E283D-B5FE-4055-9D80-7E3A32F3967B}" +Project("{6EC3EE1D-3C4E-46DD-8F32-0CC8E7565705}") = "FsiAnyCPU", "src\fsharp\fsiAnyCpu\FsiAnyCPU.fsproj", "{8B3E283D-B5FE-4055-9D80-7E3A32F3967B}" ProjectSection(ProjectDependencies) = postProject {649FA588-F02E-457C-9FCF-87E46407481E} = {649FA588-F02E-457C-9FCF-87E46407481E} EndProjectSection EndProject -Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "Fsi", "src\fsharp\fsi\Fsi.fsproj", "{D0E98C0D-490B-4C61-9329-0862F6E87645}" +Project("{6EC3EE1D-3C4E-46DD-8F32-0CC8E7565705}") = "Fsi", "src\fsharp\fsi\Fsi.fsproj", "{D0E98C0D-490B-4C61-9329-0862F6E87645}" ProjectSection(ProjectDependencies) = postProject {649FA588-F02E-457C-9FCF-87E46407481E} = {649FA588-F02E-457C-9FCF-87E46407481E} EndProjectSection EndProject -Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "FSharp.Tests.FSharpSuite", "tests\fsharp\FSharp.Tests.FSharpSuite.fsproj", "{C163E892-5BF7-4B59-AA99-B0E8079C67C4}" +Project("{6EC3EE1D-3C4E-46DD-8F32-0CC8E7565705}") = "FSharp.Tests.FSharpSuite", "tests\fsharp\FSharp.Tests.FSharpSuite.fsproj", "{C163E892-5BF7-4B59-AA99-B0E8079C67C4}" EndProject -Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "FSharp.Compiler.UnitTests", "tests\FSharp.Compiler.UnitTests\FSharp.Compiler.UnitTests.fsproj", "{A8D9641A-9170-4CF4-8FE0-6DB8C134E1B5}" +Project("{6EC3EE1D-3C4E-46DD-8F32-0CC8E7565705}") = "FSharp.Compiler.UnitTests", "tests\FSharp.Compiler.UnitTests\FSharp.Compiler.UnitTests.fsproj", "{A8D9641A-9170-4CF4-8FE0-6DB8C134E1B5}" EndProject -Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "FSharp.Core.UnitTests", "tests\FSharp.Core.UnitTests\FSharp.Core.UnitTests.fsproj", "{88E2D422-6852-46E3-A740-83E391DC7973}" +Project("{6EC3EE1D-3C4E-46DD-8F32-0CC8E7565705}") = "FSharp.Core.UnitTests", "tests\FSharp.Core.UnitTests\FSharp.Core.UnitTests.fsproj", "{88E2D422-6852-46E3-A740-83E391DC7973}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Compiler", "Compiler", "{3881429D-A97A-49EB-B7AE-A82BA5FE9C77}" EndProject @@ -55,10 +55,10 @@ Global {2E4D67B4-522D-4CF7-97E4-BA940F0B18F3}.Debug|Any CPU.Build.0 = Debug|Any CPU {2E4D67B4-522D-4CF7-97E4-BA940F0B18F3}.Debug|x86.ActiveCfg = Debug|Any CPU {2E4D67B4-522D-4CF7-97E4-BA940F0B18F3}.Debug|x86.Build.0 = Debug|Any CPU - {2E4D67B4-522D-4CF7-97E4-BA940F0B18F3}.Proto|Any CPU.ActiveCfg = Proto|Any CPU - {2E4D67B4-522D-4CF7-97E4-BA940F0B18F3}.Proto|Any CPU.Build.0 = Proto|Any CPU - {2E4D67B4-522D-4CF7-97E4-BA940F0B18F3}.Proto|x86.ActiveCfg = Proto|Any CPU - {2E4D67B4-522D-4CF7-97E4-BA940F0B18F3}.Proto|x86.Build.0 = Proto|Any CPU + {2E4D67B4-522D-4CF7-97E4-BA940F0B18F3}.Proto|Any CPU.ActiveCfg = Release|Any CPU + {2E4D67B4-522D-4CF7-97E4-BA940F0B18F3}.Proto|Any CPU.Build.0 = Release|Any CPU + {2E4D67B4-522D-4CF7-97E4-BA940F0B18F3}.Proto|x86.ActiveCfg = Release|Any CPU + {2E4D67B4-522D-4CF7-97E4-BA940F0B18F3}.Proto|x86.Build.0 = Release|Any CPU {2E4D67B4-522D-4CF7-97E4-BA940F0B18F3}.Release|Any CPU.ActiveCfg = Release|Any CPU {2E4D67B4-522D-4CF7-97E4-BA940F0B18F3}.Release|Any CPU.Build.0 = Release|Any CPU {2E4D67B4-522D-4CF7-97E4-BA940F0B18F3}.Release|x86.ActiveCfg = Release|Any CPU @@ -67,10 +67,10 @@ Global {D5870CF0-ED51-4CBC-B3D7-6F56DA84AC06}.Debug|Any CPU.Build.0 = Debug|Any CPU {D5870CF0-ED51-4CBC-B3D7-6F56DA84AC06}.Debug|x86.ActiveCfg = Debug|Any CPU {D5870CF0-ED51-4CBC-B3D7-6F56DA84AC06}.Debug|x86.Build.0 = Debug|Any CPU - {D5870CF0-ED51-4CBC-B3D7-6F56DA84AC06}.Proto|Any CPU.ActiveCfg = Proto|Any CPU - {D5870CF0-ED51-4CBC-B3D7-6F56DA84AC06}.Proto|Any CPU.Build.0 = Proto|Any CPU - {D5870CF0-ED51-4CBC-B3D7-6F56DA84AC06}.Proto|x86.ActiveCfg = Proto|Any CPU - {D5870CF0-ED51-4CBC-B3D7-6F56DA84AC06}.Proto|x86.Build.0 = Proto|Any CPU + {D5870CF0-ED51-4CBC-B3D7-6F56DA84AC06}.Proto|Any CPU.ActiveCfg = Release|Any CPU + {D5870CF0-ED51-4CBC-B3D7-6F56DA84AC06}.Proto|Any CPU.Build.0 = Release|Any CPU + {D5870CF0-ED51-4CBC-B3D7-6F56DA84AC06}.Proto|x86.ActiveCfg = Release|Any CPU + {D5870CF0-ED51-4CBC-B3D7-6F56DA84AC06}.Proto|x86.Build.0 = Release|Any CPU {D5870CF0-ED51-4CBC-B3D7-6F56DA84AC06}.Release|Any CPU.ActiveCfg = Release|Any CPU {D5870CF0-ED51-4CBC-B3D7-6F56DA84AC06}.Release|Any CPU.Build.0 = Release|Any CPU {D5870CF0-ED51-4CBC-B3D7-6F56DA84AC06}.Release|x86.ActiveCfg = Release|Any CPU @@ -79,10 +79,10 @@ Global {DED3BBD7-53F4-428A-8C9F-27968E768605}.Debug|Any CPU.Build.0 = Debug|Any CPU {DED3BBD7-53F4-428A-8C9F-27968E768605}.Debug|x86.ActiveCfg = Debug|Any CPU {DED3BBD7-53F4-428A-8C9F-27968E768605}.Debug|x86.Build.0 = Debug|Any CPU - {DED3BBD7-53F4-428A-8C9F-27968E768605}.Proto|Any CPU.ActiveCfg = Proto|Any CPU - {DED3BBD7-53F4-428A-8C9F-27968E768605}.Proto|Any CPU.Build.0 = Proto|Any CPU - {DED3BBD7-53F4-428A-8C9F-27968E768605}.Proto|x86.ActiveCfg = Proto|Any CPU - {DED3BBD7-53F4-428A-8C9F-27968E768605}.Proto|x86.Build.0 = Proto|Any CPU + {DED3BBD7-53F4-428A-8C9F-27968E768605}.Proto|Any CPU.ActiveCfg = Release|Any CPU + {DED3BBD7-53F4-428A-8C9F-27968E768605}.Proto|Any CPU.Build.0 = Release|Any CPU + {DED3BBD7-53F4-428A-8C9F-27968E768605}.Proto|x86.ActiveCfg = Release|Any CPU + {DED3BBD7-53F4-428A-8C9F-27968E768605}.Proto|x86.Build.0 = Release|Any CPU {DED3BBD7-53F4-428A-8C9F-27968E768605}.Release|Any CPU.ActiveCfg = Release|Any CPU {DED3BBD7-53F4-428A-8C9F-27968E768605}.Release|Any CPU.Build.0 = Release|Any CPU {DED3BBD7-53F4-428A-8C9F-27968E768605}.Release|x86.ActiveCfg = Release|Any CPU @@ -91,10 +91,10 @@ Global {702A7979-BCF9-4C41-853E-3ADFC9897890}.Debug|Any CPU.Build.0 = Debug|Any CPU {702A7979-BCF9-4C41-853E-3ADFC9897890}.Debug|x86.ActiveCfg = Debug|Any CPU {702A7979-BCF9-4C41-853E-3ADFC9897890}.Debug|x86.Build.0 = Debug|Any CPU - {702A7979-BCF9-4C41-853E-3ADFC9897890}.Proto|Any CPU.ActiveCfg = Proto|Any CPU - {702A7979-BCF9-4C41-853E-3ADFC9897890}.Proto|Any CPU.Build.0 = Proto|Any CPU - {702A7979-BCF9-4C41-853E-3ADFC9897890}.Proto|x86.ActiveCfg = Proto|Any CPU - {702A7979-BCF9-4C41-853E-3ADFC9897890}.Proto|x86.Build.0 = Proto|Any CPU + {702A7979-BCF9-4C41-853E-3ADFC9897890}.Proto|Any CPU.ActiveCfg = Release|Any CPU + {702A7979-BCF9-4C41-853E-3ADFC9897890}.Proto|Any CPU.Build.0 = Release|Any CPU + {702A7979-BCF9-4C41-853E-3ADFC9897890}.Proto|x86.ActiveCfg = Release|Any CPU + {702A7979-BCF9-4C41-853E-3ADFC9897890}.Proto|x86.Build.0 = Release|Any CPU {702A7979-BCF9-4C41-853E-3ADFC9897890}.Release|Any CPU.ActiveCfg = Release|Any CPU {702A7979-BCF9-4C41-853E-3ADFC9897890}.Release|Any CPU.Build.0 = Release|Any CPU {702A7979-BCF9-4C41-853E-3ADFC9897890}.Release|x86.ActiveCfg = Release|Any CPU @@ -103,10 +103,10 @@ Global {C94C257C-3C0A-4858-B5D8-D746498D1F08}.Debug|Any CPU.Build.0 = Debug|Any CPU {C94C257C-3C0A-4858-B5D8-D746498D1F08}.Debug|x86.ActiveCfg = Debug|Any CPU {C94C257C-3C0A-4858-B5D8-D746498D1F08}.Debug|x86.Build.0 = Debug|Any CPU - {C94C257C-3C0A-4858-B5D8-D746498D1F08}.Proto|Any CPU.ActiveCfg = Proto|Any CPU - {C94C257C-3C0A-4858-B5D8-D746498D1F08}.Proto|Any CPU.Build.0 = Proto|Any CPU - {C94C257C-3C0A-4858-B5D8-D746498D1F08}.Proto|x86.ActiveCfg = Proto|Any CPU - {C94C257C-3C0A-4858-B5D8-D746498D1F08}.Proto|x86.Build.0 = Proto|Any CPU + {C94C257C-3C0A-4858-B5D8-D746498D1F08}.Proto|Any CPU.ActiveCfg = Release|Any CPU + {C94C257C-3C0A-4858-B5D8-D746498D1F08}.Proto|Any CPU.Build.0 = Release|Any CPU + {C94C257C-3C0A-4858-B5D8-D746498D1F08}.Proto|x86.ActiveCfg = Release|Any CPU + {C94C257C-3C0A-4858-B5D8-D746498D1F08}.Proto|x86.Build.0 = Release|Any CPU {C94C257C-3C0A-4858-B5D8-D746498D1F08}.Release|Any CPU.ActiveCfg = Release|Any CPU {C94C257C-3C0A-4858-B5D8-D746498D1F08}.Release|Any CPU.Build.0 = Release|Any CPU {C94C257C-3C0A-4858-B5D8-D746498D1F08}.Release|x86.ActiveCfg = Release|Any CPU @@ -115,10 +115,10 @@ Global {649FA588-F02E-457C-9FCF-87E46407481E}.Debug|Any CPU.Build.0 = Debug|Any CPU {649FA588-F02E-457C-9FCF-87E46407481E}.Debug|x86.ActiveCfg = Debug|Any CPU {649FA588-F02E-457C-9FCF-87E46407481E}.Debug|x86.Build.0 = Debug|Any CPU - {649FA588-F02E-457C-9FCF-87E46407481E}.Proto|Any CPU.ActiveCfg = Proto|Any CPU - {649FA588-F02E-457C-9FCF-87E46407481E}.Proto|Any CPU.Build.0 = Proto|Any CPU - {649FA588-F02E-457C-9FCF-87E46407481E}.Proto|x86.ActiveCfg = Proto|Any CPU - {649FA588-F02E-457C-9FCF-87E46407481E}.Proto|x86.Build.0 = Proto|Any CPU + {649FA588-F02E-457C-9FCF-87E46407481E}.Proto|Any CPU.ActiveCfg = Release|Any CPU + {649FA588-F02E-457C-9FCF-87E46407481E}.Proto|Any CPU.Build.0 = Release|Any CPU + {649FA588-F02E-457C-9FCF-87E46407481E}.Proto|x86.ActiveCfg = Release|Any CPU + {649FA588-F02E-457C-9FCF-87E46407481E}.Proto|x86.Build.0 = Release|Any CPU {649FA588-F02E-457C-9FCF-87E46407481E}.Release|Any CPU.ActiveCfg = Release|Any CPU {649FA588-F02E-457C-9FCF-87E46407481E}.Release|Any CPU.Build.0 = Release|Any CPU {649FA588-F02E-457C-9FCF-87E46407481E}.Release|x86.ActiveCfg = Release|Any CPU @@ -127,10 +127,10 @@ Global {8B3E283D-B5FE-4055-9D80-7E3A32F3967B}.Debug|Any CPU.Build.0 = Debug|Any CPU {8B3E283D-B5FE-4055-9D80-7E3A32F3967B}.Debug|x86.ActiveCfg = Debug|Any CPU {8B3E283D-B5FE-4055-9D80-7E3A32F3967B}.Debug|x86.Build.0 = Debug|Any CPU - {8B3E283D-B5FE-4055-9D80-7E3A32F3967B}.Proto|Any CPU.ActiveCfg = Proto|Any CPU - {8B3E283D-B5FE-4055-9D80-7E3A32F3967B}.Proto|Any CPU.Build.0 = Proto|Any CPU - {8B3E283D-B5FE-4055-9D80-7E3A32F3967B}.Proto|x86.ActiveCfg = Proto|Any CPU - {8B3E283D-B5FE-4055-9D80-7E3A32F3967B}.Proto|x86.Build.0 = Proto|Any CPU + {8B3E283D-B5FE-4055-9D80-7E3A32F3967B}.Proto|Any CPU.ActiveCfg = Release|Any CPU + {8B3E283D-B5FE-4055-9D80-7E3A32F3967B}.Proto|Any CPU.Build.0 = Release|Any CPU + {8B3E283D-B5FE-4055-9D80-7E3A32F3967B}.Proto|x86.ActiveCfg = Release|Any CPU + {8B3E283D-B5FE-4055-9D80-7E3A32F3967B}.Proto|x86.Build.0 = Release|Any CPU {8B3E283D-B5FE-4055-9D80-7E3A32F3967B}.Release|Any CPU.ActiveCfg = Release|Any CPU {8B3E283D-B5FE-4055-9D80-7E3A32F3967B}.Release|Any CPU.Build.0 = Release|Any CPU {8B3E283D-B5FE-4055-9D80-7E3A32F3967B}.Release|x86.ActiveCfg = Release|Any CPU @@ -139,10 +139,10 @@ Global {D0E98C0D-490B-4C61-9329-0862F6E87645}.Debug|Any CPU.Build.0 = Debug|Any CPU {D0E98C0D-490B-4C61-9329-0862F6E87645}.Debug|x86.ActiveCfg = Debug|Any CPU {D0E98C0D-490B-4C61-9329-0862F6E87645}.Debug|x86.Build.0 = Debug|Any CPU - {D0E98C0D-490B-4C61-9329-0862F6E87645}.Proto|Any CPU.ActiveCfg = Proto|Any CPU - {D0E98C0D-490B-4C61-9329-0862F6E87645}.Proto|Any CPU.Build.0 = Proto|Any CPU - {D0E98C0D-490B-4C61-9329-0862F6E87645}.Proto|x86.ActiveCfg = Proto|Any CPU - {D0E98C0D-490B-4C61-9329-0862F6E87645}.Proto|x86.Build.0 = Proto|Any CPU + {D0E98C0D-490B-4C61-9329-0862F6E87645}.Proto|Any CPU.ActiveCfg = Release|Any CPU + {D0E98C0D-490B-4C61-9329-0862F6E87645}.Proto|Any CPU.Build.0 = Release|Any CPU + {D0E98C0D-490B-4C61-9329-0862F6E87645}.Proto|x86.ActiveCfg = Release|Any CPU + {D0E98C0D-490B-4C61-9329-0862F6E87645}.Proto|x86.Build.0 = Release|Any CPU {D0E98C0D-490B-4C61-9329-0862F6E87645}.Release|Any CPU.ActiveCfg = Release|Any CPU {D0E98C0D-490B-4C61-9329-0862F6E87645}.Release|Any CPU.Build.0 = Release|Any CPU {D0E98C0D-490B-4C61-9329-0862F6E87645}.Release|x86.ActiveCfg = Release|Any CPU @@ -151,10 +151,10 @@ Global {C163E892-5BF7-4B59-AA99-B0E8079C67C4}.Debug|Any CPU.Build.0 = Debug|Any CPU {C163E892-5BF7-4B59-AA99-B0E8079C67C4}.Debug|x86.ActiveCfg = Debug|Any CPU {C163E892-5BF7-4B59-AA99-B0E8079C67C4}.Debug|x86.Build.0 = Debug|Any CPU - {C163E892-5BF7-4B59-AA99-B0E8079C67C4}.Proto|Any CPU.ActiveCfg = Proto|Any CPU - {C163E892-5BF7-4B59-AA99-B0E8079C67C4}.Proto|Any CPU.Build.0 = Proto|Any CPU - {C163E892-5BF7-4B59-AA99-B0E8079C67C4}.Proto|x86.ActiveCfg = Proto|Any CPU - {C163E892-5BF7-4B59-AA99-B0E8079C67C4}.Proto|x86.Build.0 = Proto|Any CPU + {C163E892-5BF7-4B59-AA99-B0E8079C67C4}.Proto|Any CPU.ActiveCfg = Release|Any CPU + {C163E892-5BF7-4B59-AA99-B0E8079C67C4}.Proto|Any CPU.Build.0 = Release|Any CPU + {C163E892-5BF7-4B59-AA99-B0E8079C67C4}.Proto|x86.ActiveCfg = Release|Any CPU + {C163E892-5BF7-4B59-AA99-B0E8079C67C4}.Proto|x86.Build.0 = Release|Any CPU {C163E892-5BF7-4B59-AA99-B0E8079C67C4}.Release|Any CPU.ActiveCfg = Release|Any CPU {C163E892-5BF7-4B59-AA99-B0E8079C67C4}.Release|Any CPU.Build.0 = Release|Any CPU {C163E892-5BF7-4B59-AA99-B0E8079C67C4}.Release|x86.ActiveCfg = Release|Any CPU @@ -163,10 +163,10 @@ Global {A8D9641A-9170-4CF4-8FE0-6DB8C134E1B5}.Debug|Any CPU.Build.0 = Debug|Any CPU {A8D9641A-9170-4CF4-8FE0-6DB8C134E1B5}.Debug|x86.ActiveCfg = Debug|Any CPU {A8D9641A-9170-4CF4-8FE0-6DB8C134E1B5}.Debug|x86.Build.0 = Debug|Any CPU - {A8D9641A-9170-4CF4-8FE0-6DB8C134E1B5}.Proto|Any CPU.ActiveCfg = Proto|Any CPU - {A8D9641A-9170-4CF4-8FE0-6DB8C134E1B5}.Proto|Any CPU.Build.0 = Proto|Any CPU - {A8D9641A-9170-4CF4-8FE0-6DB8C134E1B5}.Proto|x86.ActiveCfg = Proto|Any CPU - {A8D9641A-9170-4CF4-8FE0-6DB8C134E1B5}.Proto|x86.Build.0 = Proto|Any CPU + {A8D9641A-9170-4CF4-8FE0-6DB8C134E1B5}.Proto|Any CPU.ActiveCfg = Release|Any CPU + {A8D9641A-9170-4CF4-8FE0-6DB8C134E1B5}.Proto|Any CPU.Build.0 = Release|Any CPU + {A8D9641A-9170-4CF4-8FE0-6DB8C134E1B5}.Proto|x86.ActiveCfg = Release|Any CPU + {A8D9641A-9170-4CF4-8FE0-6DB8C134E1B5}.Proto|x86.Build.0 = Release|Any CPU {A8D9641A-9170-4CF4-8FE0-6DB8C134E1B5}.Release|Any CPU.ActiveCfg = Release|Any CPU {A8D9641A-9170-4CF4-8FE0-6DB8C134E1B5}.Release|Any CPU.Build.0 = Release|Any CPU {A8D9641A-9170-4CF4-8FE0-6DB8C134E1B5}.Release|x86.ActiveCfg = Release|Any CPU @@ -175,10 +175,10 @@ Global {88E2D422-6852-46E3-A740-83E391DC7973}.Debug|Any CPU.Build.0 = Debug|Any CPU {88E2D422-6852-46E3-A740-83E391DC7973}.Debug|x86.ActiveCfg = Debug|Any CPU {88E2D422-6852-46E3-A740-83E391DC7973}.Debug|x86.Build.0 = Debug|Any CPU - {88E2D422-6852-46E3-A740-83E391DC7973}.Proto|Any CPU.ActiveCfg = Proto|Any CPU - {88E2D422-6852-46E3-A740-83E391DC7973}.Proto|Any CPU.Build.0 = Proto|Any CPU - {88E2D422-6852-46E3-A740-83E391DC7973}.Proto|x86.ActiveCfg = Proto|Any CPU - {88E2D422-6852-46E3-A740-83E391DC7973}.Proto|x86.Build.0 = Proto|Any CPU + {88E2D422-6852-46E3-A740-83E391DC7973}.Proto|Any CPU.ActiveCfg = Release|Any CPU + {88E2D422-6852-46E3-A740-83E391DC7973}.Proto|Any CPU.Build.0 = Release|Any CPU + {88E2D422-6852-46E3-A740-83E391DC7973}.Proto|x86.ActiveCfg = Release|Any CPU + {88E2D422-6852-46E3-A740-83E391DC7973}.Proto|x86.Build.0 = Release|Any CPU {88E2D422-6852-46E3-A740-83E391DC7973}.Release|Any CPU.ActiveCfg = Release|Any CPU {88E2D422-6852-46E3-A740-83E391DC7973}.Release|Any CPU.Build.0 = Release|Any CPU {88E2D422-6852-46E3-A740-83E391DC7973}.Release|x86.ActiveCfg = Release|Any CPU diff --git a/src/fsharp/NameResolution.fs b/src/fsharp/NameResolution.fs index 9434740d31..96def4abf9 100644 --- a/src/fsharp/NameResolution.fs +++ b/src/fsharp/NameResolution.fs @@ -3175,6 +3175,108 @@ let ResolveFieldPrim sink (ncenv:NameResolver) nenv ad ty (mp,id:Ident) allField [(resInfo,item)] +/// Resolve a long identifier representing a nested record field +let ResolveNestedField sink (ncenv:NameResolver) nenv ad ty (lid : Ident list) = + let typeNameResInfo = TypeNameResolutionInfo.Default + let g = ncenv.g + + let lookupFld ty (id : Ident) = + let m = id.idRange + let otherRecdFlds ty = + let typeName = NicePrint.minimalStringOfType nenv.eDisplayEnv ty + [ + for KeyValue(_, v) in nenv.eFieldLabels do + let fldOpt = v |> List.tryFind (fun r -> r.TyconRef.DisplayName = typeName) + match fldOpt with + | Some rfref -> yield rfref.RecdField.Id + | None -> () + ] + + let lookup() = + let frefs = + match (Map.tryFind id.idText nenv.eFieldLabels) with + | Some field -> success field + | None -> raze (SuggestLabelsOfRelatedRecords g nenv id (otherRecdFlds ty)) + + // Eliminate duplicates arising from multiple 'open' + frefs + |?> ListSet.setify (fun fref1 fref2 -> tyconRefEq g fref1.TyconRef fref2.TyconRef) + |?> List.map (fun x -> FieldResolution(x,false)) + + if isAppTy g ty then + match ncenv.InfoReader.TryFindRecdOrClassFieldInfoOfType(id.idText,m,ty) with + | Some (RecdFieldInfo(_,rfref)) -> success [FieldResolution(rfref,false)] + | None -> + if isRecdTy g ty then + // record label doesn't belong to record type -> suggest other labels of same record + let suggestLabels() = SuggestOtherLabelsOfSameRecordType g nenv ty id (otherRecdFlds ty) + let typeName = NicePrint.minimalStringOfType nenv.eDisplayEnv ty + let errorText = FSComp.SR.nrRecordDoesNotContainSuchLabel(typeName,id.idText) + raze (ErrorWithSuggestions(errorText, m, id.idText, suggestLabels)) + else + lookup() + else + lookup() + + let access, flds = + match lid with + | [] -> [], [] + | [id] -> [], lookupFld ty id |> ForceRaise + | id :: _ -> + let fldSearch () = + match lid with + | id :: rest -> + let fldSearch = lookupFld ty id + let fldSearch = fldSearch |?> List.map (fun (FieldResolution(rfref, dep)) -> FieldResolution(rfref, dep), rfref.FieldName, rfref.FormalType, rest) + fldSearch + | _ -> NoResultsOrUsefulErrors + + let tyconSearch ad () = + match lid with + | tn :: id :: rest -> + let m = tn.idRange + let tcrefs = LookupTypeNameInEnvNoArity OpenQualified tn.idText nenv + if isNil tcrefs then NoResultsOrUsefulErrors else + let tcrefs = tcrefs |> List.map (fun tcref -> (ResolutionInfo.Empty,tcref)) + let tyconSearch = ResolveLongIdentInTyconRefs ResultCollectionSettings.AllResults ncenv nenv LookupKind.RecdField 1 m ad id rest typeNameResInfo tn.idRange tcrefs + let tyconSearch = tyconSearch |?> List.choose (function (_, Item.RecdField(RecdFieldInfo(_,rfref)), rest) -> Some(FieldResolution(rfref,false), rfref.FieldName, rfref.FormalType, rest) | _ -> None) + tyconSearch + | _ -> NoResultsOrUsefulErrors + + let moduleOrNsSearch ad () = + match lid with + | [] -> NoResultsOrUsefulErrors + | id :: rest -> + let m = id.idRange + let t = ResolveLongIndentAsModuleOrNamespaceThen sink ResultCollectionSettings.AtMostOneResult ncenv.amap m OpenQualified nenv ad id rest false + (ResolveFieldInModuleOrNamespace ncenv nenv ad) + t |?> List.map (fun (_, FieldResolution(rfref, dep), rest) -> (FieldResolution(rfref, dep), rfref.FieldName, rfref.FormalType, rest)) + + let item, fldIdText, fldTy, rest = + fldSearch () +++ moduleOrNsSearch ad +++ tyconSearch ad +++ moduleOrNsSearch AccessibleFromSomeFSharpCode +++ tyconSearch AccessibleFromSomeFSharpCode + |> AtMostOneResult id.idRange + |> ForceRaise + + let idsBeforeField = lid |> List.takeWhile (fun id -> id.idText <> fldIdText) + + match rest with + | [] -> idsBeforeField, [item] + | _ -> + let rec nestedFieldSearch flds ty = + function + | [] -> flds + | id :: rest -> + let resolved = lookupFld ty id |> ForceRaise + let fldTy = + match resolved with + | [FieldResolution(rfref, _)] -> rfref.FormalType + | _ -> ty + nestedFieldSearch (flds @ resolved) fldTy rest + + idsBeforeField, item::(nestedFieldSearch [] fldTy rest) + + access, flds |> List.map (fun (FieldResolution(rfref, _)) -> lid |> List.find (fun id -> id.idText = rfref.FieldName)) + let ResolveField sink ncenv nenv ad ty (mp,id) allFields = let res = ResolveFieldPrim sink ncenv nenv ad ty (mp,id) allFields // Register the results of any field paths "Module.Type" in "Module.Type.field" as a name resolution. (Note, the path resolution diff --git a/src/fsharp/NameResolution.fsi b/src/fsharp/NameResolution.fsi index a302e22ef1..3284a11a6a 100755 --- a/src/fsharp/NameResolution.fsi +++ b/src/fsharp/NameResolution.fsi @@ -484,6 +484,9 @@ val internal ResolveTypeLongIdentInTyconRef : TcResultsSink -> NameResol /// Resolve a long identifier to a type definition val internal ResolveTypeLongIdent : TcResultsSink -> NameResolver -> ItemOccurence -> FullyQualifiedFlag -> NameResolutionEnv -> AccessorDomain -> Ident list -> TypeNameResolutionStaticArgsInfo -> PermitDirectReferenceToGeneratedType -> ResultOrException +/// Resolve a long identifier to a nested field +val internal ResolveNestedField : TcResultsSink -> NameResolver -> NameResolutionEnv -> AccessorDomain -> TType -> Ident list -> Ident list * Ident list + /// Resolve a long identifier to a field val internal ResolveField : TcResultsSink -> NameResolver -> NameResolutionEnv -> AccessorDomain -> TType -> Ident list * Ident -> Ident list -> FieldResolution list diff --git a/src/fsharp/TypeChecker.fs b/src/fsharp/TypeChecker.fs index a20b3743ca..fad9e40f72 100755 --- a/src/fsharp/TypeChecker.fs +++ b/src/fsharp/TypeChecker.fs @@ -6928,6 +6928,94 @@ and TcAssertExpr cenv overallTy env (m:range) tpenv x = and TcRecdExpr cenv overallTy env tpenv (inherits, optOrigExpr, flds, mWholeExpr) = + let transformAstForNestedUpdates (lidwd : LongIdentWithDots) v = + let recdExprCopyInfo ids (optOrigExpr : (SynExpr * BlockSeparator) option) (id : Ident) = + let upToId origSepRng id lidwd = + let rec buildLid res (id : Ident) = + function + | [] -> res + | (h : Ident) :: t -> if h.idText = id.idText then h :: res else buildLid (h :: res) id t + + let rec combineIds = + function + | [] | [_] -> [] + | id1::id2::rest -> (id1, id2) :: (id2 :: rest |> combineIds) + + let calcLidSeparatorRanges lid = + match lid with + | [] | [_] -> [origSepRng] + | _ :: t -> origSepRng :: List.map (fun (s : Ident, e : Ident) -> mkRange s.idRange.FileName s.idRange.End e.idRange.Start) t + + let lid = buildLid [] id lidwd |> List.rev + + (lid, lid |> combineIds |> calcLidSeparatorRanges) + + let totalRange (origId : Ident) (id : Ident) = + mkRange origId.idRange.FileName origId.idRange.End id.idRange.Start + + let rangeOfBlockSeperator (id : Ident) = + let idEnd = id.idRange.End + let blockSeperatorStartCol = idEnd.Column + let blockSeperatorEndCol = blockSeperatorStartCol + 4 + let blockSeperatorStartPos = mkPos idEnd.Line blockSeperatorStartCol + let blockSeporatorEndPos = mkPos idEnd.Line blockSeperatorEndCol + + mkRange id.idRange.FileName blockSeperatorStartPos blockSeporatorEndPos + + match optOrigExpr with + | Some (SynExpr.Ident origId, (sepRange, _)) -> + let lid, rng = upToId sepRange id (origId :: ids) + Some (SynExpr.LongIdent (false, LongIdentWithDots(lid, rng), None, totalRange origId id), (rangeOfBlockSeperator id, None)) // TODO: id.idRange should be the range of the next separator + | _ -> None + + + let rec synExprRecd copyInfo id flds = + SynExpr.Record( + None, + (copyInfo id), + [ match flds with + | [] -> yield ((LongIdentWithDots ([], []), true), v, None) + | [fldId] -> yield ((LongIdentWithDots ([fldId],[]), true), v, None) + | fldId :: rest -> + let nestedFld = synExprRecd copyInfo fldId + yield ((LongIdentWithDots ([fldId], []), true), nestedFld rest, None) ], + id.idRange) + |> Some + + let access, flds = lidwd.Lid |> ResolveNestedField cenv.tcSink cenv.nameResolver env.eNameResEnv env.eAccessRights overallTy + + let expanded = + [ + match (access, flds) with + | [], [] -> () + | accessIds, [] -> yield (accessIds |> List.frontAndBack), v + | accessIds, [fldId] -> yield ((accessIds@[fldId]) |> List.frontAndBack), v + | accessIds, fldId :: rest -> + yield (accessIds, fldId), synExprRecd (recdExprCopyInfo flds optOrigExpr) fldId rest + ] + + expanded + + let groupUpdatesToNestedFields flds = + let groupedByField = flds |> List.groupBy (fun ((_, fld : Ident), _) -> fld.idText) + [ + for (_, flds) in groupedByField do + if (flds |> List.length < 2) then + yield! flds + else + let rec groupIfNested res xs = + match xs with + | [] -> res + | x::[] -> x :: res + | x::y::ys -> match x, y with + | (lidwid, Some(SynExpr.Record (aBI, aCI, aFlds, aRng))), (_, Some(SynExpr.Record (_, _, bFlds, _))) -> + let combinedFlds = aFlds @ bFlds + let reducedRecd = (lidwid, Some(SynExpr.Record (aBI, aCI, combinedFlds, aRng))) + groupIfNested (reducedRecd :: res) ys + | _ -> groupIfNested (x :: res) (y :: ys) + + yield! flds |> groupIfNested [] + ] let requiresCtor = (GetCtorShapeCounter env = 1) // Get special expression forms for constructors let haveCtor = Option.isSome inherits @@ -6945,7 +7033,7 @@ and TcRecdExpr cenv overallTy env tpenv (inherits, optOrigExpr, flds, mWholeExpr let hasOrigExpr = optOrigExprInfo.IsSome - let fldsList = + let fldsList = let flds = [ // if we met at least one field that is not syntactically correct - raise ReportedError to transfer control to the recovery routine @@ -6955,9 +7043,12 @@ and TcRecdExpr cenv overallTy env tpenv (inherits, optOrigExpr, flds, mWholeExpr // we assume that parse errors were already reported raise (ReportedError None) - yield (List.frontAndBack lidwd.Lid, v) - ] - + match lidwd.Lid with + | [] -> () + | [id] -> yield (([], id), v) + | _ -> yield! transformAstForNestedUpdates lidwd v + ] |> groupUpdatesToNestedFields + match flds with | [] -> [] | _ -> diff --git a/src/fsharp/tast.fs b/src/fsharp/tast.fs index 63e7412d90..2653a9809b 100644 --- a/src/fsharp/tast.fs +++ b/src/fsharp/tast.fs @@ -3887,6 +3887,9 @@ and /// Get the signature range of the record field member x.SigRange = x.RecdField.SigRange + /// The type of the record field + member x.FormalType = x.RecdField.FormalType + member x.Index = let (RFRef(tcref,id)) = x try diff --git a/tests/fsharpqa/Source/Conformance/BasicTypeAndModuleDefinitions/RecordTypes/E_NestedUpdateRecordCloning01.fs b/tests/fsharpqa/Source/Conformance/BasicTypeAndModuleDefinitions/RecordTypes/E_NestedUpdateRecordCloning01.fs new file mode 100644 index 0000000000..583892639f --- /dev/null +++ b/tests/fsharpqa/Source/Conformance/BasicTypeAndModuleDefinitions/RecordTypes/E_NestedUpdateRecordCloning01.fs @@ -0,0 +1,14 @@ +// #Regression #Conformance #TypesAndModules #Records +// Verify same field cannot be declared twice in a nested field update +//The field 'A' appears twice in this record expression or pattern +#light + +type AnotherNestedRecTy = { A : int; } + +type NestdRecTy = { B : string; C : AnotherNestedRecTy; } + +type RecTy = { D : NestdRecTy; E : string option; } + +let t1 = { D = { B = "t1"; C = { A = 1; } }; E = None; } + +let t2 = { t1 with D.C.A = 3; D.C.A = 2} \ No newline at end of file diff --git a/tests/fsharpqa/Source/Conformance/BasicTypeAndModuleDefinitions/RecordTypes/NestedUpdateRecordCloning01.fs b/tests/fsharpqa/Source/Conformance/BasicTypeAndModuleDefinitions/RecordTypes/NestedUpdateRecordCloning01.fs new file mode 100644 index 0000000000..14b17c9dcf --- /dev/null +++ b/tests/fsharpqa/Source/Conformance/BasicTypeAndModuleDefinitions/RecordTypes/NestedUpdateRecordCloning01.fs @@ -0,0 +1,30 @@ +// #Conformance #TypesAndModules #Records +#light + +// Verify cloning and updating of fields using nested copy and update syntax + +type AnotherNestedRecTy = { A : int; } + +type NestdRecTy = { B : string; C : AnotherNestedRecTy; } + +type RecTy = { D : NestdRecTy; E : string option; } + +let t1 = { D = { B = "t1"; C = { A = 1; } }; E = None; } + +let t2 = { t1 with D.B = "t2" } + +let t3 = { t2 with D.C.A = 3 } + +// Changed fields t1 to t2 +if t1.D.B <> "t1" || t2.D.B <> "t2" then exit 1 + +// Fields cloned t1 to t2 +if t1.E <> t2.E || t1.D.C <> t2.D.C then exit 1 + +// Changed fields t2 to t3 +if t2.D.C.A <> 1 || t3.D.C.A <> 3 then exit 1 + +// Fields cloned t2 to t3 +if t2.E <> t3.E || t2.D.B <> t3.D.B then exit 1 + +exit 0 diff --git a/tests/fsharpqa/Source/Conformance/BasicTypeAndModuleDefinitions/RecordTypes/NestedUpdateRecordCloning02.fs b/tests/fsharpqa/Source/Conformance/BasicTypeAndModuleDefinitions/RecordTypes/NestedUpdateRecordCloning02.fs new file mode 100644 index 0000000000..9abf7bcbf4 --- /dev/null +++ b/tests/fsharpqa/Source/Conformance/BasicTypeAndModuleDefinitions/RecordTypes/NestedUpdateRecordCloning02.fs @@ -0,0 +1,31 @@ +// #Conformance #TypesAndModules #Records +#light + +// Verify cloning and updating of fields accessed through TypeName using nested copy and update syntax + +type AnotherNestedRecTy = { A : int; } + +type NestdRecTy = { B : string; C : AnotherNestedRecTy; } + +type RecTy = { D : NestdRecTy; E : string option; } + +let t1 = { D = { B = "t1"; C = { A = 1; } }; E = None; } + +// TypeName.FieldName access +let t2 = { t1 with RecTy.D.B = "t2"; } + +let t3 = { t2 with RecTy.D.B = "t3"; RecTy.D.C.A = 3; } + +// Changed Fields t1 to t2 +if t1.D.B <> "t1" || t2.D.B <> "t2" then exit 1 + +// Fields Cloned t1 to t2 +if t2.D.C.A <> t1.D.C.A || t2.E <> t1.E then exit 1 + +// Changed Fields t2 to t3 +if t3.D.B <> "t3" || t2.D.C.A <> 1 || t3.D.C.A <> 3 then exit 1 + +// Fields Cloned t2 to t3 +if t3.E <> t2.E then exit 1 + +exit 0 \ No newline at end of file diff --git a/tests/fsharpqa/Source/Conformance/BasicTypeAndModuleDefinitions/RecordTypes/NestedUpdateRecordCloning03.fs b/tests/fsharpqa/Source/Conformance/BasicTypeAndModuleDefinitions/RecordTypes/NestedUpdateRecordCloning03.fs new file mode 100644 index 0000000000..6f0800d502 --- /dev/null +++ b/tests/fsharpqa/Source/Conformance/BasicTypeAndModuleDefinitions/RecordTypes/NestedUpdateRecordCloning03.fs @@ -0,0 +1,32 @@ +// #Conformance #TypesAndModules #Records +#light + +// Verify cloning and updating of fields with ambiguities between TypeName and FieldName using nested copy and update syntax + +type AnotherNestedRecTy = { A : int; } + +type NestdRecTy = { B : string; AnotherNestedRecTy : AnotherNestedRecTy; } + +type RecTy = { NestdRecTy : NestdRecTy; E : string option; } + + +let t1 = { RecTy.NestdRecTy = { B = "t1"; AnotherNestedRecTy = { A = 1; } }; E = None; } + +// Ambiguous access +let t2 = { t1 with NestdRecTy.B = "t2" } + +let t3 = { t2 with NestdRecTy.AnotherNestedRecTy.A = 3 } + +// Changed Fields t1 to t2 +if t1.NestdRecTy.B <> "t1" || t2.NestdRecTy.B <> "t2" then exit 1 + +// Fields Cloned t1 to t2 +if t2.E <> t1.E || t2.NestdRecTy.AnotherNestedRecTy.A <> t1.NestdRecTy.AnotherNestedRecTy.A then exit 1 + +// Changed Fields t2 to t3 +if t3.NestdRecTy.AnotherNestedRecTy.A <> 3 then exit 1 + +// Fields Cloned t2 to t3 +if t3.E <> t2.E || t3.NestdRecTy.B <> t2.NestdRecTy.B then exit 1 + +exit 0 \ No newline at end of file diff --git a/tests/fsharpqa/Source/Conformance/BasicTypeAndModuleDefinitions/RecordTypes/NestedUpdateRecordCloning04.fs b/tests/fsharpqa/Source/Conformance/BasicTypeAndModuleDefinitions/RecordTypes/NestedUpdateRecordCloning04.fs new file mode 100644 index 0000000000..806be41552 --- /dev/null +++ b/tests/fsharpqa/Source/Conformance/BasicTypeAndModuleDefinitions/RecordTypes/NestedUpdateRecordCloning04.fs @@ -0,0 +1,34 @@ +// #Conformance #TypesAndModules #Records +#light + +// Verify cloning and updating of fields accessed through ModuleName using nested copy and update syntax +module Test = + module M = + type AnotherNestedRecTy = { A : int; } + + type NestdRecTy = { B : string; C : AnotherNestedRecTy; } + + type RecTy = { D : NestdRecTy; E : string option; } + + + let t1 = { M.RecTy.D = { M.B = "t1"; M.C = { M.A = 1; } }; M.E = None; } + + // Module.FieldName access + let t2 = { t1 with M.D.B = "t2"; M.D.C.A = 2; } + + // Module.TypeName.FieldName access + let t3 = { t2 with M.RecTy.E = Some "t3"; M.RecTy.D.B = "t3"; } + + // Changed Fields t1 to t2 + if t1.D.B <> "t1" || t2.D.B <> "t2" || t2.D.C.A <> 2 || t1.D.C.A <> 1 then exit 1 + + // Fields Cloned t1 to t2 + if t2.E <> t1.E then exit 1 + + // Changed Fields t2 to t3 + if t2.E <> None || t3.E <> Some "t3" || t3.D.B <> "t3" then exit 1 + + // Fields Cloned t2 to t3 + if t3.D.C <> t2.D.C then exit 1 + + exit 0 \ No newline at end of file diff --git a/tests/fsharpqa/Source/Conformance/BasicTypeAndModuleDefinitions/RecordTypes/env.lst b/tests/fsharpqa/Source/Conformance/BasicTypeAndModuleDefinitions/RecordTypes/env.lst index 30f2f6611c..f6ef11cb79 100644 --- a/tests/fsharpqa/Source/Conformance/BasicTypeAndModuleDefinitions/RecordTypes/env.lst +++ b/tests/fsharpqa/Source/Conformance/BasicTypeAndModuleDefinitions/RecordTypes/env.lst @@ -57,6 +57,13 @@ NoMT SOURCE=Overload_ToString.fs COMPILE_ONLY=1 SCFLAGS=--warnaserror+ FSIMOD SOURCE=StructRecordCloning02.fs # StructRecordCloning02.fs SOURCE=StructRecordCloning03.fs # StructRecordCloning03.fs + SOURCE=NestedUpdateRecordCloning01.fs # NestedUpdateRecordCloning01.fs + SOURCE=NestedUpdateRecordCloning02.fs # NestedUpdateRecordCloning02.fs + SOURCE=NestedUpdateRecordCloning03.fs # NestedUpdateRecordCloning03.fs + SOURCE=NestedUpdateRecordCloning04.fs # NestedUpdateRecordCloning04.fs + + SOURCE=E_NestedUpdateRecordCloning01.fs # E_NestedUpdateRecordCloning01 + SOURCE=E_RecordCloning01.fs # E_RecordCloning01.fs SOURCE=Syntax01.fs # Syntax01.fs