Skip to content

Commit db38206

Browse files
authored
Consolidating code around process exiting (#13784)
1 parent 6735c6f commit db38206

File tree

7 files changed

+27
-32
lines changed

7 files changed

+27
-32
lines changed

src/Compiler/Driver/CompilerConfig.fs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -577,6 +577,8 @@ type TcConfigBuilder =
577577
mutable langVersion: LanguageVersion
578578

579579
mutable xmlDocInfoLoader: IXmlDocumentationInfoLoader option
580+
581+
mutable exiter: Exiter
580582
}
581583

582584
// Directories to start probing in
@@ -762,6 +764,7 @@ type TcConfigBuilder =
762764
rangeForErrors = rangeForErrors
763765
sdkDirOverride = sdkDirOverride
764766
xmlDocInfoLoader = None
767+
exiter = QuitProcessExiter
765768
}
766769

767770
member tcConfigB.FxResolver =
@@ -1303,6 +1306,7 @@ type TcConfig private (data: TcConfigBuilder, validate: bool) =
13031306
member _.noConditionalErasure = data.noConditionalErasure
13041307
member _.applyLineDirectives = data.applyLineDirectives
13051308
member _.xmlDocInfoLoader = data.xmlDocInfoLoader
1309+
member _.exiter = data.exiter
13061310

13071311
static member Create(builder, validate) =
13081312
use unwindBuildPhase = PushThreadBuildPhaseUntilUnwind BuildPhase.Parameter

src/Compiler/Driver/CompilerConfig.fsi

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -478,6 +478,8 @@ type TcConfigBuilder =
478478
mutable langVersion: LanguageVersion
479479

480480
mutable xmlDocInfoLoader: IXmlDocumentationInfoLoader option
481+
482+
mutable exiter: Exiter
481483
}
482484

483485
static member CreateNew:
@@ -837,6 +839,8 @@ type TcConfig =
837839
/// Check if the primary assembly is mscorlib
838840
member assumeDotNetFramework: bool
839841

842+
member exiter: Exiter
843+
840844
/// Represents a computation to return a TcConfig. Normally this is just a constant immutable TcConfig,
841845
/// but for F# Interactive it may be based on an underlying mutable TcConfigBuilder.
842846
[<Sealed>]

src/Compiler/Driver/CompilerOptions.fs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1137,7 +1137,7 @@ let languageFlags tcConfigB =
11371137
tagNone,
11381138
OptionConsoleOnly(fun _ ->
11391139
Console.Write(GetLanguageVersions())
1140-
exit 0),
1140+
tcConfigB.exiter.Exit 0),
11411141
None,
11421142
Some(FSComp.SR.optsGetLangVersions ())
11431143
)
@@ -2035,7 +2035,7 @@ let miscFlagsBoth tcConfigB =
20352035
tagNone,
20362036
OptionConsoleOnly(fun _ ->
20372037
Console.Write(GetVersion tcConfigB)
2038-
exit 0),
2038+
tcConfigB.exiter.Exit 0),
20392039
None,
20402040
Some(FSComp.SR.optsVersion ())
20412041
)
@@ -2049,7 +2049,7 @@ let miscFlagsFsc tcConfigB =
20492049
tagNone,
20502050
OptionConsoleOnly(fun blocks ->
20512051
Console.Write(GetHelpFsc tcConfigB blocks)
2052-
exit 0),
2052+
tcConfigB.exiter.Exit 0),
20532053
None,
20542054
Some(FSComp.SR.optsHelp ())
20552055
)
@@ -2110,7 +2110,7 @@ let abbreviatedFlagsFsc tcConfigB =
21102110
tagNone,
21112111
OptionConsoleOnly(fun blocks ->
21122112
Console.Write(GetHelpFsc tcConfigB blocks)
2113-
exit 0),
2113+
tcConfigB.exiter.Exit 0),
21142114
None,
21152115
Some(FSComp.SR.optsShortFormOf ("--help"))
21162116
)
@@ -2120,7 +2120,7 @@ let abbreviatedFlagsFsc tcConfigB =
21202120
tagNone,
21212121
OptionConsoleOnly(fun blocks ->
21222122
Console.Write(GetHelpFsc tcConfigB blocks)
2123-
exit 0),
2123+
tcConfigB.exiter.Exit 0),
21242124
None,
21252125
Some(FSComp.SR.optsShortFormOf ("--help"))
21262126
)
@@ -2130,7 +2130,7 @@ let abbreviatedFlagsFsc tcConfigB =
21302130
tagNone,
21312131
OptionConsoleOnly(fun blocks ->
21322132
Console.Write(GetHelpFsc tcConfigB blocks)
2133-
exit 0),
2133+
tcConfigB.exiter.Exit 0),
21342134
None,
21352135
Some(FSComp.SR.optsShortFormOf ("--help"))
21362136
)

