diff options
-rw-r--r-- | src/js_ast.zig | 1 | ||||
-rw-r--r-- | src/js_parser/js_parser.zig | 84 |
2 files changed, 45 insertions, 40 deletions
diff --git a/src/js_ast.zig b/src/js_ast.zig index 96b14c363..2cb3f3f03 100644 --- a/src/js_ast.zig +++ b/src/js_ast.zig @@ -4552,6 +4552,7 @@ pub const Part = struct { runtime, cjs_imports, react_fast_refresh, + dirname_filename, }; pub const SymbolUseMap = std.ArrayHashMapUnmanaged(Ref, Symbol.Use, RefHashCtx, false); diff --git a/src/js_parser/js_parser.zig b/src/js_parser/js_parser.zig index 276dda451..a4d505af6 100644 --- a/src/js_parser/js_parser.zig +++ b/src/js_parser/js_parser.zig @@ -2403,6 +2403,50 @@ pub const Parser = struct { } } + const uses_dirname = p.symbols.items[p.dirname_ref.innerIndex()].use_count_estimate > 0; + const uses_filename = p.symbols.items[p.filename_ref.innerIndex()].use_count_estimate > 0; + if (uses_dirname or uses_filename) { + const count = @as(usize, @boolToInt(uses_dirname)) + @as(usize, @boolToInt(uses_filename)); + var declared_symbols = try p.allocator.alloc(js_ast.DeclaredSymbol, count); + var decls = p.allocator.alloc(G.Decl, count) catch unreachable; + if (uses_dirname) { + decls[0] = .{ + .binding = p.b(B.Identifier{ .ref = p.dirname_ref }, logger.Loc.Empty), + .value = p.e( + // TODO: test UTF-8 file paths + E.String.init(p.source.path.name.dir), + logger.Loc.Empty, + ), + }; + declared_symbols[0] = .{ .ref = p.dirname_ref, .is_top_level = true }; + p.recordUsage(p.dirname_ref); + } + if (uses_filename) { + decls[@as(usize, @boolToInt(uses_dirname))] = .{ + .binding = p.b(B.Identifier{ .ref = p.filename_ref }, logger.Loc.Empty), + .value = p.e( + E.String.init(p.source.path.text), + logger.Loc.Empty, + ), + }; + declared_symbols[@as(usize, @boolToInt(uses_dirname))] = .{ .ref = p.filename_ref, .is_top_level = true }; + p.recordUsage(p.filename_ref); + } + + // TODO: DeclaredSymbol + var part_stmts = p.allocator.alloc(Stmt, 1) catch unreachable; + part_stmts[0] = p.s(S.Local{ + .kind = .k_var, + .decls = decls, + }, logger.Loc.Empty); + before.append(js_ast.Part{ + .stmts = part_stmts, + .declared_symbols = declared_symbols, + .tag = .dirname_filename, + }) catch unreachable; + + } + var did_import_fast_refresh = false; // Analyze cross-part dependencies for tree shaking and code splitting @@ -2825,46 +2869,6 @@ pub const Parser = struct { p.resolveCommonJSSymbols(); - const uses_dirname = p.symbols.items[p.dirname_ref.innerIndex()].use_count_estimate > 0; - const uses_filename = p.symbols.items[p.filename_ref.innerIndex()].use_count_estimate > 0; - if (uses_dirname or uses_filename) { - const count = @as(usize, @boolToInt(uses_dirname)) + @as(usize, @boolToInt(uses_filename)); - var declared_symbols = try p.allocator.alloc(js_ast.DeclaredSymbol, count); - var decls = p.allocator.alloc(G.Decl, count) catch unreachable; - if (uses_dirname) { - decls[0] = .{ - .binding = p.b(B.Identifier{ .ref = p.dirname_ref }, logger.Loc.Empty), - .value = p.e( - // TODO: test UTF-8 file paths - E.String.init(p.source.path.name.dir), - logger.Loc.Empty, - ), - }; - declared_symbols[0] = .{ .ref = p.dirname_ref, .is_top_level = true }; - } - if (uses_filename) { - decls[@as(usize, @boolToInt(uses_dirname))] = .{ - .binding = p.b(B.Identifier{ .ref = p.filename_ref }, logger.Loc.Empty), - .value = p.e( - E.String.init(p.source.path.text), - logger.Loc.Empty, - ), - }; - declared_symbols[@as(usize, @boolToInt(uses_dirname))] = .{ .ref = p.filename_ref, .is_top_level = true }; - } - - // TODO: DeclaredSymbol - var part_stmts = p.allocator.alloc(Stmt, 1) catch unreachable; - part_stmts[0] = p.s(S.Local{ - .kind = .k_var, - .decls = decls, - }, logger.Loc.Empty); - before.append(js_ast.Part{ - .stmts = part_stmts, - .declared_symbols = declared_symbols, - }) catch unreachable; - } - // - don't import runtime if we're bundling, it's already included // - when HMR is enabled, we always need to import the runtime for HMRClient and HMRModule. // - when HMR is not enabled, we only need any runtime imports if we're importing require() |