https://github.com/yinwang0/pysonar2
PySonar2: a semantic indexer for Python with interprocedual type inference
https://github.com/yinwang0/pysonar2
code-analysis code-intelligence code-search index python static-analysis type-inference
Last synced: 12 days ago
JSON representation
PySonar2: a semantic indexer for Python with interprocedual type inference
- Host: GitHub
- URL: https://github.com/yinwang0/pysonar2
- Owner: yinwang0
- License: apache-2.0
- Created: 2013-10-29T07:20:43.000Z (about 13 years ago)
- Default Branch: master
- Last Pushed: 2026-03-02T04:19:48.000Z (8 months ago)
- Last Synced: 2026-09-29T19:19:06.553Z (about 1 month ago)
- Topics: code-analysis, code-intelligence, code-search, index, python, static-analysis, type-inference
- Language: Java
- Homepage:
- Size: 8.8 MB
- Stars: 1,423
- Watchers: 44
- Forks: 498
- Open Issues: 2
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
- fucking-awesome-python-cn - pysonar2
- useful-java-links - Pysonar2 - 3.0.en.html) [GNU AGPLv3](http://www.gnu.org/licenses/agpl-3.0.en.html), [](https://github.com/yinwang0/pysonar2).  (VI. Program languages and applications that were written with Java / 2. Other program languages tools that were written with Java)
- awesome-python-cn - pysonar2
- fucking_awesome_python - pysonar2 - A type inferencer and indexer for Python. (Code Analysis and Linter)
- awesome-java - PySonar2
README
# PySonar2 - a type inferencer and indexer library for Python
PySonar2 is a type inferencer and indexer library for Python, designed for analysing large code bases.
The resulting index can be used to build code browsers and code search engines.
PySonar2 has a sophisticated type system and whole-project interprocedural analysis to infer types
and locate definitions. It handles first-class functions (closures) and control flow correctly.
As a result, the accuracy of the index often outperforms Python IDEs such as PyCharm.
PySonar2 uses advanced analysis techniques similar to control-flow analysis (k-CFA, CFA2, etc), but
with a much simpler theory and without their drawbacks. It is both highly accurate and highly performant,
thus it became the choice of several large scale code index infrastructures,
Major users include:
- Google
- Sourcegraph
- Insight.io (now part of Elastic)
### How to build
mvn package -DskipTests
### Demo
To have a feel of what PySonar2 produce, you can build a simple code browser of the Python 2.7
standard library with the following command line:
java -jar target/pysonar-.jar /usr/lib/python2.7 ./html
This may take a few minutes depending on your machine. You should find some interactive HTML files
inside the _html_ directory after this process. You can move your mouse on the variables and click
on them to jump to definitions etc.
Note that this is just a simple demo program based on the library. PySonar2 is not meant to be an
end-user tool. It is mainly designed as a library for Python IDEs, developer tools and code search
engines, so its interface may not be as appealing as an end-user tool.
If you have problems with it, please feel free to contact me.
### System requirements
* Python 2.7.x
* Python 3.x
* Java 8+
* maven
### Environment variables
PySonar2 uses CPython's built-in `ast` package to parse Python code, so please make sure you have
`python` or `python3` installed and pointed to by the `PATH` environment variable. If you have them
in different names, please make symbol links.
`PYTHONPATH` environment variable is used for locating the Python standard libraries. It is
important to point it to the correct Python library, for example
export PYTHONPATH=/usr/lib/python2.7
If this is not set up correctly, references to library code will not be found.
### Contribute
You are welcome to make code contributions.
Because of the highly complex and unpublished theory behind PySonar2, things may go wrong easily
with even an innocent-looking change. If you hope to contribute to PySonar2, please discuss with me
first before making significant changes, otherwise I may not be able to review your changes.
For basic verification, you can run the unit tests. PySonar2 has a basic test framework. You can run
the tests using this command:
mvn test
If you modify the code or tests, you need to generate new expected results. Run these command lines:
mvn package -DskipTests
java -classpath target/pysonar-.jar org.yinwang.pysonar.TestInference -generate tests
To write new tests, you just need to write relevant Python code demonstrating your change, put them
into a directory named `tests/testname.test`(test directory name must end with ".test"). Please look
at the `tests` directory for examples.
Please don't expect the tests to catch all bugs. Be very careful :)
### License
Apache 2.0 License. See LICENSE file.