Skip to content

Commit

Permalink
Remove SynExpr.Const and SynPat.Const from AstTransformer.fs.
Browse files Browse the repository at this point in the history
  • Loading branch information
nojaf committed Mar 12, 2021
1 parent 05c56c7 commit 784b0dc
Show file tree
Hide file tree
Showing 5 changed files with 165 additions and 138 deletions.
70 changes: 17 additions & 53 deletions src/Fantomas/AstTransformer.fs
Original file line number Diff line number Diff line change
Expand Up @@ -131,18 +131,11 @@ module private Ast =

Continuation.sequence continuations finalContinuation
| SynExpr.Const (constant, range) ->
[ mkNode SynExpr_Const range
visitSynConst range constant ]
visitSynConst range constant
|> List.singleton
|> finalContinuation
| SynExpr.Typed (expr, typeName, _) ->
visit
expr
(fun nodes ->
// { Type = SynExpr_Typed
// Range = r range
// Properties = Map.empty
// }
nodes @ visitSynType typeName |> finalContinuation)
visit expr (fun nodes -> nodes @ visitSynType typeName |> finalContinuation)
| SynExpr.Tuple (_, exprs, _, range) ->
let continuations : ((TriviaNodeAssigner list -> TriviaNodeAssigner list) -> TriviaNodeAssigner list) list =
exprs |> List.map visit
Expand Down Expand Up @@ -227,9 +220,6 @@ module private Ast =
mkNode SynExpr_ArrayOrListOfSeqExpr range :: nodes
|> finalContinuation)
| SynExpr.CompExpr (_, _, expr, _) -> visit expr finalContinuation
// { Type = SynExpr_CompExpr
// Range = r range
// Properties = Map.empty }
| SynExpr.Lambda (_, _, args, body, _parsedData, range) ->
visit
body
Expand Down Expand Up @@ -284,12 +274,6 @@ module private Ast =
visit
body
(fun nodes ->
// { Type = SynExpr_LetOrUse
// Range = r range
// Properties =
// p [ "isRecursive" ==> isRecursive
// "isUse" ==> isUse ]
// }
(List.collect visitSynBinding bindings) @ nodes
|> finalContinuation)
| SynExpr.TryWith (tryExpr, _, withCases, _, range, _, _) ->
Expand Down Expand Up @@ -321,10 +305,6 @@ module private Ast =
[ visit expr1; visit expr2 ]

let finalContinuation (nodes: TriviaNodeAssigner list list) : TriviaNodeAssigner list =
// { Type = SynExpr_Sequential
// Range = r range
// Properties = Map.empty
// }
(List.collect id nodes) |> finalContinuation

Continuation.sequence continuations finalContinuation
Expand Down Expand Up @@ -671,29 +651,16 @@ module private Ast =
and visitSynTypeDefnSig (typeDefSig: SynTypeDefnSig) : TriviaNodeAssigner list =
match typeDefSig with
| TypeDefnSig (sci, synTypeDefnSigReprs, memberSig, _) ->
// { Type = TypeDefnSig_
// Range = r range
// Properties = Map.empty
// FsAstNode = typeDefSig }
[ yield! visitSynComponentInfo sci
yield! visitSynTypeDefnSigRepr synTypeDefnSigReprs
yield! (memberSig |> List.collect visitSynMemberSig) ]

and visitSynTypeDefnSigRepr (stdr: SynTypeDefnSigRepr) : TriviaNodeAssigner list =
match stdr with
| SynTypeDefnSigRepr.ObjectModel (kind, members, _) ->
// { Type = SynTypeDefnSigRepr_ObjectModel
// Range = r range
// Properties = Map.empty
// FsAstNode = stdr }
visitSynTypeDefnKind kind
@ (members |> List.collect visitSynMemberSig)
| SynTypeDefnSigRepr.Simple (simpleRepr, _) ->
// { Type = SynTypeDefnSigRepr_ObjectModel
// Range = r range
// Properties = Map.empty
// FsAstNode = stdr }
(visitSynTypeDefnSimpleRepr simpleRepr)
| SynTypeDefnSigRepr.Simple (simpleRepr, _) -> (visitSynTypeDefnSimpleRepr simpleRepr)
| SynTypeDefnSigRepr.Exception (exceptionRepr) -> visitSynExceptionDefnRepr exceptionRepr

