diff options
| author | bors <bors@rust-lang.org> | 2016-02-04 15:44:35 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2016-02-04 15:44:35 +0000 |
| commit | f01b85b1034889888be65d2208640ac926a42d36 (patch) | |
| tree | e70747bfffb0d6092ec42577382e5d83a4dc5580 /src/libsyntax | |
| parent | e64ca8cd59c859e8ae4a8063c3f3146a05be01d1 (diff) | |
| parent | b361b7f1a5bd1d7a0a66b908a65c1fdfe65ae3bf (diff) | |
| download | rust-f01b85b1034889888be65d2208640ac926a42d36.tar.gz rust-f01b85b1034889888be65d2208640ac926a42d36.zip | |
Auto merge of #31382 - DanielJCampbell:SaveSpans, r=nrc
r? @nrc
Diffstat (limited to 'src/libsyntax')
| -rw-r--r-- | src/libsyntax/codemap.rs | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/src/libsyntax/codemap.rs b/src/libsyntax/codemap.rs index 9da5e1e3881..74302e2f6a0 100644 --- a/src/libsyntax/codemap.rs +++ b/src/libsyntax/codemap.rs @@ -1052,9 +1052,18 @@ impl CodeMap { /// the macro callsite that expanded to it. pub fn source_callsite(&self, sp: Span) -> Span { let mut span = sp; + // Special case - if a macro is parsed as an argument to another macro, the source + // callsite is the first callsite, which is also source-equivalent to the span. + let mut first = true; while span.expn_id != NO_EXPANSION && span.expn_id != COMMAND_LINE_EXPN { if let Some(callsite) = self.with_expn_info(span.expn_id, |ei| ei.map(|ei| ei.call_site.clone())) { + if first && span.source_equal(&callsite) { + if self.lookup_char_pos(span.lo).file.is_real_file() { + return Span { expn_id: NO_EXPANSION, .. span }; + } + } + first = false; span = callsite; } else { @@ -1071,10 +1080,20 @@ impl CodeMap { /// corresponding to the source callsite. pub fn source_callee(&self, sp: Span) -> Option<NameAndSpan> { let mut span = sp; + // Special case - if a macro is parsed as an argument to another macro, the source + // callsite is source-equivalent to the span, and the source callee is the first callee. + let mut first = true; while let Some(callsite) = self.with_expn_info(span.expn_id, |ei| ei.map(|ei| ei.call_site.clone())) { + if first && span.source_equal(&callsite) { + if self.lookup_char_pos(span.lo).file.is_real_file() { + return self.with_expn_info(span.expn_id, + |ei| ei.map(|ei| ei.callee.clone())); + } + } + first = false; if let Some(_) = self.with_expn_info(callsite.expn_id, - |ei| ei.map(|ei| ei.call_site.clone())) { + |ei| ei.map(|ei| ei.call_site.clone())) { span = callsite; } else { |
