Skip to content

Commit fe4d182

Browse files
authored
refactor: separate module doc from docnodes (#779)
1 parent bf68a4c commit fe4d182

181 files changed

Lines changed: 15494 additions & 15259 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

examples/ddoc/main.rs

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -210,22 +210,28 @@ async fn run() -> anyhow::Result<()> {
210210
return Ok(());
211211
}
212212

213-
let mut doc_nodes =
214-
doc_nodes_by_url.into_values().flatten().collect::<Vec<_>>();
213+
let mut merged_doc = deno_doc::Document::default();
214+
for doc in doc_nodes_by_url.into_values() {
215+
if merged_doc.module_doc.is_empty() {
216+
merged_doc.module_doc = doc.module_doc;
217+
}
218+
merged_doc.symbols.extend(doc.symbols);
219+
}
215220

216-
doc_nodes.retain(|doc_node| {
221+
merged_doc.symbols.retain(|doc_node| {
217222
!matches!(doc_node.declarations[0].def, DeclarationDef::Import(..))
218223
});
219224

220225
if let Some(filter) = filter {
221-
doc_nodes = find_nodes_by_name_recursively(doc_nodes, &filter);
226+
merged_doc.symbols =
227+
find_nodes_by_name_recursively(merged_doc.symbols, &filter);
222228
}
223229

224230
if json {
225-
serde_json::to_writer_pretty(std::io::stdout(), &doc_nodes)?;
231+
serde_json::to_writer_pretty(std::io::stdout(), &merged_doc)?;
226232
println!();
227233
} else {
228-
let result = DocPrinter::new(&doc_nodes, true, false);
234+
let result = DocPrinter::new(&merged_doc, true, false);
229235
println!("{result}");
230236
}
231237
}
@@ -379,7 +385,7 @@ fn generate_docs_directory(
379385
package_name: Option<String>,
380386
output_dir: PathBuf,
381387
main_entrypoint: Option<ModuleSpecifier>,
382-
doc_nodes_by_url: IndexMap<ModuleSpecifier, Vec<deno_doc::Symbol>>,
388+
doc_nodes_by_url: IndexMap<ModuleSpecifier, deno_doc::Document>,
383389
) -> Result<(), anyhow::Error> {
384390
let cwd = current_dir().unwrap();
385391
let output_dir_resolved = cwd.join(output_dir);

js/mod.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
22

33
import { instantiate } from "./deno_doc_wasm.generated.js";
4-
import type { DocNode, Location } from "./types.d.ts";
4+
import type { Document, Location } from "./types.d.ts";
55
import type { Page } from "./html_types.d.ts";
66
import { createCache } from "@deno/cache-dir";
77
import type { CacheSetting, LoadResponse } from "@deno/graph";
@@ -87,7 +87,7 @@ export interface DocOptions {
8787
export async function doc(
8888
specifiers: string[],
8989
options: DocOptions = {},
90-
): Promise<Record<string, Array<DocNode>>> {
90+
): Promise<Record<string, Document>> {
9191
const {
9292
load = createCache().load,
9393
includeAll = false,
@@ -303,12 +303,12 @@ const defaultUsageComposer: UsageComposer = {
303303
};
304304

305305
/**
306-
* Generate HTML files for provided {@linkcode DocNode}s.
306+
* Generate HTML files for provided {@linkcode Document}s.
307307
* @param docNodesByUrl DocNodes keyed by their absolute URL.
308308
* @param options Options for the generation.
309309
*/
310310
export async function generateHtml(
311-
docNodesByUrl: Record<string, Array<DocNode>>,
311+
docNodesByUrl: Record<string, Document>,
312312
options: GenerateOptions,
313313
): Promise<Record<string, string>> {
314314
const {
@@ -346,7 +346,7 @@ export async function generateHtml(
346346
* @param options Options for the generation.
347347
*/
348348
export async function generateHtmlAsJSON(
349-
docNodesByUrl: Record<string, Array<DocNode>>,
349+
docNodesByUrl: Record<string, Document>,
350350
options: GenerateOptions,
351351
): Promise<Record<string, Page>> {
352352
const {

js/test.ts

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,9 @@ Deno.test({
99
const records = await doc(
1010
["https://deno.land/std@0.104.0/fmt/colors.ts"],
1111
);
12-
const entries = records["https://deno.land/std@0.104.0/fmt/colors.ts"];
13-
assertEquals(entries.length, 49);
14-
const fnStripColor = entries.find((n) =>
12+
const document = records["https://deno.land/std@0.104.0/fmt/colors.ts"];
13+
assertEquals(document.symbols.length, 49);
14+
const fnStripColor = document.symbols.find((n) =>
1515
n.declarations.some((d) => d.kind === "function") &&
1616
n.name === "stripColor"
1717
);
@@ -61,7 +61,7 @@ Deno.test({
6161
Deno.test({
6262
name: "doc() - with headers",
6363
async fn() {
64-
const entries = await doc(["https://example.com/a"], {
64+
const documents = await doc(["https://example.com/a"], {
6565
load(specifier) {
6666
return Promise.resolve({
6767
kind: "module",
@@ -75,7 +75,7 @@ Deno.test({
7575
});
7676
},
7777
});
78-
assertEquals(Object.values(entries)[0].length, 1);
78+
assertEquals(Object.values(documents)[0].symbols.length, 1);
7979
},
8080
});
8181

@@ -121,10 +121,10 @@ Deno.test({
121121
});
122122
},
123123
});
124-
const entries = Object.values(records)[0];
125-
assertEquals(entries.length, 1);
126-
assertEquals(entries[0].declarations[0].kind, "class");
127-
assertEquals(entries[0].name, "B");
124+
const document = Object.values(records)[0];
125+
assertEquals(document.symbols.length, 1);
126+
assertEquals(document.symbols[0].declarations[0].kind, "class");
127+
assertEquals(document.symbols[0].name, "B");
128128
},
129129
});
130130

js/types.d.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
22

3+
export interface Document {
4+
moduleDoc?: JsDoc;
5+
symbols: DocNode[];
6+
}
7+
38
export interface DocNode {
49
name: string;
510
isDefault?: true;

lib/lib.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use anyhow::Context;
55
use deno_doc::html::UrlResolveKind;
66
use deno_doc::html::UsageComposerEntry;
77
use deno_doc::html::UsageToMd;
8-
use deno_doc::DocParser;
8+
use deno_doc::{DocParser, Document};
99
use deno_graph::ast::CapturingModuleAnalyzer;
1010
use deno_graph::source::CacheSetting;
1111
use deno_graph::source::LoadError;
@@ -566,7 +566,7 @@ fn generate_html_inner(
566566
>(default_symbol_map)
567567
.map_err(|err| anyhow!("defaultSymbolMap: {}", err))?;
568568

569-
let doc_nodes_by_url: IndexMap<ModuleSpecifier, Vec<deno_doc::Symbol>> =
569+
let doc_nodes_by_url: IndexMap<ModuleSpecifier, Document> =
570570
serde_wasm_bindgen::from_value(doc_nodes_by_url)
571571
.map_err(|err| anyhow!("docNodesByUrl: {}", err))?;
572572

src/diagnostics.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -402,9 +402,7 @@ impl DiagnosticDocNodeVisitor<'_, '_> {
402402
| DeclarationDef::Namespace(..)
403403
| DeclarationDef::TypeAlias(..)
404404
| DeclarationDef::Variable(..) => true,
405-
DeclarationDef::Import(..)
406-
| DeclarationDef::ModuleDoc
407-
| DeclarationDef::Reference(..) => false,
405+
DeclarationDef::Import(..) | DeclarationDef::Reference(..) => false,
408406
}
409407
}
410408

src/diff/mod.rs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -163,10 +163,10 @@ impl DocDiff {
163163
let mut modified_modules = IndexMap::new();
164164

165165
for specifier in old_modules.intersection(&new_modules) {
166-
let old_nodes = old.get(*specifier).unwrap();
167-
let new_nodes = new.get(*specifier).unwrap();
166+
let old_doc = old.get(*specifier).unwrap();
167+
let new_doc = new.get(*specifier).unwrap();
168168

169-
let module_diff = ModuleDiff::diff(old_nodes, new_nodes);
169+
let module_diff = ModuleDiff::diff(&old_doc.symbols, &new_doc.symbols);
170170

171171
if module_diff.has_changes() {
172172
modified_modules.insert((*specifier).clone(), module_diff);
@@ -602,7 +602,6 @@ impl DeclarationDefDiff {
602602

603603
(DeclarationDef::Import(..), DeclarationDef::Import(..)) => None,
604604
(DeclarationDef::Reference(..), DeclarationDef::Reference(..)) => None,
605-
(DeclarationDef::ModuleDoc, DeclarationDef::ModuleDoc) => None,
606605

607606
_ => unreachable!(),
608607
}

src/html/jsdoc.rs

Lines changed: 70 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
use super::render_context::RenderContext;
22
use super::util::*;
3-
use crate::DeclarationDef;
43
use crate::html::ShortPath;
54
use crate::js_doc::JsDoc;
65
use crate::js_doc::JsDocTag;
@@ -802,34 +801,30 @@ impl ModuleDocCtx {
802801

803802
let mut sections = Vec::with_capacity(7);
804803

805-
let (deprecated, html) = if let Some(decl) =
806-
module_doc_nodes.iter().find_map(|n| {
807-
n.declarations
808-
.iter()
809-
.find(|decl| matches!(decl.def, DeclarationDef::ModuleDoc))
810-
}) {
811-
let deprecated = decl.js_doc.tags.iter().find_map(|tag| {
812-
if let JsDocTag::Deprecated { doc } = tag {
813-
Some(render_markdown(
814-
render_ctx,
815-
doc.as_deref().unwrap_or_default(),
816-
false,
817-
))
818-
} else {
819-
None
820-
}
821-
});
804+
let (deprecated, html) =
805+
if let Some(js_doc) = render_ctx.ctx.module_docs.get(short_path) {
806+
let deprecated = js_doc.tags.iter().find_map(|tag| {
807+
if let JsDocTag::Deprecated { doc } = tag {
808+
Some(render_markdown(
809+
render_ctx,
810+
doc.as_deref().unwrap_or_default(),
811+
false,
812+
))
813+
} else {
814+
None
815+
}
816+
});
822817

823-
if let Some(examples) = jsdoc_examples(render_ctx, &decl.js_doc) {
824-
sections.push(examples);
825-
}
818+
if let Some(examples) = jsdoc_examples(render_ctx, js_doc) {
819+
sections.push(examples);
820+
}
826821

827-
let html = jsdoc_body_to_html(render_ctx, &decl.js_doc, summary);
822+
let html = jsdoc_body_to_html(render_ctx, js_doc, summary);
828823

829-
(deprecated, html)
830-
} else {
831-
(None, None)
832-
};
824+
(deprecated, html)
825+
} else {
826+
(None, None)
827+
};
833828

834829
if render_symbols {
835830
let partitions_by_kind = super::partition::partition_nodes_by_kind(
@@ -896,6 +891,7 @@ mod test {
896891
use crate::interface::InterfaceDef;
897892
use crate::js_doc::JsDoc;
898893
use crate::node::DeclarationKind;
894+
use crate::node::Document;
899895

900896
struct EmptyResolver;
901897

@@ -984,26 +980,52 @@ mod test {
984980
IndexMap::from([
985981
(
986982
ModuleSpecifier::parse("file:///a.ts").unwrap(),
987-
vec![
988-
Symbol::interface(
989-
"foo".into(),
990-
false,
991-
Location::default(),
992-
DeclarationKind::Export,
993-
JsDoc::default(),
994-
InterfaceDef {
995-
def_name: None,
996-
extends: vec![],
997-
constructors: vec![],
998-
methods: vec![],
999-
properties: vec![],
1000-
call_signatures: vec![],
1001-
index_signatures: vec![],
1002-
type_params: Box::new([]),
1003-
},
1004-
),
1005-
Symbol::interface(
1006-
"bar".into(),
983+
Document {
984+
module_doc: Default::default(),
985+
symbols: vec![
986+
Symbol::interface(
987+
"foo".into(),
988+
false,
989+
Location::default(),
990+
DeclarationKind::Export,
991+
JsDoc::default(),
992+
InterfaceDef {
993+
def_name: None,
994+
extends: vec![],
995+
constructors: vec![],
996+
methods: vec![],
997+
properties: vec![],
998+
call_signatures: vec![],
999+
index_signatures: vec![],
1000+
type_params: Box::new([]),
1001+
},
1002+
),
1003+
Symbol::interface(
1004+
"bar".into(),
1005+
false,
1006+
Location::default(),
1007+
DeclarationKind::Export,
1008+
JsDoc::default(),
1009+
InterfaceDef {
1010+
def_name: None,
1011+
extends: vec![],
1012+
constructors: vec![],
1013+
methods: vec![],
1014+
properties: vec![],
1015+
call_signatures: vec![],
1016+
index_signatures: vec![],
1017+
type_params: Box::new([]),
1018+
},
1019+
),
1020+
],
1021+
},
1022+
),
1023+
(
1024+
ModuleSpecifier::parse("file:///b.ts").unwrap(),
1025+
Document {
1026+
module_doc: Default::default(),
1027+
symbols: vec![Symbol::interface(
1028+
"baz".into(),
10071029
false,
10081030
Location::default(),
10091031
DeclarationKind::Export,
@@ -1018,28 +1040,8 @@ mod test {
10181040
index_signatures: vec![],
10191041
type_params: Box::new([]),
10201042
},
1021-
),
1022-
],
1023-
),
1024-
(
1025-
ModuleSpecifier::parse("file:///b.ts").unwrap(),
1026-
vec![Symbol::interface(
1027-
"baz".into(),
1028-
false,
1029-
Location::default(),
1030-
DeclarationKind::Export,
1031-
JsDoc::default(),
1032-
InterfaceDef {
1033-
def_name: None,
1034-
extends: vec![],
1035-
constructors: vec![],
1036-
methods: vec![],
1037-
properties: vec![],
1038-
call_signatures: vec![],
1039-
index_signatures: vec![],
1040-
type_params: Box::new([]),
1041-
},
1042-
)],
1043+
)],
1044+
},
10431045
),
10441046
]),
10451047
None,

0 commit comments

Comments
 (0)