11// @flow
22
3- import type { LanguageConfig , LanguageIntegration } from "./types/LanguageIntegration " ;
3+ import * as Indexer from "./indexer " ;
44import type { RootDoc , SourceFile } from "@webdoc/types" ;
55import { createPackageDoc , createRootDoc } from "@webdoc/model" ;
66import { langJS , langTS } from "./symbols-babel" ;
7+ import type { LanguageConfig } from "./types/LanguageIntegration" ;
78import type { Symbol } from "./types/Symbol" ;
89import assemble from "./assembler" ;
9- import fs from "fs" ;
1010import mod from "./transformer/document-tree-modifiers" ;
11- import { parserLogger } from "./Logger" ;
12- import path from "path" ;
1311import transform from "./transformer" ;
1412
1513declare var Webdoc: any ;
1614
17- // File-extension -> LanguageIntegration mapping
18- const languages : { [ id : string ] : LanguageIntegration } = { } ;
19-
20- // Register a language-integration that will be used to generate a symbol-tree for files with its
21- // file-extensions.
22- export function registerLanguage ( lang : LanguageIntegration ) : void {
23- for ( const ext of lang . extensions ) {
24- if ( languages [ ext ] ) {
25- parserLogger . warn ( "LanguageIntegration" ,
26- `.${ ext } file extension has already been registered` ) ;
27- }
28-
29- languages [ ext ] = lang ;
30- }
31- }
32-
3315// Register built-in languages
34- registerLanguage ( langJS ) ;
35- registerLanguage ( langTS ) ;
16+ Indexer . register ( langJS ) ;
17+ Indexer . register ( langTS ) ;
3618
3719// Default language-config for parsing documentation
3820const DEFAULT_LANG_CONFIG : LanguageConfig = {
@@ -79,14 +61,7 @@ export function buildSymbolTree(
7961 } ;
8062 }
8163
82- const fileName = source . path ;
83- const lang = languages [ fileName . substring ( fileName . lastIndexOf ( "." ) + 1 , fileName . length ) ] ;
84-
85- if ( ! lang ) {
86- throw new Error ( `.${ lang } file language is not registered` ) ;
87- }
88-
89- return lang . parse ( file , source , config ) ;
64+ return Indexer . process ( file , source , config ) ;
9065}
9166
9267// TODO: Asynchronous API for parsing
@@ -107,7 +82,10 @@ export function buildSymbolTree(
10782 * @param {RootDoc } root
10883 * @return {RootDoc }
10984 */
110- export function parse ( target : string | SourceFile [ ] , root ?: RootDoc = createRootDoc ( ) ) : RootDoc {
85+ export async function parse (
86+ target : string | SourceFile [ ] ,
87+ root ? : RootDoc = createRootDoc ( ) ,
88+ ) : Promise < RootDoc > {
11189 if ( typeof target === "string" ) {
11290 target = [ {
11391 content : target ,
@@ -116,23 +94,12 @@ export function parse(target: string | SourceFile[], root?: RootDoc = createRoot
11694 } ] ;
11795 }
11896
119- const partialDoctrees = new Array ( Array . isArray ( target ) ? target . length : target . size ) ;
120-
121- // Build a symbol-tree for all the files
122- for ( let i = 0 ; i < target . length ; i ++ ) {
123- const { content , path : source } = target [ i ] ;
124-
125- partialDoctrees [ i ] = buildSymbolTree (
126- content || fs . readFileSync ( path . join ( process . cwd ( ) , source ) , "utf8" ) ,
127- target [ i ] ,
128- ) ;
129- }
130-
131- const rsym = assemble ( partialDoctrees ) ;
97+ const perFileSymbolTrees = await Indexer . run ( target , Webdoc . DEFAULT_LANG_CONFIG ) ;
98+ const fullSymbolTree = assemble ( perFileSymbolTrees ) ;
13299
133100 root . children = root . members ;
134101
135- transform ( rsym , root ) ;
102+ transform ( fullSymbolTree , root ) ;
136103 mod ( root ) ;
137104
138105 return root ;
0 commit comments