如何自动修复XML注释警告?

时间:2014-12-24 11:53:43

标签: c# roslyn

在我的C#xml评论中,我有很多警告:

  

CS1574 XML注释的cref属性'days'无法解析

使用<see>元素代替<paramref>的位置。一个容易犯的错误。

/// <summary>
/// Add <see cref="days"/> days to <see cref="date"/>.
/// </summary>
public static double AddDays(double date, int days)
{
    return DateTime.FromOADate(date).AddDays(days).ToOADate();
}

我该如何修复它们? 200个文件大约有1000个,所以我不想手工完成。查找和替换不起作用,因为这会至少打破<see>的合法用途。

新的C#Roslyn代码分析API会有帮助吗?我可以想象找到这种警告的代码,测试破坏的目标是否真的是参数的名称,如果是,则编辑为paramref。你觉得怎么样?

1 个答案:

答案 0 :(得分:1)

您可以使用正则表达式进行查找和替换,该表达式仅在see标记中的cref与参数列表中的参数匹配时才匹配。

这是一个非常丑陋的正则表达式,应该有效:

((?:///\s*\<summary\>\s*\n)(?:\s*?///.*\n)*?\s*///.*?\<)see\s+cref(?=(=\"(:?.*)\"\s*/\>.*\n(?:///.*\n)*\s*///\s*\</summary\>[\s\n]*.*\((?:[^\)]|\n)*\3\b(?:[^\)]|\n)*\)[\s\n]*\{))

然后使用此替换文字:

$1paramref name

正则表达式启动捕获以获取要替换的文本之前的所有内容,然后查找摘要块的开头。一旦找到摘要块,它就会通过摘要块行并查找see。如果它找到一个它捕获see的cref。然后它开始展望未来。它查找摘要块的结尾,然后查找可选的空行,然后查找另外一行看起来有点像方法定义的标题。 (任何序列后跟括号参数列表,后跟一个{)在匹配的括号内,它从see标签(带有单词边界的\3\b backref)中查找cref。

如果匹配成功,替换文本会写出捕获的序言文本,然后将see cref切换为paramref name。它不需要编写文本的其余部分,因为我们使用了前瞻组来匹配参数名称。

一些警告

  1. 您可能需要在同一来源上多次运行
  2. 我的Visual Studio(2012)在使用捕获引用时表现不佳 替换文本,希望你的处理更好。
  3. 总体而言,与许多基于正则表达式的解决方案一样,您可以使用它来完成大部分工作,然后手动清理任何未命中。