在我的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
。你觉得怎么样?
答案 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
。它不需要编写文本的其余部分,因为我们使用了前瞻组来匹配参数名称。
一些警告
总体而言,与许多基于正则表达式的解决方案一样,您可以使用它来完成大部分工作,然后手动清理任何未命中。