开发学院软件开发Java 构建基于 CDT 的编辑器,第 5 部分: 将 PDOM 用于... 阅读

构建基于 CDT 的编辑器,第 5 部分: 将 PDOM 用于代码完成

 2009-12-19 00:00:00 来源:WEB开发网 闂傚倸鍊搁崐鎼佸磹妞嬪孩顐芥慨姗嗗厳缂傛氨鎲稿鍫罕闂備礁婀遍搹搴ㄥ窗閺嶎偆涓嶆い鏍仦閻撱儵鏌i弴鐐测偓鍦偓姘炬嫹闂傚倸鍊搁崐鎼佸磹妞嬪海鐭嗗〒姘e亾妤犵偛顦甸弫鎾绘偐閹绘帞鈧參姊哄Ч鍥х仼闁诲繑鑹鹃悾鐑藉蓟閵夛妇鍘甸梺瑙勵問閸犳牠銆傛總鍛婄厱閹艰揪绱曟牎闂侀潧娲ょ€氫即鐛幒妤€绠f繝闈涘暙娴滈箖鏌i姀鈶跺湱澹曟繝姘厵闁绘劦鍓氶悘杈ㄤ繆閹绘帞澧涚紒缁樼洴瀹曞崬螖閸愬啠鍓濈换娑樼暆婵犱胶鏁栫紓浣介哺閹瑰洤鐣烽幒鎴僵闁瑰吀鐒﹂悗鎼佹⒒娴g儤鍤€闁搞倖鐗犻獮蹇涙晸閿燂拷濠电姷鏁告慨鐑藉极閸涘﹥鍙忔い鎾卞灩缁狀垶鏌涢幇闈涙灈鐎瑰憡绻冮妵鍕箻鐎靛摜鐣奸梺纭咁潐濞茬喎顫忕紒妯肩懝闁逞屽墮宀h儻顦查悡銈夋煏閸繃鍋繛宸簻鎯熼梺瀹犳〃閼冲爼宕濋敃鈧—鍐Χ閸℃鐟愰梺鐓庡暱閻栧ジ宕烘繝鍥у嵆闁靛骏绱曢崢顏堟⒑閹肩偛鍔楅柡鍛⊕缁傛帟顦寸紒杈ㄥ笚濞煎繘鍩℃担閿嬵潟闂備浇妗ㄩ悞锕傚箲閸ヮ剙鏋侀柟鍓х帛閺呮悂鏌ㄩ悤鍌涘闂傚倸鍊搁崐鎼佸磹妞嬪孩顐芥慨姗嗗厳缂傛氨鎲稿鍫罕闂備礁婀遍搹搴ㄥ窗閺嶎偆涓嶆い鏍仦閻撱儵鏌i弴鐐测偓鍦偓姘炬嫹  闂傚倸鍊搁崐鎼佸磹閻戣姤鍤勯柤鍝ユ暩娴犳氨绱撻崒娆掑厡缂侇噮鍨堕妴鍐川閺夋垹鍘洪悗骞垮劚椤︻垶宕¢幎鑺ョ厪闊洦娲栨牎闂佽瀵掗崜鐔奉潖閾忓湱纾兼俊顖氭惈椤矂姊虹拠鑼婵ǜ鍔戦崺鈧い鎺嶇閸ゎ剟鏌涢幘璺烘瀻妞ゎ偄绻愮叅妞ゅ繐瀚悗顓烆渻閵堝棙绀€闁瑰啿閰e畷婊勫鐎涙ǚ鎷洪梻渚囧亞閸嬫盯鎳熼娑欐珷妞ゆ柨澧界壕鐓庮熆鐠虹尨鍔熺紒澶庢閳ь剚顔栭崰鏍€﹂柨瀣╃箚婵繂鐭堝Σ鐑芥⒑缁嬫鍎愰柟鐟版搐铻為柛鎰╁妷濡插牊绻涢崱妤冪婵炲牊锕㈠缁樻媴妞嬪簼瑕嗙紓鍌氱М閸嬫挻绻涚€涙ḿ鐭ら柛鎾跺枛瀹曟椽鍩€椤掍降浜滈柟鐑樺灥閳ь剙缍婂鎶筋敆閸曨剛鍘遍柣搴秵娴滅兘鐓鍌楀亾鐟欏嫭纾婚柛妤€鍟块锝夊磹閻曚焦鞋闂備礁鎼Λ瀵哥不閹捐钃熼柕濞炬櫆閸嬪棝鏌涚仦鍓р槈妞ゅ骏鎷�
