如何从CsToken获取ICodeElement

时间:2014-04-23 07:42:12

标签: c# stylecop

我尝试在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 ...所以任何人都知道解决方案吗?或者更好的方法呢?

1 个答案:

答案 0 :(得分:0)

第一个参数是ICodeElement的原因是违规的目标必须是可以应用SuppressMessageAttribute的内容。您可以爬上令牌的Parent链,直到找到ICodeElement,但这不会特别有效。与SDK的预期用法更好地一致的方法是使用WalkDocument方法访问元素(如在实现StyleCop自己的花括号验证规则的内置StyleCop.CSharp.LayoutRules analyzer中所做的那样)。