and visitSynMemberDefn (mbrDef: SynMemberDefn) : TriviaNodeAssigner list =
Expand Down Expand Up @@ -859,8 +826,7 @@ module private Ast =
: TriviaNodeAssigner list =
match sp with
| SynPat.Const (sc, range) ->
[ mkNode SynPat_Const range
visitSynConst range sc ]
List.singleton (visitSynConst range sc)
|> finalContinuation
| SynPat.Wild (range) ->
mkNode SynPat_Wild range
Expand Down Expand Up @@ -996,18 +962,9 @@ module private Ast =
and visitSynTypeDefnRepr (stdr: SynTypeDefnRepr) : TriviaNodeAssigner list =
match stdr with
| SynTypeDefnRepr.ObjectModel (kind, members, _) ->
// { Type = SynTypeDefnRepr_ObjectModel
// Range = r range
// Properties = Map.empty
// FsAstNode = stdr }
visitSynTypeDefnKind kind
@ (members |> List.collect visitSynMemberDefn)
| SynTypeDefnRepr.Simple (simpleRepr, _) ->
// { Type = SynTypeDefnRepr_Simple
// Range = r range
// Properties = Map.empty
// FsAstNode = stdr }
visitSynTypeDefnSimpleRepr simpleRepr
| SynTypeDefnRepr.Simple (simpleRepr, _) -> visitSynTypeDefnSimpleRepr simpleRepr
| SynTypeDefnRepr.Exception (exceptionRepr) -> visitSynExceptionDefnRepr exceptionRepr

and visitSynTypeDefnKind (kind: SynTypeDefnKind) : TriviaNodeAssigner list =
Expand Down Expand Up @@ -1098,10 +1055,11 @@ module private Ast =

and visitSynEnumCase (sec: SynEnumCase) : TriviaNodeAssigner list =
match sec with
| EnumCase (attrs, ident, _, _, range) ->
| EnumCase (attrs, ident, value, _, range) ->
[ yield mkNode EnumCase_ range
yield! (visitSynAttributeLists range attrs)
yield visitIdent ident ]
yield visitIdent ident
yield visitSynConst range value ]

and visitSynField (sfield: SynField) : TriviaNodeAssigner list =
match sfield with
Expand Down Expand Up @@ -1239,7 +1197,7 @@ module private Ast =
visit st id

and visitSynConst (parentRange: Range) (sc: SynConst) : TriviaNodeAssigner =
let t =
let t sc =
match sc with
| SynConst.Bool _ -> SynConst_Bool
| SynConst.Unit _ -> SynConst_Unit
Expand All @@ -1263,7 +1221,13 @@ module private Ast =
| SynConst.UInt16s _ -> SynConst_UInt16s
| SynConst.Measure _ -> SynConst_Measure

mkNode t (sc.Range parentRange)
match sc with
| SynConst.Measure (n, SynMeasure.Seq (_, mr)) ->
let numberRange =
Range.mkRange mr.FileName parentRange.Start (Pos.mkPos mr.StartLine (mr.StartColumn - 1))

mkNode (t n) numberRange
| _ -> mkNode (t sc) (sc.Range parentRange)

and visitSynValInfo (svi: SynValInfo) =
match svi with
Expand Down
149 changes: 84 additions & 65 deletions src/Fantomas/CodePrinter.fs
Original file line number Diff line number Diff line change
Expand Up @@ -2224,7 +2224,7 @@ and genExpr astContext synExpr ctx =
(function
| Comment (LineCommentAfterSourceCode _) -> true
| _ -> false)
(TriviaHelpers.getNodesForTypes [ SynExpr_Ident; SynExpr_Const ] ctx.TriviaMainNodes)
(Map.tryFindOrEmptyList SynExpr_Ident ctx.TriviaMainNodes)

