@@ -4,6 +4,7 @@ module Fable.Cli.ProjectCracker
44
55open System
66open System.Xml .Linq
7+ open System.Text .RegularExpressions
78open System.Collections .Generic
89open FSharp.Compiler .CodeAnalysis
910open FSharp.Compiler .Text
@@ -248,11 +249,6 @@ let private getDllName (dllFullPath: string) =
248249 let i = dllFullPath.LastIndexOf( '/' )
249250 dllFullPath[( i + 1 ) .. ( dllFullPath.Length - 5 )] // -5 removes the .dll extension
250251
251- let (| Regex | _ |) ( pattern : string ) ( input : string ) =
252- let m = Text.RegularExpressions.Regex.Match( input, pattern)
253- if m.Success then Some [ for x in m.Groups -> x.Value]
254- else None
255-
256252let getBasicCompilerArgs () =
257253 [|
258254 // "--debug"
@@ -271,12 +267,32 @@ let getBasicCompilerArgs () =
271267 // yield "--target:library"
272268 |]
273269
270+ let MSBUILD_CONDITION = Regex( @" ^\s*'\$\((\w+)\)'\s*([!=]=)\s*'(true|false)'\s*$" , RegexOptions.IgnoreCase)
271+
274272/// Simplistic XML-parsing of .fsproj to get source files, as we cannot
275273/// run ` dotnet restore ` on .fsproj files embedded in Nuget packages.
276- let getSourcesFromFablePkg ( projFile : string ) =
274+ let getSourcesFromFablePkg ( opts : CrackerOptions ) ( projFile : string ) =
277275 let withName s ( xs : XElement seq ) =
278276 xs |> Seq.filter ( fun x -> x.Name.LocalName = s)
279277
278+ let checkCondition ( el : XElement ) =
279+ match el.Attribute( XName.Get " Condition" ) with
280+ | null -> true
281+ | attr ->
282+ match attr.Value with
283+ | Naming.Regex MSBUILD_ CONDITION [_; prop; op; bval] ->
284+ let bval = Boolean.Parse bval
285+ let isTrue = ( op = " ==" ) = bval // (op = "==" && bval) || (op = "!=" && not bval)
286+ let isDefined =
287+ opts.FableOptions.Define
288+ |> List.exists ( fun d -> String.Equals( d, prop, StringComparison.InvariantCultureIgnoreCase))
289+ // printfn $"CONDITION: {prop} ({isDefined}) {op} {bval} ({isTrue})"
290+ isTrue = isDefined
291+ | _ -> false
292+
293+ let withNameAndCondition s ( xs : XElement seq ) =
294+ xs |> Seq.filter ( fun el -> el.Name.LocalName = s && checkCondition el)
295+
280296 let xmlDoc = XDocument.Load( projFile)
281297 let projDir = Path.GetDirectoryName( projFile)
282298
@@ -290,11 +306,11 @@ let getSourcesFromFablePkg (projFile: string) =
290306 |> not ))
291307
292308 xmlDoc.Root.Elements()
293- |> withName " ItemGroup"
309+ |> withNameAndCondition " ItemGroup"
294310 |> Seq.map ( fun item ->
295311 ( item.Elements(), [])
296312 ||> Seq.foldBack ( fun el src ->
297- if el.Name.LocalName = " Compile" then
313+ if el.Name.LocalName = " Compile" && checkCondition el then
298314 el.Elements() |> withName " Link"
299315 |> Seq.tryHead |> function
300316 | Some link when Path.isRelativePath link.Value ->
@@ -445,7 +461,7 @@ let getProjectOptionsFromProjectFile =
445461 tryGetResult isMain opts manager csprojFile
446462 |> Option.map ( fun ( r : IAnalyzerResult ) ->
447463 // Careful, options for .csproj start with / but so do root paths in unix
448- let reg = System.Text.RegularExpressions. Regex( @" ^\/[^\/]+?(:?:|$)" )
464+ let reg = Regex( @" ^\/[^\/]+?(:?:|$)" )
449465 let comArgs =
450466 r.CompilerArguments
451467 |> Array.map ( fun line ->
@@ -469,7 +485,7 @@ let getProjectOptionsFromProjectFile =
469485 tryGetResult isMain opts manager projFile
470486 |> Option.map ( fun r ->
471487 // result.CompilerArguments doesn't seem to work well in Linux
472- let comArgs = Text.RegularExpressions. Regex.Split( r.Command, @" \r?\n" )
488+ let comArgs = Regex.Split( r.Command, @" \r?\n" )
473489 comArgs, r))
474490 |> function
475491 | Some result -> result
@@ -631,7 +647,7 @@ let copyFableLibraryAndPackageSourcesPy (opts: CrackerOptions) (pkgs: FablePacka
631647
632648// See #1455: F# compiler generates *.AssemblyInfo.fs in obj folder, but we don't need it
633649let removeFilesInObjFolder sourceFiles =
634- let reg = System.Text.RegularExpressions. Regex( @" [\\\/]obj[\\\/]" )
650+ let reg = Regex( @" [\\\/]obj[\\\/]" )
635651 sourceFiles |> Array.filter ( reg.IsMatch >> not )
636652
637653let loadPrecompiledInfo ( opts : CrackerOptions ) otherOptions sourceFiles =
@@ -775,7 +791,7 @@ let getFullProjectOpts (opts: CrackerOptions) =
775791
776792 let pkgRefs =
777793 pkgRefs |> List.map ( fun pkg ->
778- { pkg with SourcePaths = getSourcesFromFablePkg pkg.FsprojPath })
794+ { pkg with SourcePaths = getSourcesFromFablePkg opts pkg.FsprojPath })
779795
780796 let sourcePaths =
781797 let pkgSources = pkgRefs |> List.collect ( fun x -> x.SourcePaths)
0 commit comments