Skip to content

Commit

Permalink
Add SynConst nodes to TriviaNodes. (#1409)
Browse files Browse the repository at this point in the history
  • Loading branch information
nojaf committed Jan 29, 2021
1 parent 138146e commit cf452cb
Show file tree
Hide file tree
Showing 6 changed files with 87 additions and 37 deletions.
6 changes: 3 additions & 3 deletions src/Fantomas.Tests/TriviaTests.fs
Original file line number Diff line number Diff line change
Expand Up @@ -406,7 +406,7 @@ with empty lines"

match trivia with
| [ { ContentItself = Some (StringContent (sc))
Type = TriviaNodeType.MainNode (SynExpr_Const) } ] -> sc == sprintf "\"%s\"" multilineString
Type = TriviaNodeType.MainNode (SynConst_String) } ] -> sc == sprintf "\"%s\"" multilineString
| _ -> fail ()

[<Test>]
Expand All @@ -426,7 +426,7 @@ with empty lines"

match trivia with
| [ { ContentItself = Some (StringContent (sc))
Type = TriviaNodeType.MainNode (SynExpr_Const) } ] -> sc == sprintf "\"\"\"%s\"\"\"" multilineString
Type = TriviaNodeType.MainNode (SynConst_String) } ] -> sc == sprintf "\"\"\"%s\"\"\"" multilineString
| _ -> fail ()

[<Test>]
Expand All @@ -436,7 +436,7 @@ let ``char content`` () =

match trivia with
| [ { ContentItself = Some (CharContent ("\'\\u0000\'"))
Type = TriviaNodeType.MainNode (SynExpr_Const) } ] -> pass ()
Type = TriviaNodeType.MainNode (SynConst_Char) } ] -> pass ()
| _ -> fail ()

