Skip to content

Commit 040022f

Browse files
committed
add view syntax tree
1 parent 029199c commit 040022f

File tree

5 files changed

+349
-0
lines changed

5 files changed

+349
-0
lines changed

package.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,11 @@
4242
"command": "emmy.stopServer",
4343
"title": "EmmyLua: Stop EmmyLua Language Server"
4444
},
45+
{
46+
"command": "emmy.showSyntaxTree",
47+
"title": "EmmyLua: Show Syntax Tree",
48+
"icon": "$(symbol-structure)"
49+
},
4550
{
4651
"command": "emmylua.luarocks.searchPackages",
4752
"title": "Search Packages",

src/emmyContext.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,11 @@ export class EmmyContext implements vscode.Disposable {
243243
label: '$(output) Show Output',
244244
description: 'Open output channel',
245245
detail: 'View server logs and output',
246+
},
247+
{
248+
label: '$(symbol-structure) Show Syntax Tree',
249+
description: 'View syntax tree for current file',
250+
detail: 'Display the syntax tree of the active Lua file',
246251
}
247252
);
248253

@@ -266,6 +271,8 @@ export class EmmyContext implements vscode.Disposable {
266271
this.showServerInfo();
267272
} else if (selected.label.includes('Output')) {
268273
this._client?.outputChannel?.show();
274+
} else if (selected.label.includes('Syntax Tree')) {
275+
await vscode.commands.executeCommand('emmy.showSyntaxTree');
269276
}
270277
}
271278

src/extension.ts

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import * as Annotator from './annotator';
1919
import { LuaRocksManager } from './luarocks/LuaRocksManager';
2020
import { LuaRocksTreeProvider, PackageTreeItem } from './luarocks/LuaRocksTreeProvider';
2121
import { EmmyrcSchemaContentProvider } from './emmyrcSchemaContentProvider';
22+
import { SyntaxTreeManager, setClientGetter } from './syntaxTreeProvider';
2223

2324
/**
2425
* Debugger configuration interface
@@ -41,6 +42,7 @@ export let extensionContext: EmmyContext;
4142
let activeEditor: vscode.TextEditor | undefined;
4243
let luaRocksManager: LuaRocksManager | undefined;
4344
let luaRocksTreeProvider: LuaRocksTreeProvider | undefined;
45+
let syntaxTreeManager: SyntaxTreeManager | undefined;
4446

4547
/**
4648
* Extension activation entry point
@@ -90,6 +92,7 @@ function registerCommands(context: vscode.ExtensionContext): void {
9092
{ id: 'emmy.showServerMenu', handler: showServerMenu },
9193
{ id: 'emmy.showReferences', handler: showReferences },
9294
{ id: 'emmy.insertEmmyDebugCode', handler: insertEmmyDebugCode },
95+
{ id: 'emmy.showSyntaxTree', handler: showSyntaxTree },
9396
// LuaRocks commands
9497
{ id: 'emmylua.luarocks.searchPackages', handler: searchPackages },
9598
{ id: 'emmylua.luarocks.installPackage', handler: installPackage },
@@ -138,6 +141,13 @@ function registerLanguageConfiguration(context: vscode.ExtensionContext): void {
138141
* Initialize all extension features
139142
*/
140143
async function initializeExtension(): Promise<void> {
144+
// Initialize syntax tree manager
145+
syntaxTreeManager = new SyntaxTreeManager();
146+
extensionContext.vscodeContext.subscriptions.push(syntaxTreeManager);
147+
148+
// Set up client getter for syntax tree provider
149+
setClientGetter(() => extensionContext.client);
150+
141151
await startServer();
142152
registerDebuggers();
143153
await initializeLuaRocks();
@@ -425,6 +435,39 @@ async function insertEmmyDebugCode() {
425435
activeEditor.insertSnippet(ins);
426436
}
427437

438+
/**
439+
* Show syntax tree for current document
440+
* Similar to rust-analyzer's "View Syntax Tree" feature
441+
*/
442+
async function showSyntaxTree(): Promise<void> {
443+
const editor = vscode.window.activeTextEditor;
444+
445+
if (!editor) {
446+
vscode.window.showWarningMessage('No active editor');
447+
return;
448+
}
449+
450+
const document = editor.document;
451+
452+
if (document.languageId !== extensionContext.LANGUAGE_ID) {
453+
vscode.window.showWarningMessage('Current file is not a Lua file');
454+
return;
455+
}
456+
457+
if (!extensionContext.client) {
458+
vscode.window.showWarningMessage('Language server is not running');
459+
return;
460+
}
461+
462+
if (!syntaxTreeManager) {
463+
vscode.window.showErrorMessage('Syntax tree manager is not initialized');
464+
return;
465+
}
466+
467+
// Show syntax tree using the manager
468+
await syntaxTreeManager.show(document.uri, editor.selection);
469+
}
470+
428471
// LuaRocks Integration Functions
429472

430473
async function initializeLuaRocks(): Promise<void> {

src/lspExtension.ts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,3 +45,21 @@ export interface IServerLocation {
4545
uri: string;
4646
range: IServerRange;
4747
}
48+
49+
/**
50+
* Syntax tree request parameters
51+
*/
52+
export interface SyntaxTreeParams {
53+
/** Document URI to get syntax tree for */
54+
uri: string;
55+
/** Optional range to get syntax tree for (if not specified, entire document) */
56+
range?: IServerRange;
57+
}
58+
59+
/**
60+
* Syntax tree response
61+
*/
62+
export interface SyntaxTreeResponse {
63+
/** The syntax tree as text */
64+
content: string;
65+
}

0 commit comments

Comments
 (0)