簡體   English   中英

使用C#中的FastColoredTextBox的NRefactory代碼完成

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM