Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
4 changes: 4 additions & 0 deletions src/Compiler/Driver/CompilerConfig.fs
Original file line numberDiff line numberDiff line change
Expand Up@@ -551,6 +551,8 @@ type TcConfigBuilder =

mutable fxResolver: FxResolver option

mutable bufferWidth: int option

// Is F# Interactive using multi-assembly emit?
mutable fsiMultiAssemblyEmit: bool

Expand DownExpand Up@@ -741,6 +743,7 @@ type TcConfigBuilder =
shadowCopyReferences = false
useSdkRefs = true
fxResolver = None
bufferWidth = None
fsiMultiAssemblyEmit = true
internalTestSpanStackReferring = false
noConditionalErasure = false
Expand DownExpand Up@@ -1163,6 +1166,7 @@ type TcConfig private (data: TcConfigBuilder, validate: bool) =
errorRecovery e range0
[]

member _.bufferWidth = data.bufferWidth
member _.fsiMultiAssemblyEmit = data.fsiMultiAssemblyEmit
member _.FxResolver = data.FxResolver
member _.primaryAssembly = data.primaryAssembly
Expand Down
5 changes: 5 additions & 0 deletions src/Compiler/Driver/CompilerConfig.fsi
Original file line numberDiff line numberDiff line change
Expand Up@@ -452,6 +452,8 @@ type TcConfigBuilder =

mutable fxResolver: FxResolver option

mutable bufferWidth: int option

mutable fsiMultiAssemblyEmit: bool

rangeForErrors: range
Expand DownExpand Up@@ -746,13 +748,16 @@ type TcConfig =
member alwaysCallVirt: bool

member noDebugAttributes: bool

member useReflectionFreeCodeGen: bool

/// If true, indicates all type checking and code generation is in the context of fsi.exe
member isInteractive: bool

member isInvalidationSupported: bool

member bufferWidth: int option

/// Indicates if F# Interactive is using single-assembly emit via Reflection.Emit, where internals are available.
member fsiMultiAssemblyEmit: bool

Expand Down
43 changes: 28 additions & 15 deletions src/Compiler/Driver/CompilerOptions.fs
Original file line numberDiff line numberDiff line change
Expand Up@@ -115,23 +115,27 @@ let compilerOptionUsage (CompilerOption (s, tag, spec, _, _)) =

let nl = Environment.NewLine

let getCompilerOption (CompilerOption (_s, _tag, _spec, _, help) as compilerOption) =
let getCompilerOption (CompilerOption (_s, _tag, _spec, _, help) as compilerOption) width =
let sb = StringBuilder()

let flagWidth = 42 // fixed width for printing of flags, e.g. --debug:{full|pdbonly|portable|embedded}
let defaultLineWidth = 80 // the fallback width

let lineWidth =
try
Console.BufferWidth
with e ->
defaultLineWidth
match width with
| None ->
try
Console.BufferWidth
with _ ->
defaultLineWidth
| Some w -> w

let lineWidth =
if lineWidth = 0 then
defaultLineWidth
else
lineWidth (* Have seen BufferWidth=0 on Linux/Mono *)
lineWidth (* Have seen BufferWidth=0 on Linux/Mono Coreclr for sure *)

// Lines have this form: <flagWidth><space><description>
// flagWidth chars - for flags description or padding on continuation lines.
// single space - space.
Expand DownExpand Up@@ -159,14 +163,14 @@ let getCompilerOption (CompilerOption (_s, _tag, _spec, _, help) as compilerOpti
let _ = sb.Append $"{nl}"
sb.ToString()

let getPublicOptions (heading, opts) =
if not (isNil opts) then
$"{nl}{nl}\t\t{heading}{nl}"
+ (opts |> List.map getCompilerOption |> String.concat "")
else
""
let getPublicOptions heading opts width =
match opts with
| [] -> ""
| _ ->
$"{nl}{nl} {heading}{nl}"
+ (opts |> List.map (fun t -> getCompilerOption t width) |> String.concat "")

let GetCompilerOptionBlocks blocks =
let GetCompilerOptionBlocks blocks width =
let sb = new StringBuilder()

let publicBlocks =
Expand All@@ -182,7 +186,7 @@ let GetCompilerOptionBlocks blocks =
let headingOptions =
publicBlocks |> List.filter (fun (h2, _) -> heading = h2) |> List.collect snd

let _ = sb.Append(getPublicOptions (heading, headingOptions))
let _ = sb.Append(getPublicOptions heading headingOptions width)
Set.add heading doneHeadings

List.fold consider Set.empty publicBlocks |> ignore<Set<string>>
Expand DownExpand Up@@ -1462,6 +1466,14 @@ let internalFlags (tcConfigB: TcConfigBuilder) =
None
)

CompilerOption(
"bufferwidth",
tagNone,
OptionInt((fun v -> tcConfigB.bufferWidth <- Some v)),
Some(InternalCommandLineOption("--bufferWidth", rangeCmdArgs)),
None
)

CompilerOption(
"detuple",
tagNone,
Expand DownExpand Up@@ -1997,7 +2009,8 @@ let GetBannerText tcConfigB =

/// FSC only help. (FSI has it's own help function).
let GetHelpFsc tcConfigB (blocks: CompilerOptionBlock list) =
GetBannerText tcConfigB + GetCompilerOptionBlocks blocks

GetBannerText tcConfigB + GetCompilerOptionBlocks blocks tcConfigB.bufferWidth

let GetVersion tcConfigB =
$"{tcConfigB.productNameForBannerText}{nl}"
Expand Down
2 changes: 1 addition & 1 deletion src/Compiler/Driver/CompilerOptions.fsi
Original file line numberDiff line numberDiff line change
Expand Up@@ -43,7 +43,7 @@ and CompilerOptionBlock =
| PublicOptions of heading: string * options: CompilerOption list
| PrivateOptions of options: CompilerOption list

val GetCompilerOptionBlocks: CompilerOptionBlock list -> string
val GetCompilerOptionBlocks: CompilerOptionBlock list -> width: int option -> string

val DumpCompilerOptionBlocks: CompilerOptionBlock list -> unit // for QA

Expand Down
2 changes: 1 addition & 1 deletion src/Compiler/Interactive/fsi.fs
Original file line numberDiff line numberDiff line change
Expand Up@@ -885,7 +885,7 @@ type internal FsiCommandLineOptions(fsi: FsiEvaluationSessionHostConfig,
Console.Write (GetBannerText tcConfigB)
fprintfn fsiConsoleOutput.Out ""
fprintfn fsiConsoleOutput.Out "%s" (FSIstrings.SR.fsiUsage(executableFileNameWithoutExtension.Value))
Console.Write (GetCompilerOptionBlocks blocks)
Console.Write (GetCompilerOptionBlocks blocks tcConfigB.bufferWidth)
exit 0

// option tags
Expand Down
26 changes: 12 additions & 14 deletions tests/FSharp.Compiler.Service.Tests/ConsoleOnlyOptionsTests.fs
Original file line numberDiff line numberDiff line change
Expand Up@@ -5,27 +5,25 @@ module FSharp.Compiler.Service.Tests.ConsoleOnlyOptionsTests
open System
open System.IO
open FSharp.Compiler.CompilerOptions
open FSharp.Compiler.Text.Range
open NUnit.Framework
open TestDoubles

[<Test>]
[<Ignore "Failing in main, disabling until resolved">]
let ``Help is displayed correctly`` () =
try
if System.Console.BufferWidth < 80 then
System.Console.BufferWidth <- 80
with _ -> ()
let ``fsc help text is displayed correctly`` () =

let builder = getArbitraryTcConfigBuilder()
builder.showBanner <- false // We don't need the banner

let blocks = GetCoreFscCompilerOptions builder
let builder = getArbitraryTcConfigBuilder()
builder.showBanner <- false // We don't need the banner
builder.TurnWarningOff(rangeCmdArgs, "75") // We are going to use a test only flag
builder.bufferWidth <- Some 80 // Fixed width 80

let expectedHelp = File.ReadAllText $"{__SOURCE_DIRECTORY__}/expected-help-output.bsl"

let expectedHelp = File.ReadAllText $"{__SOURCE_DIRECTORY__}/expected-help-output.bsl"
let help = GetHelpFsc builder blocks
let blocks = GetCoreFscCompilerOptions builder
let help = GetHelpFsc builder blocks
let actualHelp = help.Replace("\r\n", Environment.NewLine)

let actualHelp = help.Replace("\r\n", Environment.NewLine)
Assert.AreEqual(expectedHelp, actualHelp, $"Console width: {System.Console.BufferWidth}\nExpected: {expectedHelp}\n Actual: {actualHelp}") |> ignore
Assert.AreEqual(expectedHelp, actualHelp, $"Expected: '{expectedHelp}'\n Actual: '{actualHelp}'") |> ignore

[<Test>]
let ``Version is displayed correctly`` () =
Expand Down
16 changes: 8 additions & 8 deletions tests/FSharp.Compiler.Service.Tests/expected-help-output.bsl
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@

- OUTPUT FILES -
- OUTPUT FILES -
--out:<file> Name of the output file (Short form:
-o)
--target:exe Build a console executable
Expand DownExpand Up@@ -46,15 +46,15 @@
the specified file path.


- INPUT FILES -
- INPUT FILES -
--reference:<file> Reference an assembly (Short form:
-r)
--compilertool:<file> Reference an assembly or directory
containing a design time tool (Short
form: -t)


- RESOURCES -
- RESOURCES -
--win32icon:<file> Specify a Win32 icon file (.ico)
--win32res:<file> Specify a Win32 resource file (.res)
--win32manifest:<file> Specify a Win32 manifest file
Expand All@@ -67,7 +67,7 @@
name>[,public|private]]


- CODE GENERATION -
- CODE GENERATION -
--debug[+|-] Emit debug information (Short form:
-g)
--debug:{full|pdbonly|portable|embedded} Specify debugging type: full,
Expand DownExpand Up@@ -99,7 +99,7 @@
constructs using reflection


- ERRORS AND WARNINGS -
- ERRORS AND WARNINGS -
--warnaserror[+|-] Report all warnings as errors
--warnaserror[+|-]:<warn;...> Report specific warnings as errors
--warn:<n> Set a warning level (0-5)
Expand All@@ -110,7 +110,7 @@
color


- LANGUAGE -
- LANGUAGE -
--langversion:{?|version|latest|preview} Display the allowed values for
language version, specify language
version such as 'latest' or
Expand All@@ -121,7 +121,7 @@
--mlcompatibility Ignore ML compatibility warnings


- MISCELLANEOUS -
- MISCELLANEOUS -
--nologo Suppress compiler copyright message
--version Display compiler version banner and
exit
Expand All@@ -130,7 +130,7 @@
--@<file> Read response file for more options


- ADVANCED -
- ADVANCED -
--codepage:<n> Specify the codepage used to read
source files
--utf8output Output messages in UTF-8 encoding
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -2,7 +2,7 @@ Microsoft (R) F# Compiler version 12.0.0.0 for F# 6.0
Copyright (c) Microsoft Corporation. All Rights Reserved.


- OUTPUT FILES -
- OUTPUT FILES -
--out:<file> Name of the output file (Short form:
-o)
--target:exe Build a console executable
Expand DownExpand Up@@ -48,15 +48,15 @@ Copyright (c) Microsoft Corporation. All Rights Reserved.
the specified file path.


- INPUT FILES -
- INPUT FILES -
--reference:<file> Reference an assembly (Short form:
-r)
--compilertool:<file> Reference an assembly or directory
containing a design time tool (Short
form: -t)


- RESOURCES -
- RESOURCES -
--win32icon:<file> Specify a Win32 icon file (.ico)
--win32res:<file> Specify a Win32 resource file (.res)
--win32manifest:<file> Specify a Win32 manifest file
Expand All@@ -69,7 +69,7 @@ Copyright (c) Microsoft Corporation. All Rights Reserved.
name>[,public|private]]


- CODE GENERATION -
- CODE GENERATION -
--debug[+|-] Emit debug information (Short form:
-g)
--debug:{full|pdbonly|portable|embedded} Specify debugging type: full,
Expand DownExpand Up@@ -101,7 +101,7 @@ Copyright (c) Microsoft Corporation. All Rights Reserved.
constructs using reflection


- ERRORS AND WARNINGS -
- ERRORS AND WARNINGS -
--warnaserror[+|-] Report all warnings as errors
--warnaserror[+|-]:<warn;...> Report specific warnings as errors
--warn:<n> Set a warning level (0-5)
Expand All@@ -112,7 +112,7 @@ Copyright (c) Microsoft Corporation. All Rights Reserved.
color


- LANGUAGE -
- LANGUAGE -
--langversion:{?|version|latest|preview} Display the allowed values for
language version, specify language
version such as 'latest' or
Expand All@@ -123,7 +123,7 @@ Copyright (c) Microsoft Corporation. All Rights Reserved.
--mlcompatibility Ignore ML compatibility warnings


- MISCELLANEOUS -
- MISCELLANEOUS -
--nologo Suppress compiler copyright message
--version Display compiler version banner and
exit
Expand All@@ -132,7 +132,7 @@ Copyright (c) Microsoft Corporation. All Rights Reserved.
--@<file> Read response file for more options


- ADVANCED -
- ADVANCED -
--codepage:<n> Specify the codepage used to read
source files
--utf8output Output messages in UTF-8 encoding
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -2,7 +2,7 @@
Usage: fsharpi <options> [script.fsx [<arguments>]]


- INPUT FILES -
- INPUT FILES -
--use:<file> Use the given file on startup as
initial input
--load:<file> #load the given file on startup
Expand All@@ -16,7 +16,7 @@ Usage: fsharpi <options> [script.fsx [<arguments>]]
fsi.CommandLineArgs


- CODE GENERATION -
- CODE GENERATION -
--debug[+|-] Emit debug information (Short form:
-g)
--debug:{full|pdbonly|portable|embedded} Specify debugging type: full,
Expand All@@ -42,7 +42,7 @@ Usage: fsharpi <options> [script.fsx [<arguments>]]
constructs using reflection


- ERRORS AND WARNINGS -
- ERRORS AND WARNINGS -
--warnaserror[+|-] Report all warnings as errors
--warnaserror[+|-]:<warn;...> Report specific warnings as errors
--warn:<n> Set a warning level (0-5)
Expand All@@ -53,7 +53,7 @@ Usage: fsharpi <options> [script.fsx [<arguments>]]
color


- LANGUAGE -
- LANGUAGE -
--langversion:{?|version|latest|preview} Display the allowed values for
language version, specify language
version such as 'latest' or
Expand All@@ -64,15 +64,15 @@ Usage: fsharpi <options> [script.fsx [<arguments>]]
--mlcompatibility Ignore ML compatibility warnings


- MISCELLANEOUS -
- MISCELLANEOUS -
--nologo Suppress compiler copyright message
--version Display compiler version banner and
exit
--help Display this usage message (Short
form: -?)


