@@ -34,17 +34,27 @@ let mkIdent (ident: Ident) =
34
34
35
35
stn text ident.idRange
36
36
37
- let mkSynIdent ( SynIdent ( ident , trivia )) =
37
+ let mkSynIdent ( creationAide : CreationAide ) ( SynIdent ( ident , trivia )) =
38
38
match trivia with
39
39
| None -> mkIdent ident
40
40
| Some( IdentTrivia.OriginalNotation text) -> stn text ident.idRange
41
41
| Some( IdentTrivia.OriginalNotationWithParen(_, text, _)) -> stn $" (%s {text})" ident.idRange
42
- | Some( IdentTrivia.HasParenthesis _) -> stn $" (%s {ident.idText})" ident.idRange
42
+ | Some( IdentTrivia.HasParenthesis _) ->
43
+ let width = ident.idRange.EndColumn - ident.idRange.StartColumn
44
+
45
+ let text =
46
+ if ident.idText.Length < width then
47
+ // preserve backticks inside the idText, e.g. the idText could be "|``Is Even``|``Is Odd``|"
48
+ creationAide.TextFromSource ( fun () -> $" (%s {ident.idText})" ) ident.idRange
49
+ else
50
+ ident.idText
43
51
44
- let mkSynLongIdent ( sli : SynLongIdent ) =
52
+ stn $" (%s {text})" ident.idRange
53
+
54
+ let mkSynLongIdent ( creationAide : CreationAide ) ( sli : SynLongIdent ) =
45
55
match sli.IdentsWithTrivia with
46
56
| [] -> IdentListNode.Empty
47
- | [ single ] -> IdentListNode([ IdentifierOrDot.Ident( mkSynIdent single) ], sli.Range)
57
+ | [ single ] -> IdentListNode([ IdentifierOrDot.Ident( mkSynIdent creationAide single) ], sli.Range)
48
58
| head :: tail ->
49
59
assert ( tail.Length = sli.Dots.Length)
50
60
@@ -53,9 +63,9 @@ let mkSynLongIdent (sli: SynLongIdent) =
53
63
||> List.zip
54
64
|> List.collect ( fun ( dot , ident ) ->
55
65
[ IdentifierOrDot.KnownDot( stn " ." dot)
56
- IdentifierOrDot.Ident( mkSynIdent ident) ])
66
+ IdentifierOrDot.Ident( mkSynIdent creationAide ident) ])
57
67
58
- IdentListNode( IdentifierOrDot.Ident( mkSynIdent head) :: rest, sli.Range)
68
+ IdentListNode( IdentifierOrDot.Ident( mkSynIdent creationAide head) :: rest, sli.Range)
59
69
60
70
let mkLongIdent ( longIdent : LongIdent ) : IdentListNode =
61
71
match longIdent with
@@ -116,7 +126,7 @@ let mkParsedHashDirective (creationAide: CreationAide) (ParsedHashDirective(iden
116
126
let text = creationAide.TextFromSource ( fun () -> $" %A {value}" ) range
117
127
stn text range |> Choice1Of2
118
128
| ParsedHashDirectiveArgument.Ident( value = ident) -> mkIdent ident |> Choice1Of2
119
- | ParsedHashDirectiveArgument.LongIdent( value = lid) -> mkSynLongIdent lid |> Choice2Of2)
129
+ | ParsedHashDirectiveArgument.LongIdent( value = lid) -> mkSynLongIdent creationAide lid |> Choice2Of2)
120
130
121
131
ParsedHashDirectiveNode( ident, args, range)
122
132
@@ -209,7 +219,7 @@ let mkAttribute (creationAide: CreationAide) (a: SynAttribute) =
209
219
| UnitExpr _ -> None
210
220
| e -> mkExpr creationAide e |> Some
211
221
212
- AttributeNode( mkSynLongIdent a.TypeName, expr, Option.map mkIdent a.Target, a.Range)
222
+ AttributeNode( mkSynLongIdent creationAide a.TypeName, expr, Option.map mkIdent a.Target, a.Range)
213
223
214
224
let mkAttributeList ( creationAide : CreationAide ) ( al : SynAttributeList ) : AttributeListNode =
215
225
let attributes = List.map ( mkAttribute creationAide) al.Attributes
@@ -1021,7 +1031,10 @@ let mkExpr (creationAide: CreationAide) (e: SynExpr) : Expr =
1021
1031
|> List.choose ( function
1022
1032
| SynExprRecordField(( fieldName, _), Some mEq, Some expr, _) ->
1023
1033
let m = unionRanges fieldName.Range expr.Range
1024
- Some( RecordFieldNode( mkSynLongIdent fieldName, stn " =" mEq, mkExpr creationAide expr, m))
1034
+
1035
+ Some(
1036
+ RecordFieldNode( mkSynLongIdent creationAide fieldName, stn " =" mEq, mkExpr creationAide expr, m)
1037
+ )
1025
1038
| _ -> None)
1026
1039
1027
1040
match baseInfo, copyInfo with
@@ -1049,7 +1062,7 @@ let mkExpr (creationAide: CreationAide) (e: SynExpr) : Expr =
1049
1062
|> List.choose ( function
1050
1063
| sli, Some mEq, e ->
1051
1064
let m = unionRanges sli.Range e.Range
1052
- let longIdent = mkSynLongIdent sli
1065
+ let longIdent = mkSynLongIdent creationAide sli
1053
1066
1054
1067
Some( RecordFieldNode( longIdent, stn " =" mEq, mkExpr creationAide e, m))
1055
1068
| _ -> None)
@@ -1069,7 +1082,7 @@ let mkExpr (creationAide: CreationAide) (e: SynExpr) : Expr =
1069
1082
|> List.choose ( function
1070
1083
| sli, Some mEq, e ->
1071
1084
let m = unionRanges sli.Range e.Range
1072
- let longIdent = mkSynLongIdent sli
1085
+ let longIdent = mkSynLongIdent creationAide sli
1073
1086
Some( RecordFieldNode( longIdent, stn " =" mEq, mkExpr creationAide e, m))
1074
1087
| _ -> None)
1075
1088
@@ -1294,7 +1307,7 @@ let mkExpr (creationAide: CreationAide) (e: SynExpr) : Expr =
1294
1307
ExprChain( chainLinks, exprRange) |> Expr.Chain
1295
1308
1296
1309
| AppSingleParenArg( SynExpr.LongIdent( longDotId = longDotId), px) ->
1297
- ExprAppLongIdentAndSingleParenArgNode( mkSynLongIdent longDotId, mkExpr creationAide px, exprRange)
1310
+ ExprAppLongIdentAndSingleParenArgNode( mkSynLongIdent creationAide longDotId, mkExpr creationAide px, exprRange)
1298
1311
|> Expr.AppLongIdentAndSingleParenArg
1299
1312
| AppSingleParenArg( e, px) ->
1300
1313
ExprAppSingleParenArgNode( mkExpr creationAide e, mkExpr creationAide px, exprRange)
@@ -1479,9 +1492,10 @@ let mkExpr (creationAide: CreationAide) (e: SynExpr) : Expr =
1479
1492
1480
1493
| SynExpr.Ident ident -> mkIdent ident |> Expr.Ident
1481
1494
| SynExpr.LongIdent( isOpt, synLongIdent, _, m) ->
1482
- ExprOptVarNode( isOpt, mkSynLongIdent synLongIdent, m) |> Expr.OptVar
1495
+ ExprOptVarNode( isOpt, mkSynLongIdent creationAide synLongIdent, m)
1496
+ |> Expr.OptVar
1483
1497
| SynExpr.LongIdentSet( synLongIdent, e, _) ->
1484
- ExprLongIdentSetNode( mkSynLongIdent synLongIdent, mkExpr creationAide e, exprRange)
1498
+ ExprLongIdentSetNode( mkSynLongIdent creationAide synLongIdent, mkExpr creationAide e, exprRange)
1485
1499
|> Expr.LongIdentSet
1486
1500
| SynExpr.DotIndexedGet( objectExpr, indexArgs, _, _) ->
1487
1501
ExprDotIndexedGetNode( mkExpr creationAide objectExpr, mkExpr creationAide indexArgs, exprRange)
@@ -1497,7 +1511,7 @@ let mkExpr (creationAide: CreationAide) (e: SynExpr) : Expr =
1497
1511
|> Expr.DotIndexedSet
1498
1512
| SynExpr.NamedIndexedPropertySet( synLongIdent, e1, e2, _) ->
1499
1513
ExprNamedIndexedPropertySetNode(
1500
- mkSynLongIdent synLongIdent,
1514
+ mkSynLongIdent creationAide synLongIdent,
1501
1515
mkExpr creationAide e1,
1502
1516
mkExpr creationAide e2,
1503
1517
exprRange
@@ -1506,7 +1520,7 @@ let mkExpr (creationAide: CreationAide) (e: SynExpr) : Expr =
1506
1520
| SynExpr.DotNamedIndexedPropertySet( e, synLongIdent, e1, e2, _) ->
1507
1521
ExprDotNamedIndexedPropertySetNode(
1508
1522
mkExpr creationAide e,
1509
- mkSynLongIdent synLongIdent,
1523
+ mkSynLongIdent creationAide synLongIdent,
1510
1524
mkExpr creationAide e1,
1511
1525
mkExpr creationAide e2,
1512
1526
exprRange
@@ -1721,7 +1735,8 @@ let mkPat (creationAide: CreationAide) (p: SynPat) =
1721
1735
PatNamedParenStarIdentNode( mkSynAccess ao, stn " (" lpr, stn op ident.idRange, stn " )" rpr, patternRange)
1722
1736
|> Pattern.NamedParenStarIdent
1723
1737
| SynPat.Named( accessibility = ao; ident = ident) ->
1724
- PatNamedNode( mkSynAccess ao, mkSynIdent ident, patternRange) |> Pattern.Named
1738
+ PatNamedNode( mkSynAccess ao, mkSynIdent creationAide ident, patternRange)
1739
+ |> Pattern.Named
1725
1740
| SynPat.As( p1, p2, _) ->
1726
1741
PatLeftMiddleRight( mkPat creationAide p1, Choice2Of2 " as" , mkPat creationAide p2, patternRange)
1727
1742
|> Pattern.As
@@ -1753,14 +1768,21 @@ let mkPat (creationAide: CreationAide) (p: SynPat) =
1753
1768
unionRanges ident.idRange pat.Range
1754
1769
)))
1755
1770
1756
- PatNamePatPairsNode( mkSynLongIdent synLongIdent, typarDecls, stn " (" lpr, pairs, stn " )" rpr, patternRange)
1771
+ PatNamePatPairsNode(
1772
+ mkSynLongIdent creationAide synLongIdent,
1773
+ typarDecls,
1774
+ stn " (" lpr,
1775
+ pairs,
1776
+ stn " )" rpr,
1777
+ patternRange
1778
+ )
1757
1779
|> Pattern.NamePatPairs
1758
1780
| SynPat.LongIdent( synLongIdent, _, vtdo, SynArgPats.Pats pats, ao, _) ->
1759
1781
let typarDecls = mkSynValTyparDecls creationAide vtdo
1760
1782
1761
1783
PatLongIdentNode(
1762
1784
mkSynAccess ao,
1763
- mkSynLongIdent synLongIdent,
1785
+ mkSynLongIdent creationAide synLongIdent,
1764
1786
typarDecls,
1765
1787
List.map ( mkPat creationAide) pats,
1766
1788
patternRange
@@ -1825,13 +1847,13 @@ let mkBinding
1825
1847
match sli.IdentsWithTrivia with
1826
1848
| [ prefix; OperatorWithStar operatorNode ] ->
1827
1849
IdentListNode(
1828
- [ IdentifierOrDot.Ident( mkSynIdent prefix)
1850
+ [ IdentifierOrDot.Ident( mkSynIdent creationAide prefix)
1829
1851
IdentifierOrDot.UnknownDot
1830
1852
operatorNode ],
1831
1853
sli.Range
1832
1854
)
1833
1855
| [ OperatorWithStar operatorNode ] -> IdentListNode([ operatorNode ], sli.Range)
1834
- | _ -> mkSynLongIdent sli
1856
+ | _ -> mkSynLongIdent creationAide sli
1835
1857
1836
1858
let ao , functionName , genericParameters , parameters =
1837
1859
match pat with
@@ -1844,7 +1866,7 @@ let mkBinding
1844
1866
let name =
1845
1867
match si with
1846
1868
| OperatorWithStar operatorNode -> operatorNode
1847
- | _ -> IdentifierOrDot.Ident( mkSynIdent si)
1869
+ | _ -> IdentifierOrDot.Ident( mkSynIdent creationAide si)
1848
1870
1849
1871
let m =
1850
1872
let ( SynIdent ( ident , _ )) = si
@@ -1958,7 +1980,7 @@ let mkExternBinding
1958
1980
id = [ ArrayText suffix ]))
1959
1981
isPostfix = true
1960
1982
typeArgs = [ SynType.App( typeName = SynType.LongIdent argLid; isPostfix = false ; typeArgs = []) ]) ->
1961
- let lid = mkSynLongIdent argLid
1983
+ let lid = mkSynLongIdent creationAide argLid
1962
1984
1963
1985
let lidPieces =
1964
1986
lid.Content
@@ -1991,7 +2013,7 @@ let mkExternBinding
1991
2013
| SynPat.LongIdent(
1992
2014
longDotId = longDotId
1993
2015
argPats = SynArgPats.Pats [ SynPat.Tuple(_, ps, _, StartEndRange 1 ( mOpen, _, mClose)) ]) ->
1994
- mkSynLongIdent longDotId, stn " (" mOpen, List.map mkExternPat ps, stn " )" mClose
2016
+ mkSynLongIdent creationAide longDotId, stn " (" mOpen, List.map mkExternPat ps, stn " )" mClose
1995
2017
| _ -> failwith " expecting a SynPat.LongIdent for extern binding"
1996
2018
1997
2019
ExternBindingNode(
@@ -2276,22 +2298,22 @@ let mkType (creationAide: CreationAide) (t: SynType) : Type =
2276
2298
| SynType.LongIdentApp( t, lid, Some mLt, args, _, Some mGt, _) ->
2277
2299
TypeAppPrefixNode(
2278
2300
mkType creationAide t,
2279
- Some( mkSynLongIdent lid),
2301
+ Some( mkSynLongIdent creationAide lid),
2280
2302
stn " <" mLt,
2281
2303
List.map ( mkType creationAide) args,
2282
2304
stn " >" mGt,
2283
2305
typeRange
2284
2306
)
2285
2307
|> Type.AppPrefix
2286
2308
| SynType.LongIdentApp( t, lid, None, [], _, None, _) ->
2287
- TypeLongIdentAppNode( mkType creationAide t, mkSynLongIdent lid, typeRange)
2309
+ TypeLongIdentAppNode( mkType creationAide t, mkSynLongIdent creationAide lid, typeRange)
2288
2310
|> Type.LongIdentApp
2289
2311
| SynType.WithGlobalConstraints( SynType.Var _, [ SynTypeConstraint.WhereTyparSubtypeOfType _ as tc ], _) ->
2290
2312
mkSynTypeConstraint creationAide tc |> Type.WithSubTypeConstraint
2291
2313
| SynType.WithGlobalConstraints( t, tcs, _) ->
2292
2314
TypeWithGlobalConstraintsNode( mkType creationAide t, List.map ( mkSynTypeConstraint creationAide) tcs, typeRange)
2293
2315
|> Type.WithGlobalConstraints
2294
- | SynType.LongIdent lid -> Type.LongIdent( mkSynLongIdent lid)
2316
+ | SynType.LongIdent lid -> Type.LongIdent( mkSynLongIdent creationAide lid)
2295
2317
| SynType.AnonRecd( isStruct, fields, StartEndRange 2 (_, r, mClosing)) ->
2296
2318
let structNode , openingNode =
2297
2319
if isStruct then
@@ -2361,7 +2383,7 @@ let rec (|OpenL|_|) =
2361
2383
let mkOpenNodeForImpl ( creationAide : CreationAide ) ( target , range ) : Open =
2362
2384
match target with
2363
2385
| SynOpenDeclTarget.ModuleOrNamespace( longId, _) ->
2364
- OpenModuleOrNamespaceNode( mkSynLongIdent longId, range)
2386
+ OpenModuleOrNamespaceNode( mkSynLongIdent creationAide longId, range)
2365
2387
|> Open.ModuleOrNamespace
2366
2388
| SynOpenDeclTarget.Type( typeName, _) -> OpenTargetNode( mkType creationAide typeName, range) |> Open.Target
2367
2389
@@ -2456,7 +2478,7 @@ let mkSynUnionCase
2456
2478
mkXmlDoc xmlDoc,
2457
2479
mkAttributes creationAide attributes,
2458
2480
Option.map ( stn " |" ) trivia.BarRange,
2459
- mkSynIdent ident,
2481
+ mkSynIdent creationAide ident,
2460
2482
fields,
2461
2483
fullRange
2462
2484
)
@@ -2570,7 +2592,7 @@ let mkTypeDefn
2570
2592
mkXmlDoc xmlDoc,
2571
2593
Option.map ( stn " |" ) trivia.BarRange,
2572
2594
mkAttributes creationAide attributes,
2573
- mkSynIdent ident,
2595
+ mkSynIdent creationAide ident,
2574
2596
stn " =" trivia.EqualsRange,
2575
2597
mkExpr creationAide valueExpr,
2576
2598
range
@@ -2930,7 +2952,7 @@ let mkMemberDefn (creationAide: CreationAide) (md: SynMemberDefn) =
2930
2952
mkXmlDoc px,
2931
2953
mkAttributes creationAide ats,
2932
2954
mkSynLeadingKeyword trivia.LeadingKeyword,
2933
- mkSynIdent ident,
2955
+ mkSynIdent creationAide ident,
2934
2956
mkSynValTyparDecls creationAide ( Some tds),
2935
2957
mkType creationAide t,
2936
2958
mkWithGetSet trivia.WithKeyword abstractSlotTrivia.GetSetKeywords visGet visSet,
@@ -3003,7 +3025,7 @@ let mkMemberDefn (creationAide: CreationAide) (md: SynMemberDefn) =
3003
3025
mkSynLeadingKeyword lk,
3004
3026
Option.map ( stn " inline" ) inlineKw,
3005
3027
mkSynAccess accessibility,
3006
- mkSynLongIdent memberName,
3028
+ mkSynLongIdent creationAide memberName,
3007
3029
stn " with" withKeyword,
3008
3030
firstBinding,
3009
3031
Some( stn " and" andKeyword),
@@ -3054,7 +3076,7 @@ let mkMemberDefn (creationAide: CreationAide) (md: SynMemberDefn) =
3054
3076
mkSynLeadingKeyword lk,
3055
3077
Option.map ( stn " inline" ) inlineKw,
3056
3078
mkSynAccess visMember,
3057
- mkSynLongIdent memberName,
3079
+ mkSynLongIdent creationAide memberName,
3058
3080
stn " with" withKeyword,
3059
3081
bindingNode,
3060
3082
None,
@@ -3072,7 +3094,7 @@ let mkMemberDefn (creationAide: CreationAide) (md: SynMemberDefn) =
3072
3094
mkSynLeadingKeyword lk,
3073
3095
Option.map ( stn " inline" ) inlineKw,
3074
3096
mkSynAccess visMember,
3075
- mkSynLongIdent memberName,
3097
+ mkSynLongIdent creationAide memberName,
3076
3098
stn " with" withKeyword,
3077
3099
bindingNode,
3078
3100
None,
@@ -3099,7 +3121,7 @@ let mkVal
3099
3121
Option.map ( stn " inline" ) trivia.InlineKeyword,
3100
3122
isMutable,
3101
3123
mkSynAccess ao,
3102
- mkSynIdent synIdent,
3124
+ mkSynIdent creationAide synIdent,
3103
3125
mkSynValTyparDecls creationAide ( Some vtd),
3104
3126
mkType creationAide t,
3105
3127
Option.map ( stn " =" ) trivia.EqualsRange,
@@ -3356,7 +3378,7 @@ let mkTypeDefnSig (creationAide: CreationAide) (SynTypeDefnSig(typeInfo, typeRep
3356
3378
mkXmlDoc xmlDoc,
3357
3379
Option.map ( stn " |" ) trivia.BarRange,
3358
3380
mkAttributes creationAide attributes,
3359
- mkSynIdent ident,
3381
+ mkSynIdent creationAide ident,
3360
3382
stn " =" trivia.EqualsRange,
3361
3383
mkExpr creationAide valueExpr,
3362
3384
range
0 commit comments