摘要:最后提供一段我用寫的代碼供參考行就能把任意代碼結構轉換成輸出使用了庫利用強大的屬性描述符,寫出通用的轉換代碼,避免了給每個結點類寫對應的轉換代碼幾十種結點類,要死啊。
另載于 http://www.qingjingjie.com/blogs/4
上篇介紹的形形色色的語法元素大概讓人眼花繚亂了,而且每種元素都對應一個Java類。知道是一回事,使用就是另一回事了,這么多個類,要給每個類寫對應的處理代碼,不勝其煩。ASTVisitor雖然能自動遍歷語法樹,但是并不能幫你處理每一種結點。
好在JDT提供了更加抽象的屬性描述符(property descriptor),寥寥幾個類就能掌控所有Java語法。用術語來說,上篇的那些類屬于異構AST,本篇講的是同構AST。
對任何AST結點都可調用方法structuralPropertiesForType(),你會得到List
StructuralPropertyDescriptor 是一個抽象類,有三個子類:SimplePropertyDescriptor, ChildPropertyDescriptor, ChildListPropertyDescriptor。這些東西是元數據,用來描述各種語法元素的固有結構,使用它們有種在用Java反射的感覺。
SimplePropertyDescriptor 表示這個字段存放的不是AST結點,而是個值,可能是int, String,Operator之類的,SimplePropertyDescriptor.valueType 能告訴我們這個值是什么類型。
ChildPropertyDescriptor 表示這個字段存放的是一個AST結點,比如我們解析了一個class,得到typeDeclaration結點,然后調用typeDeclaration.structuralPropertiesForType(),得到的list中有一項就是typeName的描述符,嗯,就是AbstractTypeDeclaration類的typeName字段,字段類型為SimpleName。
ChildListPropertyDescriptor 表示這個字段存放的是一組AST結點! 比如AbstractTypeDeclaration擁有一組bodyDeclarations,而CompilationUnit則擁有一組imports。bodyDeclarations和imports都是List!
有了描述符能做什么呢? 可以自由訪問一棵語法樹了。
我們來想象一個流程:你有一個java文件,你把它交給JDT的parser,解析出一個CompilationUnit cu,也就是一棵語法樹的根結點。調用cu.structuralPropertiesForType(),得到描述符的list,循環遍歷list,對每個描述符prop,用instanceof判斷具體類型(總共就3個類型),分別做"不同處理"。
不同處理:instanceof操作發現某個描述符是ChildListPropertyDescriptor, 于是你把描述符強轉(cast)成該類型,調用prop.getId()得到"imports",哦,是imports字段啊,調用prop.getElementType()得到ImportDeclaration.class,確認了這一發現。然后你調用cu.getStructuralProperty(prop)得到一個object,你知道它實際是List
由此你就完成了一個分析流程。因為不用關心具體的結點類型,所以你可以方便地進行一些宏觀、抽象的分析。
最后提供一段我用Scala寫的代碼供參考(50行就能把任意Java代碼結構轉換成JSON輸出, 使用了lift json庫):
https://github.com/sorra/Lanka/blob/fa52cdaa2f94aadfcc29f8be2711a88da3c8cbb3/src/sorra/lanka/json/MetaConversion.scala
利用強大的屬性描述符,寫出通用的JSON轉換代碼,避免了給每個結點類寫對應的JSON轉換代碼(幾十種結點類,要死啊)。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/64243.html
摘要:可能很多人和我一樣首次聽到前端架構這個詞第一反應是前端還有架構這一說呢在后端開發領域系統規劃和可擴展性非常關鍵因此架構師備受重視早在開發工作啟動之前他們就被邀請加入到項目中而且他們會跟客戶討論即將建成的平臺的架構要求使用還什么技術棧內容類型 可能很多人和我一樣, 首次聽到前端架構這個詞, 第一反應是: 前端還有架構這一說呢? 在后端開發領域, 系統規劃和可擴展性非常關鍵, 因此架構師備...
摘要:可能很多人和我一樣首次聽到前端架構這個詞第一反應是前端還有架構這一說呢在后端開發領域系統規劃和可擴展性非常關鍵因此架構師備受重視早在開發工作啟動之前他們就被邀請加入到項目中而且他們會跟客戶討論即將建成的平臺的架構要求使用還什么技術棧內容類型 可能很多人和我一樣, 首次聽到前端架構這個詞, 第一反應是: 前端還有架構這一說呢? 在后端開發領域, 系統規劃和可擴展性非常關鍵, 因此架構師備...
摘要:可能很多人和我一樣首次聽到前端架構這個詞第一反應是前端還有架構這一說呢在后端開發領域系統規劃和可擴展性非常關鍵因此架構師備受重視早在開發工作啟動之前他們就被邀請加入到項目中而且他們會跟客戶討論即將建成的平臺的架構要求使用還什么技術棧內容類型 可能很多人和我一樣, 首次聽到前端架構這個詞, 第一反應是: 前端還有架構這一說呢? 在后端開發領域, 系統規劃和可擴展性非常關鍵, 因此架構師備...
摘要:選擇器的最后一部分,也就是選擇器的最右邊在這個例子中就是部分部分被稱為關鍵選擇器,它將決定你的選擇器的效率如何是高還是低。因為最右邊的關鍵選擇器是最具體的,也符合上述的選擇器優先級順序。 贊助我以寫出更好的文章 如果您覺得文章對您有幫助,可以逐個點擊以下鏈接,類似于Google ads,不需要您付出任何費用,每天都可以來點一次噢,費用將由廣告商承擔,give me a cup of c...
閱讀 1958·2021-11-16 11:45
閱讀 3668·2021-09-06 15:02
閱讀 2013·2019-08-30 15:44
閱讀 2283·2019-08-30 11:21
閱讀 1845·2019-08-29 16:31
閱讀 3422·2019-08-29 13:55
閱讀 1895·2019-08-29 12:15
閱讀 3251·2019-08-28 18:05