Skip to content

Commit 4de2e9b

Browse files
ncavealfonsogarciacaro
authored andcommitted
Added ParseAndCheckFileInProject
1 parent 51c20c3 commit 4de2e9b

3 files changed

Lines changed: 34 additions & 22 deletions

File tree

src/dotnet/Fable.Repl/Interfaces.fs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ type IFableManager =
5252
abstract ClearParseCaches: checker: IChecker -> unit
5353
abstract ParseFSharpScript: checker: IChecker * fileName: string * source: string -> IParseResults
5454
abstract ParseFSharpProject: checker: IChecker * projectFileName: string * fileNames: string[] * sources: string[] -> IParseResults
55+
abstract ParseFSharpFileInProject: checker: IChecker * fileName: string * projectFileName: string * fileNames: string[] * sources: string[] -> IParseResults
5556
abstract GetParseErrors: parseResults: IParseResults -> Error[]
5657
abstract GetDeclarationLocation: parseResults: IParseResults * line: int * col: int * lineText: string -> Async<Range option>
5758
abstract GetToolTipText: parseResults: IParseResults * line: int * col: int * lineText: string -> Async<string[]>

src/dotnet/Fable.Repl/Main.fs

Lines changed: 24 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -11,20 +11,19 @@ type CheckerImpl(checker: InteractiveChecker) =
1111
member __.Checker = checker
1212
interface IChecker
1313

14-
let mapErrors (checkProjectResults: FSharpCheckProjectResults) =
15-
checkProjectResults.Errors
16-
|> Array.map (fun er -> {
17-
FileName = er.FileName
18-
StartLineAlternate = er.StartLineAlternate
19-
StartColumn = er.StartColumn
20-
EndLineAlternate = er.EndLineAlternate
21-
EndColumn = er.EndColumn
22-
Message = er.Message
14+
let mapError (error: FSharpErrorInfo) =
15+
{
16+
FileName = error.FileName
17+
StartLineAlternate = error.StartLineAlternate
18+
StartColumn = error.StartColumn
19+
EndLineAlternate = error.EndLineAlternate
20+
EndColumn = error.EndColumn
21+
Message = error.Message
2322
IsWarning =
24-
match er.Severity with
23+
match error.Severity with
2524
| FSharpErrorSeverity.Error -> false
2625
| FSharpErrorSeverity.Warning -> true
27-
})
26+
}
2827

