From a4774ce87d72e22bb4fe04eaa698de48b3567cf6 Mon Sep 17 00:00:00 2001 From: Jakob Stoklund Olesen Date: Sat, 17 Sep 2016 11:42:08 -0700 Subject: [PATCH] Record the location of parsed functions. Remember the location of the 'function' keyword that starts every function. This can be useful for reporting test failures etc. --- cranelift/src/libreader/parser.rs | 8 +++++--- cranelift/src/libreader/testfile.rs | 2 ++ 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/cranelift/src/libreader/parser.rs b/cranelift/src/libreader/parser.rs index 54a53310ee..6fea02b22b 100644 --- a/cranelift/src/libreader/parser.rs +++ b/cranelift/src/libreader/parser.rs @@ -523,7 +523,7 @@ impl<'a> Parser<'a> { self.comments.clear(); self.gather_comments(AnyEntity::Function); - let (name, sig) = try!(self.parse_function_spec()); + let (location, name, sig) = try!(self.parse_function_spec()); let mut ctx = Context::new(Function::with_name_signature(name, sig)); // function ::= function-spec * "{" preamble function-body "}" @@ -545,6 +545,7 @@ impl<'a> Parser<'a> { try!(ctx.rewrite_references()); let details = Details { + location: location, comments: mem::replace(&mut self.comments, Vec::new()), map: sourcemap::new(ctx.values, ctx.ebbs, ctx.stack_slots, ctx.jump_tables), }; @@ -556,8 +557,9 @@ impl<'a> Parser<'a> { // // function-spec ::= * "function" name signature // - fn parse_function_spec(&mut self) -> Result<(FunctionName, Signature)> { + fn parse_function_spec(&mut self) -> Result<(Location, FunctionName, Signature)> { try!(self.match_token(Token::Function, "expected 'function' keyword")); + let location = self.loc; // function-spec ::= "function" * name signature let name = try!(self.parse_function_name()); @@ -565,7 +567,7 @@ impl<'a> Parser<'a> { // function-spec ::= "function" name * signature let sig = try!(self.parse_signature()); - Ok((name, sig)) + Ok((location, name, sig)) } // Parse a function name. diff --git a/cranelift/src/libreader/testfile.rs b/cranelift/src/libreader/testfile.rs index 34cfabce83..8a9f8d3451 100644 --- a/cranelift/src/libreader/testfile.rs +++ b/cranelift/src/libreader/testfile.rs @@ -8,6 +8,7 @@ use cretonne::ir::Function; use cretonne::ir::entities::AnyEntity; use testcommand::TestCommand; use sourcemap::SourceMap; +use parser::Location; /// A parsed test case. /// @@ -24,6 +25,7 @@ pub struct TestFile<'a> { /// The details to not affect the semantics of the function. #[derive(Debug)] pub struct Details<'a> { + pub location: Location, pub comments: Vec>, pub map: SourceMap, }