首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NRefactory代码在c#中用FastColoredTextBox完成

NRefactory代码在c#中用FastColoredTextBox完成
EN

Stack Overflow用户
提问于 2014-12-12 16:13:07
回答 1查看 1.4K关注 0票数 0

我正在为C#构建一个简单的IDE。

..and i使用FastColoredTextBox控件编辑源代码,并内置自动完成菜单(http://www.codeproject.com/Articles/161871/Fast-Colored-TextBox-for-syntax-highlighting)。

问题是,我想使用NRefactor来完成自动代码,就像在Visual中一样。

我做了一些研究,我发现:https://github.com/lukebuehler/NRefactory-Completion-Sample ...but我不懂代码,所以我不能重用它。

准确地说,我需要什么?

我需要一个函数,它将作为程序集(字符串数组,这是DLL的路径)、当前偏移量和编辑器文本的输入列表。

作为输出,我需要一个对象数组,它将包含对象的名称,以及它的类型(变量、函数、类型、.)

那我该怎么做呢?是否有必要在另一个线程中运行此自动完成代码?

谢谢你的回答,

VitekST

别恨我,我不熟悉NRefactor.

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-15 16:25:36

我开始探索NRefactory,就在你问这个问题的同一天),所以,我不能自称是NRefactory专家。但我可以告诉你我是怎么用的。

理论材料:http://www.codeproject.com/Articles/408663/Using-NRefactory-for-analyzing-Csharp-code

首先,您可以使用此示例项目中的Visual解决方案模型为您的IDE解决方案格式创建类似的类:https://github.com/icsharpcode/NRefactory/tree/master/ICSharpCode.NRefactory.ConsistencyCheck --您需要三个类:CSharpFileCSharpProject解决方案。请看它的源代码,您就会知道NRefactory是如何对代码文件进行语法分析的。注意编译字段和CSharpFile的CSharpProject方法。

其次,您需要执行代码的语义分析。为此,您需要实现

代码语言:javascript
复制
ICSharpCode.NRefactory.CSharp.Resolver.IResolveVisitorNavigator

接口。但在您的示例中,您最好使用现有的NRefactory实现:

代码语言:javascript
复制
ICSharpCode.NRefactory.CSharp.Resolver.FindReferencedEntities

具有两个参数的构造函数等待两个处理程序。首先执行,然后解析语法元素是类型引用,包含在您的解决方案或被引用的程序集中(如变量声明)。第二,当解析语法元素是对某个类型的成员的引用时执行(例如,“(新对象().ToString().ToString()”作为"object“实例的成员"ToString”的引用)。这两个处理程序的第一个参数是AstNode:未解析的代码语法元素。第二个参数是对应的解析语义元素: IType用于第一个处理程序,IMember用于另一个处理程序。因此,您需要使用处理程序创建导航器实例,例如,在字典中保存语法和相应的语义元素。

代码可以如下所示:

代码语言:javascript
复制
var solution = new Solution(slnPath);

IDictionary<AstNode, IType> typesMap = new Dictionary<AstNode, IType>();

IDictionary<AstNode, IMember> membersMap = new Dictionary<AstNode, IMember>();

var navigator = new FindReferencedEntities(typesMap.Add, membersMap.Add);

foreach (var codeFile in solution.AllFiles)
{
    codeFile.CreateResolver().ApplyNavigator(navigator);
}

在此代码字典执行后,typesMapmembersMap将包含代码的语法元素,即NRefactory能够在字典键中解析,并在值中解析相应的语义。如果您编写自动完成,在使用时处理过的代码不能以很高的概率进行编译(因为用户在此时编写它)。因此,应用程序不仅必须使用解析代码,而且还必须使用未解决的代码。要获得代码文件的未解析语法元素,此时要进行用户编辑,您必须使用:

代码语言:javascript
复制
var syntaxTree = solution.Projects
    .Where(p => p.Title.Equals(editableProjName))
    .Files
    .Where(f => f.FileName.Equals(editableFileNamePath))
    .SyntaxTree;

"ICSharpCode.NRefactory.CSharp.SyntaxTree",是继承AstNode类的SyntaxTree。它是代码文件的根语法节点。变量syntaxTree将包含正在编辑的当前文件的所有未解析语法元素。要在语法树中移动,可以使用AstNode可枚举成员,如子代、子、GetParent()等,也可以使用“访问者”模式和AstNode方法"AcceptVisitor“。

在为自动完成生成列表时,如果找不到用户输入,您可以使用typesMap和membersMap作为声明类型及其成员的快速存储,使用syntaxTree作为慢存储。

NRefactory是一个非常广泛的话题,我不能充分揭示它。非常遗憾的是,这个强大的框架没有得到详细的文档。但我希望我的回答能帮到你。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27447644

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档