时隔一个月,终于在
Vczh Library++ 3.0的IDE工程里实现了用户自定义类型变绿(抄C#的娃哈哈)鼠标移动到对象上会出tooltip、显示函数参数提示和Code snippet的功能了。由于我的
语法树的每一个节点都包含了它在源代码中的位置,所以鼠标指向一个字符的时候,可以计算出他在语法树的位置,从而可以查到他的声明的语法树节点,再用声明节点的位置就可以把声明的代码复制出来显示在tooltip上面了:
同样的方法可以用来实现显示函数参数。这个比tooltip要复杂一点,因为要吧语法树的声明重新组织成代码才能显示出来,而且还有模板函数的类型问题。不过现在有两个小功能还没实现,第一个是在没输入的时候移动光标不会更新参数,这只是个小问题。另一个是对一个函数指针调用的时候做提示,这个还要进一步考虑。下图显示的是对一个模板函数做参数提示的时候,参数的类型会自动特化:
接下来就是code snippet了。Code snippet是一个强大的功能,可以让你免除一些无谓的手指的劳动。Visual Studio里面提供了大量的code snippet,不过在这里我暂时只提供for和forr两种,用来输入for循环。下面是使用code snippet输入一个for循环的全过程:
Code snippet是一个比较复杂的功能,在这里我只实现了上下文无关的一些特性。Visual Studio里面的就更为高级了,他在插入一个类名的时候,可以根据上下文来判断是否需要出现完整的namespace。当然由于现在我用来做intellisense的语言还没有这么复杂的元素,所以也就无从做起了。
所有的代码可以在
Vczh Library++ 3.0里面找到。这篇文章的代码跟
(十)的时候的代码已经大为不同了。经过一系列的重构,intellisense功能最终被做成一个灵活的插件形式,所有的细节都可以更改,甚至连code snippet那个黄色的输入位置都可以再往上画东西。因为在开发intellisense的时候发现了NativeX语言语法上一个二义性,因此NativeX的语法也做了一处小修改。而且我趁着这个时候重构了所有NativeX的测试用例,把在C++里面构造语法树改成了用一系列make file和反射函数并运行的方式直接使用NativeXProvider编译、运行main函数并与记录在index文件中的结果进行比较的方法。
接下来可以做的事情就比较多了。首先我要开始完成NativeX的调试功能,其次我要拿Microsoft SQL Server那个超级复杂的T-SQL来研究一个从文法产生intellisense代码(是的,你没看错,是intellisense代码)的方法,最后要在intellisense上实现NativeX的重构。对于那个自动生成intellisense代码的算法,目前还仅仅出于YY阶段,当然生成出来的也只能是上下文无关的intellisense。譬如说帮你列出数据库里面的所有表啦,或者帮你列出前面声明过的变量啦,不属于自动生成的范围。不过自动生成的intellisense还是会告诉你“现在需要弹出变量列表,需要提供内容”的这样一种信息来让你可以往里面添加一些不能自动生成的东西。当然做不做得出来那是另外一回事了,先研究研究。
posted on 2010-12-04 18:59
陈梓瀚(vczh) 阅读(13324)
评论(16) 编辑 收藏 引用 所属分类:
开发自己的IDE