簡體   English   中英

清理roslyn memberdeclarationsyntax標識符

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

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