未验证 提交 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>
<Import Project="Sdk.targets" Sdk="Microsoft.DotNet.Arcade.Sdk" />
<Import Project="eng\targets\Imports.targets" />
<Import Project="eng\targets\NuGet.targets" />
......@@ -8,7 +9,7 @@
<Target Name="NoneSubstituteTextFiles"
Inputs="@(NoneSubstituteText)"
Outputs="@(NoneSubstituteText->'$(IntermediateOutputPath)%(Filename)%(Extension)')"
BeforeTargets="AssignTargetPaths;BeforeBuild">
BeforeTargets="AssignTargetPaths;BeforeBuild;GenerateFSharpTextResources">
<PropertyGroup>
<__TargetFilePath>@(NoneSubstituteText->'$(IntermediateOutputPath)%(Filename)%(Extension)')</__TargetFilePath>
......@@ -20,16 +21,19 @@
<_CopyToOutputDirectory Condition="'%(NoneSubstituteText.CopyToOutputDirectory)' != ''">%(NoneSubstituteText.CopyToOutputDirectory)</_CopyToOutputDirectory>
<_CopyToOutputDirectory Condition="'%(NoneSubstituteText.CopyToOutputDirectory)' == ''">Never</_CopyToOutputDirectory>
<_IncludeInVsix>false</_IncludeInVsix>
<_IncludeInVsix Condition="'%(NoneSubstituteText.IncludeInVsix)' == 'true'">true</_IncludeInVsix>
</PropertyGroup>
<MakeDir Directories="$(IntermediateOutputPath)"
Condition="!Exists('$(IntermediateOutputPath)')" />
<WriteLinesToFile File="$(__TargetFilePath)" Lines="$(_ReplacementText)" Overwrite="true" WriteOnlyWhenDifferent="true" />
<!-- Make sure it will get cleaned -->
<ItemGroup >
<ItemGroup>
<None Include="$(__TargetFilePath)" CopyToOutputDirectory="$(_CopyToOutputDirectory)" />
<FileWrites Include="$(__TargetFilePath)" Condition="'$(__TargetFileName)' != 'App.config'" />
<Content Include="$(__TargetFilePath)" CopyToOutputDirectory="Always" IncludeInVsix="true" />
</ItemGroup>
</Target>
......@@ -61,4 +65,27 @@
</ItemGroup>
</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>
......@@ -66,16 +66,16 @@ Target.create "Build" (fun _ ->
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 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 _ ->
// 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
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 _ ->
......
......@@ -26,6 +26,7 @@
<Compile Include="FSharpEmbedResXSource.fs" />
<Compile Include="WriteCodeFragment.fs" />
<Compile Include="CreateFSharpManifestResourceName.fs" />
<Compile Include="SubstituteText.fs" />
<None Include="Microsoft.FSharp.Targets" CopyToOutputDirectory="PreserveNewest" />
<None Include="Microsoft.Portable.FSharp.Targets" CopyToOutputDirectory="PreserveNewest" />
<None Include="Microsoft.FSharp.NetSdk.targets" CopyToOutputDirectory="PreserveNewest" />
......
......@@ -29,6 +29,7 @@ this file.
<UsingTask TaskName="CreateFSharpManifestResourceName" AssemblyFile="$(FSharpBuildAssemblyFile)" />
<UsingTask TaskName="WriteCodeFragment" AssemblyFile="$(FSharpBuildAssemblyFile)" />
<UsingTask TaskName="FSharpPlatformInformation" AssemblyFile="$(FSharpBuildAssemblyFile)" />
<UsingTask TaskName="SubstituteText" AssemblyFile="$(FSharpBuildAssemblyFile)" />
<PropertyGroup>
<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.
namespace FSharp.Compiler.UnitTests
[<AutoOpen>]
module FSharp.Compiler.UnitTests.CompilerAssert
open System
open System.Diagnostics
......@@ -29,17 +30,54 @@ type ILVerifier (dllFilePath: string) =
member this.VerifyILWithLineNumbers (qualifiedItemName: string, expectedIL: string) =
ILChecker.checkILItemWithLineNumbers qualifiedItemName dllFilePath [ expectedIL ]
[<RequireQualifiedAccess>]
module CompilerAssert =
type Worker () =
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
#if !NETCOREAPP
#else
let projectFile = """
static let projectFile = """
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
......@@ -56,13 +94,13 @@ module CompilerAssert =
</Project>"""
let programFs = """
static let programFs = """
open System
[<EntryPoint>]
let main argv = 0"""
let getNetCoreAppReferences =
static let getNetCoreAppReferences =
let mutable output = ""
let mutable errors = ""
let mutable cleanUp = true
......@@ -107,37 +145,35 @@ let main argv = 0"""
#endif
#if FX_NO_APP_DOMAINS
let executeBuiltApp assembly =
static let executeBuiltApp assembly deps =
let ctxt = AssemblyLoadContext("ContextName", true)
try
let asm = ctxt.LoadFromAssemblyPath(assembly)
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
finally
ctxt.Unload()
#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 ()
setup.PrivateBinPath <- pathToThisDll
setup
let executeBuiltApp assembly =
static let executeBuiltApp assembly deps =
let ad = AppDomain.CreateDomain((Guid()).ToString(), null, adSetup)
let worker = (ad.CreateInstanceFromAndUnwrap(pathToThisDll, typeof<Worker>.FullName)) :?> Worker
worker.ExecuteTestCase assembly |>ignore
worker.ExecuteTestCase assembly (deps |> Array.ofList) |>ignore
#endif
let private defaultProjectOptions =
static let defaultProjectOptions =
{
ProjectFileName = "Z:\\test.fsproj"
ProjectId = None
......@@ -159,27 +195,146 @@ let main argv = 0"""
Stamp = None
}
let private gate = obj ()
let private compile isExe options source f =
lock gate <| fun () ->
let inputFilePath = Path.ChangeExtension(Path.GetTempFileName(), ".fs")
let outputFilePath = Path.ChangeExtension (Path.GetTempFileName(), if isExe then ".exe" else ".dll")
try
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)
static let rawCompile inputFilePath outputFilePath isExe options source =
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
finally
try File.Delete inputFilePath with | _ -> ()
try File.Delete outputFilePath with | _ -> ()
errors, outputFilePath
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 () ->
let parseResults, fileAnswer = checker.ParseAndCheckFileInProject("test.fs", 0, SourceText.ofString source, defaultProjectOptions) |> Async.RunSynchronously
......@@ -191,7 +346,7 @@ let main argv = 0"""
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 () ->
let parseResults, fileAnswer =
checker.ParseAndCheckFileInProject(
......@@ -222,30 +377,30 @@ let main argv = 0"""
Assert.AreEqual(expectedErrorMsg, info.Message, "expectedErrorMsg")
)
let TypeCheckWithErrors (source: string) expectedTypeErrors =
TypeCheckWithErrorsAndOptions [||] source expectedTypeErrors
static member TypeCheckWithErrors (source: string) expectedTypeErrors =
CompilerAssert.TypeCheckWithErrorsAndOptions [||] source expectedTypeErrors
let TypeCheckSingleErrorWithOptions options (source: string) (expectedServerity: FSharpErrorSeverity) (expectedErrorNumber: int) (expectedErrorRange: int * int * int * int) (expectedErrorMsg: string) =
TypeCheckWithErrorsAndOptions options source [| expectedServerity, expectedErrorNumber, expectedErrorRange, expectedErrorMsg |]
static member TypeCheckSingleErrorWithOptions options (source: string) (expectedServerity: FSharpErrorSeverity) (expectedErrorNumber: int) (expectedErrorRange: int * int * int * int) (expectedErrorMsg: string) =
CompilerAssert.TypeCheckWithErrorsAndOptions options source [| expectedServerity, expectedErrorNumber, expectedErrorRange, expectedErrorMsg |]
let TypeCheckSingleError (source: string) (expectedServerity: FSharpErrorSeverity) (expectedErrorNumber: int) (expectedErrorRange: int * int * int * int) (expectedErrorMsg: string) =
TypeCheckWithErrors source [| expectedServerity, expectedErrorNumber, expectedErrorRange, expectedErrorMsg |]
static member TypeCheckSingleError (source: string) (expectedServerity: FSharpErrorSeverity) (expectedErrorNumber: int) (expectedErrorRange: int * int * int * int) (expectedErrorMsg: string) =
CompilerAssert.TypeCheckWithErrors source [| expectedServerity, expectedErrorNumber, expectedErrorRange, expectedErrorMsg |]
let CompileExe (source: string) =
static member CompileExe (source: string) =
compile true [||] source (fun (errors, _) ->
if errors.Length > 0 then
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) ->
if errors.Length > 0 then
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) ->
let errors =
errors |> Array.filter (fun x -> x.Severity = FSharpErrorSeverity.Error)
......@@ -255,10 +410,10 @@ let main argv = 0"""
f (ILVerifier outputFilePath)
)
let CompileLibraryAndVerifyIL (source: string) (f: ILVerifier -> unit) =
CompileLibraryAndVerifyILWithOptions [||] source f
static member CompileLibraryAndVerifyIL (source: string) (f: ILVerifier -> unit) =
CompilerAssert.CompileLibraryAndVerifyILWithOptions [||] source f
let RunScript (source: string) (expectedErrorMessages: string list) =
static member RunScript (source: string) (expectedErrorMessages: string list) =
lock gate <| fun () ->
// Intialize output and input streams
use inStream = new StringReader("")
......@@ -294,7 +449,7 @@ let main argv = 0"""
Assert.AreEqual(expectedErrorMessage, errorMessage)
)
let ParseWithErrors (source: string) expectedParseErrors =
static member ParseWithErrors (source: string) expectedParseErrors =
let sourceFileName = "test.fs"
let parsingOptions = { FSharpParsingOptions.Default with SourceFiles = [| sourceFileName |] }
let parseResults = checker.ParseFile(sourceFileName, SourceText.ofString source, parsingOptions) |> Async.RunSynchronously
......
......@@ -34,6 +34,7 @@
<Compile Include="Compiler\ILChecker.fs" />
<Compile Include="Compiler\Utilities.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\Mutation.fs" />
<Compile Include="Compiler\CodeGen\EmittedIL\TailCalls.fs" />
......
......@@ -55,7 +55,7 @@
"1"="{92EF0900-2251-11D2-B72E-0000F87572EF}"
[$RootKey$\Packages\{91a04a73-4f2c-4e7c-ad38-c1a68e7da05c}]
"ProductVersion"="10.4"
"ProductVersion"="{{FSProductVersion}}"
"ProductName"="Visual F#"
"CompanyName"="Microsoft Corp."
......
......@@ -14,16 +14,22 @@
<None Include="Source.extension.vsixmanifest">
<SubType>Designer</SubType>
</None>
<Content Include="..\RegisterFsharpPackage.pkgdef">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
<IncludeInVSIX>true</IncludeInVSIX>
<Link>RegisterFsharpPackage.pkgdef</Link>
</Content>
<NoneSubstituteText Include="..\RegisterFsharpPackage.pkgdef" CopyToOutputDirectory="PreserveNewest">
<TargetFileName>RegisterFsharpPackage.pkgdef</TargetFileName>
<Pattern1>{{FSProductVersion}}</Pattern1>
<Replacement1>$(FSProductVersion)</Replacement1>
<Pattern2>{{FSLanguageVersion}}</Pattern2>
<Replacement2>$(FSLanguageVersion)</Replacement2>
<IncludeInVSix>true</IncludeInVSix>
</NoneSubstituteText>
<Content Include="$(FSharpSourcesRoot)\..\License.txt">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
<Link>License.txt</Link>
<IncludeInVSIX>true</IncludeInVSIX>
</Content>
<Content Include="$(NuGetPackageRoot)\Microsoft.VisualFSharp.Type.Providers.Redist\$(MicrosoftVisualFSharpTypeProvidersRedistVersion)\content\$(FSharpDataTypeProvidersVersion)\FSharp.Data.TypeProviders.dll">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
<Link>FSharp.Data.TypeProviders.dll</Link>
......
......@@ -24,13 +24,22 @@
<ResourceName>Menus.ctmenu</ResourceName>
<SubType>Designer</SubType>
</VSCTCompile>
<!-- Copy resx file and transform product/language version -->
<CopyVsixResources Include="Resources/**" />
<EmbeddedResource Include="VSPackage.resx">
<GenerateSource>true</GenerateSource>
<GeneratedModuleName>Microsoft.VisualStudio.FSharp.ProjectSystem.FSharpSR</GeneratedModuleName>
<MergeWithCTO>true</MergeWithCTO>
<ManifestResourceName>VSPackage</ManifestResourceName>
<SubType>Designer</SubType>
<IntermediateTargetPath>$(IntermediateOutputPath)resources\</IntermediateTargetPath>
<Pattern1>{{FSProductVersion}}</Pattern1>
<Replacement1>$(FSProductVersion)</Replacement1>
<Pattern2>{{FSLanguageVersion}}</Pattern2>
<Replacement2>$(FSLanguageVersion)</Replacement2>
</EmbeddedResource>
<Compile Include="ProjectPrelude.fs" />
<Compile Include="WaitDialog.fs" />
<Compile Include="MSBuildUtilities.fs" />
......
......@@ -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>
</data>
<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 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 name="ProductID" xml:space="preserve">
<value>1.0</value>
......@@ -476,7 +476,7 @@
<value>Microsoft Visual F# Tools</value>
</data>
<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 name="9027" xml:space="preserve">
<value>F# Interactive</value>
......
......@@ -433,13 +433,13 @@
<note />
</trans-unit>
<trans-unit id="ProductDetails">
<source>Microsoft Visual F# Tools 10.4 for F# 4.6</source>
<target state="translated">Nástroje Microsoft Visual F# 10.4 pro F# 4.6</target>
<source>Microsoft Visual F# Tools {{FSProductVersion}} for F# {{FSLanguageVersion}}</source>
<target state="needs-review-translation">Nástroje Microsoft Visual F# {{FSProductVersion}} pro F# {{FSLanguageVersion}}</target>
<note />
</trans-unit>
<trans-unit id="9002">
<source>Microsoft Visual F# Tools 10.4 for F# 4.6</source>
<target state="translated">Nástroje Microsoft Visual F# 10.4 pro F# 4.6</target>
<source>Microsoft Visual F# Tools {{FSProductVersion}} for F# {{FSLanguageVersion}}</source>
<target state="needs-review-translation">Nástroje Microsoft Visual F# {{FSProductVersion}} pro F# {{FSLanguageVersion}}</target>
<note />
</trans-unit>
<trans-unit id="ProductID">
......@@ -453,8 +453,8 @@
<note />
</trans-unit>
<trans-unit id="9001">
<source>Visual F# Tools 10.4 for F# 4.6</source>
<target state="translated">Nástroje Visual F# 10.4 pro F# 4.6</target>
<source>Visual F# Tools {{FSProductVersion}} for F# {{FSLanguageVersion}}</source>
<target state="needs-review-translation">Nástroje Visual F# {{FSProductVersion}} pro F# {{FSLanguageVersion}}</target>
<note />
</trans-unit>
<trans-unit id="9027">
......
......@@ -433,13 +433,13 @@
<note />
</trans-unit>
<trans-unit id="ProductDetails">
<source>Microsoft Visual F# Tools 10.4 for F# 4.6</source>
<target state="translated">Microsoft Visual F# Tools 10.4 für f# 4.6</target>
<source>Microsoft Visual F# Tools {{FSProductVersion}} for F# {{FSLanguageVersion}}</source>
<target state="needs-review-translation">Microsoft Visual F# Tools {{FSProductVersion}} für f# {{FSLanguageVersion}}</target>
<note />
</trans-unit>
<trans-unit id="9002">
<source>Microsoft Visual F# Tools 10.4 for F# 4.6</source>
<target state="translated">Microsoft Visual F# Tools 10.4 für f# 4.6</target>
<source>Microsoft Visual F# Tools {{FSProductVersion}} for F# {{FSLanguageVersion}}</source>
<target state="needs-review-translation">Microsoft Visual F# Tools {{FSProductVersion}} für f# {{FSLanguageVersion}}</target>
<note />
</trans-unit>
<trans-unit id="ProductID">
......@@ -453,8 +453,8 @@
<note />
</trans-unit>
<trans-unit id="9001">
<source>Visual F# Tools 10.4 for F# 4.6</source>
<target state="translated">Visual F# Tools 10.4 für F# 4.6</target>
<source>Visual F# Tools {{FSProductVersion}} for F# {{FSLanguageVersion}}</source>
<target state="needs-review-translation">Visual F# Tools {{FSProductVersion}} für F# {{FSLanguageVersion}}</target>
<note />
</trans-unit>
<trans-unit id="9027">
......
......@@ -433,13 +433,13 @@
<note />
</trans-unit>
<trans-unit id="ProductDetails">
<source>Microsoft Visual F# Tools 10.4 for F# 4.6</source>
<target state="translated">Herramientas de Microsoft Visual F# 10.4 para F# 4.6</target>
<source>Microsoft Visual F# Tools {{FSProductVersion}} for F# {{FSLanguageVersion}}</source>
<target state="needs-review-translation">Herramientas de Microsoft Visual F# {{FSProductVersion}} para F# {{FSLanguageVersion}}</target>
<note />
</trans-unit>
<trans-unit id="9002">
<source>Microsoft Visual F# Tools 10.4 for F# 4.6</source>
<target state="translated">Herramientas de Microsoft Visual F# 10.4 para F# 4.6</target>
<source>Microsoft Visual F# Tools {{FSProductVersion}} for F# {{FSLanguageVersion}}</source>
<target state="needs-review-translation">Herramientas de Microsoft Visual F# {{FSProductVersion}} para F# {{FSLanguageVersion}}</target>
<note />
</trans-unit>
<trans-unit id="ProductID">
......@@ -453,8 +453,8 @@
<note />
</trans-unit>
<trans-unit id="9001">
<source>Visual F# Tools 10.4 for F# 4.6</source>
<target state="translated">Visual F# Tools 10.4 para F# 4.6</target>
<source>Visual F# Tools {{FSProductVersion}} for F# {{FSLanguageVersion}}</source>
<target state="needs-review-translation">Visual F# Tools {{FSProductVersion}} para F# {{FSLanguageVersion}}</target>
<note />
</trans-unit>
<trans-unit id="9027">
......
......@@ -433,13 +433,13 @@
<note />
</trans-unit>
<trans-unit id="ProductDetails">
<source>Microsoft Visual F# Tools 10.4 for F# 4.6</source>
<target state="translated">Microsoft Visual F# Tools 10.4 pour F# 4.6</target>
<source>Microsoft Visual F# Tools {{FSProductVersion}} for F# {{FSLanguageVersion}}</source>
<target state="needs-review-translation">Microsoft Visual F# Tools {{FSProductVersion}} pour F# {{FSLanguageVersion}}</target>
<note />
</trans-unit>
<trans-unit id="9002">
<source>Microsoft Visual F# Tools 10.4 for F# 4.6</source>
<target state="translated">Microsoft Visual F# Tools 10.4 pour F# 4.6</target>
<source>Microsoft Visual F# Tools {{FSProductVersion}} for F# {{FSLanguageVersion}}</source>
<target state="needs-review-translation">Microsoft Visual F# Tools {{FSProductVersion}} pour F# {{FSLanguageVersion}}</target>
<note />
</trans-unit>
<trans-unit id="ProductID">
......@@ -453,8 +453,8 @@
<note />
</trans-unit>
<trans-unit id="9001">
<source>Visual F# Tools 10.4 for F# 4.6</source>
<target state="translated">Visual F# Tools 10.4 pour F# 4.6</target>
<source>Visual F# Tools {{FSProductVersion}} for F# {{FSLanguageVersion}}</source>
<target state="needs-review-translation">Visual F# Tools {{FSProductVersion}} pour F# {{FSLanguageVersion}}</target>
<note />
</trans-unit>
<trans-unit id="9027">
......
......@@ -433,13 +433,13 @@
<note />
</trans-unit>
<trans-unit id="ProductDetails">
<source>Microsoft Visual F# Tools 10.4 for F# 4.6</source>
<target state="translated">Microsoft Visual F# Tools 10.4 per F# 4.6</target>
<source>Microsoft Visual F# Tools {{FSProductVersion}} for F# {{FSLanguageVersion}}</source>
<target state="needs-review-translation">Microsoft Visual F# Tools {{FSProductVersion}} per F# {{FSLanguageVersion}}</target>
<note />
</trans-unit>
<trans-unit id="9002">
<source>Microsoft Visual F# Tools 10.4 for F# 4.6</source>
<target state="translated">Microsoft Visual F# Tools 10.4 per F# 4.6</target>
<source>Microsoft Visual F# Tools {{FSProductVersion}} for F# {{FSLanguageVersion}}</source>
<target state="needs-review-translation">Microsoft Visual F# Tools {{FSProductVersion}} per F# {{FSLanguageVersion}}</target>
<note />
</trans-unit>
<trans-unit id="ProductID">
......@@ -453,8 +453,8 @@
<note />
</trans-unit>
<trans-unit id="9001">
<source>Visual F# Tools 10.4 for F# 4.6</source>
<target state="translated">Visual F# Tools 10.4 per F# 4.6</target>
<source>Visual F# Tools {{FSProductVersion}} for F# {{FSLanguageVersion}}</source>
<target state="needs-review-translation">Visual F# Tools {{FSProductVersion}} per F# {{FSLanguageVersion}}</target>
<note />
</trans-unit>
<trans-unit id="9027">
......
......@@ -433,13 +433,13 @@
<note />
</trans-unit>
<trans-unit id="ProductDetails">
<source>Microsoft Visual F# Tools 10.4 for F# 4.6</source>
<target state="translated">F# 4.6 用 Microsoft Visual F# Tools 10.4</target>
<source>Microsoft Visual F# Tools {{FSProductVersion}} for F# {{FSLanguageVersion}}</source>
<target state="needs-review-translation">F# {{FSLanguageVersion}} 用 Microsoft Visual F# Tools {{FSProductVersion}}</target>
<note />
</trans-unit>
<trans-unit id="9002">
<source>Microsoft Visual F# Tools 10.4 for F# 4.6</source>
<target state="translated">F# 4.6 用 Microsoft Visual F# Tools 10.4</target>
<source>Microsoft Visual F# Tools {{FSProductVersion}} for F# {{FSLanguageVersion}}</source>
<target state="needs-review-translation">F# {{FSLanguageVersion}} 用 Microsoft Visual F# Tools {{FSProductVersion}}</target>
<note />
</trans-unit>
<trans-unit id="ProductID">
......@@ -453,8 +453,8 @@
<note />
</trans-unit>
<trans-unit id="9001">
<source>Visual F# Tools 10.4 for F# 4.6</source>
<target state="translated">F# 4.6 用 Visual F# Tools 10.4</target>
<source>Visual F# Tools {{FSProductVersion}} for F# {{FSLanguageVersion}}</source>
<target state="needs-review-translation">F# {{FSLanguageVersion}} 用 Visual F# Tools {{FSProductVersion}}</target>
<note />
</trans-unit>
<trans-unit id="9027">
......
......@@ -433,13 +433,13 @@
<note />
</trans-unit>
<trans-unit id="ProductDetails">
<source>Microsoft Visual F# Tools 10.4 for F# 4.6</source>
<target state="translated">F# 4.6용 Microsoft Visual F# Tools 10.4</target>
<source>Microsoft Visual F# Tools {{FSProductVersion}} for F# {{FSLanguageVersion}}</source>
<target state="needs-review-translation">F# {{FSLanguageVersion}}용 Microsoft Visual F# Tools {{FSProductVersion}}</target>
<note />
</trans-unit>
<trans-unit id="9002">
<source>Microsoft Visual F# Tools 10.4 for F# 4.6</source>
<target state="translated">F# 4.6용 Microsoft Visual F# Tools 10.4</target>
<source>Microsoft Visual F# Tools {{FSProductVersion}} for F# {{FSLanguageVersion}}</source>
<target state="needs-review-translation">F# {{FSLanguageVersion}}용 Microsoft Visual F# Tools {{FSProductVersion}}</target>
<note />
</trans-unit>
<trans-unit id="ProductID">
......@@ -453,8 +453,8 @@
<note />
</trans-unit>
<trans-unit id="9001">
<source>Visual F# Tools 10.4 for F# 4.6</source>
<target state="translated">F# 4.6용 Visual F# Tools 10.4</target>
<source>Visual F# Tools {{FSProductVersion}} for F# {{FSLanguageVersion}}</source>
<target state="needs-review-translation">F# {{FSLanguageVersion}}용 Visual F# Tools {{FSProductVersion}}</target>
<note />
</trans-unit>
<trans-unit id="9027">
......
......@@ -433,13 +433,13 @@
<note />
</trans-unit>
<trans-unit id="ProductDetails">
<source>Microsoft Visual F# Tools 10.4 for F# 4.6</source>
<target state="translated">Microsoft Visual F# Tools 10.4 dla języka F# 4.6</target>
<source>Microsoft Visual F# Tools {{FSProductVersion}} for F# {{FSLanguageVersion}}</source>
<target state="needs-review-translation">Microsoft Visual F# Tools {{FSProductVersion}} dla języka F# {{FSLanguageVersion}}</target>
<note />
</trans-unit>
<trans-unit id="9002">
<source>Microsoft Visual F# Tools 10.4 for F# 4.6</source>
<target state="translated">Microsoft Visual F# Tools 10.4 dla języka F# 4.6</target>
<source>Microsoft Visual F# Tools {{FSProductVersion}} for F# {{FSLanguageVersion}}</source>
<target state="needs-review-translation">Microsoft Visual F# Tools {{FSProductVersion}} dla języka F# {{FSLanguageVersion}}</target>
<note />
</trans-unit>
<trans-unit id="ProductID">
......@@ -453,8 +453,8 @@
<note />
</trans-unit>
<trans-unit id="9001">
<source>Visual F# Tools 10.4 for F# 4.6</source>
<target state="translated">Visual F# Tools 10.4 dla języka F# 4.6</target>
<source>Visual F# Tools {{FSProductVersion}} for F# {{FSLanguageVersion}}</source>
<target state="needs-review-translation">Visual F# Tools {{FSProductVersion}} dla języka F# {{FSLanguageVersion}}</target>
<note />
</trans-unit>
<trans-unit id="9027">
......
......@@ -433,13 +433,13 @@
<note />
</trans-unit>
<trans-unit id="ProductDetails">
<source>Microsoft Visual F# Tools 10.4 for F# 4.6</source>
<target state="translated">Microsoft Visual F# Tools 10.4 para F# 4.6</target>
<source>Microsoft Visual F# Tools {{FSProductVersion}} for F# {{FSLanguageVersion}}</source>
<target state="needs-review-translation">Microsoft Visual F# Tools {{FSProductVersion}} para F# {{FSLanguageVersion}}</target>
<note />
</trans-unit>
<trans-unit id="9002">
<source>Microsoft Visual F# Tools 10.4 for F# 4.6</source>
<target state="translated">Microsoft Visual F# Tools 10.4 para F# 4.6</target>
<source>Microsoft Visual F# Tools {{FSProductVersion}} for F# {{FSLanguageVersion}}</source>
<target state="needs-review-translation">Microsoft Visual F# Tools {{FSProductVersion}} para F# {{FSLanguageVersion}}</target>
<note />
</trans-unit>
<trans-unit id="ProductID">
......@@ -453,8 +453,8 @@
<note />
</trans-unit>
<trans-unit id="9001">
<source>Visual F# Tools 10.4 for F# 4.6</source>
<target state="translated">Visual F# Tools 10.4 para F# 4.6</target>
<source>Visual F# Tools {{FSProductVersion}} for F# {{FSLanguageVersion}}</source>
<target state="needs-review-translation">Visual F# Tools {{FSProductVersion}} para F# {{FSLanguageVersion}}</target>
<note />
</trans-unit>
<trans-unit id="9027">
......
......@@ -433,13 +433,13 @@
<note />
</trans-unit>
<trans-unit id="ProductDetails">
<source>Microsoft Visual F# Tools 10.4 for F# 4.6</source>
<target state="translated">Microsoft Visual F# Tools 10.4 для F# 4.6</target>
<source>Microsoft Visual F# Tools {{FSProductVersion}} for F# {{FSLanguageVersion}}</source>
<target state="needs-review-translation">Microsoft Visual F# Tools {{FSProductVersion}} для F# {{FSLanguageVersion}}</target>
<note />
</trans-unit>
<trans-unit id="9002">
<source>Microsoft Visual F# Tools 10.4 for F# 4.6</source>
<target state="translated">Microsoft Visual F# Tools 10.4 для F# 4.6</target>
<source>Microsoft Visual F# Tools {{FSProductVersion}} for F# {{FSLanguageVersion}}</source>
<target state="needs-review-translation">Microsoft Visual F# Tools {{FSProductVersion}} для F# {{FSLanguageVersion}}</target>
<note />
</trans-unit>
<trans-unit id="ProductID">
......@@ -453,8 +453,8 @@
<note />
</trans-unit>
<trans-unit id="9001">
<source>Visual F# Tools 10.4 for F# 4.6</source>
<target state="translated">Visual F# Tools 10.4 для F# 4.6</target>
<source>Visual F# Tools {{FSProductVersion}} for F# {{FSLanguageVersion}}</source>
<target state="needs-review-translation">Visual F# Tools {{FSProductVersion}} для F# {{FSLanguageVersion}}</target>
<note />
</trans-unit>
<trans-unit id="9027">
......
......@@ -433,13 +433,13 @@
<note />
</trans-unit>
<trans-unit id="ProductDetails">
<source>Microsoft Visual F# Tools 10.4 for F# 4.6</source>
<target state="translated">F# 4.6 için Microsoft Visual F# Tools 10.4</target>
<source>Microsoft Visual F# Tools {{FSProductVersion}} for F# {{FSLanguageVersion}}</source>
<target state="needs-review-translation">F# {{FSLanguageVersion}} için Microsoft Visual F# Tools {{FSProductVersion}}</target>
<note />
</trans-unit>
<trans-unit id="9002">
<source>Microsoft Visual F# Tools 10.4 for F# 4.6</source>
<target state="translated">F# 4.6 için Microsoft Visual F# Tools 10.4</target>
<source>Microsoft Visual F# Tools {{FSProductVersion}} for F# {{FSLanguageVersion}}</source>
<target state="needs-review-translation">F# {{FSLanguageVersion}} için Microsoft Visual F# Tools {{FSProductVersion}}</target>
<note />
</trans-unit>
<trans-unit id="ProductID">
......@@ -453,8 +453,8 @@
<note />
</trans-unit>
<trans-unit id="9001">
<source>Visual F# Tools 10.4 for F# 4.6</source>
<target state="translated">F# 4.6 için Visual F# Araçları 10.4</target>
<source>Visual F# Tools {{FSProductVersion}} for F# {{FSLanguageVersion}}</source>
<target state="needs-review-translation">F# {{FSLanguageVersion}} için Visual F# Araçları {{FSProductVersion}}</target>
<note />
</trans-unit>
<trans-unit id="9027">
......
......@@ -433,13 +433,13 @@
<note />
</trans-unit>
<trans-unit id="ProductDetails">
<source>Microsoft Visual F# Tools 10.4 for F# 4.6</source>
<target state="translated">Microsoft Visual F# Tools 10.4 for F# 4.6</target>
<source>Microsoft Visual F# Tools {{FSProductVersion}} for F# {{FSLanguageVersion}}</source>
<target state="needs-review-translation">Microsoft Visual F# Tools {{FSProductVersion}} for F# {{FSLanguageVersion}}</target>
<note />
</trans-unit>
<trans-unit id="9002">
<source>Microsoft Visual F# Tools 10.4 for F# 4.6</source>
<target state="translated">Microsoft Visual F# Tools 10.4 for F# 4.6</target>
<source>Microsoft Visual F# Tools {{FSProductVersion}} for F# {{FSLanguageVersion}}</source>
<target state="needs-review-translation">Microsoft Visual F# Tools {{FSProductVersion}} for F# {{FSLanguageVersion}}</target>
<note />
</trans-unit>
<trans-unit id="ProductID">
......@@ -453,8 +453,8 @@
<note />
</trans-unit>
<trans-unit id="9001">
<source>Visual F# Tools 10.4 for F# 4.6</source>
<target state="translated">Visual F# Tools 10.4 for F# 4.6</target>
<source>Visual F# Tools {{FSProductVersion}} for F# {{FSLanguageVersion}}</source>
<target state="needs-review-translation">Visual F# Tools {{FSProductVersion}} for F# {{FSLanguageVersion}}</target>
<note />
</trans-unit>
<trans-unit id="9027">
......
......@@ -433,13 +433,13 @@
<note />
</trans-unit>
<trans-unit id="ProductDetails">
<source>Microsoft Visual F# Tools 10.4 for F# 4.6</source>
<target state="translated">適用於 F# 4.6 的 Microsoft Visual F# Tools 10.4</target>
<source>Microsoft Visual F# Tools {{FSProductVersion}} for F# {{FSLanguageVersion}}</source>
<target state="needs-review-translation">適用於 F# {{FSLanguageVersion}} 的 Microsoft Visual F# Tools {{FSProductVersion}}</target>
<note />
</trans-unit>
<trans-unit id="9002">
<source>Microsoft Visual F# Tools 10.4 for F# 4.6</source>
<target state="translated">適用於 F# 4.6 的 Microsoft Visual F# Tools 10.4</target>
<source>Microsoft Visual F# Tools {{FSProductVersion}} for F# {{FSLanguageVersion}}</source>
<target state="needs-review-translation">適用於 F# {{FSLanguageVersion}} 的 Microsoft Visual F# Tools {{FSProductVersion}}</target>
<note />
</trans-unit>
<trans-unit id="ProductID">
......@@ -453,8 +453,8 @@
<note />
</trans-unit>
<trans-unit id="9001">
<source>Visual F# Tools 10.4 for F# 4.6</source>
<target state="translated">適用於 F# 4.6 的 Visual F# Tools 10.4</target>
<source>Visual F# Tools {{FSProductVersion}} for F# {{FSLanguageVersion}}</source>
<target state="needs-review-translation">適用於 F# {{FSLanguageVersion}} 的 Visual F# Tools {{FSProductVersion}}</target>
<note />
</trans-unit>
<trans-unit id="9027">
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册