From d1330500b2a788d102cdc510170ef02394135e13 Mon Sep 17 00:00:00 2001 From: Klesti Selimaj Date: Mon, 18 May 2026 21:40:01 +0200 Subject: [PATCH] Spanned --- parser/src/parser/mod.rs | 28 ++++++++++------------------ src/codegen.rs | 37 ++++++++++++++++++++++++++----------- 2 files changed, 36 insertions(+), 29 deletions(-) diff --git a/parser/src/parser/mod.rs b/parser/src/parser/mod.rs index 6d1ef65..2e73885 100644 --- a/parser/src/parser/mod.rs +++ b/parser/src/parser/mod.rs @@ -39,24 +39,16 @@ impl<'a, T: TryFrom, Error = AstError<'a, T>>> Ok(Self { line: span.0, column: span.1, - item: pair.try_into()?, + item: pair.try_into().map_err(|err: AstError<'_, T>| AstError { + span: err.span, + error_code: err.error_code, + error_message: err.error_message, + recovered: err.recovered.map(|v| Spanned { + line: span.0, + column: span.1, + item: v, + }), + })?, }) } } - -impl<'a, T> From> for AstError<'a, Spanned> { - fn from(value: AstError<'a, T>) -> Self { - let span = value.span.start_pos().line_col(); - - Self { - span: value.span, - error_code: value.error_code, - error_message: value.error_message, - recovered: value.recovered.map(|v| Spanned { - line: span.0, - column: span.1, - item: v, - }), - } - } -} diff --git a/src/codegen.rs b/src/codegen.rs index 2b44796..500b2a5 100644 --- a/src/codegen.rs +++ b/src/codegen.rs @@ -1,8 +1,8 @@ use mist_parser::ast::{ Attribute, BinaryOp, Block, ClassItem, EnumItem, ExprPath, ExprPathSegment, Expression, FieldDecl, FunctionDecl, Generic, GenericDecl, Generics, GenericsDecl, Identifier, ImplDecl, - Literal, Path, Pattern, Postfix, Prefix, Statement, StatementBranch, TopLevel, TopLevelKind, - TypeExpr, TypeExprKind, TypePostfix, VarDecl, VarDeclStmt, Visibility, + Literal, Path, Pattern, Postfix, Prefix, Spanned, Statement, StatementBranch, TopLevel, + TopLevelKind, TypeExpr, TypeExprKind, TypePostfix, VarDecl, VarDeclStmt, Visibility, }; // --------------------------------------------------------------------------- @@ -88,6 +88,17 @@ impl Default for RustCodegen { // GetRust — pure string production (expressions, types) // --------------------------------------------------------------------------- +impl GetRust for Spanned { + fn get_rust(self) -> String { + format!( + "/* {}:{} */ {}", + self.line, + self.column, + self.item.get_rust() + ) + } +} + impl GetRust for TypeExpr { fn get_rust(self) -> String { get_type_postfixes(self.1) + &self.0.get_rust() @@ -315,6 +326,13 @@ impl GetRust for Vec { // ToRust — output-writing (top-level, statements, blocks) // --------------------------------------------------------------------------- +impl ToRust for Spanned { + fn to_rust(self, cg: &mut RustCodegen) { + cg.add_indentedln(&format!("/* {}:{} */", self.line, self.column)); + self.item.to_rust(cg); + } +} + impl ToRust for Block { fn to_rust(self, cg: &mut RustCodegen) { for stmt in self.0 { @@ -325,16 +343,13 @@ impl ToRust for Block { impl ToRust for TopLevel { fn to_rust(self, cg: &mut RustCodegen) { - match self.0 { - TopLevelKind::ModAttribute => { - for attr in self.1 { - cg.addln(&format!("#![{}]", attr.get_rust())); - } + if let TopLevelKind::ModAttribute = self.0.item { + for attr in self.1 { + cg.addln(&format!("#![{}]", attr.get_rust())); } - _ => { - for attr in self.1 { - cg.addln(&format!("#[{}]", attr.get_rust())); - } + } else { + for attr in self.1 { + cg.addln(&format!("#[{}]", attr.get_rust())); } }