Remove redundant source position info from AST
This commit is contained in:
parent
e50b231958
commit
f1f4d48d3a
@ -4,22 +4,22 @@ use crate::{
|
||||
value::ValueInner,
|
||||
};
|
||||
|
||||
use super::{AbstractNode, Action, Block, Expression, Type};
|
||||
use super::{AbstractNode, Action, Block, Expression, Type, WithPosition};
|
||||
|
||||
#[derive(Clone, Debug, Eq, PartialEq, PartialOrd, Ord)]
|
||||
pub struct IfElse {
|
||||
if_expression: Expression,
|
||||
if_block: Block,
|
||||
else_ifs: Option<Vec<(Expression, Block)>>,
|
||||
else_block: Option<Block>,
|
||||
if_block: WithPosition<Block>,
|
||||
else_ifs: Vec<(Expression, WithPosition<Block>)>,
|
||||
else_block: Option<WithPosition<Block>>,
|
||||
}
|
||||
|
||||
impl IfElse {
|
||||
pub fn new(
|
||||
if_expression: Expression,
|
||||
if_block: Block,
|
||||
else_ifs: Option<Vec<(Expression, Block)>>,
|
||||
else_block: Option<Block>,
|
||||
if_block: WithPosition<Block>,
|
||||
else_ifs: Vec<(Expression, WithPosition<Block>)>,
|
||||
else_block: Option<WithPosition<Block>>,
|
||||
) -> Self {
|
||||
Self {
|
||||
if_expression,
|
||||
@ -32,27 +32,27 @@ impl IfElse {
|
||||
|
||||
impl AbstractNode for IfElse {
|
||||
fn expected_type(&self, _context: &Context) -> Result<Type, ValidationError> {
|
||||
self.if_block.expected_type(_context)
|
||||
self.if_block.node.expected_type(_context)
|
||||
}
|
||||
|
||||
fn validate(&self, context: &Context) -> Result<(), ValidationError> {
|
||||
self.if_expression.validate(context)?;
|
||||
self.if_block.validate(context)?;
|
||||
self.if_block.node.validate(context)?;
|
||||
|
||||
let if_expression_type = self.if_expression.expected_type(context)?;
|
||||
|
||||
if let Type::Boolean = if_expression_type {
|
||||
if let Some(else_block) = &self.else_block {
|
||||
else_block.validate(context)?;
|
||||
else_block.node.validate(context)?;
|
||||
|
||||
let expected = self.if_block.expected_type(context)?;
|
||||
let actual = else_block.expected_type(context)?;
|
||||
let expected = self.if_block.node.expected_type(context)?;
|
||||
let actual = else_block.node.expected_type(context)?;
|
||||
|
||||
expected
|
||||
.check(&actual)
|
||||
.map_err(|conflict| ValidationError::TypeCheck {
|
||||
conflict,
|
||||
actual_position: self.if_block.last_statement().position(),
|
||||
actual_position: self.if_block.node.last_statement().position(),
|
||||
expected_position: self.if_expression.position(),
|
||||
})?;
|
||||
}
|
||||
@ -79,9 +79,9 @@ impl AbstractNode for IfElse {
|
||||
|
||||
if let ValueInner::Boolean(if_boolean) = value.inner().as_ref() {
|
||||
if *if_boolean {
|
||||
self.if_block.run(context)
|
||||
self.if_block.node.run(context)
|
||||
} else if let Some(else_statement) = self.else_block {
|
||||
else_statement.run(context)
|
||||
else_statement.node.run(context)
|
||||
} else {
|
||||
Ok(Action::None)
|
||||
}
|
||||
@ -112,8 +112,9 @@ mod tests {
|
||||
Expression::Value(ValueNode::Boolean(true).with_position((0, 0))),
|
||||
Block::new(vec![Statement::Expression(Expression::Value(
|
||||
ValueNode::String("foo".to_string()).with_position((0, 0))
|
||||
))]),
|
||||
None,
|
||||
))])
|
||||
.with_position((0, 0)),
|
||||
Vec::with_capacity(0),
|
||||
None
|
||||
)
|
||||
.run(&Context::new())
|
||||
|
@ -111,9 +111,11 @@ mod tests {
|
||||
))
|
||||
.with_position((0, 0)),
|
||||
),
|
||||
Block::new(vec![Statement::Break(().with_position((0, 0)))]),
|
||||
None,
|
||||
Some(Block::new(vec![Statement::Assignment(
|
||||
Block::new(vec![Statement::Break(().with_position((0, 0)))])
|
||||
.with_position((0, 0)),
|
||||
Vec::with_capacity(0),
|
||||
Some(
|
||||
Block::new(vec![Statement::Assignment(
|
||||
Assignment::new(
|
||||
Identifier::new("i").with_position((0, 0)),
|
||||
None,
|
||||
@ -123,7 +125,9 @@ mod tests {
|
||||
)),
|
||||
)
|
||||
.with_position((0, 0)),
|
||||
)])),
|
||||
)])
|
||||
.with_position((0, 0)),
|
||||
),
|
||||
)
|
||||
.with_position((0, 0)),
|
||||
)])
|
||||
|
@ -155,6 +155,13 @@ impl AbstractNode for ValueNode {
|
||||
fields: expressions,
|
||||
} = self
|
||||
{
|
||||
if !context.contains(&name.node)? {
|
||||
return Err(ValidationError::VariableNotFound {
|
||||
identifier: name.node.clone(),
|
||||
position: name.position,
|
||||
});
|
||||
}
|
||||
|
||||
if let Some(Type::Structure {
|
||||
name: _,
|
||||
fields: types,
|
||||
|
@ -162,7 +162,7 @@ pub fn parser<'src>(
|
||||
just(Token::Control(Control::CurlyOpen)),
|
||||
just(Token::Control(Control::CurlyClose)),
|
||||
)
|
||||
.map(|statements| Block::new(statements));
|
||||
.map_with(|statements, state| Block::new(statements).with_position(state.span()));
|
||||
|
||||
let expression = recursive(|expression| {
|
||||
let identifier_expression = identifier.clone().map_with(|identifier, state| {
|
||||
@ -248,7 +248,7 @@ pub fn parser<'src>(
|
||||
.unwrap_or_else(|| Vec::with_capacity(0)),
|
||||
parameters,
|
||||
return_type,
|
||||
body: body.with_position(state.span()),
|
||||
body,
|
||||
}
|
||||
.with_position(state.span()),
|
||||
)
|
||||
@ -517,9 +517,7 @@ pub fn parser<'src>(
|
||||
)
|
||||
});
|
||||
|
||||
let block_statement = block
|
||||
.clone()
|
||||
.map_with(|block, state| Statement::Block(block.with_position(state.span())));
|
||||
let block_statement = block.clone().map(|block| Statement::Block(block));
|
||||
|
||||
let r#loop = statement
|
||||
.clone()
|
||||
@ -553,8 +551,7 @@ pub fn parser<'src>(
|
||||
.ignore_then(expression.clone())
|
||||
.then(block.clone())
|
||||
.repeated()
|
||||
.collect()
|
||||
.or_not(),
|
||||
.collect(),
|
||||
)
|
||||
.then(
|
||||
just(Token::Keyword(Keyword::Else))
|
||||
@ -598,7 +595,7 @@ mod tests {
|
||||
assert_eq!(
|
||||
parse(&lex("__READ_LINE__").unwrap()).unwrap()[0],
|
||||
Statement::Expression(Expression::Value(
|
||||
ValueNode::BuiltInFunction(BuiltInFunction::ReadLine).with_position((0, 0))
|
||||
ValueNode::BuiltInFunction(BuiltInFunction::ReadLine).with_position((0, 13))
|
||||
))
|
||||
)
|
||||
}
|
||||
@ -620,16 +617,16 @@ mod tests {
|
||||
Statement::AsyncBlock(
|
||||
AsyncBlock::new(vec![
|
||||
Statement::Expression(Expression::Value(
|
||||
ValueNode::Integer(1).with_position((0, 0))
|
||||
ValueNode::Integer(1).with_position((53, 54))
|
||||
)),
|
||||
Statement::Expression(Expression::Value(
|
||||
ValueNode::Integer(2).with_position((0, 0))
|
||||
ValueNode::Integer(2).with_position((79, 80))
|
||||
)),
|
||||
Statement::Expression(Expression::Value(
|
||||
ValueNode::Integer(3).with_position((0, 0))
|
||||
ValueNode::Integer(3).with_position((105, 106))
|
||||
)),
|
||||
])
|
||||
.with_position((0, 0))
|
||||
.with_position((21, 128))
|
||||
)
|
||||
)
|
||||
}
|
||||
@ -649,7 +646,7 @@ mod tests {
|
||||
.unwrap()[0],
|
||||
Statement::Expression(Expression::Value(
|
||||
ValueNode::Structure {
|
||||
name: Identifier::new("Foo").with_position((0, 0)),
|
||||
name: Identifier::new("Foo").with_position((21, 24)),
|
||||
fields: vec![
|
||||
(
|
||||
Identifier::new("bar"),
|
||||
@ -663,7 +660,7 @@ mod tests {
|
||||
),
|
||||
]
|
||||
}
|
||||
.with_position((0, 0))
|
||||
.with_position((21, 120))
|
||||
))
|
||||
)
|
||||
}
|
||||
@ -695,7 +692,7 @@ mod tests {
|
||||
),
|
||||
]
|
||||
)
|
||||
.with_position((0, 0))
|
||||
.with_position((21, 125))
|
||||
)
|
||||
)
|
||||
}
|
||||
@ -716,7 +713,7 @@ mod tests {
|
||||
),
|
||||
Expression::Identifier(Identifier::new("x").with_position((10, 11)))
|
||||
))
|
||||
.with_position((0, 0))
|
||||
.with_position((0, 11))
|
||||
))
|
||||
);
|
||||
assert_eq!(
|
||||
@ -726,7 +723,7 @@ mod tests {
|
||||
Expression::Identifier(Identifier::new("foo").with_position((0, 3))),
|
||||
Expression::Identifier(Identifier::new("x").with_position((4, 5)))
|
||||
))
|
||||
.with_position((0, 0))
|
||||
.with_position((0, 5))
|
||||
))
|
||||
);
|
||||
}
|
||||
@ -751,7 +748,7 @@ mod tests {
|
||||
.with_position((13, 25))
|
||||
))]
|
||||
)
|
||||
.with_position((0, 0))
|
||||
.with_position((0, 27))
|
||||
)
|
||||
)
|
||||
}
|
||||
@ -769,7 +766,7 @@ mod tests {
|
||||
ValueNode::Boolean(true).with_position((16, 20))
|
||||
))
|
||||
)
|
||||
.with_position((0, 0))
|
||||
.with_position((0, 20))
|
||||
)
|
||||
);
|
||||
}
|
||||
@ -787,7 +784,7 @@ mod tests {
|
||||
ValueNode::List(vec![]).with_position((15, 17))
|
||||
))
|
||||
)
|
||||
.with_position((0, 0))
|
||||
.with_position((0, 17))
|
||||
)
|
||||
);
|
||||
}
|
||||
@ -808,10 +805,10 @@ mod tests {
|
||||
ValueNode::List(vec![Expression::Value(
|
||||
ValueNode::Boolean(true).with_position((23, 27))
|
||||
)])
|
||||
.with_position((0, 0))
|
||||
.with_position((22, 28))
|
||||
))
|
||||
)
|
||||
.with_position((0, 0))
|
||||
.with_position((0, 28))
|
||||
)
|
||||
);
|
||||
}
|
||||
@ -838,7 +835,7 @@ mod tests {
|
||||
ValueNode::String("42".to_string()).with_position((30, 34))
|
||||
)
|
||||
])
|
||||
.with_position((0, 0))
|
||||
.with_position((23, 35))
|
||||
))
|
||||
)
|
||||
.with_position((0, 35))
|
||||
@ -862,10 +859,10 @@ mod tests {
|
||||
),
|
||||
AssignmentOperator::Assign,
|
||||
Statement::Expression(Expression::Identifier(
|
||||
Identifier::new("some_function").with_position((0, 0))
|
||||
Identifier::new("some_function").with_position((23, 36))
|
||||
))
|
||||
)
|
||||
.with_position((0, 0))
|
||||
.with_position((0, 36))
|
||||
)
|
||||
);
|
||||
}
|
||||
@ -888,7 +885,7 @@ mod tests {
|
||||
Vec::with_capacity(0),
|
||||
Vec::with_capacity(0),
|
||||
)
|
||||
.with_position((0, 0))
|
||||
.with_position((0, 15))
|
||||
))
|
||||
)
|
||||
}
|
||||
@ -902,10 +899,10 @@ mod tests {
|
||||
Expression::Identifier(Identifier::new("foobar").with_position((0, 6))),
|
||||
vec![Type::String.with_position((9, 12))],
|
||||
vec![Expression::Value(
|
||||
ValueNode::String("hi".to_string()).with_position((0, 0))
|
||||
ValueNode::String("hi".to_string()).with_position((16, 20))
|
||||
)],
|
||||
)
|
||||
.with_position((0, 0))
|
||||
.with_position((0, 21))
|
||||
))
|
||||
)
|
||||
}
|
||||
@ -915,7 +912,7 @@ mod tests {
|
||||
assert_eq!(
|
||||
parse(&lex("1..10").unwrap()).unwrap()[0],
|
||||
Statement::Expression(Expression::Value(
|
||||
ValueNode::Range(1..10).with_position((0, 0))
|
||||
ValueNode::Range(1..10).with_position((0, 5))
|
||||
))
|
||||
)
|
||||
}
|
||||
@ -930,11 +927,11 @@ mod tests {
|
||||
parameters: vec![(Identifier::new("x"), Type::Integer.with_position((4, 7)))],
|
||||
return_type: Type::Integer.with_position((9, 12)),
|
||||
body: Block::new(vec![Statement::Expression(Expression::Identifier(
|
||||
Identifier::new("x").with_position((0, 0))
|
||||
Identifier::new("x").with_position((15, 16))
|
||||
))])
|
||||
.with_position((0, 18)),
|
||||
.with_position((13, 18)),
|
||||
}
|
||||
.with_position((0, 0))
|
||||
.with_position((0, 18))
|
||||
),)
|
||||
)
|
||||
}
|
||||
@ -952,20 +949,20 @@ mod tests {
|
||||
parameters: vec![
|
||||
(
|
||||
Identifier::new("x"),
|
||||
Type::Argument(Identifier::new("T")).with_position((0, 0))
|
||||
Type::Argument(Identifier::new("T")).with_position((10, 11))
|
||||
),
|
||||
(
|
||||
Identifier::new("y"),
|
||||
Type::Argument(Identifier::new("U")).with_position((0, 0))
|
||||
Type::Argument(Identifier::new("U")).with_position((16, 17))
|
||||
)
|
||||
],
|
||||
return_type: Type::Argument(Identifier::new("T")).with_position((0, 0)),
|
||||
return_type: Type::Argument(Identifier::new("T")).with_position((19, 20)),
|
||||
body: Block::new(vec![Statement::Expression(Expression::Identifier(
|
||||
Identifier::new("x").with_position((0, 0))
|
||||
Identifier::new("x").with_position((23, 24))
|
||||
))])
|
||||
.with_position((0, 26)),
|
||||
.with_position((21, 26)),
|
||||
}
|
||||
.with_position((0, 0))
|
||||
.with_position((0, 26))
|
||||
))
|
||||
)
|
||||
}
|
||||
@ -978,12 +975,13 @@ mod tests {
|
||||
IfElse::new(
|
||||
Expression::Value(ValueNode::Boolean(true).with_position((3, 7))),
|
||||
Block::new(vec![Statement::Expression(Expression::Value(
|
||||
ValueNode::String("foo".to_string()).with_position((0, 0))
|
||||
))]),
|
||||
None,
|
||||
ValueNode::String("foo".to_string()).with_position((10, 15))
|
||||
))])
|
||||
.with_position((8, 17)),
|
||||
Vec::with_capacity(0),
|
||||
None
|
||||
)
|
||||
.with_position((0, 0))
|
||||
.with_position((0, 17))
|
||||
)
|
||||
);
|
||||
}
|
||||
@ -996,14 +994,18 @@ mod tests {
|
||||
IfElse::new(
|
||||
Expression::Value(ValueNode::Boolean(true).with_position((3, 7))),
|
||||
Block::new(vec![Statement::Expression(Expression::Value(
|
||||
ValueNode::String("foo".to_string()).with_position((0, 0))
|
||||
))]),
|
||||
None,
|
||||
Some(Block::new(vec![Statement::Expression(Expression::Value(
|
||||
ValueNode::String("bar".to_string()).with_position((0, 0))
|
||||
))]))
|
||||
ValueNode::String("foo".to_string()).with_position((9, 14))
|
||||
))])
|
||||
.with_position((8, 16)),
|
||||
Vec::with_capacity(0),
|
||||
Some(
|
||||
Block::new(vec![Statement::Expression(Expression::Value(
|
||||
ValueNode::String("bar".to_string()).with_position((24, 29))
|
||||
))])
|
||||
.with_position((22, 31))
|
||||
)
|
||||
.with_position((0, 0)),
|
||||
)
|
||||
.with_position((0, 31)),
|
||||
)
|
||||
)
|
||||
}
|
||||
@ -1018,7 +1020,7 @@ mod tests {
|
||||
None,
|
||||
Expression::Value(ValueNode::String("bar".to_string()).with_position((8, 13)))
|
||||
)])
|
||||
.with_position((0, 0))
|
||||
.with_position((0, 15))
|
||||
),)
|
||||
);
|
||||
assert_eq!(
|
||||
@ -1036,7 +1038,7 @@ mod tests {
|
||||
Expression::Value(ValueNode::Integer(2).with_position((13, 14)))
|
||||
),
|
||||
])
|
||||
.with_position((0, 0))
|
||||
.with_position((0, 17))
|
||||
),)
|
||||
);
|
||||
assert_eq!(
|
||||
@ -1054,7 +1056,7 @@ mod tests {
|
||||
Expression::Value(ValueNode::Integer(2).with_position((12, 13)))
|
||||
),
|
||||
])
|
||||
.with_position((0, 0))
|
||||
.with_position((0, 15))
|
||||
),)
|
||||
);
|
||||
}
|
||||
@ -1068,7 +1070,7 @@ mod tests {
|
||||
Expression::Value(ValueNode::Integer(1).with_position((0, 1))),
|
||||
Expression::Value(ValueNode::Integer(1).with_position((4, 5)))
|
||||
))
|
||||
.with_position((0, 0))
|
||||
.with_position((0, 5))
|
||||
))
|
||||
);
|
||||
}
|
||||
@ -1079,9 +1081,9 @@ mod tests {
|
||||
parse(&lex("loop { 42 }").unwrap()).unwrap()[0],
|
||||
Statement::Loop(
|
||||
Loop::new(vec![Statement::Expression(Expression::Value(
|
||||
ValueNode::Integer(42).with_position((0, 0))
|
||||
ValueNode::Integer(42).with_position((7, 9))
|
||||
))])
|
||||
.with_position((0, 0))
|
||||
.with_position((0, 11))
|
||||
)
|
||||
);
|
||||
assert_eq!(
|
||||
@ -1096,25 +1098,29 @@ mod tests {
|
||||
),
|
||||
Expression::Value(ValueNode::Integer(2).with_position((14, 15)))
|
||||
))
|
||||
.with_position((0, 0))
|
||||
.with_position((10, 15))
|
||||
),
|
||||
Block::new(vec![Statement::Break(().with_position((18, 23)))]),
|
||||
None,
|
||||
Some(Block::new(vec![Statement::Assignment(
|
||||
Block::new(vec![Statement::Break(().with_position((18, 23)))])
|
||||
.with_position((16, 25)),
|
||||
Vec::with_capacity(0),
|
||||
Some(
|
||||
Block::new(vec![Statement::Assignment(
|
||||
Assignment::new(
|
||||
Identifier::new("i").with_position((33, 34)),
|
||||
None,
|
||||
AssignmentOperator::AddAssign,
|
||||
Statement::Expression(Expression::Value(
|
||||
ValueNode::Integer(1).with_position((0, 0))
|
||||
ValueNode::Integer(1).with_position((38, 39))
|
||||
))
|
||||
)
|
||||
.with_position((0, 0))
|
||||
)]))
|
||||
)
|
||||
.with_position((0, 0))
|
||||
.with_position((33, 39))
|
||||
)])
|
||||
.with_position((0, 0))
|
||||
.with_position((31, 41))
|
||||
)
|
||||
)
|
||||
.with_position((7, 41))
|
||||
)])
|
||||
.with_position((0, 43))
|
||||
)
|
||||
);
|
||||
}
|
||||
@ -1125,9 +1131,9 @@ mod tests {
|
||||
parse(&lex("{ x }").unwrap()).unwrap()[0],
|
||||
Statement::Block(
|
||||
Block::new(vec![Statement::Expression(Expression::Identifier(
|
||||
Identifier::new("x").with_position((0, 0))
|
||||
Identifier::new("x").with_position((2, 3))
|
||||
),)])
|
||||
.with_position((0, 0))
|
||||
.with_position((0, 5))
|
||||
)
|
||||
);
|
||||
|
||||
@ -1146,16 +1152,16 @@ mod tests {
|
||||
Statement::Block(
|
||||
Block::new(vec![
|
||||
Statement::Expression(Expression::Identifier(
|
||||
Identifier::new("x").with_position((0, 0))
|
||||
Identifier::new("x").with_position((39, 40))
|
||||
)),
|
||||
Statement::Expression(Expression::Identifier(
|
||||
Identifier::new("y").with_position((0, 0))
|
||||
Identifier::new("y").with_position((62, 63))
|
||||
)),
|
||||
Statement::Expression(Expression::Identifier(
|
||||
Identifier::new("z").with_position((0, 0))
|
||||
Identifier::new("z").with_position((85, 86))
|
||||
)),
|
||||
])
|
||||
.with_position((0, 0)),
|
||||
.with_position((17, 104)),
|
||||
)
|
||||
);
|
||||
|
||||
@ -1177,13 +1183,13 @@ mod tests {
|
||||
Expression::Value(ValueNode::Integer(1).with_position((39, 40))),
|
||||
Expression::Value(ValueNode::Integer(1).with_position((44, 45)))
|
||||
))
|
||||
.with_position((0, 0))
|
||||
.with_position((39, 45))
|
||||
)),
|
||||
Statement::Expression(Expression::Identifier(
|
||||
Identifier::new("z").with_position((66, 67))
|
||||
)),
|
||||
])
|
||||
.with_position((0, 0)),
|
||||
.with_position((17, 85)),
|
||||
)
|
||||
);
|
||||
}
|
||||
@ -1193,19 +1199,19 @@ mod tests {
|
||||
assert_eq!(
|
||||
parse(&lex("x").unwrap()).unwrap()[0],
|
||||
Statement::Expression(Expression::Identifier(
|
||||
Identifier::new("x").with_position((0, 0))
|
||||
Identifier::new("x").with_position((0, 1))
|
||||
))
|
||||
);
|
||||
assert_eq!(
|
||||
parse(&lex("foobar").unwrap()).unwrap()[0],
|
||||
Statement::Expression(Expression::Identifier(
|
||||
Identifier::new("foobar").with_position((0, 0))
|
||||
Identifier::new("foobar").with_position((0, 6))
|
||||
))
|
||||
);
|
||||
assert_eq!(
|
||||
parse(&lex("HELLO").unwrap()).unwrap()[0],
|
||||
Statement::Expression(Expression::Identifier(
|
||||
Identifier::new("HELLO").with_position((0, 0))
|
||||
Identifier::new("HELLO").with_position((0, 5))
|
||||
))
|
||||
);
|
||||
}
|
||||
@ -1223,7 +1229,7 @@ mod tests {
|
||||
ValueNode::Integer(1).with_position((9, 10))
|
||||
))
|
||||
)
|
||||
.with_position((0, 0)),
|
||||
.with_position((0, 10)),
|
||||
)
|
||||
);
|
||||
}
|
||||
@ -1241,7 +1247,7 @@ mod tests {
|
||||
ValueNode::Integer(1).with_position((14, 15))
|
||||
))
|
||||
)
|
||||
.with_position((0, 0)),
|
||||
.with_position((0, 15)),
|
||||
)
|
||||
);
|
||||
}
|
||||
@ -1255,7 +1261,7 @@ mod tests {
|
||||
Expression::Identifier(Identifier::new("x").with_position((0, 1))),
|
||||
Expression::Value(ValueNode::Integer(1).with_position((5, 6))),
|
||||
))
|
||||
.with_position((0, 0))
|
||||
.with_position((0, 6))
|
||||
))
|
||||
);
|
||||
|
||||
@ -1268,17 +1274,17 @@ mod tests {
|
||||
Expression::Identifier(Identifier::new("x").with_position((1, 2))),
|
||||
Expression::Value(ValueNode::Integer(1).with_position((6, 7))),
|
||||
))
|
||||
.with_position((0, 0))
|
||||
.with_position((1, 7))
|
||||
),
|
||||
Expression::Logic(
|
||||
Box::new(Logic::Equal(
|
||||
Expression::Identifier(Identifier::new("y").with_position((13, 14))),
|
||||
Expression::Value(ValueNode::Integer(2).with_position((18, 19))),
|
||||
))
|
||||
.with_position((0, 0))
|
||||
.with_position((13, 19))
|
||||
)
|
||||
))
|
||||
.with_position((0, 0))
|
||||
.with_position((0, 20))
|
||||
))
|
||||
);
|
||||
|
||||
@ -1313,7 +1319,7 @@ mod tests {
|
||||
),
|
||||
Expression::Value(ValueNode::Boolean(true).with_position((24, 28)))
|
||||
))
|
||||
.with_position((0, 0))
|
||||
.with_position((0, 28))
|
||||
))
|
||||
);
|
||||
}
|
||||
@ -1323,16 +1329,16 @@ mod tests {
|
||||
assert_eq!(
|
||||
parse(&lex("[]").unwrap()).unwrap()[0],
|
||||
Statement::Expression(Expression::Value(
|
||||
ValueNode::List(Vec::with_capacity(0)).with_position((0, 0))
|
||||
ValueNode::List(Vec::with_capacity(0)).with_position((0, 2))
|
||||
),)
|
||||
);
|
||||
assert_eq!(
|
||||
parse(&lex("[42]").unwrap()).unwrap()[0],
|
||||
Statement::Expression(Expression::Value(
|
||||
ValueNode::List(vec![Expression::Value(
|
||||
ValueNode::Integer(42).with_position((0, 0))
|
||||
ValueNode::Integer(42).with_position((1, 3))
|
||||
)])
|
||||
.with_position((1, 3))
|
||||
.with_position((0, 4))
|
||||
))
|
||||
);
|
||||
assert_eq!(
|
||||
@ -1348,10 +1354,10 @@ mod tests {
|
||||
Expression::Value(ValueNode::Integer(2).with_position((23, 24))),
|
||||
Expression::Value(ValueNode::Integer(3).with_position((26, 27))),
|
||||
])
|
||||
.with_position((0, 0))
|
||||
.with_position((19, 29))
|
||||
)
|
||||
])
|
||||
.with_position((0, 0))
|
||||
.with_position((0, 30))
|
||||
),)
|
||||
);
|
||||
}
|
||||
@ -1361,7 +1367,7 @@ mod tests {
|
||||
assert_eq!(
|
||||
parse(&lex("true").unwrap()).unwrap()[0],
|
||||
Statement::Expression(Expression::Value(
|
||||
ValueNode::Boolean(true).with_position((0, 0))
|
||||
ValueNode::Boolean(true).with_position((0, 4))
|
||||
))
|
||||
);
|
||||
}
|
||||
@ -1371,7 +1377,7 @@ mod tests {
|
||||
assert_eq!(
|
||||
parse(&lex("false").unwrap()).unwrap()[0],
|
||||
Statement::Expression(Expression::Value(
|
||||
ValueNode::Boolean(false).with_position((0, 0))
|
||||
ValueNode::Boolean(false).with_position((0, 5))
|
||||
))
|
||||
);
|
||||
}
|
||||
@ -1381,13 +1387,13 @@ mod tests {
|
||||
assert_eq!(
|
||||
parse(&lex("0.0").unwrap()).unwrap()[0],
|
||||
Statement::Expression(Expression::Value(
|
||||
ValueNode::Float(0.0).with_position((0, 0))
|
||||
ValueNode::Float(0.0).with_position((0, 3))
|
||||
))
|
||||
);
|
||||
assert_eq!(
|
||||
parse(&lex("42.0").unwrap()).unwrap()[0],
|
||||
Statement::Expression(Expression::Value(
|
||||
ValueNode::Float(42.0).with_position((0, 0))
|
||||
ValueNode::Float(42.0).with_position((0, 4))
|
||||
))
|
||||
);
|
||||
|
||||
@ -1396,7 +1402,7 @@ mod tests {
|
||||
assert_eq!(
|
||||
parse(&lex(&max_float).unwrap()).unwrap()[0],
|
||||
Statement::Expression(Expression::Value(
|
||||
ValueNode::Float(f64::MAX).with_position((0, 0))
|
||||
ValueNode::Float(f64::MAX).with_position((0, 311))
|
||||
))
|
||||
);
|
||||
|
||||
@ -1405,7 +1411,7 @@ mod tests {
|
||||
assert_eq!(
|
||||
parse(&lex(&min_positive_float).unwrap()).unwrap()[0],
|
||||
Statement::Expression(Expression::Value(
|
||||
ValueNode::Float(f64::MIN_POSITIVE).with_position((0, 0))
|
||||
ValueNode::Float(f64::MIN_POSITIVE).with_position((0, 326))
|
||||
),)
|
||||
);
|
||||
}
|
||||
@ -1415,13 +1421,13 @@ mod tests {
|
||||
assert_eq!(
|
||||
parse(&lex("-0.0").unwrap()).unwrap()[0],
|
||||
Statement::Expression(Expression::Value(
|
||||
ValueNode::Float(-0.0).with_position((0, 0))
|
||||
ValueNode::Float(-0.0).with_position((0, 4))
|
||||
))
|
||||
);
|
||||
assert_eq!(
|
||||
parse(&lex("-42.0").unwrap()).unwrap()[0],
|
||||
Statement::Expression(Expression::Value(
|
||||
ValueNode::Float(-42.0).with_position((0, 0))
|
||||
ValueNode::Float(-42.0).with_position((0, 5))
|
||||
))
|
||||
);
|
||||
|
||||
@ -1430,7 +1436,7 @@ mod tests {
|
||||
assert_eq!(
|
||||
parse(&lex(&min_float).unwrap()).unwrap()[0],
|
||||
Statement::Expression(Expression::Value(
|
||||
ValueNode::Float(f64::MIN).with_position((0, 0))
|
||||
ValueNode::Float(f64::MIN).with_position((0, 312))
|
||||
))
|
||||
);
|
||||
|
||||
@ -1439,7 +1445,7 @@ mod tests {
|
||||
assert_eq!(
|
||||
parse(&lex(&max_negative_float).unwrap()).unwrap()[0],
|
||||
Statement::Expression(Expression::Value(
|
||||
ValueNode::Float(-f64::MIN_POSITIVE).with_position((0, 0))
|
||||
ValueNode::Float(-f64::MIN_POSITIVE).with_position((0, 327))
|
||||
),)
|
||||
);
|
||||
}
|
||||
@ -1449,13 +1455,13 @@ mod tests {
|
||||
assert_eq!(
|
||||
parse(&lex("Infinity").unwrap()).unwrap()[0],
|
||||
Statement::Expression(Expression::Value(
|
||||
ValueNode::Float(f64::INFINITY).with_position((0, 0))
|
||||
ValueNode::Float(f64::INFINITY).with_position((0, 8))
|
||||
))
|
||||
);
|
||||
assert_eq!(
|
||||
parse(&lex("-Infinity").unwrap()).unwrap()[0],
|
||||
Statement::Expression(Expression::Value(
|
||||
ValueNode::Float(f64::NEG_INFINITY).with_position((0, 0))
|
||||
ValueNode::Float(f64::NEG_INFINITY).with_position((0, 9))
|
||||
))
|
||||
);
|
||||
|
||||
@ -1480,7 +1486,7 @@ mod tests {
|
||||
assert_eq!(
|
||||
statements[0],
|
||||
Statement::Expression(Expression::Value(
|
||||
ValueNode::Integer(i).with_position((0, 0))
|
||||
ValueNode::Integer(i).with_position((0, 1))
|
||||
))
|
||||
)
|
||||
}
|
||||
@ -1488,7 +1494,7 @@ mod tests {
|
||||
assert_eq!(
|
||||
parse(&lex("42").unwrap()).unwrap()[0],
|
||||
Statement::Expression(Expression::Value(
|
||||
ValueNode::Integer(42).with_position((0, 0))
|
||||
ValueNode::Integer(42).with_position((0, 2))
|
||||
))
|
||||
);
|
||||
|
||||
@ -1497,14 +1503,14 @@ mod tests {
|
||||
assert_eq!(
|
||||
parse(&lex(&maximum_integer).unwrap()).unwrap()[0],
|
||||
Statement::Expression(Expression::Value(
|
||||
ValueNode::Integer(i64::MAX).with_position((0, 0))
|
||||
ValueNode::Integer(i64::MAX).with_position((0, 19))
|
||||
))
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn negative_integer() {
|
||||
for i in -9..1 {
|
||||
for i in -9..0 {
|
||||
let source = i.to_string();
|
||||
let tokens = lex(&source).unwrap();
|
||||
let statements = parse(&tokens).unwrap();
|
||||
@ -1512,7 +1518,7 @@ mod tests {
|
||||
assert_eq!(
|
||||
statements[0],
|
||||
Statement::Expression(Expression::Value(
|
||||
ValueNode::Integer(i).with_position((0, 0))
|
||||
ValueNode::Integer(i).with_position((0, 2))
|
||||
))
|
||||
)
|
||||
}
|
||||
@ -1520,7 +1526,7 @@ mod tests {
|
||||
assert_eq!(
|
||||
parse(&lex("-42").unwrap()).unwrap()[0],
|
||||
Statement::Expression(Expression::Value(
|
||||
ValueNode::Integer(-42).with_position((0, 0))
|
||||
ValueNode::Integer(-42).with_position((0, 3))
|
||||
))
|
||||
);
|
||||
|
||||
@ -1529,7 +1535,7 @@ mod tests {
|
||||
assert_eq!(
|
||||
parse(&lex(&minimum_integer).unwrap()).unwrap()[0],
|
||||
Statement::Expression(Expression::Value(
|
||||
ValueNode::Integer(i64::MIN).with_position((0, 0))
|
||||
ValueNode::Integer(i64::MIN).with_position((0, 20))
|
||||
))
|
||||
);
|
||||
}
|
||||
@ -1539,19 +1545,19 @@ mod tests {
|
||||
assert_eq!(
|
||||
parse(&lex("\"\"").unwrap()).unwrap()[0],
|
||||
Statement::Expression(Expression::Value(
|
||||
ValueNode::String("".to_string()).with_position((0, 0))
|
||||
ValueNode::String("".to_string()).with_position((0, 2))
|
||||
))
|
||||
);
|
||||
assert_eq!(
|
||||
parse(&lex("\"42\"").unwrap()).unwrap()[0],
|
||||
Statement::Expression(Expression::Value(
|
||||
ValueNode::String("42".to_string()).with_position((0, 0))
|
||||
ValueNode::String("42".to_string()).with_position((0, 4))
|
||||
),)
|
||||
);
|
||||
assert_eq!(
|
||||
parse(&lex("\"foobar\"").unwrap()).unwrap()[0],
|
||||
Statement::Expression(Expression::Value(
|
||||
ValueNode::String("foobar".to_string()).with_position((0, 0))
|
||||
ValueNode::String("foobar".to_string()).with_position((0, 8))
|
||||
),)
|
||||
);
|
||||
}
|
||||
@ -1561,19 +1567,19 @@ mod tests {
|
||||
assert_eq!(
|
||||
parse(&lex("''").unwrap()).unwrap()[0],
|
||||
Statement::Expression(Expression::Value(
|
||||
ValueNode::String("".to_string()).with_position((0, 0))
|
||||
ValueNode::String("".to_string()).with_position((0, 2))
|
||||
))
|
||||
);
|
||||
assert_eq!(
|
||||
parse(&lex("'42'").unwrap()).unwrap()[0],
|
||||
Statement::Expression(Expression::Value(
|
||||
ValueNode::String("42".to_string()).with_position((0, 0))
|
||||
ValueNode::String("42".to_string()).with_position((0, 4))
|
||||
),)
|
||||
);
|
||||
assert_eq!(
|
||||
parse(&lex("'foobar'").unwrap()).unwrap()[0],
|
||||
Statement::Expression(Expression::Value(
|
||||
ValueNode::String("foobar".to_string()).with_position((0, 0))
|
||||
ValueNode::String("foobar".to_string()).with_position((0, 8))
|
||||
),)
|
||||
);
|
||||
}
|
||||
@ -1583,19 +1589,19 @@ mod tests {
|
||||
assert_eq!(
|
||||
parse(&lex("``").unwrap()).unwrap()[0],
|
||||
Statement::Expression(Expression::Value(
|
||||
ValueNode::String("".to_string()).with_position((0, 0))
|
||||
ValueNode::String("".to_string()).with_position((0, 2))
|
||||
))
|
||||
);
|
||||
assert_eq!(
|
||||
parse(&lex("`42`").unwrap()).unwrap()[0],
|
||||
Statement::Expression(Expression::Value(
|
||||
ValueNode::String("42".to_string()).with_position((0, 0))
|
||||
ValueNode::String("42".to_string()).with_position((0, 4))
|
||||
),)
|
||||
);
|
||||
assert_eq!(
|
||||
parse(&lex("`foobar`").unwrap()).unwrap()[0],
|
||||
Statement::Expression(Expression::Value(
|
||||
ValueNode::String("foobar".to_string()).with_position((0, 0))
|
||||
ValueNode::String("foobar".to_string()).with_position((0, 8))
|
||||
),)
|
||||
);
|
||||
}
|
||||
|
@ -71,7 +71,7 @@ fn function_context_does_not_capture_values() {
|
||||
&vec![Error::Validation {
|
||||
error: ValidationError::VariableNotFound {
|
||||
identifier: Identifier::new("x"),
|
||||
position: (0, 0).into()
|
||||
position: (47, 48).into()
|
||||
},
|
||||
position: (32, 50).into()
|
||||
}]
|
||||
|
@ -23,7 +23,7 @@ fn simple_structure() {
|
||||
"
|
||||
),
|
||||
Ok(Some(Value::structure(
|
||||
Identifier::new("Foo").with_position((0, 0)),
|
||||
Identifier::new("Foo").with_position((127, 130)),
|
||||
vec![
|
||||
(Identifier::new("bar"), Value::integer(42)),
|
||||
(Identifier::new("baz"), Value::string("hiya".to_string())),
|
||||
@ -84,11 +84,11 @@ fn nested_structure() {
|
||||
"
|
||||
),
|
||||
Ok(Some(Value::structure(
|
||||
Identifier::new("Foo").with_position((0, 0)),
|
||||
Identifier::new("Foo").with_position((172, 175)),
|
||||
vec![(
|
||||
Identifier::new("bar"),
|
||||
Value::structure(
|
||||
Identifier::new("Bar").with_position((0, 0)),
|
||||
Identifier::new("Bar").with_position((204, 207)),
|
||||
vec![(Identifier::new("baz"), Value::integer(42))]
|
||||
)
|
||||
),]
|
||||
@ -112,7 +112,7 @@ fn undefined_struct() {
|
||||
&vec![Error::Validation {
|
||||
error: ValidationError::VariableNotFound {
|
||||
identifier: Identifier::new("Foo"),
|
||||
position: (0, 0).into()
|
||||
position: (17, 20).into()
|
||||
},
|
||||
position: (17, 69).into()
|
||||
}]
|
||||
|
@ -50,9 +50,9 @@ fn function_variable() {
|
||||
vec![(Identifier::new("x"), Type::Integer.with_position((13, 16)))],
|
||||
Type::Integer.with_position((18, 21)),
|
||||
Block::new(vec![Statement::Expression(Expression::Identifier(
|
||||
Identifier::new("x").with_position((0, 0))
|
||||
Identifier::new("x").with_position((24, 25))
|
||||
))])
|
||||
.with_position((9, 27))
|
||||
.with_position((22, 27))
|
||||
)))
|
||||
);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user