Skip to content
This repository was archived by the owner on Apr 1, 2025. It is now read-only.
/ semantic Public archive

Parsing, analyzing, and comparing source code across many languages

Notifications You must be signed in to change notification settings

github/semantic

Folders and files

NameName
Last commit message
Last commit date

Latest commit

d1d07eb Β· Apr 1, 2025
Mar 13, 2024
Sep 24, 2019
Feb 2, 2016
Feb 7, 2022
May 13, 2024
Feb 21, 2019
Jul 1, 2020
Apr 14, 2022
Mar 25, 2024
Mar 20, 2024
Mar 20, 2024
Mar 20, 2024
Mar 20, 2024
Mar 20, 2024
Jul 15, 2022
Mar 20, 2024
Apr 13, 2022
Mar 20, 2024
Mar 20, 2024
Mar 20, 2024
Jul 15, 2022
Mar 4, 2024
Jul 15, 2022
Mar 20, 2024
Mar 20, 2024
Mar 20, 2024
Feb 8, 2022
Jul 9, 2020
Oct 30, 2019
Jul 14, 2020
Dec 20, 2019
Jun 20, 2019
Jun 27, 2020
Mar 4, 2020
Jun 10, 2020
Feb 17, 2017
Dec 19, 2019
Jul 1, 2020
Oct 5, 2020
May 31, 2019
Oct 30, 2019
Jun 2, 2020
Jan 31, 2020
Apr 1, 2025
Aug 19, 2021
Jul 14, 2022
Jul 14, 2022
Apr 14, 2022
Aug 19, 2021
Aug 19, 2021

Repository files navigation

NOTE: This repository is no longer supported or updated by GitHub. If you wish to continue to develop this code yourself, we recommend you fork it.

Semantic

semantic is a Haskell library and command line tool for parsing, analyzing, and comparing source code.

In a hurry? Check out our documentation of example uses for the semantic command line tool.

Table of Contents
Usage
Language support
Development
Technology and architecture
Licensing

Usage

Run semantic --help for complete list of up-to-date options.

Parse

Usage: semantic parse [--sexpression | (--json-symbols|--symbols) |
                        --proto-symbols | --show | --quiet] [FILES...]
  Generate parse trees for path(s)

Available options:
  --sexpression            Output s-expression parse trees (default)
  --json-symbols,--symbols Output JSON symbol list
  --proto-symbols          Output protobufs symbol list
  --show                   Output using the Show instance (debug only, format
                           subject to change without notice)
  --quiet                  Don't produce output, but show timing stats
  -h,--help                Show this help text

Language support

Language Parse AST Symbols† Stack graphs
Ruby βœ… βœ…
JavaScript βœ… βœ…
TypeScript βœ… βœ… 🚧
Python βœ… βœ… 🚧
Go βœ… βœ…
PHP βœ… βœ…
Java 🚧 βœ…
JSON βœ… ⬜️ ⬜️
JSX βœ… βœ…
TSX βœ… βœ…
CodeQL βœ… βœ…
Haskell 🚧 🚧

† Used for code navigation on github.com.

  • βœ… β€” Supported
  • πŸ”Ά β€” Partial support
  • 🚧 β€” Under development
  • ⬜ - N/A ️

Development

semantic requires at least GHC 8.10.1 and Cabal 3.0. We strongly recommend using 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.

We use cabal's Nix-style local builds for development. To get started quickly:

git clone git@github.com:github/semantic.git
cd semantic
script/bootstrap
cabal v2-build all
cabal v2-run semantic:test
cabal v2-run semantic:semantic -- --help

You can also use the Bazel build system for development. To learn more about Bazel and why it might give you a better development experience, check the build documentation.

git clone git@github.com:github/semantic.git
cd semantic
script/bootstrap-bazel
bazel build //...

stack as a build tool is not officially supported; there is unofficial stack.yaml support available, though we cannot make guarantees as to its stability.

Technology and architecture

Architecturally, semantic:

  1. Generates per-language Haskell syntax types based on tree-sitter grammar definitions.
  2. Reads blobs from a filesystem or provided via a protocol buffer request.
  3. Returns blobs or performs analysis.
  4. Renders output in one of many supported formats.

Throughout its lifecycle, semantic has leveraged a number of interesting algorithms and techniques, including:

Contributions

Contributions are welcome! Please see our contribution guidelines and our code of conduct for details on how to participate in our community.

Licensing

Semantic is licensed under the MIT license.