- ADVANCED -
- ADVANCED -
--codepage:<n> Specify the codepage used to read
source files
--utf8output Output messages in UTF-8 encoding
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
4 changes: 4 additions & 0 deletions src/Compiler/Driver/CompilerConfig.fs
Original file line numberDiff line numberDiff line change
Expand Up@@ -551,6 +551,8 @@ type TcConfigBuilder =

mutable fxResolver: FxResolver option

mutable bufferWidth: int option

// Is F# Interactive using multi-assembly emit?
mutable fsiMultiAssemblyEmit: bool

Expand DownExpand Up@@ -741,6 +743,7 @@ type TcConfigBuilder =
shadowCopyReferences = false
useSdkRefs = true
fxResolver = None
bufferWidth = None
fsiMultiAssemblyEmit = true
internalTestSpanStackReferring = false
noConditionalErasure = false
Expand DownExpand Up@@ -1163,6 +1166,7 @@ type TcConfig private (data: TcConfigBuilder, validate: bool) =
errorRecovery e range0
[]

member _.bufferWidth = data.bufferWidth
member _.fsiMultiAssemblyEmit = data.fsiMultiAssemblyEmit
member _.FxResolver = data.FxResolver
member _.primaryAssembly = data.primaryAssembly
Expand Down
5 changes: 5 additions & 0 deletions src/Compiler/Driver/CompilerConfig.fsi
Original file line numberDiff line numberDiff line change
Expand Up@@ -452,6 +452,8 @@ type TcConfigBuilder =

mutable fxResolver: FxResolver option

mutable bufferWidth: int option

mutable fsiMultiAssemblyEmit: bool

rangeForErrors: range
Expand DownExpand Up@@ -746,13 +748,16 @@ type TcConfig =
member alwaysCallVirt: bool

member noDebugAttributes: bool

member useReflectionFreeCodeGen: bool

/// If true, indicates all type checking and code generation is in the context of fsi.exe
member isInteractive: bool

member isInvalidationSupported: bool

member bufferWidth: int option

/// Indicates if F# Interactive is using single-assembly emit via Reflection.Emit, where internals are available.
member fsiMultiAssemblyEmit: bool

Expand Down
43 changes: 28 additions & 15 deletions src/Compiler/Driver/CompilerOptions.fs
Original file line numberDiff line numberDiff line change
Expand Up@@ -115,23 +115,27 @@ let compilerOptionUsage (CompilerOption (s, tag, spec, _, _)) =

let nl = Environment.NewLine

let getCompilerOption (CompilerOption (_s, _tag, _spec, _, help) as compilerOption) =
let getCompilerOption (CompilerOption (_s, _tag, _spec, _, help) as compilerOption) width =
let sb = StringBuilder()

let flagWidth = 42 // fixed width for printing of flags, e.g. --debug:{full|pdbonly|portable|embedded}
let defaultLineWidth = 80 // the fallback width

let lineWidth =
try
Console.BufferWidth
with e ->
defaultLineWidth
match width with
| None ->
try
Console.BufferWidth
with _ ->
defaultLineWidth
| Some w -> w

let lineWidth =
if lineWidth = 0 then
defaultLineWidth
else
lineWidth (* Have seen BufferWidth=0 on Linux/Mono *)
lineWidth (* Have seen BufferWidth=0 on Linux/Mono Coreclr for sure *)

// Lines have this form: <flagWidth><space><description>
// flagWidth chars - for flags description or padding on continuation lines.
// single space - space.
Expand DownExpand Up@@ -159,14 +163,14 @@ let getCompilerOption (CompilerOption (_s, _tag, _spec, _, help) as compilerOpti
let _ = sb.Append $"{nl}"
sb.ToString()

let getPublicOptions (heading, opts) =
if not (isNil opts) then
$"{nl}{nl}\t\t{heading}{nl}"
+ (opts |> List.map getCompilerOption |> String.concat "")
else
""
let getPublicOptions heading opts width =
match opts with
| [] -> ""
| _ ->
$"{nl}{nl} {heading}{nl}"
+ (opts |> List.map (fun t -> getCompilerOption t width) |> String.concat "")

let GetCompilerOptionBlocks blocks =
let GetCompilerOptionBlocks blocks width =
let sb = new StringBuilder()

let publicBlocks =
Expand All@@ -182,7 +186,7 @@ let GetCompilerOptionBlocks blocks =
let headingOptions =
publicBlocks |> List.filter (fun (h2, _) -> heading = h2) |> List.collect snd

let _ = sb.Append(getPublicOptions (heading, headingOptions))
let _ = sb.Append(getPublicOptions heading headingOptions width)
Set.add heading doneHeadings

List.fold consider Set.empty publicBlocks |> ignore<Set<string>>
Expand DownExpand Up@@ -1462,6 +1466,14 @@ let internalFlags (tcConfigB: TcConfigBuilder) =
None
)

CompilerOption(
"bufferwidth",
tagNone,
OptionInt((fun v -> tcConfigB.bufferWidth <- Some v)),
Some(InternalCommandLineOption("--bufferWidth", rangeCmdArgs)),
None
)

CompilerOption(
"detuple",
tagNone,
Expand DownExpand Up@@ -1997,7 +2009,8 @@ let GetBannerText tcConfigB =

/// FSC only help. (FSI has it's own help function).
let GetHelpFsc tcConfigB (blocks: CompilerOptionBlock list) =
GetBannerText tcConfigB + GetCompilerOptionBlocks blocks

GetBannerText tcConfigB + GetCompilerOptionBlocks blocks tcConfigB.bufferWidth

let GetVersion tcConfigB =
$"{tcConfigB.productNameForBannerText}{nl}"
Expand Down
2 changes: 1 addition & 1 deletion src/Compiler/Driver/CompilerOptions.fsi
Original file line numberDiff line numberDiff line change
Expand Up@@ -43,7 +43,7 @@ and CompilerOptionBlock =
| PublicOptions of heading: string * options: CompilerOption list
| PrivateOptions of options: CompilerOption list

val GetCompilerOptionBlocks: CompilerOptionBlock list -> string
val GetCompilerOptionBlocks: CompilerOptionBlock list -> width: int option -> string

val DumpCompilerOptionBlocks: CompilerOptionBlock list -> unit // for QA

Expand Down
2 changes: 1 addition & 1 deletion src/Compiler/Interactive/fsi.fs
Original file line numberDiff line numberDiff line change
Expand Up@@ -885,7 +885,7 @@ type internal FsiCommandLineOptions(fsi: FsiEvaluationSessionHostConfig,
Console.Write (GetBannerText tcConfigB)
fprintfn fsiConsoleOutput.Out ""
fprintfn fsiConsoleOutput.Out "%s" (FSIstrings.SR.fsiUsage(executableFileNameWithoutExtension.Value))
Console.Write (GetCompilerOptionBlocks blocks)
Console.Write (GetCompilerOptionBlocks blocks tcConfigB.bufferWidth)
exit 0

// option tags
Expand Down
26 changes: 12 additions & 14 deletions tests/FSharp.Compiler.Service.Tests/ConsoleOnlyOptionsTests.fs
Original file line numberDiff line numberDiff line change
Expand Up@@ -5,27 +5,25 @@ module FSharp.Compiler.Service.Tests.ConsoleOnlyOptionsTests
open System
open System.IO
open FSharp.Compiler.CompilerOptions
open FSharp.Compiler.Text.Range
open NUnit.Framework
open TestDoubles

[<Test>]
[<Ignore "Failing in main, disabling until resolved">]
let ``Help is displayed correctly`` () =
try
if System.Console.BufferWidth < 80 then
System.Console.BufferWidth <- 80
with _ -> ()
let ``fsc help text is displayed correctly`` () =

let builder = getArbitraryTcConfigBuilder()
builder.showBanner <- false // We don't need the banner

let blocks = GetCoreFscCompilerOptions builder
let builder = getArbitraryTcConfigBuilder()
builder.showBanner <- false // We don't need the banner
builder.TurnWarningOff(rangeCmdArgs, "75") // We are going to use a test only flag
builder.bufferWidth <- Some 80 // Fixed width 80

let expectedHelp = File.ReadAllText $"{__SOURCE_DIRECTORY__}/expected-help-output.bsl"

let expectedHelp = File.ReadAllText $"{__SOURCE_DIRECTORY__}/expected-help-output.bsl"
let help = GetHelpFsc builder blocks
let blocks = GetCoreFscCompilerOptions builder
let help = GetHelpFsc builder blocks
let actualHelp = help.Replace("\r\n", Environment.NewLine)

let actualHelp = help.Replace("\r\n", Environment.NewLine)
Assert.AreEqual(expectedHelp, actualHelp, $"Console width: {System.Console.BufferWidth}\nExpected: {expectedHelp}\n Actual: {actualHelp}") |> ignore
Assert.AreEqual(expectedHelp, actualHelp, $"Expected: '{expectedHelp}'\n Actual: '{actualHelp}'") |> ignore

[<Test>]
let ``Version is displayed correctly`` () =
Expand Down
16 changes: 8 additions & 8 deletions tests/FSharp.Compiler.Service.Tests/expected-help-output.bsl
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@

- OUTPUT FILES -
- OUTPUT FILES -
--out:<file> Name of the output file (Short form:
-o)
--target:exe Build a console executable
Expand DownExpand Up@@ -46,15 +46,15 @@
the specified file path.


- INPUT FILES -
- INPUT FILES -
--reference:<file> Reference an assembly (Short form:
-r)
--compilertool:<file> Reference an assembly or directory
containing a design time tool (Short
form: -t)


- RESOURCES -
- RESOURCES -
--win32icon:<file> Specify a Win32 icon file (.ico)
--win32res:<file> Specify a Win32 resource file (.res)
--win32manifest:<file> Specify a Win32 manifest file
Expand All@@ -67,7 +67,7 @@
name>[,public|private]]


- CODE GENERATION -
- CODE GENERATION -
--debug[+|-] Emit debug information (Short form:
-g)
--debug:{full|pdbonly|portable|embedded} Specify debugging type: full,
Expand DownExpand Up@@ -99,7 +99,7 @@
constructs using reflection


- ERRORS AND WARNINGS -
- ERRORS AND WARNINGS -
--warnaserror[+|-] Report all warnings as errors
--warnaserror[+|-]:<warn;...> Report specific warnings as errors
--warn:<n> Set a warning level (0-5)
Expand All@@ -110,7 +110,7 @@
color


- LANGUAGE -
- LANGUAGE -
--langversion:{?|version|latest|preview} Display the allowed values for
language version, specify language
version such as 'latest' or
Expand All@@ -121,7 +121,7 @@
--mlcompatibility Ignore ML compatibility warnings


- MISCELLANEOUS -
- MISCELLANEOUS -
--nologo Suppress compiler copyright message
--version Display compiler version banner and
exit
Expand All@@ -130,7 +130,7 @@
--@<file> Read response file for more options


- ADVANCED -
- ADVANCED -
--codepage:<n> Specify the codepage used to read
source files
--utf8output Output messages in UTF-8 encoding
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -2,7 +2,7 @@ Microsoft (R) F# Compiler version 12.0.0.0 for F# 6.0
Copyright (c) Microsoft Corporation. All Rights Reserved.


- OUTPUT FILES -
- OUTPUT FILES -
--out:<file> Name of the output file (Short form:
-o)
--target:exe Build a console executable
Expand DownExpand Up@@ -48,15 +48,15 @@ Copyright (c) Microsoft Corporation. All Rights Reserved.
the specified file path.


- INPUT FILES -
- INPUT FILES -
--reference:<file> Reference an assembly (Short form:
-r)
--compilertool:<file> Reference an assembly or directory
containing a design time tool (Short
form: -t)


- RESOURCES -
- RESOURCES -
--win32icon:<file> Specify a Win32 icon file (.ico)
--win32res:<file> Specify a Win32 resource file (.res)
--win32manifest:<file> Specify a Win32 manifest file
Expand All@@ -69,7 +69,7 @@ Copyright (c) Microsoft Corporation. All Rights Reserved.
name>[,public|private]]


- CODE GENERATION -
- CODE GENERATION -
--debug[+|-] Emit debug information (Short form:
-g)
--debug:{full|pdbonly|portable|embedded} Specify debugging type: full,
Expand DownExpand Up@@ -101,7 +101,7 @@ Copyright (c) Microsoft Corporation. All Rights Reserved.
constructs using reflection


- ERRORS AND WARNINGS -
- ERRORS AND WARNINGS -
--warnaserror[+|-] Report all warnings as errors
--warnaserror[+|-]:<warn;...> Report specific warnings as errors
--warn:<n> Set a warning level (0-5)
Expand All@@ -112,7 +112,7 @@ Copyright (c) Microsoft Corporation. All Rights Reserved.
color


- LANGUAGE -
- LANGUAGE -
--langversion:{?|version|latest|preview} Display the allowed values for
language version, specify language
version such as 'latest' or
Expand All@@ -123,7 +123,7 @@ Copyright (c) Microsoft Corporation. All Rights Reserved.
--mlcompatibility Ignore ML compatibility warnings


- MISCELLANEOUS -
- MISCELLANEOUS -
--nologo Suppress compiler copyright message
--version Display compiler version banner and
exit
Expand All@@ -132,7 +132,7 @@ Copyright (c) Microsoft Corporation. All Rights Reserved.
--@<file> Read response file for more options


- ADVANCED -
- ADVANCED -
--codepage:<n> Specify the codepage used to read
source files
--utf8output Output messages in UTF-8 encoding
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -2,7 +2,7 @@
Usage: fsharpi <options> [script.fsx [<arguments>]]


- INPUT FILES -
- INPUT FILES -
--use:<file> Use the given file on startup as
initial input
--load:<file> #load the given file on startup
Expand All@@ -16,7 +16,7 @@ Usage: fsharpi <options> [script.fsx [<arguments>]]
fsi.CommandLineArgs


- CODE GENERATION -
- CODE GENERATION -
--debug[+|-] Emit debug information (Short form:
-g)
--debug:{full|pdbonly|portable|embedded} Specify debugging type: full,
Expand All@@ -42,7 +42,7 @@ Usage: fsharpi <options> [script.fsx [<arguments>]]
constructs using reflection


- ERRORS AND WARNINGS -
- ERRORS AND WARNINGS -
--warnaserror[+|-] Report all warnings as errors
--warnaserror[+|-]:<warn;...> Report specific warnings as errors
--warn:<n> Set a warning level (0-5)
Expand All@@ -53,7 +53,7 @@ Usage: fsharpi <options> [script.fsx [<arguments>]]
color


- LANGUAGE -
- LANGUAGE -
--langversion:{?|version|latest|preview} Display the allowed values for
language version, specify language
version such as 'latest' or
Expand All@@ -64,15 +64,15 @@ Usage: fsharpi <options> [script.fsx [<arguments>]]
--mlcompatibility Ignore ML compatibility warnings


- MISCELLANEOUS -
- MISCELLANEOUS -
--nologo Suppress compiler copyright message
--version Display compiler version banner and
exit
--help Display this usage message (Short
form: -?)


