【问题标题】:Sanitize roslyn memberdeclarationsyntax identifier清理 roslyn 成员声明语法标识符
【发布时间】:2015-02-21 12:23:10
【问题描述】:

在构建 synxtaxtree 时,roslyn 中是否有任何现有的方法或机制来清理 memberdeclarationsynxtax 节点的标识符名称?

例如带有空格、点、破折号或使用保留字(如 class、void、string)的名称

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

【问题讨论】:

  • 我不认为有这样的事情,告诉你应该如何命名你的成员不是编译器的工作。
  • 公平点,但是如果我尝试将类命名为“类”,编译器将根据语法树填充诊断错误,因此必须在幕后进行某种形式的验证
  • 可以调用类class:class @class {}
  • 是的,但问题是如何识别这些保留字以便在它们前面加上@
  • @Mac 简单的解决方案是在 everything 前面加上 @class @SomeValidNameclass SomeValidName 完全相同。

标签: c# roslyn


【解决方案1】:

在跟进已接受的答案时,我在 SyntaxFacts 上发现了一些可以在此处使用的其他方法。

GetKeywordKind(string) 返回代表关键字的 SyntaxKind,如果传递的字符串不是 C# 关键字,则返回 SyntaxKind.NoneGetContextualKeywordKind(string)对上下文关键字做同样的事情。这应该可以轻松执行以下操作:

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

【讨论】:

    【解决方案2】:

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

    考虑:

    namespace class
    {
    }
    

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

    请注意,在上图中,IdentifierName 旁边有一个闪电。这表明它完全丢失了。解析器不会将class 误认为是标识符。它知道每次看到关键字class 时它都是ClassDeclarationSyntax 的开头。

    您的语法树完全被破坏了,甚至 Visual Studio 也没有意识到您正在尝试使用具有“类”值的标识符。它表示三个错误:

    • 需要标识符
    • { 预期的
    • } 预期

    如果您正在生成标识符并希望检测您生成的字符串是否可用作有效标识符,则此答案的第二部分适用。我简单地搜索了代码库,并没有注意到任何可以检测标识符中的无效字符和关键字的方法。但是,我们可以结合两种方法来实现您想要的:

    SyntaxFacts.IsValidIdentifier()IsCSharpKeyword()(不幸的是,这是内部的,必须复制到您的程序中)。

    string myIdentifier = "test&";
    bool validIdentifier = SyntaxFacts.IsValidIdentifier(myIdentifier); //false
    string myOtherIdentifier = "class";
    bool isKeyword = myOtherIdentifier.IsCSharpKeyword(); //true
    

    请注意,IsCSharpKeyword() 不会检查 Contextual Keywords,它们可能会出现在标识符中。但是,将您的类命名为 var 可能会引入语义错误,因此您可能还需要添加这些上下文关键字。

    【讨论】:

    • 谢谢,我实际上是在谈论成员声明,​​我认为它涵盖了命名空间、类、方法、属性、字段等。看起来它可能会完成这项工作
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 2012-05-28
    • 2021-11-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多