src/Compiler/Driver/ParseAndCheckInputs.fs

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -471,27 +471,27 @@ let ParseInput
471471
type Tokenizer = unit -> Parser.token
472472

473473
// Show all tokens in the stream, for testing purposes
474-
let ShowAllTokensAndExit (shortFilename, tokenizer: Tokenizer, lexbuf: LexBuffer<char>) =
474+
let ShowAllTokensAndExit (shortFilename, tokenizer: Tokenizer, lexbuf: LexBuffer<char>, exiter: Exiter) =
475475
while true do
476476
printf "tokenize - getting one token from %s\n" shortFilename
477477
let t = tokenizer ()
478478
printf "tokenize - got %s @ %a\n" (Parser.token_to_string t) outputRange lexbuf.LexemeRange
479479

480480
match t with
481-
| Parser.EOF _ -> exit 0
481+
| Parser.EOF _ -> exiter.Exit 0
482482
| _ -> ()
483483

484484
if lexbuf.IsPastEndOfStream then
485485
printf "!!! at end of stream\n"
486486

487487
// Test one of the parser entry points, just for testing purposes
488-
let TestInteractionParserAndExit (tokenizer: Tokenizer, lexbuf: LexBuffer<char>) =
488+
let TestInteractionParserAndExit (tokenizer: Tokenizer, lexbuf: LexBuffer<char>, exiter: Exiter) =
489489
while true do
490490
match (Parser.interaction (fun _ -> tokenizer ()) lexbuf) with
491491
| ParsedScriptInteraction.Definitions (l, m) -> printfn "Parsed OK, got %d defs @ %a" l.Length outputRange m
492492
| ParsedScriptInteraction.HashDirective (_, m) -> printfn "Parsed OK, got hash @ %a" outputRange m
493493

494-
exit 0
494+
exiter.Exit 0
495495

496496
// Report the statistics for testing purposes
497497
let ReportParsingStatistics res =
@@ -606,11 +606,11 @@ let ParseOneInputLexbuf (tcConfig: TcConfig, lexResourceManager, lexbuf, fileNam
606606

607607
// If '--tokenize' then show the tokens now and exit
608608
if tokenizeOnly then
609-
ShowAllTokensAndExit(shortFilename, tokenizer, lexbuf)
609+
ShowAllTokensAndExit(shortFilename, tokenizer, lexbuf, tcConfig.exiter)
610610

611611
// Test hook for one of the parser entry points
612612
if tcConfig.testInteractionParser then
613-
TestInteractionParserAndExit(tokenizer, lexbuf)
613+
TestInteractionParserAndExit(tokenizer, lexbuf, tcConfig.exiter)
614614

615615
// Parse the input
616616
let res =
@@ -741,7 +741,6 @@ let ParseInputFiles
741741
lexResourceManager,
742742
sourceFiles,
743743
diagnosticsLogger: DiagnosticsLogger,
744-
exiter: Exiter,
745744
createDiagnosticsLogger: Exiter -> CapturingDiagnosticsLogger,
746745
retryLocked
747746
) =
@@ -764,7 +763,7 @@ let ParseInputFiles
764763
sourceFiles
765764
|> Array.map (fun (fileName, _) ->
766765
checkInputFile tcConfig fileName
767-
createDiagnosticsLogger (delayedExiter))
766+
createDiagnosticsLogger delayedExiter)
768767

