1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/phodal-chapi

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

Чапи

Чапи — это анализатор структуры данных общего языка, который будет анализировать различные языки для получения одного и того же объекта JSON.

Стадии языков (добро пожаловать в PR для использования ваших языков)

Функции/Языки Java Python Go Kotlin TypeScript C C# Scala C++
Синтаксический анализ 🆕 🆕 🆕 🆕 🆕
Вызов функции 🆕
Архитектура/пакет
Проверка реального мира
Выражение (TBD)

Семейство языков wiki

Семейство Алгол https://wiki.c2.com/?AlgolFamily

Языки Планируемая поддержка
Семейство C C#, Java, Go, C, C++, Objective-C, Rust и т. д. C++, C, Java, C#, Rust?
Функциональные Scheme, Lisp, Clojure, Scala и т.д. Scala
Скриптовые Lua, PHP, JavaScript, Python, Perl, Ruby и т. д. Python, JavaScript
Другие Fortran, Swift, Matlab и т. д. Swift?, Fortran?

Чапи-базовые проекты

PS: добро пожаловать в PR, чтобы отправить свои проекты.

  • Чапи-ТБС — простой пример с Чапи для анализа неприятных запахов проекта на Java.

Использование

  1. Добавьте в «зависимости»:
dependencies {
    implementation 'com.phodal.chapi:chapi-application:0.0.7'

    // или выберите целевой язык
    implementation 'com.phodal.chapi:chapi-ast-java:0.0.7'
    implementation 'com.phodal.chapi:chapi-domain:0.0.7'
}

Использование

import chapi.domain.core.CodeCall
import chapi.domain.core.CodeDataStruct
import chapi.app.analyser

...
val nodes = ChapiAnalyser().analysisByPath(path.absolutePath)
...

Примеры

Примеры исходного кода на Java:

package adapters.outbound.persistence.blog;

public class BlogPO implements PersistenceObject<Blog> {
    @Override
    public Blog toDomainModel() {

    }
}

Примеры вывода:

{
    "Imports": [],
    "Implements": [
        "PersistenceObject<Blog>"
    ],
    "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": []
}
``` **Развитие**

Правила синтаксического анализа:
1. имя пакета;
2. имя импорта;
3. класс или структура данных:
    * имя структуры;
    * параметры структуры;
    * имя функции;
    * типы возврата;
    * параметры функции;
4. функция:
    * имя функции;
    * типы возврата;
    * параметры функции;
5. вызов метода:
    * вызов нового экземпляра;
    * вызов параметра;
    * вызов поля.

### Построение грамматики Antlr

1. настройка Antlr: `brew install antlr`;
2. запуск компиляции: `./scripts/compile-antlr.sh`.

### Структуры данных

// для анализа нескольких проектов code_project code_module

// для анализа зависимостей пакетов code_package_info code_dependency

// пакет или файл как анализ зависимостей code_package code_container

// класс-первый или функция-первый code_data_struct code_function

// детали функции или класса code_annotation code_field code_import code_member code_position code_property

// информация о вызове метода code_call


**Развитие (китайская версия)**

Подготовка среды: Intellij IDEA, JDK 11+.

1. Клонировать код: `git clone https://github.com/phodal/chapi`.

2. Выполнить сборку: `./gradlew build`.

### Участие в разработке

Чтобы гарантировать, что ошибки не возникнут, проект использует подход TDD, то есть сначала пишется соответствующий синтаксический тест, а затем реализуется код. Благодаря максимально возможному покрытию тестами снижается вероятность возникновения ошибок.

Проект в основном состоит из домена + AST различных языков + приложения:

— домен, построение унифицированной модели кода;
— AST различных языков;
— приложение, предоставляющее простой API для внешнего использования.

Входом каждого проекта AST является `xxAnalyser`, который возвращает CodeContainer, то есть контейнер кода. В языках, отличных от C#, это эквивалентно CodeFile, то есть файлу кода.

Соответствующая модель предметной области в CodeContainer выглядит следующим образом:

// class-first или function-first code_data_struct // класс, struct, интерфейс и т. д. code_function // функция. Если это язык с функциями первого класса («first-class function»), он будет использовать NodeName = «default» и будет упакован в модель code_data_struct.

// function или 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. имя пакета;
2. имя импорта;
3. класс / структура данных:
   * имя структуры;
   * параметры структуры;
   * имя функции;
   * типы возврата;
   * параметры функции;
4. функция:
   * имя функции;
   * типы возврата;
   * параметры функции;
5. вызов метода:
   * вызов нового экземпляра;
   * вызов параметра;
   * вызов поля;
   * другие вызовы...

### Формат сообщения о фиксации

Для публикации используется стандартный CHANGELOG.md:

`<type>: <message>`, например: `feat: <grammars> init python & go grammars Phodal Huang 2020/2/2, 5:01 PM`.

Все типы:

* build: изменения, влияющие на систему сборки или внешние зависимости (пример диапазона: gulp, broccoli, npm);
* ci: изменения в наших файлах и сценариях непрерывной интеграции (пример диапазона: Travis, Circle, BrowserStack, SauceLabs);
* docs: только изменения документации;
* feat: новая функция;
* fix: исправление ошибки;
* perf: улучшение производительности кода;
* refactor: изменение кода, которое не исправляет ошибку и не добавляет функцию;
* style: изменения, которые не влияют на значение кода (пробел, форматирование, отсутствие точки с запятой и т.д.);
* test: добавление отсутствующего теста или исправление существующего теста.

Refs
---

Цель: модель данных исходного кода для разных языков и разных языковых семейств из [Language support](https://en.wikipedia.org/wiki/First-class_function).

Лицензия
---

[![Phodal's Idea](http://brand.phodal.com/shields/idea-small.svg)](http://ideas.phodal.com/)

@ 2020 Идея [Phodal Huang](https://www.phodal.com). Этот код распространяется под лицензией MPL. См. `LICENSE` в этом каталоге.

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

Чапи — это конвертер метаинформации общего языка, который преобразует различные языки в одну и ту же модель метаданных. Развернуть Свернуть
MPL-2.0
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/phodal-chapi.git
git@api.gitlife.ru:oschina-mirror/phodal-chapi.git
oschina-mirror
phodal-chapi
phodal-chapi
master