Skip to content

Commit 2c57754

Browse files
feat: intercept Kotlin go-to-definition for directories and open in Explorer
Prevents VSCode from showing "file is not displayed because it is a directory" errors when Kotlin LSP navigation points to package directories. Instead, automatically opens the Explorer view and highlights the target directory. - Override editor.action.revealDefinition for Kotlin files only - Check if definition targets are directories vs files - Open directories in Explorer, handle files normally - Maintain existing behavior for non-Kotlin files
1 parent b165cb0 commit 2c57754

File tree

2 files changed

+45
-1
lines changed

2 files changed

+45
-1
lines changed
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import * as vscode from 'vscode';
2+
import * as fs from 'fs';
3+
4+
export function registerDirectoryNavigator(context: vscode.ExtensionContext) {
5+
const disposable = vscode.commands.registerTextEditorCommand(
6+
'editor.action.revealDefinition',
7+
async (textEditor: vscode.TextEditor) => {
8+
if (textEditor.document.languageId !== 'kotlin') {
9+
return vscode.commands.executeCommand('vscode.executeDefinitionProvider',
10+
textEditor.document.uri, textEditor.selection.active);
11+
}
12+
13+
const definitions = await vscode.commands.executeCommand<vscode.Location[]>(
14+
'vscode.executeDefinitionProvider',
15+
textEditor.document.uri,
16+
textEditor.selection.active
17+
);
18+
19+
if (!definitions?.length) return;
20+
21+
for (const def of definitions) {
22+
try {
23+
const isDir = fs.statSync(def.uri.fsPath).isDirectory();
24+
if (isDir) {
25+
await vscode.commands.executeCommand('workbench.view.explorer');
26+
await vscode.commands.executeCommand('revealInExplorer', def.uri);
27+
return;
28+
}
29+
} catch {}
30+
}
31+
32+
for (const def of definitions) {
33+
const document = await vscode.workspace.openTextDocument(def.uri);
34+
await vscode.window.showTextDocument(document, {
35+
selection: def.range
36+
});
37+
}
38+
}
39+
);
40+
41+
context.subscriptions.push(disposable);
42+
}

kotlin-vscode/src/extension.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import {commands, type ExtensionContext, Uri, window, workspace} from "vscode"
33
import {registerDecompiler} from "./decompiler"
44
import { initLspClient, startLspClient } from './lspClient';
55
import { registerStatusBarItem } from './statusBar';
6+
import { registerDirectoryNavigator } from './directoryNavigator';
67

78

89
export const extensionId = 'kotlin'
@@ -35,7 +36,8 @@ export async function activate(context: ExtensionContext) {
3536
_context = context
3637
registerDecompiler(context)
3738
registerExportWorkspaceToJsonCommand(context)
39+
registerDirectoryNavigator(context)
3840
registerStatusBarItem()
3941
initLspClient()
4042
await startLspClient()
41-
}
43+
}

0 commit comments

Comments
 (0)