/
githubmirror
/
sway
Обзор
Документация
Войти
/
githubmirror
/
sway
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
swayfmt/src/utils/language/expr/assignable.rs
156 строк
5 KB
Marcos Henrich
Implements deref in reassignment for projections. (#6941)
21 мар 2025, 01:35
Не верифицирован
21 мар 2025, 01:35
8c916c8
Код
Авторство
О чём код?
use crate::{ formatter::*, utils::{ map::byte_span::{ByteSpan, LeafSpans}, SquareBracket, }, }; use std::fmt::Write; use sway_ast::{ assignable::ElementAccess, expr::ReassignmentOp, keywords::{DotToken, StarToken, Token}, Assignable, Expr, }; use sway_types::Spanned; impl Format for ElementAccess { fn format( &self, formatted_code: &mut FormattedCode, formatter: &mut Formatter, ) -> Result<(), FormatterError> { match self { ElementAccess::Var(name) => { name.format(formatted_code, formatter)?; } ElementAccess::Index { target, arg } => { target.format(formatted_code, formatter)?; Expr::open_square_bracket(formatted_code, formatter)?; arg.get().format(formatted_code, formatter)?; Expr::close_square_bracket(formatted_code, formatter)?; } ElementAccess::FieldProjection { target, dot_token: _, name, } => { target.format(formatted_code, formatter)?; write!(formatted_code, "{}", DotToken::AS_STR)?; name.format(formatted_code, formatter)?; } ElementAccess::TupleFieldProjection { target, dot_token: _, field, field_span: _, } => { target.format(formatted_code, formatter)?; write!(formatted_code, "{}{}", DotToken::AS_STR, field)?; } ElementAccess::Deref { target, star_token: _, is_root_element: root_element, } => { if *root_element { write!(formatted_code, "(")?; } write!(formatted_code, "{}", StarToken::AS_STR)?; target.format(formatted_code, formatter)?; if *root_element { write!(formatted_code, ")")?; } } } Ok(()) } } impl Format for Assignable { fn format( &self, formatted_code: &mut FormattedCode, formatter: &mut Formatter, ) -> Result<(), FormatterError> { match self { Assignable::ElementAccess(element_access) => { element_access.format(formatted_code, formatter)? } Assignable::Deref { star_token: _, expr, } => { write!(formatted_code, "{}", StarToken::AS_STR)?; expr.format(formatted_code, formatter)?; } } Ok(()) } } impl Format for ReassignmentOp { fn format( &self, formatted_code: &mut FormattedCode, _formatter: &mut Formatter, ) -> Result<(), FormatterError> { write!(formatted_code, " {} ", self.variant.as_str())?; Ok(()) } } impl LeafSpans for ElementAccess { fn leaf_spans(&self) -> Vec<ByteSpan> { let mut collected_spans = Vec::new(); match self { ElementAccess::Var(var) => collected_spans.push(ByteSpan::from(var.span())), ElementAccess::Index { target, arg } => { collected_spans.append(&mut target.leaf_spans()); collected_spans.append(&mut arg.leaf_spans()); } ElementAccess::FieldProjection { target, dot_token, name, } => { collected_spans.append(&mut target.leaf_spans()); collected_spans.push(ByteSpan::from(dot_token.span())); collected_spans.push(ByteSpan::from(name.span())); } ElementAccess::TupleFieldProjection { target, dot_token, field: _field, field_span, } => { collected_spans.append(&mut target.leaf_spans()); collected_spans.push(ByteSpan::from(dot_token.span())); collected_spans.push(ByteSpan::from(field_span.clone())); } ElementAccess::Deref { target, star_token, is_root_element: _, } => { collected_spans.push(ByteSpan::from(star_token.span())); collected_spans.append(&mut target.leaf_spans()); } }; collected_spans } } impl LeafSpans for Assignable { fn leaf_spans(&self) -> Vec<ByteSpan> { match self { Assignable::ElementAccess(element_access) => element_access.leaf_spans(), Assignable::Deref { star_token, expr } => { let mut collected_spans = Vec::new(); collected_spans.push(ByteSpan::from(star_token.span())); collected_spans.append(&mut expr.leaf_spans()); collected_spans } } } }