diff options
-rw-r--r-- | .gitignore | 3 | ||||
-rw-r--r-- | src/bundler.zig | 10 | ||||
-rw-r--r-- | src/cache.zig | 4 | ||||
-rw-r--r-- | src/logger.zig | 36 |
4 files changed, 45 insertions, 8 deletions
diff --git a/.gitignore b/.gitignore index cc43103a1..6c197f015 100644 --- a/.gitignore +++ b/.gitignore @@ -48,4 +48,5 @@ txt.js .vscode/cpp* node_modules_* -*.jsb
\ No newline at end of file +*.jsb +.zip
\ No newline at end of file diff --git a/src/bundler.zig b/src/bundler.zig index 105d29f54..ac340a15b 100644 --- a/src/bundler.zig +++ b/src/bundler.zig @@ -993,7 +993,7 @@ pub fn NewBundler(cache_files: bool) type { true, null, ); - const source = logger.Source.initFile(Fs.File{ .path = file_path, .contents = entry.contents }, bundler.allocator) catch return null; + const source = logger.Source.initRecycledFile(Fs.File{ .path = file_path, .contents = entry.contents }, bundler.allocator) catch return null; const source_dir = file_path.name.dirWithTrailingSlash(); var jsx = bundler.options.jsx; @@ -1275,7 +1275,7 @@ pub fn NewBundler(cache_files: bool) type { null, ) catch return; - const source = logger.Source.initFile(Fs.File{ .path = file_path, .contents = entry.contents }, bundler.allocator) catch return null; + const source = logger.Source.initRecycledFile(Fs.File{ .path = file_path, .contents = entry.contents }, bundler.allocator) catch return null; const source_dir = file_path.name.dirWithTrailingSlash(); var jsx = bundler.options.jsx; @@ -1594,8 +1594,8 @@ pub fn NewBundler(cache_files: bool) type { ) catch return null; const _file = Fs.File{ .path = file_path, .contents = entry.contents }; - const source = try logger.Source.initFile(_file, bundler.allocator); - + var source = try logger.Source.initFile(_file, bundler.allocator); + source.contents_is_recycled = !cache_files; var css_writer = CSSWriter.init( &source, file, @@ -1792,7 +1792,7 @@ pub fn NewBundler(cache_files: bool) type { file_descriptor, ) catch return null; input_fd = entry.fd; - break :brk logger.Source.initFile(Fs.File{ .path = path, .contents = entry.contents }, bundler.allocator) catch return null; + break :brk logger.Source.initRecycledFile(Fs.File{ .path = path, .contents = entry.contents }, bundler.allocator) catch return null; } }; diff --git a/src/cache.zig b/src/cache.zig index efc2a90c7..96713adca 100644 --- a/src/cache.zig +++ b/src/cache.zig @@ -185,7 +185,7 @@ pub fn NewCache(comptime cache_files: bool) type { source: *const logger.Source, ) anyerror!?js_ast.Ast { var temp_log = logger.Log.init(allocator); - defer temp_log.appendTo(log) catch {}; + defer temp_log.appendToMaybeRecycled(log, source) catch {}; var parser = js_parser.Parser.init(opts, &temp_log, source, defines, allocator) catch |err| { return null; }; @@ -205,7 +205,7 @@ pub fn NewCache(comptime cache_files: bool) type { source: *const logger.Source, ) anyerror!void { var temp_log = logger.Log.init(allocator); - defer temp_log.appendTo(log) catch {}; + defer temp_log.appendToMaybeRecycled(log, source) catch {}; var parser = js_parser.Parser.init(opts, &temp_log, source, defines, allocator) catch |err| { return; diff --git a/src/logger.zig b/src/logger.zig index a5f4eeae2..8904ee1e1 100644 --- a/src/logger.zig +++ b/src/logger.zig @@ -365,6 +365,25 @@ pub const Log = struct { self.msgs.deinit(); } + pub fn appendToMaybeRecycled(self: *Log, other: *Log, source: *const Source) !void { + if (source.contents_is_recycled) { + for (self.msgs.items) |*_msg| { + var msg: *Msg = _msg; + if (msg.data.location) |*location| { + if (location.line_text) |line_text| { + location.line_text = try other.msgs.allocator.dupe(u8, line_text); + } + } + } + } + + try other.msgs.appendSlice(self.msgs.items); + other.warnings += self.warnings; + other.errors += self.errors; + + self.msgs.deinit(); + } + pub fn deinit(self: *Log) void { self.msgs.deinit(); } @@ -547,6 +566,7 @@ pub const Source = struct { key_path: fs.Path, index: u32 = 0, contents: string, + contents_is_recycled: bool = false, // An identifier that is mixed in to automatically-generated symbol names to // improve readability. For example, if the identifier is "util" then the @@ -574,6 +594,22 @@ pub const Source = struct { return source; } + pub fn initRecycledFile(file: fs.File, allocator: *std.mem.Allocator) !Source { + var name = file.path.name; + var identifier_name = name.nonUniqueNameString(allocator) catch unreachable; + + var source = Source{ + .path = file.path, + .key_path = fs.Path.init(file.path.text), + .identifier_name = identifier_name, + .contents = file.contents, + .contents_is_recycled = true, + }; + source.path.namespace = "file"; + + return source; + } + pub fn initPathString(pathString: string, contents: string) Source { var path = fs.Path.init(pathString); return Source{ .key_path = path, .path = path, .identifier_name = path.name.base, .contents = contents }; |