11import { parse } from "@typescript-eslint/typescript-estree"
22import { namedTypes } from "ast-types"
3+ import path from "path"
34
45import { DBNode } from "../../../core/dbNode"
56import { ISourceFile } from "../sourceFile.types"
@@ -19,34 +20,68 @@ export class FileProcessor implements IFileProcessor {
1920 const fileContent = sourceFile . read ( )
2021 const ast = parse ( fileContent )
2122
22- const imports = ast . body . filter ( ( node ) =>
23- namedTypes . ImportDeclaration . check ( node )
24- )
25-
2623 let treeNodes : TreeNode [ ] = [ ]
2724 for ( let node of ast . body ) {
28- if ( namedTypes . ExportNamedDeclaration . check ( node ) ) {
25+ if ( namedTypes . ExportNamedDeclaration . check ( node ) )
2926 node = ( node as any ) . declaration
30- }
3127
32- if ( namedTypes . FunctionDeclaration . check ( node ) ) {
28+ if ( namedTypes . FunctionDeclaration . check ( node ) )
29+ /* Functions */
3330 treeNodes . push ( Functions . Handle ( node ) )
34- } else if ( namedTypes . TSInterfaceDeclaration . check ( node ) ) {
31+ else if ( namedTypes . TSInterfaceDeclaration . check ( node ) )
32+ /* Interfaces */
3533 treeNodes . push ( Interface . Handle ( node ) )
36- } else if ( namedTypes . TSTypeAliasDeclaration . check ( node ) ) {
34+ else if ( namedTypes . TSTypeAliasDeclaration . check ( node ) )
35+ /* Type Aliases */
3736 treeNodes . push ( TypeAlias . Handle ( node ) )
38- } else if ( namedTypes . TSEnumDeclaration . check ( node ) ) {
37+ else if ( namedTypes . TSEnumDeclaration . check ( node ) )
38+ /* Enums */
3939 treeNodes . push ( Enums . Handle ( node ) )
40- } else if ( namedTypes . ClassDeclaration . check ( node ) ) {
40+ else if ( namedTypes . ClassDeclaration . check ( node ) )
41+ /* Classes */
4142 treeNodes . push ( Classes . Handle ( node ) )
42- } else if ( namedTypes . TSModuleDeclaration . check ( node ) ) {
43+ else if ( namedTypes . TSModuleDeclaration . check ( node ) )
44+ /* Namespaces */
4345 treeNodes . push ( Namespaces . Handle ( node ) )
44- } else if ( namedTypes . VariableDeclaration . check ( node ) ) {
46+ else if ( namedTypes . VariableDeclaration . check ( node ) )
47+ /* Variables */
4548 treeNodes . push ( ...VariableDeclarations . Handle ( node ) )
49+ }
50+
51+ // Resolve imports
52+ const parsedImports = new Map < string , string > ( ) // { importName: absolutePath }
53+ {
54+ const imports = ast . body
55+ . filter ( ( node ) => namedTypes . ImportDeclaration . check ( node ) ) // Filter out all non-import nodes
56+ . filter ( ( node ) => ( node as any ) . source . value . startsWith ( "." ) ) // Filter out all library/non-relative imports
57+ for ( const i of imports ) {
58+ const absolutePath = path . resolve (
59+ path . dirname ( sourceFile . getFullPath ( ) ) ,
60+ ( i as any ) . source . value + ".ts"
61+ )
62+ const importName = ( i as any ) . specifiers [ 0 ] . local . name
63+
64+ parsedImports . set ( importName , absolutePath )
4665 }
4766 }
67+
68+ // Replace import names with absolute paths
69+ for ( const treeNode of treeNodes ) {
70+ treeNode . sourceFilePath = sourceFile . getFullPath ( )
71+ treeNode . uses = treeNode . uses
72+ . filter ( ( x ) => x . name )
73+ . map ( ( x ) => {
74+ if ( parsedImports . has ( x . name ) ) {
75+ x . name = parsedImports . get ( x . name ) !
76+ }
77+ return x
78+ } )
79+ }
80+
81+ // Add the nodes to the global reference
4882 for ( const treeNode of treeNodes ) {
49- sourceFile . registerSyntax ( treeNode )
83+ const dbNode = DBNode . fromTreeNode ( treeNode )
84+ nodesRef [ dbNode . id ] = dbNode
5085 }
5186 }
5287}
0 commit comments