Skip to content

Commit 5708b1c

Browse files
committed
feat(napi/parer): add get_line_column_number API
1 parent 016ae92 commit 5708b1c

5 files changed

Lines changed: 38 additions & 1 deletion

File tree

Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

napi/parser/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ doctest = false
2323
[dependencies]
2424
oxc = { workspace = true }
2525
oxc_ast = { workspace = true, features = ["serialize"] } # enable feature only
26+
oxc_data_structures = { workspace = true }
2627
oxc_napi = { workspace = true }
2728

2829
rustc-hash = { workspace = true }

napi/parser/index.d.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,10 @@
33

44
export * from '@oxc-project/types';
55
export declare class MagicString {
6+
/** Get source text from utf8 offset. */
67
getSourceText(start: number, end: number): string
8+
/** Get 0-based line and column number from utf8 offset. */
9+
getLineColumnNumber(offset: number): LineColumn
710
length(): number
811
toString(): string
912
append(input: string): this
@@ -131,6 +134,11 @@ export declare const enum ImportNameKind {
131134
Default = 'Default'
132135
}
133136

137+
export interface LineColumn {
138+
line: number
139+
column: number
140+
}
141+
134142
export interface OverwriteOptions {
135143
contentOnly: boolean
136144
}

napi/parser/src/magic_string.rs

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// use std::sync::Arc;
33

44
use napi_derive::napi;
5+
use oxc_data_structures::rope::{get_line_column, Rope};
56

67
// use oxc_sourcemap::napi::SourceMap;
78
use self_cell::self_cell;
@@ -10,6 +11,7 @@ use string_wizard::MagicString as MS;
1011
#[napi]
1112
pub struct MagicString {
1213
cell: MagicStringImpl,
14+
rope: Option<Rope>,
1315
}
1416

1517
self_cell!(
@@ -22,10 +24,19 @@ self_cell!(
2224

2325
impl MagicString {
2426
pub fn new(source_text: String) -> Self {
25-
Self { cell: MagicStringImpl::new(source_text, |s| string_wizard::MagicString::new(s)) }
27+
Self {
28+
cell: MagicStringImpl::new(source_text, |s| string_wizard::MagicString::new(s)),
29+
rope: None,
30+
}
2631
}
2732
}
2833

34+
#[napi(object)]
35+
pub struct LineColumn {
36+
pub line: u32,
37+
pub column: u32,
38+
}
39+
2940
#[napi(object)]
3041
pub struct OverwriteOptions {
3142
pub content_only: bool,
@@ -40,11 +51,21 @@ pub struct SourceMapOptions {
4051

4152
#[napi]
4253
impl MagicString {
54+
/// Get source text from utf8 offset.
4355
#[napi]
4456
pub fn get_source_text(&self, start: u32, end: u32) -> &str {
4557
&self.cell.borrow_owner()[start as usize..end as usize]
4658
}
4759

60+
/// Get 0-based line and column number from utf8 offset.
61+
#[napi]
62+
pub fn get_line_column_number(&mut self, offset: u32) -> LineColumn {
63+
let source_text = self.cell.borrow_owner();
64+
let rope = self.rope.get_or_insert_with(|| Rope::from_str(source_text));
65+
let (line, column) = get_line_column(rope, offset, source_text);
66+
LineColumn { line, column }
67+
}
68+
4869
#[napi]
4970
pub fn length(&self) -> u32 {
5071
self.cell.borrow_dependent().len() as u32

napi/parser/test/magic_string.test.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,12 @@ describe('simple', () => {
1919
// Access source text by utf8 offset.
2020
expect(ms.getSourceText(start, end)).toEqual('测试');
2121

22+
// Access line and column number from utf8 offset.
23+
expect(ms.getLineColumnNumber(start)).toStrictEqual({
24+
line: 0,
25+
column: 19,
26+
});
27+
2228
// Magic string manipulation.
2329
ms.remove(start, end).append(';');
2430
expect(ms.toString()).toEqual('const s: String = "";');

0 commit comments

Comments
 (0)