流程圖插件(ActivityDiagram)設計原理

流程圖插件(ActivityDiagram)設計原理

  1. psi結構
    • 程序結構接口(Program Structure Interface),一般稱爲PSI,是IntelliJ平臺中的一個層,負責解析文件並建立支持平臺許多功能的語法和語義代碼模型。
    • psi結構分析工具 psiViewer
    • 參考文檔:plugins.jetbrains.com/docs/intell…
  2. 模型設計
    • 數據結構
      • 棧仍是樹?
          • 優勢:操做上一元素比較方便,上一棧元素做爲下一棧元素的父
          • 缺點: 不方便操做其餘元素,臨時節點沒法關聯引用
          • 流程圖自然能夠轉換爲二叉樹
          • 同級別元素直接能夠表達父子管理
    • 標記設計
      • node:@node type="node",name="",note="",adptive=""
        • type: 目前只有兩種node和decision 分別標識流程圖中的節點和條件
        • 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<>();
      
                      
      複製代碼
    • node類型
      0, "根節點", "用做遞歸的跟節點,初始化uml的start和end",
           1, "普通節點", "方法和代碼塊中標記的node節點,能夠有多個孩子",
           2, "條件節點", "條件代碼,最多有兩個孩子",
           3, "預置節點", "佔位節點",
           4, "空白節點", "空白節點,用做decison中只表達right的時候佔位使用",
           5, "結束節點", "支持節點的結束";
      複製代碼
    • psiTree轉化爲二叉樹
      • psiTree爲多子樹,關鍵節點層級關係深度很深
      • 採用遞歸的方法,過濾掉不感知的節點,同一層節點綁定一個父節點,若是當層未建立節點則繼承祖父節點
    • 難點
      • 方法重載的解析
        Query<PsiMethod> search = OverridingMethodsSearch.search(psiMethod);
        複製代碼
      • 支持if表達式的註釋在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"
        }
        複製代碼
      • 多層if嵌套解析
        //@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
        
        }
        複製代碼
      • return 語法解析
        • 採用預置節點的方式,先生產空白節點遞歸到內部實現的時候預先放置到會調用的節點
        • 回棧到當前節點以後才關聯空白節點的孩子
        • uml不展現預置節點
      • 棧深度控制,防止棧溢出
        • 對於方法和if代碼塊,若是沒有加特定標識則再也不繼續往下遞歸
      • 遞歸方法解析
        • 記錄節點路徑,向上遞歸查詢相同節點來實現遞歸檢測
      • throw語法解析
        • 識別語法以後建立結束節點
  • 操做流程

281620788773_.pic.jpg

291620788835_.pic.jpg

  • 方法右鍵單擊使用效果 demo代碼
    //@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 diagramhtml

  • tips 公司時間開發,沒法開源源碼,後期準備本身按照其餘思路再實現一遍而後開源,因此提供不了插件供你們使用,僅僅提供一下實現思路。
相關文章
相關標籤/搜索