Skip to content

Commit

Permalink
Add more tests and improve fix
Browse files Browse the repository at this point in the history
  • Loading branch information
alfonsogarciacaro committed Jul 4, 2016
1 parent eee89ff commit b263858
Show file tree
Hide file tree
Showing 13 changed files with 73 additions and 47 deletions.
60 changes: 27 additions & 33 deletions src/fsharp/CompileOps.fs
Original file line number Diff line number Diff line change
Expand Up @@ -4962,38 +4962,32 @@ module private ScriptPreprocessClosure =
match closureDirective with
| ClosedSourceFile _ as csf -> [csf]
| SourceFile(filename,m,source) ->
let filename = FileSystem.GetFullPathShim(filename)
if observedSources.HaveSeen(filename) then []
else
observedSources.SetSeen(filename)

let errors = ref []
let warnings = ref []
let errorLogger =
{ new ErrorLogger("FindClosure") with
member x.ErrorSinkImpl(e) = errors := e :: !errors
member x.WarnSinkImpl(e) = warnings := e :: !warnings
member x.ErrorCount = (!errors).Length }

use unwindEL = PushErrorLoggerPhaseUntilUnwind (fun _ -> errorLogger)
let pathOfMetaCommandSource = Path.GetDirectoryName(filename)
match ParseScriptText(filename,source,!tcConfig,codeContext,lexResourceManager,errorLogger) with
| Some(input) ->
let tcConfigResult, noWarns = ApplyMetaCommandsFromInputToTcConfigAndGatherNoWarn !tcConfig (input,pathOfMetaCommandSource)
tcConfig := tcConfigResult
let errors = ref []
let warnings = ref []
let errorLogger =
{ new ErrorLogger("FindClosure") with
member x.ErrorSinkImpl(e) = errors := e :: !errors
member x.WarnSinkImpl(e) = warnings := e :: !warnings
member x.ErrorCount = (!errors).Length }

use unwindEL = PushErrorLoggerPhaseUntilUnwind (fun _ -> errorLogger)
let pathOfMetaCommandSource = Path.GetDirectoryName(filename)
match ParseScriptText(filename,source,!tcConfig,codeContext,lexResourceManager,errorLogger) with
| Some(input) ->
let tcConfigResult, noWarns = ApplyMetaCommandsFromInputToTcConfigAndGatherNoWarn !tcConfig (input,pathOfMetaCommandSource)
tcConfig := tcConfigResult

let AddFileIfNotSeen(m,filename) =
if observedSources.HaveSeen(filename) then []
else
if IsScript(filename) then SourceFileOfFilename(filename,m,tcConfigResult.inputCodePage)
else
observedSources.SetSeen(filename)
[ClosedSourceFile(filename,m,None,[],[],[])] // Don't traverse into .fs leafs.
let AddFileIfNotSeen(m,filename) =
if observedSources.HaveSeen(filename) then []
else
observedSources.SetSeen(filename)
if IsScript(filename) then SourceFileOfFilename(filename,m,tcConfigResult.inputCodePage)
else [ClosedSourceFile(filename,m,None,[],[],[])] // Don't traverse into .fs leafs.

let loadedSources = (!tcConfig).GetAvailableLoadedSources() |> List.rev |> List.map AddFileIfNotSeen |> List.concat
(loadedSources |> List.map FindClosure |> List.concat)
@ [ClosedSourceFile(filename,m,Some(input),!errors,!warnings,!noWarns)]
| None -> [ClosedSourceFile(filename,m,None,!errors,!warnings,[])]
let loadedSources = (!tcConfig).GetAvailableLoadedSources() |> List.map AddFileIfNotSeen |> List.concat
(loadedSources |> List.map FindClosure |> List.concat)
@ [ClosedSourceFile(filename,m,Some(input),!errors,!warnings,!noWarns)]
| None -> [ClosedSourceFile(filename,m,None,!errors,!warnings,[])]

closureDirectives |> List.map FindClosure |> List.concat, !tcConfig

Expand All @@ -5011,7 +5005,7 @@ module private ScriptPreprocessClosure =
let sourceFiles = ref []
let sourceInputs = ref []
let globalNoWarns = ref []
for directive in closureDirectives do
for directive in List.rev closureDirectives do
match directive with
| ClosedSourceFile(filename,m,input,_,_,noWarns) ->
let filename = FileSystem.GetFullPathShim(filename)
Expand Down Expand Up @@ -5054,8 +5048,8 @@ module private ScriptPreprocessClosure =
let rootWarnings = rootWarnings |> List.filter isRootRange

