Browse Source

Fix parse error reporting for imports

David Peter 2 years ago
parent
commit
446ab913a7
3 changed files with 20 additions and 6 deletions
  1. 1 2
      numbat-cli/src/main.rs
  2. 10 3
      numbat/src/lib.rs
  3. 9 1
      numbat/src/resolver.rs

+ 1 - 2
numbat-cli/src/main.rs

@@ -332,9 +332,8 @@ impl Cli {
             Err(NumbatError::ParseError {
                 inner: ref e @ ParseError { ref span, .. },
                 code_source,
+                line,
             }) => {
-                let line = input.lines().nth(span.line - 1).unwrap(); // TODO
-
                 let code_source_text = match code_source {
                     CodeSource::Text => "<input>".to_string(),
                     CodeSource::File(path) => format!("File {}", path.to_string_lossy()),

+ 10 - 3
numbat/src/lib.rs

@@ -48,6 +48,7 @@ pub enum NumbatError {
     ParseError {
         inner: ParseError,
         code_source: CodeSource,
+        line: String,
     },
     #[error("{0}")]
     ResolverError(ResolverError),
@@ -110,9 +111,15 @@ impl Context {
         let resolver = Resolver::new(self.module_importer.as_ref());
 
         let statements = resolver.resolve(code, code_source).map_err(|e| match e {
-            ResolverError::ParseError { inner, code_source } => {
-                NumbatError::ParseError { inner, code_source }
-            }
+            ResolverError::ParseError {
+                inner,
+                code_source,
+                line,
+            } => NumbatError::ParseError {
+                inner,
+                code_source,
+                line,
+            },
             e => NumbatError::ResolverError(e),
         })?;
 

+ 9 - 1
numbat/src/resolver.rs

@@ -37,6 +37,7 @@ pub enum ResolverError {
     ParseError {
         inner: ParseError,
         code_source: CodeSource,
+        line: String,
     },
 }
 
@@ -52,7 +53,14 @@ impl<'a> Resolver<'a> {
     }
 
     fn parse(&self, code: &str, code_source: CodeSource) -> Result<Vec<Statement>> {
-        parse(code).map_err(|inner| ResolverError::ParseError { inner, code_source })
+        parse(code).map_err(|inner| {
+            let line = code.lines().nth(inner.span.line - 1).unwrap().to_string();
+            ResolverError::ParseError {
+                inner,
+                code_source,
+                line,
+            }
+        })
     }
 
     fn inlining_pass(&self, program: &[Statement]) -> Result<(Vec<Statement>, bool)> {