Skip to content

Commit

Permalink
Decoupling semantic_handler
Browse files Browse the repository at this point in the history
  • Loading branch information
ityuany committed Dec 24, 2024
1 parent ae711d1 commit 5ce3d92
Show file tree
Hide file tree
Showing 8 changed files with 219 additions and 372 deletions.
1 change: 1 addition & 0 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
"insta",
"instanceof",
"isnan",
"itertools",
"kosaraju",
"msvc",
"musleabihf",
Expand Down
1 change: 1 addition & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 5 additions & 3 deletions crates/binding/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,7 @@ pub async fn check_danger_strings(
pub fn check_module_member_usage(
npm_name_vec: Vec<String>,
args: GlobJsArgs,
) -> Result<Vec<module_member_usage::ModuleMemberUsageResponse>> {
) -> Result<Vec<module_member_usage::response::ModuleMemberUsageResponse>> {
module_member_usage::check_module_member_usage(npm_name_vec, args.into())
.map_err(to_napi_error)
}
Expand All @@ -118,7 +118,7 @@ pub async fn check_filename_case(
}

#[napi]
pub fn check_browser_supported(
pub async fn check_browser_supported(
target: check_browser_supported::Target,
args: utils::GlobJsArgs,
) -> Result<Vec<check_browser_supported::CompatBox>> {
Expand All @@ -127,13 +127,15 @@ pub fn check_browser_supported(
}

#[napi]
pub fn check_browser_supported_with_source_code(
pub async fn check_browser_supported_with_source_code(
target: check_browser_supported::Target,
source_code: String,
file_path: String,
) -> Result<Vec<check_browser_supported::CompatBox>> {
check_browser_supported::check_browser_supported_with_source_code(
target,
source_code,
file_path,
)
.map_err(to_napi_error)
}
Expand Down
114 changes: 50 additions & 64 deletions crates/check_browser_supported/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ mod macros;
mod operators;
mod statements;

use std::path::Path;

use browserslist::{resolve, Distrib, Opts};
pub use compat::{CompatBox, CompatHandler};

Expand All @@ -14,8 +16,11 @@ use log::debug;
use napi::Error;
use napi_derive::napi;

use oxc_allocator::Allocator;
use oxc_parser::Parser;
use oxc_semantic::SemanticBuilder;
use utils::{
glob_by_semantic, GlobErrorHandler, GlobSuccessHandler, SemanticBuilder,
glob_by_semantic, source_type_from_path, GlobErrorHandler, GlobSuccessHandler,
};

fn get_version_list<'a>(
Expand Down Expand Up @@ -51,6 +56,7 @@ pub struct Target {
pub fn check_browser_supported_with_source_code(
target: Target,
source_code: String,
file_path: String,
) -> Result<Vec<CompatBox>> {
debug!("User-specified browser target: {:?}", target);

Expand Down Expand Up @@ -132,40 +138,52 @@ pub fn check_browser_supported_with_source_code(
}
}

let mut used: Vec<CompatBox> = Vec::new();
let allocator = Allocator::default();

let builder = SemanticBuilder::js(&source_code);
let source_type = source_type_from_path(&Path::new(&file_path));

let handler = match builder.build_handler() {
Ok(handler) => handler,
Err(e) => {
eprintln!("parse error: {}", e);
return Err(e);
}
};
let parser = Parser::new(&allocator, &source_code, source_type);

handler.each_node(|handler, node| {
for compat_handler in compat_handlers.iter() {
if compat_handler.handle(
handler.semantic.source_text(),
node,
handler.semantic.nodes(),
) {
let ast_node = beans::AstNode::with_source_and_ast_node(
handler.semantic.source_text(),
node,
);

used.push(CompatBox::new(
ast_node,
compat_handler.get_compat().clone(),
String::new(),
));
}
}
});
let parse = parser.parse();

let program = allocator.alloc(&parse.program);

let semantic_return = SemanticBuilder::new()
.with_check_syntax_error(false)
// TODO 很多场景下是不需要开启的,只有 oxlint 下需要开启,这可能对性能会产生一定的影响
.with_cfg(true)
.build(program);

let nodes = semantic_return.semantic.nodes();

Ok(used)
let nodes = nodes
.iter()
.map(|item| {
return compat_handlers
.iter()
.filter_map(|compat_handler| {
if compat_handler.handle(
semantic_return.semantic.source_text(),
item,
nodes,
) {
let ast_node =
beans::AstNode::with_source_and_ast_node(&source_code, item);
Some(CompatBox::new(
ast_node,
compat_handler.get_compat().clone(),
String::new(),
))
} else {
None
}
})
.collect::<Vec<_>>();
})
.flatten()
.collect::<Vec<_>>();

Ok(nodes)
}

pub fn check_browser_supported(
Expand Down Expand Up @@ -288,39 +306,6 @@ pub fn check_browser_supported(
.flatten()
.collect();

// let responses = glob_by_path(
// |path| {
// let mut used: Vec<CompatBox> = Vec::new();
// let builder = SemanticBuilder::with_file(&path).unwrap();
// let semantic = builder.build().unwrap();
// for node in semantic.nodes().iter() {
// for compat_handler in compat_handlers.iter() {
// if compat_handler.handle(
// semantic.source_text(),
// node,
// semantic.nodes(),
// ) {
// let ast_node = beans::AstNode::with_source_and_ast_node(
// semantic.source_text(),
// node,
// );

// used.push(CompatBox::new(
// ast_node,
// compat_handler.get_compat().clone(),
// path.to_str().unwrap().to_string(),
// ));
// }
// }
// }
// Some(used)
// },
// &args,
// )?
// .into_iter()
// .flatten()
// .collect();

Ok(responses)
}

Expand Down Expand Up @@ -356,6 +341,7 @@ mod tests {
deno: None,
},
source_code,
"test.ts".to_string(),
);

// Assert the result
Expand Down
1 change: 1 addition & 0 deletions crates/module_member_usage/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ oxc_span = { workspace = true }
oxc_ast = { workspace = true }
oxc_semantic = { workspace = true }
oxc_allocator = { workspace = true}
oxc_parser = { workspace = true }
serde = { workspace = true }
parking_lot = { workspace = true }
anyhow = { workspace = true }
Expand Down
51 changes: 25 additions & 26 deletions crates/module_member_usage/src/lib.rs
Original file line number Diff line number Diff line change
@@ -1,39 +1,38 @@
use anyhow::Result;
use handler::ModuleMemberUsageHandler;
use utils::{glob_by_path, SemanticBuilder};
use process::process;
use response::ModuleMemberUsageResponse;
use utils::{glob_by_semantic, GlobArgs};
use utils::{GlobErrorHandler, GlobSuccessHandler};

mod handler;
mod response;
pub use response::ModuleMemberUsageResponse;
mod process;
pub mod response;

pub fn check_module_member_usage(
npm_name_vec: Vec<String>,
args: GlobArgs,
) -> Result<Vec<ModuleMemberUsageResponse>> {
let responses = glob_by_path(
|path| {
let builder = SemanticBuilder::with_file(&path).unwrap();

let handler = match builder.build_handler() {
Ok(handler) => handler,
Err(e) => {
eprintln!("parse error: {}", e);
return None;
}
};

let inline_usages =
ModuleMemberUsageHandler::new(npm_name_vec.clone(), path, handler)
.handle();

Some(inline_usages)
let responses = glob_by_semantic(
|GlobSuccessHandler {
semantic,
relative_path,
..
}| {
let responses = process(&semantic, &npm_name_vec);
Some(ModuleMemberUsageResponse {
file_path: relative_path.clone(),
items: responses,
errors: vec![],
})
},
|GlobErrorHandler { relative_path, .. }| {
Some(ModuleMemberUsageResponse {
file_path: relative_path.clone(),
items: vec![],
errors: vec![],
})
},
&args,
)?
.into_iter()
.flatten()
.collect();
)?;

Ok(responses)
}
Loading

0 comments on commit 5ce3d92

Please sign in to comment.