Skip to content

Commit 2f89559

Browse files
committed
fix(scriptCompletion): enhance attribute value checks for completion
Class ScriptCompletion: ~improve attribute value validation (prevent unwanted completions) fix(extension): refine attribute retrieval logic src/extension.ts: ~update attribute handling (ensure correct attribute context)
1 parent f75ad0c commit 2f89559

2 files changed

Lines changed: 46 additions & 34 deletions

File tree

extensions/scripts/src/extension.ts

Lines changed: 39 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -376,13 +376,13 @@ export function activate(context: vscode.ExtensionContext) {
376376
}
377377
}
378378
} else {
379-
const attribute = xmlTracker.attributeWithPosInName(document, position, element);
380-
if (attribute) {
379+
const attributeWithPosInName = xmlTracker.attributeWithPosInName(document, position, element);
380+
if (attributeWithPosInName) {
381381
const elementAttributes: EnhancedAttributeInfo[] = xsdReference.getElementAttributesWithTypes(schema, element.name, element.hierarchy);
382-
const attributeDefinition = elementAttributes.find((attr) => attr.name === attribute.name);
382+
const attributeDefinition = elementAttributes.find((attr) => attr.name === attributeWithPosInName.name);
383383
if (attributeDefinition && attributeDefinition.location) {
384384
logger.debug(
385-
`Definition found for attribute: ${attribute.name} at ${attributeDefinition.location.uri.toString()}:${attributeDefinition.location.line}:${attributeDefinition.location.column}}`
385+
`Definition found for attribute: ${attributeWithPosInName.name} at ${attributeDefinition.location.uri.toString()}:${attributeDefinition.location.line}:${attributeDefinition.location.column}}`
386386
);
387387
return new vscode.Location(
388388
vscode.Uri.parse(attributeDefinition.location.uri),
@@ -396,29 +396,34 @@ export function activate(context: vscode.ExtensionContext) {
396396
);
397397
}
398398
}
399-
}
400-
}
401-
402-
// Check if cursor is on a variable
403-
const variableDefinition = variableTracker.getVariableDefinition(document, position);
404-
if (variableDefinition) {
405-
logger.debug(`Variable definition found at position: ${position.line + 1}:${position.character} for variable: ${variableDefinition.name}`);
406-
return variableDefinition.definition;
407-
}
399+
const attributeWithPosInValue = xmlTracker.attributeWithPosInValue(document, position, element);
400+
if (attributeWithPosInValue) {
401+
// Check if cursor is on a variable
402+
const variableDefinition = variableTracker.getVariableDefinition(document, position);
403+
if (variableDefinition) {
404+
logger.debug(`Variable definition found at position: ${position.line + 1}:${position.character} for variable: ${variableDefinition.name}`);
405+
return variableDefinition.definition;
406+
}
408407

409-
// Process trackers
410-
for (const [itemType, trackerInfo] of scriptReferencedItemsRegistry) {
411-
if (token.isCancellationRequested) return undefined;
412-
if (trackerInfo.tracker.schema === schema) {
413-
const itemDefinition = trackerInfo.tracker.getItemDefinition(document, position);
414-
if (itemDefinition) {
415-
logger.debug(`Definition found for ${itemType}: ${itemDefinition.name}`);
416-
return itemDefinition.definition;
408+
const attrValue = attributeWithPosInValue.value;
409+
if (!attrValue.includes('$') && !attrValue.startsWith('event.') && !attrValue.startsWith('@event.')) {
410+
// Process trackers
411+
for (const [itemType, trackerInfo] of scriptReferencedItemsRegistry) {
412+
if (token.isCancellationRequested) return undefined;
413+
if (trackerInfo.tracker.schema === schema) {
414+
const itemDefinition = trackerInfo.tracker.getItemDefinition(document, position);
415+
if (itemDefinition) {
416+
logger.debug(`Definition found for ${itemType}: ${itemDefinition.name}`);
417+
return itemDefinition.definition;
418+
}
419+
}
420+
}
421+
}
422+
// Fallback to script properties
423+
return scriptProperties.provideDefinition(document, position, token);
417424
}
418425
}
419426
}
420-
// Fallback to script properties
421-
return scriptProperties.provideDefinition(document, position, token);
422427
},
423428
})
424429
);
@@ -504,19 +509,20 @@ export function activate(context: vscode.ExtensionContext) {
504509
logger.debug(`Hover will not be generated in comment or single-quoted attribute value: ${attribute.element.name}.${attribute.name}`);
505510
return undefined;
506511
}
507-
508-
// Trackers specific hover information
509-
for (const [itemType, trackerInfo] of scriptReferencedItemsRegistry) {
510-
if (token.isCancellationRequested) return undefined;
511-
if (trackerInfo.tracker.schema === schema) {
512-
// Check for action definitions
513-
const itemHover = trackerInfo.tracker.getItemHover(document, position);
514-
if (itemHover) {
515-
return itemHover;
512+
const attrValue = attribute.value;
513+
if (!attrValue.includes('$') && !attrValue.startsWith('event.') && !attrValue.startsWith('@event.')) {
514+
// Trackers specific hover information
515+
for (const [itemType, trackerInfo] of scriptReferencedItemsRegistry) {
516+
if (token.isCancellationRequested) return undefined;
517+
if (trackerInfo.tracker.schema === schema) {
518+
// Check for action definitions
519+
const itemHover = trackerInfo.tracker.getItemHover(document, position);
520+
if (itemHover) {
521+
return itemHover;
522+
}
516523
}
517524
}
518525
}
519-
520526
// Check for variable hover
521527
const variableAtPosition = variableTracker.getVariableAtPosition(document, position);
522528
if (token.isCancellationRequested) return undefined;

extensions/scripts/src/scripts/scriptCompletion.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -253,7 +253,13 @@ export class ScriptCompletion implements vscode.CompletionItemProvider {
253253
}
254254
const referencedItemAttributeDetected = checkReferencedItemAttributeType(schema, element, attribute.name, attributeInfo.type || 'undefined');
255255
// Check if we're in a label or action context
256-
if (referencedItemAttributeDetected && !referencedItemAttributeDetected.noCompletion && !attributeValue.includes('$')) {
256+
if (
257+
referencedItemAttributeDetected &&
258+
!referencedItemAttributeDetected.noCompletion &&
259+
!attributeValue.includes('$') &&
260+
!attributeValue.startsWith('event.') &&
261+
!attributeValue.startsWith('@event.')
262+
) {
257263
const prefix = document.getText(new vscode.Range(attribute.valueRange.start, position));
258264
// if (prefix === '' && attributeValue !== '') {
259265
// prefix = attributeValue; // If the prefix is empty, use the current attribute value

0 commit comments

Comments
 (0)