使用源代码生成器时,如何让IDE将生成类导航至原始常量声明?
解决方案:通过预处理指令实现导航重定向
要解决VS Code中点击生成的StateCapitolPrompt类无法导航到原const string StateCapitol的问题,最直接且无需额外扩展的方式是利用C#的#line预处理指令,让IDE将生成类的导航指向原始定义位置。
具体步骤:
在源代码生成器中获取原始符号的位置信息
在处理带特性的const string时,通过ISymbol.Locations属性获取该字符串所在的文件路径和起始行号。例如:var originalLocation = templateSymbol.Locations.First(); var filePath = originalLocation.SourceTree.FilePath; var lineNumber = originalLocation.GetLineSpan().StartLinePosition.Line + 1; // 行号从1开始计数在生成的类代码中插入
#line指令
在生成StateCapitolPrompt类的代码开头,添加指向原始位置的#line指令,完成后恢复默认行号映射:#line {lineNumber} "{filePath}" public class StateCapitolPrompt { // 类的实现逻辑 public async Task<string> ExecuteAsync(string state) { // ... } } #line default
原理说明:
#line是C#官方支持的预处理指令,VS Code的C#语言服务器(基于OmniSharp/Roslyn)会识别该指令,将生成类的代码导航关联到指定的原始文件行。当用户点击StateCapitolPrompt时,IDE会直接跳转到原const string StateCapitol的定义位置。
备选方案:自定义特性+分析器扩展(进阶)
如果需要更灵活的控制,可以自定义一个特性标记生成类,例如:
[AttributeUsage(AttributeTargets.Class)] public class RedirectToSourceAttribute : Attribute { public string SourceFilePath { get; } public int LineNumber { get; } public RedirectToSourceAttribute(string sourceFilePath, int lineNumber) { SourceFilePath = sourceFilePath; LineNumber = lineNumber; } }
然后编写一个Roslyn分析器,识别该特性并修改IDE的导航行为。但这种方式需要额外开发和部署分析器,复杂度远高于#line指令方案。
内容的提问来源于stack exchange,提问作者Charles Chen
相关产品推荐
相关产品推荐

