Skip to content

Commit fda3af6

Browse files
committed
refactor: Use new Assignment struct in Statement
Instead of holding two values in `Statement::Assignment(name, value)`, switching to a struct `Assignment` that wraps the name and value of the assignment.
1 parent 61a3a5b commit fda3af6

19 files changed

Lines changed: 85 additions & 73 deletions

File tree

rusty_basic/src/instruction_generator/instruction_generator.rs

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,11 @@ use crate::instruction_generator::subprogram_info::{
55
use crate::RuntimeError;
66
use rusty_common::{AtPos, CaseInsensitiveString, Position, Positioned};
77
use rusty_linter::{Context, Names, SubprogramName};
8-
use rusty_parser::BuiltInSub;
8+
use rusty_parser::{Assignment, BuiltInSub};
99
use rusty_parser::{
10-
BareName, DimVar, Expression, ExpressionPos, ExpressionType, FileHandle,
11-
FunctionImplementation, GlobalStatement, HasExpressionType, Name, Parameter, Program,
12-
QualifiedName, Statement, Statements, SubImplementation, TypeQualifier,
10+
BareName, DimVar, Expression, ExpressionType, FileHandle, FunctionImplementation,
11+
GlobalStatement, HasExpressionType, Name, Parameter, Program, QualifiedName, Statement,
12+
Statements, SubImplementation, TypeQualifier,
1313
};
1414
use rusty_parser::{BuiltInFunction, UserDefinedTypes};
1515
use rusty_variant::Variant;
@@ -449,12 +449,8 @@ impl InstructionGenerator {
449449
);
450450
}
451451

