Skip to content

Commit da8f22c

Browse files
committed
adjust for #92
1 parent 602e9e4 commit da8f22c

File tree

1 file changed

+56
-1
lines changed

1 file changed

+56
-1
lines changed

lib/base/VariableResolver.js

Lines changed: 56 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)