Add parser support for placeholders#9364
Conversation
| export type Placeholder<N: PlaceholderTypes> = NodeBase & { | ||
| type: "Placeholder", | ||
| id: Identifier, | ||
| expectedNode: N, |
There was a problem hiding this comment.
What do you prefer?
expectedNodeexpectedTypeexpectedoriginal
|
Build successful! You can test your changes in the REPL here: https://babeljs.io/repl/build/10276/ |
|
I just wanted to ask once again why we aren't using {% %} (I'm totally OK with %% if {% can't be done!), I just know that {%%} gets used for a lot of templating systems and it would be cool to allow it to fit naturally into those. In particular I am currently considering gitbook.io, where it would be nice to be able to use the same templating syntax in both the markdown itself as well as the codeblocks. Again though, I'm open to a different thing just wanted to raise this. |
|
It is mainly because of https://github.com/keithamus/proposal-object-freeze-seal-syntax. Currently it uses If no one thinkgs that that proposal could use If the "open-close" tokens pair is better, maybe |
d2180c9 to
1abfbe2
Compare
|
@keithamus Do you think that the |
1abfbe2 to
aac75a2
Compare
|
Rebased and fixed #9364 (comment) |
|
@nicolo-ribaudo |
8e23611 to
3405274
Compare
3405274 to
18b465a
Compare
NOTE: Since %%FOO%% is parsed as an Expression, the following arrow
functions are not valid:
%%FOO%% => {}; async %%FOO%% => {};
The heads must be parenthesized:
(%%FOO%%) => {}; async (%%FOO%%) => {};
Also, placeholders must be parenthesized when used inside decorators:
Invalid: Valid:
@%%DECO%% @(%%DECO%%)
class X {} class X {}
c379076 to
4c6418f
Compare
|
Rebased on top of the scope tracking PR. The only changes are in the last two commits |
Co-Authored-By: nicolo-ribaudo <nicolo.ribaudo@gmail.com>
Off Topic: I changed the threshold to 30KB as the threshold is the total of changes for all assets together, so I calculated as 10KB per bundle + 5KB per minified bundle. |
This is the last step to make #9364 usable in Babel. I'm sorry for opening this PR so late, but I hope to get it in v7.4. In this PR I added a new option to `@babel/template`, `syntacticPlaceholders: ?boolean`, which toggles between `%%foo%%` placeholders (when `true`) and `FOO` placeholders. If it isn't specified, Babel tries to be "smart" to avoid breaking backward compat: if `%%foo%%` is used `syntacticPlaceholders` defaults to `true`, otherwise to `false`. 0e58e25 commit shows how some templates we used could be simplified by using this new placeholders syntax (we can't actually do it yet because we are importing `template` from `@babel/core` which could be an older version). NOTE: Since I wanted to keep this PR as small as possible to make it easier to review, I didn't migrate `template.ast` to internally use the new syntax. It is an implementation detail, so it will be possible to change it in a patch release.
I added support for
%%foo%%style placeholders to@babel/parserthrought theplaceholdersplugin.Part of this PR, which is a small refactor of import/export parsing, is split up at #9326 since it can be reviewd by its own.
For now I only allowed the
Placeholder :: %% Identifier %%syntax, it could be expanded later.@babel/types,@babel/generatorand@babel/templatesupport will come in separate PRs.cc @tolmasky