如何创建一个既包含访问者又包含ExprUseVisitor的LintPass?

时间:2015-09-16 13:15:24

标签: rust lint lifetime internals

我目前正在写一个lint来找到使用std::borrow::Cow可能有益的地方。那些地方可能包括局部变量,但也包括struct字段和枚举参数,除非它们是公共接口的一部分(此时我打算保释;我不想让人们在此时更改官方接口)

但是,要做到这一点,我们必须在报告之前检查整个包装箱的定义。由于LintPass特征没有在之后无条件地调用的回调,因此我试图通过我自己的访问者结构来实现rustc_front::visit::Visitorrustc::lint::Context封装了{{1}和我们的数据。

此外,我想检查String类型的字段,这些字段是从&'static str实例化的某个地方。为了使这个可行,我想在访问者结构中使用ExprUseVisitor特征。

截至目前的代码为here

我收到以下错误:

src/cow.rs:56:44: 56:48 error: cannot infer an appropriate lifetime for lifetime parameter `'v` due to conflicting requirements
src/cow.rs:56         let vis = euv::ExprUseVisitor::new(self as &mut euv::Delegate<'t>, &infcx);
                                                         ^~~~
src/cow.rs:51:5: 58:6 help: consider using an explicit lifetime parameter as shown: fn visit_fn(&mut self, _: FnKind, fd: &FnDecl, b: &Block, _: Span, id: NodeId)
src/cow.rs:51     fn visit_fn(&mut self, _: FnKind, fd: &FnDecl, b: &Block,
src/cow.rs:52             _: Span, id: NodeId) {
src/cow.rs:53         let tcx = &self.cx.tcx;
src/cow.rs:54         let param_env = Some(ty::ParameterEnvironment::for_item(tcx, id));
src/cow.rs:55         let infcx = infer::new_infer_ctxt(tcx, &tcx.tables, param_env, false);
src/cow.rs:56         let vis = euv::ExprUseVisitor::new(self as &mut euv::Delegate<'t>, &infcx);
              ...

至少可以说,这个错误非常令人惊讶。请注意建议的&#34;显式生命周期&#34;实际上与我的代码相同。

那么如何让我的代码编译?

1 个答案:

答案 0 :(得分:3)

问题在于euv::Delegate的实施。具体来说,当您打算实施euv::Delegate<'v> for CowVisitor<'v, 't>时,您尝试实施euv::Delegate<'t> for CowVisitor<'v, 't>

一般来说,如果你做了一生复杂的事情,那么错误信息几乎是无用的;不要相信他们实际上指的是错误。