@@ -3,6 +3,7 @@ import { worker } from './fillers/monaco-editor-core';
33import { Suggestions , ParseError , EntityContext } from 'dt-sql-parser' ;
44import { Position } from './fillers/monaco-editor-core' ;
55import { SemanticContext } from 'dt-sql-parser/dist/parser/common/types' ;
6+ import type { SerializedTreeNode } from './languageService' ;
67
78export interface ICreateData {
89 languageId : string ;
@@ -24,14 +25,43 @@ export abstract class BaseSQLWorker {
2425 return Promise . resolve ( [ ] ) ;
2526 }
2627
27- async parserTreeToString ( code : string ) : Promise < string > {
28- if ( code ) {
29- const parser = this . parser . createParser ( code ) ;
30- const parseTree = parser . program ( ) ;
31- const result = parseTree . toStringTree ( parser ) ;
32- return Promise . resolve ( result ) ;
28+ async getSerializedParseTree ( code : string ) : Promise < SerializedTreeNode | null > {
29+ if ( ! code ) return Promise . resolve ( null ) ;
30+
31+ const parser = this . parser . createParser ( code ) ;
32+ const parseTree = parser . program ( ) ;
33+ const ruleNames = parser . ruleNames ;
34+ const tokenTypeMap = parser . getTokenTypeMap ( ) ;
35+ const tokenNameMap = new Map ( ) ;
36+
37+ for ( const [ name , tokenType ] of tokenTypeMap . entries ( ) ) {
38+ tokenNameMap . set ( tokenType , name ) ;
39+ }
40+
41+ function serializeNode ( node : any ) : SerializedTreeNode | null {
42+ if ( ! node ) return null ;
43+
44+ const isRuleNode = ! node . symbol ;
45+
46+ const serializedNode : SerializedTreeNode = {
47+ ruleName : isRuleNode ? ruleNames [ node . ruleIndex ] : node . constructor . name ,
48+ text : isRuleNode
49+ ? ''
50+ : tokenNameMap . get ( node . symbol . tokenSource ?. type ) + ': ' + node . symbol . text ,
51+ children : [ ]
52+ } ;
53+
54+ for ( let i = 0 ; i < node . getChildCount ( ) ; i ++ ) {
55+ const child = node . getChild ( i ) ;
56+ if ( child ) {
57+ serializedNode . children . push ( serializeNode ( child ) ! ) ;
58+ }
59+ }
60+
61+ return serializedNode ;
3362 }
34- return Promise . resolve ( '' ) ;
63+
64+ return Promise . resolve ( serializeNode ( parseTree ) ) ;
3565 }
3666
3767 async doCompletion ( code : string , position : Position ) : Promise < Suggestions | null > {
0 commit comments