- ADVANCED -
- ADVANCED -
--codepage:<n> Specify the codepage used to read
source files
--utf8output Output messages in UTF-8 encoding
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
4 changes: 4 additions & 0 deletions src/Compiler/Driver/CompilerConfig.fs
Original file line numberDiff line numberDiff line change
Expand Up@@ -551,6 +551,8 @@ type TcConfigBuilder =

mutable fxResolver: FxResolver option

mutable bufferWidth: int option

// Is F# Interactive using multi-assembly emit?
mutable fsiMultiAssemblyEmit: bool

Expand DownExpand Up@@ -741,6 +743,7 @@ type TcConfigBuilder =
shadowCopyReferences = false
useSdkRefs = true
fxResolver = None
bufferWidth = None
fsiMultiAssemblyEmit = true
internalTestSpanStackReferring = false
noConditionalErasure = false
Expand DownExpand Up@@ -1163,6 +1166,7 @@ type TcConfig private (data: TcConfigBuilder, validate: bool) =
errorRecovery e range0
[]

member _.bufferWidth = data.bufferWidth
member _.fsiMultiAssemblyEmit = data.fsiMultiAssemblyEmit
member _.FxResolver = data.FxResolver
member _.primaryAssembly = data.primaryAssembly
Expand Down
5 changes: 5 additions & 0 deletions src/Compiler/Driver/CompilerConfig.fsi
Original file line numberDiff line numberDiff line change
Expand Up@@ -452,6 +452,8 @@ type TcConfigBuilder =

mutable fxResolver: FxResolver option

mutable bufferWidth: int option

mutable fsiMultiAssemblyEmit: bool

rangeForErrors: range
Expand DownExpand Up@@ -746,13 +748,16 @@ type TcConfig =
member alwaysCallVirt: bool

member noDebugAttributes: bool

member useReflectionFreeCodeGen: bool

/// If true, indicates all type checking and code generation is in the context of fsi.exe
member isInteractive: bool

member isInvalidationSupported: bool

member bufferWidth: int option

/// Indicates if F# Interactive is using single-assembly emit via Reflection.Emit, where internals are available.
member fsiMultiAssemblyEmit: bool

Expand Down
43 changes: 28 additions & 15 deletions src/Compiler/Driver/CompilerOptions.fs
Original file line numberDiff line numberDiff line change
Expand Up@@ -115,23 +115,27 @@ let compilerOptionUsage (CompilerOption (s, tag, spec, _, _)) =

let nl = Environment.NewLine

let getCompilerOption (CompilerOption (_s, _tag, _spec, _, help) as compilerOption) =
let getCompilerOption (CompilerOption (_s, _tag, _spec, _, help) as compilerOption) width =
let sb = StringBuilder()

let flagWidth = 42 // fixed width for printing of flags, e.g. --debug:{full|pdbonly|portable|embedded}
let defaultLineWidth = 80 // the fallback width

let lineWidth =
try
Console.BufferWidth
with e ->
defaultLineWidth
match width with
| None ->
try
Console.BufferWidth
with _ ->
defaultLineWidth
| Some w -> w

let lineWidth =
if lineWidth = 0 then
defaultLineWidth
else
lineWidth (* Have seen BufferWidth=0 on Linux/Mono *)
lineWidth (* Have seen BufferWidth=0 on Linux/Mono Coreclr for sure *)

// Lines have this form: <flagWidth><space><description>
// flagWidth chars - for flags description or padding on continuation lines.
// single space - space.
Expand DownExpand Up@@ -159,14 +163,14 @@ let getCompilerOption (CompilerOption (_s, _tag, _spec, _, help) as compilerOpti
let _ = sb.Append $"{nl}"
sb.ToString()

let getPublicOptions (heading, opts) =
if not (isNil opts) then
$"{nl}{nl}\t\t{heading}{nl}"
+ (opts |> List.map getCompilerOption |> String.concat "")
else
""
let getPublicOptions heading opts width =
match opts with
| [] -> ""
| _ ->
$"{nl}{nl} {heading}{nl}"
+ (opts |> List.map (fun t -> getCompilerOption t width) |> String.concat "")

let GetCompilerOptionBlocks blocks =
let GetCompilerOptionBlocks blocks width =
let sb = new StringBuilder()

let publicBlocks =
Expand All@@ -182,7 +186,7 @@ let GetCompilerOptionBlocks blocks =
let headingOptions =
publicBlocks |> List.filter (fun (h2, _) -> heading = h2) |> List.collect snd

let _ = sb.Append(getPublicOptions (heading, headingOptions))
let _ = sb.Append(getPublicOptions heading headingOptions width)
Set.add heading doneHeadings

List.fold consider Set.empty publicBlocks |> ignore<Set<string>>
Expand DownExpand Up@@ -1462,6 +1466,14 @@ let internalFlags (tcConfigB: TcConfigBuilder) =
None
)

CompilerOption(
"bufferwidth",
tagNone,
OptionInt((fun v -> tcConfigB.bufferWidth <- Some v)),
Some(InternalCommandLineOption("--bufferWidth", rangeCmdArgs)),
None
)

CompilerOption(
"detuple",
tagNone,
Expand DownExpand Up@@ -1997,7 +2009,8 @@ let GetBannerText tcConfigB =

/// FSC only help. (FSI has it's own help function).
let GetHelpFsc tcConfigB (blocks: CompilerOptionBlock list) =
GetBannerText tcConfigB + GetCompilerOptionBlocks blocks

GetBannerText tcConfigB + GetCompilerOptionBlocks blocks tcConfigB.bufferWidth

let GetVersion tcConfigB =
$"{tcConfigB.productNameForBannerText}{nl}"
Expand Down
2 changes: 1 addition & 1 deletion src/Compiler/Driver/CompilerOptions.fsi
Original file line numberDiff line numberDiff line change
Expand Up@@ -43,7 +43,7 @@ and CompilerOptionBlock =
| PublicOptions of heading: string * options: CompilerOption list
| PrivateOptions of options: CompilerOption list

val GetCompilerOptionBlocks: CompilerOptionBlock list -> string
val GetCompilerOptionBlocks: CompilerOptionBlock list -> width: int option -> string

val DumpCompilerOptionBlocks: CompilerOptionBlock list -> unit // for QA

Expand Down
2 changes: 1 addition & 1 deletion src/Compiler/Interactive/fsi.fs
Original file line numberDiff line numberDiff line change
Expand Up@@ -885,7 +885,7 @@ type internal FsiCommandLineOptions(fsi: FsiEvaluationSessionHostConfig,
Console.Write (GetBannerText tcConfigB)
fprintfn fsiConsoleOutput.Out ""
fprintfn fsiConsoleOutput.Out "%s" (FSIstrings.SR.fsiUsage(executableFileNameWithoutExtension.Value))
Console.Write (GetCompilerOptionBlocks blocks)
Console.Write (GetCompilerOptionBlocks blocks tcConfigB.bufferWidth)
exit 0

// option tags
Expand Down
26 changes: 12 additions & 14 deletions tests/FSharp.Compiler.Service.Tests/ConsoleOnlyOptionsTests.fs
Original file line numberDiff line numberDiff line change
Expand Up@@ -5,27 +5,25 @@ module FSharp.Compiler.Service.Tests.ConsoleOnlyOptionsTests
open System
open System.IO
open FSharp.Compiler.CompilerOptions
open FSharp.Compiler.Text.Range
open NUnit.Framework
open TestDoubles

[<Test>]
[<Ignore "Failing in main, disabling until resolved">]
let ``Help is displayed correctly`` () =
try
if System.Console.BufferWidth < 80 then
System.Console.BufferWidth <- 80
with _ -> ()
let ``fsc help text is displayed correctly`` () =

let builder = getArbitraryTcConfigBuilder()
builder.showBanner <- false // We don't need the banner

let blocks = GetCoreFscCompilerOptions builder
let builder = getArbitraryTcConfigBuilder()
builder.showBanner <- false // We don't need the banner
builder.TurnWarningOff(rangeCmdArgs, "75") // We are going to use a test only flag
builder.bufferWidth <- Some 80 // Fixed width 80

let expectedHelp = File.ReadAllText $"{__SOURCE_DIRECTORY__}/expected-help-output.bsl"

let expectedHelp = File.ReadAllText $"{__SOURCE_DIRECTORY__}/expected-help-output.bsl"
let help = GetHelpFsc builder blocks
let blocks = GetCoreFscCompilerOptions builder
let help = GetHelpFsc builder blocks
let actualHelp = help.Replace("\r\n", Environment.NewLine)

let actualHelp = help.Replace("\r\n", Environment.NewLine)
Assert.AreEqual(expectedHelp, actualHelp, $"Console width: {System.Console.BufferWidth}\nExpected: {expectedHelp}\n Actual: {actualHelp}") |> ignore
Assert.AreEqual(expectedHelp, actualHelp, $"Expected: '{expectedHelp}'\n Actual: '{actualHelp}'") |> ignore

[<Test>]
let ``Version is displayed correctly`` () =
Expand Down
16 changes: 8 additions & 8 deletions tests/FSharp.Compiler.Service.Tests/expected-help-output.bsl
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@

- OUTPUT FILES -
- OUTPUT FILES -
--out:<file> Name of the output file (Short form:
-o)
--target:exe Build a console executable
Expand DownExpand Up@@ -46,15 +46,15 @@
the specified file path.


- INPUT FILES -
- INPUT FILES -
--reference:<file> Reference an assembly (Short form:
-r)
--compilertool:<file> Reference an assembly or directory
containing a design time tool (Short
form: -t)


- RESOURCES -
- RESOURCES -
--win32icon:<file> Specify a Win32 icon file (.ico)
--win32res:<file> Specify a Win32 resource file (.res)
--win32manifest:<file> Specify a Win32 manifest file
Expand All@@ -67,7 +67,7 @@
name>[,public|private]]


- CODE GENERATION -
- CODE GENERATION -
--debug[+|-] Emit debug information (Short form:
-g)
--debug:{full|pdbonly|portable|embedded} Specify debugging type: full,
Expand DownExpand Up@@ -99,7 +99,7 @@
constructs using reflection


- ERRORS AND WARNINGS -
- ERRORS AND WARNINGS -
--warnaserror[+|-] Report all warnings as errors
--warnaserror[+|-]:<warn;...> Report specific warnings as errors
--warn:<n> Set a warning level (0-5)
Expand All@@ -110,7 +110,7 @@
color


- LANGUAGE -
- LANGUAGE -
--langversion:{?|version|latest|preview} Display the allowed values for
language version, specify language
version such as 'latest' or
Expand All@@ -121,7 +121,7 @@
--mlcompatibility Ignore ML compatibility warnings


- MISCELLANEOUS -
- MISCELLANEOUS -
--nologo Suppress compiler copyright message
--version Display compiler version banner and
exit
Expand All@@ -130,7 +130,7 @@
--@<file> Read response file for more options


- ADVANCED -
- ADVANCED -
--codepage:<n> Specify the codepage used to read
source files
--utf8output Output messages in UTF-8 encoding
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -2,7 +2,7 @@ Microsoft (R) F# Compiler version 12.0.0.0 for F# 6.0
Copyright (c) Microsoft Corporation. All Rights Reserved.


- OUTPUT FILES -
- OUTPUT FILES -
--out:<file> Name of the output file (Short form:
-o)
--target:exe Build a console executable
Expand DownExpand Up@@ -48,15 +48,15 @@ Copyright (c) Microsoft Corporation. All Rights Reserved.
the specified file path.


- INPUT FILES -
- INPUT FILES -
--reference:<file> Reference an assembly (Short form:
-r)
--compilertool:<file> Reference an assembly or directory
containing a design time tool (Short
form: -t)


- RESOURCES -
- RESOURCES -
--win32icon:<file> Specify a Win32 icon file (.ico)
--win32res:<file> Specify a Win32 resource file (.res)
--win32manifest:<file> Specify a Win32 manifest file
Expand All@@ -69,7 +69,7 @@ Copyright (c) Microsoft Corporation. All Rights Reserved.
name>[,public|private]]


- CODE GENERATION -
- CODE GENERATION -
--debug[+|-] Emit debug information (Short form:
-g)
--debug:{full|pdbonly|portable|embedded} Specify debugging type: full,
Expand DownExpand Up@@ -101,7 +101,7 @@ Copyright (c) Microsoft Corporation. All Rights Reserved.
constructs using reflection


- ERRORS AND WARNINGS -
- ERRORS AND WARNINGS -
--warnaserror[+|-] Report all warnings as errors
--warnaserror[+|-]:<warn;...> Report specific warnings as errors
--warn:<n> Set a warning level (0-5)
Expand All@@ -112,7 +112,7 @@ Copyright (c) Microsoft Corporation. All Rights Reserved.
color


- LANGUAGE -
- LANGUAGE -
--langversion:{?|version|latest|preview} Display the allowed values for
language version, specify language
version such as 'latest' or
Expand All@@ -123,7 +123,7 @@ Copyright (c) Microsoft Corporation. All Rights Reserved.
--mlcompatibility Ignore ML compatibility warnings


- MISCELLANEOUS -
- MISCELLANEOUS -
--nologo Suppress compiler copyright message
--version Display compiler version banner and
exit
Expand All@@ -132,7 +132,7 @@ Copyright (c) Microsoft Corporation. All Rights Reserved.
--@<file> Read response file for more options


- ADVANCED -
- ADVANCED -
--codepage:<n> Specify the codepage used to read
source files
--utf8output Output messages in UTF-8 encoding
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -2,7 +2,7 @@
Usage: fsharpi <options> [script.fsx [<arguments>]]


- INPUT FILES -
- INPUT FILES -
--use:<file> Use the given file on startup as
initial input
--load:<file> #load the given file on startup
Expand All@@ -16,7 +16,7 @@ Usage: fsharpi <options> [script.fsx [<arguments>]]
fsi.CommandLineArgs


- CODE GENERATION -
- CODE GENERATION -
--debug[+|-] Emit debug information (Short form:
-g)
--debug:{full|pdbonly|portable|embedded} Specify debugging type: full,
Expand All@@ -42,7 +42,7 @@ Usage: fsharpi <options> [script.fsx [<arguments>]]
constructs using reflection


- ERRORS AND WARNINGS -
- ERRORS AND WARNINGS -
--warnaserror[+|-] Report all warnings as errors
--warnaserror[+|-]:<warn;...> Report specific warnings as errors
--warn:<n> Set a warning level (0-5)
Expand All@@ -53,7 +53,7 @@ Usage: fsharpi <options> [script.fsx [<arguments>]]
color


- LANGUAGE -
- LANGUAGE -
--langversion:{?|version|latest|preview} Display the allowed values for
language version, specify language
version such as 'latest' or
Expand All@@ -64,15 +64,15 @@ Usage: fsharpi <options> [script.fsx [<arguments>]]
--mlcompatibility Ignore ML compatibility warnings


- MISCELLANEOUS -
- MISCELLANEOUS -
--nologo Suppress compiler copyright message
--version Display compiler version banner and
exit
--help Display this usage message (Short
form: -?)


