@@ -341,12 +341,21 @@ open Printf
341341
342342 let generateResxAndSource ( filename : string ) =
343343 try
344- let printMessage message = printfn " FSharpEmbedResourceText: %s " message
345- let justfilename = Path.GetFileNameWithoutExtension( filename) // .txt
346- if justfilename |> Seq.exists ( System.Char.IsLetterOrDigit >> not ) then
347- Err( filename, 0 , sprintf " The filename '%s ' is not allowed; only letters and digits can be used, as the filename also becomes the namespace for the SR class" justfilename)
348- let outFilename = Path.Combine(_ outputPath, justfilename + " .fs" )
349- let outXmlFilename = Path.Combine(_ outputPath, justfilename + " .resx" )
344+ let printMessage message = printfn " FSharpEmbedResourceText: %s " message
345+ let justfilename = Path.GetFileNameWithoutExtension( filename) // .txt
346+ if justfilename |> Seq.exists ( System.Char.IsLetterOrDigit >> not ) then
347+ Err( filename, 0 , sprintf " The filename '%s ' is not allowed; only letters and digits can be used, as the filename also becomes the namespace for the SR class" justfilename)
348+ let outFilename = Path.Combine(_ outputPath, justfilename + " .fs" )
349+ let outXmlFilename = Path.Combine(_ outputPath, justfilename + " .resx" )
350+
351+ if File.Exists( outFilename) &&
352+ File.Exists( outXmlFilename) &&
353+ File.Exists( filename) &&
354+ File.GetLastWriteTime( filename) <= File.GetLastWriteTime( outFilename) &&
355+ File.GetLastWriteTime( filename) <= File.GetLastWriteTime( outXmlFilename) then
356+ printMessage ( sprintf " Skipping generation of %s and %s since up-to-date" outFilename outXmlFilename)
357+ Some ( outFilename, outXmlFilename)
358+ else
350359
351360 printMessage ( sprintf " Reading %s " filename)
352361 let lines = File.ReadAllLines( filename)
@@ -472,27 +481,28 @@ open Printf
472481 with get() = _ hostObject
473482 and set ( value ) = _ hostObject <- value
474483 member this.Execute () =
475- let sourceItem ( source : string ) ( originalItem : string ) =
476- let item = TaskItem( source)
477- item.SetMetadata( " AutoGen" , " true" )
478- item.SetMetadata( " DesignTime" , " true" )
479- item.SetMetadata( " DependentUpon" , originalItem)
480- item :> ITaskItem
481- let resxItem ( resx : string ) =
482- let item = TaskItem( resx)
483- item.SetMetadata( " ManifestResourceName" , Path.GetFileNameWithoutExtension( resx))
484- item :> ITaskItem
485- let generatedFiles , generatedResult =
484+
485+ let generatedFiles =
486486 this.EmbeddedText
487- |> Array.fold ( fun ( resultList , aggregateResult ) item ->
488- match generateResxAndSource item.ItemSpec with
489- | Some ( source, resx) -> ((( source, resx) :: resultList), aggregateResult)
490- | None -> ( resultList, false )
491- ) ([], true )
487+ |> Array.choose ( fun item -> generateResxAndSource item.ItemSpec)
488+
492489 let generatedSource , generatedResx =
493- generatedFiles
494- |> List.map ( fun ( source , resx ) -> ( sourceItem source resx, resxItem resx))
495- |> List.fold ( fun ( sources , resxs ) ( source , resx ) -> ( source :: sources, resx:: resxs)) ([], [])
496- _ generatedSource <- generatedSource |> List.rev |> List.toArray
497- _ generatedResx <- generatedResx |> List.rev |> List.toArray
490+ [| for ( source, resx) in generatedFiles do
491+ let sourceItem =
492+ let item = TaskItem( source)
493+ item.SetMetadata( " AutoGen" , " true" )
494+ item.SetMetadata( " DesignTime" , " true" )
495+ item.SetMetadata( " DependentUpon" , resx)
496+ item :> ITaskItem
497+ let resxItem =
498+ let item = TaskItem( resx)
499+ item.SetMetadata( " ManifestResourceName" , Path.GetFileNameWithoutExtension( resx))
500+ item :> ITaskItem
501+ yield ( sourceItem, resxItem) |]
502+ |> Array.unzip
503+
504+ let generatedResult = ( generatedFiles.Length = this.EmbeddedText.Length)
505+
506+ _ generatedSource <- generatedSource
507+ _ generatedResx <- generatedResx
498508 generatedResult
0 commit comments