A code rewrite tool for structural search and replace that supports ~every language.
APACHE-2.0 License
Bot releases are visible (Hide)
stdout
per result (previously comby
would possibly buffer more than one result).Published by rvantonder over 2 years ago
using the -tar
option now outputs file paths in results (previously null
)
experimental: using the -omega
option, whitespace between delimiters will be matched loosely instead of strictly. This gives more flexibility for pattern matching, g.g., a pattern like foo(bar)
will match any of: foo( bar)
, foo(bar )
or something like
foo(
bar
)
This only applies to whitespace immediately after an opening delimiter, and whitespace immediately preceding a closing delimiter.
Published by rvantonder over 2 years ago
Fixes JSON output of -json-lines
which previously emitted double-escaped values like \\n
instead of \n
Published by rvantonder over 3 years ago
update language definitions (MATLAB, R)
recognize Terraform file extension .tf
for -lang
flag (previously .hcl
).
additional property accesses .file
aliased to file.path
fixes behavior so that -newline-separated
works with rewrite {...}
rules
custom metasyntax is now recognized for all terms inside rules
custom metasyntax aliases are now applied to rules
Published by rvantonder over 3 years ago
Utility properties for holes. The following are introduced and recognized in rules and rewrite templates, and are substituted:
:[hole].length
:[hole]
with the respective string processing in rewrite templates and rules:[hole].lowercase
:[hole].UPPERCASE
:[hole].Capitalize
:[hole].uncapitalize
:[hole].UpperCamelCase
:[hole].lowerCamelCase
:[hole].UPPER_SNAKE_CASE
:[hole].lower_snake_case
:[hole].file.path
:[hole].file.name
:[hole].file.directory
where :[x] == :[y],
where match :[x] {
| :[y] -> :[z],
},
|
for pattern matching:where match :[x] { :[y] -> :[z] }
_
:where match :[x] { _ -> :[z] }
implies
where match :[x] { :[_] -> :[z] }
~
:where match :[x] { ~match-regex -> :[z] }
implies
where match :[x] { :[~match-regex] -> :[z] }
\t
, \n
, \r
, \\
escape sequences):where match :[x] { '"yep"\n' -> :[z] }
where match :[x] { `"yep"\n` -> :[z] }
where match :[x] { foo(:[x]) -> :[x] }
where rewrite :[x] { foo(:[x]) -> :[x] }
Behavior looks for the first ->
, so ->
must be escaped if this should be matched literally. Trailing and leading spaces in pattern matches are ignored--use quotes for significant leading and trailing spaces
Added .hcl
language definition
The experimental optional hole syntax is removed. Use regular expressions holes with optional modifiers ?
instead.
Published by rvantonder over 3 years ago
-rg
option to not emit an error when no matches/files are found to process.Published by rvantonder over 3 years ago
Support general metasyntax customization. See blog post and docs for more.
Fixed an issue where substituting for regex syntax required repeating the pattern in the rewrite template. E.g., if a pattern like :[x~\w+]
matched, it was necessary to specify :[x~\w+]
in the rewrite template, instead of just :[x]
. Now you can specify just :[x]
.
It's now possible to define only match=...
fields if you only want to implement a checker without rewrite=...
in config files. This wasn't working correctly before (omitting rewrite
would not work, or multiple match
patterns would be ignored).
Published by rvantonder over 3 years ago
No functional changes. This is just a package split for comby
the app, and comby-kernel
, a minimal OCaml library.
Published by rvantonder over 3 years ago
comby.mli
Published by rvantonder over 3 years ago
opam
packagingPublished by rvantonder over 3 years ago
opam
release candidate.Published by rvantonder over 3 years ago
-parany
option to use an alternative parallel library. -parany
is the default parallel library on arm systems/.../
because this may conflict with division syntaxPublished by rvantonder over 3 years ago
-bound-count
flagStop running when at least num matches are
found (possibly more are returned for parallel
jobs).
avoids writing to file system if a file is unchanged
bug fix: don't parse for comments inside strings
bug fix: don't assume single quotes in Haskell are balanced
adds additional delimiters to interpret code blocks in Julia
adds support for Coq, Zig, Solidity, and Move languages by adding basic definitions
bug fix where strings should have been escaped in -match-only
JSON output
bug fix where carriage returns\r
were not escaped in match output
fresh variable generation via :[id()]
in -sequential
mode increment sequentially
add experimental nested matching via where nested
Published by rvantonder about 4 years ago
Breaking change:
:[hole]
will only match across newlines If they are inside delimiters for a language. Otherwise, it will match at most to the end of line, rather than across multiple lines or to the end of file. To disable this behavior and force matching across newlines for any language, add the flag -match-newline-at-toplevel
. There is one exception to this change: The following languages/file extensions are unaffected and will continue to match across newlines outside delimiters:
.tsx
, .jsx
, .html
, .xml
, .tex
, .txt
<p>...</p>
are not yet considered proper delimiters, and other textual inputs do not typically contain delimiters.Additions:
...
alias can now be used instead of :[_]
in rules. Example:where match :[args] {
| "..., foo, ..." -> true
| "..." -> false
}
Published by rvantonder about 4 years ago
:[hole]
: If they are not inside nested delimiters, only match until it's suffix, or end of line (rather than end of file).-cut-off-newline
Published by rvantonder about 4 years ago
...
in templates alias to :[_]
Published by rvantonder about 4 years ago
Published by rvantonder about 4 years ago
Published by rvantonder about 4 years ago
:[hole]
: If they are not inside nested delimiters, only match until it's suffix, or end of line (rather than end of file).