@@ -341,12 +341,21 @@ open Printf
341341
342342let generateResxAndSource ( filename : string ) =
343343try
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)
352361let lines = File.ReadAllLines( filename)
@@ -472,27 +481,28 @@ open Printf
472481with get() = _ hostObject
473482and set ( value ) = _ hostObject<- value
474483member 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.ItemSpecwith
489- | Some( source, resx) -> ((( source, resx) :: resultList), aggregateResult)
490- | None-> ( resultList, false )
491- ) ([], true )
487+ |> Array.choose( fun item -> generateResxAndSource item.ItemSpec)
488+
492489let 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 generatedFilesdo
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