- ADVANCED -
- ADVANCED -
--codepage:<n> Specify the codepage used to read
source files
--utf8output Output messages in UTF-8 encoding
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
4 changes: 4 additions & 0 deletions src/Compiler/Driver/CompilerConfig.fs
Original file line numberDiff line numberDiff line change
Expand Up@@ -551,6 +551,8 @@ type TcConfigBuilder =

mutable fxResolver: FxResolver option

mutable bufferWidth: int option

// Is F# Interactive using multi-assembly emit?
mutable fsiMultiAssemblyEmit: bool

Expand DownExpand Up@@ -741,6 +743,7 @@ type TcConfigBuilder =
shadowCopyReferences = false
useSdkRefs = true
fxResolver = None
bufferWidth = None
fsiMultiAssemblyEmit = true
internalTestSpanStackReferring = false
noConditionalErasure = false
Expand DownExpand Up@@ -1163,6 +1166,7 @@ type TcConfig private (data: TcConfigBuilder, validate: bool) =
errorRecovery e range0
[]

member _.bufferWidth = data.bufferWidth
member _.fsiMultiAssemblyEmit = data.fsiMultiAssemblyEmit
member _.FxResolver = data.FxResolver
member _.primaryAssembly = data.primaryAssembly
Expand Down
5 changes: 5 additions & 0 deletions src/Compiler/Driver/CompilerConfig.fsi
Original file line numberDiff line numberDiff line change
Expand Up@@ -452,6 +452,8 @@ type TcConfigBuilder =

mutable fxResolver: FxResolver option

mutable bufferWidth: int option

mutable fsiMultiAssemblyEmit: bool

rangeForErrors: range
Expand DownExpand Up@@ -746,13 +748,16 @@ type TcConfig =
member alwaysCallVirt: bool

member noDebugAttributes: bool

member useReflectionFreeCodeGen: bool

/// If true, indicates all type checking and code generation is in the context of fsi.exe
member isInteractive: bool

member isInvalidationSupported: bool

member bufferWidth: int option

/// Indicates if F# Interactive is using single-assembly emit via Reflection.Emit, where internals are available.
member fsiMultiAssemblyEmit: bool

Expand Down
43 changes: 28 additions & 15 deletions src/Compiler/Driver/CompilerOptions.fs
Original file line numberDiff line numberDiff line change
Expand Up@@ -115,23 +115,27 @@ let compilerOptionUsage (CompilerOption (s, tag, spec, _, _)) =

let nl = Environment.NewLine

let getCompilerOption (CompilerOption (_s, _tag, _spec, _, help) as compilerOption) =
let getCompilerOption (CompilerOption (_s, _tag, _spec, _, help) as compilerOption) width =
let sb = StringBuilder()

let flagWidth = 42 // fixed width for printing of flags, e.g. --debug:{full|pdbonly|portable|embedded}
let defaultLineWidth = 80 // the fallback width

let lineWidth =
try
Console.BufferWidth
with e ->
defaultLineWidth
match width with
| None ->
try
Console.BufferWidth
with _ ->
defaultLineWidth
| Some w -> w

let lineWidth =
if lineWidth = 0 then
defaultLineWidth
else
lineWidth (* Have seen BufferWidth=0 on Linux/Mono *)
lineWidth (* Have seen BufferWidth=0 on Linux/Mono Coreclr for sure *)

// Lines have this form: <flagWidth><space><description>
// flagWidth chars - for flags description or padding on continuation lines.
// single space - space.
Expand DownExpand Up@@ -159,14 +163,14 @@ let getCompilerOption (CompilerOption (_s, _tag, _spec, _, help) as compilerOpti
let _ = sb.Append $"{nl}"
sb.ToString()

let getPublicOptions (heading, opts) =
if not (isNil opts) then
$"{nl}{nl}\t\t{heading}{nl}"
+ (opts |> List.map getCompilerOption |> String.concat "")
else
""
let getPublicOptions heading opts width =
match opts with
| [] -> ""
| _ ->
$"{nl}{nl} {heading}{nl}"
+ (opts |> List.map (fun t -> getCompilerOption t width) |> String.concat "")

let GetCompilerOptionBlocks blocks =
let GetCompilerOptionBlocks blocks width =
let sb = new StringBuilder()

let publicBlocks =
Expand All@@ -182,7 +186,7 @@ let GetCompilerOptionBlocks blocks =
let headingOptions =
publicBlocks |> List.filter (fun (h2, _) -> heading = h2) |> List.collect snd

let _ = sb.Append(getPublicOptions (heading, headingOptions))
let _ = sb.Append(getPublicOptions heading headingOptions width)
Set.add heading doneHeadings

List.fold consider Set.empty publicBlocks |> ignore<Set<string>>
Expand DownExpand Up@@ -1462,6 +1466,14 @@ let internalFlags (tcConfigB: TcConfigBuilder) =
None
)

CompilerOption(
"bufferwidth",
tagNone,
OptionInt((fun v -> tcConfigB.bufferWidth <- Some v)),
Some(InternalCommandLineOption("--bufferWidth", rangeCmdArgs)),
None
)

CompilerOption(
"detuple",
tagNone,
Expand DownExpand Up@@ -1997,7 +2009,8 @@ let GetBannerText tcConfigB =

/// FSC only help. (FSI has it's own help function).
let GetHelpFsc tcConfigB (blocks: CompilerOptionBlock list) =
GetBannerText tcConfigB + GetCompilerOptionBlocks blocks

GetBannerText tcConfigB + GetCompilerOptionBlocks blocks tcConfigB.bufferWidth

let GetVersion tcConfigB =
$"{tcConfigB.productNameForBannerText}{nl}"
Expand Down
2 changes: 1 addition & 1 deletion src/Compiler/Driver/CompilerOptions.fsi
Original file line numberDiff line numberDiff line change
Expand Up@@ -43,7 +43,7 @@ and CompilerOptionBlock =
| PublicOptions of heading: string * options: CompilerOption list
| PrivateOptions of options: CompilerOption list

val GetCompilerOptionBlocks: CompilerOptionBlock list -> string
val GetCompilerOptionBlocks: CompilerOptionBlock list -> width: int option -> string

val DumpCompilerOptionBlocks: CompilerOptionBlock list -> unit // for QA

Expand Down
2 changes: 1 addition & 1 deletion src/Compiler/Interactive/fsi.fs
Original file line numberDiff line numberDiff line change
Expand Up@@ -885,7 +885,7 @@ type internal FsiCommandLineOptions(fsi: FsiEvaluationSessionHostConfig,
Console.Write (GetBannerText tcConfigB)
fprintfn fsiConsoleOutput.Out ""
fprintfn fsiConsoleOutput.Out "%s" (FSIstrings.SR.fsiUsage(executableFileNameWithoutExtension.Value))
Console.Write (GetCompilerOptionBlocks blocks)
Console.Write (GetCompilerOptionBlocks blocks tcConfigB.bufferWidth)
exit 0

// option tags
Expand Down
26 changes: 12 additions & 14 deletions tests/FSharp.Compiler.Service.Tests/ConsoleOnlyOptionsTests.fs
Original file line numberDiff line numberDiff line change
Expand Up@@ -5,27 +5,25 @@ module FSharp.Compiler.Service.Tests.ConsoleOnlyOptionsTests
open System
open System.IO
open FSharp.Compiler.CompilerOptions
open FSharp.Compiler.Text.Range
open NUnit.Framework
open TestDoubles

[<Test>]
[<Ignore "Failing in main, disabling until resolved">]
let ``Help is displayed correctly`` () =
try
if System.Console.BufferWidth < 80 then
System.Console.BufferWidth <- 80
with _ -> ()
let ``fsc help text is displayed correctly`` () =

let builder = getArbitraryTcConfigBuilder()
builder.showBanner <- false // We don't need the banner

let blocks = GetCoreFscCompilerOptions builder
let builder = getArbitraryTcConfigBuilder()
builder.showBanner <- false // We don't need the banner
builder.TurnWarningOff(rangeCmdArgs, "75") // We are going to use a test only flag
builder.bufferWidth <- Some 80 // Fixed width 80

let expectedHelp = File.ReadAllText $"{__SOURCE_DIRECTORY__}/expected-help-output.bsl"

let expectedHelp = File.ReadAllText $"{__SOURCE_DIRECTORY__}/expected-help-output.bsl"
let help = GetHelpFsc builder blocks
let blocks = GetCoreFscCompilerOptions builder
let help = GetHelpFsc builder blocks
let actualHelp = help.Replace("\r\n", Environment.NewLine)

let actualHelp = help.Replace("\r\n", Environment.NewLine)
Assert.AreEqual(expectedHelp, actualHelp, $"Console width: {System.Console.BufferWidth}\nExpected: {expectedHelp}\n Actual: {actualHelp}") |> ignore
Assert.AreEqual(expectedHelp, actualHelp, $"Expected: '{expectedHelp}'\n Actual: '{actualHelp}'") |> ignore

[<Test>]
let ``Version is displayed correctly`` () =
Expand Down
16 changes: 8 additions & 8 deletions tests/FSharp.Compiler.Service.Tests/expected-help-output.bsl
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@

- OUTPUT FILES -
- OUTPUT FILES -
--out:<file> Name of the output file (Short form:
-o)
--target:exe Build a console executable
Expand DownExpand Up@@ -46,15 +46,15 @@
the specified file path.


- INPUT FILES -
- INPUT FILES -
--reference:<file> Reference an assembly (Short form:
-r)
--compilertool:<file> Reference an assembly or directory
containing a design time tool (Short
form: -t)


- RESOURCES -
- RESOURCES -
--win32icon:<file> Specify a Win32 icon file (.ico)
--win32res:<file> Specify a Win32 resource file (.res)
--win32manifest:<file> Specify a Win32 manifest file
Expand All@@ -67,7 +67,7 @@
name>[,public|private]]


- CODE GENERATION -
- CODE GENERATION -
--debug[+|-] Emit debug information (Short form:
-g)
--debug:{full|pdbonly|portable|embedded} Specify debugging type: full,
Expand DownExpand Up@@ -99,7 +99,7 @@
constructs using reflection


- ERRORS AND WARNINGS -
- ERRORS AND WARNINGS -
--warnaserror[+|-] Report all warnings as errors
--warnaserror[+|-]:<warn;...> Report specific warnings as errors
--warn:<n> Set a warning level (0-5)
Expand All@@ -110,7 +110,7 @@
color


- LANGUAGE -
- LANGUAGE -
--langversion:{?|version|latest|preview} Display the allowed values for
language version, specify language
version such as 'latest' or
Expand All@@ -121,7 +121,7 @@
--mlcompatibility Ignore ML compatibility warnings


- MISCELLANEOUS -
- MISCELLANEOUS -
--nologo Suppress compiler copyright message
--version Display compiler version banner and
exit
Expand All@@ -130,7 +130,7 @@
--@<file> Read response file for more options


- ADVANCED -
- ADVANCED -
--codepage:<n> Specify the codepage used to read
source files
--utf8output Output messages in UTF-8 encoding
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -2,7 +2,7 @@ Microsoft (R) F# Compiler version 12.0.0.0 for F# 6.0
Copyright (c) Microsoft Corporation. All Rights Reserved.


- OUTPUT FILES -
- OUTPUT FILES -
--out:<file> Name of the output file (Short form:
-o)
--target:exe Build a console executable
Expand DownExpand Up@@ -48,15 +48,15 @@ Copyright (c) Microsoft Corporation. All Rights Reserved.
the specified file path.


- INPUT FILES -
- INPUT FILES -
--reference:<file> Reference an assembly (Short form:
-r)
--compilertool:<file> Reference an assembly or directory
containing a design time tool (Short
form: -t)


- RESOURCES -
- RESOURCES -
--win32icon:<file> Specify a Win32 icon file (.ico)
--win32res:<file> Specify a Win32 resource file (.res)
--win32manifest:<file> Specify a Win32 manifest file
Expand All@@ -69,7 +69,7 @@ Copyright (c) Microsoft Corporation. All Rights Reserved.
name>[,public|private]]


- CODE GENERATION -
- CODE GENERATION -
--debug[+|-] Emit debug information (Short form:
-g)
--debug:{full|pdbonly|portable|embedded} Specify debugging type: full,
Expand DownExpand Up@@ -101,7 +101,7 @@ Copyright (c) Microsoft Corporation. All Rights Reserved.
constructs using reflection


- ERRORS AND WARNINGS -
- ERRORS AND WARNINGS -
--warnaserror[+|-] Report all warnings as errors
--warnaserror[+|-]:<warn;...> Report specific warnings as errors
--warn:<n> Set a warning level (0-5)
Expand All@@ -112,7 +112,7 @@ Copyright (c) Microsoft Corporation. All Rights Reserved.
color


- LANGUAGE -
- LANGUAGE -
--langversion:{?|version|latest|preview} Display the allowed values for
language version, specify language
version such as 'latest' or
Expand All@@ -123,7 +123,7 @@ Copyright (c) Microsoft Corporation. All Rights Reserved.
--mlcompatibility Ignore ML compatibility warnings


- MISCELLANEOUS -
- MISCELLANEOUS -
--nologo Suppress compiler copyright message
--version Display compiler version banner and
exit
Expand All@@ -132,7 +132,7 @@ Copyright (c) Microsoft Corporation. All Rights Reserved.
--@<file> Read response file for more options


- ADVANCED -
- ADVANCED -
--codepage:<n> Specify the codepage used to read
source files
--utf8output Output messages in UTF-8 encoding
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -2,7 +2,7 @@
Usage: fsharpi <options> [script.fsx [<arguments>]]


- INPUT FILES -
- INPUT FILES -
--use:<file> Use the given file on startup as
initial input
--load:<file> #load the given file on startup
Expand All@@ -16,7 +16,7 @@ Usage: fsharpi <options> [script.fsx [<arguments>]]
fsi.CommandLineArgs


- CODE GENERATION -
- CODE GENERATION -
--debug[+|-] Emit debug information (Short form:
-g)
--debug:{full|pdbonly|portable|embedded} Specify debugging type: full,
Expand All@@ -42,7 +42,7 @@ Usage: fsharpi <options> [script.fsx [<arguments>]]
constructs using reflection


- ERRORS AND WARNINGS -
- ERRORS AND WARNINGS -
--warnaserror[+|-] Report all warnings as errors
--warnaserror[+|-]:<warn;...> Report specific warnings as errors
--warn:<n> Set a warning level (0-5)
Expand All@@ -53,7 +53,7 @@ Usage: fsharpi <options> [script.fsx [<arguments>]]
color


- LANGUAGE -
- LANGUAGE -
--langversion:{?|version|latest|preview} Display the allowed values for
language version, specify language
version such as 'latest' or
Expand All@@ -64,15 +64,15 @@ Usage: fsharpi <options> [script.fsx [<arguments>]]
--mlcompatibility Ignore ML compatibility warnings


- MISCELLANEOUS -
- MISCELLANEOUS -
--nologo Suppress compiler copyright message
--version Display compiler version banner and
exit
--help Display this usage message (Short
form: -?)


