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