考虑以下错误消息:
错误CS0122:"wbpoc_Base.IsNullColumnValue(DataRow,string("由于其保护级别而无法访问
作为一个人,我知道问题出在这种方法上:
private static bool IsNullColumnValue(DataRow row, String columnName)
{
return (string.IsNullOrEmpty(columnName) || row[columnName] == DBNull.Value);
}
但是,当错误消息破坏了该方法的实际签名时,有没有一种简单的方法可以通过编程将wbpoc_Base.IsNullColumnValue(DataRow, string)
与实际签名匹配——它将String
转换为相应的内置类型string
,并省略参数的名称?
现在看来,代码将不得不";按摩";类型的签名通过:
- 删除参数名称
- 将内置类型名转换为其规范形式
我希望这些是唯一必须完成的翻译。
我希望编译器有一个标志,可以关闭任何翻译,并保持对代码元素的引用与源代码中所写的完全相同。
也许有这样的事情?
编辑
这个";按摩";是一场噩梦,因为泛型类型。我假设错误将输出List<string>
而不是List<String>
。天啊。。。
编辑1
我正在构建一个自动化代码重构的工具。其中一个命令是将函数从一个类移动到另一个类。目标是尽可能减少人工干预。一旦函数被移动,该工具就会运行构建并检查错误。错误会被自动解析和处理。因此,能够将错误与实际代码相匹配是非常重要的。
编辑2
澄清我正在努力实现的目标。我已经收集了CS错误消息,现在想自动处理它们。这是可能的,因为我知道代码由于我的更改而无法编译,并且我确切地知道这些更改是什么。我有:
- 错误消息
- Roslyn API解析源代码并构建语法和语义模型
- 以前版本的二进制代码,以备我需要
问题是将错误消息与Roslyn API的工件关联起来。上面的错误消息示例参考
wbpoc_Base.IsNullColumnValue(DataRow, string)
但是实际的源代码声明
IsNullColumnValue(DataRow row, String columnName)
如果我们使用Mono.Cecil读取元数据,它将返回一个具有的FullName
的MethodDefinition
对象
System.Boolean The.Namespace.Of.wbpoc_Base::IsNullColumnValue(System.Data.DataRow, System.String)
正如我们所看到的,所有3个表示都表示相同的代码元素——wbpoc_Base
类中的一个方法。但它们不能立即进行比较——我们必须将它们规范化为某种规范形式
我能理解Mono.Cecil
——它是非微软产品。但Roslyn API和C#编译器是由同一个团队或密切相关的团队生产的,不是吗?当然,能够以编程方式将错误消息中提到的代码元素与Roslyn API生成的相应语法节点关联起来是有价值的。
问题是必须";按摩";代码元素引用了错误,因为它们并不总是可以直接使用,正如我的示例所示。
这让我想知道是否有一种方法可以使用更忠实的代码引用来生成错误消息。
编译器诊断(错误、警告、信息(包含报告诊断的文本位置信息。
当使用ErrorLog
MSBuild
属性或-errorlog
编译器参数时,可以在SARIF
文件中收集此信息。
- SARIF主页
- 用于报告错误和警告的C#编译器选项