- ADVANCED -
- ADVANCED -
--codepage:<n> Specify the codepage used to read
source files
--utf8output Output messages in UTF-8 encoding
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
4 changes: 4 additions & 0 deletions src/Compiler/Driver/CompilerConfig.fs
Original file line numberDiff line numberDiff line change
Expand Up@@ -551,6 +551,8 @@ type TcConfigBuilder =

mutable fxResolver: FxResolver option

mutable bufferWidth: int option

// Is F# Interactive using multi-assembly emit?
mutable fsiMultiAssemblyEmit: bool

Expand DownExpand Up@@ -741,6 +743,7 @@ type TcConfigBuilder =
shadowCopyReferences = false
useSdkRefs = true
fxResolver = None
bufferWidth = None
fsiMultiAssemblyEmit = true
internalTestSpanStackReferring = false
noConditionalErasure = false
Expand DownExpand Up@@ -1163,6 +1166,7 @@ type TcConfig private (data: TcConfigBuilder, validate: bool) =
errorRecovery e range0
[]

member _.bufferWidth = data.bufferWidth
member _.fsiMultiAssemblyEmit = data.fsiMultiAssemblyEmit
member _.FxResolver = data.FxResolver
member _.primaryAssembly = data.primaryAssembly
Expand Down
5 changes: 5 additions & 0 deletions src/Compiler/Driver/CompilerConfig.fsi
Original file line numberDiff line numberDiff line change
Expand Up@@ -452,6 +452,8 @@ type TcConfigBuilder =

mutable fxResolver: FxResolver option

mutable bufferWidth: int option

mutable fsiMultiAssemblyEmit: bool

rangeForErrors: range
Expand DownExpand Up@@ -746,13 +748,16 @@ type TcConfig =
member alwaysCallVirt: bool

member noDebugAttributes: bool

member useReflectionFreeCodeGen: bool

/// If true, indicates all type checking and code generation is in the context of fsi.exe
member isInteractive: bool

member isInvalidationSupported: bool

member bufferWidth: int option

/// Indicates if F# Interactive is using single-assembly emit via Reflection.Emit, where internals are available.
member fsiMultiAssemblyEmit: bool

Expand Down
43 changes: 28 additions & 15 deletions src/Compiler/Driver/CompilerOptions.fs
Original file line numberDiff line numberDiff line change
Expand Up@@ -115,23 +115,27 @@ let compilerOptionUsage (CompilerOption (s, tag, spec, _, _)) =

let nl = Environment.NewLine

let getCompilerOption (CompilerOption (_s, _tag, _spec, _, help) as compilerOption) =
let getCompilerOption (CompilerOption (_s, _tag, _spec, _, help) as compilerOption) width =
let sb = StringBuilder()

let flagWidth = 42 // fixed width for printing of flags, e.g. --debug:{full|pdbonly|portable|embedded}
let defaultLineWidth = 80 // the fallback width

let lineWidth =
try
Console.BufferWidth
with e ->
defaultLineWidth
match width with
| None ->
try
Console.BufferWidth
with _ ->
defaultLineWidth
| Some w -> w

let lineWidth =
if lineWidth = 0 then
defaultLineWidth
else
lineWidth (* Have seen BufferWidth=0 on Linux/Mono *)
lineWidth (* Have seen BufferWidth=0 on Linux/Mono Coreclr for sure *)

// Lines have this form: <flagWidth><space><description>
// flagWidth chars - for flags description or padding on continuation lines.
// single space - space.
Expand DownExpand Up@@ -159,14 +163,14 @@ let getCompilerOption (CompilerOption (_s, _tag, _spec, _, help) as compilerOpti
let _ = sb.Append $"{nl}"
sb.ToString()

let getPublicOptions (heading, opts) =
if not (isNil opts) then
$"{nl}{nl}\t\t{heading}{nl}"
+ (opts |> List.map getCompilerOption |> String.concat "")
else
""
let getPublicOptions heading opts width =
match opts with
| [] -> ""
| _ ->
$"{nl}{nl} {heading}{nl}"
+ (opts |> List.map (fun t -> getCompilerOption t width) |> String.concat "")

let GetCompilerOptionBlocks blocks =
let GetCompilerOptionBlocks blocks width =
let sb = new StringBuilder()

let publicBlocks =
Expand All@@ -182,7 +186,7 @@ let GetCompilerOptionBlocks blocks =
let headingOptions =
publicBlocks |> List.filter (fun (h2, _) -> heading = h2) |> List.collect snd

let _ = sb.Append(getPublicOptions (heading, headingOptions))
let _ = sb.Append(getPublicOptions heading headingOptions width)
Set.add heading doneHeadings

List.fold consider Set.empty publicBlocks |> ignore<Set<string>>
Expand DownExpand Up@@ -1462,6 +1466,14 @@ let internalFlags (tcConfigB: TcConfigBuilder) =
None
)

CompilerOption(
"bufferwidth",
tagNone,
OptionInt((fun v -> tcConfigB.bufferWidth <- Some v)),
Some(InternalCommandLineOption("--bufferWidth", rangeCmdArgs)),
None
)

CompilerOption(
"detuple",
tagNone,
Expand DownExpand Up@@ -1997,7 +2009,8 @@ let GetBannerText tcConfigB =

/// FSC only help. (FSI has it's own help function).
let GetHelpFsc tcConfigB (blocks: CompilerOptionBlock list) =
GetBannerText tcConfigB + GetCompilerOptionBlocks blocks

GetBannerText tcConfigB + GetCompilerOptionBlocks blocks tcConfigB.bufferWidth

let GetVersion tcConfigB =
$"{tcConfigB.productNameForBannerText}{nl}"
Expand Down
2 changes: 1 addition & 1 deletion src/Compiler/Driver/CompilerOptions.fsi
Original file line numberDiff line numberDiff line change
Expand Up@@ -43,7 +43,7 @@ and CompilerOptionBlock =
| PublicOptions of heading: string * options: CompilerOption list
| PrivateOptions of options: CompilerOption list

val GetCompilerOptionBlocks: CompilerOptionBlock list -> string
val GetCompilerOptionBlocks: CompilerOptionBlock list -> width: int option -> string

val DumpCompilerOptionBlocks: CompilerOptionBlock list -> unit // for QA

Expand Down
2 changes: 1 addition & 1 deletion src/Compiler/Interactive/fsi.fs
Original file line numberDiff line numberDiff line change
Expand Up@@ -885,7 +885,7 @@ type internal FsiCommandLineOptions(fsi: FsiEvaluationSessionHostConfig,
Console.Write (GetBannerText tcConfigB)
fprintfn fsiConsoleOutput.Out ""
fprintfn fsiConsoleOutput.Out "%s" (FSIstrings.SR.fsiUsage(executableFileNameWithoutExtension.Value))
Console.Write (GetCompilerOptionBlocks blocks)
Console.Write (GetCompilerOptionBlocks blocks tcConfigB.bufferWidth)
exit 0

// option tags
Expand Down
26 changes: 12 additions & 14 deletions tests/FSharp.Compiler.Service.Tests/ConsoleOnlyOptionsTests.fs
Original file line numberDiff line numberDiff line change
Expand Up@@ -5,27 +5,25 @@ module FSharp.Compiler.Service.Tests.ConsoleOnlyOptionsTests
open System
open System.IO
open FSharp.Compiler.CompilerOptions
open FSharp.Compiler.Text.Range
open NUnit.Framework
open TestDoubles

[<Test>]
[<Ignore "Failing in main, disabling until resolved">]
let ``Help is displayed correctly`` () =
try
if System.Console.BufferWidth < 80 then
System.Console.BufferWidth <- 80
with _ -> ()
let ``fsc help text is displayed correctly`` () =

let builder = getArbitraryTcConfigBuilder()
builder.showBanner <- false // We don't need the banner

let blocks = GetCoreFscCompilerOptions builder
let builder = getArbitraryTcConfigBuilder()
builder.showBanner <- false // We don't need the banner
builder.TurnWarningOff(rangeCmdArgs, "75") // We are going to use a test only flag
builder.bufferWidth <- Some 80 // Fixed width 80

let expectedHelp = File.ReadAllText $"{__SOURCE_DIRECTORY__}/expected-help-output.bsl"

let expectedHelp = File.ReadAllText $"{__SOURCE_DIRECTORY__}/expected-help-output.bsl"
let help = GetHelpFsc builder blocks
let blocks = GetCoreFscCompilerOptions builder
let help = GetHelpFsc builder blocks
let actualHelp = help.Replace("\r\n", Environment.NewLine)

let actualHelp = help.Replace("\r\n", Environment.NewLine)
Assert.AreEqual(expectedHelp, actualHelp, $"Console width: {System.Console.BufferWidth}\nExpected: {expectedHelp}\n Actual: {actualHelp}") |> ignore
Assert.AreEqual(expectedHelp, actualHelp, $"Expected: '{expectedHelp}'\n Actual: '{actualHelp}'") |> ignore

[<Test>]
let ``Version is displayed correctly`` () =
Expand Down
16 changes: 8 additions & 8 deletions tests/FSharp.Compiler.Service.Tests/expected-help-output.bsl
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@

- OUTPUT FILES -
- OUTPUT FILES -
--out:<file> Name of the output file (Short form:
-o)
--target:exe Build a console executable
Expand DownExpand Up@@ -46,15 +46,15 @@
the specified file path.


- INPUT FILES -
- INPUT FILES -
--reference:<file> Reference an assembly (Short form:
-r)
--compilertool:<file> Reference an assembly or directory
containing a design time tool (Short
form: -t)


- RESOURCES -
- RESOURCES -
--win32icon:<file> Specify a Win32 icon file (.ico)
--win32res:<file> Specify a Win32 resource file (.res)
--win32manifest:<file> Specify a Win32 manifest file
Expand All@@ -67,7 +67,7 @@
name>[,public|private]]


- CODE GENERATION -
- CODE GENERATION -
--debug[+|-] Emit debug information (Short form:
-g)
--debug:{full|pdbonly|portable|embedded} Specify debugging type: full,
Expand DownExpand Up@@ -99,7 +99,7 @@
constructs using reflection


- ERRORS AND WARNINGS -
- ERRORS AND WARNINGS -
--warnaserror[+|-] Report all warnings as errors
--warnaserror[+|-]:<warn;...> Report specific warnings as errors
--warn:<n> Set a warning level (0-5)
Expand All@@ -110,7 +110,7 @@
color


- LANGUAGE -
- LANGUAGE -
--langversion:{?|version|latest|preview} Display the allowed values for
language version, specify language
version such as 'latest' or
Expand All@@ -121,7 +121,7 @@
--mlcompatibility Ignore ML compatibility warnings


- MISCELLANEOUS -
- MISCELLANEOUS -
--nologo Suppress compiler copyright message
--version Display compiler version banner and
exit
Expand All@@ -130,7 +130,7 @@
--@<file> Read response file for more options


- ADVANCED -
- ADVANCED -
--codepage:<n> Specify the codepage used to read
source files
--utf8output Output messages in UTF-8 encoding
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -2,7 +2,7 @@ Microsoft (R) F# Compiler version 12.0.0.0 for F# 6.0
Copyright (c) Microsoft Corporation. All Rights Reserved.


- OUTPUT FILES -
- OUTPUT FILES -
--out:<file> Name of the output file (Short form:
-o)
--target:exe Build a console executable
Expand DownExpand Up@@ -48,15 +48,15 @@ Copyright (c) Microsoft Corporation. All Rights Reserved.
the specified file path.


- INPUT FILES -
- INPUT FILES -
--reference:<file> Reference an assembly (Short form:
-r)
--compilertool:<file> Reference an assembly or directory
containing a design time tool (Short
form: -t)


- RESOURCES -
- RESOURCES -
--win32icon:<file> Specify a Win32 icon file (.ico)
--win32res:<file> Specify a Win32 resource file (.res)
--win32manifest:<file> Specify a Win32 manifest file
Expand All@@ -69,7 +69,7 @@ Copyright (c) Microsoft Corporation. All Rights Reserved.
name>[,public|private]]


- CODE GENERATION -
- CODE GENERATION -
--debug[+|-] Emit debug information (Short form:
-g)
--debug:{full|pdbonly|portable|embedded} Specify debugging type: full,
Expand DownExpand Up@@ -101,7 +101,7 @@ Copyright (c) Microsoft Corporation. All Rights Reserved.
constructs using reflection


- ERRORS AND WARNINGS -
- ERRORS AND WARNINGS -
--warnaserror[+|-] Report all warnings as errors
--warnaserror[+|-]:<warn;...> Report specific warnings as errors
--warn:<n> Set a warning level (0-5)
Expand All@@ -112,7 +112,7 @@ Copyright (c) Microsoft Corporation. All Rights Reserved.
color


- LANGUAGE -
- LANGUAGE -
--langversion:{?|version|latest|preview} Display the allowed values for
language version, specify language
version such as 'latest' or
Expand All@@ -123,7 +123,7 @@ Copyright (c) Microsoft Corporation. All Rights Reserved.
--mlcompatibility Ignore ML compatibility warnings


- MISCELLANEOUS -
- MISCELLANEOUS -
--nologo Suppress compiler copyright message
--version Display compiler version banner and
exit
Expand All@@ -132,7 +132,7 @@ Copyright (c) Microsoft Corporation. All Rights Reserved.
--@<file> Read response file for more options


- ADVANCED -
- ADVANCED -
--codepage:<n> Specify the codepage used to read
source files
--utf8output Output messages in UTF-8 encoding
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -2,7 +2,7 @@
Usage: fsharpi <options> [script.fsx [<arguments>]]


- INPUT FILES -
- INPUT FILES -
--use:<file> Use the given file on startup as
initial input
--load:<file> #load the given file on startup
Expand All@@ -16,7 +16,7 @@ Usage: fsharpi <options> [script.fsx [<arguments>]]
fsi.CommandLineArgs


- CODE GENERATION -
- CODE GENERATION -
--debug[+|-] Emit debug information (Short form:
-g)
--debug:{full|pdbonly|portable|embedded} Specify debugging type: full,
Expand All@@ -42,7 +42,7 @@ Usage: fsharpi <options> [script.fsx [<arguments>]]
constructs using reflection


- ERRORS AND WARNINGS -
- ERRORS AND WARNINGS -
--warnaserror[+|-] Report all warnings as errors
--warnaserror[+|-]:<warn;...> Report specific warnings as errors
--warn:<n> Set a warning level (0-5)
Expand All@@ -53,7 +53,7 @@ Usage: fsharpi <options> [script.fsx [<arguments>]]
color


- LANGUAGE -
- LANGUAGE -
--langversion:{?|version|latest|preview} Display the allowed values for
language version, specify language
version such as 'latest' or
Expand All@@ -64,15 +64,15 @@ Usage: fsharpi <options> [script.fsx [<arguments>]]
--mlcompatibility Ignore ML compatibility warnings


- MISCELLANEOUS -
- MISCELLANEOUS -
--nologo Suppress compiler copyright message
--version Display compiler version banner and
exit
--help Display this usage message (Short
form: -?)


