從硬碟里翻出來2010年寫的帶IntelliSense編輯器

記得很多年前也想做一個跟LLVM差不多的項目,就是這一次嘗試讓我意識到了,一個人的力量是有限的,這種東西一個人要寫到80歲。於是寫GacUI的時候才能那麼淡定(逃。但是這並沒有讓我浪費時間,因為後來我還是完成了一次IntelliSense的嘗試,處理一個內核是C的語言,但是我給他加上了type class,於是變成了一個怪胎。

這裡的做法跟前幾天Channel 9上面看到 Anders講Roslyn如何支持VS編輯器的視頻 (感謝@RednaxelaFX 去翻,這個視頻讓我學到了helicopter還能活用為那種意義的動詞),核心方法是完全一致的。大概的意思就是說,整個東西是跑在後台的,但是你前台需要智能地識別出,到底要如何取一小塊正在編輯的代碼,才可以在UI線程里局部地更新語法樹,然後用(有1%可能是錯誤的)之前留下來的語義分析的結果來立刻彈出IntelliSense的內容。同時後台也在運行,全文分析完之後,如果你的字還沒打完,然後發現了列表的內容很不幸處於1%的錯誤的時候,就立刻更新列表。整個編輯的過程非常流暢。

當時還實現了滑鼠指名字把聲明彈成Tooltip,函數調用彈Tooltip,還實現了Visual Studio裡面按「For[TAB]」之後出現的模板式代碼編輯。

每次我都在想,為什麼需要一些高級技巧的時候,都會找不到資料,等到一個人折騰出來了,才發現dalao們終於肯在網上上課。

這個程序是C#寫的(包括那個帶錯誤恢復的parser),使用了當年火爆的Ribbon,無奈Windows Forms裡面並沒有控制項,於是我像素級copy了Word2007的效果。如果是Windows 7的話,上面的標題欄還是半透明的,工具欄的背後還會有點陰影。為什麼叫Turtle IDE呢,因為這其實是一個小海龜程序,寫完代碼之後就可以運行,看到一隻海龜在畫圖(逃

那會兒還在cppblog發了開發日誌一共十幾篇,幾年後回頭看發現其實也沒講清楚。原本我已經把相同的演算法做進了GacUI的項目裡面,不過其實還是有點殘廢,無法像Visual Studio一樣處理嵌套語言(主要是ParserGen的鍋),而這又是GacUI的必備內容。

根據現在的進度,今年內GacStudio十分有希望可以開工,到時候也要實現IntelliSense。這次我準備把語言服務的內容都做進獨立的進程裡面,畢竟這才是現代的做法。那個時候我會做一個完整的工具箱,讓大家也可以使用GacUI來開發屬於自己的編輯器,順便給《三本》系列添加新的內容。別看IntelliSense用的時候酷炫吊炸天,其實也沒什麼知識是難以學會的。

最近在給Workflow加上「自己寫庫提供yield return和await」的支持,寫完了之後我就繼續發《三本Coroutine(四)》,把這部分的內容包含進去。

推薦閱讀:

eval 之源
邏輯表達式的短路是如何實現的?
for 循環為什麼不支持小數?
Scala以cascade的方式調用函數有什麼不妥嗎?
遊戲的數值系統的實現和演化

TAG:编程 | 集成开发环境 | 成人教育 |