@@ -24,6 +24,9 @@ const ROUTINE_NAME_PATTERN = new RegExp(`^${IDENTIFIER_START}${IDENTIFIER_BODY}*
2424const CLASS_METHOD_NAME_PATTERN = new RegExp ( `^${ IDENTIFIER_START } ${ IDENTIFIER_BODY } *$` ) ;
2525const 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+
2730type EntityKind = "class" | "routine" | "unknown" ;
2831
2932interface 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