Be much more careful about parsing *
in import and export statements
#4308
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
While writing the documentation for modules, I stumbled across a bug. Yes, I broke it already.
I was writing this as an example:
Which choked on the
*
, because our check for whether*
should be treated asEXPORT_ALL
was whether we’ve seen anEXPORT
token and that the indent was 0. I knew that indent check was going to be trouble; but I gave it a lot more thought this time, and noticed two things:import
statements, an*
always precedes anas
.export
statements, the only time*
can appear is in a statement likeexport * from 'lib'
So I made the check for converting
*
toIMPORT_ALL
orEXPORT_ALL
much narrower, based on these two rules. This made my example compile properly, and broke no other tests. I added two new tests like this example, where*
is used on the same line (and indentation level) as anexport
keyword. I also re-ran the Meteor todos test.@lydell you were wondering why we can’t just put
*
in the grammar? It’s because the lexer converts*
to tagMATH
, and I don’t want to write grammar likeEXPORT MATH FROM String
. That doesn’t make much sense, and then inExportAllDeclaration
I would need to filter whetherMATH
was an*
and throw an error otherwise. Better to intercept*
in the lexer and convert it toIMPORT_ALL
orEXPORT_ALL
there rather thanMATH
.