- ADVANCED -
- ADVANCED -
--codepage:<n> Specify the codepage used to read
source files
--utf8output Output messages in UTF-8 encoding
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
4 changes: 4 additions & 0 deletions src/Compiler/Driver/CompilerConfig.fs
Original file line numberDiff line numberDiff line change
Expand Up@@ -551,6 +551,8 @@ type TcConfigBuilder =

mutable fxResolver: FxResolver option

mutable bufferWidth: int option

// Is F# Interactive using multi-assembly emit?
mutable fsiMultiAssemblyEmit: bool

Expand DownExpand Up@@ -741,6 +743,7 @@ type TcConfigBuilder =
shadowCopyReferences = false
useSdkRefs = true
fxResolver = None
bufferWidth = None
fsiMultiAssemblyEmit = true
internalTestSpanStackReferring = false
noConditionalErasure = false
Expand DownExpand Up@@ -1163,6 +1166,7 @@ type TcConfig private (data: TcConfigBuilder, validate: bool) =
errorRecovery e range0
[]

member _.bufferWidth = data.bufferWidth
member _.fsiMultiAssemblyEmit = data.fsiMultiAssemblyEmit
member _.FxResolver = data.FxResolver
member _.primaryAssembly = data.primaryAssembly
Expand Down
5 changes: 5 additions & 0 deletions src/Compiler/Driver/CompilerConfig.fsi
Original file line numberDiff line numberDiff line change
Expand Up@@ -452,6 +452,8 @@ type TcConfigBuilder =

mutable fxResolver: FxResolver option

mutable bufferWidth: int option

mutable fsiMultiAssemblyEmit: bool

rangeForErrors: range
Expand DownExpand Up@@ -746,13 +748,16 @@ type TcConfig =
member alwaysCallVirt: bool

member noDebugAttributes: bool

member useReflectionFreeCodeGen: bool

/// If true, indicates all type checking and code generation is in the context of fsi.exe
member isInteractive: bool

member isInvalidationSupported: bool

member bufferWidth: int option

/// Indicates if F# Interactive is using single-assembly emit via Reflection.Emit, where internals are available.
member fsiMultiAssemblyEmit: bool

Expand Down
43 changes: 28 additions & 15 deletions src/Compiler/Driver/CompilerOptions.fs
Original file line numberDiff line numberDiff line change
Expand Up@@ -115,23 +115,27 @@ let compilerOptionUsage (CompilerOption (s, tag, spec, _, _)) =

let nl = Environment.NewLine

let getCompilerOption (CompilerOption (_s, _tag, _spec, _, help) as compilerOption) =
let getCompilerOption (CompilerOption (_s, _tag, _spec, _, help) as compilerOption) width =
let sb = StringBuilder()

let flagWidth = 42 // fixed width for printing of flags, e.g. --debug:{full|pdbonly|portable|embedded}
let defaultLineWidth = 80 // the fallback width

let lineWidth =
try
Console.BufferWidth
with e ->
defaultLineWidth
match width with
| None ->
try
Console.BufferWidth
with _ ->
defaultLineWidth
| Some w -> w

let lineWidth =
if lineWidth = 0 then
defaultLineWidth
else
lineWidth (* Have seen BufferWidth=0 on Linux/Mono *)
lineWidth (* Have seen BufferWidth=0 on Linux/Mono Coreclr for sure *)

// Lines have this form: <flagWidth><space><description>
// flagWidth chars - for flags description or padding on continuation lines.
// single space - space.
Expand DownExpand Up@@ -159,14 +163,14 @@ let getCompilerOption (CompilerOption (_s, _tag, _spec, _, help) as compilerOpti
let _ = sb.Append $"{nl}"
sb.ToString()

let getPublicOptions (heading, opts) =
if not (isNil opts) then
$"{nl}{nl}\t\t{heading}{nl}"
+ (opts |> List.map getCompilerOption |> String.concat "")
else
""
let getPublicOptions heading opts width =
match opts with
| [] -> ""
| _ ->
$"{nl}{nl} {heading}{nl}"
+ (opts |> List.map (fun t -> getCompilerOption t width) |> String.concat "")

let GetCompilerOptionBlocks blocks =
let GetCompilerOptionBlocks blocks width =
let sb = new StringBuilder()

let publicBlocks =
Expand All@@ -182,7 +186,7 @@ let GetCompilerOptionBlocks blocks =
let headingOptions =
publicBlocks |> List.filter (fun (h2, _) -> heading = h2) |> List.collect snd

let _ = sb.Append(getPublicOptions (heading, headingOptions))
let _ = sb.Append(getPublicOptions heading headingOptions width)
Set.add heading doneHeadings

List.fold consider Set.empty publicBlocks |> ignore<Set<string>>
Expand DownExpand Up@@ -1462,6 +1466,14 @@ let internalFlags (tcConfigB: TcConfigBuilder) =
None
)

CompilerOption(
"bufferwidth",
tagNone,
OptionInt((fun v -> tcConfigB.bufferWidth <- Some v)),
Some(InternalCommandLineOption("--bufferWidth", rangeCmdArgs)),
None
)

CompilerOption(
"detuple",
tagNone,
Expand DownExpand Up@@ -1997,7 +2009,8 @@ let GetBannerText tcConfigB =

/// FSC only help. (FSI has it's own help function).
let GetHelpFsc tcConfigB (blocks: CompilerOptionBlock list) =
GetBannerText tcConfigB + GetCompilerOptionBlocks blocks

GetBannerText tcConfigB + GetCompilerOptionBlocks blocks tcConfigB.bufferWidth

let GetVersion tcConfigB =
$"{tcConfigB.productNameForBannerText}{nl}"
Expand Down
2 changes: 1 addition & 1 deletion src/Compiler/Driver/CompilerOptions.fsi
Original file line numberDiff line numberDiff line change
Expand Up@@ -43,7 +43,7 @@ and CompilerOptionBlock =
| PublicOptions of heading: string * options: CompilerOption list
| PrivateOptions of options: CompilerOption list

val GetCompilerOptionBlocks: CompilerOptionBlock list -> string
val GetCompilerOptionBlocks: CompilerOptionBlock list -> width: int option -> string

val DumpCompilerOptionBlocks: CompilerOptionBlock list -> unit // for QA

Expand Down
2 changes: 1 addition & 1 deletion src/Compiler/Interactive/fsi.fs
Original file line numberDiff line numberDiff line change
Expand Up@@ -885,7 +885,7 @@ type internal FsiCommandLineOptions(fsi: FsiEvaluationSessionHostConfig,
Console.Write (GetBannerText tcConfigB)
fprintfn fsiConsoleOutput.Out ""
fprintfn fsiConsoleOutput.Out "%s" (FSIstrings.SR.fsiUsage(executableFileNameWithoutExtension.Value))
Console.Write (GetCompilerOptionBlocks blocks)
Console.Write (GetCompilerOptionBlocks blocks tcConfigB.bufferWidth)
exit 0

// option tags
Expand Down
26 changes: 12 additions & 14 deletions tests/FSharp.Compiler.Service.Tests/ConsoleOnlyOptionsTests.fs
Original file line numberDiff line numberDiff line change
Expand Up@@ -5,27 +5,25 @@ module FSharp.Compiler.Service.Tests.ConsoleOnlyOptionsTests
open System
open System.IO
open FSharp.Compiler.CompilerOptions
open FSharp.Compiler.Text.Range
open NUnit.Framework
open TestDoubles

[<Test>]
[<Ignore "Failing in main, disabling until resolved">]
let ``Help is displayed correctly`` () =
try
if System.Console.BufferWidth < 80 then
System.Console.BufferWidth <- 80
with _ -> ()
let ``fsc help text is displayed correctly`` () =

let builder = getArbitraryTcConfigBuilder()
builder.showBanner <- false // We don't need the banner

let blocks = GetCoreFscCompilerOptions builder
let builder = getArbitraryTcConfigBuilder()
builder.showBanner <- false // We don't need the banner
builder.TurnWarningOff(rangeCmdArgs, "75") // We are going to use a test only flag
builder.bufferWidth <- Some 80 // Fixed width 80

let expectedHelp = File.ReadAllText $"{__SOURCE_DIRECTORY__}/expected-help-output.bsl"

let expectedHelp = File.ReadAllText $"{__SOURCE_DIRECTORY__}/expected-help-output.bsl"
let help = GetHelpFsc builder blocks
let blocks = GetCoreFscCompilerOptions builder
let help = GetHelpFsc builder blocks
let actualHelp = help.Replace("\r\n", Environment.NewLine)

let actualHelp = help.Replace("\r\n", Environment.NewLine)
Assert.AreEqual(expectedHelp, actualHelp, $"Console width: {System.Console.BufferWidth}\nExpected: {expectedHelp}\n Actual: {actualHelp}") |> ignore
Assert.AreEqual(expectedHelp, actualHelp, $"Expected: '{expectedHelp}'\n Actual: '{actualHelp}'") |> ignore

[<Test>]
let ``Version is displayed correctly`` () =
Expand Down
16 changes: 8 additions & 8 deletions tests/FSharp.Compiler.Service.Tests/expected-help-output.bsl
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@

- OUTPUT FILES -
- OUTPUT FILES -
--out:<file> Name of the output file (Short form:
-o)
--target:exe Build a console executable
Expand DownExpand Up@@ -46,15 +46,15 @@
the specified file path.


- INPUT FILES -
- INPUT FILES -
--reference:<file> Reference an assembly (Short form:
-r)
--compilertool:<file> Reference an assembly or directory
containing a design time tool (Short
form: -t)


- RESOURCES -
- RESOURCES -
--win32icon:<file> Specify a Win32 icon file (.ico)
--win32res:<file> Specify a Win32 resource file (.res)
--win32manifest:<file> Specify a Win32 manifest file
Expand All@@ -67,7 +67,7 @@
name>[,public|private]]


- CODE GENERATION -
- CODE GENERATION -
--debug[+|-] Emit debug information (Short form:
-g)
--debug:{full|pdbonly|portable|embedded} Specify debugging type: full,
Expand DownExpand Up@@ -99,7 +99,7 @@
constructs using reflection


- ERRORS AND WARNINGS -
- ERRORS AND WARNINGS -
--warnaserror[+|-] Report all warnings as errors
--warnaserror[+|-]:<warn;...> Report specific warnings as errors
--warn:<n> Set a warning level (0-5)
Expand All@@ -110,7 +110,7 @@
color


- LANGUAGE -
- LANGUAGE -
--langversion:{?|version|latest|preview} Display the allowed values for
language version, specify language
version such as 'latest' or
Expand All@@ -121,7 +121,7 @@
--mlcompatibility Ignore ML compatibility warnings


- MISCELLANEOUS -
- MISCELLANEOUS -
--nologo Suppress compiler copyright message
--version Display compiler version banner and
exit
Expand All@@ -130,7 +130,7 @@
--@<file> Read response file for more options


- ADVANCED -
- ADVANCED -
--codepage:<n> Specify the codepage used to read
source files
--utf8output Output messages in UTF-8 encoding
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -2,7 +2,7 @@ Microsoft (R) F# Compiler version 12.0.0.0 for F# 6.0
Copyright (c) Microsoft Corporation. All Rights Reserved.


- OUTPUT FILES -
- OUTPUT FILES -
--out:<file> Name of the output file (Short form:
-o)
--target:exe Build a console executable
Expand DownExpand Up@@ -48,15 +48,15 @@ Copyright (c) Microsoft Corporation. All Rights Reserved.
the specified file path.


- INPUT FILES -
- INPUT FILES -
--reference:<file> Reference an assembly (Short form:
-r)
--compilertool:<file> Reference an assembly or directory
containing a design time tool (Short
form: -t)


- RESOURCES -
- RESOURCES -
--win32icon:<file> Specify a Win32 icon file (.ico)
--win32res:<file> Specify a Win32 resource file (.res)
--win32manifest:<file> Specify a Win32 manifest file
Expand All@@ -69,7 +69,7 @@ Copyright (c) Microsoft Corporation. All Rights Reserved.
name>[,public|private]]


- CODE GENERATION -
- CODE GENERATION -
--debug[+|-] Emit debug information (Short form:
-g)
--debug:{full|pdbonly|portable|embedded} Specify debugging type: full,
Expand DownExpand Up@@ -101,7 +101,7 @@ Copyright (c) Microsoft Corporation. All Rights Reserved.
constructs using reflection


- ERRORS AND WARNINGS -
- ERRORS AND WARNINGS -
--warnaserror[+|-] Report all warnings as errors
--warnaserror[+|-]:<warn;...> Report specific warnings as errors
--warn:<n> Set a warning level (0-5)
Expand All@@ -112,7 +112,7 @@ Copyright (c) Microsoft Corporation. All Rights Reserved.
color


- LANGUAGE -
- LANGUAGE -
--langversion:{?|version|latest|preview} Display the allowed values for
language version, specify language
version such as 'latest' or
Expand All@@ -123,7 +123,7 @@ Copyright (c) Microsoft Corporation. All Rights Reserved.
--mlcompatibility Ignore ML compatibility warnings


- MISCELLANEOUS -
- MISCELLANEOUS -
--nologo Suppress compiler copyright message
--version Display compiler version banner and
exit
Expand All@@ -132,7 +132,7 @@ Copyright (c) Microsoft Corporation. All Rights Reserved.
--@<file> Read response file for more options


- ADVANCED -
- ADVANCED -
--codepage:<n> Specify the codepage used to read
source files
--utf8output Output messages in UTF-8 encoding
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -2,7 +2,7 @@
Usage: fsharpi <options> [script.fsx [<arguments>]]


- INPUT FILES -
- INPUT FILES -
--use:<file> Use the given file on startup as
initial input
--load:<file> #load the given file on startup
Expand All@@ -16,7 +16,7 @@ Usage: fsharpi <options> [script.fsx [<arguments>]]
fsi.CommandLineArgs


- CODE GENERATION -
- CODE GENERATION -
--debug[+|-] Emit debug information (Short form:
-g)
--debug:{full|pdbonly|portable|embedded} Specify debugging type: full,
Expand All@@ -42,7 +42,7 @@ Usage: fsharpi <options> [script.fsx [<arguments>]]
constructs using reflection


- ERRORS AND WARNINGS -
- ERRORS AND WARNINGS -
--warnaserror[+|-] Report all warnings as errors
--warnaserror[+|-]:<warn;...> Report specific warnings as errors
--warn:<n> Set a warning level (0-5)
Expand All@@ -53,7 +53,7 @@ Usage: fsharpi <options> [script.fsx [<arguments>]]
color


- LANGUAGE -
- LANGUAGE -
--langversion:{?|version|latest|preview} Display the allowed values for
language version, specify language
version such as 'latest' or
Expand All@@ -64,15 +64,15 @@ Usage: fsharpi <options> [script.fsx [<arguments>]]
--mlcompatibility Ignore ML compatibility warnings


- MISCELLANEOUS -
- MISCELLANEOUS -
--nologo Suppress compiler copyright message
--version Display compiler version banner and
exit
--help Display this usage message (Short
form: -?)


