11import * as vscode from 'vscode' ;
22import * as path from 'path' ;
3- import { DocumentSymbol , SymbolKind } from " vscode-languageclient" ;
4- import { IMethodExtractor , SymbolInfo } from " ../extractors" ;
3+ import { DocumentSymbol } from ' vscode-languageclient' ;
4+ import { IMethodExtractor , SymbolInfo } from ' ../extractors' ;
55import { Logger } from '../../logger' ;
66import { Token , TokenType } from '../tokens' ;
7+ import {
8+ MethodSymbolInfoExtractor ,
9+ SymbolInfoExtractor ,
10+ NamedFunctionDeclarationSymbolInfoExtractor ,
11+ AnonymousExpressRequestHandlerSymbolInfoExtractor ,
12+ VariableFunctionSymbolInfoExtractor ,
13+ } from './symbolInfoExtractors' ;
714
815export class JSMethodExtractor implements IMethodExtractor {
916
@@ -45,8 +52,8 @@ export class JSMethodExtractor implements IMethodExtractor {
4552 return pkgjson . name ;
4653 }
4754
48- private extractFunctions ( document : vscode . TextDocument , codeObjectPath : string , parentSymPath : string , symbols : DocumentSymbol [ ] , tokens : Token [ ] ) : SymbolInfo [ ] {
49- let symbolInfos : SymbolInfo [ ] = [ ] ;
55+ private extractFunctions ( document : vscode . TextDocument , codeObjectPath : string , parentSymbolPath : string , symbols : DocumentSymbol [ ] , tokens : Token [ ] ) : SymbolInfo [ ] {
56+ const symbolInfos : SymbolInfo [ ] = [ ] ;
5057
5158 /*
5259 declation example:
@@ -76,49 +83,31 @@ export class JSMethodExtractor implements IMethodExtractor {
7683 functionMap [ key ] = token ;
7784 } ) ;
7885
86+ const symbolInfoExtractors : SymbolInfoExtractor [ ] = [
87+ new MethodSymbolInfoExtractor ( ) ,
88+ new NamedFunctionDeclarationSymbolInfoExtractor ( ) ,
89+ new AnonymousExpressRequestHandlerSymbolInfoExtractor ( ) ,
90+ new VariableFunctionSymbolInfoExtractor ( functionMap , getKey ) ,
91+ ] ;
92+
7993 for ( const symbol of symbols ) {
80- let symPath = ( parentSymPath ? parentSymPath + '.' : '' ) + symbol . name ;
81- const hasChildren = symbol . children && symbol . children . length > 0 ;
82- let range = new vscode . Range (
83- new vscode . Position ( symbol . range . start . line , symbol . range . start . character ) ,
84- new vscode . Position ( symbol . range . end . line , symbol . range . end . character ) ) ;
85-
86- const id = `${ codeObjectPath } $_$${ symbol . name } ` ;
87- let isMethodCodeObjectRelated = this . isOfKind ( symbol , SymbolKind . Method ) ;
88-
89- if ( ! isMethodCodeObjectRelated && this . isOfKind ( symbol , SymbolKind . Function ) ) {
90- const textLine = document . lineAt ( symbol . range . start . line ) ;
91- const functionMatch = `\\s*function\\s*${ symbol . name } ` ; //should handle only function declaration, and filter out function call like db.getAll()
92- const match = textLine . text . match ( functionMatch ) ;
93- isMethodCodeObjectRelated = match !== undefined && match !== null ;
94- }
95- if ( ! isMethodCodeObjectRelated && this . isOfKind ( symbol , SymbolKind . Variable ) ) {
96- const functionToken = functionMap [ getKey ( symbol . range . start . line , symbol . range . start . character ) ] ;
97- isMethodCodeObjectRelated = functionToken !== undefined ;
94+ const symbolPath = ( parentSymbolPath ? parentSymbolPath + '.' : '' ) + symbol . name ;
95+
96+ const symbolInfo : SymbolInfo | undefined = symbolInfoExtractors . reduce (
97+ ( info : SymbolInfo | undefined , extractor ) => info || extractor . extract ( symbol , codeObjectPath , symbol . name , document , symbolPath ) ,
98+ undefined ,
99+ ) ;
100+ if ( symbolInfo ) {
101+ symbolInfos . push ( symbolInfo ) ;
98102 }
99103
100- if ( isMethodCodeObjectRelated ) {
101- symbolInfos . push ( {
102- id,
103- name : symbol . name ,
104- codeLocation : codeObjectPath ,
105- displayName : symPath ,
106- range,
107- documentUri : document . uri
108- } ) ;
109- }
104+ const hasChildren = symbol . children && symbol . children . length > 0 ;
110105 if ( hasChildren ) {
111- const childFunctions = this . extractFunctions ( document , codeObjectPath , symPath , symbol . children ! , tokens ) ;
112- symbolInfos = symbolInfos . concat ( childFunctions ) ;
106+ const childFunctions = this . extractFunctions ( document , codeObjectPath , symbolPath , symbol . children ! , tokens ) ;
107+ symbolInfos . push ( ... childFunctions ) ;
113108 }
114109 }
115110
116111 return symbolInfos ;
117-
118- }
119-
120- private isOfKind ( symbol : DocumentSymbol , kind : number ) : boolean {
121- return symbol . kind + 1 === kind ;
122112 }
123-
124- }
113+ }
0 commit comments