【问题标题】:How to ask Roslyn to generate an identifier name for me?如何让 Roslyn 为我生成标识符名称?
【发布时间】:2021-06-07 20:49:22
【问题描述】:

正如标题所说,我如何让 Roslyn 为我生成一个标识符,类似于模式匹配代码修复器或生成方法的做法?

【问题讨论】:

  • 怎么问?礼貌! :) “getHashCode()”并没有真正生成标识符;它“尝试”根据对象的“价值”生成伪代码(最后一句话可能引发很多争论)。要回答这个问题,我们可能需要确切了解您想要达到的目标。
  • 我说的是 document1,它是由 Roslyn 根据匹配的类型生成的。

标签: roslyn roslyn-code-analysis


【解决方案1】:

原来 Roslyn 内部有一个内部类可以做到这一点,但它比我需要的要多得多。

相反,我只是使用语义模型来获取块跨度开头的可见符号列表,将我的标识符命名为与我的类型相同(仅以小写字母开头)并开始在末尾添加数字直到我得到一些不可见的东西:

        var symbols = new HashSet<string>(semanticModel.LookupSymbols(bes.SpanStart).Select(s => s.Name));

        var baseIdentifierName = baseType is PredefinedTypeSyntax pts ? pts.Keyword.ValueText : throw new InvalidOperationException();
        if (isArray && !baseIdentifierName.EndsWith("s"))
            baseIdentifierName += "s";
        if (char.IsUpper(baseIdentifierName[0]))
            baseIdentifierName = $"{char.ToLower(baseIdentifierName[0])}{baseIdentifierName.Substring(1)}";

        var identifierName = baseIdentifierName;
        var index = 0;
        while (symbols.Contains(identifierName))
            identifierName = baseIdentifierName + ++index;

【讨论】:

    猜你喜欢
    • 2015-12-16
    • 1970-01-01
    • 2015-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多