Code2flow will sweep through your project source code looking for function definitions. Then it will do another sweep looking for where those functions are called. Code2flow connects the dots and presents you with a flowchart estimating the functional structure of your program.
In other words, code2flow generates callgraphs
Code2flow is especially useful for untangling spaghetti code and getting new developers up to speed.
Code2flow is EXPERIMENTAL and meant to provide a rough overview of the structure of simpler projects. There are many known limitations (see below). Expect MOST aspects of this application to change in future releases.
Here is what happens when you run it on jquery
On the python calendar module
code2flow alternatives and similar packages
Based on the "Code Analysis" category.
Alternatively, view code2flow alternatives based on common mentions on social networks and blogs.
8.2 4.8 L4 code2flow VS coalacoala provides a unified command-line interface for linting and fixing all your code, regardless of the programming languages you use.
5.6 0.0 L5 code2flow VS UndebtA fast, straightforward, reliable tool for performing massive, automated code refactoring
* Code Quality Rankings and insights are calculated and provided by Lumnify.
They vary from L1 to L5 with "L5" being the highest. Visit our partner's website for more details.
Do you think we are missing an alternative of code2flow or a related project?
Updates from May 2021
- I've entered into a contract with a generous sponsor to update code2flow.
- Going forward, in addition to JS, expect support for PHP8, & Ruby3
- The domain, code2flow.com is unrelated to this project and as far as I can tell through the internet archive, they launched their service after this repository was created. I've never heard anything from them and it doesn't appear like they use anything from here.
- The pip install, code2flow, has been claimed by a different unrelated project. For now, don't install code2flow from pip. Instead, scroll to the installation section for instructions.
The basic algorithm is simple:
- Find function definitions in your project's source code.
- Determine where those functions are called.
- Connect the dots.
Code2flow is useful for:
- Untangling spaghetti code.
- Identifying orphaned functions.
- Getting new developers up to speed.
Code2flow will provide a pretty good estimate of your project's structure. No algorithm can generate a perfect call graph for a dynamic language - even less so if that language is duck-typed. See the known limitations in the section below.
[code2flow running against itself TODO abspath https://raw.githubusercontent.com/scottrogowski/code2flow/master/assets/code2flow_output.png](assets/code2flow_output.png)
For now, do not pip install. The code2flow name is held by a different project. Instead, run:
python setup.py install
If you don't have it already, you will also need to install graphviz. Installation instructions can be found here.
To generate a DOT file run something like:
You can also specify multiple files or import directories:
code2flow project/directory/source_a.js project/directory/source_b.js
code2flow project/directory --language js
There are a ton of command line options, to see them all, run:
How code2flow works
Code2flow approximates the structure of projects in dynamic languages. It is not possible to generate a perfect callgraph for a dynamic language.
- Generate an AST of the source code
- Recursively separate groups and nodes. Groups are files, modules, or classes. More precisely, groups are namespaces where functions live. Nodes are the functions themselves.
- For all nodes, identify function calls in those nodes.
- For all nodes, identify in-scope variables. Attempt to connect those variables to specific nodes and groups. This is where there is some ambiguity in the algorithm because it is possible to know the types of variables in dynamic languages. So, instead, heuristics must be used.
- For all calls in all nodes, attempt to find a match from the in-scope variables. This will be an edge.
- If a definitive match from in-scope variables cannot be found, attempt to find a single match from all other groups and nodes.
- Trim orphaned nodes and groups.
- Output results.
Why is it impossible to generate a perfect call graph?
Consider this toy example in Python
def func_factory(inp_float): if inp_float < .5: return func_a else: return func_b func = func_factory(important_variable) func()
We have no way of knowing whether
func will point to
func_b until runtime. In practice, ambiguity like this is common and is present in most non-trivial applications.
Code2flow is internally powered by ASTs. Most limitations stem from a token not being named what code2flow expects it to be named.
- All functions without definitions are skipped. This most often happens when a file is not included.
- Functions with identical names in different namespaces are (loudly) skipped. E.g. If you have two classes with identically named methods, code2flow cannot distinguish between these and skips them.
- Imported functions from outside of your project directory (including from the standard library) which share names with your defined functions may not be handled correctly. Instead when you call the imported function, code2flow will link to your local functions. E.g. if you have a function "search()" and call, "import searcher; searcher.search()", code2flow may link (incorrectly) to your defined function.
- Anonymous or generated functions are skipped. This includes lambdas and factories.
- If a function is renamed, either explicitly or by being passed around as a parameter, it will be skipped.
Code2flow is licensed under the MIT license. Prior to the rewrite in April 2021, code2flow was licensed under LGPL. The last commit under that license was 24b2cb854c6a872ba6e17409fbddb6659bf64d4c. The April 2021 rewrite was substantial so it's probably reasonable to treat code2flow as completely MIT-licensed.
Feedback / Bugs / Contact
Please do email! [email protected]
How to contribute
- You can contribute code! Code2flow has limitations. There is room for improvement in adding heuristics to resolve these limitation. Pull requests which address these improvements will be helpful and accepted. Separately, new languages will be especially appreciated!
- You can spread the word! A simple way to help is to share this project with others. If you have a blog, mention code2flow! Linking from relevant questions on StackOverflow or other forums also helps quite a bit.
Email me. At any time, I'm spread thin across a lot of projects so I will, unfortunately, turn down most requests. However, I am open to contracting for compelling features.
*Note that all licence references and agreements mentioned in the code2flow README section above are relevant to that project's source code only.