[<Test>]
Expand Down
55 changes: 42 additions & 13 deletions src/Fantomas/AstTransformer.fs
Original file line number Diff line number Diff line change
Expand Up @@ -128,13 +128,13 @@ module private Ast =
| SynModuleDecl.Open (target, parentRange) ->
// we use the parent ranges here to match up with the trivia parsed
match target with
| SynOpenDeclTarget.ModuleOrNamespace (longIdent, range) ->
| SynOpenDeclTarget.ModuleOrNamespace (longIdent, _range) ->
{ Type = SynModuleDecl_Open
Range = r parentRange
Properties = p [ "longIdent" ==> li longIdent ]
FsAstNode = ast
Childs = [] }
| SynOpenDeclTarget.Type (synType, range) ->
| SynOpenDeclTarget.Type (synType, _range) ->
{ Type = SynModuleDecl_OpenType
Range = r parentRange
Properties = p []
Expand Down Expand Up @@ -183,9 +183,9 @@ module private Ast =
| SynExpr.Const (constant, range) ->
{ Type = SynExpr_Const
Range = r range
Properties = p [ "constant" ==> visitSynConst constant ]
Properties = p []
FsAstNode = synExpr
Childs = [] }
Childs = [ visitSynConst range constant ] }
| SynExpr.Typed (expr, typeName, range) ->
{ Type = SynExpr_Typed
Range = r range
Expand Down Expand Up @@ -853,13 +853,13 @@ module private Ast =
| SynMemberDefn.Open (target, parentRange) ->
// we use the parent ranges here to match up with the trivia parsed
match target with
| SynOpenDeclTarget.ModuleOrNamespace (longIdent, range) ->
| SynOpenDeclTarget.ModuleOrNamespace (longIdent, _range) ->
{ Type = SynMemberDefn_Open
Range = r parentRange
Properties = p [ "longIdent" ==> li longIdent ]
FsAstNode = target
Childs = [] }
| SynOpenDeclTarget.Type (synType, range) ->
| SynOpenDeclTarget.Type (synType, _range) ->
{ Type = SynMemberDefn_OpenType
Range = r parentRange
Properties = p []
Expand Down Expand Up @@ -1122,9 +1122,9 @@ module private Ast =
| SynPat.Const (sc, range) ->
{ Type = SynPat_Const
Range = r range
Properties = p [ "const" ==> visitSynConst sc ]
Properties = p []
FsAstNode = sp
Childs = [] }
Childs = [ visitSynConst range sc ] }
| SynPat.Wild (range) ->
{ Type = SynPat_Wild
Range = r range
Expand Down Expand Up @@ -1659,9 +1659,9 @@ module private Ast =
| SynType.StaticConstant (constant, range) ->
{ Type = SynType_StaticConstant
Range = r range
Properties = p [ "constant" ==> visitSynConst constant ]
Properties = p []
FsAstNode = st
Childs = [] }
Childs = [ visitSynConst range constant ] }
| SynType.StaticConstantExpr (expr, range) ->
{ Type = SynType_StaticConstantExpr
Range = r range
Expand Down Expand Up @@ -1689,7 +1689,36 @@ module private Ast =
FsAstNode = st
Childs = [ yield visitSynType innerType ] }

and visitSynConst (sc: SynConst) = sprintf "%A" sc
and visitSynConst (parentRange: range) (sc: SynConst) =
let t =
match sc with
| SynConst.Bool _ -> SynConst_Bool
| SynConst.Unit _ -> SynConst_Unit
| SynConst.SByte _ -> SynConst_SByte
| SynConst.Byte _ -> SynConst_Byte
| SynConst.Int16 _ -> SynConst_Int16
| SynConst.UInt16 _ -> SynConst_UInt16
| SynConst.Int32 _ -> SynConst_Int32
| SynConst.UInt32 _ -> SynConst_UInt32
| SynConst.Int64 _ -> SynConst_Int64
| SynConst.UInt64 _ -> SynConst_UInt64
| SynConst.IntPtr _ -> SynConst_IntPtr
| SynConst.UIntPtr _ -> SynConst_UIntPtr
| SynConst.Single _ -> SynConst_Single
| SynConst.Double _ -> SynConst_Double
| SynConst.Char _ -> SynConst_Char
| SynConst.Decimal _ -> SynConst_Decimal
| SynConst.UserNum _ -> SynConst_UserNum
| SynConst.String _ -> SynConst_String
| SynConst.Bytes _ -> SynConst_Bytes
| SynConst.UInt16s _ -> SynConst_UInt16s
| SynConst.Measure _ -> SynConst_Measure

{ Type = t
Range = r (sc.Range parentRange)
Properties = p []
FsAstNode = sc
Childs = [] }

and visitSynValInfo (svi: SynValInfo) =
match svi with
Expand Down Expand Up @@ -1808,13 +1837,13 @@ module private Ast =
| SynModuleSigDecl.Open (target, parentRange) ->
// we use the parent ranges here to match up with the trivia parsed
match target with
| SynOpenDeclTarget.ModuleOrNamespace (longIdent, range) ->
| SynOpenDeclTarget.ModuleOrNamespace (longIdent, _range) ->
{ Type = SynModuleSigDecl_Open
Range = r parentRange
Properties = p [ "longIdent" ==> li longIdent ]
FsAstNode = target
Childs = [] }
| SynOpenDeclTarget.Type (synType, range) ->
| SynOpenDeclTarget.Type (synType, _range) ->
{ Type = SynModuleSigDecl_OpenType
Range = r parentRange
Properties = p []
Expand Down
30 changes: 15 additions & 15 deletions src/Fantomas/CodePrinter.fs
Original file line number Diff line number Diff line change
Expand Up @@ -3985,10 +3985,7 @@ and addSpaceIfSynTypeStaticConstantHasAtSignBeforeString (t: SynType) (ctx: Cont
| StringContent sc -> sc.StartsWith("@")
| _ -> false)
r
(TriviaHelpers.getNodesForTypes
[ SynExpr_Const
SynType_StaticConstant ]
ctx.TriviaMainNodes)
(Map.tryFindOrEmptyList SynConst_String ctx.TriviaMainNodes)
| _ -> false

onlyIf hasAtSign sepSpace ctx
Expand Down Expand Up @@ -4892,9 +4889,16 @@ and genSynBindingValue
+> unindent

let hasMultilineString =
ctx.TriviaMainNodes
|> Map.tryFindOrEmptyList SynExpr_Const
|> TriviaHelpers.hasMultilineString e.Range
match e with
| SynExpr.Const (SynConst.String (_, r), _) ->
ctx.TriviaMainNodes
|> Map.tryFindOrEmptyList SynConst_String
|> TriviaHelpers.hasMultilineString r
| SynExpr.Const (SynConst.Bytes (_, r), _) ->
ctx.TriviaMainNodes
|> Map.tryFindOrEmptyList SynConst_Bytes
|> TriviaHelpers.hasMultilineString r
| _ -> false

if hasMultilineString then
short ctx
Expand Down Expand Up @@ -4938,14 +4942,10 @@ and genConst (c: SynConst) (r: range) =
| SynConst.UInt64 _
| SynConst.UIntPtr _
| SynConst.UserNum _ -> genConstNumber c r
| SynConst.String (s, _) ->
| SynConst.String (s, r) ->
fun (ctx: Context) ->
let trivia =
TriviaHelpers.getNodesForTypes
[ SynExpr_Const
SynType_StaticConstant
SynPat_Const ]
ctx.TriviaMainNodes
Map.tryFindOrEmptyList SynConst_String ctx.TriviaMainNodes
|> List.tryFind (fun tv -> RangeHelpers.rangeEq tv.Range r)

let triviaStringContent =
Expand Down Expand Up @@ -4982,7 +4982,7 @@ and genConst (c: SynConst) (r: range) =
!-(sprintf "\'%s\'" escapedChar)

expr ctx
| SynConst.Bytes (bytes, _) -> genConstBytes bytes r
| SynConst.Bytes (bytes, r) -> genConstBytes bytes r
| SynConst.Measure (c, m) ->
let measure =
match m with
Expand Down Expand Up @@ -5031,7 +5031,7 @@ and genConstNumber (c: SynConst) (r: range) =
and genConstBytes (bytes: byte []) (r: range) =
fun (ctx: Context) ->
let trivia =
Map.tryFindOrEmptyList SynExpr_Const ctx.TriviaMainNodes
Map.tryFindOrEmptyList SynConst_Bytes ctx.TriviaMainNodes
|> List.tryFind (fun t -> RangeHelpers.rangeEq t.Range r)
|> Option.bind
(fun tv ->
Expand Down
8 changes: 4 additions & 4 deletions src/Fantomas/Trivia.fs
Original file line number Diff line number Diff line change
Expand Up @@ -192,12 +192,12 @@ let private findConstNodeOnLineAndColumn (nodes: TriviaNodeAssigner list) (const
&& tn.Range.EndColumn = constantRange.EndColumn
| _ -> false)

let private findConstNodeAfter (nodes: TriviaNodeAssigner list) (range: range) =
let private findSynConstStringNodeAfter (nodes: TriviaNodeAssigner list) (range: range) =
nodes
|> List.tryFind
(fun tn ->
match tn.Type, range.StartLine = tn.Range.StartLine, range.StartColumn + 1 = tn.Range.StartColumn with
| MainNode (SynExpr_Const), true, true -> true
| MainNode (SynConst_String), true, true -> true
| _ -> false)

let private mapNodeToTriviaNode (node: Node) =
Expand Down Expand Up @@ -419,7 +419,7 @@ let private addTriviaToTriviaNode

| { Item = Keyword ({ TokenInfo = { TokenName = tn } } as kw)
Range = range } when (tn = "QMARK") ->
findConstNodeAfter triviaNodes range
findSynConstStringNodeAfter triviaNodes range
|> updateTriviaNode (fun tn -> tn.ContentBefore.Add(Keyword(kw))) triviaNodes

| { Item = Keyword ({ Content = keyword })
Expand Down Expand Up @@ -504,7 +504,7 @@ let private addTriviaToTriviaNode
| MainNode (SynPat_Named)
| MainNode (SynPat_LongIdent)
| MainNode (Ident_)
| MainNode (SynExpr_Const) -> true
| MainNode (SynConst_String) -> true
| _ -> false

isIdent
Expand Down
4 changes: 2 additions & 2 deletions src/Fantomas/TriviaHelpers.fs
Original file line number Diff line number Diff line change
Expand Up @@ -121,8 +121,8 @@ module internal TriviaHelpers =
&& contentItSelfIsMultilineString ())

let ``get CharContent`` range (nodes: Map<FsAstType, TriviaNode list>) =
getNodesForTypes [ SynExpr_Const; SynPat_Const ] nodes
|> List.tryFind (fun tv -> RangeHelpers.rangeEq tv.Range range)
Map.tryFindOrEmptyList SynConst_Char nodes
|> List.tryFind (fun t -> RangeHelpers.rangeEq t.Range range)
|> Option.bind
(fun tv ->
match tv.ContentItself with
Expand Down
21 changes: 21 additions & 0 deletions src/Fantomas/TriviaTypes.fs
Original file line number Diff line number Diff line change
Expand Up @@ -237,6 +237,27 @@ type FsAstType =
| SynPat_DeprecatedCharRange
| SynPat_InstanceMember
| SynPat_FromParseError
| SynConst_Bool
| SynConst_Unit
| SynConst_SByte
| SynConst_Byte
| SynConst_Int16
| SynConst_UInt16
| SynConst_Int32
| SynConst_UInt32
| SynConst_Int64
| SynConst_UInt64
| SynConst_IntPtr
| SynConst_UIntPtr
| SynConst_Single
| SynConst_Double
| SynConst_Char
| SynConst_Decimal
| SynConst_UserNum
| SynConst_String
| SynConst_Bytes
| SynConst_UInt16s
| SynConst_Measure
| Pats_
| NamePatPairs_
| ComponentInfo_
Expand Down

0 comments on commit cf452cb

Please sign in to comment.