如何创建一个既是 Visitor 又是 ExprUseVisitor 的 LintPass?
How to create a LintPass that is both Visitor and ExprUseVisitor?
我目前正在编写一个 lint 以查找使用 std::borrow::Cow
可能有益的地方。那些地方可能包括局部变量,但也包括结构字段和枚举参数,除非它们是 public 接口的一部分(此时我打算保释;我不想要求人们在此更改官方接口点)。
但是,为此,我们必须在报告前检查整个箱子的定义。由于 LintPass
特征没有 在 板条箱走完后无条件调用的回调,我试图通过我自己的访问者结构实现 rustc_front::visit::Visitor
封装rustc::lint::Context
和我们的数据。
此外,我想检查 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);
...
这个错误至少可以说是相当令人惊讶。请注意,建议的 "explicit lifetime" 实际上与我的代码相同。
那么如何编译我的代码?
问题出在您对 euv::Delegate
的实施中。具体来说,当您打算实施 euv::Delegate<'t> for CowVisitor<'v, 't>
.
时,您尝试实施 euv::Delegate<'v> for CowVisitor<'v, 't>
一般来说,如果您正在做任何涉及生命周期的复杂事情,错误消息几乎毫无用处;不要相信他们实际上是在指出错误。
我目前正在编写一个 lint 以查找使用 std::borrow::Cow
可能有益的地方。那些地方可能包括局部变量,但也包括结构字段和枚举参数,除非它们是 public 接口的一部分(此时我打算保释;我不想要求人们在此更改官方接口点)。
但是,为此,我们必须在报告前检查整个箱子的定义。由于 LintPass
特征没有 在 板条箱走完后无条件调用的回调,我试图通过我自己的访问者结构实现 rustc_front::visit::Visitor
封装rustc::lint::Context
和我们的数据。
此外,我想检查 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);
...
这个错误至少可以说是相当令人惊讶。请注意,建议的 "explicit lifetime" 实际上与我的代码相同。
那么如何编译我的代码?
问题出在您对 euv::Delegate
的实施中。具体来说,当您打算实施 euv::Delegate<'t> for CowVisitor<'v, 't>
.
euv::Delegate<'v> for CowVisitor<'v, 't>
一般来说,如果您正在做任何涉及生命周期的复杂事情,错误消息几乎毫无用处;不要相信他们实际上是在指出错误。