diff options
Diffstat (limited to 'cli/tools')
-rw-r--r-- | cli/tools/doc.rs | 158 | ||||
-rw-r--r-- | cli/tools/lint.rs | 42 | ||||
-rw-r--r-- | cli/tools/test.rs | 2 |
3 files changed, 118 insertions, 84 deletions
diff --git a/cli/tools/doc.rs b/cli/tools/doc.rs index ab9ea127e..339e046c3 100644 --- a/cli/tools/doc.rs +++ b/cli/tools/doc.rs @@ -5,75 +5,89 @@ use crate::colors; use crate::file_fetcher::File; use crate::flags::Flags; use crate::get_types; +use crate::import_map::ImportMap; use crate::media_type::MediaType; -use crate::module_graph; use crate::program_state::ProgramState; -use crate::specifier_handler::FetchHandler; use crate::write_json_to_stdout; use crate::write_to_stdout_ignore_sigpipe; use deno_core::error::AnyError; +use deno_core::futures::future; use deno_core::futures::future::FutureExt; -use deno_core::futures::Future; -use deno_core::parking_lot::Mutex; use deno_core::resolve_url_or_path; use deno_doc as doc; -use deno_doc::parser::DocFileLoader; +use deno_graph::create_graph; +use deno_graph::source::LoadFuture; +use deno_graph::source::LoadResponse; +use deno_graph::source::Loader; +use deno_graph::source::Resolver; +use deno_graph::ModuleSpecifier; use deno_runtime::permissions::Permissions; use std::path::PathBuf; -use std::pin::Pin; use std::sync::Arc; -use swc_ecmascript::parser::Syntax; -type DocResult = Result<(Syntax, String), doc::DocError>; - -/// When parsing lib.deno.d.ts, only `DocParser::parse_source` is used, -/// which never even references the loader, so this is just a stub for that scenario. -/// -/// TODO(Liamolucko): Refactor `deno_doc` so this isn't necessary. struct StubDocLoader; -impl DocFileLoader for StubDocLoader { - fn resolve( - &self, - _specifier: &str, - _referrer: &str, - ) -> Result<String, doc::DocError> { - unreachable!() +impl Loader for StubDocLoader { + fn load( + &mut self, + specifier: &ModuleSpecifier, + _is_dynamic: bool, + ) -> LoadFuture { + Box::pin(future::ready((specifier.clone(), Ok(None)))) } +} - fn load_source_code( - &self, - _specifier: &str, - ) -> Pin<Box<dyn Future<Output = DocResult>>> { - unreachable!() - } +#[derive(Debug)] +struct DocResolver { + import_map: Option<ImportMap>, } -impl DocFileLoader for module_graph::Graph { +impl Resolver for DocResolver { fn resolve( &self, specifier: &str, - referrer: &str, - ) -> Result<String, doc::DocError> { - let referrer = - resolve_url_or_path(referrer).expect("Expected valid specifier"); - match self.resolve(specifier, &referrer, true) { - Ok(specifier) => Ok(specifier.to_string()), - Err(e) => Err(doc::DocError::Resolve(e.to_string())), + referrer: &ModuleSpecifier, + ) -> Result<ModuleSpecifier, AnyError> { + if let Some(import_map) = &self.import_map { + return import_map + .resolve(specifier, referrer.as_str()) + .map_err(AnyError::from); } + + let module_specifier = + deno_core::resolve_import(specifier, referrer.as_str())?; + + Ok(module_specifier) } +} - fn load_source_code( - &self, - specifier: &str, - ) -> Pin<Box<dyn Future<Output = DocResult>>> { - let specifier = - resolve_url_or_path(specifier).expect("Expected valid specifier"); - let source = self.get_source(&specifier).expect("Unknown dependency"); - let media_type = - self.get_media_type(&specifier).expect("Unknown media type"); - let syntax = ast::get_syntax(&media_type); - async move { Ok((syntax, source)) }.boxed_local() +struct DocLoader { + program_state: Arc<ProgramState>, +} + +impl Loader for DocLoader { + fn load( + &mut self, + specifier: &ModuleSpecifier, + _is_dynamic: bool, + ) -> LoadFuture { + let specifier = specifier.clone(); + let program_state = self.program_state.clone(); + async move { + let result = program_state + .file_fetcher + .fetch(&specifier, &mut Permissions::allow_all()) + .await + .map(|file| { + Some(LoadResponse { + specifier: specifier.clone(), + content: Arc::new(file.source), + maybe_headers: file.maybe_headers, + }) + }); + (specifier.clone(), result) + } + .boxed_local() } } @@ -88,12 +102,21 @@ pub async fn print_docs( let source_file = source_file.unwrap_or_else(|| "--builtin".to_string()); let parse_result = if source_file == "--builtin" { - let loader = Box::new(StubDocLoader); - let doc_parser = doc::DocParser::new(loader, private); - + let mut loader = StubDocLoader; + let source_file_specifier = + ModuleSpecifier::parse("deno://lib.deno.d.ts").unwrap(); + let graph = create_graph( + source_file_specifier.clone(), + &mut loader, + None, + None, + None, + ) + .await; + let doc_parser = doc::DocParser::new(graph, private); let syntax = ast::get_syntax(&MediaType::Dts); doc_parser.parse_source( - "lib.deno.d.ts", + &source_file_specifier, syntax, get_types(flags.unstable).as_str(), ) @@ -109,31 +132,28 @@ pub async fn print_docs( media_type: MediaType::TypeScript, source: format!("export * from \"{}\";", module_specifier), specifier: root_specifier.clone(), + maybe_headers: None, }; // Save our fake file into file fetcher cache. program_state.file_fetcher.insert_cached(root); - let handler = Arc::new(Mutex::new(FetchHandler::new( - &program_state, - Permissions::allow_all(), - Permissions::allow_all(), - )?)); - let mut builder = module_graph::GraphBuilder::new( - handler, - program_state.maybe_import_map.clone(), - program_state.lockfile.clone(), - ); - builder.add(&root_specifier, false).await?; - builder - .analyze_config_file(&program_state.maybe_config_file) - .await?; - let graph = builder.get_graph(); - - let doc_parser = doc::DocParser::new(Box::new(graph), private); - doc_parser - .parse_with_reexports(root_specifier.as_str()) - .await + let mut loader = DocLoader { + program_state: program_state.clone(), + }; + let resolver = DocResolver { + import_map: program_state.maybe_import_map.clone(), + }; + let graph = create_graph( + root_specifier.clone(), + &mut loader, + Some(&resolver), + None, + None, + ) + .await; + let doc_parser = doc::DocParser::new(graph, private); + doc_parser.parse_with_reexports(&root_specifier) }; let mut doc_nodes = match parse_result { diff --git a/cli/tools/lint.rs b/cli/tools/lint.rs index f87ad4359..7e6d2e923 100644 --- a/cli/tools/lint.rs +++ b/cli/tools/lint.rs @@ -239,8 +239,9 @@ impl LintReporter for PrettyLintReporter { d.hint.as_ref(), &fmt_errors::format_location(&JsStackFrame::from_location( Some(d.filename.clone()), - Some(d.range.start.line as i64), - Some(d.range.start.col as i64), + Some(d.range.start.line_index as i64 + 1), // 1-indexed + // todo(#11111): make 1-indexed as well + Some(d.range.start.column_index as i64), )), ); @@ -277,24 +278,32 @@ pub fn format_diagnostic( ) -> String { let mut lines = vec![]; - for i in range.start.line..=range.end.line { - lines.push(source_lines[i - 1].to_string()); - if range.start.line == range.end.line { + for (i, line) in source_lines + .iter() + .enumerate() + .take(range.end.line_index + 1) + .skip(range.start.line_index) + { + lines.push(line.to_string()); + if range.start.line_index == range.end.line_index { lines.push(format!( "{}{}", - " ".repeat(range.start.col), - colors::red(&"^".repeat(range.end.col - range.start.col)) + " ".repeat(range.start.column_index), + colors::red( + &"^".repeat(range.end.column_index - range.start.column_index) + ) )); } else { - let line_len = source_lines[i - 1].len(); - if range.start.line == i { + let line_len = line.len(); + if range.start.line_index == i { lines.push(format!( "{}{}", - " ".repeat(range.start.col), - colors::red(&"^".repeat(line_len - range.start.col)) + " ".repeat(range.start.column_index), + colors::red(&"^".repeat(line_len - range.start.column_index)) )); - } else if range.end.line == i { - lines.push(colors::red(&"^".repeat(range.end.col)).to_string()); + } else if range.end.line_index == i { + lines + .push(colors::red(&"^".repeat(range.end.column_index)).to_string()); } else if line_len != 0 { lines.push(colors::red(&"^".repeat(line_len)).to_string()); } @@ -363,9 +372,12 @@ fn sort_diagnostics(diagnostics: &mut Vec<LintDiagnostic>) { let file_order = a.filename.cmp(&b.filename); match file_order { Ordering::Equal => { - let line_order = a.range.start.line.cmp(&b.range.start.line); + let line_order = + a.range.start.line_index.cmp(&b.range.start.line_index); match line_order { - Ordering::Equal => a.range.start.col.cmp(&b.range.start.col), + Ordering::Equal => { + a.range.start.column_index.cmp(&b.range.start.column_index) + } _ => line_order, } } diff --git a/cli/tools/test.rs b/cli/tools/test.rs index 8111293b4..90293173b 100644 --- a/cli/tools/test.rs +++ b/cli/tools/test.rs @@ -262,6 +262,7 @@ async fn test_specifier( media_type: MediaType::JavaScript, source: test_source.clone(), specifier: test_specifier.clone(), + maybe_headers: None, }; program_state.file_fetcher.insert_cached(test_file); @@ -381,6 +382,7 @@ fn extract_files_from_regex_blocks( media_type: file_media_type, source: file_source, specifier: file_specifier, + maybe_headers: None, }) }) .collect(); |