microsoft / microsoft/TypeScript

[Bug] PrivateIdentifier nodes are omitted from 2020 semantic classifications

Offen Anfängerfreundlich
#64,322 2 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

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

Beschreibung

# Bug Report

### 🔎 Search Terms

semantic highlighting, semantic token, PrivateIdentifier, private field, private method, encodedSemanticClassifications

### 🕗 Version & Regression Information

- TypeScript 6.0.3 (bundled with VS Code)
- Also present in the v5.9 classifier implementation
- This is not a theme-specific issue

### 💻 Code

```ts
class Foo {
field = 1;
#privateField = 1;

method() {}
#privateMethod() {}

test() {
this.field;
this.#privateField;

this.method();
this.#privateMethod();
}
}
```

### 🙁 Actual behavior

In VS Code's **Developer: Inspect Editor Tokens and Scopes**:

- `field` and `method` receive semantic token types.
- `#privateField` and `#privateMethod` receive no semantic token and fall back to TextMate scopes.
- As a result, `editor.semanticTokenColorCustomizations` rules for `property` and `method` do not apply to ECMAScript private members.

Image

Image

### 🙂 Expected behavior

- `#privateField` should be classified as `property`.
- `#privateMethod` should be classified as `method`.
- Declarations should also receive the `declaration` modifier.

### Root cause

VS Code requests `encodedSemanticClassifications-full` with format `"2020"`.

In `src/services/classifier2020.ts`, `collectTokens` only enters the semantic-classification path for `isIdentifier(node)`:

```ts
if (isIdentifier(node) && ...) {
let symbol = typeChecker.getSymbolAtLocation(node);
// ...
}
```

ECMAScript private names are separate `SyntaxKind.PrivateIdentifier` nodes, so they are skipped before `getSymbolAtLocation` is called.

Relevant source:
https://github.com/microsoft/TypeScript/blob/050880ce59e30b356b686bd3144efe24f875ebc8/src/services/classifier2020.ts#L121-L203

### Proposed fix

```diff
+ isPrivateIdentifier,
isPropertyAccessExpression,
```

```diff
- if (isIdentifier(node) && ...) {
+ if ((isIdentifier(node) || isPrivateIdentifier(node)) && ...) {
```

The existing declaration-kind mapping already classifies private fields and methods correctly once these nodes reach the symbol-classification path.

I tested the equivalent change against TypeScript 6.0.3:

- `#privateField` declaration/reference → `property`
- `#privateMethod` declaration/reference → `member` internally, mapped by VS Code to `method`
- declaration occurrences receive the `declaration` modifier
- added fourslash regression test passes

### Related issue

https://github.com/microsoft/TypeScript/issues/44483 requests new `private`/`protected` semantic modifiers. This report is different: ECMAScript `PrivateIdentifier` nodes currently receive no semantic classification at all.

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 in src/services/classifier2020.ts bei collectTokens und überprüfe die vorhandene declaration-kind-Zuordnung für Bezeichnerknoten. Füge den relevanten fourslash-Regressionstest hinzu, der Deklarationen und Verweise auf private Felder und Methoden abdeckt, und verifiziere anschließend, dass die Knoten property- oder method-Klassifizierungen und declaration modifiers erhalten.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
typescript, vscode
Bereich
compilers, developer-experience
Issue-Typ
Bug
Schwierigkeit
2/5
Geschätzter Aufwand
1-3 Stunden
Aktivitätsstatus
Aktiv
Klarheit
Klar beschrieben
Anfängerfreundlichkeit
88/100

Neue Issues direkt in Ihr Postfach

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