aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/js_parser/js_parser.zig21
1 files changed, 15 insertions, 6 deletions
diff --git a/src/js_parser/js_parser.zig b/src/js_parser/js_parser.zig
index 1d41945c1..112c61553 100644
--- a/src/js_parser/js_parser.zig
+++ b/src/js_parser/js_parser.zig
@@ -4620,17 +4620,24 @@ pub fn NewParser(
}
var is_identifier = p.lexer.token == .t_identifier;
- var is_strict_modereserved_word = is_identifier and js_lexer.StrictModeReservedWords.has(p.lexer.identifier);
- if (!opts.is_name_optional or (is_identifier and !is_strict_modereserved_word)) {
+ if (!opts.is_name_optional or (is_identifier and (!is_typescript_enabled or !strings.eqlComptime(p.lexer.identifier, "interface")))) {
var name_loc = p.lexer.loc();
var name_text = p.lexer.identifier;
- if (is_strict_modereserved_word) {
- try p.lexer.unexpected();
+ try p.lexer.expect(.t_identifier);
+
+ // We must return here
+ // or the lexer will crash loop!
+ // example:
+ // export class {}
+ if (!is_identifier) {
return error.SyntaxError;
}
- try p.lexer.expect(.t_identifier);
+ if (p.fn_or_arrow_data_parse.allow_await != .allow_ident and strings.eqlComptime(name_text, "await")) {
+ try p.log.addRangeError(p.source, p.lexer.range(), "Cannot use \"await\" as an identifier here");
+ }
+
name = LocRef{ .loc = name_loc, .ref = null };
if (!opts.is_typescript_declare) {
(name orelse unreachable).ref = p.declareSymbol(.class, name_loc, name_text) catch unreachable;
@@ -11981,7 +11988,9 @@ pub fn NewParser(
}
// We must relocate vars in order to safely handle removing if/else depending on NODE_ENV.
- if (data.kind == .k_var) {
+ // Edgecase:
+ // `export var` is skipped because it's unnecessary. That *should* be a noop, but it loses the `is_export` flag if we're in HMR.
+ if (data.kind == .k_var and !data.is_export) {
const relocated = p.maybeRelocateVarsToTopLevel(data.decls, .normal);
if (relocated.ok) {
if (relocated.stmt) |new_stmt| {