Skip to content

Commit 70edbbc

Browse files
committed
Make Enter navigate and Tab insert in Cross-Entity Jump QuickPick
1 parent 7742929 commit 70edbbc

File tree

2 files changed

+66
-20
lines changed

2 files changed

+66
-20
lines changed

package.json

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -887,6 +887,12 @@
887887
"command": "vscode-objectscript.ccs.jumpToTagOffsetCrossEntity",
888888
"title": "Go to Name + Offset ^ Item"
889889
},
890+
{
891+
"category": "Consistem",
892+
"command": "vscode-objectscript.ccs.jumpToTagOffsetCrossEntity.insertSelection",
893+
"title": "Insert Selected Name (Consistem Quick Pick)",
894+
"enablement": "inQuickOpen && vscode-objectscript.ccs.jumpToTagQuickPickActive"
895+
},
890896
{
891897
"category": "ObjectScript",
892898
"command": "vscode-objectscript.export",
@@ -1300,6 +1306,11 @@
13001306
"mac": "Cmd+Q",
13011307
"when": "editorTextFocus && editorLangId =~ /^objectscript/"
13021308
},
1309+
{
1310+
"command": "vscode-objectscript.ccs.jumpToTagOffsetCrossEntity.insertSelection",
1311+
"key": "Tab",
1312+
"when": "inQuickOpen && vscode-objectscript.ccs.jumpToTagQuickPickActive"
1313+
},
13031314
{
13041315
"command": "vscode-objectscript.viewOthers",
13051316
"key": "Ctrl+Shift+V",

src/ccs/commands/jumpToTagOffsetCrossEntity.ts

Lines changed: 55 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,9 @@ const ROUTINE_NAME_PATTERN = new RegExp(`^${IDENTIFIER_START}${IDENTIFIER_BODY}*
2424
const CLASS_METHOD_NAME_PATTERN = new RegExp(`^${IDENTIFIER_START}${IDENTIFIER_BODY}*$`);
2525
const ROUTINE_LABEL_NAME_PATTERN = new RegExp(`^[A-Za-z0-9_%][A-Za-z0-9_%]*$`);
2626

27+
const JUMP_QP_CONTEXT_KEY = "vscode-objectscript.ccs.jumpToTagQuickPickActive";
28+
const INSERT_SELECTION_COMMAND_ID = "vscode-objectscript.ccs.jumpToTagOffsetCrossEntity.insertSelection";
29+
2730
type EntityKind = "class" | "routine" | "unknown";
2831

2932
interface LocalNameInfo {
@@ -98,13 +101,32 @@ async function promptWithQuickPick(
98101
docCtx: DocContext
99102
): Promise<ParseSuccess | undefined> {
100103
const qp = vscode.window.createQuickPick<vscode.QuickPickItem>();
101-
qp.title = "Consistem — Ir para Nome + Offset ^ Item";
104+
qp.title = "Consistem — Ir para Definição + Offset ^ Item";
102105
qp.placeholder = docCtx.placeholder;
103106
qp.ignoreFocusOut = true;
104107
qp.matchOnDescription = true;
105108
qp.matchOnDetail = true;
106109
qp.canSelectMany = false;
107110

111+
const disposables: vscode.Disposable[] = [];
112+
let cleanedUp = false;
113+
114+
const cleanup = () => {
115+
if (cleanedUp) return;
116+
cleanedUp = true;
117+
while (disposables.length) {
118+
const d = disposables.pop();
119+
try {
120+
d?.dispose();
121+
} catch {
122+
// Ignore dispose errors.
123+
}
124+
}
125+
void vscode.commands.executeCommand("setContext", JUMP_QP_CONTEXT_KEY, false);
126+
};
127+
128+
void vscode.commands.executeCommand("setContext", JUMP_QP_CONTEXT_KEY, true);
129+
108130
let lastParse: ParseSuccess | undefined;
109131
let lastValidatedValue: string | undefined;
110132
let currentValidationId = 0;
@@ -152,6 +174,34 @@ async function promptWithQuickPick(
152174
return p;
153175
}
154176

177+
const applySelectedItemToValue = ({ revalidate }: { revalidate?: boolean } = {}): boolean => {
178+
const picked = qp.selectedItems[0] ?? qp.activeItems[0];
179+
if (!picked) return false;
180+
181+
const trimmed = qp.value.trim();
182+
const normalized = replaceNameInExpression(trimmed, picked.label);
183+
if (normalized === qp.value) return false;
184+
185+
qp.value = normalized;
186+
187+
try {
188+
(qp as any).selectedItems = [];
189+
} catch {
190+
// Ignore errors from manipulating QuickPick internals.
191+
}
192+
193+
if (revalidate && qp.value.trim() !== "") {
194+
void runValidation(qp.value, localNames, docCtx, false);
195+
}
196+
197+
return true;
198+
};
199+
200+
const insertSelectionDisposable = vscode.commands.registerCommand(INSERT_SELECTION_COMMAND_ID, () => {
201+
applySelectedItemToValue({ revalidate: true });
202+
});
203+
disposables.push(insertSelectionDisposable);
204+
155205
qp.onDidChangeValue((value) => {
156206
if (value.trim() === "") {
157207
lastParse = undefined;
@@ -164,24 +214,9 @@ async function promptWithQuickPick(
164214

165215
const accepted = new Promise<ParseSuccess | undefined>((resolve) => {
166216
qp.onDidAccept(async () => {
167-
const trimmed = qp.value.trim();
217+
applySelectedItemToValue();
168218

169-
if (qp.selectedItems.length) {
170-
const picked = qp.selectedItems[0];
171-
const normalized = replaceNameInExpression(trimmed, picked.label);
172-
if (normalized !== trimmed) {
173-
qp.value = normalized;
174-
175-
try {
176-
(qp as any).selectedItems = [];
177-
} catch {
178-
// Ignore errors from manipulating QuickPick internals.
179-
}
180-
181-
if (qp.value.trim() !== "") void runValidation(qp.value, localNames, docCtx, false);
182-
return;
183-
}
184-
}
219+
const trimmed = qp.value.trim();
185220

186221
if (trimmed === "") {
187222
vscode.window.showErrorMessage(ERR_NAME_REQUIRED);
@@ -200,13 +235,13 @@ async function promptWithQuickPick(
200235
if (!lastParse) return;
201236

202237
resolve(lastParse);
203-
qp.hide();
238+
cleanup();
204239
qp.dispose();
205240
});
206241

207242
qp.onDidHide(() => {
208243
resolve(undefined);
209-
qp.dispose();
244+
cleanup();
210245
});
211246
});
212247

0 commit comments

Comments
 (0)