769768
let results =
770769
try
@@ -790,7 +789,7 @@ let ParseInputFiles
790789
delayedDiagnosticsLoggers
791790
|> Array.iter (fun delayedDiagnosticsLogger -> delayedDiagnosticsLogger.CommitDelayedDiagnostics diagnosticsLogger)
792791
with StopProcessing ->
793-
exiter.Exit exitCode
792+
tcConfig.exiter.Exit exitCode
794793

795794
results |> List.ofArray
796795
else
@@ -806,7 +805,7 @@ let ParseInputFiles
806805

807806
with e ->
808807
errorRecoveryNoRange e
809-
exiter.Exit 1
808+
tcConfig.exiter.Exit 1
810809

811810
let ProcessMetaCommandsFromInput
812811
(nowarnF: 'state -> range * string -> 'state,

src/Compiler/Driver/ParseAndCheckInputs.fsi

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,6 @@ val ParseInputFiles:
104104
lexResourceManager: Lexhelp.LexResourceManager *
105105
sourceFiles: string list *
106106
diagnosticsLogger: DiagnosticsLogger *
107-
exiter: Exiter *
108107
createDiagnosticsLogger: (Exiter -> CapturingDiagnosticsLogger) *
109108
retryLocked: bool ->
110109
(ParsedInput * string) list

src/Compiler/Driver/fsc.fs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -510,6 +510,8 @@ let main1
510510
rangeForErrors = range0
511511
)
512512

513+
tcConfigB.exiter <- exiter
514+
513515
// Preset: --optimize+ -g --tailcalls+ (see 4505)
514516
SetOptimizeSwitch tcConfigB OptionSwitch.On
515517
SetDebugSwitch tcConfigB None OptionSwitch.Off
@@ -609,7 +611,7 @@ let main1
609611
(fun exiter -> diagnosticsLoggerProvider.CreateDelayAndForwardLogger(exiter) :> CapturingDiagnosticsLogger)
610612

611613
let inputs =
612-
ParseInputFiles(tcConfig, lexResourceManager, sourceFiles, diagnosticsLogger, exiter, createDiagnosticsLogger, false)
614+
ParseInputFiles(tcConfig, lexResourceManager, sourceFiles, diagnosticsLogger, createDiagnosticsLogger, false)
613615

614616
let inputs, _ =
615617
(Map.empty, inputs)

src/fsc/fscmain.fs

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -72,19 +72,6 @@ let main (argv) =
7272
stats.rawMemoryFileCount
7373
stats.weakByteFileCount)
7474

75-
// This object gets invoked when two many errors have been accumulated, or an abort-on-error condition
76-
// has been reached (e.g. type checking failed, so don't proceed to optimization).
77-
let quitProcessExiter =
78-
{ new Exiter with
79-
member _.Exit(n) =
80-
try
81-
exit n
82-
with _ ->
83-
()
84-
85-
failwithf "%s" (FSComp.SR.elSysEnvExitDidntExit ())
86-
}
87-
8875
// Get the handler for legacy resolution of references via MSBuild.
8976
let legacyReferenceResolver = LegacyMSBuildReferenceResolver.getResolver ()
9077

@@ -101,7 +88,7 @@ let main (argv) =
10188
false,
10289
ReduceMemoryFlag.No,
10390
CopyFSharpCoreFlag.Yes,
104-
quitProcessExiter,
91+
QuitProcessExiter,
10592
ConsoleLoggerProvider(),
10693
None,
10794
None

0 commit comments

Comments
 (0)