mirror of
https://github.com/rust-lang/rust.git
synced 2025-06-06 04:08:40 +00:00
De-@ codemap and diagnostic.
This commit is contained in:
parent
0bb6de3076
commit
871e570810
@ -1352,9 +1352,8 @@ fn add_upstream_rust_crates(args: &mut Vec<~str>, sess: &Session,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Converts a library file-stem into a cc -l argument
|
// Converts a library file-stem into a cc -l argument
|
||||||
fn unlib(config: @session::Config, stem: &str) -> ~str {
|
fn unlib(config: &session::Config, stem: &str) -> ~str {
|
||||||
if stem.starts_with("lib") &&
|
if stem.starts_with("lib") && config.os != abi::OsWin32 {
|
||||||
config.os != abi::OsWin32 {
|
|
||||||
stem.slice(3, stem.len()).to_owned()
|
stem.slice(3, stem.len()).to_owned()
|
||||||
} else {
|
} else {
|
||||||
stem.to_owned()
|
stem.to_owned()
|
||||||
@ -1434,7 +1433,7 @@ fn add_upstream_rust_crates(args: &mut Vec<~str>, sess: &Session,
|
|||||||
// what its name is
|
// what its name is
|
||||||
let dir = cratepath.dirname_str().unwrap();
|
let dir = cratepath.dirname_str().unwrap();
|
||||||
if !dir.is_empty() { args.push("-L" + dir); }
|
if !dir.is_empty() { args.push("-L" + dir); }
|
||||||
let libarg = unlib(sess.targ_cfg, cratepath.filestem_str().unwrap());
|
let libarg = unlib(&sess.targ_cfg, cratepath.filestem_str().unwrap());
|
||||||
args.push("-l" + libarg);
|
args.push("-l" + libarg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -27,7 +27,7 @@ use middle::{trans, freevars, kind, ty, typeck, lint, astencode, reachable};
|
|||||||
use middle;
|
use middle;
|
||||||
use util::common::time;
|
use util::common::time;
|
||||||
use util::ppaux;
|
use util::ppaux;
|
||||||
use util::nodemap::NodeSet;
|
use util::nodemap::{NodeMap, NodeSet};
|
||||||
|
|
||||||
use serialize::{json, Encodable};
|
use serialize::{json, Encodable};
|
||||||
|
|
||||||
@ -39,7 +39,6 @@ use std::mem::drop;
|
|||||||
use std::os;
|
use std::os;
|
||||||
use std::vec_ng::Vec;
|
use std::vec_ng::Vec;
|
||||||
use std::vec_ng;
|
use std::vec_ng;
|
||||||
use collections::HashMap;
|
|
||||||
use getopts::{optopt, optmulti, optflag, optflagopt};
|
use getopts::{optopt, optmulti, optflag, optflagopt};
|
||||||
use getopts;
|
use getopts;
|
||||||
use syntax::ast;
|
use syntax::ast;
|
||||||
@ -75,9 +74,9 @@ pub fn anon_src() -> ~str {
|
|||||||
|
|
||||||
pub fn source_name(input: &Input) -> ~str {
|
pub fn source_name(input: &Input) -> ~str {
|
||||||
match *input {
|
match *input {
|
||||||
// FIXME (#9639): This needs to handle non-utf8 paths
|
// FIXME (#9639): This needs to handle non-utf8 paths
|
||||||
FileInput(ref ifile) => ifile.as_str().unwrap().to_str(),
|
FileInput(ref ifile) => ifile.as_str().unwrap().to_str(),
|
||||||
StrInput(_) => anon_src()
|
StrInput(_) => anon_src()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -213,7 +212,7 @@ pub fn phase_2_configure_and_expand(sess: &Session,
|
|||||||
-> (ast::Crate, syntax::ast_map::Map) {
|
-> (ast::Crate, syntax::ast_map::Map) {
|
||||||
let time_passes = sess.time_passes();
|
let time_passes = sess.time_passes();
|
||||||
|
|
||||||
sess.building_library.set(session::building_library(sess.opts, &krate));
|
sess.building_library.set(session::building_library(&sess.opts, &krate));
|
||||||
sess.crate_types.set(session::collect_crate_types(sess,
|
sess.crate_types.set(session::collect_crate_types(sess,
|
||||||
krate.attrs
|
krate.attrs
|
||||||
.as_slice()));
|
.as_slice()));
|
||||||
@ -315,7 +314,7 @@ pub fn phase_3_run_analysis_passes(sess: Session,
|
|||||||
sess.macro_registrar_fn.with_mut(|r| *r =
|
sess.macro_registrar_fn.with_mut(|r| *r =
|
||||||
time(time_passes, "looking for macro registrar", (), |_|
|
time(time_passes, "looking for macro registrar", (), |_|
|
||||||
syntax::ext::registrar::find_macro_registrar(
|
syntax::ext::registrar::find_macro_registrar(
|
||||||
sess.span_diagnostic, krate)));
|
sess.diagnostic(), krate)));
|
||||||
|
|
||||||
let freevars = time(time_passes, "freevar finding", (), |_|
|
let freevars = time(time_passes, "freevar finding", (), |_|
|
||||||
freevars::annotate_freevars(def_map, krate));
|
freevars::annotate_freevars(def_map, krate));
|
||||||
@ -541,19 +540,14 @@ fn write_out_deps(sess: &Session,
|
|||||||
|
|
||||||
// Build a list of files used to compile the output and
|
// Build a list of files used to compile the output and
|
||||||
// write Makefile-compatible dependency rules
|
// write Makefile-compatible dependency rules
|
||||||
let files: Vec<~str> = {
|
let files: Vec<~str> = sess.codemap().files.borrow().get()
|
||||||
let files = sess.codemap.files.borrow();
|
.iter().filter_map(|fmap| {
|
||||||
files.get()
|
if fmap.deref().is_real_file() {
|
||||||
.iter()
|
Some(fmap.deref().name.clone())
|
||||||
.filter_map(|fmap| {
|
} else {
|
||||||
if fmap.is_real_file() {
|
None
|
||||||
Some(fmap.name.clone())
|
}
|
||||||
} else {
|
}).collect();
|
||||||
None
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.collect()
|
|
||||||
};
|
|
||||||
let mut file = try!(io::File::create(&deps_filename));
|
let mut file = try!(io::File::create(&deps_filename));
|
||||||
for path in out_filenames.iter() {
|
for path in out_filenames.iter() {
|
||||||
try!(write!(&mut file as &mut Writer,
|
try!(write!(&mut file as &mut Writer,
|
||||||
@ -741,8 +735,7 @@ static architecture_abis : &'static [(&'static str, abi::Architecture)] = &'stat
|
|||||||
|
|
||||||
("mips", abi::Mips)];
|
("mips", abi::Mips)];
|
||||||
|
|
||||||
pub fn build_target_config(sopts: @session::Options)
|
pub fn build_target_config(sopts: &session::Options) -> session::Config {
|
||||||
-> @session::Config {
|
|
||||||
let os = match get_os(sopts.target_triple) {
|
let os = match get_os(sopts.target_triple) {
|
||||||
Some(os) => os,
|
Some(os) => os,
|
||||||
None => early_error("unknown operating system")
|
None => early_error("unknown operating system")
|
||||||
@ -764,14 +757,13 @@ pub fn build_target_config(sopts: @session::Options)
|
|||||||
abi::Arm => arm::get_target_strs(target_triple, os),
|
abi::Arm => arm::get_target_strs(target_triple, os),
|
||||||
abi::Mips => mips::get_target_strs(target_triple, os)
|
abi::Mips => mips::get_target_strs(target_triple, os)
|
||||||
};
|
};
|
||||||
let target_cfg = @session::Config {
|
session::Config {
|
||||||
os: os,
|
os: os,
|
||||||
arch: arch,
|
arch: arch,
|
||||||
target_strs: target_strs,
|
target_strs: target_strs,
|
||||||
int_type: int_type,
|
int_type: int_type,
|
||||||
uint_type: uint_type,
|
uint_type: uint_type,
|
||||||
};
|
}
|
||||||
return target_cfg;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn host_triple() -> ~str {
|
pub fn host_triple() -> ~str {
|
||||||
@ -938,7 +930,7 @@ pub fn build_session_options(matches: &getopts::Matches)
|
|||||||
matches.opt_present("crate-file-name"));
|
matches.opt_present("crate-file-name"));
|
||||||
let cg = build_codegen_options(matches);
|
let cg = build_codegen_options(matches);
|
||||||
|
|
||||||
@session::Options {
|
session::Options {
|
||||||
crate_types: crate_types,
|
crate_types: crate_types,
|
||||||
gc: gc,
|
gc: gc,
|
||||||
optimize: opt_level,
|
optimize: opt_level,
|
||||||
@ -991,25 +983,24 @@ pub fn build_codegen_options(matches: &getopts::Matches)
|
|||||||
return cg;
|
return cg;
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn build_session(sopts: @session::Options,
|
pub fn build_session(sopts: session::Options,
|
||||||
local_crate_source_file: Option<Path>)
|
local_crate_source_file: Option<Path>)
|
||||||
-> Session {
|
-> Session {
|
||||||
let codemap = @codemap::CodeMap::new();
|
let codemap = codemap::CodeMap::new();
|
||||||
let diagnostic_handler =
|
let diagnostic_handler =
|
||||||
diagnostic::default_handler();
|
diagnostic::default_handler();
|
||||||
let span_diagnostic_handler =
|
let span_diagnostic_handler =
|
||||||
diagnostic::mk_span_handler(diagnostic_handler, codemap);
|
diagnostic::mk_span_handler(diagnostic_handler, codemap);
|
||||||
|
|
||||||
build_session_(sopts, local_crate_source_file, codemap, span_diagnostic_handler)
|
build_session_(sopts, local_crate_source_file, span_diagnostic_handler)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn build_session_(sopts: @session::Options,
|
pub fn build_session_(sopts: session::Options,
|
||||||
local_crate_source_file: Option<Path>,
|
local_crate_source_file: Option<Path>,
|
||||||
codemap: @codemap::CodeMap,
|
span_diagnostic: diagnostic::SpanHandler)
|
||||||
span_diagnostic_handler: @diagnostic::SpanHandler)
|
|
||||||
-> Session {
|
-> Session {
|
||||||
let target_cfg = build_target_config(sopts);
|
let target_cfg = build_target_config(&sopts);
|
||||||
let p_s = parse::new_parse_sess_special_handler(span_diagnostic_handler, codemap);
|
let p_s = parse::new_parse_sess_special_handler(span_diagnostic);
|
||||||
let default_sysroot = match sopts.maybe_sysroot {
|
let default_sysroot = match sopts.maybe_sysroot {
|
||||||
Some(_) => None,
|
Some(_) => None,
|
||||||
None => Some(filesearch::get_or_default_sysroot())
|
None => Some(filesearch::get_or_default_sysroot())
|
||||||
@ -1029,19 +1020,17 @@ pub fn build_session_(sopts: @session::Options,
|
|||||||
opts: sopts,
|
opts: sopts,
|
||||||
cstore: CStore::new(token::get_ident_interner()),
|
cstore: CStore::new(token::get_ident_interner()),
|
||||||
parse_sess: p_s,
|
parse_sess: p_s,
|
||||||
codemap: codemap,
|
|
||||||
// For a library crate, this is always none
|
// For a library crate, this is always none
|
||||||
entry_fn: RefCell::new(None),
|
entry_fn: RefCell::new(None),
|
||||||
entry_type: Cell::new(None),
|
entry_type: Cell::new(None),
|
||||||
macro_registrar_fn: RefCell::new(None),
|
macro_registrar_fn: RefCell::new(None),
|
||||||
span_diagnostic: span_diagnostic_handler,
|
|
||||||
default_sysroot: default_sysroot,
|
default_sysroot: default_sysroot,
|
||||||
building_library: Cell::new(false),
|
building_library: Cell::new(false),
|
||||||
local_crate_source_file: local_crate_source_file,
|
local_crate_source_file: local_crate_source_file,
|
||||||
working_dir: os::getcwd(),
|
working_dir: os::getcwd(),
|
||||||
lints: RefCell::new(HashMap::new()),
|
lints: RefCell::new(NodeMap::new()),
|
||||||
node_id: Cell::new(1),
|
node_id: Cell::new(1),
|
||||||
crate_types: @RefCell::new(Vec::new()),
|
crate_types: RefCell::new(Vec::new()),
|
||||||
features: front::feature_gate::Features::new(),
|
features: front::feature_gate::Features::new(),
|
||||||
recursion_limit: Cell::new(64),
|
recursion_limit: Cell::new(64),
|
||||||
}
|
}
|
||||||
|
@ -16,6 +16,7 @@ use front;
|
|||||||
use metadata::filesearch;
|
use metadata::filesearch;
|
||||||
use metadata;
|
use metadata;
|
||||||
use middle::lint;
|
use middle::lint;
|
||||||
|
use util::nodemap::NodeMap;
|
||||||
|
|
||||||
use syntax::attr::AttrMetaMethods;
|
use syntax::attr::AttrMetaMethods;
|
||||||
use syntax::ast::NodeId;
|
use syntax::ast::NodeId;
|
||||||
@ -28,7 +29,7 @@ use syntax;
|
|||||||
|
|
||||||
use std::cell::{Cell, RefCell};
|
use std::cell::{Cell, RefCell};
|
||||||
use std::vec_ng::Vec;
|
use std::vec_ng::Vec;
|
||||||
use collections::{HashMap,HashSet};
|
use collections::HashSet;
|
||||||
|
|
||||||
pub struct Config {
|
pub struct Config {
|
||||||
os: abi::Os,
|
os: abi::Os,
|
||||||
@ -174,15 +175,13 @@ pub enum CrateType {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub struct Session {
|
pub struct Session {
|
||||||
targ_cfg: @Config,
|
targ_cfg: Config,
|
||||||
opts: @Options,
|
opts: Options,
|
||||||
cstore: metadata::cstore::CStore,
|
cstore: metadata::cstore::CStore,
|
||||||
parse_sess: ParseSess,
|
parse_sess: ParseSess,
|
||||||
codemap: @codemap::CodeMap,
|
|
||||||
// For a library crate, this is always none
|
// For a library crate, this is always none
|
||||||
entry_fn: RefCell<Option<(NodeId, codemap::Span)>>,
|
entry_fn: RefCell<Option<(NodeId, codemap::Span)>>,
|
||||||
entry_type: Cell<Option<EntryFnType>>,
|
entry_type: Cell<Option<EntryFnType>>,
|
||||||
span_diagnostic: @diagnostic::SpanHandler,
|
|
||||||
macro_registrar_fn: RefCell<Option<ast::DefId>>,
|
macro_registrar_fn: RefCell<Option<ast::DefId>>,
|
||||||
default_sysroot: Option<Path>,
|
default_sysroot: Option<Path>,
|
||||||
building_library: Cell<bool>,
|
building_library: Cell<bool>,
|
||||||
@ -190,10 +189,9 @@ pub struct Session {
|
|||||||
// expected to be absolute. `None` means that there is no source file.
|
// expected to be absolute. `None` means that there is no source file.
|
||||||
local_crate_source_file: Option<Path>,
|
local_crate_source_file: Option<Path>,
|
||||||
working_dir: Path,
|
working_dir: Path,
|
||||||
lints: RefCell<HashMap<ast::NodeId,
|
lints: RefCell<NodeMap<Vec<(lint::Lint, codemap::Span, ~str)>>>,
|
||||||
Vec<(lint::Lint, codemap::Span, ~str)> >>,
|
|
||||||
node_id: Cell<ast::NodeId>,
|
node_id: Cell<ast::NodeId>,
|
||||||
crate_types: @RefCell<Vec<CrateType> >,
|
crate_types: RefCell<Vec<CrateType>>,
|
||||||
features: front::feature_gate::Features,
|
features: front::feature_gate::Features,
|
||||||
|
|
||||||
/// The maximum recursion limit for potentially infinitely recursive
|
/// The maximum recursion limit for potentially infinitely recursive
|
||||||
@ -203,52 +201,52 @@ pub struct Session {
|
|||||||
|
|
||||||
impl Session {
|
impl Session {
|
||||||
pub fn span_fatal(&self, sp: Span, msg: &str) -> ! {
|
pub fn span_fatal(&self, sp: Span, msg: &str) -> ! {
|
||||||
self.span_diagnostic.span_fatal(sp, msg)
|
self.diagnostic().span_fatal(sp, msg)
|
||||||
}
|
}
|
||||||
pub fn fatal(&self, msg: &str) -> ! {
|
pub fn fatal(&self, msg: &str) -> ! {
|
||||||
self.span_diagnostic.handler().fatal(msg)
|
self.diagnostic().handler().fatal(msg)
|
||||||
}
|
}
|
||||||
pub fn span_err(&self, sp: Span, msg: &str) {
|
pub fn span_err(&self, sp: Span, msg: &str) {
|
||||||
self.span_diagnostic.span_err(sp, msg)
|
self.diagnostic().span_err(sp, msg)
|
||||||
}
|
}
|
||||||
pub fn err(&self, msg: &str) {
|
pub fn err(&self, msg: &str) {
|
||||||
self.span_diagnostic.handler().err(msg)
|
self.diagnostic().handler().err(msg)
|
||||||
}
|
}
|
||||||
pub fn err_count(&self) -> uint {
|
pub fn err_count(&self) -> uint {
|
||||||
self.span_diagnostic.handler().err_count()
|
self.diagnostic().handler().err_count()
|
||||||
}
|
}
|
||||||
pub fn has_errors(&self) -> bool {
|
pub fn has_errors(&self) -> bool {
|
||||||
self.span_diagnostic.handler().has_errors()
|
self.diagnostic().handler().has_errors()
|
||||||
}
|
}
|
||||||
pub fn abort_if_errors(&self) {
|
pub fn abort_if_errors(&self) {
|
||||||
self.span_diagnostic.handler().abort_if_errors()
|
self.diagnostic().handler().abort_if_errors()
|
||||||
}
|
}
|
||||||
pub fn span_warn(&self, sp: Span, msg: &str) {
|
pub fn span_warn(&self, sp: Span, msg: &str) {
|
||||||
self.span_diagnostic.span_warn(sp, msg)
|
self.diagnostic().span_warn(sp, msg)
|
||||||
}
|
}
|
||||||
pub fn warn(&self, msg: &str) {
|
pub fn warn(&self, msg: &str) {
|
||||||
self.span_diagnostic.handler().warn(msg)
|
self.diagnostic().handler().warn(msg)
|
||||||
}
|
}
|
||||||
pub fn span_note(&self, sp: Span, msg: &str) {
|
pub fn span_note(&self, sp: Span, msg: &str) {
|
||||||
self.span_diagnostic.span_note(sp, msg)
|
self.diagnostic().span_note(sp, msg)
|
||||||
}
|
}
|
||||||
pub fn span_end_note(&self, sp: Span, msg: &str) {
|
pub fn span_end_note(&self, sp: Span, msg: &str) {
|
||||||
self.span_diagnostic.span_end_note(sp, msg)
|
self.diagnostic().span_end_note(sp, msg)
|
||||||
}
|
}
|
||||||
pub fn note(&self, msg: &str) {
|
pub fn note(&self, msg: &str) {
|
||||||
self.span_diagnostic.handler().note(msg)
|
self.diagnostic().handler().note(msg)
|
||||||
}
|
}
|
||||||
pub fn span_bug(&self, sp: Span, msg: &str) -> ! {
|
pub fn span_bug(&self, sp: Span, msg: &str) -> ! {
|
||||||
self.span_diagnostic.span_bug(sp, msg)
|
self.diagnostic().span_bug(sp, msg)
|
||||||
}
|
}
|
||||||
pub fn bug(&self, msg: &str) -> ! {
|
pub fn bug(&self, msg: &str) -> ! {
|
||||||
self.span_diagnostic.handler().bug(msg)
|
self.diagnostic().handler().bug(msg)
|
||||||
}
|
}
|
||||||
pub fn span_unimpl(&self, sp: Span, msg: &str) -> ! {
|
pub fn span_unimpl(&self, sp: Span, msg: &str) -> ! {
|
||||||
self.span_diagnostic.span_unimpl(sp, msg)
|
self.diagnostic().span_unimpl(sp, msg)
|
||||||
}
|
}
|
||||||
pub fn unimpl(&self, msg: &str) -> ! {
|
pub fn unimpl(&self, msg: &str) -> ! {
|
||||||
self.span_diagnostic.handler().unimpl(msg)
|
self.diagnostic().handler().unimpl(msg)
|
||||||
}
|
}
|
||||||
pub fn add_lint(&self,
|
pub fn add_lint(&self,
|
||||||
lint: lint::Lint,
|
lint: lint::Lint,
|
||||||
@ -275,12 +273,15 @@ impl Session {
|
|||||||
|
|
||||||
v
|
v
|
||||||
}
|
}
|
||||||
pub fn diagnostic(&self) -> @diagnostic::SpanHandler {
|
pub fn diagnostic<'a>(&'a self) -> &'a diagnostic::SpanHandler {
|
||||||
self.span_diagnostic
|
&self.parse_sess.span_diagnostic
|
||||||
}
|
}
|
||||||
pub fn debugging_opt(&self, opt: u64) -> bool {
|
pub fn debugging_opt(&self, opt: u64) -> bool {
|
||||||
(self.opts.debugging_opts & opt) != 0
|
(self.opts.debugging_opts & opt) != 0
|
||||||
}
|
}
|
||||||
|
pub fn codemap<'a>(&'a self) -> &'a codemap::CodeMap {
|
||||||
|
&self.parse_sess.span_diagnostic.cm
|
||||||
|
}
|
||||||
// This exists to help with refactoring to eliminate impossible
|
// This exists to help with refactoring to eliminate impossible
|
||||||
// cases later on
|
// cases later on
|
||||||
pub fn impossible_case(&self, sp: Span, msg: &str) -> ! {
|
pub fn impossible_case(&self, sp: Span, msg: &str) -> ! {
|
||||||
@ -328,8 +329,8 @@ impl Session {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Some reasonable defaults
|
/// Some reasonable defaults
|
||||||
pub fn basic_options() -> @Options {
|
pub fn basic_options() -> Options {
|
||||||
@Options {
|
Options {
|
||||||
crate_types: Vec::new(),
|
crate_types: Vec::new(),
|
||||||
gc: false,
|
gc: false,
|
||||||
optimize: No,
|
optimize: No,
|
||||||
|
@ -295,26 +295,26 @@ pub fn run_compiler(args: &[~str]) {
|
|||||||
d::parse_pretty(&sess, a)
|
d::parse_pretty(&sess, a)
|
||||||
});
|
});
|
||||||
match pretty {
|
match pretty {
|
||||||
Some::<d::PpMode>(ppm) => {
|
Some::<d::PpMode>(ppm) => {
|
||||||
d::pretty_print_input(sess, cfg, &input, ppm);
|
d::pretty_print_input(sess, cfg, &input, ppm);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
None::<d::PpMode> => {/* continue */ }
|
None::<d::PpMode> => {/* continue */ }
|
||||||
}
|
}
|
||||||
let ls = matches.opt_present("ls");
|
let ls = matches.opt_present("ls");
|
||||||
if ls {
|
if ls {
|
||||||
match input {
|
match input {
|
||||||
d::FileInput(ref ifile) => {
|
d::FileInput(ref ifile) => {
|
||||||
let mut stdout = io::stdout();
|
let mut stdout = io::stdout();
|
||||||
d::list_metadata(&sess, &(*ifile), &mut stdout).unwrap();
|
d::list_metadata(&sess, &(*ifile), &mut stdout).unwrap();
|
||||||
}
|
}
|
||||||
d::StrInput(_) => {
|
d::StrInput(_) => {
|
||||||
d::early_error("can not list metadata for stdin");
|
d::early_error("can not list metadata for stdin");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
let (crate_id, crate_name, crate_file_name) = sopts.print_metas;
|
let (crate_id, crate_name, crate_file_name) = sess.opts.print_metas;
|
||||||
// these nasty nested conditions are to avoid doing extra work
|
// these nasty nested conditions are to avoid doing extra work
|
||||||
if crate_id || crate_name || crate_file_name {
|
if crate_id || crate_name || crate_file_name {
|
||||||
let attrs = parse_crate_attrs(&sess, &input);
|
let attrs = parse_crate_attrs(&sess, &input);
|
||||||
|
@ -88,7 +88,7 @@ fn dump_crates(crate_cache: &[cache_entry]) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn warn_if_multiple_versions(e: &mut Env,
|
fn warn_if_multiple_versions(e: &mut Env,
|
||||||
diag: @SpanHandler,
|
diag: &SpanHandler,
|
||||||
crate_cache: &[cache_entry]) {
|
crate_cache: &[cache_entry]) {
|
||||||
if crate_cache.len() != 0u {
|
if crate_cache.len() != 0u {
|
||||||
let name = crate_cache[crate_cache.len() - 1].crate_id.name.clone();
|
let name = crate_cache[crate_cache.len() - 1].crate_id.name.clone();
|
||||||
|
@ -214,11 +214,11 @@ pub fn get_field_type(tcx: &ty::ctxt, class_id: ast::DefId,
|
|||||||
let cstore = &tcx.sess.cstore;
|
let cstore = &tcx.sess.cstore;
|
||||||
let cdata = cstore.get_crate_data(class_id.krate);
|
let cdata = cstore.get_crate_data(class_id.krate);
|
||||||
let all_items = reader::get_doc(reader::Doc(cdata.data()), tag_items);
|
let all_items = reader::get_doc(reader::Doc(cdata.data()), tag_items);
|
||||||
let class_doc = expect(tcx.diag,
|
let class_doc = expect(tcx.sess.diagnostic(),
|
||||||
decoder::maybe_find_item(class_id.node, all_items),
|
decoder::maybe_find_item(class_id.node, all_items),
|
||||||
|| format!("get_field_type: class ID {:?} not found",
|
|| format!("get_field_type: class ID {:?} not found",
|
||||||
class_id) );
|
class_id) );
|
||||||
let the_field = expect(tcx.diag,
|
let the_field = expect(tcx.sess.diagnostic(),
|
||||||
decoder::maybe_find_item(def.node, class_doc),
|
decoder::maybe_find_item(def.node, class_doc),
|
||||||
|| format!("get_field_type: in class {:?}, field ID {:?} not found",
|
|| format!("get_field_type: in class {:?}, field ID {:?} not found",
|
||||||
class_id, def) );
|
class_id, def) );
|
||||||
|
@ -68,7 +68,7 @@ pub type EncodeInlinedItem<'a> = 'a |ecx: &EncodeContext,
|
|||||||
ii: InlinedItemRef|;
|
ii: InlinedItemRef|;
|
||||||
|
|
||||||
pub struct EncodeParams<'a> {
|
pub struct EncodeParams<'a> {
|
||||||
diag: @SpanHandler,
|
diag: &'a SpanHandler,
|
||||||
tcx: &'a ty::ctxt,
|
tcx: &'a ty::ctxt,
|
||||||
reexports2: middle::resolve::ExportMap2,
|
reexports2: middle::resolve::ExportMap2,
|
||||||
item_symbols: &'a RefCell<NodeMap<~str>>,
|
item_symbols: &'a RefCell<NodeMap<~str>>,
|
||||||
@ -95,7 +95,7 @@ pub struct Stats {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub struct EncodeContext<'a> {
|
pub struct EncodeContext<'a> {
|
||||||
diag: @SpanHandler,
|
diag: &'a SpanHandler,
|
||||||
tcx: &'a ty::ctxt,
|
tcx: &'a ty::ctxt,
|
||||||
stats: @Stats,
|
stats: @Stats,
|
||||||
reexports2: middle::resolve::ExportMap2,
|
reexports2: middle::resolve::ExportMap2,
|
||||||
@ -904,7 +904,7 @@ fn encode_info_for_item(ecx: &EncodeContext,
|
|||||||
}
|
}
|
||||||
|
|
||||||
debug!("encoding info for item at {}",
|
debug!("encoding info for item at {}",
|
||||||
ecx.tcx.sess.codemap.span_to_str(item.span));
|
ecx.tcx.sess.codemap().span_to_str(item.span));
|
||||||
|
|
||||||
let def_id = local_def(item.id);
|
let def_id = local_def(item.id);
|
||||||
match item.node {
|
match item.node {
|
||||||
@ -1630,7 +1630,7 @@ impl<'a, 'b> Visitor<()> for MacroDefVisitor<'a, 'b> {
|
|||||||
fn visit_item(&mut self, item: &Item, _: ()) {
|
fn visit_item(&mut self, item: &Item, _: ()) {
|
||||||
match item.node {
|
match item.node {
|
||||||
ItemMac(..) => {
|
ItemMac(..) => {
|
||||||
let def = self.ecx.tcx.sess.codemap.span_to_snippet(item.span)
|
let def = self.ecx.tcx.sess.codemap().span_to_snippet(item.span)
|
||||||
.expect("Unable to find source for macro");
|
.expect("Unable to find source for macro");
|
||||||
self.ebml_w.start_tag(tag_macro_def);
|
self.ebml_w.start_tag(tag_macro_def);
|
||||||
self.ebml_w.wr_str(def);
|
self.ebml_w.wr_str(def);
|
||||||
@ -1901,7 +1901,7 @@ fn encode_metadata_inner(wr: &mut MemWriter, parms: EncodeParams, krate: &Crate)
|
|||||||
// Get the encoded string for a type
|
// Get the encoded string for a type
|
||||||
pub fn encoded_ty(tcx: &ty::ctxt, t: ty::t) -> ~str {
|
pub fn encoded_ty(tcx: &ty::ctxt, t: ty::t) -> ~str {
|
||||||
let cx = &tyencode::ctxt {
|
let cx = &tyencode::ctxt {
|
||||||
diag: tcx.diag,
|
diag: tcx.sess.diagnostic(),
|
||||||
ds: def_to_str,
|
ds: def_to_str,
|
||||||
tcx: tcx,
|
tcx: tcx,
|
||||||
abbrevs: tyencode::ac_no_abbrevs};
|
abbrevs: tyencode::ac_no_abbrevs};
|
||||||
|
@ -352,7 +352,7 @@ impl<'a> Context<'a> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn note_crateid_attr(diag: @SpanHandler, crateid: &CrateId) {
|
pub fn note_crateid_attr(diag: &SpanHandler, crateid: &CrateId) {
|
||||||
diag.handler().note(format!("crate_id: {}", crateid.to_str()));
|
diag.handler().note(format!("crate_id: {}", crateid.to_str()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -29,16 +29,15 @@ use syntax::ast;
|
|||||||
use syntax::ast::*;
|
use syntax::ast::*;
|
||||||
use syntax::diagnostic::SpanHandler;
|
use syntax::diagnostic::SpanHandler;
|
||||||
use syntax::parse::token;
|
use syntax::parse::token;
|
||||||
use syntax::print::pprust::*;
|
|
||||||
|
|
||||||
macro_rules! mywrite( ($wr:expr, $($arg:tt)*) => (
|
macro_rules! mywrite( ($wr:expr, $($arg:tt)*) => (
|
||||||
format_args!(|a| { mywrite($wr, a) }, $($arg)*)
|
format_args!(|a| { mywrite($wr, a) }, $($arg)*)
|
||||||
) )
|
) )
|
||||||
|
|
||||||
pub struct ctxt<'a> {
|
pub struct ctxt<'a> {
|
||||||
diag: @SpanHandler,
|
diag: &'a SpanHandler,
|
||||||
// Def -> str Callback:
|
// Def -> str Callback:
|
||||||
ds: extern "Rust" fn(DefId) -> ~str,
|
ds: fn(DefId) -> ~str,
|
||||||
// The type context.
|
// The type context.
|
||||||
tcx: &'a ty::ctxt,
|
tcx: &'a ty::ctxt,
|
||||||
abbrevs: abbrev_ctxt
|
abbrevs: abbrev_ctxt
|
||||||
|
@ -153,7 +153,7 @@ enum LiveNodeKind {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn live_node_kind_to_str(lnk: LiveNodeKind, cx: &ty::ctxt) -> ~str {
|
fn live_node_kind_to_str(lnk: LiveNodeKind, cx: &ty::ctxt) -> ~str {
|
||||||
let cm = cx.sess.codemap;
|
let cm = cx.sess.codemap();
|
||||||
match lnk {
|
match lnk {
|
||||||
FreeVarNode(s) => format!("Free var node [{}]", cm.span_to_str(s)),
|
FreeVarNode(s) => format!("Free var node [{}]", cm.span_to_str(s)),
|
||||||
ExprNode(s) => format!("Expr node [{}]", cm.span_to_str(s)),
|
ExprNode(s) => format!("Expr node [{}]", cm.span_to_str(s)),
|
||||||
|
@ -847,7 +847,7 @@ fn resolve_fn(visitor: &mut RegionResolutionVisitor,
|
|||||||
body.id={}, \
|
body.id={}, \
|
||||||
cx.parent={})",
|
cx.parent={})",
|
||||||
id,
|
id,
|
||||||
visitor.sess.codemap.span_to_str(sp),
|
visitor.sess.codemap().span_to_str(sp),
|
||||||
body.id,
|
body.id,
|
||||||
cx.parent);
|
cx.parent);
|
||||||
|
|
||||||
|
@ -3275,7 +3275,7 @@ impl<'a> Resolver<'a> {
|
|||||||
let import_count = imports.get().len();
|
let import_count = imports.get().len();
|
||||||
if index != import_count {
|
if index != import_count {
|
||||||
let sn = self.session
|
let sn = self.session
|
||||||
.codemap
|
.codemap()
|
||||||
.span_to_snippet(imports.get().get(index).span)
|
.span_to_snippet(imports.get().get(index).span)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
if sn.contains("::") {
|
if sn.contains("::") {
|
||||||
@ -5449,7 +5449,7 @@ impl<'a> Resolver<'a> {
|
|||||||
// public or private item, we will check the correct thing, dependent on how the import
|
// public or private item, we will check the correct thing, dependent on how the import
|
||||||
// is used.
|
// is used.
|
||||||
fn finalize_import(&mut self, id: NodeId, span: Span) {
|
fn finalize_import(&mut self, id: NodeId, span: Span) {
|
||||||
debug!("finalizing import uses for {}", self.session.codemap.span_to_snippet(span));
|
debug!("finalizing import uses for {}", self.session.codemap().span_to_snippet(span));
|
||||||
|
|
||||||
if !self.used_imports.contains(&(id, TypeNS)) &&
|
if !self.used_imports.contains(&(id, TypeNS)) &&
|
||||||
!self.used_imports.contains(&(id, ValueNS)) {
|
!self.used_imports.contains(&(id, ValueNS)) {
|
||||||
|
@ -749,7 +749,7 @@ impl<'a> Builder<'a> {
|
|||||||
|
|
||||||
pub fn add_span_comment(&self, sp: Span, text: &str) {
|
pub fn add_span_comment(&self, sp: Span, text: &str) {
|
||||||
if self.ccx.sess().asm_comments() {
|
if self.ccx.sess().asm_comments() {
|
||||||
let s = format!("{} ({})", text, self.ccx.sess().codemap.span_to_str(sp));
|
let s = format!("{} ({})", text, self.ccx.sess().codemap().span_to_str(sp));
|
||||||
debug!("{}", s);
|
debug!("{}", s);
|
||||||
self.add_comment(s);
|
self.add_comment(s);
|
||||||
}
|
}
|
||||||
|
@ -941,9 +941,9 @@ pub fn dummy_substs(tps: Vec<ty::t> ) -> ty::substs {
|
|||||||
|
|
||||||
pub fn filename_and_line_num_from_span(bcx: &Block, span: Span)
|
pub fn filename_and_line_num_from_span(bcx: &Block, span: Span)
|
||||||
-> (ValueRef, ValueRef) {
|
-> (ValueRef, ValueRef) {
|
||||||
let loc = bcx.sess().parse_sess.cm.lookup_char_pos(span.lo);
|
let loc = bcx.sess().codemap().lookup_char_pos(span.lo);
|
||||||
let filename_cstr = C_cstr(bcx.ccx(),
|
let filename_cstr = C_cstr(bcx.ccx(),
|
||||||
token::intern_and_get_ident(loc.file.name));
|
token::intern_and_get_ident(loc.file.deref().name));
|
||||||
let filename = build::PointerCast(bcx, filename_cstr, Type::i8p(bcx.ccx()));
|
let filename = build::PointerCast(bcx, filename_cstr, Type::i8p(bcx.ccx()));
|
||||||
let line = C_int(bcx.ccx(), loc.line as int);
|
let line = C_int(bcx.ccx(), loc.line as int);
|
||||||
(filename, line)
|
(filename, line)
|
||||||
|
@ -132,13 +132,11 @@ impl CrateContext {
|
|||||||
let metadata_llmod = format!("{}_metadata", name).with_c_str(|buf| {
|
let metadata_llmod = format!("{}_metadata", name).with_c_str(|buf| {
|
||||||
llvm::LLVMModuleCreateWithNameInContext(buf, llcx)
|
llvm::LLVMModuleCreateWithNameInContext(buf, llcx)
|
||||||
});
|
});
|
||||||
let data_layout: &str = tcx.sess.targ_cfg.target_strs.data_layout;
|
tcx.sess.targ_cfg.target_strs.data_layout.with_c_str(|buf| {
|
||||||
let targ_triple: &str = tcx.sess.targ_cfg.target_strs.target_triple;
|
|
||||||
data_layout.with_c_str(|buf| {
|
|
||||||
llvm::LLVMSetDataLayout(llmod, buf);
|
llvm::LLVMSetDataLayout(llmod, buf);
|
||||||
llvm::LLVMSetDataLayout(metadata_llmod, buf);
|
llvm::LLVMSetDataLayout(metadata_llmod, buf);
|
||||||
});
|
});
|
||||||
targ_triple.with_c_str(|buf| {
|
tcx.sess.targ_cfg.target_strs.target_triple.with_c_str(|buf| {
|
||||||
llvm::LLVMRustSetNormalizedTarget(llmod, buf);
|
llvm::LLVMRustSetNormalizedTarget(llmod, buf);
|
||||||
llvm::LLVMRustSetNormalizedTarget(metadata_llmod, buf);
|
llvm::LLVMRustSetNormalizedTarget(metadata_llmod, buf);
|
||||||
});
|
});
|
||||||
|
@ -331,13 +331,11 @@ pub fn trans_fail<'a>(
|
|||||||
sp: Span,
|
sp: Span,
|
||||||
fail_str: InternedString)
|
fail_str: InternedString)
|
||||||
-> &'a Block<'a> {
|
-> &'a Block<'a> {
|
||||||
let v_fail_str = C_cstr(bcx.ccx(), fail_str);
|
|
||||||
let _icx = push_ctxt("trans_fail_value");
|
|
||||||
let ccx = bcx.ccx();
|
let ccx = bcx.ccx();
|
||||||
let sess = bcx.sess();
|
let v_fail_str = C_cstr(ccx, fail_str);
|
||||||
let loc = sess.parse_sess.cm.lookup_char_pos(sp.lo);
|
let _icx = push_ctxt("trans_fail_value");
|
||||||
let v_filename = C_cstr(bcx.ccx(),
|
let loc = bcx.sess().codemap().lookup_char_pos(sp.lo);
|
||||||
token::intern_and_get_ident(loc.file.name));
|
let v_filename = C_cstr(ccx, token::intern_and_get_ident(loc.file.deref().name));
|
||||||
let v_line = loc.line as int;
|
let v_line = loc.line as int;
|
||||||
let v_str = PointerCast(bcx, v_fail_str, Type::i8p(ccx));
|
let v_str = PointerCast(bcx, v_fail_str, Type::i8p(ccx));
|
||||||
let v_filename = PointerCast(bcx, v_filename, Type::i8p(ccx));
|
let v_filename = PointerCast(bcx, v_filename, Type::i8p(ccx));
|
||||||
|
@ -485,7 +485,7 @@ pub fn set_source_location(fcx: &FunctionContext,
|
|||||||
|
|
||||||
let cx = fcx.ccx;
|
let cx = fcx.ccx;
|
||||||
|
|
||||||
debug!("set_source_location: {}", cx.sess().codemap.span_to_str(span));
|
debug!("set_source_location: {}", cx.sess().codemap().span_to_str(span));
|
||||||
|
|
||||||
if fcx.debug_context.get_ref(cx, span).source_locations_enabled.get() {
|
if fcx.debug_context.get_ref(cx, span).source_locations_enabled.get() {
|
||||||
let loc = span_start(cx, span);
|
let loc = span_start(cx, span);
|
||||||
@ -616,7 +616,7 @@ pub fn create_function_debug_context(cx: &CrateContext,
|
|||||||
}
|
}
|
||||||
|
|
||||||
let loc = span_start(cx, span);
|
let loc = span_start(cx, span);
|
||||||
let file_metadata = file_metadata(cx, loc.file.name);
|
let file_metadata = file_metadata(cx, loc.file.deref().name);
|
||||||
|
|
||||||
let function_type_metadata = unsafe {
|
let function_type_metadata = unsafe {
|
||||||
let fn_signature = get_function_signature(cx, fn_ast_id, fn_decl, param_substs, span);
|
let fn_signature = get_function_signature(cx, fn_ast_id, fn_decl, param_substs, span);
|
||||||
@ -939,7 +939,7 @@ fn declare_local(bcx: &Block,
|
|||||||
span: Span) {
|
span: Span) {
|
||||||
let cx: &CrateContext = bcx.ccx();
|
let cx: &CrateContext = bcx.ccx();
|
||||||
|
|
||||||
let filename = span_start(cx, span).file.name.clone();
|
let filename = span_start(cx, span).file.deref().name.clone();
|
||||||
let file_metadata = file_metadata(cx, filename);
|
let file_metadata = file_metadata(cx, filename);
|
||||||
|
|
||||||
let name = token::get_ident(variable_ident);
|
let name = token::get_ident(variable_ident);
|
||||||
@ -1195,7 +1195,7 @@ fn prepare_struct_metadata(cx: &CrateContext,
|
|||||||
|
|
||||||
let (containing_scope, definition_span) = get_namespace_and_span_for_item(cx, def_id);
|
let (containing_scope, definition_span) = get_namespace_and_span_for_item(cx, def_id);
|
||||||
|
|
||||||
let file_name = span_start(cx, definition_span).file.name.clone();
|
let file_name = span_start(cx, definition_span).file.deref().name.clone();
|
||||||
let file_metadata = file_metadata(cx, file_name);
|
let file_metadata = file_metadata(cx, file_name);
|
||||||
|
|
||||||
let struct_metadata_stub = create_struct_stub(cx,
|
let struct_metadata_stub = create_struct_stub(cx,
|
||||||
@ -1292,7 +1292,7 @@ fn prepare_tuple_metadata(cx: &CrateContext,
|
|||||||
let tuple_llvm_type = type_of::type_of(cx, tuple_type);
|
let tuple_llvm_type = type_of::type_of(cx, tuple_type);
|
||||||
|
|
||||||
let loc = span_start(cx, span);
|
let loc = span_start(cx, span);
|
||||||
let file_metadata = file_metadata(cx, loc.file.name);
|
let file_metadata = file_metadata(cx, loc.file.deref().name);
|
||||||
|
|
||||||
UnfinishedMetadata {
|
UnfinishedMetadata {
|
||||||
cache_id: cache_id_for_type(tuple_type),
|
cache_id: cache_id_for_type(tuple_type),
|
||||||
@ -1452,7 +1452,7 @@ fn prepare_enum_metadata(cx: &CrateContext,
|
|||||||
|
|
||||||
let (containing_scope, definition_span) = get_namespace_and_span_for_item(cx, enum_def_id);
|
let (containing_scope, definition_span) = get_namespace_and_span_for_item(cx, enum_def_id);
|
||||||
let loc = span_start(cx, definition_span);
|
let loc = span_start(cx, definition_span);
|
||||||
let file_metadata = file_metadata(cx, loc.file.name);
|
let file_metadata = file_metadata(cx, loc.file.deref().name);
|
||||||
|
|
||||||
// For empty enums there is an early exit. Just describe it as an empty struct with the
|
// For empty enums there is an early exit. Just describe it as an empty struct with the
|
||||||
// appropriate type name
|
// appropriate type name
|
||||||
@ -1791,7 +1791,7 @@ fn boxed_type_metadata(cx: &CrateContext,
|
|||||||
];
|
];
|
||||||
|
|
||||||
let loc = span_start(cx, span);
|
let loc = span_start(cx, span);
|
||||||
let file_metadata = file_metadata(cx, loc.file.name);
|
let file_metadata = file_metadata(cx, loc.file.deref().name);
|
||||||
|
|
||||||
return composite_type_metadata(
|
return composite_type_metadata(
|
||||||
cx,
|
cx,
|
||||||
@ -1892,16 +1892,16 @@ fn vec_metadata(cx: &CrateContext,
|
|||||||
assert!(member_descriptions.len() == member_llvm_types.len());
|
assert!(member_descriptions.len() == member_llvm_types.len());
|
||||||
|
|
||||||
let loc = span_start(cx, span);
|
let loc = span_start(cx, span);
|
||||||
let file_metadata = file_metadata(cx, loc.file.name);
|
let file_metadata = file_metadata(cx, loc.file.deref().name);
|
||||||
|
|
||||||
return composite_type_metadata(
|
composite_type_metadata(
|
||||||
cx,
|
cx,
|
||||||
vec_llvm_type,
|
vec_llvm_type,
|
||||||
vec_type_name,
|
vec_type_name,
|
||||||
member_descriptions,
|
member_descriptions,
|
||||||
file_metadata,
|
file_metadata,
|
||||||
file_metadata,
|
file_metadata,
|
||||||
span);
|
span)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn vec_slice_metadata(cx: &CrateContext,
|
fn vec_slice_metadata(cx: &CrateContext,
|
||||||
@ -1943,7 +1943,7 @@ fn vec_slice_metadata(cx: &CrateContext,
|
|||||||
assert!(member_descriptions.len() == member_llvm_types.len());
|
assert!(member_descriptions.len() == member_llvm_types.len());
|
||||||
|
|
||||||
let loc = span_start(cx, span);
|
let loc = span_start(cx, span);
|
||||||
let file_metadata = file_metadata(cx, loc.file.name);
|
let file_metadata = file_metadata(cx, loc.file.deref().name);
|
||||||
|
|
||||||
return composite_type_metadata(
|
return composite_type_metadata(
|
||||||
cx,
|
cx,
|
||||||
@ -1969,7 +1969,7 @@ fn subroutine_type_metadata(cx: &CrateContext,
|
|||||||
span: Span)
|
span: Span)
|
||||||
-> DICompositeType {
|
-> DICompositeType {
|
||||||
let loc = span_start(cx, span);
|
let loc = span_start(cx, span);
|
||||||
let file_metadata = file_metadata(cx, loc.file.name);
|
let file_metadata = file_metadata(cx, loc.file.deref().name);
|
||||||
|
|
||||||
let mut signature_metadata: Vec<DIType> =
|
let mut signature_metadata: Vec<DIType> =
|
||||||
Vec::with_capacity(signature.inputs.len() + 1);
|
Vec::with_capacity(signature.inputs.len() + 1);
|
||||||
@ -2015,7 +2015,7 @@ fn trait_metadata(cx: &CrateContext,
|
|||||||
|
|
||||||
let (containing_scope, definition_span) = get_namespace_and_span_for_item(cx, def_id);
|
let (containing_scope, definition_span) = get_namespace_and_span_for_item(cx, def_id);
|
||||||
|
|
||||||
let file_name = span_start(cx, definition_span).file.name.clone();
|
let file_name = span_start(cx, definition_span).file.deref().name.clone();
|
||||||
let file_metadata = file_metadata(cx, file_name);
|
let file_metadata = file_metadata(cx, file_name);
|
||||||
|
|
||||||
let trait_llvm_type = type_of::type_of(cx, trait_type);
|
let trait_llvm_type = type_of::type_of(cx, trait_type);
|
||||||
@ -2218,7 +2218,7 @@ fn generate_unique_type_id(prefix: &'static str) -> ~str {
|
|||||||
|
|
||||||
/// Return codemap::Loc corresponding to the beginning of the span
|
/// Return codemap::Loc corresponding to the beginning of the span
|
||||||
fn span_start(cx: &CrateContext, span: Span) -> codemap::Loc {
|
fn span_start(cx: &CrateContext, span: Span) -> codemap::Loc {
|
||||||
cx.sess().codemap.lookup_char_pos(span.lo)
|
cx.sess().codemap().lookup_char_pos(span.lo)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn size_and_align_of(cx: &CrateContext, llvm_type: Type) -> (u64, u64) {
|
fn size_and_align_of(cx: &CrateContext, llvm_type: Type) -> (u64, u64) {
|
||||||
@ -2315,8 +2315,8 @@ fn populate_scope_map(cx: &CrateContext,
|
|||||||
&mut Vec<ScopeStackEntry> ,
|
&mut Vec<ScopeStackEntry> ,
|
||||||
&mut HashMap<ast::NodeId, DIScope>|) {
|
&mut HashMap<ast::NodeId, DIScope>|) {
|
||||||
// Create a new lexical scope and push it onto the stack
|
// Create a new lexical scope and push it onto the stack
|
||||||
let loc = cx.sess().codemap.lookup_char_pos(scope_span.lo);
|
let loc = cx.sess().codemap().lookup_char_pos(scope_span.lo);
|
||||||
let file_metadata = file_metadata(cx, loc.file.name);
|
let file_metadata = file_metadata(cx, loc.file.deref().name);
|
||||||
let parent_scope = scope_stack.last().unwrap().scope_metadata;
|
let parent_scope = scope_stack.last().unwrap().scope_metadata;
|
||||||
|
|
||||||
let scope_metadata = unsafe {
|
let scope_metadata = unsafe {
|
||||||
@ -2432,8 +2432,8 @@ fn populate_scope_map(cx: &CrateContext,
|
|||||||
|
|
||||||
if need_new_scope {
|
if need_new_scope {
|
||||||
// Create a new lexical scope and push it onto the stack
|
// Create a new lexical scope and push it onto the stack
|
||||||
let loc = cx.sess().codemap.lookup_char_pos(pat.span.lo);
|
let loc = cx.sess().codemap().lookup_char_pos(pat.span.lo);
|
||||||
let file_metadata = file_metadata(cx, loc.file.name);
|
let file_metadata = file_metadata(cx, loc.file.deref().name);
|
||||||
let parent_scope = scope_stack.last().unwrap().scope_metadata;
|
let parent_scope = scope_stack.last().unwrap().scope_metadata;
|
||||||
|
|
||||||
let scope_metadata = unsafe {
|
let scope_metadata = unsafe {
|
||||||
|
@ -253,7 +253,6 @@ pub enum AutoRef {
|
|||||||
/// generates so that so that it can be reused and doesn't have to be redone
|
/// generates so that so that it can be reused and doesn't have to be redone
|
||||||
/// later on.
|
/// later on.
|
||||||
pub struct ctxt {
|
pub struct ctxt {
|
||||||
diag: @syntax::diagnostic::SpanHandler,
|
|
||||||
// Specifically use a speedy hash algorithm for this hash map, it's used
|
// Specifically use a speedy hash algorithm for this hash map, it's used
|
||||||
// quite often.
|
// quite often.
|
||||||
interner: RefCell<FnvHashMap<intern_key, ~t_box_>>,
|
interner: RefCell<FnvHashMap<intern_key, ~t_box_>>,
|
||||||
@ -1088,7 +1087,6 @@ pub fn mk_ctxt(s: Session,
|
|||||||
ctxt {
|
ctxt {
|
||||||
named_region_map: named_region_map,
|
named_region_map: named_region_map,
|
||||||
item_variance_map: RefCell::new(DefIdMap::new()),
|
item_variance_map: RefCell::new(DefIdMap::new()),
|
||||||
diag: s.diagnostic(),
|
|
||||||
interner: RefCell::new(FnvHashMap::new()),
|
interner: RefCell::new(FnvHashMap::new()),
|
||||||
next_id: Cell::new(primitives::LAST_PRIMITIVE_ID),
|
next_id: Cell::new(primitives::LAST_PRIMITIVE_ID),
|
||||||
sess: s,
|
sess: s,
|
||||||
|
@ -139,9 +139,8 @@ pub fn explain_region_and_span(cx: &ctxt, region: ty::Region)
|
|||||||
};
|
};
|
||||||
|
|
||||||
fn explain_span(cx: &ctxt, heading: &str, span: Span)
|
fn explain_span(cx: &ctxt, heading: &str, span: Span)
|
||||||
-> (~str, Option<Span>)
|
-> (~str, Option<Span>) {
|
||||||
{
|
let lo = cx.sess.codemap().lookup_char_pos_adj(span.lo);
|
||||||
let lo = cx.sess.codemap.lookup_char_pos_adj(span.lo);
|
|
||||||
(format!("the {} at {}:{}", heading,
|
(format!("the {} at {}:{}", heading,
|
||||||
lo.line, lo.col.to_uint()), Some(span))
|
lo.line, lo.col.to_uint()), Some(span))
|
||||||
}
|
}
|
||||||
@ -172,28 +171,28 @@ pub fn ReScope_id_to_str(cx: &ctxt, node_id: ast::NodeId) -> ~str {
|
|||||||
match cx.map.find(node_id) {
|
match cx.map.find(node_id) {
|
||||||
Some(ast_map::NodeBlock(ref blk)) => {
|
Some(ast_map::NodeBlock(ref blk)) => {
|
||||||
format!("<block at {}>",
|
format!("<block at {}>",
|
||||||
cx.sess.codemap.span_to_str(blk.span))
|
cx.sess.codemap().span_to_str(blk.span))
|
||||||
}
|
}
|
||||||
Some(ast_map::NodeExpr(expr)) => {
|
Some(ast_map::NodeExpr(expr)) => {
|
||||||
match expr.node {
|
match expr.node {
|
||||||
ast::ExprCall(..) => {
|
ast::ExprCall(..) => {
|
||||||
format!("<call at {}>",
|
format!("<call at {}>",
|
||||||
cx.sess.codemap.span_to_str(expr.span))
|
cx.sess.codemap().span_to_str(expr.span))
|
||||||
}
|
}
|
||||||
ast::ExprMatch(..) => {
|
ast::ExprMatch(..) => {
|
||||||
format!("<match at {}>",
|
format!("<match at {}>",
|
||||||
cx.sess.codemap.span_to_str(expr.span))
|
cx.sess.codemap().span_to_str(expr.span))
|
||||||
}
|
}
|
||||||
ast::ExprAssignOp(..) |
|
ast::ExprAssignOp(..) |
|
||||||
ast::ExprUnary(..) |
|
ast::ExprUnary(..) |
|
||||||
ast::ExprBinary(..) |
|
ast::ExprBinary(..) |
|
||||||
ast::ExprIndex(..) => {
|
ast::ExprIndex(..) => {
|
||||||
format!("<method at {}>",
|
format!("<method at {}>",
|
||||||
cx.sess.codemap.span_to_str(expr.span))
|
cx.sess.codemap().span_to_str(expr.span))
|
||||||
}
|
}
|
||||||
_ => {
|
_ => {
|
||||||
format!("<expression at {}>",
|
format!("<expression at {}>",
|
||||||
cx.sess.codemap.span_to_str(expr.span))
|
cx.sess.codemap().span_to_str(expr.span))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -972,7 +971,7 @@ impl Repr for ty::BuiltinBounds {
|
|||||||
|
|
||||||
impl Repr for Span {
|
impl Repr for Span {
|
||||||
fn repr(&self, tcx: &ctxt) -> ~str {
|
fn repr(&self, tcx: &ctxt) -> ~str {
|
||||||
tcx.sess.codemap.span_to_str(*self)
|
tcx.sess.codemap().span_to_str(*self)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -375,7 +375,7 @@ pub fn find_stability<AM: AttrMetaMethods, It: Iterator<AM>>(mut metas: It)
|
|||||||
None
|
None
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn require_unique_names(diagnostic: @SpanHandler, metas: &[@MetaItem]) {
|
pub fn require_unique_names(diagnostic: &SpanHandler, metas: &[@MetaItem]) {
|
||||||
let mut set = HashSet::new();
|
let mut set = HashSet::new();
|
||||||
for meta in metas.iter() {
|
for meta in metas.iter() {
|
||||||
let name = meta.name();
|
let name = meta.name();
|
||||||
@ -400,7 +400,7 @@ pub fn require_unique_names(diagnostic: @SpanHandler, metas: &[@MetaItem]) {
|
|||||||
* present (before fields, if any) with that type; reprensentation
|
* present (before fields, if any) with that type; reprensentation
|
||||||
* optimizations which would remove it will not be done.
|
* optimizations which would remove it will not be done.
|
||||||
*/
|
*/
|
||||||
pub fn find_repr_attr(diagnostic: @SpanHandler, attr: @ast::MetaItem, acc: ReprAttr)
|
pub fn find_repr_attr(diagnostic: &SpanHandler, attr: @ast::MetaItem, acc: ReprAttr)
|
||||||
-> ReprAttr {
|
-> ReprAttr {
|
||||||
let mut acc = acc;
|
let mut acc = acc;
|
||||||
match attr.node {
|
match attr.node {
|
||||||
@ -438,7 +438,7 @@ pub fn find_repr_attr(diagnostic: @SpanHandler, attr: @ast::MetaItem, acc: ReprA
|
|||||||
// Not a "repr" hint: ignore.
|
// Not a "repr" hint: ignore.
|
||||||
_ => { }
|
_ => { }
|
||||||
}
|
}
|
||||||
return acc;
|
acc
|
||||||
}
|
}
|
||||||
|
|
||||||
fn int_type_of_word(s: &str) -> Option<IntType> {
|
fn int_type_of_word(s: &str) -> Option<IntType> {
|
||||||
|
@ -23,6 +23,7 @@ source code snippets, etc.
|
|||||||
|
|
||||||
use std::cell::RefCell;
|
use std::cell::RefCell;
|
||||||
use std::cmp;
|
use std::cmp;
|
||||||
|
use std::rc::Rc;
|
||||||
use std::vec_ng::Vec;
|
use std::vec_ng::Vec;
|
||||||
use serialize::{Encodable, Decodable, Encoder, Decoder};
|
use serialize::{Encodable, Decodable, Encoder, Decoder};
|
||||||
|
|
||||||
@ -140,7 +141,7 @@ pub fn mk_sp(lo: BytePos, hi: BytePos) -> Span {
|
|||||||
/// A source code location used for error reporting
|
/// A source code location used for error reporting
|
||||||
pub struct Loc {
|
pub struct Loc {
|
||||||
/// Information about the original source
|
/// Information about the original source
|
||||||
file: @FileMap,
|
file: Rc<FileMap>,
|
||||||
/// The (1-based) line number
|
/// The (1-based) line number
|
||||||
line: uint,
|
line: uint,
|
||||||
/// The (0-based) column offset
|
/// The (0-based) column offset
|
||||||
@ -154,12 +155,12 @@ pub struct LocWithOpt {
|
|||||||
filename: FileName,
|
filename: FileName,
|
||||||
line: uint,
|
line: uint,
|
||||||
col: CharPos,
|
col: CharPos,
|
||||||
file: Option<@FileMap>,
|
file: Option<Rc<FileMap>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
// used to be structural records. Better names, anyone?
|
// used to be structural records. Better names, anyone?
|
||||||
pub struct FileMapAndLine {fm: @FileMap, line: uint}
|
pub struct FileMapAndLine {fm: Rc<FileMap>, line: uint}
|
||||||
pub struct FileMapAndBytePos {fm: @FileMap, pos: BytePos}
|
pub struct FileMapAndBytePos {fm: Rc<FileMap>, pos: BytePos}
|
||||||
|
|
||||||
#[deriving(Clone, Hash, Show)]
|
#[deriving(Clone, Hash, Show)]
|
||||||
pub enum MacroFormat {
|
pub enum MacroFormat {
|
||||||
@ -186,10 +187,10 @@ pub struct ExpnInfo {
|
|||||||
|
|
||||||
pub type FileName = ~str;
|
pub type FileName = ~str;
|
||||||
|
|
||||||
pub struct FileLines
|
pub struct FileLines {
|
||||||
{
|
file: Rc<FileMap>,
|
||||||
file: @FileMap,
|
lines: Vec<uint>
|
||||||
lines: Vec<uint> }
|
}
|
||||||
|
|
||||||
/// Identifies an offset of a multi-byte character in a FileMap
|
/// Identifies an offset of a multi-byte character in a FileMap
|
||||||
pub struct MultiByteChar {
|
pub struct MultiByteChar {
|
||||||
@ -251,8 +252,7 @@ impl FileMap {
|
|||||||
pos: pos,
|
pos: pos,
|
||||||
bytes: bytes,
|
bytes: bytes,
|
||||||
};
|
};
|
||||||
let mut multibyte_chars = self.multibyte_chars.borrow_mut();
|
self.multibyte_chars.borrow_mut().get().push(mbc);
|
||||||
multibyte_chars.get().push(mbc);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn is_real_file(&self) -> bool {
|
pub fn is_real_file(&self) -> bool {
|
||||||
@ -261,7 +261,7 @@ impl FileMap {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub struct CodeMap {
|
pub struct CodeMap {
|
||||||
files: RefCell<Vec<@FileMap> >
|
files: RefCell<Vec<Rc<FileMap>>>
|
||||||
}
|
}
|
||||||
|
|
||||||
impl CodeMap {
|
impl CodeMap {
|
||||||
@ -271,11 +271,11 @@ impl CodeMap {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn new_filemap(&self, filename: FileName, mut src: ~str) -> @FileMap {
|
pub fn new_filemap(&self, filename: FileName, mut src: ~str) -> Rc<FileMap> {
|
||||||
let mut files = self.files.borrow_mut();
|
let mut files = self.files.borrow_mut();
|
||||||
let start_pos = match files.get().last() {
|
let start_pos = match files.get().last() {
|
||||||
None => 0,
|
None => 0,
|
||||||
Some(last) => last.start_pos.to_uint() + last.src.len(),
|
Some(last) => last.deref().start_pos.to_uint() + last.deref().src.len(),
|
||||||
};
|
};
|
||||||
|
|
||||||
// Append '\n' in case it's not already there.
|
// Append '\n' in case it's not already there.
|
||||||
@ -286,34 +286,33 @@ impl CodeMap {
|
|||||||
src.push_char('\n');
|
src.push_char('\n');
|
||||||
}
|
}
|
||||||
|
|
||||||
let filemap = @FileMap {
|
let filemap = Rc::new(FileMap {
|
||||||
name: filename,
|
name: filename,
|
||||||
src: src,
|
src: src,
|
||||||
start_pos: Pos::from_uint(start_pos),
|
start_pos: Pos::from_uint(start_pos),
|
||||||
lines: RefCell::new(Vec::new()),
|
lines: RefCell::new(Vec::new()),
|
||||||
multibyte_chars: RefCell::new(Vec::new()),
|
multibyte_chars: RefCell::new(Vec::new()),
|
||||||
};
|
});
|
||||||
|
|
||||||
files.get().push(filemap);
|
files.get().push(filemap.clone());
|
||||||
|
|
||||||
return filemap;
|
filemap
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn mk_substr_filename(&self, sp: Span) -> ~str {
|
pub fn mk_substr_filename(&self, sp: Span) -> ~str {
|
||||||
let pos = self.lookup_char_pos(sp.lo);
|
let pos = self.lookup_char_pos(sp.lo);
|
||||||
return format!("<{}:{}:{}>", pos.file.name,
|
format!("<{}:{}:{}>", pos.file.deref().name, pos.line, pos.col.to_uint() + 1)
|
||||||
pos.line, pos.col.to_uint() + 1)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Lookup source information about a BytePos
|
/// Lookup source information about a BytePos
|
||||||
pub fn lookup_char_pos(&self, pos: BytePos) -> Loc {
|
pub fn lookup_char_pos(&self, pos: BytePos) -> Loc {
|
||||||
return self.lookup_pos(pos);
|
self.lookup_pos(pos)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn lookup_char_pos_adj(&self, pos: BytePos) -> LocWithOpt {
|
pub fn lookup_char_pos_adj(&self, pos: BytePos) -> LocWithOpt {
|
||||||
let loc = self.lookup_char_pos(pos);
|
let loc = self.lookup_char_pos(pos);
|
||||||
LocWithOpt {
|
LocWithOpt {
|
||||||
filename: loc.file.name.to_str(),
|
filename: loc.file.deref().name.to_str(),
|
||||||
line: loc.line,
|
line: loc.line,
|
||||||
col: loc.col,
|
col: loc.col,
|
||||||
file: Some(loc.file)
|
file: Some(loc.file)
|
||||||
@ -321,11 +320,8 @@ impl CodeMap {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn span_to_str(&self, sp: Span) -> ~str {
|
pub fn span_to_str(&self, sp: Span) -> ~str {
|
||||||
{
|
if self.files.borrow().get().len() == 0 && sp == DUMMY_SP {
|
||||||
let files = self.files.borrow();
|
return ~"no-location";
|
||||||
if files.get().len() == 0 && sp == DUMMY_SP {
|
|
||||||
return ~"no-location";
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
let lo = self.lookup_char_pos_adj(sp.lo);
|
let lo = self.lookup_char_pos_adj(sp.lo);
|
||||||
@ -335,18 +331,17 @@ impl CodeMap {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn span_to_filename(&self, sp: Span) -> FileName {
|
pub fn span_to_filename(&self, sp: Span) -> FileName {
|
||||||
let lo = self.lookup_char_pos(sp.lo);
|
self.lookup_char_pos(sp.lo).file.deref().name.to_str()
|
||||||
lo.file.name.to_str()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn span_to_lines(&self, sp: Span) -> @FileLines {
|
pub fn span_to_lines(&self, sp: Span) -> FileLines {
|
||||||
let lo = self.lookup_char_pos(sp.lo);
|
let lo = self.lookup_char_pos(sp.lo);
|
||||||
let hi = self.lookup_char_pos(sp.hi);
|
let hi = self.lookup_char_pos(sp.hi);
|
||||||
let mut lines = Vec::new();
|
let mut lines = Vec::new();
|
||||||
for i in range(lo.line - 1u, hi.line as uint) {
|
for i in range(lo.line - 1u, hi.line as uint) {
|
||||||
lines.push(i);
|
lines.push(i);
|
||||||
};
|
};
|
||||||
return @FileLines {file: lo.file, lines: lines};
|
FileLines {file: lo.file, lines: lines}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn span_to_snippet(&self, sp: Span) -> Option<~str> {
|
pub fn span_to_snippet(&self, sp: Span) -> Option<~str> {
|
||||||
@ -357,27 +352,22 @@ impl CodeMap {
|
|||||||
// it's testing isn't true for all spans in the AST, so to allow the
|
// it's testing isn't true for all spans in the AST, so to allow the
|
||||||
// caller to not have to fail (and it can't catch it since the CodeMap
|
// caller to not have to fail (and it can't catch it since the CodeMap
|
||||||
// isn't sendable), return None
|
// isn't sendable), return None
|
||||||
if begin.fm.start_pos != end.fm.start_pos {
|
if begin.fm.deref().start_pos != end.fm.deref().start_pos {
|
||||||
None
|
None
|
||||||
} else {
|
} else {
|
||||||
Some(begin.fm.src.slice( begin.pos.to_uint(), end.pos.to_uint()).to_owned())
|
Some(begin.fm.deref().src.slice( begin.pos.to_uint(), end.pos.to_uint()).to_owned())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_filemap(&self, filename: &str) -> @FileMap {
|
pub fn get_filemap(&self, filename: &str) -> Rc<FileMap> {
|
||||||
let files = self.files.borrow();
|
for fm in self.files.borrow().get().iter() {
|
||||||
for fm in files.get().iter() {
|
if filename == fm.deref().name {
|
||||||
if filename == fm.name {
|
return fm.clone();
|
||||||
return *fm
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//XXjdm the following triggers a mismatched type bug
|
fail!("asking for {} which we don't know about", filename);
|
||||||
// (or expected function, found _|_)
|
|
||||||
fail!(); // ("asking for " + filename + " which we don't know about");
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
impl CodeMap {
|
|
||||||
fn lookup_filemap_idx(&self, pos: BytePos) -> uint {
|
fn lookup_filemap_idx(&self, pos: BytePos) -> uint {
|
||||||
let files = self.files.borrow();
|
let files = self.files.borrow();
|
||||||
let files = files.get();
|
let files = files.get();
|
||||||
@ -386,7 +376,7 @@ impl CodeMap {
|
|||||||
let mut b = len;
|
let mut b = len;
|
||||||
while b - a > 1u {
|
while b - a > 1u {
|
||||||
let m = (a + b) / 2u;
|
let m = (a + b) / 2u;
|
||||||
if files.get(m).start_pos > pos {
|
if files.get(m).deref().start_pos > pos {
|
||||||
b = m;
|
b = m;
|
||||||
} else {
|
} else {
|
||||||
a = m;
|
a = m;
|
||||||
@ -396,7 +386,7 @@ impl CodeMap {
|
|||||||
// filemap, but are not the filemaps we want (because they are length 0, they cannot
|
// filemap, but are not the filemaps we want (because they are length 0, they cannot
|
||||||
// contain what we are looking for). So, rewind until we find a useful filemap.
|
// contain what we are looking for). So, rewind until we find a useful filemap.
|
||||||
loop {
|
loop {
|
||||||
let lines = files.get(a).lines.borrow();
|
let lines = files.get(a).deref().lines.borrow();
|
||||||
let lines = lines.get();
|
let lines = lines.get();
|
||||||
if lines.len() > 0 {
|
if lines.len() > 0 {
|
||||||
break;
|
break;
|
||||||
@ -413,28 +403,28 @@ impl CodeMap {
|
|||||||
return a;
|
return a;
|
||||||
}
|
}
|
||||||
|
|
||||||
fn lookup_line(&self, pos: BytePos) -> FileMapAndLine
|
fn lookup_line(&self, pos: BytePos) -> FileMapAndLine {
|
||||||
{
|
|
||||||
let idx = self.lookup_filemap_idx(pos);
|
let idx = self.lookup_filemap_idx(pos);
|
||||||
|
|
||||||
let files = self.files.borrow();
|
let files = self.files.borrow();
|
||||||
let f = *files.get().get(idx);
|
let f = files.get().get(idx).clone();
|
||||||
let mut a = 0u;
|
let mut a = 0u;
|
||||||
let mut lines = f.lines.borrow_mut();
|
{
|
||||||
let mut b = lines.get().len();
|
let mut lines = f.deref().lines.borrow_mut();
|
||||||
while b - a > 1u {
|
let mut b = lines.get().len();
|
||||||
let m = (a + b) / 2u;
|
while b - a > 1u {
|
||||||
if *lines.get().get(m) > pos { b = m; } else { a = m; }
|
let m = (a + b) / 2u;
|
||||||
|
if *lines.get().get(m) > pos { b = m; } else { a = m; }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return FileMapAndLine {fm: f, line: a};
|
FileMapAndLine {fm: f, line: a}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn lookup_pos(&self, pos: BytePos) -> Loc {
|
fn lookup_pos(&self, pos: BytePos) -> Loc {
|
||||||
let FileMapAndLine {fm: f, line: a} = self.lookup_line(pos);
|
let FileMapAndLine {fm: f, line: a} = self.lookup_line(pos);
|
||||||
let line = a + 1u; // Line numbers start at 1
|
let line = a + 1u; // Line numbers start at 1
|
||||||
let chpos = self.bytepos_to_file_charpos(pos);
|
let chpos = self.bytepos_to_file_charpos(pos);
|
||||||
let lines = f.lines.borrow();
|
let linebpos = *f.deref().lines.borrow().get().get(a);
|
||||||
let linebpos = *lines.get().get(a);
|
|
||||||
let linechpos = self.bytepos_to_file_charpos(linebpos);
|
let linechpos = self.bytepos_to_file_charpos(linebpos);
|
||||||
debug!("codemap: byte pos {:?} is on the line at byte pos {:?}",
|
debug!("codemap: byte pos {:?} is on the line at byte pos {:?}",
|
||||||
pos, linebpos);
|
pos, linebpos);
|
||||||
@ -442,20 +432,18 @@ impl CodeMap {
|
|||||||
chpos, linechpos);
|
chpos, linechpos);
|
||||||
debug!("codemap: byte is on line: {:?}", line);
|
debug!("codemap: byte is on line: {:?}", line);
|
||||||
assert!(chpos >= linechpos);
|
assert!(chpos >= linechpos);
|
||||||
return Loc {
|
Loc {
|
||||||
file: f,
|
file: f,
|
||||||
line: line,
|
line: line,
|
||||||
col: chpos - linechpos
|
col: chpos - linechpos
|
||||||
};
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn lookup_byte_offset(&self, bpos: BytePos)
|
fn lookup_byte_offset(&self, bpos: BytePos) -> FileMapAndBytePos {
|
||||||
-> FileMapAndBytePos {
|
|
||||||
let idx = self.lookup_filemap_idx(bpos);
|
let idx = self.lookup_filemap_idx(bpos);
|
||||||
let files = self.files.borrow();
|
let fm = self.files.borrow().get().get(idx).clone();
|
||||||
let fm = *files.get().get(idx);
|
let offset = bpos - fm.deref().start_pos;
|
||||||
let offset = bpos - fm.start_pos;
|
FileMapAndBytePos {fm: fm, pos: offset}
|
||||||
return FileMapAndBytePos {fm: fm, pos: offset};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Converts an absolute BytePos to a CharPos relative to the filemap.
|
// Converts an absolute BytePos to a CharPos relative to the filemap.
|
||||||
@ -468,8 +456,7 @@ impl CodeMap {
|
|||||||
// The number of extra bytes due to multibyte chars in the FileMap
|
// The number of extra bytes due to multibyte chars in the FileMap
|
||||||
let mut total_extra_bytes = 0;
|
let mut total_extra_bytes = 0;
|
||||||
|
|
||||||
let multibyte_chars = map.multibyte_chars.borrow();
|
for mbc in map.deref().multibyte_chars.borrow().get().iter() {
|
||||||
for mbc in multibyte_chars.get().iter() {
|
|
||||||
debug!("codemap: {:?}-byte char at {:?}", mbc.bytes, mbc.pos);
|
debug!("codemap: {:?}-byte char at {:?}", mbc.bytes, mbc.pos);
|
||||||
if mbc.pos < bpos {
|
if mbc.pos < bpos {
|
||||||
// every character is at least one byte, so we only
|
// every character is at least one byte, so we only
|
||||||
@ -483,8 +470,8 @@ impl CodeMap {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
assert!(map.start_pos.to_uint() + total_extra_bytes <= bpos.to_uint());
|
assert!(map.deref().start_pos.to_uint() + total_extra_bytes <= bpos.to_uint());
|
||||||
CharPos(bpos.to_uint() - map.start_pos.to_uint() - total_extra_bytes)
|
CharPos(bpos.to_uint() - map.deref().start_pos.to_uint() - total_extra_bytes)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -40,37 +40,37 @@ pub struct ExplicitBug;
|
|||||||
// accepts span information for source-location
|
// accepts span information for source-location
|
||||||
// reporting.
|
// reporting.
|
||||||
pub struct SpanHandler {
|
pub struct SpanHandler {
|
||||||
handler: @Handler,
|
handler: Handler,
|
||||||
cm: @codemap::CodeMap,
|
cm: codemap::CodeMap,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl SpanHandler {
|
impl SpanHandler {
|
||||||
pub fn span_fatal(&self, sp: Span, msg: &str) -> ! {
|
pub fn span_fatal(&self, sp: Span, msg: &str) -> ! {
|
||||||
self.handler.emit(Some((&*self.cm, sp)), msg, Fatal);
|
self.handler.emit(Some((&self.cm, sp)), msg, Fatal);
|
||||||
fail!(FatalError);
|
fail!(FatalError);
|
||||||
}
|
}
|
||||||
pub fn span_err(&self, sp: Span, msg: &str) {
|
pub fn span_err(&self, sp: Span, msg: &str) {
|
||||||
self.handler.emit(Some((&*self.cm, sp)), msg, Error);
|
self.handler.emit(Some((&self.cm, sp)), msg, Error);
|
||||||
self.handler.bump_err_count();
|
self.handler.bump_err_count();
|
||||||
}
|
}
|
||||||
pub fn span_warn(&self, sp: Span, msg: &str) {
|
pub fn span_warn(&self, sp: Span, msg: &str) {
|
||||||
self.handler.emit(Some((&*self.cm, sp)), msg, Warning);
|
self.handler.emit(Some((&self.cm, sp)), msg, Warning);
|
||||||
}
|
}
|
||||||
pub fn span_note(&self, sp: Span, msg: &str) {
|
pub fn span_note(&self, sp: Span, msg: &str) {
|
||||||
self.handler.emit(Some((&*self.cm, sp)), msg, Note);
|
self.handler.emit(Some((&self.cm, sp)), msg, Note);
|
||||||
}
|
}
|
||||||
pub fn span_end_note(&self, sp: Span, msg: &str) {
|
pub fn span_end_note(&self, sp: Span, msg: &str) {
|
||||||
self.handler.custom_emit(&*self.cm, sp, msg, Note);
|
self.handler.custom_emit(&self.cm, sp, msg, Note);
|
||||||
}
|
}
|
||||||
pub fn span_bug(&self, sp: Span, msg: &str) -> ! {
|
pub fn span_bug(&self, sp: Span, msg: &str) -> ! {
|
||||||
self.handler.emit(Some((&*self.cm, sp)), msg, Bug);
|
self.handler.emit(Some((&self.cm, sp)), msg, Bug);
|
||||||
fail!(ExplicitBug);
|
fail!(ExplicitBug);
|
||||||
}
|
}
|
||||||
pub fn span_unimpl(&self, sp: Span, msg: &str) -> ! {
|
pub fn span_unimpl(&self, sp: Span, msg: &str) -> ! {
|
||||||
self.span_bug(sp, ~"unimplemented " + msg);
|
self.span_bug(sp, ~"unimplemented " + msg);
|
||||||
}
|
}
|
||||||
pub fn handler(&self) -> @Handler {
|
pub fn handler<'a>(&'a self) -> &'a Handler {
|
||||||
self.handler
|
&self.handler
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -137,20 +137,19 @@ impl Handler {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn mk_span_handler(handler: @Handler, cm: @codemap::CodeMap)
|
pub fn mk_span_handler(handler: Handler, cm: codemap::CodeMap) -> SpanHandler {
|
||||||
-> @SpanHandler {
|
SpanHandler {
|
||||||
@SpanHandler {
|
|
||||||
handler: handler,
|
handler: handler,
|
||||||
cm: cm,
|
cm: cm,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn default_handler() -> @Handler {
|
pub fn default_handler() -> Handler {
|
||||||
mk_handler(~EmitterWriter::stderr())
|
mk_handler(~EmitterWriter::stderr())
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn mk_handler(e: ~Emitter) -> @Handler {
|
pub fn mk_handler(e: ~Emitter) -> Handler {
|
||||||
@Handler {
|
Handler {
|
||||||
err_count: Cell::new(0),
|
err_count: Cell::new(0),
|
||||||
emit: RefCell::new(e),
|
emit: RefCell::new(e),
|
||||||
}
|
}
|
||||||
@ -301,8 +300,8 @@ fn highlight_lines(err: &mut EmitterWriter,
|
|||||||
cm: &codemap::CodeMap,
|
cm: &codemap::CodeMap,
|
||||||
sp: Span,
|
sp: Span,
|
||||||
lvl: Level,
|
lvl: Level,
|
||||||
lines: &codemap::FileLines) -> io::IoResult<()> {
|
lines: codemap::FileLines) -> io::IoResult<()> {
|
||||||
let fm = lines.file;
|
let fm = lines.file.deref();
|
||||||
|
|
||||||
let mut elided = false;
|
let mut elided = false;
|
||||||
let mut display_lines = lines.lines.as_slice();
|
let mut display_lines = lines.lines.as_slice();
|
||||||
@ -374,8 +373,8 @@ fn custom_highlight_lines(w: &mut EmitterWriter,
|
|||||||
cm: &codemap::CodeMap,
|
cm: &codemap::CodeMap,
|
||||||
sp: Span,
|
sp: Span,
|
||||||
lvl: Level,
|
lvl: Level,
|
||||||
lines: &codemap::FileLines) -> io::IoResult<()> {
|
lines: codemap::FileLines) -> io::IoResult<()> {
|
||||||
let fm = lines.file;
|
let fm = lines.file.deref();
|
||||||
|
|
||||||
let lines = lines.lines.as_slice();
|
let lines = lines.lines.as_slice();
|
||||||
if lines.len() > MAX_LINES {
|
if lines.len() > MAX_LINES {
|
||||||
@ -420,8 +419,7 @@ fn print_macro_backtrace(w: &mut EmitterWriter,
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn expect<T:Clone>(diag: @SpanHandler, opt: Option<T>, msg: || -> ~str)
|
pub fn expect<T:Clone>(diag: &SpanHandler, opt: Option<T>, msg: || -> ~str) -> T {
|
||||||
-> T {
|
|
||||||
match opt {
|
match opt {
|
||||||
Some(ref t) => (*t).clone(),
|
Some(ref t) => (*t).clone(),
|
||||||
None => diag.handler().bug(msg()),
|
None => diag.handler().bug(msg()),
|
||||||
|
@ -326,7 +326,7 @@ impl<'a> ExtCtxt<'a> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn codemap(&self) -> @CodeMap { self.parse_sess.cm }
|
pub fn codemap(&self) -> &'a CodeMap { &self.parse_sess.span_diagnostic.cm }
|
||||||
pub fn parse_sess(&self) -> &'a parse::ParseSess { self.parse_sess }
|
pub fn parse_sess(&self) -> &'a parse::ParseSess { self.parse_sess }
|
||||||
pub fn cfg(&self) -> ast::CrateConfig { self.cfg.clone() }
|
pub fn cfg(&self) -> ast::CrateConfig { self.cfg.clone() }
|
||||||
pub fn call_site(&self) -> Span {
|
pub fn call_site(&self) -> Span {
|
||||||
|
@ -633,7 +633,7 @@ impl<'a> AstBuilder for ExtCtxt<'a> {
|
|||||||
vec!(
|
vec!(
|
||||||
self.expr_str(span, msg),
|
self.expr_str(span, msg),
|
||||||
self.expr_str(span,
|
self.expr_str(span,
|
||||||
token::intern_and_get_ident(loc.file.name)),
|
token::intern_and_get_ident(loc.file.deref().name)),
|
||||||
self.expr_uint(span, loc.line)))
|
self.expr_uint(span, loc.line)))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -37,7 +37,7 @@ impl Visitor<()> for MacroRegistrarContext {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn find_macro_registrar(diagnostic: @diagnostic::SpanHandler,
|
pub fn find_macro_registrar(diagnostic: &diagnostic::SpanHandler,
|
||||||
krate: &ast::Crate) -> Option<ast::DefId> {
|
krate: &ast::Crate) -> Option<ast::DefId> {
|
||||||
let mut ctx = MacroRegistrarContext { registrars: Vec::new() };
|
let mut ctx = MacroRegistrarContext { registrars: Vec::new() };
|
||||||
visit::walk_crate(&mut ctx, krate, ());
|
visit::walk_crate(&mut ctx, krate, ());
|
||||||
|
@ -57,7 +57,7 @@ pub fn expand_file(cx: &mut ExtCtxt, sp: Span, tts: &[ast::TokenTree])
|
|||||||
|
|
||||||
let topmost = topmost_expn_info(cx.backtrace().unwrap());
|
let topmost = topmost_expn_info(cx.backtrace().unwrap());
|
||||||
let loc = cx.codemap().lookup_char_pos(topmost.call_site.lo);
|
let loc = cx.codemap().lookup_char_pos(topmost.call_site.lo);
|
||||||
let filename = token::intern_and_get_ident(loc.file.name);
|
let filename = token::intern_and_get_ident(loc.file.deref().name);
|
||||||
base::MRExpr(cx.expr_str(topmost.call_site, filename))
|
base::MRExpr(cx.expr_str(topmost.call_site, filename))
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -117,7 +117,7 @@ pub fn expand_include_str(cx: &mut ExtCtxt, sp: Span, tts: &[ast::TokenTree])
|
|||||||
// dependency information
|
// dependency information
|
||||||
let filename = file.display().to_str();
|
let filename = file.display().to_str();
|
||||||
let interned = token::intern_and_get_ident(src);
|
let interned = token::intern_and_get_ident(src);
|
||||||
cx.parse_sess.cm.new_filemap(filename, src);
|
cx.codemap().new_filemap(filename, src);
|
||||||
|
|
||||||
base::MRExpr(cx.expr_str(sp, interned))
|
base::MRExpr(cx.expr_str(sp, interned))
|
||||||
}
|
}
|
||||||
|
@ -22,7 +22,7 @@ pub fn expand_trace_macros(cx: &mut ExtCtxt,
|
|||||||
-> base::MacResult {
|
-> base::MacResult {
|
||||||
let sess = cx.parse_sess();
|
let sess = cx.parse_sess();
|
||||||
let cfg = cx.cfg();
|
let cfg = cx.cfg();
|
||||||
let tt_rdr = new_tt_reader(cx.parse_sess().span_diagnostic,
|
let tt_rdr = new_tt_reader(&cx.parse_sess().span_diagnostic,
|
||||||
None,
|
None,
|
||||||
tt.iter().map(|x| (*x).clone()).collect());
|
tt.iter().map(|x| (*x).clone()).collect());
|
||||||
let mut rust_parser = Parser(sess, cfg.clone(), tt_rdr.dup());
|
let mut rust_parser = Parser(sess, cfg.clone(), tt_rdr.dup());
|
||||||
|
@ -131,13 +131,11 @@ fn generic_extension(cx: &ExtCtxt,
|
|||||||
let mut best_fail_spot = DUMMY_SP;
|
let mut best_fail_spot = DUMMY_SP;
|
||||||
let mut best_fail_msg = ~"internal error: ran no matchers";
|
let mut best_fail_msg = ~"internal error: ran no matchers";
|
||||||
|
|
||||||
let s_d = cx.parse_sess().span_diagnostic;
|
|
||||||
|
|
||||||
for (i, lhs) in lhses.iter().enumerate() { // try each arm's matchers
|
for (i, lhs) in lhses.iter().enumerate() { // try each arm's matchers
|
||||||
match **lhs {
|
match **lhs {
|
||||||
MatchedNonterminal(NtMatchers(ref mtcs)) => {
|
MatchedNonterminal(NtMatchers(ref mtcs)) => {
|
||||||
// `None` is because we're not interpolating
|
// `None` is because we're not interpolating
|
||||||
let arg_rdr = new_tt_reader(s_d,
|
let arg_rdr = new_tt_reader(&cx.parse_sess().span_diagnostic,
|
||||||
None,
|
None,
|
||||||
arg.iter()
|
arg.iter()
|
||||||
.map(|x| (*x).clone())
|
.map(|x| (*x).clone())
|
||||||
@ -162,7 +160,8 @@ fn generic_extension(cx: &ExtCtxt,
|
|||||||
_ => cx.span_bug(sp, "bad thing in rhs")
|
_ => cx.span_bug(sp, "bad thing in rhs")
|
||||||
};
|
};
|
||||||
// rhs has holes ( `$id` and `$(...)` that need filled)
|
// rhs has holes ( `$id` and `$(...)` that need filled)
|
||||||
let trncbr = new_tt_reader(s_d, Some(named_matches),
|
let trncbr = new_tt_reader(&cx.parse_sess().span_diagnostic,
|
||||||
|
Some(named_matches),
|
||||||
rhs);
|
rhs);
|
||||||
let p = Parser(cx.parse_sess(), cx.cfg(), ~trncbr);
|
let p = Parser(cx.parse_sess(), cx.cfg(), ~trncbr);
|
||||||
// Let the context choose how to interpret the result.
|
// Let the context choose how to interpret the result.
|
||||||
@ -218,7 +217,7 @@ pub fn add_new_extension(cx: &mut ExtCtxt,
|
|||||||
|
|
||||||
|
|
||||||
// Parse the macro_rules! invocation (`none` is for no interpolations):
|
// Parse the macro_rules! invocation (`none` is for no interpolations):
|
||||||
let arg_reader = new_tt_reader(cx.parse_sess().span_diagnostic,
|
let arg_reader = new_tt_reader(&cx.parse_sess().span_diagnostic,
|
||||||
None,
|
None,
|
||||||
arg.clone());
|
arg.clone());
|
||||||
let argument_map = parse_or_else(cx.parse_sess(),
|
let argument_map = parse_or_else(cx.parse_sess(),
|
||||||
|
@ -30,8 +30,8 @@ struct TtFrame {
|
|||||||
up: Option<@TtFrame>,
|
up: Option<@TtFrame>,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct TtReader {
|
pub struct TtReader<'a> {
|
||||||
sp_diag: @SpanHandler,
|
sp_diag: &'a SpanHandler,
|
||||||
// the unzipped tree:
|
// the unzipped tree:
|
||||||
priv stack: RefCell<@TtFrame>,
|
priv stack: RefCell<@TtFrame>,
|
||||||
/* for MBE-style macro transcription */
|
/* for MBE-style macro transcription */
|
||||||
@ -46,10 +46,10 @@ pub struct TtReader {
|
|||||||
/** This can do Macro-By-Example transcription. On the other hand, if
|
/** This can do Macro-By-Example transcription. On the other hand, if
|
||||||
* `src` contains no `TTSeq`s and `TTNonterminal`s, `interp` can (and
|
* `src` contains no `TTSeq`s and `TTNonterminal`s, `interp` can (and
|
||||||
* should) be none. */
|
* should) be none. */
|
||||||
pub fn new_tt_reader(sp_diag: @SpanHandler,
|
pub fn new_tt_reader<'a>(sp_diag: &'a SpanHandler,
|
||||||
interp: Option<HashMap<Ident, @NamedMatch>>,
|
interp: Option<HashMap<Ident, @NamedMatch>>,
|
||||||
src: Vec<ast::TokenTree> )
|
src: Vec<ast::TokenTree> )
|
||||||
-> TtReader {
|
-> TtReader<'a> {
|
||||||
let r = TtReader {
|
let r = TtReader {
|
||||||
sp_diag: sp_diag,
|
sp_diag: sp_diag,
|
||||||
stack: RefCell::new(@TtFrame {
|
stack: RefCell::new(@TtFrame {
|
||||||
@ -70,7 +70,7 @@ pub fn new_tt_reader(sp_diag: @SpanHandler,
|
|||||||
cur_span: RefCell::new(DUMMY_SP),
|
cur_span: RefCell::new(DUMMY_SP),
|
||||||
};
|
};
|
||||||
tt_next_token(&r); /* get cur_tok and cur_span set up */
|
tt_next_token(&r); /* get cur_tok and cur_span set up */
|
||||||
return r;
|
r
|
||||||
}
|
}
|
||||||
|
|
||||||
fn dup_tt_frame(f: @TtFrame) -> @TtFrame {
|
fn dup_tt_frame(f: @TtFrame) -> @TtFrame {
|
||||||
@ -86,7 +86,7 @@ fn dup_tt_frame(f: @TtFrame) -> @TtFrame {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn dup_tt_reader(r: &TtReader) -> TtReader {
|
pub fn dup_tt_reader<'a>(r: &TtReader<'a>) -> TtReader<'a> {
|
||||||
TtReader {
|
TtReader {
|
||||||
sp_diag: r.sp_diag,
|
sp_diag: r.sp_diag,
|
||||||
stack: RefCell::new(dup_tt_frame(r.stack.get())),
|
stack: RefCell::new(dup_tt_frame(r.stack.get())),
|
||||||
|
@ -346,10 +346,10 @@ pub struct Literal {
|
|||||||
// it appears this function is called only from pprust... that's
|
// it appears this function is called only from pprust... that's
|
||||||
// probably not a good thing.
|
// probably not a good thing.
|
||||||
pub fn gather_comments_and_literals(span_diagnostic:
|
pub fn gather_comments_and_literals(span_diagnostic:
|
||||||
@diagnostic::SpanHandler,
|
&diagnostic::SpanHandler,
|
||||||
path: ~str,
|
path: ~str,
|
||||||
srdr: &mut io::Reader)
|
srdr: &mut io::Reader)
|
||||||
-> (Vec<Comment> , Vec<Literal> ) {
|
-> (Vec<Comment>, Vec<Literal>) {
|
||||||
let src = srdr.read_to_end().unwrap();
|
let src = srdr.read_to_end().unwrap();
|
||||||
let src = str::from_utf8_owned(src).unwrap();
|
let src = str::from_utf8_owned(src).unwrap();
|
||||||
let cm = CodeMap::new();
|
let cm = CodeMap::new();
|
||||||
|
@ -18,6 +18,7 @@ use parse::token::{str_to_ident};
|
|||||||
|
|
||||||
use std::cell::{Cell, RefCell};
|
use std::cell::{Cell, RefCell};
|
||||||
use std::char;
|
use std::char;
|
||||||
|
use std::rc::Rc;
|
||||||
use std::mem::replace;
|
use std::mem::replace;
|
||||||
use std::num::from_str_radix;
|
use std::num::from_str_radix;
|
||||||
|
|
||||||
@ -27,7 +28,7 @@ pub trait Reader {
|
|||||||
fn is_eof(&self) -> bool;
|
fn is_eof(&self) -> bool;
|
||||||
fn next_token(&self) -> TokenAndSpan;
|
fn next_token(&self) -> TokenAndSpan;
|
||||||
fn fatal(&self, ~str) -> !;
|
fn fatal(&self, ~str) -> !;
|
||||||
fn span_diag(&self) -> @SpanHandler;
|
fn span_diag<'a>(&'a self) -> &'a SpanHandler;
|
||||||
fn peek(&self) -> TokenAndSpan;
|
fn peek(&self) -> TokenAndSpan;
|
||||||
fn dup(&self) -> ~Reader:;
|
fn dup(&self) -> ~Reader:;
|
||||||
}
|
}
|
||||||
@ -38,8 +39,8 @@ pub struct TokenAndSpan {
|
|||||||
sp: Span,
|
sp: Span,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct StringReader {
|
pub struct StringReader<'a> {
|
||||||
span_diagnostic: @SpanHandler,
|
span_diagnostic: &'a SpanHandler,
|
||||||
// The absolute offset within the codemap of the next character to read
|
// The absolute offset within the codemap of the next character to read
|
||||||
pos: Cell<BytePos>,
|
pos: Cell<BytePos>,
|
||||||
// The absolute offset within the codemap of the last character read(curr)
|
// The absolute offset within the codemap of the last character read(curr)
|
||||||
@ -48,36 +49,36 @@ pub struct StringReader {
|
|||||||
col: Cell<CharPos>,
|
col: Cell<CharPos>,
|
||||||
// The last character to be read
|
// The last character to be read
|
||||||
curr: Cell<Option<char>>,
|
curr: Cell<Option<char>>,
|
||||||
filemap: @codemap::FileMap,
|
filemap: Rc<codemap::FileMap>,
|
||||||
/* cached: */
|
/* cached: */
|
||||||
peek_tok: RefCell<token::Token>,
|
peek_tok: RefCell<token::Token>,
|
||||||
peek_span: RefCell<Span>,
|
peek_span: RefCell<Span>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl StringReader {
|
impl<'a> StringReader<'a> {
|
||||||
pub fn curr_is(&self, c: char) -> bool {
|
pub fn curr_is(&self, c: char) -> bool {
|
||||||
self.curr.get() == Some(c)
|
self.curr.get() == Some(c)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn new_string_reader(span_diagnostic: @SpanHandler,
|
pub fn new_string_reader<'a>(span_diagnostic: &'a SpanHandler,
|
||||||
filemap: @codemap::FileMap)
|
filemap: Rc<codemap::FileMap>)
|
||||||
-> StringReader {
|
-> StringReader<'a> {
|
||||||
let r = new_low_level_string_reader(span_diagnostic, filemap);
|
let r = new_low_level_string_reader(span_diagnostic, filemap);
|
||||||
string_advance_token(&r); /* fill in peek_* */
|
string_advance_token(&r); /* fill in peek_* */
|
||||||
r
|
r
|
||||||
}
|
}
|
||||||
|
|
||||||
/* For comments.rs, which hackily pokes into 'pos' and 'curr' */
|
/* For comments.rs, which hackily pokes into 'pos' and 'curr' */
|
||||||
pub fn new_low_level_string_reader(span_diagnostic: @SpanHandler,
|
pub fn new_low_level_string_reader<'a>(span_diagnostic: &'a SpanHandler,
|
||||||
filemap: @codemap::FileMap)
|
filemap: Rc<codemap::FileMap>)
|
||||||
-> StringReader {
|
-> StringReader<'a> {
|
||||||
// Force the initial reader bump to start on a fresh line
|
// Force the initial reader bump to start on a fresh line
|
||||||
let initial_char = '\n';
|
let initial_char = '\n';
|
||||||
let r = StringReader {
|
let r = StringReader {
|
||||||
span_diagnostic: span_diagnostic,
|
span_diagnostic: span_diagnostic,
|
||||||
pos: Cell::new(filemap.start_pos),
|
pos: Cell::new(filemap.deref().start_pos),
|
||||||
last_pos: Cell::new(filemap.start_pos),
|
last_pos: Cell::new(filemap.deref().start_pos),
|
||||||
col: Cell::new(CharPos(0)),
|
col: Cell::new(CharPos(0)),
|
||||||
curr: Cell::new(Some(initial_char)),
|
curr: Cell::new(Some(initial_char)),
|
||||||
filemap: filemap,
|
filemap: filemap,
|
||||||
@ -92,20 +93,20 @@ pub fn new_low_level_string_reader(span_diagnostic: @SpanHandler,
|
|||||||
// duplicating the string reader is probably a bad idea, in
|
// duplicating the string reader is probably a bad idea, in
|
||||||
// that using them will cause interleaved pushes of line
|
// that using them will cause interleaved pushes of line
|
||||||
// offsets to the underlying filemap...
|
// offsets to the underlying filemap...
|
||||||
fn dup_string_reader(r: &StringReader) -> StringReader {
|
fn dup_string_reader<'a>(r: &StringReader<'a>) -> StringReader<'a> {
|
||||||
StringReader {
|
StringReader {
|
||||||
span_diagnostic: r.span_diagnostic,
|
span_diagnostic: r.span_diagnostic,
|
||||||
pos: Cell::new(r.pos.get()),
|
pos: Cell::new(r.pos.get()),
|
||||||
last_pos: Cell::new(r.last_pos.get()),
|
last_pos: Cell::new(r.last_pos.get()),
|
||||||
col: Cell::new(r.col.get()),
|
col: Cell::new(r.col.get()),
|
||||||
curr: Cell::new(r.curr.get()),
|
curr: Cell::new(r.curr.get()),
|
||||||
filemap: r.filemap,
|
filemap: r.filemap.clone(),
|
||||||
peek_tok: r.peek_tok.clone(),
|
peek_tok: r.peek_tok.clone(),
|
||||||
peek_span: r.peek_span.clone(),
|
peek_span: r.peek_span.clone(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Reader for StringReader {
|
impl<'a> Reader for StringReader<'a> {
|
||||||
fn is_eof(&self) -> bool { is_eof(self) }
|
fn is_eof(&self) -> bool { is_eof(self) }
|
||||||
// return the next token. EFFECT: advances the string_reader.
|
// return the next token. EFFECT: advances the string_reader.
|
||||||
fn next_token(&self) -> TokenAndSpan {
|
fn next_token(&self) -> TokenAndSpan {
|
||||||
@ -122,7 +123,7 @@ impl Reader for StringReader {
|
|||||||
fn fatal(&self, m: ~str) -> ! {
|
fn fatal(&self, m: ~str) -> ! {
|
||||||
self.span_diagnostic.span_fatal(self.peek_span.get(), m)
|
self.span_diagnostic.span_fatal(self.peek_span.get(), m)
|
||||||
}
|
}
|
||||||
fn span_diag(&self) -> @SpanHandler { self.span_diagnostic }
|
fn span_diag<'a>(&'a self) -> &'a SpanHandler { self.span_diagnostic }
|
||||||
fn peek(&self) -> TokenAndSpan {
|
fn peek(&self) -> TokenAndSpan {
|
||||||
// FIXME(pcwalton): Bad copy!
|
// FIXME(pcwalton): Bad copy!
|
||||||
TokenAndSpan {
|
TokenAndSpan {
|
||||||
@ -133,7 +134,7 @@ impl Reader for StringReader {
|
|||||||
fn dup(&self) -> ~Reader: { ~dup_string_reader(self) as ~Reader: }
|
fn dup(&self) -> ~Reader: { ~dup_string_reader(self) as ~Reader: }
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Reader for TtReader {
|
impl<'a> Reader for TtReader<'a> {
|
||||||
fn is_eof(&self) -> bool {
|
fn is_eof(&self) -> bool {
|
||||||
let cur_tok = self.cur_tok.borrow();
|
let cur_tok = self.cur_tok.borrow();
|
||||||
*cur_tok.get() == token::EOF
|
*cur_tok.get() == token::EOF
|
||||||
@ -146,7 +147,7 @@ impl Reader for TtReader {
|
|||||||
fn fatal(&self, m: ~str) -> ! {
|
fn fatal(&self, m: ~str) -> ! {
|
||||||
self.sp_diag.span_fatal(self.cur_span.get(), m);
|
self.sp_diag.span_fatal(self.cur_span.get(), m);
|
||||||
}
|
}
|
||||||
fn span_diag(&self) -> @SpanHandler { self.sp_diag }
|
fn span_diag<'a>(&'a self) -> &'a SpanHandler { self.sp_diag }
|
||||||
fn peek(&self) -> TokenAndSpan {
|
fn peek(&self) -> TokenAndSpan {
|
||||||
TokenAndSpan {
|
TokenAndSpan {
|
||||||
tok: self.cur_tok.get(),
|
tok: self.cur_tok.get(),
|
||||||
@ -189,7 +190,7 @@ fn fatal_span_verbose(rdr: &StringReader,
|
|||||||
-> ! {
|
-> ! {
|
||||||
let mut m = m;
|
let mut m = m;
|
||||||
m.push_str(": ");
|
m.push_str(": ");
|
||||||
let s = rdr.filemap.src.slice(
|
let s = rdr.filemap.deref().src.slice(
|
||||||
byte_offset(rdr, from_pos).to_uint(),
|
byte_offset(rdr, from_pos).to_uint(),
|
||||||
byte_offset(rdr, to_pos).to_uint());
|
byte_offset(rdr, to_pos).to_uint());
|
||||||
m.push_str(s);
|
m.push_str(s);
|
||||||
@ -218,7 +219,7 @@ fn string_advance_token(r: &StringReader) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn byte_offset(rdr: &StringReader, pos: BytePos) -> BytePos {
|
fn byte_offset(rdr: &StringReader, pos: BytePos) -> BytePos {
|
||||||
(pos - rdr.filemap.start_pos)
|
(pos - rdr.filemap.deref().start_pos)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Calls `f` with a string slice of the source text spanning from `start`
|
/// Calls `f` with a string slice of the source text spanning from `start`
|
||||||
@ -240,7 +241,7 @@ fn with_str_from_to<T>(
|
|||||||
end: BytePos,
|
end: BytePos,
|
||||||
f: |s: &str| -> T)
|
f: |s: &str| -> T)
|
||||||
-> T {
|
-> T {
|
||||||
f(rdr.filemap.src.slice(
|
f(rdr.filemap.deref().src.slice(
|
||||||
byte_offset(rdr, start).to_uint(),
|
byte_offset(rdr, start).to_uint(),
|
||||||
byte_offset(rdr, end).to_uint()))
|
byte_offset(rdr, end).to_uint()))
|
||||||
}
|
}
|
||||||
@ -250,21 +251,21 @@ fn with_str_from_to<T>(
|
|||||||
pub fn bump(rdr: &StringReader) {
|
pub fn bump(rdr: &StringReader) {
|
||||||
rdr.last_pos.set(rdr.pos.get());
|
rdr.last_pos.set(rdr.pos.get());
|
||||||
let current_byte_offset = byte_offset(rdr, rdr.pos.get()).to_uint();
|
let current_byte_offset = byte_offset(rdr, rdr.pos.get()).to_uint();
|
||||||
if current_byte_offset < (rdr.filemap.src).len() {
|
if current_byte_offset < rdr.filemap.deref().src.len() {
|
||||||
assert!(rdr.curr.get().is_some());
|
assert!(rdr.curr.get().is_some());
|
||||||
let last_char = rdr.curr.get().unwrap();
|
let last_char = rdr.curr.get().unwrap();
|
||||||
let next = rdr.filemap.src.char_range_at(current_byte_offset);
|
let next = rdr.filemap.deref().src.char_range_at(current_byte_offset);
|
||||||
let byte_offset_diff = next.next - current_byte_offset;
|
let byte_offset_diff = next.next - current_byte_offset;
|
||||||
rdr.pos.set(rdr.pos.get() + Pos::from_uint(byte_offset_diff));
|
rdr.pos.set(rdr.pos.get() + Pos::from_uint(byte_offset_diff));
|
||||||
rdr.curr.set(Some(next.ch));
|
rdr.curr.set(Some(next.ch));
|
||||||
rdr.col.set(rdr.col.get() + CharPos(1u));
|
rdr.col.set(rdr.col.get() + CharPos(1u));
|
||||||
if last_char == '\n' {
|
if last_char == '\n' {
|
||||||
rdr.filemap.next_line(rdr.last_pos.get());
|
rdr.filemap.deref().next_line(rdr.last_pos.get());
|
||||||
rdr.col.set(CharPos(0u));
|
rdr.col.set(CharPos(0u));
|
||||||
}
|
}
|
||||||
|
|
||||||
if byte_offset_diff > 1 {
|
if byte_offset_diff > 1 {
|
||||||
rdr.filemap.record_multibyte_char(rdr.last_pos.get(), byte_offset_diff);
|
rdr.filemap.deref().record_multibyte_char(rdr.last_pos.get(), byte_offset_diff);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
rdr.curr.set(None);
|
rdr.curr.set(None);
|
||||||
@ -275,8 +276,8 @@ pub fn is_eof(rdr: &StringReader) -> bool {
|
|||||||
}
|
}
|
||||||
pub fn nextch(rdr: &StringReader) -> Option<char> {
|
pub fn nextch(rdr: &StringReader) -> Option<char> {
|
||||||
let offset = byte_offset(rdr, rdr.pos.get()).to_uint();
|
let offset = byte_offset(rdr, rdr.pos.get()).to_uint();
|
||||||
if offset < (rdr.filemap.src).len() {
|
if offset < rdr.filemap.deref().src.len() {
|
||||||
Some(rdr.filemap.src.char_at(offset))
|
Some(rdr.filemap.deref().src.char_at(offset))
|
||||||
} else {
|
} else {
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
@ -334,56 +335,55 @@ fn consume_any_line_comment(rdr: &StringReader)
|
|||||||
-> Option<TokenAndSpan> {
|
-> Option<TokenAndSpan> {
|
||||||
if rdr.curr_is('/') {
|
if rdr.curr_is('/') {
|
||||||
match nextch(rdr) {
|
match nextch(rdr) {
|
||||||
Some('/') => {
|
Some('/') => {
|
||||||
bump(rdr);
|
bump(rdr);
|
||||||
bump(rdr);
|
bump(rdr);
|
||||||
// line comments starting with "///" or "//!" are doc-comments
|
// line comments starting with "///" or "//!" are doc-comments
|
||||||
if rdr.curr_is('/') || rdr.curr_is('!') {
|
if rdr.curr_is('/') || rdr.curr_is('!') {
|
||||||
let start_bpos = rdr.pos.get() - BytePos(3);
|
let start_bpos = rdr.pos.get() - BytePos(3);
|
||||||
while !rdr.curr_is('\n') && !is_eof(rdr) {
|
while !rdr.curr_is('\n') && !is_eof(rdr) {
|
||||||
bump(rdr);
|
bump(rdr);
|
||||||
}
|
|
||||||
let ret = with_str_from(rdr, start_bpos, |string| {
|
|
||||||
// but comments with only more "/"s are not
|
|
||||||
if !is_line_non_doc_comment(string) {
|
|
||||||
Some(TokenAndSpan{
|
|
||||||
tok: token::DOC_COMMENT(str_to_ident(string)),
|
|
||||||
sp: codemap::mk_sp(start_bpos, rdr.pos.get())
|
|
||||||
})
|
|
||||||
} else {
|
|
||||||
None
|
|
||||||
}
|
}
|
||||||
});
|
let ret = with_str_from(rdr, start_bpos, |string| {
|
||||||
|
// but comments with only more "/"s are not
|
||||||
|
if !is_line_non_doc_comment(string) {
|
||||||
|
Some(TokenAndSpan{
|
||||||
|
tok: token::DOC_COMMENT(str_to_ident(string)),
|
||||||
|
sp: codemap::mk_sp(start_bpos, rdr.pos.get())
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
if ret.is_some() {
|
if ret.is_some() {
|
||||||
return ret;
|
return ret;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
while !rdr.curr_is('\n') && !is_eof(rdr) { bump(rdr); }
|
||||||
}
|
}
|
||||||
} else {
|
// Restart whitespace munch.
|
||||||
while !rdr.curr_is('\n') && !is_eof(rdr) { bump(rdr); }
|
consume_whitespace_and_comments(rdr)
|
||||||
}
|
}
|
||||||
// Restart whitespace munch.
|
Some('*') => { bump(rdr); bump(rdr); consume_block_comment(rdr) }
|
||||||
return consume_whitespace_and_comments(rdr);
|
_ => None
|
||||||
}
|
|
||||||
Some('*') => { bump(rdr); bump(rdr); return consume_block_comment(rdr); }
|
|
||||||
_ => ()
|
|
||||||
}
|
}
|
||||||
} else if rdr.curr_is('#') {
|
} else if rdr.curr_is('#') {
|
||||||
if nextch_is(rdr, '!') {
|
if nextch_is(rdr, '!') {
|
||||||
// I guess this is the only way to figure out if
|
// I guess this is the only way to figure out if
|
||||||
// we're at the beginning of the file...
|
// we're at the beginning of the file...
|
||||||
let cmap = @CodeMap::new();
|
let cmap = CodeMap::new();
|
||||||
{
|
cmap.files.borrow_mut().get().push(rdr.filemap.clone());
|
||||||
let mut files = cmap.files.borrow_mut();
|
|
||||||
files.get().push(rdr.filemap);
|
|
||||||
}
|
|
||||||
let loc = cmap.lookup_char_pos_adj(rdr.last_pos.get());
|
let loc = cmap.lookup_char_pos_adj(rdr.last_pos.get());
|
||||||
if loc.line == 1u && loc.col == CharPos(0u) {
|
if loc.line == 1u && loc.col == CharPos(0u) {
|
||||||
while !rdr.curr_is('\n') && !is_eof(rdr) { bump(rdr); }
|
while !rdr.curr_is('\n') && !is_eof(rdr) { bump(rdr); }
|
||||||
return consume_whitespace_and_comments(rdr);
|
return consume_whitespace_and_comments(rdr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
None
|
||||||
|
} else {
|
||||||
|
None
|
||||||
}
|
}
|
||||||
return None;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn is_block_non_doc_comment(s: &str) -> bool {
|
pub fn is_block_non_doc_comment(s: &str) -> bool {
|
||||||
@ -1019,7 +1019,7 @@ mod test {
|
|||||||
let writer = ~util::NullWriter;
|
let writer = ~util::NullWriter;
|
||||||
let emitter = diagnostic::EmitterWriter::new(writer);
|
let emitter = diagnostic::EmitterWriter::new(writer);
|
||||||
let handler = diagnostic::mk_handler(~emitter);
|
let handler = diagnostic::mk_handler(~emitter);
|
||||||
let span_handler = diagnostic::mk_span_handler(handler, @cm);
|
let span_handler = diagnostic::mk_span_handler(handler, cm);
|
||||||
Env {
|
Env {
|
||||||
string_reader: new_string_reader(span_handler,fm)
|
string_reader: new_string_reader(span_handler,fm)
|
||||||
}
|
}
|
||||||
|
@ -13,13 +13,13 @@
|
|||||||
|
|
||||||
use ast;
|
use ast;
|
||||||
use codemap::{Span, CodeMap, FileMap};
|
use codemap::{Span, CodeMap, FileMap};
|
||||||
use codemap;
|
|
||||||
use diagnostic::{SpanHandler, mk_span_handler, default_handler};
|
use diagnostic::{SpanHandler, mk_span_handler, default_handler};
|
||||||
use parse::attr::ParserAttr;
|
use parse::attr::ParserAttr;
|
||||||
use parse::parser::Parser;
|
use parse::parser::Parser;
|
||||||
|
|
||||||
use std::cell::RefCell;
|
use std::cell::RefCell;
|
||||||
use std::io::File;
|
use std::io::File;
|
||||||
|
use std::rc::Rc;
|
||||||
use std::str;
|
use std::str;
|
||||||
use std::vec_ng::Vec;
|
use std::vec_ng::Vec;
|
||||||
|
|
||||||
@ -40,26 +40,20 @@ pub mod obsolete;
|
|||||||
|
|
||||||
// info about a parsing session.
|
// info about a parsing session.
|
||||||
pub struct ParseSess {
|
pub struct ParseSess {
|
||||||
cm: @codemap::CodeMap, // better be the same as the one in the reader!
|
span_diagnostic: SpanHandler, // better be the same as the one in the reader!
|
||||||
span_diagnostic: @SpanHandler, // better be the same as the one in the reader!
|
|
||||||
/// Used to determine and report recursive mod inclusions
|
/// Used to determine and report recursive mod inclusions
|
||||||
included_mod_stack: RefCell<Vec<Path> >,
|
included_mod_stack: RefCell<Vec<Path>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn new_parse_sess() -> ParseSess {
|
pub fn new_parse_sess() -> ParseSess {
|
||||||
let cm = @CodeMap::new();
|
|
||||||
ParseSess {
|
ParseSess {
|
||||||
cm: cm,
|
span_diagnostic: mk_span_handler(default_handler(), CodeMap::new()),
|
||||||
span_diagnostic: mk_span_handler(default_handler(), cm),
|
|
||||||
included_mod_stack: RefCell::new(Vec::new()),
|
included_mod_stack: RefCell::new(Vec::new()),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn new_parse_sess_special_handler(sh: @SpanHandler,
|
pub fn new_parse_sess_special_handler(sh: SpanHandler) -> ParseSess {
|
||||||
cm: @codemap::CodeMap)
|
|
||||||
-> ParseSess {
|
|
||||||
ParseSess {
|
ParseSess {
|
||||||
cm: cm,
|
|
||||||
span_diagnostic: sh,
|
span_diagnostic: sh,
|
||||||
included_mod_stack: RefCell::new(Vec::new()),
|
included_mod_stack: RefCell::new(Vec::new()),
|
||||||
}
|
}
|
||||||
@ -175,40 +169,36 @@ pub fn parse_tts_from_source_str(name: ~str,
|
|||||||
|
|
||||||
// Create a new parser from a source string
|
// Create a new parser from a source string
|
||||||
pub fn new_parser_from_source_str<'a>(sess: &'a ParseSess,
|
pub fn new_parser_from_source_str<'a>(sess: &'a ParseSess,
|
||||||
cfg: ast::CrateConfig,
|
cfg: ast::CrateConfig,
|
||||||
name: ~str,
|
name: ~str,
|
||||||
source: ~str)
|
source: ~str)
|
||||||
-> Parser<'a> {
|
-> Parser<'a> {
|
||||||
filemap_to_parser(sess,string_to_filemap(sess,source,name),cfg)
|
filemap_to_parser(sess, string_to_filemap(sess, source, name), cfg)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Create a new parser, handling errors as appropriate
|
/// Create a new parser, handling errors as appropriate
|
||||||
/// if the file doesn't exist
|
/// if the file doesn't exist
|
||||||
pub fn new_parser_from_file<'a>(
|
pub fn new_parser_from_file<'a>(sess: &'a ParseSess,
|
||||||
sess: &'a ParseSess,
|
cfg: ast::CrateConfig,
|
||||||
cfg: ast::CrateConfig,
|
path: &Path) -> Parser<'a> {
|
||||||
path: &Path
|
filemap_to_parser(sess, file_to_filemap(sess, path, None), cfg)
|
||||||
) -> Parser<'a> {
|
|
||||||
filemap_to_parser(sess,file_to_filemap(sess,path,None),cfg)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Given a session, a crate config, a path, and a span, add
|
/// Given a session, a crate config, a path, and a span, add
|
||||||
/// the file at the given path to the codemap, and return a parser.
|
/// the file at the given path to the codemap, and return a parser.
|
||||||
/// On an error, use the given span as the source of the problem.
|
/// On an error, use the given span as the source of the problem.
|
||||||
pub fn new_sub_parser_from_file<'a>(
|
pub fn new_sub_parser_from_file<'a>(sess: &'a ParseSess,
|
||||||
sess: &'a ParseSess,
|
cfg: ast::CrateConfig,
|
||||||
cfg: ast::CrateConfig,
|
path: &Path,
|
||||||
path: &Path,
|
sp: Span) -> Parser<'a> {
|
||||||
sp: Span
|
filemap_to_parser(sess, file_to_filemap(sess, path, Some(sp)), cfg)
|
||||||
) -> Parser<'a> {
|
|
||||||
filemap_to_parser(sess,file_to_filemap(sess,path,Some(sp)),cfg)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Given a filemap and config, return a parser
|
/// Given a filemap and config, return a parser
|
||||||
pub fn filemap_to_parser<'a>(sess: &'a ParseSess,
|
pub fn filemap_to_parser<'a>(sess: &'a ParseSess,
|
||||||
filemap: @FileMap,
|
filemap: Rc<FileMap>,
|
||||||
cfg: ast::CrateConfig) -> Parser<'a> {
|
cfg: ast::CrateConfig) -> Parser<'a> {
|
||||||
tts_to_parser(sess,filemap_to_tts(sess,filemap),cfg)
|
tts_to_parser(sess, filemap_to_tts(sess, filemap), cfg)
|
||||||
}
|
}
|
||||||
|
|
||||||
// must preserve old name for now, because quote! from the *existing*
|
// must preserve old name for now, because quote! from the *existing*
|
||||||
@ -216,7 +206,7 @@ pub fn filemap_to_parser<'a>(sess: &'a ParseSess,
|
|||||||
pub fn new_parser_from_tts<'a>(sess: &'a ParseSess,
|
pub fn new_parser_from_tts<'a>(sess: &'a ParseSess,
|
||||||
cfg: ast::CrateConfig,
|
cfg: ast::CrateConfig,
|
||||||
tts: Vec<ast::TokenTree>) -> Parser<'a> {
|
tts: Vec<ast::TokenTree>) -> Parser<'a> {
|
||||||
tts_to_parser(sess,tts,cfg)
|
tts_to_parser(sess, tts, cfg)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -225,7 +215,7 @@ pub fn new_parser_from_tts<'a>(sess: &'a ParseSess,
|
|||||||
/// Given a session and a path and an optional span (for error reporting),
|
/// Given a session and a path and an optional span (for error reporting),
|
||||||
/// add the path to the session's codemap and return the new filemap.
|
/// add the path to the session's codemap and return the new filemap.
|
||||||
pub fn file_to_filemap(sess: &ParseSess, path: &Path, spanopt: Option<Span>)
|
pub fn file_to_filemap(sess: &ParseSess, path: &Path, spanopt: Option<Span>)
|
||||||
-> @FileMap {
|
-> Rc<FileMap> {
|
||||||
let err = |msg: &str| {
|
let err = |msg: &str| {
|
||||||
match spanopt {
|
match spanopt {
|
||||||
Some(sp) => sess.span_diagnostic.span_fatal(sp, msg),
|
Some(sp) => sess.span_diagnostic.span_fatal(sp, msg),
|
||||||
@ -251,17 +241,17 @@ pub fn file_to_filemap(sess: &ParseSess, path: &Path, spanopt: Option<Span>)
|
|||||||
// given a session and a string, add the string to
|
// given a session and a string, add the string to
|
||||||
// the session's codemap and return the new filemap
|
// the session's codemap and return the new filemap
|
||||||
pub fn string_to_filemap(sess: &ParseSess, source: ~str, path: ~str)
|
pub fn string_to_filemap(sess: &ParseSess, source: ~str, path: ~str)
|
||||||
-> @FileMap {
|
-> Rc<FileMap> {
|
||||||
sess.cm.new_filemap(path, source)
|
sess.span_diagnostic.cm.new_filemap(path, source)
|
||||||
}
|
}
|
||||||
|
|
||||||
// given a filemap, produce a sequence of token-trees
|
// given a filemap, produce a sequence of token-trees
|
||||||
pub fn filemap_to_tts(sess: &ParseSess, filemap: @FileMap)
|
pub fn filemap_to_tts(sess: &ParseSess, filemap: Rc<FileMap>)
|
||||||
-> Vec<ast::TokenTree> {
|
-> Vec<ast::TokenTree> {
|
||||||
// it appears to me that the cfg doesn't matter here... indeed,
|
// it appears to me that the cfg doesn't matter here... indeed,
|
||||||
// parsing tt's probably shouldn't require a parser at all.
|
// parsing tt's probably shouldn't require a parser at all.
|
||||||
let cfg = Vec::new();
|
let cfg = Vec::new();
|
||||||
let srdr = lexer::new_string_reader(sess.span_diagnostic, filemap);
|
let srdr = lexer::new_string_reader(&sess.span_diagnostic, filemap);
|
||||||
let mut p1 = Parser(sess, cfg, ~srdr);
|
let mut p1 = Parser(sess, cfg, ~srdr);
|
||||||
p1.parse_all_token_trees()
|
p1.parse_all_token_trees()
|
||||||
}
|
}
|
||||||
@ -270,7 +260,7 @@ pub fn filemap_to_tts(sess: &ParseSess, filemap: @FileMap)
|
|||||||
pub fn tts_to_parser<'a>(sess: &'a ParseSess,
|
pub fn tts_to_parser<'a>(sess: &'a ParseSess,
|
||||||
tts: Vec<ast::TokenTree>,
|
tts: Vec<ast::TokenTree>,
|
||||||
cfg: ast::CrateConfig) -> Parser<'a> {
|
cfg: ast::CrateConfig) -> Parser<'a> {
|
||||||
let trdr = lexer::new_tt_reader(sess.span_diagnostic, None, tts);
|
let trdr = lexer::new_tt_reader(&sess.span_diagnostic, None, tts);
|
||||||
Parser(sess, cfg, ~trdr)
|
Parser(sess, cfg, ~trdr)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4150,7 +4150,7 @@ impl<'a> Parser<'a> {
|
|||||||
outer_attrs: &[ast::Attribute],
|
outer_attrs: &[ast::Attribute],
|
||||||
id_sp: Span)
|
id_sp: Span)
|
||||||
-> (ast::Item_, Vec<ast::Attribute> ) {
|
-> (ast::Item_, Vec<ast::Attribute> ) {
|
||||||
let mut prefix = Path::new(self.sess.cm.span_to_filename(self.span));
|
let mut prefix = Path::new(self.sess.span_diagnostic.cm.span_to_filename(self.span));
|
||||||
prefix.pop();
|
prefix.pop();
|
||||||
let mod_path = Path::new(".").join_many(self.mod_path_stack.as_slice());
|
let mod_path = Path::new(".").join_many(self.mod_path_stack.as_slice());
|
||||||
let dir_path = prefix.join(&mod_path);
|
let dir_path = prefix.join(&mod_path);
|
||||||
|
Loading…
Reference in New Issue
Block a user