/
githubmirror
/
sway
Обзор
Документация
Войти
/
githubmirror
/
sway
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
sway-core/src/decl_engine/replace_decls.rs
126 строк
4 KB
Igor Rončević
Use `HasChanges` to propagate information about in-place mutations (#7662)
20 июн 2026, 13:06
Не верифицирован
20 июн 2026, 13:06
088068c
Код
Авторство
О чём код?
use sway_error::handler::{ErrorEmitted, Handler}; use crate::{ engine_threading::Engines, language::ty::{self, TyDecl, TyExpression}, semantic_analysis::TypeCheckContext, HasChanges, }; use super::DeclMapping; pub trait ReplaceDecls { fn replace_decls_inner( &mut self, decl_mapping: &DeclMapping, handler: &Handler, ctx: &mut TypeCheckContext, ) -> Result<HasChanges, ErrorEmitted>; fn replace_decls( &mut self, decl_mapping: &DeclMapping, handler: &Handler, ctx: &mut TypeCheckContext, ) -> Result<HasChanges, ErrorEmitted> { if !decl_mapping.is_empty() { self.replace_decls_inner(decl_mapping, handler, ctx) } else { Ok(HasChanges::No) } } } impl<T: ReplaceDecls + Clone> ReplaceDecls for std::sync::Arc<T> { fn replace_decls_inner( &mut self, decl_mapping: &DeclMapping, handler: &Handler, ctx: &mut TypeCheckContext, ) -> Result<HasChanges, ErrorEmitted> { if let Some(item) = std::sync::Arc::get_mut(self) { item.replace_decls_inner(decl_mapping, handler, ctx) } else { let mut item = self.as_ref().clone(); let r = item.replace_decls_inner(decl_mapping, handler, ctx)?; *self = std::sync::Arc::new(item); Ok(r) } } } pub(crate) trait ReplaceFunctionImplementingType { fn replace_implementing_type(&mut self, engines: &Engines, implementing_type: ty::TyDecl); } pub(crate) trait UpdateConstantExpression { fn update_constant_expression( &mut self, engines: &Engines, implementing_type: &TyDecl, ) -> HasChanges; } impl<T: UpdateConstantExpression + Clone> UpdateConstantExpression for std::sync::Arc<T> { fn update_constant_expression( &mut self, engines: &Engines, implementing_type: &TyDecl, ) -> HasChanges { if let Some(item) = std::sync::Arc::get_mut(self) { item.update_constant_expression(engines, implementing_type) } else { let mut item = self.as_ref().clone(); let has_changes = item.update_constant_expression(engines, implementing_type); *self = std::sync::Arc::new(item); has_changes } } } // Iterate the tree searching for references to a const generic, // and initialize its value with the passed value pub(crate) trait MaterializeConstGenerics { fn materialize_const_generics( &mut self, engines: &Engines, handler: &Handler, name: &str, value: &TyExpression, ) -> Result<HasChanges, ErrorEmitted>; } impl<T: MaterializeConstGenerics + Clone> MaterializeConstGenerics for std::sync::Arc<T> { fn materialize_const_generics( &mut self, engines: &Engines, handler: &Handler, name: &str, value: &TyExpression, ) -> Result<HasChanges, ErrorEmitted> { if let Some(item) = std::sync::Arc::get_mut(self) { item.materialize_const_generics(engines, handler, name, value) } else { let mut item = self.as_ref().clone(); let r = item.materialize_const_generics(engines, handler, name, value); *self = std::sync::Arc::new(item); r } } } impl<T: MaterializeConstGenerics> MaterializeConstGenerics for Vec<T> { fn materialize_const_generics( &mut self, engines: &Engines, handler: &Handler, name: &str, value: &TyExpression, ) -> Result<HasChanges, ErrorEmitted> { let mut has_changes = HasChanges::No; for item in self.iter_mut() { has_changes |= item.materialize_const_generics(engines, handler, name, value)?; } Ok(has_changes) } }