[HN Gopher] Comby - Structural code search and replace for every...
       ___________________________________________________________________
        
       Comby - Structural code search and replace for every language
        
       Author : WallyFunk
       Score  : 109 points
       Date   : 2022-05-17 17:03 UTC (5 hours ago)
        
 (HTM) web link (comby.dev)
 (TXT) w3m dump (comby.dev)
        
       | CrazyPyroLinux wrote:
       | This looks a lot like https://semgrep.dev/ Interesting that they
       | are both largely OCaml.
        
         | jjice wrote:
         | ML style languages handle tree structures and traversal so
         | well, I'm wondering if that's a large reason for using it.
        
       | feanaro wrote:
       | A more interesting comparison than with Coccinelle is with
       | semgrep (https://semgrep.dev/) since it also supports
       | semantic/structural pattern matching over a number of languages,
       | but also adds in a bunch of Boolean logic into the mix, as well
       | as some more advanced semantic features like constant
       | propagation.
       | 
       | Curious whether the teams behind these tools are aware of each
       | other? I suppose it's unlikely that they're not.
        
         | LesZedCB wrote:
         | yeah i just discovered semgrep a week ago! i'll have to
         | download this and compare.
         | 
         | i found the CLI features lacking in semgrep (vs using a yaml
         | config), so maybe this will have more support there.
        
         | carlmr wrote:
         | Comby works with C++, which to me is a great advantage.
        
       | adamesque wrote:
       | I believe Sourcegraph uses Comby under the hood to an extent for
       | structural matching as well!
        
         | vanesa- wrote:
         | Yep! (Sourcegraph Community Manager here) We use Comby syntax
         | for structural search:
         | https://docs.sourcegraph.com/code_search/reference/structura...
         | 
         | We also have a few tutorials to make large-scale code changes
         | across many repositories and code hosts (batch changes) with
         | Comby:
         | 
         | - Refactor Go code using Comby:
         | https://docs.sourcegraph.com/batch_changes/tutorials/refacto...
         | 
         | - Updating Go import statements using Comby:
         | https://docs.sourcegraph.com/batch_changes/tutorials/updatin...
         | 
         | The author of Comby is a researcher at Sourcegraph building our
         | search platform.
        
       | picardo wrote:
       | Superb tool. I used Comby to create a massive (3000+ changes) PR
       | in which I ported JS type annotations into TS typings.
        
       | marcodiego wrote:
       | License?
       | 
       | Also, how does it compare to Coccinelle?
        
         | smallnix wrote:
         | License seems to be apache V2, see https://github.com/comby-
         | tools/comby/blob/master/LICENSE.
         | 
         | They have a comparison section in their faq
         | (https://comby.dev/docs/faq):
         | 
         | "Coccinelle uses a declarative syntax for matching constructs
         | like function calls, if-statements, expression blocks, and so
         | on for the C language. Some notable differences are that
         | Coccinelle provides a patch-like format to express
         | transformations (handy when you want to inline smaller changes
         | in a broader context) and metavariable declarations (handy for
         | developing and organizing more sophisticated patterns). For an
         | example, see the file null_ref.cocci. Coccinelle works only for
         | the C language, and may struggle to parse files that contain
         | non-standard C constructs, like GCC inline assembly. Recent
         | Coccinelle work has started expanding support for Java. In
         | contrast, Comby's syntax targets a wide range of languages and
         | is more robust to matching patterns in the presence of
         | unrecognized constructs. Comby is more suited to writing quick
         | find-replace patterns for languages beyond C, and works well on
         | C languages too."
        
       | slightknack wrote:
       | I mocked up a prototype for something similar to this using
       | TreeSitter and its query language the other day for some heavy
       | refactoring I had to do. This looks like a really cool project,
       | will have to try it out!
        
       | kretaceous wrote:
       | Okay wow. I didn't tools like this existed! There's been more
       | than once where I've found myself in a situation like "find all
       | code like this, change if this, delete if this". Regex can only
       | get you so far.
       | 
       | Does someone know if this or something similar is available as a
       | VSCode extension? It'd be fun to make one if not!
        
         | ducktective wrote:
         | language-server methods like rename
        
       ___________________________________________________________________
       (page generated 2022-05-17 23:00 UTC)