Fix NamedVarRefrence tokenrange
This commit is contained in:
parent
d2ee61e888
commit
ce645519ce
@ -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);
|
||||||
|
@ -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")?)
|
||||||
}
|
}
|
||||||
|
@ -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)),
|
||||||
|
@ -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<'_, '_> {
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user