ABAP开发环境语法高亮的那些事儿
關于SAP ABAP開發環境,Jerry之前寫過幾篇公眾號文章:
- 那些年我用過的SAP IDE
- 不喜歡SAP GUI?那試試用Eclipse進行ABAP開發吧
- 使用Visual Studio Code編寫和激活ABAP代碼
本文從另一個角度出發,單獨聊聊ABAP開發環境里的語法高亮話題。
俗話說,佛靠金裝,人靠衣裝。咱們程序員雖然平日上班都穿千篇一律的職業裝:
程序員專用的格子傘:
Jerry衣柜里最不缺這種衣服:
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-wqdWWCGr-1574928873302)(https://user-images.githubusercontent.com/5669954/69788724-103ab300-11fa-11ea-84d2-59dc3f64de8e.png)]
但幸好我們的開發環境還是能夠進行各種個性化設置,所以雖然大家都穿著一樣的格子衫,但面對的卻是色彩各異的開發環境。比如SAPGUI的Options選項,給ABAP開發人員提供了種類豐富的ABAP編輯器UI元素風格的自定義設置,諸如背景色,關鍵字高亮顏色,注釋高亮顏色,斷點高亮顏色等等。
我們點了Save按鈕后,這些個性化設置保存在本地某處。那么以ABAP編輯器為例,當我們用它來編寫代碼時,ABAP語言里的語法元素是如何根據不同的類型,進行對應的顏色高亮顯示呢?
在SAPGUI設置選項里,進入Traces->Session Traces, 點擊Enable按鈕打開ABAP Editor的trace開關,回到ABAP編輯器,隨便做一些操作,比如加一段注釋,幾個空格,激活代碼之類。
然后打開生成的trace文件:
C:\Users<user name>\AppData\Local\SAP\SAP GUI\Traces\sapfewdll_01_0001_00_4272_2800.trc
能看到大段大段的CStyleCache::OnLinesChanged和CAbapFgLexer::InternalLexer這種C++里類的方法調用。
- 189行:InvalidateLineStyle - 準備重繪ABAP代碼第43883行的語法高亮
- 190~191行:FindBeginOfStatement + FindEndOfStatement:找到這一行ABAP語句的起始和結束位置。
- 193行:synchronous syntactical analysis started - 開始同步模式的語法分析
- 195行:調用C++實現的編譯器方法m_parser->run, 來完成ABAP語句的語法解析,總共花了89微秒。
- 196行:分析結束。
- 197行:根據編譯器的分析結果,調用ISyncStyleCache::SetStylesSync進行對應元素的語法高亮顯示。
從trace文件不難看出,這個ABAP語句語法分析和語法高亮渲染的同步過程會逐行處理語句,大家平時幾乎感覺不到任何時延,是因為編輯的ABAP代碼行數較少。
當Jerry在本地編輯ABAP git這個開源項目時,因為report源代碼有將近五萬行,所以當修改完代碼激活之后,會感覺到長達好幾秒鐘的時延,在這幾秒鐘內,SAPGUI里的C++實現的編譯器在忙碌地進行ABAP語句解析和語法高亮的工作。 在這些工作未完成之間,ABAP編輯器里將不會有語法高亮效果顯示:?
如果不考慮cache的情況,在Jerry手上用的Thinkpad P50電腦上,假設按每行解析花費89微秒來計算,ABAP Git的語法高亮大概會消耗4秒鐘的時間。
說完了SAPGUI,再來看看其他ABAP開發環境。雖然SAP WebIDE還不能做ABAP開發,但是在S/4HANA里,我們也能在瀏覽器里用ABAP編寫Custom Logic了,并且支持語法高亮。
你也許會問,ABAP的語法高亮是如何在瀏覽器里顯示的?自己動手,豐衣足食。
下面跟Jerry一起來通過調試的方式,自己找到問題的答案。
(1) 在瀏覽器里敲個ABAP的關鍵字,比如data。發現被高亮顯示了。通過Chrome開發工具發現高亮是通過一個叫ace_keyword的css類實現的。
在Chrome開發工具里以關鍵字".ace_keyword"搜索: 發現這個css類是硬編碼在theme-sap-cumulus.js里的。
(2) 現在需要找到瀏覽器里進行ABAP代碼編輯的編輯器的實現。在Chrome開發工具里Network tab里輸入“.xml”作為過濾條件,于是找到編輯器的Fiori實現: Editor.view.xml
具體的編輯器是實現在命名空間reuse的ABAPWrapper標簽里。
根據這個命名空間找到實現ABAP編輯器的UI5應用,如下圖: nw_aps_ext_lib.
打開ABAPWrapper-dbg.js, 在第68行設置斷點。這個函數負責從ABAP后臺取PAD文件,該文件和語法高亮有關。
刷新ABAP編輯器頁面,斷點觸發,在調試器里觀察PAD文件的內容:
所有的ABAP關鍵字都列在該PAD文件里,這樣UI5就知道編輯器里哪些字符串應該做高亮顯示。
(3) 最后一個問題就是,比如當我敲了一個ABAP關鍵字"new"之后,UI5應用具體哪行代碼將對應的css類加到這個字符串對應的DOM節點上?
如下圖,一旦我敲了一個字符w之后,字符串new作為一個關鍵字需要被高亮:
具體邏輯如下圖:一旦敲入字符"w"后,onInput作為事件處理函數觸發:
函數$renderLine負責生成對應的HTML源代碼。輸入字符"new"被傳入函數getLineTokens來計算該字符串是關鍵字還是普通變量。
在文件AceRndTokenizer.js里, ABAP解析器按照我們期望的將“new”解析成關鍵字,因為解析器擁有PAD文件的引用,因此它知道哪些字符串是關鍵字,哪些是普通變量。
(4) DOM節點的源代碼在此處生成,"ace"和“keyword"做連接操作,生成最后我們在Chrome開發工具里看到的完整css類ace_keyword.
謎底就這樣揭曉了。
至于其他工具,比如Visual Studio Code,Sublime Text之類,嚴格意義上講不能算作ABAP的開發環境,只能看成是ABAP代碼的查看工具,其ABAP語法高亮的實現,咱們下次再聊,感謝閱讀。
要獲取更多Jerry的原創文章,請關注公眾號"汪子熙":
總結
以上是生活随笔為你收集整理的ABAP开发环境语法高亮的那些事儿的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安装配置 | 用同济邮箱账户下载matl
- 下一篇: 当ABAP遇见普罗米修斯