about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorTim Neumann <mail@timnn.me>2015-08-10 20:40:46 +0200
committerTim Neumann <mail@timnn.me>2015-08-10 20:43:11 +0200
commitd46e84081f88f22198fbfcd5221faaf922e0500d (patch)
tree81c9a3bbaab8586673d96f05ba5bb7822fe1d9a3 /src
parentc115c513632b45d1a4d1b3fb648755a7023269e7 (diff)
downloadrust-d46e84081f88f22198fbfcd5221faaf922e0500d.tar.gz
rust-d46e84081f88f22198fbfcd5221faaf922e0500d.zip
add and use Span.substitute_dummy method
Diffstat (limited to 'src')
-rw-r--r--src/librustc/middle/traits/error_reporting.rs8
-rw-r--r--src/libsyntax/codemap.rs7
-rw-r--r--src/libsyntax/ext/tt/macro_rules.rs23
3 files changed, 15 insertions, 23 deletions
diff --git a/src/librustc/middle/traits/error_reporting.rs b/src/librustc/middle/traits/error_reporting.rs
index 582873082a6..1f79db9e523 100644
--- a/src/librustc/middle/traits/error_reporting.rs
+++ b/src/librustc/middle/traits/error_reporting.rs
@@ -29,7 +29,7 @@ use middle::ty::{self, ToPredicate, HasTypeFlags, ToPolyTraitRef, TraitRef};
 use middle::ty_fold::TypeFoldable;
 use std::collections::HashMap;
 use std::fmt;
-use syntax::codemap::{DUMMY_SP, Span};
+use syntax::codemap::Span;
 use syntax::attr::{AttributeMethods, AttrMetaMethods};
 
 pub fn report_fulfillment_errors<'a, 'tcx>(infcx: &InferCtxt<'a, 'tcx>,
@@ -81,11 +81,7 @@ fn report_on_unimplemented<'a, 'tcx>(infcx: &InferCtxt<'a, 'tcx>,
     let mut report = None;
     for item in infcx.tcx.get_attrs(def_id).iter() {
         if item.check_name("rustc_on_unimplemented") {
-            let err_sp = if item.meta().span == DUMMY_SP {
-                span
-            } else {
-                item.meta().span
-            };
+            let err_sp = item.meta().span.substitute_dummy(span);
             let def = infcx.tcx.lookup_trait_def(def_id);
             let trait_str = def.trait_ref.to_string();
             if let Some(ref istring) = item.value_str() {
diff --git a/src/libsyntax/codemap.rs b/src/libsyntax/codemap.rs
index 17e6b2c2e12..0aeb572b6bc 100644
--- a/src/libsyntax/codemap.rs
+++ b/src/libsyntax/codemap.rs
@@ -135,6 +135,13 @@ pub const COMMAND_LINE_SP: Span = Span { lo: BytePos(0),
                                          hi: BytePos(0),
                                          expn_id: COMMAND_LINE_EXPN };
 
+impl Span {
+    /// Returns `self` if `self` is not the dummy span, and `other` otherwise.
+    pub fn substitute_dummy(self, other: Span) -> Span {
+        if self == DUMMY_SP { other } else { self }
+    }
+}
+
 #[derive(Clone, PartialEq, Eq, RustcEncodable, RustcDecodable, Hash, Debug, Copy)]
 pub struct Spanned<T> {
     pub node: T,
diff --git a/src/libsyntax/ext/tt/macro_rules.rs b/src/libsyntax/ext/tt/macro_rules.rs
index 53e3127086c..d728fa59bd1 100644
--- a/src/libsyntax/ext/tt/macro_rules.rs
+++ b/src/libsyntax/ext/tt/macro_rules.rs
@@ -211,12 +211,8 @@ fn generic_extension<'cx>(cx: &'cx ExtCtxt,
                 best_fail_spot = sp;
                 best_fail_msg = (*msg).clone();
               },
-              Error(mut spp, ref msg) => {
-                if spp == DUMMY_SP {
-                    spp = sp;
-                }
-
-                panic!(cx.span_fatal(spp, &msg[..]))
+              Error(err_sp, ref msg) => {
+                panic!(cx.span_fatal(err_sp.substitute_dummy(sp), &msg[..]))
               }
             }
           }
@@ -224,11 +220,7 @@ fn generic_extension<'cx>(cx: &'cx ExtCtxt,
         }
     }
 
-    if best_fail_spot == DUMMY_SP {
-        best_fail_spot = sp;
-    }
-
-    panic!(cx.span_fatal(best_fail_spot, &best_fail_msg[..]));
+    panic!(cx.span_fatal(best_fail_spot.substitute_dummy(sp), &best_fail_msg[..]));
 }
 
 // Note that macro-by-example's input is also matched against a token tree:
@@ -283,12 +275,9 @@ pub fn compile<'cx>(cx: &'cx mut ExtCtxt,
                                    arg_reader,
                                    &argument_gram) {
         Success(m) => m,
-        Failure(mut sp, str) | Error(mut sp, str) => {
-            if sp == DUMMY_SP {
-                sp = def.span;
-            }
-
-            panic!(cx.parse_sess().span_diagnostic.span_fatal(sp, &str[..]));
+        Failure(sp, str) | Error(sp, str) => {
+            panic!(cx.parse_sess().span_diagnostic
+                     .span_fatal(sp.substitute_dummy(def.span), &str[..]));
         }
     };