Skip to content

Commit 19402f1

Browse files
committed
Auto merge of #45798 - nrc:rls-bugs-3, r=eddyb
A couple more save-analysis fixes r? @eddyb
2 parents 54bbd56 + b709a7e commit 19402f1

File tree

3 files changed

+48
-83
lines changed

3 files changed

+48
-83
lines changed

Diff for: src/librustc_save_analysis/dump_visitor.rs

+29-26
Original file line numberDiff line numberDiff line change
@@ -521,39 +521,41 @@ impl<'l, 'tcx: 'l, 'll, O: DumpOutput + 'll> DumpVisitor<'l, 'tcx, 'll, O> {
521521
item: &'l ast::Item,
522522
def: &'l ast::VariantData,
523523
ty_params: &'l ast::Generics) {
524+
debug!("process_struct {:?} {:?}", item, item.span);
524525
let name = item.ident.to_string();
525526
let qualname = format!("::{}", self.tcx.node_path_str(item.id));
526527

527-
let sub_span = self.span.sub_span_after_keyword(item.span, keywords::Struct);
528-
let (value, fields) =
529-
if let ast::ItemKind::Struct(ast::VariantData::Struct(ref fields, _), _) = item.node
530-
{
531-
let include_priv_fields = !self.save_ctxt.config.pub_only;
532-
let fields_str = fields
533-
.iter()
534-
.enumerate()
535-
.filter_map(|(i, f)| {
536-
if include_priv_fields || f.vis == ast::Visibility::Public {
537-
f.ident.map(|i| i.to_string()).or_else(|| Some(i.to_string()))
538-
} else {
539-
None
540-
}
541-
})
542-
.collect::<Vec<_>>()
543-
.join(", ");
544-
let value = format!("{} {{ {} }}", name, fields_str);
545-
(value, fields.iter().map(|f| ::id_from_node_id(f.id, &self.save_ctxt)).collect())
546-
} else {
547-
(String::new(), vec![])
528+
let (kind, keyword) = match item.node {
529+
ast::ItemKind::Struct(_, _) => (DefKind::Struct, keywords::Struct),
530+
ast::ItemKind::Union(_, _) => (DefKind::Union, keywords::Union),
531+
_ => unreachable!(),
532+
};
533+
534+
let sub_span = self.span.sub_span_after_keyword(item.span, keyword);
535+
let (value, fields) = match item.node {
536+
ast::ItemKind::Struct(ast::VariantData::Struct(ref fields, _), _) |
537+
ast::ItemKind::Union(ast::VariantData::Struct(ref fields, _), _) => {
538+
let include_priv_fields = !self.save_ctxt.config.pub_only;
539+
let fields_str = fields
540+
.iter()
541+
.enumerate()
542+
.filter_map(|(i, f)| {
543+
if include_priv_fields || f.vis == ast::Visibility::Public {
544+
f.ident.map(|i| i.to_string()).or_else(|| Some(i.to_string()))
545+
} else {
546+
None
547+
}
548+
})
549+
.collect::<Vec<_>>()
550+
.join(", ");
551+
let value = format!("{} {{ {} }}", name, fields_str);
552+
(value, fields.iter().map(|f| ::id_from_node_id(f.id, &self.save_ctxt)).collect())
553+
}
554+
_ => (String::new(), vec![])
548555
};
549556

550557
if !self.span.filter_generated(sub_span, item.span) {
551558
let span = self.span_from_span(sub_span.expect("No span found for struct"));
552-
let kind = match item.node {
553-
ast::ItemKind::Struct(_, _) => DefKind::Struct,
554-
ast::ItemKind::Union(_, _) => DefKind::Union,
555-
_ => unreachable!(),
556-
};
557559
self.dumper.dump_def(item.vis == ast::Visibility::Public, Def {
558560
kind,
559561
id: ::id_from_node_id(item.id, &self.save_ctxt),
@@ -876,6 +878,7 @@ impl<'l, 'tcx: 'l, 'll, O: DumpOutput + 'll> DumpVisitor<'l, 'tcx, 'll, O> {
876878
ex: &'l ast::Expr,
877879
seg: &'l ast::PathSegment,
878880
args: &'l [P<ast::Expr>]) {
881+
debug!("process_method_call {:?} {:?}", ex, ex.span);
879882
if let Some(mcd) = self.save_ctxt.get_expr_data(ex) {
880883
down_cast_data!(mcd, RefData, ex.span);
881884
if !generated_code(ex.span) {

Diff for: src/librustc_save_analysis/lib.rs

+18-15
Original file line numberDiff line numberDiff line change
@@ -546,16 +546,16 @@ impl<'l, 'tcx: 'l> SaveContext<'l, 'tcx> {
546546
}
547547
}
548548
}
549-
ast::ExprKind::MethodCall(..) => {
549+
ast::ExprKind::MethodCall(ref seg, ..) => {
550550
let expr_hir_id = self.tcx.hir.definitions().node_to_hir_id(expr.id);
551551
let method_id = self.tables.type_dependent_defs()[expr_hir_id].def_id();
552552
let (def_id, decl_id) = match self.tcx.associated_item(method_id).container {
553553
ty::ImplContainer(_) => (Some(method_id), None),
554554
ty::TraitContainer(_) => (None, Some(method_id)),
555555
};
556-
let sub_span = self.span_utils.sub_span_for_meth_name(expr.span);
557-
filter!(self.span_utils, sub_span, expr.span, None);
558-
let span = self.span_from_span(sub_span.unwrap());
556+
let sub_span = seg.span;
557+
filter!(self.span_utils, Some(sub_span), expr.span, None);
558+
let span = self.span_from_span(sub_span);
559559
Some(Data::RefData(Ref {
560560
kind: RefKind::Function,
561561
span,
@@ -627,13 +627,18 @@ impl<'l, 'tcx: 'l> SaveContext<'l, 'tcx> {
627627
false
628628
}
629629

630+
if path.segments.is_empty() {
631+
return None;
632+
}
633+
630634
let def = self.get_path_def(id);
631-
let sub_span = self.span_utils.span_for_last_ident(path.span);
632-
filter!(self.span_utils, sub_span, path.span, None);
635+
let last_seg = &path.segments[path.segments.len() - 1];
636+
let sub_span = last_seg.span;
637+
filter!(self.span_utils, Some(sub_span), path.span, None);
633638
match def {
634639
HirDef::Upvar(id, ..) |
635640
HirDef::Local(id) => {
636-
let span = self.span_from_span(sub_span.unwrap());
641+
let span = self.span_from_span(sub_span);
637642
Some(Ref {
638643
kind: RefKind::Variable,
639644
span,
@@ -644,7 +649,7 @@ impl<'l, 'tcx: 'l> SaveContext<'l, 'tcx> {
644649
HirDef::Const(..) |
645650
HirDef::AssociatedConst(..) |
646651
HirDef::VariantCtor(..) => {
647-
let span = self.span_from_span(sub_span.unwrap());
652+
let span = self.span_from_span(sub_span);
648653
Some(Ref {
649654
kind: RefKind::Variable,
650655
span,
@@ -670,7 +675,7 @@ impl<'l, 'tcx: 'l> SaveContext<'l, 'tcx> {
670675
HirDef::AssociatedTy(def_id) |
671676
HirDef::Trait(def_id) |
672677
HirDef::TyParam(def_id) => {
673-
let span = self.span_from_span(sub_span.unwrap());
678+
let span = self.span_from_span(sub_span);
674679
Some(Ref {
675680
kind: RefKind::Type,
676681
span,
@@ -681,7 +686,7 @@ impl<'l, 'tcx: 'l> SaveContext<'l, 'tcx> {
681686
// This is a reference to a tuple struct where the def_id points
682687
// to an invisible constructor function. That is not a very useful
683688
// def, so adjust to point to the tuple struct itself.
684-
let span = self.span_from_span(sub_span.unwrap());
689+
let span = self.span_from_span(sub_span);
685690
let parent_def_id = self.tcx.parent_def_id(def_id).unwrap();
686691
Some(Ref {
687692
kind: RefKind::Type,
@@ -690,8 +695,6 @@ impl<'l, 'tcx: 'l> SaveContext<'l, 'tcx> {
690695
})
691696
}
692697
HirDef::Method(decl_id) => {
693-
let sub_span = self.span_utils.sub_span_for_meth_name(path.span);
694-
filter!(self.span_utils, sub_span, path.span, None);
695698
let def_id = if decl_id.is_local() {
696699
let ti = self.tcx.associated_item(decl_id);
697700
self.tcx.associated_items(ti.container.id())
@@ -700,23 +703,23 @@ impl<'l, 'tcx: 'l> SaveContext<'l, 'tcx> {
700703
} else {
701704
None
702705
};
703-
let span = self.span_from_span(sub_span.unwrap());
706+
let span = self.span_from_span(sub_span);
704707
Some(Ref {
705708
kind: RefKind::Function,
706709
span,
707710
ref_id: id_from_def_id(def_id.unwrap_or(decl_id)),
708711
})
709712
}
710713
HirDef::Fn(def_id) => {
711-
let span = self.span_from_span(sub_span.unwrap());
714+
let span = self.span_from_span(sub_span);
712715
Some(Ref {
713716
kind: RefKind::Function,
714717
span,
715718
ref_id: id_from_def_id(def_id),
716719
})
717720
}
718721
HirDef::Mod(def_id) => {
719-
let span = self.span_from_span(sub_span.unwrap());
722+
let span = self.span_from_span(sub_span);
720723
Some(Ref {
721724
kind: RefKind::Mod,
722725
span,

Diff for: src/librustc_save_analysis/span_utils.rs

+1-42
Original file line numberDiff line numberDiff line change
@@ -103,47 +103,6 @@ impl<'a> SpanUtils<'a> {
103103
}
104104
}
105105

106-
// Return the span for the last ident before a `(` or `<` or '::<' and outside any
107-
// any brackets, or the last span.
108-
pub fn sub_span_for_meth_name(&self, span: Span) -> Option<Span> {
109-
let mut toks = self.retokenise_span(span);
110-
let mut prev = toks.real_token();
111-
let mut result = None;
112-
let mut bracket_count = 0;
113-
let mut prev_span = None;
114-
while prev.tok != token::Eof {
115-
prev_span = None;
116-
let mut next = toks.real_token();
117-
118-
if (next.tok == token::OpenDelim(token::Paren) || next.tok == token::Lt) &&
119-
bracket_count == 0 && prev.tok.is_ident() {
120-
result = Some(prev.sp);
121-
}
122-
123-
if bracket_count == 0 && next.tok == token::ModSep {
124-
let old = prev;
125-
prev = next;
126-
next = toks.real_token();
127-
if next.tok == token::Lt && old.tok.is_ident() {
128-
result = Some(old.sp);
129-
}
130-
}
131-
132-
bracket_count += match prev.tok {
133-
token::OpenDelim(token::Paren) | token::Lt => 1,
134-
token::CloseDelim(token::Paren) | token::Gt => -1,
135-
token::BinOp(token::Shr) => -2,
136-
_ => 0,
137-
};
138-
139-
if prev.tok.is_ident() && bracket_count == 0 {
140-
prev_span = Some(prev.sp);
141-
}
142-
prev = next;
143-
}
144-
result.or(prev_span)
145-
}
146-
147106
// Return the span for the last ident before a `<` and outside any
148107
// angle brackets, or the last span.
149108
pub fn sub_span_for_type_name(&self, span: Span) -> Option<Span> {
@@ -330,7 +289,7 @@ impl<'a> SpanUtils<'a> {
330289
}
331290

332291
macro_rules! filter {
333-
($util: expr, $span: ident, $parent: expr, None) => {
292+
($util: expr, $span: expr, $parent: expr, None) => {
334293
if $util.filter_generated($span, $parent) {
335294
return None;
336295
}

0 commit comments

Comments
 (0)