use ast;
use codemap::{self, Span, CodeMap, FileMap};
-use errors::{Handler, ColorConfig, FatalError};
+use errors::{Handler, ColorConfig, DiagnosticBuilder};
use parse::parser::Parser;
use parse::token::InternedString;
use ptr::P;
use std::rc::Rc;
use std::str;
-pub type PResult<T> = Result<T, FatalError>;
+pub type PResult<'a, T> = Result<T, DiagnosticBuilder<'a>>;
#[macro_use]
pub mod parser;
impl ParseSess {
pub fn new() -> ParseSess {
let cm = Rc::new(CodeMap::new());
- let handler = Handler::new(ColorConfig::Auto, None, true, cm.clone());
+ let handler = Handler::new(ColorConfig::Auto, None, true, false, cm.clone());
ParseSess::with_span_handler(handler, cm)
}
cfg: ast::CrateConfig,
sess: &ParseSess
) -> ast::Crate {
- panictry!(new_parser_from_file(sess, cfg, input).parse_crate_mod())
- // why is there no p.abort_if_errors here?
+ let mut parser = new_parser_from_file(sess, cfg, input);
+ abort_if_errors(parser.parse_crate_mod(), &parser)
}
pub fn parse_crate_attrs_from_file(
cfg: ast::CrateConfig,
sess: &ParseSess
) -> Vec<ast::Attribute> {
- // FIXME: maybe_aborted?
- panictry!(new_parser_from_file(sess, cfg, input).parse_inner_attributes())
+ let mut parser = new_parser_from_file(sess, cfg, input);
+ abort_if_errors(parser.parse_inner_attributes(), &parser)
}
pub fn parse_crate_from_source_str(name: String,
result
}
+fn abort_if_errors<'a, T>(result: PResult<'a, T>, p: &Parser) -> T {
+ match result {
+ Ok(c) => {
+ p.abort_if_errors();
+ c
+ }
+ Err(mut e) => {
+ e.emit();
+ p.abort_if_errors();
+ unreachable!();
+ }
+ }
+}
+
/// Parse a string representing a character literal into its final form.
/// Rather than just accepting/rejecting a given literal, unescapes it as
/// well. Can take any slice prefixed by a character escape. Returns the
Some(suf) => {
if suf.len() >= 2 && looks_like_width_suffix(&['f'], suf) {
// if it looks like a width, lets try to be helpful.
- sd.span_err(sp, &format!("invalid width `{}` for float literal", &suf[1..]));
- sd.fileline_help(sp, "valid widths are 32 and 64");
+ sd.struct_span_err(sp, &format!("invalid width `{}` for float literal", &suf[1..]))
+ .fileline_help(sp, "valid widths are 32 and 64")
+ .emit();
} else {
- sd.span_err(sp, &format!("invalid suffix `{}` for float literal", suf));
- sd.fileline_help(sp, "valid suffixes are `f32` and `f64`");
+ sd.struct_span_err(sp, &format!("invalid suffix `{}` for float literal", suf))
+ .fileline_help(sp, "valid suffixes are `f32` and `f64`")
+ .emit();
}
ast::LitFloatUnsuffixed(data)
// i<digits> and u<digits> look like widths, so lets
// give an error message along those lines
if looks_like_width_suffix(&['i', 'u'], suf) {
- sd.span_err(sp, &format!("invalid width `{}` for integer literal",
- &suf[1..]));
- sd.fileline_help(sp, "valid widths are 8, 16, 32 and 64");
+ sd.struct_span_err(sp, &format!("invalid width `{}` for integer literal",
+ &suf[1..]))
+ .fileline_help(sp, "valid widths are 8, 16, 32 and 64")
+ .emit();
} else {
- sd.span_err(sp, &format!("invalid suffix `{}` for numeric literal", suf));
- sd.fileline_help(sp, "the suffix must be one of the integral types \
- (`u32`, `isize`, etc)");
+ sd.struct_span_err(sp, &format!("invalid suffix `{}` for numeric literal", suf))
+ .fileline_help(sp, "the suffix must be one of the integral types \
+ (`u32`, `isize`, etc)")
+ .emit();
}
ty
use super::*;
use std::rc::Rc;
use codemap::{Span, BytePos, Pos, Spanned, NO_EXPANSION};
- use owned_slice::OwnedSlice;
use ast::{self, TokenTree};
use abi;
use attr::{first_attr_value_str_by_name, AttrMetaMethods};
assert!(panictry!(parser.parse_pat())
== P(ast::Pat{
id: ast::DUMMY_NODE_ID,
- node: ast::PatIdent(ast::BindByValue(ast::MutImmutable),
+ node: ast::PatIdent(ast::BindingMode::ByValue(ast::MutImmutable),
Spanned{ span:sp(0, 1),
node: str_to_ident("b")
},
pat: P(ast::Pat {
id: ast::DUMMY_NODE_ID,
node: ast::PatIdent(
- ast::BindByValue(ast::MutImmutable),
+ ast::BindingMode::ByValue(ast::MutImmutable),
Spanned{
span: sp(6,7),
node: str_to_ident("b")},
abi::Rust,
ast::Generics{ // no idea on either of these:
lifetimes: Vec::new(),
- ty_params: OwnedSlice::empty(),
+ ty_params: P::empty(),
where_clause: ast::WhereClause {
id: ast::DUMMY_NODE_ID,
predicates: Vec::new(),