@@ -301,7 +301,7 @@ export class BaseVariableResolver {
301301
302302 const seenNames = new Set ( ) ;
303303
304- return reversedVariables . filter ( variable => {
304+ const deduplicatedVariables = reversedVariables . filter ( variable => {
305305
306306 const provider = variable . provider || [ ] ;
307307
@@ -319,6 +319,23 @@ export class BaseVariableResolver {
319319
320320 return false ;
321321 } ) ;
322+
323+ return deduplicatedVariables . map ( variable => {
324+ if ( ! variable . usedBy || ! Array . isArray ( variable . usedBy ) ) {
325+ return variable ;
326+ }
327+
328+ const usedBy = filterUsedByForElement ( variable , bo ) ;
329+
330+ if ( usedBy . length === variable . usedBy . length ) {
331+ return variable ;
332+ }
333+
334+ return {
335+ ...variable ,
336+ usedBy : usedBy . length ? usedBy : undefined
337+ } ;
338+ } ) ;
322339 }
323340
324341 _getScope ( element , containerElement , variableName , checkYourself ) {
@@ -472,4 +489,42 @@ function isUsedOutsideOwnScope(variable) {
472489 return variable . usedBy . some ( usedBy => {
473490 return usedBy && usedBy . id && ! isElementInScope ( usedBy , variable . scope ) ;
474491 } ) ;
492+ }
493+
494+ function filterUsedByForElement ( variable , element ) {
495+ const names = variable . usedBy . filter ( usage => typeof usage === 'string' ) ;
496+ const elements = variable . usedBy . filter ( usage => usage && usage . id ) ;
497+
498+ if ( ! variable . scope ) {
499+ return [ ...names , ...elements . filter ( usage => isElementInScope ( usage , element ) ) ] ;
500+ }
501+
502+ // Querying the variable's own scope: show local consumers.
503+ if ( element . id === variable . scope . id ) {
504+ return [
505+ ...names ,
506+ ...elements . filter ( usage => isElementInScope ( usage , variable . scope ) )
507+ ] ;
508+ }
509+
510+ // Querying an ancestor scope: show consumers outside the variable's own scope.
511+ if ( isElementInScope ( variable . scope , element ) ) {
512+ return [
513+ ...names ,
514+ ...elements . filter ( usage =>
515+ isElementInScope ( usage , element )
516+ && ! isElementInScope ( usage , variable . scope )
517+ )
518+ ] ;
519+ }
520+
521+ // Querying a child scope: show consumers in that child scope only.
522+ if ( isElementInScope ( element , variable . scope ) ) {
523+ return [
524+ ...names ,
525+ ...elements . filter ( usage => isElementInScope ( usage , element ) )
526+ ] ;
527+ }
528+
529+ return names ;
475530}
0 commit comments