Skip to content

Commit a2045d4

Browse files
more extractor methods, extract from files with parallelism
1 parent 1c1b4da commit a2045d4

File tree

21 files changed

+2339
-373
lines changed

21 files changed

+2339
-373
lines changed

Cargo.lock

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

Cargo.toml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,3 +17,6 @@ lto = false
1717
opt-level = "s"
1818
# Optimize for performance, this is default so you don't need to specify it
1919
# opt-level = "z"
20+
21+
[workspace.dependencies]
22+
swc_core = { version = "56.0.0", default-features = false }

crates/lingui_extractor/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
mod message_extractor;
22
mod message_extractor_visitor;
33

4-
pub use message_extractor::extract_messages;
4+
pub use message_extractor::{extract_messages, ExtractorOptions};
55
pub use message_extractor_visitor::{ExtractedMessage, ExtractionResult};

crates/lingui_extractor/src/message_extractor.rs

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
11
use crate::message_extractor_visitor::{ExtractionResult, MessageExtractorVisitor};
22
use data_encoding::BASE64;
33
use lingui_macro::{LinguiMacroFolder, LinguiOptions};
4+
use serde::{Deserialize, Serialize};
45
use std::sync::Arc;
5-
6-
use swc_sourcemap as sourcemap;
7-
86
use swc_core::common::{Globals, Mark, GLOBALS};
97
use swc_core::ecma::transforms::base::resolver;
108
use swc_core::{
@@ -15,10 +13,11 @@ use swc_core::{
1513
},
1614
ecma::{
1715
ast::*,
18-
parser::{Parser, StringInput, Syntax, TsSyntax},
16+
parser::{Parser, StringInput, Syntax},
1917
visit::VisitWith,
2018
},
2119
};
20+
use swc_sourcemap as sourcemap;
2221

2322
/// Extract inline source map from source code
2423
/// Looks for sourceMappingURL comments with inline base64 data
@@ -54,22 +53,19 @@ fn extract_inline_sourcemap(source_code: &str) -> Option<sourcemap::SourceMap> {
5453
None
5554
}
5655

56+
#[derive(Default, Clone, Serialize, Deserialize, Debug)]
57+
#[serde(rename_all = "camelCase")]
58+
pub struct ExtractorOptions {
59+
pub parser: Syntax,
60+
}
61+
5762
/// Extract messages from source code
5863
pub fn extract_messages(
5964
source_code: &str,
6065
filename: &str,
66+
options: &ExtractorOptions,
6167
) -> Result<ExtractionResult, Box<dyn std::error::Error>> {
62-
// Set up parser with JSX support
63-
let syntax = Syntax::Typescript(TsSyntax {
64-
tsx: true,
65-
..Default::default()
66-
});
67-
68-
// let fm = c.cm.new_source_file(filename.into(), src);
69-
7068
let source_map = Lrc::new(SourceMap::default());
71-
// source_map.new_source_file()
72-
// let source_file = source_map.new_source_file(FileName::Anon, src.into());
7369

7470
let source_file = source_map.new_source_file(
7571
Arc::new(FileName::Custom(filename.to_string())),
@@ -78,7 +74,11 @@ pub fn extract_messages(
7874

7975
let comments = Lrc::new(SingleThreadedComments::default());
8076

81-
let mut parser = Parser::new(syntax, StringInput::from(&*source_file), Some(&comments));
77+
let mut parser = Parser::new(
78+
options.parser,
79+
StringInput::from(&*source_file),
80+
Some(&comments),
81+
);
8282

8383
let module = parser
8484
.parse_module()
@@ -111,7 +111,11 @@ pub fn extract_messages(
111111
let top_level_mark = Mark::new();
112112

113113
program
114-
.apply(&mut resolver(unresolved_mark, top_level_mark, false))
114+
.apply(&mut resolver(
115+
unresolved_mark,
116+
top_level_mark,
117+
options.parser.typescript(),
118+
))
115119
.apply(swc_core::ecma::visit::fold_pass(lingui_macro))
116120
.visit_with(&mut extractor_visitor);
117121
});

crates/lingui_extractor/tests/message_extractor.rs

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,17 @@
1-
use lingui_extractor::extract_messages;
21
use lingui_extractor::ExtractedMessage;
2+
use lingui_extractor::{extract_messages, ExtractorOptions};
33

44
fn extract_and_sort(source_code: &str, filename: &str) -> (Vec<ExtractedMessage>, Vec<String>) {
5-
let result = extract_messages(source_code, filename).expect("Failed to extract messages");
5+
let options = ExtractorOptions {
6+
syntax: Syntax::Typescript(TsSyntax {
7+
tsx: true,
8+
9+
..Default::default()
10+
}),
11+
};
12+
13+
let result =
14+
extract_messages(source_code, filename, &options).expect("Failed to extract messages");
615
(result.messages, result.warnings)
716
}
817

@@ -370,6 +379,7 @@ const msg = /*i18n*/{
370379

371380
use std::fs;
372381
use std::path::{Path, PathBuf};
382+
use swc_core::ecma::parser::{Syntax, TsSyntax};
373383

374384
/// Load fixture file from tests/fixtures/
375385
fn load_fixture(filename: &str) -> String {

crates/lingui_macro/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ serde = "1.0.207"
1313
serde_json = "1.0.125"
1414
regex = "1.10.6"
1515
once_cell = "1.19.0"
16-
swc_core = { version = "56.0.0", features = [
16+
swc_core = { workspace = true, features = [
1717
"ecma_plugin_transform",
1818
"ecma_utils",
1919
"ecma_visit",

napi-rs/Cargo.toml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
21
[package]
32
authors = ["LongYinan <[email protected]>"]
43
edition = "2021"
@@ -12,8 +11,11 @@ crate-type = ["cdylib"]
1211
napi = "3.0.0"
1312
napi-derive = "3.0.0"
1413
lingui_extractor = { path = "../crates/lingui_extractor" }
14+
swc_core = { workspace = true, features = ["base_node", "swc_config"] }
1515
serde = { version = "1.0", features = ["derive"] }
1616
serde_json = "1.0"
17+
anyhow = "1.0.100"
18+
rayon = "1.10"
1719

1820
[build-dependencies]
1921
napi-build = "2"

0 commit comments

Comments
 (0)