Принцип построения плагина блок-схемы (ActivityDiagram)
- пси-структура
- Интерфейс структуры программы, обычно называемый PSI, представляет собой уровень платформы IntelliJ, отвечающий за синтаксический анализ файлов и создание синтаксических и семантических моделей кода, которые поддерживают многие функции платформы.
- инструмент для структурного анализа psi psiViewer
- Справочная документация:plugins.jet brains.com/docs/Intel Ling…
- дизайн модели
- структура данных
- Стек или дерево?
- куча
- Преимущества: Удобнее работать с предыдущим элементом, а предыдущий элемент стека используется как родитель следующего элемента стека.
- Недостатки: Неудобно работать с другими элементами, а временные узлы нельзя связать со ссылками.
- Дерево
- Блок-схемы можно естественным образом преобразовать в бинарные деревья.
- Элементы одного уровня могут напрямую выражать управление родитель-потомок.
- куча
- Стек или дерево?
- Дизайн маркера
- node:@node type="node",name="",note="",adptive=""
- тип: в настоящее время существует только два типа узла и решения, которые идентифицируют узлы и условия на блок-схеме соответственно.
- имя: имя узла
- примечание: Дополнительные примечания для узлов
- адаптивный: точка расширения, которую можно подключить к саморасширяющемуся классу реализации spi
- node:@node type="node",name="",note="",adptive=""
- структура данных Java
int type;//type=1 普通节点,可有多个子节点 type = 2 条件节点 只有两个子节点 type=3 预置节点 String name;//方法中文注释 String methodName;//方法英文名 String argsType; String note;//方法注释 String adptive; Node parent; List<Node> child = new ArrayList<>();
- тип узла
0, "根节点", "用作递归的跟节点,初始化uml的start和end", 1, "普通节点", "方法和代码块中标记的node节点,可以有多个孩子", 2, "条件节点", "条件代码,最多有两个孩子", 3, "预置节点", "占位节点", 4, "空白节点", "空白节点,用作decison中只表达right的时候占位使用", 5, "结束节点", "支持节点的结束";
- Преобразование psiTree в двоичное дерево
- psiTree — мультиподдерево, и иерархия ключевых узлов очень глубокая
- Рекурсивный метод используется для фильтрации незаметных узлов.Узлы одного слоя привязываются к родительскому узлу.Если узел не создается на текущем слое, наследуется узел-прародитель.
- трудность
- Разрешение перегрузки метода
Query<PsiMethod> search = OverridingMethodsSearch.search(psiMethod);
- Поддерживает синтаксический анализ комментариев if-expression над if и после круглых скобок.
//@node type="decision",name="条件X",note="" if(true){ //@node type="node",name="G" } if(true)//@node type="decision",name="条件X",note="" { //@node type="node",name="G" }
- Многоуровневый при вложенном разборе
//@node type="decision",name="条件B",note="" if(true) { //@node type="decision",name="条件C",note="" if(true) { //@node type="node",name="G" return null; }else if(true) //@node type="decision",name="条件D",note="" { //@node type="node",name= H }else { //@node type="node",name= I } //@node type="node",name= M }
- синтаксический анализ возврата
- Используя метод предустановленных узлов, сначала создайте пустые узлы и заранее поместите их в узлы, которые будут вызываться при рекурсии к внутренней реализации.
- Дочерний элемент пустого узла связан со стеком обратно к текущему узлу.
- uml не отображает предустановленные узлы
- Контроль глубины стека для предотвращения переполнения стека
- Для методов и блоков кода, если не добавлен конкретный флаг, рекурсия не будет продолжена.
- Разбор рекурсивного метода
- Запишите путь к узлу и рекурсивно запросите тот же узел вверх, чтобы добиться рекурсивного обнаружения.
- бросить синтаксический анализ
- Создать конечный узел после распознавания грамматики
- Разрешение перегрузки метода
- структура данных
- Операционные процедуры
- Как щелкнуть правой кнопкой мыши, чтобы использовать эффекты
демо-код
//@node type="node",name="T1",note="" public Boolean test1(){ //@node type="node",name="NA",note="" //@node type="decision",name="DA",note="" if(true){ //@node type="node",name="NB",note="" }else if(true)//@node type="decision",name="DB",note="" { //@node type="node",name="NC",note="" return false; } //@node type="node",name="ND",note="" } ```
- Советы У компании есть время на разработку, и она не может открыть исходный код, позже я планирую реализовать его снова в соответствии с другими идеями, а затем открыть исходный код, поэтому я не могу предоставить плагины для всех, а только предоставить некоторые идеи реализации.