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

Offen
#235 0 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Maintainer antworten meist innerhalb von 1 Tag

Dieses Issue hat noch niemand übernommen.

Bewertung

Schwierigkeit
4/5
Geschätzter Aufwand
3-5 Tage
Anfängerfreundlichkeit
45/100
Issue-Typ
Feature
Klarheit
Größtenteils klar
Aktivitätsstatus
Aktiv
Tech-Stack
eslint, typescript
Bereich
tooling

Rechercherichtung

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.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Beschreibung

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.
Vorherrschende Sprache
TypeScript
Sterne
12
Forks
8
Ø Merge
9 Std. 2 Min.
Gemergte PRs (30 T.)
25

Entwicklungsumgebung

Erste Schritte

  1. Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
  3. Forken Sie das Repository und arbeiten Sie in einem Branch.
  4. Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.

Mehr aus adobe/data

Alle Issues in adobe/data

Ähnliche Issues

Weitere Issues zu TypeScript

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.