许多编辑器和IDE具有代码完成功能。其中一些是非常“智能”的,其他则不是。我对更智能的类型感兴趣。例如,我看到IDE仅在以下情况下提供功能:a)在当前范围内可用b)其返回值有效。(例如,在“ 5 + foo [tab]”之后,它仅提供返回可以添加到正确类型的整数或变量名称中的函数。)我还看到它们将更常用或最长的选项放在前面列表中。
我知道您需要解析代码。但是通常在编辑当前代码时无效,其中包含语法错误。当内容不完整且包含错误时,您该如何解析?
也有时间限制。如果花几秒钟才能得出列表,则完成是没有用的。有时,完成算法处理数千个类。
有什么好的算法和数据结构?
我的UnrealScript语言服务产品中的IntelliSense引擎很复杂,但是我将在此处尽可能提供概述。我的性能目标是VS2008 SP1中的C#语言服务(出于充分的理由)。它尚不存在,但是它足够快速/准确,我可以在键入单个字符后安全地提供建议,而无需等待ctrl + space或用户键入.(点)。人们(从事语言服务方面)获得的有关该主题的信息越多,如果我曾经使用他们的产品,就会获得更好的最终用户体验。我有很多不幸的工作经历,对产品没有太在意细节,因此,与IDE的战斗比与代码的战斗更多。
.
在我的语言服务中,其布局如下所示:
aa.bb.cc
aa.bb(3+2).cc
IDeclarationProvider
GetDeclarations()
IEnumerable<IDeclaration>
aa
IDeclaration
->
declaration.GetMembers(".")
cc
以下是IntelliSense后端的一些其他说明:
GetMembers
List<IDeclaration>
List<Name>
Name
IntelliSense“前端”
随着用户的输入,该文件在语法上的 错误 多于正确的错误。因此,我不想在用户键入时随意删除缓存的各个部分。我有大量的特殊情况规则,以尽快处理增量更新。增量缓存仅在打开的文件中保持本地状态,有助于确保用户不会意识到自己的键入导致后端缓存为文件中的每种方法之类的东西保存了错误的行/列信息。
上一节的代码片段:
class A { int x; // linked to A void foo() // linked to A { int local; // linked to foo() // foo() ends here because bar() is starting void bar() // linked to A { int local2; // linked to bar() } int y; // linked again to A
我想我会添加一个使用此布局实现的IntelliSense功能的列表。每个图片都在这里。