microsoft / microsoft/TypeScript

[Bug] PrivateIdentifier nodes are omitted from 2020 semantic classifications

Abierto Apto para principiantes
#64,322 2 comentarios 0 reacciones 0 asignados Ver en GitHub
Lenguaje dominante
Go
Estrellas
111k
Forks
14.3k
Merge medio
2 d 4 h
PR fusionados (30 d)
132

Descripción

# 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.

Guía de contribución

Abrir la guía de contribución

Línea de trabajo

Comienza en src/services/classifier2020.ts, en collectTokens, y revisa la asignación existente de declaration-kind para los nodos identificadores. Añade la prueba de regresión de fourslash pertinente que cubra las declaraciones y referencias de campos y métodos private, y luego verifica que los nodos reciban clasificaciones property o method y declaration modifiers.

Escrito por el modelo de indexación a partir del texto del issue.

Evaluación

Stack tecnológico
typescript, vscode
Área
compilers, developer-experience
Tipo de issue
Error
Dificultad
2/5
Tiempo estimado
1-3 horas
Estado de actividad
Activo
Claridad
Bien especificado
Aptitud para principiantes
88/100

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.