挖井

类库大魔王的挖井日记

挖一口属于自己的井


从自动完成功能说起

  再次说回来公司那个东东的自动完成功能。
  本来只有简单的关键字提示功能,因为关键字不多,而且要提示的都只有长度超过3个字符的,所以很简单,把关键字排好序,放在配置文件中,每到3个字符时,show一下那个字符串就行了。后来提出了更多的要求,要能尽量联想一下类名啊、方法名啊、变量名啊等等,于是动用了数据库,把所有的库中的类名、相关的方法名等信息都存放到一个数据库中,必要时从数据库中检索出相应的内容,再组合成一个字符串,show出来。
  Ruby语言有点奇怪,不知道是不是大部分现在流行的脚本语言都有类似的情况,因为一直以来我都只接触过C/C++,像Delphi这些语言也是静态编译的,所以几乎都是强类型的。但Ruby不同,它的变量的类型是随时可以变的,不过这个问题对于实现解决自动完成功能时并不是特有的困难,而是所有的语言都可能会有的。要扫描所有的代码,然后确定某个符号是什么类型的。
  当前项目中使用的方法,现在想起来,当时做的时候几乎没做什么设计,直接想到一个解决办法就拿上去用了。每次打开一个文件的时候,就扫描一遍文件,把几种特定形式的语句用正则表达式匹配一把,然后记录到一个map中,key是变量名,value是类型名,到时候就查找这个map。这个方案有一个很严重的问题,就是打开大文件时,会有很恶劣的性能问题,可能过了几十秒钟,那个文件还没有show出来,而是正则表达式一直在那里匹配计算,而且正则表达式有好几个,需要匹配好几次,每次都可能花费大量的时间。另外还有一个问题,就是不能很好地反映代码更新的情况,比如一开始打开时已经定义了一个变量,后来在编辑时,修改了变量所属的类型,而我现在只有在回车换行时,才扫描一遍当前行的内容,是定义了新的变量等等,如果用户只是改完内容后直接用方向键移动了,或是用鼠标直接跳离了当前行,就不能得知修改的内容了。
  因为没有这方面的经验,也没有看到其它多少可以参考的项目或资料。依稀觉得Source Insight的解决方案比较适合应用到我们这个项目中。Source Insight具体工程的概念来管理所有的源代码文件,新建一个工程后,把所有的源代码文件都添加进来,然后可以由用户手动触发扫描所有文件,建立一个符号表数据库,或者是程序自动在后台,慢慢建立一个数据库,但不会影响前台功能的使用。再一想,我现在用的正则表达式匹配的方案实现很落后低效,再怎么样,也可以依赖于像ctags这样的工具建立索引。我其实并没有仔细地研究过Source Insight的建立索引的机制,只知道它的速度确实很快,而且准确性也基本能符合用户的要求。
  另外,我现在几乎不能再大动干戈地改动那一块的设计了,所以表现上不会有质的飞跃了,真是略微有点点遗憾啊。这些想法就只能放在自己现在搞的这块来实现了,要做一个类似Source Insight的通用代码浏览、编辑工具,编辑功能应该是强于Source Insight的。然后针对几种语言做IDE,除了要能浏览、编辑代码,还得跟编译器(或解释器)有良好的交互功能。初步计划是针对DLuaTCLPythonRubyPerlPHP这几种,因为这个市场还没有被什么寡头垄断,还有机会插一脚,哈哈。

本文地址:

https://minidump.info/blog/2007/09/e4-bb-8e-e8-87-aa-e5-8a-a8-e5-ae-8c-e6-88-90-e5-8a-9f-e8-83-bd-e8-af-b4-e8-b5-b7/

感觉本文不错,不妨小额鼓励我一下!
上一篇

无聊的时候

  晚上又跟小思宇去吃肥牛府了,两个人点了好多,最后浪费了好些菜,肉硬是全让我消灭了。然后两个人慢慢走回百草园,我再走到百草园门口坐车回家。  无聊的时候,就静静地躺在床上,发一会儿呆,把所有的不快都抛得远远的。  今天在公司里也无聊了一天哦,我觉得领导们是存心不想让我按时完成那个项目了,需求...…

Job 全文阅读
下一篇

来一篇长的流水账

  昨天早上还是很早,大概是7点多就醒了,起来开电脑,无聊,然后熬了一会儿,去洗澡收拾,弄得自以为比较干净整洁的样子。还是比较早,就写了一会儿代码,好不容易熬到10点半,出去坐车,本来以为之前已经千叮万嘱过了要准时,别让我等的。结果到了那里,还是等了20分钟,当时心里还是挺有点生气的,不过见到...…

mm 全文阅读