Skip to content

Commit df524d0

Browse files
committed
fix(visual-edits): exclui filhos diretos do dropdown do elemento clicado
Ao clicar num container (ex.: card branco), o dropdown listava VARs e tags de elementos filhos aninhados, poluindo a visão do que pertence ao próprio elemento clicado. Agora, além de limitar ao range source [<tag>..</tag>], detectamos os ranges dos filhos diretos (via varredura source com balanceamento) e filtramos qualquer contribuinte cujo loc caia dentro desses ranges. Assim sobram apenas a abertura do próprio elemento, atributos interpolados (VARs no estilo) e varrefs que produzem HTML como bloco — não os elementos aninhados em si.
1 parent 1e4099f commit df524d0

1 file changed

Lines changed: 36 additions & 1 deletion

File tree

src/lib/daxParser/varDependencies.ts

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,32 @@ function extractOpenTagName(src: string, openLoc: SourceLoc): string | null {
6666
return m ? m[1].toLowerCase() : null;
6767
}
6868

69+
// Localiza os ranges (no source) dos elementos HTML filhos *diretos* contidos
70+
// entre [scanStart, scanEnd]. Cada range cobre desde o "<" da abertura até o
71+
// ponto logo após o ">" do fechamento correspondente. Tags self-closing e
72+
// elementos void ocupam apenas o range da própria tag.
73+
function findChildRanges(src: string, scanStart: number, scanEnd: number): SourceLoc[] {
74+
const ranges: SourceLoc[] = [];
75+
const openRe = /<([a-zA-Z][a-zA-Z0-9-]*)\b[^>]*?(\/?)>/g;
76+
openRe.lastIndex = scanStart;
77+
let m: RegExpExecArray | null;
78+
while ((m = openRe.exec(src)) !== null) {
79+
if (m.index >= scanEnd) break;
80+
const tagName = m[1].toLowerCase();
81+
const selfClose = m[2] === '/';
82+
const start = m.index;
83+
const openEnd = m.index + m[0].length;
84+
let end = openEnd;
85+
if (!selfClose && !VOID_ELEMENTS.has(tagName)) {
86+
end = findElementEnd(src, { start, end: openEnd }, tagName);
87+
if (end > scanEnd) end = scanEnd;
88+
}
89+
ranges.push({ start, end });
90+
openRe.lastIndex = end;
91+
}
92+
return ranges;
93+
}
94+
6995
interface VarRecord {
7096
declLoc: SourceLoc;
7197
}
@@ -246,9 +272,18 @@ export function buildContributorIndex(ast: Node, src: string): ContributorIndex
246272
const elemEnd = tagName ? findElementEnd(src, n.loc, tagName) : n.loc.end;
247273
const elemLoc: SourceLoc = { start: n.loc.start, end: elemEnd };
248274

275+
// Filhos diretos no source: queremos exibir apenas o que pertence ao
276+
// próprio elemento (sua abertura e atributos), não o que está dentro
277+
// de elementos aninhados.
278+
const childRanges = findChildRanges(src, n.loc.end, elemEnd);
279+
const inChild = (l: SourceLoc) =>
280+
childRanges.some((r) => l.start >= r.start && l.end <= r.end);
281+
249282
const items = all.filter((c) => {
250283
const l = locOfContributor(c);
251-
return l.start >= elemLoc.start && l.end <= elemLoc.end;
284+
if (l.start < elemLoc.start || l.end > elemLoc.end) return false;
285+
if (inChild(l)) return false;
286+
return true;
252287
});
253288

254289
const entry: ContributorsEntry = {

0 commit comments

Comments
 (0)