diff options
Diffstat (limited to 'editors/code/src')
-rw-r--r-- | editors/code/src/commands/syntax_tree.ts | 18 |
1 files changed, 6 insertions, 12 deletions
diff --git a/editors/code/src/commands/syntax_tree.ts b/editors/code/src/commands/syntax_tree.ts index 7b58cf788..b7a397414 100644 --- a/editors/code/src/commands/syntax_tree.ts +++ b/editors/code/src/commands/syntax_tree.ts | |||
@@ -82,7 +82,7 @@ class TextDocumentContentProvider implements vscode.TextDocumentContentProvider | |||
82 | 82 | ||
83 | // FIXME: consider implementing this via the Tree View API? | 83 | // FIXME: consider implementing this via the Tree View API? |
84 | // https://code.visualstudio.com/api/extension-guides/tree-view | 84 | // https://code.visualstudio.com/api/extension-guides/tree-view |
85 | class AstInspector implements vscode.HoverProvider, Disposable { | 85 | class AstInspector implements vscode.HoverProvider, vscode.DefinitionProvider, Disposable { |
86 | private readonly astDecorationType = vscode.window.createTextEditorDecorationType({ | 86 | private readonly astDecorationType = vscode.window.createTextEditorDecorationType({ |
87 | borderColor: new vscode.ThemeColor('rust_analyzer.syntaxTreeBorder'), | 87 | borderColor: new vscode.ThemeColor('rust_analyzer.syntaxTreeBorder'), |
88 | borderStyle: "solid", | 88 | borderStyle: "solid", |
@@ -96,8 +96,7 @@ class AstInspector implements vscode.HoverProvider, Disposable { | |||
96 | const astEditor = this.findAstTextEditor(); | 96 | const astEditor = this.findAstTextEditor(); |
97 | if (!this.rustEditor || !astEditor) return undefined; | 97 | if (!this.rustEditor || !astEditor) return undefined; |
98 | 98 | ||
99 | console.time("Build goto def index"); | 99 | const buf: [vscode.Range, vscode.Range][] = []; |
100 | let buf: [vscode.Range, vscode.Range][] = []; | ||
101 | for (let i = 0; i < astEditor.document.lineCount; ++i) { | 100 | for (let i = 0; i < astEditor.document.lineCount; ++i) { |
102 | const astLine = astEditor.document.lineAt(i); | 101 | const astLine = astEditor.document.lineAt(i); |
103 | 102 | ||
@@ -108,10 +107,8 @@ class AstInspector implements vscode.HoverProvider, Disposable { | |||
108 | const rustRange = this.parseRustTextRange(this.rustEditor.document, astLine.text); | 107 | const rustRange = this.parseRustTextRange(this.rustEditor.document, astLine.text); |
109 | if (!rustRange) continue; | 108 | if (!rustRange) continue; |
110 | 109 | ||
111 | buf.push([rustRange, this.findAstRange(astLine)]); | 110 | buf.push([rustRange, this.findAstNodeRange(astLine)]); |
112 | } | 111 | } |
113 | |||
114 | console.timeEnd("Build goto def index"); | ||
115 | return buf; | 112 | return buf; |
116 | }); | 113 | }); |
117 | 114 | ||
@@ -167,9 +164,7 @@ class AstInspector implements vscode.HoverProvider, Disposable { | |||
167 | const astEditor = this.findAstTextEditor(); | 164 | const astEditor = this.findAstTextEditor(); |
168 | if (!astEditor) return; | 165 | if (!astEditor) return; |
169 | 166 | ||
170 | console.time("Goto def"); | ||
171 | const rust2AstRanges = this.rust2Ast.get()?.find(([rustRange, _]) => rustRange.contains(pos)); | 167 | const rust2AstRanges = this.rust2Ast.get()?.find(([rustRange, _]) => rustRange.contains(pos)); |
172 | console.timeEnd("Goto def"); | ||
173 | if (!rust2AstRanges) return; | 168 | if (!rust2AstRanges) return; |
174 | 169 | ||
175 | const [rustFileRange, astFileRange] = rust2AstRanges; | 170 | const [rustFileRange, astFileRange] = rust2AstRanges; |
@@ -198,12 +193,12 @@ class AstInspector implements vscode.HoverProvider, Disposable { | |||
198 | this.rustEditor.revealRange(rustFileRange); | 193 | this.rustEditor.revealRange(rustFileRange); |
199 | 194 | ||
200 | const rustSourceCode = this.rustEditor.document.getText(rustFileRange); | 195 | const rustSourceCode = this.rustEditor.document.getText(rustFileRange); |
201 | const astFileRange = this.findAstRange(astFileLine); | 196 | const astFileRange = this.findAstNodeRange(astFileLine); |
202 | 197 | ||
203 | return new vscode.Hover(["```rust\n" + rustSourceCode + "\n```"], astFileRange); | 198 | return new vscode.Hover(["```rust\n" + rustSourceCode + "\n```"], astFileRange); |
204 | } | 199 | } |
205 | 200 | ||
206 | private findAstRange(astLine: vscode.TextLine) { | 201 | private findAstNodeRange(astLine: vscode.TextLine) { |
207 | const lineOffset = astLine.range.start; | 202 | const lineOffset = astLine.range.start; |
208 | const begin = lineOffset.translate(undefined, astLine.firstNonWhitespaceCharacterIndex); | 203 | const begin = lineOffset.translate(undefined, astLine.firstNonWhitespaceCharacterIndex); |
209 | const end = lineOffset.translate(undefined, astLine.text.trimEnd().length); | 204 | const end = lineOffset.translate(undefined, astLine.text.trimEnd().length); |
@@ -223,7 +218,7 @@ class AstInspector implements vscode.HoverProvider, Disposable { | |||
223 | class Lazy<T> { | 218 | class Lazy<T> { |
224 | val: undefined | T; | 219 | val: undefined | T; |
225 | 220 | ||
226 | constructor(private readonly compute: () => undefined | T) {} | 221 | constructor(private readonly compute: () => undefined | T) { } |
227 | 222 | ||
228 | get() { | 223 | get() { |
229 | return this.val ?? (this.val = this.compute()); | 224 | return this.val ?? (this.val = this.compute()); |
@@ -232,5 +227,4 @@ class Lazy<T> { | |||
232 | reset() { | 227 | reset() { |
233 | this.val = undefined; | 228 | this.val = undefined; |
234 | } | 229 | } |
235 | |||
236 | } | 230 | } |