microsoft / microsoft/TypeScript

feat(contentmapper): support whole-symbol rename edit projection

Offen
#63,879 1 Kommentar 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

Suggestion
Vorherrschende Sprache
Go
Sterne
111k
Forks
14.3k
Ø Merge
2 T. 4 Std.
Gemergte PRs (30 T.)
132

Beschreibung

## Problem

Content Mapper protocol v1 cannot safely rename one semantic symbol when generated and authored spellings differ.

A Vue mapper, for example, needs to project this authored listener:

```vue

```

to a TypeScript reference to the child's `saveItem` declaration. A protocol Atom correctly maps the whole generated `saveItem` span to the whole authored `save-item` span and works for hover, definition, and references. Rename still fails closed even when the Atom advertises `FeatureRename`.

At `bddd2162710e50281fa838456a875fd59ee7c91f` (the Content Mappers PR microsoft/typescript-go#4712 head):

- `GetRenameInfo` skips every mapped input whose fidelity is not exact.
- `getRenameInfoSuccess` rejects a non-exact trigger span.
- `renameEditRange` skips every mapped occurrence whose writeback is not exact.
- the fourslash contract explicitly verifies that Atom origins cannot be renamed.

Changing the projection to verbatim `"save-item"` is not equivalent: TypeScript then sees a different property symbol, so definition/reference navigation no longer reaches the child `saveItem` declaration. It also cannot express the required per-occurrence replacement: renaming to semantic `nextItem` must write `next-item` in the template and `nextItem` in the TypeScript-shaped declaration.

## Requested design

Please add a safe whole-symbol edit projection mechanism for Content Mappers. Two possible shapes:

1. A mapper RPC that receives the complete rename transaction (semantic replacement plus generated/original spans) and returns validated authored text edits.
2. A declared per-segment edit codec/strategy that can map a semantic replacement in both directions for whole-symbol Atom or Alias segments.

The contract should:

- allow prepare-rename from a single whole-symbol Atom without pretending it has verbatim geometry;
- transform each reference's replacement according to its authored spelling;
- validate bounds, overlap, URI ownership, and document versions before returning one atomic workspace edit;
- fail closed if any required occurrence cannot be projected exactly;
- never return edits targeting generated documents;
- preserve the existing exact-only behavior for ordinary Atom segments without an edit projection;
- clarify whether `FeatureRename` is valid on Atom segments in protocol v1, since it is currently accepted by validation but cannot make rename succeed.

## Acceptance test

Given a child declaration named `saveItem` and parent usages authored as both `@saveItem` and `@save-item`:

- rename from any character of either parent usage updates the child declaration and all parent usages;
- rename from the child declaration updates all parent usages;
- semantic replacement `nextItem` writes valid camel/kebab spellings at the corresponding sites;
- semantic or authored replacement input with kebab casing has a defined, deterministic normalization policy;
- hover, definition, and references retain their current Atom fidelity;
- no approximate `(0, 0)` or generated-file edit is returned.

This is not Vue-specific: template languages commonly normalize casing, prefixes, or sigils while keeping one semantic symbol.

Beitragsleitfaden

Beitragsleitfaden öffnen

Erste Schritte

  1. Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
  3. Forke das Repository und arbeite in einem Branch.
  4. Öffne einen Pull Request, der die Issue-Nummer nennt.

Rechercherichtung

Beginne mit GetRenameInfo, getRenameInfoSuccess und renameEditRange und lies dann den bestehenden fourslash-Vertrag, der verifiziert, dass Atom-Ursprünge nicht umbenannt werden können. Vergleiche die beiden vorgeschlagenen Projektionsformen mit dem Verhalten des Content Mappers PR und dem Akzeptanztest. Als erledigt gilt, wenn atomare Änderungen Vorkommen von Atom oder Alias für ganze Symbole ohne Änderungen an generierten Dateien unterstützen und dabei ansonsten das exact-only-Verhalten beibehalten.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
typescript
Bereich
tooling
Issue-Typ
Feature
Schwierigkeit
5/5
Geschätzter Aufwand
Über eine Woche
Aktivitätsstatus
Ruhig
Klarheit
Größtenteils klar
Anfängerfreundlichkeit
32/100

Neue Issues direkt in Ihr Postfach

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