From b84ff2f65cf4a474baf6788c4e507965cf25771d Mon Sep 17 00:00:00 2001 From: nojaf Date: Sat, 23 Dec 2023 12:44:36 +0100 Subject: [PATCH 1/4] Remove signature files --- src/Fantomas.Core/ASTTransformer.fsi | 7 - src/Fantomas.Core/CodeFormatter.fsi | 80 ----- src/Fantomas.Core/CodeFormatterImpl.fsi | 15 - src/Fantomas.Core/CodePrinter.fsi | 6 - src/Fantomas.Core/Context.fsi | 289 ------------------ src/Fantomas.Core/Defines.fsi | 13 - src/Fantomas.Core/Fantomas.Core.fsproj | 13 - src/Fantomas.Core/ISourceTextExtensions.fsi | 7 - .../MultipleDefineCombinations.fsi | 6 - src/Fantomas.Core/RangeHelpers.fsi | 15 - src/Fantomas.Core/Selection.fsi | 6 - src/Fantomas.Core/Trivia.fsi | 12 - src/Fantomas.Core/Utils.fsi | 33 -- src/Fantomas.Core/Validation.fsi | 7 - 14 files changed, 509 deletions(-) delete mode 100644 src/Fantomas.Core/ASTTransformer.fsi delete mode 100644 src/Fantomas.Core/CodeFormatter.fsi delete mode 100644 src/Fantomas.Core/CodeFormatterImpl.fsi delete mode 100644 src/Fantomas.Core/CodePrinter.fsi delete mode 100644 src/Fantomas.Core/Context.fsi delete mode 100644 src/Fantomas.Core/Defines.fsi delete mode 100644 src/Fantomas.Core/ISourceTextExtensions.fsi delete mode 100644 src/Fantomas.Core/MultipleDefineCombinations.fsi delete mode 100644 src/Fantomas.Core/RangeHelpers.fsi delete mode 100644 src/Fantomas.Core/Selection.fsi delete mode 100644 src/Fantomas.Core/Trivia.fsi delete mode 100644 src/Fantomas.Core/Utils.fsi delete mode 100644 src/Fantomas.Core/Validation.fsi diff --git a/src/Fantomas.Core/ASTTransformer.fsi b/src/Fantomas.Core/ASTTransformer.fsi deleted file mode 100644 index 1b0a8fe6db..0000000000 --- a/src/Fantomas.Core/ASTTransformer.fsi +++ /dev/null @@ -1,7 +0,0 @@ -module internal Fantomas.Core.ASTTransformer - -open Fantomas.FCS.Text -open Fantomas.FCS.Syntax -open Fantomas.Core.SyntaxOak - -val mkOak: sourceText: ISourceText option -> ast: ParsedInput -> Oak diff --git a/src/Fantomas.Core/CodeFormatter.fsi b/src/Fantomas.Core/CodeFormatter.fsi deleted file mode 100644 index 85fb76c538..0000000000 --- a/src/Fantomas.Core/CodeFormatter.fsi +++ /dev/null @@ -1,80 +0,0 @@ -namespace Fantomas.Core - -open Fantomas.FCS.Text -open Fantomas.FCS.Syntax -open Fantomas.Core.SyntaxOak - -[] -type CodeFormatter = - /// Parse a source string using given config - static member ParseAsync: isSignature: bool * source: string -> Async<(ParsedInput * string list) array> - - /// Format an abstract syntax tree - static member FormatASTAsync: ast: ParsedInput -> Async - - /// Format an abstract syntax tree using a given config - static member FormatASTAsync: ast: ParsedInput * config: FormatConfig -> Async - - /// Format an abstract syntax tree with the original source for trivia processing - static member FormatASTAsync: ast: ParsedInput * source: string -> Async - - /// - /// Format a source string using an optional config. - /// - /// Determines whether the F# parser will process the source as signature file. - /// F# source code - static member FormatDocumentAsync: isSignature: bool * source: string -> Async - - /// - /// Format a source string using an optional config. - /// - /// Determines whether the F# parser will process the source as signature file. - /// F# source code - /// Fantomas configuration - static member FormatDocumentAsync: isSignature: bool * source: string * config: FormatConfig -> Async - - /// - /// Format a source string using an optional config. - /// - /// Determines whether the F# parser will process the source as signature file. - /// F# source code - /// Fantomas configuration - /// The location of a cursor, zero-based. - static member FormatDocumentAsync: - isSignature: bool * source: string * config: FormatConfig * cursor: pos -> Async - - /// Format a part of a source string and return the (formatted) selected part only. - /// Beware that the range argument is inclusive. The closest expression inside the selection will be formatted if possible. - static member FormatSelectionAsync: isSignature: bool * source: string * selection: range -> Async - - /// Format a part of source string using given config, and return the (formatted) selected part only. - /// Beware that the range argument is inclusive. The closest expression inside the selection will be formatted if possible. - static member FormatSelectionAsync: - isSignature: bool * source: string * selection: range * config: FormatConfig -> Async - - /// Check whether an input string is invalid in F# by attempting to parse the code. - static member IsValidFSharpCodeAsync: isSignature: bool * source: string -> Async - - /// Returns the version of Fantomas found in the AssemblyInfo - static member GetVersion: unit -> string - - /// Make a range from (startLine, startCol) to (endLine, endCol) to select some text - static member MakeRange: fileName: string * startLine: int * startCol: int * endLine: int * endCol: int -> range - - /// Make a pos from line and column - static member MakePosition: line: int * column: int -> pos - - /// Parse a source string to SyntaxOak - static member ParseOakAsync: isSignature: bool * source: string -> Async<(Oak * string list) array> - - /// Transform a ParsedInput to an Oak - static member TransformAST: ast: ParsedInput -> Oak - - /// Transform a ParsedInput to an Oak - static member TransformAST: ast: ParsedInput * source: string -> Oak - - /// Format SyntaxOak to string - static member FormatOakAsync: oak: Oak -> Async - - /// Format SyntaxOak to string using given config - static member FormatOakAsync: oak: Oak * config: FormatConfig -> Async diff --git a/src/Fantomas.Core/CodeFormatterImpl.fsi b/src/Fantomas.Core/CodeFormatterImpl.fsi deleted file mode 100644 index 8035aeb7a2..0000000000 --- a/src/Fantomas.Core/CodeFormatterImpl.fsi +++ /dev/null @@ -1,15 +0,0 @@ -[] -module internal Fantomas.Core.CodeFormatterImpl - -open Fantomas.FCS.Syntax -open Fantomas.FCS.Text - -val getSourceText: source: string -> ISourceText - -val formatAST: - ast: ParsedInput -> sourceText: ISourceText option -> config: FormatConfig -> cursor: pos option -> FormatResult - -val parse: isSignature: bool -> source: ISourceText -> Async<(ParsedInput * DefineCombination) array> - -val formatDocument: - config: FormatConfig -> isSignature: bool -> source: ISourceText -> cursor: pos option -> Async diff --git a/src/Fantomas.Core/CodePrinter.fsi b/src/Fantomas.Core/CodePrinter.fsi deleted file mode 100644 index e7aba573ec..0000000000 --- a/src/Fantomas.Core/CodePrinter.fsi +++ /dev/null @@ -1,6 +0,0 @@ -module internal Fantomas.Core.CodePrinter - -open Fantomas.Core.Context -open Fantomas.Core.SyntaxOak - -val genFile: oak: Oak -> (Context -> Context) diff --git a/src/Fantomas.Core/Context.fsi b/src/Fantomas.Core/Context.fsi deleted file mode 100644 index 9118d47469..0000000000 --- a/src/Fantomas.Core/Context.fsi +++ /dev/null @@ -1,289 +0,0 @@ -module internal Fantomas.Core.Context - -open Fantomas.FCS.Text -open Fantomas.Core.SyntaxOak - -type WriterEvent = - | Write of string - | WriteLine - | WriteLineInsideStringConst - | WriteBeforeNewline of string - | WriteLineBecauseOfTrivia - | WriteLineInsideTrivia - | IndentBy of int - | UnIndentBy of int - | SetIndent of int - | RestoreIndent of int - | SetAtColumn of int - | RestoreAtColumn of int - -type ShortExpressionInfo = - { MaxWidth: int - StartColumn: int - ConfirmedMultiline: bool } - - member IsTooLong: maxPageWidth: int -> currentColumn: int -> bool - -type Size = - | CharacterWidth of maxWidth: Num - | NumberOfItems of items: Num * maxItems: Num - -type WriteModelMode = - | Standard - | Dummy - | ShortExpression of ShortExpressionInfo list - -type WriterModel = - { - /// lines of resulting text, in reverse order (to allow more efficient adding line to end) - Lines: string list - /// current indentation - Indent: int - /// helper indentation information, if AtColumn > Indent after NewLine, Indent will be set to AtColumn - AtColumn: int - /// text to be written before next newline - WriteBeforeNewline: string - /// dummy = "fake" writer used in `autoNln`, `autoNlnByFuture` - Mode: WriteModelMode - /// current length of last line of output - Column: int - } - - member IsDummy: bool - -[] -type Context = - { Config: FormatConfig - WriterModel: WriterModel - WriterEvents: Queue - FormattedCursor: pos option } - - /// Initialize with a string writer and use space as delimiter - static member Default: Context - static member Create: config: FormatConfig -> Context - member WithDummy: writerCommands: Queue * ?keepPageWidth: bool -> Context - member WithShortExpression: maxWidth: int * ?startColumn: int -> Context - member Column: int - -/// This adds a WriterEvent to the Context. -/// One event could potentially be split up into multiple events. -/// The event is also being processed in the WriterModel of the Context. -val writerEvent: e: WriterEvent -> ctx: Context -> Context -val hasWriteBeforeNewlineContent: ctx: Context -> bool -val dump: isSelection: bool -> ctx: Context -> FormatResult -val dumpAndContinue: ctx: Context -> Context -val lastWriteEventIsNewline: ctx: Context -> bool - -/// Indent one more level based on configuration -val indent: ctx: Context -> Context -/// Unindent one more level based on configuration -val unindent: ctx: Context -> Context -// /// Apply function f at an absolute indent level (use with care) -val atIndentLevel: alsoSetIndent: bool -> level: int -> f: (Context -> Context) -> ctx: Context -> Context -// /// Set minimal indentation (`atColumn`) at current column position - next newline will be indented on `max indent atColumn` -// /// Example: -// /// { X = // indent=0, atColumn=2 -// /// "some long string" // indent=4, atColumn=2 -// /// Y = 1 // indent=0, atColumn=2 -// /// } -/// `atCurrentColumn` was called on `X`, then `indent` was called, but "some long string" have indent only 4, because it is bigger than `atColumn` (2). -val atCurrentColumn: f: (Context -> Context) -> ctx: Context -> Context - -/// Write everything at current column indentation, set `indent` and `atColumn` on current column position -/// /// Example (same as above): -/// { X = // indent=2, atColumn=2 -/// "some long string" // indent=6, atColumn=2 -/// Y = 1 // indent=2, atColumn=2 -/// } -/// `atCurrentColumn` was called on `X`, then `indent` was called, "some long string" have indent 6, because it is indented from `atCurrentColumn` pos (2). -val atCurrentColumnIndent: f: (Context -> Context) -> ctx: Context -> Context - -/// Function composition operator -val (+>): ctx: (Context -> Context) -> f: (Context -> Context) -> x: Context -> Context -val (!-): str: string -> (Context -> Context) - -/// Similar to col, and supply index as well -val coli: f': (Context -> Context) -> c: 'T seq -> f: (int -> 'T -> Context -> Context) -> ctx: Context -> Context - -/// Process collection - keeps context through the whole processing -/// calls f for every element in sequence and f' between every two elements -/// as a separator. This is a variant that works on typed collections. -val col: f': (Context -> Context) -> c: 'T seq -> f: ('T -> Context -> Context) -> ctx: Context -> Context -val colEx: f': ('T -> Context -> Context) -> c: 'T seq -> f: ('T -> Context -> Context) -> ctx: Context -> Context - -/// Similar to col, apply one more function f2 at the end if the input sequence is not empty -val colPost: - f2: (Context -> Context) -> - f1: (Context -> Context) -> - c: 'T seq -> - f: ('T -> Context -> Context) -> - ctx: Context -> - Context - -/// Similar to col, apply one more function f2 at the beginning if the input sequence is not empty -val colPre: - f2: (Context -> Context) -> - f1: (Context -> Context) -> - c: 'T seq -> - f: ('T -> Context -> Context) -> - ctx: Context -> - Context - -/// If there is a value, apply f and f' accordingly, otherwise do nothing -val opt: f': (Context -> Context) -> o: 'a option -> f: ('a -> Context -> Context) -> ctx: Context -> Context -/// similar to opt, only takes a single function f to apply when there is a value -val optSingle: f: ('a -> 'b -> 'b) -> o: 'a option -> ctx: 'b -> 'b - -/// Similar to opt, but apply f2 at the beginning if there is a value -val optPre: - f2: (Context -> Context) -> - f1: (Context -> Context) -> - o: 'a option -> - f: ('a -> Context -> Context) -> - ctx: Context -> - Context - -val getListOrArrayExprSize: ctx: Context -> maxWidth: Num -> xs: 'a list -> Size -val getRecordSize: ctx: Context -> fields: 'a list -> Size -/// b is true, apply f1 otherwise apply f2 -val ifElse: b: bool -> f1: (Context -> Context) -> f2: (Context -> Context) -> ctx: Context -> Context - -val ifElseCtx: - cond: (Context -> bool) -> f1: (Context -> Context) -> f2: (Context -> Context) -> ctx: Context -> Context - -// /// apply f only when cond is true -val onlyIf: cond: bool -> f: ('a -> 'a) -> ctx: 'a -> 'a -val onlyIfCtx: cond: ('a -> bool) -> f: ('a -> 'a) -> ctx: 'a -> 'a -val onlyIfNot: cond: bool -> f: ('a -> 'a) -> ctx: 'a -> 'a -val whenShortIndent: f: (Context -> Context) -> ctx: Context -> Context -/// Repeat application of a function n times -val rep: n: int -> f: (Context -> Context) -> ctx: Context -> Context -val sepNone: ('a -> 'a) -val sepDot: (Context -> Context) -val sepSpace: ctx: Context -> Context -val addFixedSpaces: targetColumn: int -> ctx: Context -> Context -val sepNln: (Context -> Context) -val sepNlnForTrivia: (Context -> Context) -val sepNlnUnlessLastEventIsNewline: ctx: Context -> Context -val sepStar: (Context -> Context) -val sepEq: (Context -> Context) -val sepEqFixed: (Context -> Context) -val sepArrow: (Context -> Context) -val sepArrowRev: (Context -> Context) -val sepBar: (Context -> Context) -val addSpaceIfSpaceAroundDelimiter: ctx: Context -> Context -val addSpaceIfSpaceAfterComma: ctx: Context -> Context -/// opening token of list -val sepOpenLFixed: (Context -> Context) -/// closing token of list -val sepCloseLFixed: (Context -> Context) -/// opening token of anon record -val sepOpenAnonRecdFixed: (Context -> Context) -/// opening token of tuple -val sepOpenT: (Context -> Context) -/// closing token of tuple -val sepCloseT: (Context -> Context) -val wordAnd: (Context -> Context) -val wordAndFixed: (Context -> Context) -val wordOf: (Context -> Context) -val indentSepNlnUnindent: f: (Context -> Context) -> (Context -> Context) - -val isShortExpression: - maxWidth: int -> - shortExpression: (Context -> Context) -> - fallbackExpression: (Context -> Context) -> - ctx: Context -> - Context - -val expressionFitsOnRestOfLine: - expression: (Context -> Context) -> fallbackExpression: (Context -> Context) -> ctx: Context -> Context - -val isSmallExpression: - size: Size -> - smallExpression: (Context -> Context) -> - fallbackExpression: (Context -> Context) -> - ctx: Context -> - Context - -/// provide the line and column before and after the leadingExpression to to the continuation expression -val leadingExpressionResult: - leadingExpression: (Context -> Context) -> - continuationExpression: ((int * int) * (int * int) -> Context -> 'a) -> - ctx: Context -> - 'a - -/// A leading expression is not consider multiline if it has a comment before it. -/// For example -/// let a = 7 -/// // foo -/// let b = 8 -/// let c = 9 -/// The second binding b is not consider multiline. -val leadingExpressionIsMultiline: - leadingExpression: (Context -> Context) -> continuationExpression: (bool -> Context -> 'a) -> ctx: Context -> 'a - -/// try and write the expression on the remainder of the current line -/// add an indent and newline if the expression is longer -val autoIndentAndNlnIfExpressionExceedsPageWidth: expr: (Context -> Context) -> ctx: Context -> Context -val sepSpaceOrIndentAndNlnIfExpressionExceedsPageWidth: expr: (Context -> Context) -> ctx: Context -> Context -val sepSpaceOrDoubleIndentAndNlnIfExpressionExceedsPageWidth: expr: (Context -> Context) -> ctx: Context -> Context - -val sepSpaceOrIndentAndNlnIfExpressionExceedsPageWidthUnlessStroustrup: - f: (Expr -> Context -> Context) -> expr: Expr -> ctx: Context -> Context - -val sepSpaceOrIndentAndNlnIfTypeExceedsPageWidthUnlessStroustrup: - f: (Type -> Context -> Context) -> t: Type -> ctx: Context -> Context - -val isStroustrupStyleExpr: config: FormatConfig -> e: Expr -> bool - -val autoParenthesisIfExpressionExceedsPageWidth: expr: (Context -> Context) -> ctx: Context -> Context -val futureNlnCheck: f: (Context -> Context) -> ctx: Context -> bool -/// similar to futureNlnCheck but validates whether the expression is going over the max page width -/// This functions is does not use any caching -val exceedsWidth: maxWidth: int -> f: (Context -> Context) -> ctx: Context -> bool - -/// Similar to col, skip auto newline for index 0 -val colAutoNlnSkip0: f': (Context -> Context) -> c: 'a seq -> f: ('a -> Context -> Context) -> (Context -> Context) -val sepSpaceBeforeClassConstructor: ctx: Context -> Context -val sepColon: ctx: Context -> Context -val sepColonFixed: (Context -> Context) -val sepColonWithSpacesFixed: (Context -> Context) -val sepComma: ctx: Context -> Context -val sepSemi: ctx: Context -> Context -val ifAlignOrStroustrupBrackets: f: (Context -> Context) -> g: (Context -> Context) -> (Context -> Context) -val sepNlnWhenWriteBeforeNewlineNotEmptyOr: fallback: (Context -> Context) -> ctx: Context -> Context -val sepNlnWhenWriteBeforeNewlineNotEmpty: (Context -> Context) -val sepSpaceUnlessWriteBeforeNewlineNotEmpty: ctx: Context -> Context -val autoIndentAndNlnWhenWriteBeforeNewlineNotEmpty: f: (Context -> Context) -> ctx: Context -> Context -val addParenIfAutoNln: expr: Expr -> f: (Expr -> Context -> Context) -> (Context -> Context) - -val indentSepNlnUnindentUnlessStroustrup: f: (Expr -> Context -> Context) -> e: Expr -> ctx: Context -> Context - -val autoIndentAndNlnTypeUnlessStroustrup: f: (Type -> Context -> Context) -> t: Type -> ctx: Context -> Context - -val autoIndentAndNlnIfExpressionExceedsPageWidthUnlessStroustrup: - f: (Expr -> Context -> Context) -> e: Expr -> ctx: Context -> Context - -[] -type ColMultilineItem = ColMultilineItem of expr: (Context -> Context) * sepNln: (Context -> Context) - -/// This helper function takes a list of expressions and ranges. -/// If the expression is multiline it will add a newline before and after the expression. -/// Unless it is the first expression in the list, that will never have a leading new line. -/// F.ex. -/// let a = AAAA -/// let b = -/// BBBB -/// BBBB -/// let c = CCCC -/// -/// will be formatted as: -/// let a = AAAA -/// -/// let b = -/// BBBB -/// BBBBB -/// -/// let c = CCCC -val colWithNlnWhenItemIsMultiline: items: ColMultilineItem list -> ctx: Context -> Context -val colWithNlnWhenItemIsMultilineUsingConfig: items: ColMultilineItem list -> ctx: Context -> Context diff --git a/src/Fantomas.Core/Defines.fsi b/src/Fantomas.Core/Defines.fsi deleted file mode 100644 index 5f9709b552..0000000000 --- a/src/Fantomas.Core/Defines.fsi +++ /dev/null @@ -1,13 +0,0 @@ -namespace Fantomas.Core - -type internal DefineCombination = - | DefineCombination of defines: string list - - member Value: string list - - static member Empty: DefineCombination - -module internal Defines = - open Fantomas.FCS.SyntaxTrivia - - val getDefineCombination: hashDirectives: ConditionalDirectiveTrivia list -> DefineCombination list diff --git a/src/Fantomas.Core/Fantomas.Core.fsproj b/src/Fantomas.Core/Fantomas.Core.fsproj index 9772cd28c2..81eadc99e1 100644 --- a/src/Fantomas.Core/Fantomas.Core.fsproj +++ b/src/Fantomas.Core/Fantomas.Core.fsproj @@ -8,36 +8,23 @@ - - - - - - - - - - - - - diff --git a/src/Fantomas.Core/ISourceTextExtensions.fsi b/src/Fantomas.Core/ISourceTextExtensions.fsi deleted file mode 100644 index 22dc4d2976..0000000000 --- a/src/Fantomas.Core/ISourceTextExtensions.fsi +++ /dev/null @@ -1,7 +0,0 @@ -module Fantomas.Core.ISourceTextExtensions - -open Fantomas.FCS.Text - -type ISourceText with - - member GetContentAt: range: range -> string diff --git a/src/Fantomas.Core/MultipleDefineCombinations.fsi b/src/Fantomas.Core/MultipleDefineCombinations.fsi deleted file mode 100644 index d787aa7126..0000000000 --- a/src/Fantomas.Core/MultipleDefineCombinations.fsi +++ /dev/null @@ -1,6 +0,0 @@ -module internal Fantomas.Core.MultipleDefineCombinations - -/// When conditional defines were found in the source code, we format the code using all possible combinations. -/// Depending on the values of each combination, code will either be produced or not. -/// In this function, we try to piece back all the active code fragments. -val mergeMultipleFormatResults: config: FormatConfig -> results: (DefineCombination * FormatResult) list -> FormatResult diff --git a/src/Fantomas.Core/RangeHelpers.fsi b/src/Fantomas.Core/RangeHelpers.fsi deleted file mode 100644 index 36033b7534..0000000000 --- a/src/Fantomas.Core/RangeHelpers.fsi +++ /dev/null @@ -1,15 +0,0 @@ -namespace Fantomas.Core - -open Fantomas.FCS.Text - -[] -module RangeHelpers = - /// Checks if Range B is fully contained by Range A - val rangeContainsRange: a: Range -> b: Range -> bool - val rangeEq: (range -> range -> bool) - val isAdjacentTo: r1: Range -> r2: Range -> bool - -module RangePatterns = - val (|StartEndRange|): size: int -> range: range -> range * range * range - val (|StartRange|): size: int -> range: range -> range * range - val (|EndRange|): size: int -> range: range -> range * range diff --git a/src/Fantomas.Core/Selection.fsi b/src/Fantomas.Core/Selection.fsi deleted file mode 100644 index 834ab23294..0000000000 --- a/src/Fantomas.Core/Selection.fsi +++ /dev/null @@ -1,6 +0,0 @@ -module internal Fantomas.Core.Selection - -open Fantomas.FCS.Text - -val formatSelection: - config: FormatConfig -> isSignature: bool -> selection: range -> sourceText: ISourceText -> Async diff --git a/src/Fantomas.Core/Trivia.fsi b/src/Fantomas.Core/Trivia.fsi deleted file mode 100644 index ce6a0d7276..0000000000 --- a/src/Fantomas.Core/Trivia.fsi +++ /dev/null @@ -1,12 +0,0 @@ -module internal Fantomas.Core.Trivia - -open Fantomas.FCS.Syntax -open Fantomas.FCS.Text -open Fantomas.Core.SyntaxOak - -val findNodeWhereRangeFitsIn: root: Node -> range: range -> Node option -val enrichTree: config: FormatConfig -> sourceText: ISourceText -> ast: ParsedInput -> tree: Oak -> Oak - -/// Try and insert a cursor position as Trivia inside the Oak -/// The cursor could either be inside a Node or floating around one. -val insertCursor: tree: Oak -> cursor: pos -> Oak diff --git a/src/Fantomas.Core/Utils.fsi b/src/Fantomas.Core/Utils.fsi deleted file mode 100644 index 1bf4d55ff3..0000000000 --- a/src/Fantomas.Core/Utils.fsi +++ /dev/null @@ -1,33 +0,0 @@ -namespace Fantomas.Core - -[] -module String = - val startsWithOrdinal: prefix: string -> str: string -> bool - val endsWithOrdinal: postfix: string -> str: string -> bool - val empty: string - val isNotNullOrEmpty: (string -> bool) - val isNotNullOrWhitespace: (string -> bool) - -module List = - val chooseState: f: ('a -> 'b -> 'a * 'c option) -> state: 'a -> l: 'b list -> 'c list - val isNotEmpty: l: 'a list -> bool - val moreThanOne: ('a list -> bool) - val partitionWhile: f: (int -> 'a -> bool) -> xs: 'a list -> 'a list * 'a list - val mapWithLast: f: ('a -> 'b) -> g: ('a -> 'b) -> xs: 'a list -> 'b list - /// Removes the last element of a list - val cutOffLast: 'a list -> 'a list - - /// Similar to a List.fold but pass in another fold function for when the last item is reached. - val foldWithLast: - f: ('state -> 'item -> 'state) -> - g: ('state -> 'item -> 'state) -> - initialState: 'state -> - items: 'item list -> - 'state - -module Async = - val map: f: ('a -> 'b) -> computation: Async<'a> -> Async<'b> - -[] -module Continuation = - val sequence<'a, 'ret> : recursions: (('a -> 'ret) -> 'ret) list -> finalContinuation: ('a list -> 'ret) -> 'ret diff --git a/src/Fantomas.Core/Validation.fsi b/src/Fantomas.Core/Validation.fsi deleted file mode 100644 index 4b8d1c84ef..0000000000 --- a/src/Fantomas.Core/Validation.fsi +++ /dev/null @@ -1,7 +0,0 @@ -module internal Fantomas.Core.Validation - -open Fantomas.FCS.Parse - -val noWarningOrErrorDiagnostics: diagnostics: FSharpParserDiagnostic list -> bool -/// Check whether an input string is invalid in F# by looking for errors and warnings in the diagnostics. -val isValidFSharpCode: isSignature: bool -> source: string -> Async From 92b4eef079eac0901d9a2f07d9bb071bab6be7b1 Mon Sep 17 00:00:00 2001 From: nojaf Date: Sun, 24 Dec 2023 15:46:34 +0100 Subject: [PATCH 2/4] Add types using fsautocomplete. --- Directory.Build.props | 2 +- src/Fantomas.Core/ASTTransformer.fs | 202 +-- src/Fantomas.Core/AssemblyInfo.fs | 2 +- src/Fantomas.Core/CodeFormatter.fs | 42 +- src/Fantomas.Core/CodePrinter.fs | 213 +-- src/Fantomas.Core/Defines.fs | 12 +- src/Fantomas.Core/FormatConfig.fs | 20 +- .../MultipleDefineCombinations.fs | 29 +- src/Fantomas.Core/RangeHelpers.fs | 10 +- src/Fantomas.Core/Selection.fs | 12 +- src/Fantomas.Core/SyntaxOak.fs | 1518 +++++++++-------- src/Fantomas.Core/Utils.fs | 26 +- src/Fantomas.Core/Validation.fs | 4 +- src/Fantomas.Core/Version.fs | 2 +- 14 files changed, 1080 insertions(+), 1014 deletions(-) diff --git a/Directory.Build.props b/Directory.Build.props index 1b4ea596aa..843596f2a3 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -31,7 +31,7 @@ Some common use cases include: FS1182 Unused variables FS1178 does not support structural equality --> - 1182;3390;1178;$(WarnOn) + 1182;3390;$(WarnOn) true true NU1603 diff --git a/src/Fantomas.Core/ASTTransformer.fs b/src/Fantomas.Core/ASTTransformer.fs index 8883611b85..b78d317bb8 100644 --- a/src/Fantomas.Core/ASTTransformer.fs +++ b/src/Fantomas.Core/ASTTransformer.fs @@ -13,7 +13,7 @@ open Fantomas.Core.SyntaxOak open Microsoft.FSharp.Core [] -type CreationAide = +type private CreationAide = { SourceText: ISourceText option } member x.TextFromSource fallback range = @@ -21,9 +21,9 @@ type CreationAide = | None -> fallback () | Some sourceText -> sourceText.GetContentAt range -let stn text range = SingleTextNode(text, range) +let private stn text range = SingleTextNode(text, range) -let mkIdent (ident: Ident) = +let private mkIdent (ident: Ident) = let width = ident.idRange.EndColumn - ident.idRange.StartColumn let text = @@ -35,14 +35,14 @@ let mkIdent (ident: Ident) = stn text ident.idRange -let mkSynIdent (SynIdent(ident, trivia)) = +let private mkSynIdent (SynIdent(ident, trivia)) = match trivia with | None -> mkIdent ident | Some(IdentTrivia.OriginalNotation text) -> stn text ident.idRange | Some(IdentTrivia.OriginalNotationWithParen(_, text, _)) -> stn $"(%s{text})" ident.idRange | Some(IdentTrivia.HasParenthesis _) -> stn $"(%s{ident.idText})" ident.idRange -let mkSynLongIdent (sli: SynLongIdent) = +let private mkSynLongIdent (sli: SynLongIdent) = match sli.IdentsWithTrivia with | [] -> IdentListNode.Empty | [ single ] -> IdentListNode([ IdentifierOrDot.Ident(mkSynIdent single) ], sli.Range) @@ -58,7 +58,7 @@ let mkSynLongIdent (sli: SynLongIdent) = IdentListNode(IdentifierOrDot.Ident(mkSynIdent head) :: rest, sli.Range) -let mkLongIdent (longIdent: LongIdent) : IdentListNode = +let private mkLongIdent (longIdent: LongIdent) : IdentListNode = match longIdent with | [] -> IdentListNode.Empty | [ single ] -> IdentListNode([ IdentifierOrDot.Ident(mkIdent single) ], single.idRange) @@ -72,20 +72,20 @@ let mkLongIdent (longIdent: LongIdent) : IdentListNode = IdentListNode(IdentifierOrDot.Ident(mkIdent head) :: rest, range) -let mkSynAccess (vis: SynAccess option) = +let private mkSynAccess (vis: SynAccess option) = match vis with | None -> None | Some(SynAccess.Internal range) -> Some(stn "internal" range) | Some(SynAccess.Private range) -> Some(stn "private" range) | Some(SynAccess.Public range) -> Some(stn "public" range) -let parseExpressionInSynBinding returnInfo expr = +let private parseExpressionInSynBinding returnInfo expr = match returnInfo, expr with | Some(SynBindingReturnInfo(typeName = t1)), SynExpr.Typed(e, t2, _) when RangeHelpers.rangeEq t1.Range t2.Range -> e | _ -> expr -let mkConstString (creationAide: CreationAide) (stringKind: SynStringKind) (value: string) (range: range) = +let private mkConstString (creationAide: CreationAide) (stringKind: SynStringKind) (value: string) (range: range) = let escaped = Regex.Replace(value, "\"{1}", "\\\"") let fallback () = @@ -96,7 +96,7 @@ let mkConstString (creationAide: CreationAide) (stringKind: SynStringKind) (valu stn (creationAide.TextFromSource fallback range) range -let mkParsedHashDirective (creationAide: CreationAide) (ParsedHashDirective(ident, args, range)) = +let private mkParsedHashDirective (creationAide: CreationAide) (ParsedHashDirective(ident, args, range)) = let args = args |> List.map (function @@ -106,7 +106,7 @@ let mkParsedHashDirective (creationAide: CreationAide) (ParsedHashDirective(iden ParsedHashDirectiveNode(ident, args, range) -let mkConstant (creationAide: CreationAide) c r : Constant = +let private mkConstant (creationAide: CreationAide) c r : Constant = let orElse fallback = stn (creationAide.TextFromSource (fun () -> fallback) r) r |> Constant.FromText @@ -167,7 +167,7 @@ let mkConstant (creationAide: CreationAide) c r : Constant = |> Constant.Measure | SynConst.SourceIdentifier(c, _, r) -> stn c r |> Constant.FromText -let mkMeasure (creationAide: CreationAide) (measure: SynMeasure) : Measure = +let private mkMeasure (creationAide: CreationAide) (measure: SynMeasure) : Measure = match measure with | SynMeasure.Var(typar, _) -> mkSynTypar typar |> Measure.Single | SynMeasure.Anon m -> stn "_" m |> Measure.Single @@ -189,7 +189,7 @@ let mkMeasure (creationAide: CreationAide) (measure: SynMeasure) : Measure = |> Measure.Paren | SynMeasure.Seq(ms, m) -> MeasureSequenceNode(List.map (mkMeasure creationAide) ms, m) |> Measure.Seq -let mkAttribute (creationAide: CreationAide) (a: SynAttribute) = +let private mkAttribute (creationAide: CreationAide) (a: SynAttribute) = let expr = match a.ArgExpr with | UnitExpr _ -> None @@ -197,7 +197,7 @@ let mkAttribute (creationAide: CreationAide) (a: SynAttribute) = AttributeNode(mkSynLongIdent a.TypeName, expr, Option.map mkIdent a.Target, a.Range) -let mkAttributeList (creationAide: CreationAide) (al: SynAttributeList) : AttributeListNode = +let private mkAttributeList (creationAide: CreationAide) (al: SynAttributeList) : AttributeListNode = let attributes = List.map (mkAttribute creationAide) al.Attributes let opening, closing = @@ -206,7 +206,7 @@ let mkAttributeList (creationAide: CreationAide) (al: SynAttributeList) : Attrib AttributeListNode(opening, attributes, closing, al.Range) -let mkAttributes (creationAide: CreationAide) (al: SynAttributeList list) : MultipleAttributeListNode option = +let private mkAttributes (creationAide: CreationAide) (al: SynAttributeList list) : MultipleAttributeListNode option = match al with | [] -> None | _ -> @@ -214,7 +214,7 @@ let mkAttributes (creationAide: CreationAide) (al: SynAttributeList list) : Mult let range = attributeLists |> List.map (fun al -> al.Range) |> combineRanges Some(MultipleAttributeListNode(attributeLists, range)) -let (|Sequentials|_|) e = +let private (|Sequentials|_|) (e: SynExpr) : SynExpr list option = let rec visit (e: SynExpr) (finalContinuation: SynExpr list -> SynExpr list) : SynExpr list = match e with | SynExpr.Sequential(_, _, e1, e2, _) -> visit e2 (fun xs -> e1 :: xs |> finalContinuation) @@ -226,7 +226,7 @@ let (|Sequentials|_|) e = Some(e1 :: xs) | _ -> None -let mkOpenAndCloseForArrayOrList isArray range = +let private mkOpenAndCloseForArrayOrList isArray range = if isArray then let (StartEndRange 2 (mO, _, mC)) = range stn "[|" mO, stn "|]" mC @@ -234,7 +234,7 @@ let mkOpenAndCloseForArrayOrList isArray range = let (StartEndRange 1 (mO, _, mC)) = range stn "[" mO, stn "]" mC -let mkInheritConstructor (creationAide: CreationAide) (t: SynType) (e: SynExpr) (mInherit: range) (m: range) = +let private mkInheritConstructor (creationAide: CreationAide) (t: SynType) (e: SynExpr) (mInherit: range) (m: range) = let inheritNode = stn "inherit" mInherit let m = unionRanges mInherit m @@ -254,7 +254,7 @@ let mkInheritConstructor (creationAide: CreationAide) (t: SynType) (e: SynExpr) InheritConstructorOtherNode(inheritNode, mkType creationAide t, mkExpr creationAide e, m) |> InheritConstructor.Other -let mkTuple (creationAide: CreationAide) (exprs: SynExpr list) (commas: range list) (m: range) = +let private mkTuple (creationAide: CreationAide) (exprs: SynExpr list) (commas: range list) (m: range) = match exprs with | [] -> failwith "SynExpr.Tuple with no elements" | head :: tail -> @@ -268,7 +268,7 @@ let mkTuple (creationAide: CreationAide) (exprs: SynExpr list) (commas: range li /// Unfold a list of let bindings /// Recursive and use properties have to be determined at this point -let rec (|LetOrUses|_|) = +let rec private (|LetOrUses|_|): SynExpr -> ((SynBinding * range option) list * SynExpr) option = function | SynExpr.LetOrUse(_, _, xs, LetOrUses(ys, e), _, trivia) -> let xs' = List.mapWithLast (fun b -> b, None) (fun b -> b, trivia.InKeyword) xs @@ -278,7 +278,7 @@ let rec (|LetOrUses|_|) = Some(xs', e) | _ -> None -let rec collectComputationExpressionStatements +let rec private collectComputationExpressionStatements (creationAide: CreationAide) (e: SynExpr) (finalContinuation: ComputationExpressionStatement list -> ComputationExpressionStatement list) @@ -352,7 +352,7 @@ let rec private skipGeneratedLambdas expr = | SynExpr.Lambda(inLambdaSeq = true; body = bodyExpr) -> skipGeneratedLambdas bodyExpr | _ -> expr -and skipGeneratedMatch expr = +and private skipGeneratedMatch expr = match expr with | SynExpr.Match(_, _, [ SynMatchClause.SynMatchClause(resultExpr = innerExpr) as clause ], matchRange, _) when matchRange.Start = clause.Range.Start @@ -364,11 +364,11 @@ let inline private getLambdaBodyExpr expr = let skippedLambdas = skipGeneratedLambdas expr skipGeneratedMatch skippedLambdas -let mkLambda creationAide pats mArrow body (StartRange 3 (mFun, m)) : ExprLambdaNode = +let private mkLambda creationAide pats mArrow body (StartRange 3 (mFun, m)) : ExprLambdaNode = let body = getLambdaBodyExpr body ExprLambdaNode(stn "fun" mFun, List.map (mkPat creationAide) pats, stn "->" mArrow, mkExpr creationAide body, m) -let mkSynMatchClause creationAide (SynMatchClause(p, eo, e, range, _, trivia)) : MatchClauseNode = +let private mkSynMatchClause creationAide (SynMatchClause(p, eo, e, range, _, trivia)) : MatchClauseNode = let fullRange = match trivia.BarRange with | None -> range @@ -388,7 +388,7 @@ let mkSynMatchClause creationAide (SynMatchClause(p, eo, e, range, _, trivia)) : fullRange ) -let (|ColonColonInfixApp|_|) = +let (|ColonColonInfixApp|_|): SynExpr -> (SynExpr * SingleTextNode * SynExpr) option = function | SynExpr.App( isInfix = true @@ -397,7 +397,7 @@ let (|ColonColonInfixApp|_|) = argExpr = SynExpr.Tuple(exprs = [ e1; e2 ])) -> Some(e1, stn "::" operatorIdent.idRange, e2) | _ -> None -let (|InfixApp|_|) synExpr = +let (|InfixApp|_|) (synExpr: SynExpr) : (SynExpr * SingleTextNode * SynExpr) option = match synExpr with | ColonColonInfixApp(lhs, operator, rhs) -> Some(lhs, operator, rhs) | SynExpr.App( @@ -409,7 +409,7 @@ let (|InfixApp|_|) synExpr = argExpr = e2) -> Some(e1, stn operator operatorIdent.idRange, e2) | _ -> None -let (|IndexWithoutDot|_|) expr = +let (|IndexWithoutDot|_|) (expr: SynExpr) : (SynExpr * SynExpr) option = match expr with | SynExpr.App(ExprAtomicFlag.Atomic, false, identifierExpr, SynExpr.ArrayOrListComputed(false, indexExpr, _), _) -> Some(identifierExpr, indexExpr) @@ -421,7 +421,7 @@ let (|IndexWithoutDot|_|) expr = Some(identifierExpr, indexExpr) | _ -> None -let (|MultipleConsInfixApps|_|) expr = +let (|MultipleConsInfixApps|_|) (expr: SynExpr) : (SynExpr * (SingleTextNode * SynExpr) list) option = let rec visit expr (headAndLastOperator: (SynExpr * SingleTextNode) option) (xs: Queue) = match expr with | ColonColonInfixApp(lhs, operator, rhs) -> @@ -443,9 +443,9 @@ let (|MultipleConsInfixApps|_|) expr = if xs.Count < 2 then None else Some(head, Seq.toList xs) | _ -> None -let rightOperators = set [| "@"; "**"; "^"; ":=" |] +let private rightOperators = set [| "@"; "**"; "^"; ":=" |] -let (|SameInfixApps|_|) expr = +let private (|SameInfixApps|_|) (expr: SynExpr) : (SynExpr * (SingleTextNode * SynExpr) list) option = let rec visitLeft sameOperator expr continuation = match expr with | InfixApp(lhs, operator, rhs) when operator.Text = sameOperator -> @@ -502,9 +502,9 @@ let (|SameInfixApps|_|) expr = if xs.Count < 2 then None else Some(head, Seq.toList xs) | _ -> None -let newLineInfixOps = set [ "|>"; "||>"; "|||>"; ">>"; ">>=" ] +let private newLineInfixOps = set [ "|>"; "||>"; "|||>"; ">>"; ">>=" ] -let (|NewlineInfixApps|_|) expr = +let private (|NewlineInfixApps|_|) (expr: SynExpr) : (SynExpr * (SingleTextNode * SynExpr) list) option = let rec visit expr continuation = match expr with | InfixApp(lhs, operator, rhs) when newLineInfixOps.Contains operator.Text -> @@ -519,7 +519,10 @@ let (|NewlineInfixApps|_|) expr = if xs.Count < 2 then None else Some(head, Seq.toList xs) | _ -> None -let rec (|ElIf|_|) = +let rec private (|ElIf|_|) + : SynExpr + -> ((Choice * SynExpr * SingleTextNode * SynExpr) list * + (SingleTextNode * SynExpr) option) option = function | SynExpr.IfThenElse(e1, e2, @@ -559,7 +562,7 @@ let rec (|ElIf|_|) = Some([ (ifNode, e1, stn "then" trivia.ThenKeyword, e2) ], elseInfo) | _ -> None -let (|ConstNumberExpr|_|) = +let private (|ConstNumberExpr|_|): SynExpr -> (string * range) option = function | SynExpr.Const(SynConst.Double v, m) -> Some(string v, m) | SynExpr.Const(SynConst.Decimal v, m) -> Some(string v, m) @@ -569,7 +572,7 @@ let (|ConstNumberExpr|_|) = | SynExpr.Const(SynConst.Int64 v, m) -> Some(string v, m) | _ -> None -let (|App|_|) e = +let private (|App|_|) (e: SynExpr) : (SynExpr * SynExpr list) option = let rec visit expr continuation = match expr with | SynExpr.App(funcExpr = funcExpr; argExpr = argExpr) -> @@ -581,19 +584,19 @@ let (|App|_|) e = let head, xs = visit e id if xs.Count = 0 then None else Some(head, Seq.toList xs) -let (|ParenLambda|_|) e = +let private (|ParenLambda|_|) (e: SynExpr) : (range * SynPat list * range * SynExpr * range * range) option = match e with | ParenExpr(lpr, SynExpr.Lambda(_, _, _, _, Some(pats, body), mLambda, { ArrowRange = Some mArrow }), rpr, _) -> Some(lpr, pats, mArrow, body, mLambda, rpr) | _ -> None -let (|ParenMatchLambda|_|) e = +let private (|ParenMatchLambda|_|) (e: SynExpr) : (range * range * SynMatchClause list * range * range) option = match e with | ParenExpr(lpr, SynExpr.MatchLambda(_, mFunction, clauses, _, mMatchLambda), rpr, _) -> Some(lpr, mFunction, clauses, mMatchLambda, rpr) | _ -> None -let mkMatchLambda creationAide mFunction cs m = +let private mkMatchLambda creationAide mFunction cs m = ExprMatchLambdaNode(stn "function" mFunction, List.map (mkSynMatchClause creationAide) cs, m) [] @@ -608,7 +611,7 @@ type LinkExpr = | AppUnit of functionName: SynExpr * unit: range | IndexExpr of indexExpr: SynExpr -let mkLinksFromSynLongIdent (sli: SynLongIdent) : LinkExpr list = +let private mkLinksFromSynLongIdent (sli: SynLongIdent) : LinkExpr list = let idents = List.map (mkLongIdentExprFromSynIdent >> LinkExpr.Identifier) sli.IdentsWithTrivia @@ -624,20 +627,20 @@ let mkLinksFromSynLongIdent (sli: SynLongIdent) : LinkExpr list = | LinkExpr.AppUnit _ | LinkExpr.IndexExpr _ -> -1, -1) -let (|UnitExpr|_|) e = +let private (|UnitExpr|_|) (e: SynExpr) : range option = match e with | SynExpr.Const(constant = SynConst.Unit) -> Some e.Range | _ -> None -let (|ParenExpr|_|) e = +let private (|ParenExpr|_|) (e: SynExpr) : (range * SynExpr * range * range) option = match e with | SynExpr.Paren(e, lpr, Some rpr, pr) -> Some(lpr, e, rpr, pr) | _ -> None -let mkLongIdentExprFromSynIdent (SynIdent(ident, identTrivia)) = +let private mkLongIdentExprFromSynIdent (SynIdent(ident, identTrivia)) = SynExpr.LongIdent(false, SynLongIdent([ ident ], [], [ identTrivia ]), None, ident.idRange) -let mkLinksFromFunctionName (mkLinkFromExpr: SynExpr -> LinkExpr) (functionName: SynExpr) : LinkExpr list = +let private mkLinksFromFunctionName (mkLinkFromExpr: SynExpr -> LinkExpr) (functionName: SynExpr) : LinkExpr list = match functionName with | SynExpr.TypeApp(SynExpr.LongIdent(longDotId = sli), lessRange, @@ -682,7 +685,7 @@ let mkLinksFromFunctionName (mkLinkFromExpr: SynExpr -> LinkExpr) (functionName: yield (mkLongIdentExprFromSynIdent lastSynIdent |> mkLinkFromExpr) ] | e -> [ mkLinkFromExpr e ] -let (|ChainExpr|_|) (e: SynExpr) : LinkExpr list option = +let private (|ChainExpr|_|) (e: SynExpr) : LinkExpr list option = let rec visit (e: SynExpr) (continuation: LinkExpr list -> LinkExpr list) = match e with | SynExpr.App( @@ -877,7 +880,7 @@ let (|ChainExpr|_|) (e: SynExpr) : LinkExpr list option = Some(visit e id) | _ -> None -let (|AppSingleParenArg|_|) = +let private (|AppSingleParenArg|_|): SynExpr -> (SynExpr * SynExpr) option = function | App(SynExpr.DotGet _, [ (SynExpr.Paren(expr = SynExpr.Tuple _)) ]) -> None | App(e, [ UnitExpr _ as px ]) -> Some(e, px) @@ -888,10 +891,10 @@ let (|AppSingleParenArg|_|) = | _ -> Some(e, px) | _ -> None -let mkParenExpr creationAide lpr e rpr m = +let private mkParenExpr creationAide lpr e rpr m = ExprParenNode(stn "(" lpr, mkExpr creationAide e, stn ")" rpr, m) -let mkExpr (creationAide: CreationAide) (e: SynExpr) : Expr = +let private mkExpr (creationAide: CreationAide) (e: SynExpr) : Expr = let exprRange = e.Range match e with @@ -1596,7 +1599,7 @@ let mkExpr (creationAide: CreationAide) (e: SynExpr) : Expr = |> Expr.DotLambda | _ -> failwithf "todo for %A" e -let mkExprQuote creationAide isRaw e range : ExprQuoteNode = +let private mkExprQuote creationAide isRaw e range : ExprQuoteNode = let startToken, endToken = let sText, length, eText = if isRaw then "<@@", 3, "@@>" else "<@", 2, "@>" @@ -1605,7 +1608,7 @@ let mkExprQuote creationAide isRaw e range : ExprQuoteNode = ExprQuoteNode(startToken, mkExpr creationAide e, endToken, range) -let (|ParenStarSynIdent|_|) = +let private (|ParenStarSynIdent|_|): IdentTrivia -> (range * string * range) option = function | IdentTrivia.OriginalNotationWithParen(lpr, originalNotation, rpr) -> if originalNotation.Length > 1 && String.startsWithOrdinal "*" originalNotation then @@ -1614,7 +1617,7 @@ let (|ParenStarSynIdent|_|) = None | _ -> None -let (|PatParameter|_|) (p: SynPat) = +let private (|PatParameter|_|) (p: SynPat) : (SynAttributeList list * SynPat * SynType option) option = match p with | SynPat.Typed(pat = pat; targetType = t) -> Some([], pat, Some t) | SynPat.Attrib(pat = SynPat.Typed(pat = pat; targetType = t); attributes = attributes) -> @@ -1622,9 +1625,9 @@ let (|PatParameter|_|) (p: SynPat) = | SynPat.Attrib(pat = pat; attributes = attributes) -> Some(attributes, pat, None) | _ -> None -let mkUnit (StartEndRange 1 (lpr, m, rpr)) = UnitNode(stn "(" lpr, stn ")" rpr, m) +let private mkUnit (StartEndRange 1 (lpr, m, rpr)) = UnitNode(stn "(" lpr, stn ")" rpr, m) -let mkTuplePat (creationAide: CreationAide) (pats: SynPat list) (commas: range list) (m: range) = +let private mkTuplePat (creationAide: CreationAide) (pats: SynPat list) (commas: range list) (m: range) = match pats with | [] -> failwith "SynPat.Tuple with no elements" | head :: tail -> @@ -1636,7 +1639,7 @@ let mkTuplePat (creationAide: CreationAide) (pats: SynPat list) (commas: range l PatTupleNode([ yield Choice1Of2(mkPat creationAide head); yield! rest ], m) -let mkPat (creationAide: CreationAide) (p: SynPat) = +let private mkPat (creationAide: CreationAide) (p: SynPat) = let patternRange = p.Range match p with @@ -1747,7 +1750,7 @@ let mkPat (creationAide: CreationAide) (p: SynPat) = mkExprQuote creationAide isRaw e patternRange |> Pattern.QuoteExpr | pat -> failwith $"unexpected pattern: %A{pat}" -let mkBindingReturnInfo creationAide (returnInfo: SynBindingReturnInfo option) = +let private mkBindingReturnInfo creationAide (returnInfo: SynBindingReturnInfo option) = Option.bind (fun (SynBindingReturnInfo(typeName = t; trivia = trivia)) -> trivia.ColonRange @@ -1756,13 +1759,13 @@ let mkBindingReturnInfo creationAide (returnInfo: SynBindingReturnInfo option) = BindingReturnInfoNode(stn ":" mColon, mkType creationAide t, m))) returnInfo -let (|OperatorWithStar|_|) (si: SynIdent) = +let private (|OperatorWithStar|_|) (si: SynIdent) : IdentifierOrDot option = match si with | SynIdent(ident, Some(ParenStarSynIdent(_, text, _))) -> Some(IdentifierOrDot.Ident(stn $"( %s{text} )" ident.idRange)) | _ -> None -let mkBinding +let private mkBinding (creationAide: CreationAide) (SynBinding(_, _, _, isMutable, attributes, xmlDoc, _, pat, returnInfo, expr, _, _, trivia)) = @@ -1839,7 +1842,7 @@ let mkBinding range ) -let mkExternBinding +let private mkExternBinding (creationAide: CreationAide) (SynBinding( accessibility = accessibility @@ -1953,7 +1956,7 @@ let mkExternBinding m ) -let mkXmlDoc (px: PreXmlDoc) = +let private mkXmlDoc (px: PreXmlDoc) = if px.IsEmpty then None else @@ -1961,7 +1964,7 @@ let mkXmlDoc (px: PreXmlDoc) = let lines = Array.map (sprintf "///%s") xmlDoc.UnprocessedLines Some(XmlDocNode(lines, xmlDoc.Range)) -let mkModuleDecl (creationAide: CreationAide) (decl: SynModuleDecl) = +let private mkModuleDecl (creationAide: CreationAide) (decl: SynModuleDecl) = let declRange = decl.Range match decl with @@ -2009,7 +2012,7 @@ let mkModuleDecl (creationAide: CreationAide) (decl: SynModuleDecl) = |> ModuleDecl.NestedModule | decl -> failwithf $"Failed to create ModuleDecl for %A{decl}" -let mkSynTyparDecl +let private mkSynTyparDecl (creationAide: CreationAide) (SynTyparDecl(attributes = attrs; typar = typar; intersectionConstraints = intersectionConstraints; trivia = trivia)) = @@ -2028,7 +2031,7 @@ let mkSynTyparDecl TyparDeclNode(mkAttributes creationAide attrs, mkSynTypar typar, intersectionConstraintNodes, m) -let mkSynTyparDecls (creationAide: CreationAide) (tds: SynTyparDecls) : TyparDecls = +let private mkSynTyparDecls (creationAide: CreationAide) (tds: SynTyparDecls) : TyparDecls = match tds with | SynTyparDecls.PostfixList(decls, constraints, StartEndRange 1 (mOpen, m, mClose)) -> let decls = List.map (mkSynTyparDecl creationAide) decls @@ -2043,12 +2046,12 @@ let mkSynTyparDecls (creationAide: CreationAide) (tds: SynTyparDecls) : TyparDec |> TyparDecls.PrefixList | SynTyparDecls.SinglePrefix(decl, _) -> mkSynTyparDecl creationAide decl |> TyparDecls.SinglePrefix -let mkSynValTyparDecls (creationAide: CreationAide) (vt: SynValTyparDecls option) : TyparDecls option = +let private mkSynValTyparDecls (creationAide: CreationAide) (vt: SynValTyparDecls option) : TyparDecls option = match vt with | None -> None | Some(SynValTyparDecls(tds, _)) -> Option.map (mkSynTyparDecls creationAide) tds -let mkSynRationalConst (creationAide: CreationAide) rc = +let private mkSynRationalConst (creationAide: CreationAide) rc = let rec visit rc = match rc with | SynRationalConst.Integer(i, range) -> @@ -2090,7 +2093,7 @@ let mkSynRationalConst (creationAide: CreationAide) rc = visit rc -let mkSynTypar (SynTypar(ident, req, _)) = +let private mkSynTypar (SynTypar(ident, req, _)) = let range = mkRange ident.idRange.FileName @@ -2109,7 +2112,7 @@ let mkSynTypar (SynTypar(ident, req, _)) = | TyparStaticReq.None -> stn $"'%s{identText}" range | TyparStaticReq.HeadType -> stn $"^%s{identText}" range -let mkSynTypeConstraint (creationAide: CreationAide) (tc: SynTypeConstraint) : TypeConstraint = +let private mkSynTypeConstraint (creationAide: CreationAide) (tc: SynTypeConstraint) : TypeConstraint = match tc with | SynTypeConstraint.WhereTyparIsValueType(tp, EndRange 6 (mKeyword, m)) -> TypeConstraintSingleNode(mkSynTypar tp, stn "struct" mKeyword, m) @@ -2147,19 +2150,19 @@ let mkSynTypeConstraint (creationAide: CreationAide) (tc: SynTypeConstraint) : T | SynTypeConstraint.WhereSelfConstrained(t, _) -> mkType creationAide t |> TypeConstraint.WhereSelfConstrained // Arrow type is right-associative -let rec (|TFuns|_|) = +let rec private (|TFuns|_|): SynType -> ((SynType * range) list * SynType) option = function | SynType.Fun(t1, TFuns(ts, ret), _, trivia) -> Some((t1, trivia.ArrowRange) :: ts, ret) | SynType.Fun(t1, t2, _, trivia) -> Some([ t1, trivia.ArrowRange ], t2) | _ -> None -let mkTypeList creationAide ts rt m = +let private mkTypeList creationAide ts rt m = let parameters = ts |> List.map (fun (t, mArrow) -> mkType creationAide t, stn "->" mArrow) TypeFunsNode(parameters, mkType creationAide rt, m) -let mkType (creationAide: CreationAide) (t: SynType) : Type = +let private mkType (creationAide: CreationAide) (t: SynType) : Type = let typeRange = t.Range match t with @@ -2288,26 +2291,26 @@ let mkType (creationAide: CreationAide) (t: SynType) : Type = TypeIntersectionNode(typesAndSeparators, m) |> Type.Intersection | t -> failwith $"unexpected type: %A{t}" -let rec (|OpenL|_|) = +let rec private (|OpenL|_|): SynModuleDecl list -> ((SynOpenDeclTarget * range) list * SynModuleDecl list) option = function | SynModuleDecl.Open(target, range) :: OpenL(xs, ys) -> Some((target, range) :: xs, ys) | SynModuleDecl.Open(target, range) :: ys -> Some([ target, range ], ys) | _ -> None -let mkOpenNodeForImpl (creationAide: CreationAide) (target, range) : Open = +let private mkOpenNodeForImpl (creationAide: CreationAide) (target, range) : Open = match target with | SynOpenDeclTarget.ModuleOrNamespace(longId, _) -> OpenModuleOrNamespaceNode(mkSynLongIdent longId, range) |> Open.ModuleOrNamespace | SynOpenDeclTarget.Type(typeName, _) -> OpenTargetNode(mkType creationAide typeName, range) |> Open.Target -let rec (|HashDirectiveL|_|) = +let rec private (|HashDirectiveL|_|): SynModuleDecl list -> (ParsedHashDirective list * SynModuleDecl list) option = function | SynModuleDecl.HashDirective(p, _) :: HashDirectiveL(xs, ys) -> Some(p :: xs, ys) | SynModuleDecl.HashDirective(p, _) :: ys -> Some([ p ], ys) | _ -> None -let mkSynLeadingKeyword (lk: SynLeadingKeyword) = +let private mkSynLeadingKeyword (lk: SynLeadingKeyword) = let mtn v = v |> List.map (fun (t, r) -> stn t r) @@ -2347,7 +2350,7 @@ let mkSynLeadingKeyword (lk: SynLeadingKeyword) = | SynLeadingKeyword.Do doRange -> mtn [ "do", doRange ] | SynLeadingKeyword.Synthetic -> failwith "Unexpected SynLeadingKeyword.Synthetic" -let mkSynField +let private mkSynField (creationAide: CreationAide) (SynField(ats, _isStatic, @@ -2371,7 +2374,7 @@ let mkSynField range ) -let mkSynUnionCase +let private mkSynUnionCase (creationAide: CreationAide) (SynUnionCase(attributes, ident, caseType, xmlDoc, _vis, m, trivia)) : UnionCaseNode = @@ -2397,7 +2400,7 @@ let mkSynUnionCase fullRange ) -let mkSynSimplePat creationAide (pat: SynSimplePat) = +let private mkSynSimplePat creationAide (pat: SynSimplePat) = match pat with | SynSimplePat.Attrib(SynSimplePat.Typed(SynSimplePat.Id(ident = ident; isOptional = isOptional), t, _), attributes, @@ -2419,7 +2422,7 @@ let mkSynSimplePat creationAide (pat: SynSimplePat) = Some(SimplePatNode(mkAttributes creationAide [], isOptional, mkIdent ident, None, m)) | _ -> None -let mkImplicitCtor +let private mkImplicitCtor creationAide vis (attrs: SynAttributeList list) @@ -2483,7 +2486,7 @@ let mkImplicitCtor range ) -let mkTypeDefn +let private mkTypeDefn (creationAide: CreationAide) (SynTypeDefn(typeInfo, typeRepr, members, implicitConstructor, range, trivia)) : TypeDefn = @@ -2658,7 +2661,7 @@ let mkTypeDefn TypeDefnRegularNode(typeNameNode, allMembers, typeDefnRange) |> TypeDefn.Regular | _ -> failwithf "Could not create a TypeDefn for %A" typeRepr -let mkWithGetSet (withKeyword: range option) (getSet: GetSetKeywords option) = +let private mkWithGetSet (withKeyword: range option) (getSet: GetSetKeywords option) = match withKeyword, getSet with | Some mWith, Some gs -> let withNode = stn "with" mWith @@ -2674,7 +2677,7 @@ let mkWithGetSet (withKeyword: range option) (getSet: GetSetKeywords option) = Some(MultipleTextsNode([ withNode; stn "set," mSet; stn "get" mGet ], m)) | _ -> None -let mkPropertyGetSetBinding +let private mkPropertyGetSetBinding (creationAide: CreationAide) (accessibility: SynAccess option) (leadingKeyword: SingleTextNode) @@ -2730,7 +2733,7 @@ let mkPropertyGetSetBinding ) | _ -> failwith "SynBinding does not expected information for PropertyGetSetBinding" -let mkMemberDefn (creationAide: CreationAide) (md: SynMemberDefn) = +let private mkMemberDefn (creationAide: CreationAide) (md: SynMemberDefn) = let memberDefinitionRange = md.Range match md with @@ -3012,7 +3015,7 @@ let mkMemberDefn (creationAide: CreationAide) (md: SynMemberDefn) = | _ -> failwith "SynMemberDefn.GetSetMember cannot exist with get and without set" | _ -> failwithf "Unexpected SynMemberDefn: %A" md -let mkVal +let private mkVal (creationAide: CreationAide) (SynValSig(ats, synIdent, vtd, t, _vi, _isInline, isMutable, px, ao, eo, range, trivia)) : ValNode = @@ -3036,7 +3039,7 @@ let mkVal range ) -let mkMemberSig (creationAide: CreationAide) (ms: SynMemberSig) = +let private mkMemberSig (creationAide: CreationAide) (ms: SynMemberSig) = let memberSigRange = ms.Range match ms with @@ -3059,7 +3062,7 @@ let mkMemberSig (creationAide: CreationAide) (ms: SynMemberSig) = | SynMemberSig.ValField(f, _) -> mkSynField creationAide f |> MemberDefn.ValField | _ -> failwithf "Cannot construct node for %A" ms -let rec mkModuleDecls +let rec private mkModuleDecls (creationAide: CreationAide) (decls: SynModuleDecl list) (finalContinuation: ModuleDecl list -> ModuleDecl list) @@ -3104,7 +3107,7 @@ let rec mkModuleDecls | head :: tail -> mkModuleDecls creationAide tail (fun nodes -> mkModuleDecl creationAide head :: nodes |> finalContinuation) -let mkModuleOrNamespace +let private mkModuleOrNamespace (creationAide: CreationAide) (SynModuleOrNamespace( xmlDoc = xmlDoc @@ -3171,7 +3174,7 @@ let mkModuleOrNamespace ModuleOrNamespaceNode(header, decls, range) -let mkImplFile +let private mkImplFile (creationAide: CreationAide) (ParsedImplFileInput(hashDirectives = hashDirectives; contents = contents)) (m: range) @@ -3181,19 +3184,21 @@ let mkImplFile Oak(phds, mds, m) // start sig file -let rec (|OpenSigL|_|) = +let rec private (|OpenSigL|_|) + : SynModuleSigDecl list -> ((SynOpenDeclTarget * range) list * SynModuleSigDecl list) option = function | SynModuleSigDecl.Open(target, range) :: OpenSigL(xs, ys) -> Some((target, range) :: xs, ys) | SynModuleSigDecl.Open(target, range) :: ys -> Some([ target, range ], ys) | _ -> None -let rec (|HashDirectiveSigL|_|) = +let rec private (|HashDirectiveSigL|_|) + : SynModuleSigDecl list -> (ParsedHashDirective list * SynModuleSigDecl list) option = function | SynModuleSigDecl.HashDirective(p, _) :: HashDirectiveSigL(xs, ys) -> Some(p :: xs, ys) | SynModuleSigDecl.HashDirective(p, _) :: ys -> Some([ p ], ys) | _ -> None -let mkModuleSigDecl (creationAide: CreationAide) (decl: SynModuleSigDecl) = +let private mkModuleSigDecl (creationAide: CreationAide) (decl: SynModuleSigDecl) = let declRange = decl.Range match decl with @@ -3236,7 +3241,10 @@ let mkModuleSigDecl (creationAide: CreationAide) (decl: SynModuleSigDecl) = | SynModuleSigDecl.Val(valSig, _) -> mkVal creationAide valSig |> ModuleDecl.Val | decl -> failwithf $"Failed to create ModuleDecl for %A{decl}" -let mkTypeDefnSig (creationAide: CreationAide) (SynTypeDefnSig(typeInfo, typeRepr, members, range, trivia)) : TypeDefn = +let private mkTypeDefnSig + (creationAide: CreationAide) + (SynTypeDefnSig(typeInfo, typeRepr, members, range, trivia)) + : TypeDefn = let typeNameNode = match typeInfo with | SynComponentInfo(ats, tds, tcs, lid, px, _preferPostfix, ao, _) -> @@ -3396,7 +3404,7 @@ let mkTypeDefnSig (creationAide: CreationAide) (SynTypeDefnSig(typeInfo, typeRep TypeDefnRegularNode(typeNameNode, allMembers, typeDefnRange) |> TypeDefn.Regular | _ -> failwithf "Could not create a TypeDefn for %A" typeRepr -let rec mkModuleSigDecls +let rec private mkModuleSigDecls (creationAide: CreationAide) (decls: SynModuleSigDecl list) (finalContinuation: ModuleDecl list -> ModuleDecl list) @@ -3429,7 +3437,7 @@ let rec mkModuleSigDecls mkModuleSigDecls creationAide tail (fun nodes -> mkModuleSigDecl creationAide head :: nodes |> finalContinuation) -let mkModuleOrNamespaceSig +let private mkModuleOrNamespaceSig (creationAide: CreationAide) (SynModuleOrNamespaceSig( xmlDoc = xmlDoc @@ -3495,7 +3503,7 @@ let mkModuleOrNamespaceSig ModuleOrNamespaceNode(header, decls, range) -let mkSigFile +let private mkSigFile (creationAide: CreationAide) (ParsedSigFileInput(hashDirectives = hashDirectives; contents = contents)) (m: range) @@ -3504,7 +3512,7 @@ let mkSigFile let mds = List.map (mkModuleOrNamespaceSig creationAide) contents Oak(phds, mds, m) -let includeTrivia +let private includeTrivia (baseRange: range) (comments: CommentTrivia list) (conditionDirectives: ConditionalDirectiveTrivia list) @@ -3533,7 +3541,7 @@ let includeTrivia else unionRanges triviaRange acc) -let mkSynModuleOrNamespaceFullRange (mn: SynModuleOrNamespace) = +let private mkSynModuleOrNamespaceFullRange (mn: SynModuleOrNamespace) = match mn with | SynModuleOrNamespace(kind = SynModuleOrNamespaceKind.AnonModule; decls = decls) -> match List.tryHead decls, List.tryLast decls with @@ -3543,7 +3551,7 @@ let mkSynModuleOrNamespaceFullRange (mn: SynModuleOrNamespace) = | Some s, Some e -> unionRanges s.Range e.Range | _ -> mn.Range -let mkSynModuleOrNamespaceSigFullRange (mn: SynModuleOrNamespaceSig) = +let private mkSynModuleOrNamespaceSigFullRange (mn: SynModuleOrNamespaceSig) = match mn with | SynModuleOrNamespaceSig(kind = SynModuleOrNamespaceKind.AnonModule; decls = decls) -> match List.tryHead decls, List.tryLast decls with @@ -3554,7 +3562,7 @@ let mkSynModuleOrNamespaceSigFullRange (mn: SynModuleOrNamespaceSig) = | _ -> mn.Range -let mkFullTreeRange ast = +let private mkFullTreeRange ast = match ast with | ParsedInput.ImplFile(ParsedImplFileInput(hashDirectives = directives; contents = modules; trivia = trivia)) -> let startPos = @@ -3596,7 +3604,7 @@ let mkFullTreeRange ast = let astRange = unionRanges startPos endPos includeTrivia astRange trivia.CodeComments trivia.ConditionalDirectives -let mkOak (sourceText: ISourceText option) (ast: ParsedInput) = +let mkOak (sourceText: ISourceText option) (ast: ParsedInput) : Oak = let creationAide = { SourceText = sourceText } let fullRange = mkFullTreeRange ast diff --git a/src/Fantomas.Core/AssemblyInfo.fs b/src/Fantomas.Core/AssemblyInfo.fs index 1c3295927b..c4764ce065 100644 --- a/src/Fantomas.Core/AssemblyInfo.fs +++ b/src/Fantomas.Core/AssemblyInfo.fs @@ -8,4 +8,4 @@ do () module internal AssemblyVersionInformation = [] - let InternalsVisibleTo = "Fantomas.Tests" + let InternalsVisibleTo: string = "Fantomas.Tests" diff --git a/src/Fantomas.Core/CodeFormatter.fs b/src/Fantomas.Core/CodeFormatter.fs index de70e9071d..deba46b9ac 100644 --- a/src/Fantomas.Core/CodeFormatter.fs +++ b/src/Fantomas.Core/CodeFormatter.fs @@ -6,7 +6,7 @@ open Fantomas.Core.SyntaxOak [] type CodeFormatter = - static member ParseAsync(isSignature, source) : Async<(ParsedInput * string list) array> = + static member ParseAsync(isSignature: bool, source: string) : Async<(ParsedInput * string list) array> = async { let! results = CodeFormatterImpl.getSourceText source |> CodeFormatterImpl.parse isSignature return results |> Array.map (fun (ast, DefineCombination(defines)) -> ast, defines) @@ -18,52 +18,64 @@ type CodeFormatter = return result.Code } - static member FormatASTAsync(ast: ParsedInput, config) : Async = + static member FormatASTAsync(ast: ParsedInput, config: FormatConfig) : Async = async { let result = CodeFormatterImpl.formatAST ast None config None return result.Code } - static member FormatASTAsync(ast: ParsedInput, source) : Async = + static member FormatASTAsync(ast: ParsedInput, source: string) : Async = async { let sourceText = Some(CodeFormatterImpl.getSourceText source) let result = CodeFormatterImpl.formatAST ast sourceText FormatConfig.Default None return result.Code } - static member FormatASTAsync(ast: ParsedInput, source, config) : Async = + static member FormatASTAsync(ast: ParsedInput, source: string, config: FormatConfig) : Async = async { let sourceText = Some(CodeFormatterImpl.getSourceText source) let result = CodeFormatterImpl.formatAST ast sourceText config None return result } - static member FormatDocumentAsync(isSignature, source) = + static member FormatDocumentAsync(isSignature: bool, source: string) : Async = CodeFormatterImpl.formatDocument FormatConfig.Default isSignature (CodeFormatterImpl.getSourceText source) None - static member FormatDocumentAsync(isSignature, source, config) = + static member FormatDocumentAsync(isSignature: bool, source: string, config: FormatConfig) : Async = CodeFormatterImpl.formatDocument config isSignature (CodeFormatterImpl.getSourceText source) None - static member FormatDocumentAsync(isSignature, source, config, cursor) = + static member FormatDocumentAsync + ( + isSignature: bool, + source: string, + config: FormatConfig, + cursor: pos + ) : Async = CodeFormatterImpl.formatDocument config isSignature (CodeFormatterImpl.getSourceText source) (Some cursor) - static member FormatSelectionAsync(isSignature, source, selection) = + static member FormatSelectionAsync(isSignature: bool, source: string, selection: range) : Async = CodeFormatterImpl.getSourceText source |> Selection.formatSelection FormatConfig.Default isSignature selection - static member FormatSelectionAsync(isSignature, source, selection, config) = + static member FormatSelectionAsync + ( + isSignature: bool, + source: string, + selection: range, + config: FormatConfig + ) : Async = CodeFormatterImpl.getSourceText source |> Selection.formatSelection config isSignature selection - static member IsValidFSharpCodeAsync(isSignature: bool, source: string) = + static member IsValidFSharpCodeAsync(isSignature: bool, source: string) : Async = Validation.isValidFSharpCode isSignature source - static member GetVersion() = Version.fantomasVersion.Value + static member GetVersion() : string = Version.fantomasVersion.Value - static member MakeRange(fileName, startLine, startCol, endLine, endCol) = + static member MakeRange(fileName: string, startLine: int, startCol: int, endLine: int, endCol: int) : range = Range.mkRange fileName (Position.mkPos startLine startCol) (Position.mkPos endLine endCol) - static member MakePosition(line, column) = Position.mkPos line column + static member MakePosition(line: int, column: int) : pos = Position.mkPos line column static member ParseOakAsync(isSignature: bool, source: string) : Async<(Oak * string list) array> = async { @@ -78,9 +90,9 @@ type CodeFormatter = oak, defines.Value) } - static member TransformAST ast = ASTTransformer.mkOak None ast + static member TransformAST(ast: ParsedInput) : Oak = ASTTransformer.mkOak None ast - static member TransformAST(ast, source) = + static member TransformAST(ast: ParsedInput, source: string) : Oak = let sourceText = SourceText.ofString source let oak = ASTTransformer.mkOak (Some sourceText) ast Trivia.enrichTree FormatConfig.Default sourceText ast oak diff --git a/src/Fantomas.Core/CodePrinter.fs b/src/Fantomas.Core/CodePrinter.fs index d1f2476efe..b12e4b130c 100644 --- a/src/Fantomas.Core/CodePrinter.fs +++ b/src/Fantomas.Core/CodePrinter.fs @@ -5,8 +5,8 @@ open Fantomas.Core.Context open Fantomas.Core.SyntaxOak open Microsoft.FSharp.Core.CompilerServices -let noBreakInfixOps = set [| "="; ">"; "<"; "%" |] -let newLineInfixOps = set [ "|>"; "||>"; "|||>"; ">>"; ">>=" ] +let private noBreakInfixOps = set [| "="; ">"; "<"; "%" |] +let private newLineInfixOps = set [ "|>"; "||>"; "|||>"; ">>"; ">>=" ] let rec (|UppercaseType|LowercaseType|) (t: Type) : Choice = let upperOrLower (v: string) = @@ -30,7 +30,7 @@ let rec (|UppercaseType|LowercaseType|) (t: Type) : Choice = | Type.AppPrefix node -> (|UppercaseType|LowercaseType|) node.Identifier | _ -> failwithf $"Cannot determine if synType %A{t} is uppercase or lowercase" -let rec (|UppercaseExpr|LowercaseExpr|) (expr: Expr) = +let rec (|UppercaseExpr|LowercaseExpr|) (expr: Expr) : Choice = let upperOrLower (v: string) = let isUpper = Seq.tryHead v |> Option.map Char.IsUpper |> Option.defaultValue false if isUpper then UppercaseExpr else LowercaseExpr @@ -59,7 +59,7 @@ let rec (|UppercaseExpr|LowercaseExpr|) (expr: Expr) = | Expr.Dynamic node -> (|UppercaseExpr|LowercaseExpr|) node.FuncExpr | _ -> failwithf "cannot determine if Expr %A is uppercase or lowercase" expr -let (|ParenExpr|_|) (e: Expr) = +let (|ParenExpr|_|) (e: Expr) : Expr option = match e with | Expr.Paren _ | Expr.ParenLambda _ @@ -67,7 +67,7 @@ let (|ParenExpr|_|) (e: Expr) = | Expr.Constant(Constant.Unit _) -> Some e | _ -> None -let genTrivia (node: Node) (trivia: TriviaNode) (ctx: Context) = +let private genTrivia (node: Node) (trivia: TriviaNode) (ctx: Context) = let currentLastLine = ctx.WriterModel.Lines |> List.tryHead // Some items like #if or Newline should be printed on a newline @@ -109,7 +109,7 @@ let genTrivia (node: Node) (trivia: TriviaNode) (ctx: Context) = gen ctx -let recordCursorNode f (node: Node) (ctx: Context) = +let private recordCursorNode f (node: Node) (ctx: Context) = match node.TryGetCursor with | None -> f ctx | Some cursor -> @@ -127,30 +127,30 @@ let recordCursorNode f (node: Node) (ctx: Context) = { ctxAfter with FormattedCursor = Some formattedCursor } -let enterNode<'n when 'n :> Node> (n: 'n) = +let private enterNode<'n when 'n :> Node> (n: 'n) = col sepNone n.ContentBefore (genTrivia n) -let leaveNode<'n when 'n :> Node> (n: 'n) = +let private leaveNode<'n when 'n :> Node> (n: 'n) = col sepNone n.ContentAfter (genTrivia n) -let genNode<'n when 'n :> Node> (n: 'n) (f: Context -> Context) = +let private genNode<'n when 'n :> Node> (n: 'n) (f: Context -> Context) = enterNode n +> recordCursorNode f n +> leaveNode n -let genSingleTextNode (node: SingleTextNode) = !-node.Text |> genNode node +let private genSingleTextNode (node: SingleTextNode) = !-node.Text |> genNode node // Alternative for genSingleTextNode to avoid a double space when the node has line comment after it. -let genSingleTextNodeWithSpaceSuffix (addSpace: Context -> Context) (node: SingleTextNode) = +let private genSingleTextNodeWithSpaceSuffix (addSpace: Context -> Context) (node: SingleTextNode) = (!-node.Text +> addSpace) |> genNode node -let genSingleTextNodeSuffixDelimiter (node: SingleTextNode) = +let private genSingleTextNodeSuffixDelimiter (node: SingleTextNode) = genSingleTextNodeWithSpaceSuffix addSpaceIfSpaceAroundDelimiter node -let genSingleTextNodeWithLeadingDot (node: SingleTextNode) = !- $".%s{node.Text}" |> genNode node +let private genSingleTextNodeWithLeadingDot (node: SingleTextNode) = !- $".%s{node.Text}" |> genNode node -let genMultipleTextsNode (node: MultipleTextsNode) = +let private genMultipleTextsNode (node: MultipleTextsNode) = col sepSpace node.Content genSingleTextNode |> genNode node -let genIdentListNodeAux addLeadingDot (iln: IdentListNode) = +let private genIdentListNodeAux addLeadingDot (iln: IdentListNode) = coli sepNone iln.Content (fun idx identOrDot -> match identOrDot with | IdentifierOrDot.Ident ident -> @@ -162,20 +162,20 @@ let genIdentListNodeAux addLeadingDot (iln: IdentListNode) = | IdentifierOrDot.UnknownDot -> sepDot) |> genNode iln -let genIdentListNode iln = genIdentListNodeAux false iln -let genIdentListNodeWithDot iln = genIdentListNodeAux true iln +let private genIdentListNode iln = genIdentListNodeAux false iln +let private genIdentListNodeWithDot iln = genIdentListNodeAux true iln -let genAccessOpt (nodeOpt: SingleTextNode option) = +let private genAccessOpt (nodeOpt: SingleTextNode option) = match nodeOpt with | None -> sepNone | Some node -> genSingleTextNode node +> sepSpace -let genXml (node: XmlDocNode option) = +let private genXml (node: XmlDocNode option) = match node with | None -> sepNone | Some node -> col sepNln node.Lines (!-) +> sepNln |> genNode node -let addSpaceBeforeParenInPattern (node: IdentListNode) (ctx: Context) = +let private addSpaceBeforeParenInPattern (node: IdentListNode) (ctx: Context) = node.Content |> List.tryFindBack (function | IdentifierOrDot.Ident node -> not (String.IsNullOrWhiteSpace node.Text) @@ -192,16 +192,16 @@ let addSpaceBeforeParenInPattern (node: IdentListNode) (ctx: Context) = onlyIf parameterValue sepSpace ctx | _ -> sepSpace ctx -let genParsedHashDirective (phd: ParsedHashDirectiveNode) = +let private genParsedHashDirective (phd: ParsedHashDirectiveNode) = !- "#" +> !-phd.Ident +> sepSpace +> col sepSpace phd.Args genSingleTextNode |> genNode phd -let genUnit (n: UnitNode) = +let private genUnit (n: UnitNode) = genSingleTextNode n.OpeningParen +> genSingleTextNode n.ClosingParen |> genNode n // genNode will should be called in the caller function. -let genConstant (c: Constant) = +let private genConstant (c: Constant) = match c with | Constant.FromText n -> genSingleTextNode n | Constant.Unit n -> genUnit n @@ -212,7 +212,7 @@ let genConstant (c: Constant) = +> genSingleTextNode n.Measure.GreaterThan |> genNode n -let genMeasure (measure: Measure) = +let private genMeasure (measure: Measure) = match measure with | Measure.Single n -> genSingleTextNode n | Measure.Operator n -> @@ -240,7 +240,7 @@ let genMeasure (measure: Measure) = +> genSingleTextNode n.ClosingParen |> genNode n -let genRational (rat: RationalConstNode) = +let private genRational (rat: RationalConstNode) = match rat with | RationalConstNode.Integer i -> genSingleTextNode i | RationalConstNode.Negate negate -> genSingleTextNode negate.Minus +> genRational negate.Rational @@ -252,7 +252,7 @@ let genRational (rat: RationalConstNode) = +> genSingleTextNode rationalNode.ClosingParen |> genNode rationalNode -let genAttributesCore (ats: AttributeNode list) = +let private genAttributesCore (ats: AttributeNode list) = let genAttributeExpr (attr: AttributeNode) = match attr.Expr with | None -> opt sepColon attr.Target genSingleTextNode +> genIdentListNode attr.TypeName @@ -269,7 +269,7 @@ let genAttributesCore (ats: AttributeNode list) = let longExpression = atCurrentColumn (col (sepSemi +> sepNln) ats genAttributeExpr) ifElse ats.IsEmpty sepNone (expressionFitsOnRestOfLine shortExpression longExpression) -let genOnelinerAttributes (n: MultipleAttributeListNode option) = +let private genOnelinerAttributes (n: MultipleAttributeListNode option) = match n with | None -> sepNone | Some n -> @@ -292,7 +292,7 @@ let genOnelinerAttributes (n: MultipleAttributeListNode option) = ifElse ats.IsEmpty sepNone (genAttrs +> sepSpace) -let genAttributes (node: MultipleAttributeListNode option) = +let private genAttributes (node: MultipleAttributeListNode option) = match node with | None -> sepNone | Some node -> @@ -305,7 +305,7 @@ let genAttributes (node: MultipleAttributeListNode option) = |> genNode node // The inherit keyword should already be printed by the caller -let genInheritConstructor (ic: InheritConstructor) = +let private genInheritConstructor (ic: InheritConstructor) = match ic with | InheritConstructor.TypeOnly node -> genType node.Type | InheritConstructor.Unit node -> @@ -321,28 +321,28 @@ let genInheritConstructor (ic: InheritConstructor) = genType node.Type +> sepSpaceOrIndentAndNlnIfExpressionExceedsPageWidth (genExpr node.Expr) -let mkExprParenNode openingParen e closingParen r = +let private mkExprParenNode openingParen e closingParen r = ExprParenNode(openingParen, e, closingParen, r) |> Expr.Paren -let isIfThenElse (e: Expr) = +let private isIfThenElse (e: Expr) = match e with | Expr.IfThen _ | Expr.IfThenElif _ | Expr.IfThenElse _ -> true | _ -> false -let (|IsIfThenElse|_|) (e: Expr) = if isIfThenElse e then Some e else None +let (|IsIfThenElse|_|) (e: Expr) : Expr option = if isIfThenElse e then Some e else None -let isLambdaOrIfThenElse (e: Expr) = +let private isLambdaOrIfThenElse (e: Expr) = match e with | Expr.Lambda _ | IsIfThenElse _ -> true | _ -> false -let (|IsLambdaOrIfThenElse|_|) (e: Expr) = +let (|IsLambdaOrIfThenElse|_|) (e: Expr) : Expr option = if isLambdaOrIfThenElse e then Some e else None -let genExpr (e: Expr) = +let private genExpr (e: Expr) = match e with | Expr.Lazy node -> let genInfixExpr (ctx: Context) = @@ -1581,7 +1581,7 @@ let genExpr (e: Expr) = expressionFitsOnRestOfLine short long |> genNode node -let genQuoteExpr (node: ExprQuoteNode) = +let private genQuoteExpr (node: ExprQuoteNode) = genSingleTextNode node.OpenToken +> sepSpace +> expressionFitsOnRestOfLine (genExpr node.Expr) (indent +> sepNln +> genExpr node.Expr +> unindent +> sepNln) @@ -1596,7 +1596,7 @@ let genQuoteExpr (node: ExprQuoteNode) = /// Should there be an additional indent after the `with` keyword. /// Record fields. /// Expression before the `with` keyword. -let genMultilineRecordCopyExpr (addAdditionalIndent: bool) fieldsExpr copyExpr = +let private genMultilineRecordCopyExpr (addAdditionalIndent: bool) fieldsExpr copyExpr = atCurrentColumnIndent (genExpr copyExpr) +> !- " with" +> indent @@ -1608,7 +1608,7 @@ let genMultilineRecordCopyExpr (addAdditionalIndent: bool) fieldsExpr copyExpr = /// Special case for record fields in Cramped mode. /// The caller should have already verified that the settings do indeed specify Cramped. -let genRecordFieldNameCramped (alreadyIndentedFurther: bool) (node: RecordFieldNode) = +let private genRecordFieldNameCramped (alreadyIndentedFurther: bool) (node: RecordFieldNode) = atCurrentColumn ( enterNode node +> genIdentListNode node.FieldName @@ -1628,7 +1628,7 @@ let genRecordFieldNameCramped (alreadyIndentedFurther: bool) (node: RecordFieldN genBodyExpr node.Expr ctx) +> leaveNode node -let genRecordFieldNameAligned (node: RecordFieldNode) = +let private genRecordFieldNameAligned (node: RecordFieldNode) = atCurrentColumn ( enterNode node +> genIdentListNode node.FieldName @@ -1649,7 +1649,7 @@ let genMultilineRecordFieldsExpr /// /// Either the `expr with` or `inherit T`. /// ExprRecordBaseNode -let genSmallRecordBaseExpr genExtra (node: ExprRecordBaseNode) = +let private genSmallRecordBaseExpr genExtra (node: ExprRecordBaseNode) = genSingleTextNode node.OpeningBrace +> addSpaceIfSpaceAroundDelimiter +> genExtra @@ -1663,7 +1663,7 @@ let genSmallRecordBaseExpr genExtra (node: ExprRecordBaseNode) = +> addSpaceIfSpaceAroundDelimiter +> genSingleTextNode node.ClosingBrace -let genSmallRecordNode (node: ExprRecordNode) = +let private genSmallRecordNode (node: ExprRecordNode) = genSmallRecordBaseExpr (match node.CopyInfo with | Some we -> genExpr we +> !- " with " @@ -1680,7 +1680,7 @@ let genSmallRecordNode (node: ExprRecordNode) = /// /// The ExprRecordNode /// Context -let genMultilineRecord (node: ExprRecordNode) (ctx: Context) = +let private genMultilineRecord (node: ExprRecordNode) (ctx: Context) = let expressionStartColumn = ctx.Column let openBraceLength = node.OpeningBrace.Text.Length @@ -1764,11 +1764,11 @@ let genMultilineRecord (node: ExprRecordNode) (ctx: Context) = ifAlignOrStroustrupBrackets genMultilineAlignBrackets genMultilineCramped ctx -let genRecord smallRecordExpr multilineRecordExpr (node: ExprRecordBaseNode) ctx = +let private genRecord smallRecordExpr multilineRecordExpr (node: ExprRecordBaseNode) ctx = let size = getRecordSize ctx node.Fields genNode node (isSmallExpression size smallRecordExpr multilineRecordExpr) ctx -let genArrayOrList (preferMultilineCramped: bool) (node: ExprArrayOrListNode) = +let private genArrayOrList (preferMultilineCramped: bool) (node: ExprArrayOrListNode) = if node.Elements.IsEmpty then genSingleTextNode node.Opening +> genSingleTextNode node.Closing |> genNode node else @@ -1820,7 +1820,7 @@ let genArrayOrList (preferMultilineCramped: bool) (node: ExprArrayOrListNode) = isSmallExpression size smallExpression multilineExpression ctx |> genNode node -let genMultilineFunctionApplicationArguments (argExpr: Expr) = +let private genMultilineFunctionApplicationArguments (argExpr: Expr) = let argsInsideParenthesis (parenNode: ExprParenNode) f = genSingleTextNode parenNode.OpeningParen +> indentSepNlnUnindent f @@ -1843,7 +1843,7 @@ let genMultilineFunctionApplicationArguments (argExpr: Expr) = | _ -> genExpr parenNode.Expr |> argsInsideParenthesis parenNode | _ -> genExpr argExpr -let genTupleExpr (node: ExprTupleNode) = +let private genTupleExpr (node: ExprTupleNode) = // if a tuple element is an InfixApp with a lambda or if-then-else expression on the rhs, // we need to wrap the rhs in parenthesis to avoid a parse error caused by the higher precedence of "," over the rhs expression. // see 2819 @@ -1882,7 +1882,7 @@ let genTupleExpr (node: ExprTupleNode) = atCurrentColumn (expressionFitsOnRestOfLine shortExpression longExpression) |> genNode node -let genTupleMultiline (node: ExprTupleNode) = +let private genTupleMultiline (node: ExprTupleNode) = let containsLambdaOrMatchExpr = // If the any items (expect the last) is a match/lambda node.Items @@ -1921,7 +1921,7 @@ let genTupleMultiline (node: ExprTupleNode) = coli sepNone node.Items genItem -let genNamedArgumentExpr (node: ExprInfixAppNode) = +let private genNamedArgumentExpr (node: ExprInfixAppNode) = let short = genExpr node.LeftHandSide +> sepSpace @@ -1937,7 +1937,7 @@ let genNamedArgumentExpr (node: ExprInfixAppNode) = expressionFitsOnRestOfLine short long |> genNode node -let genLambdaAux (includeClosingParen: bool) (node: ExprLambdaNode) = +let private genLambdaAux (includeClosingParen: bool) (node: ExprLambdaNode) = let genPats = let shortPats = sepSpace +> col sepSpace node.Parameters genPat @@ -1983,10 +1983,13 @@ let genLambdaAux (includeClosingParen: bool) (node: ExprLambdaNode) = MaxLineLength = maxLineLength } }) |> genNode node -let genLambda = genLambdaAux false -let genLambdaWithParen = genLambdaAux true +let private genLambda = genLambdaAux false +let private genLambdaWithParen = genLambdaAux true -let genAppLongIdentAndSingleParenArgExpr (addSpace: Context -> Context) (node: ExprAppLongIdentAndSingleParenArgNode) = +let private genAppLongIdentAndSingleParenArgExpr + (addSpace: Context -> Context) + (node: ExprAppLongIdentAndSingleParenArgNode) + = let shortLids = genIdentListNode node.FunctionName let short = shortLids +> addSpace +> genExpr node.ArgExpr @@ -2002,7 +2005,7 @@ let genAppLongIdentAndSingleParenArgExpr (addSpace: Context -> Context) (node: E expressionFitsOnRestOfLine short long |> genNode node -let genAppSingleParenArgExpr (addSpace: Context -> Context) (node: ExprAppSingleParenArgNode) = +let private genAppSingleParenArgExpr (addSpace: Context -> Context) (node: ExprAppSingleParenArgNode) = let short = genExpr node.FunctionExpr +> addSpace +> genExpr node.ArgExpr let long ctx = @@ -2030,14 +2033,14 @@ let genAppSingleParenArgExpr (addSpace: Context -> Context) (node: ExprAppSingle expressionFitsOnRestOfLine short long |> genNode node -let genClauses (clauses: MatchClauseNode list) = +let private genClauses (clauses: MatchClauseNode list) = let lastIndex = clauses.Length - 1 coli sepNln clauses (fun idx clause -> let isLastItem = lastIndex = idx genClause isLastItem clause) -let genClause (isLastItem: bool) (node: MatchClauseNode) = +let private genClause (isLastItem: bool) (node: MatchClauseNode) = let genBar = match node.Bar with | Some barNode -> genSingleTextNodeWithSpaceSuffix sepSpace barNode @@ -2092,7 +2095,7 @@ let genClause (isLastItem: bool) (node: MatchClauseNode) = genBar +> genPatAndBody |> genNode node -let genControlExpressionStartCore +let private genControlExpressionStartCore (startKeyword: Choice) (innerExpr: Expr) (endKeyword: SingleTextNode) @@ -2138,7 +2141,7 @@ let genControlExpressionStartCore +> leaveNode endKeyword // Caller of this function is responsible for genNode! -let genMultilineInfixExpr (node: ExprInfixAppNode) = +let private genMultilineInfixExpr (node: ExprInfixAppNode) = let genLhs (ctx: Context) = match node.LeftHandSide with | IsIfThenElse _ when (ctx.Config.IndentSize - 1 <= node.Operator.Text.Length) -> @@ -2175,7 +2178,7 @@ let genMultilineInfixExpr (node: ExprInfixAppNode) = +> genExprInMultilineInfixExpr node.RightHandSide ) -let genExprInMultilineInfixExpr (e: Expr) = +let private genExprInMultilineInfixExpr (e: Expr) = match e with | Expr.CompExprBody node -> let areLetOrUseStatementsEndingWithOtherStatement = @@ -2243,7 +2246,7 @@ let genExprInMultilineInfixExpr (e: Expr) = | Expr.Record _ -> atCurrentColumnIndent (genExpr e) | _ -> genExpr e -let genKeepIdentIfThenElse (ifKeyword: Node) (elseKeyword: Node) (e: Expr) ctx = +let private genKeepIdentIfThenElse (ifKeyword: Node) (elseKeyword: Node) (e: Expr) ctx = let exprNode = Expr.Node e if @@ -2255,7 +2258,7 @@ let genKeepIdentIfThenElse (ifKeyword: Node) (elseKeyword: Node) (e: Expr) ctx = else indentSepNlnUnindent (genExpr e) ctx -let genKeepIdentMatchClause (startNode: Node) (e: Expr) ctx = +let private genKeepIdentMatchClause (startNode: Node) (e: Expr) ctx = let exprNode = Expr.Node e if @@ -2266,7 +2269,7 @@ let genKeepIdentMatchClause (startNode: Node) (e: Expr) ctx = else indentSepNlnUnindent (genExpr e) ctx -let colGenericTypeParameters typeParameters = +let private colGenericTypeParameters typeParameters = coli sepComma typeParameters (fun idx t -> let leadingSpace = match t with @@ -2275,7 +2278,7 @@ let colGenericTypeParameters typeParameters = leadingSpace +> genType t) -let genFunctionNameWithMultilineLids (trailing: Context -> Context) (longIdent: IdentListNode) = +let private genFunctionNameWithMultilineLids (trailing: Context -> Context) (longIdent: IdentListNode) = match longIdent.Content with | IdentifierOrDot.Ident identNode :: t -> genSingleTextNode identNode @@ -2294,7 +2297,10 @@ let genFunctionNameWithMultilineLids (trailing: Context -> Context) (longIdent: ) | _ -> sepNone -let (|EndsWithDualListApp|_|) (config: FormatConfig) (appNode: ExprAppNode) = +let (|EndsWithDualListApp|_|) + (config: FormatConfig) + (appNode: ExprAppNode) + : (Expr list * ExprArrayOrListNode * ExprArrayOrListNode) option = if not (config.ExperimentalElmish || config.IsStroustrupStyle) then None else @@ -2310,7 +2316,10 @@ let (|EndsWithDualListApp|_|) (config: FormatConfig) (appNode: ExprAppNode) = visit appNode.Arguments -let (|EndsWithSingleListApp|_|) (config: FormatConfig) (appNode: ExprAppNode) = +let (|EndsWithSingleListApp|_|) + (config: FormatConfig) + (appNode: ExprAppNode) + : (Expr list * ExprArrayOrListNode) option = if not (config.ExperimentalElmish || config.IsStroustrupStyle) then None else @@ -2326,7 +2335,7 @@ let (|EndsWithSingleListApp|_|) (config: FormatConfig) (appNode: ExprAppNode) = visit appNode.Arguments -let (|EndsWithSingleRecordApp|_|) (config: FormatConfig) (appNode: ExprAppNode) = +let (|EndsWithSingleRecordApp|_|) (config: FormatConfig) (appNode: ExprAppNode) : (Expr list * Expr) option = if not config.IsStroustrupStyle then None else @@ -2342,7 +2351,7 @@ let (|EndsWithSingleRecordApp|_|) (config: FormatConfig) (appNode: ExprAppNode) visit appNode.Arguments -let genAppWithLambda sep (node: ExprAppWithLambdaNode) = +let private genAppWithLambda sep (node: ExprAppWithLambdaNode) = let short = genExpr node.FunctionName +> sep @@ -2497,7 +2506,7 @@ let genAppWithLambda sep (node: ExprAppWithLambdaNode) = expressionFitsOnRestOfLine short long |> genNode node -let sepSpaceBeforeParenInFuncInvocation (functionExpr: Expr) (argExpr: Expr) ctx = +let private sepSpaceBeforeParenInFuncInvocation (functionExpr: Expr) (argExpr: Expr) ctx = match functionExpr, argExpr with | Expr.DotLambda _, _ -> ctx | Expr.Constant _, _ -> sepSpace ctx @@ -2509,7 +2518,7 @@ let sepSpaceBeforeParenInFuncInvocation (functionExpr: Expr) (argExpr: Expr) ctx // end expressions -let genPatLeftMiddleRight (node: PatLeftMiddleRight) = +let private genPatLeftMiddleRight (node: PatLeftMiddleRight) = genPat node.LeftHandSide +> sepSpace +> (match node.Middle with @@ -2519,7 +2528,7 @@ let genPatLeftMiddleRight (node: PatLeftMiddleRight) = +> genPat node.RightHandSide |> genNode node -let genTyparDecl (isFirstTypeParam: bool) (td: TyparDeclNode) = +let private genTyparDecl (isFirstTypeParam: bool) (td: TyparDeclNode) = genOnelinerAttributes td.Attributes +> onlyIf (isFirstTypeParam && String.startsWithOrdinal "^" td.TypeParameter.Text) sepSpace +> genSingleTextNode td.TypeParameter @@ -2528,7 +2537,7 @@ let genTyparDecl (isFirstTypeParam: bool) (td: TyparDeclNode) = | Choice2Of2 amp -> genSingleTextNode amp) |> genNode td -let genTyparDecls (td: TyparDecls) = +let private genTyparDecls (td: TyparDecls) = match td with | TyparDecls.PostfixList node -> genSingleTextNode node.LessThan @@ -2543,7 +2552,7 @@ let genTyparDecls (td: TyparDecls) = |> genNode node | TyparDecls.SinglePrefix node -> genTyparDecl true node -let genTuplePatLong (node: PatTupleNode) = +let private genTuplePatLong (node: PatTupleNode) = let padUntilAtCurrentColumn ctx = addFixedSpaces ctx.WriterModel.AtColumn ctx @@ -2551,7 +2560,7 @@ let genTuplePatLong (node: PatTupleNode) = | Choice1Of2 p -> genPat p | Choice2Of2 comma -> genSingleTextNode comma +> sepNln) -let genTuplePat (node: PatTupleNode) = +let private genTuplePat (node: PatTupleNode) = let short = col sepNone node.Items (function | Choice1Of2 p -> genPat p @@ -2560,7 +2569,7 @@ let genTuplePat (node: PatTupleNode) = atCurrentColumn (expressionFitsOnRestOfLine short (atCurrentColumn (genTuplePatLong node))) |> genNode node -let genPat (p: Pattern) = +let private genPat (p: Pattern) = match p with | Pattern.OptionalVal n -> genSingleTextNode n | Pattern.Or node -> genPatLeftMiddleRight node @@ -2697,7 +2706,7 @@ let genPat (p: Pattern) = | Pattern.IsInst node -> genSingleTextNode node.Token +> sepSpace +> genType node.Type |> genNode node | Pattern.QuoteExpr node -> genQuoteExpr node -let genPatInClause (pat: Pattern) = +let private genPatInClause (pat: Pattern) = let rec genPatMultiline p = match p with | Pattern.Or p -> @@ -2724,7 +2733,7 @@ let genPatInClause (pat: Pattern) = genPatMultiline pat -let genPatRecordFieldName (node: PatRecordField) = +let private genPatRecordFieldName (node: PatRecordField) = match node.Prefix with | None -> genSingleTextNode node.FieldName @@ -2741,7 +2750,7 @@ let genPatRecordFieldName (node: PatRecordField) = +> sepSpace +> genPat node.Pattern -let genReturnTypeBinding (node: BindingReturnInfoNode option) = +let private genReturnTypeBinding (node: BindingReturnInfoNode option) = match node with | None -> sepNone | Some node -> @@ -2986,10 +2995,10 @@ let genBinding (b: BindingNode) (ctx: Context) : Context = genNode b binding ctx -let genBindings withUseConfig (bs: BindingNode list) : Context -> Context = +let private genBindings withUseConfig (bs: BindingNode list) : Context -> Context = colWithNlnWhenNodeIsMultiline withUseConfig genBinding bs -let genExternBinding (externNode: ExternBindingNode) = +let private genExternBinding (externNode: ExternBindingNode) = let genParameters = let short = col sepComma externNode.Parameters (fun externParameter -> @@ -3027,13 +3036,13 @@ let genExternBinding (externNode: ExternBindingNode) = +> genSingleTextNode externNode.ClosingParen |> genNode externNode -let genOpenList (openList: OpenListNode) = +let private genOpenList (openList: OpenListNode) = col sepNln openList.Opens (function | Open.ModuleOrNamespace node -> !- "open " +> genIdentListNode node.Name |> genNode node | Open.Target node -> !- "open type " +> genType node.Target |> genNode node) |> genNode openList -let genTypeConstraint (tc: TypeConstraint) = +let private genTypeConstraint (tc: TypeConstraint) = match tc with | TypeConstraint.Single node -> genSingleTextNode node.Typar +> sepColon +> genSingleTextNode node.Kind @@ -3063,7 +3072,7 @@ let genTypeConstraint (tc: TypeConstraint) = |> genNode node | TypeConstraint.WhereSelfConstrained t -> genType t -let genTypeConstraints (tcs: TypeConstraint list) = +let private genTypeConstraints (tcs: TypeConstraint list) = let short = colPre (sepSpace +> !- "when ") wordAnd tcs genTypeConstraint let long = @@ -3071,7 +3080,7 @@ let genTypeConstraints (tcs: TypeConstraint list) = autoIndentAndNlnIfExpressionExceedsPageWidth (expressionFitsOnRestOfLine short long) -let genType (t: Type) = +let private genType (t: Type) = match t with | Type.Funs node -> let short = @@ -3212,7 +3221,7 @@ let genType (t: Type) = | Choice2Of2 amp -> genSingleTextNode amp) |> genNode node -let genSynTupleTypeSegments (path: Choice list) = +let private genSynTupleTypeSegments (path: Choice list) = let genTs addNewline = col sepSpace path (fun t -> match t with @@ -3221,7 +3230,7 @@ let genSynTupleTypeSegments (path: Choice list) = expressionFitsOnRestOfLine (genTs false) (genTs true) -let addSpaceIfSynTypeStaticConstantHasAtSignBeforeString (t: Type) = +let private addSpaceIfSynTypeStaticConstantHasAtSignBeforeString (t: Type) = match t with | Type.StaticConstant sc -> match sc with @@ -3241,7 +3250,7 @@ let sepNlnBetweenTypeAndMembers (node: ITypeDefn) (ctx: Context) : Context = else ctx -let genImplicitConstructor (node: ImplicitConstructorNode) = +let private genImplicitConstructor (node: ImplicitConstructorNode) = let genSimplePat (node: SimplePatNode) = genOnelinerAttributes node.Attributes +> onlyIf node.IsOptional (!- "?") @@ -3301,7 +3310,7 @@ let genImplicitConstructor (node: ImplicitConstructorNode) = +> sepSpace) node.Self -let hasTriviaAfterLeadingKeyword (identifier: IdentListNode) (accessibility: SingleTextNode option) = +let private hasTriviaAfterLeadingKeyword (identifier: IdentListNode) (accessibility: SingleTextNode option) = let beforeAccess = match accessibility with | Some n -> n.HasContentBefore @@ -3310,7 +3319,7 @@ let hasTriviaAfterLeadingKeyword (identifier: IdentListNode) (accessibility: Sin let beforeIdentifier = identifier.HasContentBefore beforeAccess || beforeIdentifier -let genTypeDefn (td: TypeDefn) = +let private genTypeDefn (td: TypeDefn) = let typeDefnNode = TypeDefn.TypeDefnNode td let typeName = typeDefnNode.TypeName @@ -3550,7 +3559,7 @@ let genTypeDefn (td: TypeDefn) = |> genNode node | TypeDefn.Regular node -> header +> indentSepNlnUnindent (genMemberDefnList members) |> genNode node -let genTypeList (node: TypeFunsNode) = +let private genTypeList (node: TypeFunsNode) = let shortExpr = col sepSpace node.Parameters (fun (t, arrow) -> genType t +> sepSpace +> genSingleTextNode arrow) +> sepSpace @@ -3589,7 +3598,7 @@ let genTypeList (node: TypeFunsNode) = expressionFitsOnRestOfLine shortExpr longExpr |> genNode node -let genTypeInSignature (t: Type) = +let private genTypeInSignature (t: Type) = match t with | Type.WithGlobalConstraints node -> match node.Type with @@ -3616,7 +3625,7 @@ let genTypeInSignature (t: Type) = | Type.Funs funsNode -> autoIndentAndNlnIfExpressionExceedsPageWidth (genTypeList funsNode) | _ -> autoIndentAndNlnIfExpressionExceedsPageWidth (genType t) -let genField (node: FieldNode) = +let private genField (node: FieldNode) = let genAccessAndFieldContent = genAccessOpt node.Accessibility +> (match node.Name with @@ -3633,7 +3642,7 @@ let genField (node: FieldNode) = +> ifElseCtx hasWriteBeforeNewlineContent (indentSepNlnUnindent genAccessAndFieldContent) genAccessAndFieldContent |> genNode node -let genUnionCase (hasVerticalBar: bool) (node: UnionCaseNode) = +let private genUnionCase (hasVerticalBar: bool) (node: UnionCaseNode) = let shortExpr = col sepStar node.Fields genField let longExpr = @@ -3656,19 +3665,19 @@ let genUnionCase (hasVerticalBar: bool) (node: UnionCaseNode) = +> onlyIf (List.isNotEmpty node.Fields) (expressionFitsOnRestOfLine shortExpr longExpr) |> genNode node -let genTypeAndParam (genTypeName: Context -> Context) (tds: TyparDecls option) = +let private genTypeAndParam (genTypeName: Context -> Context) (tds: TyparDecls option) = match tds with | None -> genTypeName | Some(TyparDecls.PostfixList _) -> genTypeName +> optSingle genTyparDecls tds | Some(TyparDecls.PrefixList _) -> optSingle (fun tds -> genTyparDecls tds +> sepSpace) tds +> genTypeName | Some(TyparDecls.SinglePrefix singlePrefixNode) -> genTyparDecl true singlePrefixNode +> sepSpace +> genTypeName -let genInlineOpt (inlineNode: SingleTextNode option) = +let private genInlineOpt (inlineNode: SingleTextNode option) = match inlineNode with | None -> sepNone | Some inlineNode -> genSingleTextNodeWithSpaceSuffix sepSpace inlineNode -let genVal (node: ValNode) (optGetSet: MultipleTextsNode option) = +let private genVal (node: ValNode) (optGetSet: MultipleTextsNode option) = let genOptExpr = match node.Equals, node.Expr with | Some eq, Some e -> sepSpace +> genSingleTextNode eq +> sepSpace +> genExpr e @@ -3687,12 +3696,12 @@ let genVal (node: ValNode) (optGetSet: MultipleTextsNode option) = +> genOptExpr |> genNode node -let genMemberDefnList mds = +let private genMemberDefnList mds = match mds with | [] -> sepNone | _ -> colWithNlnWhenMappedNodeIsMultiline false MemberDefn.Node genMemberDefn mds -let genMemberDefn (md: MemberDefn) = +let private genMemberDefn (md: MemberDefn) = match md with | MemberDefn.ImplicitInherit ic -> genSingleTextNode ic.InheritKeyword @@ -3793,7 +3802,7 @@ let genMemberDefn (md: MemberDefn) = |> genNode (MemberDefn.Node md) | MemberDefn.SigMember node -> genVal node.Val node.WithGetSet |> genNode node -let genException (node: ExceptionDefnNode) = +let private genException (node: ExceptionDefnNode) = genXml node.XmlDoc +> genAttributes node.Attributes +> !- "exception " @@ -3806,7 +3815,7 @@ let genException (node: ExceptionDefnNode) = +> indentSepNlnUnindent (genMemberDefnList node.Members)) |> genNode node -let genModuleDecl (md: ModuleDecl) = +let private genModuleDecl (md: ModuleDecl) = match md with | ModuleDecl.OpenList ol -> genOpenList ol | ModuleDecl.HashDirectiveList node -> col sepNln node.HashDirectives genParsedHashDirective |> genNode node @@ -3851,7 +3860,7 @@ let genModuleDecl (md: ModuleDecl) = | ModuleDecl.TypeDefn td -> genTypeDefn td | ModuleDecl.Val node -> genVal node None -let sepNlnUnlessContentBefore (node: Node) = +let private sepNlnUnlessContentBefore (node: Node) = if not node.HasContentBefore then sepNln else sepNone let colWithNlnWhenMappedNodeIsMultiline<'n> @@ -3874,7 +3883,7 @@ let colWithNlnWhenNodeIsMultiline<'n when 'n :> Node> : Context -> Context = colWithNlnWhenMappedNodeIsMultiline<'n> withUseConfig (fun n -> n :> Node) f nodes -let genModule (m: ModuleOrNamespaceNode) = +let private genModule (m: ModuleOrNamespaceNode) = let newline = match m.Declarations with | [] -> onlyIf m.HasContentAfter sepNln @@ -3895,7 +3904,7 @@ let genModule (m: ModuleOrNamespaceNode) = +> colWithNlnWhenMappedNodeIsMultiline false ModuleDecl.Node genModuleDecl m.Declarations |> genNode m -let addFinalNewline ctx = +let private addFinalNewline ctx = let lastEvent = ctx.WriterEvents.TryHead match lastEvent with @@ -3911,7 +3920,7 @@ let addFinalNewline ctx = Lines = List.tail ctx.WriterModel.Lines } } | _ -> onlyIf ctx.Config.InsertFinalNewline sepNln ctx -let genFile (oak: Oak) = +let genFile (oak: Oak) : Context -> Context = (col sepNln oak.ParsedHashDirectives genParsedHashDirective +> (if oak.ParsedHashDirectives.IsEmpty then sepNone else sepNln) +> col sepNln oak.ModulesOrNamespaces genModule diff --git a/src/Fantomas.Core/Defines.fs b/src/Fantomas.Core/Defines.fs index a74693d8d9..a12a208ce5 100644 --- a/src/Fantomas.Core/Defines.fs +++ b/src/Fantomas.Core/Defines.fs @@ -6,11 +6,11 @@ open Fantomas.Core type internal DefineCombination = | DefineCombination of defines: string list - member x.Value = + member x.Value: string list = match x with | DefineCombination defines -> defines - static member Empty = DefineCombination([]) + static member Empty: DefineCombination = DefineCombination([]) module private DefineCombinationSolver = let rec map f e = @@ -238,7 +238,7 @@ module Defines = |> List.distinct |> List.map List.singleton - let getDefineExprs (hashDirectives: ConditionalDirectiveTrivia list) = + let private getDefineExprs (hashDirectives: ConditionalDirectiveTrivia list) = let result = (([], []), hashDirectives) ||> List.fold (fun (contextExprs, exprAcc) hashLine -> @@ -257,9 +257,9 @@ module Defines = result - let satSolveMaxStepsMaxSteps = 100 + let private satSolveMaxStepsMaxSteps = 100 - let getOptimizedDefinesSets (hashDirectives: ConditionalDirectiveTrivia list) = + let private getOptimizedDefinesSets (hashDirectives: ConditionalDirectiveTrivia list) = let defineExprs = getDefineExprs hashDirectives match @@ -269,7 +269,7 @@ module Defines = | [] -> [ [] ] | xs -> xs - let getDefineCombination (hashDirectives: ConditionalDirectiveTrivia list) : DefineCombination list = + let internal getDefineCombination (hashDirectives: ConditionalDirectiveTrivia list) : DefineCombination list = [ yield [] // always include the empty defines set yield! getOptimizedDefinesSets hashDirectives yield! getIndividualDefine hashDirectives ] diff --git a/src/Fantomas.Core/FormatConfig.fs b/src/Fantomas.Core/FormatConfig.fs index e2abad7247..280891e571 100644 --- a/src/Fantomas.Core/FormatConfig.fs +++ b/src/Fantomas.Core/FormatConfig.fs @@ -15,12 +15,12 @@ type MultilineFormatterType = | CharacterWidth | NumberOfItems - static member ToConfigString(cfg: MultilineFormatterType) = + static member ToConfigString(cfg: MultilineFormatterType) : string = match cfg with | MultilineFormatterType.CharacterWidth -> "character_width" | MultilineFormatterType.NumberOfItems -> "number_of_items" - static member OfConfigString(cfgString: string) = + static member OfConfigString(cfgString: string) : MultilineFormatterType option = match cfgString with | "character_width" -> Some MultilineFormatterType.CharacterWidth | "number_of_items" -> Some MultilineFormatterType.NumberOfItems @@ -31,13 +31,13 @@ type MultilineBracketStyle = | Aligned | Stroustrup - static member ToConfigString(cfg: MultilineBracketStyle) = + static member ToConfigString(cfg: MultilineBracketStyle) : string = match cfg with | Cramped -> "cramped" | Aligned -> "aligned" | Stroustrup -> "stroustrup" - static member OfConfigString(cfgString: string) = + static member OfConfigString(cfgString: string) : MultilineBracketStyle option = match cfgString with | "cramped" -> Some Cramped | "aligned" -> Some Aligned @@ -50,25 +50,25 @@ type EndOfLineStyle = | CR | CRLF - member x.NewLineString = + member x.NewLineString: string = match x with | LF -> "\n" | CR -> "\r" | CRLF -> "\r\n" - static member FromEnvironment = + static member FromEnvironment: EndOfLineStyle = match Environment.NewLine with | "\n" -> LF | "\r\n" -> CRLF | other -> failwithf "Unknown system newline string found: %s" other - static member ToConfigString(eol: EndOfLineStyle) = + static member ToConfigString(eol: EndOfLineStyle) : string = match eol with | EndOfLineStyle.LF -> "lf" | EndOfLineStyle.CR -> "cr" | EndOfLineStyle.CRLF -> "crlf" - static member OfConfigString(eolString: string) = + static member OfConfigString(eolString: string) : EndOfLineStyle option = match eolString with | "lf" -> Some EndOfLineStyle.LF | "cr" -> failwith "Carriage returns are not valid for F# code, please use one of 'lf' or 'crlf'" @@ -229,9 +229,9 @@ type FormatConfig = [] ExperimentalElmish: bool } - member x.IsStroustrupStyle = x.MultilineBracketStyle = Stroustrup + member x.IsStroustrupStyle: bool = x.MultilineBracketStyle = Stroustrup - static member Default = + static member Default: FormatConfig = { IndentSize = 4 MaxLineLength = 120 EndOfLine = EndOfLineStyle.FromEnvironment diff --git a/src/Fantomas.Core/MultipleDefineCombinations.fs b/src/Fantomas.Core/MultipleDefineCombinations.fs index 7986565152..e07269df82 100644 --- a/src/Fantomas.Core/MultipleDefineCombinations.fs +++ b/src/Fantomas.Core/MultipleDefineCombinations.fs @@ -14,7 +14,7 @@ open Fantomas.FCS.Text /// When the code needs to be compared, a CustomComparison is used to determine which fragment we are interested in. [] [] -type CodeFragment = +type private CodeFragment = /// Any line that starts with `#if`, `#else` or `#endif` | HashLine of line: string * defines: DefineCombination /// Content found between two HashLines @@ -22,19 +22,19 @@ type CodeFragment = /// When two HashLines follow each other without any content in between. | NoContent of defines: DefineCombination - member x.Defines = + member x.Defines: DefineCombination = match x with | HashLine(defines = defines) | Content(defines = defines) | NoContent(defines = defines) -> defines - member x.LineCount = + member x.LineCount: int = match x with | HashLine _ -> 1 | Content(lineCount = lineCount) -> lineCount | NoContent _ -> 0 - override x.Equals(other: obj) = + override x.Equals(other: obj) : bool = match other with | :? CodeFragment as other -> match x, other with @@ -44,7 +44,7 @@ type CodeFragment = | _ -> false | _ -> false - override x.GetHashCode() = + override x.GetHashCode() : int = match x with | HashLine(line, defineCombination) -> {| line = line @@ -107,19 +107,19 @@ type CodeFragment = | x, other -> failwith $"Cannot compare %A{x} with %A{other}" [] -type FormatResultForDefines = +type private FormatResultForDefines = { Result: FormatResult Defines: DefineCombination Fragments: CodeFragment list } /// Accumulator type used when building up the fragments. [] -type SplitHashState = +type private SplitHashState = { CurrentBuilder: StringBuilder LinesCollected: int LastLineInfo: LastLineInfo } - static member Zero = + static member Zero: SplitHashState = { CurrentBuilder = StringBuilder() LastLineInfo = LastLineInfo.None LinesCollected = 0 } @@ -131,18 +131,18 @@ and [] LastLineInfo = /// Accumulator type used when folding over the selected CodeFragments. [] -type FragmentWeaverState = +type private FragmentWeaverState = { LastLine: int Cursors: Map ContentBuilder: StringBuilder FoundCursor: (DefineCombination * pos) option } -let stringBuilderResult (builder: StringBuilder) = builder.ToString() +let private stringBuilderResult (builder: StringBuilder) = builder.ToString() -let hashRegex = @"^\s*#(if|elseif|else|endif).*" +let private hashRegex = @"^\s*#(if|elseif|else|endif).*" /// Split the given `source` into the matching `CodeFragments`. -let splitWhenHash (defines: DefineCombination) (newline: string) (source: string) : CodeFragment list = +let private splitWhenHash (defines: DefineCombination) (newline: string) (source: string) : CodeFragment list = let lines = source.Split([| newline |], options = StringSplitOptions.None) let mutable fragmentsBuilder = ListCollector() @@ -187,7 +187,10 @@ let splitWhenHash (defines: DefineCombination) (newline: string) (source: string fragmentsBuilder.Close() -let mergeMultipleFormatResults config (results: (DefineCombination * FormatResult) list) : FormatResult = +let mergeMultipleFormatResults + (config: FormatConfig) + (results: (DefineCombination * FormatResult) list) + : FormatResult = let allInFragments: FormatResultForDefines list = results |> List.map (fun (dc, result) -> diff --git a/src/Fantomas.Core/RangeHelpers.fs b/src/Fantomas.Core/RangeHelpers.fs index 16f3863cd6..7109a27e00 100644 --- a/src/Fantomas.Core/RangeHelpers.fs +++ b/src/Fantomas.Core/RangeHelpers.fs @@ -6,10 +6,10 @@ open Fantomas.FCS.Text module RangeHelpers = /// Checks if Range B is fully contained by Range A - let rangeContainsRange (a: Range) (b: Range) = + let rangeContainsRange (a: Range) (b: Range) : bool = Position.posGeq b.Start a.Start && Position.posGeq a.End b.End - let rangeEq = Range.equals + let rangeEq: range -> range -> bool = Range.equals let isAdjacentTo (r1: Range) (r2: Range) : bool = r1.FileName = r2.FileName @@ -28,17 +28,17 @@ module RangeHelpers = startRange, endRange module RangePatterns = - let (|StartEndRange|) (size: int) (range: range) = + let (|StartEndRange|) (size: int) (range: range) : range * range * range = let o, c = RangeHelpers.mkStartEndRange size range o, range, c - let (|StartRange|) (size: int) (range: range) = + let (|StartRange|) (size: int) (range: range) : range * range = let startRange = Range.mkRange range.FileName range.Start (Position.mkPos range.StartLine (range.StartColumn + size)) startRange, range - let (|EndRange|) (size: int) (range: range) = + let (|EndRange|) (size: int) (range: range) : range * range = let endRange = Range.mkRange range.FileName (Position.mkPos range.EndLine (range.EndColumn - size)) range.End diff --git a/src/Fantomas.Core/Selection.fs b/src/Fantomas.Core/Selection.fs index 9909d7ad00..6a089d1509 100644 --- a/src/Fantomas.Core/Selection.fs +++ b/src/Fantomas.Core/Selection.fs @@ -4,7 +4,7 @@ open Fantomas.FCS.Text open Fantomas.Core.SyntaxOak open Fantomas.Core.ISourceTextExtensions -let correctSelection (fileIndex: int) (sourceText: ISourceText) (selection: range) = +let private correctSelection (fileIndex: int) (sourceText: ISourceText) (selection: range) = let lines = [| selection.StartLine .. selection.EndLine |] |> Array.choose (fun lineNumber -> @@ -62,7 +62,7 @@ let correctSelection (fileIndex: int) (sourceText: ISourceText) (selection: rang selection | _ -> selection -let findNode (selection: range) (node: Node) : Node option = +let private findNode (selection: range) (node: Node) : Node option = let isExactSelection = selection.StartLine = node.Range.StartLine && selection.StartColumn = node.Range.StartColumn @@ -91,18 +91,18 @@ let mkOakFromModuleDecl (md: ModuleDecl) : TreeForSelection = /// For example when formatting a type definition: `let (a: int list) = []` /// If the selection is `int list` we cannot just drop that in an empty file and format it. /// We can fake a binding (or type alias) and later try and select the formatted type. -let mkExtractableOakFromModule (md: ModuleDecl) (t: System.Type) = +let private mkExtractableOakFromModule (md: ModuleDecl) (t: System.Type) = let m = (ModuleDecl.Node md).Range TreeForSelection.RequiresExtraction(Oak([], [ ModuleOrNamespaceNode(None, [ md ], m) ], m), t) -let dummyUnit: Expr = +let private dummyUnit: Expr = UnitNode(SingleTextNode("(", Range.Zero), SingleTextNode(")", Range.Zero), Range.Zero) |> Constant.Unit |> Expr.Constant /// Wrap the selected node inside an anonymous module. /// Keep the original trivia of the ParsedInput so code comments could still be restored. -let mkTreeWithSingleNode (node: Node) : TreeForSelection = +let private mkTreeWithSingleNode (node: Node) : TreeForSelection = let m = node.Range match node with @@ -358,7 +358,7 @@ let printTriviaNode (node: Node) : unit = #endif // Find the first node that matches the type -let rec findRangeOf (t: System.Type) (root: Node) : range option = +let rec private findRangeOf (t: System.Type) (root: Node) : range option = if root.GetType() = t then Some root.Range else diff --git a/src/Fantomas.Core/SyntaxOak.fs b/src/Fantomas.Core/SyntaxOak.fs index d2cfb394b9..7b2be57462 100644 --- a/src/Fantomas.Core/SyntaxOak.fs +++ b/src/Fantomas.Core/SyntaxOak.fs @@ -12,8 +12,8 @@ type TriviaContent = | Cursor type TriviaNode(content: TriviaContent, range: range) = - member val Content = content - member val Range = range + member val Content: TriviaContent = content + member val Range: range = range [] type Node = @@ -36,7 +36,7 @@ type NodeBase(range: range) = member _.ContentBefore: TriviaNode seq = nodesBefore - member _.HasContentBefore = + member _.HasContentBefore: bool = nodesBefore |> Seq.filter (fun tn -> match tn.Content with @@ -47,7 +47,7 @@ type NodeBase(range: range) = member _.ContentAfter: TriviaNode seq = nodesAfter - member _.HasContentAfter = + member _.HasContentAfter: bool = nodesAfter |> Seq.filter (fun tn -> match tn.Content with @@ -56,12 +56,12 @@ type NodeBase(range: range) = |> Seq.isEmpty |> not - member _.Range = range - member _.AddBefore triviaNode = nodesBefore.Enqueue triviaNode - member _.AddAfter triviaNode = nodesAfter.Enqueue triviaNode + member _.Range: range = range + member _.AddBefore(triviaNode: TriviaNode) : unit = nodesBefore.Enqueue triviaNode + member _.AddAfter(triviaNode: TriviaNode) : unit = nodesAfter.Enqueue triviaNode abstract member Children: Node array - member _.AddCursor cursor = potentialCursor <- Some cursor - member _.TryGetCursor = potentialCursor + member _.AddCursor(cursor: pos) : unit = potentialCursor <- Some cursor + member _.TryGetCursor: pos option = potentialCursor interface Node with member x.ContentBefore = x.ContentBefore @@ -77,19 +77,19 @@ type NodeBase(range: range) = type StringNode(content: string, range: range) = inherit NodeBase(range) - member val Content = content - override val Children = Array.empty + member val Content: string = content + override val Children: SyntaxOak.Node array = Array.empty -let noa<'n when 'n :> Node> (n: 'n option) = +let noa<'n when 'n :> Node> (n: 'n option) : Node array = match n with | None -> Array.empty | Some n -> [| n :> Node |] -let nodes<'n when 'n :> Node> (ns: 'n seq) = Seq.cast ns +let nodes<'n when 'n :> Node> (ns: 'n seq) : Node seq = Seq.cast ns -let nodeRange (n: Node) = n.Range +let nodeRange (n: Node) : range = n.Range -let combineRanges (ranges: range seq) = +let combineRanges (ranges: range seq) : range = if Seq.isEmpty ranges then Range.Zero else @@ -101,19 +101,19 @@ type IdentifierOrDot = | KnownDot of SingleTextNode | UnknownDot - member x.Range = + member x.Range: range option = match x with | Ident n -> Some n.Range | KnownDot n -> Some n.Range | UnknownDot -> None -type IdentListNode(content: IdentifierOrDot list, range) = +type IdentListNode(content: IdentifierOrDot list, range: range) = inherit NodeBase(range) - member val IsEmpty = content.IsEmpty - member val Content = content - static member Empty = IdentListNode(List.empty, Range.Zero) + member val IsEmpty: bool = content.IsEmpty + member val Content: IdentifierOrDot list = content + static member Empty: IdentListNode = IdentListNode(List.empty, Range.Zero) - override x.Children = + override x.Children: SyntaxOak.Node array = x.Content |> List.choose (function | IdentifierOrDot.Ident n -> Some(n :> Node) @@ -123,33 +123,33 @@ type IdentListNode(content: IdentifierOrDot list, range) = type SingleTextNode(idText: string, range: range) = inherit NodeBase(range) - member val Text = idText - override val Children = Array.empty + member val Text: string = idText + override val Children: SyntaxOak.Node array = Array.empty -type MultipleTextsNode(content: SingleTextNode list, range) = +type MultipleTextsNode(content: SingleTextNode list, range: range) = inherit NodeBase(range) override val Children: Node array = [| yield! nodes content |] - member val Content = content + member val Content: SingleTextNode list = content -type XmlDocNode(lines: string array, range) = +type XmlDocNode(lines: string array, range: range) = inherit NodeBase(range) - override val Children = Array.empty - member val Lines = lines + override val Children: SyntaxOak.Node array = Array.empty + member val Lines: string array = lines type Oak(parsedHashDirectives: ParsedHashDirectiveNode list, modulesOrNamespaces: ModuleOrNamespaceNode list, m: range) = inherit NodeBase(m) - member val ParsedHashDirectives = parsedHashDirectives - member val ModulesOrNamespaces = modulesOrNamespaces + member val ParsedHashDirectives: ParsedHashDirectiveNode list = parsedHashDirectives + member val ModulesOrNamespaces: ModuleOrNamespaceNode list = modulesOrNamespaces override val Children: Node array = [| yield! nodes parsedHashDirectives; yield! nodes modulesOrNamespaces |] -type ParsedHashDirectiveNode(ident: string, args: SingleTextNode list, range) = +type ParsedHashDirectiveNode(ident: string, args: SingleTextNode list, range: range) = inherit NodeBase(range) - member val Ident = ident - member val Args = args + member val Ident: string = ident + member val Args: SingleTextNode list = args override val Children: Node array = [| yield! nodes args |] type ModuleOrNamespaceHeaderNode @@ -160,7 +160,7 @@ type ModuleOrNamespaceHeaderNode accessibility: SingleTextNode option, isRecursive: bool, name: IdentListNode option, - range + range: range ) = inherit NodeBase(range) @@ -171,22 +171,22 @@ type ModuleOrNamespaceHeaderNode yield! noa accessibility yield! noa name |] - member val XmlDoc = xmlDoc - member val Attributes = attributes - member val LeadingKeyword = leadingKeyword - member val Accessibility = accessibility - member val IsRecursive = isRecursive - member val Name = name + member val XmlDoc: XmlDocNode option = xmlDoc + member val Attributes: MultipleAttributeListNode option = attributes + member val LeadingKeyword: MultipleTextsNode = leadingKeyword + member val Accessibility: SingleTextNode option = accessibility + member val IsRecursive: bool = isRecursive + member val Name: IdentListNode option = name -type ModuleOrNamespaceNode(header: ModuleOrNamespaceHeaderNode option, decls: ModuleDecl list, range) = +type ModuleOrNamespaceNode(header: ModuleOrNamespaceHeaderNode option, decls: ModuleDecl list, range: range) = inherit NodeBase(range) - member val Declarations = decls - member val IsNamed = Option.isSome header + member val Declarations: ModuleDecl list = decls + member val IsNamed: bool = Option.isSome header override val Children: Node array = [| yield! noa header; yield! List.map ModuleDecl.Node decls |] - member val Header = header + member val Header: ModuleOrNamespaceHeaderNode option = header -type TypeFunsNode(parameters: (Type * SingleTextNode) list, returnType: Type, range) = +type TypeFunsNode(parameters: (Type * SingleTextNode) list, returnType: Type, range: range) = inherit NodeBase(range) override val Children: Node array = @@ -194,10 +194,10 @@ type TypeFunsNode(parameters: (Type * SingleTextNode) list, returnType: Type, ra yield Type.Node returnType |] /// Type + arrow - member val Parameters = parameters - member val ReturnType = returnType + member val Parameters: (Type * SingleTextNode) list = parameters + member val ReturnType: Type = returnType -type TypeTupleNode(path: Choice list, range) = +type TypeTupleNode(path: Choice list, range: range) = inherit NodeBase(range) override val Children: Node array = @@ -208,46 +208,46 @@ type TypeTupleNode(path: Choice list, range) = | Choice2Of2 n -> n :> Node) path |] - member val Path = path + member val Path: Choice list = path -type TypeHashConstraintNode(hash: SingleTextNode, t: Type, range) = +type TypeHashConstraintNode(hash: SingleTextNode, t: Type, range: range) = inherit NodeBase(range) override val Children: Node array = [| yield hash; yield Type.Node t |] - member val Hash = hash - member val Type = t + member val Hash: SingleTextNode = hash + member val Type: Type = t -type TypeMeasurePowerNode(baseMeasure: Type, exponent: RationalConstNode, range) = +type TypeMeasurePowerNode(baseMeasure: Type, exponent: RationalConstNode, range: range) = inherit NodeBase(range) override val Children: Node array = [| yield Type.Node baseMeasure |] - member val BaseMeasure = baseMeasure - member val Exponent = exponent + member val BaseMeasure: Type = baseMeasure + member val Exponent: RationalConstNode = exponent -type TypeStaticConstantExprNode(constNode: SingleTextNode, expr: Expr, range) = +type TypeStaticConstantExprNode(constNode: SingleTextNode, expr: Expr, range: range) = inherit NodeBase(range) override val Children: Node array = [| yield constNode; yield Expr.Node expr |] - member val Const = constNode - member val Expr = expr + member val Const: SingleTextNode = constNode + member val Expr: Expr = expr -type TypeStaticConstantNamedNode(identifier: Type, value: Type, range) = +type TypeStaticConstantNamedNode(identifier: Type, value: Type, range: range) = inherit NodeBase(range) override val Children: Node array = [| yield Type.Node identifier; yield Type.Node value |] - member val Identifier = identifier - member val Value = value + member val Identifier: Type = identifier + member val Value: Type = value -type TypeArrayNode(t: Type, rank: int, range) = +type TypeArrayNode(t: Type, rank: int, range: range) = inherit NodeBase(range) override val Children: Node array = [| yield Type.Node t |] - member val Type = t - member val Rank = rank + member val Type: Type = t + member val Rank: int = rank -type TypeAppPostFixNode(first: Type, last: Type, range) = +type TypeAppPostFixNode(first: Type, last: Type, range: range) = inherit NodeBase(range) override val Children: Node array = [| yield Type.Node first; yield Type.Node last |] - member val First = first - member val Last = last + member val First: Type = first + member val Last: Type = last type TypeAppPrefixNode ( @@ -256,7 +256,7 @@ type TypeAppPrefixNode lessThan: SingleTextNode, arguments: Type list, greaterThan: SingleTextNode, - range + range: range ) = inherit NodeBase(range) @@ -267,14 +267,14 @@ type TypeAppPrefixNode yield! (List.map Type.Node arguments) yield greaterThan |] - member val Identifier = identifier - member val PostIdentifier = postIdentifier - member val GreaterThan = greaterThan - member val Arguments = arguments - member val LessThen = lessThan + member val Identifier: Type = identifier + member val PostIdentifier: IdentListNode option = postIdentifier + member val GreaterThan: SingleTextNode = greaterThan + member val Arguments: Type list = arguments + member val LessThen: SingleTextNode = lessThan type TypeStructTupleNode - (keyword: SingleTextNode, path: Choice list, closingParen: SingleTextNode, range) = + (keyword: SingleTextNode, path: Choice list, closingParen: SingleTextNode, range: range) = inherit NodeBase(range) override val Children: Node array = @@ -287,17 +287,17 @@ type TypeStructTupleNode path yield closingParen |] - member val Keyword = keyword - member val Path = path - member val ClosingParen = closingParen + member val Keyword: SingleTextNode = keyword + member val Path: Choice list = path + member val ClosingParen: SingleTextNode = closingParen -type TypeWithGlobalConstraintsNode(t: Type, constraints: TypeConstraint list, range) = +type TypeWithGlobalConstraintsNode(t: Type, constraints: TypeConstraint list, range: range) = inherit NodeBase(range) override val Children: Node array = [| yield Type.Node t; yield! List.map TypeConstraint.Node constraints |] - member val Type = t - member val TypeConstraints = constraints + member val Type: Type = t + member val TypeConstraints: TypeConstraint list = constraints type TypeAnonRecordNode ( @@ -305,7 +305,7 @@ type TypeAnonRecordNode openingToken: SingleTextNode option, fields: (SingleTextNode * Type) list, closingToken: SingleTextNode, - range + range: range ) = inherit NodeBase(range) @@ -315,42 +315,42 @@ type TypeAnonRecordNode yield! (fields |> List.collect (fun (i, t) -> [ yield (i :> Node); yield Type.Node t ])) yield closingToken |] - member val Struct = structNode - member val Opening = openingToken - member val Fields = fields - member val Closing = closingToken + member val Struct: SingleTextNode option = structNode + member val Opening: SingleTextNode option = openingToken + member val Fields: (SingleTextNode * Type) list = fields + member val Closing: SingleTextNode = closingToken -type TypeParenNode(openingParen: SingleTextNode, t: Type, closingParen: SingleTextNode, range) = +type TypeParenNode(openingParen: SingleTextNode, t: Type, closingParen: SingleTextNode, range: range) = inherit NodeBase(range) override val Children: Node array = [| yield openingParen; yield Type.Node t; yield closingParen |] - member val OpeningParen = openingParen - member val Type = t - member val ClosingParen = closingParen + member val OpeningParen: SingleTextNode = openingParen + member val Type: Type = t + member val ClosingParen: SingleTextNode = closingParen type TypeSignatureParameterNode - (attributes: MultipleAttributeListNode option, identifier: SingleTextNode option, t: Type, range) = + (attributes: MultipleAttributeListNode option, identifier: SingleTextNode option, t: Type, range: range) = inherit NodeBase(range) override val Children: Node array = [| yield! noa attributes; yield! noa identifier; yield Type.Node t |] - member val Attributes = attributes - member val Identifier = identifier - member val Type = t + member val Attributes: MultipleAttributeListNode option = attributes + member val Identifier: SingleTextNode option = identifier + member val Type: Type = t -type TypeOrNode(lhs: Type, orNode: SingleTextNode, rhs: Type, range) = +type TypeOrNode(lhs: Type, orNode: SingleTextNode, rhs: Type, range: range) = inherit NodeBase(range) override val Children: Node array = [| yield Type.Node lhs; yield orNode; yield Type.Node rhs |] - member val LeftHandSide = lhs - member val Or = orNode - member val RightHandSide = rhs + member val LeftHandSide: Type = lhs + member val Or: SingleTextNode = orNode + member val RightHandSide: Type = rhs -type TypeLongIdentAppNode(appType: Type, longIdent: IdentListNode, range) = +type TypeLongIdentAppNode(appType: Type, longIdent: IdentListNode, range: range) = inherit NodeBase(range) override val Children: Node array = [| yield Type.Node appType; yield longIdent |] - member val AppType = appType - member val LongIdent = longIdent + member val AppType: Type = appType + member val LongIdent: IdentListNode = longIdent -type TypeIntersectionNode(typesAndSeparators: Choice list, range) = +type TypeIntersectionNode(typesAndSeparators: Choice list, range: range) = inherit NodeBase(range) override val Children: Node array = @@ -359,7 +359,7 @@ type TypeIntersectionNode(typesAndSeparators: Choice list, | Choice1Of2 t -> Type.Node t | Choice2Of2 amp -> amp |] - member val TypesAndSeparators = typesAndSeparators + member val TypesAndSeparators: Choice list = typesAndSeparators [] type Type = @@ -412,7 +412,7 @@ type Type = | Intersection n -> n /// A pattern composed from a left hand-side pattern, a single text token/operator and a right hand-side pattern. -type PatLeftMiddleRight(lhs: Pattern, middle: Choice, rhs: Pattern, range) = +type PatLeftMiddleRight(lhs: Pattern, middle: Choice, rhs: Pattern, range: range) = inherit NodeBase(range) override val Children: Node array = @@ -422,17 +422,17 @@ type PatLeftMiddleRight(lhs: Pattern, middle: Choice, rh | _ -> () yield Pattern.Node rhs |] - member val LeftHandSide = lhs - member val Middle = middle - member val RightHandSide = rhs + member val LeftHandSide: Pattern = lhs + member val Middle: Choice = middle + member val RightHandSide: Pattern = rhs -type PatAndsNode(pats: Pattern list, range) = +type PatAndsNode(pats: Pattern list, range: range) = inherit NodeBase(range) override val Children: Node array = [| yield! List.map Pattern.Node pats |] - member val Patterns = pats + member val Patterns: Pattern list = pats -type PatParameterNode(attributes: MultipleAttributeListNode option, pat: Pattern, t: Type option, range) = +type PatParameterNode(attributes: MultipleAttributeListNode option, pat: Pattern, t: Type option, range: range) = inherit NodeBase(range) override val Children: Node array = @@ -440,9 +440,9 @@ type PatParameterNode(attributes: MultipleAttributeListNode option, pat: Pattern yield Pattern.Node pat yield! noa (Option.map Type.Node t) |] - member val Attributes = attributes - member val Pattern = pat - member val Type = t + member val Attributes: MultipleAttributeListNode option = attributes + member val Pattern: Pattern = pat + member val Type: Type option = t type PatNamedParenStarIdentNode ( @@ -450,7 +450,7 @@ type PatNamedParenStarIdentNode openingParen: SingleTextNode, name: SingleTextNode, closingParen: SingleTextNode, - range + range: range ) = inherit NodeBase(range) @@ -460,24 +460,24 @@ type PatNamedParenStarIdentNode yield name yield closingParen |] - member val Accessibility = accessibility - member val OpeningParen = openingParen - member val Name = name - member val ClosingParen = closingParen + member val Accessibility: SingleTextNode option = accessibility + member val OpeningParen: SingleTextNode = openingParen + member val Name: SingleTextNode = name + member val ClosingParen: SingleTextNode = closingParen -type PatNamedNode(accessibility: SingleTextNode option, name: SingleTextNode, range) = +type PatNamedNode(accessibility: SingleTextNode option, name: SingleTextNode, range: range) = inherit NodeBase(range) override val Children: Node array = [| yield name |] - member val Name = name - member val Accessibility = accessibility + member val Name: SingleTextNode = name + member val Accessibility: SingleTextNode option = accessibility -type NamePatPair(ident: SingleTextNode, equals: SingleTextNode, pat: Pattern, range) = +type NamePatPair(ident: SingleTextNode, equals: SingleTextNode, pat: Pattern, range: range) = inherit NodeBase(range) override val Children: Node array = [| yield ident; yield equals; yield Pattern.Node pat |] - member val Ident = ident - member val Equals = equals - member val Pattern = pat + member val Ident: SingleTextNode = ident + member val Equals: SingleTextNode = equals + member val Pattern: Pattern = pat type PatNamePatPairsNode ( @@ -486,7 +486,7 @@ type PatNamePatPairsNode openingParen: SingleTextNode, pairs: NamePatPair list, closingParen: SingleTextNode, - range + range: range ) = inherit NodeBase(range) @@ -497,11 +497,11 @@ type PatNamePatPairsNode yield! nodes pairs yield closingParen |] - member val Identifier = identifier - member val TyparDecls = typarDecls - member val OpeningParen = openingParen - member val Pairs = pairs - member val ClosingParen = closingParen + member val Identifier: IdentListNode = identifier + member val TyparDecls: TyparDecls option = typarDecls + member val OpeningParen: SingleTextNode = openingParen + member val Pairs: NamePatPair list = pairs + member val ClosingParen: SingleTextNode = closingParen type PatLongIdentNode ( @@ -509,7 +509,7 @@ type PatLongIdentNode identifier: IdentListNode, typarDecls: TyparDecls option, parameters: Pattern list, - range + range: range ) = inherit NodeBase(range) @@ -519,21 +519,21 @@ type PatLongIdentNode yield! noa (Option.map TyparDecls.Node typarDecls) yield! List.map Pattern.Node parameters |] - member val Accessibility = accessibility - member val Identifier = identifier - member val TyparDecls = typarDecls - member val Parameters = parameters + member val Accessibility: SingleTextNode option = accessibility + member val Identifier: IdentListNode = identifier + member val TyparDecls: TyparDecls option = typarDecls + member val Parameters: Pattern list = parameters -type PatParenNode(openingParen: SingleTextNode, pat: Pattern, closingParen: SingleTextNode, range) = +type PatParenNode(openingParen: SingleTextNode, pat: Pattern, closingParen: SingleTextNode, range: range) = inherit NodeBase(range) override val Children: Node array = [| yield openingParen; yield Pattern.Node pat; yield closingParen |] - member val OpeningParen = openingParen - member val Pattern = pat - member val ClosingParen = closingParen + member val OpeningParen: SingleTextNode = openingParen + member val Pattern: Pattern = pat + member val ClosingParen: SingleTextNode = closingParen -type PatTupleNode(items: Choice list, range) = +type PatTupleNode(items: Choice list, range: range) = inherit NodeBase(range) override val Children: Node array = @@ -542,47 +542,48 @@ type PatTupleNode(items: Choice list, range) = | Choice1Of2 p -> Pattern.Node p | Choice2Of2 comma -> comma |] - member val Items = items + member val Items: Choice list = items -type PatStructTupleNode(pats: Pattern list, range) = +type PatStructTupleNode(pats: Pattern list, range: range) = inherit NodeBase(range) override val Children: Node array = [| yield! (List.map Pattern.Node pats) |] - member val Patterns = pats + member val Patterns: Pattern list = pats -type PatArrayOrListNode(openToken: SingleTextNode, pats: Pattern list, closeToken: SingleTextNode, range) = +type PatArrayOrListNode(openToken: SingleTextNode, pats: Pattern list, closeToken: SingleTextNode, range: range) = inherit NodeBase(range) override val Children: Node array = [| yield openToken; yield! List.map Pattern.Node pats; yield closeToken |] - member val OpenToken = openToken - member val Patterns = pats - member val CloseToken = closeToken + member val OpenToken: SingleTextNode = openToken + member val Patterns: Pattern list = pats + member val CloseToken: SingleTextNode = closeToken type PatRecordField - (prefix: IdentListNode option, fieldName: SingleTextNode, equals: SingleTextNode, pat: Pattern, range) = + (prefix: IdentListNode option, fieldName: SingleTextNode, equals: SingleTextNode, pat: Pattern, range: range) = inherit NodeBase(range) override val Children: Node array = [| yield! noa prefix; yield fieldName; yield equals; yield Pattern.Node pat |] - member val Prefix = prefix - member val FieldName = fieldName - member val Equals = equals - member val Pattern = pat + member val Prefix: IdentListNode option = prefix + member val FieldName: SingleTextNode = fieldName + member val Equals: SingleTextNode = equals + member val Pattern: Pattern = pat -type PatRecordNode(openingNode: SingleTextNode, fields: PatRecordField list, closingNode: SingleTextNode, range) = +type PatRecordNode(openingNode: SingleTextNode, fields: PatRecordField list, closingNode: SingleTextNode, range: range) + = inherit NodeBase(range) override val Children: Node array = [| yield openingNode; yield! nodes fields; yield closingNode |] - member val OpeningNode = openingNode - member val Fields = fields - member val ClosingNode = closingNode + member val OpeningNode: SingleTextNode = openingNode + member val Fields: PatRecordField list = fields + member val ClosingNode: SingleTextNode = closingNode -type PatIsInstNode(token: SingleTextNode, t: Type, range) = +type PatIsInstNode(token: SingleTextNode, t: Type, range: range) = inherit NodeBase(range) override val Children: Node array = [| yield token; yield Type.Node t |] - member val Token = token - member val Type = t + member val Token: SingleTextNode = token + member val Type: Type = t [] type Pattern = @@ -632,60 +633,60 @@ type Pattern = | IsInst n -> n | QuoteExpr n -> n -type ExprLazyNode(lazyWord: SingleTextNode, expr: Expr, range) = +type ExprLazyNode(lazyWord: SingleTextNode, expr: Expr, range: range) = inherit NodeBase(range) override val Children: Node array = [| yield lazyWord; yield Expr.Node expr |] - member val LazyWord = lazyWord - member val Expr = expr + member val LazyWord: SingleTextNode = lazyWord + member val Expr: Expr = expr - member val ExprIsInfix = + member val ExprIsInfix: bool = match Expr.Node expr with | :? InfixApp -> true | _ -> false -type ExprSingleNode(leading: SingleTextNode, addSpace: bool, supportsStroustrup: bool, expr: Expr, range) = +type ExprSingleNode(leading: SingleTextNode, addSpace: bool, supportsStroustrup: bool, expr: Expr, range: range) = inherit NodeBase(range) override val Children: Node array = [| yield leading; yield Expr.Node expr |] - member val Leading = leading - member val AddSpace = addSpace - member val SupportsStroustrup = supportsStroustrup - member val Expr = expr + member val Leading: SingleTextNode = leading + member val AddSpace: bool = addSpace + member val SupportsStroustrup: bool = supportsStroustrup + member val Expr: Expr = expr -type ExprConstantNode(range) = +type ExprConstantNode(range: range) = inherit NodeBase(range) override val Children: Node array = failwith "todo" -type ExprQuoteNode(openToken: SingleTextNode, expr, closeToken: SingleTextNode, range) = +type ExprQuoteNode(openToken: SingleTextNode, expr: Expr, closeToken: SingleTextNode, range: range) = inherit NodeBase(range) override val Children: Node array = [| yield openToken; yield Expr.Node expr; yield closeToken |] - member val OpenToken = openToken - member val Expr = expr - member val CloseToken = closeToken + member val OpenToken: SingleTextNode = openToken + member val Expr: Expr = expr + member val CloseToken: SingleTextNode = closeToken -type ExprTypedNode(expr: Expr, operator: string, t: Type, range) = +type ExprTypedNode(expr: Expr, operator: string, t: Type, range: range) = inherit NodeBase(range) override val Children: Node array = [| yield Expr.Node expr; yield Type.Node t |] - member val Expr = expr - member val Operator = operator - member val Type = t + member val Expr: Expr = expr + member val Operator: string = operator + member val Type: Type = t -type ExprNewNode(newKeyword: SingleTextNode, t: Type, arguments: Expr, range) = +type ExprNewNode(newKeyword: SingleTextNode, t: Type, arguments: Expr, range: range) = inherit NodeBase(range) override val Children: Node array = [| yield newKeyword; yield Type.Node t; yield Expr.Node arguments |] - member val NewKeyword = newKeyword - member val Type = t - member val Arguments = arguments + member val NewKeyword: SingleTextNode = newKeyword + member val Type: Type = t + member val Arguments: Expr = arguments -type ExprTupleNode(items: Choice list, range) = +type ExprTupleNode(items: Choice list, range: range) = inherit NodeBase(range) override val Children: Node array = @@ -695,34 +696,36 @@ type ExprTupleNode(items: Choice list, range) = | Choice2Of2 comma -> comma :> Node) |> Seq.toArray - member val Items = items + member val Items: Choice list = items -type ExprStructTupleNode(structNode: SingleTextNode, tuple: ExprTupleNode, closingParen: SingleTextNode, range) = +type ExprStructTupleNode(structNode: SingleTextNode, tuple: ExprTupleNode, closingParen: SingleTextNode, range: range) = inherit NodeBase(range) override val Children: Node array = [| yield structNode; yield tuple; yield closingParen |] - member val Struct = structNode - member val Tuple = tuple - member val ClosingParen = closingParen + member val Struct: SingleTextNode = structNode + member val Tuple: ExprTupleNode = tuple + member val ClosingParen: SingleTextNode = closingParen -type ExprArrayOrListNode(openingToken: SingleTextNode, elements: Expr list, closingToken: SingleTextNode, range) = +type ExprArrayOrListNode(openingToken: SingleTextNode, elements: Expr list, closingToken: SingleTextNode, range: range) + = inherit NodeBase(range) override val Children: Node array = [| yield openingToken; yield! List.map Expr.Node elements; yield closingToken |] - member val Opening = openingToken - member val Elements = elements - member val Closing = closingToken + member val Opening: SingleTextNode = openingToken + member val Elements: Expr list = elements + member val Closing: SingleTextNode = closingToken -type InheritConstructorTypeOnlyNode(inheritKeyword: SingleTextNode, t: Type, range) = +type InheritConstructorTypeOnlyNode(inheritKeyword: SingleTextNode, t: Type, range: range) = inherit NodeBase(range) override val Children: Node array = [| yield inheritKeyword; yield Type.Node t |] - member val InheritKeyword = inheritKeyword - member val Type = t + member val InheritKeyword: SingleTextNode = inheritKeyword + member val Type: Type = t type InheritConstructorUnitNode - (inheritKeyword: SingleTextNode, t: Type, openingParen: SingleTextNode, closingParen: SingleTextNode, range) = + (inheritKeyword: SingleTextNode, t: Type, openingParen: SingleTextNode, closingParen: SingleTextNode, range: range) + = inherit NodeBase(range) override val Children: Node array = @@ -731,28 +734,28 @@ type InheritConstructorUnitNode yield openingParen yield closingParen |] - member val InheritKeyword = inheritKeyword - member val Type = t - member val OpeningParen = openingParen - member val ClosingParen = closingParen + member val InheritKeyword: SingleTextNode = inheritKeyword + member val Type: Type = t + member val OpeningParen: SingleTextNode = openingParen + member val ClosingParen: SingleTextNode = closingParen -type InheritConstructorParenNode(inheritKeyword: SingleTextNode, t: Type, expr: Expr, range) = +type InheritConstructorParenNode(inheritKeyword: SingleTextNode, t: Type, expr: Expr, range: range) = inherit NodeBase(range) override val Children: Node array = [| yield inheritKeyword; yield Type.Node t; yield Expr.Node expr |] - member val InheritKeyword = inheritKeyword - member val Type = t - member val Expr = expr + member val InheritKeyword: SingleTextNode = inheritKeyword + member val Type: Type = t + member val Expr: Expr = expr -type InheritConstructorOtherNode(inheritKeyword: SingleTextNode, t: Type, expr: Expr, range) = +type InheritConstructorOtherNode(inheritKeyword: SingleTextNode, t: Type, expr: Expr, range: range) = inherit NodeBase(range) override val Children: Node array = [| yield inheritKeyword; yield Type.Node t; yield Expr.Node expr |] - member val InheritKeyword = inheritKeyword - member val Type = t - member val Expr = expr + member val InheritKeyword: SingleTextNode = inheritKeyword + member val Type: Type = t + member val Expr: Expr = expr [] type InheritConstructor = @@ -768,30 +771,30 @@ type InheritConstructor = | Paren n -> n | Other n -> n - member x.InheritKeyword = + member x.InheritKeyword: SingleTextNode = match x with | TypeOnly n -> n.InheritKeyword | Unit n -> n.InheritKeyword | Paren n -> n.InheritKeyword | Other n -> n.InheritKeyword -type RecordFieldNode(fieldName: IdentListNode, equals: SingleTextNode, expr: Expr, range) = +type RecordFieldNode(fieldName: IdentListNode, equals: SingleTextNode, expr: Expr, range: range) = inherit NodeBase(range) override val Children: Node array = [| yield fieldName; yield equals; yield Expr.Node expr |] - member val FieldName = fieldName - member val Equals = equals - member val Expr = expr + member val FieldName: IdentListNode = fieldName + member val Equals: SingleTextNode = equals + member val Expr: Expr = expr [] -type ExprRecordBaseNode(openingBrace: SingleTextNode, fields: RecordFieldNode list, closingBrace: SingleTextNode, range) - = +type ExprRecordBaseNode + (openingBrace: SingleTextNode, fields: RecordFieldNode list, closingBrace: SingleTextNode, range: range) = inherit NodeBase(range) - member val OpeningBrace = openingBrace - member val Fields = fields - member val ClosingBrace = closingBrace - member x.HasFields = List.isNotEmpty x.Fields + member val OpeningBrace: SingleTextNode = openingBrace + member val Fields: RecordFieldNode list = fields + member val ClosingBrace: SingleTextNode = closingBrace + member x.HasFields: bool = List.isNotEmpty x.Fields /// /// Represents a record instance, parsed from both `SynExpr.Record` and `SynExpr.AnonRecd`. @@ -802,11 +805,11 @@ type ExprRecordNode copyInfo: Expr option, fields: RecordFieldNode list, closingBrace: SingleTextNode, - range + range: range ) = inherit ExprRecordBaseNode(openingBrace, fields, closingBrace, range) - member val CopyInfo = copyInfo + member val CopyInfo: Expr option = copyInfo override val Children: Node array = [| yield openingBrace @@ -814,7 +817,7 @@ type ExprRecordNode yield! nodes fields yield closingBrace |] - member x.HasFields = List.isNotEmpty x.Fields + member x.HasFields: bool = List.isNotEmpty x.Fields type ExprAnonStructRecordNode ( @@ -823,10 +826,10 @@ type ExprAnonStructRecordNode copyInfo: Expr option, fields: RecordFieldNode list, closingBrace: SingleTextNode, - range + range: range ) = inherit ExprRecordNode(openingBrace, copyInfo, fields, closingBrace, range) - member val Struct = structNode + member val Struct: SingleTextNode = structNode override val Children: Node array = [| yield structNode @@ -841,11 +844,11 @@ type ExprInheritRecordNode inheritConstructor: InheritConstructor, fields: RecordFieldNode list, closingBrace: SingleTextNode, - range + range: range ) = inherit ExprRecordBaseNode(openingBrace, fields, closingBrace, range) - member val InheritConstructor = inheritConstructor + member val InheritConstructor: InheritConstructor = inheritConstructor override val Children: Node array = [| yield openingBrace @@ -860,7 +863,7 @@ type InterfaceImplNode withNode: SingleTextNode option, bindings: BindingNode list, members: MemberDefn list, - range + range: range ) = inherit NodeBase(range) @@ -872,11 +875,11 @@ type InterfaceImplNode yield! nodes bindings yield! List.map MemberDefn.Node members |] - member val Interface = interfaceNode - member val Type = t - member val With = withNode - member val Bindings = bindings - member val Members = members + member val Interface: SingleTextNode = interfaceNode + member val Type: Type = t + member val With: SingleTextNode option = withNode + member val Bindings: BindingNode list = bindings + member val Members: MemberDefn list = members type ExprObjExprNode ( @@ -889,7 +892,7 @@ type ExprObjExprNode members: MemberDefn list, interfaces: InterfaceImplNode list, closingBrace: SingleTextNode, - range + range: range ) = inherit NodeBase(range) @@ -904,24 +907,24 @@ type ExprObjExprNode yield! nodes interfaces yield closingBrace |] - member val OpeningBrace = openingBrace - member val New = newNode - member val Type = t - member val Expr = e - member val With = withNode - member val Bindings = bindings - member val Members = members - member val Interfaces = interfaces - member val ClosingBrace = closingBrace + member val OpeningBrace: SingleTextNode = openingBrace + member val New: SingleTextNode = newNode + member val Type: Type = t + member val Expr: Expr option = e + member val With: SingleTextNode option = withNode + member val Bindings: BindingNode list = bindings + member val Members: MemberDefn list = members + member val Interfaces: InterfaceImplNode list = interfaces + member val ClosingBrace: SingleTextNode = closingBrace -type ExprWhileNode(whileNode: SingleTextNode, whileExpr: Expr, doExpr: Expr, range) = +type ExprWhileNode(whileNode: SingleTextNode, whileExpr: Expr, doExpr: Expr, range: range) = inherit NodeBase(range) override val Children: Node array = [| yield whileNode; yield Expr.Node whileExpr; yield Expr.Node doExpr |] - member val While = whileNode - member val WhileExpr = whileExpr - member val DoExpr = doExpr + member val While: SingleTextNode = whileNode + member val WhileExpr: Expr = whileExpr + member val DoExpr: Expr = doExpr type ExprForNode ( @@ -932,7 +935,7 @@ type ExprForNode direction: bool, toBody: Expr, doBody: Expr, - range + range: range ) = inherit NodeBase(range) @@ -944,15 +947,16 @@ type ExprForNode yield Expr.Node toBody yield Expr.Node doBody |] - member val For = forNode - member val Ident = ident - member val Equals = equals - member val IdentBody = identBody - member val Direction = direction - member val ToBody = toBody - member val DoBody = doBody + member val For: SingleTextNode = forNode + member val Ident: SingleTextNode = ident + member val Equals: SingleTextNode = equals + member val IdentBody: Expr = identBody + member val Direction: bool = direction + member val ToBody: Expr = toBody + member val DoBody: Expr = doBody -type ExprForEachNode(forNode: SingleTextNode, pat: Pattern, enumExpr: Expr, isArrow: bool, bodyExpr: Expr, range) = +type ExprForEachNode(forNode: SingleTextNode, pat: Pattern, enumExpr: Expr, isArrow: bool, bodyExpr: Expr, range: range) + = inherit NodeBase(range) override val Children: Node array = @@ -961,14 +965,14 @@ type ExprForEachNode(forNode: SingleTextNode, pat: Pattern, enumExpr: Expr, isAr yield Expr.Node enumExpr yield Expr.Node bodyExpr |] - member val For = forNode - member val Pattern = pat - member val EnumExpr = enumExpr - member val IsArrow = isArrow - member val BodyExpr = bodyExpr + member val For: SingleTextNode = forNode + member val Pattern: Pattern = pat + member val EnumExpr: Expr = enumExpr + member val IsArrow: bool = isArrow + member val BodyExpr: Expr = bodyExpr type ExprNamedComputationNode - (nameExpr: Expr, openingBrace: SingleTextNode, bodyExpr: Expr, closingBrace: SingleTextNode, range) = + (nameExpr: Expr, openingBrace: SingleTextNode, bodyExpr: Expr, closingBrace: SingleTextNode, range: range) = inherit NodeBase(range) override val Children: Node array = @@ -977,27 +981,28 @@ type ExprNamedComputationNode yield Expr.Node bodyExpr yield closingBrace |] - member val Name = nameExpr - member val OpeningBrace = openingBrace - member val Body = bodyExpr - member val ClosingBrace = closingBrace + member val Name: Expr = nameExpr + member val OpeningBrace: SingleTextNode = openingBrace + member val Body: Expr = bodyExpr + member val ClosingBrace: SingleTextNode = closingBrace -type ExprComputationNode(openingBrace: SingleTextNode, bodyExpr: Expr, closingBrace: SingleTextNode, range) = +type ExprComputationNode(openingBrace: SingleTextNode, bodyExpr: Expr, closingBrace: SingleTextNode, range: range) = inherit NodeBase(range) override val Children: Node array = [| yield openingBrace; yield Expr.Node bodyExpr; yield closingBrace |] - member val OpeningBrace = openingBrace - member val Body = bodyExpr - member val ClosingBrace = closingBrace + member val OpeningBrace: SingleTextNode = openingBrace + member val Body: Expr = bodyExpr + member val ClosingBrace: SingleTextNode = closingBrace -type ExprLetOrUseNode(binding: BindingNode, inKeyword: SingleTextNode option, range) = +type ExprLetOrUseNode(binding: BindingNode, inKeyword: SingleTextNode option, range: range) = inherit NodeBase(range) override val Children: Node array = [| yield binding; yield! noa inKeyword |] - member val Binding = binding - member val In = inKeyword + member val Binding: BindingNode = binding + member val In: SingleTextNode option = inKeyword -type ExprLetOrUseBangNode(leadingKeyword: SingleTextNode, pat: Pattern, equals: SingleTextNode, expr: Expr, range) = +type ExprLetOrUseBangNode + (leadingKeyword: SingleTextNode, pat: Pattern, equals: SingleTextNode, expr: Expr, range: range) = inherit NodeBase(range) override val Children: Node array = @@ -1006,12 +1011,12 @@ type ExprLetOrUseBangNode(leadingKeyword: SingleTextNode, pat: Pattern, equals: yield equals yield Expr.Node expr |] - member val LeadingKeyword = leadingKeyword - member val Pattern = pat - member val Equals = equals - member val Expression = expr + member val LeadingKeyword: SingleTextNode = leadingKeyword + member val Pattern: Pattern = pat + member val Equals: SingleTextNode = equals + member val Expression: Expr = expr -type ExprAndBang(leadingKeyword: SingleTextNode, pat: Pattern, equals: SingleTextNode, expr: Expr, range) = +type ExprAndBang(leadingKeyword: SingleTextNode, pat: Pattern, equals: SingleTextNode, expr: Expr, range: range) = inherit NodeBase(range) override val Children: Node array = @@ -1020,10 +1025,10 @@ type ExprAndBang(leadingKeyword: SingleTextNode, pat: Pattern, equals: SingleTex yield equals yield Expr.Node expr |] - member val LeadingKeyword = leadingKeyword - member val Pattern = pat - member val Equals = equals - member val Expression = expr + member val LeadingKeyword: SingleTextNode = leadingKeyword + member val Pattern: Pattern = pat + member val Equals: SingleTextNode = equals + member val Expression: Expr = expr [] type ComputationExpressionStatement = @@ -1039,29 +1044,31 @@ type ComputationExpressionStatement = | AndBangStatement n -> n | OtherStatement o -> Expr.Node o -type ExprCompExprBodyNode(statements: ComputationExpressionStatement list, range) = +type ExprCompExprBodyNode(statements: ComputationExpressionStatement list, range: range) = inherit NodeBase(range) override val Children: Node array = [| yield! List.map ComputationExpressionStatement.Node statements |] - member val Statements = statements + member val Statements: ComputationExpressionStatement list = statements -type ExprJoinInNode(lhs: Expr, inNode: SingleTextNode, rhs: Expr, range) = +type ExprJoinInNode(lhs: Expr, inNode: SingleTextNode, rhs: Expr, range: range) = inherit NodeBase(range) override val Children: Node array = [| yield Expr.Node lhs; yield inNode; yield Expr.Node rhs |] - member val LeftHandSide = lhs - member val In = inNode - member val RightHandSide = rhs + member val LeftHandSide: Expr = lhs + member val In: SingleTextNode = inNode + member val RightHandSide: Expr = rhs -type ExprParenLambdaNode(openingParen: SingleTextNode, lambda: ExprLambdaNode, closingParen: SingleTextNode, range) = +type ExprParenLambdaNode + (openingParen: SingleTextNode, lambda: ExprLambdaNode, closingParen: SingleTextNode, range: range) = inherit NodeBase(range) override val Children: Node array = [| yield openingParen; yield lambda; yield closingParen |] - member val OpeningParen = openingParen - member val Lambda = lambda - member val ClosingParen = closingParen + member val OpeningParen: SingleTextNode = openingParen + member val Lambda: ExprLambdaNode = lambda + member val ClosingParen: SingleTextNode = closingParen -type ExprLambdaNode(funNode: SingleTextNode, parameters: Pattern list, arrow: SingleTextNode, expr: Expr, range) = +type ExprLambdaNode(funNode: SingleTextNode, parameters: Pattern list, arrow: SingleTextNode, expr: Expr, range: range) + = inherit NodeBase(range) override val Children: Node array = @@ -1070,14 +1077,20 @@ type ExprLambdaNode(funNode: SingleTextNode, parameters: Pattern list, arrow: Si yield arrow yield Expr.Node expr |] - member val Fun = funNode - member val Parameters = parameters - member val Arrow = arrow - member val Expr = expr + member val Fun: SingleTextNode = funNode + member val Parameters: Pattern list = parameters + member val Arrow: SingleTextNode = arrow + member val Expr: Expr = expr type MatchClauseNode - (bar: SingleTextNode option, pattern: Pattern, whenExpr: Expr option, arrow: SingleTextNode, bodyExpr: Expr, range) - = + ( + bar: SingleTextNode option, + pattern: Pattern, + whenExpr: Expr option, + arrow: SingleTextNode, + bodyExpr: Expr, + range: range + ) = inherit NodeBase(range) override val Children: Node array = @@ -1087,21 +1100,22 @@ type MatchClauseNode yield arrow yield Expr.Node bodyExpr |] - member val Bar = bar - member val Pattern = pattern - member val WhenExpr = whenExpr - member val Arrow = arrow - member val BodyExpr = bodyExpr + member val Bar: SingleTextNode option = bar + member val Pattern: Pattern = pattern + member val WhenExpr: Expr option = whenExpr + member val Arrow: SingleTextNode = arrow + member val BodyExpr: Expr = bodyExpr -type ExprMatchLambdaNode(functionNode: SingleTextNode, clauses: MatchClauseNode list, range) = +type ExprMatchLambdaNode(functionNode: SingleTextNode, clauses: MatchClauseNode list, range: range) = inherit NodeBase(range) override val Children: Node array = [| yield functionNode; yield! nodes clauses |] - member val Function = functionNode - member val Clauses = clauses + member val Function: SingleTextNode = functionNode + member val Clauses: MatchClauseNode list = clauses type ExprMatchNode - (matchNode: SingleTextNode, matchExpr: Expr, withNode: SingleTextNode, clauses: MatchClauseNode list, range) = + (matchNode: SingleTextNode, matchExpr: Expr, withNode: SingleTextNode, clauses: MatchClauseNode list, range: range) + = inherit NodeBase(range) override val Children: Node array = @@ -1110,55 +1124,55 @@ type ExprMatchNode yield withNode yield! nodes clauses |] - member val Match = matchNode - member val MatchExpr = matchExpr - member val With = withNode - member val Clauses = clauses + member val Match: SingleTextNode = matchNode + member val MatchExpr: Expr = matchExpr + member val With: SingleTextNode = withNode + member val Clauses: MatchClauseNode list = clauses -type ExprTraitCallNode(t: Type, md: MemberDefn, expr: Expr, range) = +type ExprTraitCallNode(t: Type, md: MemberDefn, expr: Expr, range: range) = inherit NodeBase(range) override val Children: Node array = [| yield Type.Node t; yield MemberDefn.Node md; yield Expr.Node expr |] - member val Type = t - member val MemberDefn = md - member val Expr = expr + member val Type: Type = t + member val MemberDefn: MemberDefn = md + member val Expr: Expr = expr type ExprParenFunctionNameWithStarNode - (openingParen: SingleTextNode, functionName: SingleTextNode, closingParen: SingleTextNode, range) = + (openingParen: SingleTextNode, functionName: SingleTextNode, closingParen: SingleTextNode, range: range) = inherit NodeBase(range) override val Children: Node array = [| yield openingParen; yield functionName; yield closingParen |] - member val OpeningParen = openingParen - member val FunctionName = functionName - member val ClosingParen = closingParen + member val OpeningParen: SingleTextNode = openingParen + member val FunctionName: SingleTextNode = functionName + member val ClosingParen: SingleTextNode = closingParen -type ExprParenNode(openingParen: SingleTextNode, expr: Expr, closingParen: SingleTextNode, range) = +type ExprParenNode(openingParen: SingleTextNode, expr: Expr, closingParen: SingleTextNode, range: range) = inherit NodeBase(range) override val Children: Node array = [| yield openingParen; yield Expr.Node expr; yield closingParen |] - member val OpeningParen = openingParen - member val Expr = expr - member val ClosingParen = closingParen + member val OpeningParen: SingleTextNode = openingParen + member val Expr: Expr = expr + member val ClosingParen: SingleTextNode = closingParen -type ExprDynamicNode(funcExpr: Expr, argExpr: Expr, range) = +type ExprDynamicNode(funcExpr: Expr, argExpr: Expr, range: range) = inherit NodeBase(range) override val Children: Node array = [| yield Expr.Node funcExpr; yield Expr.Node argExpr |] - member val FuncExpr = funcExpr - member val ArgExpr = argExpr + member val FuncExpr: Expr = funcExpr + member val ArgExpr: Expr = argExpr -type ExprPrefixAppNode(operator: SingleTextNode, expr: Expr, range) = +type ExprPrefixAppNode(operator: SingleTextNode, expr: Expr, range: range) = inherit NodeBase(range) override val Children: Node array = [| yield operator; yield Expr.Node expr |] - member val Operator = operator - member val Expr = expr + member val Operator: SingleTextNode = operator + member val Expr: Expr = expr type InfixApp = interface end -type ExprSameInfixAppsNode(leadingExpr: Expr, subsequentExpressions: (SingleTextNode * Expr) list, range) = +type ExprSameInfixAppsNode(leadingExpr: Expr, subsequentExpressions: (SingleTextNode * Expr) list, range: range) = inherit NodeBase(range) interface InfixApp @@ -1168,36 +1182,36 @@ type ExprSameInfixAppsNode(leadingExpr: Expr, subsequentExpressions: (SingleText [| yield Expr.Node leadingExpr; yield! xs |] - member val LeadingExpr = leadingExpr - member val SubsequentExpressions = subsequentExpressions + member val LeadingExpr: Expr = leadingExpr + member val SubsequentExpressions: (SingleTextNode * Expr) list = subsequentExpressions -type ExprInfixAppNode(lhs: Expr, operator: SingleTextNode, rhs: Expr, range) = +type ExprInfixAppNode(lhs: Expr, operator: SingleTextNode, rhs: Expr, range: range) = inherit NodeBase(range) interface InfixApp override val Children: Node array = [| yield Expr.Node lhs; yield operator; yield Expr.Node rhs |] - member val LeftHandSide = lhs + member val LeftHandSide: Expr = lhs member val RightHandSide: Expr = rhs - member val Operator = operator + member val Operator: SingleTextNode = operator -type ExprIndexWithoutDotNode(identifierExpr: Expr, indexExpr: Expr, range) = +type ExprIndexWithoutDotNode(identifierExpr: Expr, indexExpr: Expr, range: range) = inherit NodeBase(range) override val Children: Node array = [| yield Expr.Node identifierExpr; yield Expr.Node indexExpr |] - member val Identifier = identifierExpr - member val Index = indexExpr + member val Identifier: Expr = identifierExpr + member val Index: Expr = indexExpr -type LinkSingleAppParen(functionName: Expr, parenExpr: ExprParenNode, range) = +type LinkSingleAppParen(functionName: Expr, parenExpr: ExprParenNode, range: range) = inherit NodeBase(range) override val Children: Node array = [| yield Expr.Node functionName; yield parenExpr |] - member val FunctionName = functionName - member val Paren = parenExpr + member val FunctionName: Expr = functionName + member val Paren: ExprParenNode = parenExpr -type LinkSingleAppUnit(functionName: Expr, unit: UnitNode, range) = +type LinkSingleAppUnit(functionName: Expr, unit: UnitNode, range: range) = inherit NodeBase(range) override val Children: Node array = [| yield Expr.Node functionName; yield unit |] - member val FunctionName = functionName - member val Unit = unit + member val FunctionName: Expr = functionName + member val Unit: UnitNode = unit [] type ChainLink = @@ -1220,23 +1234,23 @@ type ChainLink = | AppUnit n -> n | IndexExpr e -> Expr.Node e -type ExprChain(links: ChainLink list, range) = +type ExprChain(links: ChainLink list, range: range) = inherit NodeBase(range) override val Children: Node array = List.map ChainLink.Node links |> List.toArray - member val Links = links + member val Links: ChainLink list = links -type ExprAppLongIdentAndSingleParenArgNode(functionName: IdentListNode, argExpr: Expr, range) = +type ExprAppLongIdentAndSingleParenArgNode(functionName: IdentListNode, argExpr: Expr, range: range) = inherit NodeBase(range) override val Children: Node array = [| yield functionName; yield Expr.Node argExpr |] - member val FunctionName = functionName - member val ArgExpr = argExpr + member val FunctionName: IdentListNode = functionName + member val ArgExpr: Expr = argExpr -type ExprAppSingleParenArgNode(functionExpr: Expr, argExpr: Expr, range) = +type ExprAppSingleParenArgNode(functionExpr: Expr, argExpr: Expr, range: range) = inherit NodeBase(range) override val Children: Node array = [| yield Expr.Node functionExpr; yield Expr.Node argExpr |] - member val FunctionExpr = functionExpr - member val ArgExpr = argExpr + member val FunctionExpr: Expr = functionExpr + member val ArgExpr: Expr = argExpr type ExprAppWithLambdaNode ( @@ -1245,7 +1259,7 @@ type ExprAppWithLambdaNode openingParen: SingleTextNode, lambda: Choice, closingParen: SingleTextNode, - range + range: range ) = inherit NodeBase(range) @@ -1261,13 +1275,13 @@ type ExprAppWithLambdaNode yield lambdaNode yield closingParen |] - member val FunctionName = functionName - member val Arguments = arguments - member val OpeningParen = openingParen - member val Lambda = lambda - member val ClosingParen = closingParen + member val FunctionName: Expr = functionName + member val Arguments: Expr list = arguments + member val OpeningParen: SingleTextNode = openingParen + member val Lambda: Choice = lambda + member val ClosingParen: SingleTextNode = closingParen -type ExprNestedIndexWithoutDotNode(identifierExpr: Expr, indexExpr: Expr, argumentExpr: Expr, range) = +type ExprNestedIndexWithoutDotNode(identifierExpr: Expr, indexExpr: Expr, argumentExpr: Expr, range: range) = inherit NodeBase(range) override val Children: Node array = @@ -1275,11 +1289,11 @@ type ExprNestedIndexWithoutDotNode(identifierExpr: Expr, indexExpr: Expr, argume yield Expr.Node indexExpr yield Expr.Node argumentExpr |] - member val Identifier = identifierExpr - member val Index = indexExpr - member val Argument = argumentExpr + member val Identifier: Expr = identifierExpr + member val Index: Expr = indexExpr + member val Argument: Expr = argumentExpr -type ExprAppNode(functionExpr: Expr, arguments: Expr list, range) = +type ExprAppNode(functionExpr: Expr, arguments: Expr list, range: range) = inherit NodeBase(range) override val Children: Node array = [| yield Expr.Node functionExpr; yield! List.map Expr.Node arguments |] @@ -1288,7 +1302,13 @@ type ExprAppNode(functionExpr: Expr, arguments: Expr list, range) = member val Arguments: Expr list = arguments type ExprTypeAppNode - (identifierExpr: Expr, lessThan: SingleTextNode, typeParameters: Type list, greaterThan: SingleTextNode, range) = + ( + identifierExpr: Expr, + lessThan: SingleTextNode, + typeParameters: Type list, + greaterThan: SingleTextNode, + range: range + ) = inherit NodeBase(range) override val Children: Node array = @@ -1297,24 +1317,24 @@ type ExprTypeAppNode yield! List.map Type.Node typeParameters yield greaterThan |] - member val Identifier = identifierExpr - member val LessThan = lessThan - member val TypeParameters = typeParameters - member val GreaterThan = greaterThan + member val Identifier: Expr = identifierExpr + member val LessThan: SingleTextNode = lessThan + member val TypeParameters: Type list = typeParameters + member val GreaterThan: SingleTextNode = greaterThan type ExprTryWithSingleClauseNode - (tryNode: SingleTextNode, tryExpr: Expr, withNode: SingleTextNode, clause: MatchClauseNode, range) = + (tryNode: SingleTextNode, tryExpr: Expr, withNode: SingleTextNode, clause: MatchClauseNode, range: range) = inherit NodeBase(range) override val Children: Node array = [| yield tryNode; yield Expr.Node tryExpr; yield withNode; yield clause |] - member val Try = tryNode - member val TryExpr = tryExpr - member val With = withNode - member val Clause = clause + member val Try: SingleTextNode = tryNode + member val TryExpr: Expr = tryExpr + member val With: SingleTextNode = withNode + member val Clause: MatchClauseNode = clause type ExprTryWithNode - (tryNode: SingleTextNode, tryExpr: Expr, withNode: SingleTextNode, clauses: MatchClauseNode list, range) = + (tryNode: SingleTextNode, tryExpr: Expr, withNode: SingleTextNode, clauses: MatchClauseNode list, range: range) = inherit NodeBase(range) override val Children: Node array = @@ -1323,12 +1343,13 @@ type ExprTryWithNode yield withNode yield! nodes clauses |] - member val Try = tryNode - member val TryExpr = tryExpr - member val With = withNode - member val Clauses = clauses + member val Try: SingleTextNode = tryNode + member val TryExpr: Expr = tryExpr + member val With: SingleTextNode = withNode + member val Clauses: MatchClauseNode list = clauses -type ExprTryFinallyNode(tryNode: SingleTextNode, tryExpr: Expr, finallyNode: SingleTextNode, finallyExpr: Expr, range) = +type ExprTryFinallyNode + (tryNode: SingleTextNode, tryExpr: Expr, finallyNode: SingleTextNode, finallyExpr: Expr, range: range) = inherit NodeBase(range) override val Children: Node array = @@ -1337,12 +1358,12 @@ type ExprTryFinallyNode(tryNode: SingleTextNode, tryExpr: Expr, finallyNode: Sin yield finallyNode yield Expr.Node finallyExpr |] - member val Try = tryNode - member val TryExpr = tryExpr - member val Finally = finallyNode - member val FinallyExpr = finallyExpr + member val Try: SingleTextNode = tryNode + member val TryExpr: Expr = tryExpr + member val Finally: SingleTextNode = finallyNode + member val FinallyExpr: Expr = finallyExpr -type ElseIfNode(mElse: range, mIf: range, condition: Node, range) as elseIfNode = +type ElseIfNode(mElse: range, mIf: range, condition: Node, range: range) as elseIfNode = let mutable elseCursor = None let mutable ifCursor = None let nodesBefore = Queue(0) @@ -1422,14 +1443,14 @@ type IfKeywordNode = | SingleWord of SingleTextNode | ElseIf of ElseIfNode - member x.Node = + member x.Node: Node = match x with | SingleWord n -> n :> Node | ElseIf n -> n :> Node - member x.Range = x.Node.Range + member x.Range: range = x.Node.Range -type ExprIfThenNode(ifNode: IfKeywordNode, ifExpr: Expr, thenNode: SingleTextNode, thenExpr: Expr, range) = +type ExprIfThenNode(ifNode: IfKeywordNode, ifExpr: Expr, thenNode: SingleTextNode, thenExpr: Expr, range: range) = inherit NodeBase(range) override val Children: Node array = @@ -1438,10 +1459,10 @@ type ExprIfThenNode(ifNode: IfKeywordNode, ifExpr: Expr, thenNode: SingleTextNod yield thenNode yield Expr.Node thenExpr |] - member val If = ifNode - member val IfExpr = ifExpr - member val Then = thenNode - member val ThenExpr = thenExpr + member val If: IfKeywordNode = ifNode + member val IfExpr: Expr = ifExpr + member val Then: SingleTextNode = thenNode + member val ThenExpr: Expr = thenExpr type ExprIfThenElseNode ( @@ -1451,7 +1472,7 @@ type ExprIfThenElseNode thenExpr: Expr, elseNode: SingleTextNode, elseExpr: Expr, - range + range: range ) = inherit NodeBase(range) @@ -1463,14 +1484,14 @@ type ExprIfThenElseNode yield elseNode yield Expr.Node elseExpr |] - member val If = ifNode - member val IfExpr = ifExpr - member val Then = thenNode - member val ThenExpr = thenExpr - member val Else = elseNode - member val ElseExpr = elseExpr + member val If: IfKeywordNode = ifNode + member val IfExpr: Expr = ifExpr + member val Then: SingleTextNode = thenNode + member val ThenExpr: Expr = thenExpr + member val Else: SingleTextNode = elseNode + member val ElseExpr: Expr = elseExpr -type ExprIfThenElifNode(branches: ExprIfThenNode list, elseBranch: (SingleTextNode * Expr) option, range) = +type ExprIfThenElifNode(branches: ExprIfThenNode list, elseBranch: (SingleTextNode * Expr) option, range: range) = inherit NodeBase(range) override val Children: Node array = @@ -1481,29 +1502,29 @@ type ExprIfThenElifNode(branches: ExprIfThenNode list, elseBranch: (SingleTextNo [| yield! nodes branches; yield! elseNodes |] - member val Branches = branches - member val Else = elseBranch + member val Branches: ExprIfThenNode list = branches + member val Else: (SingleTextNode * Expr) option = elseBranch -type ExprOptVarNode(isOptional: bool, identifier: IdentListNode, range) = +type ExprOptVarNode(isOptional: bool, identifier: IdentListNode, range: range) = inherit NodeBase(range) override val Children: Node array = [| yield identifier |] - member val IsOptional = isOptional - member val Identifier = identifier + member val IsOptional: bool = isOptional + member val Identifier: IdentListNode = identifier -type ExprLongIdentSetNode(identifier: IdentListNode, rhs: Expr, range) = +type ExprLongIdentSetNode(identifier: IdentListNode, rhs: Expr, range: range) = inherit NodeBase(range) override val Children: Node array = [| yield identifier; yield Expr.Node rhs |] - member val Identifier = identifier - member val Expr = rhs + member val Identifier: IdentListNode = identifier + member val Expr: Expr = rhs -type ExprDotIndexedGetNode(objectExpr: Expr, indexExpr: Expr, range) = +type ExprDotIndexedGetNode(objectExpr: Expr, indexExpr: Expr, range: range) = inherit NodeBase(range) override val Children: Node array = [| yield Expr.Node objectExpr; yield Expr.Node indexExpr |] - member val ObjectExpr = objectExpr - member val IndexExpr = indexExpr + member val ObjectExpr: Expr = objectExpr + member val IndexExpr: Expr = indexExpr -type ExprDotIndexedSetNode(objectExpr: Expr, indexExpr: Expr, valueExpr: Expr, range) = +type ExprDotIndexedSetNode(objectExpr: Expr, indexExpr: Expr, valueExpr: Expr, range: range) = inherit NodeBase(range) override val Children: Node array = @@ -1511,21 +1532,21 @@ type ExprDotIndexedSetNode(objectExpr: Expr, indexExpr: Expr, valueExpr: Expr, r yield Expr.Node indexExpr yield Expr.Node valueExpr |] - member val ObjectExpr = objectExpr - member val Index = indexExpr - member val Value = valueExpr + member val ObjectExpr: Expr = objectExpr + member val Index: Expr = indexExpr + member val Value: Expr = valueExpr -type ExprNamedIndexedPropertySetNode(identifier: IdentListNode, indexExpr: Expr, valueExpr: Expr, range) = +type ExprNamedIndexedPropertySetNode(identifier: IdentListNode, indexExpr: Expr, valueExpr: Expr, range: range) = inherit NodeBase(range) override val Children: Node array = [| yield identifier; yield Expr.Node indexExpr; yield Expr.Node valueExpr |] - member val Identifier = identifier - member val Index = indexExpr - member val Value = valueExpr + member val Identifier: IdentListNode = identifier + member val Index: Expr = indexExpr + member val Value: Expr = valueExpr type ExprDotNamedIndexedPropertySetNode - (identifierExpr: Expr, name: IdentListNode, propertyExpr: Expr, setExpr: Expr, range) = + (identifierExpr: Expr, name: IdentListNode, propertyExpr: Expr, setExpr: Expr, range: range) = inherit NodeBase(range) override val Children: Node array = @@ -1534,24 +1555,24 @@ type ExprDotNamedIndexedPropertySetNode yield Expr.Node propertyExpr yield Expr.Node setExpr |] - member val Identifier = identifierExpr - member val Name = name - member val Property = propertyExpr - member val Set = setExpr + member val Identifier: Expr = identifierExpr + member val Name: IdentListNode = name + member val Property: Expr = propertyExpr + member val Set: Expr = setExpr -type ExprSetNode(identifier: Expr, setExpr: Expr, range) = +type ExprSetNode(identifier: Expr, setExpr: Expr, range: range) = inherit NodeBase(range) override val Children: Node array = [| yield Expr.Node identifier; yield Expr.Node setExpr |] - member val Identifier = identifier - member val Set = setExpr + member val Identifier: Expr = identifier + member val Set: Expr = setExpr -type StaticOptimizationConstraintWhenTyparTyconEqualsTyconNode(typar: SingleTextNode, t: Type, range) = +type StaticOptimizationConstraintWhenTyparTyconEqualsTyconNode(typar: SingleTextNode, t: Type, range: range) = inherit NodeBase(range) override val Children: Node array = [| yield typar; yield Type.Node t |] - member val TypeParameter = typar - member val Type = t + member val TypeParameter: SingleTextNode = typar + member val Type: Type = t [] type StaticOptimizationConstraint = @@ -1564,7 +1585,7 @@ type StaticOptimizationConstraint = | WhenTyparIsStruct n -> n type ExprLibraryOnlyStaticOptimizationNode - (optimizedExpr: Expr, constraints: StaticOptimizationConstraint list, expr: Expr, range) = + (optimizedExpr: Expr, constraints: StaticOptimizationConstraint list, expr: Expr, range: range) = inherit NodeBase(range) override val Children: Node array = @@ -1572,17 +1593,17 @@ type ExprLibraryOnlyStaticOptimizationNode yield! List.map StaticOptimizationConstraint.Node constraints yield Expr.Node expr |] - member val OptimizedExpr = optimizedExpr - member val Constraints = constraints - member val Expr = expr + member val OptimizedExpr: Expr = optimizedExpr + member val Constraints: StaticOptimizationConstraint list = constraints + member val Expr: Expr = expr -type FillExprNode(expr: Expr, ident: SingleTextNode option, range) = +type FillExprNode(expr: Expr, ident: SingleTextNode option, range: range) = inherit NodeBase(range) override val Children: Node array = [| yield Expr.Node expr; yield! noa ident |] - member val Expr = expr - member val Ident = ident + member val Expr: Expr = expr + member val Ident: SingleTextNode option = ident -type ExprInterpolatedStringExprNode(parts: Choice list, range) = +type ExprInterpolatedStringExprNode(parts: Choice list, range: range) = inherit NodeBase(range) override val Children: Node array = @@ -1593,7 +1614,7 @@ type ExprInterpolatedStringExprNode(parts: Choice | Choice2Of2 n -> (n :> Node)) parts |] - member val Parts = parts + member val Parts: Choice list = parts type ExprTripleNumberIndexRangeNode ( @@ -1602,7 +1623,7 @@ type ExprTripleNumberIndexRangeNode centerNode: SingleTextNode, endDots: SingleTextNode, endNode: SingleTextNode, - range + range: range ) = inherit NodeBase(range) @@ -1613,13 +1634,13 @@ type ExprTripleNumberIndexRangeNode yield endDots yield endNode |] - member val Start = startNode - member val StartDots = startDots - member val Center = centerNode - member val EndDots = endDots - member val End = endNode + member val Start: SingleTextNode = startNode + member val StartDots: SingleTextNode = startDots + member val Center: SingleTextNode = centerNode + member val EndDots: SingleTextNode = endDots + member val End: SingleTextNode = endNode -type ExprIndexRangeNode(fromExpr: Expr option, dots: SingleTextNode, toExpr: Expr option, range) = +type ExprIndexRangeNode(fromExpr: Expr option, dots: SingleTextNode, toExpr: Expr option, range: range) = inherit NodeBase(range) override val Children: Node array = @@ -1627,29 +1648,29 @@ type ExprIndexRangeNode(fromExpr: Expr option, dots: SingleTextNode, toExpr: Exp yield dots yield! noa (Option.map Expr.Node toExpr) |] - member val From = fromExpr - member val Dots = dots - member val To = toExpr + member val From: Expr option = fromExpr + member val Dots: SingleTextNode = dots + member val To: Expr option = toExpr -type ExprIndexFromEndNode(expr: Expr, range) = +type ExprIndexFromEndNode(expr: Expr, range: range) = inherit NodeBase(range) override val Children: Node array = [| Expr.Node expr |] - member val Expr = expr + member val Expr: Expr = expr type ExprDotLambda(underscore: SingleTextNode, dot: SingleTextNode, expr: Expr, range: range) = inherit NodeBase(range) override val Children: Node array = [| underscore; dot; Expr.Node expr |] - member val Underscore = underscore - member val Dot = dot - member val Expr = expr + member val Underscore: SingleTextNode = underscore + member val Dot: SingleTextNode = dot + member val Expr: Expr = expr -type ExprBeginEndNode(beginNode: SingleTextNode, expr: Expr, endNode: SingleTextNode, range) = +type ExprBeginEndNode(beginNode: SingleTextNode, expr: Expr, endNode: SingleTextNode, range: range) = inherit NodeBase(range) override val Children: Node array = [| yield beginNode; yield Expr.Node expr; yield endNode |] - member val Begin = beginNode - member val Expr = expr - member val End = endNode + member val Begin: SingleTextNode = beginNode + member val Expr: Expr = expr + member val End: SingleTextNode = endNode [] type Expr = @@ -1790,17 +1811,17 @@ type Expr = | Expr.Paren _ -> true | _ -> false -type OpenModuleOrNamespaceNode(identListNode: IdentListNode, range) = +type OpenModuleOrNamespaceNode(identListNode: IdentListNode, range: range) = inherit NodeBase(range) - override val Children = Array.empty - member val Name = identListNode + override val Children: SyntaxOak.Node array = Array.empty + member val Name: IdentListNode = identListNode -type OpenTargetNode(target: Type, range) = +type OpenTargetNode(target: Type, range: range) = inherit NodeBase(range) override val Children: Node array = [| yield Type.Node target |] - member val Target = target + member val Target: Type = target [] type Open = @@ -1816,45 +1837,45 @@ type OpenListNode(opens: Open list) = inherit NodeBase(List.map (Open.Node >> nodeRange) opens |> combineRanges) override val Children: Node array = [| yield! (List.map Open.Node opens) |] - member val Opens = opens + member val Opens: Open list = opens type HashDirectiveListNode(hashDirectives: ParsedHashDirectiveNode list) = inherit NodeBase(hashDirectives |> List.map (fun n -> n.Range) |> combineRanges) override val Children: Node array = [| yield! nodes hashDirectives |] - member val HashDirectives = hashDirectives + member val HashDirectives: ParsedHashDirectiveNode list = hashDirectives -type AttributeNode(typeName: IdentListNode, expr: Expr option, target: SingleTextNode option, range) = +type AttributeNode(typeName: IdentListNode, expr: Expr option, target: SingleTextNode option, range: range) = inherit NodeBase(range) override val Children: Node array = [| yield typeName; yield! noa (Option.map Expr.Node expr); yield! noa target |] - member val TypeName = typeName - member val Expr = expr - member val Target = target + member val TypeName: IdentListNode = typeName + member val Expr: Expr option = expr + member val Target: SingleTextNode option = target /// The content from [< to >] type AttributeListNode - (openingToken: SingleTextNode, attributesNodes: AttributeNode list, closingToken: SingleTextNode, range) = + (openingToken: SingleTextNode, attributesNodes: AttributeNode list, closingToken: SingleTextNode, range: range) = inherit NodeBase(range) override val Children: Node array = [| yield openingToken; yield! nodes attributesNodes; yield closingToken |] - member val Opening = openingToken - member val Attributes = attributesNodes - member val Closing = closingToken + member val Opening: SingleTextNode = openingToken + member val Attributes: AttributeNode list = attributesNodes + member val Closing: SingleTextNode = closingToken -type MultipleAttributeListNode(attributeLists: AttributeListNode list, range) = +type MultipleAttributeListNode(attributeLists: AttributeListNode list, range: range) = inherit NodeBase(range) override val Children: Node array = [| yield! nodes attributeLists |] - member val AttributeLists = attributeLists - member val IsEmpty = attributeLists.IsEmpty + member val AttributeLists: AttributeListNode list = attributeLists + member val IsEmpty: bool = attributeLists.IsEmpty -type ModuleDeclAttributesNode(attributes: MultipleAttributeListNode option, doExpr: Expr, range) = +type ModuleDeclAttributesNode(attributes: MultipleAttributeListNode option, doExpr: Expr, range: range) = inherit NodeBase(range) override val Children: Node array = [| yield! noa attributes; yield Expr.Node doExpr |] - member val Attributes = attributes - member val Expr = doExpr + member val Attributes: MultipleAttributeListNode option = attributes + member val Expr: Expr = doExpr type ExceptionDefnNode ( @@ -1864,7 +1885,7 @@ type ExceptionDefnNode unionCase: UnionCaseNode, withKeyword: SingleTextNode option, ms: MemberDefn list, - range + range: range ) = inherit NodeBase(range) @@ -1876,12 +1897,12 @@ type ExceptionDefnNode yield! noa withKeyword yield! nodes (List.map MemberDefn.Node ms) |] - member val XmlDoc = xmlDoc - member val Attributes = attributes - member val Accessibility = accessibility - member val UnionCase = unionCase - member val WithKeyword = withKeyword - member val Members = ms + member val XmlDoc: XmlDocNode option = xmlDoc + member val Attributes: MultipleAttributeListNode option = attributes + member val Accessibility: SingleTextNode option = accessibility + member val UnionCase: UnionCaseNode = unionCase + member val WithKeyword: SingleTextNode option = withKeyword + member val Members: MemberDefn list = ms type ExternBindingPatternNode (attributes: MultipleAttributeListNode option, t: Type option, pat: Pattern option, range: range) = @@ -1892,9 +1913,9 @@ type ExternBindingPatternNode yield! noa (Option.map Type.Node t) yield! noa (Option.map Pattern.Node pat) |] - member val Attributes = attributes - member val Type = t - member val Pattern = pat + member val Attributes: MultipleAttributeListNode option = attributes + member val Type: Type option = t + member val Pattern: Pattern option = pat type ExternBindingNode ( @@ -1908,7 +1929,7 @@ type ExternBindingNode openingParen: SingleTextNode, parameters: ExternBindingPatternNode list, closingParen: SingleTextNode, - range + range: range ) = inherit NodeBase(range) @@ -1924,23 +1945,23 @@ type ExternBindingNode yield! nodes parameters yield closingParen |] - member val XmlDoc = xmlDoc - member val Attributes = attributes - member val Extern = externNode - member val AttributesOfType = attributesOfType - member val Type = t - member val Accessibility = accessibility - member val Identifier = identifier - member val OpeningParen = openingParen - member val Parameters = parameters - member val ClosingParen = closingParen + member val XmlDoc: XmlDocNode option = xmlDoc + member val Attributes: MultipleAttributeListNode option = attributes + member val Extern: SingleTextNode = externNode + member val AttributesOfType: MultipleAttributeListNode option = attributesOfType + member val Type: Type = t + member val Accessibility: SingleTextNode option = accessibility + member val Identifier: IdentListNode = identifier + member val OpeningParen: SingleTextNode = openingParen + member val Parameters: ExternBindingPatternNode list = parameters + member val ClosingParen: SingleTextNode = closingParen -type ModuleAbbrevNode(moduleNode: SingleTextNode, name: SingleTextNode, alias: IdentListNode, range) = +type ModuleAbbrevNode(moduleNode: SingleTextNode, name: SingleTextNode, alias: IdentListNode, range: range) = inherit NodeBase(range) override val Children: Node array = [| yield moduleNode; yield name; yield alias |] - member val Module = moduleNode - member val Name = name - member val Alias = alias + member val Module: SingleTextNode = moduleNode + member val Name: SingleTextNode = name + member val Alias: IdentListNode = alias type NestedModuleNode ( @@ -1952,7 +1973,7 @@ type NestedModuleNode identifier: IdentListNode, equalsNode: SingleTextNode, decls: ModuleDecl list, - range + range: range ) = inherit NodeBase(range) @@ -1965,14 +1986,14 @@ type NestedModuleNode yield equalsNode yield! List.map ModuleDecl.Node decls |] - member val XmlDoc = xmlDoc - member val Attributes = attributes - member val Module = moduleKeyword - member val Accessibility = accessibility - member val IsRecursive = isRecursive - member val Identifier = identifier - member val Equals = equalsNode - member val Declarations = decls + member val XmlDoc: XmlDocNode option = xmlDoc + member val Attributes: MultipleAttributeListNode option = attributes + member val Module: SingleTextNode = moduleKeyword + member val Accessibility: SingleTextNode option = accessibility + member val IsRecursive: bool = isRecursive + member val Identifier: IdentListNode = identifier + member val Equals: SingleTextNode = equalsNode + member val Declarations: ModuleDecl list = decls /// Each case in this DU should have a container node [] @@ -2003,11 +2024,11 @@ type ModuleDecl = | TypeDefn t -> TypeDefn.Node t | Val n -> n -type BindingReturnInfoNode(colon: SingleTextNode, t: Type, range) = +type BindingReturnInfoNode(colon: SingleTextNode, t: Type, range: range) = inherit NodeBase(range) override val Children: Node array = [| yield colon; yield Type.Node t |] - member val Colon = colon - member val Type = t + member val Colon: SingleTextNode = colon + member val Type: Type = t type BindingNode ( @@ -2023,21 +2044,21 @@ type BindingNode returnType: BindingReturnInfoNode option, equals: SingleTextNode, expr: Expr, - range + range: range ) = inherit NodeBase(range) - member val XmlDoc = xmlDoc - member val Attributes = attributes - member val LeadingKeyword = leadingKeyword - member val IsMutable = isMutable - member val Inline = inlineNode - member val Accessibility = accessibility - member val FunctionName = functionName - member val GenericTypeParameters = genericTypeParameters - member val Parameters = parameters - member val ReturnType = returnType - member val Equals = equals - member val Expr = expr + member val XmlDoc: XmlDocNode option = xmlDoc + member val Attributes: MultipleAttributeListNode option = attributes + member val LeadingKeyword: MultipleTextsNode = leadingKeyword + member val IsMutable: bool = isMutable + member val Inline: SingleTextNode option = inlineNode + member val Accessibility: SingleTextNode option = accessibility + member val FunctionName: Choice = functionName + member val GenericTypeParameters: TyparDecls option = genericTypeParameters + member val Parameters: Pattern list = parameters + member val ReturnType: BindingReturnInfoNode option = returnType + member val Equals: SingleTextNode = equals + member val Expr: Expr = expr override val Children: Node array = [| yield! noa xmlDoc @@ -2055,10 +2076,10 @@ type BindingNode yield equals yield Expr.Node expr |] -type BindingListNode(bindings: BindingNode list, range) = +type BindingListNode(bindings: BindingNode list, range: range) = inherit NodeBase(range) override val Children: Node array = [| yield! nodes bindings |] - member val Bindings = bindings + member val Bindings: BindingNode list = bindings type FieldNode ( @@ -2069,7 +2090,7 @@ type FieldNode accessibility: SingleTextNode option, name: SingleTextNode option, t: Type, - range + range: range ) = inherit NodeBase(range) @@ -2082,13 +2103,13 @@ type FieldNode yield! noa name yield Type.Node t |] - member val XmlDoc = xmlDoc - member val Attributes = attributes - member val LeadingKeyword = leadingKeyword - member val MutableKeyword = mutableKeyword - member val Accessibility = accessibility - member val Name = name - member val Type = t + member val XmlDoc: XmlDocNode option = xmlDoc + member val Attributes: MultipleAttributeListNode option = attributes + member val LeadingKeyword: MultipleTextsNode option = leadingKeyword + member val MutableKeyword: SingleTextNode option = mutableKeyword + member val Accessibility: SingleTextNode option = accessibility + member val Name: SingleTextNode option = name + member val Type: Type = t type UnionCaseNode ( @@ -2097,7 +2118,7 @@ type UnionCaseNode bar: SingleTextNode option, identifier: SingleTextNode, fields: FieldNode list, - range + range: range ) = inherit NodeBase(range) @@ -2108,11 +2129,11 @@ type UnionCaseNode yield identifier yield! nodes fields |] - member val XmlDoc = xmlDoc - member val Attributes = attributes - member val Bar = bar - member val Identifier = identifier - member val Fields = fields + member val XmlDoc: XmlDocNode option = xmlDoc + member val Attributes: MultipleAttributeListNode option = attributes + member val Bar: SingleTextNode option = bar + member val Identifier: SingleTextNode = identifier + member val Fields: FieldNode list = fields type TypeNameNode ( @@ -2126,7 +2147,7 @@ type TypeNameNode implicitConstructor: ImplicitConstructorNode option, equalsToken: SingleTextNode option, withKeyword: SingleTextNode option, - range + range: range ) = inherit NodeBase(range) @@ -2142,17 +2163,17 @@ type TypeNameNode yield! noa equalsToken yield! noa withKeyword |] - member val XmlDoc = xmlDoc - member val Attributes = attributes - member val IsFirstType = leadingKeyword.Text = "type" - member val LeadingKeyword = leadingKeyword - member val Accessibility = ao - member val Identifier = identifier - member val TypeParameters = typeParams - member val Constraints = constraints - member val ImplicitConstructor = implicitConstructor - member val EqualsToken = equalsToken - member val WithKeyword = withKeyword + member val XmlDoc: XmlDocNode option = xmlDoc + member val Attributes: MultipleAttributeListNode option = attributes + member val IsFirstType: bool = leadingKeyword.Text = "type" + member val LeadingKeyword: SingleTextNode = leadingKeyword + member val Accessibility: SingleTextNode option = ao + member val Identifier: IdentListNode = identifier + member val TypeParameters: TyparDecls option = typeParams + member val Constraints: TypeConstraint list = constraints + member val ImplicitConstructor: ImplicitConstructorNode option = implicitConstructor + member val EqualsToken: SingleTextNode option = equalsToken + member val WithKeyword: SingleTextNode option = withKeyword type ITypeDefn = abstract member TypeName: TypeNameNode @@ -2166,7 +2187,7 @@ type EnumCaseNode identifier: SingleTextNode, equals: SingleTextNode, constant: Expr, - range + range: range ) = inherit NodeBase(range) @@ -2177,14 +2198,15 @@ type EnumCaseNode yield equals yield Expr.Node constant |] - member val XmlDoc = xmlDoc - member val Bar = bar - member val Attributes = attributes - member val Identifier = identifier - member val Equals = equals - member val Constant = constant + member val XmlDoc: XmlDocNode option = xmlDoc + member val Bar: SingleTextNode option = bar + member val Attributes: MultipleAttributeListNode option = attributes + member val Identifier: SingleTextNode = identifier + member val Equals: SingleTextNode = equals + member val Constant: Expr = constant -type TypeDefnEnumNode(typeNameNode, enumCases: EnumCaseNode list, members: MemberDefn list, range) = +type TypeDefnEnumNode(typeNameNode: TypeNameNode, enumCases: EnumCaseNode list, members: MemberDefn list, range: range) + = inherit NodeBase(range) override val Children: Node array = @@ -2192,15 +2214,20 @@ type TypeDefnEnumNode(typeNameNode, enumCases: EnumCaseNode list, members: Membe yield! nodes enumCases yield! nodes (List.map MemberDefn.Node members) |] - member val EnumCases = enumCases + member val EnumCases: EnumCaseNode list = enumCases interface ITypeDefn with member val TypeName = typeNameNode member val Members = members type TypeDefnUnionNode - (typeNameNode, accessibility: SingleTextNode option, unionCases: UnionCaseNode list, members: MemberDefn list, range) - = + ( + typeNameNode: TypeNameNode, + accessibility: SingleTextNode option, + unionCases: UnionCaseNode list, + members: MemberDefn list, + range: range + ) = inherit NodeBase(range) override val Children: Node array = @@ -2209,8 +2236,8 @@ type TypeDefnUnionNode yield! nodes unionCases yield! nodes (List.map MemberDefn.Node members) |] - member val Accessibility = accessibility - member val UnionCases = unionCases + member val Accessibility: SingleTextNode option = accessibility + member val UnionCases: UnionCaseNode list = unionCases interface ITypeDefn with member val TypeName = typeNameNode @@ -2218,13 +2245,13 @@ type TypeDefnUnionNode type TypeDefnRecordNode ( - typeNameNode, + typeNameNode: TypeNameNode, accessibility: SingleTextNode option, openingBrace: SingleTextNode, fields: FieldNode list, closingBrace: SingleTextNode, - members, - range + members: MemberDefn list, + range: range ) = inherit NodeBase(range) @@ -2236,16 +2263,16 @@ type TypeDefnRecordNode yield closingBrace yield! nodes (List.map MemberDefn.Node members) |] - member val Accessibility = accessibility - member val OpeningBrace = openingBrace - member val Fields = fields - member val ClosingBrace = closingBrace + member val Accessibility: SingleTextNode option = accessibility + member val OpeningBrace: SingleTextNode = openingBrace + member val Fields: FieldNode list = fields + member val ClosingBrace: SingleTextNode = closingBrace interface ITypeDefn with member val TypeName = typeNameNode member val Members = members -type TypeDefnAbbrevNode(typeNameNode, t: Type, members, range) = +type TypeDefnAbbrevNode(typeNameNode: TypeNameNode, t: Type, members: MemberDefn list, range: range) = inherit NodeBase(range) override val Children: Node array = @@ -2253,15 +2280,20 @@ type TypeDefnAbbrevNode(typeNameNode, t: Type, members, range) = yield Type.Node t yield! nodes (List.map MemberDefn.Node members) |] - member val Type = t + member val Type: Type = t interface ITypeDefn with member val TypeName = typeNameNode member val Members = members type SimplePatNode - (attributes: MultipleAttributeListNode option, isOptional: bool, identifier: SingleTextNode, t: Type option, range) - = + ( + attributes: MultipleAttributeListNode option, + isOptional: bool, + identifier: SingleTextNode, + t: Type option, + range: range + ) = inherit NodeBase(range) override val Children: Node array = @@ -2269,16 +2301,16 @@ type SimplePatNode yield identifier yield! noa (Option.map Type.Node t) |] - member val Attributes = attributes - member val IsOptional = isOptional - member val Identifier = identifier - member val Type = t + member val Attributes: MultipleAttributeListNode option = attributes + member val IsOptional: bool = isOptional + member val Identifier: SingleTextNode = identifier + member val Type: Type option = t -type AsSelfIdentifierNode(asNode: SingleTextNode, self: SingleTextNode, range) = +type AsSelfIdentifierNode(asNode: SingleTextNode, self: SingleTextNode, range: range) = inherit NodeBase(range) - override val Children = [| yield (asNode :> Node); yield self |] - member val As = asNode - member val Self = self + override val Children: SyntaxOak.Node array = [| yield (asNode :> Node); yield self |] + member val As: SingleTextNode = asNode + member val Self: SingleTextNode = self type ImplicitConstructorNode ( @@ -2289,7 +2321,7 @@ type ImplicitConstructorNode items: Choice list, closingParen: SingleTextNode, self: AsSelfIdentifierNode option, - range + range: range ) = inherit NodeBase(range) @@ -2305,24 +2337,25 @@ type ImplicitConstructorNode yield closingParen yield! noa self |] - member val XmlDoc = xmlDoc - member val Attributes = attributes - member val Accessibility = accessibility - member val OpeningParen = openingParen - member val Items = items - member val ClosingParen = closingParen - member val Self = self + member val XmlDoc: XmlDocNode option = xmlDoc + member val Attributes: MultipleAttributeListNode option = attributes + member val Accessibility: SingleTextNode option = accessibility + member val OpeningParen: SingleTextNode = openingParen + member val Items: Choice list = items + member val ClosingParen: SingleTextNode = closingParen + member val Self: AsSelfIdentifierNode option = self -type TypeDefnExplicitBodyNode(kind: SingleTextNode, members: MemberDefn list, endNode: SingleTextNode, range) = +type TypeDefnExplicitBodyNode(kind: SingleTextNode, members: MemberDefn list, endNode: SingleTextNode, range: range) = inherit NodeBase(range) override val Children: Node array = [| yield kind; yield! nodes (List.map MemberDefn.Node members); yield endNode |] - member val Kind = kind - member val Members = members - member val End = endNode + member val Kind: SingleTextNode = kind + member val Members: MemberDefn list = members + member val End: SingleTextNode = endNode -type TypeDefnExplicitNode(typeNameNode, body: TypeDefnExplicitBodyNode, members, range) = +type TypeDefnExplicitNode + (typeNameNode: TypeNameNode, body: TypeDefnExplicitBodyNode, members: MemberDefn list, range: range) = inherit NodeBase(range) override val Children: Node array = @@ -2330,13 +2363,13 @@ type TypeDefnExplicitNode(typeNameNode, body: TypeDefnExplicitBodyNode, members, yield body yield! nodes (List.map MemberDefn.Node members) |] - member val Body = body + member val Body: TypeDefnExplicitBodyNode = body interface ITypeDefn with member val TypeName = typeNameNode member val Members = members -type TypeDefnAugmentationNode(typeNameNode, members, range) = +type TypeDefnAugmentationNode(typeNameNode: TypeNameNode, members: MemberDefn list, range: range) = inherit NodeBase(range) override val Children: Node array = [| yield typeNameNode; yield! (List.map MemberDefn.Node members) |] @@ -2345,19 +2378,20 @@ type TypeDefnAugmentationNode(typeNameNode, members, range) = member val TypeName = typeNameNode member val Members = members -type TypeDefnDelegateNode(typeNameNode, delegateNode: SingleTextNode, typeList: TypeFunsNode, range) = +type TypeDefnDelegateNode + (typeNameNode: TypeNameNode, delegateNode: SingleTextNode, typeList: TypeFunsNode, range: range) = inherit NodeBase(range) override val Children: Node array = [| yield typeNameNode; yield delegateNode; yield typeList |] - member val DelegateNode = delegateNode - member val TypeList = typeList + member val DelegateNode: SingleTextNode = delegateNode + member val TypeList: TypeFunsNode = typeList interface ITypeDefn with member val TypeName = typeNameNode member val Members = List.empty -type TypeDefnRegularNode(typeNameNode, members, range) = +type TypeDefnRegularNode(typeNameNode: TypeNameNode, members: MemberDefn list, range: range) = inherit NodeBase(range) override val Children: Node array = [| yield typeNameNode; yield! List.map MemberDefn.Node members |] @@ -2405,13 +2439,13 @@ type TypeDefn = | Delegate n -> n | Regular n -> n -type MemberDefnInheritNode(inheritKeyword: SingleTextNode, baseType: Type, range) = +type MemberDefnInheritNode(inheritKeyword: SingleTextNode, baseType: Type, range: range) = inherit NodeBase(range) override val Children: Node array = [| yield inheritKeyword; yield Type.Node baseType |] - member val Inherit = inheritKeyword - member val BaseType = baseType + member val Inherit: SingleTextNode = inheritKeyword + member val BaseType: Type = baseType type MemberDefnExplicitCtorNode ( @@ -2424,7 +2458,7 @@ type MemberDefnExplicitCtorNode equals: SingleTextNode, expr: Expr, thenExpr: Expr option, - range + range: range ) = inherit NodeBase(range) @@ -2439,18 +2473,18 @@ type MemberDefnExplicitCtorNode yield Expr.Node expr yield! noa (Option.map Expr.Node thenExpr) |] - member val XmlDoc = xmlDoc - member val Attributes = attributes - member val Accessibility = accessibility - member val New = newKeyword - member val Pattern = pat - member val Alias = alias - member val Equals = equals - member val Expr = expr - member val ThenExpr = thenExpr + member val XmlDoc: XmlDocNode option = xmlDoc + member val Attributes: MultipleAttributeListNode option = attributes + member val Accessibility: SingleTextNode option = accessibility + member val New: SingleTextNode = newKeyword + member val Pattern: Pattern = pat + member val Alias: SingleTextNode option = alias + member val Equals: SingleTextNode = equals + member val Expr: Expr = expr + member val ThenExpr: Expr option = thenExpr type MemberDefnInterfaceNode - (interfaceNode: SingleTextNode, t: Type, withNode: SingleTextNode option, members: MemberDefn list, range) = + (interfaceNode: SingleTextNode, t: Type, withNode: SingleTextNode option, members: MemberDefn list, range: range) = inherit NodeBase(range) override val Children: Node array = @@ -2459,10 +2493,10 @@ type MemberDefnInterfaceNode yield! noa withNode yield! List.map MemberDefn.Node members |] - member val Interface = interfaceNode - member val Type = t - member val With = withNode - member val Members = members + member val Interface: SingleTextNode = interfaceNode + member val Type: Type = t + member val With: SingleTextNode option = withNode + member val Members: MemberDefn list = members type MemberDefnAutoPropertyNode ( @@ -2475,7 +2509,7 @@ type MemberDefnAutoPropertyNode equals: SingleTextNode, expr: Expr, withGetSet: MultipleTextsNode option, - range + range: range ) = inherit NodeBase(range) @@ -2490,15 +2524,15 @@ type MemberDefnAutoPropertyNode yield Expr.Node expr yield! noa withGetSet |] - member val XmlDoc = xmlDoc - member val Attributes = attributes - member val LeadingKeyword = leadingKeyword - member val Accessibility = accessibility - member val Identifier = identifier - member val Type = t - member val Equals = equals - member val Expr = expr - member val WithGetSet = withGetSet + member val XmlDoc: XmlDocNode option = xmlDoc + member val Attributes: MultipleAttributeListNode option = attributes + member val LeadingKeyword: MultipleTextsNode = leadingKeyword + member val Accessibility: SingleTextNode option = accessibility + member val Identifier: SingleTextNode = identifier + member val Type: Type option = t + member val Equals: SingleTextNode = equals + member val Expr: Expr = expr + member val WithGetSet: MultipleTextsNode option = withGetSet type MemberDefnAbstractSlotNode ( @@ -2509,7 +2543,7 @@ type MemberDefnAbstractSlotNode typeParams: TyparDecls option, t: Type, withGetSet: MultipleTextsNode option, - range + range: range ) = inherit NodeBase(range) @@ -2522,13 +2556,13 @@ type MemberDefnAbstractSlotNode yield Type.Node t yield! noa withGetSet |] - member val XmlDoc = xmlDoc - member val Attributes = attributes - member val LeadingKeyword = leadingKeyword - member val Identifier = identifier - member val TypeParams = typeParams - member val Type = t - member val WithGetSet = withGetSet + member val XmlDoc: XmlDocNode option = xmlDoc + member val Attributes: MultipleAttributeListNode option = attributes + member val LeadingKeyword: MultipleTextsNode = leadingKeyword + member val Identifier: SingleTextNode = identifier + member val TypeParams: TyparDecls option = typeParams + member val Type: Type = t + member val WithGetSet: MultipleTextsNode option = withGetSet type PropertyGetSetBindingNode ( @@ -2539,7 +2573,7 @@ type PropertyGetSetBindingNode returnType: BindingReturnInfoNode option, equals: SingleTextNode, expr: Expr, - range + range: range ) = inherit NodeBase(range) @@ -2552,13 +2586,13 @@ type PropertyGetSetBindingNode yield equals yield Expr.Node expr |] - member val Inline = inlineNode - member val Accessibility = accessibility - member val LeadingKeyword = leadingKeyword - member val Parameters = parameters - member val ReturnType = returnType - member val Equals = equals - member val Expr = expr + member val Inline: SingleTextNode option = inlineNode + member val Accessibility: SingleTextNode option = accessibility + member val LeadingKeyword: SingleTextNode = leadingKeyword + member val Parameters: Pattern list = parameters + member val ReturnType: BindingReturnInfoNode option = returnType + member val Equals: SingleTextNode = equals + member val Expr: Expr = expr type MemberDefnPropertyGetSetNode ( @@ -2572,7 +2606,7 @@ type MemberDefnPropertyGetSetNode firstBinding: PropertyGetSetBindingNode, andKeyword: SingleTextNode option, lastBinding: PropertyGetSetBindingNode option, - range + range: range ) = inherit NodeBase(range) @@ -2587,16 +2621,16 @@ type MemberDefnPropertyGetSetNode yield! noa andKeyword yield! noa lastBinding |] - member val XmlDoc = xmlDoc - member val Attributes = attributes - member val LeadingKeyword = leadingKeyword - member val Inline = inlineNode - member val Accessibility = accessibility - member val MemberName = memberName - member val WithKeyword = withKeyword - member val FirstBinding = firstBinding - member val AndKeyword = andKeyword - member val LastBinding = lastBinding + member val XmlDoc: XmlDocNode option = xmlDoc + member val Attributes: MultipleAttributeListNode option = attributes + member val LeadingKeyword: MultipleTextsNode = leadingKeyword + member val Inline: SingleTextNode option = inlineNode + member val Accessibility: SingleTextNode option = accessibility + member val MemberName: IdentListNode = memberName + member val WithKeyword: SingleTextNode = withKeyword + member val FirstBinding: PropertyGetSetBindingNode = firstBinding + member val AndKeyword: SingleTextNode option = andKeyword + member val LastBinding: PropertyGetSetBindingNode option = lastBinding type ValNode ( @@ -2611,7 +2645,7 @@ type ValNode t: Type, equals: SingleTextNode option, eo: Expr option, - range + range: range ) = inherit NodeBase(range) @@ -2626,23 +2660,23 @@ type ValNode yield! noa equals yield! noa (Option.map Expr.Node eo) |] - member val XmlDoc = xmlDoc - member val Attributes = attributes - member val LeadingKeyword = leadingKeyword - member val Inline = inlineNode - member val IsMutable = isMutable - member val Accessibility = accessibility - member val Identifier = identifier - member val TypeParams = typeParams - member val Type = t - member val Equals = equals - member val Expr = eo + member val XmlDoc: XmlDocNode option = xmlDoc + member val Attributes: MultipleAttributeListNode option = attributes + member val LeadingKeyword: MultipleTextsNode option = leadingKeyword + member val Inline: SingleTextNode option = inlineNode + member val IsMutable: bool = isMutable + member val Accessibility: SingleTextNode option = accessibility + member val Identifier: SingleTextNode = identifier + member val TypeParams: TyparDecls option = typeParams + member val Type: Type = t + member val Equals: SingleTextNode option = equals + member val Expr: Expr option = eo -type MemberDefnSigMemberNode(valNode: ValNode, withGetSet: MultipleTextsNode option, range) = +type MemberDefnSigMemberNode(valNode: ValNode, withGetSet: MultipleTextsNode option, range: range) = inherit NodeBase(range) override val Children: Node array = [| yield valNode; yield! noa withGetSet |] - member val Val = valNode - member val WithGetSet = withGetSet + member val Val: ValNode = valNode + member val WithGetSet: MultipleTextsNode option = withGetSet [] type MemberDefn = @@ -2676,17 +2710,17 @@ type MemberDefn = | PropertyGetSet n -> n | SigMember n -> n -type UnitNode(openingParen: SingleTextNode, closingParen: SingleTextNode, range) = +type UnitNode(openingParen: SingleTextNode, closingParen: SingleTextNode, range: range) = inherit NodeBase(range) override val Children: Node array = [| yield openingParen; yield closingParen |] - member val OpeningParen = openingParen - member val ClosingParen = closingParen + member val OpeningParen: SingleTextNode = openingParen + member val ClosingParen: SingleTextNode = closingParen -type ConstantMeasureNode(constant: Constant, measure: UnitOfMeasureNode, range) = +type ConstantMeasureNode(constant: Constant, measure: UnitOfMeasureNode, range: range) = inherit NodeBase(range) override val Children: Node array = [| yield Constant.Node constant; yield measure |] - member val Constant = constant - member val Measure = measure + member val Constant: Constant = constant + member val Measure: UnitOfMeasureNode = measure [] type Constant = @@ -2705,7 +2739,7 @@ type TyparDeclNode attributes: MultipleAttributeListNode option, typar: SingleTextNode, intersectionConstraints: Choice list, - range + range: range ) = inherit NodeBase(range) @@ -2719,9 +2753,9 @@ type TyparDeclNode | Choice2Of2 amp -> amp :> Node) intersectionConstraints |] - member val Attributes = attributes - member val TypeParameter = typar - member val IntersectionConstraints = intersectionConstraints + member val Attributes: MultipleAttributeListNode option = attributes + member val TypeParameter: SingleTextNode = typar + member val IntersectionConstraints: Choice list = intersectionConstraints type TyparDeclsPostfixListNode ( @@ -2729,7 +2763,7 @@ type TyparDeclsPostfixListNode decls: TyparDeclNode list, constraints: TypeConstraint list, greaterThan: SingleTextNode, - range + range: range ) = inherit NodeBase(range) @@ -2739,18 +2773,18 @@ type TyparDeclsPostfixListNode yield! List.map TypeConstraint.Node constraints yield greaterThan |] - member val LessThan = lessThan - member val Decls = decls - member val Constraints = constraints - member val GreaterThan = greaterThan + member val LessThan: SingleTextNode = lessThan + member val Decls: TyparDeclNode list = decls + member val Constraints: TypeConstraint list = constraints + member val GreaterThan: SingleTextNode = greaterThan type TyparDeclsPrefixListNode - (openingParen: SingleTextNode, decls: TyparDeclNode list, closingParen: SingleTextNode, range) = + (openingParen: SingleTextNode, decls: TyparDeclNode list, closingParen: SingleTextNode, range: range) = inherit NodeBase(range) override val Children: Node array = [| yield openingParen; yield! nodes decls; yield closingParen |] - member val OpeningParen = openingParen - member val Decls = decls - member val ClosingParen = closingParen + member val OpeningParen: SingleTextNode = openingParen + member val Decls: TyparDeclNode list = decls + member val ClosingParen: SingleTextNode = closingParen [] type TyparDecls = @@ -2764,37 +2798,37 @@ type TyparDecls = | PrefixList n -> n | SinglePrefix n -> n -type TypeConstraintSingleNode(typar: SingleTextNode, kind: SingleTextNode, range) = +type TypeConstraintSingleNode(typar: SingleTextNode, kind: SingleTextNode, range: range) = inherit NodeBase(range) override val Children: Node array = [| yield typar; yield kind |] - member val Typar = typar - member val Kind = kind + member val Typar: SingleTextNode = typar + member val Kind: SingleTextNode = kind -type TypeConstraintDefaultsToTypeNode(defaultNode: SingleTextNode, typar: SingleTextNode, t: Type, range) = +type TypeConstraintDefaultsToTypeNode(defaultNode: SingleTextNode, typar: SingleTextNode, t: Type, range: range) = inherit NodeBase(range) override val Children: Node array = [| yield defaultNode; yield typar; yield Type.Node t |] - member val Default = defaultNode - member val Typar = typar - member val Type = t + member val Default: SingleTextNode = defaultNode + member val Typar: SingleTextNode = typar + member val Type: Type = t -type TypeConstraintSubtypeOfTypeNode(typar: SingleTextNode, t: Type, range) = +type TypeConstraintSubtypeOfTypeNode(typar: SingleTextNode, t: Type, range: range) = inherit NodeBase(range) override val Children: Node array = [| yield typar; yield Type.Node t |] - member val Typar = typar - member val Type = t + member val Typar: SingleTextNode = typar + member val Type: Type = t -type TypeConstraintSupportsMemberNode(t: Type, memberSig: MemberDefn, range) = +type TypeConstraintSupportsMemberNode(t: Type, memberSig: MemberDefn, range: range) = inherit NodeBase(range) override val Children: Node array = [| yield Type.Node t |] - member val Type = t - member val MemberSig = memberSig + member val Type: Type = t + member val MemberSig: MemberDefn = memberSig -type TypeConstraintEnumOrDelegateNode(typar: SingleTextNode, verb: string, ts: Type list, range) = +type TypeConstraintEnumOrDelegateNode(typar: SingleTextNode, verb: string, ts: Type list, range: range) = inherit NodeBase(range) override val Children: Node array = [| yield typar; yield! List.map Type.Node ts |] - member val Typar = typar - member val Verb = verb - member val Types = ts + member val Typar: SingleTextNode = typar + member val Verb: string = verb + member val Types: Type list = ts [] type TypeConstraint = @@ -2814,25 +2848,25 @@ type TypeConstraint = | EnumOrDelegate n -> n | WhereSelfConstrained t -> Type.Node t -type UnitOfMeasureNode(lessThan: SingleTextNode, measure: Measure, greaterThan: SingleTextNode, range) = +type UnitOfMeasureNode(lessThan: SingleTextNode, measure: Measure, greaterThan: SingleTextNode, range: range) = inherit NodeBase(range) override val Children: Node array = [| yield lessThan; yield Measure.Node measure; yield greaterThan |] - member val LessThan = lessThan - member val Measure = measure - member val GreaterThan = greaterThan + member val LessThan: SingleTextNode = lessThan + member val Measure: Measure = measure + member val GreaterThan: SingleTextNode = greaterThan -type MeasureOperatorNode(lhs: Measure, operator: SingleTextNode, rhs: Measure, range) = +type MeasureOperatorNode(lhs: Measure, operator: SingleTextNode, rhs: Measure, range: range) = inherit NodeBase(range) override val Children: Node array = [| yield Measure.Node lhs; yield operator; yield Measure.Node rhs |] - member val LeftHandSide = lhs - member val Operator = operator - member val RightHandSide = rhs + member val LeftHandSide: Measure = lhs + member val Operator: SingleTextNode = operator + member val RightHandSide: Measure = rhs -type MeasureDivideNode(lhs: Measure option, operator: SingleTextNode, rhs: Measure, range) = +type MeasureDivideNode(lhs: Measure option, operator: SingleTextNode, rhs: Measure, range: range) = inherit NodeBase(range) override val Children: Node array = @@ -2842,11 +2876,11 @@ type MeasureDivideNode(lhs: Measure option, operator: SingleTextNode, rhs: Measu yield operator yield Measure.Node rhs |] - member val LeftHandSide = lhs - member val Operator = operator - member val RightHandSide = rhs + member val LeftHandSide: Measure option = lhs + member val Operator: SingleTextNode = operator + member val RightHandSide: Measure = rhs -type MeasurePowerNode(measure: Measure, caret: SingleTextNode, exponent: RationalConstNode, range) = +type MeasurePowerNode(measure: Measure, caret: SingleTextNode, exponent: RationalConstNode, range: range) = inherit NodeBase(range) override val Children: Node array = @@ -2854,23 +2888,23 @@ type MeasurePowerNode(measure: Measure, caret: SingleTextNode, exponent: Rationa yield caret yield RationalConstNode.Node exponent |] - member val Measure = measure - member val Caret = caret - member val Exponent = exponent + member val Measure: Measure = measure + member val Caret: SingleTextNode = caret + member val Exponent: RationalConstNode = exponent -type MeasureSequenceNode(measures: Measure list, range) = +type MeasureSequenceNode(measures: Measure list, range: range) = inherit NodeBase(range) override val Children: Node array = [| yield! List.map Measure.Node measures |] - member val Measures = measures + member val Measures: Measure list = measures -type MeasureParenNode(openingParen: SingleTextNode, measure: Measure, closingParen: SingleTextNode, range) = +type MeasureParenNode(openingParen: SingleTextNode, measure: Measure, closingParen: SingleTextNode, range: range) = inherit NodeBase(range) override val Children: Node array = [| yield openingParen; yield Measure.Node measure; yield closingParen |] - member val OpeningParen = openingParen - member val Measure = measure - member val ClosingParen = closingParen + member val OpeningParen: SingleTextNode = openingParen + member val Measure: Measure = measure + member val ClosingParen: SingleTextNode = closingParen type RationalNode ( @@ -2890,18 +2924,18 @@ type RationalNode yield denominator yield closingParen |] - member val OpeningParen = openingParen - member val Numerator = numerator - member val DivOp = divOp - member val Denominator = denominator - member val ClosingParen = closingParen + member val OpeningParen: SingleTextNode = openingParen + member val Numerator: SingleTextNode = numerator + member val DivOp: SingleTextNode = divOp + member val Denominator: SingleTextNode = denominator + member val ClosingParen: SingleTextNode = closingParen type NegateRationalNode(minus: SingleTextNode, rationalConst: RationalConstNode, range: range) = inherit NodeBase(range) override val Children: Node array = [| yield minus; yield RationalConstNode.Node rationalConst |] - member val Minus = minus - member val Rational = rationalConst + member val Minus: SingleTextNode = minus + member val Rational: RationalConstNode = rationalConst [] type RationalConstNode = diff --git a/src/Fantomas.Core/Utils.fs b/src/Fantomas.Core/Utils.fs index 9e17f4dd7e..20906ee425 100644 --- a/src/Fantomas.Core/Utils.fs +++ b/src/Fantomas.Core/Utils.fs @@ -6,18 +6,18 @@ open Microsoft.FSharp.Core.CompilerServices [] module String = - let startsWithOrdinal (prefix: string) (str: string) = + let startsWithOrdinal (prefix: string) (str: string) : bool = str.StartsWith(prefix, StringComparison.Ordinal) - let endsWithOrdinal (postfix: string) (str: string) = + let endsWithOrdinal (postfix: string) (str: string) : bool = str.EndsWith(postfix, StringComparison.Ordinal) - let empty = String.Empty - let isNotNullOrEmpty = String.IsNullOrEmpty >> not - let isNotNullOrWhitespace = String.IsNullOrWhiteSpace >> not + let empty: string = String.Empty + let isNotNullOrEmpty: string -> bool = String.IsNullOrEmpty >> not + let isNotNullOrWhitespace: string -> bool = String.IsNullOrWhiteSpace >> not module List = - let chooseState f state l = + let chooseState<'a, 'b, 'c> (f: 'a -> 'b -> 'a * 'c option) (state: 'a) (l: 'b list) : 'c list = let mutable s = state l @@ -26,15 +26,15 @@ module List = s <- s' r) - let isNotEmpty l = (List.isEmpty >> not) l + let isNotEmpty<'a> (l: 'a list) : bool = (List.isEmpty >> not) l - let moreThanOne = + let moreThanOne<'a> : 'a list -> bool = function | [] | [ _ ] -> false | _ -> true - let partitionWhile (f: int -> 'a -> bool) (xs: 'a list) : 'a list * 'a list = + let private partitionWhile (f: int -> 'a -> bool) (xs: 'a list) : 'a list * 'a list = let rec go i before after = match after with | head :: tail -> @@ -45,7 +45,7 @@ module List = go 0 [] xs - let mapWithLast (f: 'a -> 'b) (g: 'a -> 'b) (xs: 'a list) = + let mapWithLast<'a, 'b> (f: 'a -> 'b) (g: 'a -> 'b) (xs: 'a list) : 'b list = let rec visit xs continuation = match xs with | [] -> continuation [] @@ -54,7 +54,7 @@ module List = visit xs id - let cutOffLast list = + let cutOffLast<'a> (list: 'a list) : 'a list = let mutable headList = ListCollector<'a>() let rec visit list = @@ -68,7 +68,7 @@ module List = visit list headList.Close() - let foldWithLast + let foldWithLast<'state, 'item> (f: 'state -> 'item -> 'state) (g: 'state -> 'item -> 'state) (initialState: 'state) @@ -83,7 +83,7 @@ module List = visit initialState items module Async = - let map f computation = + let map<'a, 'b> (f: 'a -> 'b) (computation: Async<'a>) : Async<'b> = async.Bind(computation, f >> async.Return) [] diff --git a/src/Fantomas.Core/Validation.fs b/src/Fantomas.Core/Validation.fs index 843b3b3205..bc29c3e13e 100644 --- a/src/Fantomas.Core/Validation.fs +++ b/src/Fantomas.Core/Validation.fs @@ -8,14 +8,14 @@ open Fantomas.FCS.Parse // See https://github.com/dotnet/fsharp/blob/2a25184293e39a635217670652b00680de04472a/src/Compiler/Driver/CompilerDiagnostics.fs#L214 // and https://github.com/dotnet/fsharp/blob/b7e747921515ae7939c7cb6885513eb80ec7ca2f/src/Compiler/FSComp.txt // for error codes -let safeToIgnoreWarnings = +let private safeToIgnoreWarnings = set [ 35 // Deprecated 42 // LibraryUseOnly 46 // ReservedKeyword 1104 ] // lexhlpIdentifiersContainingAtSymbolReserved -let noWarningOrErrorDiagnostics diagnostics = +let noWarningOrErrorDiagnostics (diagnostics: FSharpParserDiagnostic list) : bool = diagnostics |> List.filter (fun e -> match e.Severity with diff --git a/src/Fantomas.Core/Version.fs b/src/Fantomas.Core/Version.fs index 6b15da1d7c..293a29134f 100644 --- a/src/Fantomas.Core/Version.fs +++ b/src/Fantomas.Core/Version.fs @@ -2,7 +2,7 @@ module internal Fantomas.Core.Version open System.Reflection -let fantomasVersion = +let fantomasVersion: Lazy = lazy (let assembly = typeof.Assembly From 0681421d2f8bf3d6cd0ceb23c09596b18fafa616 Mon Sep 17 00:00:00 2001 From: nojaf Date: Tue, 26 Dec 2023 09:47:53 +0100 Subject: [PATCH 3/4] More top level types --- .../Fantomas.Core.Tests.fsproj | 1 - src/Fantomas.Core.Tests/UtilsTests.fs | 51 ---- src/Fantomas.Core/Context.fs | 275 +++++++++++------- src/Fantomas.Core/Queue.fs | 40 +-- src/Fantomas.Core/Trivia.fs | 25 +- src/Fantomas.Core/Utils.fs | 11 - 6 files changed, 197 insertions(+), 206 deletions(-) delete mode 100644 src/Fantomas.Core.Tests/UtilsTests.fs diff --git a/src/Fantomas.Core.Tests/Fantomas.Core.Tests.fsproj b/src/Fantomas.Core.Tests/Fantomas.Core.Tests.fsproj index fc1f54d822..4671015f27 100644 --- a/src/Fantomas.Core.Tests/Fantomas.Core.Tests.fsproj +++ b/src/Fantomas.Core.Tests/Fantomas.Core.Tests.fsproj @@ -9,7 +9,6 @@ - diff --git a/src/Fantomas.Core.Tests/UtilsTests.fs b/src/Fantomas.Core.Tests/UtilsTests.fs deleted file mode 100644 index 47c2968229..0000000000 --- a/src/Fantomas.Core.Tests/UtilsTests.fs +++ /dev/null @@ -1,51 +0,0 @@ -module Fantomas.Core.Tests.UtilsTests - -open NUnit.Framework -open Fantomas.Core -open FsCheck - -[] -let ``when input is empty`` () = - let property (p: bool) : bool = - let before, after = List.partitionWhile (fun _ _ -> p) [] - List.isEmpty before && List.isEmpty after - - Check.QuickThrowOnFailure property - -[] -let ``when predicate always returns false`` () = - let property (xs: int list) : bool = - let before, after = List.partitionWhile (fun _ _ -> false) xs - - List.isEmpty before && after = xs - - Check.QuickThrowOnFailure property - -[] -let ``when predicate always returns true`` () = - let property (xs: int list) : bool = - let before, after = List.partitionWhile (fun _ _ -> true) xs - - before = xs && List.isEmpty after - - Check.QuickThrowOnFailure property - -[] -let ``when predicate returns true until certain index`` () = - let property (xs: int list, i: int) : bool = - let before, after = List.partitionWhile (fun index _ -> i <> index) xs - - let beforeLength = List.length before - let afterLength = List.length after - beforeLength = i && afterLength = List.length xs - i && before @ after = xs - - let gen = - gen { - let! xs = Arb.generate |> Gen.nonEmptyListOf - let len = List.length xs - let! n = Gen.choose (0, len - 1) - - return (xs, n) - } - - property |> Prop.forAll (Arb.fromGen gen) |> Check.QuickThrowOnFailure diff --git a/src/Fantomas.Core/Context.fs b/src/Fantomas.Core/Context.fs index b6b2a60a5d..82f01dff45 100644 --- a/src/Fantomas.Core/Context.fs +++ b/src/Fantomas.Core/Context.fs @@ -19,7 +19,7 @@ type WriterEvent = | SetAtColumn of int | RestoreAtColumn of int -let (|CommentOrDefineEvent|_|) we = +let private (|CommentOrDefineEvent|_|) we = match we with | Write w when (String.startsWithOrdinal "//" w) -> Some we | Write w when (String.startsWithOrdinal "#if" w) -> Some we @@ -28,7 +28,7 @@ let (|CommentOrDefineEvent|_|) we = | Write w when (String.startsWithOrdinal "(*" w) -> Some we | _ -> None -let (|EmptyWrite|_|) (we: WriterEvent) = +let private (|EmptyWrite|_|) (we: WriterEvent) = match we with | Write v -> if String.IsNullOrWhiteSpace v then Some() else None | _ -> None @@ -38,7 +38,7 @@ type ShortExpressionInfo = StartColumn: int ConfirmedMultiline: bool } - member x.IsTooLong maxPageWidth currentColumn = + member x.IsTooLong (maxPageWidth: int) (currentColumn: int) : bool = currentColumn - x.StartColumn > x.MaxWidth // expression is not too long according to MaxWidth || (currentColumn > maxPageWidth) // expression at current position is not going over the page width @@ -67,13 +67,13 @@ type WriterModel = Column: int } - member __.IsDummy = + member __.IsDummy: bool = match __.Mode with | Dummy -> true | _ -> false module WriterModel = - let init = + let init: WriterModel = { Lines = [ "" ] Indent = 0 AtColumn = 0 @@ -81,7 +81,7 @@ module WriterModel = Mode = Standard Column = 0 } - let update maxPageWidth cmd m = + let update (maxPageWidth: int) (cmd: WriterEvent) (m: WriterModel) : WriterModel = let doNewline m = let m = { m with @@ -159,7 +159,7 @@ module WriterModel = updateCmd cmd module WriterEvents = - let normalize ev = + let normalize (ev: WriterEvent) : WriterEvent list = match ev with | Write s when s.Contains("\n") -> let writeLine = @@ -175,7 +175,7 @@ module WriterEvents = |> Seq.toList | _ -> [ ev ] - let isMultiline evs = + let isMultiline (evs: Queue) : bool = evs |> Queue.toSeq |> Seq.exists (function @@ -191,16 +191,16 @@ type Context = FormattedCursor: pos option } /// Initialize with a string writer and use space as delimiter - static member Default = + static member Default: Context = { Config = FormatConfig.Default WriterModel = WriterModel.init WriterEvents = Queue.empty FormattedCursor = None } - static member Create config : Context = + static member Create(config: FormatConfig) : Context = { Context.Default with Config = config } - member x.WithDummy(writerCommands, ?keepPageWidth) = + member x.WithDummy(writerCommands: Queue, ?keepPageWidth: bool) : Context = let keepPageWidth = keepPageWidth |> Option.defaultValue false let mkModel m = @@ -222,7 +222,7 @@ type Context = WriterEvents = writerCommands Config = config } - member x.WithShortExpression(maxWidth, ?startColumn) = + member x.WithShortExpression(maxWidth: int, ?startColumn: int) : Context = let info = { MaxWidth = maxWidth StartColumn = Option.defaultValue x.WriterModel.Column startColumn @@ -243,7 +243,7 @@ type Context = { x.WriterModel with Mode = ShortExpression([ info ]) } } - member x.Column = x.WriterModel.Column + member x.Column: int = x.WriterModel.Column /// This adds a WriterEvent to the Context. /// One event could potentially be split up into multiple events. @@ -262,16 +262,16 @@ let writerEvent (e: WriterEvent) (ctx: Context) : Context = ctx' -let hasWriteBeforeNewlineContent ctx = +let hasWriteBeforeNewlineContent (ctx: Context) : bool = String.isNotNullOrEmpty ctx.WriterModel.WriteBeforeNewline -let finalizeWriterModel (ctx: Context) = +let private finalizeWriterModel (ctx: Context) = if hasWriteBeforeNewlineContent ctx then writerEvent (Write ctx.WriterModel.WriteBeforeNewline) ctx else ctx -let dump (isSelection: bool) (ctx: Context) = +let dump (isSelection: bool) (ctx: Context) : FormatResult = let ctx = finalizeWriterModel ctx let code = @@ -289,7 +289,7 @@ let dump (isSelection: bool) (ctx: Context) = { Code = code Cursor = ctx.FormattedCursor } -let dumpAndContinue (ctx: Context) = +let private dumpAndContinue (ctx: Context) = #if DEBUG let m = finalizeWriterModel ctx let lines = m.WriterModel.Lines |> List.rev @@ -302,15 +302,15 @@ let dumpAndContinue (ctx: Context) = type Context with - member x.FinalizeModel = finalizeWriterModel x + member x.FinalizeModel: Context = finalizeWriterModel x - member x.Dump() = + member x.Dump() : string = let m = finalizeWriterModel x let lines = m.WriterModel.Lines |> List.rev String.concat x.Config.EndOfLine.NewLineString lines -let writeEventsOnLastLine ctx = +let private writeEventsOnLastLine ctx = ctx.WriterEvents |> Queue.rev |> Seq.takeWhile (function @@ -322,7 +322,7 @@ let writeEventsOnLastLine ctx = | Write w when (String.length w > 0) -> Some w | _ -> None) -let lastWriteEventIsNewline ctx = +let lastWriteEventIsNewline (ctx: Context) : bool = ctx.WriterEvents |> Queue.rev |> Seq.skipWhile (function @@ -338,7 +338,7 @@ let lastWriteEventIsNewline ctx = | _ -> false) |> Option.defaultValue false -let (|EmptyHashDefineBlock|_|) (events: WriterEvent array) = +let private (|EmptyHashDefineBlock|_|) (events: WriterEvent array) = match Array.tryHead events, Array.tryLast events with | Some(CommentOrDefineEvent _), Some(CommentOrDefineEvent _) -> // Check if there is an empty block between hash defines @@ -358,7 +358,7 @@ let (|EmptyHashDefineBlock|_|) (events: WriterEvent array) = | _ -> None /// Validate if there is a complete blank line between the last write event and the last event -let newlineBetweenLastWriteEvent ctx = +let private newlineBetweenLastWriteEvent ctx = ctx.WriterEvents |> Queue.rev |> Seq.takeWhile (function @@ -377,22 +377,22 @@ let newlineBetweenLastWriteEvent ctx = |> Seq.length |> fun writeLines -> writeLines > 1 -let lastWriteEventOnLastLine ctx = +let private lastWriteEventOnLastLine ctx = writeEventsOnLastLine ctx |> Seq.tryHead // A few utility functions from https://github.com/fsharp/powerpack/blob/master/src/FSharp.Compiler.CodeDom/generator.fs /// Indent one more level based on configuration -let indent (ctx: Context) = +let indent (ctx: Context) : Context = // if atColumn is bigger then after indent, then we use atColumn as base for indent writerEvent (IndentBy ctx.Config.IndentSize) ctx /// Unindent one more level based on configuration -let unindent (ctx: Context) = +let unindent (ctx: Context) : Context = writerEvent (UnIndentBy ctx.Config.IndentSize) ctx /// Apply function f at an absolute indent level (use with care) -let atIndentLevel alsoSetIndent level (f: Context -> Context) (ctx: Context) = +let atIndentLevel (alsoSetIndent: bool) (level: int) (f: Context -> Context) (ctx: Context) : Context = if level < 0 then invalidArg "level" "The indent level cannot be negative." @@ -414,7 +414,7 @@ let atIndentLevel alsoSetIndent level (f: Context -> Context) (ctx: Context) = /// Y = 1 // indent=0, atColumn=2 /// } /// `atCurrentColumn` was called on `X`, then `indent` was called, but "some long string" have indent only 4, because it is bigger than `atColumn` (2). -let atCurrentColumn (f: _ -> Context) (ctx: Context) = atIndentLevel false ctx.Column f ctx +let atCurrentColumn (f: _ -> Context) (ctx: Context) : Context = atIndentLevel false ctx.Column f ctx /// Write everything at current column indentation, set `indent` and `atColumn` on current column position /// /// Example (same as above): @@ -423,20 +423,20 @@ let atCurrentColumn (f: _ -> Context) (ctx: Context) = atIndentLevel false ctx.C /// Y = 1 // indent=2, atColumn=2 /// } /// `atCurrentColumn` was called on `X`, then `indent` was called, "some long string" have indent 6, because it is indented from `atCurrentColumn` pos (2). -let atCurrentColumnIndent (f: _ -> Context) (ctx: Context) = atIndentLevel true ctx.Column f ctx +let atCurrentColumnIndent (f: _ -> Context) (ctx: Context) : Context = atIndentLevel true ctx.Column f ctx /// Function composition operator -let (+>) (ctx: Context -> Context) (f: _ -> Context) x = +let (+>) (ctx: Context -> Context) (f: _ -> Context) (x: Context) : Context = let y = ctx x match y.WriterModel.Mode with | ShortExpression infos when infos |> List.exists (fun x -> x.ConfirmedMultiline) -> y | _ -> f y -let (!-) (str: string) = writerEvent (Write str) +let (!-) (str: string) : Context -> Context = writerEvent (Write str) /// Similar to col, and supply index as well -let coli f' (c: 'T seq) f (ctx: Context) = +let coli<'T> (f': Context -> Context) (c: 'T seq) (f: int -> 'T -> Context -> Context) (ctx: Context) : Context = let mutable tryPick = true let mutable st = ctx let mutable i = 0 @@ -453,7 +453,7 @@ let coli f' (c: 'T seq) f (ctx: Context) = /// Process collection - keeps context through the whole processing /// calls f for every element in sequence and f' between every two elements /// as a separator. This is a variant that works on typed collections. -let col f' (c: 'T seq) f (ctx: Context) = +let col<'T> (f': Context -> Context) (c: 'T seq) (f: 'T -> Context -> Context) (ctx: Context) : Context = let mutable tryPick = true let mutable st = ctx let e = c.GetEnumerator() @@ -465,7 +465,7 @@ let col f' (c: 'T seq) f (ctx: Context) = st // Similar to col but pass the item of 'T to f' as well -let colEx f' (c: 'T seq) f (ctx: Context) = +let colEx<'T> (f': 'T -> Context -> Context) (c: 'T seq) (f: 'T -> Context -> Context) (ctx: Context) : Context = let mutable tryPick = true let mutable st = ctx let e = c.GetEnumerator() @@ -477,65 +477,85 @@ let colEx f' (c: 'T seq) f (ctx: Context) = st /// Similar to col, apply one more function f2 at the end if the input sequence is not empty -let colPost f2 f1 (c: 'T seq) f (ctx: Context) = +let colPost<'T> + (f2: Context -> Context) + (f1: Context -> Context) + (c: 'T seq) + (f: 'T -> Context -> Context) + (ctx: Context) + : Context = if Seq.isEmpty c then ctx else f2 (col f1 c f ctx) /// Similar to col, apply one more function f2 at the beginning if the input sequence is not empty -let colPre f2 f1 (c: 'T seq) f (ctx: Context) = +let colPre<'T> + (f2: Context -> Context) + (f1: Context -> Context) + (c: 'T seq) + (f: 'T -> Context -> Context) + (ctx: Context) + : Context = if Seq.isEmpty c then ctx else col f1 c f (f2 ctx) /// If there is a value, apply f and f' accordingly, otherwise do nothing -let opt (f': Context -> _) o f (ctx: Context) = +let opt<'a> (f': Context -> _) (o: 'a option) (f: 'a -> Context -> Context) (ctx: Context) : Context = match o with | Some x -> f' (f x ctx) | None -> ctx /// similar to opt, only takes a single function f to apply when there is a value -let optSingle f o ctx = +let optSingle<'a, 'b> (f: 'a -> 'b -> 'b) (o: 'a option) (ctx: 'b) : 'b = match o with | Some x -> f x ctx | None -> ctx /// Similar to opt, but apply f2 at the beginning if there is a value -let optPre (f2: _ -> Context) (f1: Context -> _) o f (ctx: Context) = +let optPre<'a> + (f2: _ -> Context) + (f1: Context -> _) + (o: 'a option) + (f: 'a -> Context -> Context) + (ctx: Context) + : Context = match o with | Some x -> f1 (f x (f2 ctx)) | None -> ctx -let getListOrArrayExprSize ctx maxWidth xs = +let getListOrArrayExprSize<'a> (ctx: Context) (maxWidth: Num) (xs: 'a list) : Size = match ctx.Config.ArrayOrListMultilineFormatter with | MultilineFormatterType.CharacterWidth -> Size.CharacterWidth maxWidth | MultilineFormatterType.NumberOfItems -> Size.NumberOfItems(List.length xs, ctx.Config.MaxArrayOrListNumberOfItems) -let getRecordSize ctx fields = +let getRecordSize<'a> (ctx: Context) (fields: 'a list) : Size = match ctx.Config.RecordMultilineFormatter with | MultilineFormatterType.CharacterWidth -> Size.CharacterWidth ctx.Config.MaxRecordWidth | MultilineFormatterType.NumberOfItems -> Size.NumberOfItems(List.length fields, ctx.Config.MaxRecordNumberOfItems) /// b is true, apply f1 otherwise apply f2 -let ifElse b (f1: Context -> Context) f2 (ctx: Context) = if b then f1 ctx else f2 ctx +let ifElse (b: bool) (f1: Context -> Context) (f2: Context -> Context) (ctx: Context) : Context = + if b then f1 ctx else f2 ctx -let ifElseCtx cond (f1: Context -> Context) f2 (ctx: Context) = if cond ctx then f1 ctx else f2 ctx +let ifElseCtx (cond: Context -> bool) (f1: Context -> Context) (f2: Context -> Context) (ctx: Context) : Context = + if cond ctx then f1 ctx else f2 ctx /// apply f only when cond is true -let onlyIf cond f ctx = if cond then f ctx else ctx +let onlyIf<'a> (cond: bool) (f: 'a -> 'a) (ctx: 'a) : 'a = if cond then f ctx else ctx -let onlyIfCtx cond f ctx = if cond ctx then f ctx else ctx +let onlyIfCtx<'a> (cond: 'a -> bool) (f: 'a -> 'a) (ctx: 'a) : 'a = if cond ctx then f ctx else ctx -let onlyIfNot cond f ctx = if cond then ctx else f ctx +let onlyIfNot<'a> (cond: bool) (f: 'a -> 'a) (ctx: 'a) : 'a = if cond then ctx else f ctx -let whenShortIndent f ctx = +let private whenShortIndent f ctx = onlyIf (ctx.Config.IndentSize < 3) f ctx /// Repeat application of a function n times -let rep n (f: Context -> Context) (ctx: Context) = +let rep (n: int) (f: Context -> Context) (ctx: Context) : Context = [ 1..n ] |> List.fold (fun c _ -> f c) ctx // Separator functions -let sepNone = id -let sepDot = !- "." +let sepNone<'a> : 'a -> 'a = id +let sepDot: Context -> Context = !- "." -let sepSpace (ctx: Context) = +let sepSpace (ctx: Context) : Context = if ctx.WriterModel.IsDummy then (!- " ") ctx else @@ -550,49 +570,49 @@ let addFixedSpaces (targetColumn: int) (ctx: Context) : Context = let delta = targetColumn - ctx.Column onlyIf (delta > 0) (rep delta (!- " ")) ctx -let sepNln = writerEvent WriteLine +let sepNln: Context -> Context = writerEvent WriteLine // Use a different WriteLine event to indicate that the newline was introduces due to trivia // This is later useful when checking if an expression was multiline when checking for ColMultilineItem -let sepNlnForTrivia = writerEvent WriteLineBecauseOfTrivia +let sepNlnForTrivia: Context -> Context = writerEvent WriteLineBecauseOfTrivia -let sepNlnUnlessLastEventIsNewline (ctx: Context) = +let sepNlnUnlessLastEventIsNewline (ctx: Context) : Context = if lastWriteEventIsNewline ctx then ctx else sepNln ctx -let sepStar = sepSpace +> !- "* " -let sepEq = !- " =" -let sepEqFixed = !- "=" -let sepArrow = !- " -> " -let sepArrowRev = !- " <- " -let sepBar = !- "| " +let sepStar: Context -> Context = sepSpace +> !- "* " +let sepEq: Context -> Context = !- " =" +let sepEqFixed: Context -> Context = !- "=" +let sepArrow: Context -> Context = !- " -> " +let sepArrowRev: Context -> Context = !- " <- " +let sepBar: Context -> Context = !- "| " -let addSpaceIfSpaceAroundDelimiter (ctx: Context) = +let addSpaceIfSpaceAroundDelimiter (ctx: Context) : Context = onlyIf ctx.Config.SpaceAroundDelimiter sepSpace ctx -let addSpaceIfSpaceAfterComma (ctx: Context) = +let addSpaceIfSpaceAfterComma (ctx: Context) : Context = onlyIf ctx.Config.SpaceAfterComma sepSpace ctx /// opening token of list -let sepOpenLFixed = !- "[" +let sepOpenLFixed: Context -> Context = !- "[" /// closing token of list -let sepCloseLFixed = !- "]" +let sepCloseLFixed: Context -> Context = !- "]" /// opening token of anon record -let sepOpenAnonRecdFixed = !- "{|" +let sepOpenAnonRecdFixed: Context -> Context = !- "{|" /// opening token of tuple -let sepOpenT = !- "(" +let sepOpenT: Context -> Context = !- "(" /// closing token of tuple -let sepCloseT = !- ")" +let sepCloseT: Context -> Context = !- ")" -let wordAnd = sepSpace +> !- "and " -let wordAndFixed = !- "and" -let wordOf = sepSpace +> !- "of " +let wordAnd: Context -> Context = sepSpace +> !- "and " +let wordAndFixed: Context -> Context = !- "and" +let wordOf: Context -> Context = sepSpace +> !- "of " -let indentSepNlnUnindent f = indent +> sepNln +> f +> unindent +let indentSepNlnUnindent (f: Context -> Context) : Context -> Context = indent +> sepNln +> f +> unindent -let shortExpressionWithFallback +let private shortExpressionWithFallback (shortExpression: Context -> Context) fallbackExpression maxWidth @@ -635,13 +655,27 @@ let shortExpressionWithFallback // you should never hit this branch fallbackExpression ctx -let isShortExpression maxWidth (shortExpression: Context -> Context) fallbackExpression (ctx: Context) = +let isShortExpression + (maxWidth: int) + (shortExpression: Context -> Context) + (fallbackExpression: Context -> Context) + (ctx: Context) + : Context = shortExpressionWithFallback shortExpression fallbackExpression maxWidth None ctx -let expressionFitsOnRestOfLine expression fallbackExpression (ctx: Context) = +let expressionFitsOnRestOfLine + (expression: Context -> Context) + (fallbackExpression: Context -> Context) + (ctx: Context) + : Context = shortExpressionWithFallback expression fallbackExpression ctx.Config.MaxLineLength (Some 0) ctx -let isSmallExpression size (smallExpression: Context -> Context) fallbackExpression (ctx: Context) = +let isSmallExpression + (size: Size) + (smallExpression: Context -> Context) + (fallbackExpression: Context -> Context) + (ctx: Context) + : Context = match size with | CharacterWidth maxWidth -> isShortExpression maxWidth smallExpression fallbackExpression ctx | NumberOfItems(items, maxItems) -> @@ -651,7 +685,11 @@ let isSmallExpression size (smallExpression: Context -> Context) fallbackExpress expressionFitsOnRestOfLine smallExpression fallbackExpression ctx /// provide the line and column before and after the leadingExpression to to the continuation expression -let leadingExpressionResult leadingExpression continuationExpression (ctx: Context) = +let leadingExpressionResult<'a> + (leadingExpression: Context -> Context) + (continuationExpression: (int * int) * (int * int) -> Context -> 'a) + (ctx: Context) + : 'a = let lineCountBefore, columnBefore = List.length ctx.WriterModel.Lines, ctx.WriterModel.Column @@ -669,7 +707,11 @@ let leadingExpressionResult leadingExpression continuationExpression (ctx: Conte /// let b = 8 /// let c = 9 /// The second binding b is not consider multiline. -let leadingExpressionIsMultiline leadingExpression continuationExpression (ctx: Context) = +let leadingExpressionIsMultiline<'a> + (leadingExpression: Context -> Context) + (continuationExpression: bool -> Context -> 'a) + (ctx: Context) + : 'a = let eventCountBeforeExpression = Queue.length ctx.WriterEvents let contextAfterLeading = leadingExpression ctx @@ -691,7 +733,7 @@ let leadingExpressionIsMultiline leadingExpression continuationExpression (ctx: continuationExpression hasWriteLineEventsAfterExpression contextAfterLeading -let expressionExceedsPageWidth beforeShort afterShort beforeLong afterLong expr (ctx: Context) = +let private expressionExceedsPageWidth beforeShort afterShort beforeLong afterLong expr (ctx: Context) = // if the context is already inside a ShortExpression mode, we should try the shortExpression in this case. match ctx.WriterModel.Mode with | ShortExpression infos when @@ -730,7 +772,7 @@ let expressionExceedsPageWidth beforeShort afterShort beforeLong afterLong expr /// try and write the expression on the remainder of the current line /// add an indent and newline if the expression is longer -let autoIndentAndNlnIfExpressionExceedsPageWidth expr (ctx: Context) = +let autoIndentAndNlnIfExpressionExceedsPageWidth (expr: Context -> Context) (ctx: Context) : Context = expressionExceedsPageWidth sepNone sepNone // before and after for short expressions @@ -739,7 +781,7 @@ let autoIndentAndNlnIfExpressionExceedsPageWidth expr (ctx: Context) = expr ctx -let sepSpaceOrIndentAndNlnIfExpressionExceedsPageWidth expr (ctx: Context) = +let sepSpaceOrIndentAndNlnIfExpressionExceedsPageWidth (expr: Context -> Context) (ctx: Context) : Context = expressionExceedsPageWidth sepSpace sepNone // before and after for short expressions @@ -748,7 +790,7 @@ let sepSpaceOrIndentAndNlnIfExpressionExceedsPageWidth expr (ctx: Context) = expr ctx -let sepSpaceOrDoubleIndentAndNlnIfExpressionExceedsPageWidth expr (ctx: Context) = +let sepSpaceOrDoubleIndentAndNlnIfExpressionExceedsPageWidth (expr: Context -> Context) (ctx: Context) : Context = expressionExceedsPageWidth sepSpace sepNone // before and after for short expressions @@ -757,7 +799,7 @@ let sepSpaceOrDoubleIndentAndNlnIfExpressionExceedsPageWidth expr (ctx: Context) expr ctx -let isStroustrupStyleExpr (config: FormatConfig) (e: Expr) = +let isStroustrupStyleExpr (config: FormatConfig) (e: Expr) : bool = let isStroustrupEnabled = config.MultilineBracketStyle = Stroustrup match e with @@ -767,37 +809,45 @@ let isStroustrupStyleExpr (config: FormatConfig) (e: Expr) = | Expr.NamedComputation _ -> not config.NewlineBeforeMultilineComputationExpression | _ -> false -let isStroustrupStyleType (config: FormatConfig) (t: Type) = +let private isStroustrupStyleType (config: FormatConfig) (t: Type) = let isStroustrupEnabled = config.MultilineBracketStyle = Stroustrup match t with | Type.AnonRecord _ when isStroustrupEnabled -> true | _ -> false -let canSafelyUseStroustrup (node: Node) (ctx: Context) = +let private canSafelyUseStroustrup (node: Node) (ctx: Context) = not node.HasContentBefore && not (hasWriteBeforeNewlineContent ctx) -let sepSpaceOrIndentAndNlnIfExceedsPageWidthUnlessStroustrup isStroustrup f (node: Node) (ctx: Context) = +let private sepSpaceOrIndentAndNlnIfExceedsPageWidthUnlessStroustrup isStroustrup f (node: Node) (ctx: Context) = if isStroustrup && canSafelyUseStroustrup node ctx then (sepSpace +> f) ctx else sepSpaceOrIndentAndNlnIfExpressionExceedsPageWidth f ctx -let sepSpaceOrIndentAndNlnIfExpressionExceedsPageWidthUnlessStroustrup f (expr: Expr) (ctx: Context) = +let sepSpaceOrIndentAndNlnIfExpressionExceedsPageWidthUnlessStroustrup + (f: Expr -> Context -> Context) + (expr: Expr) + (ctx: Context) + : Context = sepSpaceOrIndentAndNlnIfExceedsPageWidthUnlessStroustrup (isStroustrupStyleExpr ctx.Config expr) (f expr) (Expr.Node expr) ctx -let sepSpaceOrIndentAndNlnIfTypeExceedsPageWidthUnlessStroustrup f (t: Type) (ctx: Context) = +let sepSpaceOrIndentAndNlnIfTypeExceedsPageWidthUnlessStroustrup + (f: Type -> Context -> Context) + (t: Type) + (ctx: Context) + : Context = sepSpaceOrIndentAndNlnIfExceedsPageWidthUnlessStroustrup (isStroustrupStyleType ctx.Config t) (f t) (Type.Node t) ctx -let autoNlnIfExpressionExceedsPageWidth expr (ctx: Context) = +let private autoNlnIfExpressionExceedsPageWidth expr (ctx: Context) = expressionExceedsPageWidth sepNone sepNone // before and after for short expressions @@ -806,10 +856,10 @@ let autoNlnIfExpressionExceedsPageWidth expr (ctx: Context) = expr ctx -let autoParenthesisIfExpressionExceedsPageWidth expr (ctx: Context) = +let autoParenthesisIfExpressionExceedsPageWidth (expr: Context -> Context) (ctx: Context) : Context = expressionFitsOnRestOfLine expr (sepOpenT +> expr +> sepCloseT) ctx -let futureNlnCheckMem (f, ctx) = +let private futureNlnCheckMem (f, ctx) = if ctx.WriterModel.IsDummy then (false, false) else @@ -817,13 +867,13 @@ let futureNlnCheckMem (f, ctx) = let dummyCtx: Context = ctx.WithDummy(Queue.empty, keepPageWidth = true) |> f WriterEvents.isMultiline dummyCtx.WriterEvents, dummyCtx.Column > ctx.Config.MaxLineLength -let futureNlnCheck f (ctx: Context) = +let futureNlnCheck (f: Context -> Context) (ctx: Context) : bool = let isMultiLine, isLong = futureNlnCheckMem (f, ctx) isMultiLine || isLong /// similar to futureNlnCheck but validates whether the expression is going over the max page width /// This functions is does not use any caching -let exceedsWidth maxWidth f (ctx: Context) = +let exceedsWidth (maxWidth: int) (f: Context -> Context) (ctx: Context) : bool = let dummyCtx: Context = ctx.WithDummy(Queue.empty, keepPageWidth = true) let currentLines = dummyCtx.WriterModel.Lines.Length @@ -837,7 +887,7 @@ let exceedsWidth maxWidth f (ctx: Context) = || currentColumn > ctx.Config.MaxLineLength /// Similar to col, skip auto newline for index 0 -let colAutoNlnSkip0i f' (c: 'T seq) f (ctx: Context) = +let private colAutoNlnSkip0i f' (c: 'T seq) f (ctx: Context) = coli f' c @@ -849,15 +899,16 @@ let colAutoNlnSkip0i f' (c: 'T seq) f (ctx: Context) = ctx /// Similar to col, skip auto newline for index 0 -let colAutoNlnSkip0 f' c f = colAutoNlnSkip0i f' c (fun _ -> f) +let colAutoNlnSkip0<'a> (f': Context -> Context) (c: 'a seq) (f: 'a -> Context -> Context) : Context -> Context = + colAutoNlnSkip0i f' c (fun _ -> f) -let sepSpaceBeforeClassConstructor ctx = +let sepSpaceBeforeClassConstructor (ctx: Context) : Context = if ctx.Config.SpaceBeforeClassConstructor then sepSpace ctx else ctx -let sepColon (ctx: Context) = +let sepColon (ctx: Context) : Context = let defaultExpr = if ctx.Config.SpaceBeforeColon then !- " : " else !- ": " if ctx.WriterModel.IsDummy then @@ -868,17 +919,17 @@ let sepColon (ctx: Context) = | None -> !- ": " ctx | _ -> defaultExpr ctx -let sepColonFixed = !- ":" +let sepColonFixed: Context -> Context = !- ":" -let sepColonWithSpacesFixed = !- " : " +let sepColonWithSpacesFixed: Context -> Context = !- " : " -let sepComma (ctx: Context) = +let sepComma (ctx: Context) : Context = if ctx.Config.SpaceAfterComma then !- ", " ctx else !- "," ctx -let sepSemi (ctx: Context) = +let sepSemi (ctx: Context) : Context = let { Config = { SpaceBeforeSemicolon = before SpaceAfterSemicolon = after } } = ctx @@ -890,7 +941,7 @@ let sepSemi (ctx: Context) = | true, true -> !- " ; " <| ctx -let ifAlignOrStroustrupBrackets f g = +let ifAlignOrStroustrupBrackets (f: Context -> Context) (g: Context -> Context) : Context -> Context = ifElseCtx (fun ctx -> match ctx.Config.MultilineBracketStyle with @@ -900,28 +951,28 @@ let ifAlignOrStroustrupBrackets f g = f g -let sepNlnWhenWriteBeforeNewlineNotEmptyOr fallback (ctx: Context) = +let sepNlnWhenWriteBeforeNewlineNotEmptyOr (fallback: Context -> Context) (ctx: Context) : Context = if hasWriteBeforeNewlineContent ctx then sepNln ctx else fallback ctx -let sepNlnWhenWriteBeforeNewlineNotEmpty = +let sepNlnWhenWriteBeforeNewlineNotEmpty: Context -> Context = sepNlnWhenWriteBeforeNewlineNotEmptyOr sepNone -let sepSpaceUnlessWriteBeforeNewlineNotEmpty (ctx: Context) = +let sepSpaceUnlessWriteBeforeNewlineNotEmpty (ctx: Context) : Context = if hasWriteBeforeNewlineContent ctx then ctx else sepSpace ctx -let autoIndentAndNlnWhenWriteBeforeNewlineNotEmpty (f: Context -> Context) (ctx: Context) = +let autoIndentAndNlnWhenWriteBeforeNewlineNotEmpty (f: Context -> Context) (ctx: Context) : Context = if hasWriteBeforeNewlineContent ctx then indentSepNlnUnindent f ctx else f ctx -let addParenIfAutoNln expr f = +let addParenIfAutoNln (expr: Expr) (f: Expr -> Context -> Context) : Context -> Context = let hasParenthesis = match expr with | Expr.Paren _ @@ -934,7 +985,7 @@ let addParenIfAutoNln expr f = let expr = f expr expressionFitsOnRestOfLine expr (ifElse hasParenthesis (sepOpenT +> expr +> sepCloseT) expr) -let indentSepNlnUnindentUnlessStroustrup f (e: Expr) (ctx: Context) = +let indentSepNlnUnindentUnlessStroustrup (f: Expr -> Context -> Context) (e: Expr) (ctx: Context) : Context = let shouldUseStroustrup = isStroustrupStyleExpr ctx.Config e && canSafelyUseStroustrup (Expr.Node e) ctx @@ -943,7 +994,7 @@ let indentSepNlnUnindentUnlessStroustrup f (e: Expr) (ctx: Context) = else indentSepNlnUnindent (f e) ctx -let autoIndentAndNlnTypeUnlessStroustrup f (t: Type) (ctx: Context) = +let autoIndentAndNlnTypeUnlessStroustrup (f: Type -> Context -> Context) (t: Type) (ctx: Context) : Context = let shouldUseStroustrup = isStroustrupStyleType ctx.Config t && canSafelyUseStroustrup (Type.Node t) ctx @@ -952,7 +1003,11 @@ let autoIndentAndNlnTypeUnlessStroustrup f (t: Type) (ctx: Context) = else autoIndentAndNlnIfExpressionExceedsPageWidth (f t) ctx -let autoIndentAndNlnIfExpressionExceedsPageWidthUnlessStroustrup f (e: Expr) (ctx: Context) = +let autoIndentAndNlnIfExpressionExceedsPageWidthUnlessStroustrup + (f: Expr -> Context -> Context) + (e: Expr) + (ctx: Context) + : Context = let isStroustrup = isStroustrupStyleExpr ctx.Config e && canSafelyUseStroustrup (Expr.Node e) ctx @@ -1067,7 +1122,7 @@ let colWithNlnWhenItemIsMultiline (items: ColMultilineItem list) (ctx: Context) result -let colWithNlnWhenItemIsMultilineUsingConfig (items: ColMultilineItem list) (ctx: Context) = +let colWithNlnWhenItemIsMultilineUsingConfig (items: ColMultilineItem list) (ctx: Context) : Context = if ctx.Config.BlankLinesAroundNestedMultilineExpressions then colWithNlnWhenItemIsMultiline items ctx else diff --git a/src/Fantomas.Core/Queue.fs b/src/Fantomas.Core/Queue.fs index 4f2ed94e5c..a99dc94bf3 100644 --- a/src/Fantomas.Core/Queue.fs +++ b/src/Fantomas.Core/Queue.fs @@ -5,7 +5,7 @@ namespace Fantomas.Core type Queue<'T>(data: 'T array list, length: int) = let mutable hashCode = None - override x.GetHashCode() = + override x.GetHashCode() : int = match hashCode with | None -> let mutable hash = 1 @@ -17,7 +17,7 @@ type Queue<'T>(data: 'T array list, length: int) = hash | Some hash -> hash - override x.Equals(other) = + override x.Equals((other: obj)) : bool = match other with | :? Queue<'T> as y -> if x.Length <> y.Length then false @@ -25,15 +25,15 @@ type Queue<'T>(data: 'T array list, length: int) = else Seq.forall2 Unchecked.equals x y | _ -> false - member x.Head = + member x.Head: 'T = if length > 0 then (List.head data).[0] else raise (System.Exception("Queue is empty")) - member x.TryHead = if length > 0 then Some((List.head data).[0]) else None + member x.TryHead: 'T option = if length > 0 then Some((List.head data).[0]) else None - member x.Tail = + member x.Tail: Queue<'T> = match data with | [] -> x | head :: tail -> @@ -47,19 +47,19 @@ type Queue<'T>(data: 'T array list, length: int) = else Queue(newHead :: tail, length - 1) - member x.IsEmpty = length = 0 + member x.IsEmpty: bool = length = 0 - member x.Length = length + member x.Length: int = length - member x.Rev() = + member x.Rev<'T>() : 'T seq = data |> Seq.collect (fun arr -> seq { arr.Length - 1 .. -1 .. 0 } |> Seq.map (fun i -> arr.[i])) - member x.Append xs = + member x.Append<'T>(xs: 'T list) : Queue<'T> = Queue(Array.ofList xs :: data, length + List.length xs) /// Equivalent of q |> Queue.toSeq |> Seq.skip n |> Seq.skipWhile p |> Seq.exists f, optimized for speed - member x.SkipExists n f p = + member x.SkipExists<'T> (n: int) (f: 'T -> bool) (p: 'T array -> bool) : bool = if n >= length then false else @@ -107,25 +107,25 @@ type Queue<'T>(data: 'T array list, length: int) = module Queue = let empty<'T> : Queue<'T> = Queue<_>([ [||] ], 0) - let inline head (q: Queue<'T>) = q.Head + let inline private head (q: Queue<'T>) = q.Head - let inline tryHead (q: Queue<'T>) = q.TryHead + let inline tryHead<'T> (q: Queue<'T>) : 'T option = q.TryHead - let inline isEmpty (q: Queue<'T>) = q.IsEmpty + let inline private isEmpty (q: Queue<'T>) = q.IsEmpty - let inline length (q: Queue<'T>) = q.Length + let inline length<'T> (q: Queue<'T>) : int = q.Length - let ofList xs = + let ofList<'T> (xs: 'T list) : Queue<'T> = Queue<'T>([ List.toArray xs ], List.length xs) - let ofSeq (xs: _ seq) = + let ofSeq<'T> (xs: 'T seq) : Queue<'T> = Queue<'T>([ Seq.toArray xs ], Seq.length xs) - let inline rev (q: Queue<'T>) = q.Rev() + let inline rev<'T> (q: Queue<'T>) : 'T seq = q.Rev() - let inline toSeq (q: Queue<'T>) = q :> 'T seq + let inline toSeq<'T> (q: Queue<'T>) : 'T seq = q :> 'T seq - let inline append (q: Queue<'T>) xs = q.Append xs + let inline append<'T> (q: Queue<'T>) (xs: 'T list) : Queue<'T> = q.Append xs /// Equivalent of q |> Queue.toSeq |> Seq.skip n |> Seq.skipWhile p |> Seq.exists f - let inline skipExists (n: int) (f: 'T -> bool) (p: 'T array -> bool) (q: Queue<'T>) : bool = q.SkipExists n f p + let inline skipExists<'T> (n: int) (f: 'T -> bool) (p: 'T array -> bool) (q: Queue<'T>) : bool = q.SkipExists n f p diff --git a/src/Fantomas.Core/Trivia.fs b/src/Fantomas.Core/Trivia.fs index 229050708e..4d10a493bd 100644 --- a/src/Fantomas.Core/Trivia.fs +++ b/src/Fantomas.Core/Trivia.fs @@ -1,6 +1,5 @@ module internal Fantomas.Core.Trivia -open System open Fantomas.FCS.Syntax open Fantomas.FCS.SyntaxTrivia open Fantomas.FCS.Text @@ -9,12 +8,12 @@ open Fantomas.Core.SyntaxOak type CommentTrivia with - member x.Range = + member x.Range: range = match x with | CommentTrivia.BlockComment m | CommentTrivia.LineComment m -> m -let internal collectTriviaFromCodeComments +let private collectTriviaFromCodeComments (source: ISourceText) (codeComments: CommentTrivia list) (codeRange: range) @@ -56,7 +55,7 @@ let internal collectTriviaFromCodeComments TriviaNode(content, r)) -let internal collectTriviaFromBlankLines +let private collectTriviaFromBlankLines (config: FormatConfig) (source: ISourceText) (rootNode: Node) @@ -131,13 +130,13 @@ let internal collectTriviaFromBlankLines type ConditionalDirectiveTrivia with - member x.Range = + member x.Range: range = match x with | ConditionalDirectiveTrivia.If(_, m) | ConditionalDirectiveTrivia.Else m | ConditionalDirectiveTrivia.EndIf m -> m -let internal collectTriviaFromDirectives +let private collectTriviaFromDirectives (source: ISourceText) (directives: ConditionalDirectiveTrivia list) (codeRange: range) @@ -166,7 +165,7 @@ let rec findNodeWhereRangeFitsIn (root: Node) (range: range) : Node option = | Some betterChild -> Some betterChild | None -> Some root -let triviaBeforeOrAfterEntireTree (rootNode: Node) (trivia: TriviaNode) : unit = +let private triviaBeforeOrAfterEntireTree (rootNode: Node) (trivia: TriviaNode) : unit = let isBefore = trivia.Range.EndLine < rootNode.Range.StartLine if isBefore then @@ -175,7 +174,7 @@ let triviaBeforeOrAfterEntireTree (rootNode: Node) (trivia: TriviaNode) : unit = rootNode.AddAfter(trivia) /// Find the last child node that will be the last node of the parent node. -let rec visitLastChildNode (node: Node) : Node = +let rec private visitLastChildNode (node: Node) : Node = match node with | :? ExprIfThenNode | :? ExprIfThenElseNode @@ -235,7 +234,7 @@ let rec visitLastChildNode (node: Node) : Node = visitLastChildNode (Seq.last node.Children) | _ -> node -let lineCommentAfterSourceCodeToTriviaInstruction (containerNode: Node) (trivia: TriviaNode) : unit = +let private lineCommentAfterSourceCodeToTriviaInstruction (containerNode: Node) (trivia: TriviaNode) : unit = let lineNumber = trivia.Range.StartLine let result = @@ -249,14 +248,14 @@ let lineCommentAfterSourceCodeToTriviaInstruction (containerNode: Node) (trivia: let node = visitLastChildNode node node.AddAfter(trivia)) -let simpleTriviaToTriviaInstruction (containerNode: Node) (trivia: TriviaNode) : unit = +let private simpleTriviaToTriviaInstruction (containerNode: Node) (trivia: TriviaNode) : unit = containerNode.Children |> Array.tryFind (fun node -> node.Range.StartLine > trivia.Range.StartLine) |> Option.map (fun n -> n.AddBefore) |> Option.orElseWith (fun () -> Array.tryLast containerNode.Children |> Option.map (fun n -> n.AddAfter)) |> Option.iter (fun f -> f trivia) -let blockCommentToTriviaInstruction (containerNode: Node) (trivia: TriviaNode) : unit = +let private blockCommentToTriviaInstruction (containerNode: Node) (trivia: TriviaNode) : unit = let nodeAfter = containerNode.Children |> Seq.tryFind (fun tn -> @@ -298,7 +297,7 @@ let blockCommentToTriviaInstruction (containerNode: Node) (trivia: TriviaNode) : na.AddBefore(triviaWith false false) | _ -> () -let addToTree (tree: Oak) (trivia: TriviaNode seq) = +let private addToTree (tree: Oak) (trivia: TriviaNode seq) = for trivia in trivia do let smallestNodeThatContainsTrivia = findNodeWhereRangeFitsIn tree trivia.Range @@ -344,7 +343,7 @@ let enrichTree (config: FormatConfig) (sourceText: ISourceText) (ast: ParsedInpu addToTree tree trivia tree -let insertCursor (tree: Oak) (cursor: pos) = +let insertCursor (tree: Oak) (cursor: pos) : Oak = let cursorRange = Range.mkRange (tree :> Node).Range.FileName cursor cursor let nodeWithCursor = findNodeWhereRangeFitsIn tree cursorRange diff --git a/src/Fantomas.Core/Utils.fs b/src/Fantomas.Core/Utils.fs index 20906ee425..94e7005411 100644 --- a/src/Fantomas.Core/Utils.fs +++ b/src/Fantomas.Core/Utils.fs @@ -34,17 +34,6 @@ module List = | [ _ ] -> false | _ -> true - let private partitionWhile (f: int -> 'a -> bool) (xs: 'a list) : 'a list * 'a list = - let rec go i before after = - match after with - | head :: tail -> - match f i head with - | true -> go (i + 1) (head :: before) tail - | false -> List.rev before, after - | [] -> List.rev before, after - - go 0 [] xs - let mapWithLast<'a, 'b> (f: 'a -> 'b) (g: 'a -> 'b) (xs: 'a list) : 'b list = let rec visit xs continuation = match xs with From efb3085a4122c74034403214e588764595bbe284 Mon Sep 17 00:00:00 2001 From: nojaf Date: Tue, 26 Dec 2023 10:06:54 +0100 Subject: [PATCH 4/4] Replace wildcard in types. --- src/Fantomas.Core/Context.fs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/Fantomas.Core/Context.fs b/src/Fantomas.Core/Context.fs index 82f01dff45..4962d60b7a 100644 --- a/src/Fantomas.Core/Context.fs +++ b/src/Fantomas.Core/Context.fs @@ -414,7 +414,7 @@ let atIndentLevel (alsoSetIndent: bool) (level: int) (f: Context -> Context) (ct /// Y = 1 // indent=0, atColumn=2 /// } /// `atCurrentColumn` was called on `X`, then `indent` was called, but "some long string" have indent only 4, because it is bigger than `atColumn` (2). -let atCurrentColumn (f: _ -> Context) (ctx: Context) : Context = atIndentLevel false ctx.Column f ctx +let atCurrentColumn (f: Context -> Context) (ctx: Context) : Context = atIndentLevel false ctx.Column f ctx /// Write everything at current column indentation, set `indent` and `atColumn` on current column position /// /// Example (same as above): @@ -423,10 +423,10 @@ let atCurrentColumn (f: _ -> Context) (ctx: Context) : Context = atIndentLevel f /// Y = 1 // indent=2, atColumn=2 /// } /// `atCurrentColumn` was called on `X`, then `indent` was called, "some long string" have indent 6, because it is indented from `atCurrentColumn` pos (2). -let atCurrentColumnIndent (f: _ -> Context) (ctx: Context) : Context = atIndentLevel true ctx.Column f ctx +let atCurrentColumnIndent (f: Context -> Context) (ctx: Context) : Context = atIndentLevel true ctx.Column f ctx /// Function composition operator -let (+>) (ctx: Context -> Context) (f: _ -> Context) (x: Context) : Context = +let (+>) (ctx: Context -> Context) (f: Context -> Context) (x: Context) : Context = let y = ctx x match y.WriterModel.Mode with @@ -497,7 +497,7 @@ let colPre<'T> if Seq.isEmpty c then ctx else col f1 c f (f2 ctx) /// If there is a value, apply f and f' accordingly, otherwise do nothing -let opt<'a> (f': Context -> _) (o: 'a option) (f: 'a -> Context -> Context) (ctx: Context) : Context = +let opt<'a> (f': Context -> Context) (o: 'a option) (f: 'a -> Context -> Context) (ctx: Context) : Context = match o with | Some x -> f' (f x ctx) | None -> ctx @@ -510,8 +510,8 @@ let optSingle<'a, 'b> (f: 'a -> 'b -> 'b) (o: 'a option) (ctx: 'b) : 'b = /// Similar to opt, but apply f2 at the beginning if there is a value let optPre<'a> - (f2: _ -> Context) - (f1: Context -> _) + (f2: Context -> Context) + (f1: Context -> Context) (o: 'a option) (f: 'a -> Context -> Context) (ctx: Context)