2017-08-29 5 views
2
#![feature(rustc_private)] 
#![feature(box_syntax)] 
extern crate rustc; 
extern crate rustc_driver; 

use rustc::hir::intravisit as hir_visit; 
use rustc::hir; 
use rustc_driver::driver::{CompileController, CompileState}; 

pub struct SomeVisitor<'a, 'tcx: 'a> { 
    pub map: &'a hir::map::Map<'tcx>, 
} 

impl<'v, 'tcx: 'v> rustc::hir::intravisit::Visitor<'tcx> for SomeVisitor<'v, 'tcx> { 
    fn nested_visit_map<'this>(&'this mut self) -> hir_visit::NestedVisitorMap<'this, 'tcx> { 
     hir_visit::NestedVisitorMap::All(self.map) 
    } 
} 

fn hir(s: &mut CompileState) { 
    let krate = s.hir_crate.unwrap(); 
    let map = s.hir_map.unwrap(); 
    let mut visitor = SomeVisitor { map }; 
    hir_visit::walk_crate(&mut visitor, krate); 
} 

fn main() { 
    { 
     let mut controller = CompileController::basic(); 
     controller.after_hir_lowering.callback = box hir; 
    } 
} 

playground明示的な寿命は、私は生涯のエラーを取得していますし、ために、明示的な寿命を追加することによって、それを解決するために非常に簡単である理由私は理解して関数のシグネチャを変更し、必要な型シグネチャ

ための機能が非互換にします機能hir

pub fn walk_crate<'v, V: hir_visit::Visitor<'v>>(visitor: &mut V, krate: &'v Crate) {} 

があるため、この定義の参照のための寿命は'tcxのために生きている必要があります。

fn hir<'v, 'tcx>(s: &'tcx mut CompileState<'v, 'tcx>) { 
    let krate = s.hir_crate.unwrap(); 
    let map = s.hir_map.unwrap(); 
    let mut visitor = SomeVisitor { map }; 
    hir_visit::walk_crate(&mut visitor, krate); 
} 

しかし、その後の機能hirは、コールバックのための非互換となります。 playground

ここでHRTBを使用する必要があると思われますか?

更新:

私の現在の回避策は、transuteを使用することです。 (playground)。確かに良い方法があるはずですか?

答えて

1
hir_visit::walk_crate(&mut visitor, visitor.map.krate()); 

解決策は、マップにも参照としてkrateが含まれていることを認識することでしたが、正しい生涯がありました。つまり、明示的な生涯を導入する必要はありません。

playground

関連する問題