diff --git a/.nuget/NuGet.Config b/.nuget/NuGet.Config
index 377a0de0fe7..e20fd46714b 100644
--- a/.nuget/NuGet.Config
+++ b/.nuget/NuGet.Config
@@ -12,6 +12,6 @@
-
+
diff --git a/VisualFSharp.sln b/VisualFSharp.sln
index 0dd516a06bd..d70655386d3 100644
--- a/VisualFSharp.sln
+++ b/VisualFSharp.sln
@@ -1,9 +1,7 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
-VisualStudioVersion = 15.0.25302.0
-# Visual Studio 14
-VisualStudioVersion = 14.0.25123.0
+VisualStudioVersion = 15.0.25618.0
MinimumVisualStudioVersion = 10.0.40219.1
Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "FSharp.Compiler", "src\fsharp\FSharp.Compiler\FSharp.Compiler.fsproj", "{2E4D67B4-522D-4CF7-97E4-BA940F0B18F3}"
EndProject
@@ -131,6 +129,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VisualFSharpFull", "vsinteg
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VisualFSharpWeb", "vsintegration\Vsix\VisualFSharpWeb\VisualFSharpWeb.csproj", "{58730C8B-16F5-4956-9291-BB68E17C9142}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VisualFSharpOpenSource", "vsintegration\Vsix\VisualFSharpOpenSource\VisualFSharpOpenSource.csproj", "{E6A45CDF-B408-420F-B475-74611BEFC52B}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -728,6 +728,18 @@ Global
{58730C8B-16F5-4956-9291-BB68E17C9142}.Release|Any CPU.Build.0 = Release|Any CPU
{58730C8B-16F5-4956-9291-BB68E17C9142}.Release|x86.ActiveCfg = Release|Any CPU
{58730C8B-16F5-4956-9291-BB68E17C9142}.Release|x86.Build.0 = Release|Any CPU
+ {E6A45CDF-B408-420F-B475-74611BEFC52B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {E6A45CDF-B408-420F-B475-74611BEFC52B}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {E6A45CDF-B408-420F-B475-74611BEFC52B}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {E6A45CDF-B408-420F-B475-74611BEFC52B}.Debug|x86.Build.0 = Debug|Any CPU
+ {E6A45CDF-B408-420F-B475-74611BEFC52B}.Proto|Any CPU.ActiveCfg = Proto|Any CPU
+ {E6A45CDF-B408-420F-B475-74611BEFC52B}.Proto|Any CPU.Build.0 = Proto|Any CPU
+ {E6A45CDF-B408-420F-B475-74611BEFC52B}.Proto|x86.ActiveCfg = Proto|Any CPU
+ {E6A45CDF-B408-420F-B475-74611BEFC52B}.Proto|x86.Build.0 = Proto|Any CPU
+ {E6A45CDF-B408-420F-B475-74611BEFC52B}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {E6A45CDF-B408-420F-B475-74611BEFC52B}.Release|Any CPU.Build.0 = Release|Any CPU
+ {E6A45CDF-B408-420F-B475-74611BEFC52B}.Release|x86.ActiveCfg = Release|Any CPU
+ {E6A45CDF-B408-420F-B475-74611BEFC52B}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -787,5 +799,6 @@ Global
{E7EC4A3E-9D57-45B8-83F5-EDDFD6CEF090} = {141F6C23-E1B1-4D89-9F10-F0B8AD58E71F}
{59ADCE46-9740-4079-834D-9A03A3494EBC} = {141F6C23-E1B1-4D89-9F10-F0B8AD58E71F}
{58730C8B-16F5-4956-9291-BB68E17C9142} = {141F6C23-E1B1-4D89-9F10-F0B8AD58E71F}
+ {E6A45CDF-B408-420F-B475-74611BEFC52B} = {141F6C23-E1B1-4D89-9F10-F0B8AD58E71F}
EndGlobalSection
EndGlobal
diff --git a/build.cmd b/build.cmd
index 2dc565d3eb2..9e856ae7a55 100644
--- a/build.cmd
+++ b/build.cmd
@@ -363,8 +363,8 @@ if '%RestorePackages%' == 'true' (
.\.nuget\NuGet.exe restore packages.config -PackagesDirectory packages -ConfigFile .nuget\nuget.config
@if ERRORLEVEL 1 echo Error: Nuget restore failed && goto :failure
)
-if '%BUILD_PROTO_WITH_CORECLR_LKG%' == '1' (
+if '%BUILD_PROTO_WITH_CORECLR_LKG%' == '1' (
:: Restore the Tools directory
call %~dp0init-tools.cmd
)
@@ -372,7 +372,6 @@ if '%BUILD_PROTO_WITH_CORECLR_LKG%' == '1' (
set _dotnetexe=%~dp0Tools\dotnetcli\dotnet.exe
if '%BUILD_PROTO_WITH_CORECLR_LKG%' == '1' (
-
:: Restore the Tools directory
call %~dp0init-tools.cmd
diff --git a/lkg/FSharp-14.0.23413.0/bin/FSharp.Build.dll b/lkg/FSharp-14.0.23413.0/bin/FSharp.Build.dll
index b0f401edb50..e8d1b6f4612 100644
Binary files a/lkg/FSharp-14.0.23413.0/bin/FSharp.Build.dll and b/lkg/FSharp-14.0.23413.0/bin/FSharp.Build.dll differ
diff --git a/packages.config b/packages.config
index 063cb9442ad..6082805e2d3 100644
--- a/packages.config
+++ b/packages.config
@@ -45,4 +45,5 @@
+
diff --git a/setup/FSharp.SDK/Common.Wix.Properties.wxs b/setup/FSharp.SDK/Common.Wix.Properties.wxs
index 5afdc6bcca3..f44251c1fdb 100644
--- a/setup/FSharp.SDK/Common.Wix.Properties.wxs
+++ b/setup/FSharp.SDK/Common.Wix.Properties.wxs
@@ -12,64 +12,64 @@
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
@@ -81,7 +81,7 @@
-
+
diff --git a/setup/FSharp.SDK/FSharp.SDK.wixproj b/setup/FSharp.SDK/FSharp.SDK.wixproj
index 04e76713f4e..12843effde0 100644
--- a/setup/FSharp.SDK/FSharp.SDK.wixproj
+++ b/setup/FSharp.SDK/FSharp.SDK.wixproj
@@ -10,7 +10,8 @@
- Microsoft.FSharp.SDK
+ Microsoft.FSharp.SDK.Core
+ Microsoft.FSharp.SDK.Resources.$(LocaleCode)
da0da41f-0e00-4598-8eee-b29d31b0ca04
Package
net
@@ -23,7 +24,8 @@
$(DefineConstants);LocaleCode=$(LocaleCode)
$(DefineConstants);LocaleId=$(LocaleId)
- $(DefineConstants);LocaleRegion=$(LocaleRegion)
+ $(DefineConstants);LocaleParentCulture=$(LocaleParentCulture)
+ $(DefineConstants);LocaleSpecificCulture=$(LocaleSpecificCulture)
$(DefineConstants);IsLangPack=$(IsLangPack)
$(DefineConstants);BinariesDir=$(BinariesDir)
@@ -65,7 +67,8 @@
-
+
+
@@ -74,6 +77,6 @@
-
+
\ No newline at end of file
diff --git a/setup/FSharp.SDK/component-groups/Runtime_LangPack.wxs b/setup/FSharp.SDK/component-groups/Runtime_LangPack.wxs
index acd7f104fc9..633cb063bb8 100644
--- a/setup/FSharp.SDK/component-groups/Runtime_LangPack.wxs
+++ b/setup/FSharp.SDK/component-groups/Runtime_LangPack.wxs
@@ -4,7 +4,7 @@
-
+
diff --git a/setup/FSharp.Setup.props b/setup/FSharp.Setup.props
index 683a8929c52..0ead30f9770 100644
--- a/setup/FSharp.Setup.props
+++ b/setup/FSharp.Setup.props
@@ -4,6 +4,7 @@
2.0
3.10
+ 4.1
3.10.0.1503
$(SetupRootFolder)\..\packages\WiX.Toolset.2015.$(WiXToolset2015Version)\tools\wix
$(SetupRootFolder)\..\packages
@@ -26,85 +27,99 @@
ENU
1033
- en-us
+ en
+ en-US
false
CHT
1028
- zh-tw
+ zh-Hant
+ zh-TW
true
CSY
1029
- cs-cz
+ cs
+ cs-CZ
true
DEU
1031
- de-de
+ de
+ de-DE
true
FRA
1036
- fr-fr
+ fr
+ fr-FR
true
ITA
1040
- it-it
+ it
+ it-IT
true
JPN
1041
- ja-jp
+ ja
+ ja-JP
true
KOR
1042
- ko-kr
+ ko
+ ko-KR
true
PLK
1045
- pl-pl
+ pl
+ pl-PL
true
PTB
1046
- pt-br
+ pt-BR
+ pt-BR
true
RUS
1049
- ru-ru
+ ru
+ ru-RU
true
TRK
1055
- tr-tr
+ tr
+ tr-TR
true
CHS
2052
- zh-cn
+ zh-Hans
+ zh-CN
true
ESN
3082
- es-es
+ es
+ es-ES
true
diff --git a/setup/Swix/Microsoft.FSharp.Dependencies/Dependencies.swr b/setup/Swix/Microsoft.FSharp.Dependencies/Dependencies.swr
new file mode 100644
index 00000000000..406eb671e33
--- /dev/null
+++ b/setup/Swix/Microsoft.FSharp.Dependencies/Dependencies.swr
@@ -0,0 +1,43 @@
+use vs
+
+package name=Microsoft.FSharp.Dependencies
+ version=$(FSharpPackageVersion)
+
+vs.dependencies
+ vs.dependency id=Microsoft.FSharp.SDK.Core
+ version=$(FSharpPackageVersion)
+ type=Required
+
+ vs.dependency id=Microsoft.FSharp.SDK.Resources
+ version=$(FSharpPackageVersion)
+ type=Required
+
+ vs.dependency id=Microsoft.FSharp.VSIX.Full.Core
+ version=$(FSharpPackageVersion)
+ type=Required
+ when=Microsoft.VisualStudio.Product.Enterprise,Microsoft.VisualStudio.Product.Professional,Microsoft.VisualStudio.Product.Community
+
+ vs.dependency id=Microsoft.FSharp.VSIX.Full.Resources
+ version=$(FSharpPackageVersion)
+ type=Required
+ when=Microsoft.VisualStudio.Product.Enterprise,Microsoft.VisualStudio.Product.Professional,Microsoft.VisualStudio.Product.Community
+
+ vs.dependency id=Microsoft.FSharp.VSIX.Desktop.Core
+ version=$(FSharpPackageVersion)
+ type=Required
+ when=Microsoft.VisualStudio.Product.DesktopExpress
+
+ vs.dependency id=Microsoft.FSharp.VSIX.Desktop.Resources
+ version=$(FSharpPackageVersion)
+ type=Required
+ when=Microsoft.VisualStudio.Product.DesktopExpress
+
+ vs.dependency id=Microsoft.FSharp.VSIX.Web.Core
+ version=$(FSharpPackageVersion)
+ type=Required
+ when=Microsoft.VisualStudio.Product.WebExpress
+
+ vs.dependency id=Microsoft.FSharp.VSIX.Web.Resources
+ version=$(FSharpPackageVersion)
+ type=Required
+ when=Microsoft.VisualStudio.Product.WebExpress
diff --git a/setup/Swix/Microsoft.FSharp.Dependencies/Files.swr b/setup/Swix/Microsoft.FSharp.Dependencies/Files.swr
index bf639935d7a..04eeec577a8 100644
--- a/setup/Swix/Microsoft.FSharp.Dependencies/Files.swr
+++ b/setup/Swix/Microsoft.FSharp.Dependencies/Files.swr
@@ -1,17 +1,7 @@
use vs
-package name=Microsoft.FSharp.Dependencies.$(VSSku)
- version=4.1
- vs.package.language=neutral
-
-vs.dependencies
- vs.dependency id=Microsoft.FSharp.VSIX.$(VSSku)
- version=4.1
- type=Required
-
- vs.dependency id=Microsoft.FSharp.SDK
- version=4.1
- type=Required
+package name=Microsoft.FSharp.Dependencies
+ version=$(FSharpPackageVersion)
folder "InstallDir:MSBuild\Microsoft\VisualStudio\v15.0\FSharp"
file "Microsoft.FSharp.targets" source="$(BinariesFolder)\setup\resources\Microsoft.FSharp.Shim.targets"
diff --git a/setup/Swix/Microsoft.FSharp.Dependencies/Microsoft.FSharp.Dependencies.swixproj b/setup/Swix/Microsoft.FSharp.Dependencies/Microsoft.FSharp.Dependencies.swixproj
index 071b86deb08..2ba832036eb 100644
--- a/setup/Swix/Microsoft.FSharp.Dependencies/Microsoft.FSharp.Dependencies.swixproj
+++ b/setup/Swix/Microsoft.FSharp.Dependencies/Microsoft.FSharp.Dependencies.swixproj
@@ -10,7 +10,7 @@
$(FSharpSourcesRoot)\..\$(Configuration)
$(FSharpSourcesRoot)\..\packages
$(BinariesFolder)\insertion
- Microsoft.FSharp.Dependencies.$(VSSku)
+ Microsoft.FSharp.Dependencies
$(MSBuildThisFileDirectory)obj
@@ -19,18 +19,15 @@
$(PackagePreprocessorDefinitions);BinariesFolder=$(BinariesFolder)
$(PackagePreprocessorDefinitions);PackagesFolder=$(PackagesFolder)
- $(PackagePreprocessorDefinitions);VSSku=$(VSSku)
+ $(PackagePreprocessorDefinitions);FSharpPackageVersion=$(FSharpPackageVersion)
+
-
-
-
-
diff --git a/setup/Swix/Microsoft.FSharp.SDK.Core/Files.swr b/setup/Swix/Microsoft.FSharp.SDK.Core/Files.swr
new file mode 100644
index 00000000000..03c9dab29b7
--- /dev/null
+++ b/setup/Swix/Microsoft.FSharp.SDK.Core/Files.swr
@@ -0,0 +1,8 @@
+use vs
+
+package name=Microsoft.FSharp.SDK.Core
+ version=$(FSharpPackageVersion)
+ vs.package.type=msi
+
+vs.payloads
+ vs.payload source="$(BinariesFolder)\msi\Microsoft.FSharp.SDK.Core.msi"
diff --git a/setup/Swix/Microsoft.FSharp.SDK.Core/Microsoft.FSharp.SDK.Core.swixproj b/setup/Swix/Microsoft.FSharp.SDK.Core/Microsoft.FSharp.SDK.Core.swixproj
new file mode 100644
index 00000000000..de6979f0a7c
--- /dev/null
+++ b/setup/Swix/Microsoft.FSharp.SDK.Core/Microsoft.FSharp.SDK.Core.swixproj
@@ -0,0 +1,30 @@
+
+
+
+ ..\..\..\src
+ neutral
+ false
+ manifest
+ Microsoft.FSharp.SDK.Core
+ true
+ Debug
+ $(FSharpSourcesRoot)\..\$(Configuration)
+ $(BinariesFolder)\insertion
+ $(MSBuildThisFileDirectory)obj
+
+
+
+
+
+ $(PackagePreprocessorDefinitions);BinariesFolder=$(BinariesFolder)
+ $(PackagePreprocessorDefinitions);FSharpPackageVersion=$(FSharpPackageVersion)
+
+
+
+
+
+
+
+
+
+
diff --git a/setup/Swix/Microsoft.FSharp.SDK.Resources/Empty.swr b/setup/Swix/Microsoft.FSharp.SDK.Resources/Empty.swr
new file mode 100644
index 00000000000..fa3af6a1adb
--- /dev/null
+++ b/setup/Swix/Microsoft.FSharp.SDK.Resources/Empty.swr
@@ -0,0 +1,5 @@
+use vs
+
+package name=Microsoft.FSharp.SDK.Resources
+ version=$(FSharpPackageVersion)
+ vs.package.language=$(LocaleSpecificCulture)
\ No newline at end of file
diff --git a/setup/Swix/Microsoft.FSharp.SDK.Resources/Files.swr b/setup/Swix/Microsoft.FSharp.SDK.Resources/Files.swr
new file mode 100644
index 00000000000..5e7c02d2980
--- /dev/null
+++ b/setup/Swix/Microsoft.FSharp.SDK.Resources/Files.swr
@@ -0,0 +1,9 @@
+use vs
+
+package name=Microsoft.FSharp.SDK.Resources
+ version=$(FSharpPackageVersion)
+ vs.package.type=msi
+ vs.package.language=$(LocaleSpecificCulture)
+
+vs.payloads
+ vs.payload source="$(BinariesFolder)\msi\Microsoft.FSharp.SDK.Resources.$(LocaleCode).msi"
diff --git a/setup/Swix/Microsoft.FSharp.SDK/Microsoft.FSharp.SDK.swixproj b/setup/Swix/Microsoft.FSharp.SDK.Resources/Microsoft.FSharp.SDK.Resources.swixproj
similarity index 60%
rename from setup/Swix/Microsoft.FSharp.SDK/Microsoft.FSharp.SDK.swixproj
rename to setup/Swix/Microsoft.FSharp.SDK.Resources/Microsoft.FSharp.SDK.Resources.swixproj
index 3e836ccb657..a91de00cb73 100644
--- a/setup/Swix/Microsoft.FSharp.SDK/Microsoft.FSharp.SDK.swixproj
+++ b/setup/Swix/Microsoft.FSharp.SDK.Resources/Microsoft.FSharp.SDK.Resources.swixproj
@@ -4,25 +4,33 @@
..\..\..\src
neutral
false
- manifest
- Microsoft.FSharp.SDK.$(LocaleCode)
+ Microsoft.FSharp.SDK.Resources.$(LocaleCode)
true
Debug
$(FSharpSourcesRoot)\..\$(Configuration)
$(BinariesFolder)\insertion
+ vsix
+ manifest
+ $(MSBuildThisFileDirectory)obj
$(PackagePreprocessorDefinitions);BinariesFolder=$(BinariesFolder)
+ $(PackagePreprocessorDefinitions);FSharpPackageVersion=$(FSharpPackageVersion)
$(PackagePreprocessorDefinitions);LocaleCode=$(LocaleCode)
- $(PackagePreprocessorDefinitions);LocaleId=$(LocaleId)
- $(PackagePreprocessorDefinitions);LocaleRegion=$(LocaleRegion)
+ $(PackagePreprocessorDefinitions);LocaleId=$(LocaleId)
+ $(PackagePreprocessorDefinitions);LocaleParentCulture=$(LocaleParentCulture)
+ $(PackagePreprocessorDefinitions);LocaleSpecificCulture=$(LocaleSpecificCulture)
$(PackagePreprocessorDefinitions);IsLangPack=$(IsLangPack)
-
+
+
+
+
+
@@ -33,7 +41,8 @@
-
+
+
diff --git a/setup/Swix/Microsoft.FSharp.SDK/Files.swr b/setup/Swix/Microsoft.FSharp.SDK/Files.swr
deleted file mode 100644
index d161ff0fb99..00000000000
--- a/setup/Swix/Microsoft.FSharp.SDK/Files.swr
+++ /dev/null
@@ -1,9 +0,0 @@
-use vs
-
-package name=Microsoft.FSharp.SDK
- version=4.1
- vs.package.type=msi
- vs.package.language=$(LocaleRegion)
-
-vs.payloads
- vs.payload source="$(BinariesFolder)\msi\Microsoft.FSharp.SDK.$(LocaleCode).msi"
diff --git a/setup/Swix/Microsoft.FSharp.Vsix/Core.Files.swr b/setup/Swix/Microsoft.FSharp.Vsix.Core/Files.swr
similarity index 60%
rename from setup/Swix/Microsoft.FSharp.Vsix/Core.Files.swr
rename to setup/Swix/Microsoft.FSharp.Vsix.Core/Files.swr
index 2cd1df4fd55..34048ab6dbb 100644
--- a/setup/Swix/Microsoft.FSharp.Vsix/Core.Files.swr
+++ b/setup/Swix/Microsoft.FSharp.Vsix.Core/Files.swr
@@ -1,9 +1,8 @@
use vs
-package name=Microsoft.FSharp.VSIX.$(VSSku)
- version=4.1
+package name=Microsoft.FSharp.VSIX.$(VSSku).Core
+ version=$(FSharpPackageVersion)
vs.package.type=vsix
- vs.package.language=$(LocaleRegion)
vs.package.vsixId=VisualFSharp
vs.payloads
diff --git a/setup/Swix/Microsoft.FSharp.Vsix.Core/Microsoft.FSharp.Vsix.Core.swixproj b/setup/Swix/Microsoft.FSharp.Vsix.Core/Microsoft.FSharp.Vsix.Core.swixproj
new file mode 100644
index 00000000000..5f95bcfcfa6
--- /dev/null
+++ b/setup/Swix/Microsoft.FSharp.Vsix.Core/Microsoft.FSharp.Vsix.Core.swixproj
@@ -0,0 +1,35 @@
+
+
+
+ ..\..\..\src
+ neutral
+ false
+ true
+ Debug
+ $(FSharpSourcesRoot)\..\$(Configuration)
+ $(BinariesFolder)\insertion
+ Microsoft.FSharp.VSIX.$(VSSku).Core
+ $(MSBuildThisFileDirectory)obj
+ manifest
+
+
+
+
+
+ $(PackagePreprocessorDefinitions);BinariesFolder=$(BinariesFolder)
+ $(PackagePreprocessorDefinitions);FSharpPackageVersion=$(FSharpPackageVersion)
+ $(PackagePreprocessorDefinitions);VSSku=$(VSSku)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/setup/Swix/Microsoft.FSharp.Vsix/LangPack.Desktop.Templates.swr b/setup/Swix/Microsoft.FSharp.Vsix.Resources/Desktop.Templates.swr
similarity index 72%
rename from setup/Swix/Microsoft.FSharp.Vsix/LangPack.Desktop.Templates.swr
rename to setup/Swix/Microsoft.FSharp.Vsix.Resources/Desktop.Templates.swr
index a3977cc67f0..f918abc7334 100644
--- a/setup/Swix/Microsoft.FSharp.Vsix/LangPack.Desktop.Templates.swr
+++ b/setup/Swix/Microsoft.FSharp.Vsix.Resources/Desktop.Templates.swr
@@ -1,24 +1,24 @@
use vs
-package name=Microsoft.FSharp.VSIX.$(VSSku)
- version=4.1
- vs.package.language=$(LocaleRegion)
+package name=Microsoft.FSharp.VSIX.$(VSSku).Resources
+ version=$(FSharpPackageVersion)
+ vs.package.language=$(LocaleSpecificCulture)
-folder "InstallDir:Common7\IDE\ProjectTemplates\FSharp\$(LocaleId)\ConsoleProject"
+folder "InstallDir:Common7\IDE\CommonExtensions\Microsoft\FSharp\ProjectTemplates\FSharp\$(LocaleId)\ConsoleProject"
file source="$(BinariesFolder)\net40\bin\ProjectTemplates\ConsoleProject\App.config"
file source="$(BinariesFolder)\net40\bin\localize\$(LocaleCode)\ProjectTemplates\ConsoleProject\AssemblyInfo.fs"
file source="$(BinariesFolder)\net40\bin\ProjectTemplates\ConsoleProject\ConsoleApplication.fsproj"
file source="$(BinariesFolder)\net40\bin\ProjectTemplates\ConsoleProject\ConsoleApplication.vstemplate"
file source="$(BinariesFolder)\net40\bin\localize\$(LocaleCode)\ProjectTemplates\ConsoleProject\Program.fs"
-folder "InstallDir:Common7\IDE\ProjectTemplates\FSharp\$(LocaleId)\LibraryProject"
+folder "InstallDir:Common7\IDE\CommonExtensions\Microsoft\FSharp\ProjectTemplates\FSharp\$(LocaleId)\LibraryProject"
file source="$(BinariesFolder)\net40\bin\localize\$(LocaleCode)\ProjectTemplates\LibraryProject\AssemblyInfo.fs"
file source="$(BinariesFolder)\net40\bin\ProjectTemplates\LibraryProject\Library.fsproj"
file source="$(BinariesFolder)\net40\bin\ProjectTemplates\LibraryProject\Library.vstemplate"
file source="$(BinariesFolder)\net40\bin\ProjectTemplates\LibraryProject\Library1.fs"
file source="$(BinariesFolder)\net40\bin\localize\$(LocaleCode)\ProjectTemplates\LibraryProject\Script.fsx"
-folder "InstallDir:Common7\IDE\ProjectTemplates\FSharp\$(LocaleId)\TutorialProject"
+folder "InstallDir:Common7\IDE\CommonExtensions\Microsoft\FSharp\ProjectTemplates\FSharp\$(LocaleId)\TutorialProject"
file source="$(BinariesFolder)\net40\bin\ProjectTemplates\TutorialProject\Tutorial.fsproj"
file source="$(BinariesFolder)\net40\bin\localize\$(LocaleCode)\ProjectTemplates\TutorialProject\Tutorial.fsx"
file source="$(BinariesFolder)\net40\bin\ProjectTemplates\TutorialProject\Tutorial.vstemplate"
diff --git a/setup/Swix/Microsoft.FSharp.Vsix.Resources/Empty.swr b/setup/Swix/Microsoft.FSharp.Vsix.Resources/Empty.swr
new file mode 100644
index 00000000000..2203e272e19
--- /dev/null
+++ b/setup/Swix/Microsoft.FSharp.Vsix.Resources/Empty.swr
@@ -0,0 +1,5 @@
+use vs
+
+package name=Microsoft.FSharp.VSIX.$(VSSku).Resources
+ version=$(FSharpPackageVersion)
+ vs.package.language=$(LocaleSpecificCulture)
diff --git a/setup/Swix/Microsoft.FSharp.Vsix/LangPack.Files.swr b/setup/Swix/Microsoft.FSharp.Vsix.Resources/Files.swr
similarity index 85%
rename from setup/Swix/Microsoft.FSharp.Vsix/LangPack.Files.swr
rename to setup/Swix/Microsoft.FSharp.Vsix.Resources/Files.swr
index fa907fa0edf..749b461e814 100644
--- a/setup/Swix/Microsoft.FSharp.Vsix/LangPack.Files.swr
+++ b/setup/Swix/Microsoft.FSharp.Vsix.Resources/Files.swr
@@ -1,13 +1,13 @@
use vs
-package name=Microsoft.FSharp.VSIX.$(VSSku)
- version=4.1
- vs.package.language=$(LocaleRegion)
+package name=Microsoft.FSharp.VSIX.$(VSSku).Resources
+ version=$(FSharpPackageVersion)
+ vs.package.language=$(LocaleSpecificCulture)
-folder "InstallDir:Common7\IDE\PublicAssemblies\$(LocaleRegion)"
+folder "InstallDir:Common7\IDE\PublicAssemblies\$(LocaleParentCulture)"
file source="$(BinariesFolder)\net40\bin\localize\$(LocaleCode)\FSharp.Core.resources.dll" vs.file.ngen=yes
-folder "InstallDir:Common7\IDE\CommonExtensions\Microsoft\FSharp\$(LocaleRegion)"
+folder "InstallDir:Common7\IDE\CommonExtensions\Microsoft\FSharp\$(LocaleParentCulture)"
file source="$(BinariesFolder)\net40\bin\localize\$(LocaleCode)\FSharp.Compiler.resources.dll" vs.file.ngen=yes
file source="$(BinariesFolder)\net40\bin\localize\$(LocaleCode)\FSharp.Core.resources.dll" vs.file.ngen=yes
file source="$(BinariesFolder)\net40\bin\localize\$(LocaleCode)\FSharp.LanguageService.Base.resources.dll" vs.file.ngen=yes
diff --git a/setup/Swix/Microsoft.FSharp.Vsix/LangPack.Full.Templates.swr b/setup/Swix/Microsoft.FSharp.Vsix.Resources/Full.Templates.swr
similarity index 78%
rename from setup/Swix/Microsoft.FSharp.Vsix/LangPack.Full.Templates.swr
rename to setup/Swix/Microsoft.FSharp.Vsix.Resources/Full.Templates.swr
index fa876a3fef3..fec68497438 100644
--- a/setup/Swix/Microsoft.FSharp.Vsix/LangPack.Full.Templates.swr
+++ b/setup/Swix/Microsoft.FSharp.Vsix.Resources/Full.Templates.swr
@@ -1,52 +1,52 @@
use vs
-package name=Microsoft.FSharp.VSIX.$(VSSku)
- version=4.1
- vs.package.language=$(LocaleRegion)
+package name=Microsoft.FSharp.VSIX.$(VSSku).Resources
+ version=$(FSharpPackageVersion)
+ vs.package.language=$(LocaleSpecificCulture)
-folder "InstallDir:Common7\IDE\ProjectTemplates\FSharp\$(LocaleId)\ConsoleProject"
+folder "InstallDir:Common7\IDE\CommonExtensions\Microsoft\FSharp\ProjectTemplates\FSharp\$(LocaleId)\ConsoleProject"
file source="$(BinariesFolder)\net40\bin\ProjectTemplates\ConsoleProject\App.config"
file source="$(BinariesFolder)\net40\bin\localize\$(LocaleCode)\ProjectTemplates\ConsoleProject\AssemblyInfo.fs"
file source="$(BinariesFolder)\net40\bin\ProjectTemplates\ConsoleProject\ConsoleApplication.fsproj"
file source="$(BinariesFolder)\net40\bin\ProjectTemplates\ConsoleProject\ConsoleApplication.vstemplate"
file source="$(BinariesFolder)\net40\bin\localize\$(LocaleCode)\ProjectTemplates\ConsoleProject\Program.fs"
-folder "InstallDir:Common7\IDE\ProjectTemplates\FSharp\$(LocaleId)\LibraryProject"
+folder "InstallDir:Common7\IDE\CommonExtensions\Microsoft\FSharp\ProjectTemplates\FSharp\$(LocaleId)\LibraryProject"
file source="$(BinariesFolder)\net40\bin\localize\$(LocaleCode)\ProjectTemplates\LibraryProject\AssemblyInfo.fs"
file source="$(BinariesFolder)\net40\bin\ProjectTemplates\LibraryProject\Library.fsproj"
file source="$(BinariesFolder)\net40\bin\ProjectTemplates\LibraryProject\Library.vstemplate"
file source="$(BinariesFolder)\net40\bin\ProjectTemplates\LibraryProject\Library1.fs"
file source="$(BinariesFolder)\net40\bin\localize\$(LocaleCode)\ProjectTemplates\LibraryProject\Script.fsx"
-folder "InstallDir:Common7\IDE\ProjectTemplates\FSharp\$(LocaleId)\NetCore259Project"
+folder "InstallDir:Common7\IDE\CommonExtensions\Microsoft\FSharp\ProjectTemplates\FSharp\$(LocaleId)\NetCore259Project"
file source="$(BinariesFolder)\net40\bin\localize\$(LocaleCode)\ProjectTemplates\NetCore259Project\AssemblyInfo.fs"
file source="$(BinariesFolder)\net40\bin\ProjectTemplates\NetCore259Project\NETCore259PortableLibrary.vstemplate"
file source="$(BinariesFolder)\net40\bin\ProjectTemplates\NetCore259Project\PortableLibrary.fsproj"
file source="$(BinariesFolder)\net40\bin\ProjectTemplates\NetCore259Project\PortableLibrary1.fs"
file source="$(BinariesFolder)\net40\bin\localize\$(LocaleCode)\ProjectTemplates\NetCore259Project\Script.fsx"
-folder "InstallDir:Common7\IDE\ProjectTemplates\FSharp\$(LocaleId)\NetCore78Project"
+folder "InstallDir:Common7\IDE\CommonExtensions\Microsoft\FSharp\ProjectTemplates\FSharp\$(LocaleId)\NetCore78Project"
file source="$(BinariesFolder)\net40\bin\localize\$(LocaleCode)\ProjectTemplates\NetCore78Project\AssemblyInfo.fs"
file source="$(BinariesFolder)\net40\bin\ProjectTemplates\NetCore78Project\NETCore78PortableLibrary.vstemplate"
file source="$(BinariesFolder)\net40\bin\ProjectTemplates\NetCore78Project\PortableLibrary.fsproj"
file source="$(BinariesFolder)\net40\bin\ProjectTemplates\NetCore78Project\PortableLibrary1.fs"
file source="$(BinariesFolder)\net40\bin\localize\$(LocaleCode)\ProjectTemplates\NetCore78Project\Script.fsx"
-folder "InstallDir:Common7\IDE\ProjectTemplates\FSharp\$(LocaleId)\NetCoreProject"
+folder "InstallDir:Common7\IDE\CommonExtensions\Microsoft\FSharp\ProjectTemplates\FSharp\$(LocaleId)\NetCoreProject"
file source="$(BinariesFolder)\net40\bin\localize\$(LocaleCode)\ProjectTemplates\NetCoreProject\AssemblyInfo.fs"
file source="$(BinariesFolder)\net40\bin\ProjectTemplates\NetCoreProject\NETCore7PortableLibrary.vstemplate"
file source="$(BinariesFolder)\net40\bin\ProjectTemplates\NetCoreProject\PortableLibrary.fsproj"
file source="$(BinariesFolder)\net40\bin\ProjectTemplates\NetCoreProject\PortableLibrary1.fs"
file source="$(BinariesFolder)\net40\bin\localize\$(LocaleCode)\ProjectTemplates\NetCoreProject\Script.fsx"
-folder "InstallDir:Common7\IDE\ProjectTemplates\FSharp\$(LocaleId)\PortableLibraryProject"
+folder "InstallDir:Common7\IDE\CommonExtensions\Microsoft\FSharp\ProjectTemplates\FSharp\$(LocaleId)\PortableLibraryProject"
file source="$(BinariesFolder)\net40\bin\localize\$(LocaleCode)\ProjectTemplates\PortableLibraryProject\AssemblyInfo.fs"
file source="$(BinariesFolder)\net40\bin\ProjectTemplates\PortableLibraryProject\PortableLibrary.fsproj"
file source="$(BinariesFolder)\net40\bin\ProjectTemplates\PortableLibraryProject\PortableLibrary.vstemplate"
file source="$(BinariesFolder)\net40\bin\ProjectTemplates\PortableLibraryProject\PortableLibrary1.fs"
file source="$(BinariesFolder)\net40\bin\localize\$(LocaleCode)\ProjectTemplates\PortableLibraryProject\Script.fsx"
-folder "InstallDir:Common7\IDE\ProjectTemplates\FSharp\$(LocaleId)\TutorialProject"
+folder "InstallDir:Common7\IDE\CommonExtensions\Microsoft\FSharp\ProjectTemplates\FSharp\$(LocaleId)\TutorialProject"
file source="$(BinariesFolder)\net40\bin\ProjectTemplates\TutorialProject\Tutorial.fsproj"
file source="$(BinariesFolder)\net40\bin\localize\$(LocaleCode)\ProjectTemplates\TutorialProject\Tutorial.fsx"
file source="$(BinariesFolder)\net40\bin\ProjectTemplates\TutorialProject\Tutorial.vstemplate"
diff --git a/setup/Swix/Microsoft.FSharp.Vsix/Microsoft.FSharp.Vsix.swixproj b/setup/Swix/Microsoft.FSharp.Vsix.Resources/Microsoft.FSharp.Vsix.Resources.swixproj
similarity index 71%
rename from setup/Swix/Microsoft.FSharp.Vsix/Microsoft.FSharp.Vsix.swixproj
rename to setup/Swix/Microsoft.FSharp.Vsix.Resources/Microsoft.FSharp.Vsix.Resources.swixproj
index 9cc2d0f1199..e2371d1d5d7 100644
--- a/setup/Swix/Microsoft.FSharp.Vsix/Microsoft.FSharp.Vsix.swixproj
+++ b/setup/Swix/Microsoft.FSharp.Vsix.Resources/Microsoft.FSharp.Vsix.Resources.swixproj
@@ -8,36 +8,31 @@
Debug
$(FSharpSourcesRoot)\..\$(Configuration)
$(BinariesFolder)\insertion
- Microsoft.FSharp.VSIX.$(VSSku).$(LocaleCode)
+ Microsoft.FSharp.VSIX.$(VSSku).Resources.$(LocaleCode)
$(MSBuildThisFileDirectory)obj
-
-
-
- manifest
-
-
-
vsix
-
+
$(PackagePreprocessorDefinitions);BinariesFolder=$(BinariesFolder)
+ $(PackagePreprocessorDefinitions);FSharpPackageVersion=$(FSharpPackageVersion)
$(PackagePreprocessorDefinitions);VSSku=$(VSSku)
$(PackagePreprocessorDefinitions);LocaleCode=$(LocaleCode)
$(PackagePreprocessorDefinitions);LocaleId=$(LocaleId)
- $(PackagePreprocessorDefinitions);LocaleRegion=$(LocaleRegion)
+ $(PackagePreprocessorDefinitions);LocaleParentCulture=$(LocaleParentCulture)
+ $(PackagePreprocessorDefinitions);LocaleSpecificCulture=$(LocaleSpecificCulture)
$(PackagePreprocessorDefinitions);IsLangPack=$(IsLangPack)
-
-
-
+
+
+
-
-
+
+
@@ -48,7 +43,8 @@
-
+
+
diff --git a/setup/Swix/Microsoft.FSharp.Vsix/LangPack.Web.Templates.swr b/setup/Swix/Microsoft.FSharp.Vsix.Resources/Web.Templates.swr
similarity index 68%
rename from setup/Swix/Microsoft.FSharp.Vsix/LangPack.Web.Templates.swr
rename to setup/Swix/Microsoft.FSharp.Vsix.Resources/Web.Templates.swr
index e9756006478..8f0cdd660ef 100644
--- a/setup/Swix/Microsoft.FSharp.Vsix/LangPack.Web.Templates.swr
+++ b/setup/Swix/Microsoft.FSharp.Vsix.Resources/Web.Templates.swr
@@ -1,17 +1,17 @@
use vs
-package name=Microsoft.FSharp.VSIX.$(VSSku)
- version=4.1
- vs.package.language=$(LocaleRegion)
+package name=Microsoft.FSharp.VSIX.$(VSSku).Resources
+ version=$(FSharpPackageVersion)
+ vs.package.language=$(LocaleSpecificCulture)
-folder "InstallDir:Common7\IDE\ProjectTemplates\FSharp\$(LocaleId)\LibraryProject"
+folder "InstallDir:Common7\IDE\CommonExtensions\Microsoft\FSharp\ProjectTemplates\FSharp\$(LocaleId)\LibraryProject"
file source="$(BinariesFolder)\net40\bin\localize\$(LocaleCode)\ProjectTemplates\LibraryProject\AssemblyInfo.fs"
file source="$(BinariesFolder)\net40\bin\ProjectTemplates\LibraryProject\Library.fsproj"
file source="$(BinariesFolder)\net40\bin\ProjectTemplates\LibraryProject\Library.vstemplate"
file source="$(BinariesFolder)\net40\bin\ProjectTemplates\LibraryProject\Library1.fs"
file source="$(BinariesFolder)\net40\bin\localize\$(LocaleCode)\ProjectTemplates\LibraryProject\Script.fsx"
-folder "InstallDir:Common7\IDE\ProjectTemplates\FSharp\$(LocaleId)\TutorialProject"
+folder "InstallDir:Common7\IDE\CommonExtensions\Microsoft\FSharp\ProjectTemplates\FSharp\$(LocaleId)\TutorialProject"
file source="$(BinariesFolder)\net40\bin\ProjectTemplates\TutorialProject\Tutorial.fsproj"
file source="$(BinariesFolder)\net40\bin\localize\$(LocaleCode)\ProjectTemplates\TutorialProject\Tutorial.fsx"
file source="$(BinariesFolder)\net40\bin\ProjectTemplates\TutorialProject\Tutorial.vstemplate"
diff --git a/setup/Swix/Microsoft.FSharp.vsmanproj b/setup/Swix/Microsoft.FSharp.vsmanproj
index 736ea5bdb51..25e55147a3a 100644
--- a/setup/Swix/Microsoft.FSharp.vsmanproj
+++ b/setup/Swix/Microsoft.FSharp.vsmanproj
@@ -15,10 +15,19 @@
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/setup/fsharp-setup-build.proj b/setup/fsharp-setup-build.proj
index 87ca1c6d400..85b6ffb1dad 100644
--- a/setup/fsharp-setup-build.proj
+++ b/setup/fsharp-setup-build.proj
@@ -15,36 +15,61 @@
FSharp.Wix.Extensions\FSharp.Wix.Extensions.csproj
-
+
-
+
+
+
+ Swix\Microsoft.FSharp.SDK.Core\Microsoft.FSharp.SDK.Core.swixproj
+
+
+
-
+ AdditionalMetadata="ProjectPath=Swix\Microsoft.FSharp.SDK.Resources\Microsoft.FSharp.SDK.Resources.swixproj">
+
-
+
+
+ Swix\Microsoft.FSharp.Vsix.Core\Microsoft.FSharp.Vsix.Core.swixproj
+ Full
+
+
+
+ Swix\Microsoft.FSharp.Vsix.Core\Microsoft.FSharp.Vsix.Core.swixproj
+ Desktop
+
+
+
+ Swix\Microsoft.FSharp.Vsix.Core\Microsoft.FSharp.Vsix.Core.swixproj
+ Web
+
+
+
+
+
+
-
+ AdditionalMetadata="ProjectPath=Swix\Microsoft.FSharp.Vsix.Resources\Microsoft.FSharp.Vsix.Resources.swixproj;VSSku=Desktop">
+
-
-
+
+
+
+
Swix\Microsoft.FSharp.Dependencies\Microsoft.FSharp.Dependencies.swixproj
- Full
-
+
Swix\Microsoft.FSharp.vsmanproj
@@ -56,19 +81,19 @@
+ Properties="LocaleCode=%(SetupProjects.LocaleCode);LocaleId=%(SetupProjects.LocaleId);LocaleParentCulture=%(SetupProjects.LocaleParentCulture);LocaleSpecificCulture=%(SetupProjects.LocaleSpecificCulture);IsLangPack=%(SetupProjects.IsLangPack);VSSku=%(SetupProjects.VSSku);FSharpPackageVersion=$(FSharpPackageVersion)"/>
+ Properties="LocaleCode=%(SetupProjects.LocaleCode);LocaleId=%(SetupProjects.LocaleId);LocaleParentCulture=%(SetupProjects.LocaleParentCulture);LocaleSpecificCulture=%(SetupProjects.LocaleSpecificCulture);IsLangPack=%(SetupProjects.IsLangPack);VSSku=%(SetupProjects.VSSku);FSharpPackageVersion=$(FSharpPackageVersion)"/>
+ Properties="LocaleCode=%(SetupProjects.LocaleCode);LocaleId=%(SetupProjects.LocaleId);LocaleParentCulture=%(SetupProjects.LocaleParentCulture);LocaleSpecificCulture=%(SetupProjects.LocaleSpecificCulture);IsLangPack=%(SetupProjects.IsLangPack);VSSku=%(SetupProjects.VSSku);FSharpPackageVersion=$(FSharpPackageVersion)"/>
diff --git a/src/absil/illib.fs b/src/absil/illib.fs
index abb1c3090ad..91b44acd2b7 100644
--- a/src/absil/illib.fs
+++ b/src/absil/illib.fs
@@ -780,6 +780,7 @@ module NameMap =
let exists f m = Map.foldBack (fun x y sofar -> sofar || f x y) m false
let ofKeyedList f l = List.foldBack (fun x acc -> Map.add (f x) x acc) l Map.empty
let ofList l : NameMap<'T> = Map.ofList l
+ let ofSeq l : NameMap<'T> = Map.ofSeq l
let ofFlatList (l:FlatList<_>) : NameMap<'T> = FlatList.toMap l
let toList (l: NameMap<'T>) = Map.toList l
let layer (m1 : NameMap<'T>) m2 = Map.foldBack Map.add m1 m2
diff --git a/src/absil/ilwrite.fs b/src/absil/ilwrite.fs
index f2bb3402b36..966de947a05 100644
--- a/src/absil/ilwrite.fs
+++ b/src/absil/ilwrite.fs
@@ -3054,10 +3054,6 @@ let generateIL requiredDataFixups (desiredMetadataVersion,generatePdb, ilg : ILG
//=====================================================================
// TABLES+BLOBS --> PHYSICAL METADATA+BLOBS
//=====================================================================
-type BinaryChunk =
- { size: int32
- addr: int32 }
-
let chunk sz next = ({addr=next; size=sz},next + sz)
let nochunk next = ({addr= 0x0;size= 0x0; } ,next)
@@ -3541,7 +3537,7 @@ let writeDirectory os dict =
let writeBytes (os: BinaryWriter) (chunk:byte[]) = os.Write(chunk,0,chunk.Length)
-let writeBinaryAndReportMappings (outfile, ilg, pdbfile: string option, signer: ILStrongNameSigner option, portablePDB,
+let writeBinaryAndReportMappings (outfile, ilg, pdbfile: string option, signer: ILStrongNameSigner option, portablePDB, embeddedPDB,
fixupOverlappingSequencePoints, emitTailcalls, showTimes, dumpDebugInfo) modul noDebugData =
// Store the public key from the signer into the manifest. This means it will be written
// to the binary and also acts as an indicator to leave space for delay sign
@@ -3590,7 +3586,7 @@ let writeBinaryAndReportMappings (outfile, ilg, pdbfile: string option, signer:
with e ->
failwith ("Could not open file for writing (binary mode): " + outfile)
- let pdbData,debugDirectoryChunk,debugDataChunk,textV2P,mappings =
+ let pdbData,pdbOpt,debugDirectoryChunk,debugDataChunk,debugEmbeddedPdbChunk,textV2P,mappings =
try
let imageBaseReal = modul.ImageBase // FIXED CHOICE
@@ -3683,7 +3679,7 @@ let writeBinaryAndReportMappings (outfile, ilg, pdbfile: string option, signer:
let importLookupTableChunk,next = chunk 0x14 next
let importNameHintTableChunk,next = chunk 0x0e next
let mscoreeStringChunk,next = chunk 0x0c next
-
+
let next = align 0x10 (next + 0x05) - 0x05
let importTableChunk = { addr=importTableChunk.addr; size = next - importTableChunk.addr}
let importTableChunkPadding = importTableChunk.size - (0x28 + 0x14 + 0x0e + 0x0c)
@@ -3691,8 +3687,22 @@ let writeBinaryAndReportMappings (outfile, ilg, pdbfile: string option, signer:
let next = next + 0x03
let entrypointCodeChunk,next = chunk 0x06 next
let globalpointerCodeChunk,next = chunk (if isItanium then 0x8 else 0x0) next
-
- let debugDirectoryChunk,next = chunk (if pdbfile = None then 0x0 else sizeof_IMAGE_DEBUG_DIRECTORY) next
+
+ let pdbOpt =
+ match portablePDB with
+ | true ->
+ let struct (uncompressedLength, contentId, stream) as pdbStream = generatePortablePdb fixupOverlappingSequencePoints showTimes pdbData
+ if embeddedPDB then Some (compressPortablePdbStream uncompressedLength contentId stream)
+ else Some (pdbStream)
+ | _ -> None
+ let debugDirectoryChunk,next =
+ chunk (if pdbfile = None then
+ 0x0
+ else if embeddedPDB && portablePDB then
+ sizeof_IMAGE_DEBUG_DIRECTORY * 2
+ else
+ sizeof_IMAGE_DEBUG_DIRECTORY
+ ) next
// The debug data is given to us by the PDB writer and appears to
// typically be the type of the data plus the PDB file name. We fill
// this in after we've written the binary. We approximate the size according
@@ -3700,11 +3710,19 @@ let writeBinaryAndReportMappings (outfile, ilg, pdbfile: string option, signer:
let debugDataJustInCase = 40
let debugDataChunk,next =
chunk (align 0x4 (match pdbfile with
- | None -> 0x0
+ | None -> 0
| Some f -> (24
+ System.Text.Encoding.Unicode.GetByteCount(f) // See bug 748444
+ debugDataJustInCase))) next
+ let debugEmbeddedPdbChunk,next =
+ let streamLength =
+ match pdbOpt with
+ | Some struct (_,_,stream) -> int(stream.Length)
+ | None -> 0
+ chunk (align 0x4 (match embeddedPDB with
+ | true -> 8 + streamLength
+ | _ -> 0 )) next
let textSectionSize = next - textSectionAddr
let nextPhys = align alignPhys (textSectionPhysLoc + textSectionSize)
@@ -4094,11 +4112,14 @@ let writeBinaryAndReportMappings (outfile, ilg, pdbfile: string option, signer:
if isItanium then
write (Some (textV2P globalpointerCodeChunk.addr)) os " itanium global pointer"
[| 0x0uy; 0x0uy; 0x0uy; 0x0uy; 0x0uy; 0x0uy; 0x0uy; 0x0uy |]
-
+
if pdbfile.IsSome then
- write (Some (textV2P debugDirectoryChunk.addr)) os "debug directory" (Array.create sizeof_IMAGE_DEBUG_DIRECTORY 0x0uy)
+ write (Some (textV2P debugDirectoryChunk.addr)) os "debug directory" (Array.create debugDirectoryChunk.size 0x0uy)
write (Some (textV2P debugDataChunk.addr)) os "debug data" (Array.create debugDataChunk.size 0x0uy)
-
+
+ if embeddedPDB then
+ write (Some (textV2P debugEmbeddedPdbChunk.addr)) os "debug data" (Array.create debugEmbeddedPdbChunk.size 0x0uy)
+
writePadding os "end of .text" (dataSectionPhysLoc - textSectionPhysLoc - textSectionSize)
// DATA SECTION
@@ -4145,7 +4166,7 @@ let writeBinaryAndReportMappings (outfile, ilg, pdbfile: string option, signer:
FileSystemUtilites.setExecutablePermission outfile
with _ ->
()
- pdbData,debugDirectoryChunk,debugDataChunk,textV2P,mappings
+ pdbData,pdbOpt,debugDirectoryChunk,debugDataChunk,debugEmbeddedPdbChunk,textV2P,mappings
// Looks like a finally
with e ->
@@ -4169,14 +4190,17 @@ let writeBinaryAndReportMappings (outfile, ilg, pdbfile: string option, signer:
| Some fpdb ->
try
let idd =
+ match pdbOpt with
+ | Some struct(originalLength, contentId, stream) ->
+ if embeddedPDB then
+ embedPortablePdbInfo originalLength contentId stream showTimes fpdb debugDataChunk debugEmbeddedPdbChunk
+ else
+ writePortablePdbInfo contentId stream showTimes fpdb debugDataChunk
+ | None ->
#if FX_NO_PDB_WRITER
- ignore portablePDB
- writePortablePdbInfo fixupOverlappingSequencePoints showTimes fpdb pdbData
+ Array.empty
#else
- if portablePDB then
- writePortablePdbInfo fixupOverlappingSequencePoints showTimes fpdb pdbData
- else
- writePdbInfo fixupOverlappingSequencePoints showTimes outfile fpdb pdbData
+ writePdbInfo fixupOverlappingSequencePoints showTimes outfile fpdb pdbData debugDataChunk
#endif
reportTime showTimes "Generate PDB Info"
@@ -4186,19 +4210,22 @@ let writeBinaryAndReportMappings (outfile, ilg, pdbfile: string option, signer:
try
// write the IMAGE_DEBUG_DIRECTORY
os2.BaseStream.Seek (int64 (textV2P debugDirectoryChunk.addr), SeekOrigin.Begin) |> ignore
- writeInt32 os2 idd.iddCharacteristics // IMAGE_DEBUG_DIRECTORY.Characteristics
- writeInt32 os2 idd.iddTimestamp
- writeInt32AsUInt16 os2 idd.iddMajorVersion
- writeInt32AsUInt16 os2 idd.iddMinorVersion
- writeInt32 os2 idd.iddType
- writeInt32 os2 idd.iddData.Length // IMAGE_DEBUG_DIRECTORY.SizeOfData
- writeInt32 os2 debugDataChunk.addr // IMAGE_DEBUG_DIRECTORY.AddressOfRawData
- writeInt32 os2 (textV2P debugDataChunk.addr) // IMAGE_DEBUG_DIRECTORY.PointerToRawData
-
- // write the debug raw data as given us by the PDB writer
- os2.BaseStream.Seek (int64 (textV2P debugDataChunk.addr), SeekOrigin.Begin) |> ignore
- if debugDataChunk.size < idd.iddData.Length then failwith "Debug data area is not big enough. Debug info may not be usable"
- writeBytes os2 idd.iddData
+ for i in idd do
+ writeInt32 os2 i.iddCharacteristics // IMAGE_DEBUG_DIRECTORY.Characteristics
+ writeInt32 os2 i.iddTimestamp
+ writeInt32AsUInt16 os2 i.iddMajorVersion
+ writeInt32AsUInt16 os2 i.iddMinorVersion
+ writeInt32 os2 i.iddType
+ writeInt32 os2 i.iddData.Length // IMAGE_DEBUG_DIRECTORY.SizeOfData
+ writeInt32 os2 i.iddChunk.addr // IMAGE_DEBUG_DIRECTORY.AddressOfRawData
+ writeInt32 os2 (textV2P i.iddChunk.addr) // IMAGE_DEBUG_DIRECTORY.PointerToRawData
+
+ // Write the Debug Data
+ for i in idd do
+ // write the debug raw data as given us by the PDB writer
+ os2.BaseStream.Seek (int64 (textV2P i.iddChunk.addr), SeekOrigin.Begin) |> ignore
+ if i.iddChunk.size < i.iddData.Length then failwith "Debug data area is not big enough. Debug info may not be usable"
+ writeBytes os2 i.iddData
os2.Dispose()
with e ->
failwith ("Error while writing debug directory entry: "+e.Message)
@@ -4209,6 +4236,7 @@ let writeBinaryAndReportMappings (outfile, ilg, pdbfile: string option, signer:
end
ignore debugDataChunk
+ ignore debugEmbeddedPdbChunk
reportTime showTimes "Finalize PDB"
/// Sign the binary. No further changes to binary allowed past this point!
@@ -4228,19 +4256,18 @@ let writeBinaryAndReportMappings (outfile, ilg, pdbfile: string option, signer:
//Finished writing and signing the binary and debug info...
mappings
-
type options =
{ ilg: ILGlobals;
pdbfile: string option
portablePDB: bool
+ embeddedPDB: bool
signer: ILStrongNameSigner option
fixupOverlappingSequencePoints: bool
emitTailcalls : bool
showTimes: bool
dumpDebugInfo:bool }
-
let WriteILBinary (outfile, (args: options), modul, noDebugData) =
- ignore (writeBinaryAndReportMappings (outfile, args.ilg, args.pdbfile, args.signer, args.portablePDB,
+ ignore (writeBinaryAndReportMappings (outfile, args.ilg, args.pdbfile, args.signer, args.portablePDB, args.embeddedPDB,
args.fixupOverlappingSequencePoints, args.emitTailcalls, args.showTimes,
args.dumpDebugInfo) modul noDebugData)
diff --git a/src/absil/ilwrite.fsi b/src/absil/ilwrite.fsi
index aab8b46221b..51d1842b208 100644
--- a/src/absil/ilwrite.fsi
+++ b/src/absil/ilwrite.fsi
@@ -19,6 +19,7 @@ type options =
{ ilg: ILGlobals
pdbfile: string option
portablePDB: bool
+ embeddedPDB: bool
signer : ILStrongNameSigner option
fixupOverlappingSequencePoints : bool
emitTailcalls: bool
diff --git a/src/absil/ilwritepdb.fs b/src/absil/ilwritepdb.fs
index ca569235362..e25211b3cce 100644
--- a/src/absil/ilwritepdb.fs
+++ b/src/absil/ilwritepdb.fs
@@ -6,6 +6,7 @@ open System
open System.Collections.Generic
open System.Collections.Immutable
open System.IO
+open System.IO.Compression
open System.Reflection
open System.Reflection.Metadata
open System.Reflection.Metadata.Ecma335
@@ -86,9 +87,9 @@ type PdbData =
Methods: PdbMethodData[]
TableRowCounts: int[] }
-//---------------------------------------------------------------------
-// Portable PDB Writer
-//---------------------------------------------------------------------
+type BinaryChunk =
+ { size: int32
+ addr: int32 }
type idd =
{ iddCharacteristics: int32;
@@ -96,34 +97,60 @@ type idd =
iddMinorVersion: int32; (* actually u16 in IMAGE_DEBUG_DIRECTORY *)
iddType: int32;
iddTimestamp: int32;
- iddData: byte[];}
+ iddData: byte[];
+ iddChunk: BinaryChunk }
-let magicNumber = 0x53445352L
-let pdbGetDebugInfo (mvid:byte[]) (timestamp:int32) (filepath:string) =
- let iddDataBuffer =
+//---------------------------------------------------------------------
+// Portable PDB Writer
+//---------------------------------------------------------------------
+let cvMagicNumber = 0x53445352L
+let pdbGetCvDebugInfo (mvid:byte[]) (timestamp:int32) (filepath:string) (cvChunk:BinaryChunk) =
+ let iddCvBuffer =
+ // Debug directory entry
let path = (System.Text.Encoding.UTF8.GetBytes filepath)
let buffer = Array.zeroCreate (sizeof + mvid.Length + sizeof + path.Length + 1)
-
let struct (offset, size) = struct(0, sizeof) // Magic Number RSDS dword: 0x53445352L
- Buffer.BlockCopy(BitConverter.GetBytes(magicNumber), 0, buffer, offset, size)
-
+ Buffer.BlockCopy(BitConverter.GetBytes(cvMagicNumber), 0, buffer, offset, size)
let struct (offset, size) = struct (offset + size, mvid.Length) // mvid Guid
Buffer.BlockCopy(mvid, 0, buffer, offset, size)
-
let struct (offset, size) = struct (offset + size, sizeof) // # of pdb files generated (1)
Buffer.BlockCopy(BitConverter.GetBytes(1), 0, buffer, offset, size)
-
let struct (offset, size) = struct (offset + size, path.Length) // Path to pdb string
Buffer.BlockCopy(path, 0, buffer, offset, size)
-
buffer
-
- { iddCharacteristics = 0x0; // Reserved
- iddMajorVersion = 0x0; // VersionMajor should be 0
- iddMinorVersion = 0x0; // VersionMinor should be 0
- iddType = 0x2; // IMAGE_DEBUG_TYPE_CODEVIEW
+ { iddCharacteristics = 0; // Reserved
+ iddMajorVersion = 0; // VersionMajor should be 0
+ iddMinorVersion = 0; // VersionMinor should be 0
+ iddType = 2; // IMAGE_DEBUG_TYPE_CODEVIEW
iddTimestamp = timestamp;
- iddData = iddDataBuffer } // Path name to the pdb file when built
+ iddData = iddCvBuffer; // Path name to the pdb file when built
+ iddChunk = cvChunk;
+ }
+
+let pdbMagicNumber= 0x4244504dL
+let pdbGetPdbDebugInfo (embeddedPDBChunk:BinaryChunk) (uncompressedLength:int64) (stream:MemoryStream) =
+ let iddPdbBuffer =
+ let buffer = Array.zeroCreate (sizeof + sizeof + int(stream.Length))
+ let struct (offset, size) = struct(0, sizeof) // Magic Number dword: 0x4244504dL
+ Buffer.BlockCopy(BitConverter.GetBytes(pdbMagicNumber), 0, buffer, offset, size)
+ let struct (offset, size) = struct(offset + size, sizeof) // Uncompressed size
+ Buffer.BlockCopy(BitConverter.GetBytes((int uncompressedLength)), 0, buffer, offset, size)
+ let struct (offset, size) = struct(offset + size, int(stream.Length)) // Uncompressed size
+ Buffer.BlockCopy(stream.ToArray(), 0, buffer, offset, size)
+ buffer
+ { iddCharacteristics = 0; // Reserved
+ iddMajorVersion = 0; // VersionMajor should be 0
+ iddMinorVersion = 0x0100; // VersionMinor should be 0x0100
+ iddType = 17; // IMAGE_DEBUG_TYPE_EMBEDDEDPDB
+ iddTimestamp = 0;
+ iddData = iddPdbBuffer; // Path name to the pdb file when built
+ iddChunk = embeddedPDBChunk;
+ }
+
+let pdbGetDebugInfo (mvid:byte[]) (timestamp:int32) (filepath:string) (cvChunk:BinaryChunk) (embeddedPDBChunk:BinaryChunk option) (uncompressedLength:int64) (stream:MemoryStream option)=
+ match stream, embeddedPDBChunk with
+ | None, _ | _, None -> [| pdbGetCvDebugInfo mvid timestamp filepath cvChunk |]
+ | Some s, Some chunk -> [| pdbGetCvDebugInfo mvid timestamp filepath cvChunk; pdbGetPdbDebugInfo chunk uncompressedLength s; |]
// Document checksum algorithms
let guidSourceHashMD5 = System.Guid(0x406ea660u, 0x64cfus, 0x4c82us, 0xb6uy, 0xf0uy, 0x42uy, 0xd4uy, 0x81uy, 0x72uy, 0xa7uy, 0x99uy) //406ea660-64cf-4c82-b6f0-42d48172a799
@@ -200,10 +227,7 @@ let fixupOverlappingSequencePoints fixupSPs showTimes methods =
Array.sortInPlaceBy fst allSps
spCounts, allSps
-let writePortablePdbInfo (fixupSPs:bool) showTimes fpdb (info:PdbData) =
-
- try FileSystem.FileDelete fpdb with _ -> ()
-
+let generatePortablePdb fixupSPs showTimes (info:PdbData) =
sortMethods showTimes info
let _spCounts, _allSps = fixupOverlappingSequencePoints fixupSPs showTimes info.Methods
let externalRowCounts = getRowCounts info.TableRowCounts
@@ -336,18 +360,18 @@ let writePortablePdbInfo (fixupSPs:bool) showTimes fpdb (info:PdbData) =
let rec writePdbScope scope =
if scope.Children.Length = 0 then
metadata.AddLocalScope(MetadataTokens.MethodDefinitionHandle(minfo.MethToken),
- Unchecked.defaultof,
- nextHandle lastLocalVariableHandle,
- Unchecked.defaultof,
- 0,
- scope.EndOffset - scope.StartOffset) |>ignore
+ Unchecked.defaultof,
+ nextHandle lastLocalVariableHandle,
+ Unchecked.defaultof,
+ 0,
+ scope.EndOffset - scope.StartOffset) |>ignore
else
metadata.AddLocalScope(MetadataTokens.MethodDefinitionHandle(minfo.MethToken),
- Unchecked.defaultof,
- nextHandle lastLocalVariableHandle,
- Unchecked.defaultof,
- scope.StartOffset,
- scope.EndOffset - scope.StartOffset) |>ignore
+ Unchecked.defaultof,
+ nextHandle lastLocalVariableHandle,
+ Unchecked.defaultof,
+ scope.StartOffset,
+ scope.EndOffset - scope.StartOffset) |>ignore
for localVariable in scope.Locals do
lastLocalVariableHandle <- metadata.AddLocalVariable(LocalVariableAttributes.None, localVariable.Index, metadata.GetOrAddString(localVariable.Name))
@@ -365,12 +389,28 @@ let writePortablePdbInfo (fixupSPs:bool) showTimes fpdb (info:PdbData) =
let serializer = PortablePdbBuilder(metadata, externalRowCounts, entryPoint, null)
let blobBuilder = new BlobBuilder()
let contentId= serializer.Serialize(blobBuilder)
-
- reportTime showTimes "PDB: Created"
- use portablePdbStream = new FileStream(fpdb, FileMode.Create, FileAccess.ReadWrite)
+ let portablePdbStream = new MemoryStream()
blobBuilder.WriteContentTo(portablePdbStream)
+ reportTime showTimes "PDB: Created"
+ struct (portablePdbStream.Length, contentId, portablePdbStream)
+
+let compressPortablePdbStream (uncompressedLength:int64) (contentId:BlobContentId) (stream:MemoryStream) =
+ let compressedStream = new MemoryStream()
+ use compressionStream = new DeflateStream(compressedStream, CompressionMode.Compress,true)
+ stream.WriteTo(compressionStream)
+ struct (uncompressedLength, contentId, compressedStream)
+
+let writePortablePdbInfo (contentId:BlobContentId) (stream:MemoryStream) showTimes fpdb cvChunk =
+ try FileSystem.FileDelete fpdb with _ -> ()
+ use pdbFile = new FileStream(fpdb, FileMode.Create, FileAccess.ReadWrite)
+ stream.WriteTo(pdbFile)
reportTime showTimes "PDB: Closed"
- pdbGetDebugInfo (contentId.Guid.ToByteArray()) (int32(contentId.Stamp)) fpdb
+ pdbGetDebugInfo (contentId.Guid.ToByteArray()) (int32 (contentId.Stamp)) fpdb cvChunk None 0L None
+
+let embedPortablePdbInfo (uncompressedLength:int64) (contentId:BlobContentId) (stream:MemoryStream) showTimes fpdb cvChunk pdbChunk =
+ reportTime showTimes "PDB: Closed"
+ let fn = Path.GetFileName(fpdb)
+ pdbGetDebugInfo (contentId.Guid.ToByteArray()) (int32 (contentId.Stamp)) fn cvChunk (Some pdbChunk) uncompressedLength (Some stream)
#if FX_NO_PDB_WRITER
#else
@@ -378,7 +418,7 @@ let writePortablePdbInfo (fixupSPs:bool) showTimes fpdb (info:PdbData) =
// PDB Writer. The function [WritePdbInfo] abstracts the
// imperative calls to the Symbol Writer API.
//---------------------------------------------------------------------
-let writePdbInfo fixupOverlappingSequencePoints showTimes f fpdb info =
+let writePdbInfo fixupOverlappingSequencePoints showTimes f fpdb info cvChunk =
try FileSystem.FileDelete fpdb with _ -> ()
@@ -453,7 +493,7 @@ let writePdbInfo fixupOverlappingSequencePoints showTimes f fpdb info =
match Map.tryFind k res with
| Some xsR -> xsR := sp :: !xsR; res
| None -> Map.add k (ref [sp]) res
-
+
let res = Array.fold add res sps
let res = Map.toList res // ordering may not be stable
List.map (fun (_,x) -> Array.ofList !x) res
@@ -462,22 +502,27 @@ let writePdbInfo fixupOverlappingSequencePoints showTimes f fpdb info =
if spset.Length > 0 then
Array.sortInPlaceWith SequencePoint.orderByOffset spset
let sps =
- spset |> Array.map (fun sp ->
- // Ildiag.dprintf "token 0x%08lx has an sp at offset 0x%08x\n" minfo.MethToken sp.Offset
- (sp.Offset, sp.Line, sp.Column,sp.EndLine, sp.EndColumn))
- // Use of alloca in implementation of pdbDefineSequencePoints can give stack overflow here
+ spset |> Array.map (fun sp ->
+ // Ildiag.dprintf "token 0x%08lx has an sp at offset 0x%08x\n" minfo.MethToken sp.Offset
+ (sp.Offset, sp.Line, sp.Column,sp.EndLine, sp.EndColumn))
+ // Use of alloca in implementation of pdbDefineSequencePoints can give stack overflow here
if sps.Length < 5000 then
- pdbDefineSequencePoints !pdbw (getDocument spset.[0].Document) sps)
+ pdbDefineSequencePoints !pdbw (getDocument spset.[0].Document) sps)
// Write the scopes
- let rec writePdbScope top sco =
- if top || sco.Locals.Length <> 0 || sco.Children.Length <> 0 then
- pdbOpenScope !pdbw sco.StartOffset
+ let rec writePdbScope parent sco =
+ if parent = None || sco.Locals.Length <> 0 || sco.Children.Length <> 0 then
+ // Only nest scopes if the child scope is a different size from
+ let nested =
+ match parent with
+ | Some p -> sco.StartOffset <> p.StartOffset || sco.EndOffset <> p.EndOffset
+ | None -> true
+ if nested then pdbOpenScope !pdbw sco.StartOffset
sco.Locals |> Array.iter (fun v -> pdbDefineLocalVariable !pdbw v.Name v.Signature v.Index)
- sco.Children |> Array.iter (writePdbScope false)
- pdbCloseScope !pdbw sco.EndOffset
- writePdbScope true minfo.RootScope
+ sco.Children |> Array.iter (writePdbScope (if nested then Some sco else parent))
+ if nested then pdbCloseScope !pdbw sco.EndOffset
+ writePdbScope None minfo.RootScope
pdbCloseMethod !pdbw
end)
reportTime showTimes "PDB: Wrote methods"
@@ -487,12 +532,13 @@ let writePdbInfo fixupOverlappingSequencePoints showTimes f fpdb info =
pdbClose !pdbw f fpdb;
reportTime showTimes "PDB: Closed"
- { iddCharacteristics = res.iddCharacteristics;
- iddMajorVersion = res.iddMajorVersion;
- iddMinorVersion = res.iddMinorVersion;
- iddType = res.iddType;
- iddTimestamp = info.Timestamp;
- iddData = res.iddData}
+ [| { iddCharacteristics = res.iddCharacteristics;
+ iddMajorVersion = res.iddMajorVersion;
+ iddMinorVersion = res.iddMinorVersion;
+ iddType = res.iddType;
+ iddTimestamp = info.Timestamp;
+ iddData = res.iddData
+ iddChunk = cvChunk } |]
#endif
#if ENABLE_MONO_SUPPORT
diff --git a/src/absil/ilwritepdb.fsi b/src/absil/ilwritepdb.fsi
index de03c2bbf37..1baf1d4b98c 100644
--- a/src/absil/ilwritepdb.fsi
+++ b/src/absil/ilwritepdb.fsi
@@ -7,6 +7,8 @@ open Microsoft.FSharp.Compiler.AbstractIL.IL
open Microsoft.FSharp.Compiler.ErrorLogger
open Microsoft.FSharp.Compiler.Range
open System.Collections.Generic
+open System.IO
+open System.Reflection.Metadata
type PdbDocumentData = ILSourceDocument
@@ -67,16 +69,24 @@ val logDebugInfo : string -> PdbData -> unit
val writeMdbInfo<'a> : string -> string -> PdbData -> 'a
#endif
+type BinaryChunk =
+ { size: int32
+ addr: int32 }
+
type idd =
{ iddCharacteristics: int32;
iddMajorVersion: int32; (* actually u16 in IMAGE_DEBUG_DIRECTORY *)
iddMinorVersion: int32; (* actually u16 in IMAGE_DEBUG_DIRECTORY *)
iddType: int32;
iddTimestamp: int32;
- iddData: byte[]; }
+ iddData: byte[];
+ iddChunk: BinaryChunk }
-val writePortablePdbInfo : fixupOverlappingSequencePoints:bool -> showTimes:bool -> fpdb:string -> info:PdbData -> idd
+val generatePortablePdb : fixupSPs:bool -> showTimes:bool -> info:PdbData -> struct (int64 * BlobContentId * MemoryStream)
+val compressPortablePdbStream : uncompressedLength:int64 -> contentId:BlobContentId -> stream:MemoryStream -> struct (int64 * BlobContentId * MemoryStream)
+val embedPortablePdbInfo : uncompressedLength:int64 -> contentId:BlobContentId -> stream:MemoryStream -> showTimes:bool -> fpdb:string -> cvChunk:BinaryChunk -> pdbChunk:BinaryChunk -> idd[]
+val writePortablePdbInfo : contentId:BlobContentId -> stream:MemoryStream -> showTimes:bool -> fpdb:string -> cvChunk:BinaryChunk -> idd[]
#if !FX_NO_PDB_WRITER
-val writePdbInfo : fixupOverlappingSequencePoints:bool -> showTimes:bool -> f:string -> fpdb:string -> info:PdbData -> idd
+val writePdbInfo : fixupOverlappingSequencePoints:bool -> showTimes:bool -> f:string -> fpdb:string -> info:PdbData -> cvChunk:BinaryChunk -> idd[]
#endif
diff --git a/src/fsharp/CompileOps.fs b/src/fsharp/CompileOps.fs
index 879ccf0f2c4..7ada6090e9e 100644
--- a/src/fsharp/CompileOps.fs
+++ b/src/fsharp/CompileOps.fs
@@ -2072,6 +2072,7 @@ type TcConfigBuilder =
mutable useSignatureDataFile : bool
mutable jitTracking : bool
mutable portablePDB : bool
+ mutable embeddedPDB : bool
mutable ignoreSymbolStoreSequencePoints : bool
mutable internConstantStrings : bool
mutable extraOptimizationIterations : int
@@ -2241,6 +2242,7 @@ type TcConfigBuilder =
useSignatureDataFile = false
jitTracking = true
portablePDB = true
+ embeddedPDB = true
ignoreSymbolStoreSequencePoints = false
internConstantStrings = true
extraOptimizationIterations = 0
@@ -2729,6 +2731,7 @@ type TcConfig private (data : TcConfigBuilder,validate:bool) =
member x.useSignatureDataFile = data.useSignatureDataFile
member x.jitTracking = data.jitTracking
member x.portablePDB = data.portablePDB
+ member x.embeddedPDB = data.embeddedPDB
member x.ignoreSymbolStoreSequencePoints = data.ignoreSymbolStoreSequencePoints
member x.internConstantStrings = data.internConstantStrings
member x.extraOptimizationIterations = data.extraOptimizationIterations
diff --git a/src/fsharp/CompileOps.fsi b/src/fsharp/CompileOps.fsi
index 1d00cd89d98..34a4f8bf763 100755
--- a/src/fsharp/CompileOps.fsi
+++ b/src/fsharp/CompileOps.fsi
@@ -306,6 +306,7 @@ type TcConfigBuilder =
mutable useSignatureDataFile : bool
mutable jitTracking : bool
mutable portablePDB : bool
+ mutable embeddedPDB : bool
mutable ignoreSymbolStoreSequencePoints : bool
mutable internConstantStrings : bool
mutable extraOptimizationIterations : int
@@ -459,6 +460,7 @@ type TcConfig =
member useSignatureDataFile : bool
member jitTracking : bool
member portablePDB : bool
+ member embeddedPDB : bool
member ignoreSymbolStoreSequencePoints : bool
member internConstantStrings : bool
member extraOptimizationIterations : int
diff --git a/src/fsharp/CompileOptions.fs b/src/fsharp/CompileOptions.fs
index c1867acbb52..ccf2c6e96e6 100644
--- a/src/fsharp/CompileOptions.fs
+++ b/src/fsharp/CompileOptions.fs
@@ -119,7 +119,7 @@ let PrintCompilerOption (CompilerOption(_s,_tag,_spec,_,help) as compilerOption)
// single space - space.
// description - words upto but excluding the final character of the line.
assert(flagWidth = 30)
- printf "%-30s" (compilerOptionUsage compilerOption)
+ printf "%-40s" (compilerOptionUsage compilerOption)
let printWord column (word:string) =
// Have printed upto column.
// Now print the next word including any preceeding whitespace.
@@ -127,7 +127,7 @@ let PrintCompilerOption (CompilerOption(_s,_tag,_spec,_,help) as compilerOption)
if column + 1 (*space*) + word.Length >= lineWidth then // NOTE: "equality" ensures final character of the line is never printed
printfn "" (* newline *)
assert(flagWidth = 30)
- printf "%-30s %s" ""(*<--flags*) word
+ printf "%-40s %s" ""(*<--flags*) word
flagWidth + 1 + word.Length
else
printf " %s" word
@@ -474,11 +474,12 @@ let SetDebugSwitch (tcConfigB : TcConfigBuilder) (dtype : string option) (s : Op
match dtype with
| Some(s) ->
match s with
- | "portable" -> tcConfigB.portablePDB <- true ; tcConfigB.jitTracking <- true
- | "pdbonly" -> tcConfigB.portablePDB <- false; tcConfigB.jitTracking <- false
- | "full" -> tcConfigB.portablePDB <- false; tcConfigB.jitTracking <- true
+ | "portable" -> tcConfigB.portablePDB <- true ; tcConfigB.embeddedPDB <- false; tcConfigB.jitTracking <- true
+ | "pdbonly" -> tcConfigB.portablePDB <- false; tcConfigB.embeddedPDB <- false; tcConfigB.jitTracking <- false
+ | "embedded" -> tcConfigB.portablePDB <- true; tcConfigB.embeddedPDB <- true; tcConfigB.jitTracking <- true
+ | "full" -> tcConfigB.portablePDB <- false; tcConfigB.embeddedPDB <- false; tcConfigB.jitTracking <- true
| _ -> error(Error(FSComp.SR.optsUnrecognizedDebugType(s), rangeCmdArgs))
- | None -> tcConfigB.portablePDB <- false; tcConfigB.jitTracking <- s = OptionSwitch.On;
+ | None -> tcConfigB.portablePDB <- false; tcConfigB.embeddedPDB <- false; tcConfigB.jitTracking <- s = OptionSwitch.On;
tcConfigB.debuginfo <- s = OptionSwitch.On
let setOutFileName tcConfigB s =
@@ -499,7 +500,7 @@ let tagFileList = ""
let tagDirList = ""
let tagPathList = ""
let tagResInfo = ""
-let tagFullPDBOnlyPortable = "{full|pdbonly|portable}"
+let tagFullPDBOnlyPortable = "{full|pdbonly|portable|embedded}"
let tagWarnList = ""
let tagSymbolList = ""
let tagAddress = ""
@@ -522,6 +523,7 @@ let PrintOptionInfo (tcConfigB:TcConfigBuilder) =
printfn " doFinalSimplify. . . . : %+A" tcConfigB.doFinalSimplify
printfn " jitTracking . . . . . : %+A" tcConfigB.jitTracking
printfn " portablePDB. . . . . . : %+A" tcConfigB.portablePDB
+ printfn " embeddedPDB. . . . . . : %+A" tcConfigB.embeddedPDB
printfn " debuginfo . . . . . . : %+A" tcConfigB.debuginfo
printfn " resolutionEnvironment : %+A" tcConfigB.resolutionEnvironment
printfn " product . . . . . . . : %+A" tcConfigB.productNameForBannerText
diff --git a/src/fsharp/FSComp.txt b/src/fsharp/FSComp.txt
index cefdff8663e..8f14f835865 100644
--- a/src/fsharp/FSComp.txt
+++ b/src/fsharp/FSComp.txt
@@ -839,7 +839,7 @@ optsNowin32manifest,"Do not include the default Win32 manifest"
optsResource,"Embed the specified managed resource"
optsLinkresource,"Link the specified resource to this assembly where the resinfo format is [,[,public|private]]"
optsDebugPM,"Emit debug information (Short form: -g)"
-optsDebug,"Specify debugging type: full, portable, pdbonly. ('%s' is the default if no debuggging type specified and enables attaching a debugger to a running program. 'portable' is a cross-platform format)."
+optsDebug,"Specify debugging type: full, portable, embedded, pdbonly. ('%s' is the default if no debuggging type specified and enables attaching a debugger to a running program, 'portable' is a cross-platform format, 'embedded' is a cross-platform format embedded into the output file)."
optsOptimize,"Enable optimizations (Short form: -O)"
optsTailcalls,"Enable or disable tailcalls"
optsCrossoptimize,"Enable or disable cross-module optimizations"
diff --git a/src/fsharp/FSharp.Build/Fsc.fs b/src/fsharp/FSharp.Build/Fsc.fs
index 9b42f425cf1..583fa2bf62f 100644
--- a/src/fsharp/FSharp.Build/Fsc.fs
+++ b/src/fsharp/FSharp.Build/Fsc.fs
@@ -180,6 +180,7 @@ type [ null
| "PORTABLE" -> "portable"
| "PDBONLY" -> "pdbonly"
+ | "EMBEDDED" -> "embedded"
| "FULL" -> "full"
| _ -> null)
// NoFramework
diff --git a/src/fsharp/FSharp.Compiler/FSharp.Compiler.fsproj b/src/fsharp/FSharp.Compiler/FSharp.Compiler.fsproj
index 24d87a98c01..da37aa76f7d 100644
--- a/src/fsharp/FSharp.Compiler/FSharp.Compiler.fsproj
+++ b/src/fsharp/FSharp.Compiler/FSharp.Compiler.fsproj
@@ -528,7 +528,7 @@
..\..\..\packages\Microsoft.DiaSymReader.1.0.8\lib\portable-net45+win8\Microsoft.DiaSymReader.dll
..\..\..\packages\System.Reflection.Metadata.1.4.1-beta-24227-04\lib\portable-net45+win8\System.Reflection.Metadata.dll
..\..\..\packages\System.Collections.Immutable.1.2.0\lib\portable-net45+win8+wp8+wpa81\System.Collections.Immutable.dll
- ..\..\..\packages\System.ValueTuple.4.0.0-rc3-24212-01\lib\netstandard1.1\System.ValueTuple.dllfalse
+ ..\..\..\packages\System.ValueTuple.4.0.0-rc3-24212-01\lib\netstandard1.1\System.ValueTuple.dlltrue
diff --git a/src/fsharp/FSharp.Core.Unittests/FSharp.Core/Microsoft.FSharp.Collections/ArrayModule.fs b/src/fsharp/FSharp.Core.Unittests/FSharp.Core/Microsoft.FSharp.Collections/ArrayModule.fs
index a91b2736c8a..475f91345f9 100644
--- a/src/fsharp/FSharp.Core.Unittests/FSharp.Core/Microsoft.FSharp.Collections/ArrayModule.fs
+++ b/src/fsharp/FSharp.Core.Unittests/FSharp.Core/Microsoft.FSharp.Collections/ArrayModule.fs
@@ -21,13 +21,6 @@ Make sure each method works on:
[]
type ArrayModule() =
- let rec IsNaN (x : obj) =
- match x with
- | :? float as x -> Double.IsNaN(x)
- | :? float32 as x -> Single.IsNaN(x)
- | :? decimal as x -> Decimal.ToDouble(x) |> box |> IsNaN
- | _ -> failwith "Invalid input. Please provide a numeric type which could possibly be NaN"
-
[]
member this.Empty() =
let emptyArray = Array.empty
@@ -400,7 +393,7 @@ type ArrayModule() =
if intChoosed.[1] <> 10 then Assert.Fail()
// string array
- let stringSrc: string [] = "Lists are a commonly used data structure. They are not mutable, i.e., you can't delete an element of a list – instead you create a new list with the element deleted. List values often share storage under the hood, i.e., a list value only allocate more memory when you actually execute construction operations.".Split([|' '|], System.StringSplitOptions.RemoveEmptyEntries)
+ let stringSrc: string [] = "Lists are a commonly used data structure. They are not mutable, i.e., you can't delete an element of a list – instead you create a new list with the element deleted. List values often share storage under the hood, i.e., a list value only allocate more memory when you actually execute construction operations.".Split([|' '|], System.StringSplitOptions.RemoveEmptyEntries)
let funcString x = match x with
| "list"-> Some x
| "List" -> Some x
diff --git a/src/fsharp/FSharp.Core/local.fs b/src/fsharp/FSharp.Core/local.fs
index 6232d9ec3d4..7df2e049e8f 100644
--- a/src/fsharp/FSharp.Core/local.fs
+++ b/src/fsharp/FSharp.Core/local.fs
@@ -148,10 +148,12 @@ module internal List =
let mutable ie = dict.GetEnumerator()
if not (ie.MoveNext()) then []
else
- let res = freshConsNoTail (keyf ie.Current.Key, ie.Current.Value)
+ let current = ie.Current
+ let res = freshConsNoTail (keyf current.Key, current.Value)
let mutable cons = res
while ie.MoveNext() do
- let cons2 = freshConsNoTail (keyf ie.Current.Key, ie.Current.Value)
+ let current = ie.Current
+ let cons2 = freshConsNoTail (keyf current.Key, current.Value)
setFreshConsTail cons cons2
cons <- cons2
setFreshConsTail cons []
diff --git a/src/fsharp/FSharp.Core/map.fs b/src/fsharp/FSharp.Core/map.fs
index 9d16a1d5151..0d5e015b3d3 100644
--- a/src/fsharp/FSharp.Core/map.fs
+++ b/src/fsharp/FSharp.Core/map.fs
@@ -576,7 +576,7 @@ namespace Microsoft.FSharp.Collections
let rec loop () =
let m1 = e1.MoveNext()
let m2 = e2.MoveNext()
- (m1 = m2) && (not m1 || ((e1.Current.Key = e2.Current.Key) && (Unchecked.equals e1.Current.Value e2.Current.Value) && loop()))
+ (m1 = m2) && (not m1 || let e1c, e2c = e1.Current, e2.Current in ((e1c.Key = e2c.Key) && (Unchecked.equals e1c.Value e2c.Value) && loop()))
loop()
| _ -> false
diff --git a/src/fsharp/FSharp.Core/prim-types.fs b/src/fsharp/FSharp.Core/prim-types.fs
index a3b0f055e1d..5d1010cf4a4 100644
--- a/src/fsharp/FSharp.Core/prim-types.fs
+++ b/src/fsharp/FSharp.Core/prim-types.fs
@@ -5324,12 +5324,13 @@ namespace Microsoft.FSharp.Core
// is undefined prior to the first call of MoveNext and post called to MoveNext
// that return false (see https://msdn.microsoft.com/en-us/library/58e146b7%28v=vs.110%29.aspx)
// so we should be able to just return value here, which would be faster
- if !value < n then
+ let derefValue = !value
+ if derefValue < n then
notStarted ()
- elif !value > m then
+ elif derefValue > m then
alreadyFinished ()
else
- !value
+ derefValue
{ new IEnumerator<'T> with
member __.Dispose () = ()
@@ -5339,11 +5340,12 @@ namespace Microsoft.FSharp.Core
member __.Current = box (current ())
member __.Reset () = value := n - LanguagePrimitives.GenericOne
member __.MoveNext () =
- if !value < m then
- value := !value + LanguagePrimitives.GenericOne
+ let derefValue = !value
+ if derefValue < m then
+ value := derefValue + LanguagePrimitives.GenericOne
true
- elif !value = m then
- value := m + LanguagePrimitives.GenericOne
+ elif derefValue = m then
+ value := derefValue + LanguagePrimitives.GenericOne
false
else false }
diff --git a/src/fsharp/FSharp.Core/printf.fs b/src/fsharp/FSharp.Core/printf.fs
index 26c9647b86e..c4d6f510e48 100644
--- a/src/fsharp/FSharp.Core/printf.fs
+++ b/src/fsharp/FSharp.Core/printf.fs
@@ -1094,7 +1094,7 @@ module internal PrintfImpl =
mi.Invoke(null, args)
let buildPlainFinal(args : obj[], argTypes : Type[]) =
- let mi = typeof>.GetMethod("Final" + (argTypes.Length.ToString()), NonPublicStatics)
+ let mi = typeof>.GetMethod("Final" + (let x = argTypes.Length in x.ToString()), NonPublicStatics)
#if DEBUG
verifyMethodInfoWasTaken mi
#else
@@ -1103,7 +1103,7 @@ module internal PrintfImpl =
mi.Invoke(null, args)
let buildPlainChained(args : obj[], argTypes : Type[]) =
- let mi = typeof>.GetMethod("Chained" + ((argTypes.Length - 1).ToString()), NonPublicStatics)
+ let mi = typeof>.GetMethod("Chained" + (let x = (argTypes.Length - 1) in x.ToString()), NonPublicStatics)
#if DEBUG
verifyMethodInfoWasTaken mi
#else
diff --git a/src/fsharp/FSharp.Core/reflect.fs b/src/fsharp/FSharp.Core/reflect.fs
index 379e0bc79e5..9eee255d042 100644
--- a/src/fsharp/FSharp.Core/reflect.fs
+++ b/src/fsharp/FSharp.Core/reflect.fs
@@ -128,9 +128,9 @@ module internal Impl =
let args = a.ConstructorArguments
let flags =
match args.Count with
- | 1 -> ((args.[0].Value :?> SourceConstructFlags), 0, 0)
- | 2 -> ((args.[0].Value :?> SourceConstructFlags), (args.[1].Value :?> int), 0)
- | 3 -> ((args.[0].Value :?> SourceConstructFlags), (args.[1].Value :?> int), (args.[2].Value :?> int))
+ | 1 -> ((let x = args.[0] in x.Value :?> SourceConstructFlags), 0, 0)
+ | 2 -> ((let x = args.[0] in x.Value :?> SourceConstructFlags), (let x = args.[1] in x.Value :?> int), 0)
+ | 3 -> ((let x = args.[0] in x.Value :?> SourceConstructFlags), (let x = args.[1] in x.Value :?> int), (let x = args.[2] in x.Value :?> int))
| _ -> (enum 0, 0, 0)
res <- Some flags
res
diff --git a/src/fsharp/FlatList.fs b/src/fsharp/FlatList.fs
index ba9c8af6ab6..66e0f056b7c 100644
--- a/src/fsharp/FlatList.fs
+++ b/src/fsharp/FlatList.fs
@@ -198,38 +198,38 @@ type internal FlatList<'T> ='T list
[]
module internal FlatList =
let empty<'T> : 'T list = []
- let collect (f: 'T -> FlatList<'T>) (x:FlatList<_>) = List.collect f x
- let exists f (x:FlatList<_>) = List.exists f x
- let filter f (x:FlatList<_>) = List.filter f x
- let fold f acc (x:FlatList<_>) = List.fold f acc x
- let fold2 f acc (x:FlatList<_>) (y:FlatList<_>) = List.fold2 f acc x y
- let foldBack f (x:FlatList<_>) acc = List.foldBack f x acc
- let foldBack2 f (x:FlatList<_>) (y:FlatList<_>) acc = List.foldBack2 f x y acc
- let map2 f (x:FlatList<_>) (y:FlatList<_>) = List.map2 f x y
- let forall f (x:FlatList<_>) = List.forall f x
- let forall2 f (x1:FlatList<_>) (x2:FlatList<_>) = List.forall2 f x1 x2
- let iter2 f (x1:FlatList<_>) (x2:FlatList<_>) = List.iter2 f x1 x2
- let partition f (x:FlatList<_>) = List.partition f x
- let (* inline *) sum (x:FlatList) = List.sum x
- let (* inline *) sumBy (f: 'T -> int) (x:FlatList<'T>) = List.sumBy f x
- let unzip (x:FlatList<_>) = List.unzip x
- let physicalEquality (x:FlatList<_>) (y:FlatList<_>) = (LanguagePrimitives.PhysicalEquality x y)
- let tryFind f (x:FlatList<_>) = List.tryFind f x
- let concat (x:FlatList<_>) = List.concat x
- let isEmpty (x:FlatList<_>) = List.isEmpty x
- let one(x) = [x]
- let toMap (x:FlatList<_>) = Map.ofList x
- let length (x:FlatList<_>) = List.length x
- let map f (x:FlatList<_>) = List.map f x
- let mapi f (x:FlatList<_>) = List.mapi f x
- let iter f (x:FlatList<_>) = List.iter f x
- let iteri f (x:FlatList<_>) = List.iteri f x
- let toList (x:FlatList<_>) = x
- let ofSeq (x:seq<_>) = List.ofSeq x
- let append(l1 : FlatList<'T>) (l2 : FlatList<'T>) = List.append l1 l2
- let ofList(l) = l
- let init n f = List.init n f
- let zip (x:FlatList<_>) (y:FlatList<_>) = List.zip x y
+ let inline collect (f: 'T -> FlatList<'T>) (x:FlatList<_>) = List.collect f x
+ let inline exists f (x:FlatList<_>) = List.exists f x
+ let inline filter f (x:FlatList<_>) = List.filter f x
+ let inline fold f acc (x:FlatList<_>) = List.fold f acc x
+ let inline fold2 f acc (x:FlatList<_>) (y:FlatList<_>) = List.fold2 f acc x y
+ let inline foldBack f (x:FlatList<_>) acc = List.foldBack f x acc
+ let inline foldBack2 f (x:FlatList<_>) (y:FlatList<_>) acc = List.foldBack2 f x y acc
+ let inline map2 f (x:FlatList<_>) (y:FlatList<_>) = List.map2 f x y
+ let inline forall f (x:FlatList<_>) = List.forall f x
+ let inline forall2 f (x1:FlatList<_>) (x2:FlatList<_>) = List.forall2 f x1 x2
+ let inline iter2 f (x1:FlatList<_>) (x2:FlatList<_>) = List.iter2 f x1 x2
+ let inline partition f (x:FlatList<_>) = List.partition f x
+ let inline sum (x:FlatList) = List.sum x
+ let inline sumBy (f: 'T -> int) (x:FlatList<'T>) = List.sumBy f x
+ let inline unzip (x:FlatList<_>) = List.unzip x
+ let inline physicalEquality (x:FlatList<_>) (y:FlatList<_>) = (LanguagePrimitives.PhysicalEquality x y)
+ let inline tryFind f (x:FlatList<_>) = List.tryFind f x
+ let inline concat (x:FlatList<_>) = List.concat x
+ let inline isEmpty (x:FlatList<_>) = List.isEmpty x
+ let inline one(x) = [x]
+ let inline toMap (x:FlatList<_>) = Map.ofList x
+ let inline length (x:FlatList<_>) = List.length x
+ let inline map f (x:FlatList<_>) = List.map f x
+ let inline mapi f (x:FlatList<_>) = List.mapi f x
+ let inline iter f (x:FlatList<_>) = List.iter f x
+ let inline iteri f (x:FlatList<_>) = List.iteri f x
+ let inline toList (x:FlatList<_>) = x
+ let inline ofSeq (x:seq<_>) = List.ofSeq x
+ let inline append(l1 : FlatList<'T>) (l2 : FlatList<'T>) = List.append l1 l2
+ let inline ofList(l) = l
+ let inline init n f = List.init n f
+ let inline zip (x:FlatList<_>) (y:FlatList<_>) = List.zip x y
#endif
#if FLAT_LIST_AS_ARRAY
diff --git a/src/fsharp/Optimizer.fs b/src/fsharp/Optimizer.fs
index 9bb4ba0ecde..b547523882f 100644
--- a/src/fsharp/Optimizer.fs
+++ b/src/fsharp/Optimizer.fs
@@ -467,18 +467,20 @@ let rec BindValsInModuleOrNamespace cenv (mval:LazyModuleInfo) env =
let env = (env, mval.ValInfos.Entries) ||> Seq.fold (fun env (v:ValRef, vval) -> BindExternalLocalVal cenv v.Deref vval env)
env
-let BindInternalValToUnknown cenv v env =
+let inline BindInternalValToUnknown cenv v env =
#if CHECKED
BindInternalLocalVal cenv v UnknownValue env
#else
- ignore (cenv,v)
+ ignore cenv
+ ignore v
env
#endif
-let BindInternalValsToUnknown cenv vs env =
+let inline BindInternalValsToUnknown cenv vs env =
#if CHECKED
List.foldBack (BindInternalValToUnknown cenv) vs env
#else
- ignore (cenv,vs)
+ ignore cenv
+ ignore vs
env
#endif
@@ -568,9 +570,11 @@ let GetInfoForNonLocalVal cenv env (vref:ValRef) =
let GetInfoForVal cenv env m (vref:ValRef) =
let res =
- match vref.IsLocalRef with
- | true -> GetInfoForLocalValue cenv env vref.binding m
- | false -> GetInfoForNonLocalVal cenv env vref
+ if vref.IsLocalRef then
+ GetInfoForLocalValue cenv env vref.binding m
+ else
+ GetInfoForNonLocalVal cenv env vref
+
check (* "its stored value was incomplete" m *) vref res |> ignore
res
@@ -2032,7 +2036,7 @@ and OptimizeFastIntegerForLoop cenv env (spStart,v,e1,dir,e2,e3,m) =
//-------------------------------------------------------------------------
and OptimizeLetRec cenv env (binds,bodyExpr,m) =
- let vs = binds |> FlatList.map (fun v -> v.Var) in
+ let vs = binds |> FlatList.map (fun v -> v.Var)
let env = BindInternalValsToUnknown cenv vs env
let binds',env = OptimizeBindings cenv true env binds
let bodyExpr',einfo = OptimizeExpr cenv env bodyExpr
@@ -2040,8 +2044,7 @@ and OptimizeLetRec cenv env (binds,bodyExpr,m) =
// Eliminate any unused bindings, as in let case
let binds'',bindinfos =
let fvs0 = freeInExpr CollectLocals bodyExpr'
- let fvsN = FlatList.map (fst >> freeInBindingRhs CollectLocals) binds'
- let fvs = FlatList.fold unionFreeVars fvs0 fvsN
+ let fvs = FlatList.fold (fun acc x -> unionFreeVars acc (fst x |> freeInBindingRhs CollectLocals)) fvs0 binds'
SplitValuesByIsUsedOrHasEffect cenv (fun () -> fvs.FreeLocals) binds'
// Trim out any optimization info that involves escaping values
let evalue' = AbstractExprInfoByVars (FlatList.toList vs,[]) einfo.Info
@@ -2206,7 +2209,7 @@ and TryOptimizeVal cenv env (mustInline,valInfoForVal,m) =
| SizeValue (_,detail) -> TryOptimizeVal cenv env (mustInline,detail,m)
| ValValue (v',detail) ->
// Inline values bound to other values immediately
- match TryOptimizeVal cenv env (mustInline,detail,m) with
+ match TryOptimizeVal cenv env (mustInline,detail,m) with
// Prefer to inline using the more specific info if possible
| Some e -> Some e
//If the more specific info didn't reveal an inline then use the value
@@ -2300,9 +2303,9 @@ and TakeAddressOfStructArgumentIfNeeded cenv (vref:ValRef) ty args m =
wrap, (objArgAddress::rest)
| _ ->
// no wrapper, args stay the same
- (fun x -> x), args
+ id, args
else
- (fun x -> x), args
+ id, args
and DevirtualizeApplication cenv env (vref:ValRef) ty tyargs args m =
let wrap,args = TakeAddressOfStructArgumentIfNeeded cenv vref ty args m
@@ -2579,50 +2582,51 @@ and TryInlineApplication cenv env (_f0',finfo) (tyargs: TType list,args: Expr li
//-------------------------------------------------------------------------
and OptimizeApplication cenv env (f0,f0ty,tyargs,args,m) =
- let f0',finfo = OptimizeExpr cenv env f0
// trying to devirtualize
match TryDevirtualizeApplication cenv env (f0,tyargs,args,m) with
| Some res ->
// devirtualized
res
| None ->
-
- match TryInlineApplication cenv env (f0',finfo) (tyargs,args,m) with
+ let newf0,finfo = OptimizeExpr cenv env f0
+ match TryInlineApplication cenv env (newf0,finfo) (tyargs,args,m) with
| Some res ->
// inlined
res
| None ->
let shapes =
- match f0' with
- | Expr.Val(vref,_,_) when Option.isSome vref.ValReprInfo ->
- let (ValReprInfo(_kinds,detupArgsL,_)) = Option.get vref.ValReprInfo
- let nargs = (args.Length)
- let nDetupArgsL = detupArgsL.Length
- let nShapes = min nargs nDetupArgsL
- let detupArgsShapesL =
- List.take nShapes detupArgsL |> List.map (fun detupArgs ->
- match detupArgs with
- | [] | [_] -> UnknownValue
- | _ -> TupleValue(Array.ofList (List.map (fun _ -> UnknownValue) detupArgs)))
- detupArgsShapesL @ List.replicate (nargs - nShapes) UnknownValue
-
- | _ -> args |> List.map (fun _ -> UnknownValue)
-
- let args',arginfos = OptimizeExprsThenReshapeAndConsiderSplits cenv env (List.zip shapes args)
+ match newf0 with
+ | Expr.Val(vref,_,_) ->
+ match vref.ValReprInfo with
+ | Some(ValReprInfo(_,detupArgsL,_)) ->
+ let nargs = args.Length
+ let nDetupArgsL = detupArgsL.Length
+ let nShapes = min nargs nDetupArgsL
+ let detupArgsShapesL =
+ List.take nShapes detupArgsL
+ |> List.map (fun detupArgs ->
+ match detupArgs with
+ | [] | [_] -> UnknownValue
+ | _ -> TupleValue(Array.ofList (List.map (fun _ -> UnknownValue) detupArgs)))
+ List.zip (detupArgsShapesL @ List.replicate (nargs - nShapes) UnknownValue) args
+ | _ -> args |> List.map (fun arg -> UnknownValue,arg)
+ | _ -> args |> List.map (fun arg -> UnknownValue,arg)
+
+ let newArgs,arginfos = OptimizeExprsThenReshapeAndConsiderSplits cenv env shapes
// beta reducing
- let expr' = MakeApplicationAndBetaReduce cenv.g (f0',f0ty, [tyargs],args',m)
+ let newExpr = MakeApplicationAndBetaReduce cenv.g (newf0,f0ty, [tyargs],newArgs,m)
- match f0', expr' with
+ match newf0, newExpr with
| (Expr.Lambda _ | Expr.TyLambda _), Expr.Let _ ->
// we beta-reduced, hence reoptimize
- OptimizeExpr cenv env expr'
+ OptimizeExpr cenv env newExpr
| _ ->
// regular
// Determine if this application is a critical tailcall
let mayBeCriticalTailcall =
- match f0' with
+ match newf0 with
| KnownValApp(vref,_typeArgs,otherArgs) ->
// Check if this is a call to a function of known arity that has been inferred to not be a critical tailcall when used as a direct call
@@ -2633,13 +2637,13 @@ and OptimizeApplication cenv env (f0,f0ty,tyargs,args,m) =
(let valInfoForVal = GetInfoForVal cenv env m vref in valInfoForVal.ValMakesNoCriticalTailcalls) ||
(match env.functionVal with | None -> false | Some (v,_) -> valEq vref.Deref v)
if doesNotMakeCriticalTailcall then
- let numArgs = otherArgs.Length + args'.Length
+ let numArgs = otherArgs.Length + newArgs.Length
match vref.ValReprInfo with
| Some i -> numArgs > i.NumCurriedArgs
| None ->
match env.functionVal with
| Some (_v,i) -> numArgs > i.NumCurriedArgs
- | None -> true // over-applicaiton of a known function, which presumably returns a function. This counts as an indirect call
+ | None -> true // over-application of a known function, which presumably returns a function. This counts as an indirect call
else
true // application of a function that may make a critical tailcall
@@ -2647,11 +2651,11 @@ and OptimizeApplication cenv env (f0,f0ty,tyargs,args,m) =
// All indirect calls (calls to unknown functions) are assumed to be critical tailcalls
true
- expr', { TotalSize=finfo.TotalSize + AddTotalSizes arginfos
- FunctionSize=finfo.FunctionSize + AddFunctionSizes arginfos
- HasEffect=true
- MightMakeCriticalTailcall = mayBeCriticalTailcall
- Info=ValueOfExpr expr' }
+ newExpr, { TotalSize=finfo.TotalSize + AddTotalSizes arginfos
+ FunctionSize=finfo.FunctionSize + AddFunctionSizes arginfos
+ HasEffect=true
+ MightMakeCriticalTailcall = mayBeCriticalTailcall
+ Info=ValueOfExpr newExpr }
//-------------------------------------------------------------------------
// Optimize/analyze a lambda expression
@@ -2661,7 +2665,6 @@ and OptimizeLambdas (vspec: Val option) cenv env topValInfo e ety =
match e with
| Expr.Lambda (lambdaId,_,_,_,_,m,_)
| Expr.TyLambda(lambdaId,_,_,m,_) ->
- let isTopLevel = Option.isSome vspec && vspec.Value.IsCompiledAsTopLevel
let tps,ctorThisValOpt,baseValOpt,vsl,body,bodyty = IteratedAdjustArityOfLambda cenv.g cenv.amap topValInfo e
let env = { env with functionVal = (match vspec with None -> None | Some v -> Some (v,topValInfo)) }
let env = Option.foldBack (BindInternalValToUnknown cenv) ctorThisValOpt env
@@ -2709,13 +2712,18 @@ and OptimizeLambdas (vspec: Val option) cenv env topValInfo e ety =
| Some baseVal ->
let fvs = freeInExpr CollectLocals body'
if fvs.UsesMethodLocalConstructs || fvs.FreeLocals.Contains baseVal then
- UnknownValue
+ UnknownValue
else
let expr2 = mkMemberLambdas m tps ctorThisValOpt None vsl (body',bodyty)
CurriedLambdaValue (lambdaId,arities,bsize,expr2,ety)
- expr', { TotalSize=bsize + (if isTopLevel then methodDefnTotalSize else closureTotalSize) (* estimate size of new syntactic closure - expensive, in contrast to a method *)
+ let estimatedSize =
+ match vspec with
+ | Some v when v.IsCompiledAsTopLevel -> methodDefnTotalSize
+ | _ -> closureTotalSize
+
+ expr', { TotalSize=bsize + estimatedSize (* estimate size of new syntactic closure - expensive, in contrast to a method *)
FunctionSize=1
HasEffect=false
MightMakeCriticalTailcall = false
@@ -2739,9 +2747,10 @@ and OptimizeExprsThenConsiderSplits cenv env exprs =
| [] -> NoExprs
| _ -> OptimizeList (OptimizeExprThenConsiderSplit cenv env) exprs
-and OptimizeFlatExprsThenConsiderSplits cenv env (exprs:FlatExprs) =
- if FlatList.isEmpty exprs then NoFlatExprs
- else OptimizeFlatList (OptimizeExprThenConsiderSplit cenv env) exprs
+and OptimizeFlatExprsThenConsiderSplits cenv env exprs =
+ match exprs with
+ | [] -> NoFlatExprs
+ | _ -> OptimizeFlatList (OptimizeExprThenConsiderSplit cenv env) exprs
and OptimizeExprThenReshapeAndConsiderSplit cenv env (shape,e) =
OptimizeExprThenConsiderSplit cenv env (ReshapeExpr cenv (shape,e))
@@ -2753,7 +2762,8 @@ and ReshapeExpr cenv (shape,e) =
match shape,e with
| TupleValue(subshapes), Expr.Val(_vref,_vFlags,m) ->
let tinst = destRefTupleTy cenv.g (tyOfExpr cenv.g e)
- mkRefTupled cenv.g m (List.mapi (fun i subshape -> ReshapeExpr cenv (subshape,mkTupleFieldGet cenv.g (tupInfoRef,e,tinst,i,m))) (Array.toList subshapes)) tinst
+ let subshapes = Array.toList subshapes
+ mkRefTupled cenv.g m (List.mapi (fun i subshape -> ReshapeExpr cenv (subshape,mkTupleFieldGet cenv.g (tupInfoRef,e,tinst,i,m))) subshapes) tinst
| _ ->
e
@@ -2868,8 +2878,7 @@ and OptimizeDecisionTree cenv env m x =
let info = CombineValueInfosUnknown [rinfo;binfo]
// try to fold the let-binding into a single result expression
match rest with
- | TDSuccess(es,n) when es.Length = 1 ->
- let e = es.[0]
+ | TDSuccess([e],n) ->
let e,_adjust = TryEliminateLet cenv env bind e m
TDSuccess(FlatList.one e,n),info
| _ ->
@@ -3072,7 +3081,7 @@ and OptimizeModuleExpr cenv env x =
new ModuleOrNamespaceType(kind=mtyp.ModuleOrNamespaceKind,
vals= (mtyp.AllValsAndMembers |> QueueList.filter (Zset.memberOf deadSet >> not)),
entities= mtyp.AllEntities)
- mtyp.ModuleAndNamespaceDefinitions |> List.iter (fun mspec -> elimModSpec mspec)
+ mtyp.ModuleAndNamespaceDefinitions |> List.iter elimModSpec
mty
and elimModSpec (mspec:ModuleOrNamespace) =
let mtyp = elimModTy mspec.ModuleOrNamespaceType
@@ -3116,13 +3125,12 @@ and OptimizeModuleDef cenv (env,bindInfosColl) x =
let binds = minfos |> List.choose (function Choice1Of2 (x,_) -> Some x | _ -> None)
let binfos = minfos |> List.choose (function Choice1Of2 (_,x) -> Some x | _ -> None)
let minfos = minfos |> List.choose (function Choice2Of2 x -> Some x | _ -> None)
-
- (* REVIEW: Eliminate let bindings on the way back up *)
+ (* REVIEW: Eliminate let bindings on the way back up *)
(TMDefRec(isRec,tycons,mbinds,m),
- notlazy { ValInfos= ValInfos(FlatList.map2 (fun bind binfo -> mkValBind bind (mkValInfo binfo bind.Var)) binds binfos)
+ notlazy { ValInfos = ValInfos(FlatList.map2 (fun bind binfo -> mkValBind bind (mkValInfo binfo bind.Var)) binds binfos)
ModuleOrNamespaceInfos = NameMap.ofList minfos}),
- (env,bindInfosColl)
+ (env,bindInfosColl)
| TMAbstract(mexpr) ->
let mexpr,info = OptimizeModuleExpr cenv env mexpr
let env = BindValsInModuleOrNamespace cenv info env
@@ -3132,7 +3140,7 @@ and OptimizeModuleDef cenv (env,bindInfosColl) x =
(* REVIEW: Eliminate unused let bindings from modules *)
(TMDefLet(bind',m),
notlazy { ValInfos=ValInfos [mkValBind bind (mkValInfo binfo bind.Var)]
- ModuleOrNamespaceInfos = NameMap.ofList []}),
+ ModuleOrNamespaceInfos = NameMap.empty }),
(env ,([bindInfo]::bindInfosColl))
| TMDefDo(e,m) ->
diff --git a/src/fsharp/autobox.fs b/src/fsharp/autobox.fs
index 7d4398fea80..b32e07f0798 100644
--- a/src/fsharp/autobox.fs
+++ b/src/fsharp/autobox.fs
@@ -17,7 +17,7 @@ open Microsoft.FSharp.Compiler.TypeRelations
// Decide the set of mutable locals to promote to heap-allocated reference cells
type cenv =
- { g: TcGlobals;
+ { g: TcGlobals
amap: Import.ImportMap }
/// Find all the mutable locals that escape a method, function or lambda expression
diff --git a/src/fsharp/fsc.fs b/src/fsharp/fsc.fs
index 43b1659e453..73be4f34e89 100644
--- a/src/fsharp/fsc.fs
+++ b/src/fsharp/fsc.fs
@@ -1741,6 +1741,7 @@ module FileWriter =
emitTailcalls = tcConfig.emitTailcalls
showTimes = tcConfig.showTimes
portablePDB = tcConfig.portablePDB
+ embeddedPDB = tcConfig.embeddedPDB
signer = GetSigner signingInfo
fixupOverlappingSequencePoints = false
dumpDebugInfo = tcConfig.dumpDebugInfo },
diff --git a/src/fsharp/lib.fs b/src/fsharp/lib.fs
index 1a1e64acd23..766f6f023f6 100755
--- a/src/fsharp/lib.fs
+++ b/src/fsharp/lib.fs
@@ -178,14 +178,11 @@ module ListAssoc =
//------------------------------------------------------------------------
module ListSet =
- (* NOTE: O(n)! *)
- let rec contains f x l =
- match l with
- | [] -> false
- | x'::t -> f x x' || contains f x t
+ let inline contains f x l = List.exists (f x) l
(* NOTE: O(n)! *)
let insert f x l = if contains f x l then l else x::l
+
let unionFavourRight f l1 l2 =
match l1, l2 with
| _, [] -> l1
diff --git a/tests/RunTests.cmd b/tests/RunTests.cmd
index 208bd8c296f..687719a5229 100644
--- a/tests/RunTests.cmd
+++ b/tests/RunTests.cmd
@@ -18,6 +18,13 @@ if not exist "%~dp0..\packages\NUnit.Console.3.0.0\tools\" (
SET NUNIT3_CONSOLE=%~dp0..\packages\NUnit.Console.3.0.0\tools\nunit3-console.exe
SET FSI_TOOL=%~dp0..\%FLAVOR%\net40\bin\Fsi.exe
+set link_exe=%~dp0..\packages\VisualCppTools.14.0.24519-Pre\lib\native\bin\link.exe
+if not exist "%link_exe%" (
+ set saved_errorlevel=1
+ echo Error: failed to find '%link_exe%' use nuget to restore the VisualCppTools package
+ goto :FINISHED
+)
+
rem "ttags" indicates what test areas will be run, based on the tags in the test.lst files
set TTAGS_ARG=
SET TTAGS=
@@ -382,7 +389,8 @@ echo powershell -File Upload-Results.ps1 "%~1"
powershell -File Upload-Results.ps1 "%~1"
:SKIP_APPVEYOR_UPLOAD
-
+:FINISHED
+
if NOT %saved_errorlevel% == 0 exit /b 1
goto :EOF
diff --git a/tests/fsharpqa/Source/CodeGen/EmittedIL/SerializableAttribute/ToplevelModule.il.bsl b/tests/fsharpqa/Source/CodeGen/EmittedIL/SerializableAttribute/ToplevelModule.il.bsl
index 042143d9677..3c9df2a50c3 100644
--- a/tests/fsharpqa/Source/CodeGen/EmittedIL/SerializableAttribute/ToplevelModule.il.bsl
+++ b/tests/fsharpqa/Source/CodeGen/EmittedIL/SerializableAttribute/ToplevelModule.il.bsl
@@ -1720,21 +1720,19 @@
{
// Code size 14 (0xe)
.maxstack 3
- .locals init ([0] string V_0,
- [1] string greeting)
- .line 12,12 : 9,31
+ .locals init ([0] string greeting,
+ [1] string V_1)
+ .line 12,12 : 9,31 ''
IL_0000: nop
IL_0001: call string ABC::get_greeting()
IL_0006: stloc.0
- .line 22,22 : 13,35
+ .line 22,22 : 13,35 ''
IL_0007: call string ABC/ABC::get_greeting()
IL_000c: stloc.1
IL_000d: ret
} // end of method $ABC::.cctor
-
} // end of class ''.$ABC
-
// =============================================================
// *********** DISASSEMBLY COMPLETE ***********************
diff --git a/tests/fsharpqa/Source/CodeGen/EmittedIL/SerializableAttribute/ToplevelModuleP.il.bsl b/tests/fsharpqa/Source/CodeGen/EmittedIL/SerializableAttribute/ToplevelModuleP.il.bsl
index a504b86ed4e..93b55d4bd13 100644
--- a/tests/fsharpqa/Source/CodeGen/EmittedIL/SerializableAttribute/ToplevelModuleP.il.bsl
+++ b/tests/fsharpqa/Source/CodeGen/EmittedIL/SerializableAttribute/ToplevelModuleP.il.bsl
@@ -1692,18 +1692,17 @@
{
// Code size 14 (0xe)
.maxstack 3
- .locals init ([0] string V_0,
- [1] string greeting)
- .line 12,12 : 9,31
+ .locals init ([0] string greeting,
+ [1] string V_1)
+ .line 12,12 : 9,31 ''
IL_0000: nop
IL_0001: call string ABC::get_greeting()
IL_0006: stloc.0
- .line 22,22 : 13,35
+ .line 22,22 : 13,35 ''
IL_0007: call string ABC/ABC::get_greeting()
IL_000c: stloc.1
IL_000d: ret
} // end of method $ABC::.cctor
-
} // end of class ''.$ABC
diff --git a/tests/fsharpqa/Source/CodeGen/EmittedIL/SerializableAttribute/ToplevelNamespace.il.bsl b/tests/fsharpqa/Source/CodeGen/EmittedIL/SerializableAttribute/ToplevelNamespace.il.bsl
index 4ec579e7517..2c1b74c902a 100644
--- a/tests/fsharpqa/Source/CodeGen/EmittedIL/SerializableAttribute/ToplevelNamespace.il.bsl
+++ b/tests/fsharpqa/Source/CodeGen/EmittedIL/SerializableAttribute/ToplevelNamespace.il.bsl
@@ -2513,18 +2513,17 @@
{
// Code size 14 (0xe)
.maxstack 3
- .locals init ([0] string V_0,
- [1] string greeting)
- .line 19,19 : 9,31
+ .locals init ([0] string greeting,
+ [1] string V_1)
+ .line 19,19 : 9,31 ''
IL_0000: nop
IL_0001: call string XYZ.ABC::get_greeting()
IL_0006: stloc.0
- .line 29,29 : 13,35
+ .line 29,29 : 13,35 ''
IL_0007: call string XYZ.ABC/ABC::get_greeting()
IL_000c: stloc.1
IL_000d: ret
} // end of method $ToplevelNamespace::.cctor
-
} // end of class ''.$ToplevelNamespace
diff --git a/tests/fsharpqa/Source/CodeGen/EmittedIL/SerializableAttribute/ToplevelNamespaceP.il.bsl b/tests/fsharpqa/Source/CodeGen/EmittedIL/SerializableAttribute/ToplevelNamespaceP.il.bsl
index 6e206df9ecc..dc494245d5b 100644
--- a/tests/fsharpqa/Source/CodeGen/EmittedIL/SerializableAttribute/ToplevelNamespaceP.il.bsl
+++ b/tests/fsharpqa/Source/CodeGen/EmittedIL/SerializableAttribute/ToplevelNamespaceP.il.bsl
@@ -2471,18 +2471,17 @@
{
// Code size 14 (0xe)
.maxstack 3
- .locals init ([0] string V_0,
- [1] string greeting)
- .line 19,19 : 9,31
+ .locals init ([0] string greeting,
+ [1] string V_1)
+ .line 19,19 : 9,31 ''
IL_0000: nop
IL_0001: call string XYZ.ABC::get_greeting()
IL_0006: stloc.0
- .line 29,29 : 13,35
+ .line 29,29 : 13,35 ''
IL_0007: call string XYZ.ABC/ABC::get_greeting()
IL_000c: stloc.1
IL_000d: ret
} // end of method $ToplevelNamespace::.cctor
-
} // end of class ''.$ToplevelNamespace
diff --git a/tests/fsharpqa/Source/CompilerOptions/fsc/help/comparer.fsx b/tests/fsharpqa/Source/CompilerOptions/fsc/help/comparer.fsx
index 5ea487fbd26..3b812c21ae1 100644
--- a/tests/fsharpqa/Source/CompilerOptions/fsc/help/comparer.fsx
+++ b/tests/fsharpqa/Source/CompilerOptions/fsc/help/comparer.fsx
@@ -17,8 +17,8 @@ let f2 = File2List fn2
let mutable i = 0
let compare (f1:string list) (f2:string list) = List.forall2 (fun (a:string) (b:string) ->
- let aa = System.Text.RegularExpressions.Regex.Replace(a, @"F# Compiler version .+", "F# 3.0 Compiler version")
- let bb = System.Text.RegularExpressions.Regex.Replace(b, @"F# Compiler version .+", "F# 3.0 Compiler version")
+ let aa = System.Text.RegularExpressions.Regex.Replace(a, @"F# Compiler version .+", "F# Compiler")
+ let bb = System.Text.RegularExpressions.Regex.Replace(b, @"F# Compiler version .+", "F# Compiler")
i <- i+1
if (aa = bb) then
@@ -30,4 +30,4 @@ let compare (f1:string list) (f2:string list) = List.forall2 (fun (a:string) (b:
false
) f1 f2
-exit (if (f1.Length = f2.Length && compare f1 f2) then 0 else 1)
+exit (if (f1.Length = f2.Length && compare f1 f2) then 0 else printfn "File lengths differ"; 1)
diff --git a/tests/fsharpqa/Source/CompilerOptions/fsc/help/help40.437.1033.bsl b/tests/fsharpqa/Source/CompilerOptions/fsc/help/help40.437.1033.bsl
index 227de6e5682..1d028d6669d 100644
--- a/tests/fsharpqa/Source/CompilerOptions/fsc/help/help40.437.1033.bsl
+++ b/tests/fsharpqa/Source/CompilerOptions/fsc/help/help40.437.1033.bsl
@@ -1,110 +1,112 @@
-Microsoft (R) F# Compiler version 12.0.50525.0
+Microsoft (R) F# Compiler version 3.0
Copyright (c) Microsoft Corporation. All Rights Reserved.
- OUTPUT FILES -
---out: Name of the output file (Short form: -o)
---target:exe Build a console executable
---target:winexe Build a Windows executable
---target:library Build a library (Short form: -a)
---target:module Build a module that can be added to another
- assembly
---delaysign[+|-] Delay-sign the assembly using only the public
- portion of the strong name key
---publicsign[+|-] Public-sign the assembly using only the public
- portion of the strong name key, and mark the
- assembly as signed
---doc: Write the xmldoc of the assembly to the given
- file
---keyfile: Specify a strong name key file
---keycontainer: Specify a strong name key container
---platform: Limit which platforms this code can run on: x86,
- Itanium, x64, anycpu32bitpreferred, or anycpu.
- The default is anycpu.
---nooptimizationdata Only include optimization information essential
- for implementing inlined constructs. Inhibits
- cross-module inlining but improves binary
- compatibility.
---nointerfacedata Don't add a resource to the generated assembly
- containing F#-specific metadata
---sig: Print the inferred interface of the assembly to
- a file
---nocopyfsharpcore Don't copy FSharp.Core.dll along the produced
- binaries
+--out: Name of the output file (Short form: -o)
+--target:exe Build a console executable
+--target:winexe Build a Windows executable
+--target:library Build a library (Short form: -a)
+--target:module Build a module that can be added to another
+ assembly
+--delaysign[+|-] Delay-sign the assembly using only the public
+ portion of the strong name key
+--publicsign[+|-] Public-sign the assembly using only the public
+ portion of the strong name key, and mark the
+ assembly as signed
+--doc: Write the xmldoc of the assembly to the given
+ file
+--keyfile: Specify a strong name key file
+--keycontainer: Specify a strong name key container
+--platform: Limit which platforms this code can run on: x86,
+ Itanium, x64, anycpu32bitpreferred, or anycpu.
+ The default is anycpu.
+--nooptimizationdata Only include optimization information essential
+ for implementing inlined constructs. Inhibits
+ cross-module inlining but improves binary
+ compatibility.
+--nointerfacedata Don't add a resource to the generated assembly
+ containing F#-specific metadata
+--sig: Print the inferred interface of the assembly to
+ a file
+--nocopyfsharpcore Don't copy FSharp.Core.dll along the produced
+ binaries
- INPUT FILES -
---reference: Reference an assembly (Short form: -r)
+--reference: Reference an assembly (Short form: -r)
- RESOURCES -
---win32res: Specify a Win32 resource file (.res)
---win32manifest: Specify a Win32 manifest file
---nowin32manifest Do not include the default Win32 manifest
---resource: Embed the specified managed resource
---linkresource: Link the specified resource to this assembly
- where the resinfo format is [,[,public|private]]
+--win32res: Specify a Win32 resource file (.res)
+--win32manifest: Specify a Win32 manifest file
+--nowin32manifest Do not include the default Win32 manifest
+--resource: Embed the specified managed resource
+--linkresource: Link the specified resource to this assembly
+ where the resinfo format is [,[,public|private]]
- CODE GENERATION -
---debug[+|-] Emit debug information (Short form: -g)
---debug:{full|pdbonly|portable} Specify debugging type: full, portable, pdbonly.
- ('full' is the default if no debuggging type
- specified and enables attaching a debugger to a
- running program. 'portable' is a cross-platform
- format).
---optimize[+|-] Enable optimizations (Short form: -O)
---tailcalls[+|-] Enable or disable tailcalls
---crossoptimize[+|-] Enable or disable cross-module optimizations
+--debug[+|-] Emit debug information (Short form: -g)
+--debug:{full|pdbonly|portable|embedded} Specify debugging type: full, portable,
+ embedded, pdbonly. ('full' is the default if no
+ debuggging type specified and enables attaching
+ a debugger to a running program, 'portable' is a
+ cross-platform format, 'embedded' is a
+ cross-platform format embedded into the output
+ file).
+--optimize[+|-] Enable optimizations (Short form: -O)
+--tailcalls[+|-] Enable or disable tailcalls
+--crossoptimize[+|-] Enable or disable cross-module optimizations
- ERRORS AND WARNINGS -
---warnaserror[+|-] Report all warnings as errors
---warnaserror[+|-]: Report specific warnings as errors
---warn: Set a warning level (0-5)
---nowarn: Disable specific warning messages
---warnon: Enable specific warnings that may be off by
- default
---consolecolors[+|-] Output warning and error messages in color
+--warnaserror[+|-] Report all warnings as errors
+--warnaserror[+|-]: Report specific warnings as errors
+--warn: Set a warning level (0-5)
+--nowarn: Disable specific warning messages
+--warnon: Enable specific warnings that may be off by
+ default
+--consolecolors[+|-] Output warning and error messages in color
- LANGUAGE -
---checked[+|-] Generate overflow checks
---define: Define conditional compilation symbols (Short
- form: -d)
---mlcompatibility Ignore ML compatibility warnings
+--checked[+|-] Generate overflow checks
+--define: Define conditional compilation symbols (Short
+ form: -d)
+--mlcompatibility Ignore ML compatibility warnings
- MISCELLANEOUS -
---nologo Suppress compiler copyright message
---help Display this usage message (Short form: -?)
---@ Read response file for more options
+--nologo Suppress compiler copyright message
+--help Display this usage message (Short form: -?)
+--@ Read response file for more options
- ADVANCED -
---codepage: Specify the codepage used to read source files
---utf8output Output messages in UTF-8 encoding
---fullpaths Output messages with fully qualified paths
---lib: Specify a directory for the include path which
- is used to resolve source files and assemblies
- (Short form: -I)
---baseaddress: Base address for the library to be built
---noframework Do not reference the default CLI assemblies by
- default
---standalone Statically link the F# library and all
- referenced DLLs that depend on it into the
- assembly being generated
---staticlink: Statically link the given assembly and all
- referenced DLLs that depend on this assembly.
- Use an assembly name e.g. mylib, not a DLL name.
---pdb: Name the output debug file
---simpleresolution Resolve assembly references using
- directory-based rules rather than MSBuild
- resolution
---highentropyva[+|-] Enable high-entropy ASLR
---subsystemversion: Specify subsystem version of this assembly
---targetprofile: Specify target framework profile of this
- assembly. Valid values are mscorlib or netcore.
- Default - mscorlib
---quotations-debug[+|-] Emit debug information in quotations
+--codepage: Specify the codepage used to read source files
+--utf8output Output messages in UTF-8 encoding
+--fullpaths Output messages with fully qualified paths
+--lib: Specify a directory for the include path which
+ is used to resolve source files and assemblies
+ (Short form: -I)
+--baseaddress: Base address for the library to be built
+--noframework Do not reference the default CLI assemblies by
+ default
+--standalone Statically link the F# library and all
+ referenced DLLs that depend on it into the
+ assembly being generated
+--staticlink: Statically link the given assembly and all
+ referenced DLLs that depend on this assembly.
+ Use an assembly name e.g. mylib, not a DLL name.
+--pdb: Name the output debug file
+--simpleresolution Resolve assembly references using
+ directory-based rules rather than MSBuild
+ resolution
+--highentropyva[+|-] Enable high-entropy ASLR
+--subsystemversion: Specify subsystem version of this assembly
+--targetprofile: Specify target framework profile of this
+ assembly. Valid values are mscorlib or netcore.
+ Default - mscorlib
+--quotations-debug[+|-] Emit debug information in quotations
diff --git a/tests/fsharpqa/Source/CompilerOptions/fsc/highentropyva/CheckHighEntropyASLR.bat b/tests/fsharpqa/Source/CompilerOptions/fsc/highentropyva/CheckHighEntropyASLR.bat
index 230392ba312..d5ec99a9a23 100644
--- a/tests/fsharpqa/Source/CompilerOptions/fsc/highentropyva/CheckHighEntropyASLR.bat
+++ b/tests/fsharpqa/Source/CompilerOptions/fsc/highentropyva/CheckHighEntropyASLR.bat
@@ -1,14 +1,6 @@
@echo off
-REM Search for the Linker
-REM Use VS2015 or fall back to VS2014
-SET LINK_EXE="%VS150COMNTOOLS%\..\IDE\VC\bin\link.exe"
-IF NOT EXIST %LINK_EXE% ( SET LINK_EXE="%VS150COMNTOOLS%..\..\VC\bin\link.exe" )
-IF NOT EXIST %LINK_EXE% ( SET LINK_EXE="%VS140COMNTOOLS%..\..\VC\bin\link.exe" )
-IF NOT EXIST %LINK_EXE% (
- @echo "Test Requires LINK.EXE" --- Not found
- @echo "When installing VS please select "Select Visual C++ / Common Tools For Visual C++"
-)
+REM Use Link.exe from the nuget package
REM %LINK_EXE% -- Path to link.exe
REM %1 -- assembly to check
diff --git a/tests/fsharpqa/Source/CompilerOptions/fsc/pdb/env.lst b/tests/fsharpqa/Source/CompilerOptions/fsc/pdb/env.lst
index 1d1680d8d75..9124761257b 100644
--- a/tests/fsharpqa/Source/CompilerOptions/fsc/pdb/env.lst
+++ b/tests/fsharpqa/Source/CompilerOptions/fsc/pdb/env.lst
@@ -14,6 +14,8 @@ NOMONO SOURCE=pdb01.fs SCFLAGS="--debug --pdb:.\\pdb01.pdb" PRECMD="IF EXIST pd
NOMONO SOURCE=pdb01.fs SCFLAGS="-g --pdb:.\\pdb01.fs" PRECMD="IF EXIST pdb01.pdb DEL pdb01.pdb" POSTCMD="IF NOT EXIST pdb01.pdb EXIT 1" # different file w/ -g (try to overwrite)
+NOMONO SOURCE=pdb01.fs SCFLAGS="-g --debug:embedded" PRECMD="IF EXIST pdb01.pdb DEL pdb01.pdb" POSTCMD="IF EXIST pdb01.pdb EXIT 1" # If pdb file exists then it didn't embed so fail.
+
# Case sensitive
SOURCE=pdb02.fs SCFLAGS="--PDB -g" POSTCMD="IF EXIST pdb02.pdb EXIT 1" # --PDB
diff --git a/tests/fsharpqa/Source/CompilerOptions/fsc/subsystemversion/CheckSubsystemVersion.bat b/tests/fsharpqa/Source/CompilerOptions/fsc/subsystemversion/CheckSubsystemVersion.bat
index 60afc827ace..7189f89f5cb 100644
--- a/tests/fsharpqa/Source/CompilerOptions/fsc/subsystemversion/CheckSubsystemVersion.bat
+++ b/tests/fsharpqa/Source/CompilerOptions/fsc/subsystemversion/CheckSubsystemVersion.bat
@@ -1,15 +1,5 @@
@echo off
-REM Search for the Linker
-REM Use VS2015 or fall back to VS2014
-SET LINK_EXE="%VS150COMNTOOLS%\..\IDE\VC\bin\link.exe"
-IF NOT EXIST %LINK_EXE% ( SET LINK_EXE="%VS150COMNTOOLS%..\..\VC\bin\link.exe" )
-IF NOT EXIST %LINK_EXE% ( SET LINK_EXE="%VS140COMNTOOLS%..\..\VC\bin\link.exe" )
-IF NOT EXIST %LINK_EXE% (
- @echo "Test Requires LINK.EXE" --- Not found
- @echo "When installing VS please select "Select Visual C++ / Common Tools For Visual C++"
-)
-
REM %LINK_EXE% -- Path to link.exe
REM %1 -- assembly to check
REM %2 -- expected value ("4.00" etc...)
diff --git a/tests/fsharpqa/Source/CompilerOptions/fsi/exename/help40.437.1033.bsl b/tests/fsharpqa/Source/CompilerOptions/fsi/exename/help40.437.1033.bsl
index 3aaba1fffc8..61dc02ef058 100644
--- a/tests/fsharpqa/Source/CompilerOptions/fsi/exename/help40.437.1033.bsl
+++ b/tests/fsharpqa/Source/CompilerOptions/fsi/exename/help40.437.1033.bsl
@@ -3,63 +3,65 @@ Usage: fsharpi [script.fsx []]
- INPUT FILES -
---use: Use the given file on startup as initial input
---load: #load the given file on startup
---reference: Reference an assembly (Short form: -r)
--- ... Treat remaining arguments as command line
- arguments, accessed using fsi.CommandLineArgs
+--use: Use the given file on startup as initial input
+--load: #load the given file on startup
+--reference: Reference an assembly (Short form: -r)
+-- ... Treat remaining arguments as command line
+ arguments, accessed using fsi.CommandLineArgs
- CODE GENERATION -
---debug[+|-] Emit debug information (Short form: -g)
---debug:{full|pdbonly|portable} Specify debugging type: full, portable, pdbonly.
- ('pdbonly' is the default if no debuggging type
- specified and enables attaching a debugger to a
- running program. 'portable' is a cross-platform
- format).
---optimize[+|-] Enable optimizations (Short form: -O)
---tailcalls[+|-] Enable or disable tailcalls
---crossoptimize[+|-] Enable or disable cross-module optimizations
+--debug[+|-] Emit debug information (Short form: -g)
+--debug:{full|pdbonly|portable|embedded} Specify debugging type: full, portable,
+ embedded, pdbonly. ('pdbonly' is the default if
+ no debuggging type specified and enables
+ attaching a debugger to a running program,
+ 'portable' is a cross-platform format,
+ 'embedded' is a cross-platform format embedded
+ into the output file).
+--optimize[+|-] Enable optimizations (Short form: -O)
+--tailcalls[+|-] Enable or disable tailcalls
+--crossoptimize[+|-] Enable or disable cross-module optimizations
- ERRORS AND WARNINGS -
---warnaserror[+|-] Report all warnings as errors
---warnaserror[+|-]: Report specific warnings as errors
---warn: Set a warning level (0-5)
---nowarn: Disable specific warning messages
---warnon: Enable specific warnings that may be off by
- default
---consolecolors[+|-] Output warning and error messages in color
+--warnaserror[+|-] Report all warnings as errors
+--warnaserror[+|-]: Report specific warnings as errors
+--warn: Set a warning level (0-5)
+--nowarn: Disable specific warning messages
+--warnon: Enable specific warnings that may be off by
+ default
+--consolecolors[+|-] Output warning and error messages in color
- LANGUAGE -
---checked[+|-] Generate overflow checks
---define: Define conditional compilation symbols (Short
- form: -d)
---mlcompatibility Ignore ML compatibility warnings
+--checked[+|-] Generate overflow checks
+--define: Define conditional compilation symbols (Short
+ form: -d)
+--mlcompatibility Ignore ML compatibility warnings
- MISCELLANEOUS -
---nologo Suppress compiler copyright message
---help Display this usage message (Short form: -?)
+--nologo Suppress compiler copyright message
+--help Display this usage message (Short form: -?)
- ADVANCED -
---codepage: Specify the codepage used to read source files
---utf8output Output messages in UTF-8 encoding
---fullpaths Output messages with fully qualified paths
---lib: Specify a directory for the include path which
- is used to resolve source files and assemblies
- (Short form: -I)
---noframework Do not reference the default CLI assemblies by
- default
---exec Exit fsi after loading the files or running the
- .fsx script given on the command line
---gui[+|-] Execute interactions on a Windows Forms event
- loop (on by default)
---quiet Suppress fsi writing to stdout
---readline[+|-] Support TAB completion in console (on by
- default)
---quotations-debug[+|-] Emit debug information in quotations
---shadowcopyreferences[+|-] Prevents references from being locked by the F#
- Interactive process
\ No newline at end of file
+--codepage: Specify the codepage used to read source files
+--utf8output Output messages in UTF-8 encoding
+--fullpaths Output messages with fully qualified paths
+--lib: Specify a directory for the include path which
+ is used to resolve source files and assemblies
+ (Short form: -I)
+--noframework Do not reference the default CLI assemblies by
+ default
+--exec Exit fsi after loading the files or running the
+ .fsx script given on the command line
+--gui[+|-] Execute interactions on a Windows Forms event
+ loop (on by default)
+--quiet Suppress fsi writing to stdout
+--readline[+|-] Support TAB completion in console (on by
+ default)
+--quotations-debug[+|-] Emit debug information in quotations
+--shadowcopyreferences[+|-] Prevents references from being locked by the F#
+ Interactive process
diff --git a/tests/fsharpqa/Source/CompilerOptions/fsi/help/help.437.1033.bsl b/tests/fsharpqa/Source/CompilerOptions/fsi/help/help.437.1033.bsl
deleted file mode 100644
index 5afc1c8249d..00000000000
--- a/tests/fsharpqa/Source/CompilerOptions/fsi/help/help.437.1033.bsl
+++ /dev/null
@@ -1,62 +0,0 @@
-Microsoft (R) F# 2.0 Interactive build 2.0.50727.0
-Copyright (c) Microsoft Corporation. All Rights Reserved.
-
-Usage: fsi.exe [script.fsx []]
-
-
- - INPUT FILES -
---use: Use the given file on startup as initial input
---load: #load the given file on startup
---reference: Reference an assembly (Short form: -r)
--- ... Treat remaining arguments as command line
- arguments, accessed using fsi.CommandLineArgs
-
-
- - CODE GENERATION -
---debug[+|-] Emit debug information (Short form: -g)
---debug:{full|pdbonly|portable} Specify debugging type: full, portable, pdbonly.
- ('pdbonly' is the default if no debuggging type
- specified and enables attaching a debugger to a
- running program. 'portable' is a cross-platform
- format).
---optimize[+|-] Enable optimizations (Short form: -O)
---tailcalls[+|-] Enable or disable tailcalls
---crossoptimize[+|-] Enable or disable cross-module optimizations
-
-
- - ERRORS AND WARNINGS -
---warnaserror[+|-] Report all warnings as errors
---warnaserror[+|-]: Report specific warnings as errors
---warn: Set a warning level (0-4)
---nowarn: Disable specific warning messages
---consolecolors[+|-] Output warning and error messages in color
-
-
- - LANGUAGE -
---checked[+|-] Generate overflow checks
---define: Define conditional compilation symbols (Short
- form: -d)
---mlcompatibility Ignore ML compatibility warnings
-
-
- - MISCELLANEOUS -
---nologo Suppress compiler copyright message
---help Display this usage message (Short form: -?)
-
-
- - ADVANCED -
---codepage: Specify the codepage used to read source files
---utf8output Output messages in UTF-8 encoding
---fullpaths Output messages with fully qualified paths
---lib: Specify a directory for the include path which
- is used to resolve source files and assemblies
- (Short form: -I)
---noframework Do not reference the default CLI assemblies by
- default
---exec Exit fsi after loading the files or running the
- .fsx script given on the command line
---gui[+|-] Execute interactions on a Windows Forms event
- loop (on by default)
---quiet Suppress fsi writing to stdout
---readline[+|-] Support TAB completion in console (on by
- default)
diff --git a/tests/fsharpqa/Source/CompilerOptions/fsi/help/help40-nologo.437.1033.bsl b/tests/fsharpqa/Source/CompilerOptions/fsi/help/help40-nologo.437.1033.bsl
index 3ffd8e94bdf..a044d368a20 100644
--- a/tests/fsharpqa/Source/CompilerOptions/fsi/help/help40-nologo.437.1033.bsl
+++ b/tests/fsharpqa/Source/CompilerOptions/fsi/help/help40-nologo.437.1033.bsl
@@ -1,65 +1,67 @@
-Usage: Fsi.exe [script.fsx []]
+Usage: fsi.exe [script.fsx []]
- INPUT FILES -
---use: Use the given file on startup as initial input
---load: #load the given file on startup
---reference: Reference an assembly (Short form: -r)
--- ... Treat remaining arguments as command line
- arguments, accessed using fsi.CommandLineArgs
+--use: Use the given file on startup as initial input
+--load: #load the given file on startup
+--reference: Reference an assembly (Short form: -r)
+-- ... Treat remaining arguments as command line
+ arguments, accessed using fsi.CommandLineArgs
- CODE GENERATION -
---debug[+|-] Emit debug information (Short form: -g)
---debug:{full|pdbonly|portable} Specify debugging type: full, portable, pdbonly.
- ('pdbonly' is the default if no debuggging type
- specified and enables attaching a debugger to a
- running program. 'portable' is a cross-platform
- format).
---optimize[+|-] Enable optimizations (Short form: -O)
---tailcalls[+|-] Enable or disable tailcalls
---crossoptimize[+|-] Enable or disable cross-module optimizations
+--debug[+|-] Emit debug information (Short form: -g)
+--debug:{full|pdbonly|portable|embedded} Specify debugging type: full, portable,
+ embedded, pdbonly. ('pdbonly' is the default if
+ no debuggging type specified and enables
+ attaching a debugger to a running program,
+ 'portable' is a cross-platform format,
+ 'embedded' is a cross-platform format embedded
+ into the output file).
+--optimize[+|-] Enable optimizations (Short form: -O)
+--tailcalls[+|-] Enable or disable tailcalls
+--crossoptimize[+|-] Enable or disable cross-module optimizations
- ERRORS AND WARNINGS -
---warnaserror[+|-] Report all warnings as errors
---warnaserror[+|-]: Report specific warnings as errors
---warn: Set a warning level (0-5)
---nowarn: Disable specific warning messages
---warnon: Enable specific warnings that may be off by
- default
---consolecolors[+|-] Output warning and error messages in color
+--warnaserror[+|-] Report all warnings as errors
+--warnaserror[+|-]: Report specific warnings as errors
+--warn: Set a warning level (0-5)
+--nowarn: Disable specific warning messages
+--warnon: Enable specific warnings that may be off by
+ default
+--consolecolors[+|-] Output warning and error messages in color
- LANGUAGE -
---checked[+|-] Generate overflow checks
---define: Define conditional compilation symbols (Short
- form: -d)
---mlcompatibility Ignore ML compatibility warnings
+--checked[+|-] Generate overflow checks
+--define: Define conditional compilation symbols (Short
+ form: -d)
+--mlcompatibility Ignore ML compatibility warnings
- MISCELLANEOUS -
---nologo Suppress compiler copyright message
---help Display this usage message (Short form: -?)
+--nologo Suppress compiler copyright message
+--help Display this usage message (Short form: -?)
- ADVANCED -
---codepage: Specify the codepage used to read source files
---utf8output Output messages in UTF-8 encoding
---fullpaths Output messages with fully qualified paths
---lib: Specify a directory for the include path which
- is used to resolve source files and assemblies
- (Short form: -I)
---noframework Do not reference the default CLI assemblies by
- default
---exec Exit fsi after loading the files or running the
- .fsx script given on the command line
---gui[+|-] Execute interactions on a Windows Forms event
- loop (on by default)
---quiet Suppress fsi writing to stdout
---readline[+|-] Support TAB completion in console (on by
- default)
---quotations-debug[+|-] Emit debug information in quotations
---shadowcopyreferences[+|-] Prevents references from being locked by the F#
- Interactive process
\ No newline at end of file
+--codepage: Specify the codepage used to read source files
+--utf8output Output messages in UTF-8 encoding
+--fullpaths Output messages with fully qualified paths
+--lib: Specify a directory for the include path which
+ is used to resolve source files and assemblies
+ (Short form: -I)
+--noframework Do not reference the default CLI assemblies by
+ default
+--exec Exit fsi after loading the files or running the
+ .fsx script given on the command line
+--gui[+|-] Execute interactions on a Windows Forms event
+ loop (on by default)
+--quiet Suppress fsi writing to stdout
+--readline[+|-] Support TAB completion in console (on by
+ default)
+--quotations-debug[+|-] Emit debug information in quotations
+--shadowcopyreferences[+|-] Prevents references from being locked by the F#
+ Interactive process
diff --git a/tests/fsharpqa/Source/CompilerOptions/fsi/help/help40.437.1033.bsl b/tests/fsharpqa/Source/CompilerOptions/fsi/help/help40.437.1033.bsl
index 722596ffd71..a0d495ad635 100644
--- a/tests/fsharpqa/Source/CompilerOptions/fsi/help/help40.437.1033.bsl
+++ b/tests/fsharpqa/Source/CompilerOptions/fsi/help/help40.437.1033.bsl
@@ -1,67 +1,69 @@
-Microsoft (R) F# Interactive build 4.0.30319.17303
+Microsoft (R) F# Interactive version 4.1
Copyright (c) Microsoft Corporation. All Rights Reserved.
-Usage: Fsi.exe [script.fsx []]
+Usage: fsi.exe [script.fsx []]
- INPUT FILES -
---use: Use the given file on startup as initial input
---load: #load the given file on startup
---reference: Reference an assembly (Short form: -r)
--- ... Treat remaining arguments as command line
- arguments, accessed using fsi.CommandLineArgs
+--use: Use the given file on startup as initial input
+--load: #load the given file on startup
+--reference: Reference an assembly (Short form: -r)
+-- ... Treat remaining arguments as command line
+ arguments, accessed using fsi.CommandLineArgs
- CODE GENERATION -
---debug[+|-] Emit debug information (Short form: -g)
---debug:{full|pdbonly|portable} Specify debugging type: full, portable, pdbonly.
- ('pdbonly' is the default if no debuggging type
- specified and enables attaching a debugger to a
- running program. 'portable' is a cross-platform
- format).
---optimize[+|-] Enable optimizations (Short form: -O)
---tailcalls[+|-] Enable or disable tailcalls
---crossoptimize[+|-] Enable or disable cross-module optimizations
+--debug[+|-] Emit debug information (Short form: -g)
+--debug:{full|pdbonly|portable|embedded} Specify debugging type: full, portable,
+ embedded, pdbonly. ('pdbonly' is the default if
+ no debuggging type specified and enables
+ attaching a debugger to a running program,
+ 'portable' is a cross-platform format,
+ 'embedded' is a cross-platform format embedded
+ into the output file).
+--optimize[+|-] Enable optimizations (Short form: -O)
+--tailcalls[+|-] Enable or disable tailcalls
+--crossoptimize[+|-] Enable or disable cross-module optimizations
- ERRORS AND WARNINGS -
---warnaserror[+|-] Report all warnings as errors
---warnaserror[+|-]: Report specific warnings as errors
---warn: Set a warning level (0-5)
---nowarn: Disable specific warning messages
---warnon: Enable specific warnings that may be off by
- default
---consolecolors[+|-] Output warning and error messages in color
+--warnaserror[+|-] Report all warnings as errors
+--warnaserror[+|-]: Report specific warnings as errors
+--warn: Set a warning level (0-5)
+--nowarn: Disable specific warning messages
+--warnon: Enable specific warnings that may be off by
+ default
+--consolecolors[+|-] Output warning and error messages in color
- LANGUAGE -
---checked[+|-] Generate overflow checks
---define: Define conditional compilation symbols (Short
- form: -d)
---mlcompatibility Ignore ML compatibility warnings
+--checked[+|-] Generate overflow checks
+--define: Define conditional compilation symbols (Short
+ form: -d)
+--mlcompatibility Ignore ML compatibility warnings
- MISCELLANEOUS -
---nologo Suppress compiler copyright message
---help Display this usage message (Short form: -?)
+--nologo Suppress compiler copyright message
+--help Display this usage message (Short form: -?)
- ADVANCED -
---codepage: Specify the codepage used to read source files
---utf8output Output messages in UTF-8 encoding
---fullpaths Output messages with fully qualified paths
---lib: Specify a directory for the include path which
- is used to resolve source files and assemblies
- (Short form: -I)
---noframework Do not reference the default CLI assemblies by
- default
---exec Exit fsi after loading the files or running the
- .fsx script given on the command line
---gui[+|-] Execute interactions on a Windows Forms event
- loop (on by default)
---quiet Suppress fsi writing to stdout
---readline[+|-] Support TAB completion in console (on by
- default)
---quotations-debug[+|-] Emit debug information in quotations
---shadowcopyreferences[+|-] Prevents references from being locked by the F#
- Interactive process
\ No newline at end of file
+--codepage: Specify the codepage used to read source files
+--utf8output Output messages in UTF-8 encoding
+--fullpaths Output messages with fully qualified paths
+--lib: Specify a directory for the include path which
+ is used to resolve source files and assemblies
+ (Short form: -I)
+--noframework Do not reference the default CLI assemblies by
+ default
+--exec Exit fsi after loading the files or running the
+ .fsx script given on the command line
+--gui[+|-] Execute interactions on a Windows Forms event
+ loop (on by default)
+--quiet Suppress fsi writing to stdout
+--readline[+|-] Support TAB completion in console (on by
+ default)
+--quotations-debug[+|-] Emit debug information in quotations
+--shadowcopyreferences[+|-] Prevents references from being locked by the F#
+ Interactive process
diff --git a/tests/fsharpqa/Source/Conformance/DeclarationElements/LetBindings/Basic/ManyLetBindings.fs b/tests/fsharpqa/Source/Conformance/DeclarationElements/LetBindings/Basic/ManyLetBindings.fs
new file mode 100644
index 00000000000..f5ca30545c0
--- /dev/null
+++ b/tests/fsharpqa/Source/Conformance/DeclarationElements/LetBindings/Basic/ManyLetBindings.fs
@@ -0,0 +1,515 @@
+module TestCase
+open System
+
+let x0 = "0"
+let x1 = "1"
+let x2 = "2"
+let x3 = "3"
+let x4 = "4"
+let x5 = "5"
+let x6 = "6"
+let x7 = "7"
+let x8 = "8"
+let x9 = "9"
+let x10 = "10"
+let x11 = "11"
+let x12 = "12"
+let x13 = "13"
+let x14 = "14"
+let x15 = "15"
+let x16 = "16"
+let x17 = "17"
+let x18 = "18"
+let x19 = "19"
+let x20 = "20"
+let x21 = "21"
+let x22 = "22"
+let x23 = "23"
+let x24 = "24"
+let x25 = "25"
+let x26 = "26"
+let x27 = "27"
+let x28 = "28"
+let x29 = "29"
+let x30 = "30"
+let x31 = "31"
+let x32 = "32"
+let x33 = "33"
+let x34 = "34"
+let x35 = "35"
+let x36 = "36"
+let x37 = "37"
+let x38 = "38"
+let x39 = "39"
+let x40 = "40"
+let x41 = "41"
+let x42 = "42"
+let x43 = "43"
+let x44 = "44"
+let x45 = "45"
+let x46 = "46"
+let x47 = "47"
+let x48 = "48"
+let x49 = "49"
+let x50 = "50"
+let x51 = "51"
+let x52 = "52"
+let x53 = "53"
+let x54 = "54"
+let x55 = "55"
+let x56 = "56"
+let x57 = "57"
+let x58 = "58"
+let x59 = "59"
+let x60 = "60"
+let x61 = "61"
+let x62 = "62"
+let x63 = "63"
+let x64 = "64"
+let x65 = "65"
+let x66 = "66"
+let x67 = "67"
+let x68 = "68"
+let x69 = "69"
+let x70 = "70"
+let x71 = "71"
+let x72 = "72"
+let x73 = "73"
+let x74 = "74"
+let x75 = "75"
+let x76 = "76"
+let x77 = "77"
+let x78 = "78"
+let x79 = "79"
+let x80 = "80"
+let x81 = "81"
+let x82 = "82"
+let x83 = "83"
+let x84 = "84"
+let x85 = "85"
+let x86 = "86"
+let x87 = "87"
+let x88 = "88"
+let x89 = "89"
+let x90 = "90"
+let x91 = "91"
+let x92 = "92"
+let x93 = "93"
+let x94 = "94"
+let x95 = "95"
+let x96 = "96"
+let x97 = "97"
+let x98 = "98"
+let x99 = "99"
+let x100 = "100"
+let x101 = "101"
+let x102 = "102"
+let x103 = "103"
+let x104 = "104"
+let x105 = "105"
+let x106 = "106"
+let x107 = "107"
+let x108 = "108"
+let x109 = "109"
+let x110 = "110"
+let x111 = "111"
+let x112 = "112"
+let x113 = "113"
+let x114 = "114"
+let x115 = "115"
+let x116 = "116"
+let x117 = "117"
+let x118 = "118"
+let x119 = "119"
+let x120 = "120"
+let x121 = "121"
+let x122 = "122"
+let x123 = "123"
+let x124 = "124"
+let x125 = "125"
+let x126 = "126"
+let x127 = "127"
+let x128 = "128"
+let x129 = "129"
+let x130 = "130"
+let x131 = "131"
+let x132 = "132"
+let x133 = "133"
+let x134 = "134"
+let x135 = "135"
+let x136 = "136"
+let x137 = "137"
+let x138 = "138"
+let x139 = "139"
+let x140 = "140"
+let x141 = "141"
+let x142 = "142"
+let x143 = "143"
+let x144 = "144"
+let x145 = "145"
+let x146 = "146"
+let x147 = "147"
+let x148 = "148"
+let x149 = "149"
+let x150 = "150"
+let x151 = "151"
+let x152 = "152"
+let x153 = "153"
+let x154 = "154"
+let x155 = "155"
+let x156 = "156"
+let x157 = "157"
+let x158 = "158"
+let x159 = "159"
+let x160 = "160"
+let x161 = "161"
+let x162 = "162"
+let x163 = "163"
+let x164 = "164"
+let x165 = "165"
+let x166 = "166"
+let x167 = "167"
+let x168 = "168"
+let x169 = "169"
+let x170 = "170"
+let x171 = "171"
+let x172 = "172"
+let x173 = "173"
+let x174 = "174"
+let x175 = "175"
+let x176 = "176"
+let x177 = "177"
+let x178 = "178"
+let x179 = "179"
+let x180 = "180"
+let x181 = "181"
+let x182 = "182"
+let x183 = "183"
+let x184 = "184"
+let x185 = "185"
+let x186 = "186"
+let x187 = "187"
+let x188 = "188"
+let x189 = "189"
+let x190 = "190"
+let x191 = "191"
+let x192 = "192"
+let x193 = "193"
+let x194 = "194"
+let x195 = "195"
+let x196 = "196"
+let x197 = "197"
+let x198 = "198"
+let x199 = "199"
+let x200 = "200"
+let x201 = "201"
+let x202 = "202"
+let x203 = "203"
+let x204 = "204"
+let x205 = "205"
+let x206 = "206"
+let x207 = "207"
+let x208 = "208"
+let x209 = "209"
+let x210 = "210"
+let x211 = "211"
+let x212 = "212"
+let x213 = "213"
+let x214 = "214"
+let x215 = "215"
+let x216 = "216"
+let x217 = "217"
+let x218 = "218"
+let x219 = "219"
+let x220 = "220"
+let x221 = "221"
+let x222 = "222"
+let x223 = "223"
+let x224 = "224"
+let x225 = "225"
+let x226 = "226"
+let x227 = "227"
+let x228 = "228"
+let x229 = "229"
+let x230 = "230"
+let x231 = "231"
+let x232 = "232"
+let x233 = "233"
+let x234 = "234"
+let x235 = "235"
+let x236 = "236"
+let x237 = "237"
+let x238 = "238"
+let x239 = "239"
+let x240 = "240"
+let x241 = "241"
+let x242 = "242"
+let x243 = "243"
+let x244 = "244"
+let x245 = "245"
+let x246 = "246"
+let x247 = "247"
+let x248 = "248"
+let x249 = "249"
+let x250 = "250"
+let x251 = "251"
+let x252 = "252"
+let x253 = "253"
+let x254 = "254"
+let x255 = "255"
+let x256 = "256"
+let x257 = "257"
+let x258 = "258"
+let x259 = "259"
+let x260 = "260"
+let x261 = "261"
+let x262 = "262"
+let x263 = "263"
+let x264 = "264"
+let x265 = "265"
+let x266 = "266"
+let x267 = "267"
+let x268 = "268"
+let x269 = "269"
+let x270 = "270"
+let x271 = "271"
+let x272 = "272"
+let x273 = "273"
+let x274 = "274"
+let x275 = "275"
+let x276 = "276"
+let x277 = "277"
+let x278 = "278"
+let x279 = "279"
+let x280 = "280"
+let x281 = "281"
+let x282 = "282"
+let x283 = "283"
+let x284 = "284"
+let x285 = "285"
+let x286 = "286"
+let x287 = "287"
+let x288 = "288"
+let x289 = "289"
+let x290 = "290"
+let x291 = "291"
+let x292 = "292"
+let x293 = "293"
+let x294 = "294"
+let x295 = "295"
+let x296 = "296"
+let x297 = "297"
+let x298 = "298"
+let x299 = "299"
+let x300 = "300"
+let x301 = "301"
+let x302 = "302"
+let x303 = "303"
+let x304 = "304"
+let x305 = "305"
+let x306 = "306"
+let x307 = "307"
+let x308 = "308"
+let x309 = "309"
+let x310 = "310"
+let x311 = "311"
+let x312 = "312"
+let x313 = "313"
+let x314 = "314"
+let x315 = "315"
+let x316 = "316"
+let x317 = "317"
+let x318 = "318"
+let x319 = "319"
+let x320 = "320"
+let x321 = "321"
+let x322 = "322"
+let x323 = "323"
+let x324 = "324"
+let x325 = "325"
+let x326 = "326"
+let x327 = "327"
+let x328 = "328"
+let x329 = "329"
+let x330 = "330"
+let x331 = "331"
+let x332 = "332"
+let x333 = "333"
+let x334 = "334"
+let x335 = "335"
+let x336 = "336"
+let x337 = "337"
+let x338 = "338"
+let x339 = "339"
+let x340 = "340"
+let x341 = "341"
+let x342 = "342"
+let x343 = "343"
+let x344 = "344"
+let x345 = "345"
+let x346 = "346"
+let x347 = "347"
+let x348 = "348"
+let x349 = "349"
+let x350 = "350"
+let x351 = "351"
+let x352 = "352"
+let x353 = "353"
+let x354 = "354"
+let x355 = "355"
+let x356 = "356"
+let x357 = "357"
+let x358 = "358"
+let x359 = "359"
+let x360 = "360"
+let x361 = "361"
+let x362 = "362"
+let x363 = "363"
+let x364 = "364"
+let x365 = "365"
+let x366 = "366"
+let x367 = "367"
+let x368 = "368"
+let x369 = "369"
+let x370 = "370"
+let x371 = "371"
+let x372 = "372"
+let x373 = "373"
+let x374 = "374"
+let x375 = "375"
+let x376 = "376"
+let x377 = "377"
+let x378 = "378"
+let x379 = "379"
+let x380 = "380"
+let x381 = "381"
+let x382 = "382"
+let x383 = "383"
+let x384 = "384"
+let x385 = "385"
+let x386 = "386"
+let x387 = "387"
+let x388 = "388"
+let x389 = "389"
+let x390 = "390"
+let x391 = "391"
+let x392 = "392"
+let x393 = "393"
+let x394 = "394"
+let x395 = "395"
+let x396 = "396"
+let x397 = "397"
+let x398 = "398"
+let x399 = "399"
+let x400 = "400"
+let x401 = "401"
+let x402 = "402"
+let x403 = "403"
+let x404 = "404"
+let x405 = "405"
+let x406 = "406"
+let x407 = "407"
+let x408 = "408"
+let x409 = "409"
+let x410 = "410"
+let x411 = "411"
+let x412 = "412"
+let x413 = "413"
+let x414 = "414"
+let x415 = "415"
+let x416 = "416"
+let x417 = "417"
+let x418 = "418"
+let x419 = "419"
+let x420 = "420"
+let x421 = "421"
+let x422 = "422"
+let x423 = "423"
+let x424 = "424"
+let x425 = "425"
+let x426 = "426"
+let x427 = "427"
+let x428 = "428"
+let x429 = "429"
+let x430 = "430"
+let x431 = "431"
+let x432 = "432"
+let x433 = "433"
+let x434 = "434"
+let x435 = "435"
+let x436 = "436"
+let x437 = "437"
+let x438 = "438"
+let x439 = "439"
+let x440 = "440"
+let x441 = "441"
+let x442 = "442"
+let x443 = "443"
+let x444 = "444"
+let x445 = "445"
+let x446 = "446"
+let x447 = "447"
+let x448 = "448"
+let x449 = "449"
+let x450 = "450"
+let x451 = "451"
+let x452 = "452"
+let x453 = "453"
+let x454 = "454"
+let x455 = "455"
+let x456 = "456"
+let x457 = "457"
+let x458 = "458"
+let x459 = "459"
+let x460 = "460"
+let x461 = "461"
+let x462 = "462"
+let x463 = "463"
+let x464 = "464"
+let x465 = "465"
+let x466 = "466"
+let x467 = "467"
+let x468 = "468"
+let x469 = "469"
+let x470 = "470"
+let x471 = "471"
+let x472 = "472"
+let x473 = "473"
+let x474 = "474"
+let x475 = "475"
+let x476 = "476"
+let x477 = "477"
+let x478 = "478"
+let x479 = "479"
+let x480 = "480"
+let x481 = "481"
+let x482 = "482"
+let x483 = "483"
+let x484 = "484"
+let x485 = "485"
+let x486 = "486"
+let x487 = "487"
+let x488 = "488"
+let x489 = "489"
+let x490 = "490"
+let x491 = "491"
+let x492 = "492"
+let x493 = "493"
+let x494 = "494"
+let x495 = "495"
+let x496 = "496"
+let x497 = "497"
+let x498 = "498"
+let x499 = "499"
+let x500 = "500"
+let x501 = "501"
+let x502 = "502"
+let x503 = "503"
+let x504 = "504"
+let x505 = "505"
+let x506 = "506"
+let x507 = "507"
+let x508 = "508"
+let x509 = "509"
+let x510 = "510"
+let x511 = "511"
diff --git a/tests/fsharpqa/Source/Conformance/DeclarationElements/LetBindings/Basic/env.lst b/tests/fsharpqa/Source/Conformance/DeclarationElements/LetBindings/Basic/env.lst
index 97702ef99d1..1b523e68034 100644
--- a/tests/fsharpqa/Source/Conformance/DeclarationElements/LetBindings/Basic/env.lst
+++ b/tests/fsharpqa/Source/Conformance/DeclarationElements/LetBindings/Basic/env.lst
@@ -4,6 +4,8 @@
SOURCE=Pathological04.fs SCFLAGS=-a # Pathological04.fs
SOURCE=E_Pathological05.fs SCFLAGS=--test:ErrorRanges # E_Pathological05.fs
SOURCE=E_Pathological06.fs SCFLAGS=--test:ErrorRanges # E_Pathological06.fs
+
+ SOURCE=ManyLetBindings.fs SCFLAGS="--debug:full --optimize-" # ManyLetBindings.fs
SOURCE=SanityCheck.fs # SanityCheck.fs
SOURCE=nestedLetBindings.fs # nestedLetBindings.fs
diff --git a/vsintegration/Vsix/VisualFSharpOpenSource/Source.extension.vsixmanifest b/vsintegration/Vsix/VisualFSharpOpenSource/Source.extension.vsixmanifest
new file mode 100644
index 00000000000..24a4f84aadf
--- /dev/null
+++ b/vsintegration/Vsix/VisualFSharpOpenSource/Source.extension.vsixmanifest
@@ -0,0 +1,66 @@
+
+
+
+
+
+ Visual F# Tools
+ Deploy Visual F# Tools templates to Visual Studio
+ ..\CommonExtensions\Microsoft\FSharp
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/vsintegration/Vsix/VisualFSharpOpenSource/VisualFSharpOpenSource.csproj b/vsintegration/Vsix/VisualFSharpOpenSource/VisualFSharpOpenSource.csproj
new file mode 100644
index 00000000000..5b0cf6abe64
--- /dev/null
+++ b/vsintegration/Vsix/VisualFSharpOpenSource/VisualFSharpOpenSource.csproj
@@ -0,0 +1,316 @@
+
+
+
+
+ ..\..\..\src
+ net40
+ 15.0
+ 11.0
+ $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)
+
+
+ 15.0
+ 2.0
+ true
+ {82b43b9b-a64c-4715-b499-d71e9ca2bd60};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+
+
+ publish\
+ true
+ Disk
+ false
+ Foreground
+ 7
+ Days
+ true
+ false
+ true
+ 0
+ v4.6
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ true
+ None
+ Debug
+ AnyCPU
+ Library
+ Properties
+ FSharpDev
+ true
+ False
+ True
+ {E6A45CDF-B408-420F-B475-74611BEFC52B}
+ true
+ VisualFSharpOpenSource
+ $(FSharpSourcesRoot)\..\$(Configuration)\$(TargetFramework)\bin
+ VisualFSharpOpenSource
+ $(RootBinPath)
+ 15.4.1.0
+ cs
+
+
+ Program
+ $(DevEnvDir)devenv.exe
+ /rootsuffix $(VSRootSuffix) /log
+ $(VSRootSuffix)
+ true
+
+
+ Program
+ $(DevEnvDir)devenv.exe
+ true
+ /rootsuffix $(VSRootSuffix) /log
+ $(VSRootSuffix)
+
+
+
+ Designer
+
+
+ Always
+ true
+ RegisterFsharpPackage.pkgdef
+
+
+ PreserveNewest
+ true
+
+
+
+
+ False
+ Microsoft .NET Framework 4.6 %28x86 and x64%29
+ true
+
+
+ False
+ .NET Framework 3.5 SP1 Client Profile
+ false
+
+
+ False
+ .NET Framework 3.5 SP1
+ false
+
+
+
+
+ {649FA588-F02E-457C-9FCF-87E46407481E}
+ FSharp.Compiler.Interactive.Settings
+ BuiltProjectOutputGroup%3bGetCopyToOutputDirectoryItems%3bSatelliteDllsProjectOutputGroup%3b
+ DebugSymbolsProjectOutputGroup%3b
+ True
+
+
+ {D5870CF0-ED51-4CBC-B3D7-6F56DA84AC06}
+ FSharp.Compiler.Server.Shared
+ BuiltProjectOutputGroup%3bGetCopyToOutputDirectoryItems%3bSatelliteDllsProjectOutputGroup%3bPkgDefProjectOutputGroup%3b
+ DebugSymbolsProjectOutputGroup%3b
+ True
+
+
+ {2E4D67B4-522D-4CF7-97E4-BA940F0B18F3}
+ FSharp.Compiler
+ BuiltProjectOutputGroup%3bGetCopyToOutputDirectoryItems%3bSatelliteDllsProjectOutputGroup%3b
+ DebugSymbolsProjectOutputGroup%3b
+ True
+
+
+ {DED3BBD7-53F4-428A-8C9F-27968E768605}
+ FSharp.Core
+ BuiltProjectOutputGroup%3bGetCopyToOutputDirectoryItems%3bSatelliteDllsProjectOutputGroup%3b
+ DebugSymbolsProjectOutputGroup%3b
+ True
+
+
+ {A437A6EC-5323-47C2-8F86-E2CAC54FF152}
+ FSharp.LanguageService.Compiler
+ BuiltProjectOutputGroup%3bGetCopyToOutputDirectoryItems%3bSatelliteDllsProjectOutputGroup%3bPkgDefProjectOutputGroup%3b
+ DebugSymbolsProjectOutputGroup%3b
+ True
+
+
+ {8B3E283D-B5FE-4055-9D80-7E3A32F3967B}
+ FsiAnyCPU
+ BuiltProjectOutputGroup%3bGetCopyToOutputDirectoryItems%3bSatelliteDllsProjectOutputGroup%3b
+ DebugSymbolsProjectOutputGroup%3b
+ True
+
+
+ {D0E98C0D-490B-4C61-9329-0862F6E87645}
+ Fsi
+ BuiltProjectOutputGroup%3bGetCopyToOutputDirectoryItems%3bSatelliteDllsProjectOutputGroup%3b
+ DebugSymbolsProjectOutputGroup%3b
+ True
+
+
+ {65e0e82a-eace-4787-8994-888674c2fe87}
+ FSharp.Editor
+ BuiltProjectOutputGroup%3bGetCopyToOutputDirectoryItems%3bSatelliteDllsProjectOutputGroup%3bPkgDefProjectOutputGroup%3b
+ DebugSymbolsProjectOutputGroup%3b
+ True
+
+
+ {1C5C163C-37EA-4A3C-8CCC-0D34B74BF8EF}
+ FSharp.LanguageService.Base
+ BuiltProjectOutputGroup%3bGetCopyToOutputDirectoryItems%3bSatelliteDllsProjectOutputGroup%3bPkgDefProjectOutputGroup%3b
+ DebugSymbolsProjectOutputGroup%3b
+ True
+
+
+ {EE85AAB7-CDA0-4C4E-BDA0-A64CCC413E3F}
+ FSharp.LanguageService
+ BuiltProjectOutputGroup%3bGetCopyToOutputDirectoryItems%3bSatelliteDllsProjectOutputGroup%3bPkgDefProjectOutputGroup%3b
+ DebugSymbolsProjectOutputGroup%3b
+ True
+
+
+ {B700E38B-F8C0-4E49-B5EC-DB7B7AC0C4E7}
+ ProjectSystem.Base
+ BuiltProjectOutputGroup%3bGetCopyToOutputDirectoryItems%3bSatelliteDllsProjectOutputGroup%3bPkgDefProjectOutputGroup%3b
+ DebugSymbolsProjectOutputGroup%3b
+ True
+
+
+ {6196B0F8-CAEA-4CF1-AF82-1B520F77FE44}
+ ProjectSystem
+ BuiltProjectOutputGroup%3bGetCopyToOutputDirectoryItems%3bSatelliteDllsProjectOutputGroup%3bPkgDefProjectOutputGroup%3b
+ DebugSymbolsProjectOutputGroup%3b
+ True
+
+
+ {FCFB214C-462E-42B3-91CA-FC557EFEE74F}
+ FSharp.PropertiesPages
+ BuiltProjectOutputGroup%3bGetCopyToOutputDirectoryItems%3bSatelliteDllsProjectOutputGroup%3bPkgDefProjectOutputGroup%3b
+ DebugSymbolsProjectOutputGroup%3b
+ True
+
+
+ {991DCF75-C2EB-42B6-9A0D-AA1D2409D519}
+ FSharp.VS.FSI
+ BuiltProjectOutputGroup%3bGetCopyToOutputDirectoryItems%3bSatelliteDllsProjectOutputGroup%3bPkgDefProjectOutputGroup%3b
+ DebugSymbolsProjectOutputGroup%3b
+ True
+
+
+ {6ba13aa4-c25f-480f-856b-8e8000299a72}
+ AppConfig
+ ItemTemplates
+ TemplateProjectOutputGroup%3b
+ false
+ True
+
+
+ {12ac2813-e895-4aaa-ae6c-94e21da09f64}
+ CodeFile
+ ItemTemplates
+ TemplateProjectOutputGroup%3b
+ false
+ True
+
+
+ {a333b85a-dc23-49b6-9797-b89a7951e92d}
+ ScriptFile
+ ItemTemplates
+ TemplateProjectOutputGroup%3b
+ false
+ True
+
+
+ {e3fdd4ac-46b6-4b9f-b672-317d1202cc50}
+ SignatureFile
+ ItemTemplates
+ TemplateProjectOutputGroup%3b
+ false
+ True
+
+
+ {d11fc318-8f5d-4c8c-9287-ab40a016d13c}
+ TextFile
+ ItemTemplates
+ TemplateProjectOutputGroup%3b
+ false
+ True
+
+
+ {1fb1dd07-06aa-45b4-b5ac-20ff5bee98b6}
+ XMLFile
+ ItemTemplates
+ TemplateProjectOutputGroup%3b
+ false
+ True
+
+
+ {604f0daa-2d33-48dd-b162-edf0b672803d}
+ ConsoleProject
+ ProjectTemplates
+ TemplateProjectOutputGroup%3b
+ false
+ True
+
+
+ {01678cda-a11f-4dee-9344-2edf91cf1ae7}
+ LibraryProject
+ ProjectTemplates
+ TemplateProjectOutputGroup%3b
+ false
+ True
+
+
+ {d9d95330-3626-4199-b7af-17b8e4af6d87}
+ NetCore259Project
+ ProjectTemplates
+ TemplateProjectOutputGroup%3b
+ false
+ True
+
+
+ {1a8dbf70-4178-4ae3-af5f-39ddd5692210}
+ NetCore78Project
+ ProjectTemplates
+ TemplateProjectOutputGroup%3b
+ false
+ True
+
+
+ {5b739cf3-1116-4eb4-b598-6c16bea81ce5}
+ NetCoreProject
+ ProjectTemplates
+ TemplateProjectOutputGroup%3b
+ false
+ True
+
+
+ {db374a0c-7560-479f-9b21-d37c81f7624f}
+ PortableLibraryProject
+ ProjectTemplates
+ TemplateProjectOutputGroup%3b
+ false
+ True
+
+
+ {2facee44-48bd-40b5-a2ee-b54a0c9bb7c4}
+ TutorialProject
+ ProjectTemplates
+ TemplateProjectOutputGroup%3b
+ false
+ True
+
+
+
+
+
+
+
+
+ VsixSHA2
+
+
+
+
\ No newline at end of file
diff --git a/vsintegration/fsharp-vsintegration-vsix-build.proj b/vsintegration/fsharp-vsintegration-vsix-build.proj
index 96cc78da026..d2588f7bd66 100644
--- a/vsintegration/fsharp-vsintegration-vsix-build.proj
+++ b/vsintegration/fsharp-vsintegration-vsix-build.proj
@@ -8,6 +8,7 @@
+