2015-11-27 4 views
1

С текущими ночными моделями можно использовать rustc::middle::const_eval_partial(..), чтобы получить Result<ConstVal, _>. Однако, что ConstVal является Tuple { node: NodeId } для значений кортежа. Как я могу получить содержимое этого кортежа?Как получить кортеж из ConstVal?

Пример кода (здесь минимальный пух для использования в качестве компилятора плагина):

use rustc::lint::*; 
use syntax::ptr::P; 
use rustc_front::hir::*; 
use rustc::middle::const_eval::ConstVal::Tuple; 
use rustc::middle::const_eval::eval_const_expr_partial; 
use rustc::middle::const_eval::EvalHint::ExprTypeChecked; 

declare_lint! { pub TEST_LINT, Warn, "Just a test, ignore this" } 

#[derive(Copy,Clone)] 
pub struct TestLint; 

impl LintPass for TestLint { 
    fn get_lints(&self) -> LintArray { 
     lint_array!TEST_LINT) 
    } 
} 

impl LateLintPass for BitMask { 
    fn check_expr(&mut self, cx: &LateContext, e: &Expr) { 
     let res = eval_const_expr_partial(cx.tcx, expr, ExprTypeChecked, None); 
     if let Ok(Tuple(node_id))) = res { 
      // ... how to get the parts of the tuple? 
     } 
    } 
} 

ответ

2

Если вы посмотрите на коде для постоянной оценки выражения ExprTupField (индексирование в кортежи), вы можете увидеть, как извлечь определенную область:

if let hir::ExprTup(ref fields) = tcx.map.expect_expr(tup_id).node { 
    if index.node < fields.len() { 
     return eval_const_expr_partial(tcx, &fields[index.node], base_hint, fn_args) 
    } else { 
     signal!(e, TupleIndexOutOfBounds); 
    } 
} else { 
    unreachable!() 
} 

fields является Vec<P<Expr>>. Таким образом, вы можете перебрать этот Vec и позвонить eval_const_expr_partial, чтобы получить ConstVal поля кортежа.

Обратите внимание, что вы получите в беду, если кортеж был создан в const fn: https://github.com/rust-lang/rust/issues/29928

Смежные вопросы