Skip to content

Commit

Permalink
Merge pull request #2046 from fzyzcjy/feat/12180
Browse files Browse the repository at this point in the history
Support `#[frb(generate_impl_enum)]` ; Fix overriding attributes in third party crates for traits
  • Loading branch information
fzyzcjy committed Jun 8, 2024
2 parents 76cdb39 + e6b38f3 commit bf67b72
Show file tree
Hide file tree
Showing 151 changed files with 34,018 additions and 7,880 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ pub(super) fn compute_rust_path_info(
rust_input_namespace_prefixes: tidy_rust_input_namespace_prefixes(
&rust_input_namespace_prefixes_raw,
),
early_skip_namespace_prefixes: vec![rust_output_path_namespace],
rust_output_path_namespace,
},
rust_output_path,
})
Expand Down
4 changes: 2 additions & 2 deletions frb_codegen/src/library/codegen/dumper/mod.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
use crate::codegen::dumper::internal_config::{ConfigDumpContent, DumperInternalConfig};
use crate::codegen::generator::acc::Acc;
use crate::codegen::generator::misc::path_texts::PathTexts;
use crate::codegen::generator::misc::target::TargetOrCommon;
use crate::codegen::generator::misc::PathTexts;
use crate::utils::file_utils::create_dir_all_and_write;
use crate::utils::path_utils::path_to_string;
use anyhow::Context;
Expand Down Expand Up @@ -50,7 +50,7 @@ impl Dumper<'_> {
&diff_paths(&path_text.path, base_dir).context("cannot diff path")?
)?
),
&path_text.text,
&path_text.text.all_code(),
)?;
}

Expand Down
20 changes: 14 additions & 6 deletions frb_codegen/src/library/codegen/generator/api_dart/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,12 @@ mod text_generator;
use crate::codegen::dumper::internal_config::ConfigDumpContent;
use crate::codegen::dumper::Dumper;
use crate::codegen::generator::api_dart::internal_config::GeneratorApiDartInternalConfig;
use crate::codegen::generator::misc::PathTexts;
use crate::codegen::generator::misc::path_texts::PathTexts;
use crate::codegen::ir::mir::pack::MirPack;
use anyhow::Result;

pub(crate) struct GeneratorApiDartOutput {
pub output_texts: PathTexts,
pub output_extra_impl_text: String,
pub needs_freezed: bool,
}