452-
pub fn generate_assignment_instructions(
453-
&mut self,
454-
l: Expression,
455-
r: ExpressionPos,
456-
pos: Position,
457-
) {
452+
pub fn generate_assignment_instructions(&mut self, a: Assignment, pos: Position) {
453+
let (l, r) = a.into();
458454
let left_type = l.expression_type();
459455
self.generate_expression_instructions_casting(r, left_type);
460456
self.generate_store_instructions(l, pos);

rusty_basic/src/instruction_generator/statement.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,7 @@ impl Visitor<StatementPos> for InstructionGenerator {
2323
}
2424

2525
match statement {
26-
Statement::Assignment(left_side, right_side) => {
27-
self.generate_assignment_instructions(left_side, right_side, pos)
28-
}
26+
Statement::Assignment(a) => self.generate_assignment_instructions(a, pos),
2927
Statement::Const(_) => {
3028
// The CONST statement does not generate any instructions,
3129
// because the linter has replaced expressions that reference constants

rusty_linter/src/converter/statement/assignment.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,22 +4,23 @@ use crate::converter::common::ExprContext;
44
use crate::core::LintErrorPos;
55
use rusty_common::Position;
66
use rusty_common::{AtPos, Positioned};
7+
use rusty_parser::Assignment;
78
use rusty_parser::{Expression, ExpressionPos, Statement};
89

910
pub fn on_assignment(
10-
left: Expression,
11-
right: ExpressionPos,
11+
a: Assignment,
1212
ctx: &mut Context,
1313
pos: Position,
1414
) -> Result<Statement, LintErrorPos> {
15+
let (left, right) = a.into();
1516
assignment_pre_conversion_validation_rules::validate(ctx, &left, pos)?;
1617
let converted_right: ExpressionPos = right.convert_in_default(ctx)?;
1718
let Positioned {
1819
element: converted_left,
1920
..
2021
} = left.at_pos(pos).convert_in(ctx, ExprContext::Assignment)?;
2122
assignment_post_conversion_validation_rules::validate(&converted_left, &converted_right)?;
22-
Ok(Statement::Assignment(converted_left, converted_right))
23+
Ok(Statement::assignment(converted_left, converted_right))
2324
}
2425

2526
mod assignment_pre_conversion_validation_rules {

rusty_linter/src/converter/statement/main.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ use rusty_parser::{ExitObject, Statement};
1111
impl ConvertibleIn<Position> for Statement {
1212
fn convert_in(self, ctx: &mut Context, pos: Position) -> Result<Self, LintErrorPos> {
1313
match self {
14-
Self::Assignment(n, e) => assignment::on_assignment(n, e, ctx, pos),
14+
Self::Assignment(a) => assignment::on_assignment(a, ctx, pos),
1515
// CONST is mapped to None and is filtered out
1616
Self::Const(c) => const_rules::on_const(ctx, c),
1717
Self::SubCall(n, args) => ctx.sub_call(n, args),

rusty_linter/src/post_linter/dots_linter.rs

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -170,12 +170,8 @@ impl PostConversionLinter for DotsLinter {
170170
.try_for_each(|dim_var_pos| self.ensure_no_dots(dim_var_pos))
171171
}
172172

173-
fn visit_assignment(
174-
&mut self,
175-
name: &Expression,
176-
name_pos: Position,
177-
v: &ExpressionPos,
178-
) -> Result<(), LintErrorPos> {
173+
fn visit_assignment(&mut self, a: &Assignment, name_pos: Position) -> Result<(), LintErrorPos> {
174+
let (name, v) = a.into();
179175
self.ensure_no_dots(&Positioned::new(name, name_pos))?;
180176
self.visit_expression(v)
181177
}

rusty_linter/src/post_linter/expression_reducer.rs

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -101,12 +101,7 @@ pub trait ExpressionReducer {
101101

102102
fn visit_map_statement(&mut self, s: Statement) -> Result<Statement, LintErrorPos> {
103103
match s {
104-
Statement::Assignment(left, right) => {
105-
self.visit_assignment(left, right)
106-
.map(|(reduced_left, reduced_right)| {
107-
Statement::Assignment(reduced_left, reduced_right)
108-
})
109-
}
104+
Statement::Assignment(a) => self.visit_assignment(a).map(Statement::Assignment),
110105
Statement::Const(c) => {
111106
// The converter is smart enough to replace Expressions that reference
112107
// constants with their actual value, so the `CONST` statement isn't used
@@ -159,12 +154,9 @@ pub trait ExpressionReducer {
159154
Ok((name, self.visit_expressions(args)?))
160155
}
161156

162-
fn visit_assignment(
163-
&mut self,
164-
name: Expression,
165-
v: ExpressionPos,
166-
) -> Result<(Expression, ExpressionPos), LintErrorPos> {
167-
Ok((name, self.visit_expression_pos(v)?))
157+
fn visit_assignment(&mut self, a: Assignment) -> Result<Assignment, LintErrorPos> {
158+
let (name, v) = a.into();
159+
Ok(Assignment::new(name, self.visit_expression_pos(v)?))
168160
}
169161

170162
fn visit_for_loop(&mut self, f: ForLoop) -> Result<ForLoop, LintErrorPos> {

rusty_linter/src/post_linter/post_conversion_linter.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ pub trait PostConversionLinter {
5656

5757
fn visit_statement_pos(&mut self, s: &Statement, pos: Position) -> Result<(), LintErrorPos> {
5858
match s {
59-
Statement::Assignment(left, right) => self.visit_assignment(left, pos, right),
59+
Statement::Assignment(a) => self.visit_assignment(a, pos),
6060
Statement::SubCall(b, e) => self.visit_sub_call(b, pos, e),
6161
Statement::BuiltInSubCall(b, e) => self.visit_built_in_sub_call(b, pos, e),
6262
Statement::IfBlock(i) => self.visit_if_block(i),
@@ -158,10 +158,10 @@ pub trait PostConversionLinter {
158158

159159
fn visit_assignment(
160160
&mut self,
161-
_name: &Expression,
161+
assignment: &Assignment,
162162
_name_pos: Position,
163-
v: &ExpressionPos,
164163
) -> Result<(), LintErrorPos> {
164+
let (_, v) = assignment.into();
165165
self.visit_expression(v)
166166
}
167167

rusty_linter/src/tests/array.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ fn test_passing_array_parameter_with_parenthesis() {
134134
.into_list_rc(7, 9)
135135
)
136136
.at_rc(7, 9),
137-
Statement::Assignment(
137+
Statement::assignment(
138138
Expression::var_resolved("X$"),
139139
Expression::ArrayElement(
140140
"choice$".into(),
@@ -189,7 +189,7 @@ fn test_passing_array_without_parenthesis() {
189189
.into_list_rc(2, 9)
190190
))
191191
.at_rc(2, 5),
192-
GlobalStatement::Statement(Statement::Assignment(
192+
GlobalStatement::Statement(Statement::assignment(
193193
Expression::Variable(
194194
"X!".into(),
195195
VariableInfo::new_local(ExpressionType::BuiltIn(TypeQualifier::BangSingle))

rusty_linter/src/tests/assignment.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ fn test_assign_binary_plus() {
6565
Statement::Dim(
6666
DimVar::new_compact_local("X", TypeQualifier::PercentInteger).into_list_rc(1, 1)
6767
),
68-
Statement::Assignment(
68+
Statement::assignment(
6969
Expression::var_resolved("X%"),
7070
Expression::BinaryExpression(
7171
Operator::Plus,
@@ -85,7 +85,7 @@ fn test_possible_property_folded_back_to_variable() {
8585
Statement::Dim(
8686
DimVar::new_compact_local("A.B", TypeQualifier::BangSingle).into_list_rc(1, 1)
8787
),
88-
Statement::Assignment(
88+
Statement::assignment(
8989
Expression::var_resolved("A.B!"),
9090
Expression::IntegerLiteral(12).at_rc(1, 7),
9191
)

rusty_linter/src/tests/dim_assign_use_in_expr.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ fn bare() {
2323
vec![
2424
GlobalStatement::Statement(Statement::Dim(DimVar::parse("A!").into_list_rc(2, 9)))
2525
.at_rc(2, 5),
26-
GlobalStatement::Statement(Statement::Assignment(
26+
GlobalStatement::Statement(Statement::assignment(
2727
Expression::var_resolved("A!"),
2828
Expression::IntegerLiteral(42).at_rc(3, 9)
2929
))
@@ -48,7 +48,7 @@ fn compact_string() {
4848
vec![
4949
GlobalStatement::Statement(Statement::Dim(DimVar::parse("A$").into_list_rc(2, 9)))
5050
.at_rc(2, 5),
51-
GlobalStatement::Statement(Statement::Assignment(
51+
GlobalStatement::Statement(Statement::assignment(
5252
Expression::var_resolved("A$"),
5353
Expression::StringLiteral("hello".to_string()).at_rc(3, 10)
5454
))
@@ -79,7 +79,7 @@ fn extended_string() {
7979
.into_list_rc(2, 9)
8080
))
8181
.at_rc(2, 5),
82-
GlobalStatement::Statement(Statement::Assignment(
82+
GlobalStatement::Statement(Statement::assignment(
8383
Expression::var_resolved("A$"),
8484
Expression::StringLiteral("hello".to_string()).at_rc(3, 9)
8585
))
@@ -123,7 +123,7 @@ fn user_defined_type() {
123123
.into_list_rc(7, 9)
124124
))
125125
.at_rc(7, 5),
126-
GlobalStatement::Statement(Statement::Assignment(
126+
GlobalStatement::Statement(Statement::assignment(
127127
Expression::var_user_defined("A", "Card"),
128128
Expression::var_user_defined("B", "Card").at_rc(8, 9)
129129
))
@@ -178,7 +178,7 @@ fn user_defined_type_integer_element() {
178178
)
179179
.into_list_rc(6, 9)
180180
),
181-
Statement::Assignment(
181+
Statement::assignment(
182182
Expression::Property(
183183
Box::new(Expression::var_user_defined("A", "Card")),
184184
"Value".into(),
@@ -217,7 +217,7 @@ fn user_defined_type_string_element() {
217217
)
218218
.into_list_rc(6, 9)
219219
),
220-
Statement::Assignment(
220+
Statement::assignment(
221221
Expression::Property(
222222
Box::new(Expression::var_user_defined("A", "Card")),
223223
"Suit".into(),

0 commit comments

Comments
 (0)