[英]Sanitize roslyn memberdeclarationsyntax identifier
在構建synxtaxtrees時,roslyn中是否存在用於清理memberdeclarationsynxtax節點的標識符名稱的現有方法或機制?
例如,帶有空格,點,短划線或使用保留字的名稱,如class,void,string
[編輯]為了澄清,代碼將被生成,因此您事先不知道或無法控制輸入,目標是清理輸入。 我指的是與Path.GetInvalidFileNameChars()無關的syntaxtree,您可以使用它來清理輸入以創建目錄和文件。 我在問roslin是否有這樣的機制。
在跟進接受的答案的同時,我在SyntaxFacts上找到了一些可以在這里使用的其他方法。
GetKeywordKind(string)
返回表示關鍵字的SyntaxKind.None
如果傳遞的字符串不是C#關鍵字,則返回SyntaxKind
。 GetContextualKeywordKind(string)
對上下文關鍵字執行相同的操作。 這應該可以很容易地做到這樣的事情:
string identifier = "double";
bool isAnyKeyword = SyntaxFacts.GetKeywordKind(identifier) != SyntaxKind.None
|| SyntaxFacts.GetContextualKeywordKind(identifier) != SyntaxKind.None;
我認為這個答案有兩個部分。 首先,在語法級別,您將永遠不會擁有帶有保留關鍵字值的IdentifierNameSyntax
。 我知道你在討論方法聲明,但同樣的想法適用於命名空間(它有較淺的語法樹來查看)。
考慮:
namespace class
{
}
相應的語法樹(使用Roslyn語法Visualizer生成):
請注意,在上面的圖像中, IdentifierName
旁邊有一個閃電。 這表明它完全沒有了。 解析器不會將class
錯誤作為標識符。 它知道每次看到關鍵字class
它都是ClassDeclarationSyntax
的開頭。
您的語法樹被徹底銷毀,甚至Visual Studio也沒有意識到您正在嘗試使用值為“class”的標識符。 它表示三個錯誤:
如果您正在生成標識符並且想要檢測您生成的字符串是否可以用作有效標識符,則此答案的第二部分適用。 我簡單地搜索了代碼庫,並沒有注意到任何可以檢測標識符中的無效字符和關鍵字的方法。 但是,我們可以結合兩種方法來實現您的目標:
SyntaxFacts.IsValidIdentifier()
和IsCSharpKeyword()
(不幸的是內部,必須復制到您的程序中)。
string myIdentifier = "test&";
bool validIdentifier = SyntaxFacts.IsValidIdentifier(myIdentifier); //false
string myOtherIdentifier = "class";
bool isKeyword = myOtherIdentifier.IsCSharpKeyword(); //true
請注意, IsCSharpKeyword()
不檢查Contextual Keywords
,它們可能出現在標識符中。 但是,命名類var
可能會引入語義錯誤,因此您可能還想添加這些上下文關鍵字。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.