1
1
using CSTParser
2
- using CSTParser: EXPR, Call, Location, exprloc, charrange
2
+ using CSTParser: EXPR, Call, Location, LocExpr, exprloc, charrange
3
3
4
4
expridx (x, ii) = (@assert isempty (ii); x)
5
5
expridx (x:: Expr , ii) = isempty (ii) ? x : expridx (x. args[ii[1 ]], ii[2 : end ])
6
+ expridx (x:: LocExpr , ii) = expridx (x. expr, ii)
6
7
7
8
function precedence_level (cst:: EXPR , loc:: Location )
8
9
parent = cst[CSTParser. parent (loc)]
@@ -48,16 +49,16 @@ struct SourceFile
48
49
path:: String
49
50
text:: String
50
51
cst:: EXPR
51
- ast:: Expr
52
+ ast:: LocExpr
52
53
end
53
54
54
55
function SourceFile (path:: String , text = String (read (path)))
55
56
cst = CSTParser. parse (text, true )
56
- SourceFile (path, text, cst, Expr (cst))
57
+ SourceFile (path, text, cst, LocExpr (cst))
57
58
end
58
59
59
60
function replacement (src:: SourceFile , p:: Replace )
60
- loc = exprloc (src. cst , p. idx)
61
+ loc = exprloc (src. ast , p. idx)
61
62
prec = precedence_level (src. cst, loc)
62
63
_, span = charrange (src. cst, loc)
63
64
span => sprint (Base. show_unquoted, p. new, 0 , prec)
66
67
function replacement (src:: SourceFile , p:: Insert )
67
68
append = p. idx[end ] > length (expridx (src. ast, p. idx[1 : end - 1 ]). args)
68
69
append && (p. idx[end ] -= 1 )
69
- loc = exprloc (src. cst , p. idx)
70
+ loc = exprloc (src. ast , p. idx)
70
71
# TODO handle cases like this more generally
71
72
src. cst[CSTParser. parent (loc)] isa EXPR{Call} && (loc. ii[end ] = max (loc. ii[end ], 2 ))
72
73
_, span = charrange (src. cst, loc)
@@ -81,7 +82,7 @@ function replacement(src::SourceFile, p::Insert)
81
82
end
82
83
83
84
function replacement (src:: SourceFile , p:: Delete )
84
- loc = exprloc (src. cst , p. idx)
85
+ loc = exprloc (src. ast , p. idx)
85
86
span, _ = charrange (src. cst, loc)
86
87
sep = separator (src. cst, loc)
87
88
sep isa AbstractRange || (sep = span)
@@ -120,16 +121,18 @@ function patch!(src::SourceFile, p)
120
121
end
121
122
122
123
function sourcemap (f, src:: SourceFile )
123
- ex = striplines (f (src. ast))
124
- patch (src, diff (src. ast, ex))
124
+ expr = CSTParser. striploc (src. ast)
125
+ ex = striplines (f (expr))
126
+ patch (src, diff (expr, ex))
125
127
end
126
128
127
129
function sourcemap (f, path:: AbstractString )
128
130
isdir (path) && return sourcemap_dir (f, path)
129
131
isfile (path) || error (" No file at $path " )
130
132
s = SourceFile (path)
131
- ex = striplines (f (s. ast))
132
- patch! (s, diff (s. ast, ex))
133
+ expr = CSTParser. striploc (s. ast)
134
+ ex = striplines (f (expr))
135
+ patch! (s, diff (expr, ex))
133
136
return
134
137
end
135
138
0 commit comments