eslint rule suggestion: report an Index that the system's own query already covers

Aperta
#235 0 commenti 0 reazioni 0 assegnatari Vedi su GitHub

I maintainer di solito rispondono entro 1 giorno

Nessuno ha ancora preso questa issue.

Valutazione

Difficoltà
4/5
Tempo stimato
3-5 giorni
Idoneità per principianti
45/100
Tipo di issue
Funzionalità
Chiarezza
Abbastanza chiara
Stato di attività
Attiva
Stack tecnologico
eslint, typescript
Ambito
tooling

Direzione di ricerca

Start by reading the existing ESLint plugin and rule entry points; the issue notes that the plugin already sees system declarations and lookups. Check related issues #233 and #234 for context, then add tests for the listed report and non-report cases. Done means the rule reports only qualifying indexes at Index.create and leaves the specified legitimate indexes alone.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

Summary

Suggestion for the planned ESLint rule: report an Index that a plain query already covers. An index is kept up to date on every structural change and costs memory, so defining one for something a system can read with components: { with, not } is waste, and it is easy to write by habit.

Case

A system that despawns every entity carrying a tag was written with an index:

const transients = Index.create({ key: [], components: { with: [frameTransient] } });

export const endFrame = System.create({ lookup: { transients: { index: transients } } }, ({ commands, lookup }) => {
    const all = lookup.transients();
    for (let i = 0; i < all.length; i++) commands.despawn(all.at(i).entity);
});

A row system reads the same entities with nothing to maintain:

export const endFrame = System.create({ components: { with: [frameTransient] } }, (row, { commands }) => {
    commands.despawn(row.entity);
});

Rule

Report an index when all of these hold:

  • it has key: [] and is not unique,
  • exactly one system uses it, through a lookup,
  • the index's with (and not) is covered by that system's own components declaration, so the system already matches those entities,
  • the body only iterates the lookup's rows (for (i < rows.length) rows.at(i)), with no keyed access.

Message: "this index is replaceable by the system's own components query; make it a row system" (or the equivalent for per-run systems), pointing at the Index.create.

What it must not report

An all-rows index (key: []) is legitimate when:

  • several systems read it,
  • a per-run system needs the whole set before it acts (for example, "is there any request for X?" across all rows), which a row system, called once per row, can't express,
  • it is read from a system whose own declaration doesn't match those entities (a different archetype).

An index with a key (a keyed or unique lookup) is never reported.

Notes

  • It could also be a compiler warning, since the plugin already sees every system's declaration and lookups, but a lint rule fits better: the first check is a style judgment and the fix depends on the body.
  • Related: https://github.com/adobe/data/issues/234 (the widened-access fallback) and https://github.com/adobe/data/issues/233 (describing inferred access), both about making what the build infers visible.
Lingua principale
TypeScript
Stelle
12
Fork
8
Merge medio
11h 2m
PR unite (30g)
23

Preparare l'ambiente

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di adobe/data

Tutte le issue di adobe/data

Issue simili

Altre issue su TypeScript

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.