Skip to content
Closed
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
c445c57
Fix issues with package management subdirectories (#12381)
KevinRansom Nov 16, 2021
db2c9da
split large methods sensibly (#12397)
dsyme Nov 16, 2021
0458724
Add debug emit docs (#12411)
dsyme Nov 17, 2021
641ace3
Small typo (#12412)
jamil7 Nov 17, 2021
f0f9c17
[main] Update dependencies from dotnet/arcade (#12310)
dotnet-maestro[bot] Nov 17, 2021
9cba74d
Fix 12384: non-nested direct mutrec bindings (#12395)
dsyme Nov 19, 2021
57ef580
add fantomas tool to repo (#12403)
dsyme Nov 19, 2021
76e65ac
Add with keyword to Syntax tree (#12400)
nojaf Nov 19, 2021
8faf123
Fixes 12414: int32 --> Nullable Int64 additional implicit conversion…
dsyme Nov 20, 2021
e989f81
[main] Update dependencies from dotnet/arcade (#12426)
dotnet-maestro[bot] Nov 22, 2021
ef7944d
make diagnostic numbers unique (#12428)
dsyme Nov 22, 2021
7512e5c
Localized file check-in by OneLocBuild Task: Build definition ID 499:…
dotnet-bot Nov 22, 2021
8c300e6
Improve error message for invalid member declarations (#12342)
Nov 22, 2021
c194738
update messages (#12427)
dsyme Nov 22, 2021
5be669b
Localized file check-in by OneLocBuild Task: Build definition ID 499:…
dotnet-bot Nov 22, 2021
3d15c43
Fix 12405 (#12406)
KevinRansom Nov 22, 2021
c5da378
Fix debug tailcalls for pipelines if /tailcalls+ is explicitly specif…
dsyme Nov 22, 2021
2080a47
Localized file check-in by OneLocBuild Task: Build definition ID 499:…
dotnet-bot Nov 22, 2021
69ece79
Rename FSharpReferencedProject.ProjectFileName for clarity (#12431)
baronfel Nov 23, 2021
edd4c3b
12322: Fix deep recursive expression processing (#12420)
dsyme Nov 23, 2021
ee93e05
UnmanagedCallersOnlyAttribute is unsupported (#12350)
Happypig375 Nov 23, 2021
a847a71
Added CI job for deterministic builds (#12335)
TIHan Nov 23, 2021
cd7847d
Added service_slim
ncave Nov 15, 2021
adcea08
Async ParseAndCheckProject by Alfonso
ncave Nov 15, 2021
760f583
Added ParseAndCheckFileInProject
ncave Nov 15, 2021
2a49718
Add Compile to service_slim and pub-sub pattern
alfonsogarciacaro Dec 23, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Added ParseAndCheckFileInProject
  • Loading branch information
ncave authored and alfonsogarciacaro committed Nov 23, 2021
commit 760f583eee79962150dea90eae1cf460f428a3fc
12 changes: 7 additions & 5 deletions fcs/fcs-test/Program.fs
Original file line number Diff line number Diff line change
Expand Up @@ -83,24 +83,26 @@ let main argv =
let fileName = "test_script.fsx"
let fileNames = [| fileName |]
let source = File.ReadAllText (fileName, System.Text.Encoding.UTF8)
let sources = [| source |]

let dllName = Path.ChangeExtension(fileName, ".dll")
let args = mkProjectCommandLineArgsForScript (dllName, fileNames)
// for arg in args do printfn "%s" arg

let projectOptions = getProjectOptionsFromCommandLineArgs (projName, args)
let checker = InteractiveChecker.Create(projectOptions)
let sourceReader _fileName = (hash source, lazy source)

// parse and typecheck a project
let sourceReader _key = (1, lazy source)
let projectResults = checker.ParseAndCheckProject(projName, fileNames, sourceReader)
let projectResults =
checker.ParseAndCheckProject(projName, fileNames, sourceReader)
|> Async.RunSynchronously
projectResults.Diagnostics |> Array.iter (fun e -> printfn "%A: %A" (e.Severity) e)
printAst "ParseAndCheckProject" projectResults

// or just parse and typecheck a file in project
let parseResults, typeCheckResults, projectResults =
checker.ParseAndCheckFileInProject(fileName, projName, fileNames, sources)
let (parseResults, typeCheckResults, projectResults) =
checker.ParseAndCheckFileInProject(projName, fileNames, sourceReader, fileName)
|> Async.RunSynchronously
projectResults.Diagnostics |> Array.iter (fun e -> printfn "%A: %A" (e.Severity) e)

printAst "ParseAndCheckFileInProject" projectResults
Expand Down
67 changes: 65 additions & 2 deletions src/fsharp/FSharp.Compiler.Service/service_slim.fs
Original file line number Diff line number Diff line change
Expand Up @@ -163,8 +163,9 @@ module internal ParseAndCheck =
compilerState) =
let assemblyRef = mkSimpleAssemblyRef "stdin"
let access = tcState.TcEnvFromImpls.AccessRights
let symbolUses = Choice2Of2 TcSymbolUses.Empty
let dependencyFiles = parseResults |> Seq.map (fun x -> x.DependencyFiles) |> Array.concat
let details = (compilerState.tcGlobals, compilerState.tcImports, tcState.Ccu, tcState.CcuSig, (Choice2Of2 TcSymbolUses.Empty), topAttrsOpt,
let details = (compilerState.tcGlobals, compilerState.tcImports, tcState.Ccu, tcState.CcuSig, symbolUses, topAttrsOpt,
assemblyRef, access, tcImplFilesOpt, dependencyFiles, compilerState.projectOptions)
let keepAssemblyContents = true
FSharpCheckProjectResults (projectFileName, Some compilerState.tcConfig, keepAssemblyContents, errors, Some details)
Expand Down Expand Up @@ -211,6 +212,25 @@ module internal ParseAndCheck =
let tcErrors = DiagnosticHelpers.CreateDiagnostics (compilerState.tcConfig.errorSeverityOptions, false, fileName, (capturingErrorLogger.GetDiagnostics()), suggestNamesForErrors)
(tcResult, tcErrors), (tcState, moduleNamesDict)

let CheckFile (projectFileName: string, parseResults: FSharpParseFileResults, tcState: TcState, moduleNamesDict: ModuleNamesDict, compilerState) =
let sink = TcResultsSinkImpl(compilerState.tcGlobals)
let tcSink = TcResultsSink.WithSink sink
let (tcResult, tcErrors), (tcState, moduleNamesDict) =
TypeCheckOneInputEntry (parseResults, tcSink, tcState, moduleNamesDict, compilerState)
let fileName = parseResults.FileName
compilerState.checkCache.[fileName] <- ((tcResult, tcErrors), (tcState, moduleNamesDict))

let loadClosure = None
let keepAssemblyContents = true

let tcEnvAtEnd, _topAttrs, implFile, ccuSigForFile = tcResult
let errors = Array.append parseResults.Diagnostics tcErrors

let scope = TypeCheckInfo (compilerState.tcConfig, compilerState.tcGlobals, ccuSigForFile, tcState.Ccu, compilerState.tcImports, tcEnvAtEnd.AccessRights,
projectFileName, fileName, compilerState.projectOptions, sink.GetResolutions(), sink.GetSymbolUses(), tcEnvAtEnd.NameEnv,
loadClosure, implFile, sink.GetOpenDeclarations())
FSharpCheckFileResults (fileName, errors, Some scope, parseResults.DependencyFiles, None, keepAssemblyContents)

let TypeCheckClosedInputSet (parseResults: FSharpParseFileResults[], tcState, compilerState) =
let cachedTypeCheck (tcState, moduleNamesDict) (parseRes: FSharpParseFileResults) =
let checkCacheKey = parseRes.FileName
Expand Down Expand Up @@ -252,7 +272,7 @@ type InteractiveChecker internal (compilerStateCache) =
/// Parses and checks the whole project, good for compilers (Fable etc.)
/// Does not retain name resolutions and symbol uses which are quite memory hungry (so no intellisense etc.).
/// Already parsed files will be cached so subsequent compilations will be faster.
member _.ParseAndCheckProject (projectFileName: string, fileNames: string[], sourceReader: string->int*Lazy<string>, ?lastFile: string) = async {
member _.ParseAndCheckProject (projectFileName: string, fileNames: string[], sourceReader: string -> int * Lazy<string>, ?lastFile: string) = async {
let! compilerState = compilerStateCache.Get()
// parse files
let parsingOptions = FSharpParsingOptions.FromTcConfig(compilerState.tcConfig, fileNames, false)
Expand Down Expand Up @@ -284,3 +304,46 @@ type InteractiveChecker internal (compilerStateCache) =

return projectResults
}

/// Parses and checks file in project, will compile and cache all the files up to this one
/// (if not already done before), or fetch them from cache. Returns partial project results,
/// up to and including the file requested. Returns parse and typecheck results containing
/// name resolutions and symbol uses for the file requested only, so intellisense etc. works.
member _.ParseAndCheckFileInProject (projectFileName: string, fileNames: string[], sourceReader: string -> int * Lazy<string>, fileName: string) = async {
let! compilerState = compilerStateCache.Get()

// get files before file
let fileIndex = fileNames |> Array.findIndex ((=) fileName)
let fileNamesBeforeFile = fileNames |> Array.take fileIndex

// parse files before file
let parsingOptions = FSharpParsingOptions.FromTcConfig(compilerState.tcConfig, fileNames, false)
let parseFile fileName =
let sourceHash, source = sourceReader fileName
ParseFile (fileName, sourceHash, source, parsingOptions, compilerState)
let parseResults = fileNamesBeforeFile |> Array.map parseFile

// type check files before file
let tcState, topAttrs, tcImplFiles, _tcEnvAtEnd, moduleNamesDict, tcErrors =
TypeCheckClosedInputSet (parseResults, compilerState.tcInitialState, compilerState)

// parse and type check file
let parseFileResults = parseFile fileName
let checkFileResults = CheckFile (projectFileName, parseFileResults, tcState, moduleNamesDict, compilerState)
let (tcResult, _tcErrors), (tcState, _moduleNamesDict) = compilerState.checkCache.[fileName]
let _tcEnvAtEndFile, topAttrsFile, implFile, _ccuSigForFile = tcResult

// collect errors
let parseErrorsBefore = parseResults |> Array.collect (fun p -> p.Diagnostics)
let typedErrorsBefore = tcErrors |> Array.concat
let newErrors = checkFileResults.Diagnostics
let errors = ErrorsByFile (fileNames, [ parseErrorsBefore; typedErrorsBefore; newErrors ])

// make partial project results
let parseResults = Array.append parseResults [| parseFileResults |]
let tcImplFiles = List.append tcImplFiles (Option.toList implFile)
let topAttrs = CombineTopAttrs topAttrsFile topAttrs
let projectResults = MakeProjectResults (projectFileName, parseResults, tcState, errors, Some topAttrs, Some tcImplFiles, compilerState)

return (parseFileResults, checkFileResults, projectResults)
}