let hasCommentAfterIfKeyword =
commentAfterKeyword IF (RangeHelpers.rangeStartEq synExpr.Range) ctx
Expand All @@ -2243,7 +2243,7 @@ and genExpr astContext synExpr ctx =
(function
| Comment (LineCommentAfterSourceCode _) -> true
| _ -> false)
(TriviaHelpers.getNodesForTypes [ SynExpr_Ident; SynExpr_Const ] ctx.TriviaMainNodes)
(Map.tryFindOrEmptyList SynExpr_Ident ctx.TriviaMainNodes)

let hasCommentAfterThenKeyword =
commentAfterKeyword THEN (RangeHelpers.``range contains`` fullRange) ctx
Expand Down Expand Up @@ -2339,7 +2339,7 @@ and genExpr astContext synExpr ctx =
(function
| Comment (LineCommentAfterSourceCode _) -> true
| _ -> false)
(TriviaHelpers.getNodesForTypes [ SynExpr_Ident; SynExpr_Const ] ctx.TriviaMainNodes)
(Map.tryFindOrEmptyList SynExpr_Ident ctx.TriviaMainNodes)

let elifExpr =
TriviaContext.``else if / elif`` fullRange
Expand Down Expand Up @@ -2703,7 +2703,6 @@ and genExpr astContext synExpr ctx =
| e -> failwithf "Unexpected expression: %O" e
|> (match synExpr with
| SynExpr.App _ -> genTriviaFor SynExpr_App synExpr.Range
| SynExpr.Const _ -> genTriviaFor SynExpr_Const synExpr.Range
| SynExpr.AnonRecd _ -> genTriviaFor SynExpr_AnonRecd synExpr.Range
| SynExpr.Record _ -> genTriviaFor SynExpr_Record synExpr.Range
| SynExpr.Ident _ -> genTriviaFor SynExpr_Ident synExpr.Range
Expand Down Expand Up @@ -3534,9 +3533,7 @@ and genTypeDefn astContext (TypeDef (ats, px, ao, tds, tcs, tdr, ms, s, preferPo
+> unindent)

let genTypeBody =
autoIndentAndNlnIfExpressionExceedsPageWidth (
genTriviaFor SynTypeDefnRepr_ObjectModel tdr.Range genTypeAbbrev
)
autoIndentAndNlnIfExpressionExceedsPageWidth (genTypeAbbrev)
+> genMembers

typeName +> sepEq +> sepSpace +> genTypeBody
Expand Down Expand Up @@ -3721,11 +3718,7 @@ and sepNlnBetweenSigTypeAndMembers (ms: SynMemberSig list) =
sepNlnTypeAndMembers (Some range) mainNodeType
| None -> sepNone

and genSigTypeDefn astContext (SigTypeDef (ats, px, ao, tds, tcs, tdr, ms, s, preferPostfix) as node) =
let range =
match node with
| SynTypeDefnSig.TypeDefnSig (_, _, _, r) -> r

and genSigTypeDefn astContext (SigTypeDef (ats, px, ao, tds, tcs, tdr, ms, s, preferPostfix)) =
let typeName =
genPreXmlDoc px
+> ifElse
Expand Down Expand Up @@ -3888,7 +3881,6 @@ and genSigTypeDefn astContext (SigTypeDef (ats, px, ao, tds, tcs, tdr, ms, s, pr
+> unindent

| SigExceptionRepr (SigExceptionDefRepr (ats, px, ao, uc)) -> genExceptionBody astContext ats px ao uc
|> genTriviaFor TypeDefnSig_ range

and genSigSimpleRecord tdr ms ao' fs astContext =
// the typeName is already printed
Expand Down Expand Up @@ -4065,8 +4057,24 @@ and genEnumCase astContext (EnumCase (ats, px, _, (_, _)) as node) =
let expr =
match node with
| EnumCase (_, _, identInAST, (c, r)) ->
!-identInAST +> !- " = " +> genConst c r
|> genTriviaFor EnumCase_ r
let triviaNode =
Map.tryFindOrEmptyList EnumCase_ ctx.TriviaMainNodes
|> List.tryFind (fun tn -> RangeHelpers.rangeEq tn.Range r)

match triviaNode with
| Some ({ ContentItself = Some (Number n) } as tn) ->
printContentBefore tn
+> !-identInAST
+> !- " = "
+> !-n
+> printContentAfter tn
| Some tn ->
printContentBefore tn
+> !-identInAST
+> !- " = "
+> genConst c r
+> printContentAfter tn
| None -> !-identInAST +> !- " = " +> genConst c r

expr ctx

Expand Down Expand Up @@ -5168,6 +5176,7 @@ and genConst (c: SynConst) (r: Range) =
+> enterNodeTokenByName r RPAREN
+> !- ")"
+> leaveNodeTokenByName r RPAREN
|> genTriviaFor SynConst_Unit r
| SynConst.Bool (b) -> !-(if b then "true" else "false")
| SynConst.Byte _
| SynConst.SByte _
Expand All @@ -5191,24 +5200,23 @@ and genConst (c: SynConst) (r: Range) =
Map.tryFindOrEmptyList SynConst_String ctx.TriviaMainNodes
|> List.tryFind (fun tv -> RangeHelpers.rangeEq tv.Range r)

let triviaStringContent =
trivia
|> Option.bind
(fun tv ->
match tv.ContentItself with
| Some (StringContent (sc)) -> Some sc
| _ -> None)

match triviaStringContent, trivia with
| Some stringContent, Some _ -> !-stringContent
| None,
Some ({ ContentBefore = [ Keyword ({ TokenInfo = { TokenName = "KEYWORD_STRING" }
match trivia with
| Some ({ ContentItself = Some (StringContent (sc)) } as tn) ->
printContentBefore tn
+> !-sc
+> printContentAfter tn
| Some ({ ContentBefore = [ Keyword ({ TokenInfo = { TokenName = "KEYWORD_STRING" }
Content = kw }) ] }) -> !-kw
| None,
Some ({ ContentBefore = [ Keyword ({ TokenInfo = { TokenName = "QMARK" } }) ]
| Some ({ ContentBefore = [ Keyword ({ TokenInfo = { TokenName = "QMARK" } }) ]
ContentItself = Some (IdentBetweenTicks ibt) }) -> !-ibt
| None, Some ({ ContentBefore = [ Keyword ({ TokenInfo = { TokenName = "QMARK" } }) ] }) -> !-s
| _ ->
| Some ({ ContentBefore = [ Keyword ({ TokenInfo = { TokenName = "QMARK" } }) ] }) -> !-s
| Some tn ->
let escaped = Regex.Replace(s, "\"{1}", "\\\"")

printContentBefore tn
+> !-(sprintf "\"%s\"" escaped)
+> printContentAfter tn
| None ->
let escaped = Regex.Replace(s, "\"{1}", "\\\"")
!-(sprintf "\"%s\"" escaped)
<| ctx
Expand All @@ -5231,45 +5239,56 @@ and genConst (c: SynConst) (r: Range) =
match m with
| Measure m -> !-m

genConstNumber c r
let genNumber (ctx: Context) =
match m with
| SynMeasure.Seq (_, mr) ->
let numberRange =
ctx.MkRange r.Start (Pos.mkPos mr.StartLine (mr.StartColumn - 1))

genConstNumber c numberRange ctx
| _ -> genConstNumber c r ctx

genNumber
+> measure
+> leaveNodeTokenByName r GREATER

and genConstNumber (c: SynConst) (r: Range) =
fun (ctx: Context) ->
TriviaHelpers.getNodesForTypes
[ SynExpr_Const
SynPat_Const
EnumCase_ ]
ctx.TriviaMainNodes
|> List.tryFind (fun t -> RangeHelpers.rangeEq t.Range r)
|> Option.bind
(fun tn ->
match tn.ContentItself with
| Some (Number (n)) -> Some n
| _ -> None)
|> fun n ->
match n with
| Some n -> !-n
| None ->
match c with
| SynConst.Byte (v) -> !-(sprintf "%A" v)
| SynConst.SByte (v) -> !-(sprintf "%A" v)
| SynConst.Int16 (v) -> !-(sprintf "%A" v)
| SynConst.Int32 (v) -> !-(sprintf "%A" v)
| SynConst.Int64 (v) -> !-(sprintf "%A" v)
| SynConst.UInt16 (v) -> !-(sprintf "%A" v)
| SynConst.UInt16s (v) -> !-(sprintf "%A" v)
| SynConst.UInt32 (v) -> !-(sprintf "%A" v)
| SynConst.UInt64 (v) -> !-(sprintf "%A" v)
| SynConst.Double (v) -> !-(sprintf "%A" v)
| SynConst.Single (v) -> !-(sprintf "%A" v)
| SynConst.Decimal (v) -> !-(sprintf "%A" v)
| SynConst.IntPtr (v) -> !-(sprintf "%A" v)
| SynConst.UIntPtr (v) -> !-(sprintf "%A" v)
| SynConst.UserNum (v, s) -> !-(sprintf "%s%s" v s)
| _ -> failwithf "Cannot generating Const number for %A" c
<| ctx
let findNumberAsContentItself (fallback: Context -> Context) (nodeType: FsAstType) =
Map.tryFindOrEmptyList nodeType ctx.TriviaMainNodes
|> List.tryFind (fun t -> RangeHelpers.rangeEq t.Range r)
|> fun tn ->
match tn with
| Some ({ ContentItself = Some (Number (n)) } as tn) ->
printContentBefore tn
+> !-n
+> printContentAfter tn
| Some tn ->
printContentBefore tn
+> fallback
+> printContentAfter tn
| _ -> fallback

let expr =
match c with
| SynConst.Byte (v) -> findNumberAsContentItself (!-(sprintf "%A" v)) SynConst_Byte
| SynConst.SByte (v) -> findNumberAsContentItself (!-(sprintf "%A" v)) SynConst_SByte
| SynConst.Int16 (v) -> findNumberAsContentItself (!-(sprintf "%A" v)) SynConst_Int16
| SynConst.Int32 (v) -> findNumberAsContentItself (!-(sprintf "%A" v)) SynConst_Int32
| SynConst.Int64 (v) -> findNumberAsContentItself (!-(sprintf "%A" v)) SynConst_Int64
| SynConst.UInt16 (v) -> findNumberAsContentItself (!-(sprintf "%A" v)) SynConst_UInt16
| SynConst.UInt16s (v) -> findNumberAsContentItself (!-(sprintf "%A" v)) SynConst_UInt16s
| SynConst.UInt32 (v) -> findNumberAsContentItself (!-(sprintf "%A" v)) SynConst_UInt32
| SynConst.UInt64 (v) -> findNumberAsContentItself (!-(sprintf "%A" v)) SynConst_UInt64
| SynConst.Double (v) -> findNumberAsContentItself (!-(sprintf "%A" v)) SynConst_Double
| SynConst.Single (v) -> findNumberAsContentItself (!-(sprintf "%A" v)) SynConst_Single
| SynConst.Decimal (v) -> findNumberAsContentItself (!-(sprintf "%A" v)) SynConst_Decimal
| SynConst.IntPtr (v) -> findNumberAsContentItself (!-(sprintf "%A" v)) SynConst_IntPtr
| SynConst.UIntPtr (v) -> findNumberAsContentItself (!-(sprintf "%A" v)) SynConst_UIntPtr
| SynConst.UserNum (v, s) -> findNumberAsContentItself (!-(sprintf "%s%s" v s)) SynConst_UserNum
| _ -> failwithf "Cannot generating Const number for %A" c

expr ctx

and genConstBytes (bytes: byte []) (r: Range) =
fun (ctx: Context) ->
Expand Down
Loading

0 comments on commit 784b0dc

Please sign in to comment.