我正在为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.
发布于 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 --您需要三个类:CSharpFile、CSharpProject和解决方案。请看它的源代码,您就会知道NRefactory是如何对代码文件进行语法分析的。注意编译字段和CSharpFile的CSharpProject方法。
其次,您需要执行代码的语义分析。为此,您需要实现
ICSharpCode.NRefactory.CSharp.Resolver.IResolveVisitorNavigator接口。但在您的示例中,您最好使用现有的NRefactory实现:
ICSharpCode.NRefactory.CSharp.Resolver.FindReferencedEntities具有两个参数的构造函数等待两个处理程序。首先执行,然后解析语法元素是类型引用,包含在您的解决方案或被引用的程序集中(如变量声明)。第二,当解析语法元素是对某个类型的成员的引用时执行(例如,“(新对象().ToString().ToString()”作为"object“实例的成员"ToString”的引用)。这两个处理程序的第一个参数是AstNode:未解析的代码语法元素。第二个参数是对应的解析语义元素: IType用于第一个处理程序,IMember用于另一个处理程序。因此,您需要使用处理程序创建导航器实例,例如,在字典中保存语法和相应的语义元素。
代码可以如下所示:
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);
}在此代码字典执行后,typesMap和membersMap将包含代码的语法元素,即NRefactory能够在字典键中解析,并在值中解析相应的语义。如果您编写自动完成,在使用时处理过的代码不能以很高的概率进行编译(因为用户在此时编写它)。因此,应用程序不仅必须使用解析代码,而且还必须使用未解决的代码。要获得代码文件的未解析语法元素,此时要进行用户编辑,您必须使用:
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是一个非常广泛的话题,我不能充分揭示它。非常遗憾的是,这个强大的框架没有得到详细的文档。但我希望我的回答能帮到你。
https://stackoverflow.com/questions/27447644
复制相似问题