Merge branch 'master' of https://github.com/Microsoft/visualfsharp into dev15-sxs
This commit is contained in:
Коммит
cfd76f437c
|
@ -98,3 +98,4 @@ tests/fsharpqa/Source/*FSharpQA_Failures.lst
|
||||||
*.ldf
|
*.ldf
|
||||||
*.cto
|
*.cto
|
||||||
tests/**/FSharp.Core.dll
|
tests/**/FSharp.Core.dll
|
||||||
|
project.lock.json
|
||||||
|
|
Двоичные данные
.nuget/NuGet.exe
Двоичные данные
.nuget/NuGet.exe
Двоичный файл не отображается.
|
@ -72,8 +72,6 @@ Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "FSharp.Build", "src\fsharp\
|
||||||
EndProject
|
EndProject
|
||||||
Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "Fsc", "src\fsharp\Fsc\Fsc.fsproj", "{C94C257C-3C0A-4858-B5D8-D746498D1F08}"
|
Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "Fsc", "src\fsharp\Fsc\Fsc.fsproj", "{C94C257C-3C0A-4858-B5D8-D746498D1F08}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "FSharp.Data.TypeProviders", "src\fsharp\FSharp.Data.TypeProviders\FSharp.Data.TypeProviders.fsproj", "{CB7D20C4-6506-406D-9144-5342C3595F03}"
|
|
||||||
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("{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}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "FsiAnyCPU", "src\fsharp\fsiAnyCpu\FsiAnyCPU.fsproj", "{8B3E283D-B5FE-4055-9D80-7E3A32F3967B}"
|
Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "FsiAnyCPU", "src\fsharp\fsiAnyCpu\FsiAnyCPU.fsproj", "{8B3E283D-B5FE-4055-9D80-7E3A32F3967B}"
|
||||||
|
@ -122,20 +120,12 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AppConfig", "vsintegration\
|
||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CodeFile", "vsintegration\ItemTemplates\CodeFile\CodeFile.csproj", "{12AC2813-E895-4AAA-AE6C-94E21DA09F64}"
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CodeFile", "vsintegration\ItemTemplates\CodeFile\CodeFile.csproj", "{12AC2813-E895-4AAA-AE6C-94E21DA09F64}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ODataServiceConnection", "vsintegration\ItemTemplates\ODataServiceConnection\ODataServiceConnection.csproj", "{17716AF4-D439-4C74-8326-475FB1847DF2}"
|
|
||||||
EndProject
|
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ScriptFile", "vsintegration\ItemTemplates\ScriptFile\ScriptFile.csproj", "{A333B85A-DC23-49B6-9797-B89A7951E92D}"
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ScriptFile", "vsintegration\ItemTemplates\ScriptFile\ScriptFile.csproj", "{A333B85A-DC23-49B6-9797-B89A7951E92D}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SignatureFile", "vsintegration\ItemTemplates\SignatureFile\SignatureFile.csproj", "{E3FDD4AC-46B6-4B9F-B672-317D1202CC50}"
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SignatureFile", "vsintegration\ItemTemplates\SignatureFile\SignatureFile.csproj", "{E3FDD4AC-46B6-4B9F-B672-317D1202CC50}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SqlDataConnection", "vsintegration\ItemTemplates\SqlDataConnection\SqlDataConnection.csproj", "{35E83EDF-CC5A-441D-8949-17AACC463CA4}"
|
|
||||||
EndProject
|
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SqlEntityConnection", "vsintegration\ItemTemplates\SqlEntityConnection\SqlEntityConnection.csproj", "{A2CDA945-EF31-4C37-A063-BD1E2B3938EB}"
|
|
||||||
EndProject
|
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TextFile", "vsintegration\ItemTemplates\TextFile\TextFile.csproj", "{D11FC318-8F5D-4C8C-9287-AB40A016D13C}"
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TextFile", "vsintegration\ItemTemplates\TextFile\TextFile.csproj", "{D11FC318-8F5D-4C8C-9287-AB40A016D13C}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WsdlServiceConnection", "vsintegration\ItemTemplates\WsdlServiceConnection\WsdlServiceConnection.csproj", "{7FDF9571-B7DF-4F09-BD5E-12BDDF4FA520}"
|
|
||||||
EndProject
|
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "XMLFile", "vsintegration\ItemTemplates\XMLFile\XMLFile.csproj", "{1FB1DD07-06AA-45B4-B5AC-20FF5BEE98B6}"
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "XMLFile", "vsintegration\ItemTemplates\XMLFile\XMLFile.csproj", "{1FB1DD07-06AA-45B4-B5AC-20FF5BEE98B6}"
|
||||||
EndProject
|
EndProject
|
||||||
Global
|
Global
|
||||||
|
@ -1109,26 +1099,6 @@ Global
|
||||||
{12AC2813-E895-4AAA-AE6C-94E21DA09F64}.VSRelease|Any CPU.Build.0 = VSRelease|Any CPU
|
{12AC2813-E895-4AAA-AE6C-94E21DA09F64}.VSRelease|Any CPU.Build.0 = VSRelease|Any CPU
|
||||||
{12AC2813-E895-4AAA-AE6C-94E21DA09F64}.VSRelease|x86.ActiveCfg = VSRelease|Any CPU
|
{12AC2813-E895-4AAA-AE6C-94E21DA09F64}.VSRelease|x86.ActiveCfg = VSRelease|Any CPU
|
||||||
{12AC2813-E895-4AAA-AE6C-94E21DA09F64}.VSRelease|x86.Build.0 = VSRelease|Any CPU
|
{12AC2813-E895-4AAA-AE6C-94E21DA09F64}.VSRelease|x86.Build.0 = VSRelease|Any CPU
|
||||||
{17716AF4-D439-4C74-8326-475FB1847DF2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{17716AF4-D439-4C74-8326-475FB1847DF2}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{17716AF4-D439-4C74-8326-475FB1847DF2}.Debug|x86.ActiveCfg = Debug|Any CPU
|
|
||||||
{17716AF4-D439-4C74-8326-475FB1847DF2}.Debug|x86.Build.0 = Debug|Any CPU
|
|
||||||
{17716AF4-D439-4C74-8326-475FB1847DF2}.Proto|Any CPU.ActiveCfg = Proto|Any CPU
|
|
||||||
{17716AF4-D439-4C74-8326-475FB1847DF2}.Proto|Any CPU.Build.0 = Proto|Any CPU
|
|
||||||
{17716AF4-D439-4C74-8326-475FB1847DF2}.Proto|x86.ActiveCfg = Proto|Any CPU
|
|
||||||
{17716AF4-D439-4C74-8326-475FB1847DF2}.Proto|x86.Build.0 = Proto|Any CPU
|
|
||||||
{17716AF4-D439-4C74-8326-475FB1847DF2}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{17716AF4-D439-4C74-8326-475FB1847DF2}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{17716AF4-D439-4C74-8326-475FB1847DF2}.Release|x86.ActiveCfg = Release|Any CPU
|
|
||||||
{17716AF4-D439-4C74-8326-475FB1847DF2}.Release|x86.Build.0 = Release|Any CPU
|
|
||||||
{17716AF4-D439-4C74-8326-475FB1847DF2}.VSDebug|Any CPU.ActiveCfg = VSDebug|Any CPU
|
|
||||||
{17716AF4-D439-4C74-8326-475FB1847DF2}.VSDebug|Any CPU.Build.0 = VSDebug|Any CPU
|
|
||||||
{17716AF4-D439-4C74-8326-475FB1847DF2}.VSDebug|x86.ActiveCfg = VSDebug|Any CPU
|
|
||||||
{17716AF4-D439-4C74-8326-475FB1847DF2}.VSDebug|x86.Build.0 = VSDebug|Any CPU
|
|
||||||
{17716AF4-D439-4C74-8326-475FB1847DF2}.VSRelease|Any CPU.ActiveCfg = VSRelease|Any CPU
|
|
||||||
{17716AF4-D439-4C74-8326-475FB1847DF2}.VSRelease|Any CPU.Build.0 = VSRelease|Any CPU
|
|
||||||
{17716AF4-D439-4C74-8326-475FB1847DF2}.VSRelease|x86.ActiveCfg = VSRelease|Any CPU
|
|
||||||
{17716AF4-D439-4C74-8326-475FB1847DF2}.VSRelease|x86.Build.0 = VSRelease|Any CPU
|
|
||||||
{A333B85A-DC23-49B6-9797-B89A7951E92D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
{A333B85A-DC23-49B6-9797-B89A7951E92D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
{A333B85A-DC23-49B6-9797-B89A7951E92D}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{A333B85A-DC23-49B6-9797-B89A7951E92D}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
{A333B85A-DC23-49B6-9797-B89A7951E92D}.Debug|x86.ActiveCfg = Debug|Any CPU
|
{A333B85A-DC23-49B6-9797-B89A7951E92D}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||||
|
@ -1169,46 +1139,6 @@ Global
|
||||||
{E3FDD4AC-46B6-4B9F-B672-317D1202CC50}.VSRelease|Any CPU.Build.0 = VSRelease|Any CPU
|
{E3FDD4AC-46B6-4B9F-B672-317D1202CC50}.VSRelease|Any CPU.Build.0 = VSRelease|Any CPU
|
||||||
{E3FDD4AC-46B6-4B9F-B672-317D1202CC50}.VSRelease|x86.ActiveCfg = VSRelease|Any CPU
|
{E3FDD4AC-46B6-4B9F-B672-317D1202CC50}.VSRelease|x86.ActiveCfg = VSRelease|Any CPU
|
||||||
{E3FDD4AC-46B6-4B9F-B672-317D1202CC50}.VSRelease|x86.Build.0 = VSRelease|Any CPU
|
{E3FDD4AC-46B6-4B9F-B672-317D1202CC50}.VSRelease|x86.Build.0 = VSRelease|Any CPU
|
||||||
{35E83EDF-CC5A-441D-8949-17AACC463CA4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{35E83EDF-CC5A-441D-8949-17AACC463CA4}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{35E83EDF-CC5A-441D-8949-17AACC463CA4}.Debug|x86.ActiveCfg = Debug|Any CPU
|
|
||||||
{35E83EDF-CC5A-441D-8949-17AACC463CA4}.Debug|x86.Build.0 = Debug|Any CPU
|
|
||||||
{35E83EDF-CC5A-441D-8949-17AACC463CA4}.Proto|Any CPU.ActiveCfg = Proto|Any CPU
|
|
||||||
{35E83EDF-CC5A-441D-8949-17AACC463CA4}.Proto|Any CPU.Build.0 = Proto|Any CPU
|
|
||||||
{35E83EDF-CC5A-441D-8949-17AACC463CA4}.Proto|x86.ActiveCfg = Proto|Any CPU
|
|
||||||
{35E83EDF-CC5A-441D-8949-17AACC463CA4}.Proto|x86.Build.0 = Proto|Any CPU
|
|
||||||
{35E83EDF-CC5A-441D-8949-17AACC463CA4}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{35E83EDF-CC5A-441D-8949-17AACC463CA4}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{35E83EDF-CC5A-441D-8949-17AACC463CA4}.Release|x86.ActiveCfg = Release|Any CPU
|
|
||||||
{35E83EDF-CC5A-441D-8949-17AACC463CA4}.Release|x86.Build.0 = Release|Any CPU
|
|
||||||
{35E83EDF-CC5A-441D-8949-17AACC463CA4}.VSDebug|Any CPU.ActiveCfg = VSDebug|Any CPU
|
|
||||||
{35E83EDF-CC5A-441D-8949-17AACC463CA4}.VSDebug|Any CPU.Build.0 = VSDebug|Any CPU
|
|
||||||
{35E83EDF-CC5A-441D-8949-17AACC463CA4}.VSDebug|x86.ActiveCfg = VSDebug|Any CPU
|
|
||||||
{35E83EDF-CC5A-441D-8949-17AACC463CA4}.VSDebug|x86.Build.0 = VSDebug|Any CPU
|
|
||||||
{35E83EDF-CC5A-441D-8949-17AACC463CA4}.VSRelease|Any CPU.ActiveCfg = VSRelease|Any CPU
|
|
||||||
{35E83EDF-CC5A-441D-8949-17AACC463CA4}.VSRelease|Any CPU.Build.0 = VSRelease|Any CPU
|
|
||||||
{35E83EDF-CC5A-441D-8949-17AACC463CA4}.VSRelease|x86.ActiveCfg = VSRelease|Any CPU
|
|
||||||
{35E83EDF-CC5A-441D-8949-17AACC463CA4}.VSRelease|x86.Build.0 = VSRelease|Any CPU
|
|
||||||
{A2CDA945-EF31-4C37-A063-BD1E2B3938EB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{A2CDA945-EF31-4C37-A063-BD1E2B3938EB}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{A2CDA945-EF31-4C37-A063-BD1E2B3938EB}.Debug|x86.ActiveCfg = Debug|Any CPU
|
|
||||||
{A2CDA945-EF31-4C37-A063-BD1E2B3938EB}.Debug|x86.Build.0 = Debug|Any CPU
|
|
||||||
{A2CDA945-EF31-4C37-A063-BD1E2B3938EB}.Proto|Any CPU.ActiveCfg = Proto|Any CPU
|
|
||||||
{A2CDA945-EF31-4C37-A063-BD1E2B3938EB}.Proto|Any CPU.Build.0 = Proto|Any CPU
|
|
||||||
{A2CDA945-EF31-4C37-A063-BD1E2B3938EB}.Proto|x86.ActiveCfg = Proto|Any CPU
|
|
||||||
{A2CDA945-EF31-4C37-A063-BD1E2B3938EB}.Proto|x86.Build.0 = Proto|Any CPU
|
|
||||||
{A2CDA945-EF31-4C37-A063-BD1E2B3938EB}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{A2CDA945-EF31-4C37-A063-BD1E2B3938EB}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{A2CDA945-EF31-4C37-A063-BD1E2B3938EB}.Release|x86.ActiveCfg = Release|Any CPU
|
|
||||||
{A2CDA945-EF31-4C37-A063-BD1E2B3938EB}.Release|x86.Build.0 = Release|Any CPU
|
|
||||||
{A2CDA945-EF31-4C37-A063-BD1E2B3938EB}.VSDebug|Any CPU.ActiveCfg = VSDebug|Any CPU
|
|
||||||
{A2CDA945-EF31-4C37-A063-BD1E2B3938EB}.VSDebug|Any CPU.Build.0 = VSDebug|Any CPU
|
|
||||||
{A2CDA945-EF31-4C37-A063-BD1E2B3938EB}.VSDebug|x86.ActiveCfg = VSDebug|Any CPU
|
|
||||||
{A2CDA945-EF31-4C37-A063-BD1E2B3938EB}.VSDebug|x86.Build.0 = VSDebug|Any CPU
|
|
||||||
{A2CDA945-EF31-4C37-A063-BD1E2B3938EB}.VSRelease|Any CPU.ActiveCfg = VSRelease|Any CPU
|
|
||||||
{A2CDA945-EF31-4C37-A063-BD1E2B3938EB}.VSRelease|Any CPU.Build.0 = VSRelease|Any CPU
|
|
||||||
{A2CDA945-EF31-4C37-A063-BD1E2B3938EB}.VSRelease|x86.ActiveCfg = VSRelease|Any CPU
|
|
||||||
{A2CDA945-EF31-4C37-A063-BD1E2B3938EB}.VSRelease|x86.Build.0 = VSRelease|Any CPU
|
|
||||||
{D11FC318-8F5D-4C8C-9287-AB40A016D13C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
{D11FC318-8F5D-4C8C-9287-AB40A016D13C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
{D11FC318-8F5D-4C8C-9287-AB40A016D13C}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{D11FC318-8F5D-4C8C-9287-AB40A016D13C}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
{D11FC318-8F5D-4C8C-9287-AB40A016D13C}.Debug|x86.ActiveCfg = Debug|Any CPU
|
{D11FC318-8F5D-4C8C-9287-AB40A016D13C}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||||
|
@ -1229,26 +1159,6 @@ Global
|
||||||
{D11FC318-8F5D-4C8C-9287-AB40A016D13C}.VSRelease|Any CPU.Build.0 = VSRelease|Any CPU
|
{D11FC318-8F5D-4C8C-9287-AB40A016D13C}.VSRelease|Any CPU.Build.0 = VSRelease|Any CPU
|
||||||
{D11FC318-8F5D-4C8C-9287-AB40A016D13C}.VSRelease|x86.ActiveCfg = VSRelease|Any CPU
|
{D11FC318-8F5D-4C8C-9287-AB40A016D13C}.VSRelease|x86.ActiveCfg = VSRelease|Any CPU
|
||||||
{D11FC318-8F5D-4C8C-9287-AB40A016D13C}.VSRelease|x86.Build.0 = VSRelease|Any CPU
|
{D11FC318-8F5D-4C8C-9287-AB40A016D13C}.VSRelease|x86.Build.0 = VSRelease|Any CPU
|
||||||
{7FDF9571-B7DF-4F09-BD5E-12BDDF4FA520}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{7FDF9571-B7DF-4F09-BD5E-12BDDF4FA520}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{7FDF9571-B7DF-4F09-BD5E-12BDDF4FA520}.Debug|x86.ActiveCfg = Debug|Any CPU
|
|
||||||
{7FDF9571-B7DF-4F09-BD5E-12BDDF4FA520}.Debug|x86.Build.0 = Debug|Any CPU
|
|
||||||
{7FDF9571-B7DF-4F09-BD5E-12BDDF4FA520}.Proto|Any CPU.ActiveCfg = Proto|Any CPU
|
|
||||||
{7FDF9571-B7DF-4F09-BD5E-12BDDF4FA520}.Proto|Any CPU.Build.0 = Proto|Any CPU
|
|
||||||
{7FDF9571-B7DF-4F09-BD5E-12BDDF4FA520}.Proto|x86.ActiveCfg = Proto|Any CPU
|
|
||||||
{7FDF9571-B7DF-4F09-BD5E-12BDDF4FA520}.Proto|x86.Build.0 = Proto|Any CPU
|
|
||||||
{7FDF9571-B7DF-4F09-BD5E-12BDDF4FA520}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{7FDF9571-B7DF-4F09-BD5E-12BDDF4FA520}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{7FDF9571-B7DF-4F09-BD5E-12BDDF4FA520}.Release|x86.ActiveCfg = Release|Any CPU
|
|
||||||
{7FDF9571-B7DF-4F09-BD5E-12BDDF4FA520}.Release|x86.Build.0 = Release|Any CPU
|
|
||||||
{7FDF9571-B7DF-4F09-BD5E-12BDDF4FA520}.VSDebug|Any CPU.ActiveCfg = VSDebug|Any CPU
|
|
||||||
{7FDF9571-B7DF-4F09-BD5E-12BDDF4FA520}.VSDebug|Any CPU.Build.0 = VSDebug|Any CPU
|
|
||||||
{7FDF9571-B7DF-4F09-BD5E-12BDDF4FA520}.VSDebug|x86.ActiveCfg = VSDebug|Any CPU
|
|
||||||
{7FDF9571-B7DF-4F09-BD5E-12BDDF4FA520}.VSDebug|x86.Build.0 = VSDebug|Any CPU
|
|
||||||
{7FDF9571-B7DF-4F09-BD5E-12BDDF4FA520}.VSRelease|Any CPU.ActiveCfg = VSRelease|Any CPU
|
|
||||||
{7FDF9571-B7DF-4F09-BD5E-12BDDF4FA520}.VSRelease|Any CPU.Build.0 = VSRelease|Any CPU
|
|
||||||
{7FDF9571-B7DF-4F09-BD5E-12BDDF4FA520}.VSRelease|x86.ActiveCfg = VSRelease|Any CPU
|
|
||||||
{7FDF9571-B7DF-4F09-BD5E-12BDDF4FA520}.VSRelease|x86.Build.0 = VSRelease|Any CPU
|
|
||||||
{1FB1DD07-06AA-45B4-B5AC-20FF5BEE98B6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
{1FB1DD07-06AA-45B4-B5AC-20FF5BEE98B6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
{1FB1DD07-06AA-45B4-B5AC-20FF5BEE98B6}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{1FB1DD07-06AA-45B4-B5AC-20FF5BEE98B6}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
{1FB1DD07-06AA-45B4-B5AC-20FF5BEE98B6}.Debug|x86.ActiveCfg = Debug|Any CPU
|
{1FB1DD07-06AA-45B4-B5AC-20FF5BEE98B6}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||||
|
@ -1306,7 +1216,6 @@ Global
|
||||||
{956BBE41-ABD1-4DBA-9F3B-BA1C9821C98C} = {3F044931-FB83-4433-B934-AE66AB27B278}
|
{956BBE41-ABD1-4DBA-9F3B-BA1C9821C98C} = {3F044931-FB83-4433-B934-AE66AB27B278}
|
||||||
{702A7979-BCF9-4C41-853E-3ADFC9897890} = {B8DDA694-7939-42E3-95E5-265C2217C142}
|
{702A7979-BCF9-4C41-853E-3ADFC9897890} = {B8DDA694-7939-42E3-95E5-265C2217C142}
|
||||||
{C94C257C-3C0A-4858-B5D8-D746498D1F08} = {3881429D-A97A-49EB-B7AE-A82BA5FE9C77}
|
{C94C257C-3C0A-4858-B5D8-D746498D1F08} = {3881429D-A97A-49EB-B7AE-A82BA5FE9C77}
|
||||||
{CB7D20C4-6506-406D-9144-5342C3595F03} = {3058BC79-8E79-4645-B05D-48CC182FA8A6}
|
|
||||||
{649FA588-F02E-457C-9FCF-87E46407481E} = {B8DDA694-7939-42E3-95E5-265C2217C142}
|
{649FA588-F02E-457C-9FCF-87E46407481E} = {B8DDA694-7939-42E3-95E5-265C2217C142}
|
||||||
{8B3E283D-B5FE-4055-9D80-7E3A32F3967B} = {B8DDA694-7939-42E3-95E5-265C2217C142}
|
{8B3E283D-B5FE-4055-9D80-7E3A32F3967B} = {B8DDA694-7939-42E3-95E5-265C2217C142}
|
||||||
{D0E98C0D-490B-4C61-9329-0862F6E87645} = {B8DDA694-7939-42E3-95E5-265C2217C142}
|
{D0E98C0D-490B-4C61-9329-0862F6E87645} = {B8DDA694-7939-42E3-95E5-265C2217C142}
|
||||||
|
@ -1327,13 +1236,9 @@ Global
|
||||||
{F6DAEE9A-8BE1-4C4A-BC83-09215517C7DA} = {4C7B48D7-19AF-4AE7-9D1D-3BB289D5480D}
|
{F6DAEE9A-8BE1-4C4A-BC83-09215517C7DA} = {4C7B48D7-19AF-4AE7-9D1D-3BB289D5480D}
|
||||||
{6BA13AA4-C25F-480F-856B-8E8000299A72} = {F6DAEE9A-8BE1-4C4A-BC83-09215517C7DA}
|
{6BA13AA4-C25F-480F-856B-8E8000299A72} = {F6DAEE9A-8BE1-4C4A-BC83-09215517C7DA}
|
||||||
{12AC2813-E895-4AAA-AE6C-94E21DA09F64} = {F6DAEE9A-8BE1-4C4A-BC83-09215517C7DA}
|
{12AC2813-E895-4AAA-AE6C-94E21DA09F64} = {F6DAEE9A-8BE1-4C4A-BC83-09215517C7DA}
|
||||||
{17716AF4-D439-4C74-8326-475FB1847DF2} = {F6DAEE9A-8BE1-4C4A-BC83-09215517C7DA}
|
|
||||||
{A333B85A-DC23-49B6-9797-B89A7951E92D} = {F6DAEE9A-8BE1-4C4A-BC83-09215517C7DA}
|
{A333B85A-DC23-49B6-9797-B89A7951E92D} = {F6DAEE9A-8BE1-4C4A-BC83-09215517C7DA}
|
||||||
{E3FDD4AC-46B6-4B9F-B672-317D1202CC50} = {F6DAEE9A-8BE1-4C4A-BC83-09215517C7DA}
|
{E3FDD4AC-46B6-4B9F-B672-317D1202CC50} = {F6DAEE9A-8BE1-4C4A-BC83-09215517C7DA}
|
||||||
{35E83EDF-CC5A-441D-8949-17AACC463CA4} = {F6DAEE9A-8BE1-4C4A-BC83-09215517C7DA}
|
|
||||||
{A2CDA945-EF31-4C37-A063-BD1E2B3938EB} = {F6DAEE9A-8BE1-4C4A-BC83-09215517C7DA}
|
|
||||||
{D11FC318-8F5D-4C8C-9287-AB40A016D13C} = {F6DAEE9A-8BE1-4C4A-BC83-09215517C7DA}
|
{D11FC318-8F5D-4C8C-9287-AB40A016D13C} = {F6DAEE9A-8BE1-4C4A-BC83-09215517C7DA}
|
||||||
{7FDF9571-B7DF-4F09-BD5E-12BDDF4FA520} = {F6DAEE9A-8BE1-4C4A-BC83-09215517C7DA}
|
|
||||||
{1FB1DD07-06AA-45B4-B5AC-20FF5BEE98B6} = {F6DAEE9A-8BE1-4C4A-BC83-09215517C7DA}
|
{1FB1DD07-06AA-45B4-B5AC-20FF5BEE98B6} = {F6DAEE9A-8BE1-4C4A-BC83-09215517C7DA}
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
EndGlobal
|
EndGlobal
|
||||||
|
|
|
@ -29,4 +29,4 @@ artifacts:
|
||||||
type: zip
|
type: zip
|
||||||
|
|
||||||
#on_finish:
|
#on_finish:
|
||||||
# - ps: $blockRdp = $true; iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1'))
|
# - ps: $blockRdp = $true; iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1'))
|
|
@ -1,43 +1,70 @@
|
||||||
<!-- Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -->
|
<!-- Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -->
|
||||||
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
|
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
|
||||||
<ItemGroup>
|
|
||||||
|
<ItemGroup Condition="'$(BUILD_NET40)'=='1'">
|
||||||
<ProjectsWithDefaultFramework Include="src/fsharp-library-build.proj" />
|
<ProjectsWithDefaultFramework Include="src/fsharp-library-build.proj" />
|
||||||
<ProjectsWithDefaultFramework Include="src/fsharp-compiler-build.proj" />
|
<ProjectsWithDefaultFramework Include="src/fsharp-compiler-build.proj" />
|
||||||
<ProjectsWithDefaultFramework Include="src/fsharp-typeproviders-build.proj" />
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectsWithDefaultFramework Include="src/fsharp-library-unittests-build.proj" Condition="'$(TEST_NET40_COREUNIT)'=='1'" />
|
||||||
|
<ProjectsWithDefaultFramework Include="src/fsharp-compiler-unittests-build.proj" Condition="'$(TEST_COMPILERUNIT)'=='1'" />
|
||||||
|
<ProjectsWithDefaultFramework Include="tests/fsharp/FSharp.Tests.fsproj" Condition="'$(TEST_FSHARP_SUITE)'=='1'" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectsWithPortableFramework Include="src/fsharp-library-build.proj" Condition="'$(BUILD_PORTABLE)'=='1'"/>
|
||||||
|
<ProjectsWithPortableFramework Include="src/fsharp-library-unittests-build.proj" Condition="'$(TEST_PORTABLE_COREUNIT)'=='1'" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectsWithDefaultFramework Include="src/fsharp-typeproviders-build.proj" Condition="'$(BUILD_FSHARP_DATA_TYPEPROVIDERS)'=='1'" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup Condition="'$(BUILD_VS)'=='1'">
|
||||||
<ProjectsWithDefaultFramework Include="vsintegration/fsharp-vsintegration-src-build.proj" />
|
<ProjectsWithDefaultFramework Include="vsintegration/fsharp-vsintegration-src-build.proj" />
|
||||||
<ProjectsWithDefaultFramework Include="vsintegration/fsharp-vsintegration-project-templates-build.proj" />
|
<ProjectsWithDefaultFramework Include="vsintegration/fsharp-vsintegration-project-templates-build.proj" />
|
||||||
<ProjectsWithDefaultFramework Include="vsintegration/fsharp-vsintegration-item-templates-build.proj" />
|
<ProjectsWithDefaultFramework Include="vsintegration/fsharp-vsintegration-item-templates-build.proj" />
|
||||||
<ProjectsWithDefaultFramework Include="vsintegration/fsharp-vsintegration-deployment-build.proj" />
|
<ProjectsWithDefaultFramework Include="vsintegration/fsharp-vsintegration-deployment-build.proj" />
|
||||||
<ProjectsWithDefaultFramework Include="vsintegration/fsharp-vsintegration-unittests-build.proj" />
|
|
||||||
<ProjectsWithDefaultFramework Include="src/fsharp-library-unittests-build.proj" />
|
|
||||||
<ProjectsWithDefaultFramework Include="src/fsharp-compiler-unittests-build.proj" />
|
|
||||||
<ProjectsWithDefaultFramework Include="tests/fsharp/FSharp.Tests.fsproj" />
|
|
||||||
|
|
||||||
<ProjectsWithPortableFramework Include="src/fsharp-library-build.proj" />
|
|
||||||
<ProjectsWithPortableFramework Include="src/fsharp-library-unittests-build.proj" />
|
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectsWithDefaultFramework Include="vsintegration/fsharp-vsintegration-unittests-build.proj" Condition="'$(TEST_VS)'=='1'" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup Condition="'$(BUILD_CORECLR)'=='1'">
|
||||||
|
<ProjectsWithCoreClr Include="src/fsharp-library-build.proj" />
|
||||||
|
<ProjectsWithCoreClr Include="src/fsharp-compiler-build.proj" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectsWithCoreClr Include="src/fsharp-library-unittests-build.proj" Condition="'$(TEST_CORECLR)'=='1'" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
<Target Name="Build">
|
<Target Name="Build">
|
||||||
<MSBuild Projects="@(ProjectsWithDefaultFramework)" Targets="Build" BuildInParallel="true"/>
|
<MSBuild Projects="@(ProjectsWithDefaultFramework)" Targets="Build" BuildInParallel="true" Properties="Configuration=$(Configuration)" />
|
||||||
<MSBuild Projects="@(ProjectsWithPortableFramework)" Targets="Build" BuildInParallel="true" Properties="TargetFramework=portable47"/>
|
<MSBuild Projects="@(ProjectsWithPortableFramework)" Targets="Build" BuildInParallel="true" Properties="Configuration=$(Configuration);TargetFramework=portable7" />
|
||||||
<MSBuild Projects="@(ProjectsWithPortableFramework)" Targets="Build" BuildInParallel="true" Properties="TargetFramework=portable7"/>
|
<MSBuild Projects="@(ProjectsWithPortableFramework)" Targets="Build" BuildInParallel="true" Properties="Configuration=$(Configuration);TargetFramework=portable47" />
|
||||||
<MSBuild Projects="@(ProjectsWithPortableFramework)" Targets="Build" BuildInParallel="true" Properties="TargetFramework=portable78"/>
|
<MSBuild Projects="@(ProjectsWithPortableFramework)" Targets="Build" BuildInParallel="true" Properties="Configuration=$(Configuration);TargetFramework=portable78" />
|
||||||
<MSBuild Projects="@(ProjectsWithPortableFramework)" Targets="Build" BuildInParallel="true" Properties="TargetFramework=portable259"/>
|
<MSBuild Projects="@(ProjectsWithPortableFramework)" Targets="Build" BuildInParallel="true" Properties="Configuration=$(Configuration);TargetFramework=portable259" />
|
||||||
|
<MSBuild Projects="@(ProjectsWithCoreClr)" Targets="Build" BuildInParallel="false" Properties="Configuration=$(Configuration);TargetFramework=coreclr" />
|
||||||
</Target>
|
</Target>
|
||||||
|
|
||||||
<Target Name="Rebuild">
|
<Target Name="Rebuild">
|
||||||
<MSBuild Projects="@(ProjectsWithDefaultFramework)" Targets="Rebuild" BuildInParallel="true"/>
|
<MSBuild Projects="@(ProjectsWithDefaultFramework)" Targets="Rebuild" BuildInParallel="true" Properties="Configuration=$(Configuration)" />
|
||||||
<MSBuild Projects="@(ProjectsWithPortableFramework)" Targets="Rebuild" BuildInParallel="true" Properties="TargetFramework=portable47"/>
|
<MSBuild Projects="@(ProjectsWithPortableFramework)" Targets="Rebuild" BuildInParallel="true" Properties="Configuration=$(Configuration);TargetFramework=portable7" />
|
||||||
<MSBuild Projects="@(ProjectsWithPortableFramework)" Targets="Rebuild" BuildInParallel="true" Properties="TargetFramework=portable7"/>
|
<MSBuild Projects="@(ProjectsWithPortableFramework)" Targets="Rebuild" BuildInParallel="true" Properties="Configuration=$(Configuration);TargetFramework=portable47" />
|
||||||
<MSBuild Projects="@(ProjectsWithPortableFramework)" Targets="Rebuild" BuildInParallel="true" Properties="TargetFramework=portable78"/>
|
<MSBuild Projects="@(ProjectsWithPortableFramework)" Targets="Rebuild" BuildInParallel="true" Properties="Configuration=$(Configuration);TargetFramework=portable78" />
|
||||||
<MSBuild Projects="@(ProjectsWithPortableFramework)" Targets="Rebuild" BuildInParallel="true" Properties="TargetFramework=portable259"/>
|
<MSBuild Projects="@(ProjectsWithPortableFramework)" Targets="Rebuild" BuildInParallel="true" Properties="Configuration=$(Configuration);TargetFramework=portable259" />
|
||||||
|
<MSBuild Projects="@(ProjectsWithCoreClr)" Targets="Rebuild" BuildInParallel="false" Properties="Configuration=$(Configuration);TargetFramework=coreclr" />
|
||||||
</Target>
|
</Target>
|
||||||
|
|
||||||
<Target Name="Clean">
|
<Target Name="Clean">
|
||||||
<MSBuild Projects="@(ProjectsWithDefaultFramework)" Targets="Clean" BuildInParallel="true"/>
|
<MSBuild Projects="@(ProjectsWithDefaultFramework)" Targets="Clean" BuildInParallel="true" Properties="Configuration=$(Configuration)" />
|
||||||
<MSBuild Projects="@(ProjectsWithPortableFramework)" Targets="Clean" BuildInParallel="true" Properties="TargetFramework=portable47"/>
|
<MSBuild Projects="@(ProjectsWithPortableFramework)" Targets="Clean" BuildInParallel="true" Properties="Configuration=$(Configuration);TargetFramework=portable7" />
|
||||||
<MSBuild Projects="@(ProjectsWithPortableFramework)" Targets="Clean" BuildInParallel="true" Properties="TargetFramework=portable7"/>
|
<MSBuild Projects="@(ProjectsWithPortableFramework)" Targets="Clean" BuildInParallel="true" Properties="Configuration=$(Configuration);TargetFramework=portable47" />
|
||||||
<MSBuild Projects="@(ProjectsWithPortableFramework)" Targets="Clean" BuildInParallel="true" Properties="TargetFramework=portable78"/>
|
<MSBuild Projects="@(ProjectsWithPortableFramework)" Targets="Clean" BuildInParallel="true" Properties="Configuration=$(Configuration);TargetFramework=portable78" />
|
||||||
<MSBuild Projects="@(ProjectsWithPortableFramework)" Targets="Clean" BuildInParallel="true" Properties="TargetFramework=portable259"/>
|
<MSBuild Projects="@(ProjectsWithPortableFramework)" Targets="Clean" BuildInParallel="true" Properties="Configuration=$(Configuration);TargetFramework=portable259" />
|
||||||
|
<MSBuild Projects="@(ProjectsWithCoreClr)" Targets="Clean" BuildInParallel="false" Properties="Configuration=$(Configuration);TargetFramework=coreclr" />
|
||||||
</Target>
|
</Target>
|
||||||
</Project>
|
</Project>
|
||||||
|
|
86
build.cmd
86
build.cmd
|
@ -31,7 +31,6 @@ set BUILD_NET40=1
|
||||||
set BUILD_CORECLR=0
|
set BUILD_CORECLR=0
|
||||||
set BUILD_PORTABLE=0
|
set BUILD_PORTABLE=0
|
||||||
set BUILD_VS=0
|
set BUILD_VS=0
|
||||||
set BUILD_FSHARP_DATA_TYPEPROVIDERS=0
|
|
||||||
set BUILD_CONFIG=release
|
set BUILD_CONFIG=release
|
||||||
set BUILD_CONFIG_LOWERCASE=release
|
set BUILD_CONFIG_LOWERCASE=release
|
||||||
|
|
||||||
|
@ -80,7 +79,6 @@ if /i '%ARG%' == 'all' (
|
||||||
set BUILD_PROTO=1
|
set BUILD_PROTO=1
|
||||||
set BUILD_PORTABLE=1
|
set BUILD_PORTABLE=1
|
||||||
set BUILD_VS=1
|
set BUILD_VS=1
|
||||||
set BUILD_FSHARP_DATA_TYPEPROVIDERS=1
|
|
||||||
set TEST_COMPILERUNIT=1
|
set TEST_COMPILERUNIT=1
|
||||||
set TEST_PORTABLE_COREUNIT=1
|
set TEST_PORTABLE_COREUNIT=1
|
||||||
set TEST_VS=1
|
set TEST_VS=1
|
||||||
|
@ -94,7 +92,6 @@ if /i '%ARG%' == 'ci' (
|
||||||
set BUILD_CORECLR=1
|
set BUILD_CORECLR=1
|
||||||
set BUILD_PORTABLE=1
|
set BUILD_PORTABLE=1
|
||||||
set BUILD_VS=1
|
set BUILD_VS=1
|
||||||
set BUILD_FSHARP_DATA_TYPEPROVIDERS=1
|
|
||||||
|
|
||||||
set TEST_COMPILERUNIT=1
|
set TEST_COMPILERUNIT=1
|
||||||
set TEST_NET40_COREUNIT=1
|
set TEST_NET40_COREUNIT=1
|
||||||
|
@ -112,7 +109,6 @@ if /i '%ARG%' == 'ci_part1' (
|
||||||
set BUILD_CORECLR=1
|
set BUILD_CORECLR=1
|
||||||
set BUILD_PORTABLE=1
|
set BUILD_PORTABLE=1
|
||||||
set BUILD_VS=1
|
set BUILD_VS=1
|
||||||
set BUILD_FSHARP_DATA_TYPEPROVIDERS=1
|
|
||||||
|
|
||||||
set TEST_COMPILERUNIT=1
|
set TEST_COMPILERUNIT=1
|
||||||
set TEST_NET40_COREUNIT=1
|
set TEST_NET40_COREUNIT=1
|
||||||
|
@ -125,7 +121,6 @@ if /i '%ARG%' == 'ci_part1' (
|
||||||
if /i '%ARG%' == 'ci_part2' (
|
if /i '%ARG%' == 'ci_part2' (
|
||||||
set SKIP_EXPENSIVE_TESTS=1
|
set SKIP_EXPENSIVE_TESTS=1
|
||||||
set BUILD_PORTABLE=1
|
set BUILD_PORTABLE=1
|
||||||
set BUILD_FSHARP_DATA_TYPEPROVIDERS=1
|
|
||||||
set TEST_FSHARPQA_SUITE=1
|
set TEST_FSHARPQA_SUITE=1
|
||||||
set TEST_FSHARP_SUITE=1
|
set TEST_FSHARP_SUITE=1
|
||||||
)
|
)
|
||||||
|
@ -180,7 +175,6 @@ echo BUILD_NET40=%BUILD_NET40%
|
||||||
echo BUILD_CORECLR=%BUILD_CORECLR%
|
echo BUILD_CORECLR=%BUILD_CORECLR%
|
||||||
echo BUILD_PORTABLE=%BUILD_PORTABLE%
|
echo BUILD_PORTABLE=%BUILD_PORTABLE%
|
||||||
echo BUILD_VS=%BUILD_VS%
|
echo BUILD_VS=%BUILD_VS%
|
||||||
echo BUILD_FSHARP_DATA_TYPEPROVIDERS=%BUILD_FSHARP_DATA_TYPEPROVIDERS%
|
|
||||||
echo BUILD_CONFIG=%BUILD_CONFIG%
|
echo BUILD_CONFIG=%BUILD_CONFIG%
|
||||||
echo BUILD_CONFIG_LOWERCASE=%BUILD_CONFIG_LOWERCASE%
|
echo BUILD_CONFIG_LOWERCASE=%BUILD_CONFIG_LOWERCASE%
|
||||||
echo.
|
echo.
|
||||||
|
@ -285,85 +279,7 @@ if '%BUILD_PROTO%' == '1' (
|
||||||
@if ERRORLEVEL 1 echo Error: NGen of proto failed && goto :failure
|
@if ERRORLEVEL 1 echo Error: NGen of proto failed && goto :failure
|
||||||
)
|
)
|
||||||
|
|
||||||
%_msbuildexe% %msbuildflags% src/fsharp-compiler-build.proj /p:Configuration=%BUILD_CONFIG% /p:RestorePackages=%RestorePackages%
|
%_msbuildexe% %msbuildflags% build-everything.proj /p:Configuration=%BUILD_CONFIG%
|
||||||
@if ERRORLEVEL 1 echo Error: compiler build failed && goto :failure
|
|
||||||
|
|
||||||
%_msbuildexe% %msbuildflags% src/fsharp-library-build.proj /p:Configuration=%BUILD_CONFIG% /p:RestorePackages=%RestorePackages%
|
|
||||||
@if ERRORLEVEL 1 echo Error: library build failed && goto :failure
|
|
||||||
|
|
||||||
if '%BUILD_FSHARP_DATA_TYPEPROVIDERS%' == '1' (
|
|
||||||
%_msbuildexe% %msbuildflags% src/fsharp-typeproviders-build.proj /p:Configuration=%BUILD_CONFIG% /p:RestorePackages=%RestorePackages%
|
|
||||||
@if ERRORLEVEL 1 echo Error: type provider build failed && goto :failure
|
|
||||||
)
|
|
||||||
|
|
||||||
if '%BUILD_CORECLR%' == '1' (
|
|
||||||
%_msbuildexe% %msbuildflags% src/fsharp-library-build.proj /p:TargetFramework=coreclr /p:Configuration=%BUILD_CONFIG% /p:RestorePackages=%RestorePackages%
|
|
||||||
@if ERRORLEVEL 1 echo Error: library coreclr build failed && goto :failure
|
|
||||||
|
|
||||||
%_msbuildexe% %msbuildflags% src/fsharp-compiler-build.proj /p:TargetFramework=coreclr /p:Configuration=%BUILD_CONFIG% /p:RestorePackages=%RestorePackages%
|
|
||||||
@if ERRORLEVEL 1 echo Error: compiler coreclr build failed && goto :failure
|
|
||||||
|
|
||||||
if '%TEST_CORECLR%' == '1' (
|
|
||||||
%_msbuildexe% src/fsharp-library-unittests-build.proj /p:TargetFramework=coreclr /p:Configuration=%BUILD_CONFIG%
|
|
||||||
@if ERRORLEVEL 1 echo Error: library unittests build failed && goto :failure
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
if '%BUILD_PORTABLE%' == '1' (
|
|
||||||
%_msbuildexe% %msbuildflags% src/fsharp-library-build.proj /p:TargetFramework=portable7 /p:Configuration=%BUILD_CONFIG%
|
|
||||||
@if ERRORLEVEL 1 echo Error: library portable7 build failed && goto :failure
|
|
||||||
|
|
||||||
%_msbuildexe% %msbuildflags% src/fsharp-library-build.proj /p:TargetFramework=portable47 /p:Configuration=%BUILD_CONFIG%
|
|
||||||
@if ERRORLEVEL 1 echo Error: library portable47 build failed && goto :failure
|
|
||||||
|
|
||||||
%_msbuildexe% %msbuildflags% src/fsharp-library-build.proj /p:TargetFramework=portable78 /p:Configuration=%BUILD_CONFIG%
|
|
||||||
@if ERRORLEVEL 1 echo Error: library portable78 build failed && goto :failure
|
|
||||||
|
|
||||||
%_msbuildexe% %msbuildflags% src/fsharp-library-build.proj /p:TargetFramework=portable259 /p:Configuration=%BUILD_CONFIG%
|
|
||||||
@if ERRORLEVEL 1 echo Error: library portable259 build failed && goto :failure
|
|
||||||
)
|
|
||||||
|
|
||||||
if '%TEST_COMPILERUNIT%' == '1' (
|
|
||||||
%_msbuildexe% %msbuildflags% src/fsharp-compiler-unittests-build.proj /p:Configuration=%BUILD_CONFIG%
|
|
||||||
@if ERRORLEVEL 1 echo Error: compiler unittests build failed && goto :failure
|
|
||||||
)
|
|
||||||
if '%TEST_NET40_COREUNIT%' == '1' (
|
|
||||||
%_msbuildexe% %msbuildflags% src/fsharp-library-unittests-build.proj /p:Configuration=%BUILD_CONFIG%
|
|
||||||
@if ERRORLEVEL 1 echo Error: library unittests build failed && goto :failure
|
|
||||||
)
|
|
||||||
|
|
||||||
if '%TEST_PORTABLE_COREUNIT%' == '1' (
|
|
||||||
%_msbuildexe% %msbuildflags% src/fsharp-library-unittests-build.proj /p:TargetFramework=portable7 /p:Configuration=%BUILD_CONFIG%
|
|
||||||
@if ERRORLEVEL 1 echo Error: library unittests build failed && goto :failure
|
|
||||||
|
|
||||||
%_msbuildexe% %msbuildflags% src/fsharp-library-unittests-build.proj /p:TargetFramework=portable47 /p:Configuration=%BUILD_CONFIG%
|
|
||||||
@if ERRORLEVEL 1 echo Error: library unittests build failed && goto :failure
|
|
||||||
|
|
||||||
%_msbuildexe% %msbuildflags% src/fsharp-library-unittests-build.proj /p:TargetFramework=portable78 /p:Configuration=%BUILD_CONFIG%
|
|
||||||
@if ERRORLEVEL 1 echo Error: library unittests build failed && goto :failure
|
|
||||||
|
|
||||||
%_msbuildexe% %msbuildflags% src/fsharp-library-unittests-build.proj /p:TargetFramework=portable259 /p:Configuration=%BUILD_CONFIG%
|
|
||||||
@if ERRORLEVEL 1 echo Error: library unittests build failed && goto :failure
|
|
||||||
)
|
|
||||||
|
|
||||||
if '%BUILD_VS%' == '1' (
|
|
||||||
%_msbuildexe% %msbuildflags% vsintegration/fsharp-vsintegration-src-build.proj /p:Configuration=%BUILD_CONFIG%
|
|
||||||
@if ERRORLEVEL 1 echo Error: VS integration src build failed && goto :failure
|
|
||||||
|
|
||||||
%_msbuildexe% %msbuildflags% vsintegration/fsharp-vsintegration-project-templates-build.proj /p:Configuration=%BUILD_CONFIG%
|
|
||||||
@if ERRORLEVEL 1 echo Error: VS integration project templates build failed && goto :failure
|
|
||||||
|
|
||||||
%_msbuildexe% %msbuildflags% vsintegration/fsharp-vsintegration-item-templates-build.proj /p:Configuration=%BUILD_CONFIG%
|
|
||||||
@if ERRORLEVEL 1 echo Error: VS integration item templates build failed && goto :failure
|
|
||||||
|
|
||||||
%_msbuildexe% %msbuildflags% vsintegration/fsharp-vsintegration-deployment-build.proj /p:Configuration=%BUILD_CONFIG%
|
|
||||||
@if ERRORLEVEL 1 echo Error: VS integration deployment build failed && goto :failure
|
|
||||||
|
|
||||||
if '%TEST_VS%' == '1' (
|
|
||||||
%_msbuildexe% %msbuildflags% vsintegration/fsharp-vsintegration-unittests-build.proj /p:Configuration=%BUILD_CONFIG%
|
|
||||||
@if ERRORLEVEL 1 echo Error: VS integration unittests build failed && goto :failure
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
@echo on
|
@echo on
|
||||||
call src\update.cmd %BUILD_CONFIG_LOWERCASE% -ngen
|
call src\update.cmd %BUILD_CONFIG_LOWERCASE% -ngen
|
||||||
|
|
16026
lkg/project.lock.json
16026
lkg/project.lock.json
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -19,7 +19,7 @@
|
||||||
<Choose>
|
<Choose>
|
||||||
<When Condition="'$(ProjectLanguage)' == 'FSharp'">
|
<When Condition="'$(ProjectLanguage)' == 'FSharp'">
|
||||||
<Choose>
|
<Choose>
|
||||||
<When Condition="'$(AssemblyName)' == 'FSharp.Core' or '$(AssemblyName)' == 'FSharp.Build' or '$(AssemblyName)' == 'FSharp.Compiler' or '$(AssemblyName)' == 'FSharp.Compiler.Interactive.Settings' or '$(AssemblyName)' == 'FSharp.Compiler.Server.Shared' or '$(AssemblyName)' == 'fsc' or '$(AssemblyName)' == 'fsi' or '$(AssemblyName)' == 'FsiAnyCPU' or '$(AssemblyName)' == 'FSharp.Data.TypeProviders' or '$(AssemblyName)' == 'FSharp.Compiler.Unittests'" >
|
<When Condition="'$(AssemblyName)' == 'FSharp.Core' or '$(AssemblyName)' == 'FSharp.Build' or '$(AssemblyName)' == 'FSharp.Compiler' or '$(AssemblyName)' == 'FSharp.Compiler.Interactive.Settings' or '$(AssemblyName)' == 'FSharp.Compiler.Server.Shared' or '$(AssemblyName)' == 'fsc' or '$(AssemblyName)' == 'fsi' or '$(AssemblyName)' == 'FsiAnyCPU' or '$(AssemblyName)' == 'FSharp.Compiler.Unittests'" >
|
||||||
<PropertyGroup Condition="'$(AssemblyName)' == 'FSharp.Core' and ('$(TargetFramework)' == 'portable47' or '$(TargetFramework)' == 'portable7' or '$(TargetFramework)' == 'portable78' or '$(TargetFramework)' == 'portable259' or '$(TargetFramework)' == 'coreclr')">
|
<PropertyGroup Condition="'$(AssemblyName)' == 'FSharp.Core' and ('$(TargetFramework)' == 'portable47' or '$(TargetFramework)' == 'portable7' or '$(TargetFramework)' == 'portable78' or '$(TargetFramework)' == 'portable259' or '$(TargetFramework)' == 'coreclr')">
|
||||||
<IsPortableProfile>true</IsPortableProfile>
|
<IsPortableProfile>true</IsPortableProfile>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
|
@ -1,20 +0,0 @@
|
||||||
// Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
|
||||||
|
|
||||||
namespace Microsoft.FSharp
|
|
||||||
open System.Reflection
|
|
||||||
open System.Runtime.InteropServices
|
|
||||||
|
|
||||||
[<assembly:AssemblyDescription("FSharp.Data.TypeProviders.dll")>]
|
|
||||||
[<assembly:AssemblyCompany("Microsoft Corporation")>]
|
|
||||||
[<assembly:AssemblyTitle("FSharp.Data.TypeProviders.dll")>]
|
|
||||||
[<assembly:AssemblyCopyright("\169 Microsoft Corporation. All rights reserved.")>]
|
|
||||||
[<assembly:AssemblyProduct("Microsoft\174 F#")>]
|
|
||||||
[<assembly:ComVisible(false)>]
|
|
||||||
do()
|
|
||||||
|
|
||||||
#if NO_STRONG_NAMES
|
|
||||||
[<assembly:System.Runtime.CompilerServices.InternalsVisibleTo("VisualFSharp.Unittests")>]
|
|
||||||
#else
|
|
||||||
[<assembly:System.Runtime.CompilerServices.InternalsVisibleTo("VisualFSharp.Unittests, PublicKey=002400000480000094000000060200000024000052534131000400000100010007D1FA57C4AED9F0A32E84AA0FAEFD0DE9E8FD6AEC8F87FB03766C834C99921EB23BE79AD9D5DCC1DD9AD236132102900B723CF980957FC4E177108FC607774F29E8320E92EA05ECE4E821C0A5EFE8F1645C4C0C93C1AB99285D622CAA652C1DFAD63D745D6F2DE5F17E5EAF0FC4963D261C8A12436518206DC093344D5AD293")>]
|
|
||||||
#endif
|
|
||||||
do()
|
|
|
@ -53,7 +53,7 @@ try
|
||||||
|
|
||||||
let nugetArgs = sprintf "pack %s -BasePath \"%s\" -OutputDirectory \"%s\" -ExcludeEmptyDirectories -prop licenseUrl=\"%s\" -prop version=\"%s\" -prop authors=\"%s\" -prop projectURL=\"%s\" -prop tags=\"%s\" -Verbosity detailed"
|
let nugetArgs = sprintf "pack %s -BasePath \"%s\" -OutputDirectory \"%s\" -ExcludeEmptyDirectories -prop licenseUrl=\"%s\" -prop version=\"%s\" -prop authors=\"%s\" -prop projectURL=\"%s\" -prop tags=\"%s\" -Verbosity detailed"
|
||||||
nuspec
|
nuspec
|
||||||
bindir
|
layouts
|
||||||
output
|
output
|
||||||
licenseUrl
|
licenseUrl
|
||||||
version
|
version
|
||||||
|
|
|
@ -1,19 +0,0 @@
|
||||||
<!-- Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -->
|
|
||||||
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"
|
|
||||||
ToolsVersion="4.0">
|
|
||||||
|
|
||||||
<PropertyGroup>
|
|
||||||
<TargetFramework Condition="'$(TargetFramework)'==''">net40</TargetFramework>
|
|
||||||
</PropertyGroup>
|
|
||||||
|
|
||||||
<!-- Type providers assembly -->
|
|
||||||
<ItemGroup Condition=" '$(TargetFramework)' != 'sl3-wp' and '$(TargetFramework)' != 'sl5'">
|
|
||||||
<ProjectFiles Include="fsharp/FSharp.Data.TypeProviders/FSharp.Data.TypeProviders.fsproj"/>
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
<Import Project="root.traversal.targets"/>
|
|
||||||
|
|
||||||
<!-- Insert any customizations for targets here -->
|
|
||||||
|
|
||||||
</Project>
|
|
||||||
|
|
|
@ -27,8 +27,6 @@ Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "FSharp.Compiler.Server.Shar
|
||||||
EndProject
|
EndProject
|
||||||
Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "FSharp.Core.Unittests", "fsharp\FSharp.Core.Unittests\FSharp.Core.Unittests.fsproj", "{88E2D422-6852-46E3-A740-83E391DC7973}"
|
Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "FSharp.Core.Unittests", "fsharp\FSharp.Core.Unittests\FSharp.Core.Unittests.fsproj", "{88E2D422-6852-46E3-A740-83E391DC7973}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "FSharp.Data.TypeProviders", "fsharp\FSharp.Data.TypeProviders\FSharp.Data.TypeProviders.fsproj", "{CB7D20C4-6506-406D-9144-5342C3595F03}"
|
|
||||||
EndProject
|
|
||||||
Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "FsiAnyCPU", "fsharp\fsiAnyCpu\FsiAnyCPU.fsproj", "{8B3E283D-B5FE-4055-9D80-7E3A32F3967B}"
|
Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "FsiAnyCPU", "fsharp\fsiAnyCpu\FsiAnyCPU.fsproj", "{8B3E283D-B5FE-4055-9D80-7E3A32F3967B}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "FSharp.Compiler.Unittests", "fsharp\FSharp.Compiler.Unittests\FSharp.Compiler.Unittests.fsproj", "{A8D9641A-9170-4CF4-8FE0-6DB8C134E1B5}"
|
Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "FSharp.Compiler.Unittests", "fsharp\FSharp.Compiler.Unittests\FSharp.Compiler.Unittests.fsproj", "{A8D9641A-9170-4CF4-8FE0-6DB8C134E1B5}"
|
||||||
|
@ -77,10 +75,6 @@ Global
|
||||||
{88E2D422-6852-46E3-A740-83E391DC7973}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{88E2D422-6852-46E3-A740-83E391DC7973}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
{88E2D422-6852-46E3-A740-83E391DC7973}.Release|Any CPU.ActiveCfg = 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|Any CPU.Build.0 = Release|Any CPU
|
||||||
{CB7D20C4-6506-406D-9144-5342C3595F03}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{CB7D20C4-6506-406D-9144-5342C3595F03}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{CB7D20C4-6506-406D-9144-5342C3595F03}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{CB7D20C4-6506-406D-9144-5342C3595F03}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{8B3E283D-B5FE-4055-9D80-7E3A32F3967B}.Debug|Any CPU.ActiveCfg = Debug|x86
|
{8B3E283D-B5FE-4055-9D80-7E3A32F3967B}.Debug|Any CPU.ActiveCfg = Debug|x86
|
||||||
{8B3E283D-B5FE-4055-9D80-7E3A32F3967B}.Release|Any CPU.ActiveCfg = Release|x86
|
{8B3E283D-B5FE-4055-9D80-7E3A32F3967B}.Release|Any CPU.ActiveCfg = Release|x86
|
||||||
{A8D9641A-9170-4CF4-8FE0-6DB8C134E1B5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
{A8D9641A-9170-4CF4-8FE0-6DB8C134E1B5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
|
|
@ -30,7 +30,9 @@ let mkFlexibleFormatTypar m tys dflt =
|
||||||
|
|
||||||
let mkFlexibleIntFormatTypar g m =
|
let mkFlexibleIntFormatTypar g m =
|
||||||
mkFlexibleFormatTypar m [ g.byte_ty; g.int16_ty; g.int32_ty; g.int64_ty; g.sbyte_ty; g.uint16_ty; g.uint32_ty; g.uint64_ty;g.nativeint_ty;g.unativeint_ty; ] g.int_ty
|
mkFlexibleFormatTypar m [ g.byte_ty; g.int16_ty; g.int32_ty; g.int64_ty; g.sbyte_ty; g.uint16_ty; g.uint32_ty; g.uint64_ty;g.nativeint_ty;g.unativeint_ty; ] g.int_ty
|
||||||
|
|
||||||
|
let mkFlexibleDecimalFormatTypar g m =
|
||||||
|
mkFlexibleFormatTypar m [ g.decimal_ty ] g.decimal_ty
|
||||||
|
|
||||||
let mkFlexibleFloatFormatTypar g m =
|
let mkFlexibleFloatFormatTypar g m =
|
||||||
mkFlexibleFormatTypar m [ g.float_ty; g.float32_ty; g.decimal_ty ] g.float_ty
|
mkFlexibleFormatTypar m [ g.float_ty; g.float32_ty; g.decimal_ty ] g.float_ty
|
||||||
|
@ -235,9 +237,9 @@ let parseFormatStringInternal (m:range) g (source: string option) fmt bty cty =
|
||||||
| ('h' | 'H') ->
|
| ('h' | 'H') ->
|
||||||
failwithf "%s" <| FSComp.SR.forHIsUnnecessary()
|
failwithf "%s" <| FSComp.SR.forHIsUnnecessary()
|
||||||
|
|
||||||
| 'M' ->
|
| 'M' ->
|
||||||
collectSpecifierLocation relLine relCol
|
collectSpecifierLocation relLine relCol
|
||||||
parseLoop ((posi, g.decimal_ty) :: acc) (i+1, relLine, relCol+1)
|
parseLoop ((posi, mkFlexibleDecimalFormatTypar g m) :: acc) (i+1, relLine, relCol+1)
|
||||||
|
|
||||||
| ('f' | 'F' | 'e' | 'E' | 'g' | 'G') ->
|
| ('f' | 'F' | 'e' | 'E' | 'g' | 'G') ->
|
||||||
collectSpecifierLocation relLine relCol
|
collectSpecifierLocation relLine relCol
|
||||||
|
|
|
@ -102,7 +102,6 @@ exception DeprecatedCommandLineOptionNoDescription of string * range
|
||||||
exception InternalCommandLineOption of string * range
|
exception InternalCommandLineOption of string * range
|
||||||
exception HashLoadedSourceHasIssues of (*warnings*) exn list * (*errors*) exn list * range
|
exception HashLoadedSourceHasIssues of (*warnings*) exn list * (*errors*) exn list * range
|
||||||
exception HashLoadedScriptConsideredSource of range
|
exception HashLoadedScriptConsideredSource of range
|
||||||
exception InvalidInternalsVisibleToAssemblyName of (*badName*)string * (*fileName option*) string option
|
|
||||||
|
|
||||||
|
|
||||||
let GetRangeOfError(err:PhasedError) =
|
let GetRangeOfError(err:PhasedError) =
|
||||||
|
@ -3548,7 +3547,7 @@ let WriteOptimizationData (tcGlobals, file, ccu,modulInfo) =
|
||||||
// Abstraction for project reference
|
// Abstraction for project reference
|
||||||
|
|
||||||
type RawFSharpAssemblyDataBackedByFileOnDisk (ilModule: ILModuleDef, ilAssemblyRefs) =
|
type RawFSharpAssemblyDataBackedByFileOnDisk (ilModule: ILModuleDef, ilAssemblyRefs) =
|
||||||
let externalSigAndOptData = ["FSharp.Core";"FSharp.LanguageService.Compiler"]
|
let externalSigAndOptData = ["FSharp.Core"]
|
||||||
interface IRawFSharpAssemblyData with
|
interface IRawFSharpAssemblyData with
|
||||||
member __.GetAutoOpenAttributes(ilg) = GetAutoOpenAttributes ilg ilModule
|
member __.GetAutoOpenAttributes(ilg) = GetAutoOpenAttributes ilg ilModule
|
||||||
member __.GetInternalsVisibleToAttributes(ilg) = GetInternalsVisibleToAttributes ilg ilModule
|
member __.GetInternalsVisibleToAttributes(ilg) = GetInternalsVisibleToAttributes ilg ilModule
|
||||||
|
@ -3701,6 +3700,13 @@ type TcImports(tcConfigP:TcConfigProvider, initialResolutions:TcAssemblyResoluti
|
||||||
| Some(importsBase)-> importsBase.GetDllInfos() @ dllInfos
|
| Some(importsBase)-> importsBase.GetDllInfos() @ dllInfos
|
||||||
| None -> dllInfos
|
| None -> dllInfos
|
||||||
|
|
||||||
|
member tcImports.AllAssemblyResolutions() =
|
||||||
|
CheckDisposed()
|
||||||
|
let ars = resolutions.GetAssemblyResolutions()
|
||||||
|
match importsBase with
|
||||||
|
| Some(importsBase)-> importsBase.AllAssemblyResolutions() @ ars
|
||||||
|
| None -> ars
|
||||||
|
|
||||||
member tcImports.TryFindDllInfo (m,assemblyName,lookupOnly) =
|
member tcImports.TryFindDllInfo (m,assemblyName,lookupOnly) =
|
||||||
CheckDisposed()
|
CheckDisposed()
|
||||||
let rec look (t:TcImports) =
|
let rec look (t:TcImports) =
|
||||||
|
@ -4036,7 +4042,7 @@ type TcImports(tcConfigP:TcConfigProvider, initialResolutions:TcAssemblyResoluti
|
||||||
{ resolutionFolder = tcConfig.implicitIncludeDir
|
{ resolutionFolder = tcConfig.implicitIncludeDir
|
||||||
outputFile = tcConfig.outputFile
|
outputFile = tcConfig.outputFile
|
||||||
showResolutionMessages = tcConfig.showExtensionTypeMessages
|
showResolutionMessages = tcConfig.showExtensionTypeMessages
|
||||||
referencedAssemblies = [| for r in resolutions.GetAssemblyResolutions() -> r.resolvedPath |]
|
referencedAssemblies = Array.distinct [| for r in tcImports.AllAssemblyResolutions() -> r.resolvedPath |]
|
||||||
temporaryFolder = FileSystem.GetTempPathShim() }
|
temporaryFolder = FileSystem.GetTempPathShim() }
|
||||||
|
|
||||||
// The type provider should not hold strong references to disposed
|
// The type provider should not hold strong references to disposed
|
||||||
|
@ -4585,17 +4591,19 @@ type TcImports(tcConfigP:TcConfigProvider, initialResolutions:TcAssemblyResoluti
|
||||||
|
|
||||||
/// Process #r in F# Interactive.
|
/// Process #r in F# Interactive.
|
||||||
/// Adds the reference to the tcImports and add the ccu to the type checking environment.
|
/// Adds the reference to the tcImports and add the ccu to the type checking environment.
|
||||||
let RequireDLL (tcImports:TcImports) tcEnv m file =
|
let RequireDLL (tcImports:TcImports, tcEnv, thisAssemblyName, m, file) =
|
||||||
let RequireResolved = function
|
|
||||||
| ResolvedImportedAssembly(ccuinfo) -> ccuinfo
|
|
||||||
| UnresolvedImportedAssembly(assemblyName) -> error(Error(FSComp.SR.buildCouldNotResolveAssemblyRequiredByFile(assemblyName,file),m))
|
|
||||||
let resolutions = CommitOperationResult(tcImports.TryResolveAssemblyReference(AssemblyReference(m,file,None),ResolveAssemblyReferenceMode.ReportErrors))
|
let resolutions = CommitOperationResult(tcImports.TryResolveAssemblyReference(AssemblyReference(m,file,None),ResolveAssemblyReferenceMode.ReportErrors))
|
||||||
let dllinfos,ccuinfos = tcImports.RegisterAndImportReferencedAssemblies(resolutions)
|
let dllinfos,ccuinfos = tcImports.RegisterAndImportReferencedAssemblies(resolutions)
|
||||||
let ccuinfos = ccuinfos |> List.map RequireResolved
|
|
||||||
|
let asms =
|
||||||
|
ccuinfos |> List.map (function
|
||||||
|
| ResolvedImportedAssembly(asm) -> asm
|
||||||
|
| UnresolvedImportedAssembly(assemblyName) -> error(Error(FSComp.SR.buildCouldNotResolveAssemblyRequiredByFile(assemblyName,file),m)))
|
||||||
|
|
||||||
let g = tcImports.GetTcGlobals()
|
let g = tcImports.GetTcGlobals()
|
||||||
let amap = tcImports.GetImportMap()
|
let amap = tcImports.GetImportMap()
|
||||||
let tcEnv = ccuinfos |> List.fold (fun tcEnv ccuinfo -> Tc.AddCcuToTcEnv(g,amap,m,tcEnv,ccuinfo.FSharpViewOfMetadata,ccuinfo.AssemblyAutoOpenAttributes,false)) tcEnv
|
let tcEnv = (tcEnv, asms) ||> List.fold (fun tcEnv asm -> Tc.AddCcuToTcEnv(g,amap,m,tcEnv,thisAssemblyName,asm.FSharpViewOfMetadata,asm.AssemblyAutoOpenAttributes,asm.AssemblyInternalsVisibleToAttributes))
|
||||||
tcEnv,(dllinfos,ccuinfos)
|
tcEnv,(dllinfos,asms)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -5013,29 +5021,16 @@ type LoadClosure with
|
||||||
//--------------------------------------------------------------------------
|
//--------------------------------------------------------------------------
|
||||||
|
|
||||||
/// Build the initial type checking environment
|
/// Build the initial type checking environment
|
||||||
let GetInitialTcEnv (assemblyName:string option, initm:range, tcConfig:TcConfig, tcImports:TcImports, tcGlobals) =
|
let GetInitialTcEnv (thisAssemblyName:string, initm:range, tcConfig:TcConfig, tcImports:TcImports, tcGlobals) =
|
||||||
let initm = initm.StartRange
|
let initm = initm.StartRange
|
||||||
|
|
||||||
let internalsAreVisibleHere (asm:ImportedAssembly) =
|
|
||||||
match assemblyName with
|
|
||||||
| None -> false
|
|
||||||
| Some assemblyName ->
|
|
||||||
let isTargetAssemblyName (visibleTo:string) =
|
|
||||||
try
|
|
||||||
System.Reflection.AssemblyName(visibleTo).Name = assemblyName
|
|
||||||
with e ->
|
|
||||||
warning(InvalidInternalsVisibleToAssemblyName(visibleTo,asm.FSharpViewOfMetadata.FileName))
|
|
||||||
false
|
|
||||||
let internalsVisibleTos = asm.AssemblyInternalsVisibleToAttributes
|
|
||||||
List.exists isTargetAssemblyName internalsVisibleTos
|
|
||||||
|
|
||||||
let ccus =
|
let ccus =
|
||||||
tcImports.GetImportedAssemblies()
|
tcImports.GetImportedAssemblies()
|
||||||
|> List.map (fun asm -> asm.FSharpViewOfMetadata, asm.AssemblyAutoOpenAttributes, asm |> internalsAreVisibleHere)
|
|> List.map (fun asm -> asm.FSharpViewOfMetadata, asm.AssemblyAutoOpenAttributes, asm.AssemblyInternalsVisibleToAttributes)
|
||||||
|
|
||||||
let amap = tcImports.GetImportMap()
|
let amap = tcImports.GetImportMap()
|
||||||
|
|
||||||
let tcEnv = Tc.CreateInitialTcEnv(tcGlobals, amap, initm, ccus)
|
let tcEnv = Tc.CreateInitialTcEnv(tcGlobals, amap, initm, thisAssemblyName, ccus)
|
||||||
|
|
||||||
let tcEnv =
|
let tcEnv =
|
||||||
if tcConfig.checkOverflow then
|
if tcConfig.checkOverflow then
|
||||||
|
|
|
@ -649,7 +649,7 @@ val WriteOptimizationData : TcGlobals * string * CcuThunk * Optimizer.LazyModul
|
||||||
|
|
||||||
/// Process #r in F# Interactive.
|
/// Process #r in F# Interactive.
|
||||||
/// Adds the reference to the tcImports and add the ccu to the type checking environment.
|
/// Adds the reference to the tcImports and add the ccu to the type checking environment.
|
||||||
val RequireDLL : TcImports -> TcEnv -> range -> string -> TcEnv * (ImportedBinary list * ImportedAssembly list)
|
val RequireDLL : TcImports * TcEnv * thisAssemblyName: string * referenceRange: range * file: string -> TcEnv * (ImportedBinary list * ImportedAssembly list)
|
||||||
|
|
||||||
/// Processing # commands
|
/// Processing # commands
|
||||||
val ProcessMetaCommandsFromInput :
|
val ProcessMetaCommandsFromInput :
|
||||||
|
@ -690,7 +690,7 @@ val ParseOneInputFile : TcConfig * Lexhelp.LexResourceManager * string list * st
|
||||||
|
|
||||||
/// Get the initial type checking environment including the loading of mscorlib/System.Core, FSharp.Core
|
/// Get the initial type checking environment including the loading of mscorlib/System.Core, FSharp.Core
|
||||||
/// applying the InternalsVisibleTo in referenced assemblies and opening 'Checked' if requested.
|
/// applying the InternalsVisibleTo in referenced assemblies and opening 'Checked' if requested.
|
||||||
val GetInitialTcEnv : string option * range * TcConfig * TcImports * TcGlobals -> TcEnv
|
val GetInitialTcEnv : assemblyName: string * range * TcConfig * TcImports * TcGlobals -> TcEnv
|
||||||
|
|
||||||
[<Sealed>]
|
[<Sealed>]
|
||||||
/// Represents the incremental type checking state for a set of inputs
|
/// Represents the incremental type checking state for a set of inputs
|
||||||
|
|
|
@ -2004,7 +2004,7 @@ and ReportNoCandidatesError (csenv:ConstraintSolverEnv) (nUnnamedCallerArgs,nNam
|
||||||
let missingArgs = List.drop nReqd cmeth.AllUnnamedCalledArgs
|
let missingArgs = List.drop nReqd cmeth.AllUnnamedCalledArgs
|
||||||
match NamesOfCalledArgs missingArgs with
|
match NamesOfCalledArgs missingArgs with
|
||||||
| [] -> (false, "")
|
| [] -> (false, "")
|
||||||
| names -> (true, String.concat ";" (List.map textOfId names))
|
| names -> (true, String.concat ";" (pathOfLid names))
|
||||||
else (false, "")
|
else (false, "")
|
||||||
|
|
||||||
match suggestNamesForMissingArguments with
|
match suggestNamesForMissingArguments with
|
||||||
|
|
|
@ -1291,3 +1291,4 @@ estApplyStaticArgumentsForMethodNotImplemented,"A type provider implemented GetS
|
||||||
3194,optsResponseFileNotFound,"Response file '%s' not found in '%s'"
|
3194,optsResponseFileNotFound,"Response file '%s' not found in '%s'"
|
||||||
3195,optsResponseFileNameInvalid,"Response file name '%s' is empty, contains invalid characters, has a drive specification without an absolute path, or is too long"
|
3195,optsResponseFileNameInvalid,"Response file name '%s' is empty, contains invalid characters, has a drive specification without an absolute path, or is too long"
|
||||||
3196,fsharpCoreNotFoundToBeCopied,"Cannot find FSharp.Core.dll in compiler's directory"
|
3196,fsharpCoreNotFoundToBeCopied,"Cannot find FSharp.Core.dll in compiler's directory"
|
||||||
|
3197,etMissingStaticArgumentsToMethod,"This provided method requires static parameters"
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
<?xml version="1.0"?>
|
<?xml version="1.0"?>
|
||||||
<package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
|
<package xmlns="http://schemas.microsoft.com/packaging/2012/06/nuspec.xsd">
|
||||||
<metadata>
|
<metadata>
|
||||||
<id>Microsoft.FSharp.Compiler.Host.netcore</id>
|
<id>Microsoft.FSharp.Compiler.Host.netcore</id>
|
||||||
<description>
|
<description>
|
||||||
netcore compatible version of the fsharp compiler fsc.exe.
|
netcore compatible version of the fsharp compiler fsc.exe.
|
||||||
|
|
||||||
Supported Platforms:
|
Supported Platforms:
|
||||||
- .NET Core (dnxcore50)
|
- .NET Core (netstandard1.5)
|
||||||
</description>
|
</description>
|
||||||
<language>en-US</language>
|
<language>en-US</language>
|
||||||
<requireLicenseAcceptance>true</requireLicenseAcceptance>
|
<requireLicenseAcceptance>true</requireLicenseAcceptance>
|
||||||
|
@ -16,7 +16,7 @@
|
||||||
<projectUrl>$projectUrl$</projectUrl>
|
<projectUrl>$projectUrl$</projectUrl>
|
||||||
<tags>$tags$</tags>
|
<tags>$tags$</tags>
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<group>
|
<group targetFramework=".NETStandard1.5">
|
||||||
<dependency id="Microsoft.NETCore.Platforms" version="1.0.1-rc2-23911" />
|
<dependency id="Microsoft.NETCore.Platforms" version="1.0.1-rc2-23911" />
|
||||||
<dependency id="Microsoft.NETCore.Runtime.CoreCLR" version="1.0.2-rc2-23911" />
|
<dependency id="Microsoft.NETCore.Runtime.CoreCLR" version="1.0.2-rc2-23911" />
|
||||||
<dependency id="Microsoft.NETCore" version="5.0.1-rc2-23911" />
|
<dependency id="Microsoft.NETCore" version="5.0.1-rc2-23911" />
|
||||||
|
|
|
@ -21,7 +21,7 @@
|
||||||
</FsSrGen>
|
</FsSrGen>
|
||||||
<Compile Include="InternalsVisibleTo.fs"/>
|
<Compile Include="InternalsVisibleTo.fs"/>
|
||||||
<Compile Include="..\..\assemblyinfo\assemblyinfo.FSharp.Compiler.Interactive.Settings.dll.fs">
|
<Compile Include="..\..\assemblyinfo\assemblyinfo.FSharp.Compiler.Interactive.Settings.dll.fs">
|
||||||
<Link>Utilities/assemblyinfo.FSharp.Compiler.Interactive.Settings.dll.fs</Link>
|
<Link>assemblyinfo.FSharp.Compiler.Interactive.Settings.dll.fs</Link>
|
||||||
</Compile>
|
</Compile>
|
||||||
<Compile Include="..\..\utils\reshapedreflection.fs">
|
<Compile Include="..\..\utils\reshapedreflection.fs">
|
||||||
<Link>Reflection/reshapedreflection.fs</Link>
|
<Link>Reflection/reshapedreflection.fs</Link>
|
||||||
|
|
|
@ -14,6 +14,6 @@
|
||||||
"ubuntu.14.04-x64": { }
|
"ubuntu.14.04-x64": { }
|
||||||
},
|
},
|
||||||
"frameworks": {
|
"frameworks": {
|
||||||
"dnxcore50": { }
|
"netstandard1.5": { }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -1,10 +1,10 @@
|
||||||
<?xml version="1.0"?>
|
<?xml version="1.0"?>
|
||||||
<package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
|
<package xmlns="http://schemas.microsoft.com/packaging/2012/06/nuspec.xsd">
|
||||||
<metadata>
|
<metadata>
|
||||||
<id>Microsoft.FSharp.Compiler.netcore</id>
|
<id>Microsoft.FSharp.Compiler.netcore</id>
|
||||||
<description>
|
<description>
|
||||||
netcore compatible version of the fsharp compiler fsc.exe.
|
netcore compatible version of the fsharp compiler fsc.exe.
|
||||||
Supported Platforms: - .NET Core (dnxcore50)
|
Supported Platforms: - .NET Core (.netstandard1.5)
|
||||||
</description>
|
</description>
|
||||||
<language>en-US</language>
|
<language>en-US</language>
|
||||||
<requireLicenseAcceptance>true</requireLicenseAcceptance>
|
<requireLicenseAcceptance>true</requireLicenseAcceptance>
|
||||||
|
@ -14,7 +14,7 @@
|
||||||
<projectUrl>$projectUrl$</projectUrl>
|
<projectUrl>$projectUrl$</projectUrl>
|
||||||
<tags>$tags$</tags>
|
<tags>$tags$</tags>
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<group>
|
<group targetFramework=".NETStandard1.5">
|
||||||
<dependency id="Microsoft.FSharp.Core.netcore" version="$version$" />
|
<dependency id="Microsoft.FSharp.Core.netcore" version="$version$" />
|
||||||
<dependency id="Microsoft.NETCore.Platforms" version="1.0.1-rc2-23911" />
|
<dependency id="Microsoft.NETCore.Platforms" version="1.0.1-rc2-23911" />
|
||||||
<dependency id="NETStandard.Library" version="1.5.0-rc2-23911" />
|
<dependency id="NETStandard.Library" version="1.5.0-rc2-23911" />
|
||||||
|
@ -41,10 +41,10 @@
|
||||||
</dependencies>
|
</dependencies>
|
||||||
</metadata>
|
</metadata>
|
||||||
<files>
|
<files>
|
||||||
<file src="fsc.exe" target="lib/DNXCore50" />
|
<file src="fsc.exe" target="lib/netstandard1.5" />
|
||||||
<file src="FSharp.Compiler.dll" target="lib/DNXCore50" />
|
<file src="FSharp.Compiler.dll" target="lib/netstandard1.5" />
|
||||||
<file src="default.win32manifest" target="runtimes/any/native/" />
|
<file src="default.win32manifest" target="runtimes/any/native/" />
|
||||||
<file src="fsi.exe" target="lib/DNXCore50" />
|
<file src="fsi.exe" target="lib/netstandard1.5" />
|
||||||
<file src="FSharp.Compiler.Interactive.Settings.dll" target="lib/DNXCore50" />
|
<file src="FSharp.Compiler.Interactive.Settings.dll" target="lib/netstandard1.5" />
|
||||||
</files>
|
</files>
|
||||||
</package>
|
</package>
|
||||||
|
|
|
@ -62,11 +62,10 @@ try
|
||||||
let fsharpCompilerFiles =
|
let fsharpCompilerFiles =
|
||||||
seq {
|
seq {
|
||||||
yield Path.Combine(bindir, "fsc.exe")
|
yield Path.Combine(bindir, "fsc.exe")
|
||||||
yield Path.Combine(bindir, "FSharp.Core.dll")
|
|
||||||
yield Path.Combine(bindir, "FSharp.Compiler.dll")
|
yield Path.Combine(bindir, "FSharp.Compiler.dll")
|
||||||
yield Path.Combine(bindir, "FSharp.Core.sigdata")
|
|
||||||
yield Path.Combine(bindir, "FSharp.Core.optdata")
|
|
||||||
yield Path.Combine(bindir, "default.win32manifest")
|
yield Path.Combine(bindir, "default.win32manifest")
|
||||||
|
yield Path.Combine(bindir, "fsi.exe")
|
||||||
|
yield Path.Combine(bindir, "FSharp.Compiler.Interactive.Settings.dll")
|
||||||
}
|
}
|
||||||
|
|
||||||
//Clean intermediate directoriy
|
//Clean intermediate directoriy
|
||||||
|
|
|
@ -4,8 +4,6 @@ namespace Microsoft.FSharp
|
||||||
open System.Reflection
|
open System.Reflection
|
||||||
[<assembly:System.Runtime.CompilerServices.InternalsVisibleTo("Fsc, PublicKey=002400000480000094000000060200000024000052534131000400000100010007D1FA57C4AED9F0A32E84AA0FAEFD0DE9E8FD6AEC8F87FB03766C834C99921EB23BE79AD9D5DCC1DD9AD236132102900B723CF980957FC4E177108FC607774F29E8320E92EA05ECE4E821C0A5EFE8F1645C4C0C93C1AB99285D622CAA652C1DFAD63D745D6F2DE5F17E5EAF0FC4963D261C8A12436518206DC093344D5AD293")>]
|
[<assembly:System.Runtime.CompilerServices.InternalsVisibleTo("Fsc, PublicKey=002400000480000094000000060200000024000052534131000400000100010007D1FA57C4AED9F0A32E84AA0FAEFD0DE9E8FD6AEC8F87FB03766C834C99921EB23BE79AD9D5DCC1DD9AD236132102900B723CF980957FC4E177108FC607774F29E8320E92EA05ECE4E821C0A5EFE8F1645C4C0C93C1AB99285D622CAA652C1DFAD63D745D6F2DE5F17E5EAF0FC4963D261C8A12436518206DC093344D5AD293")>]
|
||||||
[<assembly:System.Runtime.CompilerServices.InternalsVisibleTo("FSharp.Build, PublicKey=002400000480000094000000060200000024000052534131000400000100010007D1FA57C4AED9F0A32E84AA0FAEFD0DE9E8FD6AEC8F87FB03766C834C99921EB23BE79AD9D5DCC1DD9AD236132102900B723CF980957FC4E177108FC607774F29E8320E92EA05ECE4E821C0A5EFE8F1645C4C0C93C1AB99285D622CAA652C1DFAD63D745D6F2DE5F17E5EAF0FC4963D261C8A12436518206DC093344D5AD293")>]
|
[<assembly:System.Runtime.CompilerServices.InternalsVisibleTo("FSharp.Build, PublicKey=002400000480000094000000060200000024000052534131000400000100010007D1FA57C4AED9F0A32E84AA0FAEFD0DE9E8FD6AEC8F87FB03766C834C99921EB23BE79AD9D5DCC1DD9AD236132102900B723CF980957FC4E177108FC607774F29E8320E92EA05ECE4E821C0A5EFE8F1645C4C0C93C1AB99285D622CAA652C1DFAD63D745D6F2DE5F17E5EAF0FC4963D261C8A12436518206DC093344D5AD293")>]
|
||||||
[<assembly:System.Runtime.CompilerServices.InternalsVisibleTo("FSharp.QuickSearch, PublicKey=002400000480000094000000060200000024000052534131000400000100010007D1FA57C4AED9F0A32E84AA0FAEFD0DE9E8FD6AEC8F87FB03766C834C99921EB23BE79AD9D5DCC1DD9AD236132102900B723CF980957FC4E177108FC607774F29E8320E92EA05ECE4E821C0A5EFE8F1645C4C0C93C1AB99285D622CAA652C1DFAD63D745D6F2DE5F17E5EAF0FC4963D261C8A12436518206DC093344D5AD293")>]
|
|
||||||
[<assembly:System.Runtime.CompilerServices.InternalsVisibleTo("FSharp.Compiler.Model, PublicKey=002400000480000094000000060200000024000052534131000400000100010007D1FA57C4AED9F0A32E84AA0FAEFD0DE9E8FD6AEC8F87FB03766C834C99921EB23BE79AD9D5DCC1DD9AD236132102900B723CF980957FC4E177108FC607774F29E8320E92EA05ECE4E821C0A5EFE8F1645C4C0C93C1AB99285D622CAA652C1DFAD63D745D6F2DE5F17E5EAF0FC4963D261C8A12436518206DC093344D5AD293")>]
|
|
||||||
[<assembly:System.Runtime.CompilerServices.InternalsVisibleTo("Fsi, PublicKey=002400000480000094000000060200000024000052534131000400000100010007D1FA57C4AED9F0A32E84AA0FAEFD0DE9E8FD6AEC8F87FB03766C834C99921EB23BE79AD9D5DCC1DD9AD236132102900B723CF980957FC4E177108FC607774F29E8320E92EA05ECE4E821C0A5EFE8F1645C4C0C93C1AB99285D622CAA652C1DFAD63D745D6F2DE5F17E5EAF0FC4963D261C8A12436518206DC093344D5AD293")>]
|
[<assembly:System.Runtime.CompilerServices.InternalsVisibleTo("Fsi, PublicKey=002400000480000094000000060200000024000052534131000400000100010007D1FA57C4AED9F0A32E84AA0FAEFD0DE9E8FD6AEC8F87FB03766C834C99921EB23BE79AD9D5DCC1DD9AD236132102900B723CF980957FC4E177108FC607774F29E8320E92EA05ECE4E821C0A5EFE8F1645C4C0C93C1AB99285D622CAA652C1DFAD63D745D6F2DE5F17E5EAF0FC4963D261C8A12436518206DC093344D5AD293")>]
|
||||||
[<assembly:System.Runtime.CompilerServices.InternalsVisibleTo("FsiAnyCPU, PublicKey=002400000480000094000000060200000024000052534131000400000100010007D1FA57C4AED9F0A32E84AA0FAEFD0DE9E8FD6AEC8F87FB03766C834C99921EB23BE79AD9D5DCC1DD9AD236132102900B723CF980957FC4E177108FC607774F29E8320E92EA05ECE4E821C0A5EFE8F1645C4C0C93C1AB99285D622CAA652C1DFAD63D745D6F2DE5F17E5EAF0FC4963D261C8A12436518206DC093344D5AD293")>]
|
[<assembly:System.Runtime.CompilerServices.InternalsVisibleTo("FsiAnyCPU, PublicKey=002400000480000094000000060200000024000052534131000400000100010007D1FA57C4AED9F0A32E84AA0FAEFD0DE9E8FD6AEC8F87FB03766C834C99921EB23BE79AD9D5DCC1DD9AD236132102900B723CF980957FC4E177108FC607774F29E8320E92EA05ECE4E821C0A5EFE8F1645C4C0C93C1AB99285D622CAA652C1DFAD63D745D6F2DE5F17E5EAF0FC4963D261C8A12436518206DC093344D5AD293")>]
|
||||||
[<assembly:System.Runtime.CompilerServices.InternalsVisibleTo("FSharp.LanguageService, PublicKey=002400000480000094000000060200000024000052534131000400000100010007D1FA57C4AED9F0A32E84AA0FAEFD0DE9E8FD6AEC8F87FB03766C834C99921EB23BE79AD9D5DCC1DD9AD236132102900B723CF980957FC4E177108FC607774F29E8320E92EA05ECE4E821C0A5EFE8F1645C4C0C93C1AB99285D622CAA652C1DFAD63D745D6F2DE5F17E5EAF0FC4963D261C8A12436518206DC093344D5AD293")>]
|
[<assembly:System.Runtime.CompilerServices.InternalsVisibleTo("FSharp.LanguageService, PublicKey=002400000480000094000000060200000024000052534131000400000100010007D1FA57C4AED9F0A32E84AA0FAEFD0DE9E8FD6AEC8F87FB03766C834C99921EB23BE79AD9D5DCC1DD9AD236132102900B723CF980957FC4E177108FC607774F29E8320E92EA05ECE4E821C0A5EFE8F1645C4C0C93C1AB99285D622CAA652C1DFAD63D745D6F2DE5F17E5EAF0FC4963D261C8A12436518206DC093344D5AD293")>]
|
||||||
|
|
|
@ -30,7 +30,7 @@
|
||||||
"ubuntu.14.04-x64": { }
|
"ubuntu.14.04-x64": { }
|
||||||
},
|
},
|
||||||
"frameworks": {
|
"frameworks": {
|
||||||
"dnxcore50": {
|
"netstandard1.5": {
|
||||||
"imports": "portable-net45+win8"
|
"imports": "portable-net45+win8"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -18,6 +18,6 @@
|
||||||
"ubuntu.14.04-x64": { }
|
"ubuntu.14.04-x64": { }
|
||||||
},
|
},
|
||||||
"frameworks": {
|
"frameworks": {
|
||||||
"dnxcore50": { }
|
"netstandard1.5": { }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -590,28 +590,98 @@ namespace Microsoft.FSharp.Collections
|
||||||
let tryFindIndexBack f list = list |> toArray |> Array.tryFindIndexBack f
|
let tryFindIndexBack f list = list |> toArray |> Array.tryFindIndexBack f
|
||||||
|
|
||||||
[<CompiledName("Sum")>]
|
[<CompiledName("Sum")>]
|
||||||
let inline sum (list:list<_>) = Seq.sum list
|
let inline sum (list:list<'T>) =
|
||||||
|
match list with
|
||||||
|
| [] -> LanguagePrimitives.GenericZero< 'T >
|
||||||
|
| t ->
|
||||||
|
let mutable acc = LanguagePrimitives.GenericZero< 'T >
|
||||||
|
for x in t do
|
||||||
|
acc <- Checked.(+) acc x
|
||||||
|
acc
|
||||||
|
|
||||||
[<CompiledName("SumBy")>]
|
[<CompiledName("SumBy")>]
|
||||||
let inline sumBy f (list:list<_>) = Seq.sumBy f list
|
let inline sumBy (f: 'T -> 'U) (list:list<'T>) =
|
||||||
|
match list with
|
||||||
|
| [] -> LanguagePrimitives.GenericZero< 'U >
|
||||||
|
| t ->
|
||||||
|
let mutable acc = LanguagePrimitives.GenericZero< 'U >
|
||||||
|
for x in t do
|
||||||
|
acc <- Checked.(+) acc (f x)
|
||||||
|
acc
|
||||||
|
|
||||||
[<CompiledName("Max")>]
|
[<CompiledName("Max")>]
|
||||||
let inline max (list:list<_>) = Seq.max list
|
let inline max (list:list<_>) =
|
||||||
|
match list with
|
||||||
|
| [] -> invalidArg "list" LanguagePrimitives.ErrorStrings.InputSequenceEmptyString;
|
||||||
|
| h::t ->
|
||||||
|
let mutable acc = h
|
||||||
|
for x in t do
|
||||||
|
if x > acc then
|
||||||
|
acc <- x
|
||||||
|
acc
|
||||||
|
|
||||||
[<CompiledName("MaxBy")>]
|
[<CompiledName("MaxBy")>]
|
||||||
let inline maxBy f (list:list<_>) = Seq.maxBy f list
|
let inline maxBy f (list:list<_>) =
|
||||||
|
match list with
|
||||||
|
| [] -> invalidArg "list" LanguagePrimitives.ErrorStrings.InputSequenceEmptyString;
|
||||||
|
| h::t ->
|
||||||
|
let mutable acc = h
|
||||||
|
let mutable accv = f h
|
||||||
|
for x in t do
|
||||||
|
let currv = f x
|
||||||
|
if currv > accv then
|
||||||
|
acc <- x
|
||||||
|
accv <- currv
|
||||||
|
acc
|
||||||
|
|
||||||
[<CompiledName("Min")>]
|
[<CompiledName("Min")>]
|
||||||
let inline min (list:list<_>) = Seq.min list
|
let inline min (list:list<_>) =
|
||||||
|
match list with
|
||||||
|
| [] -> invalidArg "list" LanguagePrimitives.ErrorStrings.InputSequenceEmptyString;
|
||||||
|
| h::t ->
|
||||||
|
let mutable acc = h
|
||||||
|
for x in t do
|
||||||
|
if x < acc then
|
||||||
|
acc <- x
|
||||||
|
acc
|
||||||
|
|
||||||
[<CompiledName("MinBy")>]
|
[<CompiledName("MinBy")>]
|
||||||
let inline minBy f (list:list<_>) = Seq.minBy f list
|
let inline minBy f (list:list<_>) =
|
||||||
|
match list with
|
||||||
|
| [] -> invalidArg "list" LanguagePrimitives.ErrorStrings.InputSequenceEmptyString;
|
||||||
|
| h::t ->
|
||||||
|
let mutable acc = h
|
||||||
|
let mutable accv = f h
|
||||||
|
for x in t do
|
||||||
|
let currv = f x
|
||||||
|
if currv < accv then
|
||||||
|
acc <- x
|
||||||
|
accv <- currv
|
||||||
|
acc
|
||||||
|
|
||||||
[<CompiledName("Average")>]
|
[<CompiledName("Average")>]
|
||||||
let inline average (list:list<_>) = Seq.average list
|
let inline average (list:list<'T>) =
|
||||||
|
match list with
|
||||||
|
| [] -> invalidArg "source" LanguagePrimitives.ErrorStrings.InputSequenceEmptyString;
|
||||||
|
| xs ->
|
||||||
|
let mutable sum = LanguagePrimitives.GenericZero< 'T >
|
||||||
|
let mutable count = 0
|
||||||
|
for x in xs do
|
||||||
|
sum <- Checked.(+) sum x
|
||||||
|
count <- count + 1
|
||||||
|
LanguagePrimitives.DivideByInt sum count
|
||||||
|
|
||||||
[<CompiledName("AverageBy")>]
|
[<CompiledName("AverageBy")>]
|
||||||
let inline averageBy f (list:list<_>) = Seq.averageBy f list
|
let inline averageBy (f : 'T -> 'U) (list:list<'T>) =
|
||||||
|
match list with
|
||||||
|
| [] -> invalidArg "source" LanguagePrimitives.ErrorStrings.InputSequenceEmptyString;
|
||||||
|
| xs ->
|
||||||
|
let mutable sum = LanguagePrimitives.GenericZero< 'U >
|
||||||
|
let mutable count = 0
|
||||||
|
for x in xs do
|
||||||
|
sum <- Checked.(+) sum (f x)
|
||||||
|
count <- count + 1
|
||||||
|
LanguagePrimitives.DivideByInt sum count
|
||||||
|
|
||||||
[<CompiledName("Collect")>]
|
[<CompiledName("Collect")>]
|
||||||
let collect f list = Microsoft.FSharp.Primitives.Basics.List.collect f list
|
let collect f list = Microsoft.FSharp.Primitives.Basics.List.collect f list
|
||||||
|
|
|
@ -17,6 +17,6 @@
|
||||||
"ubuntu.14.04-x64": { }
|
"ubuntu.14.04-x64": { }
|
||||||
},
|
},
|
||||||
"frameworks": {
|
"frameworks": {
|
||||||
"dnxcore50": { }
|
"netstandard1.5": { }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -1,69 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<!-- Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -->
|
|
||||||
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
|
||||||
<PropertyGroup>
|
|
||||||
<DefineConstants>$(DefineConstants);TPEMIT_INTERNAL_AND_MINIMAL_FOR_TYPE_CONTAINERS</DefineConstants>
|
|
||||||
</PropertyGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<Reference Include="System" />
|
|
||||||
<Reference Include="System.Core" />
|
|
||||||
<Reference Include="System.Data" />
|
|
||||||
<Reference Include="System.Xml" />
|
|
||||||
<Reference Include="System.Xml.Linq" />
|
|
||||||
<Reference Include="System.Configuration" />
|
|
||||||
<Reference Include="System.ServiceModel" />
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<FilesToLocalize Include="$(OutDir)$(AssemblyName).dll">
|
|
||||||
<TranslationFile>$(FSharpSourcesRoot)\..\loc\lcl\{Lang}\$(AssemblyName).dll.lcl</TranslationFile>
|
|
||||||
<LciCommentFile>$(FSharpSourcesRoot)\..\loc\lci\$(AssemblyName).dll.lci</LciCommentFile>
|
|
||||||
<HasLceComments>false</HasLceComments>
|
|
||||||
<InProject>false</InProject>
|
|
||||||
</FilesToLocalize>
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<FsSrGen Include="$(FSharpSourcesRoot)\fsharp\FSharp.Data.TypeProviders\FSData.txt" >
|
|
||||||
<Link>FSData.txt</Link>
|
|
||||||
<Visible>true</Visible>
|
|
||||||
</FsSrGen>
|
|
||||||
<Compile Include="$(FSharpSourcesRoot)\fsharp\FSharp.Data.TypeProviders\Util.fsi">
|
|
||||||
<Link>Util.fsi</Link>
|
|
||||||
<Visible>true</Visible>
|
|
||||||
</Compile>
|
|
||||||
<Compile Include="$(FSharpSourcesRoot)\fsharp\FSharp.Data.TypeProviders\Util.fs">
|
|
||||||
<Link>Util.fs</Link>
|
|
||||||
<Visible>true</Visible>
|
|
||||||
</Compile>
|
|
||||||
<Compile Include="$(FSharpSourcesRoot)\fsharp\FSharp.Data.TypeProviders\InternalsVisibleTo.fs">
|
|
||||||
<Link>InternalsVisibleTo.fs</Link>
|
|
||||||
<Visible>true</Visible>
|
|
||||||
</Compile>
|
|
||||||
<Compile Include="$(FSharpSourcesRoot)\fsharp\FSharp.Data.TypeProviders\TypeProviderEmit.fsi">
|
|
||||||
<Link>TypeProviderEmit.fsi</Link>
|
|
||||||
<Visible>true</Visible>
|
|
||||||
</Compile>
|
|
||||||
<Compile Include="$(FSharpSourcesRoot)\fsharp\FSharp.Data.TypeProviders\TypeProviderEmit.fs">
|
|
||||||
<Link>TypeProviderEmit.fs</Link>
|
|
||||||
<Visible>true</Visible>
|
|
||||||
</Compile>
|
|
||||||
<Compile Include="$(FSharpSourcesRoot)\fsharp\FSharp.Data.TypeProviders\TypeProvidersImpl.fs">
|
|
||||||
<Link>TypeProvidersImpl.fs</Link>
|
|
||||||
<Visible>true</Visible>
|
|
||||||
</Compile>
|
|
||||||
<Compile Include="$(FSharpSourcesRoot)\fsharp\FSharp.Data.TypeProviders\TypeProviders.fs">
|
|
||||||
<Link>TypeProviders.fs</Link>
|
|
||||||
<Visible>true</Visible>
|
|
||||||
</Compile>
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
<Target Name="GatherBinariesToBeSigned" AfterTargets="Localize">
|
|
||||||
<ItemGroup>
|
|
||||||
<BinariesToBeSigned Include="$(OutDir)$(AssemblyName).dll" />
|
|
||||||
<BinariesToBeSigned Include="$(OutDir)localize\**\$(AssemblyName).resources.dll" />
|
|
||||||
<FilesToSign Include="@(BinariesToBeSigned)">
|
|
||||||
<Authenticode>Microsoft</Authenticode>
|
|
||||||
<StrongName>StrongName</StrongName>
|
|
||||||
</FilesToSign>
|
|
||||||
</ItemGroup>
|
|
||||||
</Target>
|
|
||||||
</Project>
|
|
|
@ -1,48 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<!-- Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -->
|
|
||||||
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
|
||||||
<PropertyGroup>
|
|
||||||
<FSharpSourcesRoot>..\..</FSharpSourcesRoot>
|
|
||||||
</PropertyGroup>
|
|
||||||
<Import Project="$(FSharpSourcesRoot)\FSharpSource.Settings.targets" />
|
|
||||||
<PropertyGroup>
|
|
||||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
|
||||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
|
||||||
<OutputType>Library</OutputType>
|
|
||||||
<AssemblyName>FSharp.Data.TypeProviders</AssemblyName>
|
|
||||||
<AllowCrossTargeting>true</AllowCrossTargeting>
|
|
||||||
<TargetFrameworkVersion Condition=" '$(TargetFrameworkVersion)' == '' ">v4.0</TargetFrameworkVersion>
|
|
||||||
<ProjectGuid>{cb7d20c4-6506-406d-9144-5342c3595f03}</ProjectGuid>
|
|
||||||
<OtherFlags>$(OtherFlags) --warnon:1182</OtherFlags>
|
|
||||||
</PropertyGroup>
|
|
||||||
<Import Project="$(FSharpSourcesRoot)\fsharp\FSharp.Data.TypeProviders\FSharp.Data.TypeProviders.Shared.fsproj"
|
|
||||||
Condition="'$(TargetFramework)' != 'sl5' AND
|
|
||||||
'$(TargetFramework)' != 'portable47' AND
|
|
||||||
'$(TargetFramework)' != 'sl3-wp'" />
|
|
||||||
<ItemGroup>
|
|
||||||
<!--This is used for compiling the runtime type provider DLL for WP7, Silverlight etc. -->
|
|
||||||
<!--This is the only file used. -->
|
|
||||||
<Compile Include="$(FSharpSourcesRoot)\fsharp\FSharp.Data.TypeProviders\TypeProviderRuntimeAttribute.fs" Condition="'$(TargetFramework)' == 'net20' or '$(TargetFramework)' == 'sl3-wp' or '$(TargetFramework)'=='sl4' ">
|
|
||||||
<Link>TypeProviderRuntimeAttribute.fs</Link>
|
|
||||||
<Visible>true</Visible>
|
|
||||||
</Compile>
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<Compile Include="$(FSharpSourcesRoot)\assemblyinfo\assemblyinfo.FSharp.Data.TypeProviders.dll.fs">
|
|
||||||
<Link>assemblyinfo.FSharp.Data.TypeProviders.dll.fs</Link>
|
|
||||||
</Compile>
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<Reference Include="mscorlib" />
|
|
||||||
<Reference Include="System" />
|
|
||||||
<Reference Include="System.Core" />
|
|
||||||
<Reference Include="System.Configuration" />
|
|
||||||
<Reference Include="System.ServiceModel" />
|
|
||||||
<ProjectReference Include="$(FSharpSourcesRoot)\fsharp\FSharp.Core\FSharp.Core.fsproj" >
|
|
||||||
<Project>{DED3BBD7-53F4-428A-8C9F-27968E768605}</Project>
|
|
||||||
<Name>FSharp.Core</Name>
|
|
||||||
</ProjectReference>
|
|
||||||
</ItemGroup>
|
|
||||||
<Import Project="$(FSharpSourcesRoot)\FSharpSource.targets"/>
|
|
||||||
</Project>
|
|
|
@ -1,9 +0,0 @@
|
||||||
// Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
|
||||||
|
|
||||||
namespace Microsoft.FSharp
|
|
||||||
open System.Reflection
|
|
||||||
[<assembly:System.Runtime.CompilerServices.InternalsVisibleTo("VisualFSharp.Unittests, PublicKey=002400000480000094000000060200000024000052534131000400000100010007D1FA57C4AED9F0A32E84AA0FAEFD0DE9E8FD6AEC8F87FB03766C834C99921EB23BE79AD9D5DCC1DD9AD236132102900B723CF980957FC4E177108FC607774F29E8320E92EA05ECE4E821C0A5EFE8F1645C4C0C93C1AB99285D622CAA652C1DFAD63D745D6F2DE5F17E5EAF0FC4963D261C8A12436518206DC093344D5AD293")>]
|
|
||||||
|
|
||||||
|
|
||||||
do()
|
|
||||||
|
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -1,267 +0,0 @@
|
||||||
// Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
|
||||||
|
|
||||||
#if TPEMIT_INTERNAL_AND_MINIMAL_FOR_TYPE_CONTAINERS
|
|
||||||
namespace Internal.Utilities.TypeProvider.Emit
|
|
||||||
#else
|
|
||||||
namespace Microsoft.FSharp.TypeProvider.Emit
|
|
||||||
#endif
|
|
||||||
open System
|
|
||||||
open System.Reflection
|
|
||||||
open System.Linq.Expressions
|
|
||||||
open Microsoft.FSharp.Core.CompilerServices
|
|
||||||
|
|
||||||
|
|
||||||
/// Represents an erased provided parameter
|
|
||||||
#if TPEMIT_INTERNAL_AND_MINIMAL_FOR_TYPE_CONTAINERS
|
|
||||||
type internal ProvidedParameter =
|
|
||||||
#else
|
|
||||||
type ProvidedParameter =
|
|
||||||
#endif
|
|
||||||
inherit System.Reflection.ParameterInfo
|
|
||||||
new : parameterName: string * parameterType: Type * ?isOut:bool * ?optionalValue:obj -> ProvidedParameter
|
|
||||||
|
|
||||||
|
|
||||||
/// Represents an erased provided constructor.
|
|
||||||
#if TPEMIT_INTERNAL_AND_MINIMAL_FOR_TYPE_CONTAINERS
|
|
||||||
type internal ProvidedConstructor =
|
|
||||||
#else
|
|
||||||
type ProvidedConstructor =
|
|
||||||
#endif
|
|
||||||
inherit System.Reflection.ConstructorInfo
|
|
||||||
|
|
||||||
/// Create a new provided constructor. It is not initially associated with any specific provided type definition.
|
|
||||||
new : parameters: ProvidedParameter list -> ProvidedConstructor
|
|
||||||
|
|
||||||
/// 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
|
|
||||||
|
|
||||||
/// Set the function used to compute the implementation of invocations of this constructor.
|
|
||||||
member InvokeCodeInternal : (Quotations.Expr[] -> Quotations.Expr) with get,set
|
|
||||||
|
|
||||||
/// Add definition location information to the provided constructor.
|
|
||||||
member AddDefinitionLocation : line:int * column:int * filePath:string -> unit
|
|
||||||
|
|
||||||
|
|
||||||
#if TPEMIT_INTERNAL_AND_MINIMAL_FOR_TYPE_CONTAINERS
|
|
||||||
type internal ProvidedMethod =
|
|
||||||
#else
|
|
||||||
type ProvidedMethod =
|
|
||||||
#endif
|
|
||||||
inherit System.Reflection.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 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
|
|
||||||
|
|
||||||
/// 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
|
|
||||||
|
|
||||||
/// Set the function used to compute the implementation of invocations of this method.
|
|
||||||
member InvokeCodeInternal : (Quotations.Expr[] -> Quotations.Expr) with get,set
|
|
||||||
|
|
||||||
|
|
||||||
/// Add definition location information to the provided type definition.
|
|
||||||
member AddDefinitionLocation : line:int * column:int * filePath:string -> unit
|
|
||||||
|
|
||||||
|
|
||||||
/// Represents an erased provided property.
|
|
||||||
#if TPEMIT_INTERNAL_AND_MINIMAL_FOR_TYPE_CONTAINERS
|
|
||||||
type internal ProvidedProperty =
|
|
||||||
#else
|
|
||||||
type ProvidedProperty =
|
|
||||||
#endif
|
|
||||||
inherit System.Reflection.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 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 invocations of this constructor.
|
|
||||||
member GetterCode : (Quotations.Expr list -> Quotations.Expr) with set
|
|
||||||
|
|
||||||
/// Set the function used to compute the implementation of invocations of this constructor.
|
|
||||||
member GetterCodeInternal : (Quotations.Expr[] -> Quotations.Expr) with get,set
|
|
||||||
|
|
||||||
/// Set the function used to compute the implementation of invocations of the property setter
|
|
||||||
member SetterCode : (Quotations.Expr list -> Quotations.Expr) with set
|
|
||||||
|
|
||||||
/// Set the function used to compute the implementation of invocations of this constructor.
|
|
||||||
member SetterCodeInternal : (Quotations.Expr[] -> Quotations.Expr) with get,set
|
|
||||||
|
|
||||||
/// Add definition location information to the provided type definition.
|
|
||||||
member AddDefinitionLocation : line:int * column:int * filePath:string -> unit
|
|
||||||
|
|
||||||
#if TPEMIT_INTERNAL_AND_MINIMAL_FOR_TYPE_CONTAINERS
|
|
||||||
#else
|
|
||||||
/// Represents an erased provided property.
|
|
||||||
[<Class>]
|
|
||||||
type ProvidedMeasureBuilder =
|
|
||||||
|
|
||||||
/// The ProvidedMeasureBuilder for building measures.
|
|
||||||
static member Default : ProvidedMeasureBuilder
|
|
||||||
|
|
||||||
/// e.g. 1
|
|
||||||
member One : System.Type
|
|
||||||
/// e.g. m * kg
|
|
||||||
member Product : measure1: System.Type * measure1: System.Type -> System.Type
|
|
||||||
/// e.g. 1 / kg
|
|
||||||
member Inverse : denominator: System.Type -> System.Type
|
|
||||||
|
|
||||||
/// e.g. kg / m
|
|
||||||
member Ratio : numerator: System.Type * denominator: System.Type -> System.Type
|
|
||||||
|
|
||||||
/// e.g. m * m
|
|
||||||
member Square : ``measure``: System.Type -> System.Type
|
|
||||||
|
|
||||||
/// the SI unit from the F# core library, where the string is in capitals and US spelling, e.g. Meter
|
|
||||||
member SI : string -> System.Type
|
|
||||||
|
|
||||||
/// e.g. float<kg>, Vector<int, kg>
|
|
||||||
member AnnotateType : basic: System.Type * argument: System.Type list -> System.Type
|
|
||||||
|
|
||||||
#endif //TPEMIT_INTERNAL_AND_MINIMAL_FOR_TYPE_CONTAINERS
|
|
||||||
|
|
||||||
/// Represents an erased provided parameter
|
|
||||||
#if TPEMIT_INTERNAL_AND_MINIMAL_FOR_TYPE_CONTAINERS
|
|
||||||
type internal ProvidedStaticParameter =
|
|
||||||
#else
|
|
||||||
type ProvidedStaticParameter =
|
|
||||||
#endif
|
|
||||||
inherit System.Reflection.ParameterInfo
|
|
||||||
new : parameterName: string * parameterType:Type * ?parameterDefaultValue:obj -> ProvidedStaticParameter
|
|
||||||
|
|
||||||
/// Represents an erased provided type definition.
|
|
||||||
#if TPEMIT_INTERNAL_AND_MINIMAL_FOR_TYPE_CONTAINERS
|
|
||||||
type internal ProvidedTypeDefinition =
|
|
||||||
#else
|
|
||||||
type ProvidedTypeDefinition =
|
|
||||||
#endif
|
|
||||||
inherit System.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
|
|
||||||
|
|
||||||
/// Specifies that the given method body implements the given method declaration.
|
|
||||||
member DefineMethodOverride : methodInfoBody: ProvidedMethod * methodInfoDeclaration: MethodInfo -> 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.
|
|
||||||
/// 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 : System.Reflection.TypeAttributes -> 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 : (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 -> System.Reflection.Assembly) -> unit
|
|
||||||
|
|
||||||
// Parametric types
|
|
||||||
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
|
|
||||||
/// Emit the given provided type definition and its nested type definitions into an 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.
|
|
||||||
member ConvertToGenerated : assemblyFileName:string * ?reportAssembly: (Assembly * byte[] -> unit) -> unit
|
|
||||||
|
|
||||||
/// 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
|
|
||||||
[<Experimental("SuppressRelocation is a workaround and likely to be removed")>]
|
|
||||||
member SuppressRelocation : bool with get,set
|
|
||||||
|
|
||||||
#if PROVIDER_TRANSFORMATIONS
|
|
||||||
[<Sealed;Class;AbstractClass>]
|
|
||||||
type ProviderTransformations =
|
|
||||||
static member FilterTypes : types: Type list * ?methodFilter : (MethodInfo -> bool) * ?eventFilter : (EventInfo -> bool) * ?propertyFilter : (PropertyInfo -> bool) * ?constructorFilter : (ConstructorInfo -> bool) * ?fieldFilter : (FieldInfo -> bool) * ?baseTypeTransform : (Type -> Type option) -> Type list
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if TPEMIT_INTERNAL_AND_MINIMAL_FOR_TYPE_CONTAINERS
|
|
||||||
#else
|
|
||||||
type TypeProviderForNamespaces =
|
|
||||||
/// A base type providing default implementations of type provider functionality when all provided types are of type ProvidedTypeDefinition
|
|
||||||
// A TypeProvider boiler plate type.
|
|
||||||
// 1. Inherit supplying the "providedNamespaces"
|
|
||||||
// 2. Add [<Microsoft.FSharp.Core.CompilerServices.TypeProvider>] to type.
|
|
||||||
// 3. Add [<assembly:TypeProviderAssembly>] do() to assembly.
|
|
||||||
|
|
||||||
/// 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
|
|
||||||
|
|
||||||
/// Add a namespace of provided types.
|
|
||||||
member AddNamespace : namespaceName:string * types: ProvidedTypeDefinition list -> unit
|
|
||||||
|
|
||||||
/// Invalidate the information provided by the provider
|
|
||||||
member Invalidate : unit -> unit
|
|
||||||
|
|
||||||
interface ITypeProvider
|
|
||||||
#endif
|
|
|
@ -1,11 +0,0 @@
|
||||||
// Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
|
||||||
|
|
||||||
namespace Microsoft.FSharp.Data.TypeProviders.DesignTime
|
|
||||||
|
|
||||||
open Microsoft.FSharp.Core.CompilerServices
|
|
||||||
|
|
||||||
// This says that this assembly is a runtime DLL for a particular platform, where the design-time
|
|
||||||
// DLL is found alongside this DLL and has the given name.
|
|
||||||
[<assembly:TypeProviderAssemblyAttribute("FSharp.Data.TypeProviders.DesignTime.dll") >]
|
|
||||||
do()
|
|
||||||
|
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -1,896 +0,0 @@
|
||||||
// Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
|
||||||
|
|
||||||
namespace Microsoft.FSharp.Data.TypeProviders.DesignTime
|
|
||||||
|
|
||||||
open System
|
|
||||||
open System.IO
|
|
||||||
open System.Reflection
|
|
||||||
open System.Collections.Generic
|
|
||||||
open System.Linq
|
|
||||||
open System.Xml.Linq
|
|
||||||
open System.Net
|
|
||||||
open System.Configuration
|
|
||||||
open Microsoft.FSharp.Data.TypeProviders.Utility
|
|
||||||
|
|
||||||
[<AutoOpen>]
|
|
||||||
module internal Utilities =
|
|
||||||
|
|
||||||
let validateSchemaFileExtension localSchemaFile ext =
|
|
||||||
// treat extensions that differ only in case as equal
|
|
||||||
if not (Path.GetExtension(localSchemaFile).Equals("."+ext, StringComparison.OrdinalIgnoreCase)) then
|
|
||||||
failwith (FSData.SR.errorInvalidExtensionSchema(Path.GetFileName(localSchemaFile),ext))
|
|
||||||
|
|
||||||
/// Use a local schema file if the 'localSchemaFile' parameter is present (IsNullOrWhiteSpace). Otherwise,
|
|
||||||
/// use a temporary file to hold the metadata description of the service. Always force the update
|
|
||||||
/// of the file if 'forceUpdate' is true and the downloaded contents have changed.
|
|
||||||
let tryUseLocalSchemaFile (localSchemaFile, forceUpdate, ext) loader =
|
|
||||||
let useTempFile = String.IsNullOrWhiteSpace localSchemaFile
|
|
||||||
let schemaFile = if useTempFile then Util.TemporaryFile ext else Util.ExistingFile localSchemaFile
|
|
||||||
|
|
||||||
// Check if the extension of LocalSchema matches the given "ext"
|
|
||||||
if not useTempFile then validateSchemaFileExtension localSchemaFile ext
|
|
||||||
|
|
||||||
if useTempFile || forceUpdate || not (File.Exists schemaFile.Path) then
|
|
||||||
let metadataText = Util.TemporaryFile ext |> loader
|
|
||||||
|
|
||||||
// Only write if it's actually changed
|
|
||||||
if useTempFile || (try File.ReadAllText schemaFile.Path with _ -> null) <> metadataText then
|
|
||||||
try
|
|
||||||
File.WriteAllText(schemaFile.Path, metadataText)
|
|
||||||
with :? System.IO.IOException as e -> failwith (FSData.SR.errorWritingLocalSchemaFile(e.Message))
|
|
||||||
|
|
||||||
schemaFile
|
|
||||||
|
|
||||||
// tricky moment that error message can spread through multiple lines
|
|
||||||
// so we:
|
|
||||||
// - walk through lines until we met first line with error code, save this line
|
|
||||||
// - traverse lines till the next error code (or EOF). append every line to the buffer
|
|
||||||
// - flush buffer on every line with error code (or at the end)
|
|
||||||
let private selectLines hasErrorCode (arr : string[]) =
|
|
||||||
|
|
||||||
// sqlmetal\edmgen pads inner exceptions with tabs so if line starts with tab - this is not beginning of the message
|
|
||||||
// svcutil pads inner exceptions with ' ' so this is not message start as well
|
|
||||||
let (|MessageStart|_|) line =
|
|
||||||
if not (System.String.IsNullOrEmpty line) && line.[0] <> '\t' && not (line.StartsWith " ") && hasErrorCode line then Some () else None
|
|
||||||
|
|
||||||
let (|EmptyLine|_|) line =
|
|
||||||
if String.IsNullOrEmpty line then Some () else None
|
|
||||||
|
|
||||||
[|
|
|
||||||
let buf = System.Text.StringBuilder()
|
|
||||||
for line in arr do
|
|
||||||
match line with
|
|
||||||
| MessageStart ->
|
|
||||||
// return accumulated result with the prevous message
|
|
||||||
if buf.Length <> 0 then
|
|
||||||
yield buf.ToString()
|
|
||||||
buf.Length <- 0
|
|
||||||
// start new message
|
|
||||||
buf.Append(line.Trim()) |> ignore
|
|
||||||
| EmptyLine ->
|
|
||||||
// // we assume that messages cannot contain embedded empty lines so empty line terminates current message
|
|
||||||
if buf.Length <> 0 then
|
|
||||||
yield buf.ToString()
|
|
||||||
buf.Length <- 0
|
|
||||||
| l ->
|
|
||||||
// if we already started writing the message - then interleave lines in buffer with spaces
|
|
||||||
// if buffer.Length = 0 - this means that we previous error has already ended but MessageStart for the new one wasn't yet met.
|
|
||||||
// in this case we discard this line - it is probably header or footer of output
|
|
||||||
if buf.Length <> 0 then
|
|
||||||
buf
|
|
||||||
.Append(" ")
|
|
||||||
.Append(l.Trim()) |> ignore
|
|
||||||
|
|
||||||
// flush remaining content
|
|
||||||
if buf.Length <> 0 then
|
|
||||||
yield buf.ToString()
|
|
||||||
|]
|
|
||||||
|
|
||||||
// Defines the main pattern for matching messages.
|
|
||||||
// taken from vsproject\xmake\shared\canonicalerror.cs
|
|
||||||
let private canonicalMessageRegex =
|
|
||||||
new System.Text.RegularExpressions.Regex
|
|
||||||
(
|
|
||||||
// Beginning of line and any amount of whitespace.
|
|
||||||
@"^\s*" +
|
|
||||||
// Match a [optional project number prefix 'ddd>'], single letter + colon + remaining filename, or
|
|
||||||
// string with no colon followed by a colon.
|
|
||||||
@"(((?<ORIGIN>(((\d+>)?[a-zA-Z]?:[^:]*)|([^:]*))):)" +
|
|
||||||
// Origin may also be empty. In this case there's no trailing colon.
|
|
||||||
"|())" +
|
|
||||||
// Match the empty string or a string without a colon that ends with a space
|
|
||||||
"(?<SUBCATEGORY>(()|([^:]*? )))" +
|
|
||||||
// Match 'error' or 'warning'.
|
|
||||||
@"(?<CATEGORY>(error|warning))" +
|
|
||||||
// Match anything starting with a space that's not a colon/space, followed by a colon.
|
|
||||||
// Error code is optional in which case "error"/"warning" can be followed immediately by a colon.
|
|
||||||
@"( \s*(?<CODE>[^: ]*))?\s*:" +
|
|
||||||
// Whatever's left on this line, including colons.
|
|
||||||
"(?<TEXT>.*)$",
|
|
||||||
System.Text.RegularExpressions.RegexOptions.IgnoreCase ||| System.Text.RegularExpressions.RegexOptions.Compiled
|
|
||||||
)
|
|
||||||
|
|
||||||
// Defines the additional pattern for matching messages which may contain localized strings.
|
|
||||||
// Note that the string "error|warning" from canonicalMessageRegex is simply replaced by "\w+"
|
|
||||||
// to match both any localized strings and PLOC'd strings.
|
|
||||||
// It has some group misalignment for PLOC'd strings, but as a whole, it works as expected.
|
|
||||||
let private structuralMessageRegex =
|
|
||||||
new System.Text.RegularExpressions.Regex
|
|
||||||
(
|
|
||||||
// Beginning of line and any amount of whitespace.
|
|
||||||
@"^\s*" +
|
|
||||||
// Match a [optional project number prefix 'ddd>'], single letter + colon + remaining filename, or
|
|
||||||
// string with no colon followed by a colon.
|
|
||||||
@"(((?<ORIGIN>(((\d+>)?[a-zA-Z]?:[^:]*)|([^:]*))):)" +
|
|
||||||
// Origin may also be empty. In this case there's no trailing colon.
|
|
||||||
"|())" +
|
|
||||||
// Match the empty string or a string without a colon that ends with a space
|
|
||||||
"(?<SUBCATEGORY>(()|([^:]*? )))" +
|
|
||||||
// Match localized 'error' or 'warning'.
|
|
||||||
@"(?<CATEGORY>(\w+))" +
|
|
||||||
// Match anything starting with a space that's not a colon/space, followed by a colon.
|
|
||||||
// Error code is optional in which case "error"/"warning" can be followed immediately by a colon.
|
|
||||||
// constraints for CODE here is more restrictive than in cannonical case - here we match only alphanumeric chars
|
|
||||||
@"( \s*(?<CODE>\w*))?\s*:" +
|
|
||||||
// Whatever's left on this line, including colons.
|
|
||||||
"(?<TEXT>.*)$",
|
|
||||||
System.Text.RegularExpressions.RegexOptions.IgnoreCase ||| System.Text.RegularExpressions.RegexOptions.Compiled
|
|
||||||
)
|
|
||||||
|
|
||||||
let formatErr (stdout: string[]) (stderr: string[]) : unit =
|
|
||||||
let getErrors s =
|
|
||||||
Array.ofSeq s
|
|
||||||
|> selectLines (fun s ->
|
|
||||||
if canonicalMessageRegex.IsMatch s then true
|
|
||||||
else
|
|
||||||
// structural regex can produce false positives when line contain ':' chars
|
|
||||||
// to reduce amount of false positives we'll mangle the most frequent scenario when ':' can be met - urls.
|
|
||||||
// In addition, "!" which wraps PLOC'd strings will be also replaced to "_" to make the matching easier.
|
|
||||||
let escapedLine = s.Replace("://", "_").Replace("!","_")
|
|
||||||
structuralMessageRegex.IsMatch escapedLine
|
|
||||||
)
|
|
||||||
|> Array.map Failure
|
|
||||||
let exns =
|
|
||||||
Array.concat
|
|
||||||
[
|
|
||||||
getErrors stdout
|
|
||||||
getErrors stderr
|
|
||||||
]
|
|
||||||
assert (exns.Length <> 0)
|
|
||||||
raise (AggregateException exns)
|
|
||||||
|
|
||||||
/// Run SQLMetal and strip out a decent error message
|
|
||||||
let sqlmetal args = Util.shell (Path.GetTempPath(), Util.sdkUtil "SqlMetal.exe", args, Some formatErr)
|
|
||||||
|
|
||||||
let inline handleReadingSchemaError (e : exn) =
|
|
||||||
match e with
|
|
||||||
| :? AggregateException as ae ->
|
|
||||||
let inners =
|
|
||||||
ae.InnerExceptions
|
|
||||||
|> Seq.map (fun e -> Failure(FSData.SR.errorReadingSchema(e.Message)))
|
|
||||||
|> Seq.toArray
|
|
||||||
|
|
||||||
raise(AggregateException(inners))
|
|
||||||
| e -> failwith (FSData.SR.errorReadingSchema(e.Message))
|
|
||||||
|
|
||||||
// will exists forever - but I guess we can live with it as the leak is minor
|
|
||||||
// CSharpCodeProvider is IDisposable -
|
|
||||||
// Dispose is inherited from Component: removes component from the ISite and unsubscribes from events - we don't use any of this features
|
|
||||||
let private csCodeProvider = new Microsoft.CSharp.CSharpCodeProvider()
|
|
||||||
|
|
||||||
let validateDataContextClassName name =
|
|
||||||
if not(String.IsNullOrWhiteSpace name) && not (csCodeProvider.IsValidIdentifier name) then
|
|
||||||
failwith (FSData.SR.invalidDataContextClassName(name))
|
|
||||||
|
|
||||||
type UC = System.Globalization.UnicodeCategory
|
|
||||||
|
|
||||||
let sanitizeDataContextFileName (name : string) =
|
|
||||||
if String.IsNullOrEmpty name then failwith (FSData.SR.invalidDataContextClassName(name))
|
|
||||||
|
|
||||||
/// tests if specified character is valid start character for C# identifier
|
|
||||||
let isValidStartChar c = Char.IsLetter c || c = '_'
|
|
||||||
|
|
||||||
/// tests if specified character is valid non-start character for C# identifier
|
|
||||||
let isValidNonStartChar c =
|
|
||||||
if Char.IsLetterOrDigit c || c = '_' then true
|
|
||||||
else
|
|
||||||
match Char.GetUnicodeCategory(c) with
|
|
||||||
| UC.NonSpacingMark | UC.ConnectorPunctuation | UC.SpacingCombiningMark -> true
|
|
||||||
| _ -> false
|
|
||||||
|
|
||||||
let buf = System.Text.StringBuilder()
|
|
||||||
|
|
||||||
let name =
|
|
||||||
// convert given identifier to the uniform representation
|
|
||||||
// 1. make it all lower-cased
|
|
||||||
// 2. convert all word starting letters to upper-case + remove whitespaces
|
|
||||||
let name = name.ToLower()
|
|
||||||
let buf = System.Text.StringBuilder()
|
|
||||||
let rec capitalizeFirstLetters i convertNextLetterToUpper =
|
|
||||||
if i >= name.Length then buf.ToString()
|
|
||||||
else
|
|
||||||
let c = name.[i]
|
|
||||||
if Char.IsWhiteSpace c then
|
|
||||||
// whitespace - set convertNextLetterToUpper to true and proceed to the next character (thus removing whitespace from the result buffer)
|
|
||||||
capitalizeFirstLetters (i + 1) true
|
|
||||||
else
|
|
||||||
// check if we see whitespace before.
|
|
||||||
// if yes and current character is letter - it should be converted it to upper case before appending character to the result buffer
|
|
||||||
let c = if Char.IsLetter c && convertNextLetterToUpper then Char.ToUpper c else c
|
|
||||||
buf.Append(c) |> ignore
|
|
||||||
capitalizeFirstLetters (i + 1) false
|
|
||||||
|
|
||||||
capitalizeFirstLetters 0 true
|
|
||||||
|
|
||||||
let startIndex =
|
|
||||||
let first = name.[0]
|
|
||||||
if isValidStartChar first then
|
|
||||||
// if first character is valid start character for C# identifier => append it to the result buffer
|
|
||||||
buf.Append(first) |> ignore
|
|
||||||
1
|
|
||||||
elif isValidNonStartChar first then
|
|
||||||
// first character in name is not valid start character but valid as non-start. => it should be prepended with '_'
|
|
||||||
buf.Append('_').Append(first) |> ignore
|
|
||||||
1
|
|
||||||
else
|
|
||||||
// first character is invalid for usage in C# identifier => let loop below do all job (this char will be replaced with '_')
|
|
||||||
0
|
|
||||||
|
|
||||||
// check char by char if they can be used in C# identifier. invalid characters are replaced with '_'
|
|
||||||
for i=startIndex to (name.Length - 1) do
|
|
||||||
let c = name.[i]
|
|
||||||
let c = if isValidNonStartChar c then c else '_'
|
|
||||||
buf.Append(c) |> ignore
|
|
||||||
|
|
||||||
// pad result with underscores if it occasionaly matches some C# keyword or reserved word
|
|
||||||
csCodeProvider.CreateValidIdentifier(buf.ToString())
|
|
||||||
|
|
||||||
module internal ConfigFiles =
|
|
||||||
|
|
||||||
type ConfigFileSearchResult =
|
|
||||||
| StandardFound of string
|
|
||||||
| CustomFound of string
|
|
||||||
| StandardNotFound
|
|
||||||
| CustomNotFound of string
|
|
||||||
|
|
||||||
/// searches for the configuration file that will be used by TP
|
|
||||||
/// designTimeDirectory- root folder
|
|
||||||
/// configFileName - full path to the custom configuration file
|
|
||||||
let findConfigFile (designTimeDirectory, configFileName) =
|
|
||||||
if String.IsNullOrWhiteSpace configFileName then
|
|
||||||
let appConfig = System.IO.Path.Combine(designTimeDirectory,"app.config")
|
|
||||||
let webConfig = System.IO.Path.Combine(designTimeDirectory,"web.config")
|
|
||||||
if System.IO.File.Exists appConfig then StandardFound appConfig
|
|
||||||
elif System.IO.File.Exists webConfig then StandardFound webConfig
|
|
||||||
else StandardNotFound
|
|
||||||
else
|
|
||||||
if System.IO.File.Exists configFileName then
|
|
||||||
CustomFound configFileName
|
|
||||||
else
|
|
||||||
CustomNotFound configFileName
|
|
||||||
|
|
||||||
[<RequireQualifiedAccess>]
|
|
||||||
type ConnectionStringReadResult =
|
|
||||||
| Ok of ConnectionStringSettings
|
|
||||||
| NotFound
|
|
||||||
| Error of exn
|
|
||||||
|
|
||||||
/// reads ConnectionStringSettings with name <connectionStringName> from the specified file
|
|
||||||
/// returns either ConnectionStringReadResult.Ok (cs : ConnectionStringSettings) (cs is not null)
|
|
||||||
/// or ConnectionStringReadResult.NotFound if configuration file doesn't contain ConnectionStringSettings with specified name
|
|
||||||
/// or ConnectionStringReadResult.Error if reading of the file ends with error
|
|
||||||
let tryReadConnectionString (configFileName : string, connectionStringName : string) =
|
|
||||||
try
|
|
||||||
// copy original file to avoid its locking
|
|
||||||
let text = System.IO.File.ReadAllText configFileName
|
|
||||||
use tmpConfigFile = Util.TemporaryFile "config"
|
|
||||||
do System.IO.File.WriteAllText(tmpConfigFile.Path,text)
|
|
||||||
let map = ExeConfigurationFileMap(ExeConfigFilename = tmpConfigFile.Path)
|
|
||||||
let config = ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.None);
|
|
||||||
|
|
||||||
let connString = config.ConnectionStrings.ConnectionStrings.[connectionStringName]
|
|
||||||
if connString <> null then ConnectionStringReadResult.Ok connString
|
|
||||||
else ConnectionStringReadResult.NotFound
|
|
||||||
with exn ->
|
|
||||||
ConnectionStringReadResult.Error exn
|
|
||||||
|
|
||||||
|
|
||||||
let computeStaticConnectionString (name,checkForSqlClientProvider, connectionString, connectionStringName, configFileName, absoluteDataDirectoryParam, designTimeDirectory) =
|
|
||||||
let connectionString, usingConfigFileInfo =
|
|
||||||
if String.IsNullOrWhiteSpace connectionString then
|
|
||||||
|
|
||||||
let configFileName, configFileBaseNameOpt =
|
|
||||||
match findConfigFile (designTimeDirectory, configFileName) with
|
|
||||||
| StandardFound path ->
|
|
||||||
let name = Path.GetFileName path
|
|
||||||
path, Some name
|
|
||||||
| CustomFound path -> path, None
|
|
||||||
| StandardNotFound -> failwith (FSData.SR.noConfigFileFound1())
|
|
||||||
| CustomNotFound name -> failwith (FSData.SR.noConfigFileFound2(name))
|
|
||||||
|
|
||||||
if String.IsNullOrWhiteSpace connectionStringName then
|
|
||||||
failwith (FSData.SR.noConnectionStringOrConnectionStringName(name))
|
|
||||||
|
|
||||||
let mkReadConnectionStringError msg =
|
|
||||||
FSData.SR.errorWhileReadingConnectionStringInConfigFile (connectionStringName, configFileName, msg)
|
|
||||||
|> Choice2Of2
|
|
||||||
|
|
||||||
let result =
|
|
||||||
match tryReadConnectionString(configFileName, connectionStringName) with
|
|
||||||
| ConnectionStringReadResult.Ok connString ->
|
|
||||||
if checkForSqlClientProvider && connString.ProviderName <> "System.Data.SqlClient" then
|
|
||||||
Choice2Of2 (FSData.SR.invalidProviderInConfigFile (connString.ProviderName, connectionStringName, configFileName))
|
|
||||||
|
|
||||||
else
|
|
||||||
let result = connString.ConnectionString
|
|
||||||
if String.IsNullOrWhiteSpace result then
|
|
||||||
Choice2Of2 (FSData.SR.invalidConnectionStringInConfigFile (result, connectionStringName, configFileName))
|
|
||||||
else
|
|
||||||
Choice1Of2 result
|
|
||||||
| ConnectionStringReadResult.NotFound ->
|
|
||||||
FSData.SR.connectionStringNotFound(connectionStringName)
|
|
||||||
|> mkReadConnectionStringError
|
|
||||||
|
|
||||||
| ConnectionStringReadResult.Error exn ->
|
|
||||||
mkReadConnectionStringError exn.Message
|
|
||||||
|
|
||||||
match result with
|
|
||||||
| Choice1Of2 r -> r, Some (connectionStringName, configFileBaseNameOpt)
|
|
||||||
| Choice2Of2 msg -> failwith msg
|
|
||||||
else
|
|
||||||
if not (String.IsNullOrWhiteSpace connectionStringName) then
|
|
||||||
failwith (FSData.SR.notBothConnectionStringOrConnectionStringName())
|
|
||||||
connectionString, None
|
|
||||||
|
|
||||||
// Always do |DataDirectory| substitution
|
|
||||||
let connectionString =
|
|
||||||
let absoluteDataDirectory =
|
|
||||||
if String.IsNullOrWhiteSpace absoluteDataDirectoryParam then
|
|
||||||
designTimeDirectory
|
|
||||||
else
|
|
||||||
if not (System.IO.Directory.Exists absoluteDataDirectoryParam) then
|
|
||||||
failwith (FSData.SR.dataDirectoryNotFound(absoluteDataDirectoryParam))
|
|
||||||
absoluteDataDirectoryParam
|
|
||||||
connectionString.Replace("|DataDirectory|", absoluteDataDirectory)
|
|
||||||
|
|
||||||
connectionString, usingConfigFileInfo
|
|
||||||
|
|
||||||
module internal Dbml =
|
|
||||||
|
|
||||||
let buildType (dbmlFileContent: string, contextTypeName:string, serializable:bool) =
|
|
||||||
|
|
||||||
validateDataContextClassName contextTypeName
|
|
||||||
|
|
||||||
// Remove the Database/Connection element if exist, which can be created by the O/R Designer
|
|
||||||
// Its attributes, "SettingsObjectName" and "SettingsPropertyName" can cause sqlmetal to generate a problematic csharp file
|
|
||||||
let dbmlFileContent =
|
|
||||||
if dbmlFileContent.Contains("Connection") then
|
|
||||||
let xdoc = XDocument.Parse dbmlFileContent
|
|
||||||
xdoc.Elements()
|
|
||||||
|> Seq.filter (fun xnode -> xnode.Name.LocalName = "Database")
|
|
||||||
|> Seq.choose (fun xnode ->
|
|
||||||
match xnode.Elements(xnode.Name.Namespace + "Connection") with
|
|
||||||
| null -> None
|
|
||||||
| s -> Some (s))
|
|
||||||
|> Seq.iter (fun xchild -> xchild.Remove())
|
|
||||||
xdoc.ToString()
|
|
||||||
else dbmlFileContent
|
|
||||||
|
|
||||||
use csFile = Util.TemporaryFile "cs"
|
|
||||||
use dbmlFile = Util.TemporaryFile "dbml"
|
|
||||||
File.WriteAllText (dbmlFile.Path, dbmlFileContent)
|
|
||||||
|
|
||||||
let sqlMetalArgs =
|
|
||||||
let command = sprintf "/code:\"%s\" /language:C# \"%s\"" csFile.Path dbmlFile.Path
|
|
||||||
let command = if not (String.IsNullOrWhiteSpace contextTypeName) then sprintf "%s /context:\"%s\" " command contextTypeName else command
|
|
||||||
let command = if serializable then sprintf "%s /serialization:Unidirectional" command else command
|
|
||||||
command
|
|
||||||
|
|
||||||
sqlmetal sqlMetalArgs
|
|
||||||
|
|
||||||
let assemblyFile = Util.TemporaryFile "dll" // TODO: load in-memory and clean up this file
|
|
||||||
|
|
||||||
let cscCommand = sprintf "/nologo /target:library /out:\"%s\" \"%s\"" assemblyFile.Path csFile.Path
|
|
||||||
Util.shell(Path.GetTempPath(), Util.cscExe(), cscCommand, None)
|
|
||||||
|
|
||||||
assemblyFile
|
|
||||||
|
|
||||||
module internal SqlConnection =
|
|
||||||
|
|
||||||
let getDbml (dbmlFile: Util.FileResource, connString, flagPluralize, flagViews, flagFunctions, flagStoredProcs, flagTimeout, contextTypeName) =
|
|
||||||
|
|
||||||
validateDataContextClassName contextTypeName
|
|
||||||
|
|
||||||
let sqlMetalArgs =
|
|
||||||
let command = sprintf "/conn:\"%s\" /dbml:\"%s\"" connString dbmlFile.Path
|
|
||||||
let command = if flagPluralize then sprintf "%s /pluralize" command else command
|
|
||||||
let command = if flagViews then sprintf "%s /views" command else command
|
|
||||||
let command = if flagFunctions then sprintf "%s /functions" command else command
|
|
||||||
let command = if flagStoredProcs then sprintf "%s /sprocs" command else command
|
|
||||||
let command = if not (String.IsNullOrWhiteSpace contextTypeName) then sprintf "%s /context:\"%s\" " command contextTypeName else command
|
|
||||||
let command = sprintf "%s /timeout:%d" command flagTimeout
|
|
||||||
command
|
|
||||||
sqlmetal sqlMetalArgs
|
|
||||||
File.ReadAllText dbmlFile.Path
|
|
||||||
|
|
||||||
|
|
||||||
let buildType (connectionString, connectionStringName:string, configFileName:string, absoluteDataDirectory:string, localSchemaFile:string, forceUpdate:bool, flagPluralize, flagViews, flagFunctions, flagStoredProcs, flagTimeout, contextTypeName, serializable, designTimeDirectory) =
|
|
||||||
let connectionString, usingConfigFileInfo = ConfigFiles.computeStaticConnectionString ("SqlDataConnection", true, connectionString, connectionStringName, configFileName, absoluteDataDirectory, designTimeDirectory)
|
|
||||||
|
|
||||||
// parses connection string on components, validates only syntax
|
|
||||||
let connStringBuilder = System.Data.Common.DbConnectionStringBuilder()
|
|
||||||
connStringBuilder.ConnectionString <- connectionString
|
|
||||||
let contextTypeName =
|
|
||||||
// if context is not explicitly set - try to infer context name from database filename
|
|
||||||
if String.IsNullOrWhiteSpace(contextTypeName) then
|
|
||||||
let dbFileNameOpt =
|
|
||||||
// SqlCE allows usage of both 'Data Source' and 'DataSource' names and treats them as equivalent
|
|
||||||
// however SqlMetal doesn't recognize 'DataSource' and always looks for 'Data Source'
|
|
||||||
// so to figure out if given connection string is SqlCE - we'll get value of 'Data Source' and check if it ends with .sdf
|
|
||||||
// NOTE: we cannot just use SqlConnectionStringBuilder because it rejects some SqlCE specific parameter names
|
|
||||||
match connStringBuilder.TryGetValue ("Data Source") with
|
|
||||||
| true, (:? string as ds) when ds.EndsWith(".sdf", System.StringComparison.OrdinalIgnoreCase) -> Some ds // SqlCE
|
|
||||||
| _ ->
|
|
||||||
// SqlServer
|
|
||||||
let sqlConnString = System.Data.SqlClient.SqlConnectionStringBuilder(connectionString)
|
|
||||||
if not (String.IsNullOrEmpty sqlConnString.AttachDBFilename) then
|
|
||||||
Some (sqlConnString.AttachDBFilename)
|
|
||||||
else
|
|
||||||
None
|
|
||||||
|
|
||||||
match dbFileNameOpt with
|
|
||||||
| Some f -> Path.GetFileNameWithoutExtension f |> sanitizeDataContextFileName
|
|
||||||
| None -> contextTypeName
|
|
||||||
else
|
|
||||||
contextTypeName
|
|
||||||
|
|
||||||
use dbmlFile =
|
|
||||||
tryUseLocalSchemaFile
|
|
||||||
(localSchemaFile, forceUpdate, "dbml")
|
|
||||||
(fun dbmlFile ->
|
|
||||||
try
|
|
||||||
getDbml (dbmlFile,connectionString, flagPluralize, flagViews, flagFunctions, flagStoredProcs, flagTimeout, contextTypeName)
|
|
||||||
with
|
|
||||||
e -> handleReadingSchemaError e)
|
|
||||||
|
|
||||||
use csFile = Util.TemporaryFile "cs"
|
|
||||||
let sqlMetalArgs =
|
|
||||||
let command = sprintf "/code:\"%s\" /language:C# \"%s\"" csFile.Path dbmlFile.Path
|
|
||||||
let command = if not (String.IsNullOrWhiteSpace contextTypeName) then sprintf "%s /context:\"%s\" " command contextTypeName else command
|
|
||||||
let command = if serializable then sprintf "%s /serialization:Unidirectional" command else command
|
|
||||||
command
|
|
||||||
sqlmetal sqlMetalArgs
|
|
||||||
|
|
||||||
let assemblyFile = Util.TemporaryFile "dll" // TODO: load in-memory and clean up this file
|
|
||||||
|
|
||||||
let cscCommand = sprintf "/nologo /target:library /out:\"%s\" \"%s\"" assemblyFile.Path csFile.Path
|
|
||||||
Util.shell(Path.GetTempPath(), Util.cscExe(), cscCommand, None)
|
|
||||||
|
|
||||||
assemblyFile, usingConfigFileInfo
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
module internal DataSvcUtil =
|
|
||||||
|
|
||||||
type MetadataError = FixedQueryNotSupported | DataQualityServiceNotSupported
|
|
||||||
module Metadata =
|
|
||||||
|
|
||||||
let private edmx = XNamespace.Get "http://schemas.microsoft.com/ado/2007/06/edmx"
|
|
||||||
let private dr = XNamespace.Get "http://schemas.microsoft.com/dallas/2010/04"
|
|
||||||
let private edm08 = XNamespace.Get "http://schemas.microsoft.com/ado/2009/08/edm"
|
|
||||||
let private edm05 = XNamespace.Get "http://schemas.microsoft.com/ado/2007/05/edm"
|
|
||||||
|
|
||||||
let private get (name : XName) (c : XContainer) =
|
|
||||||
match c.Element name with
|
|
||||||
| null -> None
|
|
||||||
| el -> Some (el :> XContainer)
|
|
||||||
|
|
||||||
/// Analyzes given metadata file and tries to find evidence of specific cases that may cause datasvcutil to fail
|
|
||||||
let TryPredictError (path : string) =
|
|
||||||
try
|
|
||||||
let xdoc = XDocument.Load(path)
|
|
||||||
let error =
|
|
||||||
defaultArg (get (edmx + "Edmx") xdoc) (xdoc :> XContainer)
|
|
||||||
|> get (edmx + "DataServices")
|
|
||||||
|> Option.bind (fun ds ->
|
|
||||||
match get (edm08 + "Schema") ds with
|
|
||||||
| Some el -> Some (el, edm08)
|
|
||||||
| None ->
|
|
||||||
|
|
||||||
match get (edm05 + "Schema") ds with
|
|
||||||
| Some el -> Some (el, edm05)
|
|
||||||
| None -> None
|
|
||||||
)
|
|
||||||
|> Option.bind (fun (schema, ns) ->
|
|
||||||
// check if metadata contains node
|
|
||||||
// <Using Namespace="Microsoft.DQS">
|
|
||||||
// this indicates that target service implements DataQuality API - datasvcutil cannot consume it correctly
|
|
||||||
let isDQS =
|
|
||||||
match get (ns + "Using") schema with
|
|
||||||
| Some (:? XElement as e) ->
|
|
||||||
match e.Attribute(XName.Get "Namespace") with
|
|
||||||
| null -> false
|
|
||||||
| attr -> attr.Value = "Microsoft.DQS"
|
|
||||||
| _ -> false
|
|
||||||
|
|
||||||
if isDQS then Some DataQualityServiceNotSupported
|
|
||||||
else
|
|
||||||
|
|
||||||
// check all EntityType nodes
|
|
||||||
// if all of them has <Property Queryable='false'> - then it may indicate that service support fixed query
|
|
||||||
let entityTypes = schema.Elements(ns + "EntityType")
|
|
||||||
let isFixed =
|
|
||||||
entityTypes.Elements (ns + "Property")
|
|
||||||
|> Seq.forall (fun el ->
|
|
||||||
let attr = el.Attribute(dr + "Queryable")
|
|
||||||
attr <> null && attr.Value = "false"
|
|
||||||
)
|
|
||||||
|
|
||||||
if isFixed then Some FixedQueryNotSupported
|
|
||||||
else None
|
|
||||||
)
|
|
||||||
error
|
|
||||||
with _ -> None // swallow this error (if datasvcutil will fail - we'll report errors from the output)
|
|
||||||
|
|
||||||
/// Add the default service URI to the generated CS file by inserting it as the argument
|
|
||||||
/// to the default data context constructor, also drop the namespace declaration.
|
|
||||||
let addDefaultUriToDataSvcUtilCSharpFile uri csFile =
|
|
||||||
let csText = File.ReadAllLines csFile
|
|
||||||
|
|
||||||
let (|DataContextClass|_|) (line:string) =
|
|
||||||
let trimmed = line.Trim('{',' ','\t')
|
|
||||||
let starting = "public partial class "
|
|
||||||
let ending = "System.Data.Services.Client.DataServiceContext"
|
|
||||||
if trimmed.StartsWith starting && trimmed.Contains ":" && trimmed.EndsWith ending then
|
|
||||||
let s = trimmed.Substring starting.Length
|
|
||||||
Some (s.Substring(0, s.IndexOf ' '), line.Contains "{")
|
|
||||||
else None
|
|
||||||
|
|
||||||
let doctoredText =
|
|
||||||
[| // Was the last line a namespace?
|
|
||||||
let prevNS = ref false
|
|
||||||
let foundDataContextClass = ref None
|
|
||||||
for line in csText do
|
|
||||||
match line with
|
|
||||||
| _ when prevNS.Value -> prevNS := false // note, the line after the namespace is dropped
|
|
||||||
| _ when line.StartsWith "namespace" -> prevNS := true // note, the namespace declaration is dropped
|
|
||||||
|
|
||||||
| DataContextClass (className, endsWithBrace) ->
|
|
||||||
foundDataContextClass := Some (className, endsWithBrace)
|
|
||||||
yield line
|
|
||||||
| _ ->
|
|
||||||
match line.Trim(), foundDataContextClass.Value with
|
|
||||||
| "{", Some(className, false)
|
|
||||||
| "", Some(className, true) ->
|
|
||||||
yield line
|
|
||||||
yield sprintf "public %s() : this(new global::System.Uri(\"%s\")) {}" className uri
|
|
||||||
foundDataContextClass := None
|
|
||||||
|
|
||||||
| _ when line <> "}" -> yield line
|
|
||||||
| _ -> ()
|
|
||||||
|]
|
|
||||||
File.WriteAllLines(csFile, doctoredText)
|
|
||||||
|
|
||||||
let buildTypeFromMetadataUri (uri : string, localSchemaFile:string, forceUpdate:bool, dataServiceCollection) =
|
|
||||||
|
|
||||||
use csdlFile =
|
|
||||||
tryUseLocalSchemaFile (localSchemaFile, forceUpdate, "csdl") (fun _ ->
|
|
||||||
try
|
|
||||||
let metadataUri =
|
|
||||||
if uri.EndsWith "/" then uri + "$metadata"
|
|
||||||
else uri + "/$metadata"
|
|
||||||
let metadataText =
|
|
||||||
use c = new WebClient(UseDefaultCredentials=true) // TODO: consider adding schema credentials here
|
|
||||||
c.DownloadString metadataUri
|
|
||||||
metadataText
|
|
||||||
with e -> handleReadingSchemaError e)
|
|
||||||
|
|
||||||
let expectedError = Metadata.TryPredictError csdlFile.Path
|
|
||||||
|
|
||||||
use csFile = Util.TemporaryFile "cs"
|
|
||||||
let dataSvcUtilArgs =
|
|
||||||
let args = sprintf "/nologo /in:\"%s\" /out:\"%s\" /language:CSharp /version:2.0" csdlFile.Path csFile.Path
|
|
||||||
let args = if dataServiceCollection then sprintf "%s /DataServiceCollection" args else args
|
|
||||||
args
|
|
||||||
try
|
|
||||||
Util.shell(Path.GetTempPath(), Util.dataSvcUtilExe(), dataSvcUtilArgs, Some formatErr)
|
|
||||||
with
|
|
||||||
_ ->
|
|
||||||
// check if we expect errors in this file
|
|
||||||
match expectedError with
|
|
||||||
| Some FixedQueryNotSupported -> failwith (FSData.SR.fixedQueriesNotSupported())
|
|
||||||
| Some DataQualityServiceNotSupported -> failwith (FSData.SR.dqsServicesNotSupported())
|
|
||||||
| None -> reraise()
|
|
||||||
|
|
||||||
addDefaultUriToDataSvcUtilCSharpFile uri csFile.Path
|
|
||||||
|
|
||||||
let assemblyFile = Util.TemporaryFile "dll" // TODO: load in-memory and clean up this file
|
|
||||||
|
|
||||||
let cscCommand = sprintf "/nologo /target:library /r:System.Data.Services.Client.dll /out:\"%s\" \"%s\"" assemblyFile.Path csFile.Path
|
|
||||||
Util.shell(Path.GetTempPath(), Util.cscExe(), cscCommand, None)
|
|
||||||
assemblyFile
|
|
||||||
|
|
||||||
|
|
||||||
module internal SvcUtil =
|
|
||||||
|
|
||||||
let serviceMetadataFilesXName = XName.Get "ServiceMetadataFiles"
|
|
||||||
let serviceMetadataFileXName = XName.Get "ServiceMetadataFile"
|
|
||||||
let fileNameXName = XName.Get "name"
|
|
||||||
|
|
||||||
/// assumes that destFolder is already created
|
|
||||||
let private unpackFolder (sourceFile : string) (destFolder : string) =
|
|
||||||
let xml = XDocument.Load sourceFile
|
|
||||||
for fileNode in xml.Root.Elements(serviceMetadataFileXName) do
|
|
||||||
let name = fileNode.Attribute(fileNameXName)
|
|
||||||
let resultPath = Path.Combine(destFolder, name.Value)
|
|
||||||
let root =
|
|
||||||
fileNode.Elements()
|
|
||||||
|> Seq.tryFind(fun _ -> true) // pick first element
|
|
||||||
match root with
|
|
||||||
| Some root -> root.Save(resultPath)
|
|
||||||
| None -> failwith (FSData.SR.serviceMetadataFileElementIsEmpty())
|
|
||||||
|
|
||||||
let private packFolder sourceFolder (destFile : string) patterns =
|
|
||||||
let root =XElement(serviceMetadataFilesXName)
|
|
||||||
let doc = XDocument(root)
|
|
||||||
|
|
||||||
let append pat =
|
|
||||||
for f in Directory.GetFiles(sourceFolder, pat) do
|
|
||||||
let xml = XDocument.Load(f)
|
|
||||||
let node = XElement(serviceMetadataFileXName)
|
|
||||||
let fileName = Path.GetFileName f
|
|
||||||
// add attribute with the name of source file
|
|
||||||
node.Add(XAttribute(fileNameXName, fileName))
|
|
||||||
// append file content
|
|
||||||
node.Add(xml.Root)
|
|
||||||
|
|
||||||
root.Add(node)
|
|
||||||
|
|
||||||
for pat in patterns do
|
|
||||||
append pat
|
|
||||||
|
|
||||||
doc.Save(destFile)
|
|
||||||
|
|
||||||
let validateWsdlUri uri =
|
|
||||||
if String.IsNullOrWhiteSpace uri then
|
|
||||||
failwith (FSData.SR.invalidWsdlUri())
|
|
||||||
|
|
||||||
let buildTypeFromWsdlUri (namespaceName, wsdlUri : string, localSchemaFile:string, forceUpdate:bool, messageContract, enableDataBinding, serializable, async, collectionType) =
|
|
||||||
|
|
||||||
validateWsdlUri wsdlUri
|
|
||||||
|
|
||||||
use metadataDir =
|
|
||||||
let tempFolder = Util.TemporaryDirectory()
|
|
||||||
|
|
||||||
let schemaFileSet = not (String.IsNullOrWhiteSpace localSchemaFile)
|
|
||||||
let schemaFileExists = schemaFileSet && ( try File.Exists(localSchemaFile) with _ -> false )
|
|
||||||
|
|
||||||
if schemaFileSet then validateSchemaFileExtension localSchemaFile "wsdlschema"
|
|
||||||
|
|
||||||
// downloads metadata to the specified temp folder
|
|
||||||
// if localSchemaFile is set - pack downloaded content as localSchemaFile
|
|
||||||
let downloadMetadata () =
|
|
||||||
if (try System.IO.Directory.Exists tempFolder.Path with _ -> false) then
|
|
||||||
(try System.IO.Directory.Delete (tempFolder.Path, true) with _ -> ())
|
|
||||||
if not (System.IO.Directory.Exists tempFolder.Path) then
|
|
||||||
System.IO.Directory.CreateDirectory tempFolder.Path |> ignore
|
|
||||||
let svcUtilArgs =
|
|
||||||
let args = sprintf "/nologo /t:metadata \"%s\"" wsdlUri
|
|
||||||
args
|
|
||||||
|
|
||||||
Util.shell(tempFolder.Path, Util.svcUtilExe(), svcUtilArgs, Some formatErr)
|
|
||||||
|
|
||||||
if schemaFileSet then
|
|
||||||
packFolder tempFolder.Path localSchemaFile ["*.wsdl"; "*.xsd"]
|
|
||||||
|
|
||||||
if not (schemaFileExists) || forceUpdate then
|
|
||||||
downloadMetadata()
|
|
||||||
else
|
|
||||||
// reraise exceptions if local schema file is corrupted
|
|
||||||
try
|
|
||||||
unpackFolder localSchemaFile tempFolder.Path
|
|
||||||
with
|
|
||||||
e -> failwith (FSData.SR.errorReadingSchema(e.Message))
|
|
||||||
|
|
||||||
|
|
||||||
tempFolder
|
|
||||||
|
|
||||||
use configFile = Util.TemporaryFile "config" //Util.ExistingFile (System.IO.Path.Combine(metadataDir.Path, configFileName))
|
|
||||||
use csFile = Util.TemporaryFile "cs"
|
|
||||||
|
|
||||||
let svcUtilArgs =
|
|
||||||
let args = sprintf "/nologo /out:\"%s\" /config:\"%s\" /language:CSharp /serializer:Auto /fault" csFile.Path configFile.Path
|
|
||||||
let args = if System.IO.Directory.EnumerateFiles(metadataDir.Path, "*.wsdl") |> Seq.isEmpty then args else sprintf "%s \"%s\"" args (Path.Combine(metadataDir.Path,"*.wsdl"))
|
|
||||||
let args = if System.IO.Directory.EnumerateFiles(metadataDir.Path, "*.xsd") |> Seq.isEmpty then args else sprintf "%s \"%s\"" args (Path.Combine(metadataDir.Path,"*.xsd"))
|
|
||||||
let args = if messageContract then sprintf "%s /messageContract" args else args
|
|
||||||
let args = if enableDataBinding then sprintf "%s /enableDataBinding" args else args
|
|
||||||
let args = if serializable then sprintf "%s /serializable" args else args
|
|
||||||
let args = if async then sprintf "%s /async" args else args
|
|
||||||
let args = if not (String.IsNullOrWhiteSpace collectionType) then sprintf "%s /collectionType:%s" args collectionType else args
|
|
||||||
args
|
|
||||||
|
|
||||||
Util.shell(Path.GetTempPath(), Util.svcUtilExe(), svcUtilArgs, Some formatErr)
|
|
||||||
|
|
||||||
let assemblyFile = Util.TemporaryFile "dll" // TODO: load in-memory and clean up this file
|
|
||||||
|
|
||||||
let cscCommand = sprintf "/nologo /target:library /resource:\"%s\",%s.config,public /out:\"%s\" \"%s\"" configFile.Path namespaceName assemblyFile.Path csFile.Path
|
|
||||||
Util.shell(Path.GetTempPath(), Util.cscExe(), cscCommand, None)
|
|
||||||
|
|
||||||
let endPointNames =
|
|
||||||
try
|
|
||||||
let config = ConfigurationManager.OpenMappedExeConfiguration(ExeConfigurationFileMap(ExeConfigFilename = configFile.Path), ConfigurationUserLevel.None);
|
|
||||||
[ for ep in ((config.GetSectionGroup "system.serviceModel").Sections.["client"] :?> System.ServiceModel.Configuration.ClientSection).Endpoints do
|
|
||||||
yield ep.Name ]
|
|
||||||
with _ ->
|
|
||||||
[]
|
|
||||||
|
|
||||||
assemblyFile, endPointNames
|
|
||||||
|
|
||||||
module internal Edmx =
|
|
||||||
type private EdmxNamespaceGroup = { Edmx : XNamespace; Edm : XNamespace; Ssdl :XNamespace; Msl : XNamespace; RequireDotNet45 : bool }
|
|
||||||
let private makeGroup (edmx : string, edm : string, ssdl : string, msl : string, requireDotNet45)=
|
|
||||||
{ Edmx = XNamespace.Get edmx
|
|
||||||
Edm = XNamespace.Get edm
|
|
||||||
Ssdl = XNamespace.Get ssdl
|
|
||||||
Msl = XNamespace.Get msl
|
|
||||||
RequireDotNet45 = requireDotNet45 }
|
|
||||||
|
|
||||||
let private ns45 =
|
|
||||||
makeGroup
|
|
||||||
(
|
|
||||||
"http://schemas.microsoft.com/ado/2009/11/edmx",
|
|
||||||
"http://schemas.microsoft.com/ado/2009/11/edm",
|
|
||||||
"http://schemas.microsoft.com/ado/2009/11/edm/ssdl",
|
|
||||||
"http://schemas.microsoft.com/ado/2009/11/mapping/cs",
|
|
||||||
true
|
|
||||||
)
|
|
||||||
|
|
||||||
let private ns40 =
|
|
||||||
makeGroup
|
|
||||||
(
|
|
||||||
"http://schemas.microsoft.com/ado/2008/10/edmx",
|
|
||||||
"http://schemas.microsoft.com/ado/2008/09/edm",
|
|
||||||
"http://schemas.microsoft.com/ado/2009/02/edm/ssdl",
|
|
||||||
"http://schemas.microsoft.com/ado/2008/09/mapping/cs",
|
|
||||||
false
|
|
||||||
)
|
|
||||||
|
|
||||||
let private ns20 =
|
|
||||||
makeGroup
|
|
||||||
(
|
|
||||||
"http://schemas.microsoft.com/ado/2007/06/edmx",
|
|
||||||
"http://schemas.microsoft.com/ado/2006/04/edm",
|
|
||||||
"http://schemas.microsoft.com/ado/2006/04/edm/ssdl",
|
|
||||||
"urn:schemas-microsoft-com:windows:storage:mapping:CS",
|
|
||||||
false
|
|
||||||
)
|
|
||||||
|
|
||||||
let loadEdmxFile path =
|
|
||||||
let getElement (c : XContainer) (name : string) (ns : XNamespace) =
|
|
||||||
match c.Element (ns + name) with
|
|
||||||
| null -> failwith (FSData.SR.fileDoesNotContainXMLElement(path, name))
|
|
||||||
| el -> el
|
|
||||||
|
|
||||||
let xdoc =
|
|
||||||
match XDocument.Load path with
|
|
||||||
| null -> failwith (FSData.SR.failedToLoadFileAsXML(path))
|
|
||||||
| xdoc -> xdoc
|
|
||||||
let extractEdmxComponents (nsGroup : EdmxNamespaceGroup) =
|
|
||||||
let edmxNode = getElement xdoc "Edmx" nsGroup.Edmx
|
|
||||||
let runtimeNode = getElement edmxNode "Runtime" nsGroup.Edmx
|
|
||||||
let csdlNode =
|
|
||||||
let conceptualModelNode = getElement runtimeNode "ConceptualModels" nsGroup.Edmx
|
|
||||||
getElement conceptualModelNode "Schema" nsGroup.Edm
|
|
||||||
let ssdlNode =
|
|
||||||
let storageModelNode = getElement runtimeNode "StorageModels" nsGroup.Edmx
|
|
||||||
getElement storageModelNode "Schema" nsGroup.Ssdl
|
|
||||||
let mslNode =
|
|
||||||
let mappingsNode = getElement runtimeNode "Mappings" nsGroup.Edmx
|
|
||||||
getElement mappingsNode "Mapping" nsGroup.Msl
|
|
||||||
(csdlNode.ToString()), (ssdlNode.ToString()), (mslNode.ToString()), nsGroup.RequireDotNet45
|
|
||||||
|
|
||||||
// tries to process given edmx using supplied set of namespace groups
|
|
||||||
let rec load = function
|
|
||||||
| [] -> assert false; failwith "impossible"
|
|
||||||
| x::xs ->
|
|
||||||
try extractEdmxComponents x
|
|
||||||
with e ->
|
|
||||||
match xs with
|
|
||||||
| [] -> reraise() // we were not able to load file - raise exception
|
|
||||||
| _ -> load xs
|
|
||||||
load [ns45; ns40; ns20]
|
|
||||||
|
|
||||||
let buildTypeFromEdmxFile (edmxFile, isTargetingDotNet45) =
|
|
||||||
|
|
||||||
use csDir = Util.TemporaryDirectory()
|
|
||||||
let baseContainerName = Path.GetFileNameWithoutExtension edmxFile
|
|
||||||
let csFile = Path.Combine(csDir.Path, baseContainerName + ".cs")
|
|
||||||
|
|
||||||
let csdlFileName = baseContainerName + ".csdl"
|
|
||||||
let mslFileName = baseContainerName + ".msl"
|
|
||||||
let ssdlFileName = baseContainerName + ".ssdl"
|
|
||||||
|
|
||||||
let csdlFile = Path.Combine(csDir.Path, csdlFileName)
|
|
||||||
let mslFile = Path.Combine(csDir.Path, mslFileName)
|
|
||||||
let ssdlFile = Path.Combine(csDir.Path, ssdlFileName)
|
|
||||||
let csdlContent, ssdlContent, mslContent, requireDotNet45 = loadEdmxFile edmxFile
|
|
||||||
|
|
||||||
if requireDotNet45 && not isTargetingDotNet45 then
|
|
||||||
failwith (FSData.SR.edmxFileRequiresDotNet45(edmxFile))
|
|
||||||
|
|
||||||
File.WriteAllText(csdlFile, csdlContent)
|
|
||||||
File.WriteAllText(mslFile, mslContent)
|
|
||||||
File.WriteAllText(ssdlFile, ssdlContent)
|
|
||||||
|
|
||||||
let edmGenArgs =
|
|
||||||
let args = sprintf "/mode:EntityClassGeneration /incsdl:\"%s\" /outobjectlayer:\"%s\" /nologo" csdlFile csFile
|
|
||||||
let args = if isTargetingDotNet45 then sprintf "%s /targetversion:4.5" args else args
|
|
||||||
args
|
|
||||||
|
|
||||||
Util.shell(csDir.Path, Util.edmGenExe(), edmGenArgs, Some formatErr)
|
|
||||||
let assemblyFile = Util.TemporaryFile "dll" // TODO: load in-memory and clean up this file
|
|
||||||
|
|
||||||
let cscCommand = sprintf "/nologo /resource:\"%s\",\"%s\" /resource:\"%s\",\"%s\" /resource:\"%s\",\"%s\" /target:library /r:System.Data.Entity.dll /out:\"%s\" \"%s\"" csdlFile csdlFileName mslFile mslFileName ssdlFile ssdlFileName assemblyFile.Path csFile
|
|
||||||
|
|
||||||
Util.shell(csDir.Path, Util.cscExe(), cscCommand, None)
|
|
||||||
assemblyFile
|
|
||||||
|
|
||||||
module internal SqlEntityConnection =
|
|
||||||
|
|
||||||
let getSsdl (namespaceName, ssdlFile: Util.FileResource, provider, connString, flagPluralize, flagSuppressForeignKeyProperties, isTargetingDotNet45) =
|
|
||||||
let edmGenArgs =
|
|
||||||
let args = sprintf "/namespace:\"%s\" /project:\"%s\" /outssdl:\"%s\" /mode:FullGeneration /connectionstring:\"%s\" " namespaceName (Path.GetFileNameWithoutExtension ssdlFile.Path) ssdlFile.Path connString
|
|
||||||
let args = if not (String.IsNullOrWhiteSpace provider) then sprintf "%s /provider:%s" args provider else args
|
|
||||||
let args = if flagPluralize then sprintf "%s /pluralize" args else args
|
|
||||||
let args = if flagSuppressForeignKeyProperties then sprintf "%s /SuppressForeignKeyProperties" args else args
|
|
||||||
let args = if isTargetingDotNet45 then sprintf "%s /targetversion:4.5" args else args
|
|
||||||
args
|
|
||||||
Util.shell(System.IO.Path.GetDirectoryName ssdlFile.Path, Util.edmGenExe(), edmGenArgs, Some formatErr)
|
|
||||||
File.ReadAllText ssdlFile.Path
|
|
||||||
|
|
||||||
|
|
||||||
let computeEntityContainerName (entityContainer:string) =
|
|
||||||
if String.IsNullOrWhiteSpace entityContainer then
|
|
||||||
"EntityContainer"
|
|
||||||
else
|
|
||||||
entityContainer
|
|
||||||
|
|
||||||
let buildType (namespaceName, connectionString, connectionStringName, configFileName, absoluteDataDirectory, localSchemaFile:string, provider:string, entityContainer:string, forceUpdate:bool, flagPluralize, flagSuppressForeignKeyProperties, designTimeDirectory, isTargetingDotNet45) =
|
|
||||||
let connectionString, usingConfigFileInfo = ConfigFiles.computeStaticConnectionString ("SqlEntityConnection", false, connectionString, connectionStringName, configFileName, absoluteDataDirectory, designTimeDirectory)
|
|
||||||
let entityContainer = computeEntityContainerName entityContainer
|
|
||||||
use ssdlFile =
|
|
||||||
tryUseLocalSchemaFile
|
|
||||||
(localSchemaFile, forceUpdate, "ssdl")
|
|
||||||
(fun ssdlFile ->
|
|
||||||
try
|
|
||||||
getSsdl (namespaceName, ssdlFile, provider, connectionString, flagPluralize, flagSuppressForeignKeyProperties, isTargetingDotNet45)
|
|
||||||
with
|
|
||||||
e -> handleReadingSchemaError e)
|
|
||||||
|
|
||||||
use csFile = Util.TemporaryFile "cs"
|
|
||||||
use csdlFile = Util.TemporaryFile "csdl"
|
|
||||||
use mslFile = Util.TemporaryFile "msl"
|
|
||||||
use viewsFile = Util.TemporaryFile "Views.cs"
|
|
||||||
|
|
||||||
let edmGenArgs =
|
|
||||||
let args = sprintf "/mode:FromSsdlGeneration /entitycontainer:\"%s\" /namespace:\"%s\" /project:\"%s\" /inssdl:\"%s\" /outobjectlayer:\"%s\" /outcsdl:\"%s\" /outmsl:\"%s\" /outviews:\"%s\" /language:CSharp" entityContainer namespaceName (Path.GetFileNameWithoutExtension ssdlFile.Path) ssdlFile.Path csFile.Path csdlFile.Path mslFile.Path viewsFile.Path
|
|
||||||
let args = if not (String.IsNullOrWhiteSpace provider) then sprintf "%s /provider:%s" args provider else args
|
|
||||||
let args = if flagPluralize then sprintf "%s /pluralize" args else args
|
|
||||||
let args = if flagSuppressForeignKeyProperties then sprintf "%s /SuppressForeignKeyProperties" args else args
|
|
||||||
let args = if isTargetingDotNet45 then sprintf "%s /targetversion:4.5" args else args
|
|
||||||
args
|
|
||||||
Util.shell(System.IO.Path.GetDirectoryName ssdlFile.Path, Util.edmGenExe(), edmGenArgs, Some formatErr)
|
|
||||||
|
|
||||||
let assemblyFile = Util.TemporaryFile "dll"
|
|
||||||
|
|
||||||
let csdlFileName = namespaceName + ".csdl"
|
|
||||||
let mslFileName = namespaceName + ".msl"
|
|
||||||
let ssdlFileName = namespaceName + ".ssdl"
|
|
||||||
|
|
||||||
let cscCommand = sprintf "/r:System.Data.Entity.dll /nologo /resource:\"%s\",\"%s\" /resource:\"%s\",\"%s\" /resource:\"%s\",\"%s\" /nologo /target:library /out:\"%s\" \"%s\"" csdlFile.Path csdlFileName mslFile.Path mslFileName ssdlFile.Path ssdlFileName assemblyFile.Path csFile.Path
|
|
||||||
Util.shell(Path.GetTempPath(), Util.cscExe(), cscCommand, None)
|
|
||||||
|
|
||||||
assemblyFile, usingConfigFileInfo
|
|
||||||
|
|
||||||
|
|
|
@ -1,223 +0,0 @@
|
||||||
// Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
|
||||||
|
|
||||||
namespace Microsoft.FSharp.Data.TypeProviders.Utility
|
|
||||||
|
|
||||||
module internal Util =
|
|
||||||
open System
|
|
||||||
open System.IO
|
|
||||||
open System.Collections.Generic
|
|
||||||
open System.Reflection
|
|
||||||
|
|
||||||
type ProcessResult = { exitCode : int; stdout : string[] ; stderr : string[] }
|
|
||||||
|
|
||||||
let executeProcess (workingDirectory,exe,cmdline) =
|
|
||||||
try
|
|
||||||
// External tools (like edmgen.exe) run as part of default OS locale/codepage/LCID. We need to ensure we translate their output
|
|
||||||
// accordingly, by setting up the correct encoding on the stdout/stderr streams.
|
|
||||||
let encodingToTranslateToolOutput = System.Text.Encoding.Default
|
|
||||||
|
|
||||||
let psi = new System.Diagnostics.ProcessStartInfo(exe,cmdline)
|
|
||||||
psi.WorkingDirectory <- workingDirectory
|
|
||||||
psi.UseShellExecute <- false
|
|
||||||
psi.RedirectStandardOutput <- true
|
|
||||||
psi.RedirectStandardError <- true
|
|
||||||
psi.CreateNoWindow <- true
|
|
||||||
psi.StandardOutputEncoding <- encodingToTranslateToolOutput
|
|
||||||
psi.StandardErrorEncoding <- encodingToTranslateToolOutput
|
|
||||||
let p = System.Diagnostics.Process.Start(psi)
|
|
||||||
let output = ResizeArray()
|
|
||||||
let error = ResizeArray()
|
|
||||||
|
|
||||||
// nulls are skipped because they act as signal that redirected stream is closed and not as part of output data
|
|
||||||
p.OutputDataReceived.Add(fun args -> if args.Data <> null then output.Add(args.Data))
|
|
||||||
p.ErrorDataReceived.Add(fun args -> if args.Data <> null then error.Add(args.Data))
|
|
||||||
p.BeginErrorReadLine()
|
|
||||||
p.BeginOutputReadLine()
|
|
||||||
p.WaitForExit()
|
|
||||||
{ exitCode = p.ExitCode; stdout = output.ToArray(); stderr = error.ToArray() }
|
|
||||||
with
|
|
||||||
| :? System.IO.FileNotFoundException
|
|
||||||
| :? System.ComponentModel.Win32Exception -> failwith (FSData.SR.requiredToolNotFound(exe))
|
|
||||||
| _ -> reraise()
|
|
||||||
|
|
||||||
let shell (workingDirectory,exe,cmdline,formatError) =
|
|
||||||
// printfn "execute: %s %s" exe cmdline
|
|
||||||
let result = executeProcess(workingDirectory,exe,cmdline)
|
|
||||||
if result.exitCode > 0 then
|
|
||||||
//failwithf "The command\n%s %s\n failed.\n\nError:%s\n\nOutput: %s\n" exe cmdline result.stderr result.stdout
|
|
||||||
match formatError with
|
|
||||||
| None ->
|
|
||||||
let merge lines = String.concat Environment.NewLine lines
|
|
||||||
failwith ((merge result.stderr) + Environment.NewLine + (merge result.stdout))
|
|
||||||
| Some f -> f result.stdout result.stderr
|
|
||||||
else
|
|
||||||
// printfn "<--command-->\n%s %s\n<-- success --><-- stdout -->\n%s<-- stderr -->\n%s\n" exe cmdline result.stdout result.stderr
|
|
||||||
()
|
|
||||||
|
|
||||||
let cscExe () =
|
|
||||||
let toolPath =
|
|
||||||
//if System.Runtime.InteropServices.RuntimeEnvironment.GetSystemVersion().StartsWith("v4.0") then
|
|
||||||
System.Runtime.InteropServices.RuntimeEnvironment.GetRuntimeDirectory()
|
|
||||||
//else
|
|
||||||
// Path.Combine(System.Runtime.InteropServices.RuntimeEnvironment.GetRuntimeDirectory(), @"..\v3.5")
|
|
||||||
Path.Combine(toolPath, "csc.exe")
|
|
||||||
|
|
||||||
|
|
||||||
let dataSvcUtilExe () =
|
|
||||||
let toolPath =
|
|
||||||
//if System.Runtime.InteropServices.RuntimeEnvironment.GetSystemVersion().StartsWith("v4.0") then
|
|
||||||
System.Runtime.InteropServices.RuntimeEnvironment.GetRuntimeDirectory()
|
|
||||||
//else
|
|
||||||
// Path.Combine(System.Runtime.InteropServices.RuntimeEnvironment.GetRuntimeDirectory(), @"..\v4.0.30319")
|
|
||||||
Path.Combine(toolPath, "DataSvcUtil.exe")
|
|
||||||
|
|
||||||
|
|
||||||
let edmGenExe () =
|
|
||||||
let toolPath = System.Runtime.InteropServices.RuntimeEnvironment.GetRuntimeDirectory()
|
|
||||||
Path.Combine(toolPath, "edmgen.exe")
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
let sdkPath () =
|
|
||||||
|
|
||||||
let tryResult (key: Microsoft.Win32.RegistryKey) =
|
|
||||||
match key with
|
|
||||||
| null -> None
|
|
||||||
| _ ->
|
|
||||||
let installFolder = key.GetValue("InstallationFolder") :?> string
|
|
||||||
if Directory.Exists installFolder then
|
|
||||||
Some installFolder
|
|
||||||
else
|
|
||||||
None
|
|
||||||
// Annoyingly, the F# 2.0 decoding of 'use key = ...' on a registry key doesn't use an null check on the
|
|
||||||
// key before calling Dispose. THis is because the key type doesn't use the IDisposable pattern.
|
|
||||||
let useKey keyName f =
|
|
||||||
// Look for WinSDK reg keys under the 32bit view of the registry.
|
|
||||||
let reg32view = Microsoft.Win32.RegistryKey.OpenBaseKey(Microsoft.Win32.RegistryHive.LocalMachine, Microsoft.Win32.RegistryView.Registry32)
|
|
||||||
let key = reg32view.OpenSubKey keyName
|
|
||||||
try f key
|
|
||||||
finally
|
|
||||||
match key with
|
|
||||||
| null -> ()
|
|
||||||
| _ -> key.Dispose()
|
|
||||||
reg32view.Dispose() // if reg32view were really null, we would not be here and the user would have more serious issues not being able to access HKLM
|
|
||||||
|
|
||||||
let SDK_REGPATHS = [ @"Software\Microsoft\Microsoft SDKs\NETFXSDK\4.6\WinSDK-NetFx40Tools"
|
|
||||||
@"Software\Microsoft\Microsoft SDKs\Windows\v8.1A\WinSDK-NetFx40Tools"
|
|
||||||
@"Software\Microsoft\Microsoft SDKs\Windows\v8.0A\WinSDK-NetFx40Tools"
|
|
||||||
@"Software\Microsoft\Microsoft SDKs\Windows\v7.1\WinSDK-NetFx40Tools"
|
|
||||||
@"Software\Microsoft\Microsoft SDKs\Windows\v7.0A\WinSDK-NetFx40Tools" ]
|
|
||||||
|
|
||||||
SDK_REGPATHS
|
|
||||||
|> Seq.tryPick (fun p -> useKey p tryResult)
|
|
||||||
|> function
|
|
||||||
| Some p -> p
|
|
||||||
| _ -> raise <| System.NotSupportedException(FSData.SR.unsupportedFramework())
|
|
||||||
|
|
||||||
let sdkUtil name = Path.Combine(sdkPath(), name)
|
|
||||||
|
|
||||||
let svcUtilExe () = sdkUtil "svcutil.exe"
|
|
||||||
let xsdExe () = sdkUtil "xsd.exe"
|
|
||||||
|
|
||||||
type FileResource =
|
|
||||||
abstract member Path : string
|
|
||||||
inherit IDisposable
|
|
||||||
|
|
||||||
let ExistingFile(fileName : string) =
|
|
||||||
{ new FileResource with
|
|
||||||
member this.Path = fileName
|
|
||||||
interface IDisposable with
|
|
||||||
member this.Dispose() = () }
|
|
||||||
|
|
||||||
let TemporaryFile(extension : string) =
|
|
||||||
let filename =
|
|
||||||
let fs = Path.GetTempFileName()
|
|
||||||
let fs' = Path.ChangeExtension(fs, extension)
|
|
||||||
if fs <> fs' then
|
|
||||||
File.Delete fs
|
|
||||||
fs'
|
|
||||||
|
|
||||||
{ new FileResource with
|
|
||||||
member this.Path = filename
|
|
||||||
interface IDisposable with
|
|
||||||
member this.Dispose() = File.Delete(filename) }
|
|
||||||
|
|
||||||
type DirectoryResource =
|
|
||||||
abstract member Path : string
|
|
||||||
inherit IDisposable
|
|
||||||
|
|
||||||
let TemporaryDirectory() =
|
|
||||||
let dirName =
|
|
||||||
let fs = Path.GetTempFileName()
|
|
||||||
File.Delete fs
|
|
||||||
Directory.CreateDirectory fs |> ignore
|
|
||||||
fs
|
|
||||||
|
|
||||||
{ new DirectoryResource with
|
|
||||||
member this.Path = dirName
|
|
||||||
interface IDisposable with
|
|
||||||
member this.Dispose() =
|
|
||||||
for f in Directory.EnumerateFiles dirName do File.Delete f
|
|
||||||
Directory.Delete dirName }
|
|
||||||
|
|
||||||
let ExistingDirectory(dirName : string) =
|
|
||||||
{ new DirectoryResource with
|
|
||||||
member this.Path = dirName
|
|
||||||
interface IDisposable with
|
|
||||||
member this.Dispose() = () }
|
|
||||||
|
|
||||||
type MemoizationTable<'T,'U when 'T : equality>(f) =
|
|
||||||
let createdDB = new Dictionary<'T,'U>()
|
|
||||||
member x.Contents = (createdDB :> IDictionary<_,_>)
|
|
||||||
member x.Apply typeName =
|
|
||||||
let found,result = createdDB.TryGetValue typeName
|
|
||||||
if found then
|
|
||||||
result
|
|
||||||
else
|
|
||||||
let ty = f typeName
|
|
||||||
createdDB.[typeName] <- ty
|
|
||||||
ty
|
|
||||||
|
|
||||||
open System.Threading
|
|
||||||
|
|
||||||
let WithExclusiveAccessToFile (fileName : string) f =
|
|
||||||
// file name is not specified - run function directly
|
|
||||||
if String.IsNullOrWhiteSpace fileName then f()
|
|
||||||
else
|
|
||||||
// convert filename to the uniform representation: full path + no backslashes + upper case
|
|
||||||
|
|
||||||
// MSDN: In Silverlight for Windows Phone, private object namespaces are not supported.
|
|
||||||
// In the .NET Framework, object namespaces are supported and because of this the backslash (\) is considered a delimiter and is not supported in the name parameter.
|
|
||||||
// In Silverlight for Windows Phone you can use a backslash (\) in the name parameter.
|
|
||||||
let fileName = Path.GetFullPath(fileName)
|
|
||||||
let fileName = fileName.Replace('\\', '_')
|
|
||||||
let fileName = fileName.ToUpper()
|
|
||||||
|
|
||||||
// MSDN: On a server that is running Terminal Services, a named system mutex can have two levels of visibility.
|
|
||||||
// If its name begins with the prefix "Global\", the mutex is visible in all terminal server sessions.
|
|
||||||
// Since we use mutex to protect access to file - use Global prefix to cover all terminal sessions
|
|
||||||
let fileName = @"Global\" + fileName
|
|
||||||
use mutex =
|
|
||||||
let mutable createdNew = false
|
|
||||||
let mutex = new Mutex(initiallyOwned = true, name = fileName, createdNew = &createdNew)
|
|
||||||
// createdNew = true - we created and immediately acquired mutex - can continue
|
|
||||||
// createdNew = false - mutex already exists and we do not own it - must wait until it is released
|
|
||||||
if createdNew then mutex
|
|
||||||
else
|
|
||||||
try
|
|
||||||
mutex.WaitOne() |> ignore
|
|
||||||
mutex
|
|
||||||
with
|
|
||||||
| :? AbandonedMutexException ->
|
|
||||||
// if thread that owns mutex was terminated abnormally - then WaitOne will raise AbandonedMutexException
|
|
||||||
// MSDN: The next thread to request ownership of the mutex can handle this exception and proceed,
|
|
||||||
// provided that the integrity of the data structures can be verified.
|
|
||||||
// Current thread still owns mutex so we can return it
|
|
||||||
mutex
|
|
||||||
| _ ->
|
|
||||||
mutex.Dispose()
|
|
||||||
reraise()
|
|
||||||
try f()
|
|
||||||
finally mutex.ReleaseMutex()
|
|
||||||
|
|
|
@ -1,41 +0,0 @@
|
||||||
// Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
|
||||||
|
|
||||||
namespace Microsoft.FSharp.Data.TypeProviders.Utility
|
|
||||||
module internal Util =
|
|
||||||
open System
|
|
||||||
open System.Reflection
|
|
||||||
open System.Collections.Generic
|
|
||||||
|
|
||||||
type ProcessResult = { exitCode : int; stdout : string[]; stderr : string[] }
|
|
||||||
val executeProcess : workingDirectory: string * exe:string * cmdline:string -> ProcessResult
|
|
||||||
/// Throws on failure
|
|
||||||
val shell : workingDirectory: string * exe:string * cmdline:string * formatError:(string[] -> string[] -> unit) option -> unit
|
|
||||||
|
|
||||||
val cscExe : unit -> string
|
|
||||||
val dataSvcUtilExe : unit -> string
|
|
||||||
val edmGenExe : unit -> string
|
|
||||||
val svcUtilExe : unit -> string
|
|
||||||
|
|
||||||
val sdkUtil : string -> string
|
|
||||||
|
|
||||||
type FileResource =
|
|
||||||
abstract member Path : string
|
|
||||||
inherit IDisposable
|
|
||||||
|
|
||||||
val TemporaryFile : extension:string -> FileResource
|
|
||||||
val ExistingFile : fileName:string -> FileResource
|
|
||||||
|
|
||||||
type DirectoryResource =
|
|
||||||
abstract member Path : string
|
|
||||||
inherit IDisposable
|
|
||||||
|
|
||||||
val TemporaryDirectory : unit -> DirectoryResource
|
|
||||||
val ExistingDirectory : dirName:string -> DirectoryResource
|
|
||||||
|
|
||||||
type MemoizationTable<'T,'U when 'T : equality> =
|
|
||||||
new : ('T -> 'U) -> MemoizationTable<'T,'U>
|
|
||||||
member Apply : 'T -> 'U
|
|
||||||
member Contents : IDictionary<'T, 'U>
|
|
||||||
|
|
||||||
val WithExclusiveAccessToFile : string -> (unit -> 'T)-> 'T
|
|
||||||
|
|
|
@ -551,8 +551,7 @@
|
||||||
<Import Project="$(FSharpSourcesRoot)\FSharpSource.targets" />
|
<Import Project="$(FSharpSourcesRoot)\FSharpSource.targets" />
|
||||||
<Import Project="$(FSharpSourcesRoot)\..\lkg\FSharp-$(LkgVersion)\bin\FSharp.PowerPack.targets" />
|
<Import Project="$(FSharpSourcesRoot)\..\lkg\FSharp-$(LkgVersion)\bin\FSharp.PowerPack.targets" />
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<OtherFlags>$(OtherFlags) /warnon:1182 --sig:$(IntermediateOutputPath)\$(AssemblyName).sig</OtherFlags>
|
<OtherFlags>$(OtherFlags) /warnon:1182</OtherFlags>
|
||||||
<PrepareForRunDependsOn>$(PrepareForRunDependsOn);CopyToBuiltBin</PrepareForRunDependsOn>
|
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<Target Name="CopyToBuiltBin">
|
<Target Name="CopyToBuiltBin">
|
||||||
<Copy SourceFiles="$(IntermediateOutputPath)\FSharp.LanguageService.Compiler.sigdata" DestinationFolder="$(OutputPath)" SkipUnchangedFiles="true">
|
<Copy SourceFiles="$(IntermediateOutputPath)\FSharp.LanguageService.Compiler.sigdata" DestinationFolder="$(OutputPath)" SkipUnchangedFiles="true">
|
||||||
|
|
|
@ -4,8 +4,6 @@ namespace Microsoft.FSharp
|
||||||
open System.Reflection
|
open System.Reflection
|
||||||
[<assembly:System.Runtime.CompilerServices.InternalsVisibleTo("Fsc, PublicKey=002400000480000094000000060200000024000052534131000400000100010007D1FA57C4AED9F0A32E84AA0FAEFD0DE9E8FD6AEC8F87FB03766C834C99921EB23BE79AD9D5DCC1DD9AD236132102900B723CF980957FC4E177108FC607774F29E8320E92EA05ECE4E821C0A5EFE8F1645C4C0C93C1AB99285D622CAA652C1DFAD63D745D6F2DE5F17E5EAF0FC4963D261C8A12436518206DC093344D5AD293")>]
|
[<assembly:System.Runtime.CompilerServices.InternalsVisibleTo("Fsc, PublicKey=002400000480000094000000060200000024000052534131000400000100010007D1FA57C4AED9F0A32E84AA0FAEFD0DE9E8FD6AEC8F87FB03766C834C99921EB23BE79AD9D5DCC1DD9AD236132102900B723CF980957FC4E177108FC607774F29E8320E92EA05ECE4E821C0A5EFE8F1645C4C0C93C1AB99285D622CAA652C1DFAD63D745D6F2DE5F17E5EAF0FC4963D261C8A12436518206DC093344D5AD293")>]
|
||||||
[<assembly:System.Runtime.CompilerServices.InternalsVisibleTo("FSharp.Build, PublicKey=002400000480000094000000060200000024000052534131000400000100010007D1FA57C4AED9F0A32E84AA0FAEFD0DE9E8FD6AEC8F87FB03766C834C99921EB23BE79AD9D5DCC1DD9AD236132102900B723CF980957FC4E177108FC607774F29E8320E92EA05ECE4E821C0A5EFE8F1645C4C0C93C1AB99285D622CAA652C1DFAD63D745D6F2DE5F17E5EAF0FC4963D261C8A12436518206DC093344D5AD293")>]
|
[<assembly:System.Runtime.CompilerServices.InternalsVisibleTo("FSharp.Build, PublicKey=002400000480000094000000060200000024000052534131000400000100010007D1FA57C4AED9F0A32E84AA0FAEFD0DE9E8FD6AEC8F87FB03766C834C99921EB23BE79AD9D5DCC1DD9AD236132102900B723CF980957FC4E177108FC607774F29E8320E92EA05ECE4E821C0A5EFE8F1645C4C0C93C1AB99285D622CAA652C1DFAD63D745D6F2DE5F17E5EAF0FC4963D261C8A12436518206DC093344D5AD293")>]
|
||||||
[<assembly:System.Runtime.CompilerServices.InternalsVisibleTo("FSharp.QuickSearch, PublicKey=002400000480000094000000060200000024000052534131000400000100010007D1FA57C4AED9F0A32E84AA0FAEFD0DE9E8FD6AEC8F87FB03766C834C99921EB23BE79AD9D5DCC1DD9AD236132102900B723CF980957FC4E177108FC607774F29E8320E92EA05ECE4E821C0A5EFE8F1645C4C0C93C1AB99285D622CAA652C1DFAD63D745D6F2DE5F17E5EAF0FC4963D261C8A12436518206DC093344D5AD293")>]
|
|
||||||
[<assembly:System.Runtime.CompilerServices.InternalsVisibleTo("FSharp.Compiler.Model, PublicKey=002400000480000094000000060200000024000052534131000400000100010007D1FA57C4AED9F0A32E84AA0FAEFD0DE9E8FD6AEC8F87FB03766C834C99921EB23BE79AD9D5DCC1DD9AD236132102900B723CF980957FC4E177108FC607774F29E8320E92EA05ECE4E821C0A5EFE8F1645C4C0C93C1AB99285D622CAA652C1DFAD63D745D6F2DE5F17E5EAF0FC4963D261C8A12436518206DC093344D5AD293")>]
|
|
||||||
[<assembly:System.Runtime.CompilerServices.InternalsVisibleTo("Fsi, PublicKey=002400000480000094000000060200000024000052534131000400000100010007D1FA57C4AED9F0A32E84AA0FAEFD0DE9E8FD6AEC8F87FB03766C834C99921EB23BE79AD9D5DCC1DD9AD236132102900B723CF980957FC4E177108FC607774F29E8320E92EA05ECE4E821C0A5EFE8F1645C4C0C93C1AB99285D622CAA652C1DFAD63D745D6F2DE5F17E5EAF0FC4963D261C8A12436518206DC093344D5AD293")>]
|
[<assembly:System.Runtime.CompilerServices.InternalsVisibleTo("Fsi, PublicKey=002400000480000094000000060200000024000052534131000400000100010007D1FA57C4AED9F0A32E84AA0FAEFD0DE9E8FD6AEC8F87FB03766C834C99921EB23BE79AD9D5DCC1DD9AD236132102900B723CF980957FC4E177108FC607774F29E8320E92EA05ECE4E821C0A5EFE8F1645C4C0C93C1AB99285D622CAA652C1DFAD63D745D6F2DE5F17E5EAF0FC4963D261C8A12436518206DC093344D5AD293")>]
|
||||||
[<assembly:System.Runtime.CompilerServices.InternalsVisibleTo("FsiAnyCPU, PublicKey=002400000480000094000000060200000024000052534131000400000100010007D1FA57C4AED9F0A32E84AA0FAEFD0DE9E8FD6AEC8F87FB03766C834C99921EB23BE79AD9D5DCC1DD9AD236132102900B723CF980957FC4E177108FC607774F29E8320E92EA05ECE4E821C0A5EFE8F1645C4C0C93C1AB99285D622CAA652C1DFAD63D745D6F2DE5F17E5EAF0FC4963D261C8A12436518206DC093344D5AD293")>]
|
[<assembly:System.Runtime.CompilerServices.InternalsVisibleTo("FsiAnyCPU, PublicKey=002400000480000094000000060200000024000052534131000400000100010007D1FA57C4AED9F0A32E84AA0FAEFD0DE9E8FD6AEC8F87FB03766C834C99921EB23BE79AD9D5DCC1DD9AD236132102900B723CF980957FC4E177108FC607774F29E8320E92EA05ECE4E821C0A5EFE8F1645C4C0C93C1AB99285D622CAA652C1DFAD63D745D6F2DE5F17E5EAF0FC4963D261C8A12436518206DC093344D5AD293")>]
|
||||||
[<assembly:System.Runtime.CompilerServices.InternalsVisibleTo("FSharp.LanguageService, PublicKey=002400000480000094000000060200000024000052534131000400000100010007D1FA57C4AED9F0A32E84AA0FAEFD0DE9E8FD6AEC8F87FB03766C834C99921EB23BE79AD9D5DCC1DD9AD236132102900B723CF980957FC4E177108FC607774F29E8320E92EA05ECE4E821C0A5EFE8F1645C4C0C93C1AB99285D622CAA652C1DFAD63D745D6F2DE5F17E5EAF0FC4963D261C8A12436518206DC093344D5AD293")>]
|
[<assembly:System.Runtime.CompilerServices.InternalsVisibleTo("FSharp.LanguageService, PublicKey=002400000480000094000000060200000024000052534131000400000100010007D1FA57C4AED9F0A32E84AA0FAEFD0DE9E8FD6AEC8F87FB03766C834C99921EB23BE79AD9D5DCC1DD9AD236132102900B723CF980957FC4E177108FC607774F29E8320E92EA05ECE4E821C0A5EFE8F1645C4C0C93C1AB99285D622CAA652C1DFAD63D745D6F2DE5F17E5EAF0FC4963D261C8A12436518206DC093344D5AD293")>]
|
||||||
|
@ -18,5 +16,6 @@ open System.Reflection
|
||||||
[<assembly:System.Runtime.CompilerServices.InternalsVisibleTo("VisualFSharp.Salsa, PublicKey=002400000480000094000000060200000024000052534131000400000100010007D1FA57C4AED9F0A32E84AA0FAEFD0DE9E8FD6AEC8F87FB03766C834C99921EB23BE79AD9D5DCC1DD9AD236132102900B723CF980957FC4E177108FC607774F29E8320E92EA05ECE4E821C0A5EFE8F1645C4C0C93C1AB99285D622CAA652C1DFAD63D745D6F2DE5F17E5EAF0FC4963D261C8A12436518206DC093344D5AD293")>]
|
[<assembly:System.Runtime.CompilerServices.InternalsVisibleTo("VisualFSharp.Salsa, PublicKey=002400000480000094000000060200000024000052534131000400000100010007D1FA57C4AED9F0A32E84AA0FAEFD0DE9E8FD6AEC8F87FB03766C834C99921EB23BE79AD9D5DCC1DD9AD236132102900B723CF980957FC4E177108FC607774F29E8320E92EA05ECE4E821C0A5EFE8F1645C4C0C93C1AB99285D622CAA652C1DFAD63D745D6F2DE5F17E5EAF0FC4963D261C8A12436518206DC093344D5AD293")>]
|
||||||
[<assembly:System.Runtime.CompilerServices.InternalsVisibleTo("VisualFSharp.Unittests, PublicKey=002400000480000094000000060200000024000052534131000400000100010007D1FA57C4AED9F0A32E84AA0FAEFD0DE9E8FD6AEC8F87FB03766C834C99921EB23BE79AD9D5DCC1DD9AD236132102900B723CF980957FC4E177108FC607774F29E8320E92EA05ECE4E821C0A5EFE8F1645C4C0C93C1AB99285D622CAA652C1DFAD63D745D6F2DE5F17E5EAF0FC4963D261C8A12436518206DC093344D5AD293")>]
|
[<assembly:System.Runtime.CompilerServices.InternalsVisibleTo("VisualFSharp.Unittests, PublicKey=002400000480000094000000060200000024000052534131000400000100010007D1FA57C4AED9F0A32E84AA0FAEFD0DE9E8FD6AEC8F87FB03766C834C99921EB23BE79AD9D5DCC1DD9AD236132102900B723CF980957FC4E177108FC607774F29E8320E92EA05ECE4E821C0A5EFE8F1645C4C0C93C1AB99285D622CAA652C1DFAD63D745D6F2DE5F17E5EAF0FC4963D261C8A12436518206DC093344D5AD293")>]
|
||||||
|
|
||||||
|
|
||||||
do()
|
do()
|
||||||
|
|
||||||
|
|
|
@ -12,6 +12,6 @@
|
||||||
"ubuntu.14.04-x64": { }
|
"ubuntu.14.04-x64": { }
|
||||||
},
|
},
|
||||||
"frameworks": {
|
"frameworks": {
|
||||||
"dnxcore50": { }
|
"netstandard1.5": { }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -164,8 +164,8 @@ type Item =
|
||||||
| Event of EventInfo
|
| Event of EventInfo
|
||||||
/// Represents the resolution of a name to a property
|
/// Represents the resolution of a name to a property
|
||||||
| Property of string * PropInfo list
|
| Property of string * PropInfo list
|
||||||
/// Represents the resolution of a name to a group of methods
|
/// Represents the resolution of a name to a group of methods.
|
||||||
| MethodGroup of string * MethInfo list
|
| MethodGroup of displayName: string * methods: MethInfo list * uninstantiatedMethodOpt: MethInfo option
|
||||||
/// Represents the resolution of a name to a constructor
|
/// Represents the resolution of a name to a constructor
|
||||||
| CtorGroup of string * MethInfo list
|
| CtorGroup of string * MethInfo list
|
||||||
/// Represents the resolution of a name to the fake constructor simulated for an interface type.
|
/// Represents the resolution of a name to the fake constructor simulated for an interface type.
|
||||||
|
@ -195,7 +195,7 @@ type Item =
|
||||||
|
|
||||||
static member MakeMethGroup (nm,minfos:MethInfo list) =
|
static member MakeMethGroup (nm,minfos:MethInfo list) =
|
||||||
let minfos = minfos |> List.sortBy (fun minfo -> minfo.NumArgs |> List.sum)
|
let minfos = minfos |> List.sortBy (fun minfo -> minfo.NumArgs |> List.sum)
|
||||||
Item.MethodGroup (nm,minfos)
|
Item.MethodGroup (nm,minfos,None)
|
||||||
|
|
||||||
static member MakeCtorGroup (nm,minfos:MethInfo list) =
|
static member MakeCtorGroup (nm,minfos:MethInfo list) =
|
||||||
let minfos = minfos |> List.sortBy (fun minfo -> minfo.NumArgs |> List.sum)
|
let minfos = minfos |> List.sortBy (fun minfo -> minfo.NumArgs |> List.sum)
|
||||||
|
@ -212,7 +212,7 @@ type Item =
|
||||||
| Item.ILField finfo -> finfo.FieldName
|
| Item.ILField finfo -> finfo.FieldName
|
||||||
| Item.Event einfo -> einfo.EventName
|
| Item.Event einfo -> einfo.EventName
|
||||||
| Item.Property(nm,_) -> nm
|
| Item.Property(nm,_) -> nm
|
||||||
| Item.MethodGroup(nm,_) -> nm
|
| Item.MethodGroup(nm,_,_) -> nm
|
||||||
| Item.CtorGroup(nm,_) -> DemangleGenericTypeName nm
|
| Item.CtorGroup(nm,_) -> DemangleGenericTypeName nm
|
||||||
| Item.FakeInterfaceCtor (AbbrevOrAppTy tcref)
|
| Item.FakeInterfaceCtor (AbbrevOrAppTy tcref)
|
||||||
| Item.DelegateCtor (AbbrevOrAppTy tcref) -> DemangleGenericTypeName tcref.DisplayName
|
| Item.DelegateCtor (AbbrevOrAppTy tcref) -> DemangleGenericTypeName tcref.DisplayName
|
||||||
|
@ -1106,7 +1106,7 @@ type ItemOccurence =
|
||||||
type ITypecheckResultsSink =
|
type ITypecheckResultsSink =
|
||||||
abstract NotifyEnvWithScope : range * NameResolutionEnv * AccessorDomain -> unit
|
abstract NotifyEnvWithScope : range * NameResolutionEnv * AccessorDomain -> unit
|
||||||
abstract NotifyExprHasType : pos * TType * Tastops.DisplayEnv * NameResolutionEnv * AccessorDomain * range -> unit
|
abstract NotifyExprHasType : pos * TType * Tastops.DisplayEnv * NameResolutionEnv * AccessorDomain * range -> unit
|
||||||
abstract NotifyNameResolution : pos * Item * Item * ItemOccurence * Tastops.DisplayEnv * NameResolutionEnv * AccessorDomain * range -> unit
|
abstract NotifyNameResolution : pos * Item * Item * ItemOccurence * Tastops.DisplayEnv * NameResolutionEnv * AccessorDomain * range * bool -> unit
|
||||||
abstract NotifyFormatSpecifierLocation : range -> unit
|
abstract NotifyFormatSpecifierLocation : range -> unit
|
||||||
abstract CurrentSource : string option
|
abstract CurrentSource : string option
|
||||||
|
|
||||||
|
@ -1140,12 +1140,12 @@ let rec (|FSharpPropertyUse|_|) (item : Item) =
|
||||||
|
|
||||||
let (|MethodUse|_|) (item : Item) =
|
let (|MethodUse|_|) (item : Item) =
|
||||||
match item with
|
match item with
|
||||||
| Item.MethodGroup(_, [minfo]) -> Some(minfo)
|
| Item.MethodGroup(_, [minfo],_) -> Some(minfo)
|
||||||
| _ -> None
|
| _ -> None
|
||||||
|
|
||||||
let (|FSharpMethodUse|_|) (item : Item) =
|
let (|FSharpMethodUse|_|) (item : Item) =
|
||||||
match item with
|
match item with
|
||||||
| Item.MethodGroup(_, [ValRefOfMeth vref]) -> Some(vref)
|
| Item.MethodGroup(_, [ValRefOfMeth vref],_) -> Some(vref)
|
||||||
| Item.Value(vref) when vref.IsMember -> Some(vref)
|
| Item.Value(vref) when vref.IsMember -> Some(vref)
|
||||||
| _ -> None
|
| _ -> None
|
||||||
|
|
||||||
|
@ -1346,7 +1346,7 @@ type TcResultsSinkImpl(g, ?source: string) =
|
||||||
if allowedRange m then
|
if allowedRange m then
|
||||||
capturedExprTypings.Add((endPos,ty,denv,nenv,ad,m))
|
capturedExprTypings.Add((endPos,ty,denv,nenv,ad,m))
|
||||||
|
|
||||||
member sink.NotifyNameResolution(endPos,item,itemMethodGroup,occurenceType,denv,nenv,ad,m) =
|
member sink.NotifyNameResolution(endPos,item,itemMethodGroup,occurenceType,denv,nenv,ad,m,replace) =
|
||||||
// Desugaring some F# constructs (notably computation expressions with custom operators)
|
// Desugaring some F# constructs (notably computation expressions with custom operators)
|
||||||
// results in duplication of textual variables. So we ensure we never record two name resolutions
|
// results in duplication of textual variables. So we ensure we never record two name resolutions
|
||||||
// for the same identifier at the same location.
|
// for the same identifier at the same location.
|
||||||
|
@ -1365,6 +1365,10 @@ type TcResultsSinkImpl(g, ?source: string) =
|
||||||
res
|
res
|
||||||
| _ -> false
|
| _ -> false
|
||||||
|
|
||||||
|
if replace then
|
||||||
|
capturedNameResolutions.RemoveAll(fun cnr -> cnr.Range = m) |> ignore
|
||||||
|
capturedMethodGroupResolutions.RemoveAll(fun cnr -> cnr.Range = m) |> ignore
|
||||||
|
|
||||||
if not alreadyDone then
|
if not alreadyDone then
|
||||||
capturedNameResolutions.Add(CapturedNameResolution(endPos,item,occurenceType,denv,nenv,ad,m))
|
capturedNameResolutions.Add(CapturedNameResolution(endPos,item,occurenceType,denv,nenv,ad,m))
|
||||||
capturedMethodGroupResolutions.Add(CapturedNameResolution(endPos,itemMethodGroup,occurenceType,denv,nenv,ad,m))
|
capturedMethodGroupResolutions.Add(CapturedNameResolution(endPos,itemMethodGroup,occurenceType,denv,nenv,ad,m))
|
||||||
|
@ -1405,7 +1409,12 @@ let CallEnvSink (sink:TcResultsSink) (scopem,nenv,ad) =
|
||||||
let CallNameResolutionSink (sink:TcResultsSink) (m:range,nenv,item,itemMethodGroup,occurenceType,denv,ad) =
|
let CallNameResolutionSink (sink:TcResultsSink) (m:range,nenv,item,itemMethodGroup,occurenceType,denv,ad) =
|
||||||
match sink.CurrentSink with
|
match sink.CurrentSink with
|
||||||
| None -> ()
|
| None -> ()
|
||||||
| Some sink -> sink.NotifyNameResolution(m.End,item,itemMethodGroup,occurenceType,denv,nenv,ad,m)
|
| Some sink -> sink.NotifyNameResolution(m.End,item,itemMethodGroup,occurenceType,denv,nenv,ad,m,false)
|
||||||
|
|
||||||
|
let CallNameResolutionSinkReplacing (sink:TcResultsSink) (m:range,nenv,item,itemMethodGroup,occurenceType,denv,ad) =
|
||||||
|
match sink.CurrentSink with
|
||||||
|
| None -> ()
|
||||||
|
| Some sink -> sink.NotifyNameResolution(m.End,item,itemMethodGroup,occurenceType,denv,nenv,ad,m,true)
|
||||||
|
|
||||||
/// Report a specific expression typing at a source range
|
/// Report a specific expression typing at a source range
|
||||||
let CallExprHasTypeSink (sink:TcResultsSink) (m:range,nenv,typ,denv,ad) =
|
let CallExprHasTypeSink (sink:TcResultsSink) (m:range,nenv,typ,denv,ad) =
|
||||||
|
@ -1434,7 +1443,7 @@ let CheckAllTyparsInferrable amap m item =
|
||||||
let free = Zset.diff freeInDeclaringType.FreeTypars freeInArgsAndRetType.FreeTypars
|
let free = Zset.diff freeInDeclaringType.FreeTypars freeInArgsAndRetType.FreeTypars
|
||||||
free.IsEmpty)
|
free.IsEmpty)
|
||||||
|
|
||||||
| Item.MethodGroup(_,minfos) ->
|
| Item.MethodGroup(_,minfos,_) ->
|
||||||
minfos |> List.forall (fun minfo ->
|
minfos |> List.forall (fun minfo ->
|
||||||
minfo.IsExtensionMember ||
|
minfo.IsExtensionMember ||
|
||||||
let fminst = minfo.FormalMethodInst
|
let fminst = minfo.FormalMethodInst
|
||||||
|
@ -2571,15 +2580,15 @@ let ComputeItemRange wholem (lid: Ident list) rest =
|
||||||
|
|
||||||
let FilterMethodGroups (ncenv:NameResolver) itemRange item staticOnly =
|
let FilterMethodGroups (ncenv:NameResolver) itemRange item staticOnly =
|
||||||
match item with
|
match item with
|
||||||
| Item.MethodGroup(nm, minfos) ->
|
| Item.MethodGroup(nm, minfos, orig) ->
|
||||||
let minfos = minfos |> List.filter (fun minfo ->
|
let minfos = minfos |> List.filter (fun minfo ->
|
||||||
staticOnly = (minfo.GetObjArgTypes(ncenv.amap, itemRange, minfo.FormalMethodInst) |> isNil))
|
staticOnly = (minfo.GetObjArgTypes(ncenv.amap, itemRange, minfo.FormalMethodInst) |> isNil))
|
||||||
Item.MethodGroup(nm, minfos)
|
Item.MethodGroup(nm, minfos, orig)
|
||||||
| item -> item
|
| item -> item
|
||||||
|
|
||||||
let NeedsOverloadResolution namedItem =
|
let NeedsOverloadResolution namedItem =
|
||||||
match namedItem with
|
match namedItem with
|
||||||
| Item.MethodGroup(_,_::_::_)
|
| Item.MethodGroup(_,_::_::_,_)
|
||||||
| Item.CtorGroup(_,_::_::_)
|
| Item.CtorGroup(_,_::_::_)
|
||||||
| Item.Property(_,_::_::_) -> true
|
| Item.Property(_,_::_::_) -> true
|
||||||
| _ -> false
|
| _ -> false
|
||||||
|
@ -2632,7 +2641,7 @@ let ResolveLongIdentAsExprAndComputeRange (sink:TcResultsSink) (ncenv:NameResolv
|
||||||
|
|
||||||
let (|NonOverridable|_|) namedItem =
|
let (|NonOverridable|_|) namedItem =
|
||||||
match namedItem with
|
match namedItem with
|
||||||
| Item.MethodGroup(_,minfos) when minfos |> List.exists(fun minfo -> minfo.IsVirtual || minfo.IsAbstract) -> None
|
| Item.MethodGroup(_,minfos,_) when minfos |> List.exists(fun minfo -> minfo.IsVirtual || minfo.IsAbstract) -> None
|
||||||
| Item.Property(_,pinfos) when pinfos |> List.exists(fun pinfo -> pinfo.IsVirtualProperty) -> None
|
| Item.Property(_,pinfos) when pinfos |> List.exists(fun pinfo -> pinfo.IsVirtualProperty) -> None
|
||||||
| _ -> Some ()
|
| _ -> Some ()
|
||||||
|
|
||||||
|
@ -2905,16 +2914,34 @@ let ResolveCompletionsInType (ncenv: NameResolver) nenv (completionTargets: Reso
|
||||||
AllMethInfosOfTypeInScope ncenv.InfoReader nenv (None,ad) PreferOverrides m typ
|
AllMethInfosOfTypeInScope ncenv.InfoReader nenv (None,ad) PreferOverrides m typ
|
||||||
|> List.filter minfoFilter
|
|> List.filter minfoFilter
|
||||||
|
|
||||||
let addersAndRemovers =
|
let minfos =
|
||||||
pinfoItems
|
let addersAndRemovers =
|
||||||
|> List.map (function Item.Event(FSEvent(_,_,addValRef,removeValRef)) -> [addValRef.LogicalName;removeValRef.LogicalName] | _ -> [])
|
pinfoItems
|
||||||
|> List.concat
|
|> List.map (function Item.Event(FSEvent(_,_,addValRef,removeValRef)) -> [addValRef.LogicalName;removeValRef.LogicalName] | _ -> [])
|
||||||
|
|> List.concat
|
||||||
|
|> set
|
||||||
|
|
||||||
match addersAndRemovers with
|
if addersAndRemovers.IsEmpty then minfos
|
||||||
| [] -> minfos
|
else minfos |> List.filter (fun minfo -> not (addersAndRemovers.Contains minfo.LogicalName))
|
||||||
| addersAndRemovers ->
|
|
||||||
let isNotAdderOrRemover (minfo: MethInfo) = not(addersAndRemovers |> List.exists (fun ar -> ar = minfo.LogicalName))
|
#if EXTENSIONTYPING
|
||||||
List.filter isNotAdderOrRemover minfos
|
// Filter out the ones with mangled names from applying static parameters
|
||||||
|
let minfos =
|
||||||
|
let methsWithStaticParams =
|
||||||
|
minfos
|
||||||
|
|> List.filter (fun minfo ->
|
||||||
|
match minfo.ProvidedStaticParameterInfo with
|
||||||
|
| Some (_methBeforeArguments, staticParams) -> staticParams.Length <> 0
|
||||||
|
| _ -> false)
|
||||||
|
|> List.map (fun minfo -> minfo.DisplayName)
|
||||||
|
|
||||||
|
if methsWithStaticParams.IsEmpty then minfos
|
||||||
|
else minfos |> List.filter (fun minfo ->
|
||||||
|
let nm = minfo.LogicalName
|
||||||
|
not (nm.Contains "," && methsWithStaticParams |> List.exists (fun m -> nm.StartsWith(m))))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
minfos
|
||||||
|
|
||||||
else []
|
else []
|
||||||
// Partition methods into overload sets
|
// Partition methods into overload sets
|
||||||
|
|
|
@ -55,7 +55,7 @@ type Item =
|
||||||
| ILField of ILFieldInfo
|
| ILField of ILFieldInfo
|
||||||
| Event of EventInfo
|
| Event of EventInfo
|
||||||
| Property of string * PropInfo list
|
| Property of string * PropInfo list
|
||||||
| MethodGroup of string * MethInfo list
|
| MethodGroup of displayName: string * methods: MethInfo list * uninstantiatedMethodOpt: MethInfo option
|
||||||
| CtorGroup of string * MethInfo list
|
| CtorGroup of string * MethInfo list
|
||||||
| FakeInterfaceCtor of TType
|
| FakeInterfaceCtor of TType
|
||||||
| DelegateCtor of TType
|
| DelegateCtor of TType
|
||||||
|
@ -261,7 +261,7 @@ type ITypecheckResultsSink =
|
||||||
abstract NotifyExprHasType : pos * TType * DisplayEnv * NameResolutionEnv * AccessorDomain * range -> unit
|
abstract NotifyExprHasType : pos * TType * DisplayEnv * NameResolutionEnv * AccessorDomain * range -> unit
|
||||||
|
|
||||||
/// Record that a name resolution occurred at a specific location in the source
|
/// Record that a name resolution occurred at a specific location in the source
|
||||||
abstract NotifyNameResolution : pos * Item * Item * ItemOccurence * DisplayEnv * NameResolutionEnv * AccessorDomain * range -> unit
|
abstract NotifyNameResolution : pos * Item * Item * ItemOccurence * DisplayEnv * NameResolutionEnv * AccessorDomain * range * bool -> unit
|
||||||
|
|
||||||
/// Record that a printf format specifier occurred at a specific location in the source
|
/// Record that a printf format specifier occurred at a specific location in the source
|
||||||
abstract NotifyFormatSpecifierLocation : range -> unit
|
abstract NotifyFormatSpecifierLocation : range -> unit
|
||||||
|
@ -301,6 +301,9 @@ val internal CallEnvSink : TcResultsSink -> range * NameResolutio
|
||||||
/// Report a specific name resolution at a source range
|
/// Report a specific name resolution at a source range
|
||||||
val internal CallNameResolutionSink : TcResultsSink -> range * NameResolutionEnv * Item * Item * ItemOccurence * DisplayEnv * AccessorDomain -> unit
|
val internal CallNameResolutionSink : TcResultsSink -> range * NameResolutionEnv * Item * Item * ItemOccurence * DisplayEnv * AccessorDomain -> unit
|
||||||
|
|
||||||
|
/// Report a specific name resolution at a source range, replacing any previous resolutions
|
||||||
|
val internal CallNameResolutionSinkReplacing : TcResultsSink -> range * NameResolutionEnv * Item * Item * ItemOccurence * DisplayEnv * AccessorDomain -> unit
|
||||||
|
|
||||||
/// Report a specific name resolution at a source range
|
/// Report a specific name resolution at a source range
|
||||||
val internal CallExprHasTypeSink : TcResultsSink -> range * NameResolutionEnv * TType * DisplayEnv * AccessorDomain -> unit
|
val internal CallExprHasTypeSink : TcResultsSink -> range * NameResolutionEnv * TType * DisplayEnv * AccessorDomain -> unit
|
||||||
|
|
||||||
|
|
|
@ -107,6 +107,7 @@ exception OverrideInIntrinsicAugmentation of range
|
||||||
exception OverrideInExtrinsicAugmentation of range
|
exception OverrideInExtrinsicAugmentation of range
|
||||||
exception NonUniqueInferredAbstractSlot of TcGlobals * DisplayEnv * string * MethInfo * MethInfo * range
|
exception NonUniqueInferredAbstractSlot of TcGlobals * DisplayEnv * string * MethInfo * MethInfo * range
|
||||||
exception StandardOperatorRedefinitionWarning of string * range
|
exception StandardOperatorRedefinitionWarning of string * range
|
||||||
|
exception InvalidInternalsVisibleToAssemblyName of (*badName*)string * (*fileName option*) string option
|
||||||
|
|
||||||
|
|
||||||
// Identify any security attributes
|
// Identify any security attributes
|
||||||
|
@ -422,7 +423,16 @@ let OpenModulesOrNamespaces tcSink g amap scopem root env mvvs =
|
||||||
let AddRootModuleOrNamespaceRefs g amap m env modrefs =
|
let AddRootModuleOrNamespaceRefs g amap m env modrefs =
|
||||||
ModifyNameResEnv (fun nenv -> AddModuleOrNamespaceRefsToNameEnv g amap m true env.eAccessRights nenv modrefs) env
|
ModifyNameResEnv (fun nenv -> AddModuleOrNamespaceRefsToNameEnv g amap m true env.eAccessRights nenv modrefs) env
|
||||||
|
|
||||||
let AddNonLocalCcu g amap scopem env (ccu:CcuThunk,internalsVisible) =
|
let AddNonLocalCcu g amap scopem env assemblyName (ccu:CcuThunk, internalsVisibleToAttributes) =
|
||||||
|
|
||||||
|
let internalsVisible =
|
||||||
|
internalsVisibleToAttributes |> List.exists (fun visibleTo ->
|
||||||
|
try
|
||||||
|
System.Reflection.AssemblyName(visibleTo).Name = assemblyName
|
||||||
|
with e ->
|
||||||
|
warning(InvalidInternalsVisibleToAssemblyName(visibleTo,ccu.FileName))
|
||||||
|
false)
|
||||||
|
|
||||||
let env = if internalsVisible then addInternalsAccessibility env ccu else env
|
let env = if internalsVisible then addInternalsAccessibility env ccu else env
|
||||||
// Compute the top-rooted module or namespace references
|
// Compute the top-rooted module or namespace references
|
||||||
let modrefs = ccu.RootModulesAndNamespaces |> List.map (mkNonLocalCcuRootEntityRef ccu)
|
let modrefs = ccu.RootModulesAndNamespaces |> List.map (mkNonLocalCcuRootEntityRef ccu)
|
||||||
|
@ -724,10 +734,10 @@ type AfterTcOverloadResolution =
|
||||||
| AfterOverloadResolution.DoNothing ->
|
| AfterOverloadResolution.DoNothing ->
|
||||||
AfterTcOverloadResolution.DoNothing
|
AfterTcOverloadResolution.DoNothing
|
||||||
| AfterOverloadResolution.SendToSink(callSink,fallback) ->
|
| AfterOverloadResolution.SendToSink(callSink,fallback) ->
|
||||||
AfterTcOverloadResolution.SendToSink ((fun (minfo,_) -> Item.MethodGroup(minfo.LogicalName,[minfo]) |> callSink), fallback)
|
AfterTcOverloadResolution.SendToSink ((fun (minfo,_) -> Item.MethodGroup(minfo.LogicalName,[minfo],None) |> callSink), fallback)
|
||||||
| AfterOverloadResolution.ReplaceWithOverrideAndSendToSink (Item.MethodGroup(_,overridenMinfos), callSink,fallback) ->
|
| AfterOverloadResolution.ReplaceWithOverrideAndSendToSink (Item.MethodGroup(_,overridenMinfos,_orig), callSink,fallback) ->
|
||||||
AfterTcOverloadResolution.ReplaceWithOverrideAndSendToSink
|
AfterTcOverloadResolution.ReplaceWithOverrideAndSendToSink
|
||||||
((List.map (fun minfo -> minfo,None) overridenMinfos),(fun (minfo,_) -> Item.MethodGroup(minfo.LogicalName,[minfo]) |> callSink),fallback)
|
((overridenMinfos |> List.map (fun minfo -> minfo,None)),(fun (minfo,_) -> Item.MethodGroup(minfo.LogicalName,[minfo],None) |> callSink),fallback)
|
||||||
| _ -> error(InternalError("Name resolution does not match overriden for method groups", range0))
|
| _ -> error(InternalError("Name resolution does not match overriden for method groups", range0))
|
||||||
|
|
||||||
static member ForProperties name gettersOrSetters afterOverloadResolution =
|
static member ForProperties name gettersOrSetters afterOverloadResolution =
|
||||||
|
@ -1735,9 +1745,9 @@ let MakeAndPublishSimpleVals cenv env m names mergeNamesInOneNameresEnv =
|
||||||
let sink =
|
let sink =
|
||||||
{ new ITypecheckResultsSink with
|
{ new ITypecheckResultsSink with
|
||||||
member this.NotifyEnvWithScope(_, _, _) = () // ignore EnvWithScope reports
|
member this.NotifyEnvWithScope(_, _, _) = () // ignore EnvWithScope reports
|
||||||
member this.NotifyNameResolution(pos, a, b, occurence, denv, nenv, ad, m) =
|
member this.NotifyNameResolution(pos, a, b, occurence, denv, nenv, ad, m, replacing) =
|
||||||
if not m.IsSynthetic then
|
if not m.IsSynthetic then
|
||||||
nameResolutions.Add(pos, a, b, occurence, denv, nenv, ad, m)
|
nameResolutions.Add(pos, a, b, occurence, denv, nenv, ad, m, replacing)
|
||||||
member this.NotifyExprHasType(_, _, _, _, _, _) = assert false // no expr typings in MakeSimpleVals
|
member this.NotifyExprHasType(_, _, _, _, _, _) = assert false // no expr typings in MakeSimpleVals
|
||||||
member this.NotifyFormatSpecifierLocation _ = ()
|
member this.NotifyFormatSpecifierLocation _ = ()
|
||||||
member this.CurrentSource = None }
|
member this.CurrentSource = None }
|
||||||
|
@ -1746,11 +1756,11 @@ let MakeAndPublishSimpleVals cenv env m names mergeNamesInOneNameresEnv =
|
||||||
MakeSimpleVals cenv env names
|
MakeSimpleVals cenv env names
|
||||||
|
|
||||||
if nameResolutions.Count <> 0 then
|
if nameResolutions.Count <> 0 then
|
||||||
let (_, _, _, _, _, _, ad, m1) = nameResolutions.[0]
|
let (_, _, _, _, _, _, ad, m1, _replacing) = nameResolutions.[0]
|
||||||
// mergedNameEnv - name resolution env that contains all names
|
// mergedNameEnv - name resolution env that contains all names
|
||||||
// mergedRange - union of ranges of names
|
// mergedRange - union of ranges of names
|
||||||
let mergedNameEnv, mergedRange =
|
let mergedNameEnv, mergedRange =
|
||||||
((env.NameEnv, m1), nameResolutions) ||> Seq.fold (fun (nenv, merged) (_pos, item, _b, _occurence, _denv, _nenv, _ad, m) ->
|
((env.NameEnv, m1), nameResolutions) ||> Seq.fold (fun (nenv, merged) (_pos, item, _b, _occurence, _denv, _nenv, _ad, m, _) ->
|
||||||
// MakeAndPublishVal creates only Item.Value
|
// MakeAndPublishVal creates only Item.Value
|
||||||
let item = match item with Item.Value(item) -> item | _ -> failwith "impossible"
|
let item = match item with Item.Value(item) -> item | _ -> failwith "impossible"
|
||||||
(AddFakeNamedValRefToNameEnv item.DisplayName nenv item), (unionRanges m merged)
|
(AddFakeNamedValRefToNameEnv item.DisplayName nenv item), (unionRanges m merged)
|
||||||
|
@ -1758,7 +1768,7 @@ let MakeAndPublishSimpleVals cenv env m names mergeNamesInOneNameresEnv =
|
||||||
// send notification about mergedNameEnv
|
// send notification about mergedNameEnv
|
||||||
CallEnvSink cenv.tcSink (mergedRange, mergedNameEnv, ad)
|
CallEnvSink cenv.tcSink (mergedRange, mergedNameEnv, ad)
|
||||||
// call CallNameResolutionSink for all captured name resolutions using mergedNameEnv
|
// call CallNameResolutionSink for all captured name resolutions using mergedNameEnv
|
||||||
for (_, item, b, occurence, denv, _nenv, ad, m) in nameResolutions do
|
for (_, item, b, occurence, denv, _nenv, ad, m, _replacing) in nameResolutions do
|
||||||
CallNameResolutionSink cenv.tcSink (m, mergedNameEnv, item, b, occurence, denv, ad)
|
CallNameResolutionSink cenv.tcSink (m, mergedNameEnv, item, b, occurence, denv, ad)
|
||||||
|
|
||||||
values,vspecMap
|
values,vspecMap
|
||||||
|
@ -4357,10 +4367,9 @@ and TcTypesOrMeasures optKinds cenv newOk checkCxs occ env tpenv args m =
|
||||||
| None ->
|
| None ->
|
||||||
List.mapFold (TcTypeOrMeasure None cenv newOk checkCxs occ env) tpenv args
|
List.mapFold (TcTypeOrMeasure None cenv newOk checkCxs occ env) tpenv args
|
||||||
| Some kinds ->
|
| Some kinds ->
|
||||||
if List.length kinds = List.length args
|
if List.length kinds = List.length args then
|
||||||
then List.mapFold (fun tpenv (arg,kind) -> TcTypeOrMeasure (Some kind) cenv newOk checkCxs occ env tpenv arg) tpenv (List.zip args kinds)
|
List.mapFold (fun tpenv (arg,kind) -> TcTypeOrMeasure (Some kind) cenv newOk checkCxs occ env tpenv arg) tpenv (List.zip args kinds)
|
||||||
else if kinds.Length = 0
|
elif kinds.Length = 0 then error(Error(FSComp.SR.tcUnexpectedTypeArguments(), m))
|
||||||
then error(Error(FSComp.SR.tcUnexpectedTypeArguments(), m))
|
|
||||||
else error(Error(FSComp.SR.tcTypeParameterArityMismatch((List.length kinds), (List.length args)), m))
|
else error(Error(FSComp.SR.tcTypeParameterArityMismatch((List.length kinds), (List.length args)), m))
|
||||||
|
|
||||||
and TcTyparConstraints cenv newOk checkCxs occ env tpenv wcs =
|
and TcTyparConstraints cenv newOk checkCxs occ env tpenv wcs =
|
||||||
|
@ -8125,7 +8134,7 @@ and TcItemThen cenv overallTy env tpenv (item,mItem,rest,afterOverloadResolution
|
||||||
// call to ResolveLongIdentAsExprAndComputeRange
|
// call to ResolveLongIdentAsExprAndComputeRange
|
||||||
error(Error(FSComp.SR.tcInvalidUseOfTypeName(),mItem))
|
error(Error(FSComp.SR.tcInvalidUseOfTypeName(),mItem))
|
||||||
|
|
||||||
| Item.MethodGroup (methodName,minfos) ->
|
| Item.MethodGroup (methodName,minfos,_) ->
|
||||||
// Static method calls Type.Foo(arg1,...,argn)
|
// Static method calls Type.Foo(arg1,...,argn)
|
||||||
let meths = List.map (fun minfo -> minfo,None) minfos
|
let meths = List.map (fun minfo -> minfo,None) minfos
|
||||||
let afterTcOverloadResolution = afterOverloadResolution |> AfterTcOverloadResolution.ForMethods
|
let afterTcOverloadResolution = afterOverloadResolution |> AfterTcOverloadResolution.ForMethods
|
||||||
|
@ -8133,15 +8142,21 @@ and TcItemThen cenv overallTy env tpenv (item,mItem,rest,afterOverloadResolution
|
||||||
| (DelayedApp (atomicFlag, arg, mExprAndArg)::otherDelayed) ->
|
| (DelayedApp (atomicFlag, arg, mExprAndArg)::otherDelayed) ->
|
||||||
TcMethodApplicationThen cenv env overallTy None tpenv None [] mExprAndArg mItem methodName ad NeverMutates false meths afterTcOverloadResolution NormalValUse [arg] atomicFlag otherDelayed
|
TcMethodApplicationThen cenv env overallTy None tpenv None [] mExprAndArg mItem methodName ad NeverMutates false meths afterTcOverloadResolution NormalValUse [arg] atomicFlag otherDelayed
|
||||||
|
|
||||||
| (DelayedTypeApp(tys, mTypeArgs, mExprAndTypeArgs) :: DelayedApp(atomicFlag, arg, mExprAndArg) :: otherDelayed) ->
|
| (DelayedTypeApp(tys, mTypeArgs, mExprAndTypeArgs) :: otherDelayed) ->
|
||||||
|
|
||||||
#if EXTENSIONTYPING
|
#if EXTENSIONTYPING
|
||||||
match TryTcMethodAppToStaticConstantArgs cenv env tpenv (minfos, Some (tys, mTypeArgs), mExprAndArg, mItem) with
|
match TryTcMethodAppToStaticConstantArgs cenv env tpenv (minfos, Some (tys, mTypeArgs), mExprAndTypeArgs, mItem) with
|
||||||
| Some minfoAfterStaticArguments ->
|
| Some minfoAfterStaticArguments ->
|
||||||
|
|
||||||
// // NOTE: This doesn't take instantiation into account
|
// Replace the resolution including the static parameters, plus the extra information about the original method info
|
||||||
// CallNameResolutionSink cenv.tcSink (mExprAndTypeArgs,env.NameEnv,item (* ! *), item, ItemOccurence.Use,env.DisplayEnv,env.eAccessRights)
|
let item = Item.MethodGroup(methodName, [minfoAfterStaticArguments], Some minfos.[0])
|
||||||
TcMethodApplicationThen cenv env overallTy None tpenv None [] mExprAndArg mItem methodName ad NeverMutates false [(minfoAfterStaticArguments, None)] afterTcOverloadResolution NormalValUse [arg] atomicFlag otherDelayed
|
CallNameResolutionSinkReplacing cenv.tcSink (mItem, env.NameEnv, item, item, ItemOccurence.Use, env.DisplayEnv, env.eAccessRights)
|
||||||
|
|
||||||
|
match otherDelayed with
|
||||||
|
| DelayedApp(atomicFlag, arg, mExprAndArg) :: otherDelayed ->
|
||||||
|
TcMethodApplicationThen cenv env overallTy None tpenv None [] mExprAndArg mItem methodName ad NeverMutates false [(minfoAfterStaticArguments, None)] afterTcOverloadResolution NormalValUse [arg] atomicFlag otherDelayed
|
||||||
|
| _ ->
|
||||||
|
TcMethodApplicationThen cenv env overallTy None tpenv None [] mExprAndTypeArgs mItem methodName ad NeverMutates false [(minfoAfterStaticArguments, None)] afterTcOverloadResolution NormalValUse [] ExprAtomicFlag.Atomic otherDelayed
|
||||||
|
|
||||||
| None ->
|
| None ->
|
||||||
#endif
|
#endif
|
||||||
|
@ -8150,8 +8165,17 @@ and TcItemThen cenv overallTy env tpenv (item,mItem,rest,afterOverloadResolution
|
||||||
|
|
||||||
// NOTE: This doesn't take instantiation into account
|
// NOTE: This doesn't take instantiation into account
|
||||||
CallNameResolutionSink cenv.tcSink (mExprAndTypeArgs,env.NameEnv,item (* ! *), item, ItemOccurence.Use,env.DisplayEnv,env.eAccessRights)
|
CallNameResolutionSink cenv.tcSink (mExprAndTypeArgs,env.NameEnv,item (* ! *), item, ItemOccurence.Use,env.DisplayEnv,env.eAccessRights)
|
||||||
TcMethodApplicationThen cenv env overallTy None tpenv (Some tyargs) [] mExprAndArg mItem methodName ad NeverMutates false meths afterTcOverloadResolution NormalValUse [arg] atomicFlag otherDelayed
|
match otherDelayed with
|
||||||
|
| DelayedApp(atomicFlag, arg, mExprAndArg) :: otherDelayed ->
|
||||||
|
TcMethodApplicationThen cenv env overallTy None tpenv (Some tyargs) [] mExprAndArg mItem methodName ad NeverMutates false meths afterTcOverloadResolution NormalValUse [arg] atomicFlag otherDelayed
|
||||||
|
| _ ->
|
||||||
|
TcMethodApplicationThen cenv env overallTy None tpenv (Some tyargs) [] mExprAndTypeArgs mItem methodName ad NeverMutates false meths afterTcOverloadResolution NormalValUse [] ExprAtomicFlag.Atomic otherDelayed
|
||||||
|
|
||||||
| _ ->
|
| _ ->
|
||||||
|
#if EXTENSIONTYPING
|
||||||
|
if not minfos.IsEmpty && minfos.[0].ProvidedStaticParameterInfo.IsSome then
|
||||||
|
error(Error(FSComp.SR.etMissingStaticArgumentsToMethod(),mItem))
|
||||||
|
#endif
|
||||||
TcMethodApplicationThen cenv env overallTy None tpenv None [] mItem mItem methodName ad NeverMutates false meths afterTcOverloadResolution NormalValUse [] ExprAtomicFlag.Atomic delayed
|
TcMethodApplicationThen cenv env overallTy None tpenv None [] mItem mItem methodName ad NeverMutates false meths afterTcOverloadResolution NormalValUse [] ExprAtomicFlag.Atomic delayed
|
||||||
|
|
||||||
| Item.CtorGroup(nm,minfos) ->
|
| Item.CtorGroup(nm,minfos) ->
|
||||||
|
@ -8417,6 +8441,8 @@ and GetSynMemberApplicationArgs delayed tpenv =
|
||||||
atomicFlag, None, [arg], otherDelayed, tpenv
|
atomicFlag, None, [arg], otherDelayed, tpenv
|
||||||
| DelayedTypeApp(tyargs, mTypeArgs, _) :: DelayedApp (atomicFlag, arg, _mExprAndArg) :: otherDelayed ->
|
| DelayedTypeApp(tyargs, mTypeArgs, _) :: DelayedApp (atomicFlag, arg, _mExprAndArg) :: otherDelayed ->
|
||||||
(atomicFlag, Some (tyargs,mTypeArgs), [arg], otherDelayed, tpenv)
|
(atomicFlag, Some (tyargs,mTypeArgs), [arg], otherDelayed, tpenv)
|
||||||
|
| DelayedTypeApp(tyargs, mTypeArgs, _) :: otherDelayed ->
|
||||||
|
(ExprAtomicFlag.Atomic, Some (tyargs,mTypeArgs), [], otherDelayed, tpenv)
|
||||||
| otherDelayed ->
|
| otherDelayed ->
|
||||||
(ExprAtomicFlag.NonAtomic, None, [], otherDelayed, tpenv)
|
(ExprAtomicFlag.NonAtomic, None, [], otherDelayed, tpenv)
|
||||||
|
|
||||||
|
@ -8451,7 +8477,7 @@ and TcLookupThen cenv overallTy env tpenv mObjExpr objExpr objExprTy longId dela
|
||||||
let delayed = delayRest rest mExprAndItem delayed
|
let delayed = delayRest rest mExprAndItem delayed
|
||||||
|
|
||||||
match item with
|
match item with
|
||||||
| Item.MethodGroup (methodName,minfos) ->
|
| Item.MethodGroup (methodName,minfos,_) ->
|
||||||
let atomicFlag,tyargsOpt,args,delayed,tpenv = GetSynMemberApplicationArgs delayed tpenv
|
let atomicFlag,tyargsOpt,args,delayed,tpenv = GetSynMemberApplicationArgs delayed tpenv
|
||||||
let afterTcOverloadResolution = afterOverloadResolution |> AfterTcOverloadResolution.ForMethods
|
let afterTcOverloadResolution = afterOverloadResolution |> AfterTcOverloadResolution.ForMethods
|
||||||
|
|
||||||
|
@ -8461,8 +8487,15 @@ and TcLookupThen cenv overallTy env tpenv mObjExpr objExpr objExprTy longId dela
|
||||||
|
|
||||||
#if EXTENSIONTYPING
|
#if EXTENSIONTYPING
|
||||||
match TryTcMethodAppToStaticConstantArgs cenv env tpenv (minfos, tyargsOpt, mExprAndItem, mItem) with
|
match TryTcMethodAppToStaticConstantArgs cenv env tpenv (minfos, tyargsOpt, mExprAndItem, mItem) with
|
||||||
| Some minfo -> TcMethodApplicationThen cenv env overallTy None tpenv None objArgs mExprAndItem mItem methodName ad mutates false [(minfo, None)] afterTcOverloadResolution NormalValUse args atomicFlag delayed
|
| Some minfoAfterStaticArguments ->
|
||||||
|
// Replace the resolution including the static parameters, plus the extra information about the original method info
|
||||||
|
let item = Item.MethodGroup(methodName, [minfoAfterStaticArguments], Some minfos.[0])
|
||||||
|
CallNameResolutionSinkReplacing cenv.tcSink (mExprAndItem,env.NameEnv, item, item, ItemOccurence.Use, env.DisplayEnv, env.eAccessRights)
|
||||||
|
|
||||||
|
TcMethodApplicationThen cenv env overallTy None tpenv None objArgs mExprAndItem mItem methodName ad mutates false [(minfoAfterStaticArguments, None)] afterTcOverloadResolution NormalValUse args atomicFlag delayed
|
||||||
| None ->
|
| None ->
|
||||||
|
if not minfos.IsEmpty && minfos.[0].ProvidedStaticParameterInfo.IsSome then
|
||||||
|
error(Error(FSComp.SR.etMissingStaticArgumentsToMethod(),mItem))
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
let tyargsOpt,tpenv = TcMemberTyArgsOpt cenv env tpenv tyargsOpt
|
let tyargsOpt,tpenv = TcMemberTyArgsOpt cenv env tpenv tyargsOpt
|
||||||
|
@ -15521,8 +15554,8 @@ let ApplyAssemblyLevelAutoOpenAttributeToTcEnv g amap (ccu: CcuThunk) scopem env
|
||||||
| Some _ -> OpenModulesOrNamespaces TcResultsSink.NoSink g amap scopem root env [modref]
|
| Some _ -> OpenModulesOrNamespaces TcResultsSink.NoSink g amap scopem root env [modref]
|
||||||
|
|
||||||
// Add the CCU and apply the "AutoOpen" attributes
|
// Add the CCU and apply the "AutoOpen" attributes
|
||||||
let AddCcuToTcEnv(g,amap,scopem,env,ccu,autoOpens,internalsVisible) =
|
let AddCcuToTcEnv(g,amap,scopem,env,assemblyName,ccu,autoOpens,internalsVisible) =
|
||||||
let env = AddNonLocalCcu g amap scopem env (ccu,internalsVisible)
|
let env = AddNonLocalCcu g amap scopem env assemblyName (ccu,internalsVisible)
|
||||||
|
|
||||||
// See https://fslang.uservoice.com/forums/245727-f-language/suggestions/6107641-make-microsoft-prefix-optional-when-using-core-f
|
// See https://fslang.uservoice.com/forums/245727-f-language/suggestions/6107641-make-microsoft-prefix-optional-when-using-core-f
|
||||||
// "Microsoft" is opened by default in FSharp.Core
|
// "Microsoft" is opened by default in FSharp.Core
|
||||||
|
@ -15539,8 +15572,8 @@ let AddCcuToTcEnv(g,amap,scopem,env,ccu,autoOpens,internalsVisible) =
|
||||||
let env = (env,autoOpens) ||> List.fold (ApplyAssemblyLevelAutoOpenAttributeToTcEnv g amap ccu scopem)
|
let env = (env,autoOpens) ||> List.fold (ApplyAssemblyLevelAutoOpenAttributeToTcEnv g amap ccu scopem)
|
||||||
env
|
env
|
||||||
|
|
||||||
let CreateInitialTcEnv(g,amap,scopem,ccus) =
|
let CreateInitialTcEnv(g,amap,scopem,assemblyName,ccus) =
|
||||||
List.fold (fun env (ccu,autoOpens,internalsVisible) -> AddCcuToTcEnv(g,amap,scopem,env,ccu,autoOpens,internalsVisible)) (emptyTcEnv g) ccus
|
List.fold (fun env (ccu,autoOpens,internalsVisible) -> AddCcuToTcEnv(g,amap,scopem,env,assemblyName,ccu,autoOpens,internalsVisible)) (emptyTcEnv g) ccus
|
||||||
|
|
||||||
type ConditionalDefines =
|
type ConditionalDefines =
|
||||||
string list
|
string list
|
||||||
|
|
|
@ -26,8 +26,8 @@ type TcEnv =
|
||||||
member NameEnv : NameResolution.NameResolutionEnv
|
member NameEnv : NameResolution.NameResolutionEnv
|
||||||
member AccessRights : AccessorDomain
|
member AccessRights : AccessorDomain
|
||||||
|
|
||||||
val CreateInitialTcEnv : TcGlobals * ImportMap * range * (CcuThunk * string list * bool) list -> TcEnv
|
val CreateInitialTcEnv : TcGlobals * ImportMap * range * assemblyName: string * (CcuThunk * string list * string list) list -> TcEnv
|
||||||
val AddCcuToTcEnv : TcGlobals * ImportMap * range * TcEnv * CcuThunk * autoOpens: string list * bool -> TcEnv
|
val AddCcuToTcEnv : TcGlobals * ImportMap * range * TcEnv * assemblyName: string * ccu: CcuThunk * autoOpens: string list * internalsVisibleToAttributes: string list -> TcEnv
|
||||||
val AddLocalRootModuleOrNamespace : NameResolution.TcResultsSink -> TcGlobals -> ImportMap -> range -> TcEnv -> ModuleOrNamespaceType -> TcEnv
|
val AddLocalRootModuleOrNamespace : NameResolution.TcResultsSink -> TcGlobals -> ImportMap -> range -> TcEnv -> ModuleOrNamespaceType -> TcEnv
|
||||||
val TcOpenDecl : NameResolution.TcResultsSink -> TcGlobals -> ImportMap -> range -> range -> TcEnv -> Ast.LongIdent -> TcEnv
|
val TcOpenDecl : NameResolution.TcResultsSink -> TcGlobals -> ImportMap -> range -> range -> TcEnv -> Ast.LongIdent -> TcEnv
|
||||||
|
|
||||||
|
@ -103,6 +103,7 @@ exception OverrideInExtrinsicAugmentation of range
|
||||||
exception NonUniqueInferredAbstractSlot of TcGlobals * DisplayEnv * string * MethInfo * MethInfo * range
|
exception NonUniqueInferredAbstractSlot of TcGlobals * DisplayEnv * string * MethInfo * MethInfo * range
|
||||||
exception StandardOperatorRedefinitionWarning of string * range
|
exception StandardOperatorRedefinitionWarning of string * range
|
||||||
exception ParameterlessStructCtor of range
|
exception ParameterlessStructCtor of range
|
||||||
|
exception InvalidInternalsVisibleToAssemblyName of (*badName*)string * (*fileName option*) string option
|
||||||
|
|
||||||
val TcFieldInit : range -> ILFieldInit -> Tast.Const
|
val TcFieldInit : range -> ILFieldInit -> Tast.Const
|
||||||
|
|
||||||
|
|
|
@ -1150,7 +1150,7 @@ module DispatchSlotChecking =
|
||||||
|> List.filter (OverrideImplementsDispatchSlot g amap m dispatchSlot) with
|
|> List.filter (OverrideImplementsDispatchSlot g amap m dispatchSlot) with
|
||||||
| [ovd] ->
|
| [ovd] ->
|
||||||
if not ovd.IsCompilerGenerated then
|
if not ovd.IsCompilerGenerated then
|
||||||
let item = Item.MethodGroup(ovd.LogicalName,[dispatchSlot])
|
let item = Item.MethodGroup(ovd.LogicalName,[dispatchSlot],None)
|
||||||
CallNameResolutionSink sink (ovd.Range,nenv,item,item,ItemOccurence.Implemented,denv,AccessorDomain.AccessibleFromSomewhere)
|
CallNameResolutionSink sink (ovd.Range,nenv,item,item,ItemOccurence.Implemented,denv,AccessorDomain.AccessibleFromSomewhere)
|
||||||
sink |> ignore
|
sink |> ignore
|
||||||
()
|
()
|
||||||
|
|
|
@ -1412,7 +1412,7 @@ type ParsedSigFile =
|
||||||
let ident (s,r) = new Ident(s,r)
|
let ident (s,r) = new Ident(s,r)
|
||||||
let textOfId (id:Ident) = id.idText
|
let textOfId (id:Ident) = id.idText
|
||||||
let pathOfLid lid = List.map textOfId lid
|
let pathOfLid lid = List.map textOfId lid
|
||||||
let arrPathOfLid lid = Array.ofList (List.map textOfId lid)
|
let arrPathOfLid lid = Array.ofList (pathOfLid lid)
|
||||||
let textOfPath path = String.concat "." path
|
let textOfPath path = String.concat "." path
|
||||||
let textOfArrPath path = String.concat "." (List.ofArray path)
|
let textOfArrPath path = String.concat "." (List.ofArray path)
|
||||||
let textOfLid lid = textOfPath (pathOfLid lid)
|
let textOfLid lid = textOfPath (pathOfLid lid)
|
||||||
|
|
|
@ -440,7 +440,7 @@ let GetTcImportsFromCommandLine
|
||||||
|
|
||||||
ReportTime tcConfig "Typecheck"
|
ReportTime tcConfig "Typecheck"
|
||||||
use unwindParsePhase = PushThreadBuildPhaseUntilUnwind (BuildPhase.TypeCheck)
|
use unwindParsePhase = PushThreadBuildPhaseUntilUnwind (BuildPhase.TypeCheck)
|
||||||
let tcEnv0 = GetInitialTcEnv (Some assemblyName, rangeStartup, tcConfig, tcImports, tcGlobals)
|
let tcEnv0 = GetInitialTcEnv (assemblyName, rangeStartup, tcConfig, tcImports, tcGlobals)
|
||||||
|
|
||||||
// typecheck
|
// typecheck
|
||||||
let inputs = inputs |> List.map fst
|
let inputs = inputs |> List.map fst
|
||||||
|
@ -637,15 +637,13 @@ let EncodeInterfaceData(tcConfig:TcConfig,tcGlobals,exportRemapping,generatedCcu
|
||||||
let resource = WriteSignatureData (tcConfig,tcGlobals,exportRemapping,generatedCcu,outfile)
|
let resource = WriteSignatureData (tcConfig,tcGlobals,exportRemapping,generatedCcu,outfile)
|
||||||
if verbose then dprintf "Generated interface data attribute!\n";
|
if verbose then dprintf "Generated interface data attribute!\n";
|
||||||
// REVIEW: need a better test for this
|
// REVIEW: need a better test for this
|
||||||
let outFileNoExtension = Filename.chopExtension outfile
|
if (tcConfig.useOptimizationDataFile || tcGlobals.compilingFslib) && not isIncrementalBuild then
|
||||||
let isCompilerServiceDll = outFileNoExtension.Contains("FSharp.LanguageService.Compiler")
|
|
||||||
if (tcConfig.useOptimizationDataFile || tcGlobals.compilingFslib || isCompilerServiceDll) && not isIncrementalBuild then
|
|
||||||
let sigDataFileName = (Filename.chopExtension outfile)+".sigdata"
|
let sigDataFileName = (Filename.chopExtension outfile)+".sigdata"
|
||||||
File.WriteAllBytes(sigDataFileName,resource.Bytes);
|
File.WriteAllBytes(sigDataFileName,resource.Bytes);
|
||||||
let sigAttr = mkSignatureDataVersionAttr tcGlobals (IL.parseILVersion Internal.Utilities.FSharpEnvironment.FSharpBinaryMetadataFormatRevision)
|
let sigAttr = mkSignatureDataVersionAttr tcGlobals (IL.parseILVersion Internal.Utilities.FSharpEnvironment.FSharpBinaryMetadataFormatRevision)
|
||||||
// The resource gets written to a file for FSharp.Core
|
// The resource gets written to a file for FSharp.Core
|
||||||
let resources =
|
let resources =
|
||||||
[ if not tcGlobals.compilingFslib && not isCompilerServiceDll then
|
[ if not tcGlobals.compilingFslib then
|
||||||
yield resource ]
|
yield resource ]
|
||||||
[sigAttr], resources
|
[sigAttr], resources
|
||||||
else
|
else
|
||||||
|
@ -665,15 +663,13 @@ let EncodeOptimizationData(tcGlobals,tcConfig,outfile,exportRemapping,data) =
|
||||||
let data = map2Of2 (Optimizer.RemapOptimizationInfo tcGlobals exportRemapping) data
|
let data = map2Of2 (Optimizer.RemapOptimizationInfo tcGlobals exportRemapping) data
|
||||||
if verbose then dprintn "Generating optimization data attribute...";
|
if verbose then dprintn "Generating optimization data attribute...";
|
||||||
// REVIEW: need a better test for this
|
// REVIEW: need a better test for this
|
||||||
let outFileNoExtension = Filename.chopExtension outfile
|
if tcConfig.useOptimizationDataFile || tcGlobals.compilingFslib then
|
||||||
let isCompilerServiceDll = outFileNoExtension.Contains("FSharp.LanguageService.Compiler")
|
|
||||||
if tcConfig.useOptimizationDataFile || tcGlobals.compilingFslib || isCompilerServiceDll then
|
|
||||||
let ccu,modulInfo = data
|
let ccu,modulInfo = data
|
||||||
let bytes = TastPickle.pickleObjWithDanglingCcus outfile tcGlobals ccu Optimizer.p_CcuOptimizationInfo modulInfo
|
let bytes = TastPickle.pickleObjWithDanglingCcus outfile tcGlobals ccu Optimizer.p_CcuOptimizationInfo modulInfo
|
||||||
let optDataFileName = (Filename.chopExtension outfile)+".optdata"
|
let optDataFileName = (Filename.chopExtension outfile)+".optdata"
|
||||||
File.WriteAllBytes(optDataFileName,bytes);
|
File.WriteAllBytes(optDataFileName,bytes);
|
||||||
// As with the sigdata file, the optdata gets written to a file for FSharp.Core, FSharp.Compiler.Silverlight and FSharp.LanguageService.Compiler
|
// As with the sigdata file, the optdata gets written to a file for FSharp.Core
|
||||||
if tcGlobals.compilingFslib || isCompilerServiceDll then
|
if tcGlobals.compilingFslib then
|
||||||
[]
|
[]
|
||||||
else
|
else
|
||||||
let (ccu, optData) =
|
let (ccu, optData) =
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
{
|
||||||
|
"runtimeOptions": {}
|
||||||
|
}
|
|
@ -1,10 +1,10 @@
|
||||||
<?xml version="1.0"?>
|
<?xml version="1.0"?>
|
||||||
<package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
|
<package xmlns="http://schemas.microsoft.com/packaging/2012/06/nuspec.xsd">
|
||||||
<metadata>
|
<metadata>
|
||||||
<id>Microsoft.FSharp.Core.netcore</id>
|
<id>Microsoft.FSharp.Core.netcore</id>
|
||||||
<description>
|
<description>
|
||||||
netcore compatible version of the fsharp core library fsharp.core.dll
|
netcore compatible version of the fsharp core library fsharp.core.dll
|
||||||
Supported Platforms: - .NET Core (dnxcore50)
|
Supported Platforms: - .NET Core (netstandard1.5)
|
||||||
</description>
|
</description>
|
||||||
<language>en-US</language>
|
<language>en-US</language>
|
||||||
<requireLicenseAcceptance>true</requireLicenseAcceptance>
|
<requireLicenseAcceptance>true</requireLicenseAcceptance>
|
||||||
|
@ -14,7 +14,7 @@
|
||||||
<projectUrl>$projectUrl$</projectUrl>
|
<projectUrl>$projectUrl$</projectUrl>
|
||||||
<tags>$tags$</tags>
|
<tags>$tags$</tags>
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<group>
|
<group targetFramework=".NETStandard1.5">
|
||||||
<dependency id="Microsoft.NETCore.Platforms" version="1.0.1-rc2-23911" />
|
<dependency id="Microsoft.NETCore.Platforms" version="1.0.1-rc2-23911" />
|
||||||
<dependency id="NETStandard.Library" version="1.5.0-rc2-23911" />
|
<dependency id="NETStandard.Library" version="1.5.0-rc2-23911" />
|
||||||
<dependency id="System.Linq.Expressions" version="4.0.11-rc2-23911" />
|
<dependency id="System.Linq.Expressions" version="4.0.11-rc2-23911" />
|
||||||
|
@ -30,11 +30,12 @@
|
||||||
</dependencies>
|
</dependencies>
|
||||||
</metadata>
|
</metadata>
|
||||||
<files>
|
<files>
|
||||||
<file src="FSharp.Core.dll" target="lib/DNXCore50" />
|
<file src="FSharp.Core.dll" target="lib/netstandard1.5" />
|
||||||
<file src="FSharp.Core.sigdata" target="lib/DNXCore50" />
|
<file src="FSharp.Core.sigdata" target="lib/netstandard1.5" />
|
||||||
<file src="FSharp.Core.optdata" target="lib/DNXCore50" />
|
<file src="FSharp.Core.optdata" target="lib/netstandard1.5" />
|
||||||
<file src="FSharp.Core.sigdata" target="content/any/DNXCore50" />
|
<file src="FSharp.Core.runtimeconfig.json" target="lib/netstandard1.5" />
|
||||||
<file src="FSharp.Core.optdata" target="content/any/DNXCore50" />
|
<file src="FSharp.Core.sigdata" target="content/any/netstandard1.5" />
|
||||||
|
<file src="FSharp.Core.optdata" target="content/any/netstandard1.5" />
|
||||||
<file src="FSharp.Core.sigdata" target="runtimes/any/native/" />
|
<file src="FSharp.Core.sigdata" target="runtimes/any/native/" />
|
||||||
<file src="FSharp.Core.optdata" target="runtimes/any/native/" />
|
<file src="FSharp.Core.optdata" target="runtimes/any/native/" />
|
||||||
</files>
|
</files>
|
||||||
|
|
|
@ -62,6 +62,7 @@ try
|
||||||
yield Path.Combine(bindir, "FSharp.Core.dll")
|
yield Path.Combine(bindir, "FSharp.Core.dll")
|
||||||
yield Path.Combine(bindir, "FSharp.Core.sigdata")
|
yield Path.Combine(bindir, "FSharp.Core.sigdata")
|
||||||
yield Path.Combine(bindir, "FSharp.Core.optdata")
|
yield Path.Combine(bindir, "FSharp.Core.optdata")
|
||||||
|
yield Path.Combine( __SOURCE_DIRECTORY__ , "FSharp.Core.runtimeconfig.json")
|
||||||
}
|
}
|
||||||
|
|
||||||
//Clean intermediate directoriy
|
//Clean intermediate directoriy
|
||||||
|
|
|
@ -39,7 +39,7 @@
|
||||||
<Link>FSIstrings.txt</Link>
|
<Link>FSIstrings.txt</Link>
|
||||||
</FsSrGen>
|
</FsSrGen>
|
||||||
<Compile Include="..\..\assemblyinfo\assemblyinfo.fsi.exe.fs">
|
<Compile Include="..\..\assemblyinfo\assemblyinfo.fsi.exe.fs">
|
||||||
<Link>Utilities/assemblyinfo.fsi.exe.fs</Link>
|
<Link>assemblyinfo.fsi.exe.fs</Link>
|
||||||
</Compile>
|
</Compile>
|
||||||
<Compile Include="..\..\utils\reshapedreflection.fs">
|
<Compile Include="..\..\utils\reshapedreflection.fs">
|
||||||
<Link>Reflection/reshapedreflection.fs</Link>
|
<Link>Reflection/reshapedreflection.fs</Link>
|
||||||
|
|
|
@ -1030,7 +1030,7 @@ type internal FsiDynamicCompiler
|
||||||
let tcState = istate.tcState
|
let tcState = istate.tcState
|
||||||
let tcEnv,(_dllinfos,ccuinfos) =
|
let tcEnv,(_dllinfos,ccuinfos) =
|
||||||
try
|
try
|
||||||
RequireDLL tcImports tcState.TcEnvFromImpls m path
|
RequireDLL (tcImports, tcState.TcEnvFromImpls, assemblyName, m, path)
|
||||||
with e ->
|
with e ->
|
||||||
tcConfigB.RemoveReferencedAssemblyByPath(m,path)
|
tcConfigB.RemoveReferencedAssemblyByPath(m,path)
|
||||||
reraise()
|
reraise()
|
||||||
|
@ -1096,7 +1096,7 @@ type internal FsiDynamicCompiler
|
||||||
let tcConfig = TcConfig.Create(tcConfigB,validate=false)
|
let tcConfig = TcConfig.Create(tcConfigB,validate=false)
|
||||||
let optEnv0 = GetInitialOptimizationEnv (tcImports, tcGlobals)
|
let optEnv0 = GetInitialOptimizationEnv (tcImports, tcGlobals)
|
||||||
let emEnv = ILRuntimeWriter.emEnv0
|
let emEnv = ILRuntimeWriter.emEnv0
|
||||||
let tcEnv = GetInitialTcEnv (None, rangeStdin, tcConfig, tcImports, tcGlobals)
|
let tcEnv = GetInitialTcEnv (assemblyName, rangeStdin, tcConfig, tcImports, tcGlobals)
|
||||||
let ccuName = assemblyName
|
let ccuName = assemblyName
|
||||||
|
|
||||||
let tcState = GetInitialTcState (rangeStdin, ccuName, tcConfig, tcGlobals, tcImports, niceNameGen, tcEnv)
|
let tcState = GetInitialTcState (rangeStdin, ccuName, tcConfig, tcGlobals, tcImports, niceNameGen, tcEnv)
|
||||||
|
|
|
@ -17,6 +17,6 @@
|
||||||
"ubuntu.14.04-x64": { }
|
"ubuntu.14.04-x64": { }
|
||||||
},
|
},
|
||||||
"frameworks": {
|
"frameworks": {
|
||||||
"dnxcore50": { }
|
"netstandard1.5": { }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -3306,6 +3306,8 @@ declExpr:
|
||||||
| declExpr INFIX_COMPARE_OP declExpr { mkSynInfix (rhs parseState 2) $1 $2 $3 }
|
| declExpr INFIX_COMPARE_OP declExpr { mkSynInfix (rhs parseState 2) $1 $2 $3 }
|
||||||
| declExpr DOLLAR declExpr { mkSynInfix (rhs parseState 2) $1 "$" $3 }
|
| declExpr DOLLAR declExpr { mkSynInfix (rhs parseState 2) $1 "$" $3 }
|
||||||
| declExpr LESS declExpr { mkSynInfix (rhs parseState 2) $1 "<" $3 }
|
| declExpr LESS declExpr { mkSynInfix (rhs parseState 2) $1 "<" $3 }
|
||||||
|
| declExpr LESS recover { if not $3 then reportParseErrorAt (rhs parseState 2) (FSComp.SR.parsUnfinishedExpression("<"));
|
||||||
|
exprFromParseError (mkSynInfix (rhs parseState 2) $1 "<" (arbExpr("declExprInfix",(rhs parseState 3).StartRange))) }
|
||||||
| declExpr GREATER declExpr { mkSynInfix (rhs parseState 2) $1 ">" $3 }
|
| declExpr GREATER declExpr { mkSynInfix (rhs parseState 2) $1 ">" $3 }
|
||||||
| declExpr INFIX_AT_HAT_OP declExpr { mkSynInfix (rhs parseState 2) $1 $2 $3 }
|
| declExpr INFIX_AT_HAT_OP declExpr { mkSynInfix (rhs parseState 2) $1 $2 $3 }
|
||||||
| declExpr PERCENT_OP declExpr { mkSynInfix (rhs parseState 2) $1 $2 $3 }
|
| declExpr PERCENT_OP declExpr { mkSynInfix (rhs parseState 2) $1 $2 $3 }
|
||||||
|
|
|
@ -1405,7 +1405,7 @@ type IncrementalBuilder(frameworkTcImportsCache: FrameworkImportsCache, tcConfig
|
||||||
errorLogger.Warning(e)
|
errorLogger.Warning(e)
|
||||||
frameworkTcImports
|
frameworkTcImports
|
||||||
|
|
||||||
let tcEnvAtEndOfFile = GetInitialTcEnv (Some assemblyName, rangeStartup, tcConfig, tcImports, tcGlobals)
|
let tcEnvAtEndOfFile = GetInitialTcEnv (assemblyName, rangeStartup, tcConfig, tcImports, tcGlobals)
|
||||||
let tcState = GetInitialTcState (rangeStartup, assemblyName, tcConfig, tcGlobals, tcImports, niceNameGen, tcEnvAtEndOfFile)
|
let tcState = GetInitialTcState (rangeStartup, assemblyName, tcConfig, tcGlobals, tcImports, niceNameGen, tcEnvAtEndOfFile)
|
||||||
let tcAcc =
|
let tcAcc =
|
||||||
{ tcGlobals=tcGlobals
|
{ tcGlobals=tcGlobals
|
||||||
|
|
|
@ -150,7 +150,7 @@ module internal ItemDescriptionsImpl =
|
||||||
| Item.CustomOperation (_,_,Some minfo) -> rangeOfMethInfo g preferFlag minfo
|
| Item.CustomOperation (_,_,Some minfo) -> rangeOfMethInfo g preferFlag minfo
|
||||||
| Item.TypeVar (_,tp) -> Some tp.Range
|
| Item.TypeVar (_,tp) -> Some tp.Range
|
||||||
| Item.ModuleOrNamespaces(modrefs) -> modrefs |> List.tryPick (rangeOfEntityRef preferFlag >> Some)
|
| Item.ModuleOrNamespaces(modrefs) -> modrefs |> List.tryPick (rangeOfEntityRef preferFlag >> Some)
|
||||||
| Item.MethodGroup(_,minfos)
|
| Item.MethodGroup(_,minfos,_)
|
||||||
| Item.CtorGroup(_,minfos) -> minfos |> List.tryPick (rangeOfMethInfo g preferFlag)
|
| Item.CtorGroup(_,minfos) -> minfos |> List.tryPick (rangeOfMethInfo g preferFlag)
|
||||||
| Item.ActivePatternResult(APInfo _,_, _, m) -> Some m
|
| Item.ActivePatternResult(APInfo _,_, _, m) -> Some m
|
||||||
| Item.SetterArg (_,item) -> rangeOfItem g preferFlag item
|
| Item.SetterArg (_,item) -> rangeOfItem g preferFlag item
|
||||||
|
@ -195,7 +195,7 @@ module internal ItemDescriptionsImpl =
|
||||||
|
|
||||||
| Item.ArgName (_,_,Some (ArgumentContainer.Method minfo)) -> ccuOfMethInfo g minfo
|
| Item.ArgName (_,_,Some (ArgumentContainer.Method minfo)) -> ccuOfMethInfo g minfo
|
||||||
|
|
||||||
| Item.MethodGroup(_,minfos)
|
| Item.MethodGroup(_,minfos,_)
|
||||||
| Item.CtorGroup(_,minfos) -> minfos |> List.tryPick (ccuOfMethInfo g)
|
| Item.CtorGroup(_,minfos) -> minfos |> List.tryPick (ccuOfMethInfo g)
|
||||||
| Item.CustomOperation (_,_,Some minfo) -> ccuOfMethInfo g minfo
|
| Item.CustomOperation (_,_,Some minfo) -> ccuOfMethInfo g minfo
|
||||||
|
|
||||||
|
@ -390,12 +390,13 @@ module internal ItemDescriptionsImpl =
|
||||||
| Item.Property(_,(pinfo :: _)) -> mkXmlComment (GetXmlDocSigOfProp infoReader m pinfo)
|
| Item.Property(_,(pinfo :: _)) -> mkXmlComment (GetXmlDocSigOfProp infoReader m pinfo)
|
||||||
| Item.Event(einfo) -> mkXmlComment (GetXmlDocSigOfEvent infoReader m einfo)
|
| Item.Event(einfo) -> mkXmlComment (GetXmlDocSigOfEvent infoReader m einfo)
|
||||||
|
|
||||||
| Item.MethodGroup(_,minfo :: _) -> mkXmlComment (GetXmlDocSigOfMethInfo infoReader m minfo)
|
| Item.MethodGroup(_,minfo :: _,_) -> mkXmlComment (GetXmlDocSigOfMethInfo infoReader m minfo)
|
||||||
| Item.CtorGroup(_,minfo :: _) -> mkXmlComment (GetXmlDocSigOfMethInfo infoReader m minfo)
|
| Item.CtorGroup(_,minfo :: _) -> mkXmlComment (GetXmlDocSigOfMethInfo infoReader m minfo)
|
||||||
| Item.ArgName(_, _, Some argContainer) -> match argContainer with
|
| Item.ArgName(_, _, Some argContainer) ->
|
||||||
| ArgumentContainer.Method(minfo) -> mkXmlComment (GetXmlDocSigOfMethInfo infoReader m minfo)
|
match argContainer with
|
||||||
| ArgumentContainer.Type(tcref) -> mkXmlComment (GetXmlDocSigOfEntityRef infoReader m tcref)
|
| ArgumentContainer.Method minfo -> mkXmlComment (GetXmlDocSigOfMethInfo infoReader m minfo)
|
||||||
| ArgumentContainer.UnionCase(ucinfo) -> mkXmlComment (GetXmlDocSigOfUnionCaseInfo ucinfo)
|
| ArgumentContainer.Type tcref -> mkXmlComment (GetXmlDocSigOfEntityRef infoReader m tcref)
|
||||||
|
| ArgumentContainer.UnionCase ucinfo -> mkXmlComment (GetXmlDocSigOfUnionCaseInfo ucinfo)
|
||||||
| _ -> FSharpXmlDoc.None
|
| _ -> FSharpXmlDoc.None
|
||||||
|
|
||||||
/// Produce an XmlComment with a signature or raw text.
|
/// Produce an XmlComment with a signature or raw text.
|
||||||
|
@ -509,7 +510,7 @@ module internal ItemDescriptionsImpl =
|
||||||
(nm1 = nm2) && typarRefEq tp1 tp2
|
(nm1 = nm2) && typarRefEq tp1 tp2
|
||||||
| Wrap(Item.ModuleOrNamespaces(modref1 :: _)), Wrap(Item.ModuleOrNamespaces(modref2 :: _)) -> fullDisplayTextOfModRef modref1 = fullDisplayTextOfModRef modref2
|
| Wrap(Item.ModuleOrNamespaces(modref1 :: _)), Wrap(Item.ModuleOrNamespaces(modref2 :: _)) -> fullDisplayTextOfModRef modref1 = fullDisplayTextOfModRef modref2
|
||||||
| Wrap(Item.SetterArg(id1,_)), Wrap(Item.SetterArg(id2,_)) -> (id1.idRange, id1.idText) = (id2.idRange, id2.idText)
|
| Wrap(Item.SetterArg(id1,_)), Wrap(Item.SetterArg(id2,_)) -> (id1.idRange, id1.idText) = (id2.idRange, id2.idText)
|
||||||
| Wrap(Item.MethodGroup(_, meths1)), Wrap(Item.MethodGroup(_, meths2)) ->
|
| Wrap(Item.MethodGroup(_, meths1,_)), Wrap(Item.MethodGroup(_, meths2,_)) ->
|
||||||
Seq.zip meths1 meths2 |> Seq.forall (fun (minfo1, minfo2) ->
|
Seq.zip meths1 meths2 |> Seq.forall (fun (minfo1, minfo2) ->
|
||||||
MethInfo.MethInfosUseIdenticalDefinitions minfo1 minfo2)
|
MethInfo.MethInfosUseIdenticalDefinitions minfo1 minfo2)
|
||||||
| Wrap(Item.Value vref1 | Item.CustomBuilder (_,vref1)), Wrap(Item.Value vref2 | Item.CustomBuilder (_,vref2)) -> valRefEq g vref1 vref2
|
| Wrap(Item.Value vref1 | Item.CustomBuilder (_,vref1)), Wrap(Item.Value vref2 | Item.CustomBuilder (_,vref2)) -> valRefEq g vref1 vref2
|
||||||
|
@ -541,7 +542,7 @@ module internal ItemDescriptionsImpl =
|
||||||
| Wrap(Item.CustomOperation (_,_,None)) -> 1
|
| Wrap(Item.CustomOperation (_,_,None)) -> 1
|
||||||
| Wrap(Item.ModuleOrNamespaces(modref :: _)) -> hash (fullDisplayTextOfModRef modref)
|
| Wrap(Item.ModuleOrNamespaces(modref :: _)) -> hash (fullDisplayTextOfModRef modref)
|
||||||
| Wrap(Item.SetterArg(id,_)) -> hash (id.idRange, id.idText)
|
| Wrap(Item.SetterArg(id,_)) -> hash (id.idRange, id.idText)
|
||||||
| Wrap(Item.MethodGroup(_, meths)) -> meths |> List.fold (fun st a -> st + a.ComputeHashCode()) 0
|
| Wrap(Item.MethodGroup(_, meths,_)) -> meths |> List.fold (fun st a -> st + a.ComputeHashCode()) 0
|
||||||
| Wrap(Item.CtorGroup(name, meths)) -> name.GetHashCode() + (meths |> List.fold (fun st a -> st + a.ComputeHashCode()) 0)
|
| Wrap(Item.CtorGroup(name, meths)) -> name.GetHashCode() + (meths |> List.fold (fun st a -> st + a.ComputeHashCode()) 0)
|
||||||
| Wrap(Item.Value vref | Item.CustomBuilder (_,vref)) -> hash vref.LogicalName
|
| Wrap(Item.Value vref | Item.CustomBuilder (_,vref)) -> hash vref.LogicalName
|
||||||
| Wrap(Item.ActivePatternCase(APElemRef(_apinfo, vref, idx))) -> hash (vref.LogicalName, idx)
|
| Wrap(Item.ActivePatternCase(APElemRef(_apinfo, vref, idx))) -> hash (vref.LogicalName, idx)
|
||||||
|
@ -607,7 +608,8 @@ module internal ItemDescriptionsImpl =
|
||||||
| Item.Property(_,(pinfo::_)) -> bufs (fun os -> NicePrint.outputTyconRef denv os (tcrefOfAppTy g pinfo.EnclosingType); bprintf os ".%s" pinfo.PropertyName)
|
| Item.Property(_,(pinfo::_)) -> bufs (fun os -> NicePrint.outputTyconRef denv os (tcrefOfAppTy g pinfo.EnclosingType); bprintf os ".%s" pinfo.PropertyName)
|
||||||
| Item.CustomOperation (customOpName,_,_) -> customOpName
|
| Item.CustomOperation (customOpName,_,_) -> customOpName
|
||||||
| Item.CtorGroup(_,minfo :: _) -> bufs (fun os -> NicePrint.outputTyconRef denv os minfo.DeclaringEntityRef)
|
| Item.CtorGroup(_,minfo :: _) -> bufs (fun os -> NicePrint.outputTyconRef denv os minfo.DeclaringEntityRef)
|
||||||
| Item.MethodGroup(_,minfo :: _) -> bufs (fun os -> NicePrint.outputTyconRef denv os minfo.DeclaringEntityRef; bprintf os ".%s" minfo.DisplayName)
|
| Item.MethodGroup(_,_,Some minfo) -> bufs (fun os -> NicePrint.outputTyconRef denv os minfo.DeclaringEntityRef; bprintf os ".%s" minfo.DisplayName)
|
||||||
|
| Item.MethodGroup(_,minfo :: _,_) -> bufs (fun os -> NicePrint.outputTyconRef denv os minfo.DeclaringEntityRef; bprintf os ".%s" minfo.DisplayName)
|
||||||
| Item.UnqualifiedType (tcref :: _) -> bufs (fun os -> NicePrint.outputTyconRef denv os tcref)
|
| Item.UnqualifiedType (tcref :: _) -> bufs (fun os -> NicePrint.outputTyconRef denv os tcref)
|
||||||
| Item.FakeInterfaceCtor typ
|
| Item.FakeInterfaceCtor typ
|
||||||
| Item.DelegateCtor typ
|
| Item.DelegateCtor typ
|
||||||
|
@ -623,7 +625,7 @@ module internal ItemDescriptionsImpl =
|
||||||
| Item.UnqualifiedType([])
|
| Item.UnqualifiedType([])
|
||||||
| Item.Types(_,[])
|
| Item.Types(_,[])
|
||||||
| Item.CtorGroup(_,[])
|
| Item.CtorGroup(_,[])
|
||||||
| Item.MethodGroup(_,[])
|
| Item.MethodGroup(_,[],_)
|
||||||
| Item.ModuleOrNamespaces []
|
| Item.ModuleOrNamespaces []
|
||||||
| Item.Property(_,[]) -> ""
|
| Item.Property(_,[]) -> ""
|
||||||
|
|
||||||
|
@ -802,7 +804,7 @@ module internal ItemDescriptionsImpl =
|
||||||
|
|
||||||
// F# constructors and methods
|
// F# constructors and methods
|
||||||
| Item.CtorGroup(_,minfos)
|
| Item.CtorGroup(_,minfos)
|
||||||
| Item.MethodGroup(_,minfos) ->
|
| Item.MethodGroup(_,minfos,_) ->
|
||||||
FormatOverloadsToList infoReader m denv d minfos
|
FormatOverloadsToList infoReader m denv d minfos
|
||||||
|
|
||||||
// The 'fake' zero-argument constructors of .NET interfaces.
|
// The 'fake' zero-argument constructors of .NET interfaces.
|
||||||
|
@ -937,7 +939,7 @@ module internal ItemDescriptionsImpl =
|
||||||
let layout = (NicePrint.layoutPrettifiedTypeAndConstraints denv [] rty)
|
let layout = (NicePrint.layoutPrettifiedTypeAndConstraints denv [] rty)
|
||||||
bufferL os layout
|
bufferL os layout
|
||||||
| Item.CustomOperation (_,_,Some minfo)
|
| Item.CustomOperation (_,_,Some minfo)
|
||||||
| Item.MethodGroup(_,(minfo :: _))
|
| Item.MethodGroup(_,(minfo :: _),_)
|
||||||
| Item.CtorGroup(_,(minfo :: _)) ->
|
| Item.CtorGroup(_,(minfo :: _)) ->
|
||||||
let rty = minfo.GetFSharpReturnTy(amap, m, minfo.FormalMethodInst)
|
let rty = minfo.GetFSharpReturnTy(amap, m, minfo.FormalMethodInst)
|
||||||
bufferL os (NicePrint.layoutPrettifiedTypeAndConstraints denv [] rty)
|
bufferL os (NicePrint.layoutPrettifiedTypeAndConstraints denv [] rty)
|
||||||
|
@ -1097,9 +1099,10 @@ module internal ItemDescriptionsImpl =
|
||||||
| ProvidedMeth _::_ -> None
|
| ProvidedMeth _::_ -> None
|
||||||
#endif
|
#endif
|
||||||
| Item.CustomOperation (_,_,Some minfo) -> getKeywordForMethInfo minfo
|
| Item.CustomOperation (_,_,Some minfo) -> getKeywordForMethInfo minfo
|
||||||
| Item.MethodGroup(_,minfo :: _) -> getKeywordForMethInfo minfo
|
| Item.MethodGroup(_,_,Some minfo) -> getKeywordForMethInfo minfo
|
||||||
|
| Item.MethodGroup(_,minfo :: _,_) -> getKeywordForMethInfo minfo
|
||||||
| Item.SetterArg (_, propOrField) -> GetF1Keyword propOrField
|
| Item.SetterArg (_, propOrField) -> GetF1Keyword propOrField
|
||||||
| Item.MethodGroup(_,[])
|
| Item.MethodGroup(_,[],_)
|
||||||
| Item.CustomOperation (_,_,None) // "into"
|
| Item.CustomOperation (_,_,None) // "into"
|
||||||
| Item.NewDef _ // "let x$yz = ..." - no keyword
|
| Item.NewDef _ // "let x$yz = ..." - no keyword
|
||||||
| Item.ArgName _ // no keyword on named parameters
|
| Item.ArgName _ // no keyword on named parameters
|
||||||
|
@ -1303,7 +1306,7 @@ type FSharpDeclarationListInfo(declarations: FSharpDeclarationListItem[]) =
|
||||||
let isOpItem(nm,item) =
|
let isOpItem(nm,item) =
|
||||||
match item with
|
match item with
|
||||||
| [Item.Value _]
|
| [Item.Value _]
|
||||||
| [Item.MethodGroup(_,[_])] ->
|
| [Item.MethodGroup(_,[_],_)] ->
|
||||||
(IsOpName nm) && nm.[0]='(' && nm.[nm.Length-1]=')'
|
(IsOpName nm) && nm.[0]='(' && nm.[nm.Length-1]=')'
|
||||||
| [Item.UnionCase _] -> IsOpName nm
|
| [Item.UnionCase _] -> IsOpName nm
|
||||||
| _ -> false
|
| _ -> false
|
||||||
|
|
|
@ -7,12 +7,7 @@ open Microsoft.FSharp.Compiler.Range
|
||||||
open Microsoft.FSharp.Compiler.Ast
|
open Microsoft.FSharp.Compiler.Ast
|
||||||
|
|
||||||
[<Sealed>]
|
[<Sealed>]
|
||||||
type FSharpNoteworthyParamInfoLocations(longId : string list,
|
type FSharpNoteworthyParamInfoLocations(longId: string list, longIdRange: range, openParenLocation: pos, tupleEndLocations: pos list, isThereACloseParen: bool, namedParamNames: string list) =
|
||||||
longIdRange: range,
|
|
||||||
openParenLocation : pos,
|
|
||||||
tupleEndLocations : pos list,
|
|
||||||
isThereACloseParen : bool,
|
|
||||||
namedParamNames : string list) =
|
|
||||||
|
|
||||||
let tupleEndLocations = Array.ofList tupleEndLocations
|
let tupleEndLocations = Array.ofList tupleEndLocations
|
||||||
let namedParamNames = Array.ofList namedParamNames
|
let namedParamNames = Array.ofList namedParamNames
|
||||||
|
@ -43,15 +38,20 @@ module internal NoteworthyParamInfoLocationsImpl =
|
||||||
| SynType.LongIdent _ -> true // NOTE: this is not a static constant, but it is a prefix of incomplete code, e.g. "TP<42,Arg3" is a prefix of "TP<42,Arg3=6>" and Arg3 shows up as a LongId
|
| SynType.LongIdent _ -> true // NOTE: this is not a static constant, but it is a prefix of incomplete code, e.g. "TP<42,Arg3" is a prefix of "TP<42,Arg3=6>" and Arg3 shows up as a LongId
|
||||||
| _ -> false
|
| _ -> false
|
||||||
|
|
||||||
let rec digOutIdentFromApp synExpr =
|
/// Dig out an identifier from an expression that used in an application
|
||||||
|
let rec digOutIdentFromFuncExpr synExpr =
|
||||||
// we found it, dig out ident
|
// we found it, dig out ident
|
||||||
match synExpr with
|
match synExpr with
|
||||||
| SynExpr.Ident(id) -> Some ([id.idText], id.idRange)
|
| SynExpr.Ident(id) -> Some ([id.idText], id.idRange)
|
||||||
| SynExpr.LongIdent(_, LongIdentWithDots(lid,_), _, lidRange) -> Some (lid |> List.map textOfId, lidRange)
|
| SynExpr.LongIdent(_, LongIdentWithDots(lid,_), _, lidRange)
|
||||||
| SynExpr.DotGet(_expr, _dotm, LongIdentWithDots(lid,_), range) -> Some (lid |> List.map textOfId, range)
|
| SynExpr.DotGet(_, _, LongIdentWithDots(lid,_), lidRange) -> Some (pathOfLid lid, lidRange)
|
||||||
| SynExpr.TypeApp(synExpr, _, _synTypeList, _commas, _, _, _range) -> digOutIdentFromApp synExpr
|
| SynExpr.TypeApp(synExpr, _, _synTypeList, _commas, _, _, _range) -> digOutIdentFromFuncExpr synExpr
|
||||||
| _ -> None
|
| _ -> None
|
||||||
|
|
||||||
|
type FindResult =
|
||||||
|
| Found of openParen: pos * commasAndCloseParen: (pos * string) list * hasClosedParen: bool
|
||||||
|
| NotFound
|
||||||
|
|
||||||
let digOutIdentFromStaticArg synType =
|
let digOutIdentFromStaticArg synType =
|
||||||
match synType with
|
match synType with
|
||||||
| SynType.StaticConstantNamed(SynType.LongIdent(LongIdentWithDots([id],_)),_,_) -> id.idText
|
| SynType.StaticConstantNamed(SynType.LongIdent(LongIdentWithDots([id],_)),_,_) -> id.idText
|
||||||
|
@ -77,66 +77,65 @@ module internal NoteworthyParamInfoLocationsImpl =
|
||||||
|
|
||||||
let getTypeName(synType) =
|
let getTypeName(synType) =
|
||||||
match synType with
|
match synType with
|
||||||
| SynType.LongIdent(LongIdentWithDots(ids,_)) -> ids |> List.map textOfId
|
| SynType.LongIdent(LongIdentWithDots(ids,_)) -> ids |> pathOfLid
|
||||||
| _ -> [""] // TODO type name for other cases, see also unit test named "ParameterInfo.LocationOfParams.AfterQuicklyTyping.CallConstructorViaLongId.Bug94333"
|
| _ -> [""] // TODO type name for other cases, see also unit test named "ParameterInfo.LocationOfParams.AfterQuicklyTyping.CallConstructorViaLongId.Bug94333"
|
||||||
|
|
||||||
|
let handleSingleArg traverseSynExpr (pos, synExpr, parenRange, rpRangeOpt : _ option) =
|
||||||
|
let inner = traverseSynExpr synExpr
|
||||||
|
match inner with
|
||||||
|
| None ->
|
||||||
|
if AstTraversal.rangeContainsPosEdgesExclusive parenRange pos then
|
||||||
|
Found (parenRange.Start, [(parenRange.End, getNamedParamName synExpr)], rpRangeOpt.IsSome), None
|
||||||
|
else
|
||||||
|
NotFound, None
|
||||||
|
| _ -> NotFound, None
|
||||||
|
|
||||||
// This method returns a tuple, where the second element is
|
// This method returns a tuple, where the second element is
|
||||||
// Some(cache) if the implementation called 'traverseSynExpr expr', then 'cache' is the result of that call
|
// Some(cache) if the implementation called 'traverseSynExpr expr', then 'cache' is the result of that call
|
||||||
// None otherwise
|
// None otherwise
|
||||||
// so that callers can avoid recomputing 'traverseSynExpr expr' if it's already been done. This is very important for perf,
|
// so that callers can avoid recomputing 'traverseSynExpr expr' if it's already been done. This is very important for perf,
|
||||||
// see bug 345385.
|
// see bug 345385.
|
||||||
let rec astFindNoteworthyParamInfoLocationsSynExprExactParen traverseSynExpr pos expr =
|
let rec searchSynArgExpr traverseSynExpr pos expr =
|
||||||
let handleSingleArg(synExpr, parenRange, rpRangeOpt : _ option) =
|
|
||||||
let inner = traverseSynExpr synExpr
|
|
||||||
match inner with
|
|
||||||
| None ->
|
|
||||||
if AstTraversal.rangeContainsPosEdgesExclusive parenRange pos then
|
|
||||||
let r = parenRange.Start, [parenRange.End, getNamedParamName synExpr], rpRangeOpt.IsSome
|
|
||||||
Trace.PrintLine("LanguageServiceParamInfo", fun () -> sprintf "Found single arg paren range %+A from %+A" r expr)
|
|
||||||
Some r, None
|
|
||||||
else
|
|
||||||
None, None
|
|
||||||
| _ -> None, None
|
|
||||||
|
|
||||||
match expr with
|
match expr with
|
||||||
| SynExprParen((SynExpr.Tuple(synExprList, commaRanges, _tupleRange) as synExpr), _lpRange, rpRangeOpt, parenRange) -> // tuple argument
|
| SynExprParen((SynExpr.Tuple(synExprList, commaRanges, _tupleRange) as synExpr), _lpRange, rpRangeOpt, parenRange) -> // tuple argument
|
||||||
let inner = traverseSynExpr synExpr
|
let inner = traverseSynExpr synExpr
|
||||||
match inner with
|
match inner with
|
||||||
| None ->
|
| None ->
|
||||||
if AstTraversal.rangeContainsPosEdgesExclusive parenRange pos then
|
if AstTraversal.rangeContainsPosEdgesExclusive parenRange pos then
|
||||||
let r = parenRange.Start, ((synExprList,commaRanges@[parenRange]) ||> List.map2 (fun e c -> c.End, getNamedParamName e)), rpRangeOpt.IsSome
|
let commasAndCloseParen = ((synExprList,commaRanges@[parenRange]) ||> List.map2 (fun e c -> c.End, getNamedParamName e))
|
||||||
|
let r = Found (parenRange.Start, commasAndCloseParen, rpRangeOpt.IsSome)
|
||||||
Trace.PrintLine("LanguageServiceParamInfo", fun () -> sprintf "Found paren tuple ranges %+A from %+A" r expr)
|
Trace.PrintLine("LanguageServiceParamInfo", fun () -> sprintf "Found paren tuple ranges %+A from %+A" r expr)
|
||||||
Some r, None
|
r, None
|
||||||
else
|
else
|
||||||
None, None
|
NotFound, None
|
||||||
| _ -> None, None
|
| _ -> NotFound, None
|
||||||
|
|
||||||
| SynExprParen(SynExprParen(SynExpr.Tuple(_,_,_),_,_,_) as synExpr, _, rpRangeOpt, parenRange) -> // f((x,y)) is special, single tuple arg
|
| SynExprParen(SynExprParen(SynExpr.Tuple(_,_,_),_,_,_) as synExpr, _, rpRangeOpt, parenRange) -> // f((x,y)) is special, single tuple arg
|
||||||
handleSingleArg(synExpr,parenRange,rpRangeOpt)
|
handleSingleArg traverseSynExpr (pos,synExpr,parenRange,rpRangeOpt)
|
||||||
|
|
||||||
// dig into multiple parens
|
// dig into multiple parens
|
||||||
| SynExprParen(SynExprParen(_,_,_,_) as synExpr, _, _, _parenRange) ->
|
| SynExprParen(SynExprParen(_,_,_,_) as synExpr, _, _, _parenRange) ->
|
||||||
let r,_cacheOpt = astFindNoteworthyParamInfoLocationsSynExprExactParen traverseSynExpr pos synExpr
|
let r,_cacheOpt = searchSynArgExpr traverseSynExpr pos synExpr
|
||||||
r, None
|
r, None
|
||||||
|
|
||||||
| SynExprParen(synExpr, _lpRange, rpRangeOpt, parenRange) -> // single argument
|
| SynExprParen(synExpr, _lpRange, rpRangeOpt, parenRange) -> // single argument
|
||||||
handleSingleArg(synExpr,parenRange,rpRangeOpt)
|
handleSingleArg traverseSynExpr (pos, synExpr, parenRange, rpRangeOpt)
|
||||||
|
|
||||||
| SynExpr.ArbitraryAfterError(_debugStr, range) -> // single argument when e.g. after open paren you hit EOF
|
| SynExpr.ArbitraryAfterError(_debugStr, range) -> // single argument when e.g. after open paren you hit EOF
|
||||||
if AstTraversal.rangeContainsPosEdgesExclusive range pos then
|
if AstTraversal.rangeContainsPosEdgesExclusive range pos then
|
||||||
let r = range.Start, [range.End, null], false
|
let r = Found (range.Start, [range.End, null], false)
|
||||||
Trace.PrintLine("LanguageServiceParamInfo", fun () -> sprintf "Found ArbitraryAfterError range %+A from %+A" r expr)
|
Trace.PrintLine("LanguageServiceParamInfo", fun () -> sprintf "Found ArbitraryAfterError range %+A from %+A" r expr)
|
||||||
Some r, None
|
r, None
|
||||||
else
|
else
|
||||||
None, None
|
NotFound, None
|
||||||
|
|
||||||
| SynExpr.Const(SynConst.Unit, unitRange) ->
|
| SynExpr.Const(SynConst.Unit, unitRange) ->
|
||||||
if AstTraversal.rangeContainsPosEdgesExclusive unitRange pos then
|
if AstTraversal.rangeContainsPosEdgesExclusive unitRange pos then
|
||||||
let r = unitRange.Start, [unitRange.End, null], true
|
let r = Found (unitRange.Start, [unitRange.End, null], true)
|
||||||
Trace.PrintLine("LanguageServiceParamInfo", fun () -> sprintf "Found unit range %+A from %+A" r expr)
|
Trace.PrintLine("LanguageServiceParamInfo", fun () -> sprintf "Found unit range %+A from %+A" r expr)
|
||||||
Some r, None
|
r, None
|
||||||
else
|
else
|
||||||
None, None
|
NotFound, None
|
||||||
|
|
||||||
| e ->
|
| e ->
|
||||||
let inner = traverseSynExpr e
|
let inner = traverseSynExpr e
|
||||||
|
@ -144,41 +143,61 @@ module internal NoteworthyParamInfoLocationsImpl =
|
||||||
| None ->
|
| None ->
|
||||||
if AstTraversal.rangeContainsPosEdgesExclusive e.Range pos then
|
if AstTraversal.rangeContainsPosEdgesExclusive e.Range pos then
|
||||||
// any other expression doesn't start with parens, so if it was the target of an App, then it must be a single argument e.g. "f x"
|
// any other expression doesn't start with parens, so if it was the target of an App, then it must be a single argument e.g. "f x"
|
||||||
let r = e.Range.Start, [e.Range.End, null], false
|
Found (e.Range.Start, [e.Range.End, null], false), Some inner
|
||||||
Trace.PrintLine("LanguageServiceParamInfo", fun () -> sprintf "Found non-parenthesized single arg range %+A from %+A" r expr)
|
|
||||||
Some r, Some inner
|
|
||||||
else
|
else
|
||||||
None, Some inner
|
NotFound, Some inner
|
||||||
| _ -> None, Some inner
|
| _ -> NotFound, Some inner
|
||||||
|
|
||||||
let traverseInput(pos,parseTree) : FSharpNoteworthyParamInfoLocations option =
|
|
||||||
|
|
||||||
|
let traverseInput(pos,parseTree) =
|
||||||
|
|
||||||
AstTraversal.Traverse(pos,parseTree, { new AstTraversal.AstVisitorBase<_>() with
|
AstTraversal.Traverse(pos,parseTree, { new AstTraversal.AstVisitorBase<_>() with
|
||||||
member this.VisitExpr(_path, traverseSynExpr, defaultTraverse, expr) =
|
member this.VisitExpr(_path, traverseSynExpr, defaultTraverse, expr) =
|
||||||
let expr = expr // fix debug locals
|
let expr = expr // fix debug locals
|
||||||
match expr with
|
match expr with
|
||||||
| SynExpr.New(_, synType, synExpr, _range) -> // TODO walk SynType
|
|
||||||
let constrArgsResult,cacheOpt = astFindNoteworthyParamInfoLocationsSynExprExactParen traverseSynExpr pos synExpr
|
// new LID<tyarg1,....,tyargN>(...) and error recovery of these
|
||||||
|
| SynExpr.New(_, synType, synExpr, _range) ->
|
||||||
|
let constrArgsResult,cacheOpt = searchSynArgExpr traverseSynExpr pos synExpr
|
||||||
match constrArgsResult,cacheOpt with
|
match constrArgsResult,cacheOpt with
|
||||||
| Some(parenLoc,args,isThereACloseParen), _ ->
|
| Found(parenLoc,args,isThereACloseParen), _ ->
|
||||||
let typename = getTypeName synType
|
let typeName = getTypeName synType
|
||||||
let r = FSharpNoteworthyParamInfoLocations(typename, synType.Range, parenLoc, args |> List.map fst, isThereACloseParen, args |> List.map snd)
|
Some (FSharpNoteworthyParamInfoLocations(typeName, synType.Range, parenLoc, args |> List.map fst, isThereACloseParen, args |> List.map snd))
|
||||||
Trace.PrintLine("LanguageServiceParamInfo", fun () -> sprintf "Found 'new' call with ranges %+A from %+A" r expr)
|
| NotFound, Some cache ->
|
||||||
Some(r)
|
|
||||||
| None, Some(cache) ->
|
|
||||||
cache
|
cache
|
||||||
| _ ->
|
| _ ->
|
||||||
traverseSynExpr synExpr
|
traverseSynExpr synExpr
|
||||||
| SynExpr.App(_exprAtomicFlag, isInfix, synExpr, synExpr2, _range) ->
|
|
||||||
|
// EXPR< = error recovery of a form of half-written TypeApp
|
||||||
|
| SynExpr.App(_, _, SynExpr.App(_, true, SynExpr.Ident op, synExpr, openm), SynExpr.ArbitraryAfterError _, wholem) when op.idText = "op_LessThan" ->
|
||||||
|
// Look in the function expression
|
||||||
let fResult = traverseSynExpr synExpr
|
let fResult = traverseSynExpr synExpr
|
||||||
match fResult with
|
match fResult with
|
||||||
| Some(_) -> fResult
|
| Some _ -> fResult
|
||||||
| _ ->
|
| _ ->
|
||||||
let xResult,cacheOpt = astFindNoteworthyParamInfoLocationsSynExprExactParen traverseSynExpr pos synExpr2
|
let typeArgsm = mkRange openm.FileName openm.Start wholem.End
|
||||||
|
if AstTraversal.rangeContainsPosEdgesExclusive typeArgsm pos then
|
||||||
|
// We found it, dig out ident
|
||||||
|
match digOutIdentFromFuncExpr synExpr with
|
||||||
|
| Some(lid,lidRange) -> Some (FSharpNoteworthyParamInfoLocations(lid, lidRange, op.idRange.Start, [ wholem.End ], false, []))
|
||||||
|
| None -> None
|
||||||
|
else
|
||||||
|
None
|
||||||
|
|
||||||
|
// EXPR EXPR2
|
||||||
|
| SynExpr.App(_exprAtomicFlag, isInfix, synExpr, synExpr2, _range) ->
|
||||||
|
// Look in the function expression
|
||||||
|
let fResult = traverseSynExpr synExpr
|
||||||
|
match fResult with
|
||||||
|
| Some _ -> fResult
|
||||||
|
| _ ->
|
||||||
|
// Search the argument
|
||||||
|
let xResult,cacheOpt = searchSynArgExpr traverseSynExpr pos synExpr2
|
||||||
match xResult,cacheOpt with
|
match xResult,cacheOpt with
|
||||||
| Some(parenLoc,args,isThereACloseParen),_ ->
|
| Found(parenLoc,args,isThereACloseParen),_ ->
|
||||||
// we found it, dig out ident
|
// We found it, dig out ident
|
||||||
match digOutIdentFromApp synExpr with
|
match digOutIdentFromFuncExpr synExpr with
|
||||||
| Some(lid,lidRange) ->
|
| Some(lid,lidRange) ->
|
||||||
assert(isInfix = (posLt parenLoc lidRange.End))
|
assert(isInfix = (posLt parenLoc lidRange.End))
|
||||||
if isInfix then
|
if isInfix then
|
||||||
|
@ -187,28 +206,20 @@ module internal NoteworthyParamInfoLocationsImpl =
|
||||||
Trace.PrintLine("LanguageServiceParamInfo", fun () -> sprintf "Found apparent infix operator, ignoring dug-out ident from %+A" expr)
|
Trace.PrintLine("LanguageServiceParamInfo", fun () -> sprintf "Found apparent infix operator, ignoring dug-out ident from %+A" expr)
|
||||||
None
|
None
|
||||||
else
|
else
|
||||||
let r = FSharpNoteworthyParamInfoLocations(lid, lidRange, parenLoc, args |> List.map fst, isThereACloseParen, args |> List.map snd)
|
Some (FSharpNoteworthyParamInfoLocations(lid, lidRange, parenLoc, args |> List.map fst, isThereACloseParen, args |> List.map snd))
|
||||||
Trace.PrintLine("LanguageServiceParamInfo", fun () -> sprintf "Found app with ranges %+A from %+A" r expr)
|
| None -> None
|
||||||
Some r
|
| NotFound, Some cache -> cache
|
||||||
| x ->
|
|
||||||
ignore(x)
|
|
||||||
None
|
|
||||||
| None, Some(cache) -> cache
|
|
||||||
| _ -> traverseSynExpr synExpr2
|
| _ -> traverseSynExpr synExpr2
|
||||||
|
|
||||||
|
// ID<tyarg1,....,tyargN> and error recovery of these
|
||||||
| SynExpr.TypeApp(synExpr, openm, tyArgs, commas, closemOpt, _, wholem) as seta ->
|
| SynExpr.TypeApp(synExpr, openm, tyArgs, commas, closemOpt, _, wholem) as seta ->
|
||||||
match traverseSynExpr synExpr with
|
match traverseSynExpr synExpr with
|
||||||
| Some _ as r -> r
|
| Some _ as r -> r
|
||||||
| None ->
|
| None ->
|
||||||
let typeArgsm = mkRange openm.FileName openm.Start wholem.End
|
let typeArgsm = mkRange openm.FileName openm.Start wholem.End
|
||||||
if AstTraversal.rangeContainsPosEdgesExclusive typeArgsm pos && tyArgs |> List.forall isStaticArg then
|
if AstTraversal.rangeContainsPosEdgesExclusive typeArgsm pos && tyArgs |> List.forall isStaticArg then
|
||||||
let r = FSharpNoteworthyParamInfoLocations(["dummy"], // TODO synExpr, but LongId?
|
let commasAndCloseParen = [ for c in commas -> c.End ] @ [ wholem.End ]
|
||||||
synExpr.Range,
|
let r = FSharpNoteworthyParamInfoLocations(["dummy"], synExpr.Range, openm.Start, commasAndCloseParen, closemOpt.IsSome, tyArgs |> List.map digOutIdentFromStaticArg)
|
||||||
openm.Start,
|
|
||||||
[ for c in commas -> c.End
|
|
||||||
yield wholem.End ],
|
|
||||||
closemOpt.IsSome,
|
|
||||||
tyArgs |> List.map digOutIdentFromStaticArg)
|
|
||||||
Trace.PrintLine("LanguageServiceParamInfo", fun () -> sprintf "Found SynExpr.TypeApp with ranges %+A from %+A" r seta)
|
Trace.PrintLine("LanguageServiceParamInfo", fun () -> sprintf "Found SynExpr.TypeApp with ranges %+A from %+A" r seta)
|
||||||
Some r
|
Some r
|
||||||
else
|
else
|
||||||
|
@ -222,13 +233,8 @@ module internal NoteworthyParamInfoLocationsImpl =
|
||||||
let lidm = lidwd.Range
|
let lidm = lidwd.Range
|
||||||
let betweenTheBrackets = mkRange wholem.FileName openm.Start wholem.End
|
let betweenTheBrackets = mkRange wholem.FileName openm.Start wholem.End
|
||||||
if AstTraversal.rangeContainsPosEdgesExclusive betweenTheBrackets pos && args |> List.forall isStaticArg then
|
if AstTraversal.rangeContainsPosEdgesExclusive betweenTheBrackets pos && args |> List.forall isStaticArg then
|
||||||
let r = FSharpNoteworthyParamInfoLocations(lid |> List.map textOfId, lidm, openm.Start,
|
let commasAndCloseParen = [ for c in commas -> c.End ] @ [ wholem.End ]
|
||||||
[ for c in commas -> c.End
|
Some (FSharpNoteworthyParamInfoLocations(pathOfLid lid, lidm, openm.Start, commasAndCloseParen, closemOpt.IsSome, args |> List.map digOutIdentFromStaticArg))
|
||||||
yield wholem.End ],
|
|
||||||
closemOpt.IsSome,
|
|
||||||
args |> List.map digOutIdentFromStaticArg)
|
|
||||||
Trace.PrintLine("LanguageServiceParamInfo", fun () -> sprintf "Found type abbrev ty-app with ranges %+A from %+A" r tyAbbrevRhs)
|
|
||||||
Some r
|
|
||||||
else
|
else
|
||||||
None
|
None
|
||||||
| _ ->
|
| _ ->
|
||||||
|
@ -241,15 +247,14 @@ module internal NoteworthyParamInfoLocationsImpl =
|
||||||
let inheritm = mkRange m.FileName m.Start m.End
|
let inheritm = mkRange m.FileName m.Start m.End
|
||||||
if AstTraversal.rangeContainsPosEdgesExclusive inheritm pos then
|
if AstTraversal.rangeContainsPosEdgesExclusive inheritm pos then
|
||||||
// inherit ty(expr) --- treat it like an application (constructor call)
|
// inherit ty(expr) --- treat it like an application (constructor call)
|
||||||
let xResult,_cacheOpt = astFindNoteworthyParamInfoLocationsSynExprExactParen defaultTraverse pos expr
|
let xResult,_cacheOpt = searchSynArgExpr defaultTraverse pos expr
|
||||||
match xResult with
|
match xResult with
|
||||||
| Some(parenLoc,args,isThereACloseParen) ->
|
| Found(parenLoc,args,isThereACloseParen) ->
|
||||||
// we found it, dig out ident
|
// we found it, dig out ident
|
||||||
let typename = getTypeName ty
|
let typeName = getTypeName ty
|
||||||
let r = FSharpNoteworthyParamInfoLocations(typename, ty.Range, parenLoc, args |> List.map fst, isThereACloseParen, args |> List.map snd)
|
let r = FSharpNoteworthyParamInfoLocations(typeName, ty.Range, parenLoc, args |> List.map fst, isThereACloseParen, args |> List.map snd)
|
||||||
Trace.PrintLine("LanguageServiceParamInfo", fun () -> sprintf "Found app with ranges %+A from %+A" r expr)
|
|
||||||
Some r
|
Some r
|
||||||
| _ -> None
|
| NotFound -> None
|
||||||
else None
|
else None
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
|
@ -16,9 +16,12 @@ type internal FSharpNoteworthyParamInfoLocations =
|
||||||
member LongIdStartLocation : pos
|
member LongIdStartLocation : pos
|
||||||
member LongIdEndLocation : pos
|
member LongIdEndLocation : pos
|
||||||
member OpenParenLocation : pos
|
member OpenParenLocation : pos
|
||||||
member TupleEndLocations : pos[] // locations of commas and close parenthesis (or, last char of last arg, if no final close parenthesis)
|
/// locations of commas and close parenthesis (or, last char of last arg, if no final close parenthesis)
|
||||||
member IsThereACloseParen : bool // false if either this is a call without parens "f x" or the parser recovered as in "f(x,y"
|
member TupleEndLocations : pos[]
|
||||||
member NamedParamNames : string[] // null, or a name if an actual named parameter; f(0,a=4,?b=None) would be [|null;"a";"b"|]
|
/// false if either this is a call without parens "f x" or the parser recovered as in "f(x,y"
|
||||||
|
member IsThereACloseParen : bool
|
||||||
|
/// empty or a name if an actual named parameter; f(0,a=4,?b=None) would be [|null;"a";"b"|]
|
||||||
|
member NamedParamNames : string[]
|
||||||
|
|
||||||
static member Find : pos * Ast.ParsedInput -> FSharpNoteworthyParamInfoLocations option
|
static member Find : pos * Ast.ParsedInput -> FSharpNoteworthyParamInfoLocations option
|
||||||
|
|
||||||
|
|
|
@ -609,7 +609,7 @@ module UntypedParseImpl =
|
||||||
|
|
||||||
type TS = AstTraversal.TraverseStep
|
type TS = AstTraversal.TraverseStep
|
||||||
|
|
||||||
/// try to determine completion context for the given pair (row, columns)
|
/// Try to determine completion context for the given pair (row, columns)
|
||||||
let TryGetCompletionContext (pos, untypedParseOpt: FSharpParseFileResults option) : CompletionContext option =
|
let TryGetCompletionContext (pos, untypedParseOpt: FSharpParseFileResults option) : CompletionContext option =
|
||||||
let parsedInputOpt =
|
let parsedInputOpt =
|
||||||
match untypedParseOpt with
|
match untypedParseOpt with
|
||||||
|
@ -675,7 +675,7 @@ module UntypedParseImpl =
|
||||||
| false, false, true -> Struct
|
| false, false, true -> Struct
|
||||||
| _ -> Invalid
|
| _ -> Invalid
|
||||||
|
|
||||||
let getCompletionContextForInheritSynMember ((ComponentInfo(synAttributes, _, _, _,_, _, _, _)), typeDefnKind : SynTypeDefnKind, completionPath) =
|
let GetCompletionContextForInheritSynMember ((ComponentInfo(synAttributes, _, _, _,_, _, _, _)), typeDefnKind : SynTypeDefnKind, completionPath) =
|
||||||
|
|
||||||
let success k = Some (Inherit (k, completionPath))
|
let success k = Some (Inherit (k, completionPath))
|
||||||
|
|
||||||
|
@ -863,7 +863,7 @@ module UntypedParseImpl =
|
||||||
match synType with
|
match synType with
|
||||||
| SynType.LongIdent lidwd ->
|
| SynType.LongIdent lidwd ->
|
||||||
match parseLid lidwd with
|
match parseLid lidwd with
|
||||||
| Some (completionPath) -> getCompletionContextForInheritSynMember (componentInfo, typeDefnKind, completionPath)
|
| Some (completionPath) -> GetCompletionContextForInheritSynMember (componentInfo, typeDefnKind, completionPath)
|
||||||
| None -> Some (CompletionContext.Invalid) // A $ .B -> no completion list
|
| None -> Some (CompletionContext.Invalid) // A $ .B -> no completion list
|
||||||
| _ -> None }
|
| _ -> None }
|
||||||
AstTraversal.Traverse(pos, pt, walker)
|
AstTraversal.Traverse(pos, pt, walker)
|
||||||
|
|
|
@ -420,11 +420,11 @@ and FSharpEntity(cenv:cenv, entity:EntityRef) =
|
||||||
let fsMeth = FSMeth (cenv.g, entityTy, v, None)
|
let fsMeth = FSMeth (cenv.g, entityTy, v, None)
|
||||||
let item =
|
let item =
|
||||||
if fsMeth.IsConstructor then Item.CtorGroup (fsMeth.DisplayName, [fsMeth])
|
if fsMeth.IsConstructor then Item.CtorGroup (fsMeth.DisplayName, [fsMeth])
|
||||||
else Item.MethodGroup (fsMeth.DisplayName, [fsMeth])
|
else Item.MethodGroup (fsMeth.DisplayName, [fsMeth], None)
|
||||||
yield FSharpMemberOrFunctionOrValue(cenv, M fsMeth, item)
|
yield FSharpMemberOrFunctionOrValue(cenv, M fsMeth, item)
|
||||||
else
|
else
|
||||||
for minfo in GetImmediateIntrinsicMethInfosOfType (None, AccessibleFromSomeFSharpCode) cenv.g cenv.amap range0 entityTy do
|
for minfo in GetImmediateIntrinsicMethInfosOfType (None, AccessibleFromSomeFSharpCode) cenv.g cenv.amap range0 entityTy do
|
||||||
yield FSharpMemberOrFunctionOrValue(cenv, M minfo, Item.MethodGroup (minfo.DisplayName,[minfo]))
|
yield FSharpMemberOrFunctionOrValue(cenv, M minfo, Item.MethodGroup (minfo.DisplayName,[minfo],None))
|
||||||
let props = GetImmediateIntrinsicPropInfosOfType (None, AccessibleFromSomeFSharpCode) cenv.g cenv.amap range0 entityTy
|
let props = GetImmediateIntrinsicPropInfosOfType (None, AccessibleFromSomeFSharpCode) cenv.g cenv.amap range0 entityTy
|
||||||
let events = cenv.infoReader.GetImmediateIntrinsicEventsOfType (None, AccessibleFromSomeFSharpCode, range0, entityTy)
|
let events = cenv.infoReader.GetImmediateIntrinsicEventsOfType (None, AccessibleFromSomeFSharpCode, range0, entityTy)
|
||||||
for pinfo in props do
|
for pinfo in props do
|
||||||
|
@ -1117,11 +1117,11 @@ and FSharpMemberOrFunctionOrValue(cenv, d:FSharpMemberOrValData, item) =
|
||||||
let nm = (match v with VRefNonLocal n -> n.ItemKey.PartialKey.LogicalName | _ -> "<local>")
|
let nm = (match v with VRefNonLocal n -> n.ItemKey.PartialKey.LogicalName | _ -> "<local>")
|
||||||
invalidOp (sprintf "The value or member '%s' does not exist or is in an unresolved assembly." nm)
|
invalidOp (sprintf "The value or member '%s' does not exist or is in an unresolved assembly." nm)
|
||||||
|
|
||||||
let mkMethSym minfo = FSharpMemberOrFunctionOrValue(cenv, M minfo, Item.MethodGroup (minfo.DisplayName,[minfo]))
|
let mkMethSym minfo = FSharpMemberOrFunctionOrValue(cenv, M minfo, Item.MethodGroup (minfo.DisplayName, [minfo], None))
|
||||||
let mkEventSym einfo = FSharpMemberOrFunctionOrValue(cenv, E einfo, Item.Event einfo)
|
let mkEventSym einfo = FSharpMemberOrFunctionOrValue(cenv, E einfo, Item.Event einfo)
|
||||||
|
|
||||||
new (cenv, vref) = FSharpMemberFunctionOrValue(cenv, V vref, Item.Value vref)
|
new (cenv, vref) = FSharpMemberFunctionOrValue(cenv, V vref, Item.Value vref)
|
||||||
new (cenv, minfo) = FSharpMemberFunctionOrValue(cenv, M minfo, Item.MethodGroup(minfo.LogicalName, [minfo]))
|
new (cenv, minfo) = FSharpMemberFunctionOrValue(cenv, M minfo, Item.MethodGroup(minfo.LogicalName, [minfo], None))
|
||||||
|
|
||||||
member __.IsUnresolved =
|
member __.IsUnresolved =
|
||||||
isUnresolved()
|
isUnresolved()
|
||||||
|
@ -1137,7 +1137,7 @@ and FSharpMemberOrFunctionOrValue(cenv, d:FSharpMemberOrValData, item) =
|
||||||
match d with
|
match d with
|
||||||
| M m ->
|
| M m ->
|
||||||
match item with
|
match item with
|
||||||
| Item.MethodGroup (_name, methodInfos) ->
|
| Item.MethodGroup (_name, methodInfos, _) ->
|
||||||
let methods =
|
let methods =
|
||||||
if matchParameterNumber then
|
if matchParameterNumber then
|
||||||
methodInfos
|
methodInfos
|
||||||
|
@ -2071,7 +2071,7 @@ type FSharpSymbol with
|
||||||
| Item.Property(_,pinfo :: _) ->
|
| Item.Property(_,pinfo :: _) ->
|
||||||
FSharpMemberOrFunctionOrValue(cenv, P pinfo, item) :> _
|
FSharpMemberOrFunctionOrValue(cenv, P pinfo, item) :> _
|
||||||
|
|
||||||
| Item.MethodGroup(_,minfo :: _) ->
|
| Item.MethodGroup(_,minfo :: _, _) ->
|
||||||
FSharpMemberOrFunctionOrValue(cenv, M minfo, item) :> _
|
FSharpMemberOrFunctionOrValue(cenv, M minfo, item) :> _
|
||||||
|
|
||||||
| Item.CtorGroup(_,cinfo :: _) ->
|
| Item.CtorGroup(_,cinfo :: _) ->
|
||||||
|
@ -2117,7 +2117,7 @@ type FSharpSymbol with
|
||||||
| Item.UnqualifiedType []
|
| Item.UnqualifiedType []
|
||||||
| Item.ModuleOrNamespaces []
|
| Item.ModuleOrNamespaces []
|
||||||
| Item.Property (_,[])
|
| Item.Property (_,[])
|
||||||
| Item.MethodGroup (_,[])
|
| Item.MethodGroup (_,[],_)
|
||||||
| Item.CtorGroup (_,[])
|
| Item.CtorGroup (_,[])
|
||||||
// These cases cover misc. corned cases (non-symbol types)
|
// These cases cover misc. corned cases (non-symbol types)
|
||||||
| Item.Types _
|
| Item.Types _
|
||||||
|
|
|
@ -143,19 +143,77 @@ module internal Params =
|
||||||
(args,argsL) ||> List.zip |> List.map mkParam
|
(args,argsL) ||> List.zip |> List.map mkParam
|
||||||
|
|
||||||
#if EXTENSIONTYPING
|
#if EXTENSIONTYPING
|
||||||
let (|ItemIsTypeWithStaticArguments|_|) g item =
|
|
||||||
|
let (|ItemIsProvidedType|_|) g item =
|
||||||
match item with
|
match item with
|
||||||
| Item.Types(_name,tys) ->
|
| Item.Types(_name,tys) ->
|
||||||
match tys with
|
match tys with
|
||||||
| [Microsoft.FSharp.Compiler.Tastops.AppTy g (tyconRef,_typeInst)] ->
|
| [AppTy g (tyconRef,_typeInst)] ->
|
||||||
if tyconRef.IsProvidedErasedTycon || tyconRef.IsProvidedGeneratedTycon then
|
if tyconRef.IsProvidedErasedTycon || tyconRef.IsProvidedGeneratedTycon then
|
||||||
Some tyconRef
|
Some tyconRef
|
||||||
else
|
else
|
||||||
None
|
None
|
||||||
| _ -> None
|
| _ -> None
|
||||||
| _ -> None
|
| _ -> None
|
||||||
|
|
||||||
|
let (|ItemIsProvidedTypeWithStaticArguments|_|) m g item =
|
||||||
|
match item with
|
||||||
|
| Item.Types(_name,tys) ->
|
||||||
|
match tys with
|
||||||
|
| [AppTy g (tyconRef,_typeInst)] ->
|
||||||
|
if tyconRef.IsProvidedErasedTycon || tyconRef.IsProvidedGeneratedTycon then
|
||||||
|
let typeBeforeArguments =
|
||||||
|
match tyconRef.TypeReprInfo with
|
||||||
|
| TProvidedTypeExtensionPoint info -> info.ProvidedType
|
||||||
|
| _ -> failwith "unreachable"
|
||||||
|
let staticParameters = typeBeforeArguments.PApplyWithProvider((fun (typeBeforeArguments,provider) -> typeBeforeArguments.GetStaticParameters(provider)), range=m)
|
||||||
|
let staticParameters = staticParameters.PApplyArray(id, "GetStaticParameters",m)
|
||||||
|
Some staticParameters
|
||||||
|
else
|
||||||
|
None
|
||||||
|
| _ -> None
|
||||||
|
| _ -> None
|
||||||
|
|
||||||
|
|
||||||
|
let (|ItemIsProvidedMethodWithStaticArguments|_|) item =
|
||||||
|
match item with
|
||||||
|
// Prefer the static parameters from the uninstantiated method info
|
||||||
|
| Item.MethodGroup(_,_,Some minfo) ->
|
||||||
|
match minfo.ProvidedStaticParameterInfo with
|
||||||
|
| Some (_,staticParameters) -> Some staticParameters
|
||||||
|
| _ -> None
|
||||||
|
| Item.MethodGroup(_,[minfo],_) ->
|
||||||
|
match minfo.ProvidedStaticParameterInfo with
|
||||||
|
| Some (_,staticParameters) -> Some staticParameters
|
||||||
|
| _ -> None
|
||||||
|
| _ -> None
|
||||||
|
|
||||||
|
let (|ItemIsWithStaticArguments|_|) m g item =
|
||||||
|
match item with
|
||||||
|
| ItemIsProvidedTypeWithStaticArguments m g staticParameters -> Some staticParameters
|
||||||
|
| ItemIsProvidedMethodWithStaticArguments staticParameters -> Some staticParameters
|
||||||
|
| _ -> None
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
let StaticParamsOfItem (infoReader:InfoReader) m denv d =
|
||||||
|
let amap = infoReader.amap
|
||||||
|
let g = infoReader.g
|
||||||
|
match d with
|
||||||
|
#if EXTENSIONTYPING
|
||||||
|
| ItemIsWithStaticArguments m g staticParameters ->
|
||||||
|
staticParameters
|
||||||
|
|> Array.map (fun sp ->
|
||||||
|
let typ = Import.ImportProvidedType amap m (sp.PApply((fun x -> x.ParameterType),m))
|
||||||
|
let spKind = NicePrint.stringOfTy denv typ
|
||||||
|
let spName = sp.PUntaint((fun sp -> sp.Name), m)
|
||||||
|
let spOpt = sp.PUntaint((fun sp -> sp.IsOptional), m)
|
||||||
|
FSharpMethodGroupItemParameter(
|
||||||
|
name = spName,
|
||||||
|
canonicalTypeTextForSorting = spKind,
|
||||||
|
display = sprintf "%s%s: %s" (if spOpt then "?" else "") spName spKind))
|
||||||
|
#endif
|
||||||
|
| _ -> [| |]
|
||||||
|
|
||||||
let rec ParamsOfItem (infoReader:InfoReader) m denv d =
|
let rec ParamsOfItem (infoReader:InfoReader) m denv d =
|
||||||
let amap = infoReader.amap
|
let amap = infoReader.amap
|
||||||
let g = infoReader.g
|
let g = infoReader.g
|
||||||
|
@ -207,7 +265,7 @@ module internal Params =
|
||||||
let rty = pinfo.GetPropertyType(amap,m)
|
let rty = pinfo.GetPropertyType(amap,m)
|
||||||
ParamsOfParamDatas g denv paramDatas rty
|
ParamsOfParamDatas g denv paramDatas rty
|
||||||
| Item.CtorGroup(_,(minfo :: _))
|
| Item.CtorGroup(_,(minfo :: _))
|
||||||
| Item.MethodGroup(_,(minfo :: _)) ->
|
| Item.MethodGroup(_,(minfo :: _),_) ->
|
||||||
let paramDatas = minfo.GetParamDatas(amap, m, minfo.FormalMethodInst) |> List.head
|
let paramDatas = minfo.GetParamDatas(amap, m, minfo.FormalMethodInst) |> List.head
|
||||||
let rty = minfo.GetFSharpReturnTy(amap, m, minfo.FormalMethodInst)
|
let rty = minfo.GetFSharpReturnTy(amap, m, minfo.FormalMethodInst)
|
||||||
ParamsOfParamDatas g denv paramDatas rty
|
ParamsOfParamDatas g denv paramDatas rty
|
||||||
|
@ -229,39 +287,19 @@ module internal Params =
|
||||||
| Item.DelegateCtor delty ->
|
| Item.DelegateCtor delty ->
|
||||||
let (SigOfFunctionForDelegate(_, _, _, fty)) = GetSigOfFunctionForDelegate infoReader delty m AccessibleFromSomeFSharpCode
|
let (SigOfFunctionForDelegate(_, _, _, fty)) = GetSigOfFunctionForDelegate infoReader delty m AccessibleFromSomeFSharpCode
|
||||||
ParamsOfParamDatas g denv [ParamData(false, false, NotOptional, None, ReflectedArgInfo.None, fty)] delty
|
ParamsOfParamDatas g denv [ParamData(false, false, NotOptional, None, ReflectedArgInfo.None, fty)] delty
|
||||||
#if EXTENSIONTYPING
|
|
||||||
| ItemIsTypeWithStaticArguments g tyconRef ->
|
|
||||||
// similar code to TcProvidedTypeAppToStaticConstantArgs
|
|
||||||
let typeBeforeArguments =
|
|
||||||
match tyconRef.TypeReprInfo with
|
|
||||||
| TProvidedTypeExtensionPoint info -> info.ProvidedType
|
|
||||||
| _ -> failwith "unreachable"
|
|
||||||
let staticParameters = typeBeforeArguments.PApplyWithProvider((fun (typeBeforeArguments,provider) -> typeBeforeArguments.GetStaticParameters(provider)), range=m)
|
|
||||||
let staticParameters = staticParameters.PApplyArray(id, "GetStaticParameters",m)
|
|
||||||
staticParameters
|
|
||||||
|> Array.map (fun sp ->
|
|
||||||
let typ = Import.ImportProvidedType amap m (sp.PApply((fun x -> x.ParameterType),m))
|
|
||||||
let spKind = NicePrint.stringOfTy denv typ
|
|
||||||
let spName = sp.PUntaint((fun sp -> sp.Name), m)
|
|
||||||
let spOpt = sp.PUntaint((fun sp -> sp.IsOptional), m)
|
|
||||||
FSharpMethodGroupItemParameter(
|
|
||||||
name = spName,
|
|
||||||
canonicalTypeTextForSorting = spKind,
|
|
||||||
display = sprintf "%s%s: %s" (if spOpt then "?" else "") spName spKind))
|
|
||||||
|> Array.toList
|
|
||||||
#endif
|
|
||||||
| _ -> []
|
| _ -> []
|
||||||
|
|
||||||
|
|
||||||
/// A single method for Intellisense completion
|
/// A single method for Intellisense completion
|
||||||
[<Sealed; NoEquality; NoComparison>]
|
[<Sealed; NoEquality; NoComparison>]
|
||||||
// Note: instances of this type do not hold any references to any compiler resources.
|
// Note: instances of this type do not hold any references to any compiler resources.
|
||||||
type FSharpMethodGroupItem(description: FSharpToolTipText, typeText: string, parameters: FSharpMethodGroupItemParameter[], isStaticArguments: bool) =
|
type FSharpMethodGroupItem(description: FSharpToolTipText, typeText: string, parameters: FSharpMethodGroupItemParameter[], hasParameters: bool, staticParameters: FSharpMethodGroupItemParameter[]) =
|
||||||
member __.Description = description
|
member __.Description = description
|
||||||
member __.TypeText = typeText
|
member __.TypeText = typeText
|
||||||
member __.Parameters = parameters
|
member __.Parameters = parameters
|
||||||
// is this not really a method, but actually a static arguments list, like TP<42,"foo"> ?
|
member __.HasParameters = hasParameters
|
||||||
member __.IsStaticArguments = isStaticArguments
|
// Does the type name or method support a static arguments list, like TP<42,"foo"> or conn.CreateCommand<42, "foo">(arg1, arg2)?
|
||||||
|
member __.StaticParameters = staticParameters
|
||||||
|
|
||||||
|
|
||||||
/// A table of methods for Intellisense completion
|
/// A table of methods for Intellisense completion
|
||||||
|
@ -282,7 +320,7 @@ type FSharpMethodGroup( name: string, unsortedMethods: FSharpMethodGroupItem[] )
|
||||||
|> Array.map (fun meth ->
|
|> Array.map (fun meth ->
|
||||||
let parms = meth.Parameters
|
let parms = meth.Parameters
|
||||||
if parms.Length = 1 && parms.[0].CanonicalTypeTextForSorting="Microsoft.FSharp.Core.Unit" then
|
if parms.Length = 1 && parms.[0].CanonicalTypeTextForSorting="Microsoft.FSharp.Core.Unit" then
|
||||||
FSharpMethodGroupItem(meth.Description,meth.TypeText,[||],meth.IsStaticArguments)
|
FSharpMethodGroupItem(meth.Description,meth.TypeText,[||],true,meth.StaticParameters)
|
||||||
else
|
else
|
||||||
meth)
|
meth)
|
||||||
// Fix the order of methods, to be stable for unit testing.
|
// Fix the order of methods, to be stable for unit testing.
|
||||||
|
@ -304,7 +342,6 @@ type FSharpMethodGroup( name: string, unsortedMethods: FSharpMethodGroupItem[] )
|
||||||
#endif
|
#endif
|
||||||
let items =
|
let items =
|
||||||
match item with
|
match item with
|
||||||
| Item.MethodGroup(nm,minfos) -> List.map (fun minfo -> Item.MethodGroup(nm,[minfo])) minfos
|
|
||||||
| Item.CtorGroup(nm,cinfos) -> List.map (fun minfo -> Item.CtorGroup(nm,[minfo])) cinfos
|
| Item.CtorGroup(nm,cinfos) -> List.map (fun minfo -> Item.CtorGroup(nm,[minfo])) cinfos
|
||||||
| Item.FakeInterfaceCtor _
|
| Item.FakeInterfaceCtor _
|
||||||
| Item.DelegateCtor _ -> [item]
|
| Item.DelegateCtor _ -> [item]
|
||||||
|
@ -323,8 +360,9 @@ type FSharpMethodGroup( name: string, unsortedMethods: FSharpMethodGroupItem[] )
|
||||||
let pinfo = List.head pinfos
|
let pinfo = List.head pinfos
|
||||||
if pinfo.IsIndexer then [item] else []
|
if pinfo.IsIndexer then [item] else []
|
||||||
#if EXTENSIONTYPING
|
#if EXTENSIONTYPING
|
||||||
| Params.ItemIsTypeWithStaticArguments g _ -> [item] // we pretend that provided-types-with-static-args are method-like in order to get ParamInfo for them
|
| Params.ItemIsWithStaticArguments m g _ -> [item] // we pretend that provided-types-with-static-args are method-like in order to get ParamInfo for them
|
||||||
#endif
|
#endif
|
||||||
|
| Item.MethodGroup(nm,minfos,orig) -> minfos |> List.map (fun minfo -> Item.MethodGroup(nm,[minfo],orig))
|
||||||
| Item.CustomOperation(_name, _helpText, _minfo) -> [item]
|
| Item.CustomOperation(_name, _helpText, _minfo) -> [item]
|
||||||
| Item.TypeVar _ -> []
|
| Item.TypeVar _ -> []
|
||||||
| Item.CustomBuilder _ -> []
|
| Item.CustomBuilder _ -> []
|
||||||
|
@ -333,10 +371,11 @@ type FSharpMethodGroup( name: string, unsortedMethods: FSharpMethodGroupItem[] )
|
||||||
let methods =
|
let methods =
|
||||||
items |> Array.ofList |> Array.map (fun item ->
|
items |> Array.ofList |> Array.map (fun item ->
|
||||||
FSharpMethodGroupItem(
|
FSharpMethodGroupItem(
|
||||||
description=FSharpToolTipText [FormatDescriptionOfItem true infoReader m denv item],
|
description = FSharpToolTipText [FormatDescriptionOfItem true infoReader m denv item],
|
||||||
typeText= (FormatReturnTypeOfItem infoReader m denv item),
|
typeText = FormatReturnTypeOfItem infoReader m denv item,
|
||||||
parameters = Array.ofList (Params.ParamsOfItem infoReader m denv item),
|
parameters = (Params.ParamsOfItem infoReader m denv item |> Array.ofList),
|
||||||
isStaticArguments = (match item with | Item.Types _ -> true | _ -> false)
|
hasParameters = (match item with Params.ItemIsProvidedTypeWithStaticArguments m g _ -> false | _ -> true),
|
||||||
|
staticParameters = Params.StaticParamsOfItem infoReader m denv item
|
||||||
))
|
))
|
||||||
#if FX_ATLEAST_40
|
#if FX_ATLEAST_40
|
||||||
methodOverloadsCache.Add(item, methods)
|
methodOverloadsCache.Add(item, methods)
|
||||||
|
@ -539,8 +578,11 @@ type TypeCheckInfo
|
||||||
Trace.PrintLine("CompilerServicesVerbose", fun () -> sprintf "GetPreciseItemsFromNameResolution: endOfNamesPos = %s\n" (stringOfPos endOfNamesPos))
|
Trace.PrintLine("CompilerServicesVerbose", fun () -> sprintf "GetPreciseItemsFromNameResolution: endOfNamesPos = %s\n" (stringOfPos endOfNamesPos))
|
||||||
|
|
||||||
let quals =
|
let quals =
|
||||||
(match resolveOverloads with ResolveOverloads.Yes -> sResolutions.CapturedNameResolutions | ResolveOverloads.No -> sResolutions.CapturedMethodGroupResolutions)
|
match resolveOverloads with
|
||||||
|> ResizeArray.filter (fun cnr -> posEq cnr.Pos endOfNamesPos)
|
| ResolveOverloads.Yes -> sResolutions.CapturedNameResolutions
|
||||||
|
| ResolveOverloads.No -> sResolutions.CapturedMethodGroupResolutions
|
||||||
|
|
||||||
|
let quals = quals |> ResizeArray.filter (fun cnr -> posEq cnr.Pos endOfNamesPos)
|
||||||
|
|
||||||
quals
|
quals
|
||||||
|
|
||||||
|
@ -623,7 +665,7 @@ type TypeCheckInfo
|
||||||
let props = ResolveCompletionsInType ncenv nenv ResolveCompletionTargets.SettablePropertiesAndFields m ad false ctor.EnclosingType
|
let props = ResolveCompletionsInType ncenv nenv ResolveCompletionTargets.SettablePropertiesAndFields m ad false ctor.EnclosingType
|
||||||
let parameters = CollectParameters ctors amap m
|
let parameters = CollectParameters ctors amap m
|
||||||
Some (denv, m, props @ parameters)
|
Some (denv, m, props @ parameters)
|
||||||
| CNR(_, Item.MethodGroup(_, methods), _, denv, nenv, ad, m)::_ ->
|
| CNR(_, Item.MethodGroup(_, methods, _), _, denv, nenv, ad, m)::_ ->
|
||||||
let props =
|
let props =
|
||||||
methods
|
methods
|
||||||
|> List.collect (fun meth ->
|
|> List.collect (fun meth ->
|
||||||
|
@ -728,7 +770,7 @@ type TypeCheckInfo
|
||||||
else GetPreciseCompletionListFromExprTypingsResult.None
|
else GetPreciseCompletionListFromExprTypingsResult.None
|
||||||
|
|
||||||
/// Find items in the best naming environment.
|
/// Find items in the best naming environment.
|
||||||
let GetEnvironmentLookupResolutions(cursorPos,plid,filterCtors,showObsolete) =
|
let GetEnvironmentLookupResolutions(cursorPos, plid, filterCtors, showObsolete) =
|
||||||
let (nenv,ad),m = GetBestEnvForPos cursorPos
|
let (nenv,ad),m = GetBestEnvForPos cursorPos
|
||||||
let items = NameResolution.ResolvePartialLongIdent ncenv nenv (ConstraintSolver.IsApplicableMethApprox g amap m) m ad plid showObsolete
|
let items = NameResolution.ResolvePartialLongIdent ncenv nenv (ConstraintSolver.IsApplicableMethApprox g amap m) m ad plid showObsolete
|
||||||
let items = items |> RemoveDuplicateItems g
|
let items = items |> RemoveDuplicateItems g
|
||||||
|
@ -753,75 +795,68 @@ type TypeCheckInfo
|
||||||
//
|
//
|
||||||
// The overall aim is to resolve as accurately as possible based on what we know from type inference
|
// The overall aim is to resolve as accurately as possible based on what we know from type inference
|
||||||
|
|
||||||
let GetDeclItemsForNamesAtPosition(parseResultsOpt : FSharpParseFileResults option,
|
let GetBaseClassCandidates = function
|
||||||
origLongIdentOpt: string list option, residueOpt:string option, line:int, lineStr:string, colAtEndOfNamesAndResidue, filterCtors, resolveOverloads, hasTextChangedSinceLastTypecheck: (obj * range -> bool)) =
|
| Item.ModuleOrNamespaces _ -> true
|
||||||
|
| Item.Types(_, ty::_) when (isClassTy g ty) && not (isSealedTy g ty) -> true
|
||||||
|
| _ -> false
|
||||||
|
|
||||||
let GetBaseClassCandidates (denv : DisplayEnv) = function
|
let GetInterfaceCandidates = function
|
||||||
| Item.ModuleOrNamespaces _ -> true
|
| Item.ModuleOrNamespaces _ -> true
|
||||||
| Item.Types(_, ty::_) when (isClassTy denv.g ty) && not (isSealedTy denv.g ty) -> true
|
| Item.Types(_, ty::_) when (isInterfaceTy g ty) -> true
|
||||||
| _ -> false
|
| _ -> false
|
||||||
|
|
||||||
let GetInterfaceCandidates (denv : DisplayEnv) = function
|
// Return only items with the specified name
|
||||||
| Item.ModuleOrNamespaces _ -> true
|
let FilterDeclItemsByResidue residue (items: Item list) =
|
||||||
| Item.Types(_, ty::_) when (isInterfaceTy denv.g ty) -> true
|
items |> List.filter (fun item ->
|
||||||
| _ -> false
|
let n1 = item.DisplayName
|
||||||
/// Post-filter items to make sure they have precisely the right name
|
match item with
|
||||||
/// This also checks that there are some remaining results
|
| Item.Types _ | Item.CtorGroup _ -> residue + "Attribute" = n1 || residue = n1
|
||||||
/// exactMatchResidue = Some _ -- means that we are looking for exact matches
|
| _ -> residue = n1 )
|
||||||
let FilterRelevantItemsBy (exactMatchResidue : _ option) f (items, denv, m) =
|
|
||||||
|
|
||||||
// can throw if type is in located in non-resolved CCU: i.e. bigint if reference to System.Numerics is absent
|
/// Post-filter items to make sure they have precisely the right name
|
||||||
let f denv item = try f denv item with _ -> false
|
/// This also checks that there are some remaining results
|
||||||
|
/// exactMatchResidueOpt = Some _ -- means that we are looking for exact matches
|
||||||
|
let FilterRelevantItemsBy (exactMatchResidueOpt : _ option) check (items, denv, m) =
|
||||||
|
|
||||||
|
// can throw if type is in located in non-resolved CCU: i.e. bigint if reference to System.Numerics is absent
|
||||||
|
let safeCheck item = try check item with _ -> false
|
||||||
|
|
||||||
// Return only items with the specified name
|
// Are we looking for items with precisely the given name?
|
||||||
let filterDeclItemsByResidue residue (items: Item list) =
|
if nonNil items && exactMatchResidueOpt.IsSome then
|
||||||
items |> List.filter (fun item ->
|
let items = items |> FilterDeclItemsByResidue exactMatchResidueOpt.Value |> List.filter safeCheck
|
||||||
let n1 = item.DisplayName
|
if nonNil items then Some(items, denv, m) else None
|
||||||
if not (f denv item) then false
|
else
|
||||||
else
|
// When (items = []) we must returns Some([],..) and not None
|
||||||
match item with
|
// because this value is used if we want to stop further processing (e.g. let x.$ = ...)
|
||||||
| Item.Types _ | Item.CtorGroup _ -> residue + "Attribute" = n1 || residue = n1
|
let items = items |> List.filter safeCheck
|
||||||
| _ -> residue = n1 )
|
Some(items, denv, m)
|
||||||
|
|
||||||
// Are we looking for items with precisely the given name?
|
|
||||||
if nonNil items && exactMatchResidue.IsSome then
|
|
||||||
let items = items |> filterDeclItemsByResidue exactMatchResidue.Value
|
|
||||||
if nonNil items then Some(items,denv,m) else None
|
|
||||||
else
|
|
||||||
// When (items = []) we must returns Some([],..) and not None
|
|
||||||
// because this value is used if we want to stop further processing (e.g. let x.$ = ...)
|
|
||||||
let items = List.filter (f denv) items
|
|
||||||
Some(items, denv, m)
|
|
||||||
|
|
||||||
let loc =
|
/// Post-filter items to make sure they have precisely the right name
|
||||||
match colAtEndOfNamesAndResidue with
|
/// This also checks that there are some remaining results
|
||||||
| pastEndOfLine when pastEndOfLine >= lineStr.Length -> lineStr.Length
|
let (|FilterRelevantItems|_|) exactMatchResidueOpt orig =
|
||||||
| atDot when lineStr.[atDot] = '.' -> atDot + 1
|
FilterRelevantItemsBy exactMatchResidueOpt (fun _ -> true) orig
|
||||||
| atStart when atStart = 0 -> 0
|
|
||||||
| otherwise -> otherwise - 1
|
|
||||||
|
|
||||||
let FindInEnv(plid, showObsolete) = GetEnvironmentLookupResolutions(mkPos line loc,plid,filterCtors, showObsolete)
|
|
||||||
|
/// Find the first non-whitespace postion in a line prior to the given character
|
||||||
let FindRecordFieldsInEnv(plid, residue) = GetClassOrRecordFieldsEnvironmentLookupResolutions(mkPos line loc, plid, residue)
|
let FindFirstNonWhitespacePosition (lineStr: string) i =
|
||||||
|
if i >= lineStr.Length then None
|
||||||
let getDeclaredItems isInRangeOperator =
|
else
|
||||||
let findFirstNonWsPos i =
|
let mutable p = i
|
||||||
if i >= lineStr.Length then None
|
while p >= 0 && System.Char.IsWhiteSpace(lineStr.[p]) do
|
||||||
else
|
p <- p - 1
|
||||||
let mutable p = i
|
if p >= 0 then Some p else None
|
||||||
while p >= 0 && System.Char.IsWhiteSpace(lineStr.[p]) do
|
|
||||||
p <- p - 1
|
|
||||||
if p >= 0 then Some p else None
|
|
||||||
|
|
||||||
// are last two chars (except whitespaces) = ".."
|
|
||||||
|
let GetDeclaredItems (parseResultsOpt: FSharpParseFileResults option, lineStr: string, origLongIdentOpt, colAtEndOfNamesAndResidue, residueOpt, line, loc, filterCtors,resolveOverloads, hasTextChangedSinceLastTypecheck, isInRangeOperator) =
|
||||||
|
|
||||||
|
// Are the last two chars (except whitespaces) = ".."
|
||||||
let isLikeRangeOp =
|
let isLikeRangeOp =
|
||||||
match findFirstNonWsPos (colAtEndOfNamesAndResidue - 1) with
|
match FindFirstNonWhitespacePosition lineStr (colAtEndOfNamesAndResidue - 1) with
|
||||||
| Some x when x >= 1 && lineStr.[x] = '.' && lineStr.[x - 1] = '.' -> true
|
| Some x when x >= 1 && lineStr.[x] = '.' && lineStr.[x - 1] = '.' -> true
|
||||||
| _ -> false
|
| _ -> false
|
||||||
|
|
||||||
// if last two chars are .. and we are not in range operator context - no completion
|
// if last two chars are .. and we are not in range operator context - no completion
|
||||||
if isLikeRangeOp && not isInRangeOperator then None
|
if isLikeRangeOp && not isInRangeOperator then None else
|
||||||
else
|
|
||||||
|
|
||||||
// Try to use the exact results of name resolution during type checking to generate the results
|
// Try to use the exact results of name resolution during type checking to generate the results
|
||||||
// This is based on position (i.e. colAtEndOfNamesAndResidue). This is not used if a residueOpt is given.
|
// This is based on position (i.e. colAtEndOfNamesAndResidue). This is not used if a residueOpt is given.
|
||||||
|
@ -838,9 +873,9 @@ type TypeCheckInfo
|
||||||
// TODO: this code would be a lot simpler if we just passed in colAtEndOfNames in
|
// TODO: this code would be a lot simpler if we just passed in colAtEndOfNames in
|
||||||
// the first place. colAtEndOfNamesAndResidue serves no purpose. The cracking below is
|
// the first place. colAtEndOfNamesAndResidue serves no purpose. The cracking below is
|
||||||
// inaccurate and incomplete in any case since it only works on a single line.
|
// inaccurate and incomplete in any case since it only works on a single line.
|
||||||
match findFirstNonWsPos (colAtEndOfNamesAndResidue - 1) with
|
match FindFirstNonWhitespacePosition lineStr (colAtEndOfNamesAndResidue - 1) with
|
||||||
| Some p when lineStr.[p] = '.' ->
|
| Some p when lineStr.[p] = '.' ->
|
||||||
match findFirstNonWsPos (p - 1) with
|
match FindFirstNonWhitespacePosition lineStr (p - 1) with
|
||||||
| Some colAtEndOfNames ->
|
| Some colAtEndOfNames ->
|
||||||
let colAtEndOfNames = colAtEndOfNames + 1 // convert 0-based to 1-based
|
let colAtEndOfNames = colAtEndOfNames + 1 // convert 0-based to 1-based
|
||||||
GetPreciseItemsFromNameResolution(line, colAtEndOfNames, Some(residue), filterCtors,resolveOverloads, hasTextChangedSinceLastTypecheck)
|
GetPreciseItemsFromNameResolution(line, colAtEndOfNames, Some(residue), filterCtors,resolveOverloads, hasTextChangedSinceLastTypecheck)
|
||||||
|
@ -859,15 +894,10 @@ type TypeCheckInfo
|
||||||
let plid, residue = List.frontAndBack origLongIdent
|
let plid, residue = List.frontAndBack origLongIdent
|
||||||
plid, Some residue
|
plid, Some residue
|
||||||
|
|
||||||
/// Post-filter items to make sure they have precisely the right name
|
|
||||||
/// This also checks that there are some remaining results
|
|
||||||
let (|FilterRelevantItems|_|) orig =
|
|
||||||
FilterRelevantItemsBy exactMatchResidueOpt (fun _ _ -> true) orig
|
|
||||||
|
|
||||||
match nameResItems with
|
match nameResItems with
|
||||||
| NameResResult.TypecheckStaleAndTextChanged -> None // second-chance intellisense will try again
|
| NameResResult.TypecheckStaleAndTextChanged -> None // second-chance intellisense will try again
|
||||||
| NameResResult.Cancel(denv,m) -> Some([], denv, m)
|
| NameResResult.Cancel(denv,m) -> Some([], denv, m)
|
||||||
| NameResResult.Members(FilterRelevantItems(items)) ->
|
| NameResResult.Members(FilterRelevantItems exactMatchResidueOpt items) ->
|
||||||
Trace.PrintLine("CompilerServices", fun _ -> sprintf "GetDeclItemsForNamesAtPosition: lookup based on name resolution results successful, #items = %d, exists ctor = %b\n" (p13 items).Length (items |> p13 |> List.exists (function Item.CtorGroup _ -> true | _ -> false)))
|
Trace.PrintLine("CompilerServices", fun _ -> sprintf "GetDeclItemsForNamesAtPosition: lookup based on name resolution results successful, #items = %d, exists ctor = %b\n" (p13 items).Length (items |> p13 |> List.exists (function Item.CtorGroup _ -> true | _ -> false)))
|
||||||
Some items
|
Some items
|
||||||
| _ ->
|
| _ ->
|
||||||
|
@ -878,8 +908,7 @@ type TypeCheckInfo
|
||||||
Trace.PrintLine("CompilerServices", fun _ -> sprintf "GetDeclItemsForNamesAtPosition: plid = %+A, residue = %+A, colAtEndOfNamesAndResidue = %+A\n" plid exactMatchResidueOpt colAtEndOfNamesAndResidue)
|
Trace.PrintLine("CompilerServices", fun _ -> sprintf "GetDeclItemsForNamesAtPosition: plid = %+A, residue = %+A, colAtEndOfNamesAndResidue = %+A\n" plid exactMatchResidueOpt colAtEndOfNamesAndResidue)
|
||||||
|
|
||||||
// Try to use the type of the expression on the left to help generate a completion list
|
// Try to use the type of the expression on the left to help generate a completion list
|
||||||
let mutable thereIsADotInvolved = false
|
let qualItems, thereIsADotInvolved =
|
||||||
let qualItems =
|
|
||||||
match parseResultsOpt with
|
match parseResultsOpt with
|
||||||
| None ->
|
| None ->
|
||||||
// Note, you will get here if the 'reason' is not CompleteWord/MemberSelect/DisplayMemberList, as those are currently the
|
// Note, you will get here if the 'reason' is not CompleteWord/MemberSelect/DisplayMemberList, as those are currently the
|
||||||
|
@ -887,26 +916,20 @@ type TypeCheckInfo
|
||||||
// if you do QuickInfo hovering over A in "f(x).A()", you will only get a tip if typechecking has a name-resolution recorded
|
// if you do QuickInfo hovering over A in "f(x).A()", you will only get a tip if typechecking has a name-resolution recorded
|
||||||
// for A, not if merely we know the capturedExpressionTyping of f(x) and you very recently typed ".A()" - in that case,
|
// for A, not if merely we know the capturedExpressionTyping of f(x) and you very recently typed ".A()" - in that case,
|
||||||
// you won't won't get a tip until the typechecking catches back up.
|
// you won't won't get a tip until the typechecking catches back up.
|
||||||
GetPreciseCompletionListFromExprTypingsResult.None
|
GetPreciseCompletionListFromExprTypingsResult.None, false
|
||||||
| Some(upi) ->
|
| Some parseResults ->
|
||||||
|
|
||||||
// See ServiceUntypedParse - GetRangeOfExprLeftOfDot and TryFindExpressionASTLeftOfDotLeftOfCursor are similar, but different, can we refactor commonality?
|
match UntypedParseImpl.TryFindExpressionASTLeftOfDotLeftOfCursor(mkPos line colAtEndOfNamesAndResidue,parseResults.ParseTree) with
|
||||||
// match UntypedParseImpl.GetRangeOfExprLeftOfDot(line,colAtEndOfNamesAndResidue,upi.ParseTree) with
|
|
||||||
// | Some((_,_),(el,ec)) ->
|
|
||||||
// thereIsADotInvolved <- true
|
|
||||||
// GetPreciseCompletionListFromExprTypings(upi, el-1, ec, filterCtors)
|
|
||||||
match UntypedParseImpl.TryFindExpressionASTLeftOfDotLeftOfCursor(mkPos line colAtEndOfNamesAndResidue,upi.ParseTree) with
|
|
||||||
| Some(pos,_) ->
|
| Some(pos,_) ->
|
||||||
thereIsADotInvolved <- true
|
GetPreciseCompletionListFromExprTypings(parseResults, pos, filterCtors, hasTextChangedSinceLastTypecheck), true
|
||||||
GetPreciseCompletionListFromExprTypings(upi, pos, filterCtors, hasTextChangedSinceLastTypecheck)
|
|
||||||
| None ->
|
| None ->
|
||||||
// Can get here in a case like: if "f xxx yyy" is legal, and we do "f xxx y"
|
// Can get here in a case like: if "f xxx yyy" is legal, and we do "f xxx y"
|
||||||
// We have no interest in expression typings, those are only useful for dot-completion. We want to fallback
|
// We have no interest in expression typings, those are only useful for dot-completion. We want to fallback
|
||||||
// to "Use an environment lookup as the last resort" below
|
// to "Use an environment lookup as the last resort" below
|
||||||
GetPreciseCompletionListFromExprTypingsResult.None
|
GetPreciseCompletionListFromExprTypingsResult.None, false
|
||||||
|
|
||||||
match qualItems,thereIsADotInvolved with
|
match qualItems,thereIsADotInvolved with
|
||||||
| GetPreciseCompletionListFromExprTypingsResult.Some(FilterRelevantItems(items)), _
|
| GetPreciseCompletionListFromExprTypingsResult.Some(FilterRelevantItems exactMatchResidueOpt items), _
|
||||||
// Initially we only use the expression typings when looking up, e.g. (expr).Nam or (expr).Name1.Nam
|
// Initially we only use the expression typings when looking up, e.g. (expr).Nam or (expr).Name1.Nam
|
||||||
// These come through as an empty plid and residue "". Otherwise we try an environment lookup
|
// These come through as an empty plid and residue "". Otherwise we try an environment lookup
|
||||||
// and then return to the qualItems. This is because the expression typings are a little inaccurate, primarily because
|
// and then return to the qualItems. This is because the expression typings are a little inaccurate, primarily because
|
||||||
|
@ -927,9 +950,9 @@ type TypeCheckInfo
|
||||||
// Second-chance intellisense will bring up the correct list in a moment.
|
// Second-chance intellisense will bring up the correct list in a moment.
|
||||||
None
|
None
|
||||||
| _ ->
|
| _ ->
|
||||||
// Use an environment lookup as the last resort
|
|
||||||
|
|
||||||
let envItems = FindInEnv(plid, residueOpt.IsSome)
|
// Use an environment lookup as the last resort
|
||||||
|
let envItems = GetEnvironmentLookupResolutions(mkPos line loc, plid, filterCtors, residueOpt.IsSome)
|
||||||
match nameResItems, envItems, qualItems with
|
match nameResItems, envItems, qualItems with
|
||||||
|
|
||||||
// First, use unfiltered name resolution items, if they're not empty
|
// First, use unfiltered name resolution items, if they're not empty
|
||||||
|
@ -939,43 +962,71 @@ type TypeCheckInfo
|
||||||
|
|
||||||
// If we have nonempty items from environment that were resolved from a type, then use them...
|
// If we have nonempty items from environment that were resolved from a type, then use them...
|
||||||
// (that's better than the next case - here we'd return 'int' as a type)
|
// (that's better than the next case - here we'd return 'int' as a type)
|
||||||
| _, FilterRelevantItems(items, denv, m), _ when nonNil items ->
|
| _, FilterRelevantItems exactMatchResidueOpt (items, denv, m), _ when nonNil items ->
|
||||||
Trace.PrintLine("CompilerServices", fun _ -> sprintf "GetDeclItemsForNamesAtPosition: lookup based on name and environment successful\n")
|
Trace.PrintLine("CompilerServices", fun _ -> sprintf "GetDeclItemsForNamesAtPosition: lookup based on name and environment successful\n")
|
||||||
Some(items, denv, m)
|
Some(items, denv, m)
|
||||||
|
|
||||||
// Try again with the qualItems
|
// Try again with the qualItems
|
||||||
| _, _, GetPreciseCompletionListFromExprTypingsResult.Some(FilterRelevantItems(items)) ->
|
| _, _, GetPreciseCompletionListFromExprTypingsResult.Some(FilterRelevantItems exactMatchResidueOpt items) ->
|
||||||
Some(items)
|
Some(items)
|
||||||
|
|
||||||
| _ -> None
|
| _ -> None
|
||||||
|
|
||||||
|
|
||||||
|
/// Get the auto-complete items at a particular location.
|
||||||
|
let GetDeclItemsForNamesAtPosition(parseResultsOpt: FSharpParseFileResults option, origLongIdentOpt: string list option, residueOpt:string option, line:int, lineStr:string, colAtEndOfNamesAndResidue, filterCtors, resolveOverloads, hasTextChangedSinceLastTypecheck: (obj * range -> bool)) =
|
||||||
|
|
||||||
|
let loc =
|
||||||
|
match colAtEndOfNamesAndResidue with
|
||||||
|
| pastEndOfLine when pastEndOfLine >= lineStr.Length -> lineStr.Length
|
||||||
|
| atDot when lineStr.[atDot] = '.' -> atDot + 1
|
||||||
|
| atStart when atStart = 0 -> 0
|
||||||
|
| otherwise -> otherwise - 1
|
||||||
|
|
||||||
|
// Look for a "special" completion context
|
||||||
match UntypedParseImpl.TryGetCompletionContext(mkPos line colAtEndOfNamesAndResidue, parseResultsOpt) with
|
match UntypedParseImpl.TryGetCompletionContext(mkPos line colAtEndOfNamesAndResidue, parseResultsOpt) with
|
||||||
|
|
||||||
|
// Invalid completion locations
|
||||||
| Some CompletionContext.Invalid -> None
|
| Some CompletionContext.Invalid -> None
|
||||||
|
|
||||||
|
// Completion at 'inherit C(...)"
|
||||||
| Some (CompletionContext.Inherit(InheritanceContext.Class, (plid, _))) ->
|
| Some (CompletionContext.Inherit(InheritanceContext.Class, (plid, _))) ->
|
||||||
FindInEnv(plid, false)
|
GetEnvironmentLookupResolutions(mkPos line loc, plid, filterCtors, false)
|
||||||
|> FilterRelevantItemsBy None GetBaseClassCandidates
|
|> FilterRelevantItemsBy None GetBaseClassCandidates
|
||||||
|
|
||||||
|
// Completion at 'interface ..."
|
||||||
| Some (CompletionContext.Inherit(InheritanceContext.Interface, (plid, _))) ->
|
| Some (CompletionContext.Inherit(InheritanceContext.Interface, (plid, _))) ->
|
||||||
FindInEnv(plid, false)
|
GetEnvironmentLookupResolutions(mkPos line loc, plid, filterCtors, false)
|
||||||
|> FilterRelevantItemsBy None GetInterfaceCandidates
|
|> FilterRelevantItemsBy None GetInterfaceCandidates
|
||||||
|
|
||||||
|
// Completion at 'implement ..."
|
||||||
| Some (CompletionContext.Inherit(InheritanceContext.Unknown, (plid, _))) ->
|
| Some (CompletionContext.Inherit(InheritanceContext.Unknown, (plid, _))) ->
|
||||||
FindInEnv(plid, false)
|
GetEnvironmentLookupResolutions(mkPos line loc, plid, filterCtors, false)
|
||||||
|> FilterRelevantItemsBy None (fun denv t -> (GetBaseClassCandidates denv t) || (GetInterfaceCandidates denv t))
|
|> FilterRelevantItemsBy None (fun t -> GetBaseClassCandidates t || GetInterfaceCandidates t)
|
||||||
|
|
||||||
|
// Completion at ' { XXX = ... } "
|
||||||
| Some(CompletionContext.RecordField(RecordContext.New(plid, residue))) ->
|
| Some(CompletionContext.RecordField(RecordContext.New(plid, residue))) ->
|
||||||
FindRecordFieldsInEnv(plid, residue)
|
GetClassOrRecordFieldsEnvironmentLookupResolutions(mkPos line loc, plid, residue)
|
||||||
|> Some
|
|> Some
|
||||||
|
|
||||||
|
// Completion at ' { XXX = ... with ... } "
|
||||||
| Some(CompletionContext.RecordField(RecordContext.CopyOnUpdate(r, (plid, residue)))) ->
|
| Some(CompletionContext.RecordField(RecordContext.CopyOnUpdate(r, (plid, residue)))) ->
|
||||||
match GetRecdFieldsForExpr(r) with
|
match GetRecdFieldsForExpr(r) with
|
||||||
| None ->
|
| None ->
|
||||||
FindRecordFieldsInEnv(plid, residue)
|
GetClassOrRecordFieldsEnvironmentLookupResolutions(mkPos line loc, plid, residue)
|
||||||
|> Some
|
|> Some
|
||||||
| x -> x
|
| x -> x
|
||||||
|
|
||||||
|
// Completion at ' { XXX = ... with ... } "
|
||||||
| Some(CompletionContext.RecordField(RecordContext.Constructor(typeName))) ->
|
| Some(CompletionContext.RecordField(RecordContext.Constructor(typeName))) ->
|
||||||
FindRecordFieldsInEnv([typeName], None)
|
GetClassOrRecordFieldsEnvironmentLookupResolutions(mkPos line loc, [typeName], None)
|
||||||
|> Some
|
|> Some
|
||||||
|
|
||||||
|
// Completion at ' SomeMethod( ... ) ' with named arguments
|
||||||
| Some(CompletionContext.ParameterList (endPos, fields)) ->
|
| Some(CompletionContext.ParameterList (endPos, fields)) ->
|
||||||
let results = GetNamedParametersAndSettableFields endPos hasTextChangedSinceLastTypecheck
|
let results = GetNamedParametersAndSettableFields endPos hasTextChangedSinceLastTypecheck
|
||||||
|
|
||||||
let declaredItems = getDeclaredItems false
|
let declaredItems = GetDeclaredItems (parseResultsOpt, lineStr, origLongIdentOpt, colAtEndOfNamesAndResidue, residueOpt, line, loc, filterCtors, resolveOverloads, hasTextChangedSinceLastTypecheck, false)
|
||||||
|
|
||||||
match results with
|
match results with
|
||||||
| NameResResult.Members(items, denv, m) ->
|
| NameResResult.Members(items, denv, m) ->
|
||||||
|
@ -988,178 +1039,56 @@ type TypeCheckInfo
|
||||||
| None -> Some (items, denv, m)
|
| None -> Some (items, denv, m)
|
||||||
| Some (declItems, declaredDisplayEnv, declaredRange) -> Some (filtered @ declItems, declaredDisplayEnv, declaredRange)
|
| Some (declItems, declaredDisplayEnv, declaredRange) -> Some (filtered @ declItems, declaredDisplayEnv, declaredRange)
|
||||||
| _ -> declaredItems
|
| _ -> declaredItems
|
||||||
|
|
||||||
|
// Other completions
|
||||||
| cc ->
|
| cc ->
|
||||||
#if OLD
|
let isInRangeOperator = (match cc with Some (CompletionContext.RangeOperator) -> true | _ -> false)
|
||||||
|
let declaredItems = GetDeclaredItems (parseResultsOpt, lineStr, origLongIdentOpt, colAtEndOfNamesAndResidue, residueOpt, line, loc, filterCtors,resolveOverloads, hasTextChangedSinceLastTypecheck, isInRangeOperator)
|
||||||
|
declaredItems
|
||||||
|
|
||||||
|
/// Return 'false' if this is not a completion item valid in an interface file.
|
||||||
// are last two chars (except whitespaces) = ".."
|
|
||||||
let isLikeRangeOp =
|
|
||||||
match findFirstNonWsPos (colAtEndOfNamesAndResidue - 1) with
|
|
||||||
| Some x when x >= 1 && lineStr.[x] = '.' && lineStr.[x - 1] = '.' -> true
|
|
||||||
| _ -> false
|
|
||||||
|
|
||||||
// if last two chars are .. and we are not in range operator context - no completion
|
|
||||||
if isLikeRangeOp && not (cc = Some (CompletionContext.RangeOperator)) then None
|
|
||||||
else
|
|
||||||
|
|
||||||
// Try to use the exact results of name resolution during type checking to generate the results
|
|
||||||
// This is based on position (i.e. colAtEndOfNamesAndResidue).
|
|
||||||
let nameResItems =
|
|
||||||
match residueOpt with
|
|
||||||
| None -> GetPreciseItemsFromNameResolution(line, colAtEndOfNamesAndResidue, None, filterCtors,resolveOverloads, hasTextChangedSinceLastTypecheck)
|
|
||||||
| Some residue ->
|
|
||||||
// deals with cases when we have spaces between dot and\or identifier, like A . $
|
|
||||||
// if this is our case - then wen need to locate end position of the name skipping whitespaces
|
|
||||||
// this allows us to handle cases like: let x . $ = 1
|
|
||||||
|
|
||||||
// colAtEndOfNamesAndResidue is 1-based so at first we need to convert it to 0-based
|
|
||||||
//
|
|
||||||
// TODO: this code would be a lot simpler if we just passed in colAtEndOfNames in
|
|
||||||
// the first place. colAtEndOfNamesAndResidue serves no purpose. The cracking below is
|
|
||||||
// inaccurate and incomplete in any case since it only works on a single line.
|
|
||||||
match findFirstNonWsPos (colAtEndOfNamesAndResidue - 1) with
|
|
||||||
| Some p when lineStr.[p] = '.' ->
|
|
||||||
match findFirstNonWsPos (p - 1) with
|
|
||||||
| Some colAtEndOfNames ->
|
|
||||||
let colAtEndOfNames = colAtEndOfNames + 1 // convert 0-based to 1-based
|
|
||||||
GetPreciseItemsFromNameResolution(line, colAtEndOfNames, Some(residue), filterCtors,resolveOverloads, hasTextChangedSinceLastTypecheck)
|
|
||||||
| None -> NameResResult.Empty
|
|
||||||
| _ -> NameResResult.Empty
|
|
||||||
|
|
||||||
// Normalize to form A.B.C.D where D is the residue. It may be empty for "A.B.C."
|
|
||||||
// residueOpt = Some when we are looking for the exact match
|
|
||||||
let plid, exactMatchResidueOpt =
|
|
||||||
match origLongIdentOpt, residueOpt with
|
|
||||||
| None, _ -> [], None
|
|
||||||
| Some(origLongIdent), Some _ -> origLongIdent, None
|
|
||||||
| Some(origLongIdent), None ->
|
|
||||||
assert (nonNil origLongIdent)
|
|
||||||
// note: as above, this happens when we are called for "precise" resolution - (F1 keyword, data tip etc..)
|
|
||||||
let plid, residue = List.frontAndBack origLongIdent
|
|
||||||
plid, Some residue
|
|
||||||
|
|
||||||
/// Post-filter items to make sure they have precisely the right name
|
|
||||||
/// This also checks that there are some remaining results
|
|
||||||
let (|FilterRelevantItems|_|) orig =
|
|
||||||
FilterRelevantItemsBy exactMatchResidueOpt (fun _ _ -> true) orig
|
|
||||||
|
|
||||||
match nameResItems with
|
|
||||||
| NameResResult.TypecheckStaleAndTextChanged -> None // second-chance intellisense will try again
|
|
||||||
| NameResResult.Cancel(denv,m) -> Some([], denv, m)
|
|
||||||
| NameResResult.Members(FilterRelevantItems(items)) ->
|
|
||||||
Some items
|
|
||||||
| _ ->
|
|
||||||
|
|
||||||
match origLongIdentOpt with
|
|
||||||
| None -> None
|
|
||||||
| Some _ ->
|
|
||||||
|
|
||||||
// Try to use the type of the expression on the left to help generate a completion list
|
|
||||||
let mutable thereIsADotInvolved = false
|
|
||||||
let qualItems =
|
|
||||||
match parseResultsOpt with
|
|
||||||
| None ->
|
|
||||||
// Note, you will get here if the 'reason' is not CompleteWord/MemberSelect/DisplayMemberList, as those are currently the
|
|
||||||
// only reasons we do a sync parse to have the most precise and likely-to-be-correct-and-up-to-date info. So for example,
|
|
||||||
// if you do QuickInfo hovering over A in "f(x).A()", you will only get a tip if typechecking has a name-resolution recorded
|
|
||||||
// for A, not if merely we know the capturedExpressionTyping of f(x) and you very recently typed ".A()" - in that case,
|
|
||||||
// you won't won't get a tip until the typechecking catches back up.
|
|
||||||
GetPreciseCompletionListFromExprTypingsResult.None
|
|
||||||
| Some(upi) ->
|
|
||||||
|
|
||||||
// See ServiceUntypedParse - GetRangeOfExprLeftOfDot and TryFindExpressionASTLeftOfDotLeftOfCursor are similar, but different, can we refactor commonality?
|
|
||||||
// match UntypedParseImpl.GetRangeOfExprLeftOfDot(line,colAtEndOfNamesAndResidue,upi.ParseTree) with
|
|
||||||
// | Some((_,_),(el,ec)) ->
|
|
||||||
// thereIsADotInvolved <- true
|
|
||||||
// GetPreciseCompletionListFromExprTypings(upi, el-1, ec, filterCtors)
|
|
||||||
match UntypedParseImpl.TryFindExpressionASTLeftOfDotLeftOfCursor(mkPos line colAtEndOfNamesAndResidue,upi.ParseTree) with
|
|
||||||
| Some(pos,_) ->
|
|
||||||
thereIsADotInvolved <- true
|
|
||||||
GetPreciseCompletionListFromExprTypings(upi, pos, filterCtors, hasTextChangedSinceLastTypecheck)
|
|
||||||
| None ->
|
|
||||||
// Can get here in a case like: if "f xxx yyy" is legal, and we do "f xxx y"
|
|
||||||
// We have no interest in expression typings, those are only useful for dot-completion. We want to fallback
|
|
||||||
// to "Use an environment lookup as the last resort" below
|
|
||||||
GetPreciseCompletionListFromExprTypingsResult.None
|
|
||||||
|
|
||||||
match qualItems,thereIsADotInvolved with
|
|
||||||
| GetPreciseCompletionListFromExprTypingsResult.Some(FilterRelevantItems(items)), _
|
|
||||||
// Initially we only use the expression typings when looking up, e.g. (expr).Nam or (expr).Name1.Nam
|
|
||||||
// These come through as an empty plid and residue "". Otherwise we try an environment lookup
|
|
||||||
// and then return to the qualItems. This is because the expression typings are a little inaccurate, primarily because
|
|
||||||
// it appears we're getting some typings recorded for non-atomic expressions like "f x"
|
|
||||||
when (match plid with [] -> true | _ -> false) ->
|
|
||||||
Some items
|
|
||||||
| GetPreciseCompletionListFromExprTypingsResult.NoneBecauseThereWereTypeErrors, _ ->
|
|
||||||
// There was an error, e.g. we have "<expr>." and there is an error determining the type of <expr>
|
|
||||||
// In this case, we don't want any of the fallback logic, rather, we want to produce zero results.
|
|
||||||
None
|
|
||||||
| GetPreciseCompletionListFromExprTypingsResult.NoneBecauseTypecheckIsStaleAndTextChanged, _ ->
|
|
||||||
// we want to report no result and let second-chance intellisense kick in
|
|
||||||
None
|
|
||||||
| _, true when (match plid with [] -> true | _ -> false) ->
|
|
||||||
// If the user just pressed '.' after an _expression_ (not a plid), it is never right to show environment-lookup top-level completions.
|
|
||||||
// The user might by typing quickly, and the LS didn't have an expression type right before the dot yet.
|
|
||||||
// Second-chance intellisense will bring up the correct list in a moment.
|
|
||||||
None
|
|
||||||
| _ ->
|
|
||||||
// Use an environment lookup as the last resort
|
|
||||||
|
|
||||||
let envItems = FindInEnv(plid, residueOpt.IsSome)
|
|
||||||
match nameResItems, envItems, qualItems with
|
|
||||||
|
|
||||||
// First, use unfiltered name resolution items, if they're not empty
|
|
||||||
| NameResResult.Members(items, denv, m), _, _ when nonNil items ->
|
|
||||||
Some(items, denv, m)
|
|
||||||
|
|
||||||
// If we have nonempty items from environment that were resolved from a type, then use them...
|
|
||||||
// (that's better than the next case - here we'd return 'int' as a type)
|
|
||||||
| _, FilterRelevantItems(items, denv, m), _ when nonNil items ->
|
|
||||||
Some(items, denv, m)
|
|
||||||
|
|
||||||
// Try again with the qualItems
|
|
||||||
| _, _, GetPreciseCompletionListFromExprTypingsResult.Some(FilterRelevantItems(items)) ->
|
|
||||||
Some(items)
|
|
||||||
|
|
||||||
| _ -> None
|
|
||||||
|
|
||||||
#endif
|
|
||||||
getDeclaredItems (match cc with Some (CompletionContext.RangeOperator) -> true | _ -> false)
|
|
||||||
|
|
||||||
// Return 'false' if this is not a completion item valid in an interface file.
|
|
||||||
let IsValidSignatureFileItem item =
|
let IsValidSignatureFileItem item =
|
||||||
match item with
|
match item with
|
||||||
| Item.Types _ | Item.ModuleOrNamespaces _ -> true
|
| Item.Types _ | Item.ModuleOrNamespaces _ -> true
|
||||||
| _ -> false
|
| _ -> false
|
||||||
|
|
||||||
let filterIntellisenseCompletionsBasedOnParseContext parseResultsOpt (pos:pos) items =
|
/// Check if we are at an "open" declaration
|
||||||
match parseResultsOpt with
|
let IsAtOpenDeclaration (parseResults, pos: pos) =
|
||||||
| None -> items
|
// visitor to see if we are in an "open" declaration in the parse tree
|
||||||
| Some t ->
|
let visitor = { new AstTraversal.AstVisitorBase<bool>() with
|
||||||
// visitor to see if we are in an "open" declaration in the parse tree
|
override this.VisitExpr(_path, _traverseSynExpr, defaultTraverse, expr) = None // don't need to keep going, 'open' declarations never appear inside Exprs
|
||||||
let visitor = { new AstTraversal.AstVisitorBase<int>() with
|
override this.VisitModuleDecl(defaultTraverse, decl) =
|
||||||
override this.VisitExpr(_path, _traverseSynExpr, defaultTraverse, expr) = None // don't need to keep going, 'open' declarations never appear inside Exprs
|
match decl with
|
||||||
override this.VisitModuleDecl(defaultTraverse, decl) =
|
| SynModuleDecl.Open(_longIdent, m) ->
|
||||||
match decl with
|
// in theory, this means we're "in an open"
|
||||||
| SynModuleDecl.Open(_longIdent, m) ->
|
// in practice, because the parse tree/walkers do not handle attributes well yet, need extra check below to ensure not e.g. $here$
|
||||||
// in theory, this means we're "in an open"
|
// open System
|
||||||
// in practice, because the parse tree/walkers do not handle attributes well yet, need extra check below to ensure not e.g. $here$
|
// [<Attr$
|
||||||
// open System
|
// let f() = ()
|
||||||
// [<Attr$
|
// inside an attribute on the next item
|
||||||
// let f() = ()
|
let pos = mkPos pos.Line (pos.Column - 1) // -1 because for e.g. "open System." the dot does not show up in the parse tree
|
||||||
// inside an attribute on the next item
|
if rangeContainsPos m pos then
|
||||||
let pos = mkPos pos.Line (pos.Column - 1) // -1 because for e.g. "open System." the dot does not show up in the parse tree
|
Some true
|
||||||
if rangeContainsPos m pos then
|
else
|
||||||
Some 0
|
None
|
||||||
else
|
| _ -> defaultTraverse decl }
|
||||||
None
|
match AstTraversal.Traverse(pos, parseResults, visitor) with
|
||||||
| _ -> defaultTraverse decl }
|
| None -> false
|
||||||
match AstTraversal.Traverse(pos, t, visitor) with
|
| Some res -> res
|
||||||
| None -> items
|
|
||||||
| Some _ ->
|
|
||||||
items |> List.filter (function | Item.ModuleOrNamespaces _ -> true | _ -> false)
|
|
||||||
|
|
||||||
member x.GetDeclarations (parseResultsOpt:FSharpParseFileResults option, line, lineStr, colAtEndOfNamesAndResidue, qualifyingNames, partialName, hasTextChangedSinceLastTypecheck) =
|
/// If an AST is available, then determine if we are at a "special" position in the AST such as an "open". If so restrict
|
||||||
|
/// or augment the autocompletes available at that point.
|
||||||
|
let FilterAutoCompletesBasedOnParseContext (parseResultsOpt: FSharpParseFileResults option) (pos:pos) items =
|
||||||
|
match parseResultsOpt |> Option.bind (fun parseResults -> parseResults.ParseTree) with
|
||||||
|
| None -> items
|
||||||
|
| Some parseTree ->
|
||||||
|
if IsAtOpenDeclaration (parseTree, pos) then
|
||||||
|
items |> List.filter (function Item.ModuleOrNamespaces _ -> true | _ -> false)
|
||||||
|
else
|
||||||
|
items
|
||||||
|
|
||||||
|
/// Get the auto-complete items at a location
|
||||||
|
member x.GetDeclarations (parseResultsOpt, line, lineStr, colAtEndOfNamesAndResidue, qualifyingNames, partialName, hasTextChangedSinceLastTypecheck) =
|
||||||
let isInterfaceFile = SourceFileImpl.IsInterfaceFile mainInputFileName
|
let isInterfaceFile = SourceFileImpl.IsInterfaceFile mainInputFileName
|
||||||
ErrorScope.Protect
|
ErrorScope.Protect
|
||||||
Range.range0
|
Range.range0
|
||||||
|
@ -1167,12 +1096,13 @@ type TypeCheckInfo
|
||||||
match GetDeclItemsForNamesAtPosition(parseResultsOpt, Some qualifyingNames, Some partialName, line, lineStr, colAtEndOfNamesAndResidue, ResolveTypeNamesToCtors, ResolveOverloads.Yes, hasTextChangedSinceLastTypecheck) with
|
match GetDeclItemsForNamesAtPosition(parseResultsOpt, Some qualifyingNames, Some partialName, line, lineStr, colAtEndOfNamesAndResidue, ResolveTypeNamesToCtors, ResolveOverloads.Yes, hasTextChangedSinceLastTypecheck) with
|
||||||
| None -> FSharpDeclarationListInfo.Empty
|
| None -> FSharpDeclarationListInfo.Empty
|
||||||
| Some(items,denv,m) ->
|
| Some(items,denv,m) ->
|
||||||
let items = items |> filterIntellisenseCompletionsBasedOnParseContext (parseResultsOpt |> Option.bind (fun x -> x.ParseTree)) (mkPos line colAtEndOfNamesAndResidue)
|
let items = items |> FilterAutoCompletesBasedOnParseContext parseResultsOpt (mkPos line colAtEndOfNamesAndResidue)
|
||||||
let items = if isInterfaceFile then items |> List.filter IsValidSignatureFileItem else items
|
let items = if isInterfaceFile then items |> List.filter IsValidSignatureFileItem else items
|
||||||
FSharpDeclarationListInfo.Create(infoReader,m,denv,items,reactorOps,checkAlive))
|
FSharpDeclarationListInfo.Create(infoReader,m,denv,items,reactorOps,checkAlive))
|
||||||
(fun msg -> FSharpDeclarationListInfo.Error msg)
|
(fun msg -> FSharpDeclarationListInfo.Error msg)
|
||||||
|
|
||||||
member x.GetDeclarationListSymbols (parseResultsOpt:FSharpParseFileResults option, line, lineStr, colAtEndOfNamesAndResidue, qualifyingNames, partialName, hasTextChangedSinceLastTypecheck) =
|
/// Get the symbols for auto-complete items at a location
|
||||||
|
member x.GetDeclarationListSymbols (parseResultsOpt, line, lineStr, colAtEndOfNamesAndResidue, qualifyingNames, partialName, hasTextChangedSinceLastTypecheck) =
|
||||||
let isInterfaceFile = SourceFileImpl.IsInterfaceFile mainInputFileName
|
let isInterfaceFile = SourceFileImpl.IsInterfaceFile mainInputFileName
|
||||||
ErrorScope.Protect
|
ErrorScope.Protect
|
||||||
Range.range0
|
Range.range0
|
||||||
|
@ -1180,7 +1110,7 @@ type TypeCheckInfo
|
||||||
match GetDeclItemsForNamesAtPosition(parseResultsOpt, Some qualifyingNames, Some partialName, line, lineStr, colAtEndOfNamesAndResidue, ResolveTypeNamesToCtors, ResolveOverloads.Yes, hasTextChangedSinceLastTypecheck) with
|
match GetDeclItemsForNamesAtPosition(parseResultsOpt, Some qualifyingNames, Some partialName, line, lineStr, colAtEndOfNamesAndResidue, ResolveTypeNamesToCtors, ResolveOverloads.Yes, hasTextChangedSinceLastTypecheck) with
|
||||||
| None -> List.Empty
|
| None -> List.Empty
|
||||||
| Some(items,_denv,_m) ->
|
| Some(items,_denv,_m) ->
|
||||||
let items = items |> filterIntellisenseCompletionsBasedOnParseContext (parseResultsOpt |> Option.bind (fun x -> x.ParseTree)) (mkPos line colAtEndOfNamesAndResidue)
|
let items = items |> FilterAutoCompletesBasedOnParseContext parseResultsOpt (mkPos line colAtEndOfNamesAndResidue)
|
||||||
let items = if isInterfaceFile then items |> List.filter IsValidSignatureFileItem else items
|
let items = if isInterfaceFile then items |> List.filter IsValidSignatureFileItem else items
|
||||||
|
|
||||||
//do filtering like Declarationset
|
//do filtering like Declarationset
|
||||||
|
@ -1216,7 +1146,7 @@ type TypeCheckInfo
|
||||||
let isOpItem(nm,item) =
|
let isOpItem(nm,item) =
|
||||||
match item with
|
match item with
|
||||||
| [Item.Value _]
|
| [Item.Value _]
|
||||||
| [Item.MethodGroup(_,[_])] ->
|
| [Item.MethodGroup(_,[_],_)] ->
|
||||||
(IsOpName nm) && nm.[0]='(' && nm.[nm.Length-1]=')'
|
(IsOpName nm) && nm.[0]='(' && nm.[nm.Length-1]=')'
|
||||||
| [Item.UnionCase _] -> IsOpName nm
|
| [Item.UnionCase _] -> IsOpName nm
|
||||||
| _ -> false
|
| _ -> false
|
||||||
|
@ -1240,6 +1170,7 @@ type TypeCheckInfo
|
||||||
items)
|
items)
|
||||||
(fun _msg -> [])
|
(fun _msg -> [])
|
||||||
|
|
||||||
|
/// Get the "reference resolution" tooltip for at a location
|
||||||
member scope.GetReferenceResolutionToolTipText(line,col) =
|
member scope.GetReferenceResolutionToolTipText(line,col) =
|
||||||
let pos = mkPos line col
|
let pos = mkPos line col
|
||||||
let lineIfExists(append) =
|
let lineIfExists(append) =
|
||||||
|
@ -1376,7 +1307,7 @@ type TypeCheckInfo
|
||||||
items
|
items
|
||||||
|> List.collect (fun item ->
|
|> List.collect (fun item ->
|
||||||
match item with
|
match item with
|
||||||
| Item.MethodGroup(nm,minfos) -> minfos |> List.map (fun minfo -> Item.MethodGroup(nm,[minfo]))
|
| Item.MethodGroup(nm,minfos,orig) -> minfos |> List.map (fun minfo -> Item.MethodGroup(nm,[minfo],orig))
|
||||||
| Item.CtorGroup(nm,cinfos) -> cinfos |> List.map (fun minfo -> Item.CtorGroup(nm,[minfo]))
|
| Item.CtorGroup(nm,cinfos) -> cinfos |> List.map (fun minfo -> Item.CtorGroup(nm,[minfo]))
|
||||||
| Item.FakeInterfaceCtor _
|
| Item.FakeInterfaceCtor _
|
||||||
| Item.DelegateCtor _ -> [item]
|
| Item.DelegateCtor _ -> [item]
|
||||||
|
@ -1391,7 +1322,7 @@ type TypeCheckInfo
|
||||||
let pinfo = List.head pinfos
|
let pinfo = List.head pinfos
|
||||||
if pinfo.IsIndexer then [item] else []
|
if pinfo.IsIndexer then [item] else []
|
||||||
#if EXTENSIONTYPING
|
#if EXTENSIONTYPING
|
||||||
| Params.ItemIsTypeWithStaticArguments g _ -> [item] // we pretend that provided-types-with-static-args are method-like in order to get ParamInfo for them
|
| Params.ItemIsWithStaticArguments m g _ -> [item] // we pretend that provided-types-with-static-args are method-like in order to get ParamInfo for them
|
||||||
#endif
|
#endif
|
||||||
| Item.CustomOperation(_name, _helpText, _minfo) -> [item]
|
| Item.CustomOperation(_name, _helpText, _minfo) -> [item]
|
||||||
| Item.TypeVar _ -> []
|
| Item.TypeVar _ -> []
|
||||||
|
@ -1414,7 +1345,7 @@ type TypeCheckInfo
|
||||||
// This is probably old code from when we supported 'go to definition' generating IL metadata.
|
// This is probably old code from when we supported 'go to definition' generating IL metadata.
|
||||||
let item =
|
let item =
|
||||||
match item with
|
match item with
|
||||||
| Item.MethodGroup (_, (ILMeth (_,ilinfo,_)) :: _)
|
| Item.MethodGroup (_, (ILMeth (_,ilinfo,_)) :: _, _)
|
||||||
| Item.CtorGroup (_, (ILMeth (_,ilinfo,_)) :: _) -> Item.Types ("", [ ilinfo.ApparentEnclosingType ])
|
| Item.CtorGroup (_, (ILMeth (_,ilinfo,_)) :: _) -> Item.Types ("", [ ilinfo.ApparentEnclosingType ])
|
||||||
| Item.ILField (ILFieldInfo (typeInfo, _)) -> Item.Types ("", [ typeInfo.ToType ])
|
| Item.ILField (ILFieldInfo (typeInfo, _)) -> Item.Types ("", [ typeInfo.ToType ])
|
||||||
| Item.ImplicitOp(_, {contents = Some(TraitConstraintSln.FSMethSln(_, vref, _))}) -> Item.Value(vref)
|
| Item.ImplicitOp(_, {contents = Some(TraitConstraintSln.FSMethSln(_, vref, _))}) -> Item.Value(vref)
|
||||||
|
@ -1423,9 +1354,9 @@ type TypeCheckInfo
|
||||||
let fail defaultReason =
|
let fail defaultReason =
|
||||||
match item with
|
match item with
|
||||||
#if EXTENSIONTYPING
|
#if EXTENSIONTYPING
|
||||||
| Params.ItemIsTypeWithStaticArguments g (tcref) -> FSharpFindDeclResult.DeclNotFound (FSharpFindDeclFailureReason.ProvidedType(tcref.DisplayName))
|
| Params.ItemIsProvidedType g (tcref) -> FSharpFindDeclResult.DeclNotFound (FSharpFindDeclFailureReason.ProvidedType(tcref.DisplayName))
|
||||||
| Item.CtorGroup(name, ProvidedMeth(_)::_)
|
| Item.CtorGroup(name, ProvidedMeth(_)::_)
|
||||||
| Item.MethodGroup(name, ProvidedMeth(_)::_)
|
| Item.MethodGroup(name, ProvidedMeth(_)::_, _)
|
||||||
| Item.Property(name, ProvidedProp(_)::_) -> FSharpFindDeclResult.DeclNotFound (FSharpFindDeclFailureReason.ProvidedMember(name))
|
| Item.Property(name, ProvidedProp(_)::_) -> FSharpFindDeclResult.DeclNotFound (FSharpFindDeclFailureReason.ProvidedMember(name))
|
||||||
| Item.Event(ProvidedEvent(_) as e) -> FSharpFindDeclResult.DeclNotFound (FSharpFindDeclFailureReason.ProvidedMember(e.EventName))
|
| Item.Event(ProvidedEvent(_) as e) -> FSharpFindDeclResult.DeclNotFound (FSharpFindDeclFailureReason.ProvidedMember(e.EventName))
|
||||||
| Item.ILField(ProvidedField(_) as f) -> FSharpFindDeclResult.DeclNotFound (FSharpFindDeclFailureReason.ProvidedMember(f.FieldName))
|
| Item.ILField(ProvidedField(_) as f) -> FSharpFindDeclResult.DeclNotFound (FSharpFindDeclFailureReason.ProvidedMember(f.FieldName))
|
||||||
|
|
|
@ -43,8 +43,11 @@ type internal FSharpMethodGroupItem =
|
||||||
/// The parameters of the method in the overload set
|
/// The parameters of the method in the overload set
|
||||||
member Parameters: FSharpMethodGroupItemParameter[]
|
member Parameters: FSharpMethodGroupItemParameter[]
|
||||||
|
|
||||||
/// Indicates that this not really a method, but actually a static arguments list, like TP<42,"foo">
|
/// Does the method support an arguments list? This is always true except for static type instantiations like TP<42,"foo">.
|
||||||
member IsStaticArguments: bool
|
member HasParameters: bool
|
||||||
|
|
||||||
|
/// Does the type name or method support a static arguments list, like TP<42,"foo"> or conn.CreateCommand<42, "foo">(arg1, arg2)?
|
||||||
|
member StaticParameters: FSharpMethodGroupItemParameter[]
|
||||||
|
|
||||||
/// Represents a group of methods (or other items) returned by GetMethods.
|
/// Represents a group of methods (or other items) returned by GetMethods.
|
||||||
[<Sealed>]
|
[<Sealed>]
|
||||||
|
|
|
@ -45,7 +45,6 @@ rem Disable strong-name validation for F# binaries built from open source that a
|
||||||
%SN32% -Vr FSharp.Build,b03f5f7f11d50a3a
|
%SN32% -Vr FSharp.Build,b03f5f7f11d50a3a
|
||||||
%SN32% -Vr FSharp.Compiler.Interactive.Settings,b03f5f7f11d50a3a
|
%SN32% -Vr FSharp.Compiler.Interactive.Settings,b03f5f7f11d50a3a
|
||||||
%SN32% -Vr FSharp.Compiler.Hosted,b03f5f7f11d50a3a
|
%SN32% -Vr FSharp.Compiler.Hosted,b03f5f7f11d50a3a
|
||||||
%SN32% -Vr FSharp.Data.TypeProviders,b03f5f7f11d50a3a
|
|
||||||
|
|
||||||
%SN32% -Vr fsc,b03f5f7f11d50a3a
|
%SN32% -Vr fsc,b03f5f7f11d50a3a
|
||||||
%SN32% -Vr fsi,b03f5f7f11d50a3a
|
%SN32% -Vr fsi,b03f5f7f11d50a3a
|
||||||
|
@ -70,7 +69,6 @@ if /i "%PROCESSOR_ARCHITECTURE%"=="AMD64" (
|
||||||
%SN64% -Vr FSharp.Build,b03f5f7f11d50a3a
|
%SN64% -Vr FSharp.Build,b03f5f7f11d50a3a
|
||||||
%SN64% -Vr FSharp.Compiler.Interactive.Settings,b03f5f7f11d50a3a
|
%SN64% -Vr FSharp.Compiler.Interactive.Settings,b03f5f7f11d50a3a
|
||||||
%SN64% -Vr FSharp.Compiler.Hosted,b03f5f7f11d50a3a
|
%SN64% -Vr FSharp.Compiler.Hosted,b03f5f7f11d50a3a
|
||||||
%SN64% -Vr FSharp.Data.TypeProviders,b03f5f7f11d50a3a
|
|
||||||
|
|
||||||
%SN64% -Vr fsc,b03f5f7f11d50a3a
|
%SN64% -Vr fsc,b03f5f7f11d50a3a
|
||||||
%SN64% -Vr fsi,b03f5f7f11d50a3a
|
%SN64% -Vr fsi,b03f5f7f11d50a3a
|
||||||
|
|
|
@ -236,7 +236,6 @@ if exist "%FSCBinPath%\..\..\portable47\bin\FSharp.Core.dll" set FSCOREDLLPORTAB
|
||||||
if exist "%FSCBinPath%\..\..\portable7\bin\FSharp.Core.dll" set FSCOREDLLNETCOREPATH=%FSCBinPath%\..\..\portable7\bin
|
if exist "%FSCBinPath%\..\..\portable7\bin\FSharp.Core.dll" set FSCOREDLLNETCOREPATH=%FSCBinPath%\..\..\portable7\bin
|
||||||
IF exist "%FSCBinPath%\..\..\portable78\bin\FSharp.Core.dll" set FSCOREDLLNETCORE78PATH=%FSCBinPath%\..\..\portable78\bin
|
IF exist "%FSCBinPath%\..\..\portable78\bin\FSharp.Core.dll" set FSCOREDLLNETCORE78PATH=%FSCBinPath%\..\..\portable78\bin
|
||||||
IF exist "%FSCBinPath%\..\..\portable259\bin\FSharp.Core.dll" set FSCOREDLLNETCORE259PATH=%FSCBinPath%\..\..\portable259\bin
|
IF exist "%FSCBinPath%\..\..\portable259\bin\FSharp.Core.dll" set FSCOREDLLNETCORE259PATH=%FSCBinPath%\..\..\portable259\bin
|
||||||
if exist "%FSCBinPath%\FSharp.Data.TypeProviders.dll" set FSDATATPPATH=%FSCBinPath%
|
|
||||||
|
|
||||||
set FSCOREDLLPATH=%FSCOREDLLPATH%\FSharp.Core.dll
|
set FSCOREDLLPATH=%FSCOREDLLPATH%\FSharp.Core.dll
|
||||||
set FSCOREDLL20PATH=%FSCOREDLL20PATH%\FSharp.Core.dll
|
set FSCOREDLL20PATH=%FSCOREDLL20PATH%\FSharp.Core.dll
|
||||||
|
@ -244,7 +243,6 @@ set FSCOREDLLPORTABLEPATH=%FSCOREDLLPORTABLEPATH%\FSharp.Core.dll
|
||||||
set FSCOREDLLNETCOREPATH=%FSCOREDLLNETCOREPATH%\FSharp.Core.dll
|
set FSCOREDLLNETCOREPATH=%FSCOREDLLNETCOREPATH%\FSharp.Core.dll
|
||||||
set FSCOREDLLNETCORE78PATH=%FSCOREDLLNETCORE78PATH%\FSharp.Core.dll
|
set FSCOREDLLNETCORE78PATH=%FSCOREDLLNETCORE78PATH%\FSharp.Core.dll
|
||||||
set FSCOREDLLNETCORE259PATH=%FSCOREDLLNETCORE259PATH%\FSharp.Core.dll
|
set FSCOREDLLNETCORE259PATH=%FSCOREDLLNETCORE259PATH%\FSharp.Core.dll
|
||||||
set FSDATATPPATH=%FSDATATPPATH%\FSharp.Data.TypeProviders.dll
|
|
||||||
set FSCOREDLLVPREVPATH=%FSCOREDLLVPREVPATH%\FSharp.Core.dll
|
set FSCOREDLLVPREVPATH=%FSCOREDLLVPREVPATH%\FSharp.Core.dll
|
||||||
|
|
||||||
for /d %%i in (%WINDIR%\Microsoft.NET\Framework\v4.0.?????) do set CORDIR=%%i
|
for /d %%i in (%WINDIR%\Microsoft.NET\Framework\v4.0.?????) do set CORDIR=%%i
|
||||||
|
|
|
@ -277,7 +277,6 @@ IF EXIST "%FSCBinPath%\..\..\portable47\bin\FSharp.Core.dll" set FSCOREDLLPORTAB
|
||||||
IF EXIST "%FSCBinPath%\..\..\portable7\bin\FSharp.Core.dll" set FSCOREDLLNETCOREPATH=%FSCBinPath%\..\..\portable7\bin
|
IF EXIST "%FSCBinPath%\..\..\portable7\bin\FSharp.Core.dll" set FSCOREDLLNETCOREPATH=%FSCBinPath%\..\..\portable7\bin
|
||||||
IF EXIST "%FSCBinPath%\..\..\portable78\bin\FSharp.Core.dll" set FSCOREDLLNETCORE78PATH=%FSCBinPath%\..\..\portable78\bin
|
IF EXIST "%FSCBinPath%\..\..\portable78\bin\FSharp.Core.dll" set FSCOREDLLNETCORE78PATH=%FSCBinPath%\..\..\portable78\bin
|
||||||
IF EXIST "%FSCBinPath%\..\..\portable259\bin\FSharp.Core.dll" set FSCOREDLLNETCORE259PATH=%FSCBinPath%\..\..\portable259\bin
|
IF EXIST "%FSCBinPath%\..\..\portable259\bin\FSharp.Core.dll" set FSCOREDLLNETCORE259PATH=%FSCBinPath%\..\..\portable259\bin
|
||||||
IF EXIST "%FSCBinPath%\FSharp.Data.TypeProviders.dll" set FSDATATPPATH=%FSCBinPath%
|
|
||||||
|
|
||||||
set FSCOREDLLPATH=%FSCOREDLLPATH%\FSharp.Core.dll
|
set FSCOREDLLPATH=%FSCOREDLLPATH%\FSharp.Core.dll
|
||||||
set FSCOREDLL20PATH=%FSCOREDLL20PATH%\FSharp.Core.dll
|
set FSCOREDLL20PATH=%FSCOREDLL20PATH%\FSharp.Core.dll
|
||||||
|
|
|
@ -90,11 +90,6 @@ let private GetFSLibPaths env osArch fscBinPath =
|
||||||
| Some d when fileExists (d/"FSharp.Core.dll") -> FSCOREDLLNETCORE259PATH <- d
|
| Some d when fileExists (d/"FSharp.Core.dll") -> FSCOREDLLNETCORE259PATH <- d
|
||||||
| Some _ | None -> ()
|
| Some _ | None -> ()
|
||||||
|
|
||||||
// IF EXIST "%FSCBinPath%\FSharp.Data.TypeProviders.dll" set FSDATATPPATH=%FSCBinPath%
|
|
||||||
match fscBinPath with
|
|
||||||
| Some d when fileExists (d/"FSharp.Data.TypeProviders.dll") -> FSDATATPPATH <- d
|
|
||||||
| Some _ | None -> ()
|
|
||||||
|
|
||||||
// set FSCOREDLLPATH=%FSCOREDLLPATH%\FSharp.Core.dll
|
// set FSCOREDLLPATH=%FSCOREDLLPATH%\FSharp.Core.dll
|
||||||
FSCOREDLLPATH <- FSCOREDLLPATH/"FSharp.Core.dll"
|
FSCOREDLLPATH <- FSCOREDLLPATH/"FSharp.Core.dll"
|
||||||
// set FSCOREDLL20PATH=%FSCOREDLL20PATH%\FSharp.Core.dll
|
// set FSCOREDLL20PATH=%FSCOREDLL20PATH%\FSharp.Core.dll
|
||||||
|
@ -107,8 +102,6 @@ let private GetFSLibPaths env osArch fscBinPath =
|
||||||
FSCOREDLLNETCORE78PATH <- FSCOREDLLNETCORE78PATH/"FSharp.Core.dll"
|
FSCOREDLLNETCORE78PATH <- FSCOREDLLNETCORE78PATH/"FSharp.Core.dll"
|
||||||
// set FSCOREDLLNETCORE259PATH=%FSCOREDLLNETCORE259PATH%\FSharp.Core.dll
|
// set FSCOREDLLNETCORE259PATH=%FSCOREDLLNETCORE259PATH%\FSharp.Core.dll
|
||||||
FSCOREDLLNETCORE259PATH <- FSCOREDLLNETCORE259PATH/"FSharp.Core.dll"
|
FSCOREDLLNETCORE259PATH <- FSCOREDLLNETCORE259PATH/"FSharp.Core.dll"
|
||||||
// set FSDATATPPATH=%FSDATATPPATH%\FSharp.Data.TypeProviders.dll
|
|
||||||
FSDATATPPATH <- FSDATATPPATH/"FSharp.Data.TypeProviders.dll"
|
|
||||||
// set FSCOREDLLVPREVPATH=%FSCOREDLLVPREVPATH%\FSharp.Core.dll
|
// set FSCOREDLLVPREVPATH=%FSCOREDLLVPREVPATH%\FSharp.Core.dll
|
||||||
FSCOREDLLVPREVPATH <- FSCOREDLLVPREVPATH/"FSharp.Core.dll"
|
FSCOREDLLVPREVPATH <- FSCOREDLLVPREVPATH/"FSharp.Core.dll"
|
||||||
|
|
||||||
|
|
|
@ -91,7 +91,6 @@
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Compile Include="typeProviders\build-typeprovider-test.fs" />
|
<Compile Include="typeProviders\build-typeprovider-test.fs" />
|
||||||
<Compile Include="typeProviders\builtin\copyFSharpDataTypeProviderDLL.fs" />
|
|
||||||
<Compile Include="typeProviders\tests_typeProviders.fs" />
|
<Compile Include="typeProviders\tests_typeProviders.fs" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|
|
@ -1,69 +0,0 @@
|
||||||
@if "%_echo%"=="" echo off
|
|
||||||
|
|
||||||
setlocal
|
|
||||||
|
|
||||||
REM Configure the sample, i.e. where to find the F# compiler and C# compiler.
|
|
||||||
if EXIST build.ok DEL /f /q build.ok
|
|
||||||
|
|
||||||
call %~d0%~p0..\..\..\config.bat
|
|
||||||
|
|
||||||
if NOT "%FSC:NOTAVAIL=X%" == "%FSC%" (
|
|
||||||
ECHO Skipping test for FSI.EXE
|
|
||||||
goto Skip
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
rem fsc.exe building
|
|
||||||
|
|
||||||
|
|
||||||
"%FSC%" %fsc_flags% -o:test.exe -g test.fsx
|
|
||||||
@if ERRORLEVEL 1 goto Error
|
|
||||||
|
|
||||||
"%PEVERIFY%" test.exe
|
|
||||||
@if ERRORLEVEL 1 goto Error
|
|
||||||
|
|
||||||
"%FSC%" %fsc_flags% --optimize -o:test--optimize.exe -g test.fsx
|
|
||||||
@if ERRORLEVEL 1 goto Error
|
|
||||||
|
|
||||||
"%PEVERIFY%" test--optimize.exe
|
|
||||||
@if ERRORLEVEL 1 goto Error
|
|
||||||
|
|
||||||
REM ==
|
|
||||||
REM == Disabled until Don checks in the missing files
|
|
||||||
REM ==
|
|
||||||
GOTO :SkipMultiPartTests
|
|
||||||
"%FSC%" %fsc_flags% -a -o:testlib.dll -r:System.Data.Services.Client.dll -r:FSharp.Data.TypeProviders.dll -g test-part1.fs @if ERRORLEVEL 1 goto Error
|
|
||||||
|
|
||||||
"%PEVERIFY%" testlib.dll
|
|
||||||
@if ERRORLEVEL 1 goto Error
|
|
||||||
|
|
||||||
"%FSC%" %fsc_flags% -r:testlib.dll -o:testapp.exe -r:System.Data.Services.Client.dll -g test-part2.fs
|
|
||||||
@if ERRORLEVEL 1 goto Error
|
|
||||||
|
|
||||||
"%PEVERIFY%" testapp.exe
|
|
||||||
@if ERRORLEVEL 1 goto Error
|
|
||||||
|
|
||||||
"%FSC%" %fsc_flags% -o:testtwoparts.exe -r:System.Data.Services.Client.dll -r:FSharp.Data.TypeProviders.dll -g test-part1.fs test-part2.fs
|
|
||||||
@if ERRORLEVEL 1 goto Error
|
|
||||||
|
|
||||||
"%PEVERIFY%" testtwoparts.exe
|
|
||||||
@if ERRORLEVEL 1 goto Error
|
|
||||||
|
|
||||||
:SkipMultiPartTests
|
|
||||||
|
|
||||||
:Ok
|
|
||||||
echo Built fsharp %~f0 ok.
|
|
||||||
echo. > build.ok
|
|
||||||
endlocal
|
|
||||||
exit /b 0
|
|
||||||
|
|
||||||
:Skip
|
|
||||||
echo Skipped %~f0
|
|
||||||
endlocal
|
|
||||||
exit /b 0
|
|
||||||
|
|
||||||
|
|
||||||
:Error
|
|
||||||
endlocal
|
|
||||||
exit /b %ERRORLEVEL%
|
|
||||||
|
|
|
@ -1,78 +0,0 @@
|
||||||
@if "%_echo%"=="" echo off
|
|
||||||
|
|
||||||
setlocal
|
|
||||||
dir build.ok > NUL ) || (
|
|
||||||
@echo 'build.ok' not found.
|
|
||||||
goto :ERROR
|
|
||||||
)
|
|
||||||
|
|
||||||
call %~d0%~p0..\..\..\config.bat
|
|
||||||
|
|
||||||
REM fsi.exe testing
|
|
||||||
|
|
||||||
|
|
||||||
echo TestC
|
|
||||||
|
|
||||||
if exist test.ok (del /f /q test.ok)
|
|
||||||
"%FSI%" %fsi_flags% test.fsx
|
|
||||||
if NOT EXIST test.ok goto SetError
|
|
||||||
|
|
||||||
REM fsc.exe testing
|
|
||||||
|
|
||||||
echo TestD
|
|
||||||
if exist test.ok (del /f /q test.ok)
|
|
||||||
%CLIX% test.exe
|
|
||||||
@if ERRORLEVEL 1 goto Error
|
|
||||||
if NOT EXIST test.ok goto SetError
|
|
||||||
|
|
||||||
if exist test.ok (del /f /q test.ok)
|
|
||||||
%CLIX% test--optimize.exe
|
|
||||||
@if ERRORLEVEL 1 goto Error
|
|
||||||
if NOT EXIST test.ok goto SetError
|
|
||||||
|
|
||||||
REM ==
|
|
||||||
REM == Disabled until Don checks in the missing files
|
|
||||||
REM ==
|
|
||||||
GOTO :SkipMultiPartTests
|
|
||||||
|
|
||||||
if exist test.ok (del /f /q test.ok)
|
|
||||||
%CLIX% testapp.exe
|
|
||||||
@if ERRORLEVEL 1 goto Error
|
|
||||||
if NOT EXIST test.ok goto SetError
|
|
||||||
|
|
||||||
if exist test.ok (del /f /q test.ok)
|
|
||||||
%CLIX% testtwoparts.exe
|
|
||||||
@if ERRORLEVEL 1 goto Error
|
|
||||||
if NOT EXIST test.ok goto SetError
|
|
||||||
|
|
||||||
if exist test.ok (del /f /q test.ok)
|
|
||||||
%CLIX% testapp.exe
|
|
||||||
@if ERRORLEVEL 1 goto Error
|
|
||||||
if NOT EXIST test.ok goto SetError
|
|
||||||
|
|
||||||
if exist test.ok (del /f /q test.ok)
|
|
||||||
%CLIX% testtwoparts.exe
|
|
||||||
@if ERRORLEVEL 1 goto Error
|
|
||||||
if NOT EXIST test.ok goto SetError
|
|
||||||
:SkipMultiPartTests
|
|
||||||
|
|
||||||
:Ok
|
|
||||||
echo Ran fsharp %~f0 ok.
|
|
||||||
endlocal
|
|
||||||
exit /b 0
|
|
||||||
|
|
||||||
:Skip
|
|
||||||
echo Skipped %~f0
|
|
||||||
endlocal
|
|
||||||
exit /b 0
|
|
||||||
|
|
||||||
|
|
||||||
:Error
|
|
||||||
echo Test Script Failed (perhaps test did not emit test.ok signal file?)
|
|
||||||
endlocal
|
|
||||||
exit /b %ERRORLEVEL%
|
|
||||||
|
|
||||||
|
|
||||||
:SETERROR
|
|
||||||
set NonexistentErrorLevel 2> nul
|
|
||||||
goto Error
|
|
|
@ -1,145 +0,0 @@
|
||||||
// #Quotations
|
|
||||||
#nowarn "57"
|
|
||||||
#r "System.Data.Services.Client.dll"
|
|
||||||
#r "FSharp.Data.TypeProviders.dll"
|
|
||||||
|
|
||||||
open Microsoft.FSharp.Linq
|
|
||||||
open Microsoft.FSharp.Data.TypeProviders
|
|
||||||
open System
|
|
||||||
open Microsoft.FSharp.Quotations
|
|
||||||
open Microsoft.FSharp.Quotations.ExprShape
|
|
||||||
open Microsoft.FSharp.Linq.RuntimeHelpers
|
|
||||||
|
|
||||||
[<AutoOpen>]
|
|
||||||
module Infrastructure =
|
|
||||||
let mutable failures = []
|
|
||||||
let reportFailure s =
|
|
||||||
stderr.WriteLine " NO"; failures <- s :: failures
|
|
||||||
|
|
||||||
let argv = System.Environment.GetCommandLineArgs()
|
|
||||||
let SetCulture() =
|
|
||||||
if argv.Length > 2 && argv.[1] = "--culture" then
|
|
||||||
let cultureString = argv.[2]
|
|
||||||
let culture = new System.Globalization.CultureInfo(cultureString)
|
|
||||||
stdout.WriteLine ("Running under culture "+culture.ToString()+"...");
|
|
||||||
System.Threading.Thread.CurrentThread.CurrentCulture <- culture
|
|
||||||
|
|
||||||
do SetCulture()
|
|
||||||
|
|
||||||
let check s v1 v2 =
|
|
||||||
if v1 = v2 then
|
|
||||||
printfn "test %s...passed " s
|
|
||||||
else
|
|
||||||
failures <- failures @ [(s, box v1, box v2)]
|
|
||||||
printfn "test %s...failed, expected \n\t%A\ngot\n\t%A" s v2 v1
|
|
||||||
|
|
||||||
let test s b = check s b true
|
|
||||||
let qmap f (x:System.Linq.IQueryable<_>) = x |> Seq.map f |> System.Linq.Queryable.AsQueryable
|
|
||||||
|
|
||||||
let checkCommuteSeq s (q1: System.Linq.IQueryable<'T>) q2 =
|
|
||||||
check s (q1 |> Seq.toList) (q2 |> Seq.toList)
|
|
||||||
|
|
||||||
let checkCommuteVal s q1 q2 =
|
|
||||||
check s q1 q2
|
|
||||||
|
|
||||||
|
|
||||||
type Northwest = ODataService< "http://services.odata.org/V2/Northwind/Northwind.svc/",LocalSchemaFile="schema1.csdl",ForceUpdate=false >
|
|
||||||
|
|
||||||
module Test = begin end
|
|
||||||
|
|
||||||
module DuplicateTypes =
|
|
||||||
|
|
||||||
type Northwest = ODataService< "http://services.odata.org/V2/Northwind/Northwind.svc/",LocalSchemaFile="schema2.csdl",ForceUpdate=false >
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
type Northwest2 = ODataService< "http://services.odata.org/V2/Northwind/Northwind.svc/",LocalSchemaFile="schema3.csdl",ForceUpdate=false >
|
|
||||||
|
|
||||||
|
|
||||||
open System
|
|
||||||
open Microsoft.FSharp.Quotations
|
|
||||||
open Microsoft.FSharp.Quotations.ExprShape
|
|
||||||
open Microsoft.FSharp.Linq
|
|
||||||
open Microsoft.FSharp.Linq.RuntimeHelpers
|
|
||||||
|
|
||||||
module Queryable =
|
|
||||||
|
|
||||||
let db = Northwest.GetDataContext()
|
|
||||||
let urlCapture = new System.Text.StringBuilder()
|
|
||||||
db.DataContext.SendingRequest.Add (fun x -> printfn "yurl = %A" x.Request.RequestUri; urlCapture.Append x.Request.RequestUri |> ignore)
|
|
||||||
|
|
||||||
let checkODataUrlTextForValue s (q1: unit -> 'T) (text:string) =
|
|
||||||
urlCapture.Clear() |> ignore
|
|
||||||
q1() |> ignore
|
|
||||||
let url = urlCapture.ToString()
|
|
||||||
check s url text
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
let allCustomersQuery =
|
|
||||||
checkODataUrlTextForValue "vwe4yuwe09uu"
|
|
||||||
(fun () -> query { for c in db.Customers do select c } |> Seq.length)
|
|
||||||
"http://services.odata.org/V2/Northwind/Northwind.svc/Customers()"
|
|
||||||
|
|
||||||
|
|
||||||
let allEmployeesQuery =
|
|
||||||
checkODataUrlTextForValue "vwe4yuwe09uu"
|
|
||||||
(fun () -> query { for c in db.Employees do select c } |> Seq.length)
|
|
||||||
"http://services.odata.org/V2/Northwind/Northwind.svc/Employees()"
|
|
||||||
|
|
||||||
let allProductsQuery =
|
|
||||||
checkODataUrlTextForValue "vwe4yuwe09uu"
|
|
||||||
(fun () -> query { for c in db.Products do select c } |> Seq.length)
|
|
||||||
"http://services.odata.org/V2/Northwind/Northwind.svc/Products()"
|
|
||||||
|
|
||||||
|
|
||||||
let allOrdersQuery =
|
|
||||||
checkODataUrlTextForValue "vwe4yuwe09uu"
|
|
||||||
(fun () -> query { for c in db.Orders do select c } |> Seq.length)
|
|
||||||
"http://services.odata.org/V2/Northwind/Northwind.svc/Orders()"
|
|
||||||
|
|
||||||
|
|
||||||
let firstFiveOrders =
|
|
||||||
checkODataUrlTextForValue "vwe4yuwe09uu"
|
|
||||||
(fun () -> query { for c in db.Orders do take 5; select c } |> Seq.length)
|
|
||||||
"http://services.odata.org/V2/Northwind/Northwind.svc/Orders()?$top=5"
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
let ordersSortedByShipDateLatestFirst =
|
|
||||||
checkODataUrlTextForValue "vwe4yuwe09uu"
|
|
||||||
(fun () -> query { for o in db.Orders do sortByNullableDescending o.ShippedDate; select (o.OrderID, o.ShippedDate) } |> Seq.length)
|
|
||||||
"http://services.odata.org/V2/Northwind/Northwind.svc/Orders()?$orderby=ShippedDate desc&$select=OrderID,ShippedDate"
|
|
||||||
|
|
||||||
|
|
||||||
let ordersSortedByShipDateEarliestFirst =
|
|
||||||
checkODataUrlTextForValue "vwe4yuwe09uu"
|
|
||||||
(fun () -> query { for o in db.Orders do sortByNullable o.ShippedDate; select (o.OrderID, o.ShippedDate) } |> Seq.length)
|
|
||||||
"http://services.odata.org/V2/Northwind/Northwind.svc/Orders()?$orderby=ShippedDate&$select=OrderID,ShippedDate"
|
|
||||||
|
|
||||||
|
|
||||||
let ordersSortedByCustomerIDAndShipDateLatestFirst=
|
|
||||||
checkODataUrlTextForValue "vwe4yuwe09uu"
|
|
||||||
(fun () -> query { for o in db.Orders do sortBy o.CustomerID; thenByNullableDescending o.ShippedDate; select (o.CustomerID, o.OrderID, o.ShippedDate) } |> Seq.length)
|
|
||||||
"http://services.odata.org/V2/Northwind/Northwind.svc/Orders()?$orderby=CustomerID,ShippedDate desc&$select=CustomerID,OrderID,ShippedDate"
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
let ordersSortedByCustomerIDAndShipDateEarliestFirst=
|
|
||||||
checkODataUrlTextForValue "vwe4yuwe09uu"
|
|
||||||
(fun () -> query { for o in db.Orders do sortBy o.CustomerID; thenByNullable o.ShippedDate; select (o.CustomerID, o.OrderID, o.ShippedDate) } |> Seq.length)
|
|
||||||
"http://services.odata.org/V2/Northwind/Northwind.svc/Orders()?$orderby=CustomerID,ShippedDate&$select=CustomerID,OrderID,ShippedDate"
|
|
||||||
|
|
||||||
#if COMPILED
|
|
||||||
[<System.STAThread>]
|
|
||||||
do()
|
|
||||||
#endif
|
|
||||||
|
|
||||||
let _ =
|
|
||||||
if not failures.IsEmpty then (printfn "Test Failed, failures = %A" failures; exit 1)
|
|
||||||
else (stdout.WriteLine "Test Passed";
|
|
||||||
System.IO.File.WriteAllText("test.ok","ok");
|
|
||||||
exit 0)
|
|
||||||
|
|
||||||
|
|
|
@ -1929,78 +1929,6 @@ module QueriesOverIQueryable =
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
module QueriesOverOData =
|
|
||||||
|
|
||||||
let build cfg dir = attempt {
|
|
||||||
|
|
||||||
let exec p = Command.exec dir cfg.EnvironmentVariables { Output = Inherit; Input = None; } p >> checkResult
|
|
||||||
let fsc = Printf.ksprintf (Commands.fsc exec cfg.FSC)
|
|
||||||
let peverify = Commands.peverify exec cfg.PEVERIFY "/nologo"
|
|
||||||
|
|
||||||
// "%FSC%" %fsc_flags% -o:test.exe -g test.fsx
|
|
||||||
do! fsc "%s -o:test.exe -g" cfg.fsc_flags ["test.fsx"]
|
|
||||||
|
|
||||||
// "%PEVERIFY%" test.exe
|
|
||||||
do! peverify "test.exe"
|
|
||||||
|
|
||||||
// "%FSC%" %fsc_flags% --optimize -o:test--optimize.exe -g test.fsx
|
|
||||||
do! fsc "%s --optimize -o:test--optimize.exe -g" cfg.fsc_flags ["test.fsx"]
|
|
||||||
|
|
||||||
// "%PEVERIFY%" test--optimize.exe
|
|
||||||
do! peverify "test--optimize.exe"
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
let run cfg dir = attempt {
|
|
||||||
|
|
||||||
let exec p = Command.exec dir cfg.EnvironmentVariables { Output = Inherit; Input = None; } p >> checkResult
|
|
||||||
let fsi = Printf.ksprintf (Commands.fsi exec cfg.FSI)
|
|
||||||
let fileguard = (Commands.getfullpath dir) >> FileGuard.create
|
|
||||||
|
|
||||||
// REM fsi.exe testing
|
|
||||||
// echo TestC
|
|
||||||
log "TestC"
|
|
||||||
|
|
||||||
// if exist test.ok (del /f /q test.ok)
|
|
||||||
use testOkFile = fileguard "test.ok"
|
|
||||||
// "%FSI%" %fsi_flags% test.fsx
|
|
||||||
do! fsi "%s" cfg.fsi_flags ["test.fsx"]
|
|
||||||
// if NOT EXIST test.ok goto SetError
|
|
||||||
do! testOkFile |> NUnitConf.checkGuardExists
|
|
||||||
|
|
||||||
// REM fsc.exe testing
|
|
||||||
// echo TestD
|
|
||||||
log "TestD"
|
|
||||||
|
|
||||||
// if exist test.ok (del /f /q test.ok)
|
|
||||||
use testOkFile2 = fileguard "test.ok"
|
|
||||||
// %CLIX% test.exe
|
|
||||||
do! exec ("."/"test.exe") ""
|
|
||||||
// if NOT EXIST test.ok goto SetError
|
|
||||||
do! testOkFile2 |> NUnitConf.checkGuardExists
|
|
||||||
|
|
||||||
|
|
||||||
// if exist test.ok (del /f /q test.ok)
|
|
||||||
use testOkFile3 = fileguard "test.ok"
|
|
||||||
// %CLIX% test--optimize.exe
|
|
||||||
do! exec ("."/"test--optimize.exe") ""
|
|
||||||
// if NOT EXIST test.ok goto SetError
|
|
||||||
do! testOkFile3 |> NUnitConf.checkGuardExists
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
[<Test; FSharpSuiteTest("core/queriesOverOData")>]
|
|
||||||
let queriesOverOData () = check (attempt {
|
|
||||||
let { Directory = dir; Config = cfg } = testContext ()
|
|
||||||
|
|
||||||
do! build cfg dir
|
|
||||||
|
|
||||||
do! run cfg dir
|
|
||||||
|
|
||||||
})
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
module QuotesDebugInfo =
|
module QuotesDebugInfo =
|
||||||
|
|
||||||
let build cfg dir = attempt {
|
let build cfg dir = attempt {
|
||||||
|
|
|
@ -27,6 +27,6 @@
|
||||||
"ubuntu.14.04-x64": { }
|
"ubuntu.14.04-x64": { }
|
||||||
},
|
},
|
||||||
"frameworks": {
|
"frameworks": {
|
||||||
"dnxcore50": { }
|
"netstandard1.5": { }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -33,6 +33,4 @@ wedgeAssembly/providedJ.dll
|
||||||
wedgeAssembly/providedK.dll
|
wedgeAssembly/providedK.dll
|
||||||
wedgeAssembly/provider.dll
|
wedgeAssembly/provider.dll
|
||||||
|
|
||||||
builtin/SqlDataConnection/DataDirectory
|
|
||||||
builtin/SqlDataConnection/ExampleResolutionFolder
|
|
||||||
|
|
||||||
|
|
|
@ -1,29 +0,0 @@
|
||||||
|
|
||||||
FSharp.Data.TypeProviders.dll
|
|
||||||
|
|
||||||
EdmxFile/SampleModel01.edmx
|
|
||||||
|
|
||||||
EdmxFile/*.exe.config
|
|
||||||
EdmxFile/*.dll.config
|
|
||||||
|
|
||||||
ODataService/*.exe.config
|
|
||||||
ODataService/*.dll.config
|
|
||||||
ODataService/svc.csdl
|
|
||||||
ODataService/svc2.csdl
|
|
||||||
|
|
||||||
SqlDataConnection/*.exe.config
|
|
||||||
SqlDataConnection/*.dll.config
|
|
||||||
SqlDataConnection/app.config
|
|
||||||
SqlDataConnection/NORTHWND.mdf
|
|
||||||
SqlDataConnection/NORTHWND_log.ldf
|
|
||||||
SqlDataConnection/nwind2.dbml
|
|
||||||
SqlDataConnection/nwind3.dbml
|
|
||||||
SqlDataConnection/test.config
|
|
||||||
|
|
||||||
SqlEntityConnection/*.exe.config
|
|
||||||
SqlEntityConnection/*.dll.config
|
|
||||||
|
|
||||||
WsdlService/*.exe.config
|
|
||||||
WsdlService/*.dll.config
|
|
||||||
WsdlService/sfile.wsdlschema
|
|
||||||
WsdlService/sfile2.wsdlschema
|
|
|
@ -1,87 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<edmx:Edmx Version="2.0" xmlns:edmx="http://schemas.microsoft.com/ado/2008/10/edmx">
|
|
||||||
<!-- EF Runtime content -->
|
|
||||||
<edmx:Runtime>
|
|
||||||
<!-- SSDL content -->
|
|
||||||
<edmx:StorageModels>
|
|
||||||
<Schema xmlns="http://schemas.microsoft.com/ado/2009/02/edm/ssdl" Namespace="SampleModel01.Store" Alias="Self" Provider="System.Data.SqlClient" ProviderManifestToken="2005">
|
|
||||||
<EntityContainer Name="SampleModel01TargetContainer" >
|
|
||||||
</EntityContainer>
|
|
||||||
</Schema>
|
|
||||||
</edmx:StorageModels>
|
|
||||||
<!-- CSDL content -->
|
|
||||||
<edmx:ConceptualModels>
|
|
||||||
<Schema xmlns="http://schemas.microsoft.com/ado/2008/09/edm" xmlns:cg="http://schemas.microsoft.com/ado/2006/04/codegeneration" xmlns:store="http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator" Namespace="SampleModel01" Alias="Self" xmlns:annotation="http://schemas.microsoft.com/ado/2009/02/edm/annotation">
|
|
||||||
<EntityContainer Name="SampleModel01Container" annotation:LazyLoadingEnabled="true">
|
|
||||||
<EntitySet Name="Orders" EntityType="SampleModel01.Orders" />
|
|
||||||
<EntitySet Name="Persons" EntityType="SampleModel01.Persons" />
|
|
||||||
<AssociationSet Name="CustomersOrders" Association="SampleModel01.CustomersOrders">
|
|
||||||
<End Role="Customers" EntitySet="Persons" />
|
|
||||||
<End Role="Orders" EntitySet="Orders" />
|
|
||||||
</AssociationSet>
|
|
||||||
</EntityContainer>
|
|
||||||
<EntityType Name="Customers" BaseType="SampleModel01.Persons">
|
|
||||||
<Property Type="Int32" Name="Id" Nullable="false" annotation:StoreGeneratedPattern="Identity" />
|
|
||||||
<NavigationProperty Name="Orders" Relationship="SampleModel01.CustomersOrders" FromRole="Customers" ToRole="Orders" />
|
|
||||||
</EntityType>
|
|
||||||
<EntityType Name="Orders">
|
|
||||||
<Key>
|
|
||||||
<PropertyRef Name="Id" />
|
|
||||||
</Key>
|
|
||||||
<Property Type="Int32" Name="Id" Nullable="false" annotation:StoreGeneratedPattern="Identity" />
|
|
||||||
<Property Type="Int32" Name="CustomersId" Nullable="false" />
|
|
||||||
<NavigationProperty Name="Customer" Relationship="SampleModel01.CustomersOrders" FromRole="Orders" ToRole="Customers" />
|
|
||||||
</EntityType>
|
|
||||||
<EntityType Name="Persons">
|
|
||||||
<Key>
|
|
||||||
<PropertyRef Name="ID" />
|
|
||||||
</Key>
|
|
||||||
<Property Type="Int32" Name="ID" Nullable="false" annotation:StoreGeneratedPattern="Identity" />
|
|
||||||
<Property Type="String" Name="FirstName" Nullable="false" />
|
|
||||||
<Property Type="String" Name="LastName" Nullable="false" />
|
|
||||||
</EntityType>
|
|
||||||
<Association Name="CustomersOrders">
|
|
||||||
<End Type="SampleModel01.Customers" Role="Customers" Multiplicity="1" />
|
|
||||||
<End Type="SampleModel01.Orders" Role="Orders" Multiplicity="*" />
|
|
||||||
</Association>
|
|
||||||
</Schema>
|
|
||||||
</edmx:ConceptualModels>
|
|
||||||
<!-- C-S mapping content -->
|
|
||||||
<edmx:Mappings>
|
|
||||||
<Mapping xmlns="http://schemas.microsoft.com/ado/2008/09/mapping/cs" Space="C-S">
|
|
||||||
<Alias Key="Model" Value="SampleModel01" />
|
|
||||||
<Alias Key="Target" Value="SampleModel01.Store" />
|
|
||||||
<EntityContainerMapping CdmEntityContainer="SampleModel01Container" StorageEntityContainer="SampleModel01TargetContainer">
|
|
||||||
</EntityContainerMapping>
|
|
||||||
</Mapping>
|
|
||||||
</edmx:Mappings>
|
|
||||||
</edmx:Runtime>
|
|
||||||
<!-- EF Designer content (DO NOT EDIT MANUALLY BELOW HERE) -->
|
|
||||||
<edmx:Designer xmlns="http://schemas.microsoft.com/ado/2008/10/edmx">
|
|
||||||
<edmx:Connection>
|
|
||||||
<DesignerInfoPropertySet>
|
|
||||||
<DesignerProperty Name="MetadataArtifactProcessing" Value="EmbedInOutputAssembly" />
|
|
||||||
</DesignerInfoPropertySet>
|
|
||||||
</edmx:Connection>
|
|
||||||
<edmx:Options>
|
|
||||||
<DesignerInfoPropertySet>
|
|
||||||
<DesignerProperty Name="ValidateOnBuild" Value="true" />
|
|
||||||
<DesignerProperty Name="EnablePluralization" Value="True" />
|
|
||||||
</DesignerInfoPropertySet>
|
|
||||||
</edmx:Options>
|
|
||||||
<!-- Diagram content (shape and connector positions) -->
|
|
||||||
<edmx:Diagrams>
|
|
||||||
<Diagram Name="SampleModel01" >
|
|
||||||
<EntityTypeShape EntityType="SampleModel01.Customers" Width="1.5" PointX="3.3072142933063273" PointY="8.50035328068787" />
|
|
||||||
<InheritanceConnector EntityType="SampleModel01.Customers" />
|
|
||||||
<EntityTypeShape EntityType="SampleModel01.Orders" Width="1.5" PointX="3.25" PointY="6.5" Height="1.4279589843749996" />
|
|
||||||
<EntityTypeShape EntityType="SampleModel01.Persons" Width="1.5" PointX="8.4623833040065986" PointY="12.312999537360389" />
|
|
||||||
<AssociationConnector Association="SampleModel01.CustomersOrders" >
|
|
||||||
<ConnectorPoint PointX="2.25" PointY="5.9374994999999995" />
|
|
||||||
<ConnectorPoint PointX="4" PointY="5.9374994999999995" />
|
|
||||||
<ConnectorPoint PointX="4" PointY="6.5" />
|
|
||||||
</AssociationConnector>
|
|
||||||
</Diagram>
|
|
||||||
</edmx:Diagrams>
|
|
||||||
</edmx:Designer>
|
|
||||||
</edmx:Edmx>
|
|
|
@ -1,8 +0,0 @@
|
||||||
@if "%_echo%"=="" echo off
|
|
||||||
|
|
||||||
call %~d0%~p0..\copyFSharpDataTypeProviderDLL.cmd
|
|
||||||
|
|
||||||
call %~d0%~p0..\..\..\single-test-build.bat
|
|
||||||
|
|
||||||
exit /b %ERRORLEVEL%
|
|
||||||
|
|
|
@ -1,7 +0,0 @@
|
||||||
@if "%_echo%"=="" echo off
|
|
||||||
|
|
||||||
call %~d0%~p0..\..\..\single-test-run.bat
|
|
||||||
|
|
||||||
exit /b %ERRORLEVEL%
|
|
||||||
|
|
||||||
|
|
|
@ -1,143 +0,0 @@
|
||||||
// #Conformance #TypeProviders #EdmxFile
|
|
||||||
#r "FSharp.Data.TypeProviders.dll"
|
|
||||||
|
|
||||||
open Microsoft.FSharp.Core.CompilerServices
|
|
||||||
open System.IO
|
|
||||||
|
|
||||||
[<AutoOpen>]
|
|
||||||
module Infrastructure =
|
|
||||||
let failures = ref false
|
|
||||||
let reportFailure () = stderr.WriteLine " NO"; failures := true
|
|
||||||
let test s b = stderr.Write(s:string); if b then stderr.WriteLine " OK" else reportFailure()
|
|
||||||
let check s v1 v2 = stderr.Write(s:string); if v1 = v2 then stderr.WriteLine " OK" else eprintf "... FAILURE: expected %A, got %A " v2 v1; reportFailure()
|
|
||||||
|
|
||||||
let argv = System.Environment.GetCommandLineArgs()
|
|
||||||
let SetCulture() =
|
|
||||||
if argv.Length > 2 && argv.[1] = "--culture" then begin
|
|
||||||
let cultureString = argv.[2] in
|
|
||||||
let culture = new System.Globalization.CultureInfo(cultureString) in
|
|
||||||
stdout.WriteLine ("Running under culture "+culture.ToString()+"...");
|
|
||||||
System.Threading.Thread.CurrentThread.CurrentCulture <- culture
|
|
||||||
end
|
|
||||||
|
|
||||||
do SetCulture()
|
|
||||||
|
|
||||||
module CheckEdmxfileTypeProvider =
|
|
||||||
|
|
||||||
let checkHostedType (hostedType: System.Type) =
|
|
||||||
test "ceklc09wlkm1a" (hostedType.Assembly <> typeof<Microsoft.FSharp.Data.TypeProviders.DesignTime.DataProviders>.Assembly)
|
|
||||||
test "ceklc09wlkm1b" (hostedType.Assembly.FullName.StartsWith "tmp")
|
|
||||||
|
|
||||||
check "ceklc09wlkm2" hostedType.DeclaringType null
|
|
||||||
check "ceklc09wlkm3" hostedType.DeclaringMethod null
|
|
||||||
check "ceklc09wlkm4" hostedType.FullName "SampleModel01.EdmxFileApplied"
|
|
||||||
check "ceklc09wlkm5" (hostedType.GetConstructors()) [| |]
|
|
||||||
check "ceklc09wlkm6" (hostedType.GetCustomAttributesData().Count) 1
|
|
||||||
check "ceklc09wlkm6" (hostedType.GetCustomAttributesData().[0].Constructor.DeclaringType.FullName) typeof<TypeProviderXmlDocAttribute>.FullName
|
|
||||||
check "ceklc09wlkm7" (hostedType.GetEvents()) [| |]
|
|
||||||
check "ceklc09wlkm8" (hostedType.GetFields()) [| |]
|
|
||||||
check "ceklc09wlkm9" (hostedType.GetMethods()) [| |]
|
|
||||||
check "ceklc09wlkm10" (hostedType.GetProperties()) [| |]
|
|
||||||
check "ceklc09wlkm11" (hostedType.GetNestedTypes().Length) 1
|
|
||||||
check "ceklc09wlkm12"
|
|
||||||
(set [ for x in hostedType.GetNestedTypes() -> x.Name ])
|
|
||||||
(set ["SampleModel01"])
|
|
||||||
|
|
||||||
let hostedServiceTypes = hostedType.GetNestedTypes().[0]
|
|
||||||
check "ceklc09wlkm12b" (hostedServiceTypes.GetMethods()) [| |]
|
|
||||||
check "ceklc09wlkm12c"
|
|
||||||
(set [ for x in hostedServiceTypes.GetNestedTypes() -> x.Name ])
|
|
||||||
(set ["Customers"; "Orders"; "Persons"; "SampleModel01Container"])
|
|
||||||
|
|
||||||
// Deep check on one type: Customers
|
|
||||||
let customersType = (hostedServiceTypes.GetNestedTypes() |> Seq.find (fun t -> t.Name = "Customers"))
|
|
||||||
check "ceklc09wlkm131" (set [ for x in customersType.GetProperties() -> x.Name ]) (set [| "Id"; "Orders"; "ID"; "FirstName"; "LastName"; "EntityState"; "EntityKey" |])
|
|
||||||
check "ceklc09wlkm133a" (set [ for x in customersType.GetFields() -> x.Name ]) (set [| |])
|
|
||||||
check "ceklc09wlkm133b" (set [ for x in customersType.GetFields(System.Reflection.BindingFlags.Static ||| System.Reflection.BindingFlags.Public ||| System.Reflection.BindingFlags.FlattenHierarchy) -> x.Name ])
|
|
||||||
(set [ "EntityKeyPropertyName"] )
|
|
||||||
check "ceklc09wlkm134" (set [ for x in customersType.GetMethods() -> x.Name ])
|
|
||||||
(set ["CreateCustomers"; "get_Id"; "set_Id"; "get_Orders"; "set_Orders"; "get_ID"; "set_ID"; "get_FirstName"; "set_FirstName"; "get_LastName"; "set_LastName";
|
|
||||||
"get_EntityState"; "get_EntityKey"; "set_EntityKey"; "add_PropertyChanged"; "remove_PropertyChanged"; "add_PropertyChanging"; "remove_PropertyChanging"; "ToString"; "Equals";
|
|
||||||
"GetHashCode"; "GetType"] )
|
|
||||||
check "ceklc09wlkm135" (set [ for x in customersType.GetMethods(System.Reflection.BindingFlags.Static ||| System.Reflection.BindingFlags.Public ||| System.Reflection.BindingFlags.FlattenHierarchy) -> x.Name ])
|
|
||||||
(set [ "CreateCustomers"; "CreatePersons"; "Equals"; "ReferenceEquals" ] )
|
|
||||||
check "ceklc09wlkm136" (customersType.GetNestedTypes()) [||]
|
|
||||||
|
|
||||||
// Not so deep check on another type: SampleModel01Container
|
|
||||||
let SampleModel01ContainerType = (hostedServiceTypes.GetNestedTypes() |> Seq.find (fun t -> t.Name = "SampleModel01Container"))
|
|
||||||
check "ceklc09wlkm141" (set [ for x in SampleModel01ContainerType.GetProperties() -> x.Name ]) (set [|"Orders"; "Persons"; "Connection"; "DefaultContainerName"; "MetadataWorkspace"; "ObjectStateManager"; "CommandTimeout"; "ContextOptions"|])
|
|
||||||
check "ceklc09wlkm142" (SampleModel01ContainerType.GetFields()) [||]
|
|
||||||
check "ceklc09wlkm144" (set [ for x in SampleModel01ContainerType.GetMethods() -> x.Name ])
|
|
||||||
(set [|"get_Orders"; "get_Persons"; "AddToOrders"; "AddToPersons"; "get_Connection"; "get_DefaultContainerName"; "set_DefaultContainerName"; "get_MetadataWorkspace"; "get_ObjectStateManager"; "get_CommandTimeout"; "set_CommandTimeout"; "get_ContextOptions"; "add_SavingChanges"; "remove_SavingChanges"; "add_ObjectMaterialized"; "remove_ObjectMaterialized"; "AcceptAllChanges"; "AddObject"; "LoadProperty"; "LoadProperty"; "LoadProperty"; "LoadProperty"; "ApplyPropertyChanges"; "ApplyCurrentValues"; "ApplyOriginalValues"; "AttachTo"; "Attach"; "CreateEntityKey"; "CreateObjectSet"; "CreateObjectSet"; "CreateQuery"; "DeleteObject"; "Detach"; "Dispose"; "GetObjectByKey"; "Refresh"; "Refresh"; "SaveChanges"; "SaveChanges"; "SaveChanges"; "DetectChanges"; "TryGetObjectByKey"; "ExecuteFunction"; "ExecuteFunction"; "ExecuteFunction"; "CreateProxyTypes"; "CreateObject"; "ExecuteStoreCommand"; "ExecuteStoreQuery"; "ExecuteStoreQuery"; "Translate"; "Translate"; "CreateDatabase"; "DeleteDatabase"; "DatabaseExists"; "CreateDatabaseScript"; "ToString"; "Equals"; "GetHashCode"; "GetType"|])
|
|
||||||
check "ceklc09wlkm146" (SampleModel01ContainerType.GetNestedTypes()) [||]
|
|
||||||
|
|
||||||
|
|
||||||
let instantiateTypeProviderAndCheckOneHostedType( edmxfile : string, typeFullPath ) =
|
|
||||||
|
|
||||||
let assemblyFile = typeof<Microsoft.FSharp.Data.TypeProviders.DesignTime.DataProviders>.Assembly.CodeBase.Replace("file:///","").Replace("/","\\")
|
|
||||||
test "CheckFSharpDataTypeProvidersDLLExist" (File.Exists assemblyFile)
|
|
||||||
|
|
||||||
// If/when we care about the "target framework", this mock function will have to be fully implemented
|
|
||||||
let systemRuntimeContainsType s =
|
|
||||||
printfn "Call systemRuntimeContainsType(%s) returning dummy value 'true'" s
|
|
||||||
true
|
|
||||||
|
|
||||||
let tpConfig = new TypeProviderConfig(systemRuntimeContainsType, ResolutionFolder=__SOURCE_DIRECTORY__, RuntimeAssembly=assemblyFile, ReferencedAssemblies=[| |], TemporaryFolder=Path.GetTempPath(), IsInvalidationSupported=false, IsHostedExecution=true)
|
|
||||||
use typeProvider1 = (new Microsoft.FSharp.Data.TypeProviders.DesignTime.DataProviders( tpConfig ) :> ITypeProvider)
|
|
||||||
|
|
||||||
// Setup machinery to keep track of the "invalidate event" (see below)
|
|
||||||
let invalidateEventCount = ref 0
|
|
||||||
typeProvider1.Invalidate.Add(fun _ -> incr invalidateEventCount)
|
|
||||||
|
|
||||||
// Load a type provider instance for the type and restart
|
|
||||||
let hostedNamespace1 = typeProvider1.GetNamespaces() |> Seq.find (fun t -> t.NamespaceName = "Microsoft.FSharp.Data.TypeProviders")
|
|
||||||
|
|
||||||
check "CheckAllTPsAreThere" (set [ for i in hostedNamespace1.GetTypes() -> i.Name ]) (set ["DbmlFile"; "EdmxFile"; "ODataService"; "SqlDataConnection";"SqlEntityConnection";"WsdlService"])
|
|
||||||
|
|
||||||
let hostedType1 = hostedNamespace1.ResolveTypeName("EdmxFile")
|
|
||||||
let hostedType1StaticParameters = typeProvider1.GetStaticParameters(hostedType1)
|
|
||||||
check "VerifyStaticParam"
|
|
||||||
(set [ for i in hostedType1StaticParameters -> i.Name ])
|
|
||||||
(set [ "File"; "ResolutionFolder" ])
|
|
||||||
|
|
||||||
let staticParameterValues =
|
|
||||||
[| for x in hostedType1StaticParameters ->
|
|
||||||
(match x.Name with
|
|
||||||
| "File" -> box edmxfile
|
|
||||||
| _ -> box x.RawDefaultValue) |]
|
|
||||||
printfn "instantiating type... may take a while for code generation tool to run and csc.exe to run..."
|
|
||||||
let hostedAppliedType1 = typeProvider1.ApplyStaticArguments(hostedType1, typeFullPath, staticParameterValues)
|
|
||||||
|
|
||||||
checkHostedType hostedAppliedType1
|
|
||||||
|
|
||||||
// Write replacement text into the file and check that the invalidation event is triggered....
|
|
||||||
let file1NewContents = System.IO.File.ReadAllText(edmxfile).Replace("Customer", "Client") // Rename 'Customer' to 'Client'
|
|
||||||
do File.WriteAllText(edmxfile, file1NewContents)
|
|
||||||
|
|
||||||
// Wait for invalidate event to fire....
|
|
||||||
for i in 0 .. 30 do
|
|
||||||
if !invalidateEventCount = 0 then
|
|
||||||
System.Threading.Thread.Sleep 100
|
|
||||||
|
|
||||||
check "VerifyInvalidateEventFired" !invalidateEventCount 1
|
|
||||||
|
|
||||||
// Test with absolute path
|
|
||||||
// Copy the .edmx used for tests to avoid trashing our original (we may overwrite it when testing the event)
|
|
||||||
let edmxfile = Path.Combine(__SOURCE_DIRECTORY__, "SampleModel01.edmx")
|
|
||||||
System.IO.File.Copy(Path.Combine(__SOURCE_DIRECTORY__, @"EdmxFiles\SampleModel01.edmx"), edmxfile, true)
|
|
||||||
System.IO.File.SetAttributes(edmxfile, System.IO.FileAttributes.Normal)
|
|
||||||
instantiateTypeProviderAndCheckOneHostedType(edmxfile, [| "EdmxFileApplied" |])
|
|
||||||
|
|
||||||
// Test with relative path
|
|
||||||
// Copy the .edmx used for tests to avoid trashing our original (we may overwrite it when testing the event)
|
|
||||||
System.IO.File.Copy(Path.Combine(__SOURCE_DIRECTORY__, @"EdmxFiles\SampleModel01.edmx"), edmxfile, true)
|
|
||||||
System.IO.File.SetAttributes(edmxfile, System.IO.FileAttributes.Normal)
|
|
||||||
instantiateTypeProviderAndCheckOneHostedType( System.IO.Path.GetFileName(edmxfile), [| "EdmxFileApplied" |])
|
|
||||||
|
|
||||||
let _ =
|
|
||||||
if !failures then (stdout.WriteLine "Test Failed"; exit 1)
|
|
||||||
|
|
||||||
do (stdout.WriteLine "Test Passed";
|
|
||||||
File.WriteAllText("test.ok","ok");
|
|
||||||
exit 0)
|
|
||||||
|
|
|
@ -1,8 +0,0 @@
|
||||||
@if "%_echo%"=="" echo off
|
|
||||||
|
|
||||||
call %~d0%~p0..\copyFSharpDataTypeProviderDLL.cmd
|
|
||||||
|
|
||||||
call %~d0%~p0..\..\..\single-test-build.bat
|
|
||||||
|
|
||||||
exit /b %ERRORLEVEL%
|
|
||||||
|
|
|
@ -1,7 +0,0 @@
|
||||||
@if "%_echo%"=="" echo off
|
|
||||||
|
|
||||||
call %~d0%~p0..\..\..\single-test-run.bat
|
|
||||||
|
|
||||||
exit /b %ERRORLEVEL%
|
|
||||||
|
|
||||||
|
|
|
@ -1,149 +0,0 @@
|
||||||
// #Conformance #TypeProviders #ODataService
|
|
||||||
#r "FSharp.Data.TypeProviders.dll"
|
|
||||||
|
|
||||||
open Microsoft.FSharp.Core.CompilerServices
|
|
||||||
open System.IO
|
|
||||||
|
|
||||||
[<AutoOpen>]
|
|
||||||
module Infrastructure =
|
|
||||||
let failures = ref false
|
|
||||||
let reportFailure () = stderr.WriteLine " NO"; failures := true
|
|
||||||
let test s b = stderr.Write(s:string); if b then stderr.WriteLine " OK" else reportFailure()
|
|
||||||
let check s v1 v2 = stderr.Write(s:string); if v1 = v2 then stderr.WriteLine " OK" else eprintf "... FAILURE: expected %A, got %A " v2 v1; reportFailure()
|
|
||||||
|
|
||||||
let argv = System.Environment.GetCommandLineArgs()
|
|
||||||
let SetCulture() =
|
|
||||||
if argv.Length > 2 && argv.[1] = "--culture" then begin
|
|
||||||
let cultureString = argv.[2] in
|
|
||||||
let culture = new System.Globalization.CultureInfo(cultureString) in
|
|
||||||
stdout.WriteLine ("Running under culture "+culture.ToString()+"...");
|
|
||||||
System.Threading.Thread.CurrentThread.CurrentCulture <- culture
|
|
||||||
end
|
|
||||||
|
|
||||||
do SetCulture()
|
|
||||||
|
|
||||||
module CheckODataServiceTypeProvider =
|
|
||||||
|
|
||||||
let checkHostedType (hostedType: System.Type) =
|
|
||||||
//let hostedType = hostedAppliedType1
|
|
||||||
test "ceklc09wlkm1a" (hostedType.Assembly <> typeof<Microsoft.FSharp.Data.TypeProviders.DesignTime.DataProviders>.Assembly)
|
|
||||||
test "ceklc09wlkm1b" (hostedType.Assembly.FullName.StartsWith "tmp")
|
|
||||||
|
|
||||||
check "ceklc09wlkm2" hostedType.DeclaringType null
|
|
||||||
check "ceklc09wlkm3" hostedType.DeclaringMethod null
|
|
||||||
check "ceklc09wlkm4" hostedType.FullName "Microsoft.FSharp.Data.TypeProviders.ODataServiceApplied"
|
|
||||||
check "ceklc09wlkm5" (hostedType.GetConstructors()) [| |]
|
|
||||||
check "ceklc09wlkm6" (hostedType.GetCustomAttributesData().Count) 1
|
|
||||||
check "ceklc09wlkm6" (hostedType.GetCustomAttributesData().[0].Constructor.DeclaringType.FullName) typeof<TypeProviderXmlDocAttribute>.FullName
|
|
||||||
check "ceklc09wlkm7" (hostedType.GetEvents()) [| |]
|
|
||||||
check "ceklc09wlkm8" (hostedType.GetFields()) [| |]
|
|
||||||
check "ceklc09wlkm9" [ for m in hostedType.GetMethods() -> m.Name ] [ "GetDataContext" ; "GetDataContext" ]
|
|
||||||
let m1 = hostedType.GetMethods().[0]
|
|
||||||
let m2 = hostedType.GetMethods().[1]
|
|
||||||
check "ceklc09wlkm9b" (m1.GetParameters().Length) 0
|
|
||||||
check "ceklc09wlkm9b" (m2.GetParameters().Length) 1
|
|
||||||
check "ceklc09wlkm9b" (m1.ReturnType.Name) "DemoService"
|
|
||||||
check "ceklc09wlkm9c" (m1.ReturnType.FullName) ("Microsoft.FSharp.Data.TypeProviders.ODataServiceApplied+ServiceTypes+SimpleDataContextTypes+DemoService")
|
|
||||||
|
|
||||||
check "ceklc09wlkm9d" (m1.ReturnType.GetProperties().Length) 5
|
|
||||||
check "ceklc09wlkm9e" (set [ for p in m1.ReturnType.GetProperties() -> p.Name ]) (set ["Categories"; "Credentials"; "DataContext"; "Products"; "Suppliers"])
|
|
||||||
check "ceklc09wlkm9f" (set [ for p in m1.ReturnType.GetProperties() -> p.PropertyType.Name ]) (set ["DataServiceQuery`1"; "DataServiceQuery`1";"DataServiceQuery`1";"ICredentials"; "DataServiceContext"])
|
|
||||||
|
|
||||||
// We expose some getters and 1 setter on the simpler data context
|
|
||||||
check "ceklc09wlkm9g" (m1.ReturnType.GetMethods().Length) 6
|
|
||||||
check "ceklc09wlkm9h" (set [ for p in m1.ReturnType.GetMethods() -> p.Name ]) (set ["get_Categories"; "get_Credentials"; "get_DataContext"; "get_Products"; "get_Suppliers"; "set_Credentials"])
|
|
||||||
|
|
||||||
check "ceklc09wlkm10" (hostedType.GetProperties()) [| |]
|
|
||||||
check "ceklc09wlkm11" (hostedType.GetNestedTypes().Length) 1
|
|
||||||
check "ceklc09wlkm12"
|
|
||||||
(set [ for x in hostedType.GetNestedTypes() -> x.Name ])
|
|
||||||
(set ["ServiceTypes"])
|
|
||||||
|
|
||||||
let hostedServiceTypes = hostedType.GetNestedTypes().[0]
|
|
||||||
|
|
||||||
check "ceklc09wlkm11" (hostedServiceTypes.GetNestedTypes().Length) 6
|
|
||||||
check "ceklc09wlkm12"
|
|
||||||
(set [ for x in hostedServiceTypes.GetNestedTypes() -> x.Name ])
|
|
||||||
(set ["Address"; "Category"; "DemoService"; "Product"; "SimpleDataContextTypes"; "Supplier"])
|
|
||||||
|
|
||||||
let productType = (hostedServiceTypes.GetNestedTypes() |> Seq.find (fun t -> t.Name = "Product"))
|
|
||||||
check "ceklc09wlkm13" (productType.GetProperties().Length) 9
|
|
||||||
|
|
||||||
check "ceklc09wlkm14"
|
|
||||||
(set [ for x in productType.GetProperties() -> x.Name ])
|
|
||||||
(set ["ID"; "Name"; "Description"; "ReleaseDate"; "DiscontinuedDate"; "Rating"; "Price"; "Category"; "Supplier"])
|
|
||||||
|
|
||||||
let instantiateTypeProviderAndCheckOneHostedType(useLocalSchemaFile: string option, useForceUpdate: bool option, typeFullPath:string[]) =
|
|
||||||
//let useLocalSchemaFile : string option = None
|
|
||||||
//let useForceUpdate : bool option = None
|
|
||||||
let assemblyFile = typeof<Microsoft.FSharp.Data.TypeProviders.DesignTime.DataProviders>.Assembly.CodeBase.Replace("file:///","").Replace("/","\\")
|
|
||||||
test "cnlkenkewe" (File.Exists assemblyFile)
|
|
||||||
|
|
||||||
// If/when we care about the "target framework", this mock function will have to be fully implemented
|
|
||||||
let systemRuntimeContainsType s =
|
|
||||||
printfn "Call systemRuntimeContainsType(%s) returning dummy value 'true'" s
|
|
||||||
true
|
|
||||||
|
|
||||||
let tpConfig = new TypeProviderConfig(systemRuntimeContainsType, ResolutionFolder=__SOURCE_DIRECTORY__, RuntimeAssembly=assemblyFile, ReferencedAssemblies=[| |], TemporaryFolder=Path.GetTempPath(), IsInvalidationSupported=false, IsHostedExecution=true)
|
|
||||||
use typeProvider1 = (new Microsoft.FSharp.Data.TypeProviders.DesignTime.DataProviders( tpConfig ) :> ITypeProvider)
|
|
||||||
|
|
||||||
let invalidateEventCount = ref 0
|
|
||||||
|
|
||||||
typeProvider1.Invalidate.Add(fun _ -> incr invalidateEventCount)
|
|
||||||
|
|
||||||
// Load a type provider instance for the type and restart
|
|
||||||
let hostedNamespace1 = typeProvider1.GetNamespaces() |> Seq.find (fun t -> t.NamespaceName = "Microsoft.FSharp.Data.TypeProviders")
|
|
||||||
|
|
||||||
check "eenewioinw" (set [ for i in hostedNamespace1.GetTypes() -> i.Name ]) (set ["DbmlFile"; "EdmxFile"; "ODataService"; "SqlDataConnection";"SqlEntityConnection";"WsdlService"])
|
|
||||||
|
|
||||||
let hostedType1 = hostedNamespace1.ResolveTypeName("ODataService")
|
|
||||||
let hostedType1StaticParameters = typeProvider1.GetStaticParameters(hostedType1)
|
|
||||||
check "eenewioinw2"
|
|
||||||
(set [ for i in hostedType1StaticParameters -> i.Name ])
|
|
||||||
(set ["ServiceUri"; "LocalSchemaFile"; "ForceUpdate"; "ResolutionFolder"; "DataServiceCollection"])
|
|
||||||
|
|
||||||
let serviceUri = "http://services.odata.org/V2/OData/OData.svc/"
|
|
||||||
let staticParameterValues =
|
|
||||||
[| for x in hostedType1StaticParameters ->
|
|
||||||
(match x.Name with
|
|
||||||
| "ServiceUri" -> box serviceUri
|
|
||||||
| "LocalSchemaFile" when useLocalSchemaFile.IsSome -> box useLocalSchemaFile.Value
|
|
||||||
| "ForceUpdate" when useForceUpdate.IsSome -> box useForceUpdate.Value
|
|
||||||
| _ -> box x.RawDefaultValue) |]
|
|
||||||
printfn "instantiating service type... may take a while for OData service metadata to be downloaded, code generation tool to run and csc.exe to run..."
|
|
||||||
try
|
|
||||||
let hostedAppliedType1 = typeProvider1.ApplyStaticArguments(hostedType1, typeFullPath, staticParameterValues)
|
|
||||||
|
|
||||||
checkHostedType hostedAppliedType1
|
|
||||||
with
|
|
||||||
| e ->
|
|
||||||
printfn "%s" (e.ToString())
|
|
||||||
reportFailure()
|
|
||||||
|
|
||||||
instantiateTypeProviderAndCheckOneHostedType(None, None, [| "ODataServiceApplied" |])
|
|
||||||
|
|
||||||
let schemaFile2 = Path.Combine(__SOURCE_DIRECTORY__, "svc.csdl")
|
|
||||||
(try File.Delete schemaFile2 with _ -> ())
|
|
||||||
instantiateTypeProviderAndCheckOneHostedType(Some (Path.Combine(__SOURCE_DIRECTORY__, "svc.csdl")), Some true, [| "ODataServiceApplied" |])
|
|
||||||
// schemaFile2 should now exist
|
|
||||||
check "eoinew0c9e" (File.Exists schemaFile2)
|
|
||||||
|
|
||||||
// Reuse the CSDL just created
|
|
||||||
instantiateTypeProviderAndCheckOneHostedType(Some (Path.Combine(__SOURCE_DIRECTORY__, "svc.csdl")), Some false, [| "ODataServiceApplied" |])
|
|
||||||
// schemaFile2 should now still exist
|
|
||||||
check "eoinew0c9e" (File.Exists schemaFile2)
|
|
||||||
|
|
||||||
let schemaFile3 = Path.Combine(__SOURCE_DIRECTORY__, "svc2.csdl")
|
|
||||||
(try File.Delete schemaFile3 with _ -> ())
|
|
||||||
instantiateTypeProviderAndCheckOneHostedType(Some schemaFile3, None, [| "ODataServiceApplied" |])
|
|
||||||
|
|
||||||
// schemaFile3 should now exist
|
|
||||||
check "eoinew0c9e" (File.Exists schemaFile3)
|
|
||||||
|
|
||||||
let _ =
|
|
||||||
if !failures then (stdout.WriteLine "Test Failed"; exit 1)
|
|
||||||
|
|
||||||
do (stdout.WriteLine "Test Passed";
|
|
||||||
File.WriteAllText("test.ok","ok");
|
|
||||||
exit 0)
|
|
||||||
|
|
Двоичный файл не отображается.
|
@ -1,8 +0,0 @@
|
||||||
@if "%_echo%"=="" echo off
|
|
||||||
|
|
||||||
call %~d0%~p0..\copyFSharpDataTypeProviderDLL.cmd
|
|
||||||
|
|
||||||
call %~d0%~p0..\..\..\single-test-build.bat
|
|
||||||
|
|
||||||
exit /b %ERRORLEVEL%
|
|
||||||
|
|
|
@ -1,17 +0,0 @@
|
||||||
@if "%_echo%"=="" echo off
|
|
||||||
|
|
||||||
call %~d0%~p0..\..\..\..\config.bat
|
|
||||||
|
|
||||||
IF /I "%INSTALL_SKU%" NEQ "ULTIMATE" (
|
|
||||||
echo Test not supported except on Ultimate
|
|
||||||
exit /b 0
|
|
||||||
)
|
|
||||||
|
|
||||||
IF EXIST test.exe (
|
|
||||||
echo Running test.exe to warm up SQL
|
|
||||||
test.exe > nul 2> nul
|
|
||||||
)
|
|
||||||
|
|
||||||
call %~d0%~p0..\..\..\single-test-run.bat
|
|
||||||
|
|
||||||
exit /b %ERRORLEVEL%
|
|
|
@ -1,255 +0,0 @@
|
||||||
// #Conformance #TypeProviders #SqlDataConnection
|
|
||||||
#r "FSharp.Data.TypeProviders.dll"
|
|
||||||
#r "System.Management.dll"
|
|
||||||
|
|
||||||
open Microsoft.FSharp.Core.CompilerServices
|
|
||||||
open System.IO
|
|
||||||
|
|
||||||
[<AutoOpen>]
|
|
||||||
module Infrastructure =
|
|
||||||
let failures = ref false
|
|
||||||
let reportFailure () = stderr.WriteLine " NO"; failures := true
|
|
||||||
let test s b = stderr.Write(s:string); if b then stderr.WriteLine " OK" else reportFailure()
|
|
||||||
let check s v1 v2 = stderr.Write(s:string); if v1 = v2 then stderr.WriteLine " OK" else eprintf "... FAILURE: expected %A, got %A " v2 v1; reportFailure()
|
|
||||||
|
|
||||||
let argv = System.Environment.GetCommandLineArgs()
|
|
||||||
let SetCulture() =
|
|
||||||
if argv.Length > 2 && argv.[1] = "--culture" then begin
|
|
||||||
let cultureString = argv.[2] in
|
|
||||||
let culture = new System.Globalization.CultureInfo(cultureString) in
|
|
||||||
stdout.WriteLine ("Running under culture "+culture.ToString()+"...");
|
|
||||||
System.Threading.Thread.CurrentThread.CurrentCulture <- culture
|
|
||||||
end
|
|
||||||
|
|
||||||
do SetCulture()
|
|
||||||
|
|
||||||
module CheckSqlConnectionTypeProvider =
|
|
||||||
|
|
||||||
let isSQLExpressInstalled =
|
|
||||||
let edition = "Express Edition"
|
|
||||||
let instance = "MSSQL$SQLEXPRESS"
|
|
||||||
|
|
||||||
try
|
|
||||||
let getSqlExpress =
|
|
||||||
new System.Management.ManagementObjectSearcher("root\\Microsoft\\SqlServer\\ComputerManagement10",
|
|
||||||
"select * from SqlServiceAdvancedProperty where SQLServiceType = 1 and ServiceName = '" + instance + "' and (PropertyName = 'SKUNAME' or PropertyName = 'SPLEVEL')")
|
|
||||||
|
|
||||||
// If nothing is returned, SQL Express isn't installed.
|
|
||||||
getSqlExpress.Get().Count <> 0
|
|
||||||
with
|
|
||||||
| _ -> false
|
|
||||||
|
|
||||||
|
|
||||||
let checkHostedType (hostedType: System.Type) =
|
|
||||||
//let hostedType = hostedAppliedType1
|
|
||||||
test "ceklc09wlkm1a" (hostedType.Assembly <> typeof<Microsoft.FSharp.Data.TypeProviders.DesignTime.DataProviders>.Assembly)
|
|
||||||
test "ceklc09wlkm1b" (hostedType.Assembly.FullName.StartsWith "tmp")
|
|
||||||
|
|
||||||
check "ceklc09wlkm2" hostedType.DeclaringType null
|
|
||||||
check "ceklc09wlkm3" hostedType.DeclaringMethod null
|
|
||||||
check "ceklc09wlkm4" hostedType.FullName "Microsoft.FSharp.Data.TypeProviders.SqlDataConnectionApplied"
|
|
||||||
check "ceklc09wlkm5" (hostedType.GetConstructors()) [| |]
|
|
||||||
check "ceklc09wlkm6" (hostedType.GetCustomAttributesData().Count) 1
|
|
||||||
check "ceklc09wlkm6" (hostedType.GetCustomAttributesData().[0].Constructor.DeclaringType.FullName) typeof<TypeProviderXmlDocAttribute>.FullName
|
|
||||||
check "ceklc09wlkm7" (hostedType.GetEvents()) [| |]
|
|
||||||
check "ceklc09wlkm8" (hostedType.GetFields()) [| |]
|
|
||||||
check "ceklc09wlkm9" [ for m in hostedType.GetMethods() -> m.Name ] [ "GetDataContext" ; "GetDataContext" ]
|
|
||||||
let m0 = hostedType.GetMethods().[0]
|
|
||||||
let m1 = hostedType.GetMethods().[1]
|
|
||||||
check "ceklc09wlkm9b" (m0.GetParameters().Length) 0
|
|
||||||
check "ceklc09wlkm9b" (m1.GetParameters().Length) 1
|
|
||||||
check "ceklc09wlkm9b" (m0.ReturnType.Name) "Northwnd"
|
|
||||||
check "ceklc09wlkm9b" (m0.ReturnType.FullName) "Microsoft.FSharp.Data.TypeProviders.SqlDataConnectionApplied+ServiceTypes+SimpleDataContextTypes+Northwnd"
|
|
||||||
check "ceklc09wlkm10" (hostedType.GetProperties()) [| |]
|
|
||||||
check "ceklc09wlkm11" (hostedType.GetNestedTypes().Length) 1
|
|
||||||
check "ceklc09wlkm12"
|
|
||||||
(set [ for x in hostedType.GetNestedTypes() -> x.Name ])
|
|
||||||
(set ["ServiceTypes"])
|
|
||||||
|
|
||||||
let hostedServiceTypes = hostedType.GetNestedTypes().[0]
|
|
||||||
check "ceklc09wlkm12b" (hostedServiceTypes.GetMethods()) [| |]
|
|
||||||
check "ceklc09wlkm12c" (hostedServiceTypes.GetNestedTypes().Length) 38
|
|
||||||
|
|
||||||
let hostedSimpleDataContextTypes = hostedServiceTypes.GetNestedType("SimpleDataContextTypes")
|
|
||||||
check "ceklc09wlkm12d" (hostedSimpleDataContextTypes.GetMethods()) [| |]
|
|
||||||
check "ceklc09wlkm12e" (hostedSimpleDataContextTypes.GetNestedTypes().Length) 1
|
|
||||||
check "ceklc09wlkm12e" [ for x in hostedSimpleDataContextTypes.GetNestedTypes() -> x.Name] ["Northwnd"]
|
|
||||||
|
|
||||||
check "ceklc09wlkm12"
|
|
||||||
(set [ for x in hostedServiceTypes.GetNestedTypes() -> x.Name ])
|
|
||||||
(set ["Northwnd"; "SimpleDataContextTypes"; "AlphabeticalListOfProduct"; "Category"; "CategorySalesFor1997"; "CurrentProductList"; "CustomerAndSuppliersByCity";
|
|
||||||
"CustomerCustomerDemo"; "CustomerDemographic"; "Customer"; "Employee"; "EmployeeTerritory";
|
|
||||||
"Invoice"; "OrderDetail"; "OrderDetailsExtended"; "OrderSubtotal"; "Order"; "OrdersQry";
|
|
||||||
"ProductSalesFor1997"; "Product"; "ProductsAboveAveragePrice"; "ProductsByCategory";
|
|
||||||
"QuarterlyOrder"; "Region"; "SalesByCategory"; "SalesTotalsByAmount"; "Shipper";
|
|
||||||
"SummaryOfSalesByQuarter"; "SummaryOfSalesByYear"; "Supplier"; "Territory"; "CustOrderHistResult";
|
|
||||||
"CustOrdersDetailResult"; "CustOrdersOrdersResult"; "EmployeeSalesByCountryResult"; "SalesByYearResult";
|
|
||||||
"SalesByCategoryResult"; "TenMostExpensiveProductsResult"])
|
|
||||||
|
|
||||||
let customersType = (hostedServiceTypes.GetNestedTypes() |> Seq.find (fun t -> t.Name = "Customer"))
|
|
||||||
check "ceklc09wlkm13" (customersType.GetProperties().Length) 13
|
|
||||||
|
|
||||||
|
|
||||||
let instantiateTypeProviderAndCheckOneHostedType(connectionStringName, configFile, useDataDirectory, dataDirectory, useLocalSchemaFile: string option, useForceUpdate: bool option, typeFullPath: string[], resolutionFolder:string option) =
|
|
||||||
let assemblyFile = typeof<Microsoft.FSharp.Data.TypeProviders.DesignTime.DataProviders>.Assembly.CodeBase.Replace("file:///","").Replace("/","\\")
|
|
||||||
test "cnlkenkewe" (File.Exists assemblyFile)
|
|
||||||
|
|
||||||
// If/when we care about the "target framework", this mock function will have to be fully implemented
|
|
||||||
let systemRuntimeContainsType s =
|
|
||||||
printfn "Call systemRuntimeContainsType(%s) returning dummy value 'true'" s
|
|
||||||
true
|
|
||||||
|
|
||||||
let tpConfig = new TypeProviderConfig(systemRuntimeContainsType, ResolutionFolder=__SOURCE_DIRECTORY__, RuntimeAssembly=assemblyFile, ReferencedAssemblies=[| |], TemporaryFolder=Path.GetTempPath(), IsInvalidationSupported=false, IsHostedExecution=true)
|
|
||||||
use typeProvider1 = (new Microsoft.FSharp.Data.TypeProviders.DesignTime.DataProviders( tpConfig ) :> ITypeProvider)
|
|
||||||
|
|
||||||
let invalidateEventCount = ref 0
|
|
||||||
|
|
||||||
typeProvider1.Invalidate.Add(fun _ -> incr invalidateEventCount)
|
|
||||||
|
|
||||||
// Load a type provider instance for the type and restart
|
|
||||||
let hostedNamespace1 = typeProvider1.GetNamespaces() |> Seq.find (fun t -> t.NamespaceName = "Microsoft.FSharp.Data.TypeProviders")
|
|
||||||
|
|
||||||
check "eenewioinw" (set [ for i in hostedNamespace1.GetTypes() -> i.Name ]) (set ["DbmlFile"; "EdmxFile"; "ODataService"; "SqlDataConnection";"SqlEntityConnection";"WsdlService"])
|
|
||||||
|
|
||||||
let hostedType1 = hostedNamespace1.ResolveTypeName("SqlDataConnection")
|
|
||||||
let hostedType1StaticParameters = typeProvider1.GetStaticParameters(hostedType1)
|
|
||||||
check "eenewioinw2"
|
|
||||||
(set [ for i in hostedType1StaticParameters -> i.Name ])
|
|
||||||
(set ["ConnectionString"; "ConnectionStringName"; "DataDirectory"; "ResolutionFolder"; "ConfigFile"; "LocalSchemaFile";
|
|
||||||
"ForceUpdate"; "Pluralize"; "Views"; "Functions"; "StoredProcedures"; "Timeout";
|
|
||||||
"ContextTypeName"; "Serializable" ])
|
|
||||||
|
|
||||||
let northwind = "NORTHWND.mdf"
|
|
||||||
let northwindLog = "NORTHWND_log.ldf"
|
|
||||||
let northwindFile =
|
|
||||||
let baseFile =
|
|
||||||
match dataDirectory with
|
|
||||||
| None -> northwind
|
|
||||||
| Some dd -> System.IO.Path.Combine(dd,northwind)
|
|
||||||
match resolutionFolder with
|
|
||||||
| None ->
|
|
||||||
match dataDirectory with
|
|
||||||
| None -> ()
|
|
||||||
| Some dd -> if not(System.IO.Directory.Exists dd) then System.IO.Directory.CreateDirectory dd |> ignore
|
|
||||||
baseFile
|
|
||||||
| Some rf ->
|
|
||||||
if not(System.IO.Directory.Exists rf) then System.IO.Directory.CreateDirectory rf |> ignore
|
|
||||||
match dataDirectory with
|
|
||||||
| None -> ()
|
|
||||||
| Some dd -> let dd = System.IO.Path.Combine(rf,dd) in if not(System.IO.Directory.Exists dd) then System.IO.Directory.CreateDirectory dd |> ignore
|
|
||||||
System.IO.Path.Combine(rf,baseFile)
|
|
||||||
|
|
||||||
|
|
||||||
if not(System.IO.File.Exists(northwindFile)) then
|
|
||||||
System.IO.File.Copy("DB\\northwnd.mdf", northwindFile, false)
|
|
||||||
System.IO.File.SetAttributes(northwindFile, System.IO.FileAttributes.Normal)
|
|
||||||
|
|
||||||
|
|
||||||
let connectionString =
|
|
||||||
if useDataDirectory then
|
|
||||||
if isSQLExpressInstalled then
|
|
||||||
@"AttachDBFileName = '|DataDirectory|\" + northwind + "';Server='.\SQLEXPRESS';User Instance=true;Integrated Security=SSPI"
|
|
||||||
else
|
|
||||||
"AttachDBFileName = '|DataDirectory|\\" + northwind + "';Server='(localdb)\\MSSQLLocalDB'"
|
|
||||||
else
|
|
||||||
if isSQLExpressInstalled then
|
|
||||||
@"AttachDBFileName = '" + System.IO.Path.Combine(__SOURCE_DIRECTORY__, northwindFile) + "';Server='.\SQLEXPRESS';User Instance=true;Integrated Security=SSPI"
|
|
||||||
else
|
|
||||||
"AttachDBFileName = '" + System.IO.Path.Combine(__SOURCE_DIRECTORY__, northwindFile) + "';Server='(localdb)\\MSSQLLocalDB'"
|
|
||||||
|
|
||||||
match connectionStringName with
|
|
||||||
| None -> ()
|
|
||||||
| Some connectionStringName ->
|
|
||||||
let configFileName = match configFile with None -> "app.config" | Some nm -> nm
|
|
||||||
let configFileName =
|
|
||||||
match resolutionFolder with
|
|
||||||
| None -> configFileName
|
|
||||||
| Some rf ->
|
|
||||||
System.IO.Path.Combine(rf,configFileName)
|
|
||||||
System.IO.File.WriteAllText(configFileName,
|
|
||||||
sprintf """<?xml version="1.0"?>
|
|
||||||
|
|
||||||
<configuration>
|
|
||||||
<connectionStrings>
|
|
||||||
<add name="%s"
|
|
||||||
connectionString="%s"
|
|
||||||
providerName="System.Data.SqlClient" />
|
|
||||||
</connectionStrings>
|
|
||||||
|
|
||||||
<system.webServer>
|
|
||||||
<modules runAllManagedModulesForAllRequests="true"/>
|
|
||||||
</system.webServer>
|
|
||||||
</configuration>
|
|
||||||
"""
|
|
||||||
connectionStringName
|
|
||||||
connectionString)
|
|
||||||
let staticParameterValues =
|
|
||||||
[| for x in hostedType1StaticParameters ->
|
|
||||||
(match x.Name with
|
|
||||||
| "ConnectionString" when connectionStringName.IsNone -> box connectionString
|
|
||||||
| "Pluralize" -> box true
|
|
||||||
| "ConnectionStringName" when connectionStringName.IsSome -> box connectionStringName.Value
|
|
||||||
| "ResolutionFolder" when resolutionFolder.IsSome -> box resolutionFolder.Value
|
|
||||||
| "DataDirectory" when dataDirectory.IsSome -> box dataDirectory.Value
|
|
||||||
| "ConfigFile" when configFile.IsSome -> box configFile.Value
|
|
||||||
| "ContextTypeName" -> box "Northwnd"
|
|
||||||
| "LocalSchemaFile" when useLocalSchemaFile.IsSome -> box useLocalSchemaFile.Value
|
|
||||||
| "ForceUpdate" when useForceUpdate.IsSome -> box useForceUpdate.Value
|
|
||||||
| "Timeout" -> box 60
|
|
||||||
| _ -> box x.RawDefaultValue) |]
|
|
||||||
printfn "instantiating database type... may take a while for db to attach, code generation tool to run and csc.exe to run..."
|
|
||||||
|
|
||||||
try
|
|
||||||
let hostedAppliedType1 = typeProvider1.ApplyStaticArguments(hostedType1, typeFullPath, staticParameterValues)
|
|
||||||
|
|
||||||
checkHostedType hostedAppliedType1
|
|
||||||
with
|
|
||||||
| e ->
|
|
||||||
printfn "%s" (e.ToString())
|
|
||||||
reportFailure()
|
|
||||||
|
|
||||||
instantiateTypeProviderAndCheckOneHostedType(None, None, false, None, None, None, [| "SqlDataConnectionApplied" |], None)
|
|
||||||
|
|
||||||
// Use an implied app.config config file, use the current directory as the DataDirectory
|
|
||||||
instantiateTypeProviderAndCheckOneHostedType(Some "ConnectionString1", None, true, None, None, None, [| "SqlDataConnectionApplied" |], None)
|
|
||||||
|
|
||||||
// Use a config file, use an explicit relative DataDirectory
|
|
||||||
instantiateTypeProviderAndCheckOneHostedType(Some "ConnectionString2", Some "app.config", true, Some "DataDirectory", None, None, [| "SqlDataConnectionApplied" |], None)
|
|
||||||
|
|
||||||
// Use a config file, use an explicit relative DataDirectory and an explicit ResolutionFolder.
|
|
||||||
instantiateTypeProviderAndCheckOneHostedType(Some "ConnectionString2", Some "app.config", true, Some "DataDirectory", None, None, [| "SqlDataConnectionApplied" |], Some "ExampleResolutionFolder")
|
|
||||||
|
|
||||||
|
|
||||||
// Use an absolute config file, use an absolute DataDirectory
|
|
||||||
instantiateTypeProviderAndCheckOneHostedType(Some "ConnectionString3", Some (__SOURCE_DIRECTORY__ + @"\test.config"), true, Some (__SOURCE_DIRECTORY__ + @"\DataDirectory"), None, None, [| "SqlDataConnectionApplied" |], None)
|
|
||||||
|
|
||||||
let schemaFile2 = Path.Combine(__SOURCE_DIRECTORY__, "nwind2.dbml")
|
|
||||||
(try File.Delete schemaFile2 with _ -> ())
|
|
||||||
instantiateTypeProviderAndCheckOneHostedType(None, None, false, None, Some (Path.Combine(__SOURCE_DIRECTORY__, "nwind2.dbml")), Some true, [| "SqlDataConnectionApplied" |], None)
|
|
||||||
// schemaFile2 should now exist
|
|
||||||
check "eoinew0c9e" (File.Exists schemaFile2)
|
|
||||||
|
|
||||||
// Reuse the DBML just created
|
|
||||||
instantiateTypeProviderAndCheckOneHostedType(None, None, false, None, Some (Path.Combine(__SOURCE_DIRECTORY__, "nwind2.dbml")), Some false, [| "SqlDataConnectionApplied" |], None)
|
|
||||||
// schemaFile2 should now still exist
|
|
||||||
check "eoinew0c9e" (File.Exists schemaFile2)
|
|
||||||
|
|
||||||
// // A relative path should work....
|
|
||||||
// instantiateTypeProviderAndCheckOneHostedType(Some "nwind2.dbml", Some false)
|
|
||||||
// // schemaFile2 should now still exist
|
|
||||||
// check "eoinew0c9e" (File.Exists schemaFile2)
|
|
||||||
|
|
||||||
let schemaFile3 = Path.Combine(__SOURCE_DIRECTORY__, "nwind3.dbml")
|
|
||||||
(try File.Delete schemaFile3 with _ -> ())
|
|
||||||
instantiateTypeProviderAndCheckOneHostedType(None, None, false, None, Some schemaFile3, None, [| "SqlDataConnectionApplied" |], None)
|
|
||||||
|
|
||||||
// schemaFile3 should now exist
|
|
||||||
check "eoinew0c9e" (File.Exists schemaFile3)
|
|
||||||
|
|
||||||
let _ =
|
|
||||||
if !failures then (stdout.WriteLine "Test Failed"; exit 1)
|
|
||||||
|
|
||||||
do (stdout.WriteLine "Test Passed";
|
|
||||||
File.WriteAllText("test.ok","ok");
|
|
||||||
exit 0)
|
|
||||||
|
|
Двоичный файл не отображается.
|
@ -1,8 +0,0 @@
|
||||||
@if "%_echo%"=="" echo off
|
|
||||||
|
|
||||||
call %~d0%~p0..\copyFSharpDataTypeProviderDLL.cmd
|
|
||||||
|
|
||||||
call %~d0%~p0..\..\..\single-test-build.bat
|
|
||||||
|
|
||||||
exit /b %ERRORLEVEL%
|
|
||||||
|
|
|
@ -1,13 +0,0 @@
|
||||||
@if "%_echo%"=="" echo off
|
|
||||||
call %~d0%~p0..\..\..\..\config.bat
|
|
||||||
|
|
||||||
IF /I "%INSTALL_SKU%" NEQ "ULTIMATE" (
|
|
||||||
echo Test not supported except on Ultimate
|
|
||||||
exit /b 0
|
|
||||||
)
|
|
||||||
|
|
||||||
call %~d0%~p0..\..\..\single-test-run.bat
|
|
||||||
|
|
||||||
exit /b %ERRORLEVEL%
|
|
||||||
|
|
||||||
|
|
|
@ -1,243 +0,0 @@
|
||||||
// #Conformance #TypeProviders #SqlEntityConnection
|
|
||||||
#r "FSharp.Data.TypeProviders.dll"
|
|
||||||
#r "System.Management.dll"
|
|
||||||
|
|
||||||
open Microsoft.FSharp.Core.CompilerServices
|
|
||||||
open System.IO
|
|
||||||
|
|
||||||
[<AutoOpen>]
|
|
||||||
module Infrastructure =
|
|
||||||
let failures = ref false
|
|
||||||
let reportFailure () = stderr.WriteLine " NO"; failures := true
|
|
||||||
let test s b = stderr.Write(s:string); if b then stderr.WriteLine " OK" else reportFailure()
|
|
||||||
let check s v1 v2 = stderr.Write(s:string); if v1 = v2 then stderr.WriteLine " OK" else eprintf "... FAILURE: expected %A, got %A " v2 v1; reportFailure()
|
|
||||||
|
|
||||||
let argv = System.Environment.GetCommandLineArgs()
|
|
||||||
let SetCulture() =
|
|
||||||
if argv.Length > 2 && argv.[1] = "--culture" then begin
|
|
||||||
let cultureString = argv.[2] in
|
|
||||||
let culture = new System.Globalization.CultureInfo(cultureString) in
|
|
||||||
stdout.WriteLine ("Running under culture "+culture.ToString()+"...");
|
|
||||||
System.Threading.Thread.CurrentThread.CurrentCulture <- culture
|
|
||||||
end
|
|
||||||
|
|
||||||
do SetCulture()
|
|
||||||
|
|
||||||
module CheckSqlEntityConnectionTypeProvider =
|
|
||||||
|
|
||||||
let isSQLExpressInstalled =
|
|
||||||
let edition = "Express Edition"
|
|
||||||
let instance = "MSSQL$SQLEXPRESS"
|
|
||||||
|
|
||||||
try
|
|
||||||
let getSqlExpress =
|
|
||||||
new System.Management.ManagementObjectSearcher("root\\Microsoft\\SqlServer\\ComputerManagement10",
|
|
||||||
"select * from SqlServiceAdvancedProperty where SQLServiceType = 1 and ServiceName = '" + instance + "' and (PropertyName = 'SKUNAME' or PropertyName = 'SPLEVEL')")
|
|
||||||
|
|
||||||
// If nothing is returned, SQL Express isn't installed.
|
|
||||||
getSqlExpress.Get().Count <> 0
|
|
||||||
with
|
|
||||||
| _ -> false
|
|
||||||
|
|
||||||
let checkHostedType (expectedContextTypeName, hostedType: System.Type) =
|
|
||||||
//let hostedType = hostedAppliedType1
|
|
||||||
|
|
||||||
test "ceklc09wlkm1a" (hostedType.Assembly <> typeof<Microsoft.FSharp.Data.TypeProviders.DesignTime.DataProviders>.Assembly)
|
|
||||||
test "ceklc09wlkm1b" (hostedType.Assembly.FullName.StartsWith "tmp")
|
|
||||||
|
|
||||||
check "ceklc09wlkm2" hostedType.DeclaringType null
|
|
||||||
check "ceklc09wlkm3" hostedType.DeclaringMethod null
|
|
||||||
check "ceklc09wlkm4" hostedType.FullName ("SqlEntityConnection1.SqlEntityConnectionApplied")
|
|
||||||
check "ceklc09wlkm5" (hostedType.GetConstructors()) [| |]
|
|
||||||
check "ceklc09wlkm6" (hostedType.GetCustomAttributesData().Count) 1
|
|
||||||
check "ceklc09wlkm6" (hostedType.GetCustomAttributesData().[0].Constructor.DeclaringType.FullName) typeof<TypeProviderXmlDocAttribute>.FullName
|
|
||||||
check "ceklc09wlkm7" (hostedType.GetEvents()) [| |]
|
|
||||||
check "ceklc09wlkm8" (hostedType.GetFields()) [| |]
|
|
||||||
check "ceklc09wlkm9" [ for m in hostedType.GetMethods() -> m.Name ] [ "GetDataContext" ;"GetDataContext" ]
|
|
||||||
let m0 = hostedType.GetMethods().[0]
|
|
||||||
let m1 = hostedType.GetMethods().[1]
|
|
||||||
check "ceklc09wlkm9b" (m0.GetParameters().Length) 0
|
|
||||||
check "ceklc09wlkm9c" (m1.GetParameters().Length) 1
|
|
||||||
check "ceklc09wlkm9d" (m0.ReturnType.Name) expectedContextTypeName
|
|
||||||
check "ceklc09wlkm9e" (m0.ReturnType.FullName) ("SqlEntityConnection1.SqlEntityConnectionApplied+ServiceTypes+SimpleDataContextTypes+" + expectedContextTypeName)
|
|
||||||
check "ceklc09wlkm10" (hostedType.GetProperties()) [| |]
|
|
||||||
check "ceklc09wlkm11" (hostedType.GetNestedTypes().Length) 1
|
|
||||||
check "ceklc09wlkm12"
|
|
||||||
(set [ for x in hostedType.GetNestedTypes() -> x.Name ])
|
|
||||||
(set ["ServiceTypes"])
|
|
||||||
|
|
||||||
let hostedServiceTypes = hostedType.GetNestedTypes().[0]
|
|
||||||
check "ceklc09wlkm12b" (hostedServiceTypes.GetMethods()) [| |]
|
|
||||||
check "ceklc09wlkm12c" (hostedServiceTypes.GetNestedTypes().Length) 28
|
|
||||||
|
|
||||||
let hostedSimpleDataContextTypes = hostedServiceTypes.GetNestedType("SimpleDataContextTypes")
|
|
||||||
check "ceklc09wlkm12d" (hostedSimpleDataContextTypes.GetMethods()) [| |]
|
|
||||||
check "ceklc09wlkm12e" (hostedSimpleDataContextTypes.GetNestedTypes().Length) 1
|
|
||||||
check "ceklc09wlkm12e" [ for x in hostedSimpleDataContextTypes.GetNestedTypes() -> x.Name] [expectedContextTypeName]
|
|
||||||
|
|
||||||
check "ceklc09wlkm12"
|
|
||||||
(set [ for x in hostedServiceTypes.GetNestedTypes() -> x.Name ])
|
|
||||||
(set
|
|
||||||
(["Territory"; "Supplier"; "Summary_of_Sales_by_Year";
|
|
||||||
"Summary_of_Sales_by_Quarter"; "Shipper"; "Sales_Totals_by_Amount";
|
|
||||||
"Sales_by_Category"; "Region"; "Products_by_Category";
|
|
||||||
"Products_Above_Average_Price"; "Product_Sales_for_1997"; "Product";
|
|
||||||
"Orders_Qry"; "Order_Subtotal"; "Order_Details_Extended"; "Order_Detail";
|
|
||||||
"Order"; "Invoice"; "Employee"; "CustomerDemographic";
|
|
||||||
"Customer_and_Suppliers_by_City"; "Customer"; "Current_Product_List";
|
|
||||||
"Category_Sales_for_1997"; "Category"; "Alphabetical_list_of_product"; ] @
|
|
||||||
[expectedContextTypeName] @
|
|
||||||
[ "SimpleDataContextTypes"]))
|
|
||||||
|
|
||||||
let customersType = (hostedServiceTypes.GetNestedTypes() |> Seq.find (fun t -> t.Name = "Customer"))
|
|
||||||
check "ceklc09wlkm13" (customersType.GetProperties().Length) 15
|
|
||||||
|
|
||||||
|
|
||||||
let instantiateTypeProviderAndCheckOneHostedType(connectionStringName, configFile, useDataDirectory, dataDirectory, entityContainer: string option, localSchemaFile: string option, useForceUpdate: bool option, typeFullPath: string[]) =
|
|
||||||
let expectedContextTypeName = match entityContainer with None -> "EntityContainer" | Some s -> s
|
|
||||||
let assemblyFile = typeof<Microsoft.FSharp.Data.TypeProviders.DesignTime.DataProviders>.Assembly.CodeBase.Replace("file:///","").Replace("/","\\")
|
|
||||||
test "cnlkenkewe" (File.Exists assemblyFile)
|
|
||||||
|
|
||||||
// If/when we care about the "target framework", this mock function will have to be fully implemented
|
|
||||||
let systemRuntimeContainsType s =
|
|
||||||
printfn "Call systemRuntimeContainsType(%s) returning dummy value 'true'" s
|
|
||||||
true
|
|
||||||
|
|
||||||
let tpConfig = new TypeProviderConfig(systemRuntimeContainsType, ResolutionFolder=__SOURCE_DIRECTORY__, RuntimeAssembly=assemblyFile, ReferencedAssemblies=[| |], TemporaryFolder=Path.GetTempPath(), IsInvalidationSupported=false, IsHostedExecution=true)
|
|
||||||
use typeProvider1 = (new Microsoft.FSharp.Data.TypeProviders.DesignTime.DataProviders( tpConfig ) :> ITypeProvider)
|
|
||||||
|
|
||||||
let invalidateEventCount = ref 0
|
|
||||||
|
|
||||||
typeProvider1.Invalidate.Add(fun _ -> incr invalidateEventCount)
|
|
||||||
|
|
||||||
// Load a type provider instance for the type and restart
|
|
||||||
let hostedNamespace1 = typeProvider1.GetNamespaces() |> Seq.find (fun t -> t.NamespaceName = "Microsoft.FSharp.Data.TypeProviders")
|
|
||||||
|
|
||||||
check "eenewioinw" (set [ for i in hostedNamespace1.GetTypes() -> i.Name ]) (set ["DbmlFile"; "EdmxFile"; "ODataService"; "SqlDataConnection";"SqlEntityConnection";"WsdlService"])
|
|
||||||
|
|
||||||
let hostedType1 = hostedNamespace1.ResolveTypeName("SqlEntityConnection")
|
|
||||||
let hostedType1StaticParameters = typeProvider1.GetStaticParameters(hostedType1)
|
|
||||||
check "eenewioinw2"
|
|
||||||
(set [ for i in hostedType1StaticParameters -> i.Name ])
|
|
||||||
(set ["ConnectionString"; "ConnectionStringName"; "ResolutionFolder"; "DataDirectory"; "ConfigFile"; "ForceUpdate"; "Provider"; "EntityContainer"; "LocalSchemaFile"; "Pluralize"; "SuppressForeignKeyProperties"] )
|
|
||||||
|
|
||||||
|
|
||||||
let northwind = "NORTHWND.mdf"
|
|
||||||
let northwindFile =
|
|
||||||
match dataDirectory with
|
|
||||||
| None -> northwind
|
|
||||||
| Some dd ->
|
|
||||||
if not(System.IO.Directory.Exists dd) then System.IO.Directory.CreateDirectory dd |> ignore
|
|
||||||
System.IO.Path.Combine(dd,northwind)
|
|
||||||
|
|
||||||
if not(System.IO.File.Exists(northwindFile)) then
|
|
||||||
System.IO.File.Copy("DB\\northwnd.mdf", northwindFile, false)
|
|
||||||
System.IO.File.SetAttributes(northwindFile, System.IO.FileAttributes.Normal)
|
|
||||||
|
|
||||||
|
|
||||||
let connectionString =
|
|
||||||
if useDataDirectory then
|
|
||||||
if isSQLExpressInstalled then
|
|
||||||
@"AttachDBFileName = '|DataDirectory|\" + northwind + "';Server='.\SQLEXPRESS';User Instance=true;Integrated Security=SSPI"
|
|
||||||
else
|
|
||||||
"AttachDBFileName = '|DataDirectory|\\" + northwind + "';Server='(localdb)\\MSSQLLocalDB'"
|
|
||||||
else
|
|
||||||
if isSQLExpressInstalled then
|
|
||||||
@"AttachDBFileName = '" + System.IO.Path.Combine(__SOURCE_DIRECTORY__, northwindFile) + "';Server='.\SQLEXPRESS';User Instance=true;Integrated Security=SSPI"
|
|
||||||
else
|
|
||||||
"AttachDBFileName = '" + System.IO.Path.Combine(__SOURCE_DIRECTORY__, northwindFile) + "';Server='(localdb)\\MSSQLLocalDB'"
|
|
||||||
|
|
||||||
match connectionStringName with
|
|
||||||
| None -> ()
|
|
||||||
| Some connectionStringName ->
|
|
||||||
let configFileName = match configFile with None -> "app.config" | Some nm -> nm
|
|
||||||
System.IO.File.WriteAllText(configFileName,
|
|
||||||
sprintf """<?xml version="1.0"?>
|
|
||||||
|
|
||||||
<configuration>
|
|
||||||
<connectionStrings>
|
|
||||||
<add name="%s"
|
|
||||||
connectionString="%s"
|
|
||||||
providerName="System.Data.SqlClient" />
|
|
||||||
</connectionStrings>
|
|
||||||
|
|
||||||
<system.webServer>
|
|
||||||
<modules runAllManagedModulesForAllRequests="true"/>
|
|
||||||
</system.webServer>
|
|
||||||
</configuration>
|
|
||||||
"""
|
|
||||||
connectionStringName
|
|
||||||
connectionString)
|
|
||||||
let staticParameterValues =
|
|
||||||
[| for x in hostedType1StaticParameters ->
|
|
||||||
(match x.Name with
|
|
||||||
| "ConnectionString" when connectionStringName.IsNone -> box connectionString
|
|
||||||
| "ConnectionStringName" when connectionStringName.IsSome -> box connectionStringName.Value
|
|
||||||
| "DataDirectory" when dataDirectory.IsSome -> box dataDirectory.Value
|
|
||||||
| "ConfigFile" when configFile.IsSome -> box configFile.Value
|
|
||||||
| "Pluralize" -> box true
|
|
||||||
| "EntityContainer" when entityContainer.IsSome -> box entityContainer.Value
|
|
||||||
| "SuppressForeignKeyProperties" -> box false
|
|
||||||
| "LocalSchemaFile" when localSchemaFile.IsSome -> box localSchemaFile.Value
|
|
||||||
| "ForceUpdate" when useForceUpdate.IsSome -> box useForceUpdate.Value
|
|
||||||
| _ -> box x.RawDefaultValue) |]
|
|
||||||
printfn "instantiating database type... may take a while for db to attach, code generation tool to run and csc.exe to run..."
|
|
||||||
try
|
|
||||||
let hostedAppliedType1 = typeProvider1.ApplyStaticArguments(hostedType1, typeFullPath, staticParameterValues)
|
|
||||||
|
|
||||||
checkHostedType (expectedContextTypeName,hostedAppliedType1 )
|
|
||||||
with
|
|
||||||
| e ->
|
|
||||||
printfn "%s" (e.ToString())
|
|
||||||
reportFailure()
|
|
||||||
|
|
||||||
instantiateTypeProviderAndCheckOneHostedType(None, None, false, None, None, None, None, [| "SqlEntityConnectionApplied" |])
|
|
||||||
|
|
||||||
// Use an implied app.config config file, use the current directory as the DataDirectory
|
|
||||||
instantiateTypeProviderAndCheckOneHostedType(Some "ConnectionString1", None, true, None, None, None, None, [| "SqlEntityConnectionApplied" |])
|
|
||||||
|
|
||||||
// Use a config file, use an explicit relative DataDirectory
|
|
||||||
instantiateTypeProviderAndCheckOneHostedType(Some "ConnectionString2", Some "app.config", true, Some "DataDirectory", None, None, None, [| "SqlEntityConnectionApplied" |])
|
|
||||||
|
|
||||||
// Use an absolute config file, use an absoltue DataDirectory
|
|
||||||
instantiateTypeProviderAndCheckOneHostedType(Some "ConnectionString3", Some (__SOURCE_DIRECTORY__ + @"\test.config"), true, Some (__SOURCE_DIRECTORY__ + @"\DataDirectory"), None, None, None, [| "SqlEntityConnectionApplied" |])
|
|
||||||
|
|
||||||
|
|
||||||
let schemaFile2 = Path.Combine(__SOURCE_DIRECTORY__, "nwind2.ssdl")
|
|
||||||
(try File.Delete schemaFile2 with _ -> ())
|
|
||||||
instantiateTypeProviderAndCheckOneHostedType(None, None, false, None, None, Some (Path.Combine(__SOURCE_DIRECTORY__, "nwind2.ssdl")), Some true, [| "SqlEntityConnectionApplied" |])
|
|
||||||
// schemaFile2 should now exist
|
|
||||||
check "eoinew0c9e" (File.Exists schemaFile2)
|
|
||||||
|
|
||||||
// Reuse the SSDL just created
|
|
||||||
instantiateTypeProviderAndCheckOneHostedType(None, None, false, None, None, Some (Path.Combine(__SOURCE_DIRECTORY__, "nwind2.ssdl")), Some false, [| "SqlEntityConnectionApplied" |])
|
|
||||||
// schemaFile2 should now still exist
|
|
||||||
check "eoinew0c9e" (File.Exists schemaFile2)
|
|
||||||
|
|
||||||
// // A relative path should work....
|
|
||||||
// instantiateTypeProviderAndCheckOneHostedType(Some "nwind2.ssdl", Some false)
|
|
||||||
// // schemaFile2 should now still exist
|
|
||||||
// check "eoinew0c9e" (File.Exists schemaFile2)
|
|
||||||
|
|
||||||
let schemaFile3 = Path.Combine(__SOURCE_DIRECTORY__, "nwind3.ssdl")
|
|
||||||
(try File.Delete schemaFile3 with _ -> ())
|
|
||||||
instantiateTypeProviderAndCheckOneHostedType(None, None, false, None, None, Some schemaFile3, None, [| "SqlEntityConnectionApplied" |])
|
|
||||||
|
|
||||||
// schemaFile3 should now exist
|
|
||||||
check "eoinew0c9e" (File.Exists schemaFile3)
|
|
||||||
|
|
||||||
let schemaFile4 = Path.Combine(__SOURCE_DIRECTORY__, "nwind4.ssdl")
|
|
||||||
(try File.Delete schemaFile4 with _ -> ())
|
|
||||||
instantiateTypeProviderAndCheckOneHostedType(None, None, false, None, Some "MyEntityContainer", Some schemaFile4, None, [| "SqlEntityConnectionApplied" |])
|
|
||||||
|
|
||||||
// schemaFile4 should now exist
|
|
||||||
check "eoinew0c9e" (File.Exists schemaFile4)
|
|
||||||
|
|
||||||
|
|
||||||
let _ =
|
|
||||||
if !failures then (stdout.WriteLine "Test Failed"; exit 1)
|
|
||||||
|
|
||||||
do (stdout.WriteLine "Test Passed";
|
|
||||||
File.WriteAllText("test.ok","ok");
|
|
||||||
exit 0)
|
|
||||||
|
|
|
@ -1,8 +0,0 @@
|
||||||
@if "%_echo%"=="" echo off
|
|
||||||
|
|
||||||
call %~d0%~p0..\copyFSharpDataTypeProviderDLL.cmd
|
|
||||||
|
|
||||||
call %~d0%~p0..\..\..\single-test-build.bat
|
|
||||||
|
|
||||||
exit /b %ERRORLEVEL%
|
|
||||||
|
|
|
@ -1,7 +0,0 @@
|
||||||
@if "%_echo%"=="" echo off
|
|
||||||
|
|
||||||
call %~d0%~p0..\..\..\single-test-run.bat
|
|
||||||
|
|
||||||
exit /b %ERRORLEVEL%
|
|
||||||
|
|
||||||
|
|
|
@ -1,210 +0,0 @@
|
||||||
// #Conformance #TypeProviders #WsdlService
|
|
||||||
#r "FSharp.Data.TypeProviders.dll"
|
|
||||||
|
|
||||||
open Microsoft.FSharp.Core.CompilerServices
|
|
||||||
open System.IO
|
|
||||||
|
|
||||||
module Infrastructure =
|
|
||||||
let failures = ref false
|
|
||||||
let reportFailure () = stderr.WriteLine " NO"; failures := true
|
|
||||||
let test s b = stderr.Write(s:string); if b then stderr.WriteLine " OK" else reportFailure()
|
|
||||||
let check s v1 v2 = stderr.Write(s:string); if v1 = v2 then stderr.WriteLine " OK" else eprintf "... FAILURE: expected %A, got %A " v2 v1; reportFailure()
|
|
||||||
|
|
||||||
let argv = System.Environment.GetCommandLineArgs()
|
|
||||||
let SetCulture() =
|
|
||||||
if argv.Length > 2 && argv.[1] = "--culture" then begin
|
|
||||||
let cultureString = argv.[2] in
|
|
||||||
let culture = new System.Globalization.CultureInfo(cultureString) in
|
|
||||||
stdout.WriteLine ("Running under culture "+culture.ToString()+"...");
|
|
||||||
System.Threading.Thread.CurrentThread.CurrentCulture <- culture
|
|
||||||
end
|
|
||||||
|
|
||||||
do SetCulture()
|
|
||||||
|
|
||||||
[<AbstractClass>]
|
|
||||||
type WsdlServiceTest(serviceUri, prefix) =
|
|
||||||
|
|
||||||
let check caption a b = Infrastructure.check (prefix + caption) a b
|
|
||||||
let test caption v = Infrastructure.test (prefix + caption) v
|
|
||||||
|
|
||||||
abstract CheckHostedType: System.Type -> unit
|
|
||||||
|
|
||||||
member this.InstantiateTypeProviderAndPerformCheck(useLocalSchemaFile : string option, useForceUpdate : bool option, typeFullPath : string[], f) =
|
|
||||||
let assemblyFile = typeof<Microsoft.FSharp.Data.TypeProviders.DesignTime.DataProviders>.Assembly.CodeBase.Replace("file:///","").Replace("/","\\")
|
|
||||||
test "cnlkenkewe" (File.Exists assemblyFile)
|
|
||||||
|
|
||||||
// If/when we care about the "target framework", this mock function will have to be fully implemented
|
|
||||||
let systemRuntimeContainsType s =
|
|
||||||
printfn "Call systemRuntimeContainsType(%s) returning dummy value 'true'" s
|
|
||||||
true
|
|
||||||
|
|
||||||
let tpConfig = new TypeProviderConfig(systemRuntimeContainsType, ResolutionFolder=__SOURCE_DIRECTORY__, RuntimeAssembly=assemblyFile, ReferencedAssemblies=[| |], TemporaryFolder=Path.GetTempPath(), IsInvalidationSupported=true, IsHostedExecution=true)
|
|
||||||
use typeProvider1 = (new Microsoft.FSharp.Data.TypeProviders.DesignTime.DataProviders( tpConfig ) :> ITypeProvider)
|
|
||||||
|
|
||||||
let invalidateEventCount = ref 0
|
|
||||||
|
|
||||||
typeProvider1.Invalidate.Add(fun _ -> incr invalidateEventCount)
|
|
||||||
|
|
||||||
// Load a type provider instance for the type and restart
|
|
||||||
let hostedNamespace1 = typeProvider1.GetNamespaces() |> Seq.find (fun t -> t.NamespaceName = "Microsoft.FSharp.Data.TypeProviders")
|
|
||||||
|
|
||||||
check "eenewioinw" (set [ for i in hostedNamespace1.GetTypes() -> i.Name ]) (set ["DbmlFile"; "EdmxFile"; "ODataService"; "SqlDataConnection";"SqlEntityConnection";"WsdlService"])
|
|
||||||
|
|
||||||
let hostedType1 = hostedNamespace1.ResolveTypeName("WsdlService")
|
|
||||||
let hostedType1StaticParameters = typeProvider1.GetStaticParameters(hostedType1)
|
|
||||||
check "eenewioinw2"
|
|
||||||
(set [ for i in hostedType1StaticParameters -> i.Name ])
|
|
||||||
(set ["ServiceUri"; "LocalSchemaFile"; "ResolutionFolder"; "ForceUpdate"; "Serializable"; "MessageContract"; "EnableDataBinding"; "Async"; "CollectionType";])
|
|
||||||
|
|
||||||
let staticParameterValues =
|
|
||||||
[| for x in hostedType1StaticParameters ->
|
|
||||||
(match x.Name with
|
|
||||||
| "ServiceUri" -> box serviceUri
|
|
||||||
| "LocalSchemaFile" when useLocalSchemaFile.IsSome -> box useLocalSchemaFile.Value
|
|
||||||
| "ForceUpdate" when useForceUpdate.IsSome -> box useForceUpdate.Value
|
|
||||||
| _ -> box x.RawDefaultValue) |]
|
|
||||||
|
|
||||||
for p in Seq.zip hostedType1StaticParameters staticParameterValues do
|
|
||||||
printfn "%A" p
|
|
||||||
printfn "instantiating service type... may take a while for WSDL service metadata to be downloaded, code generation tool to run and csc.exe to run..."
|
|
||||||
let hostedAppliedType1 = typeProvider1.ApplyStaticArguments(hostedType1, typeFullPath, staticParameterValues)
|
|
||||||
this.CheckHostedType(hostedAppliedType1)
|
|
||||||
|
|
||||||
f()
|
|
||||||
|
|
||||||
member this.InstantiateTypeProviderAndCheckOneHostedType(useLocalSchemaFile: string option, useForceUpdate: bool option, typeFullPath: string[] ) =
|
|
||||||
this.InstantiateTypeProviderAndPerformCheck(useLocalSchemaFile, useForceUpdate, typeFullPath, ignore)
|
|
||||||
|
|
||||||
member this.Run() =
|
|
||||||
this.InstantiateTypeProviderAndCheckOneHostedType( None, None, [| "WsdlServiceApplied" |] )
|
|
||||||
|
|
||||||
let sfile = "sfile.wsdlschema"
|
|
||||||
let fullPath s = Path.Combine(__SOURCE_DIRECTORY__, s)
|
|
||||||
let schemaFile = fullPath sfile
|
|
||||||
|
|
||||||
(try File.Delete schemaFile with _ -> ())
|
|
||||||
this.InstantiateTypeProviderAndCheckOneHostedType(Some sfile, Some true, [| "WsdlServiceApplied" |])
|
|
||||||
// schemaFile should now exist
|
|
||||||
test "eoinew0c9e1" (File.Exists schemaFile)
|
|
||||||
|
|
||||||
let writeTime = File.GetLastWriteTime(schemaFile)
|
|
||||||
// Reuse the WsdlSchema just created
|
|
||||||
this.InstantiateTypeProviderAndCheckOneHostedType(Some sfile, Some false, [| "WsdlServiceApplied" |])
|
|
||||||
// schemaFile should still exist
|
|
||||||
test "eoinew0c9e" (File.Exists schemaFile)
|
|
||||||
check "LastWriteTime_1" (File.GetLastWriteTime(schemaFile)) writeTime
|
|
||||||
|
|
||||||
let sfile2 = "sfile2.wsdlschema"
|
|
||||||
let schemaFile2 = fullPath sfile2
|
|
||||||
(try File.Delete schemaFile2 with _ -> ())
|
|
||||||
|
|
||||||
let check() =
|
|
||||||
// schemaFile2 should now exist
|
|
||||||
test "eoinew0c9e" (File.Exists schemaFile2)
|
|
||||||
|
|
||||||
// rename schema file
|
|
||||||
let renamedFile = fullPath "renamed"
|
|
||||||
// delete existing file
|
|
||||||
try File.Delete renamedFile with _ -> ()
|
|
||||||
System.Threading.SpinWait.SpinUntil((fun () -> File.Exists(schemaFile2)), 10000)
|
|
||||||
|> ignore
|
|
||||||
test "SchemaFileExists" (File.Exists schemaFile2)
|
|
||||||
this.InstantiateTypeProviderAndPerformCheck(Some sfile2, Some false, [| "WsdlServiceApplied" |], check)
|
|
||||||
|
|
||||||
// corrupt source file
|
|
||||||
let initial = File.ReadAllText(sfile2)
|
|
||||||
let text = "123" + File.ReadAllText(sfile2)
|
|
||||||
File.WriteAllText(sfile2, text)
|
|
||||||
try
|
|
||||||
this.InstantiateTypeProviderAndPerformCheck(Some sfile2, Some false, [| "WsdlServiceApplied" |], check)
|
|
||||||
test "Exception_Expected" false
|
|
||||||
with
|
|
||||||
e -> ()
|
|
||||||
// read all text and verify that it was not overwritten
|
|
||||||
let newText = File.ReadAllText(sfile2)
|
|
||||||
test "FileWasNotChanged" (text = newText)
|
|
||||||
|
|
||||||
|
|
||||||
module CheckWsdlServiceTypeProvider =
|
|
||||||
let private prefix = "ceklc"
|
|
||||||
type SimpleWsdlTest() =
|
|
||||||
inherit WsdlServiceTest("http://api.microsofttranslator.com/V2/Soap.svc", prefix)
|
|
||||||
|
|
||||||
let check caption a b = Infrastructure.check (prefix + caption) a b
|
|
||||||
let test caption v = Infrastructure.test (prefix + caption) v
|
|
||||||
|
|
||||||
override this.CheckHostedType(hostedType) =
|
|
||||||
//let hostedType = hostedAppliedType1
|
|
||||||
test "09wlkm1a" (hostedType.Assembly <> typeof<Microsoft.FSharp.Data.TypeProviders.DesignTime.DataProviders>.Assembly)
|
|
||||||
test "09wlkm1b" (hostedType.Assembly.FullName.StartsWith "tmp")
|
|
||||||
|
|
||||||
check "09wlkm2" hostedType.DeclaringType null
|
|
||||||
check "09wlkm3" hostedType.DeclaringMethod null
|
|
||||||
check "09wlkm4" hostedType.FullName "WsdlService1.WsdlServiceApplied"
|
|
||||||
check "09wlkm5" (hostedType.GetConstructors()) [| |]
|
|
||||||
check "09wlkm6" (hostedType.GetCustomAttributesData().Count) 1
|
|
||||||
check "09wlkm6" (hostedType.GetCustomAttributesData().[0].Constructor.DeclaringType.FullName) typeof<TypeProviderXmlDocAttribute>.FullName
|
|
||||||
check "09wlkm7" (hostedType.GetEvents()) [| |]
|
|
||||||
check "09wlkm8" (hostedType.GetFields()) [| |]
|
|
||||||
check "09wlkm9" (hostedType.GetMethods() |> Array.map (fun m -> m.Name)) [| "GetBasicHttpBinding_LanguageService"; "GetBasicHttpBinding_LanguageService"|]
|
|
||||||
check "09wlkm10" (hostedType.GetProperties()) [| |]
|
|
||||||
check "09wlkm11"
|
|
||||||
(set [ for x in hostedType.GetNestedTypes() -> x.Name ])
|
|
||||||
(set ["ServiceTypes"] )
|
|
||||||
|
|
||||||
let serviceTypes = hostedType.GetNestedTypes().[0]
|
|
||||||
|
|
||||||
check "09wlkm11" (serviceTypes.GetNestedTypes().Length) 5
|
|
||||||
check "09wlkm12"
|
|
||||||
(set [ for x in serviceTypes.GetNestedTypes() -> x.Name ])
|
|
||||||
(set ["LanguageService"; "LanguageServiceChannel"; "LanguageServiceClient"; "Microsoft"; "SimpleDataContextTypes" ] )
|
|
||||||
|
|
||||||
let languageServiceType = (serviceTypes.GetNestedTypes() |> Seq.find (fun t -> t.Name = "LanguageService"))
|
|
||||||
check "09wlkm13" (languageServiceType.GetProperties().Length) 0
|
|
||||||
|
|
||||||
(new SimpleWsdlTest()).Run()
|
|
||||||
|
|
||||||
module CheckWsdlServiceTypeProviderXIgniteFutures =
|
|
||||||
let prefix = "qceklc"
|
|
||||||
type XIgniteWsdlTest() =
|
|
||||||
inherit WsdlServiceTest("http://www.xignite.com/xFutures.asmx?WSDL", prefix)
|
|
||||||
let prefix = "xignite"
|
|
||||||
let check caption a b = Infrastructure.check (prefix + caption) a b
|
|
||||||
let test caption v = Infrastructure.test (prefix + caption) v
|
|
||||||
|
|
||||||
override this.CheckHostedType (hostedType: System.Type) =
|
|
||||||
test "09wlkm1ad233" (hostedType.Assembly <> typeof<Microsoft.FSharp.Data.TypeProviders.DesignTime.DataProviders>.Assembly)
|
|
||||||
test "09wlkm1b2ed1" (hostedType.Assembly.FullName.StartsWith "tmp")
|
|
||||||
|
|
||||||
check "09wlkm2" hostedType.DeclaringType null
|
|
||||||
check "09wlkm3" hostedType.DeclaringMethod null
|
|
||||||
check "09wlkm4" hostedType.FullName "WsdlService1.WsdlServiceApplied"
|
|
||||||
check "09wlkm5" (hostedType.GetConstructors()) [| |]
|
|
||||||
check "09wlkm6" (hostedType.GetCustomAttributesData().Count) 1
|
|
||||||
check "09wlkm6" (hostedType.GetCustomAttributesData().[0].Constructor.DeclaringType.FullName) typeof<TypeProviderXmlDocAttribute>.FullName
|
|
||||||
check "09wlkm7" (hostedType.GetEvents()) [| |]
|
|
||||||
check "09wlkm8" (hostedType.GetFields()) [| |]
|
|
||||||
check "09wlkm9" (hostedType.GetMethods() |> Array.map (fun m -> m.Name)) [| "GetXigniteFuturesSoap"; "GetXigniteFuturesSoap"; "GetXigniteFuturesSoap12";"GetXigniteFuturesSoap12"|]
|
|
||||||
check "09wlkm10" (hostedType.GetProperties()) [| |]
|
|
||||||
|
|
||||||
let serviceTypes = hostedType.GetNestedTypes().[0]
|
|
||||||
|
|
||||||
|
|
||||||
check "09wlkm11a" (serviceTypes.GetNestedTypes().Length >= 1) true
|
|
||||||
check "09wlkm11b" (serviceTypes.GetNestedType("www") <> null) true
|
|
||||||
check "09wlkm11c" (serviceTypes.GetNestedType("www").GetNestedType("xignite") <> null) true
|
|
||||||
check "09wlkm11d" (serviceTypes.GetNestedType("www").GetNestedType("xignite").GetNestedType("com") <> null) true
|
|
||||||
check "09wlkm11e" (serviceTypes.GetNestedType("www").GetNestedType("xignite").GetNestedType("com").GetNestedType("services") <> null) true
|
|
||||||
check "09wlkm11f" (serviceTypes.GetNestedType("www").GetNestedType("xignite").GetNestedType("com").GetNestedType("services").GetNestedTypes().Length >= 1) true
|
|
||||||
check "09wlkm11g" [ for x in serviceTypes.GetNestedTypes() do if not x.IsNested && x.Namespace = null then yield x.Name ].Length 175
|
|
||||||
|
|
||||||
(new XIgniteWsdlTest()).Run()
|
|
||||||
|
|
||||||
|
|
||||||
let _ =
|
|
||||||
if !Infrastructure.failures then (stdout.WriteLine "Test Failed"; exit 1)
|
|
||||||
|
|
||||||
do (stdout.WriteLine "Test Passed";
|
|
||||||
File.WriteAllText("test.ok","ok");
|
|
||||||
exit 0)
|
|
||||||
|
|
|
@ -1,28 +0,0 @@
|
||||||
REM == Find out OS architecture, no matter what cmd prompt
|
|
||||||
SET OSARCH=%PROCESSOR_ARCHITECTURE%
|
|
||||||
IF NOT "%PROCESSOR_ARCHITEW6432%"=="" SET OSARCH=%PROCESSOR_ARCHITEW6432%
|
|
||||||
|
|
||||||
REM == Find out path to native 'Program Files 32bit', no matter what
|
|
||||||
REM == architecture we are running on and no matter what command
|
|
||||||
REM == prompt we came from.
|
|
||||||
IF /I "%OSARCH%"=="x86" set X86_PROGRAMFILES=%ProgramFiles%
|
|
||||||
IF /I "%OSARCH%"=="AMD64" set X86_PROGRAMFILES=%ProgramFiles(x86)%
|
|
||||||
|
|
||||||
REM == Set path to FSharp.Data.TypeProviders.dll
|
|
||||||
REM == This binary is frozen at 4.3.0.0 version
|
|
||||||
set FSDATATYPEPROVIDERSPATH=%X86_PROGRAMFILES%\Reference Assemblies\Microsoft\FSharp\.NETFramework\v4.0\4.3.0.0\Type Providers\FSharp.Data.TypeProviders.dll
|
|
||||||
IF EXIST "%FSCBinPath%\FSharp.Data.TypeProviders.dll" set FSDATATYPEPROVIDERSPATH=%FSCBinPath%\FSharp.Data.TypeProviders.dll
|
|
||||||
|
|
||||||
REM == Copy the FSharp.Data.TypeProvider.dll
|
|
||||||
REM == Note: we need this because we are doing white box testing
|
|
||||||
IF EXIST "%FSDATATYPEPROVIDERSPATH%" copy /y "%FSDATATYPEPROVIDERSPATH%" .
|
|
||||||
|
|
||||||
REM == Copy in config files with needed binding redirects
|
|
||||||
xcopy /RY "%~dp0test.exe.config" "%cd%\test.exe.config*"
|
|
||||||
xcopy /RY "%~dp0test.exe.config" "%cd%\testX64.exe.config*"
|
|
||||||
xcopy /RY "%~dp0test.exe.config" "%cd%\test--optimize.exe.config*"
|
|
||||||
xcopy /RY "%~dp0test.exe.config" "%cd%\test--optimize-lib.dll.config*"
|
|
||||||
xcopy /RY "%~dp0test.exe.config" "%cd%\test--optimize-client-of-lib.exe.config*"
|
|
||||||
xcopy /RY "%~dp0test.exe.config" "%cd%\test--optminus--debug.exe.config*"
|
|
||||||
xcopy /RY "%~dp0test.exe.config" "%cd%\test--optplus--debug.exe.config*"
|
|
||||||
|
|
|
@ -1,71 +0,0 @@
|
||||||
module CopyFSharpDataTypeProviderDLL
|
|
||||||
|
|
||||||
open System
|
|
||||||
open System.IO
|
|
||||||
open NUnit.Framework
|
|
||||||
|
|
||||||
open FSharpTestSuiteTypes
|
|
||||||
open PlatformHelpers
|
|
||||||
open NUnitConf
|
|
||||||
|
|
||||||
let copy (cfg: TestConfig) (dir: string) = attempt {
|
|
||||||
let fileExists = Commands.fileExists dir >> Option.isSome
|
|
||||||
let getfullpath = Commands.getfullpath dir
|
|
||||||
|
|
||||||
let copy_y a = Commands.copy_y dir a >> checkResult
|
|
||||||
|
|
||||||
// REM == Find out OS architecture, no matter what cmd prompt
|
|
||||||
// SET OSARCH=%PROCESSOR_ARCHITECTURE%
|
|
||||||
// IF NOT "%PROCESSOR_ARCHITEW6432%"=="" SET OSARCH=%PROCESSOR_ARCHITEW6432%
|
|
||||||
let osArch = WindowsPlatform.osArch cfg.EnvironmentVariables
|
|
||||||
|
|
||||||
// REM == Find out path to native 'Program Files 32bit', no matter what
|
|
||||||
// REM == architecture we are running on and no matter what command
|
|
||||||
// REM == prompt we came from.
|
|
||||||
// IF /I "%OSARCH%"=="x86" set X86_PROGRAMFILES=%ProgramFiles%
|
|
||||||
// IF /I "%OSARCH%"=="AMD64" set X86_PROGRAMFILES=%ProgramFiles(x86)%
|
|
||||||
let x86ProgramFiles = WindowsPlatform.x86ProgramFilesDirectory cfg.EnvironmentVariables osArch
|
|
||||||
|
|
||||||
// REM == Set path to FSharp.Data.TypeProviders.dll
|
|
||||||
// REM == This binary is frozen at 4.3.0.0 version
|
|
||||||
// set FSDATATYPEPROVIDERSPATH=%X86_PROGRAMFILES%\Reference Assemblies\Microsoft\FSharp\.NETFramework\v4.0\4.3.0.0\Type Providers\FSharp.Data.TypeProviders.dll
|
|
||||||
// IF EXIST "%FSCBinPath%\FSharp.Data.TypeProviders.dll" set FSDATATYPEPROVIDERSPATH=%FSCBinPath%\FSharp.Data.TypeProviders.dll
|
|
||||||
let FSDATATYPEPROVIDERSPATH =
|
|
||||||
if fileExists (cfg.FSCBinPath/"FSharp.Data.TypeProviders.dll")
|
|
||||||
then cfg.FSCBinPath/"FSharp.Data.TypeProviders.dll"
|
|
||||||
else x86ProgramFiles/"Reference Assemblies"/"Microsoft"/"FSharp"/".NETFramework"/"v4.0"/"4.3.0.0"/"Type Providers"/"FSharp.Data.TypeProviders.dll"
|
|
||||||
|
|
||||||
|
|
||||||
// REM == Copy the FSharp.Data.TypeProvider.dll
|
|
||||||
// REM == Note: we need this because we are doing white box testing
|
|
||||||
// IF EXIST "%FSDATATYPEPROVIDERSPATH%" copy /y "%FSDATATYPEPROVIDERSPATH%" .
|
|
||||||
do! if fileExists FSDATATYPEPROVIDERSPATH
|
|
||||||
then copy_y FSDATATYPEPROVIDERSPATH ("."/"FSharp.Data.TypeProviders.dll")
|
|
||||||
else Success ()
|
|
||||||
|
|
||||||
// REM == Copy in config files with needed binding redirects
|
|
||||||
let xcopy_ry a b =
|
|
||||||
let removeReadonly p =
|
|
||||||
let attr = File.GetAttributes(p)
|
|
||||||
File.SetAttributes(p, attr &&& (~~~ FileAttributes.ReadOnly))
|
|
||||||
|
|
||||||
if fileExists b then removeReadonly (getfullpath b)
|
|
||||||
copy_y a b
|
|
||||||
|
|
||||||
let ``test.exe.config`` = __SOURCE_DIRECTORY__/"test.exe.config"
|
|
||||||
// xcopy /RY "%~dp0test.exe.config" "%cd%\test.exe.config*"
|
|
||||||
do! xcopy_ry ``test.exe.config`` "test.exe.config"
|
|
||||||
// xcopy /RY "%~dp0test.exe.config" "%cd%\testX64.exe.config*"
|
|
||||||
do! xcopy_ry ``test.exe.config`` "testX64.exe.config"
|
|
||||||
// xcopy /RY "%~dp0test.exe.config" "%cd%\test--optimize.exe.config*"
|
|
||||||
do! xcopy_ry ``test.exe.config`` "test--optimize.exe.config"
|
|
||||||
// xcopy /RY "%~dp0test.exe.config" "%cd%\test--optimize-lib.dll.config*"
|
|
||||||
do! xcopy_ry ``test.exe.config`` "test--optimize-lib.dll.config"
|
|
||||||
// xcopy /RY "%~dp0test.exe.config" "%cd%\test--optimize-client-of-lib.exe.config*"
|
|
||||||
do! xcopy_ry ``test.exe.config`` "test--optimize-client-of-lib.exe.config"
|
|
||||||
// xcopy /RY "%~dp0test.exe.config" "%cd%\test--optminus--debug.exe.config*"
|
|
||||||
do! xcopy_ry ``test.exe.config`` "test--optminus--debug.exe.config"
|
|
||||||
// xcopy /RY "%~dp0test.exe.config" "%cd%\test--optplus--debug.exe.config*"
|
|
||||||
do! xcopy_ry ``test.exe.config`` "test--optplus--debug.exe.config"
|
|
||||||
|
|
||||||
}
|
|
Некоторые файлы не были показаны из-за слишком большого количества измененных файлов Показать больше
Загрузка…
Ссылка в новой задаче