Skip to content

Commit d84b0ff

Browse files
committed
perf(analyzer): reduce use of owned strings
1 parent 73be9e1 commit d84b0ff

24 files changed

+122
-109
lines changed

crates/biome_analyze/src/signals.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ impl<L: Language> Default for AnalyzerActionIter<L> {
143143

144144
impl<L: Language> From<AnalyzerAction<L>> for CodeSuggestionAdvice<MarkupBuf> {
145145
fn from(action: AnalyzerAction<L>) -> Self {
146-
let (_, suggestion) = action.mutation.as_text_range_and_edit().unwrap_or_default();
146+
let (_, suggestion) = action.mutation.to_text_range_and_edit().unwrap_or_default();
147147
Self {
148148
applicability: action.applicability,
149149
msg: action.message,
@@ -154,7 +154,7 @@ impl<L: Language> From<AnalyzerAction<L>> for CodeSuggestionAdvice<MarkupBuf> {
154154

155155
impl<L: Language> From<AnalyzerAction<L>> for CodeSuggestionItem {
156156
fn from(action: AnalyzerAction<L>) -> Self {
157-
let (range, suggestion) = action.mutation.as_text_range_and_edit().unwrap_or_default();
157+
let (range, suggestion) = action.mutation.to_text_range_and_edit().unwrap_or_default();
158158

159159
Self {
160160
rule_name: action.rule_name,

crates/biome_analyze/src/suppression_action.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ pub trait SuppressionAction {
1616
suppression_reason,
1717
} = payload;
1818

19-
// retrieve the most suited, most left token where the diagnostics was emitted
19+
// retrieve the most suited, leftest token where the diagnostics was emitted
2020
let original_token = self.get_token_from_offset(token_offset, diagnostic_text_range);
2121

2222
// considering that our suppression system works via lines, we need to look for the first newline,

crates/biome_css_analyze/src/utils.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,8 @@ pub fn is_css_variable(value: &str) -> bool {
4848
pub fn find_font_family(value: CssGenericComponentValueList) -> Vec<AnyCssValue> {
4949
let mut font_families: Vec<AnyCssValue> = Vec::new();
5050
for v in value {
51-
let value = v.to_trimmed_string();
52-
let lower_case_value = value.to_ascii_lowercase_cow();
51+
let value = v.to_trimmed_text();
52+
let lower_case_value = value.text().to_ascii_lowercase_cow();
5353

5454
// Ignore CSS variables
5555
if is_css_variable(&lower_case_value) {

crates/biome_js_analyze/src/lint/a11y/no_positive_tabindex.rs

Lines changed: 35 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -96,29 +96,6 @@ impl NoPositiveTabindexQuery {
9696
}
9797
}
9898

99-
impl AnyNumberLikeExpression {
100-
/// Returns the value of a number-like expression; it returns the expression
101-
/// text for literal expressions. However, for unary expressions, it only
102-
/// returns the value for signed numeric expressions.
103-
pub(crate) fn value(&self) -> Option<String> {
104-
match self {
105-
Self::JsStringLiteralExpression(string_literal) => {
106-
return Some(string_literal.inner_string_text().ok()?.to_string());
107-
}
108-
Self::JsNumberLiteralExpression(number_literal) => {
109-
return Some(number_literal.value_token().ok()?.to_string());
110-
}
111-
Self::JsUnaryExpression(unary_expression) => {
112-
if unary_expression.is_signed_numeric_literal().ok()? {
113-
return Some(unary_expression.to_trimmed_string());
114-
}
115-
}
116-
}
117-
118-
None
119-
}
120-
}
121-
12299
impl Rule for NoPositiveTabindex {
123100
type Query = Semantic<NoPositiveTabindexQuery>;
124101
type State = TextRange;
@@ -141,9 +118,24 @@ impl Rule for NoPositiveTabindex {
141118
TabindexProp::JsPropertyObjectMember(js_object_member) => {
142119
let expression = js_object_member.value().ok()?;
143120
let range = expression.range();
144-
let expression_value =
145-
AnyNumberLikeExpression::cast(expression.into_syntax())?.value()?;
146-
if !is_tabindex_valid(&expression_value) {
121+
let expression_value = AnyNumberLikeExpression::cast(expression.into_syntax())?;
122+
let is_tabindex_valid = match expression_value {
123+
AnyNumberLikeExpression::JsStringLiteralExpression(string_literal) => {
124+
is_tabindex_valid(string_literal.inner_string_text().ok()?.text())
125+
}
126+
AnyNumberLikeExpression::JsNumberLiteralExpression(number_literal) => {
127+
is_tabindex_valid(number_literal.value_token().ok()?.text())
128+
}
129+
AnyNumberLikeExpression::JsUnaryExpression(unary_expression) => {
130+
if unary_expression.is_signed_numeric_literal().ok()? {
131+
let text = unary_expression.to_trimmed_text();
132+
is_tabindex_valid(text.text())
133+
} else {
134+
return None;
135+
}
136+
}
137+
};
138+
if !is_tabindex_valid {
147139
return Some(range);
148140
}
149141
}
@@ -214,10 +206,24 @@ fn attribute_has_valid_tabindex(jsx_any_attribute_value: &AnyJsxAttributeValue)
214206
}
215207
AnyJsxAttributeValue::JsxExpressionAttributeValue(value) => {
216208
let expression = value.expression().ok()?;
217-
let expression_value =
218-
AnyNumberLikeExpression::cast(expression.into_syntax())?.value()?;
209+
let expression_value = AnyNumberLikeExpression::cast(expression.into_syntax())?;
219210

220-
Some(is_tabindex_valid(&expression_value))
211+
Some(match expression_value {
212+
AnyNumberLikeExpression::JsStringLiteralExpression(string_literal) => {
213+
is_tabindex_valid(string_literal.inner_string_text().ok()?.text())
214+
}
215+
AnyNumberLikeExpression::JsNumberLiteralExpression(number_literal) => {
216+
is_tabindex_valid(number_literal.value_token().ok()?.text())
217+
}
218+
AnyNumberLikeExpression::JsUnaryExpression(unary_expression) => {
219+
if unary_expression.is_signed_numeric_literal().ok()? {
220+
let text = unary_expression.to_trimmed_text();
221+
is_tabindex_valid(text.text())
222+
} else {
223+
return None;
224+
}
225+
}
226+
})
221227
}
222228
_ => None,
223229
}

crates/biome_js_analyze/src/lint/complexity/no_useless_catch.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -108,9 +108,9 @@ impl Rule for NoUselessCatch {
108108
.argument()
109109
.ok()?
110110
.as_js_identifier_expression()?
111-
.to_trimmed_string();
111+
.to_trimmed_text();
112112

113-
if throw_ident.eq(catch_err_name) {
113+
if throw_ident.text().eq(catch_err_name) {
114114
Some(js_throw_statement.syntax().text_trimmed_range())
115115
} else {
116116
None

crates/biome_js_analyze/src/lint/complexity/no_useless_fragments.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -217,8 +217,8 @@ impl Rule for NoUselessFragments {
217217
JsSyntaxKind::JSX_TEXT => {
218218
// We need to whitespaces and newlines from the original string.
219219
// Since in the JSX newlines aren't trivia, we require to allocate a string to trim from those characters.
220-
let original_text = child.to_trimmed_string();
221-
let child_text = original_text.trim();
220+
let original_text = child.to_trimmed_text();
221+
let child_text = original_text.text().trim();
222222

223223
if (in_jsx_expr || in_js_logical_expr)
224224
&& contains_html_character_references(child_text)

crates/biome_js_analyze/src/lint/complexity/no_useless_undefined_initialization.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -96,10 +96,10 @@ impl Rule for NoUselessUndefinedInitialization {
9696

9797
if keyword.is_undefined() {
9898
let decl_range = initializer.range();
99-
let Some(binding_name) = decl.id().ok().map(|id| id.to_trimmed_string()) else {
99+
let Some(binding_name) = decl.id().ok().map(|id| id.to_trimmed_text()) else {
100100
continue;
101101
};
102-
signals.push((binding_name.into(), decl_range));
102+
signals.push((binding_name.text().into(), decl_range));
103103
}
104104
}
105105

crates/biome_js_analyze/src/lint/correctness/no_constant_math_min_max_clamp.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ impl Rule for NoConstantMathMinMaxClamp {
9696
).detail(
9797
state.0.range(),
9898
markup! {
99-
"It always evaluates to "<Emphasis>{state.0.to_trimmed_string()}</Emphasis>"."
99+
"It always evaluates to "<Emphasis>{state.0.to_trimmed_text().text()}</Emphasis>"."
100100
}
101101
)
102102
)
@@ -111,7 +111,7 @@ impl Rule for NoConstantMathMinMaxClamp {
111111
Some(JsRuleAction::new(
112112
ctx.metadata().action_category(ctx.category(), ctx.group()),
113113
ctx.metadata().applicability(),
114-
markup! {"Swap "<Emphasis>{state.0.to_trimmed_string()}</Emphasis>" with "<Emphasis>{state.1.to_trimmed_string()}</Emphasis>"."}
114+
markup! {"Swap "<Emphasis>{state.0.to_trimmed_text().text()}</Emphasis>" with "<Emphasis>{state.1.to_trimmed_text().text()}</Emphasis>"."}
115115
.to_owned(),
116116
mutation,
117117
))

crates/biome_js_analyze/src/lint/correctness/use_hook_at_top_level.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -91,22 +91,22 @@ impl AnyJsFunctionOrMethod {
9191
false
9292
}
9393

94-
fn name(&self) -> Option<String> {
94+
fn name(&self) -> Option<Text> {
9595
match self {
9696
Self::AnyJsFunction(function) => function
9797
.binding()
9898
.as_ref()
99-
.map(AnyJsBinding::to_trimmed_string),
99+
.map(AnyJsBinding::to_trimmed_text),
100100
Self::JsMethodClassMember(method) => method
101101
.name()
102102
.ok()
103103
.as_ref()
104-
.map(AnyJsClassMemberName::to_trimmed_string),
104+
.map(AnyJsClassMemberName::to_trimmed_text),
105105
Self::JsMethodObjectMember(method) => method
106106
.name()
107107
.ok()
108108
.as_ref()
109-
.map(AnyJsObjectMemberName::to_trimmed_string),
109+
.map(AnyJsObjectMemberName::to_trimmed_text),
110110
}
111111
}
112112
}

crates/biome_js_analyze/src/lint/correctness/use_is_nan.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -237,7 +237,10 @@ fn create_is_nan_expression(nan: AnyJsExpression) -> Option<AnyJsExpression> {
237237
.object()
238238
.ok()?
239239
.as_js_static_member_expression()
240-
.is_some_and(|y| y.member().is_ok_and(|z| z.to_trimmed_string() == "Number"));
240+
.is_some_and(|y| {
241+
y.member()
242+
.is_ok_and(|z| z.to_trimmed_text().text() == "Number")
243+
});
241244

242245
if !reference.is_global_this() && !reference.has_name("window")
243246
|| number_identifier_exists

0 commit comments

Comments
 (0)