清理roslyn memberdeclarationsyntax标识符

时间:2015-02-21 12:23:11

标签: c# roslyn

在构建synxtaxtrees时,roslyn中是否存在用于清理memberdeclarationsynxtax节点的标识符名称的现有方法或机制?

例如带有空格,点,短划线或使用保留字的名称,如class,void,string

[编辑] 为了澄清,代码将被生成,因此您事先不知道或无法控制输入,目标是清理输入。我指的是与Path.GetInvalidFileNameChars()无关的syntaxtree,您可以使用它来清理输入以创建目录和文件。我在问roslin是否有这样的机制。

2 个答案:

答案 0 :(得分:3)

在跟进接受的答案时,我在SyntaxFacts上找到了一些可以在这里使用的其他方法。

GetKeywordKind(string)返回表示关键字的SyntaxKind,如果传递的字符串不是C#关键字,则返回SyntaxKind.NoneGetContextualKeywordKind(string)为上下文关键字做同样的事情。这应该可以很容易地做到这样的事情:

string identifier = "double";
bool isAnyKeyword = SyntaxFacts.GetKeywordKind(identifier) != KeywordKind.None
                 && SyntaxFacts.GetContextualKeywordKind(identifier) != KeywordKind.None;

答案 1 :(得分:2)

我认为这个答案有两个部分。首先,在语法级别,您永远不会有IdentifierNameSyntax具有保留关键字的值。我知道你在谈论方法声明,但同样的想法适用于命名空间(它有较浅的语法树来查看)。

考虑:

namespace class
{
}

相应的语法树(使用Roslyn Syntax Visualizer生成):

enter image description here

请注意,在上图中,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命名可能会引入语义错误,因此您可能还想添加这些关联关键字。