https://github.com/williamfzc/sibyl
static code analyzer for multi languages based on antlr4
https://github.com/williamfzc/sibyl
antlr4 java static-code-analyzer
Last synced: 12 months ago
JSON representation
static code analyzer for multi languages based on antlr4
- Host: GitHub
- URL: https://github.com/williamfzc/sibyl
- Owner: williamfzc
- License: apache-2.0
- Created: 2021-12-03T06:30:28.000Z (over 4 years ago)
- Default Branch: main
- Last Pushed: 2022-09-24T08:18:50.000Z (over 3 years ago)
- Last Synced: 2025-02-09T23:28:19.885Z (about 1 year ago)
- Topics: antlr4, java, static-code-analyzer
- Language: Java
- Homepage:
- Size: 584 KB
- Stars: 1
- Watchers: 3
- Forks: 0
- Open Issues: 7
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# sibyl
> 基于antlr4的静态代码分析库
## status
[](https://github.com/williamfzc/sibyl/actions/workflows/normal.yml)
[](https://github.com/williamfzc/sibyl/actions/workflows/perf.yml)
[](https://jitpack.io/#williamfzc/sibyl)
## usage
用于快速为代码仓库生成逻辑快照,作为底层工具支持上层的建设开展。诸如智能diff分析、代码生成等。
### api
#### snapshot
```java
File src = new File("YOUR_PROJECT_PATH");
Snapshot snapshot = Sibyl.genSnapshotFromDir(src, SibylLangType.JAVA_8);
// get a method set
snapshot.exportFile("your_file.json");
```
```json
[{
"info": {
"name": "exitUnaryExpressionNotPlusMinus",
"params": null,
"returnType": "void"
},
"belongsTo": {
"clazz": {
"name": "Java8BaseListener",
"superName": null,
"interfaces": ["Java8Listener"],
"belongsTo": {
"pkg": {
"name": "com.williamfzc.sibyl.core.listener"
},
"file": {
"name": "sibyl-core/target/generated-sources/antlr4/com/williamfzc/sibyl/core/listener/Java8BaseListener.java",
"startLine": 13,
"endLine": 2883
}
},
"fullName": "com.williamfzc.sibyl.core.listener.Java8BaseListener"
},
"file": {
"name": "sibyl-core/target/generated-sources/antlr4/com/williamfzc/sibyl/core/listener/Java8BaseListener.java",
"startLine": 2785,
"endLine": 2785
}
},
"lineCount": 1,
"lineRange": [2785]
}, {
...
}
```
支持多种语言:
- java(完成
- kotlin(初步可用
- golang(进行中
- ...
#### further ...
也提供了大量的API支持,当前优先支持java:
- All the methods you need can be found in [Sibyl.java](https://github.com/williamfzc/sibyl/blob/main/sibyl-core/src/main/java/com/williamfzc/sibyl/core/api/Sibyl.java).
- About how to use them: [TestAPI.java](https://github.com/williamfzc/sibyl/blob/main/sibyl-core/src/test/java/com/williamfzc/sibyl/core/TestAPI.java).
#### maven
```xml
jitpack.io
https://jitpack.io
```
dep:
[](https://jitpack.io/#williamfzc/sibyl)
```xml
com.github.williamfzc
sibyl
USE_BADGE_VERSION_ABOVE
```
## 声明
### 2022-09-24
随着试用范围的扩大,这个项目暴露出不少设计缺陷。在此说明。
#### 性能(antlr4)
- 基于 java,在性能上比起 tree-sitter 之类的纯c库首先输一阵;
- 默认情况下使用全量的语言解析规则(which means 无论你需要与否,所有的规则都会走到),在一些简单场景下这部分性能是浪费的;
- 不支持增量分析(不是非常重要但
尽管针对java做了优化,但目前遇到大型java文件的时候依旧会轻易把机器CPU拉满。
另,antlr4十分优秀,但各类分析引擎之间其实定位并不完全一致,需要思考清楚。
#### 数据结构设计(sibyl)
暴露了我自己对编程语言的理解有限,轻率设计了第一版的snapshot树状结构+递归式的listener。树状结构非常不合理。
java方法是树状嵌套在class内的,但许多语言并不是,例如go。如此做,在迁移至其他语言时采集逻辑几乎无法复用。
应参考:
- AST层:https://github.com/github/semantic/blob/main/docs/examples.md#symbols
- 基于AST层做快照层
## licence
[Apache License 2.0](LICENSE)