Skip to content

Commit

Permalink
refactor(BREAKING): remove unused module parser build option and use …
Browse files Browse the repository at this point in the history
…less Options (#399)
  • Loading branch information
dsherret authored Apr 2, 2024
1 parent bf056eb commit 9ae1c0e
Show file tree
Hide file tree
Showing 11 changed files with 98 additions and 73 deletions.
9 changes: 4 additions & 5 deletions lib/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -263,11 +263,10 @@ pub async fn js_create_graph(
BuildOptions {
is_dynamic: false,
resolver: maybe_resolver.as_ref().map(|r| r as &dyn Resolver),
file_system: Some(&NullFileSystem),
jsr_url_provider: None,
file_system: &NullFileSystem,
jsr_url_provider: Default::default(),
npm_resolver: None,
module_analyzer: None,
module_parser: None,
module_analyzer: Default::default(),
imports,
reporter: None,
workspace_members: &[],
Expand Down Expand Up @@ -318,7 +317,7 @@ pub fn js_parse_module(
content: content.into(),
file_system: &NullFileSystem,
maybe_resolver: maybe_resolver.as_ref().map(|r| r as &dyn Resolver),
maybe_module_analyzer: None,
module_analyzer: Default::default(),
maybe_npm_resolver: None,
}) {
Ok(module) => {
Expand Down
7 changes: 7 additions & 0 deletions src/analyzer.rs
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ use serde::Serialize;
use serde::Serializer;

use crate::graph::Position;
use crate::DefaultModuleAnalyzer;

/// Matches the `@deno-types` pragma.
static DENO_TYPES_RE: Lazy<Regex> = Lazy::new(|| {
Expand Down Expand Up @@ -314,6 +315,12 @@ pub trait ModuleAnalyzer {
) -> Result<ModuleInfo, ParseDiagnostic>;
}

impl<'a> Default for &'a dyn ModuleAnalyzer {
fn default() -> &'a dyn ModuleAnalyzer {
&DefaultModuleAnalyzer
}
}

#[cfg(test)]
mod test {
use std::collections::HashMap;
Expand Down
54 changes: 35 additions & 19 deletions src/ast.rs
Original file line number Diff line number Diff line change
Expand Up @@ -209,18 +209,29 @@ impl<'a> ModuleParser for CapturingModuleParser<'a> {
}
}

/// Default module analyzer that analyzes based on a deno_ast::ParsedSource.
#[derive(Default)]
pub struct DefaultModuleAnalyzer<'a> {
parser: Option<&'a dyn ModuleParser>,
pub struct DefaultModuleAnalyzer;

impl ModuleAnalyzer for DefaultModuleAnalyzer {
fn analyze(
&self,
specifier: &deno_ast::ModuleSpecifier,
source: Arc<str>,
media_type: MediaType,
) -> Result<ModuleInfo, ParseDiagnostic> {
ParserModuleAnalyzer::default().analyze(specifier, source, media_type)
}
}

impl<'a> DefaultModuleAnalyzer<'a> {
/// Default module analyzer that analyzes based on a deno_ast::ParsedSource.
pub struct ParserModuleAnalyzer<'a> {
parser: &'a dyn ModuleParser,
}

impl<'a> ParserModuleAnalyzer<'a> {
/// Creates a new module analyzer.
pub fn new(parser: &'a dyn ModuleParser) -> Self {
Self {
parser: Some(parser),
}
Self { parser }
}

/// Gets the module info from a parsed source.
Expand Down Expand Up @@ -263,23 +274,29 @@ impl<'a> DefaultModuleAnalyzer<'a> {
}
}

impl<'a> ModuleAnalyzer for DefaultModuleAnalyzer<'a> {
impl<'a> Default for ParserModuleAnalyzer<'a> {
fn default() -> Self {
Self {
parser: &DefaultModuleParser,
}
}
}

impl<'a> ModuleAnalyzer for ParserModuleAnalyzer<'a> {
fn analyze(
&self,
specifier: &deno_ast::ModuleSpecifier,
source: Arc<str>,
media_type: MediaType,
) -> Result<ModuleInfo, ParseDiagnostic> {
let default_parser = DefaultModuleParser;
let parser = self.parser.unwrap_or(&default_parser);
let parsed_source = parser.parse_module(ParseOptions {
let parsed_source = self.parser.parse_module(ParseOptions {
specifier,
source,
media_type,
// scope analysis is not necessary for module parsing
scope_analysis: false,
})?;
Ok(DefaultModuleAnalyzer::module_info(&parsed_source))
Ok(ParserModuleAnalyzer::module_info(&parsed_source))
}
}

Expand Down Expand Up @@ -323,7 +340,7 @@ impl ModuleAnalyzer for CapturingModuleAnalyzer {
media_type: MediaType,
) -> Result<ModuleInfo, ParseDiagnostic> {
let capturing_parser = self.as_capturing_parser();
let module_analyzer = DefaultModuleAnalyzer::new(&capturing_parser);
let module_analyzer = ParserModuleAnalyzer::new(&capturing_parser);
module_analyzer.analyze(specifier, source, media_type)
}
}
Expand Down Expand Up @@ -606,7 +623,7 @@ mod tests {
})
.unwrap();
let text_info = parsed_source.text_info();
let module_info = DefaultModuleAnalyzer::module_info(&parsed_source);
let module_info = ParserModuleAnalyzer::module_info(&parsed_source);
let dependencies = module_info.dependencies;
assert_eq!(dependencies.len(), 6);

Expand Down Expand Up @@ -683,7 +700,7 @@ mod tests {
scope_analysis: false,
})
.unwrap();
let module_info = DefaultModuleAnalyzer::module_info(&parsed_source);
let module_info = ParserModuleAnalyzer::module_info(&parsed_source);
let text_info = parsed_source.text_info();
let dependencies = module_info.dependencies;
assert_eq!(dependencies.len(), 10);
Expand Down Expand Up @@ -720,7 +737,7 @@ mod tests {
scope_analysis: false,
})
.unwrap();
let module_info = DefaultModuleAnalyzer::module_info(&parsed_source);
let module_info = ParserModuleAnalyzer::module_info(&parsed_source);
let dependencies = module_info.dependencies;
assert_eq!(dependencies.len(), 2);
let dep = dependencies[0].as_static().unwrap();
Expand Down Expand Up @@ -771,7 +788,7 @@ const f = new Set();
scope_analysis: false,
})
.unwrap();
let module_info = DefaultModuleAnalyzer::module_info(&parsed_source);
let module_info = ParserModuleAnalyzer::module_info(&parsed_source);
let dependencies = module_info.jsdoc_imports;
assert_eq!(
dependencies,
Expand Down Expand Up @@ -840,8 +857,7 @@ const f = new Set();
/* @jsxImportSource preact */
export {};
"#;
let analyzer = DefaultModuleAnalyzer::new(&DefaultModuleParser);
let module_info = analyzer
let module_info = DefaultModuleAnalyzer
.analyze(&specifier, source.into(), MediaType::Tsx)
.unwrap();
assert_eq!(
Expand Down
4 changes: 2 additions & 2 deletions src/fast_check/transform.rs
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,9 @@ use deno_ast::ParsedSource;
use deno_ast::SourceRange;
use deno_ast::SourceRangedForSpanned;

use crate::DefaultModuleAnalyzer;
use crate::ModuleGraph;
use crate::ModuleInfo;
use crate::ParserModuleAnalyzer;
use crate::WorkspaceMember;

use super::range_finder::ModulePublicRanges;
Expand Down Expand Up @@ -115,7 +115,7 @@ pub fn transform(
if !transformer.diagnostics.is_empty() {
return Err(transformer.diagnostics);
}
let module_info = DefaultModuleAnalyzer::module_info_from_swc(
let module_info = ParserModuleAnalyzer::module_info_from_swc(
parsed_source.media_type(),
&module,
parsed_source.text_info(),
Expand Down
8 changes: 4 additions & 4 deletions src/fast_check/transform_dts.rs
Original file line number Diff line number Diff line change
Expand Up @@ -936,7 +936,7 @@ mod tests {
use crate::source::Source;
use crate::symbols::RootSymbol;
use crate::BuildOptions;
use crate::DefaultModuleParser;
use crate::CapturingModuleAnalyzer;
use crate::GraphKind;
use crate::ModuleGraph;
use url::Url;
Expand All @@ -955,20 +955,20 @@ mod tests {
)],
vec![],
);
let parser = DefaultModuleParser {};
let analyzer = CapturingModuleAnalyzer::default();
let mut graph = ModuleGraph::new(GraphKind::All);
graph
.build(
vec![specifier.clone()],
&mut loader,
BuildOptions {
module_parser: Some(&parser),
module_analyzer: &analyzer,
..Default::default()
},
)
.await;

let root_sym = RootSymbol::new(&graph, &parser);
let root_sym = RootSymbol::new(&graph, &analyzer);

let module_info = root_sym
.module_from_specifier(&specifier)
Expand Down
35 changes: 12 additions & 23 deletions src/graph.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,6 @@ use crate::analyzer::SpecifierWithRange;
use crate::analyzer::TypeScriptReference;
#[cfg(feature = "fast_check")]
use crate::fast_check::FastCheckDtsModule;
use crate::CapturingModuleAnalyzer;
use crate::ModuleParser;
use crate::ReferrerImports;

use crate::fast_check::FastCheckDiagnostic;
Expand Down Expand Up @@ -1001,7 +999,7 @@ pub struct BuildFastCheckTypeGraphOptions<'a> {
pub fast_check_cache: Option<&'a dyn crate::fast_check::FastCheckCache>,
pub fast_check_dts: bool,
pub jsr_url_provider: Option<&'a dyn JsrUrlProvider>,
pub module_parser: Option<&'a dyn ModuleParser>,
pub module_parser: Option<&'a dyn crate::ModuleParser>,
pub resolver: Option<&'a dyn Resolver>,
pub npm_resolver: Option<&'a dyn NpmResolver>,
/// Whether to fill workspace members with fast check TypeScript data.
Expand All @@ -1016,15 +1014,14 @@ pub struct BuildOptions<'a> {
/// be extra modules such as TypeScript's "types" option or JSX
/// runtime types.
pub imports: Vec<ReferrerImports>,
pub file_system: Option<&'a dyn FileSystem>,
pub jsr_url_provider: Option<&'a dyn JsrUrlProvider>,
pub resolver: Option<&'a dyn Resolver>,
pub executor: &'a dyn Executor,
pub file_system: &'a dyn FileSystem,
pub jsr_url_provider: &'a dyn JsrUrlProvider,
pub module_analyzer: &'a dyn ModuleAnalyzer,
pub npm_resolver: Option<&'a dyn NpmResolver>,
pub module_analyzer: Option<&'a dyn ModuleAnalyzer>,
pub module_parser: Option<&'a dyn ModuleParser>,
pub reporter: Option<&'a dyn Reporter>,
pub resolver: Option<&'a dyn Resolver>,
pub workspace_members: &'a [WorkspaceMember],
pub executor: &'a dyn Executor,
}

#[derive(Debug, Copy, Clone)]
Expand Down Expand Up @@ -1444,25 +1441,17 @@ impl ModuleGraph {
loader: &mut dyn Loader,
options: BuildOptions<'a>,
) -> Vec<BuildDiagnostic> {
let default_jsr_url_provider = DefaultJsrUrlProvider;
let default_module_parser = CapturingModuleAnalyzer::default();
#[cfg(not(target_arch = "wasm32"))]
let file_system = RealFileSystem;
#[cfg(target_arch = "wasm32")]
let file_system = NullFileSystem;
Builder::build(
self,
roots,
options.imports,
options.is_dynamic,
options.file_system.unwrap_or(&file_system),
options
.jsr_url_provider
.unwrap_or(&default_jsr_url_provider),
options.file_system,
options.jsr_url_provider,
options.resolver,
options.npm_resolver,
loader,
options.module_analyzer.unwrap_or(&default_module_parser),
options.module_analyzer,
options.reporter,
options.workspace_members,
options.executor,
Expand Down Expand Up @@ -1494,7 +1483,7 @@ impl ModuleGraph {
return;
}

let default_module_parser = CapturingModuleAnalyzer::default();
let default_module_parser = crate::CapturingModuleAnalyzer::default();
let root_symbol = crate::symbols::RootSymbol::new(
self,
options.module_parser.unwrap_or(&default_module_parser),
Expand Down Expand Up @@ -4588,7 +4577,7 @@ where
#[cfg(test)]
mod tests {
use crate::packages::JsrPackageInfoVersion;
use crate::DefaultModuleAnalyzer;
use crate::ParserModuleAnalyzer;
use deno_ast::dep::ImportAttribute;
use pretty_assertions::assert_eq;
use serde_json::json;
Expand Down Expand Up @@ -4656,7 +4645,7 @@ mod tests {
#[test]
fn test_module_dependency_includes() {
let specifier = ModuleSpecifier::parse("file:///a.ts").unwrap();
let module_analyzer = DefaultModuleAnalyzer::default();
let module_analyzer = ParserModuleAnalyzer::default();
let content: Arc<[u8]> = Arc::from(
b"import * as b from \"./b.ts\";\nimport * as c from \"./b.ts\"".to_vec(),
);
Expand Down
Loading

0 comments on commit 9ae1c0e

Please sign in to comment.