我尝试在stylecop中为java样式曲线括号编写自定义规则,如下所示:
public void myfunction(int argument) {
body();
//.......
}
我的实际代码是:
public override void AnalyzeDocument(CodeDocument document) {
var csharpDocument = (CsDocument)document;
for (var tokenNode = csharpDocument.Tokens.First; tokenNode != null; tokenNode = tokenNode.Next) {
if (tokenNode.Value.CsTokenType == CsTokenType.OpenCurlyBracket) {
if (tokenNode.Value.LineNumber == tokenNode.Previous.Value.LineNumber
|| tokenNode.Value.LineNumber == tokenNode.Next.Value.LineNumber) {
this.AddViolation(tokenNode.Value,
tokenNode.Value.LineNumber,
"OpenCurlyBracketBadLocation");
}
}
if (tokenNode.Value.CsTokenType == CsTokenType.CloseCurlyBracket) {
if (tokenNode.Value.LineNumber != tokenNode.Previous.Value.LineNumber
|| tokenNode.Value.LineNumber == tokenNode.Next.Value.LineNumber) {
this.AddViolation(tokenNode.Value,
tokenNode.Value.LineNumber,
"CloseCurlyBracketBadLocation");
}
}
}
但这一行:
this.AddViolation(tokenNode.Value,
tokenNode.Value.LineNumber,
"CloseCurlyBracketBadLocation");
因为函数参数类型不匹配而无法编译。 第一个参数需要一个ICodeElement,我有一个CsToken ... 但是在这种方式下使用SDK ...所以任何人都知道解决方案吗?或者更好的方法呢?
答案 0 :(得分:0)
第一个参数是ICodeElement
的原因是违规的目标必须是可以应用SuppressMessageAttribute
的内容。您可以爬上令牌的Parent
链,直到找到ICodeElement
,但这不会特别有效。与SDK的预期用法更好地一致的方法是使用WalkDocument
方法访问元素(如在实现StyleCop自己的花括号验证规则的内置StyleCop.CSharp.LayoutRules
analyzer中所做的那样)。