gpt4 book ai didi

c# - 如何从 CsToken 获取 ICodeElement

转载 作者:太空宇宙 更新时间:2023-11-03 15:56:50 25 4
gpt4 key购买 nike

我尝试在 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 中,它使用了这种方式……所以有人知道解决方案吗?或者更好的方法?

最佳答案

第一个参数是 ICodeElement 的原因是违规目标必须是可以应用 SuppressMessageAttribute 的对象。您可以沿着 token 的 Parent 链向上攀登,直到找到 ICodeElement,但这并不是特别有效。一种更符合 SDK 预期用途的方法是使用 WalkDocument 方法访问元素(正如在实现 StyleCop 自己的花括号验证的内置 StyleCop.CSharp.LayoutRules analyzer 中所做的那样规则)。

关于c# - 如何从 CsToken 获取 ICodeElement,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23237951/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com