@directive is dropped on @this functions

Ouverte
#9,197 0 commentaires 0 réactions 0 personnes assignées Voir sur GitHub

Les mainteneurs répondent en général sous 1 jour

Personne n'a encore pris cette issue.

Évaluation

Difficulté
4/5
Temps estimé
3-5 jours
Accessibilité débutants
55/100
Type d'issue
Bug
Clarté
Clairement spécifiée
Activité
Active
Stack technique
javascript, ocaml
Domaine
compilers

Piste de recherche

Start with the Pjs_fn_method case in compiler/core/lam_compile.ml, then follow how E.method_ builds functions in compiler/core/js_exp_make.ml and how the method branch prints them in Js_dump.pp_function. Check the frontend @this rewrite to confirm the directive stays on the inner function; printlambda does not show directives. Done means @directive appears first in the generated method body, before let self = this, for both examples while preserving async.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Description

A @this function loses its @directive. Nothing is reported, and async on the same function is kept.

let plain = @this @directive("'use cache'") (self, x) => self + x
let action = @this @directive("'use server'") async (self, x) => self + x

compiles to

function plain(x) {
  let self = this ;
  return self + x | 0;
}

async function action(x) {
  let self = this ;
  return self + x | 0;
}

Neither directive appears in the output. Without @this, the directive is kept (function d(n) { 'use cache'; … }).

Cause

@this compiles through %unsafe_to_method to Pjs_fn_method, and that path drops the directive:

  • compiler/core/lam_compile.ml: the Pjs_fn_method case matches attr = {return_unit; async} and never reads directive.
  • compiler/core/js_exp_make.ml: E.method_ has no directive parameter and builds the function with directive = None.

Fixing it

Passing the directive through is not enough. In Js_dump.pp_function, the method branch prints let self = this before function_body ?directive. The directive would then not be the first statement in the body, so JavaScript would treat it as a plain string expression. The method branch has to print the directive before let self = this.

printlambda does not show directives, so check that the @this rewrite in the frontend keeps the attribute on the inner function.

Found while reviewing #9176, which fixes the related #9174 (forwarding async/directive functions reduced away). This bug was there before that PR.

Langage dominant
OCaml
Étoiles
7.5k
Forks
485
Merge moyen
17 h 9 min
PR mergées (30 j)
264

Préparer son environnement

Ouvrir dans Codespaces

Lance le conteneur de développement du projet dans votre navigateur, avec votre propre compte GitHub.

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Autres issues de rescript-lang/rescript

Toutes les issues de rescript-lang/rescript

Issues similaires

Plus d'issues Compilers

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.