X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Flibsyntax_pos%2Flib.rs;h=f5449061b87fabed7eb3d096ebb3c3b5945823b7;hb=6f4ab9458a7ad06c8ce630604f533c8c0c0acef4;hp=3a701f91314b6b2a3084054b1fddec81580940fc;hpb=de5c5251f81106d8bae689520597adf352927ec3;p=rust.git diff --git a/src/libsyntax_pos/lib.rs b/src/libsyntax_pos/lib.rs index 3a701f91314..f5449061b87 100644 --- a/src/libsyntax_pos/lib.rs +++ b/src/libsyntax_pos/lib.rs @@ -153,6 +153,16 @@ pub fn allows_unstable(&self) -> bool { } } + /// Check if a span is "internal" to a macro in which `unsafe` + /// can be used without triggering the `unsafe_code` lint + // (that is, a macro marked with `#[allow_internal_unsafe]`). + pub fn allows_unsafe(&self) -> bool { + match self.ctxt.outer().expn_info() { + Some(info) => info.callee.allow_internal_unsafe, + None => false, + } + } + pub fn macro_backtrace(mut self) -> Vec { let mut prev_span = DUMMY_SP; let mut result = vec![]; @@ -174,8 +184,8 @@ pub fn macro_backtrace(mut self) -> Vec { if !info.call_site.source_equal(&prev_span) { result.push(MacroBacktrace { call_site: info.call_site, - macro_decl_name: macro_decl_name, - def_site_span: def_site_span, + macro_decl_name, + def_site_span, }); } @@ -348,7 +358,7 @@ pub fn span_labels(&self) -> Vec { for &(span, ref label) in &self.span_labels { span_labels.push(SpanLabel { - span: span, + span, is_primary: is_primary(span), label: Some(label.clone()) }); @@ -357,7 +367,7 @@ pub fn span_labels(&self) -> Vec { for &span in &self.primary_spans { if !span_labels.iter().any(|sl| sl.span == span) { span_labels.push(SpanLabel { - span: span, + span, is_primary: true, label: None }); @@ -546,16 +556,16 @@ fn decode(d: &mut D) -> Result { let multibyte_chars: Vec = d.read_struct_field("multibyte_chars", 5, |d| Decodable::decode(d))?; Ok(FileMap { - name: name, - name_was_remapped: name_was_remapped, + name, + name_was_remapped, // `crate_of_origin` has to be set by the importer. // This value matches up with rustc::hir::def_id::INVALID_CRATE. // That constant is not available here unfortunately :( crate_of_origin: ::std::u32::MAX - 1, - start_pos: start_pos, - end_pos: end_pos, + start_pos, + end_pos, src: None, - src_hash: src_hash, + src_hash, external_src: RefCell::new(ExternalSource::AbsentOk), lines: RefCell::new(lines), multibyte_chars: RefCell::new(multibyte_chars) @@ -584,13 +594,13 @@ pub fn new(name: FileName, let end_pos = start_pos.to_usize() + src.len(); FileMap { - name: name, - name_was_remapped: name_was_remapped, + name, + name_was_remapped, crate_of_origin: 0, src: Some(Rc::new(src)), - src_hash: src_hash, + src_hash, external_src: RefCell::new(ExternalSource::Unneeded), - start_pos: start_pos, + start_pos, end_pos: Pos::from_usize(end_pos), lines: RefCell::new(Vec::new()), multibyte_chars: RefCell::new(Vec::new()), @@ -618,8 +628,11 @@ pub fn next_line(&self, pos: BytePos) { /// If the hash of the input doesn't match or no input is supplied via None, /// it is interpreted as an error and the corresponding enum variant is set. /// The return value signifies whether some kind of source is present. - pub fn add_external_src(&self, src: Option) -> bool { + pub fn add_external_src(&self, get_src: F) -> bool + where F: FnOnce() -> Option + { if *self.external_src.borrow() == ExternalSource::AbsentOk { + let src = get_src(); let mut external_src = self.external_src.borrow_mut(); if let Some(src) = src { let mut hasher: StableHasher = StableHasher::new(); @@ -674,8 +687,8 @@ fn get_until_newline(src: &str, begin: usize) -> &str { pub fn record_multibyte_char(&self, pos: BytePos, bytes: usize) { assert!(bytes >=2 && bytes <= 4); let mbc = MultiByteChar { - pos: pos, - bytes: bytes, + pos, + bytes, }; self.multibyte_chars.borrow_mut().push(mbc); }