核心提示: 查找 ASTCompletionNode 要提出这些建议,光知道刚输入了哪些字符是不够的,构建基于 CDT 的编辑器,第 5 部分: 将 PDOM 用于代码完成(3),CCompletionProcessor2 需要确定这段文本适合总体代码结构的哪部分,具体地说,默认情况下,CDT 提供五种这样

查找 ASTCompletionNode

要提出这些建议,光知道刚输入了哪些字符是不够的。CCompletionProcessor2 需要确定这段文本适合总体代码结构的哪部分。具体地说,它需要找到文本相应的 AST 节点,即补全节点 。有了补全节点,它就能够收集额外信息,如节点的范围和绑定。

为获取此节点,处理器确定当前 WorkingCopy 的 ILanguage 并调用 ILanguage.getCompletionNode()。这和索引器通过调用 ILanguage.getASTTranslationUnit() 开始解析过程类似。事实上,这两个方法都让 ILanguage 的解析器重新解析文档。

但首先,处理器让 DOMScanner 在其达到代码完成点时停止扫描。在重新解析过程中,扫描器一探测到标识符就检查这个偏移量。当达到代码完成点时,扫描器将该标识符作为 IToken.tCOMPLETION 这类标记的一部分返回并停止扫描。

在 第 4 部分 中,介绍了新解析器如何为节点中的标识符创建 IASTName。每次创建 IASTName 时,解析器也会检查当前标记是否是 IToken.tCOMPLETION 类型。如果是,它会创建一个 ASTCompletionNode。与给定补全节点相关联的 IASTName 也许有多个。

生成代码完成建议

有了补全节点之后,CCompletionProcessor2 就会创建一个空的 ArrayList 来包含 CCompletionProposal。然后,它会查找能够填充这个列表的类。具体地说,它为 CDT 扩展点 org.eclipse.cdt.ui.completionContributors 查找扩展。

根据该模式,扩展必需具备一个 <contributor> 元素,该元素包含所需的 <class> 和一个可选的 <id> 和 <priority>。默认情况下,CDT 提供五种这样的扩展,如清单 1 所示。


清单 1. 默认的代码完成扩展

<extension point="org.eclipse.cdt.ui.completionContributors"> 
  <contributor 
   class="org.eclipse.cdt.internal.ui.text.contentassist.DOMCompletionContributor" 
   id="DOM" 
   priority="1"/> 
  <contributor 
   class="org.eclipse.cdt.internal.ui.text.template.TemplateEngine" 
   id="CodeTemplates" 
   priority="2"/> 
  <contributor 
   class="org.eclipse.cdt.internal.ui.text.contentassist.PDOMCompletionContributor" 
   id="PDOM" 
   priority="3"/> 
  <contributor 
   class="org.eclipse.cdt.internal.ui.text.contentassist.KeywordCompletionContributor" 
   id="Keywords" 
   priority="10"/> 
  <contributor 
   class="org.eclipse.cdt.internal.ui.text.contentassist.HelpCompletionContributor" 
   id="Help" 
   priority="99"/> 
</extension> 

上一页  1 2 3 4 5 6 7  下一页

Tags:构建 基于 CDT

编辑录入:爽爽 [复制链接] [打 印]
[]
  • 好
  • 好的评价 如果觉得好,就请您
      0%(0)
  • 差
  • 差的评价 如果觉得差,就请您
      0%(0)
赞助商链接