let result : LoadClosure =
{ SourceFiles = List.groupByFirst !sourceFiles |> List.rev
References = List.groupByFirst references |> List.rev
{ SourceFiles = List.groupByFirst !sourceFiles
References = List.groupByFirst references
UnresolvedReferences = unresolvedReferences
Inputs = !sourceInputs
NoWarns = List.groupByFirst !globalNoWarns
Expand Down
23 changes: 14 additions & 9 deletions tests/service/ProjectOptionsTests.fs
Original file line number Diff line number Diff line change
Expand Up @@ -411,15 +411,20 @@ let ``Project file parsing -- space in file name``() =

[<Test>]
let ``Test ProjectFileNames order for GetProjectOptionsFromScript`` () = // See #594
let scriptPath = __SOURCE_DIRECTORY__ + @"/data/ScriptProject/Main.fsx"
let scriptSource = File.ReadAllText scriptPath
let projOpts =
checker.GetProjectOptionsFromScript(scriptPath, scriptSource)
|> Async.RunSynchronously
projOpts.ProjectFileNames
|> Array.map Path.GetFileNameWithoutExtension
|> (=) [|"BaseLib"; "Lib1"; "Lib2"; "Main"|]
|> shouldEqual true
let test scriptName expected =
let scriptPath = __SOURCE_DIRECTORY__ + @"/data/ScriptProject/" + scriptName + ".fsx"
let scriptSource = File.ReadAllText scriptPath
let projOpts =
checker.GetProjectOptionsFromScript(scriptPath, scriptSource)
|> Async.RunSynchronously
projOpts.ProjectFileNames
|> Array.map Path.GetFileNameWithoutExtension
|> (=) expected
|> shouldEqual true
test "Main1" [|"BaseLib1"; "Lib1"; "Lib2"; "Main1"|]
test "Main2" [|"BaseLib1"; "Lib1"; "Lib2"; "Lib3"; "Main2"|]
test "Main3" [|"Lib3"; "Lib4"; "Main3"|]
test "Main4" [|"BaseLib2"; "Lib5"; "BaseLib1"; "Lib1"; "Lib2"; "Main4"|]

#endif

Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
module BaseLib
module BaseLib1

let add2 x = x + 2
3 changes: 3 additions & 0 deletions tests/service/data/ScriptProject/BaseLib2.fs
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
module BaseLib2

let add10 x = x + 10
4 changes: 2 additions & 2 deletions tests/service/data/ScriptProject/Lib1.fsx
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
#load "BaseLib.fs"
let add3 = BaseLib.add2 >> ((+) 1)
#load "BaseLib1.fs"
let add3 = BaseLib1.add2 >> ((+) 1)
4 changes: 2 additions & 2 deletions tests/service/data/ScriptProject/Lib2.fsx
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
#load "BaseLib.fs"
let add4 = BaseLib.add2 >> ((+) 2)
#load "BaseLib1.fs"
let add4 = BaseLib1.add2 >> ((+) 2)
3 changes: 3 additions & 0 deletions tests/service/data/ScriptProject/Lib3.fs
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
module Lib3

let add6 = ((+) 6)
3 changes: 3 additions & 0 deletions tests/service/data/ScriptProject/Lib4.fs
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
module Lib4

let add8 = ((+) 8)
2 changes: 2 additions & 0 deletions tests/service/data/ScriptProject/Lib5.fsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
#load "BaseLib2.fs"
let add12 = BaseLib2.add10 >> ((+) 2)
File renamed without changes.
6 changes: 6 additions & 0 deletions tests/service/data/ScriptProject/Main2.fsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
#load "Lib1.fsx"
#load "Lib2.fsx"
#load "Lib3.fs"
Lib1.add3 5 |> printfn "%i"
Lib2.add4 5 |> printfn "%i"
Lib3.add6 5 |> printfn "%i"
4 changes: 4 additions & 0 deletions tests/service/data/ScriptProject/Main3.fsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
#load "Lib3.fs"
#load "Lib4.fs"
Lib3.add6 5 |> printfn "%i"
Lib4.add8 5 |> printfn "%i"
6 changes: 6 additions & 0 deletions tests/service/data/ScriptProject/Main4.fsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
#load "Lib5.fsx"
#load "Lib1.fsx"
#load "Lib2.fsx"
Lib1.add3 5 |> printfn "%i"
Lib2.add4 5 |> printfn "%i"
Lib5.add12 5 |> printfn "%i"

0 comments on commit b263858

Please sign in to comment.