# chapi **Repository Path**: phodal/chapi ## Basic Information - **Project Name**: chapi - **Description**: Chapi is A common language meta information convertor, convert different languages to same meta-data model - **Primary Language**: Kotlin - **License**: MPL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 5 - **Forks**: 1 - **Created**: 2020-08-29 - **Last Updated**: 2023-02-20 ## Categories & Tags **Categories**: utils **Tags**: None ## README # Chapi [![Java CI](https://github.com/phodal/chapi/workflows/Java%20CI/badge.svg)](https://github.com/phodal/chapi/actions) [![codecov](https://codecov.io/gh/modernizing/chapi/branch/master/graph/badge.svg)](https://codecov.io/gh/modernizing/chapi) [![Maintainability](https://api.codeclimate.com/v1/badges/2af5f5168a9ceb2ebe9b/maintainability)](https://codeclimate.com/github/phodal/chapi/maintainability) ![GitHub release (latest by date)](https://img.shields.io/github/v/release/phodal/chapi) ![Maven Central](https://img.shields.io/maven-central/v/com.phodal.chapi/chapi-domain) > Chapi is a common language data structure parser, which will parse different language to same JSON object. Languages Stages (Welcome to PR your usage languages) | Features/Languages | Java | Python | Go | Kotlin | TypeScript | C | C# | Scala | C++ | |---------------------|------|--------|-----|--------|------------|-----|-----|-------|-----| | syntax parse | ✅ | ✅ | ✅ | 🆕 | ✅ | 🆕 | 🆕 | 🆕 | 🆕 | | function call | ✅ | 🆕 | | | ✅ | | | | | | arch/package | ✅ | | | | | | | | | | real world validate | ✅ | | | | | | | | | | expression (TBD) | | | | | | | | | | Language Family [wiki](https://en.wikipedia.org/wiki/First-class_function) Algol Family [https://wiki.c2.com/?AlgolFamily](https://wiki.c2.com/?AlgolFamily) | | Languages | plan support | |------------|-----------------------------------------------|-------------------------| | C family | C#, Java, Go, C, C++, Objective-C, Rust, ... | C++, C, Java, C#, Rust? | | Functional | Scheme, Lisp, Clojure, Scala, ... | Scala | | Scripting | Lua, PHP, JavaScript, Python, Perl, Ruby, ... | Python, JavaScript | | Other | Fortran, Swift, Matlab, ... | Swift?, Fortran? | ## Chapi-base projects PS: welcome to PR to send your projects - [Chapi-TBS](https://github.com/phodal/chapi-tbs) a simple example with Chapi to Analysis Java project's bad smell. ## Usage 1add to ``dependencies`` ``` dependencies { implementation 'com.phodal.chapi:chapi-application:0.0.7' // or choose languages target implementation 'com.phodal.chapi:chapi-ast-java:0.0.7' implementation 'com.phodal.chapi:chapi-domain:0.0.7' } ``` ### Usage ```kotlin import chapi.domain.core.CodeCall import chapi.domain.core.CodeDataStruct import chapi.app.analyser ... val nodes = ChapiAnalyser().analysisByPath(path.absolutePath) ... ``` ## Examples examples Java source code: ```java package adapters.outbound.persistence.blog; public class BlogPO implements PersistenceObject { @Override public Blog toDomainModel() { } } ``` examples output ```json { "Imports": [], "Implements": [ "PersistenceObject" ], "NodeName": "BlogPO", "Extend": "", "Type": "CLASS", "FilePath": "", "InOutProperties": [], "Functions": [ { "IsConstructor": false, "InnerFunctions": [], "Position": { "StartLine": 6, "StartLinePosition": 133, "StopLine": 8, "StopLinePosition": 145 }, "Package": "", "Name": "toDomainModel", "MultipleReturns": [], "Annotations": [ { "Name": "Override", "KeyValues": [] } ], "Extension": {}, "Override": false, "extensionMap": {}, "Parameters": [], "InnerStructures": [], "ReturnType": "Blog", "Modifiers": [], "FunctionCalls": [] } ], "Annotations": [], "Extension": {}, "Parameters": [], "Fields": [], "MultipleExtend": [], "InnerStructures": [], "Package": "adapters.outbound.persistence.blog", "FunctionCalls": [] } ``` ## Development Syntax Parse Identify Rules: 1. package name 2. import name 3. class / data struct 1. struct name 2. struct parameters 3. function name 4. return types 5. function parameters 4. function 1. function name 2. return types 3. function parameters 5. method call 1. new instance call 2. parameter call 3. field call ### Build Antlr Grammar 1. setup Antlr: `brew install antlr` 2. run compile: `./scripts/compile-antlr.sh` ### Data Structures ``` // for multiple project analysis code_project code_module // for package dependency analysis code_package_info code_dependency // package or file as dependency analysis code_package code_container // class-first or function-first code_data_struct code_function // function or class detail code_annotation code_field code_import code_member code_position code_property // method call information code_call ``` ## Development(Chinese Version) 环境准备:Intellij IDEA、JDK 11+ 1. Clone 代码:``git clone https://github.com/phodal/chapi`` 2. 执行构建:``./gradlew build`` ### 参与开发 为了保证不易出现 bug,项目采用 TDD 的方式进行,即先编写对应的语法测试,然后实现代码。通过尽可能高的测试覆盖率,降低 bug 的出现。 项目主要由 domain + 各种语言的 AST + application 构建: - domain,构建统一的代码模型 - 各语言 AST - application,对外暴露的简易 API 每个 AST 项目的入口是 ``xxAnalyser``,返回的是一个 CodeContainer,即代码容器。在非 C# 语言里,等同于 CodeFile,即代码文件。 CodeContainer 内对应的领域模型如下所示: ``` // class-first or function-first code_data_struct // 类、struct、interface 等 code_function // 函数。如果是头等函数的语言(first-class function”),会用 NodeName = "default" 包在 code_data_struct 模型中 // function or class detail code_annotation // 注解 code_field // 全局变量 code_import // 包依赖 code_member // 保留字段 code_position // 位置信息 code_property // 参数相关 // method call information code_call // 函数调用,如 fmt.Println ``` ### 加入开发 1. 寻找感兴趣的语言 / 添加新的语言 AST 通过 TDD 的方式一点点实现下面的功能(可以考虑按顺序),参照示例见 [JavaFullIdentListenerTest.kt](https://github.com/phodal/chapi/blob/master/chapi-ast-java/src/test/kotlin/chapi/ast/javaast/JavaFullIdentListenerTest.kt): 1. package name 2. import name 3. class / data struct 1. struct name 2. struct parameters 3. function name 4. return types 5. function parameters 4. function 1. function name 2. return types 3. function parameters 5. method call 1. new instance call 2. parameter call 3. field call 4. other calls... ### 提交信息格式 用于发布时,使用标准的 [CHANGELOG.md](CHANGELOG.md) `: `,示例:`feat: init python & go grammars Phodal Huang 2020/2/2, 5:01 PM` 所有的 type 见: - build: 影响构建系统或外部依赖关系的更改(示例范围:gulp,broccoli,npm) - ci: 更改我们的持续集成文件和脚本(示例范围:Travis,Circle,BrowserStack,SauceLabs) - docs: 仅文档更改 - feat: 一个新功能 - fix: 修复错误 - perf: 改进性能的代码更改 - refactor: 代码更改,既不修复错误也不添加功能 - style: 不影响代码含义的变化(空白,格式化,缺少分号等) - test: 添加缺失测试或更正现有测试 Refs --- Goal: source code data model for different language & different language family from [Language support](https://en.wikipedia.org/wiki/First-class_function) License --- [![Phodal's Idea](http://brand.phodal.com/shields/idea-small.svg)](http://ideas.phodal.com/) @ 2020 A [Phodal Huang](https://www.phodal.com)'s [Idea](http://github.com/phodal/ideas). This code is distributed under the MPL license. See `LICENSE` in this directory.