如何要求 Roslyn 为我生成标识符名称?
How to ask Roslyn to generate an identifier name for me?
正如标题所说,我如何要求 Roslyn 为我生成一个标识符,类似于模式匹配代码修复程序或生成方法的做法?
原来 Roslyn 内部有一个内部 class 可以执行此操作,但它所做的远远超出我的需要。
相反,我只是使用语义模型在我的块跨度开始时获取可见符号列表,将我的标识符命名为与我的类型相同(只是以小写字母开头)并开始在结束直到我得到一些不可见的东西:
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;
正如标题所说,我如何要求 Roslyn 为我生成一个标识符,类似于模式匹配代码修复程序或生成方法的做法?
原来 Roslyn 内部有一个内部 class 可以执行此操作,但它所做的远远超出我的需要。
相反,我只是使用语义模型在我的块跨度开始时获取可见符号列表,将我的标识符命名为与我的类型相同(只是以小写字母开头)并开始在结束直到我得到一些不可见的东西:
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;