- ADVANCED -
- ADVANCED -
--codepage:<n> Specify the codepage used to read
source files
--utf8output Output messages in UTF-8 encoding
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
4 changes: 4 additions & 0 deletions src/Compiler/Driver/CompilerConfig.fs
Original file line numberDiff line numberDiff line change
Expand Up@@ -551,6 +551,8 @@ type TcConfigBuilder =

mutable fxResolver: FxResolver option

mutable bufferWidth: int option

// Is F# Interactive using multi-assembly emit?
mutable fsiMultiAssemblyEmit: bool

Expand DownExpand Up@@ -741,6 +743,7 @@ type TcConfigBuilder =
shadowCopyReferences = false
useSdkRefs = true
fxResolver = None
bufferWidth = None
fsiMultiAssemblyEmit = true
internalTestSpanStackReferring = false
noConditionalErasure = false
Expand DownExpand Up@@ -1163,6 +1166,7 @@ type TcConfig private (data: TcConfigBuilder, validate: bool) =
errorRecovery e range0
[]

member _.bufferWidth = data.bufferWidth
member _.fsiMultiAssemblyEmit = data.fsiMultiAssemblyEmit
member _.FxResolver = data.FxResolver
member _.primaryAssembly = data.primaryAssembly
Expand Down
5 changes: 5 additions & 0 deletions src/Compiler/Driver/CompilerConfig.fsi
Original file line numberDiff line numberDiff line change
Expand Up@@ -452,6 +452,8 @@ type TcConfigBuilder =

mutable fxResolver: FxResolver option

mutable bufferWidth: int option

mutable fsiMultiAssemblyEmit: bool

rangeForErrors: range
Expand DownExpand Up@@ -746,13 +748,16 @@ type TcConfig =
member alwaysCallVirt: bool

member noDebugAttributes: bool

member useReflectionFreeCodeGen: bool

/// If true, indicates all type checking and code generation is in the context of fsi.exe
member isInteractive: bool

member isInvalidationSupported: bool

member bufferWidth: int option

/// Indicates if F# Interactive is using single-assembly emit via Reflection.Emit, where internals are available.
member fsiMultiAssemblyEmit: bool

Expand Down
43 changes: 28 additions & 15 deletions src/Compiler/Driver/CompilerOptions.fs
Original file line numberDiff line numberDiff line change
Expand Up@@ -115,23 +115,27 @@ let compilerOptionUsage (CompilerOption (s, tag, spec, _, _)) =

let nl = Environment.NewLine

let getCompilerOption (CompilerOption (_s, _tag, _spec, _, help) as compilerOption) =
let getCompilerOption (CompilerOption (_s, _tag, _spec, _, help) as compilerOption) width =
let sb = StringBuilder()

let flagWidth = 42 // fixed width for printing of flags, e.g. --debug:{full|pdbonly|portable|embedded}
let defaultLineWidth = 80 // the fallback width

let lineWidth =
try
Console.BufferWidth
with e ->
defaultLineWidth
match width with
| None ->
try
Console.BufferWidth
with _ ->
defaultLineWidth
| Some w -> w

let lineWidth =
if lineWidth = 0 then
defaultLineWidth
else
lineWidth (* Have seen BufferWidth=0 on Linux/Mono *)
lineWidth (* Have seen BufferWidth=0 on Linux/Mono Coreclr for sure *)

// Lines have this form: <flagWidth><space><description>
// flagWidth chars - for flags description or padding on continuation lines.
// single space - space.
Expand DownExpand Up@@ -159,14 +163,14 @@ let getCompilerOption (CompilerOption (_s, _tag, _spec, _, help) as compilerOpti
let _ = sb.Append $"{nl}"
sb.ToString()

let getPublicOptions (heading, opts) =
if not (isNil opts) then
$"{nl}{nl}\t\t{heading}{nl}"
+ (opts |> List.map getCompilerOption |> String.concat "")
else
""
let getPublicOptions heading opts width =
match opts with
| [] -> ""
| _ ->
$"{nl}{nl} {heading}{nl}"
+ (opts |> List.map (fun t -> getCompilerOption t width) |> String.concat "")

let GetCompilerOptionBlocks blocks =
let GetCompilerOptionBlocks blocks width =
let sb = new StringBuilder()

let publicBlocks =
Expand All@@ -182,7 +186,7 @@ let GetCompilerOptionBlocks blocks =
let headingOptions =
publicBlocks |> List.filter (fun (h2, _) -> heading = h2) |> List.collect snd

let _ = sb.Append(getPublicOptions (heading, headingOptions))
let _ = sb.Append(getPublicOptions heading headingOptions width)
Set.add heading doneHeadings

List.fold consider Set.empty publicBlocks |> ignore<Set<string>>
Expand DownExpand Up@@ -1462,6 +1466,14 @@ let internalFlags (tcConfigB: TcConfigBuilder) =
None
)

CompilerOption(
"bufferwidth",
tagNone,
OptionInt((fun v -> tcConfigB.bufferWidth <- Some v)),
Some(InternalCommandLineOption("--bufferWidth", rangeCmdArgs)),
None
)

CompilerOption(
"detuple",
tagNone,
Expand DownExpand Up@@ -1997,7 +2009,8 @@ let GetBannerText tcConfigB =

/// FSC only help. (FSI has it's own help function).
let GetHelpFsc tcConfigB (blocks: CompilerOptionBlock list) =
GetBannerText tcConfigB + GetCompilerOptionBlocks blocks

GetBannerText tcConfigB + GetCompilerOptionBlocks blocks tcConfigB.bufferWidth

let GetVersion tcConfigB =
$"{tcConfigB.productNameForBannerText}{nl}"
Expand Down
2 changes: 1 addition & 1 deletion src/Compiler/Driver/CompilerOptions.fsi
Original file line numberDiff line numberDiff line change
Expand Up@@ -43,7 +43,7 @@ and CompilerOptionBlock =
| PublicOptions of heading: string * options: CompilerOption list
| PrivateOptions of options: CompilerOption list

val GetCompilerOptionBlocks: CompilerOptionBlock list -> string
val GetCompilerOptionBlocks: CompilerOptionBlock list -> width: int option -> string

val DumpCompilerOptionBlocks: CompilerOptionBlock list -> unit // for QA

Expand Down
2 changes: 1 addition & 1 deletion src/Compiler/Interactive/fsi.fs
Original file line numberDiff line numberDiff line change
Expand Up@@ -885,7 +885,7 @@ type internal FsiCommandLineOptions(fsi: FsiEvaluationSessionHostConfig,
Console.Write (GetBannerText tcConfigB)
fprintfn fsiConsoleOutput.Out ""
fprintfn fsiConsoleOutput.Out "%s" (FSIstrings.SR.fsiUsage(executableFileNameWithoutExtension.Value))
Console.Write (GetCompilerOptionBlocks blocks)
Console.Write (GetCompilerOptionBlocks blocks tcConfigB.bufferWidth)
exit 0

// option tags
Expand Down
26 changes: 12 additions & 14 deletions tests/FSharp.Compiler.Service.Tests/ConsoleOnlyOptionsTests.fs
Original file line numberDiff line numberDiff line change
Expand Up@@ -5,27 +5,25 @@ module FSharp.Compiler.Service.Tests.ConsoleOnlyOptionsTests
open System
open System.IO
open FSharp.Compiler.CompilerOptions
open FSharp.Compiler.Text.Range
open NUnit.Framework
open TestDoubles

[<Test>]
[<Ignore "Failing in main, disabling until resolved">]
let ``Help is displayed correctly`` () =
try
if System.Console.BufferWidth < 80 then
System.Console.BufferWidth <- 80
with _ -> ()
let ``fsc help text is displayed correctly`` () =

let builder = getArbitraryTcConfigBuilder()
builder.showBanner <- false // We don't need the banner

let blocks = GetCoreFscCompilerOptions builder
let builder = getArbitraryTcConfigBuilder()
builder.showBanner <- false // We don't need the banner
builder.TurnWarningOff(rangeCmdArgs, "75") // We are going to use a test only flag
builder.bufferWidth <- Some 80 // Fixed width 80

let expectedHelp = File.ReadAllText $"{__SOURCE_DIRECTORY__}/expected-help-output.bsl"

let expectedHelp = File.ReadAllText $"{__SOURCE_DIRECTORY__}/expected-help-output.bsl"
let help = GetHelpFsc builder blocks
let blocks = GetCoreFscCompilerOptions builder
let help = GetHelpFsc builder blocks
let actualHelp = help.Replace("\r\n", Environment.NewLine)

let actualHelp = help.Replace("\r\n", Environment.NewLine)
Assert.AreEqual(expectedHelp, actualHelp, $"Console width: {System.Console.BufferWidth}\nExpected: {expectedHelp}\n Actual: {actualHelp}") |> ignore
Assert.AreEqual(expectedHelp, actualHelp, $"Expected: '{expectedHelp}'\n Actual: '{actualHelp}'") |> ignore

[<Test>]
let ``Version is displayed correctly`` () =
Expand Down
16 changes: 8 additions & 8 deletions tests/FSharp.Compiler.Service.Tests/expected-help-output.bsl
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@

- OUTPUT FILES -
- OUTPUT FILES -
--out:<file> Name of the output file (Short form:
-o)
--target:exe Build a console executable
Expand DownExpand Up@@ -46,15 +46,15 @@
the specified file path.


- INPUT FILES -
- INPUT FILES -
--reference:<file> Reference an assembly (Short form:
-r)
--compilertool:<file> Reference an assembly or directory
containing a design time tool (Short
form: -t)


- RESOURCES -
- RESOURCES -
--win32icon:<file> Specify a Win32 icon file (.ico)
--win32res:<file> Specify a Win32 resource file (.res)
--win32manifest:<file> Specify a Win32 manifest file
Expand All@@ -67,7 +67,7 @@
name>[,public|private]]


- CODE GENERATION -
- CODE GENERATION -
--debug[+|-] Emit debug information (Short form:
-g)
--debug:{full|pdbonly|portable|embedded} Specify debugging type: full,
Expand DownExpand Up@@ -99,7 +99,7 @@
constructs using reflection


- ERRORS AND WARNINGS -
- ERRORS AND WARNINGS -
--warnaserror[+|-] Report all warnings as errors
--warnaserror[+|-]:<warn;...> Report specific warnings as errors
--warn:<n> Set a warning level (0-5)
Expand All@@ -110,7 +110,7 @@
color


- LANGUAGE -
- LANGUAGE -
--langversion:{?|version|latest|preview} Display the allowed values for
language version, specify language
version such as 'latest' or
Expand All@@ -121,7 +121,7 @@
--mlcompatibility Ignore ML compatibility warnings


- MISCELLANEOUS -
- MISCELLANEOUS -
--nologo Suppress compiler copyright message
--version Display compiler version banner and
exit
Expand All@@ -130,7 +130,7 @@
--@<file> Read response file for more options


- ADVANCED -
- ADVANCED -
--codepage:<n> Specify the codepage used to read
source files
--utf8output Output messages in UTF-8 encoding
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -2,7 +2,7 @@ Microsoft (R) F# Compiler version 12.0.0.0 for F# 6.0
Copyright (c) Microsoft Corporation. All Rights Reserved.


- OUTPUT FILES -
- OUTPUT FILES -
--out:<file> Name of the output file (Short form:
-o)
--target:exe Build a console executable
Expand DownExpand Up@@ -48,15 +48,15 @@ Copyright (c) Microsoft Corporation. All Rights Reserved.
the specified file path.


- INPUT FILES -
- INPUT FILES -
--reference:<file> Reference an assembly (Short form:
-r)
--compilertool:<file> Reference an assembly or directory
containing a design time tool (Short
form: -t)


- RESOURCES -
- RESOURCES -
--win32icon:<file> Specify a Win32 icon file (.ico)
--win32res:<file> Specify a Win32 resource file (.res)
--win32manifest:<file> Specify a Win32 manifest file
Expand All@@ -69,7 +69,7 @@ Copyright (c) Microsoft Corporation. All Rights Reserved.
name>[,public|private]]


- CODE GENERATION -
- CODE GENERATION -
--debug[+|-] Emit debug information (Short form:
-g)
--debug:{full|pdbonly|portable|embedded} Specify debugging type: full,
Expand DownExpand Up@@ -101,7 +101,7 @@ Copyright (c) Microsoft Corporation. All Rights Reserved.
constructs using reflection


- ERRORS AND WARNINGS -
- ERRORS AND WARNINGS -
--warnaserror[+|-] Report all warnings as errors
--warnaserror[+|-]:<warn;...> Report specific warnings as errors
--warn:<n> Set a warning level (0-5)
Expand All@@ -112,7 +112,7 @@ Copyright (c) Microsoft Corporation. All Rights Reserved.
color


- LANGUAGE -
- LANGUAGE -
--langversion:{?|version|latest|preview} Display the allowed values for
language version, specify language
version such as 'latest' or
Expand All@@ -123,7 +123,7 @@ Copyright (c) Microsoft Corporation. All Rights Reserved.
--mlcompatibility Ignore ML compatibility warnings


- MISCELLANEOUS -
- MISCELLANEOUS -
--nologo Suppress compiler copyright message
--version Display compiler version banner and
exit
Expand All@@ -132,7 +132,7 @@ Copyright (c) Microsoft Corporation. All Rights Reserved.
--@<file> Read response file for more options


- ADVANCED -
- ADVANCED -
--codepage:<n> Specify the codepage used to read
source files
--utf8output Output messages in UTF-8 encoding
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -2,7 +2,7 @@
Usage: fsharpi <options> [script.fsx [<arguments>]]


- INPUT FILES -
- INPUT FILES -
--use:<file> Use the given file on startup as
initial input
--load:<file> #load the given file on startup
Expand All@@ -16,7 +16,7 @@ Usage: fsharpi <options> [script.fsx [<arguments>]]
fsi.CommandLineArgs


- CODE GENERATION -
- CODE GENERATION -
--debug[+|-] Emit debug information (Short form:
-g)
--debug:{full|pdbonly|portable|embedded} Specify debugging type: full,
Expand All@@ -42,7 +42,7 @@ Usage: fsharpi <options> [script.fsx [<arguments>]]
constructs using reflection


- ERRORS AND WARNINGS -
- ERRORS AND WARNINGS -
--warnaserror[+|-] Report all warnings as errors
--warnaserror[+|-]:<warn;...> Report specific warnings as errors
--warn:<n> Set a warning level (0-5)
Expand All@@ -53,7 +53,7 @@ Usage: fsharpi <options> [script.fsx [<arguments>]]
color


- LANGUAGE -
- LANGUAGE -
--langversion:{?|version|latest|preview} Display the allowed values for
language version, specify language
version such as 'latest' or
Expand All@@ -64,15 +64,15 @@ Usage: fsharpi <options> [script.fsx [<arguments>]]
--mlcompatibility Ignore ML compatibility warnings


- MISCELLANEOUS -
- MISCELLANEOUS -
--nologo Suppress compiler copyright message
--version Display compiler version banner and
exit
--help Display this usage message (Short
form: -?)


