Skip to content

Commit e56cc5b

Browse files
committed
refactor: Add AsBareName and ToBareName traits
The `AsRef` and `From` can be confusing on the caller side, trying to figure out what `.as_ref()` or `.into()` will return. Going for the more explicit option and defining custom traits.
1 parent ee5ff37 commit e56cc5b

26 files changed

Lines changed: 141 additions & 88 deletions

File tree

rusty_basic/src/instruction_generator/instruction_generator.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ 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::{Assignment, BuiltInSub};
8+
use rusty_parser::{Assignment, BuiltInSub, ToBareName};
99
use rusty_parser::{
1010
BareName, DimVar, Expression, ExpressionType, FileHandle, FunctionImplementation,
1111
GlobalStatement, HasExpressionType, Name, Parameter, Program, QualifiedName, Statement,
@@ -376,7 +376,7 @@ impl InstructionGenerator {
376376
let qualifier = function_name
377377
.qualifier()
378378
.expect("Expected qualified function name");
379-
let bare_name = function_name.bare_name().clone();
379+
let bare_name = function_name.to_bare_name();
380380
let q_function_name = QualifiedName::new(bare_name, qualifier);
381381
self.mark_current_subprogram(SubprogramName::Function(q_function_name), pos);
382382
// set default value

rusty_basic/src/interpreter/variables.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@ use crate::interpreter::arguments::{ArgumentInfo, Arguments};
33
use crate::interpreter::byte_size::QByteSize;
44
use crate::interpreter::handlers::allocation::allocate_built_in;
55
use crate::interpreter::indexed_map::IndexedMap;
6-
use rusty_parser::{BareName, DimType, DimVar, Name, ParamType, Parameter, TypeQualifier};
6+
use rusty_parser::{
7+
AsBareName, BareName, DimType, DimVar, Name, ParamType, Parameter, TypeQualifier,
8+
};
79
use rusty_variant::{Variant, V_FALSE};
810

911
#[derive(Debug)]
@@ -171,7 +173,7 @@ impl Variables {
171173
}
172174

173175
pub fn get_by_dim_name(&self, dim_name: &DimVar) -> Option<&Variant> {
174-
self.get_by_dim_name_internal(dim_name.bare_name(), dim_name.var_type())
176+
self.get_by_dim_name_internal(dim_name.as_bare_name(), dim_name.var_type())
175177
}
176178

177179
fn get_by_dim_name_internal(

rusty_linter/src/converter/dim_rules/validation.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use crate::core::{HasSubprograms, HasUserDefinedTypes};
44
use crate::core::{LintError, LintErrorPos};
55
use crate::names::ManyNamesTrait;
66
use rusty_common::{AtPos, Position, Positioned};
7-
use rusty_parser::{DimVar, Parameter, TypedName, VarType};
7+
use rusty_parser::{AsBareName, DimVar, Parameter, TypedName, VarType};
88

99
pub fn validate<T: VarType>(
1010
var_name: &TypedName<T>,
@@ -26,7 +26,7 @@ fn cannot_clash_with_subs<T: VarType, C: HasSubprograms>(
2626
ctx: &C,
2727
pos: Position,
2828
) -> Result<(), LintErrorPos> {
29-
if ctx.subs().contains_key(var_name.bare_name()) {
29+
if ctx.subs().contains_key(var_name.as_bare_name()) {
3030
Err(LintError::DuplicateDefinition.at_pos(pos))
3131
} else {
3232
Ok(())
@@ -38,7 +38,7 @@ fn cannot_clash_with_local_constants<T: VarType>(
3838
ctx: &Context,
3939
pos: Position,
4040
) -> Result<(), LintErrorPos> {
41-
match ctx.names.names().get_const_value(var_name.bare_name()) {
41+
match ctx.names.names().get_const_value(var_name.as_bare_name()) {
4242
Some(_) => Err(LintError::DuplicateDefinition.at_pos(pos)),
4343
_ => Ok(()),
4444
}
@@ -55,7 +55,7 @@ impl CannotClashWithFunctions for DimVar {
5555
ctx: &Context,
5656
pos: Position,
5757
) -> Result<(), LintErrorPos> {
58-
if ctx.functions().contains_key(self.bare_name()) {
58+
if ctx.functions().contains_key(self.as_bare_name()) {
5959
Err(LintError::DuplicateDefinition.at_pos(pos))
6060
} else {
6161
Ok(())
@@ -69,15 +69,15 @@ impl CannotClashWithFunctions for Parameter {
6969
ctx: &Context,
7070
pos: Position,
7171
) -> Result<(), LintErrorPos> {
72-
if let Some(func_qualifier) = ctx.function_qualifier(self.bare_name()) {
72+
if let Some(func_qualifier) = ctx.function_qualifier(self.as_bare_name()) {
7373
if self.var_type().is_extended() {
7474
Err(LintError::DuplicateDefinition.at_pos(pos))
7575
} else {
7676
// for some reason you can have a FUNCTION Add(Add)
7777
let q = self
7878
.var_type()
7979
.to_qualifier_recursively()
80-
.unwrap_or_else(|| self.bare_name().qualify(ctx));
80+
.unwrap_or_else(|| self.as_bare_name().qualify(ctx));
8181
if q == func_qualifier {
8282
Ok(())
8383
} else {

rusty_linter/src/converter/expr_rules/function.rs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
use rusty_common::{AtPos, Position};
2-
use rusty_parser::{BareName, Expression, ExpressionType, Expressions, Name, VariableInfo};
2+
use rusty_parser::{
3+
AsBareName, BareName, Expression, ExpressionType, Expressions, Name, VariableInfo,
4+
};
35

46
use crate::converter::common::{Context, ConvertibleIn, ExprContext, ExprContextPos};
57
use crate::converter::expr_rules::qualify_name::*;
@@ -40,7 +42,7 @@ fn resolve_function(
4042
Expression::BuiltInFunctionCall(built_in_function, converted_args)
4143
}
4244
_ => {
43-
let converted_name: Name = match ctx.function_qualifier(name.bare_name()) {
45+
let converted_name: Name = match ctx.function_qualifier(name.as_bare_name()) {
4446
Some(function_qualifier) => {
4547
try_qualify(name, function_qualifier).with_err_at(&pos)?
4648
}
@@ -78,7 +80,7 @@ impl ExistingArrayWithParenthesis {
7880
}
7981

8082
fn get_var_info<'a>(ctx: &'a Context, name: &Name) -> Option<&'a VariableInfo> {
81-
Self::get_extended_var_info(ctx, name.bare_name())
83+
Self::get_extended_var_info(ctx, name.as_bare_name())
8284
.or_else(|| Self::get_compact_var_info(ctx, name))
8385
}
8486

@@ -92,7 +94,7 @@ impl ExistingArrayWithParenthesis {
9294
fn get_compact_var_info<'a>(ctx: &'a Context, name: &Name) -> Option<&'a VariableInfo> {
9395
let qualifier = name.qualify(ctx);
9496
ctx.names
95-
.get_compact_var_recursively(name.bare_name(), qualifier)
97+
.get_compact_var_recursively(name.as_bare_name(), qualifier)
9698
}
9799
}
98100

rusty_linter/src/converter/expr_rules/property.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use rusty_common::{AtPos, Position, Positioned};
22
use rusty_parser::{
3-
BareName, ElementType, Expression, ExpressionType, HasExpressionType, Name, UserDefinedType,
4-
VariableInfo,
3+
AsBareName, BareName, ElementType, Expression, ExpressionType, HasExpressionType, Name,
4+
ToBareName, UserDefinedType, VariableInfo,
55
};
66

77
use crate::converter::common::{Context, ConvertibleIn, ExprContext, ExprContextPos};
@@ -177,7 +177,7 @@ fn existing_property_element_type(
177177
element_type: &ElementType,
178178
property_name: Name,
179179
) -> Result<Expression, LintErrorPos> {
180-
let bare_name = property_name.into();
180+
let bare_name = property_name.to_bare_name();
181181
let property_name = Name::bare(bare_name);
182182
Ok(Expression::Property(
183183
Box::new(resolved_left_side),
@@ -190,7 +190,7 @@ fn demand_element_by_name<'a>(
190190
user_defined_type: &'a UserDefinedType,
191191
element_name: &Name,
192192
) -> Result<&'a ElementType, LintError> {
193-
let element_type = find_element_type(user_defined_type, element_name.bare_name())
193+
let element_type = find_element_type(user_defined_type, element_name.as_bare_name())
194194
.ok_or(LintError::ElementNotDefined)?;
195195
if element_type.can_be_referenced_by_property_name(element_name) {
196196
Ok(element_type)

rusty_linter/src/converter/expr_rules/qualify_name.rs

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
1-
use rusty_parser::{
2-
BuiltInFunction, {ExpressionType, Name, TypeQualifier},
3-
};
1+
use rusty_parser::{AsBareName, BuiltInFunction, ExpressionType, Name, ToBareName, TypeQualifier};
42

53
use crate::LintError;
64

@@ -28,14 +26,14 @@ pub fn try_qualify(name: Name, qualifier: TypeQualifier) -> Result<Name, LintErr
2826
match name.qualifier() {
2927
Some(q) if q != qualifier => Err(LintError::DuplicateDefinition),
3028
Some(_) => Ok(name),
31-
None => Ok(Name::qualified(name.into(), qualifier)),
29+
None => Ok(Name::qualified(name.to_bare_name(), qualifier)),
3230
}
3331
}
3432

3533
// Name -> BuiltInFunction
3634

3735
pub fn try_built_in_function(n: &Name) -> Result<Option<BuiltInFunction>, LintError> {
38-
let opt_built_in: Option<BuiltInFunction> = BuiltInFunction::try_parse(n.bare_name());
36+
let opt_built_in: Option<BuiltInFunction> = BuiltInFunction::try_parse(n.as_bare_name());
3937
match opt_built_in {
4038
Some(b) => match b {
4139
BuiltInFunction::Cvd

rusty_linter/src/converter/expr_rules/variable.rs

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use crate::core::{
66
use crate::core::{LintError, LintErrorPos};
77
use crate::names::ManyNamesTrait;
88
use rusty_common::{AtPos, Position};
9-
use rusty_parser::BuiltInFunction;
9+
use rusty_parser::{AsBareName, BuiltInFunction};
1010
use rusty_parser::{
1111
BuiltInStyle, DimType, Expression, ExpressionType, Name, TypeQualifier, VariableInfo,
1212
};
@@ -49,7 +49,7 @@ pub fn convert(
4949
}
5050

5151
fn validate(ctx: &Context, name: &Name, pos: Position) -> Result<(), LintErrorPos> {
52-
if ctx.subs().contains_key(name.bare_name()) {
52+
if ctx.subs().contains_key(name.as_bare_name()) {
5353
return Err(LintError::DuplicateDefinition.at_pos(pos));
5454
}
5555

@@ -59,7 +59,7 @@ fn validate(ctx: &Context, name: &Name, pos: Position) -> Result<(), LintErrorPo
5959
pub fn add_as_new_implicit_var(ctx: &mut Context, extra: ExprContextPos, name: Name) -> Expression {
6060
let resolved_name = name.to_qualified(ctx);
6161

62-
let bare_name = resolved_name.bare_name();
62+
let bare_name = resolved_name.as_bare_name();
6363
let q = resolved_name.qualifier().expect("Should be resolved");
6464
ctx.names.insert(
6565
bare_name.clone(),
@@ -94,7 +94,7 @@ pub struct ExistingVar {
9494

9595
impl VarResolve for ExistingVar {
9696
fn can_handle(&mut self, ctx: &Context, name: &Name) -> bool {
97-
let bare_name = name.bare_name();
97+
let bare_name = name.as_bare_name();
9898
self.var_info = ctx.names.get_extended_var_recursively(bare_name).cloned();
9999
if self.var_info.is_some() {
100100
true
@@ -143,10 +143,13 @@ impl VarResolve for ExistingConst {
143143
fn can_handle(&mut self, ctx: &Context, name: &Name) -> bool {
144144
self.opt_v = if self.use_recursion {
145145
ctx.names
146-
.get_const_value_recursively(name.bare_name())
146+
.get_const_value_recursively(name.as_bare_name())
147147
.cloned()
148148
} else {
149-
ctx.names.names().get_const_value(name.bare_name()).cloned()
149+
ctx.names
150+
.names()
151+
.get_const_value(name.as_bare_name())
152+
.cloned()
150153
};
151154
self.opt_v.is_some()
152155
}
@@ -186,7 +189,7 @@ pub struct AssignToFunction {
186189

187190
impl VarResolve for AssignToFunction {
188191
fn can_handle(&mut self, ctx: &Context, name: &Name) -> bool {
189-
let bare_name = name.bare_name();
192+
let bare_name = name.as_bare_name();
190193
match ctx.function_qualifier(bare_name) {
191194
Some(function_qualifier) => {
192195
self.function_qualifier = Some(function_qualifier);
@@ -203,7 +206,7 @@ impl VarResolve for AssignToFunction {
203206
name: Name,
204207
) -> Result<Expression, LintErrorPos> {
205208
let function_qualifier = self.function_qualifier.unwrap();
206-
if ctx.names.is_in_function(name.bare_name()) {
209+
if ctx.names.is_in_function(name.as_bare_name()) {
207210
let converted_name = try_qualify(name, function_qualifier).with_err_at(&extra.pos)?;
208211
let expr_type = ExpressionType::BuiltIn(function_qualifier);
209212
let variable_info = VariableInfo::new_local(expr_type);
@@ -212,7 +215,7 @@ impl VarResolve for AssignToFunction {
212215
// TODO add unit test
213216
// TODO what if the name already exists?
214217
ctx.names
215-
.insert_compact(converted_name.bare_name().clone(), variable_info.clone());
218+
.insert_compact(converted_name.as_bare_name().clone(), variable_info.clone());
216219

217220
let expr = Expression::Variable(converted_name, variable_info);
218221

@@ -230,7 +233,7 @@ pub struct VarAsBuiltInFunctionCall {
230233

231234
impl VarResolve for VarAsBuiltInFunctionCall {
232235
fn can_handle(&mut self, _ctx: &Context, name: &Name) -> bool {
233-
self.built_in_function = BuiltInFunction::try_parse(name.bare_name());
236+
self.built_in_function = BuiltInFunction::try_parse(name.as_bare_name());
234237
self.built_in_function.is_some()
235238
}
236239

@@ -256,7 +259,7 @@ pub struct VarAsUserDefinedFunctionCall {
256259

257260
impl VarResolve for VarAsUserDefinedFunctionCall {
258261
fn can_handle(&mut self, ctx: &Context, name: &Name) -> bool {
259-
self.function_qualifier = ctx.function_qualifier(name.bare_name());
262+
self.function_qualifier = ctx.function_qualifier(name.as_bare_name());
260263
self.function_qualifier.is_some()
261264
}
262265

rusty_linter/src/converter/statement/assignment.rs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ pub fn on_assignment(
2424
}
2525

2626
mod assignment_pre_conversion_validation_rules {
27+
use rusty_parser::AsBareName;
28+
2729
use super::*;
2830
use crate::core::LintError;
2931

@@ -41,7 +43,10 @@ mod assignment_pre_conversion_validation_rules {
4143
pos: Position,
4244
) -> Result<(), LintErrorPos> {
4345
if let Expression::Variable(var_name, _) = input {
44-
if ctx.names.contains_const_recursively(var_name.bare_name()) {
46+
if ctx
47+
.names
48+
.contains_const_recursively(var_name.as_bare_name())
49+
{
4550
Err(LintError::DuplicateDefinition.at_pos(pos))
4651
} else {
4752
Ok(())

rusty_linter/src/converter/statement/const_rules.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,9 @@ fn const_cannot_clash_with_existing_names(
2121
} = left_side;
2222
if ctx
2323
.names
24-
.contains_any_locally_or_contains_extended_recursively(const_name.bare_name())
25-
|| ctx.subs().contains_key(const_name.bare_name())
26-
|| ctx.functions().contains_key(const_name.bare_name())
24+
.contains_any_locally_or_contains_extended_recursively(const_name.as_bare_name())
25+
|| ctx.subs().contains_key(const_name.as_bare_name())
26+
|| ctx.functions().contains_key(const_name.as_bare_name())
2727
{
2828
Err(LintError::DuplicateDefinition.at(const_name_pos))
2929
} else {
@@ -51,7 +51,7 @@ fn new_const(
5151
};
5252
ctx.names
5353
.names_mut()
54-
.insert_const(const_name.bare_name().clone(), final_value);
54+
.insert_const(const_name.as_bare_name().clone(), final_value);
5555

5656
// here we could return the simplified resolved value of the constant
5757
// instead of keeping `right_side`.

rusty_linter/src/core/const_value_resolver.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use crate::core::{LintError, LintErrorPos};
22
use rusty_common::*;
3-
use rusty_parser::{Expression, ExpressionPos, Operator, TypeQualifier, UnaryOperator};
3+
use rusty_parser::{AsBareName, Expression, ExpressionPos, Operator, TypeQualifier, UnaryOperator};
44
use rusty_variant::Variant;
55
use std::cmp::Ordering;
66

@@ -44,7 +44,7 @@ where
4444
Expression::IntegerLiteral(i) => Ok(Variant::VInteger(*i)),
4545
Expression::LongLiteral(l) => Ok(Variant::VLong(*l)),
4646
Expression::Variable(name_expr, _) => {
47-
let bare_name = name_expr.bare_name();
47+
let bare_name = name_expr.as_bare_name();
4848
let bare_name_pos = Positioned::new(bare_name, *pos);
4949
let v = self.resolve_const(&bare_name_pos)?;
5050
if let Some(qualifier) = name_expr.qualifier() {

0 commit comments

Comments
 (0)