如何获取给定块的访客的lint级别?

时间:2016-02-09 05:36:28

标签: rust lint internals visitor

由于各种原因,我使用访问者进行HIR树遍历而不是 依靠lint上下文来走树。但是,这意味着我的棉绒 忽略源中的#[allow/warn/deny(..)]注释。我怎么能得到这个 回来?

我知道ctxt.levels,但那些似乎没有帮助。其他功能 (如with_lint_attrs(..)对上下文是私有的。

1 个答案:

答案 0 :(得分:1)

由于我们没有使用Rust的解决方案,我created在Rustc中进行了必要的回调:今晚每晚,我们LateLintPass还有另一个check_block_post(..)方法。因此,我们可以将访问者内容拉入lint,并添加Option<&Block>方法中设置的check_block(..)类型的新字段,如果字段等于当前值,则在check_block_post(..)中取消设置阻止,从而忽略所有包含的块。

编辑:代码如下:

use syntax::ast::NodeId;

struct RegexLint { // some fields omitted
    last: Option<NodeId>
}
// concentrating on the block functions here:
impl LateLintPass for RegexLint {
    fn check_block(&mut self, cx: &LateContext, block: &Block) {
        if !self.last.is_none() { return; }
        // set self.last to Some(block.id) to ignore inner blocks
    }

    fn check_block_post(&mut self, _: &LateContext, block: &Block) {
        if self.last.map_or(false, |id| block.id == id) {
             self.last = None; // resume visiting blocks
        }
    }
}