未验证 提交 072d7310 编写于 作者: K Kevin Ransom (msft) 提交者: GitHub

Merge pull request #8103 from dotnet/merges/master-to-release/dev16.5

Merge master to release/dev16.5
<Project> <Project>
<Import Project="Sdk.targets" Sdk="Microsoft.DotNet.Arcade.Sdk" /> <Import Project="Sdk.targets" Sdk="Microsoft.DotNet.Arcade.Sdk" />
<Import Project="eng\targets\Imports.targets" /> <Import Project="eng\targets\Imports.targets" />
<Import Project="eng\targets\NuGet.targets" /> <Import Project="eng\targets\NuGet.targets" />
...@@ -8,7 +9,7 @@ ...@@ -8,7 +9,7 @@
<Target Name="NoneSubstituteTextFiles" <Target Name="NoneSubstituteTextFiles"
Inputs="@(NoneSubstituteText)" Inputs="@(NoneSubstituteText)"
Outputs="@(NoneSubstituteText->'$(IntermediateOutputPath)%(Filename)%(Extension)')" Outputs="@(NoneSubstituteText->'$(IntermediateOutputPath)%(Filename)%(Extension)')"
BeforeTargets="AssignTargetPaths;BeforeBuild"> BeforeTargets="AssignTargetPaths;BeforeBuild;GenerateFSharpTextResources">
<PropertyGroup> <PropertyGroup>
<__TargetFilePath>@(NoneSubstituteText->'$(IntermediateOutputPath)%(Filename)%(Extension)')</__TargetFilePath> <__TargetFilePath>@(NoneSubstituteText->'$(IntermediateOutputPath)%(Filename)%(Extension)')</__TargetFilePath>
...@@ -20,16 +21,19 @@ ...@@ -20,16 +21,19 @@
<_CopyToOutputDirectory Condition="'%(NoneSubstituteText.CopyToOutputDirectory)' != ''">%(NoneSubstituteText.CopyToOutputDirectory)</_CopyToOutputDirectory> <_CopyToOutputDirectory Condition="'%(NoneSubstituteText.CopyToOutputDirectory)' != ''">%(NoneSubstituteText.CopyToOutputDirectory)</_CopyToOutputDirectory>
<_CopyToOutputDirectory Condition="'%(NoneSubstituteText.CopyToOutputDirectory)' == ''">Never</_CopyToOutputDirectory> <_CopyToOutputDirectory Condition="'%(NoneSubstituteText.CopyToOutputDirectory)' == ''">Never</_CopyToOutputDirectory>
<_IncludeInVsix>false</_IncludeInVsix>
<_IncludeInVsix Condition="'%(NoneSubstituteText.IncludeInVsix)' == 'true'">true</_IncludeInVsix>
</PropertyGroup> </PropertyGroup>
<MakeDir Directories="$(IntermediateOutputPath)" <MakeDir Directories="$(IntermediateOutputPath)"
Condition="!Exists('$(IntermediateOutputPath)')" /> Condition="!Exists('$(IntermediateOutputPath)')" />
<WriteLinesToFile File="$(__TargetFilePath)" Lines="$(_ReplacementText)" Overwrite="true" WriteOnlyWhenDifferent="true" /> <WriteLinesToFile File="$(__TargetFilePath)" Lines="$(_ReplacementText)" Overwrite="true" WriteOnlyWhenDifferent="true" />
<!-- Make sure it will get cleaned --> <ItemGroup>
<ItemGroup >
<None Include="$(__TargetFilePath)" CopyToOutputDirectory="$(_CopyToOutputDirectory)" /> <None Include="$(__TargetFilePath)" CopyToOutputDirectory="$(_CopyToOutputDirectory)" />
<FileWrites Include="$(__TargetFilePath)" Condition="'$(__TargetFileName)' != 'App.config'" /> <FileWrites Include="$(__TargetFilePath)" Condition="'$(__TargetFileName)' != 'App.config'" />
<Content Include="$(__TargetFilePath)" CopyToOutputDirectory="Always" IncludeInVsix="true" />
</ItemGroup> </ItemGroup>
</Target> </Target>
...@@ -61,4 +65,27 @@ ...@@ -61,4 +65,27 @@
</ItemGroup> </ItemGroup>
</Target> </Target>
<Target Name="BeforeResGen"
Inputs="@(EmbeddedResource->'$(IntermediateOutputPath)%(Filename)%(Extension)')"
Outputs="@(EmbeddedResource->'$(IntermediateOutputPath)resources\%(Filename)%(Extension)')"
DependsOnTargets="CopyVsixResources"
Condition="'$(Configuration)' != 'Proto' and '$(Language)'=='F#' and '$(DisableCompilerRedirection)' != 'true' ">
<SubstituteText EmbeddedResources="@(EmbeddedResource)">
<Output TaskParameter="CopiedFiles" ItemName="CopiedFiles" />
</SubstituteText>
<ItemGroup>
<EmbeddedResource Remove="@(EmbeddedResource)"/>
<EmbeddedResource Include="@(CopiedFiles)"/>
</ItemGroup>
<MakeDir Directories="$(IntermediateOutputPath)" Condition="!Exists('$(IntermediateOutputPath)')" />
<MakeDir Directories="$(IntermediateOutputPath)resources\" Condition="!Exists('$(IntermediateOutputPath)resources\')" />
</Target>
<Target Name="CopyVsixResources">
<Copy SourceFiles="@(CopyVsixResources)" DestinationFolder="$(IntermediateOutputPath)\resources\Resources" />
</Target>
</Project> </Project>
...@@ -66,16 +66,16 @@ Target.create "Build" (fun _ -> ...@@ -66,16 +66,16 @@ Target.create "Build" (fun _ ->
runDotnet __SOURCE_DIRECTORY__ "build" "../src/buildtools/buildtools.proj -v n -c Proto" runDotnet __SOURCE_DIRECTORY__ "build" "../src/buildtools/buildtools.proj -v n -c Proto"
let fslexPath = __SOURCE_DIRECTORY__ + "/../artifacts/bin/fslex/Proto/netcoreapp2.1/fslex.dll" let fslexPath = __SOURCE_DIRECTORY__ + "/../artifacts/bin/fslex/Proto/netcoreapp2.1/fslex.dll"
let fsyaccPath = __SOURCE_DIRECTORY__ + "/../artifacts/bin/fsyacc/Proto/netcoreapp2.1/fsyacc.dll" let fsyaccPath = __SOURCE_DIRECTORY__ + "/../artifacts/bin/fsyacc/Proto/netcoreapp2.1/fsyacc.dll"
runDotnet __SOURCE_DIRECTORY__ "build" (sprintf "FSharp.Compiler.Service.sln -v n -c Release /p:FsLexPath=%s /p:FsYaccPath=%s" fslexPath fsyaccPath) runDotnet __SOURCE_DIRECTORY__ "build" (sprintf "FSharp.Compiler.Service.sln -nodereuse:false -v n -c Release /p:DisableCompilerRedirection=true /p:FsLexPath=%s /p:FsYaccPath=%s" fslexPath fsyaccPath)
) )
Target.create "Test" (fun _ -> Target.create "Test" (fun _ ->
// This project file is used for the netcoreapp2.0 tests to work out reference sets // This project file is used for the netcoreapp2.0 tests to work out reference sets
runDotnet __SOURCE_DIRECTORY__ "build" "../tests/projects/Sample_NETCoreSDK_FSharp_Library_netstandard2_0/Sample_NETCoreSDK_FSharp_Library_netstandard2_0.fsproj -v n /restore /p:DisableCompilerRedirection=true" runDotnet __SOURCE_DIRECTORY__ "build" "../tests/projects/Sample_NETCoreSDK_FSharp_Library_netstandard2_0/Sample_NETCoreSDK_FSharp_Library_netstandard2_0.fsproj -nodereuse:false -v n /restore /p:DisableCompilerRedirection=true"
// Now run the tests // Now run the tests
let logFilePath = Path.Combine(__SOURCE_DIRECTORY__, "..", "artifacts", "TestResults", "Release", "FSharp.Compiler.Service.Test.xml") let logFilePath = Path.Combine(__SOURCE_DIRECTORY__, "..", "artifacts", "TestResults", "Release", "FSharp.Compiler.Service.Test.xml")
runDotnet __SOURCE_DIRECTORY__ "test" (sprintf "FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.Tests.fsproj --no-restore --no-build -v n -c Release --test-adapter-path . --logger \"nunit;LogFilePath=%s\"" logFilePath) runDotnet __SOURCE_DIRECTORY__ "test" (sprintf "FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.Tests.fsproj --no-restore --no-build -nodereuse:false -v n -c Release --test-adapter-path . --logger \"nunit;LogFilePath=%s\"" logFilePath)
) )
Target.create "NuGet" (fun _ -> Target.create "NuGet" (fun _ ->
......
...@@ -26,6 +26,7 @@ ...@@ -26,6 +26,7 @@
<Compile Include="FSharpEmbedResXSource.fs" /> <Compile Include="FSharpEmbedResXSource.fs" />
<Compile Include="WriteCodeFragment.fs" /> <Compile Include="WriteCodeFragment.fs" />
<Compile Include="CreateFSharpManifestResourceName.fs" /> <Compile Include="CreateFSharpManifestResourceName.fs" />
<Compile Include="SubstituteText.fs" />
<None Include="Microsoft.FSharp.Targets" CopyToOutputDirectory="PreserveNewest" /> <None Include="Microsoft.FSharp.Targets" CopyToOutputDirectory="PreserveNewest" />
<None Include="Microsoft.Portable.FSharp.Targets" CopyToOutputDirectory="PreserveNewest" /> <None Include="Microsoft.Portable.FSharp.Targets" CopyToOutputDirectory="PreserveNewest" />
<None Include="Microsoft.FSharp.NetSdk.targets" CopyToOutputDirectory="PreserveNewest" /> <None Include="Microsoft.FSharp.NetSdk.targets" CopyToOutputDirectory="PreserveNewest" />
......
...@@ -29,6 +29,7 @@ this file. ...@@ -29,6 +29,7 @@ this file.
<UsingTask TaskName="CreateFSharpManifestResourceName" AssemblyFile="$(FSharpBuildAssemblyFile)" /> <UsingTask TaskName="CreateFSharpManifestResourceName" AssemblyFile="$(FSharpBuildAssemblyFile)" />
<UsingTask TaskName="WriteCodeFragment" AssemblyFile="$(FSharpBuildAssemblyFile)" /> <UsingTask TaskName="WriteCodeFragment" AssemblyFile="$(FSharpBuildAssemblyFile)" />
<UsingTask TaskName="FSharpPlatformInformation" AssemblyFile="$(FSharpBuildAssemblyFile)" /> <UsingTask TaskName="FSharpPlatformInformation" AssemblyFile="$(FSharpBuildAssemblyFile)" />
<UsingTask TaskName="SubstituteText" AssemblyFile="$(FSharpBuildAssemblyFile)" />
<PropertyGroup> <PropertyGroup>
<ImportByWildcardBeforeMicrosoftFSharpTargets Condition="'$(ImportByWildcardBeforeMicrosoftFSharpTargets)' == ''">true</ImportByWildcardBeforeMicrosoftFSharpTargets> <ImportByWildcardBeforeMicrosoftFSharpTargets Condition="'$(ImportByWildcardBeforeMicrosoftFSharpTargets)' == ''">true</ImportByWildcardBeforeMicrosoftFSharpTargets>
......
// Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information.
namespace FSharp.Build
open System
open System.Collections
open System.IO
open Microsoft.Build.Framework
open Microsoft.Build.Utilities
type SubstituteText () =
let mutable _buildEngine : IBuildEngine = null
let mutable _hostObject : ITaskHost = null
let mutable copiedFiles = new ResizeArray<ITaskItem>()
let mutable embeddedResources : ITaskItem[] = [||]
[<Required>]
member this.EmbeddedResources
with get() = embeddedResources
and set(value) = embeddedResources <- value
[<Output>]
member this.CopiedFiles
with get() = copiedFiles.ToArray()
interface ITask with
member this.BuildEngine
with get() = _buildEngine
and set(value) = _buildEngine <- value
member this.HostObject
with get() = _hostObject
and set(value) = _hostObject <- value
member this.Execute() =
copiedFiles.Clear()
if not(isNull embeddedResources) then
for item in embeddedResources do
// Update ITaskItem metadata to point to new location
let sourcePath = item.GetMetadata("FullPath")
let pattern1 = item.GetMetadata("Pattern1")
let pattern2 = item.GetMetadata("Pattern2")
// Is there any replacement to do?
if not (String.IsNullOrWhiteSpace(pattern1) && String.IsNullOrWhiteSpace(pattern2)) then
if not(String.IsNullOrWhiteSpace(sourcePath)) then
try
let getTargetPathFrom key =
let md = item.GetMetadata(key)
let path = Path.GetDirectoryName(md)
let filename = Path.GetFileName(md)
let target = Path.Combine(path, @"..\resources", filename)
target
// Copy from the location specified in Identity
let sourcePath=item.GetMetadata("Identity")
// Copy to the location specified in TargetPath unless no TargetPath is provided, then use Identity
let targetPath=
let identityPath = getTargetPathFrom "Identity"
let intermediateTargetPath = item.GetMetadata("IntermediateTargetPath")
if not (String.IsNullOrWhiteSpace(intermediateTargetPath)) then
let filename = Path.GetFileName(identityPath)
let target = Path.Combine(intermediateTargetPath, filename)
target
else
identityPath
item.ItemSpec <- targetPath
// Transform file
let mutable contents = File.ReadAllText(sourcePath)
if not (String.IsNullOrWhiteSpace(pattern1)) then
let replacement = item.GetMetadata("Replacement1")
contents <- contents.Replace(pattern1, replacement)
if not (String.IsNullOrWhiteSpace(pattern2)) then
let replacement = item.GetMetadata("Replacement2")
contents <- contents.Replace(pattern2, replacement)
let directory = Path.GetDirectoryName(targetPath)
if not(Directory.Exists(directory)) then
Directory.CreateDirectory(directory) |>ignore
File.WriteAllText(targetPath, contents)
with
| _ -> ()
copiedFiles.Add(item)
true
此差异已折叠。
// Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information.
namespace FSharp.Compiler.UnitTests.CodeGen.EmittedIL
open System.IO
open System.Reflection
open FSharp.Compiler.UnitTests
open NUnit.Framework
[<TestFixture>]
module StaticLinkTests =
[<Test>]
let ``Static link simple library``() =
let module1 =
let source =
"""
module Module1
type C() = class end
"""
Compilation.Create(source, Fsx, Library)
let module2 =
let source =
"""
let y = Module1.C()
printfn "%A" y
"""
Compilation.Create(source, Fsx, Exe, cmplRefs=[CompilationReference.CreateFSharp(module1, staticLink=true)])
CompilerAssert.Execute(module2,
beforeExecute=(fun _ deps ->
deps
|> List.iter (fun dep -> try File.Delete dep with | _ -> ())))
[<Test>]
let ``Simple exe should fail to execute if dependency was not found and is not statically linked``() =
let module1 =
let source =
"""
module Module1
type C() = class end
"""
Compilation.Create(source, Fsx, Library)
let module2 =
let source =
"""
let y = Module1.C()
printfn "%A" y
"""
Compilation.Create(source, Fsx, Exe, cmplRefs=[CompilationReference.CreateFSharp module1])
Assert.Throws<TargetInvocationException>(fun _ ->
CompilerAssert.Execute(module2,
beforeExecute=(fun _ deps ->
deps
|> List.iter (fun dep -> try File.Delete dep with | _ -> ())))) |> ignore
[<Test>]
let ``Simple exe should execute if dependency was found and is not statically linked``() =
let module1 =
let source =
"""
module Module1
type C() = class end
"""
Compilation.Create(source, Fsx, Library)
let module2 =
let source =
"""
let y = Module1.C()
printfn "%A" y
"""
Compilation.Create(source, Fsx, Exe, cmplRefs=[CompilationReference.CreateFSharp module1])
CompilerAssert.Execute module2
[<Test>]
let ``Static link quotes in multiple modules``() =
let module1 =
let source =
"""
module Module1
module Test =
let inline run() =
<@ fun (output:'T[]) (input:'T[]) (length:int) ->
let start = 0
let mutable i = start
while i < length do
output.[i] <- input.[i]
i <- i + 1 @>
let bar() =
sprintf "%A" (run())
type C() =
[<ReflectedDefinition>]
static member F x = (C(), System.DateTime.Now)
"""
Compilation.Create(source, Fsx, Library)
let module2 =
let source =
"""
let a = Module1.Test.bar()
let b = sprintf "%A" (Module1.Test.run())
let test1 = (a=b)
type D() =
[<ReflectedDefinition>]
static member F x = (Module1.C(), D(), System.DateTime.Now)
let z2 = Quotations.Expr.TryGetReflectedDefinition(typeof<Module1.C>.GetMethod("F"))
let s2 = (sprintf "%2000A" z2)
let test2 = (s2 = "Some Lambda (x, NewTuple (NewObject (C), PropertyGet (None, Now, [])))")
let z3 = Quotations.Expr.TryGetReflectedDefinition(typeof<D>.GetMethod("F"))
let s3 = (sprintf "%2000A" z3)
let test3 = (s3 = "Some Lambda (x, NewTuple (NewObject (C), NewObject (D), PropertyGet (None, Now, [])))")
#if EXTRAS
// Add some references to System.ValueTuple, and add a test case which statically links this DLL
let test4 = struct (3,4)
let test5 = struct (z2,z3)
#endif
if not test1 then
stdout.WriteLine "*** test1 FAILED";
eprintf "FAILED, in-module result %s is different from out-module call %s" a b
if not test2 then
stdout.WriteLine "*** test2 FAILED";
eprintf "FAILED, %s is different from expected" s2
if not test3 then
stdout.WriteLine "*** test3 FAILED";
eprintf "FAILED, %s is different from expected" s3
if test1 && test2 && test3 then ()
else failwith "Test Failed"
"""
Compilation.Create(source, Fsx, Exe, cmplRefs=[CompilationReference.CreateFSharp(module1, staticLink=true)])
CompilerAssert.Execute(module2, ignoreWarnings=true)
[<Test>]
let ``Static link quotes in multiple modules - optimized``() =
let module1 =
let source =
"""
module Module1
module Test =
let inline run() =
<@ fun (output:'T[]) (input:'T[]) (length:int) ->
let start = 0
let mutable i = start
while i < length do
output.[i] <- input.[i]
i <- i + 1 @>
let bar() =
sprintf "%A" (run())
type C() =
[<ReflectedDefinition>]
static member F x = (C(), System.DateTime.Now)
"""
Compilation.Create(source, Fsx, Library, [|"--optimize+"|])
let module2 =
let source =
"""
let a = Module1.Test.bar()
let b = sprintf "%A" (Module1.Test.run())
let test1 = (a=b)
type D() =
[<ReflectedDefinition>]
static member F x = (Module1.C(), D(), System.DateTime.Now)
let z2 = Quotations.Expr.TryGetReflectedDefinition(typeof<Module1.C>.GetMethod("F"))
let s2 = (sprintf "%2000A" z2)
let test2 = (s2 = "Some Lambda (x, NewTuple (NewObject (C), PropertyGet (None, Now, [])))")
let z3 = Quotations.Expr.TryGetReflectedDefinition(typeof<D>.GetMethod("F"))
let s3 = (sprintf "%2000A" z3)
let test3 = (s3 = "Some Lambda (x, NewTuple (NewObject (C), NewObject (D), PropertyGet (None, Now, [])))")
#if EXTRAS
// Add some references to System.ValueTuple, and add a test case which statically links this DLL
let test4 = struct (3,4)
let test5 = struct (z2,z3)
#endif
if not test1 then
stdout.WriteLine "*** test1 FAILED";
eprintf "FAILED, in-module result %s is different from out-module call %s" a b
if not test2 then
stdout.WriteLine "*** test2 FAILED";
eprintf "FAILED, %s is different from expected" s2
if not test3 then
stdout.WriteLine "*** test3 FAILED";
eprintf "FAILED, %s is different from expected" s3
if test1 && test2 && test3 then ()
else failwith "Test Failed"
"""
Compilation.Create(source, Fsx, Exe, [|"--optimize+"|], [CompilationReference.CreateFSharp(module1, staticLink=true)])
CompilerAssert.Execute(module2, ignoreWarnings=true)
\ No newline at end of file
// Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information. // Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information.
namespace FSharp.Compiler.UnitTests [<AutoOpen>]
module FSharp.Compiler.UnitTests.CompilerAssert
open System open System
open System.Diagnostics open System.Diagnostics
...@@ -29,17 +30,54 @@ type ILVerifier (dllFilePath: string) = ...@@ -29,17 +30,54 @@ type ILVerifier (dllFilePath: string) =
member this.VerifyILWithLineNumbers (qualifiedItemName: string, expectedIL: string) = member this.VerifyILWithLineNumbers (qualifiedItemName: string, expectedIL: string) =
ILChecker.checkILItemWithLineNumbers qualifiedItemName dllFilePath [ expectedIL ] ILChecker.checkILItemWithLineNumbers qualifiedItemName dllFilePath [ expectedIL ]
[<RequireQualifiedAccess>] type Worker () =
module CompilerAssert = inherit MarshalByRefObject()
let checker = FSharpChecker.Create(suggestNamesForErrors=true) member x.ExecuteTestCase assemblyPath (deps: string[]) =
AppDomain.CurrentDomain.add_AssemblyResolve(ResolveEventHandler(fun _ args ->
deps
|> Array.tryFind (fun (x: string) -> Path.GetFileNameWithoutExtension x = args.Name)
|> Option.bind (fun x -> if File.Exists x then Some x else None)
|> Option.map Assembly.LoadFile
|> Option.defaultValue null))
let asm = Assembly.LoadFrom(assemblyPath)
let entryPoint = asm.EntryPoint
(entryPoint.Invoke(Unchecked.defaultof<obj>, [||])) |> ignore
let private config = TestFramework.initializeSuite () type SourceKind =
| Fs
| Fsx
type CompileOutput =
| Library
| Exe
type CompilationReference = private CompilationReference of Compilation * staticLink: bool with
static member CreateFSharp(cmpl: Compilation, ?staticLink) =
let staticLink = defaultArg staticLink false
CompilationReference(cmpl, staticLink)
and Compilation = private Compilation of string * SourceKind * CompileOutput * options: string[] * CompilationReference list with
static member Create(source, sourceKind, output, ?options, ?cmplRefs) =
let options = defaultArg options [||]
let cmplRefs = defaultArg cmplRefs []
Compilation(source, sourceKind, output, options, cmplRefs)
[<Sealed;AbstractClass>]
type CompilerAssert private () =
static let checker = FSharpChecker.Create(suggestNamesForErrors=true)
static let config = TestFramework.initializeSuite ()
static let _ = config |> ignore
// Do a one time dotnet sdk build to compute the proper set of reference assemblies to pass to the compiler // Do a one time dotnet sdk build to compute the proper set of reference assemblies to pass to the compiler
#if !NETCOREAPP #if !NETCOREAPP
#else #else
let projectFile = """ static let projectFile = """
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
...@@ -56,13 +94,13 @@ module CompilerAssert = ...@@ -56,13 +94,13 @@ module CompilerAssert =
</Project>""" </Project>"""
let programFs = """ static let programFs = """
open System open System
[<EntryPoint>] [<EntryPoint>]
let main argv = 0""" let main argv = 0"""
let getNetCoreAppReferences = static let getNetCoreAppReferences =
let mutable output = "" let mutable output = ""
let mutable errors = "" let mutable errors = ""
let mutable cleanUp = true let mutable cleanUp = true
...@@ -107,37 +145,35 @@ let main argv = 0""" ...@@ -107,37 +145,35 @@ let main argv = 0"""
#endif #endif
#if FX_NO_APP_DOMAINS #if FX_NO_APP_DOMAINS
let executeBuiltApp assembly = static let executeBuiltApp assembly deps =
let ctxt = AssemblyLoadContext("ContextName", true) let ctxt = AssemblyLoadContext("ContextName", true)
try try
let asm = ctxt.LoadFromAssemblyPath(assembly) let asm = ctxt.LoadFromAssemblyPath(assembly)
let entryPoint = asm.EntryPoint let entryPoint = asm.EntryPoint
ctxt.add_Resolving(fun ctxt name ->
deps
|> List.tryFind (fun (x: string) -> Path.GetFileNameWithoutExtension x = name.Name)
|> Option.map ctxt.LoadFromAssemblyPath
|> Option.defaultValue null)
(entryPoint.Invoke(Unchecked.defaultof<obj>, [||])) |> ignore (entryPoint.Invoke(Unchecked.defaultof<obj>, [||])) |> ignore
finally finally
ctxt.Unload() ctxt.Unload()
#else #else
type Worker () =
inherit MarshalByRefObject()
member __.ExecuteTestCase assemblyPath =
let asm = Assembly.LoadFrom(assemblyPath)
let entryPoint = asm.EntryPoint
(entryPoint.Invoke(Unchecked.defaultof<obj>, [||])) |> ignore
let pathToThisDll = Assembly.GetExecutingAssembly().CodeBase static let pathToThisDll = Assembly.GetExecutingAssembly().CodeBase
let adSetup = static let adSetup =
let setup = new System.AppDomainSetup () let setup = new System.AppDomainSetup ()
setup.PrivateBinPath <- pathToThisDll setup.PrivateBinPath <- pathToThisDll
setup setup
let executeBuiltApp assembly = static let executeBuiltApp assembly deps =
let ad = AppDomain.CreateDomain((Guid()).ToString(), null, adSetup) let ad = AppDomain.CreateDomain((Guid()).ToString(), null, adSetup)
let worker = (ad.CreateInstanceFromAndUnwrap(pathToThisDll, typeof<Worker>.FullName)) :?> Worker let worker = (ad.CreateInstanceFromAndUnwrap(pathToThisDll, typeof<Worker>.FullName)) :?> Worker
worker.ExecuteTestCase assembly |>ignore worker.ExecuteTestCase assembly (deps |> Array.ofList) |>ignore
#endif #endif
let private defaultProjectOptions = static let defaultProjectOptions =
{ {
ProjectFileName = "Z:\\test.fsproj" ProjectFileName = "Z:\\test.fsproj"
ProjectId = None ProjectId = None
...@@ -159,27 +195,146 @@ let main argv = 0""" ...@@ -159,27 +195,146 @@ let main argv = 0"""
Stamp = None Stamp = None
} }
let private gate = obj () static let rawCompile inputFilePath outputFilePath isExe options source =
File.WriteAllText (inputFilePath, source)
let private compile isExe options source f = let args =
lock gate <| fun () -> options
let inputFilePath = Path.ChangeExtension(Path.GetTempFileName(), ".fs") |> Array.append defaultProjectOptions.OtherOptions
let outputFilePath = Path.ChangeExtension (Path.GetTempFileName(), if isExe then ".exe" else ".dll") |> Array.append [| "fsc.exe"; inputFilePath; "-o:" + outputFilePath; (if isExe then "--target:exe" else "--target:library"); "--nowin32manifest" |]
try let errors, _ = checker.Compile args |> Async.RunSynchronously
File.WriteAllText (inputFilePath, source)
let args =
options
|> Array.append defaultProjectOptions.OtherOptions
|> Array.append [| "fsc.exe"; inputFilePath; "-o:" + outputFilePath; (if isExe then "--target:exe" else "--target:library"); "--nowin32manifest" |]
let errors, _ = checker.Compile args |> Async.RunSynchronously
f (errors, outputFilePath)
finally errors, outputFilePath
try File.Delete inputFilePath with | _ -> ()
try File.Delete outputFilePath with | _ -> ()
let Pass (source: string) = static let compileAux isExe options source f : unit =
let inputFilePath = Path.ChangeExtension(Path.GetTempFileName(), ".fs")
let outputFilePath = Path.ChangeExtension (Path.GetTempFileName(), if isExe then ".exe" else ".dll")
try
f (rawCompile inputFilePath outputFilePath isExe options source)
finally
try File.Delete inputFilePath with | _ -> ()
try File.Delete outputFilePath with | _ -> ()
static let compileDisposable isScript isExe options source =
let ext =
if isScript then ".fsx"
else ".fs"
let inputFilePath = Path.ChangeExtension(Path.GetTempFileName(), ext)
let outputFilePath = Path.ChangeExtension (Path.GetTempFileName(), if isExe then ".exe" else ".dll")
let o =
{ new IDisposable with
member _.Dispose() =
try File.Delete inputFilePath with | _ -> ()
try File.Delete outputFilePath with | _ -> () }
try
o, rawCompile inputFilePath outputFilePath isExe options source
with
| _ ->
o.Dispose()
reraise()
static let gate = obj ()
static let compile isExe options source f =
lock gate (fun _ -> compileAux isExe options source f)
static let assertErrors ignoreWarnings (errors: FSharpErrorInfo[]) =
let errors =
if ignoreWarnings then
errors
|> Array.filter (fun error -> error.Severity <> FSharpErrorSeverity.Warning)
else
errors
if errors.Length > 0 then
Assert.Fail(sprintf "%A" errors)
static let rec compileCompilationAux (disposals: ResizeArray<IDisposable>) ignoreWarnings (cmpl: Compilation) : (FSharpErrorInfo[] * string) * string list =
let compilationRefs, deps =
match cmpl with
| Compilation(_, _, _, _, cmpls) ->
let compiledRefs =
cmpls
|> List.map (fun cmpl ->
match cmpl with
| CompilationReference (cmpl, staticLink) ->
compileCompilationAux disposals ignoreWarnings cmpl, staticLink)
let compilationRefs =
compiledRefs
|> List.map (fun (((errors, outputFilePath), _), staticLink) ->
assertErrors ignoreWarnings errors
let rOption = "-r:" + outputFilePath
if staticLink then
[rOption;"--staticlink:" + Path.GetFileNameWithoutExtension outputFilePath]
else
[rOption])
|> List.concat
|> Array.ofList
let deps =
compiledRefs
|> List.map (fun ((_, deps), _) -> deps)
|> List.concat
|> List.distinct
compilationRefs, deps
let isScript =
match cmpl with
| Compilation(_, kind, _, _, _) ->
match kind with
| Fs -> false
| Fsx -> true
let isExe =
match cmpl with
| Compilation(_, _, output, _, _) ->
match output with
| Library -> false
| Exe -> true
let source =
match cmpl with
| Compilation(source, _, _, _, _) -> source
let options =
match cmpl with
| Compilation(_, _, _, options, _) -> options
let disposal, res = compileDisposable isScript isExe (Array.append options compilationRefs) source
disposals.Add disposal
let deps2 =
compilationRefs
|> Array.filter (fun x -> not (x.Contains("--staticlink")))
|> Array.map (fun x -> x.Replace("-r:", String.Empty))
|> List.ofArray
res, (deps @ deps2)
static let rec compileCompilation ignoreWarnings (cmpl: Compilation) f =
let disposals = ResizeArray()
try
f (compileCompilationAux disposals ignoreWarnings cmpl)
finally
disposals
|> Seq.iter (fun x -> x.Dispose())
static member Compile(cmpl: Compilation, ?ignoreWarnings) =
let ignoreWarnings = defaultArg ignoreWarnings false
lock gate (fun () ->
compileCompilation ignoreWarnings cmpl (fun ((errors, _), _) ->
assertErrors ignoreWarnings errors))
static member Execute(cmpl: Compilation, ?ignoreWarnings, ?beforeExecute) =
let ignoreWarnings = defaultArg ignoreWarnings false
let beforeExecute = defaultArg beforeExecute (fun _ _ -> ())
lock gate (fun () ->
compileCompilation ignoreWarnings cmpl (fun ((errors, outputFilePath), deps) ->
assertErrors ignoreWarnings errors
beforeExecute outputFilePath deps
executeBuiltApp outputFilePath deps))
static member Pass (source: string) =
lock gate <| fun () -> lock gate <| fun () ->
let parseResults, fileAnswer = checker.ParseAndCheckFileInProject("test.fs", 0, SourceText.ofString source, defaultProjectOptions) |> Async.RunSynchronously let parseResults, fileAnswer = checker.ParseAndCheckFileInProject("test.fs", 0, SourceText.ofString source, defaultProjectOptions) |> Async.RunSynchronously
...@@ -191,7 +346,7 @@ let main argv = 0""" ...@@ -191,7 +346,7 @@ let main argv = 0"""
Assert.IsEmpty(typeCheckResults.Errors, sprintf "Type Check errors: %A" typeCheckResults.Errors) Assert.IsEmpty(typeCheckResults.Errors, sprintf "Type Check errors: %A" typeCheckResults.Errors)
let TypeCheckWithErrorsAndOptions options (source: string) expectedTypeErrors = static member TypeCheckWithErrorsAndOptions options (source: string) expectedTypeErrors =
lock gate <| fun () -> lock gate <| fun () ->
let parseResults, fileAnswer = let parseResults, fileAnswer =
checker.ParseAndCheckFileInProject( checker.ParseAndCheckFileInProject(
...@@ -222,30 +377,30 @@ let main argv = 0""" ...@@ -222,30 +377,30 @@ let main argv = 0"""
Assert.AreEqual(expectedErrorMsg, info.Message, "expectedErrorMsg") Assert.AreEqual(expectedErrorMsg, info.Message, "expectedErrorMsg")
) )
let TypeCheckWithErrors (source: string) expectedTypeErrors = static member TypeCheckWithErrors (source: string) expectedTypeErrors =
TypeCheckWithErrorsAndOptions [||] source expectedTypeErrors CompilerAssert.TypeCheckWithErrorsAndOptions [||] source expectedTypeErrors
let TypeCheckSingleErrorWithOptions options (source: string) (expectedServerity: FSharpErrorSeverity) (expectedErrorNumber: int) (expectedErrorRange: int * int * int * int) (expectedErrorMsg: string) = static member TypeCheckSingleErrorWithOptions options (source: string) (expectedServerity: FSharpErrorSeverity) (expectedErrorNumber: int) (expectedErrorRange: int * int * int * int) (expectedErrorMsg: string) =
TypeCheckWithErrorsAndOptions options source [| expectedServerity, expectedErrorNumber, expectedErrorRange, expectedErrorMsg |] CompilerAssert.TypeCheckWithErrorsAndOptions options source [| expectedServerity, expectedErrorNumber, expectedErrorRange, expectedErrorMsg |]
let TypeCheckSingleError (source: string) (expectedServerity: FSharpErrorSeverity) (expectedErrorNumber: int) (expectedErrorRange: int * int * int * int) (expectedErrorMsg: string) = static member TypeCheckSingleError (source: string) (expectedServerity: FSharpErrorSeverity) (expectedErrorNumber: int) (expectedErrorRange: int * int * int * int) (expectedErrorMsg: string) =
TypeCheckWithErrors source [| expectedServerity, expectedErrorNumber, expectedErrorRange, expectedErrorMsg |] CompilerAssert.TypeCheckWithErrors source [| expectedServerity, expectedErrorNumber, expectedErrorRange, expectedErrorMsg |]
let CompileExe (source: string) = static member CompileExe (source: string) =
compile true [||] source (fun (errors, _) -> compile true [||] source (fun (errors, _) ->
if errors.Length > 0 then if errors.Length > 0 then
Assert.Fail (sprintf "Compile had warnings and/or errors: %A" errors)) Assert.Fail (sprintf "Compile had warnings and/or errors: %A" errors))
let CompileExeAndRun (source: string) = static member CompileExeAndRun (source: string) =
compile true [||] source (fun (errors, outputExe) -> compile true [||] source (fun (errors, outputExe) ->
if errors.Length > 0 then if errors.Length > 0 then
Assert.Fail (sprintf "Compile had warnings and/or errors: %A" errors) Assert.Fail (sprintf "Compile had warnings and/or errors: %A" errors)
executeBuiltApp outputExe executeBuiltApp outputExe []
) )
let CompileLibraryAndVerifyILWithOptions options (source: string) (f: ILVerifier -> unit) = static member CompileLibraryAndVerifyILWithOptions options (source: string) (f: ILVerifier -> unit) =
compile false options source (fun (errors, outputFilePath) -> compile false options source (fun (errors, outputFilePath) ->
let errors = let errors =
errors |> Array.filter (fun x -> x.Severity = FSharpErrorSeverity.Error) errors |> Array.filter (fun x -> x.Severity = FSharpErrorSeverity.Error)
...@@ -255,10 +410,10 @@ let main argv = 0""" ...@@ -255,10 +410,10 @@ let main argv = 0"""
f (ILVerifier outputFilePath) f (ILVerifier outputFilePath)
) )
let CompileLibraryAndVerifyIL (source: string) (f: ILVerifier -> unit) = static member CompileLibraryAndVerifyIL (source: string) (f: ILVerifier -> unit) =
CompileLibraryAndVerifyILWithOptions [||] source f CompilerAssert.CompileLibraryAndVerifyILWithOptions [||] source f
let RunScript (source: string) (expectedErrorMessages: string list) = static member RunScript (source: string) (expectedErrorMessages: string list) =
lock gate <| fun () -> lock gate <| fun () ->
// Intialize output and input streams // Intialize output and input streams
use inStream = new StringReader("") use inStream = new StringReader("")
...@@ -294,7 +449,7 @@ let main argv = 0""" ...@@ -294,7 +449,7 @@ let main argv = 0"""
Assert.AreEqual(expectedErrorMessage, errorMessage) Assert.AreEqual(expectedErrorMessage, errorMessage)
) )
let ParseWithErrors (source: string) expectedParseErrors = static member ParseWithErrors (source: string) expectedParseErrors =
let sourceFileName = "test.fs" let sourceFileName = "test.fs"
let parsingOptions = { FSharpParsingOptions.Default with SourceFiles = [| sourceFileName |] } let parsingOptions = { FSharpParsingOptions.Default with SourceFiles = [| sourceFileName |] }
let parseResults = checker.ParseFile(sourceFileName, SourceText.ofString source, parsingOptions) |> Async.RunSynchronously let parseResults = checker.ParseFile(sourceFileName, SourceText.ofString source, parsingOptions) |> Async.RunSynchronously
......
...@@ -34,6 +34,7 @@ ...@@ -34,6 +34,7 @@
<Compile Include="Compiler\ILChecker.fs" /> <Compile Include="Compiler\ILChecker.fs" />
<Compile Include="Compiler\Utilities.fs" /> <Compile Include="Compiler\Utilities.fs" />
<Compile Include="Compiler\CompilerAssert.fs" /> <Compile Include="Compiler\CompilerAssert.fs" />
<Compile Include="Compiler\CodeGen\EmittedIL\StaticLinkTests.fs" />
<Compile Include="Compiler\CodeGen\EmittedIL\LiteralValue.fs" /> <Compile Include="Compiler\CodeGen\EmittedIL\LiteralValue.fs" />
<Compile Include="Compiler\CodeGen\EmittedIL\Mutation.fs" /> <Compile Include="Compiler\CodeGen\EmittedIL\Mutation.fs" />
<Compile Include="Compiler\CodeGen\EmittedIL\TailCalls.fs" /> <Compile Include="Compiler\CodeGen\EmittedIL\TailCalls.fs" />
......
...@@ -55,7 +55,7 @@ ...@@ -55,7 +55,7 @@
"1"="{92EF0900-2251-11D2-B72E-0000F87572EF}" "1"="{92EF0900-2251-11D2-B72E-0000F87572EF}"
[$RootKey$\Packages\{91a04a73-4f2c-4e7c-ad38-c1a68e7da05c}] [$RootKey$\Packages\{91a04a73-4f2c-4e7c-ad38-c1a68e7da05c}]
"ProductVersion"="10.4" "ProductVersion"="{{FSProductVersion}}"
"ProductName"="Visual F#" "ProductName"="Visual F#"
"CompanyName"="Microsoft Corp." "CompanyName"="Microsoft Corp."
......
...@@ -14,16 +14,22 @@ ...@@ -14,16 +14,22 @@
<None Include="Source.extension.vsixmanifest"> <None Include="Source.extension.vsixmanifest">
<SubType>Designer</SubType> <SubType>Designer</SubType>
</None> </None>
<Content Include="..\RegisterFsharpPackage.pkgdef">
<CopyToOutputDirectory>Always</CopyToOutputDirectory> <NoneSubstituteText Include="..\RegisterFsharpPackage.pkgdef" CopyToOutputDirectory="PreserveNewest">
<IncludeInVSIX>true</IncludeInVSIX> <TargetFileName>RegisterFsharpPackage.pkgdef</TargetFileName>
<Link>RegisterFsharpPackage.pkgdef</Link> <Pattern1>{{FSProductVersion}}</Pattern1>
</Content> <Replacement1>$(FSProductVersion)</Replacement1>
<Pattern2>{{FSLanguageVersion}}</Pattern2>
<Replacement2>$(FSLanguageVersion)</Replacement2>
<IncludeInVSix>true</IncludeInVSix>
</NoneSubstituteText>
<Content Include="$(FSharpSourcesRoot)\..\License.txt"> <Content Include="$(FSharpSourcesRoot)\..\License.txt">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
<Link>License.txt</Link> <Link>License.txt</Link>
<IncludeInVSIX>true</IncludeInVSIX> <IncludeInVSIX>true</IncludeInVSIX>
</Content> </Content>
<Content Include="$(NuGetPackageRoot)\Microsoft.VisualFSharp.Type.Providers.Redist\$(MicrosoftVisualFSharpTypeProvidersRedistVersion)\content\$(FSharpDataTypeProvidersVersion)\FSharp.Data.TypeProviders.dll"> <Content Include="$(NuGetPackageRoot)\Microsoft.VisualFSharp.Type.Providers.Redist\$(MicrosoftVisualFSharpTypeProvidersRedistVersion)\content\$(FSharpDataTypeProvidersVersion)\FSharp.Data.TypeProviders.dll">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
<Link>FSharp.Data.TypeProviders.dll</Link> <Link>FSharp.Data.TypeProviders.dll</Link>
......
...@@ -24,13 +24,22 @@ ...@@ -24,13 +24,22 @@
<ResourceName>Menus.ctmenu</ResourceName> <ResourceName>Menus.ctmenu</ResourceName>
<SubType>Designer</SubType> <SubType>Designer</SubType>
</VSCTCompile> </VSCTCompile>
<!-- Copy resx file and transform product/language version -->
<CopyVsixResources Include="Resources/**" />
<EmbeddedResource Include="VSPackage.resx"> <EmbeddedResource Include="VSPackage.resx">
<GenerateSource>true</GenerateSource> <GenerateSource>true</GenerateSource>
<GeneratedModuleName>Microsoft.VisualStudio.FSharp.ProjectSystem.FSharpSR</GeneratedModuleName> <GeneratedModuleName>Microsoft.VisualStudio.FSharp.ProjectSystem.FSharpSR</GeneratedModuleName>
<MergeWithCTO>true</MergeWithCTO> <MergeWithCTO>true</MergeWithCTO>
<ManifestResourceName>VSPackage</ManifestResourceName> <ManifestResourceName>VSPackage</ManifestResourceName>
<SubType>Designer</SubType> <SubType>Designer</SubType>
<IntermediateTargetPath>$(IntermediateOutputPath)resources\</IntermediateTargetPath>
<Pattern1>{{FSProductVersion}}</Pattern1>
<Replacement1>$(FSProductVersion)</Replacement1>
<Pattern2>{{FSLanguageVersion}}</Pattern2>
<Replacement2>$(FSLanguageVersion)</Replacement2>
</EmbeddedResource> </EmbeddedResource>
<Compile Include="ProjectPrelude.fs" /> <Compile Include="ProjectPrelude.fs" />
<Compile Include="WaitDialog.fs" /> <Compile Include="WaitDialog.fs" />
<Compile Include="MSBuildUtilities.fs" /> <Compile Include="MSBuildUtilities.fs" />
......
...@@ -464,10 +464,10 @@ ...@@ -464,10 +464,10 @@
<value>Customizes the environment to maximize code editor screen space and improve the visibility of F# commands and tool windows.</value> <value>Customizes the environment to maximize code editor screen space and improve the visibility of F# commands and tool windows.</value>
</data> </data>
<data name="ProductDetails" xml:space="preserve"> <data name="ProductDetails" xml:space="preserve">
<value>Microsoft Visual F# Tools 10.4 for F# 4.6</value> <value>Microsoft Visual F# Tools {{FSProductVersion}} for F# {{FSLanguageVersion}}</value>
</data> </data>
<data name="9002" xml:space="preserve"> <data name="9002" xml:space="preserve">
<value>Microsoft Visual F# Tools 10.4 for F# 4.6</value> <value>Microsoft Visual F# Tools {{FSProductVersion}} for F# {{FSLanguageVersion}}</value>
</data> </data>
<data name="ProductID" xml:space="preserve"> <data name="ProductID" xml:space="preserve">
<value>1.0</value> <value>1.0</value>
...@@ -476,7 +476,7 @@ ...@@ -476,7 +476,7 @@
<value>Microsoft Visual F# Tools</value> <value>Microsoft Visual F# Tools</value>
</data> </data>
<data name="9001" xml:space="preserve"> <data name="9001" xml:space="preserve">
<value>Visual F# Tools 10.4 for F# 4.6</value> <value>Visual F# Tools {{FSProductVersion}} for F# {{FSLanguageVersion}}</value>
</data> </data>
<data name="9027" xml:space="preserve"> <data name="9027" xml:space="preserve">
<value>F# Interactive</value> <value>F# Interactive</value>
......
...@@ -433,13 +433,13 @@ ...@@ -433,13 +433,13 @@
<note /> <note />
</trans-unit> </trans-unit>
<trans-unit id="ProductDetails"> <trans-unit id="ProductDetails">
<source>Microsoft Visual F# Tools 10.4 for F# 4.6</source> <source>Microsoft Visual F# Tools {{FSProductVersion}} for F# {{FSLanguageVersion}}</source>
<target state="translated">Nástroje Microsoft Visual F# 10.4 pro F# 4.6</target> <target state="needs-review-translation">Nástroje Microsoft Visual F# {{FSProductVersion}} pro F# {{FSLanguageVersion}}</target>
<note /> <note />
</trans-unit> </trans-unit>
<trans-unit id="9002"> <trans-unit id="9002">
<source>Microsoft Visual F# Tools 10.4 for F# 4.6</source> <source>Microsoft Visual F# Tools {{FSProductVersion}} for F# {{FSLanguageVersion}}</source>
<target state="translated">Nástroje Microsoft Visual F# 10.4 pro F# 4.6</target> <target state="needs-review-translation">Nástroje Microsoft Visual F# {{FSProductVersion}} pro F# {{FSLanguageVersion}}</target>
<note /> <note />
</trans-unit> </trans-unit>
<trans-unit id="ProductID"> <trans-unit id="ProductID">
...@@ -453,8 +453,8 @@ ...@@ -453,8 +453,8 @@
<note /> <note />
</trans-unit> </trans-unit>
<trans-unit id="9001"> <trans-unit id="9001">
<source>Visual F# Tools 10.4 for F# 4.6</source> <source>Visual F# Tools {{FSProductVersion}} for F# {{FSLanguageVersion}}</source>
<target state="translated">Nástroje Visual F# 10.4 pro F# 4.6</target> <target state="needs-review-translation">Nástroje Visual F# {{FSProductVersion}} pro F# {{FSLanguageVersion}}</target>
<note /> <note />
</trans-unit> </trans-unit>
<trans-unit id="9027"> <trans-unit id="9027">
......
...@@ -433,13 +433,13 @@ ...@@ -433,13 +433,13 @@
<note /> <note />
</trans-unit> </trans-unit>
<trans-unit id="ProductDetails"> <trans-unit id="ProductDetails">
<source>Microsoft Visual F# Tools 10.4 for F# 4.6</source> <source>Microsoft Visual F# Tools {{FSProductVersion}} for F# {{FSLanguageVersion}}</source>
<target state="translated">Microsoft Visual F# Tools 10.4 für f# 4.6</target> <target state="needs-review-translation">Microsoft Visual F# Tools {{FSProductVersion}} für f# {{FSLanguageVersion}}</target>
<note /> <note />
</trans-unit> </trans-unit>
<trans-unit id="9002"> <trans-unit id="9002">
<source>Microsoft Visual F# Tools 10.4 for F# 4.6</source> <source>Microsoft Visual F# Tools {{FSProductVersion}} for F# {{FSLanguageVersion}}</source>
<target state="translated">Microsoft Visual F# Tools 10.4 für f# 4.6</target> <target state="needs-review-translation">Microsoft Visual F# Tools {{FSProductVersion}} für f# {{FSLanguageVersion}}</target>
<note /> <note />
</trans-unit> </trans-unit>
<trans-unit id="ProductID"> <trans-unit id="ProductID">
...@@ -453,8 +453,8 @@ ...@@ -453,8 +453,8 @@
<note /> <note />
</trans-unit> </trans-unit>
<trans-unit id="9001"> <trans-unit id="9001">
<source>Visual F# Tools 10.4 for F# 4.6</source> <source>Visual F# Tools {{FSProductVersion}} for F# {{FSLanguageVersion}}</source>
<target state="translated">Visual F# Tools 10.4 für F# 4.6</target> <target state="needs-review-translation">Visual F# Tools {{FSProductVersion}} für F# {{FSLanguageVersion}}</target>
<note /> <note />
</trans-unit> </trans-unit>
<trans-unit id="9027"> <trans-unit id="9027">
......
...@@ -433,13 +433,13 @@ ...@@ -433,13 +433,13 @@
<note /> <note />
</trans-unit> </trans-unit>
<trans-unit id="ProductDetails"> <trans-unit id="ProductDetails">
<source>Microsoft Visual F# Tools 10.4 for F# 4.6</source> <source>Microsoft Visual F# Tools {{FSProductVersion}} for F# {{FSLanguageVersion}}</source>
<target state="translated">Herramientas de Microsoft Visual F# 10.4 para F# 4.6</target> <target state="needs-review-translation">Herramientas de Microsoft Visual F# {{FSProductVersion}} para F# {{FSLanguageVersion}}</target>
<note /> <note />
</trans-unit> </trans-unit>
<trans-unit id="9002"> <trans-unit id="9002">
<source>Microsoft Visual F# Tools 10.4 for F# 4.6</source> <source>Microsoft Visual F# Tools {{FSProductVersion}} for F# {{FSLanguageVersion}}</source>
<target state="translated">Herramientas de Microsoft Visual F# 10.4 para F# 4.6</target> <target state="needs-review-translation">Herramientas de Microsoft Visual F# {{FSProductVersion}} para F# {{FSLanguageVersion}}</target>
<note /> <note />
</trans-unit> </trans-unit>
<trans-unit id="ProductID"> <trans-unit id="ProductID">
...@@ -453,8 +453,8 @@ ...@@ -453,8 +453,8 @@
<note /> <note />
</trans-unit> </trans-unit>
<trans-unit id="9001"> <trans-unit id="9001">
<source>Visual F# Tools 10.4 for F# 4.6</source> <source>Visual F# Tools {{FSProductVersion}} for F# {{FSLanguageVersion}}</source>
<target state="translated">Visual F# Tools 10.4 para F# 4.6</target> <target state="needs-review-translation">Visual F# Tools {{FSProductVersion}} para F# {{FSLanguageVersion}}</target>
<note /> <note />
</trans-unit> </trans-unit>
<trans-unit id="9027"> <trans-unit id="9027">
......
...@@ -433,13 +433,13 @@ ...@@ -433,13 +433,13 @@
<note /> <note />
</trans-unit> </trans-unit>
<trans-unit id="ProductDetails"> <trans-unit id="ProductDetails">
<source>Microsoft Visual F# Tools 10.4 for F# 4.6</source> <source>Microsoft Visual F# Tools {{FSProductVersion}} for F# {{FSLanguageVersion}}</source>
<target state="translated">Microsoft Visual F# Tools 10.4 pour F# 4.6</target> <target state="needs-review-translation">Microsoft Visual F# Tools {{FSProductVersion}} pour F# {{FSLanguageVersion}}</target>
<note /> <note />
</trans-unit> </trans-unit>
<trans-unit id="9002"> <trans-unit id="9002">
<source>Microsoft Visual F# Tools 10.4 for F# 4.6</source> <source>Microsoft Visual F# Tools {{FSProductVersion}} for F# {{FSLanguageVersion}}</source>
<target state="translated">Microsoft Visual F# Tools 10.4 pour F# 4.6</target> <target state="needs-review-translation">Microsoft Visual F# Tools {{FSProductVersion}} pour F# {{FSLanguageVersion}}</target>
<note /> <note />
</trans-unit> </trans-unit>
<trans-unit id="ProductID"> <trans-unit id="ProductID">
...@@ -453,8 +453,8 @@ ...@@ -453,8 +453,8 @@
<note /> <note />
</trans-unit> </trans-unit>
<trans-unit id="9001"> <trans-unit id="9001">
<source>Visual F# Tools 10.4 for F# 4.6</source> <source>Visual F# Tools {{FSProductVersion}} for F# {{FSLanguageVersion}}</source>
<target state="translated">Visual F# Tools 10.4 pour F# 4.6</target> <target state="needs-review-translation">Visual F# Tools {{FSProductVersion}} pour F# {{FSLanguageVersion}}</target>
<note /> <note />
</trans-unit> </trans-unit>
<trans-unit id="9027"> <trans-unit id="9027">
......
...@@ -433,13 +433,13 @@ ...@@ -433,13 +433,13 @@
<note /> <note />
</trans-unit> </trans-unit>
<trans-unit id="ProductDetails"> <trans-unit id="ProductDetails">
<source>Microsoft Visual F# Tools 10.4 for F# 4.6</source> <source>Microsoft Visual F# Tools {{FSProductVersion}} for F# {{FSLanguageVersion}}</source>
<target state="translated">Microsoft Visual F# Tools 10.4 per F# 4.6</target> <target state="needs-review-translation">Microsoft Visual F# Tools {{FSProductVersion}} per F# {{FSLanguageVersion}}</target>
<note /> <note />
</trans-unit> </trans-unit>
<trans-unit id="9002"> <trans-unit id="9002">
<source>Microsoft Visual F# Tools 10.4 for F# 4.6</source> <source>Microsoft Visual F# Tools {{FSProductVersion}} for F# {{FSLanguageVersion}}</source>
<target state="translated">Microsoft Visual F# Tools 10.4 per F# 4.6</target> <target state="needs-review-translation">Microsoft Visual F# Tools {{FSProductVersion}} per F# {{FSLanguageVersion}}</target>
<note /> <note />
</trans-unit> </trans-unit>
<trans-unit id="ProductID"> <trans-unit id="ProductID">
...@@ -453,8 +453,8 @@ ...@@ -453,8 +453,8 @@
<note /> <note />
</trans-unit> </trans-unit>
<trans-unit id="9001"> <trans-unit id="9001">
<source>Visual F# Tools 10.4 for F# 4.6</source> <source>Visual F# Tools {{FSProductVersion}} for F# {{FSLanguageVersion}}</source>
<target state="translated">Visual F# Tools 10.4 per F# 4.6</target> <target state="needs-review-translation">Visual F# Tools {{FSProductVersion}} per F# {{FSLanguageVersion}}</target>
<note /> <note />
</trans-unit> </trans-unit>
<trans-unit id="9027"> <trans-unit id="9027">
......
...@@ -433,13 +433,13 @@ ...@@ -433,13 +433,13 @@
<note /> <note />
</trans-unit> </trans-unit>
<trans-unit id="ProductDetails"> <trans-unit id="ProductDetails">
<source>Microsoft Visual F# Tools 10.4 for F# 4.6</source> <source>Microsoft Visual F# Tools {{FSProductVersion}} for F# {{FSLanguageVersion}}</source>
<target state="translated">F# 4.6 用 Microsoft Visual F# Tools 10.4</target> <target state="needs-review-translation">F# {{FSLanguageVersion}} 用 Microsoft Visual F# Tools {{FSProductVersion}}</target>
<note /> <note />
</trans-unit> </trans-unit>
<trans-unit id="9002"> <trans-unit id="9002">
<source>Microsoft Visual F# Tools 10.4 for F# 4.6</source> <source>Microsoft Visual F# Tools {{FSProductVersion}} for F# {{FSLanguageVersion}}</source>
<target state="translated">F# 4.6 用 Microsoft Visual F# Tools 10.4</target> <target state="needs-review-translation">F# {{FSLanguageVersion}} 用 Microsoft Visual F# Tools {{FSProductVersion}}</target>
<note /> <note />
</trans-unit> </trans-unit>
<trans-unit id="ProductID"> <trans-unit id="ProductID">
...@@ -453,8 +453,8 @@ ...@@ -453,8 +453,8 @@
<note /> <note />
</trans-unit> </trans-unit>
<trans-unit id="9001"> <trans-unit id="9001">
<source>Visual F# Tools 10.4 for F# 4.6</source> <source>Visual F# Tools {{FSProductVersion}} for F# {{FSLanguageVersion}}</source>
<target state="translated">F# 4.6 用 Visual F# Tools 10.4</target> <target state="needs-review-translation">F# {{FSLanguageVersion}} 用 Visual F# Tools {{FSProductVersion}}</target>
<note /> <note />
</trans-unit> </trans-unit>
<trans-unit id="9027"> <trans-unit id="9027">
......
...@@ -433,13 +433,13 @@ ...@@ -433,13 +433,13 @@
<note /> <note />
</trans-unit> </trans-unit>
<trans-unit id="ProductDetails"> <trans-unit id="ProductDetails">
<source>Microsoft Visual F# Tools 10.4 for F# 4.6</source> <source>Microsoft Visual F# Tools {{FSProductVersion}} for F# {{FSLanguageVersion}}</source>
<target state="translated">F# 4.6용 Microsoft Visual F# Tools 10.4</target> <target state="needs-review-translation">F# {{FSLanguageVersion}}용 Microsoft Visual F# Tools {{FSProductVersion}}</target>
<note /> <note />
</trans-unit> </trans-unit>
<trans-unit id="9002"> <trans-unit id="9002">
<source>Microsoft Visual F# Tools 10.4 for F# 4.6</source> <source>Microsoft Visual F# Tools {{FSProductVersion}} for F# {{FSLanguageVersion}}</source>
<target state="translated">F# 4.6용 Microsoft Visual F# Tools 10.4</target> <target state="needs-review-translation">F# {{FSLanguageVersion}}용 Microsoft Visual F# Tools {{FSProductVersion}}</target>
<note /> <note />
</trans-unit> </trans-unit>
<trans-unit id="ProductID"> <trans-unit id="ProductID">
...@@ -453,8 +453,8 @@ ...@@ -453,8 +453,8 @@
<note /> <note />
</trans-unit> </trans-unit>
<trans-unit id="9001"> <trans-unit id="9001">
<source>Visual F# Tools 10.4 for F# 4.6</source> <source>Visual F# Tools {{FSProductVersion}} for F# {{FSLanguageVersion}}</source>
<target state="translated">F# 4.6용 Visual F# Tools 10.4</target> <target state="needs-review-translation">F# {{FSLanguageVersion}}용 Visual F# Tools {{FSProductVersion}}</target>
<note /> <note />
</trans-unit> </trans-unit>
<trans-unit id="9027"> <trans-unit id="9027">
......
...@@ -433,13 +433,13 @@ ...@@ -433,13 +433,13 @@
<note /> <note />
</trans-unit> </trans-unit>
<trans-unit id="ProductDetails"> <trans-unit id="ProductDetails">
<source>Microsoft Visual F# Tools 10.4 for F# 4.6</source> <source>Microsoft Visual F# Tools {{FSProductVersion}} for F# {{FSLanguageVersion}}</source>
<target state="translated">Microsoft Visual F# Tools 10.4 dla języka F# 4.6</target> <target state="needs-review-translation">Microsoft Visual F# Tools {{FSProductVersion}} dla języka F# {{FSLanguageVersion}}</target>
<note /> <note />
</trans-unit> </trans-unit>
<trans-unit id="9002"> <trans-unit id="9002">
<source>Microsoft Visual F# Tools 10.4 for F# 4.6</source> <source>Microsoft Visual F# Tools {{FSProductVersion}} for F# {{FSLanguageVersion}}</source>
<target state="translated">Microsoft Visual F# Tools 10.4 dla języka F# 4.6</target> <target state="needs-review-translation">Microsoft Visual F# Tools {{FSProductVersion}} dla języka F# {{FSLanguageVersion}}</target>
<note /> <note />
</trans-unit> </trans-unit>
<trans-unit id="ProductID"> <trans-unit id="ProductID">
...@@ -453,8 +453,8 @@ ...@@ -453,8 +453,8 @@
<note /> <note />
</trans-unit> </trans-unit>
<trans-unit id="9001"> <trans-unit id="9001">
<source>Visual F# Tools 10.4 for F# 4.6</source> <source>Visual F# Tools {{FSProductVersion}} for F# {{FSLanguageVersion}}</source>
<target state="translated">Visual F# Tools 10.4 dla języka F# 4.6</target> <target state="needs-review-translation">Visual F# Tools {{FSProductVersion}} dla języka F# {{FSLanguageVersion}}</target>
<note /> <note />
</trans-unit> </trans-unit>
<trans-unit id="9027"> <trans-unit id="9027">
......
...@@ -433,13 +433,13 @@ ...@@ -433,13 +433,13 @@
<note /> <note />
</trans-unit> </trans-unit>
<trans-unit id="ProductDetails"> <trans-unit id="ProductDetails">
<source>Microsoft Visual F# Tools 10.4 for F# 4.6</source> <source>Microsoft Visual F# Tools {{FSProductVersion}} for F# {{FSLanguageVersion}}</source>
<target state="translated">Microsoft Visual F# Tools 10.4 para F# 4.6</target> <target state="needs-review-translation">Microsoft Visual F# Tools {{FSProductVersion}} para F# {{FSLanguageVersion}}</target>
<note /> <note />
</trans-unit> </trans-unit>
<trans-unit id="9002"> <trans-unit id="9002">
<source>Microsoft Visual F# Tools 10.4 for F# 4.6</source> <source>Microsoft Visual F# Tools {{FSProductVersion}} for F# {{FSLanguageVersion}}</source>
<target state="translated">Microsoft Visual F# Tools 10.4 para F# 4.6</target> <target state="needs-review-translation">Microsoft Visual F# Tools {{FSProductVersion}} para F# {{FSLanguageVersion}}</target>
<note /> <note />
</trans-unit> </trans-unit>
<trans-unit id="ProductID"> <trans-unit id="ProductID">
...@@ -453,8 +453,8 @@ ...@@ -453,8 +453,8 @@
<note /> <note />
</trans-unit> </trans-unit>
<trans-unit id="9001"> <trans-unit id="9001">
<source>Visual F# Tools 10.4 for F# 4.6</source> <source>Visual F# Tools {{FSProductVersion}} for F# {{FSLanguageVersion}}</source>
<target state="translated">Visual F# Tools 10.4 para F# 4.6</target> <target state="needs-review-translation">Visual F# Tools {{FSProductVersion}} para F# {{FSLanguageVersion}}</target>
<note /> <note />
</trans-unit> </trans-unit>
<trans-unit id="9027"> <trans-unit id="9027">
......
...@@ -433,13 +433,13 @@ ...@@ -433,13 +433,13 @@
<note /> <note />
</trans-unit> </trans-unit>
<trans-unit id="ProductDetails"> <trans-unit id="ProductDetails">
<source>Microsoft Visual F# Tools 10.4 for F# 4.6</source> <source>Microsoft Visual F# Tools {{FSProductVersion}} for F# {{FSLanguageVersion}}</source>
<target state="translated">Microsoft Visual F# Tools 10.4 для F# 4.6</target> <target state="needs-review-translation">Microsoft Visual F# Tools {{FSProductVersion}} для F# {{FSLanguageVersion}}</target>
<note /> <note />
</trans-unit> </trans-unit>
<trans-unit id="9002"> <trans-unit id="9002">
<source>Microsoft Visual F# Tools 10.4 for F# 4.6</source> <source>Microsoft Visual F# Tools {{FSProductVersion}} for F# {{FSLanguageVersion}}</source>
<target state="translated">Microsoft Visual F# Tools 10.4 для F# 4.6</target> <target state="needs-review-translation">Microsoft Visual F# Tools {{FSProductVersion}} для F# {{FSLanguageVersion}}</target>
<note /> <note />
</trans-unit> </trans-unit>
<trans-unit id="ProductID"> <trans-unit id="ProductID">
...@@ -453,8 +453,8 @@ ...@@ -453,8 +453,8 @@
<note /> <note />
</trans-unit> </trans-unit>
<trans-unit id="9001"> <trans-unit id="9001">
<source>Visual F# Tools 10.4 for F# 4.6</source> <source>Visual F# Tools {{FSProductVersion}} for F# {{FSLanguageVersion}}</source>
<target state="translated">Visual F# Tools 10.4 для F# 4.6</target> <target state="needs-review-translation">Visual F# Tools {{FSProductVersion}} для F# {{FSLanguageVersion}}</target>
<note /> <note />
</trans-unit> </trans-unit>
<trans-unit id="9027"> <trans-unit id="9027">
......
...@@ -433,13 +433,13 @@ ...@@ -433,13 +433,13 @@
<note /> <note />
</trans-unit> </trans-unit>
<trans-unit id="ProductDetails"> <trans-unit id="ProductDetails">
<source>Microsoft Visual F# Tools 10.4 for F# 4.6</source> <source>Microsoft Visual F# Tools {{FSProductVersion}} for F# {{FSLanguageVersion}}</source>
<target state="translated">F# 4.6 için Microsoft Visual F# Tools 10.4</target> <target state="needs-review-translation">F# {{FSLanguageVersion}} için Microsoft Visual F# Tools {{FSProductVersion}}</target>
<note /> <note />
</trans-unit> </trans-unit>
<trans-unit id="9002"> <trans-unit id="9002">
<source>Microsoft Visual F# Tools 10.4 for F# 4.6</source> <source>Microsoft Visual F# Tools {{FSProductVersion}} for F# {{FSLanguageVersion}}</source>
<target state="translated">F# 4.6 için Microsoft Visual F# Tools 10.4</target> <target state="needs-review-translation">F# {{FSLanguageVersion}} için Microsoft Visual F# Tools {{FSProductVersion}}</target>
<note /> <note />
</trans-unit> </trans-unit>
<trans-unit id="ProductID"> <trans-unit id="ProductID">
...@@ -453,8 +453,8 @@ ...@@ -453,8 +453,8 @@
<note /> <note />
</trans-unit> </trans-unit>
<trans-unit id="9001"> <trans-unit id="9001">
<source>Visual F# Tools 10.4 for F# 4.6</source> <source>Visual F# Tools {{FSProductVersion}} for F# {{FSLanguageVersion}}</source>
<target state="translated">F# 4.6 için Visual F# Araçları 10.4</target> <target state="needs-review-translation">F# {{FSLanguageVersion}} için Visual F# Araçları {{FSProductVersion}}</target>
<note /> <note />
</trans-unit> </trans-unit>
<trans-unit id="9027"> <trans-unit id="9027">
......
...@@ -433,13 +433,13 @@ ...@@ -433,13 +433,13 @@
<note /> <note />
</trans-unit> </trans-unit>
<trans-unit id="ProductDetails"> <trans-unit id="ProductDetails">
<source>Microsoft Visual F# Tools 10.4 for F# 4.6</source> <source>Microsoft Visual F# Tools {{FSProductVersion}} for F# {{FSLanguageVersion}}</source>
<target state="translated">Microsoft Visual F# Tools 10.4 for F# 4.6</target> <target state="needs-review-translation">Microsoft Visual F# Tools {{FSProductVersion}} for F# {{FSLanguageVersion}}</target>
<note /> <note />
</trans-unit> </trans-unit>
<trans-unit id="9002"> <trans-unit id="9002">
<source>Microsoft Visual F# Tools 10.4 for F# 4.6</source> <source>Microsoft Visual F# Tools {{FSProductVersion}} for F# {{FSLanguageVersion}}</source>
<target state="translated">Microsoft Visual F# Tools 10.4 for F# 4.6</target> <target state="needs-review-translation">Microsoft Visual F# Tools {{FSProductVersion}} for F# {{FSLanguageVersion}}</target>
<note /> <note />
</trans-unit> </trans-unit>
<trans-unit id="ProductID"> <trans-unit id="ProductID">
...@@ -453,8 +453,8 @@ ...@@ -453,8 +453,8 @@
<note /> <note />
</trans-unit> </trans-unit>
<trans-unit id="9001"> <trans-unit id="9001">
<source>Visual F# Tools 10.4 for F# 4.6</source> <source>Visual F# Tools {{FSProductVersion}} for F# {{FSLanguageVersion}}</source>
<target state="translated">Visual F# Tools 10.4 for F# 4.6</target> <target state="needs-review-translation">Visual F# Tools {{FSProductVersion}} for F# {{FSLanguageVersion}}</target>
<note /> <note />
</trans-unit> </trans-unit>
<trans-unit id="9027"> <trans-unit id="9027">
......
...@@ -433,13 +433,13 @@ ...@@ -433,13 +433,13 @@
<note /> <note />
</trans-unit> </trans-unit>
<trans-unit id="ProductDetails"> <trans-unit id="ProductDetails">
<source>Microsoft Visual F# Tools 10.4 for F# 4.6</source> <source>Microsoft Visual F# Tools {{FSProductVersion}} for F# {{FSLanguageVersion}}</source>
<target state="translated">適用於 F# 4.6 的 Microsoft Visual F# Tools 10.4</target> <target state="needs-review-translation">適用於 F# {{FSLanguageVersion}} 的 Microsoft Visual F# Tools {{FSProductVersion}}</target>
<note /> <note />
</trans-unit> </trans-unit>
<trans-unit id="9002"> <trans-unit id="9002">
<source>Microsoft Visual F# Tools 10.4 for F# 4.6</source> <source>Microsoft Visual F# Tools {{FSProductVersion}} for F# {{FSLanguageVersion}}</source>
<target state="translated">適用於 F# 4.6 的 Microsoft Visual F# Tools 10.4</target> <target state="needs-review-translation">適用於 F# {{FSLanguageVersion}} 的 Microsoft Visual F# Tools {{FSProductVersion}}</target>
<note /> <note />
</trans-unit> </trans-unit>
<trans-unit id="ProductID"> <trans-unit id="ProductID">
...@@ -453,8 +453,8 @@ ...@@ -453,8 +453,8 @@
<note /> <note />
</trans-unit> </trans-unit>
<trans-unit id="9001"> <trans-unit id="9001">
<source>Visual F# Tools 10.4 for F# 4.6</source> <source>Visual F# Tools {{FSProductVersion}} for F# {{FSLanguageVersion}}</source>
<target state="translated">適用於 F# 4.6 的 Visual F# Tools 10.4</target> <target state="needs-review-translation">適用於 F# {{FSLanguageVersion}} 的 Visual F# Tools {{FSProductVersion}}</target>
<note /> <note />
</trans-unit> </trans-unit>
<trans-unit id="9027"> <trans-unit id="9027">
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册