From 62b28344810b1d694842a1ea8186ae0b50737785 Mon Sep 17 00:00:00 2001 From: Teakowa Date: Wed, 23 Sep 2026 04:37:32 +0800 Subject: [PATCH] refactor: decouple source bridge from Workshop arena Refs wrightkit/workshop-rs#253 --- src/workshop_source.rs | 12 ++++++------ tests/workshop_source.rs | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/workshop_source.rs b/src/workshop_source.rs index 2fecaad..20f1d85 100644 --- a/src/workshop_source.rs +++ b/src/workshop_source.rs @@ -4,7 +4,6 @@ //! canonical Workshop source model. It deliberately contains no HIR, //! lowering, backend encoding, or catalog state. -use workshop_rs::arena::Arena; use workshop_rs::source::{FileId as WorkshopFileId, Position, SourceFile, Span as WorkshopSpan}; use crate::span::{FileId, SourceMap, Span}; @@ -35,21 +34,22 @@ pub enum SourceBridgeError { #[derive(Clone)] pub struct WorkshopSourceBridge { source_map: SourceMap, - files: Arena, + files: Vec, del_to_workshop: Vec, } impl WorkshopSourceBridge { /// Build Workshop source-file entries and a stable DEL-file-ID mapping. pub fn from_source_map(sources: &SourceMap) -> Result { - let mut files = Arena::new(); + let mut files = Vec::new(); let mut del_to_workshop = Vec::new(); for source in sources.files() { let Some(path) = source.name.to_str() else { return Err(SourceBridgeError::NonUtf8Path(source.id)); }; - let workshop_file = files.push(SourceFile::new(path)); + let workshop_file = WorkshopFileId::from_index(files.len()); + files.push(SourceFile::new(path)); let index = source.id.0 as usize; if del_to_workshop.len() <= index { del_to_workshop.resize(index + 1, workshop_file); @@ -64,8 +64,8 @@ impl WorkshopSourceBridge { }) } - /// The workshop-rs source-file arena, in DEL source-map order. - pub fn files(&self) -> &Arena { + /// Workshop source-file entries in DEL source-map order. + pub fn files(&self) -> &[SourceFile] { &self.files } diff --git a/tests/workshop_source.rs b/tests/workshop_source.rs index 6e8ca67..d7ec327 100644 --- a/tests/workshop_source.rs +++ b/tests/workshop_source.rs @@ -18,11 +18,11 @@ fn bridge_preserves_cross_file_identity_and_unicode_positions() { assert_ne!(first_workshop, second_workshop); assert_eq!(bridge.files().len(), 2); assert_eq!( - bridge.files().get(first_workshop), + bridge.files().get(first_workshop.index()), Some(&SourceFile::new("src/main.del")) ); assert_eq!( - bridge.files().get(second_workshop), + bridge.files().get(second_workshop.index()), Some(&SourceFile::new("lib/β.del")) );