Принцип построения плагина блок-схемы (ActivityDiagram)

UML

Принцип построения плагина блок-схемы (ActivityDiagram)

  1. пси-структура
    • Интерфейс структуры программы, обычно называемый PSI, представляет собой уровень платформы IntelliJ, отвечающий за синтаксический анализ файлов и создание синтаксических и семантических моделей кода, которые поддерживают многие функции платформы.
    • инструмент для структурного анализа psi psiViewer
    • Справочная документация:plugins.jet brains.com/docs/Intel Ling…
  2. дизайн модели
    • структура данных
      • Стек или дерево?
        • куча
          • Преимущества: Удобнее работать с предыдущим элементом, а предыдущий элемент стека используется как родитель следующего элемента стека.
          • Недостатки: Неудобно работать с другими элементами, а временные узлы нельзя связать со ссылками.
        • Дерево
          • Блок-схемы можно естественным образом преобразовать в бинарные деревья.
          • Элементы одного уровня могут напрямую выражать управление родитель-потомок.
    • Дизайн маркера
      • node:@node type="node",name="",note="",adptive=""
        • тип: в настоящее время существует только два типа узла и решения, которые идентифицируют узлы и условия на блок-схеме соответственно.
        • имя: имя узла
        • примечание: Дополнительные примечания для узлов
        • адаптивный: точка расширения, которую можно подключить к саморасширяющемуся классу реализации spi
    • структура данных 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 не отображает предустановленные узлы
      • Контроль глубины стека для предотвращения переполнения стека
        • Для методов и блоков кода, если не добавлен конкретный флаг, рекурсия не будет продолжена.
      • Разбор рекурсивного метода
        • Запишите путь к узлу и рекурсивно запросите тот же узел вверх, чтобы добиться рекурсивного обнаружения.
      • бросить синтаксический анализ
        • Создать конечный узел после распознавания грамматики
  • Операционные процедуры

281620788773_.pic.jpg

291620788835_.pic.jpg

  • Как щелкнуть правой кнопкой мыши, чтобы использовать эффекты демо-код
     //@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=""
    }
     ```
     
    

- PlantUML diagram

  • Советы У компании есть время на разработку, и она не может открыть исходный код, позже я планирую реализовать его снова в соответствии с другими идеями, а затем открыть исходный код, поэтому я не могу предоставить плагины для всех, а только предоставить некоторые идеи реализации.