-
Notifications
You must be signed in to change notification settings - Fork 285
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #2014 from fzyzcjy/feat/12123
Refactor macros information encoding and decoding
- Loading branch information
Showing
29 changed files
with
282 additions
and
228 deletions.
There are no files selected for viewing
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
1 change: 1 addition & 0 deletions
1
frb_codegen/assets/integration_template/REPLACE_ME_RUST_CRATE_DIR/Cargo.lock.template
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
19 changes: 2 additions & 17 deletions
19
frb_codegen/src/library/codegen/parser/hir/hierarchical/mod.rs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,34 +1,19 @@ | ||
use crate::codegen::ir::hir::hierarchical::pack::HirPack; | ||
use crate::codegen::ir::hir::raw::pack::HirRawPack; | ||
use crate::codegen::parser::hir::hierarchical::crates::parse_crate; | ||
use crate::codegen::parser::hir::internal_config::ParserHirInternalConfig; | ||
|
||
pub(crate) mod crates; | ||
pub(crate) mod function; | ||
pub(crate) mod item_type; | ||
pub(crate) mod mirror_ident; | ||
pub(crate) mod module; | ||
mod pub_use; | ||
pub(crate) mod pack; | ||
pub(crate) mod struct_or_enum; | ||
mod third_party_override_transformer; | ||
pub(crate) mod visibility; | ||
|
||
pub(crate) fn parse( | ||
config: &ParserHirInternalConfig, | ||
hir_raw: &HirRawPack, | ||
) -> anyhow::Result<HirPack> { | ||
let pack = parse_raw(config, hir_raw)?; | ||
let pack = third_party_override_transformer::transform(pack)?; | ||
Ok(pack) | ||
} | ||
|
||
fn parse_raw(config: &ParserHirInternalConfig, hir_raw: &HirRawPack) -> anyhow::Result<HirPack> { | ||
let crates = hir_raw | ||
.crates | ||
.iter() | ||
.map(|c| parse_crate(config, &c.syn_file, &c.name)) | ||
.collect::<anyhow::Result<Vec<_>>>()? | ||
.into_iter() | ||
.collect(); | ||
Ok(HirPack { crates }) | ||
pack::parse_pack(config, hir_raw) | ||
} |
40 changes: 40 additions & 0 deletions
40
frb_codegen/src/library/codegen/parser/hir/hierarchical/module/mod.rs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,40 @@ | ||
mod pub_use_transformer; | ||
mod syn_item; | ||
|
||
use crate::codegen::ir::hir::hierarchical::module::{HirModule, HirModuleContent, HirModuleMeta}; | ||
use crate::codegen::parser::hir::hierarchical::function::parse_generalized_functions; | ||
use crate::codegen::parser::hir::internal_config::ParserHirInternalConfig; | ||
|
||
pub(crate) fn parse_module( | ||
items: &[syn::Item], | ||
meta: HirModuleMeta, | ||
config: &ParserHirInternalConfig, | ||
) -> anyhow::Result<HirModule> { | ||
let module = parse_raw(items, meta, config)?; | ||
let module = pub_use_transformer::transform(module, items)?; | ||
Ok(module) | ||
} | ||
|
||
fn parse_raw( | ||
items: &[syn::Item], | ||
meta: HirModuleMeta, | ||
config: &ParserHirInternalConfig, | ||
) -> anyhow::Result<HirModule> { | ||
let mut scope = HirModuleContent { | ||
functions: parse_generalized_functions(items, &meta.namespace)?, | ||
..HirModuleContent::default() | ||
}; | ||
|
||
for item in items.iter() { | ||
syn_item::parse_syn_item(item, &mut scope, config, &meta.namespace, &meta.parent_vis)?; | ||
} | ||
|
||
Ok(HirModule { | ||
meta, | ||
content: scope, | ||
raw: (items.iter()) | ||
.filter(|item| !matches!(item, syn::Item::Mod(_))) | ||
.map(|item| quote::quote!(#item).to_string()) | ||
.collect(), | ||
}) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
39 changes: 2 additions & 37 deletions
39
...codegen/parser/hir/hierarchical/module.rs → ...arser/hir/hierarchical/module/syn_item.rs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
26 changes: 26 additions & 0 deletions
26
frb_codegen/src/library/codegen/parser/hir/hierarchical/pack/mod.rs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,26 @@ | ||
use crate::codegen::ir::hir::hierarchical::pack::HirPack; | ||
use crate::codegen::ir::hir::raw::pack::HirRawPack; | ||
use crate::codegen::parser::hir::hierarchical::crates::parse_crate; | ||
use crate::codegen::parser::hir::internal_config::ParserHirInternalConfig; | ||
|
||
mod third_party_override_transformer; | ||
|
||
pub(crate) fn parse_pack( | ||
config: &ParserHirInternalConfig, | ||
hir_raw: &HirRawPack, | ||
) -> anyhow::Result<HirPack> { | ||
let pack = parse_raw(config, hir_raw)?; | ||
let pack = third_party_override_transformer::transform(pack)?; | ||
Ok(pack) | ||
} | ||
|
||
fn parse_raw(config: &ParserHirInternalConfig, hir_raw: &HirRawPack) -> anyhow::Result<HirPack> { | ||
let crates = hir_raw | ||
.crates | ||
.iter() | ||
.map(|c| parse_crate(config, &c.syn_file, &c.name)) | ||
.collect::<anyhow::Result<Vec<_>>>()? | ||
.into_iter() | ||
.collect(); | ||
Ok(HirPack { crates }) | ||
} |
File renamed without changes.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
100 changes: 50 additions & 50 deletions
100
frb_codegen/src/library/codegen/parser/mir/type_parser/external_impl.rs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,50 +1,50 @@ | ||
use anyhow::Result; | ||
use syn::{parse_str, visit_mut, visit_mut::VisitMut, Path, Type}; | ||
|
||
pub(crate) fn parse_type(mut ty: Type) -> Result<Type> { | ||
struct Visitor; | ||
impl VisitMut for Visitor { | ||
fn visit_path_mut(&mut self, node: &mut Path) { | ||
if node.segments.len() == 1 { | ||
let ident = &node.segments[0].ident; | ||
if let Some(reconstructed_name) = parse_name(&ident.to_string()).unwrap() { | ||
// println!("hi {node:?} {reconstructed_name}"); | ||
*node = parse_str(&reconstructed_name).unwrap(); | ||
} | ||
} | ||
|
||
visit_mut::visit_path_mut(self, node); | ||
} | ||
} | ||
Visitor.visit_type_mut(&mut ty); | ||
Ok(ty) | ||
} | ||
|
||
pub(crate) fn parse_name_or_original(raw_name: &str) -> Result<String> { | ||
Ok(parse_name(raw_name)?.unwrap_or_else(|| raw_name.to_string())) | ||
} | ||
|
||
fn parse_name(raw_name: &str) -> Result<Option<String>> { | ||
const DUMMY_STRUCT_PREFIX: &str = "__external_impl__"; | ||
Ok( | ||
if let Some(stripped_name) = raw_name.strip_prefix(DUMMY_STRUCT_PREFIX) { | ||
Some(String::from_utf8(hex::decode(stripped_name)?)?) | ||
} else { | ||
None | ||
}, | ||
) | ||
} | ||
|
||
#[cfg(test)] | ||
mod tests { | ||
use super::*; | ||
|
||
#[test] | ||
fn test_parse_external_impl_dummy_struct_name() { | ||
assert_eq!(parse_name("One<Two,Three>").unwrap(), None); | ||
assert_eq!( | ||
parse_name("__external_impl__4f6e65203c2054776f2c205468726565203e").unwrap(), | ||
Some("One < Two, Three >".to_owned()), | ||
); | ||
} | ||
} | ||
// use anyhow::Result; | ||
// use syn::{parse_str, visit_mut, visit_mut::VisitMut, Path, Type}; | ||
// | ||
// pub(crate) fn parse_type(mut ty: Type) -> Result<Type> { | ||
// struct Visitor; | ||
// impl VisitMut for Visitor { | ||
// fn visit_path_mut(&mut self, node: &mut Path) { | ||
// if node.segments.len() == 1 { | ||
// let ident = &node.segments[0].ident; | ||
// if let Some(reconstructed_name) = parse_name(&ident.to_string()).unwrap() { | ||
// // println!("hi {node:?} {reconstructed_name}"); | ||
// *node = parse_str(&reconstructed_name).unwrap(); | ||
// } | ||
// } | ||
// | ||
// visit_mut::visit_path_mut(self, node); | ||
// } | ||
// } | ||
// Visitor.visit_type_mut(&mut ty); | ||
// Ok(ty) | ||
// } | ||
// | ||
// pub(crate) fn parse_name_or_original(raw_name: &str) -> Result<String> { | ||
// Ok(parse_name(raw_name)?.unwrap_or_else(|| raw_name.to_string())) | ||
// } | ||
// | ||
// fn parse_name(raw_name: &str) -> Result<Option<String>> { | ||
// const DUMMY_STRUCT_PREFIX: &str = "__external_impl__"; | ||
// Ok( | ||
// if let Some(stripped_name) = raw_name.strip_prefix(DUMMY_STRUCT_PREFIX) { | ||
// Some(String::from_utf8(hex::decode(stripped_name)?)?) | ||
// } else { | ||
// None | ||
// }, | ||
// ) | ||
// } | ||
// | ||
// #[cfg(test)] | ||
// mod tests { | ||
// use super::*; | ||
// | ||
// #[test] | ||
// fn test_parse_external_impl_dummy_struct_name() { | ||
// assert_eq!(parse_name("One<Two,Three>").unwrap(), None); | ||
// assert_eq!( | ||
// parse_name("__external_impl__4f6e65203c2054776f2c205468726565203e").unwrap(), | ||
// Some("One < Two, Three >".to_owned()), | ||
// ); | ||
// } | ||
// } |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.