Skip to content

Commit d313d02

Browse files
feat: support search from extension input
1 parent c607b14 commit d313d02

File tree

2 files changed

+67
-47
lines changed

2 files changed

+67
-47
lines changed

src/extension.ts

Lines changed: 56 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@ import {
1010
TextDocumentShowOptions,
1111
Uri,
1212
ThemeIcon,
13-
EventEmitter
13+
EventEmitter,
14+
Position
1415
} from 'vscode'
1516

1617
import {
@@ -21,6 +22,7 @@ import {
2122
} from 'vscode-languageclient/node'
2223

2324
import { activate as activateWebview } from './view'
25+
import { SgSearch } from './types'
2426

2527
let client: LanguageClient
2628
const diagnosticCollectionName = 'ast-grep-diagnostics'
@@ -45,11 +47,11 @@ function getExecutable(isDebug: boolean): Executable {
4547
}
4648

4749
interface FileItem {
48-
uri: string
50+
file: string
4951
}
5052

5153
interface 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

8696
type 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-
140147
function 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

211222
export 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

216228
async function restart(): Promise<void> {

src/view.ts

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,13 @@ import { execa } from 'execa'
33
import { Unport, ChannelMessage } from 'unport'
44
import * as vscode from 'vscode'
55
import { workspace } from 'vscode'
6+
import { AstGrepSearchResultProvider } from './extension'
67

7-
export function activate(context: vscode.ExtensionContext) {
8-
const provider = new SearchSidebarProvider(context.extensionUri)
8+
export function activate(
9+
context: vscode.ExtensionContext,
10+
search: AstGrepSearchResultProvider
11+
) {
12+
const provider = new SearchSidebarProvider(context.extensionUri, search)
913

1014
context.subscriptions.push(
1115
vscode.window.registerWebviewViewProvider(
@@ -46,7 +50,10 @@ class SearchSidebarProvider implements vscode.WebviewViewProvider {
4650
// @ts-expect-error
4751
private _view?: vscode.WebviewView
4852

49-
constructor(private readonly _extensionUri: vscode.Uri) {}
53+
constructor(
54+
private readonly _extensionUri: vscode.Uri,
55+
private search: AstGrepSearchResultProvider
56+
) {}
5057

5158
public resolveWebviewView(
5259
webviewView: vscode.WebviewView,
@@ -85,6 +92,7 @@ class SearchSidebarProvider implements vscode.WebviewViewProvider {
8592

8693
parentPort.onMessage('search', async payload => {
8794
const res = (await getPatternRes(payload.inputValue)) ?? []
95+
this.search.updateResult(res)
8896
parentPort.postMessage('search', { ...payload, searchResult: res })
8997
})
9098
}

0 commit comments

Comments
 (0)