@@ -213,7 +213,7 @@ impl Linter {
213213 }
214214
215215 #[ cfg( all( feature = "oxlint2" , not( feature = "disable_oxlint2" ) ) ) ]
216- self . run_external_rules ( & external_rules, path, & ctx_host, allocator) ;
216+ self . run_external_rules ( & external_rules, path, semantic , & ctx_host, allocator) ;
217217
218218 // Stop clippy complaining about unused vars
219219 #[ cfg( not( all( feature = "oxlint2" , not( feature = "disable_oxlint2" ) ) ) ) ]
@@ -233,9 +233,12 @@ impl Linter {
233233 & self ,
234234 external_rules : & [ ( ExternalRuleId , AllowWarnDeny ) ] ,
235235 path : & Path ,
236+ semantic : & Semantic < ' _ > ,
236237 ctx_host : & ContextHost ,
237- _allocator : & Allocator ,
238+ allocator : & Allocator ,
238239 ) {
240+ use std:: ptr;
241+
239242 use oxc_diagnostics:: OxcDiagnostic ;
240243 use oxc_span:: Span ;
241244
@@ -248,9 +251,23 @@ impl Linter {
248251 // `external_linter` always exists when `oxlint2` feature is enabled
249252 let external_linter = self . external_linter . as_ref ( ) . unwrap ( ) ;
250253
254+ // Write offset of `Program` and source text length in metadata at end of buffer
255+ let program = semantic. nodes ( ) . program ( ) . unwrap ( ) ;
256+ let program_offset = ptr:: from_ref ( program) as u32 ;
257+ #[ expect( clippy:: cast_possible_truncation) ]
258+ let source_len = program. source_text . len ( ) as u32 ;
259+
260+ let metadata = RawTransferMetadata :: new ( program_offset, source_len) ;
261+ let metadata_ptr = allocator. end_ptr ( ) . cast :: < RawTransferMetadata > ( ) ;
262+ // SAFETY: `Allocator` was created by `FixedSizeAllocator` which reserved space after `end_ptr`
263+ // for a `RawTransferMetadata`. `end_ptr` is aligned for `FixedSizeAllocator`.
264+ unsafe { metadata_ptr. write ( metadata) } ;
265+
266+ // Pass AST and rule IDs to JS
251267 let result = ( external_linter. run ) (
252268 path. to_str ( ) . unwrap ( ) . to_string ( ) ,
253269 external_rules. iter ( ) . map ( |( rule_id, _) | rule_id. raw ( ) ) . collect ( ) ,
270+ allocator,
254271 ) ;
255272 match result {
256273 Ok ( diagnostics) => {
@@ -304,10 +321,9 @@ struct RawTransferMetadata2 {
304321use RawTransferMetadata2 as RawTransferMetadata ;
305322
306323#[ cfg( all( feature = "oxlint2" , not( feature = "disable_oxlint2" ) ) ) ]
307- #[ expect( dead_code) ]
308324impl RawTransferMetadata {
309- pub fn new ( data_offset : u32 , is_ts : bool ) -> Self {
310- Self { data_offset, is_ts, source_len : 0 , _padding : 0 }
325+ pub fn new ( data_offset : u32 , source_len : u32 ) -> Self {
326+ Self { data_offset, is_ts : false , source_len, _padding : 0 }
311327 }
312328}
313329
0 commit comments