- ADVANCED -
- ADVANCED -
--codepage:<n> Specify the codepage used to read
source files
--utf8output Output messages in UTF-8 encoding
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
4 changes: 4 additions & 0 deletions src/Compiler/Driver/CompilerConfig.fs
Original file line numberDiff line numberDiff line change
Expand Up@@ -551,6 +551,8 @@ type TcConfigBuilder =

mutable fxResolver: FxResolver option

mutable bufferWidth: int option

// Is F# Interactive using multi-assembly emit?
mutable fsiMultiAssemblyEmit: bool

Expand DownExpand Up@@ -741,6 +743,7 @@ type TcConfigBuilder =
shadowCopyReferences = false
useSdkRefs = true
fxResolver = None
bufferWidth = None
fsiMultiAssemblyEmit = true
internalTestSpanStackReferring = false
noConditionalErasure = false
Expand DownExpand Up@@ -1163,6 +1166,7 @@ type TcConfig private (data: TcConfigBuilder, validate: bool) =
errorRecovery e range0
[]

member _.bufferWidth = data.bufferWidth
member _.fsiMultiAssemblyEmit = data.fsiMultiAssemblyEmit
member _.FxResolver = data.FxResolver
member _.primaryAssembly = data.primaryAssembly
Expand Down
5 changes: 5 additions & 0 deletions src/Compiler/Driver/CompilerConfig.fsi
Original file line numberDiff line numberDiff line change
Expand Up@@ -452,6 +452,8 @@ type TcConfigBuilder =

mutable fxResolver: FxResolver option

mutable bufferWidth: int option

mutable fsiMultiAssemblyEmit: bool

rangeForErrors: range
Expand DownExpand Up@@ -746,13 +748,16 @@ type TcConfig =
member alwaysCallVirt: bool

member noDebugAttributes: bool

member useReflectionFreeCodeGen: bool

/// If true, indicates all type checking and code generation is in the context of fsi.exe
member isInteractive: bool

member isInvalidationSupported: bool

member bufferWidth: int option

/// Indicates if F# Interactive is using single-assembly emit via Reflection.Emit, where internals are available.
member fsiMultiAssemblyEmit: bool

Expand Down
43 changes: 28 additions & 15 deletions src/Compiler/Driver/CompilerOptions.fs
Original file line numberDiff line numberDiff line change
Expand Up@@ -115,23 +115,27 @@ let compilerOptionUsage (CompilerOption (s, tag, spec, _, _)) =

let nl = Environment.NewLine

let getCompilerOption (CompilerOption (_s, _tag, _spec, _, help) as compilerOption) =
let getCompilerOption (CompilerOption (_s, _tag, _spec, _, help) as compilerOption) width =
let sb = StringBuilder()

let flagWidth = 42 // fixed width for printing of flags, e.g. --debug:{full|pdbonly|portable|embedded}
let defaultLineWidth = 80 // the fallback width

let lineWidth =
try
Console.BufferWidth
with e ->
defaultLineWidth
match width with
| None ->
try
Console.BufferWidth
with _ ->
defaultLineWidth
| Some w -> w

let lineWidth =
if lineWidth = 0 then
defaultLineWidth
else
lineWidth (* Have seen BufferWidth=0 on Linux/Mono *)
lineWidth (* Have seen BufferWidth=0 on Linux/Mono Coreclr for sure *)

// Lines have this form: <flagWidth><space><description>
// flagWidth chars - for flags description or padding on continuation lines.
// single space - space.
Expand DownExpand Up@@ -159,14 +163,14 @@ let getCompilerOption (CompilerOption (_s, _tag, _spec, _, help) as compilerOpti
let _ = sb.Append $"{nl}"
sb.ToString()

let getPublicOptions (heading, opts) =
if not (isNil opts) then
$"{nl}{nl}\t\t{heading}{nl}"
+ (opts |> List.map getCompilerOption |> String.concat "")
else
""
let getPublicOptions heading opts width =
match opts with
| [] -> ""
| _ ->
$"{nl}{nl} {heading}{nl}"
+ (opts |> List.map (fun t -> getCompilerOption t width) |> String.concat "")

let GetCompilerOptionBlocks blocks =
let GetCompilerOptionBlocks blocks width =
let sb = new StringBuilder()

let publicBlocks =
Expand All@@ -182,7 +186,7 @@ let GetCompilerOptionBlocks blocks =
let headingOptions =
publicBlocks |> List.filter (fun (h2, _) -> heading = h2) |> List.collect snd

let _ = sb.Append(getPublicOptions (heading, headingOptions))
let _ = sb.Append(getPublicOptions heading headingOptions width)
Set.add heading doneHeadings

List.fold consider Set.empty publicBlocks |> ignore<Set<string>>
Expand DownExpand Up@@ -1462,6 +1466,14 @@ let internalFlags (tcConfigB: TcConfigBuilder) =
None
)

CompilerOption(
"bufferwidth",
tagNone,
OptionInt((fun v -> tcConfigB.bufferWidth <- Some v)),
Some(InternalCommandLineOption("--bufferWidth", rangeCmdArgs)),
None
)

CompilerOption(
"detuple",
tagNone,
Expand DownExpand Up@@ -1997,7 +2009,8 @@ let GetBannerText tcConfigB =

/// FSC only help. (FSI has it's own help function).
let GetHelpFsc tcConfigB (blocks: CompilerOptionBlock list) =
GetBannerText tcConfigB + GetCompilerOptionBlocks blocks

GetBannerText tcConfigB + GetCompilerOptionBlocks blocks tcConfigB.bufferWidth

let GetVersion tcConfigB =
$"{tcConfigB.productNameForBannerText}{nl}"
Expand Down
2 changes: 1 addition & 1 deletion src/Compiler/Driver/CompilerOptions.fsi
Original file line numberDiff line numberDiff line change
Expand Up@@ -43,7 +43,7 @@ and CompilerOptionBlock =
| PublicOptions of heading: string * options: CompilerOption list
| PrivateOptions of options: CompilerOption list

val GetCompilerOptionBlocks: CompilerOptionBlock list -> string
val GetCompilerOptionBlocks: CompilerOptionBlock list -> width: int option -> string

val DumpCompilerOptionBlocks: CompilerOptionBlock list -> unit // for QA

Expand Down
2 changes: 1 addition & 1 deletion src/Compiler/Interactive/fsi.fs
Original file line numberDiff line numberDiff line change
Expand Up@@ -885,7 +885,7 @@ type internal FsiCommandLineOptions(fsi: FsiEvaluationSessionHostConfig,
Console.Write (GetBannerText tcConfigB)
fprintfn fsiConsoleOutput.Out ""
fprintfn fsiConsoleOutput.Out "%s" (FSIstrings.SR.fsiUsage(executableFileNameWithoutExtension.Value))
Console.Write (GetCompilerOptionBlocks blocks)
Console.Write (GetCompilerOptionBlocks blocks tcConfigB.bufferWidth)
exit 0

// option tags
Expand Down
26 changes: 12 additions & 14 deletions tests/FSharp.Compiler.Service.Tests/ConsoleOnlyOptionsTests.fs
Original file line numberDiff line numberDiff line change
Expand Up@@ -5,27 +5,25 @@ module FSharp.Compiler.Service.Tests.ConsoleOnlyOptionsTests
open System
open System.IO
open FSharp.Compiler.CompilerOptions
open FSharp.Compiler.Text.Range
open NUnit.Framework
open TestDoubles

[<Test>]
[<Ignore "Failing in main, disabling until resolved">]
let ``Help is displayed correctly`` () =
try
if System.Console.BufferWidth < 80 then
System.Console.BufferWidth <- 80
with _ -> ()
let ``fsc help text is displayed correctly`` () =

let builder = getArbitraryTcConfigBuilder()
builder.showBanner <- false // We don't need the banner

let blocks = GetCoreFscCompilerOptions builder
let builder = getArbitraryTcConfigBuilder()
builder.showBanner <- false // We don't need the banner
builder.TurnWarningOff(rangeCmdArgs, "75") // We are going to use a test only flag
builder.bufferWidth <- Some 80 // Fixed width 80

let expectedHelp = File.ReadAllText $"{__SOURCE_DIRECTORY__}/expected-help-output.bsl"

let expectedHelp = File.ReadAllText $"{__SOURCE_DIRECTORY__}/expected-help-output.bsl"
let help = GetHelpFsc builder blocks
let blocks = GetCoreFscCompilerOptions builder
let help = GetHelpFsc builder blocks
let actualHelp = help.Replace("\r\n", Environment.NewLine)

let actualHelp = help.Replace("\r\n", Environment.NewLine)
Assert.AreEqual(expectedHelp, actualHelp, $"Console width: {System.Console.BufferWidth}\nExpected: {expectedHelp}\n Actual: {actualHelp}") |> ignore
Assert.AreEqual(expectedHelp, actualHelp, $"Expected: '{expectedHelp}'\n Actual: '{actualHelp}'") |> ignore

[<Test>]
let ``Version is displayed correctly`` () =
Expand Down
16 changes: 8 additions & 8 deletions tests/FSharp.Compiler.Service.Tests/expected-help-output.bsl
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@

- OUTPUT FILES -
- OUTPUT FILES -
--out:<file> Name of the output file (Short form:
-o)
--target:exe Build a console executable
Expand DownExpand Up@@ -46,15 +46,15 @@
the specified file path.


- INPUT FILES -
- INPUT FILES -
--reference:<file> Reference an assembly (Short form:
-r)
--compilertool:<file> Reference an assembly or directory
containing a design time tool (Short
form: -t)


- RESOURCES -
- RESOURCES -
--win32icon:<file> Specify a Win32 icon file (.ico)
--win32res:<file> Specify a Win32 resource file (.res)
--win32manifest:<file> Specify a Win32 manifest file
Expand All@@ -67,7 +67,7 @@
name>[,public|private]]


- CODE GENERATION -
- CODE GENERATION -
--debug[+|-] Emit debug information (Short form:
-g)
--debug:{full|pdbonly|portable|embedded} Specify debugging type: full,
Expand DownExpand Up@@ -99,7 +99,7 @@
constructs using reflection


- ERRORS AND WARNINGS -
- ERRORS AND WARNINGS -
--warnaserror[+|-] Report all warnings as errors
--warnaserror[+|-]:<warn;...> Report specific warnings as errors
--warn:<n> Set a warning level (0-5)
Expand All@@ -110,7 +110,7 @@
color


- LANGUAGE -
- LANGUAGE -
--langversion:{?|version|latest|preview} Display the allowed values for
language version, specify language
version such as 'latest' or
Expand All@@ -121,7 +121,7 @@
--mlcompatibility Ignore ML compatibility warnings


- MISCELLANEOUS -
- MISCELLANEOUS -
--nologo Suppress compiler copyright message
--version Display compiler version banner and
exit
Expand All@@ -130,7 +130,7 @@
--@<file> Read response file for more options


- ADVANCED -
- ADVANCED -
--codepage:<n> Specify the codepage used to read
source files
--utf8output Output messages in UTF-8 encoding
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -2,7 +2,7 @@ Microsoft (R) F# Compiler version 12.0.0.0 for F# 6.0
Copyright (c) Microsoft Corporation. All Rights Reserved.


- OUTPUT FILES -
- OUTPUT FILES -
--out:<file> Name of the output file (Short form:
-o)
--target:exe Build a console executable
Expand DownExpand Up@@ -48,15 +48,15 @@ Copyright (c) Microsoft Corporation. All Rights Reserved.
the specified file path.


- INPUT FILES -
- INPUT FILES -
--reference:<file> Reference an assembly (Short form:
-r)
--compilertool:<file> Reference an assembly or directory
containing a design time tool (Short
form: -t)


- RESOURCES -
- RESOURCES -
--win32icon:<file> Specify a Win32 icon file (.ico)
--win32res:<file> Specify a Win32 resource file (.res)
--win32manifest:<file> Specify a Win32 manifest file
Expand All@@ -69,7 +69,7 @@ Copyright (c) Microsoft Corporation. All Rights Reserved.
name>[,public|private]]


- CODE GENERATION -
- CODE GENERATION -
--debug[+|-] Emit debug information (Short form:
-g)
--debug:{full|pdbonly|portable|embedded} Specify debugging type: full,
Expand DownExpand Up@@ -101,7 +101,7 @@ Copyright (c) Microsoft Corporation. All Rights Reserved.
constructs using reflection


- ERRORS AND WARNINGS -
- ERRORS AND WARNINGS -
--warnaserror[+|-] Report all warnings as errors
--warnaserror[+|-]:<warn;...> Report specific warnings as errors
--warn:<n> Set a warning level (0-5)
Expand All@@ -112,7 +112,7 @@ Copyright (c) Microsoft Corporation. All Rights Reserved.
color


- LANGUAGE -
- LANGUAGE -
--langversion:{?|version|latest|preview} Display the allowed values for
language version, specify language
version such as 'latest' or
Expand All@@ -123,7 +123,7 @@ Copyright (c) Microsoft Corporation. All Rights Reserved.
--mlcompatibility Ignore ML compatibility warnings


- MISCELLANEOUS -
- MISCELLANEOUS -
--nologo Suppress compiler copyright message
--version Display compiler version banner and
exit
Expand All@@ -132,7 +132,7 @@ Copyright (c) Microsoft Corporation. All Rights Reserved.
--@<file> Read response file for more options


- ADVANCED -
- ADVANCED -
--codepage:<n> Specify the codepage used to read
source files
--utf8output Output messages in UTF-8 encoding
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -2,7 +2,7 @@
Usage: fsharpi <options> [script.fsx [<arguments>]]


- INPUT FILES -
- INPUT FILES -
--use:<file> Use the given file on startup as
initial input
--load:<file> #load the given file on startup
Expand All@@ -16,7 +16,7 @@ Usage: fsharpi <options> [script.fsx [<arguments>]]
fsi.CommandLineArgs


- CODE GENERATION -
- CODE GENERATION -
--debug[+|-] Emit debug information (Short form:
-g)
--debug:{full|pdbonly|portable|embedded} Specify debugging type: full,
Expand All@@ -42,7 +42,7 @@ Usage: fsharpi <options> [script.fsx [<arguments>]]
constructs using reflection


- ERRORS AND WARNINGS -
- ERRORS AND WARNINGS -
--warnaserror[+|-] Report all warnings as errors
--warnaserror[+|-]:<warn;...> Report specific warnings as errors
--warn:<n> Set a warning level (0-5)
Expand All@@ -53,7 +53,7 @@ Usage: fsharpi <options> [script.fsx [<arguments>]]
color


- LANGUAGE -
- LANGUAGE -
--langversion:{?|version|latest|preview} Display the allowed values for
language version, specify language
version such as 'latest' or
Expand All@@ -64,15 +64,15 @@ Usage: fsharpi <options> [script.fsx [<arguments>]]
--mlcompatibility Ignore ML compatibility warnings


- MISCELLANEOUS -
- MISCELLANEOUS -
--nologo Suppress compiler copyright message
--version Display compiler version banner and
exit
--help Display this usage message (Short
form: -?)


- ADVANCED -
- ADVANCED -
--codepage:<n> Specify the codepage used to read
source files
--utf8output Output messages in UTF-8 encoding
Expand Down
Loading