CodeSearch
CodeSearch.jl is a package for semantically searching Julia code. Unlike plain string search
and regex search, CodeSearch performs search operations after parsing. Thus the search
patterns j"a + b"
and j"a+b"
are equivalent, and both match the code a +b
.
julia> using CodeSearch
julia> j"a + b" == j"a+b"
true
julia> findfirst(j"a+b", "sqrt(a +b)/(a+ b)")
6:9
The other key feature in this package is wildcard matching. You can use the character *
to
match any expression. For example, the pattern j"a + *"
matches both a + b
and
a + (b + c)
.
julia> Expr.(eachmatch(j"a + *", "a + (a + b), a + sqrt(2)"))
3-element Vector{Expr}:
:(a + (a + b))
:(a + b)
:(a + sqrt(2))
Here we can see that j"a + *"
matches multiple places, even some that nest within
eachother!
Finally, it is possible to extract the "captured values" that match the wildcards.
julia> m = match(j"a + *", "a + (a + b), a + sqrt(2)")
CodeSearch.Match((call-i a + (call-i a + b)), captures=[(call-i a + b)])
julia> m.captures
1-element Vector{JuliaSyntax.SyntaxNode}:
(call-i a + b)
julia> Expr(only(m.captures))
:(a + b)
How to use this package
- Create
Pattern
s with the@j_str
macro or theCodeSearch.pattern
function. - Search an
AbstractString
or aJuliaSyntax.SyntaxNode
for whether and where that pattern occurs with generic functions likeoccursin
,findfirst
,findlast
, orfindall
OR extract the actualMatch
es with generic functions likeeachmatch
andmatch
. - If you extracted an actual match, access relevant information using the public
syntax_node
andcaptures
fields, convert to aSyntaxNode
,Expr
, orAbstractString
via constructors, index into the captures directly withgetindex
, or extract the indices in the original string that match the capture withindices
.