日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ABAP开发环境语法高亮的那些事儿

發布時間:2023/12/19 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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开发环境语法高亮的那些事儿的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。