2019-03-21 15:56:57 +03:00
# Semantic
`semantic` is a Haskell library and command line tool for parsing, analyzing, and comparing source code.
2019-06-04 17:23:27 +03:00
In a hurry? Check out our documentation of [example uses for the `semantic` command line tool ](docs/examples.md ).
2019-03-21 15:56:57 +03:00
| Table of Contents |
| :------------- |
| [Usage ](#usage ) |
| [Language support ](#language-support ) |
| [Development ](#development ) |
| [Technology and architecture ](#technology-and-architecture ) |
2019-03-21 16:01:13 +03:00
| [Licensing ](#licensing ) |
2019-03-21 15:56:57 +03:00
## Usage
Run `semantic --help` for complete list of up-to-date options.
#### Parse
```
2020-06-11 22:55:28 +03:00
Usage: semantic parse [--sexpression | (--json-symbols|--symbols) |
--proto-symbols | --show | --quiet] [FILES...]
2019-03-21 15:56:57 +03:00
Generate parse trees for path(s)
Available options:
--sexpression Output s-expression parse trees (default)
2020-06-11 22:55:28 +03:00
--json-symbols,--symbols Output JSON symbol list
--proto-symbols Output protobufs symbol list
2019-03-21 15:56:57 +03:00
--show Output using the Show instance (debug only, format
subject to change without notice)
--quiet Don't produce output, but show timing stats
2020-06-11 22:55:28 +03:00
-h,--help Show this help text
2019-03-21 15:56:57 +03:00
```
## Language support
2020-06-11 22:55:28 +03:00
| Language | Parse | AST Symbols† | Stack graphs |
| :------------- | :---: | :---: | :---: |
| Ruby | ✅ | ✅ | |
| JavaScript | ✅ | ✅ | |
| TypeScript | ✅ | ✅ | 🚧 |
| Python | ✅ | ✅ | 🚧 |
| Go | ✅ | ✅ | |
| PHP | ✅ | ✅ | |
| Java | 🚧 | ✅ | |
| JSON | ✅ | ⬜️ | ⬜️ |
| JSX | ✅ | ✅ | |
| TSX | ✅ | ✅ | |
| CodeQL | ✅ | ✅ | |
| Haskell | 🚧 | 🚧 | |
† Used for [code navigation ](https://help.github.com/en/github/managing-files-in-a-repository/navigating-code-on-github ) on github.com.
2019-03-21 15:56:57 +03:00
* ✅ — Supported
* 🔶 — Partial support
* 🚧 — Under development
2020-06-11 22:55:28 +03:00
* ⬜ - N/A ️
2019-03-21 15:56:57 +03:00
## Development
2019-12-13 23:48:49 +03:00
`semantic` requires at least GHC 8.8.1 and Cabal 3.0. We strongly recommend using [`ghcup`][ghcup] to sandbox GHC versions, as GHC packages installed through your OS's package manager may not install statically-linked versions of the GHC boot libraries. `semantic` currently builds only on Unix systems; users of other operating systems may wish to use the [Docker images ](https://github.com/github/semantic/packages/11609 ).
2019-06-17 20:34:36 +03:00
2019-04-03 16:12:49 +03:00
We use `cabal's` [Nix-style local builds][nix] for development. To get started quickly:
```bash
git clone git@github.com:github/semantic.git
cd semantic
2019-06-17 20:23:05 +03:00
script/bootstrap
2019-10-30 15:42:28 +03:00
cabal v2-build
cabal v2-test
cabal v2-run semantic -- --help
2019-04-03 16:12:49 +03:00
```
2020-05-18 04:32:10 +03:00
`stack` as a build tool is not officially supported; there is [unofficial `stack.yaml` support ](https://github.com/jkachmar/semantic-stack-yaml ) available, though we cannot make guarantees as to its stability.
2019-03-21 15:56:57 +03:00
2019-04-03 16:12:49 +03:00
[nix]: https://www.haskell.org/cabal/users-guide/nix-local-build-overview.html
[ghcup]: https://www.haskell.org/ghcup/
2019-03-21 15:56:57 +03:00
## Technology and architecture
Architecturally, `semantic` :
1. Reads blobs.
2019-06-06 15:03:43 +03:00
2. Generates parse trees for those blobs with [tree-sitter][tree-sitter] (an incremental parsing system for programming tools).
2019-03-21 15:56:57 +03:00
3. Assigns those trees into a generalized representation of syntax.
4. Performs analysis, computes diffs, or just returns parse trees.
5. Renders output in one of many supported formats.
Semantic leverages a number of interesting algorithms and techniques:
- Myers' algorithm (SES) as described in the paper [*An O(ND) Difference Algorithm and Its Variations*][SES]
- RWS as described in the paper [*RWS-Diff: Flexible and Efficient Change Detection in Hierarchical Data*][RWS].
- Open unions and [data types à la carte ](http://www.cs.ru.nl/~W.Swierstra/Publications/DataTypesALaCarte.pdf ).
- An implementation of [Abstracting Definitional Interpreters][adi] extended to work with an à la carte representation of syntax terms.
[SES]: http://www.xmailserver.org/diff2.pdf
[RWS]: https://db.in.tum.de/~finis/papers/RWS-Diff.pdf
[adi]: https://plum-umd.github.io/abstracting-definitional-interpreters/
[tree-sitter]: https://github.com/tree-sitter/tree-sitter
2019-03-21 16:01:13 +03:00
## Contributions
Contributions are welcome! Please see our [contribution
guidelines](CONTRIBUTING.md) and our [code of conduct ](CODE_OF_CONDUCT.md ) for
details on how to participate in our community.
## Licensing
Semantic is licensed under the [MIT license ](LICENSE ).