Fix NamedVarRefrence tokenrange

This commit is contained in:
Sofia 2025-07-21 10:52:33 +03:00
parent d2ee61e888
commit ce645519ce
5 changed files with 32 additions and 23 deletions

View File

@ -103,14 +103,13 @@ pub struct IfExpression(
); );
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
pub struct LetStatement( pub struct LetStatement {
pub String, pub name: String,
pub Option<Type>, pub ty: Option<Type>,
/// Mutability pub mutable: bool,
pub bool, pub value: Expression,
pub Expression, pub name_range: TokenRange,
pub TokenRange, }
);
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
pub struct ImportStatement(pub Vec<String>, pub TokenRange); pub struct ImportStatement(pub Vec<String>, pub TokenRange);

View File

@ -318,17 +318,18 @@ impl Parse for LetStatement {
let mutability = stream.expect(Token::MutKeyword).is_ok(); let mutability = stream.expect(Token::MutKeyword).is_ok();
if let Some(Token::Identifier(variable)) = stream.next() { if let Some(Token::Identifier(variable)) = stream.next() {
let range = stream.get_range_prev().unwrap();
stream.expect(Token::Equals)?; stream.expect(Token::Equals)?;
let expression = stream.parse()?; let expression = stream.parse()?;
stream.expect(Token::Semi)?; stream.expect(Token::Semi)?;
Ok(LetStatement( Ok(LetStatement {
variable, name: variable,
None, // TODO add possibility to name type ty: None,
mutability, mutable: mutability,
expression, value: expression,
stream.get_range().unwrap(), name_range: range,
)) })
} else { } else {
Err(stream.expected_err("identifier")?) Err(stream.expected_err("identifier")?)
} }

View File

@ -114,17 +114,17 @@ impl ast::Block {
mir::StmtKind::Let( mir::StmtKind::Let(
mir::NamedVariableRef( mir::NamedVariableRef(
s_let s_let
.1 .ty
.clone() .clone()
.map(|t| t.0.into()) .map(|t| t.0.into())
.unwrap_or(mir::TypeKind::Vague(mir::VagueType::Unknown)), .unwrap_or(mir::TypeKind::Vague(mir::VagueType::Unknown)),
s_let.0.clone(), s_let.name.clone(),
s_let.4.as_meta(module_id), s_let.name_range.as_meta(module_id),
), ),
s_let.2, s_let.mutable,
s_let.3.process(module_id), s_let.value.process(module_id),
), ),
s_let.4, s_let.name_range + s_let.value.1,
), ),
ast::BlockLevelStatement::Set(var_ref, expression, range) => ( ast::BlockLevelStatement::Set(var_ref, expression, range) => (
StmtKind::Set(var_ref.process(module_id), expression.process(module_id)), StmtKind::Set(var_ref.process(module_id), expression.process(module_id)),

View File

@ -181,6 +181,15 @@ impl<'a, 'b> TokenStream<'a, 'b> {
end: self.position, end: self.position,
}) })
} }
/// Gets range from the previous position to the current. Useful when using
/// with [`TokenStream::next`]
pub fn get_range_prev(&self) -> Option<TokenRange> {
self.ref_position.as_ref().map(|ref_pos| TokenRange {
start: **ref_pos,
end: self.position - 1,
})
}
} }
impl Drop for TokenStream<'_, '_> { impl Drop for TokenStream<'_, '_> {

View File

@ -5,9 +5,9 @@ fn changer(param: &mut u32) {
} }
fn main() -> u32 { fn main() -> u32 {
let mut value = 6; let value = 6;
changer(&mut value); let mut a = &value;
return value; return value;
} }