rollup merge of #20425: sanxiyn/opt-local-ty

This avoids having ast::Ty nodes which have no counterpart in the source.
This commit is contained in:
Alex Crichton 2015-01-02 09:23:47 -08:00
commit 6f567e0c29
12 changed files with 50 additions and 28 deletions

View File

@ -649,7 +649,10 @@ fn resolve_local(visitor: &mut RegionResolutionVisitor, local: &ast::Local) {
Some(ref expr) => {
record_rvalue_scope_if_borrow_expr(visitor, &**expr, blk_scope);
if is_binding_pat(&*local.pat) || is_borrowed_ty(&*local.ty) {
let is_borrow =
if let Some(ref ty) = local.ty { is_borrowed_ty(&**ty) } else { false };
if is_binding_pat(&*local.pat) || is_borrow {
record_rvalue_scope(visitor, &**expr, blk_scope);
}
}

View File

@ -3401,7 +3401,9 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
fn resolve_local(&mut self, local: &Local) {
// Resolve the type.
self.resolve_type(&*local.ty);
if let Some(ref ty) = local.ty {
self.resolve_type(&**ty);
}
// Resolve the initializer, if necessary.
match local.init {

View File

@ -1495,7 +1495,7 @@ impl<'l, 'tcx, 'v> Visitor<'v> for DxrVisitor<'l, 'tcx> {
self.collected_paths.clear();
// Just walk the initialiser and type (don't want to walk the pattern again).
self.visit_ty(&*l.ty);
visit::walk_ty_opt(self, &l.ty);
visit::walk_expr_opt(self, &l.init);
}
}

View File

@ -507,9 +507,9 @@ impl<'a, 'tcx> GatherLocalsVisitor<'a, 'tcx> {
impl<'a, 'tcx, 'v> Visitor<'v> for GatherLocalsVisitor<'a, 'tcx> {
// Add explicitly-declared locals.
fn visit_local(&mut self, local: &ast::Local) {
let o_ty = match local.ty.node {
ast::TyInfer => None,
_ => Some(self.fcx.to_ty(&*local.ty))
let o_ty = match local.ty {
Some(ref ty) => Some(self.fcx.to_ty(&**ty)),
None => None
};
self.assign(local.span, local.id, o_ty);
debug!("Local variable {} is assigned type {}",

View File

@ -643,8 +643,8 @@ pub enum LocalSource {
/// Local represents a `let` statement, e.g., `let <pat>:<ty> = <expr>;`
#[deriving(Clone, PartialEq, Eq, RustcEncodable, RustcDecodable, Hash, Show)]
pub struct Local {
pub ty: P<Ty>,
pub pat: P<Pat>,
pub ty: Option<P<Ty>>,
pub init: Option<P<Expr>>,
pub id: NodeId,
pub span: Span,

View File

@ -482,8 +482,8 @@ impl<'a> AstBuilder for ExtCtxt<'a> {
self.pat_ident(sp, ident)
};
let local = P(ast::Local {
ty: self.ty_infer(sp),
pat: pat,
ty: None,
init: Some(ex),
id: ast::DUMMY_NODE_ID,
span: sp,
@ -506,8 +506,8 @@ impl<'a> AstBuilder for ExtCtxt<'a> {
self.pat_ident(sp, ident)
};
let local = P(ast::Local {
ty: typ,
pat: pat,
ty: Some(typ),
init: Some(ex),
id: ast::DUMMY_NODE_ID,
span: sp,

View File

@ -712,7 +712,7 @@ fn expand_non_macro_stmt(Spanned {node, span: stmt_span}: Stmt, fld: &mut MacroE
let rewritten_local = local.map(|Local {id, pat, ty, init, source, span}| {
// expand the ty since TyFixedLengthVec contains an Expr
// and thus may have a macro use
let expanded_ty = fld.fold_ty(ty);
let expanded_ty = ty.map(|t| fld.fold_ty(t));
// expand the pat (it might contain macro uses):
let expanded_pat = fld.fold_pat(pat);
// find the PatIdents in the pattern:

View File

@ -553,7 +553,7 @@ pub fn noop_fold_parenthesized_parameter_data<T: Folder>(data: ParenthesizedPara
pub fn noop_fold_local<T: Folder>(l: P<Local>, fld: &mut T) -> P<Local> {
l.map(|Local {id, pat, ty, init, source, span}| Local {
id: fld.new_id(id),
ty: fld.fold_ty(ty),
ty: ty.map(|t| fld.fold_ty(t)),
pat: fld.fold_pat(pat),
init: init.map(|e| fld.fold_expr(e)),
source: source,

View File

@ -3628,13 +3628,9 @@ impl<'a> Parser<'a> {
let lo = self.span.lo;
let pat = self.parse_pat();
let mut ty = P(Ty {
id: ast::DUMMY_NODE_ID,
node: TyInfer,
span: mk_sp(lo, lo),
});
let mut ty = None;
if self.eat(&token::Colon) {
ty = self.parse_ty_sum();
ty = Some(self.parse_ty_sum());
}
let init = self.parse_initializer();
P(ast::Local {

View File

@ -1858,13 +1858,11 @@ impl<'a> State<'a> {
pub fn print_local_decl(&mut self, loc: &ast::Local) -> IoResult<()> {
try!(self.print_pat(&*loc.pat));
match loc.ty.node {
ast::TyInfer => Ok(()),
_ => {
if let Some(ref ty) = loc.ty {
try!(self.word_space(":"));
self.print_type(&*loc.ty)
}
try!(self.print_type(&**ty));
}
Ok(())
}
pub fn print_decl(&mut self, decl: &ast::Decl) -> IoResult<()> {

View File

@ -211,7 +211,7 @@ pub fn walk_view_item<'v, V: Visitor<'v>>(visitor: &mut V, vi: &'v ViewItem) {
pub fn walk_local<'v, V: Visitor<'v>>(visitor: &mut V, local: &'v Local) {
visitor.visit_pat(&*local.pat);
visitor.visit_ty(&*local.ty);
walk_ty_opt(visitor, &local.ty);
walk_expr_opt(visitor, &local.init);
}
@ -381,6 +381,13 @@ pub fn skip_ty<'v, V: Visitor<'v>>(_: &mut V, _: &'v Ty) {
// Empty!
}
pub fn walk_ty_opt<'v, V: Visitor<'v>>(visitor: &mut V, optional_type: &'v Option<P<Ty>>) {
match *optional_type {
Some(ref ty) => visitor.visit_ty(&**ty),
None => ()
}
}
pub fn walk_ty<'v, V: Visitor<'v>>(visitor: &mut V, typ: &'v Ty) {
match typ.node {
TyVec(ref ty) | TyParen(ref ty) => {
@ -583,10 +590,7 @@ pub fn walk_ty_param_bound<'v, V: Visitor<'v>>(visitor: &mut V,
pub fn walk_ty_param<'v, V: Visitor<'v>>(visitor: &mut V, param: &'v TyParam) {
visitor.visit_ident(param.span, param.ident);
walk_ty_param_bounds_helper(visitor, &param.bounds);
match param.default {
Some(ref ty) => visitor.visit_ty(&**ty),
None => {}
}
walk_ty_opt(visitor, &param.default);
}
pub fn walk_generics<'v, V: Visitor<'v>>(visitor: &mut V, generics: &'v Generics) {

19
src/test/pretty/let.rs Normal file
View File

@ -0,0 +1,19 @@
// Copyright 2014 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
// pp-exact
// Check that `let x: _ = 0;` does not print as `let x = 0;`.
fn main() {
let x: _ = 0;
let _ = x;
}