[英]NRefactory code completion with FastColoredTextBox in c#
我正在為C#構建一個簡單的IDE。
..並且我正在使用FastColoredTextBox
控件進行源代碼編輯,並帶有內置的自動完成菜單( http://www.codeproject.com/Articles/161871/Fast-Colored-TextBox-for-syntax-highlighting )
問題是,我想使用NRefactor
來執行自動代碼完成,就像在Visual Studio中一樣。
我做了一些研究,發現了這一點: https : //github.com/lukebuehler/NRefactory-Completion-Sample ...但我不理解代碼,因此無法重用。
確切地說,我需要什么?
我需要一個函數,該函數將把程序集(字符串數組,它們是DLL的路徑)作為輸入列表,當前偏移量和編輯器的文本。
作為輸出,我需要一個對象數組,其中將包含對象的名稱及其類型(變量,函數,類型...)
那么,我該怎么做呢? 是否有必要在另一個線程中運行此自動完成代碼?
謝謝你的回答,
VitekST
PS:不要恨我,我對NRefactor
不熟悉...
在您提出此問題的同一天,我便開始探索NRefactory。因此,我不能稱自己為NRefactory專家。 但是我可以告訴您如何使用它。
理論資料: http : //www.codeproject.com/Articles/408663/Using-NRefactory-for-analyzing-Csharp-code
首先,您可以使用此示例項目中的Visual Studio解決方案模型為您的IDE解決方案格式創建類似的類: https : //github.com/icsharpcode/NRefactory/tree/master/ICSharpCode.NRefactory.ConsistencyCheck有三個類您需要:CSharpFile,CSharpProject和解決方案 。 請查看其源代碼,您將知道NRefactory如何執行代碼文件的語法分析。 注意CSharpProject的“ Compilation ”字段和CSharpFile的“ CreateResolver ”方法。
其次,您需要執行代碼的語義分析。 為此,您需要實施
ICSharpCode.NRefactory.CSharp.Resolver.IResolveVisitorNavigator
接口。 但是您最好使用現有的NRefactory實現:
ICSharpCode.NRefactory.CSharp.Resolver.FindReferencedEntities
具有兩個參數的構造函數等待兩個處理程序。 首先執行,然后解析的語法元素是類型的引用,包含在您的解決方案或引用的程序集中(如變量聲明)。 當解析的語法元素是某種類型的成員的引用(例如,“(new object())。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;
SyntaxTree是一個繼承自AstNode類的“ ICSharpCode.NRefactory.CSharp.SyntaxTree ”。 它是代碼文件的根語法節點。 變量語法樹將包含正在編輯的當前文件的所有未解析的語法元素。 要遍歷語法樹,可以使用AstNode枚舉成員,如Descendants,Children,GetParent()等。也可以使用“ Visitor”模式和AstNode方法“ AcceptVisitor”。
在生成自動完成列表時,如果未找到用戶輸入,則可以將typesMap和membersMap用作聲明的類型及其成員的快速存儲,將syntaxTree用作慢速存儲。
NRefactory是一個非常廣泛的主題,我無法完全揭示。 令人遺憾的是,這個強大的框架還沒有詳細的文檔。 但我希望我的回答能對您有所幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.