Skip to content

Commit b4d48a1

Browse files
authored
feat: Depcrate SourceMapGetter, move methods to ModuleLoader (#823)
This commit deprecates `SourceMapGetter` trait, `JsRuntime::source_map_getter` option and updates `ModuleLoader` trait to have the same methods as `SourceMapGetter`. In real usage it's always implementor of `ModuleLoader` that also implements `SourceMapGetter`. It makes little sense to keep these two trait separate. This will open up doors for native source map support that is being developed in #819. `SourceMapGetter` is scheduled to be removed in 0.297.0.
1 parent 19ef2b4 commit b4d48a1

File tree

7 files changed

+72
-47
lines changed

7 files changed

+72
-47
lines changed

core/examples/ts_module_loader.rs

Lines changed: 10 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -29,29 +29,16 @@ use deno_core::ModuleType;
2929
use deno_core::RequestedModuleType;
3030
use deno_core::ResolutionKind;
3131
use deno_core::RuntimeOptions;
32-
use deno_core::SourceMapGetter;
3332

34-
#[derive(Clone)]
35-
struct SourceMapStore(Rc<RefCell<HashMap<String, Vec<u8>>>>);
36-
37-
impl SourceMapGetter for SourceMapStore {
38-
fn get_source_map(&self, specifier: &str) -> Option<Vec<u8>> {
39-
self.0.borrow().get(specifier).cloned()
40-
}
41-
42-
fn get_source_line(
43-
&self,
44-
_file_name: &str,
45-
_line_number: usize,
46-
) -> Option<String> {
47-
None
48-
}
49-
}
33+
// TODO(bartlomieju): this is duplicated in `testing/checkin`
34+
type SourceMapStore = Rc<RefCell<HashMap<String, Vec<u8>>>>;
5035

36+
// TODO(bartlomieju): this is duplicated in `testing/checkin`
5137
struct TypescriptModuleLoader {
5238
source_maps: SourceMapStore,
5339
}
5440

41+
// TODO(bartlomieju): this is duplicated in `testing/checkin`
5542
impl ModuleLoader for TypescriptModuleLoader {
5643
fn resolve(
5744
&self,
@@ -112,7 +99,6 @@ impl ModuleLoader for TypescriptModuleLoader {
11299
})?;
113100
let source_map = res.source_map.unwrap();
114101
source_maps
115-
.0
116102
.borrow_mut()
117103
.insert(module_specifier.to_string(), source_map.into_bytes());
118104
res.text
@@ -129,6 +115,10 @@ impl ModuleLoader for TypescriptModuleLoader {
129115

130116
ModuleLoadResponse::Sync(load(source_maps, module_specifier))
131117
}
118+
119+
fn get_source_map(&self, specifier: &str) -> Option<Vec<u8>> {
120+
self.source_maps.borrow().get(specifier).cloned()
121+
}
132122
}
133123

134124
fn main() -> Result<(), Error> {
@@ -140,13 +130,12 @@ fn main() -> Result<(), Error> {
140130
let main_url = &args[1];
141131
println!("Run {main_url}");
142132

143-
let source_map_store = SourceMapStore(Rc::new(RefCell::new(HashMap::new())));
133+
let source_map_store = Rc::new(RefCell::new(HashMap::new()));
144134

145135
let mut js_runtime = JsRuntime::new(RuntimeOptions {
146136
module_loader: Some(Rc::new(TypescriptModuleLoader {
147-
source_maps: source_map_store.clone(),
137+
source_maps: source_map_store,
148138
})),
149-
source_map_getter: Some(Rc::new(source_map_store)),
150139
..Default::default()
151140
});
152141

core/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,7 @@ pub use crate::runtime::MODULE_MAP_SLOT_INDEX;
161161
pub use crate::runtime::V8_WRAPPER_OBJECT_INDEX;
162162
pub use crate::runtime::V8_WRAPPER_TYPE_INDEX;
163163
pub use crate::source_map::SourceMapData;
164+
#[allow(deprecated)]
164165
pub use crate::source_map::SourceMapGetter;
165166
pub use crate::tasks::V8CrossThreadTaskSpawner;
166167
pub use crate::tasks::V8TaskSpawner;

core/modules/loaders.rs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,21 @@ pub trait ModuleLoader {
9595
) -> Pin<Box<dyn Future<Output = ()>>> {
9696
async {}.boxed_local()
9797
}
98+
99+
/// Returns a source map for given `file_name`.
100+
///
101+
/// This function will soon be deprecated or renamed.
102+
fn get_source_map(&self, _file_name: &str) -> Option<Vec<u8>> {
103+
None
104+
}
105+
106+
fn get_source_mapped_source_line(
107+
&self,
108+
_file_name: &str,
109+
_line_number: usize,
110+
) -> Option<String> {
111+
None
112+
}
98113
}
99114

100115
/// Placeholder structure used when creating

core/runtime/jsruntime.rs

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ use crate::runtime::ContextState;
4444
use crate::runtime::JsRealm;
4545
use crate::runtime::OpDriverImpl;
4646
use crate::source_map::SourceMapData;
47+
#[allow(deprecated)]
4748
use crate::source_map::SourceMapGetter;
4849
use crate::source_map::SourceMapper;
4950
use crate::stats::RuntimeActivityType;
@@ -428,6 +429,8 @@ pub struct JsRuntimeState {
428429
#[derive(Default)]
429430
pub struct RuntimeOptions {
430431
/// Source map reference for errors.
432+
#[deprecated = "Update `ModuleLoader` trait implementations. This option will be removed in deno_core v0.300.0."]
433+
#[allow(deprecated)]
431434
pub source_map_getter: Option<Rc<dyn SourceMapGetter>>,
432435

433436
/// Allows to map error type to a string "class" used to represent
@@ -672,7 +675,12 @@ impl JsRuntime {
672675

673676
// Load the sources and source maps
674677
let mut files_loaded = Vec::with_capacity(128);
675-
let mut source_mapper = SourceMapper::new(options.source_map_getter);
678+
let loader = options
679+
.module_loader
680+
.unwrap_or_else(|| Rc::new(NoopModuleLoader));
681+
#[allow(deprecated)]
682+
let mut source_mapper =
683+
SourceMapper::new(loader.clone(), options.source_map_getter);
676684
let mut sources = extension_set::into_sources(
677685
options.extension_transpiler.as_deref(),
678686
&extensions,
@@ -890,9 +898,6 @@ impl JsRuntime {
890898
// ...now that JavaScript bindings to ops are available we can deserialize
891899
// modules stored in the snapshot (because they depend on the ops and external
892900
// references must match properly) and recreate a module map...
893-
let loader = options
894-
.module_loader
895-
.unwrap_or_else(|| Rc::new(NoopModuleLoader));
896901
let import_meta_resolve_cb = options
897902
.import_meta_resolve_callback
898903
.unwrap_or_else(|| Box::new(default_import_meta_resolve_cb));

core/source_map.rs

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,18 @@
22

33
//! This mod provides functions to remap a `JsError` based on a source map.
44
5+
// TODO(bartlomieju): remove once `SourceMapGetter` is removed.
6+
#![allow(deprecated)]
7+
58
use crate::resolve_url;
9+
use crate::ModuleLoader;
610
pub use sourcemap::SourceMap;
711
use std::borrow::Cow;
812
use std::collections::HashMap;
913
use std::rc::Rc;
1014
use std::str;
1115

16+
#[deprecated = "Use `ModuleLoader` methods instead. This trait will be removed in deno_core v0.300.0."]
1217
pub trait SourceMapGetter {
1318
/// Returns the raw source map file.
1419
fn get_source_map(&self, file_name: &str) -> Option<Vec<u8>>;
@@ -40,6 +45,8 @@ pub type SourceMapData = Cow<'static, [u8]>;
4045
pub struct SourceMapper {
4146
maps: HashMap<String, Option<SourceMap>>,
4247
source_lines: HashMap<(String, i64), Option<String>>,
48+
loader: Rc<dyn ModuleLoader>,
49+
4350
getter: Option<Rc<dyn SourceMapGetter>>,
4451
pub(crate) ext_source_maps: HashMap<String, SourceMapData>,
4552
// This is not the right place for this, but it's the easiest way to make
@@ -48,11 +55,15 @@ pub struct SourceMapper {
4855
}
4956

5057
impl SourceMapper {
51-
pub fn new(getter: Option<Rc<dyn SourceMapGetter>>) -> Self {
58+
pub fn new(
59+
loader: Rc<dyn ModuleLoader>,
60+
getter: Option<Rc<dyn SourceMapGetter>>,
61+
) -> Self {
5262
Self {
5363
maps: Default::default(),
5464
source_lines: Default::default(),
5565
ext_source_maps: Default::default(),
66+
loader,
5667
getter,
5768
stashed_file_name: Default::default(),
5869
}
@@ -84,6 +95,9 @@ impl SourceMapper {
8495
.or_else(|| {
8596
SourceMap::from_slice(self.ext_source_maps.get(file_name)?).ok()
8697
})
98+
.or_else(|| {
99+
SourceMap::from_slice(&self.loader.get_source_map(file_name)?).ok()
100+
})
87101
.or_else(|| {
88102
SourceMap::from_slice(&getter?.get_source_map(file_name)?).ok()
89103
})
@@ -141,13 +155,25 @@ impl SourceMapper {
141155
line_number: i64,
142156
) -> Option<String> {
143157
let getter = self.getter.as_ref()?;
158+
144159
self
145160
.source_lines
146161
.entry((file_name.to_string(), line_number))
147162
.or_insert_with(|| {
148163
// Source lookup expects a 0-based line number, ours are 1-based.
149-
let s = getter.get_source_line(file_name, (line_number - 1) as usize);
150-
s.filter(|s| s.len() <= Self::MAX_SOURCE_LINE_LENGTH)
164+
if let Some(source_line) = self
165+
.loader
166+
.get_source_mapped_source_line(file_name, (line_number - 1) as usize)
167+
{
168+
if source_line.len() <= Self::MAX_SOURCE_LINE_LENGTH {
169+
Some(source_line)
170+
} else {
171+
None
172+
}
173+
} else {
174+
let s = getter.get_source_line(file_name, (line_number - 1) as usize);
175+
s.filter(|s| s.len() <= Self::MAX_SOURCE_LINE_LENGTH)
176+
}
151177
})
152178
.clone()
153179
}

testing/checkin/runner/mod.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,6 @@ pub fn create_runtime_from_snapshot(
125125
deno_core::error::get_custom_error_class(error).unwrap_or("Error")
126126
}),
127127
shared_array_buffer_store: Some(CrossIsolateStore::default()),
128-
source_map_getter: Some(module_loader),
129128
custom_module_evaluation_cb: Some(Box::new(custom_module_evaluation_cb)),
130129
inspector,
131130
..Default::default()

testing/checkin/runner/ts_module_loader.rs

Lines changed: 8 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -28,30 +28,17 @@ use deno_core::ModuleType;
2828
use deno_core::RequestedModuleType;
2929
use deno_core::ResolutionKind;
3030
use deno_core::SourceMapData;
31-
use deno_core::SourceMapGetter;
3231

33-
#[derive(Clone, Default)]
34-
struct SourceMapStore(Rc<RefCell<HashMap<String, Vec<u8>>>>);
35-
36-
impl SourceMapGetter for TypescriptModuleLoader {
37-
fn get_source_map(&self, specifier: &str) -> Option<Vec<u8>> {
38-
self.source_maps.0.borrow().get(specifier).cloned()
39-
}
40-
41-
fn get_source_line(
42-
&self,
43-
_file_name: &str,
44-
_line_number: usize,
45-
) -> Option<String> {
46-
None
47-
}
48-
}
32+
// TODO(bartlomieju): this is duplicated in `core/examples/ts_modules_loader.rs`.
33+
type SourceMapStore = Rc<RefCell<HashMap<String, Vec<u8>>>>;
4934

35+
// TODO(bartlomieju): this is duplicated in `core/examples/ts_modules_loader.rs`.
5036
#[derive(Default)]
5137
pub struct TypescriptModuleLoader {
5238
source_maps: SourceMapStore,
5339
}
5440

41+
// TODO(bartlomieju): this is duplicated in `core/examples/ts_modules_loader.rs`.
5542
impl ModuleLoader for TypescriptModuleLoader {
5643
fn resolve(
5744
&self,
@@ -135,7 +122,6 @@ impl ModuleLoader for TypescriptModuleLoader {
135122
})?;
136123
let source_map = res.source_map.unwrap();
137124
source_maps
138-
.0
139125
.borrow_mut()
140126
.insert(module_specifier.to_string(), source_map.into_bytes());
141127
res.text
@@ -156,6 +142,10 @@ impl ModuleLoader for TypescriptModuleLoader {
156142
requested_module_type,
157143
))
158144
}
145+
146+
fn get_source_map(&self, specifier: &str) -> Option<Vec<u8>> {
147+
self.source_maps.borrow().get(specifier).cloned()
148+
}
159149
}
160150

161151
pub fn maybe_transpile_source(

0 commit comments

Comments
 (0)