Expand All @@ -34,7 +33,6 @@ pub(crate) fn generate(

Ok(GeneratorApiDartOutput {
output_texts: text.output_texts,
output_extra_impl_text: text.output_extra_impl_text,
needs_freezed: spec.namespaced_items.values().any(|x| x.needs_freezed),
})
}
Expand All @@ -61,6 +59,7 @@ mod tests {
HashMap::from([
("api.dart", "expect_output.dart"),
("dep.dart", "expect_output2.dart"),
("frb_generated.dart", "expect_output3.dart"),
]),
)
}
Expand All @@ -70,7 +69,10 @@ mod tests {
fn test_functions() -> anyhow::Result<()> {
body(
"library/codegen/generator/api_dart/mod/functions",
HashMap::from([("api.dart", "expect_output.dart")]),
HashMap::from([
("api.dart", "expect_output.dart"),
("frb_generated.dart", "expect_output2.dart"),
]),
)
}

Expand All @@ -93,11 +95,17 @@ mod tests {
)?;

let output_texts = actual.output_texts;
assert_eq!(output_texts.0.len(), expect_outputs.len());
assert_eq!(
output_texts.0.len(),
expect_outputs.len(),
"output_texts={output_texts:?}"
);
for path_text in output_texts.0 {
let path = path_text.path.file_name().unwrap().to_str().unwrap();
let expect_output = expect_outputs.get(path).unwrap();
let raw_text = (path_text.text).replace(env!("CARGO_PKG_VERSION"), "{VERSION}");
let raw_text = (path_text.text)
.all_code()
.replace(env!("CARGO_PKG_VERSION"), "{VERSION}");
text_golden_test(raw_text, &test_fixture_dir.join(expect_output))?;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ use crate::codegen::ir::mir::func::{
};
use crate::if_then_some;
use crate::library::codegen::generator::api_dart::spec_generator::base::*;
use crate::utils::basic_code::DartBasicHeaderCode;
use crate::utils::basic_code::dart_header_code::DartHeaderCode;
use crate::utils::namespace::NamespacedName;
use convert_case::{Case, Casing};
use itertools::Itertools;
Expand Down Expand Up @@ -44,12 +44,12 @@ pub(crate) enum GenerateApiMethodMode {
pub(crate) struct GeneratedApiMethods {
pub(crate) num_methods: usize,
pub(crate) code: String,
pub(crate) header: DartBasicHeaderCode,
pub(crate) header: DartHeaderCode,
}

struct GeneratedApiMethod {
code: String,
header: DartBasicHeaderCode,
header: DartHeaderCode,
}

pub(crate) fn generate_api_methods(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
use crate::utils::basic_code::DartBasicHeaderCode;
use crate::utils::basic_code::dart_header_code::DartHeaderCode;
use crate::utils::namespace::Namespace;
use serde::Serialize;

Expand All @@ -9,7 +9,7 @@ pub(crate) mod ty;

#[derive(Debug, Serialize)]
pub(crate) struct ApiDartGeneratedClass {
pub(crate) header: DartBasicHeaderCode,
pub(crate) header: DartHeaderCode,
pub(crate) namespace: Namespace,
pub(crate) class_name: String,
pub(crate) code: String,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ use crate::codegen::ir::mir::ty::delegate::{
};
use crate::library::codegen::generator::api_dart::spec_generator::base::*;
use crate::library::codegen::generator::api_dart::spec_generator::info::ApiDartGeneratorInfoTrait;
use crate::utils::basic_code::DartBasicHeaderCode;
use crate::utils::basic_code::dart_header_code::DartHeaderCode;

impl<'a> ApiDartGeneratorClassTrait for DelegateApiDartGenerator<'a> {
fn generate_class(&self) -> Option<ApiDartGeneratedClass> {
Expand Down Expand Up @@ -40,7 +40,7 @@ fn generate_array(
};

Some(ApiDartGeneratedClass {
header: DartBasicHeaderCode {
header: DartHeaderCode {
import: "import 'package:collection/collection.dart';\n".to_owned(),
..Default::default()
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ use crate::codegen::ir::mir::ty::enumeration::{MirEnum, MirEnumVariant, MirVaria
use crate::codegen::ir::mir::ty::structure::MirStruct;
use crate::library::codegen::generator::api_dart::spec_generator::base::*;
use crate::library::codegen::generator::api_dart::spec_generator::info::ApiDartGeneratorInfoTrait;
use crate::utils::basic_code::DartBasicHeaderCode;
use crate::utils::basic_code::dart_header_code::DartHeaderCode;
use itertools::Itertools;

const BACKTRACE_IDENT: &str = "backtrace";
Expand All @@ -20,7 +20,7 @@ impl<'a> EnumRefApiDartGenerator<'a> {
&self,
src: &MirEnum,
extra_body: &str,
header: DartBasicHeaderCode,
header: DartHeaderCode,
) -> Option<ApiDartGeneratedClass> {
let variants = src
.variants()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ use crate::codegen::generator::api_dart::spec_generator::class::ApiDartGenerated
use crate::codegen::generator::api_dart::spec_generator::misc::generate_dart_comments;
use crate::codegen::ir::mir::ty::enumeration::{MirEnum, MirEnumVariant};
use crate::library::codegen::generator::api_dart::spec_generator::base::*;
use crate::utils::basic_code::DartBasicHeaderCode;
use crate::utils::basic_code::dart_header_code::DartHeaderCode;
use crate::utils::dart_keywords::make_string_keyword_safe;
use itertools::Itertools;

Expand All @@ -11,7 +11,7 @@ impl<'a> EnumRefApiDartGenerator<'a> {
&self,
src: &MirEnum,
extra_body: &str,
header: DartBasicHeaderCode,
header: DartHeaderCode,
) -> Option<ApiDartGeneratedClass> {
let comments = generate_dart_comments(&src.comments);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ use crate::codegen::ir::mir::ty::MirType;
use crate::library::codegen::generator::api_dart::spec_generator::base::*;
use crate::library::codegen::generator::api_dart::spec_generator::info::ApiDartGeneratorInfoTrait;
use crate::library::codegen::ir::mir::ty::MirTypeTrait;
use crate::utils::basic_code::DartBasicHeaderCode;
use crate::utils::basic_code::dart_header_code::DartHeaderCode;
use crate::utils::namespace::NamespacedName;
use itertools::Itertools;
use lazy_static::lazy_static;
Expand Down Expand Up @@ -143,7 +143,7 @@ fn generate_maybe_impls(
all_trait_impls: &[MirTraitImpl],
self_type: &MirTypeRustOpaque,
context: ApiDartGeneratorContext,
) -> (String, DartBasicHeaderCode) {
) -> (String, DartHeaderCode) {
let interest_trait_impls = all_trait_impls
.iter()
.filter(|x| {
Expand Down Expand Up @@ -174,7 +174,7 @@ fn generate_maybe_impls(

(
code,
DartBasicHeaderCode {
DartHeaderCode {
import,
..Default::default()
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,15 +11,15 @@ use crate::codegen::ir::mir::ty::delegate::{MirTypeDelegate, MirTypeDelegateStre
use crate::codegen::ir::mir::ty::MirType;
use crate::if_then_some;
use crate::library::codegen::generator::api_dart::spec_generator::info::ApiDartGeneratorInfoTrait;
use crate::utils::basic_code::DartBasicHeaderCode;
use crate::utils::basic_code::dart_header_code::DartHeaderCode;
use crate::utils::namespace::Namespace;
use itertools::Itertools;
use serde::Serialize;

#[derive(Debug, Serialize)]
pub(crate) struct ApiDartGeneratedFunction {
pub(crate) namespace: Namespace,
pub(crate) header: DartBasicHeaderCode,
pub(crate) header: DartHeaderCode,
pub(crate) func_comments: String,
pub(crate) func_expr: String,
pub(crate) func_impl: String,
Expand Down Expand Up @@ -191,8 +191,8 @@ fn generate_func_impl(
fn generate_header(
func: &MirFunc,
context: ApiDartGeneratorContext,
) -> anyhow::Result<DartBasicHeaderCode> {
Ok(DartBasicHeaderCode {
) -> anyhow::Result<DartHeaderCode> {
Ok(DartHeaderCode {
import: generate_imports_which_types_and_funcs_use(
&func.name.namespace.clone(),
&None,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ use crate::codegen::ir::mir::ty::MirType;
use crate::codegen::ConfigDumpContent;
use crate::library::codegen::generator::api_dart::spec_generator::class::ty::ApiDartGeneratorClassTrait;
use crate::library::codegen::ir::mir::ty::MirTypeTrait;
use crate::utils::basic_code::DartBasicHeaderCode;
use crate::utils::basic_code::dart_header_code::DartHeaderCode;
use crate::utils::namespace::Namespace;
use anyhow::Result;
use itertools::{concat, Itertools};
Expand All @@ -41,7 +41,7 @@ pub(crate) struct ApiDartOutputSpecItem {
pub funcs: Vec<ApiDartGeneratedFunction>,
pub classes: Vec<ApiDartGeneratedClass>,
pub extra_impl_code: Vec<String>,
pub imports: DartBasicHeaderCode,
pub imports: DartHeaderCode,
pub preamble: String,
pub skips: Vec<MirSkip>,
pub needs_freezed: bool,
Expand Down Expand Up @@ -100,7 +100,7 @@ fn generate_item(
funcs: &Option<&Vec<&MirFunc>>,
context: ApiDartGeneratorContext,
) -> Result<ApiDartOutputSpecItem> {
let imports = DartBasicHeaderCode {
let imports = DartHeaderCode {
import: generate_imports_which_types_and_funcs_use(
namespace,
namespaced_types,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,18 +4,19 @@ use crate::codegen::generator::api_dart::spec_generator::function::ApiDartGenera
use crate::codegen::generator::api_dart::spec_generator::{
ApiDartOutputSpec, ApiDartOutputSpecItem,
};
use crate::codegen::generator::misc::generate_code_header;
use crate::codegen::generator::misc::path_texts::{PathText, PathTexts};
use crate::codegen::generator::misc::target::TargetOrCommonMap;
use crate::codegen::generator::misc::{generate_code_header, PathText, PathTexts};
use crate::utils::basic_code::DartBasicHeaderCode;
use crate::utils::basic_code::dart_header_code::DartHeaderCode;
use crate::utils::basic_code::general_code::{GeneralCode, GeneralDartCode};
use crate::utils::path_utils::path_to_string;
use anyhow::Context;
use itertools::Itertools;
use itertools::{concat, Itertools};
use pathdiff::diff_paths;
use std::path::{Path, PathBuf};

pub(super) struct ApiDartOutputText {
pub(super) output_texts: PathTexts,
pub(super) output_extra_impl_text: String,
}

pub(super) fn generate(
Expand All @@ -26,37 +27,37 @@ pub(super) fn generate(
// Namespace::compute_common_prefix(&spec.namespaced_items.keys().collect_vec());
// debug!("common_namespace_prefix={common_namespace_prefix:?}");

let path_texts = PathTexts(
spec.namespaced_items
.iter()
.map(|(namespace, item)| {
let dart_output_path =
compute_path_from_namespace(&config.dart_decl_base_output_path, namespace);
let text =
generate_end_api_text(&dart_output_path, &config.dart_impl_output_path, item)?;
Ok(PathText::new(dart_output_path, text))
})
.collect::<anyhow::Result<Vec<_>>>()?,
);

let extra_impl_text = spec
.namespaced_items
.values()
.flat_map(|item| item.extra_impl_code.clone())
.sorted()
.join("");
let normal_output_texts = (spec.namespaced_items.iter())
.map(|(namespace, item)| {
let dart_output_path =
compute_path_from_namespace(&config.dart_decl_base_output_path, namespace);
let text =
generate_end_api_text(&dart_output_path, &config.dart_impl_output_path, item)?;
Ok(PathText::new(dart_output_path, text))
})
.collect::<anyhow::Result<Vec<_>>>()?;

let extra_output_text = PathText {
path: config.dart_impl_output_path.common.clone(),
text: GeneralCode::Dart(GeneralDartCode {
body: (spec.namespaced_items.values())
.flat_map(|item| item.extra_impl_code.clone())
.sorted()
.join(""),
header: Default::default(),
}),
};

Ok(ApiDartOutputText {
output_texts: path_texts,
output_extra_impl_text: extra_impl_text,
output_texts: PathTexts(concat([normal_output_texts, vec![extra_output_text]])),
})
}

fn generate_end_api_text(
dart_output_path: &Path,
dart_impl_output_path: &TargetOrCommonMap<PathBuf>,
item: &ApiDartOutputSpecItem,
) -> anyhow::Result<String> {
) -> anyhow::Result<GeneralCode> {
let funcs = item
.funcs
.iter()
Expand All @@ -73,7 +74,7 @@ fn generate_end_api_text(
let path_frb_generated = path_to_string(&path_frb_generated)?.replace('\\', "/");

let preamble = &item.preamble.as_str();
let mut header = DartBasicHeaderCode {
let mut header = DartHeaderCode {
file_top: generate_code_header()
+ if !preamble.is_empty() {"\n\n"} else {""} + preamble
+ "\n\n// ignore_for_file: invalid_use_of_internal_member, unused_import, unnecessary_import\n",
Expand All @@ -87,7 +88,7 @@ fn generate_end_api_text(
};

if item.needs_freezed {
header += DartBasicHeaderCode {
header += DartHeaderCode {
import: "import 'package:freezed_annotation/freezed_annotation.dart' hide protected;"
.into(),
part: format!(
Expand All @@ -107,21 +108,20 @@ fn generate_end_api_text(
header += c.header.clone();
}

let header = header.all_code();

let skips = compute_skips(item);

Ok(format!(
"
{header}
{skips}
Ok(GeneralCode::Dart(GeneralDartCode {
header,
body: format!(
"
{skips}
{funcs}
{funcs}
{classes}
",
))
{classes}
",
),
}))
}

fn compute_skips(item: &ApiDartOutputSpecItem) -> String {
Expand Down
Loading

0 comments on commit bf67b72

Please sign in to comment.