2928
type ParseResults (optimizedProject: Lazy<Project>,
3029
unoptimizedProject: Lazy<Project>,
@@ -42,7 +41,7 @@ type ParseResults (optimizedProject: Lazy<Project>,
4241
member __.CheckProjectResults = checkProjectResults
4342

4443
interface IParseResults with
45-
member __.Errors = mapErrors checkProjectResults
44+
member __.Errors = checkProjectResults.Errors |> Array.map mapError
4645

4746
let inline private tryGetLexerSymbolIslands (sym: Lexer.LexerSymbol) =
4847
match sym.Text with
@@ -134,12 +133,12 @@ let makeProject projectOptions (projectResults: FSharpCheckProjectResults) optim
134133
project
135134

136135
let parseFSharpScript (checker: InteractiveChecker) projectFileName fileName source =
137-
let parseResults, typeCheckResults, projectResults =
136+
let parseResults, checkResults, projectResults =
138137
checker.ParseAndCheckScript (projectFileName, fileName, source)
139138
let projectOptions = makeProjOptions projectFileName [| fileName |]
140139
let optimizedProject = lazy (makeProject projectOptions projectResults true)
141140
let unoptimizedProject = lazy (makeProject projectOptions projectResults false)
142-
ParseResults (optimizedProject, unoptimizedProject, Some parseResults, Some typeCheckResults, projectResults)
141+
ParseResults (optimizedProject, unoptimizedProject, Some parseResults, Some checkResults, projectResults)
143142

144143
let parseFSharpProject (checker: InteractiveChecker) projectFileName fileNames sources =
145144
let projectResults = checker.ParseAndCheckProject (projectFileName, fileNames, sources)
@@ -148,6 +147,13 @@ let parseFSharpProject (checker: InteractiveChecker) projectFileName fileNames s
148147
let unoptimizedProject = lazy (makeProject projectOptions projectResults false)
149148
ParseResults (optimizedProject, unoptimizedProject, None, None, projectResults)
150149

150+
let parseFSharpFileInProject (checker: InteractiveChecker) fileName projectFileName fileNames sources =
151+
let parseResults, checkResultsOpt, projectResults = checker.ParseAndCheckFileInProject (fileName, projectFileName, fileNames, sources)
152+
let projectOptions = makeProjOptions projectFileName fileNames
153+
let optimizedProject = lazy (makeProject projectOptions projectResults true)
154+
let unoptimizedProject = lazy (makeProject projectOptions projectResults false)
155+
ParseResults (optimizedProject, unoptimizedProject, Some parseResults, checkResultsOpt, projectResults)
156+
151157
let tooltipToString (el: FSharpToolTipElement<string>): string[] =
152158
let dataToString (data: FSharpToolTipElementData<string>) =
153159
[| match data.ParamName with
@@ -254,6 +260,10 @@ let init () =
254260
let c = checker :?> CheckerImpl
255261
parseFSharpProject c.Checker projectFileName fileNames sources :> IParseResults
256262

263+
member __.ParseFSharpFileInProject(checker, fileName, projectFileName, fileNames, sources) =
264+
let c = checker :?> CheckerImpl
265+
parseFSharpFileInProject c.Checker fileName projectFileName fileNames sources :> IParseResults
266+
257267
member __.GetParseErrors(parseResults:IParseResults) =
258268
parseResults.Errors
259269

src/dotnet/Fable.Repl/bench/app.fs

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -31,26 +31,27 @@ let main argv =
3131
| [|metadataPath; testScriptPath; compiledScriptPath|] -> metadataPath, testScriptPath, compiledScriptPath
3232
| _ -> metadataPath, testScriptPath, testScriptPath.Replace(".fsx", ".js")
3333
try
34-
let optimized = false
35-
// let writeAst = false
34+
let optimize = false
3635
// let fsAstFile = Fable.Path.ChangeExtension(testScriptPath, ".fsharp.ast.txt")
3736
// let babelAstFile = Fable.Path.ChangeExtension(testScriptPath, ".babel.ast.json")
37+
let projectFileName = "project"
38+
let fileName = testScriptPath
3839
let source = readAllText testScriptPath
3940
let fable = Fable.Repl.Main.init ()
40-
let createChecker () = fable.CreateChecker(references, readAllBytes metadataPath, None)
41+
let createChecker () = fable.CreateChecker(references, readAllBytes metadataPath, [||], optimize)
4142
let ms0, checker = measureTime createChecker ()
4243
printfn "InteractiveChecker created in %d ms" ms0
43-
let parseFSharpScript () = fable.ParseFSharpScript(checker, testScriptPath, source)
44-
let parseFable (res, fileName) = fable.CompileToBabelAst(fableLibraryDir, res, fileName, optimized)
44+
// let parseFSharpScript () = fable.ParseFSharpScript(checker, fileName, source)
45+
let parseFSharpScript () = fable.ParseFSharpFileInProject(checker, fileName, projectFileName, [|fileName|], [|source|])
46+
let parseFable (res, fileName) = fable.CompileToBabelAst(fableLibraryDir, res, fileName, optimize)
4547
let bench i =
46-
let fileName = testScriptPath
4748
let ms1, parseRes = measureTime parseFSharpScript ()
4849
let errors = fable.GetParseErrors parseRes
4950
errors |> Array.iter (printfn "Error: %A")
5051
if errors.Length > 0 then failwith "Too many errors."
5152
let ms2, babelAst = measureTime parseFable (parseRes, fileName)
52-
// if i = 1 && writeAst then
53-
// // let fsAstStr = fable.FSharpAstToString(parseRes, fileName, optimized)
53+
// if i = 1 then
54+
// // let fsAstStr = fable.FSharpAstToString(parseRes, fileName, optimize)
5455
// // printfn "%s Typed AST: %s" fileName fsAstStr
5556
// // writeAllText fsAstFile fsAstStr
5657
// // printfn "Babel AST: %s" (toJson babelAst)

0 commit comments

Comments
 (0)