@@ -10,7 +10,8 @@ import {
1010 TextDocumentShowOptions ,
1111 Uri ,
1212 ThemeIcon ,
13- EventEmitter
13+ EventEmitter ,
14+ Position
1415} from 'vscode'
1516
1617import {
@@ -21,6 +22,7 @@ import {
2122} from 'vscode-languageclient/node'
2223
2324import { activate as activateWebview } from './view'
25+ import { SgSearch } from './types'
2426
2527let client : LanguageClient
2628const diagnosticCollectionName = 'ast-grep-diagnostics'
@@ -45,11 +47,11 @@ function getExecutable(isDebug: boolean): Executable {
4547}
4648
4749interface FileItem {
48- uri : string
50+ file : string
4951}
5052
5153interface SearchItem {
52- uri : string
54+ file : string
5355 source : string
5456 range : Range
5557}
@@ -60,7 +62,7 @@ class AstGrepScanTreeItem extends TreeItem {
6062 if ( 'source' in item ) {
6163 label = item . source
6264 } else {
63- label = workspace . asRelativePath ( Uri . parse ( item . uri ) )
65+ label = item . file
6466 collapsibleState = TreeItemCollapsibleState . Expanded
6567 }
6668 super ( label , collapsibleState )
@@ -69,7 +71,7 @@ class AstGrepScanTreeItem extends TreeItem {
6971 title : 'ast-grep' ,
7072 command : 'vscode.open' ,
7173 arguments : [
72- item . uri ,
74+ this . uri ,
7375 < TextDocumentShowOptions > {
7476 selection : item . range
7577 }
@@ -78,16 +80,24 @@ class AstGrepScanTreeItem extends TreeItem {
7880 }
7981 }
8082
83+ get uri ( ) {
84+ // Get the current workspace folder
85+ const workspaceFolder = workspace . workspaceFolders ! [ 0 ]
86+ // Join the workspace folder path with the relative path
87+ const filePath = Uri . joinPath ( workspaceFolder . uri , this . item . file )
88+ return filePath
89+ }
90+
8191 static isSearchItem ( item : FileItem | SearchItem ) : item is SearchItem {
8292 return 'source' in item
8393 }
8494}
8595
8696type Dictionary < T > = { [ key : string ] : T }
87- class NodeDependenciesProvider
97+ export class AstGrepSearchResultProvider
8898 implements TreeDataProvider < AstGrepScanTreeItem >
8999{
90- private scanResultDict : Dictionary < ScanResult [ ] > = { }
100+ private scanResultDict : Dictionary < SgSearch [ ] > = { }
91101 private emitter = new EventEmitter < undefined > ( )
92102 onDidChangeTreeData = this . emitter . event
93103
@@ -97,72 +107,70 @@ class NodeDependenciesProvider
97107 element . contextValue = 'file-item'
98108 element . description = true
99109 element . iconPath = ThemeIcon . File
100- element . resourceUri = Uri . parse ( element . item . uri )
110+ element . resourceUri = element . uri
101111 }
102112 return element
103113 }
104114
105115 getChildren ( element ?: AstGrepScanTreeItem ) : Thenable < AstGrepScanTreeItem [ ] > {
106116 if ( ! element ) {
107- let list = Object . keys ( this . scanResultDict ) . map ( uri => {
108- return new AstGrepScanTreeItem ( { uri } )
117+ let list = Object . keys ( this . scanResultDict ) . map ( file => {
118+ return new AstGrepScanTreeItem ( { file } )
109119 } )
110120 return Promise . resolve ( list )
111121 }
112122 if ( AstGrepScanTreeItem . isSearchItem ( element . item ) ) {
113123 return Promise . resolve ( [ ] )
114124 }
115- let uri = element . item . uri
116- let list = this . scanResultDict [ uri ] . map ( item => {
125+ let file = element . item . file
126+ let list = this . scanResultDict [ file ] . map ( item => {
127+ const { start, end } = item . range
117128 return new AstGrepScanTreeItem ( {
118- uri : item . uri ,
119- source : item . content ,
120- range : item . position
129+ file : item . file ,
130+ source : item . text ,
131+ range : new Range (
132+ new Position ( start . line , start . column ) ,
133+ new Position ( end . line , end . column )
134+ )
121135 } )
122136 } )
123137 return Promise . resolve ( list )
124138 }
125139
126- updateResult ( res : ScanResult [ ] ) {
127- let grouped = groupBy ( res , 'uri ' )
140+ updateResult ( res : SgSearch [ ] ) {
141+ let grouped = groupBy ( res , 'file ' )
128142 this . scanResultDict = grouped
129143 this . emitter . fire ( undefined )
130144 }
131145}
132146
133- interface ScanResult {
134- uri : string
135- // Same as vscode.Range but all zero-based
136- position : Range
137- content : string
138- }
139-
140147function activateLsp ( context : ExtensionContext ) {
141- let provider = new NodeDependenciesProvider ( )
148+ let provider = new AstGrepSearchResultProvider ( )
142149
143150 window . createTreeView ( 'ast-grep.search.result' , {
144151 treeDataProvider : provider ,
145152 showCollapseAll : false
146153 } )
147154 context . subscriptions . push (
148155 commands . registerCommand ( 'ast-grep.search' , async _uri => {
149- let curWorkspace = workspace . workspaceFolders ?. [ 0 ]
150- if ( ! curWorkspace ) {
151- return
152- }
153- let pattern
154- try {
155- pattern = await window . showInputBox ( { } )
156- } catch {
157- return
158- }
159- if ( ! pattern ) {
160- return
161- }
162- let res = await client . sendRequest < ScanResult [ ] > ( 'ast-grep/search' , {
163- pattern : pattern
164- } )
165- provider . updateResult ( res )
156+ // TODO: change impl
157+ // let curWorkspace = workspace.workspaceFolders?.[0]
158+ // if (!curWorkspace) {
159+ // return
160+ // }
161+ // let pattern
162+ // try {
163+ // pattern = await window.showInputBox({})
164+ // } catch {
165+ // return
166+ // }
167+ // if (!pattern) {
168+ // return
169+ // }
170+ // let res = await client.sendRequest<ScanResult[]>('ast-grep/search', {
171+ // pattern: pattern
172+ // })
173+ // provider.updateResult(res)
166174 } ) ,
167175 commands . registerCommand ( 'ast-grep.restartLanguageServer' , async ( ) => {
168176 console . log (
@@ -206,11 +214,15 @@ function activateLsp(context: ExtensionContext) {
206214
207215 // Start the client. This will also launch the server
208216 client . start ( )
217+
218+ // TODO: fix shit code
219+ return provider
209220}
210221
211222export function activate ( context : ExtensionContext ) {
212- activateLsp ( context )
213- activateWebview ( context )
223+ const provider = activateLsp ( context )
224+ // TODO: fix shit code
225+ activateWebview ( context , provider )
214226}
215227
216228async function restart ( ) : Promise < void > {
0 commit comments