microsoft / microsoft/TypeScript
[Performance] Add option for parser to compute Node.loc eagerly during parsing
Personne n'a encore pris cette issue.
- Langage dominant
- Go
- Étoiles
- 111k
- Forks
- 14.4k
- Merge moyen
- 1 j 19 h
- PR mergées (30 j)
- 117
Description
Suggestion
🔍 Search Terms
List of keywords you searched for before creating this issue. Write them down here so that others can find this suggestion more easily and help provide feedback.
performance, parser, node location, loc
✅ Viability Checklist
My suggestion meets these guidelines:
- This wouldn't be a breaking change in existing TypeScript/JavaScript code
- This wouldn't change the runtime behavior of existing JavaScript code
- This could be implemented without emitting different JS based on the types of the expressions
- This isn't a runtime feature (e.g. library functionality, non-ECMAScript syntax with JavaScript output, new syntax sugar for JS, etc.)
- This feature would agree with the rest of TypeScript's Design Goals.
⭐ Suggestion
Currently TS does not compute or store a node's loc during a parse.
For TS itself this is fine because it's rarer that TS needs this information (I don't know for sure, but I'd say it only needs it when reporting errors?).
For @typescript-eslint, however, we need to compute the location because ESLint uses it for various things.
The issue is that computing the loc after the parse cycle means that TS has to do a binary search on the line/range table to compute the line/col of each of the start/end - which is obviously not super cheap to do.
As an alternative approach I tried changing ts-eslint's parser to lazily compute the locaction (https://github.com/typescript-eslint/typescript-eslint/pull/6542). Sadly it was a net-neutral change because (I believe) the cost of defining a getter/setter is much more expensive than a property.
Unfortunately based on the way the ESLint's AST is designed we can't introduce a getLoc function, and can only defer this by using accessors.
Here is a cpu profile to help illustrate the cost - NON_LAZY_1.cpuprofile.zip. If you load this into https://speedscope.app you can use the search to find SourceFileObject.getLineAndCharacterOfPosition. It shows that the total time spent in SourceFileObject.getLineAndCharacterOfPosition for the parse was ~260ms (0.61% of the type-aware lint run).
You people know TS's parser better than I - so you're more aware of whether or not it's feasible to compute the loc up front without a binary search or not. If it's not - then we can just close this out as non-actionable.
Guide de contribution
Ouvrir le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Piste de recherche
Commencez par lire le parseur TypeScript et le calcul existant de node-location décrit dans l’issue, puis comparez la façon dont @typescript-eslint consomme les emplacements de l’AST ESLint. L’issue ne nomme aucun fichier ni test ; la finalisation nécessiterait une option acceptée pour le calcul eager de loc ainsi que des éléments montrant qu’elle évite le coût de la recherche binaire signalé sans modifier le comportement existant.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Évaluation
- Stack technique
- eslint, typescript
- Domaine
- compilers, performance
- Type d'issue
- Fonctionnalité
- Difficulté
- 5/5
- Temps estimé
- Plus d'une semaine
- Activité
- À l'abandon
- Clarté
- Plutôt claire
- Accessibilité débutants
- 25/100