Skip to content

Commit

Permalink
Merge pull request #1879 from fzyzcjy/feat/1870
Browse files Browse the repository at this point in the history
Support instance and static methods for enums without fields
  • Loading branch information
fzyzcjy committed Apr 15, 2024
2 parents c098168 + f7c3b3b commit d6fc16d
Show file tree
Hide file tree
Showing 72 changed files with 3,966 additions and 1,877 deletions.
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
use crate::codegen::generator::api_dart::spec_generator::class::method::generate_api_methods;
use crate::codegen::generator::api_dart::spec_generator::class::misc::generate_class_extra_body;
use crate::codegen::generator::api_dart::spec_generator::class::ty::ApiDartGeneratorClassTrait;
use crate::codegen::generator::api_dart::spec_generator::class::ApiDartGeneratedClass;
use crate::codegen::ir::ty::enumeration::IrEnumMode;
Expand All @@ -6,9 +8,16 @@ use crate::library::codegen::generator::api_dart::spec_generator::base::*;
impl<'a> ApiDartGeneratorClassTrait for EnumRefApiDartGenerator<'a> {
fn generate_class(&self) -> Option<ApiDartGeneratedClass> {
let src = self.ir.get(self.context.ir_pack);

let methods_str = generate_api_methods(&src.name, self.context).join("\n");
let extra_body =
generate_class_extra_body(self.ir_type(), &self.context.ir_pack.dart_code_of_type);

let body = methods_str + &extra_body;

match src.mode {
IrEnumMode::Simple => self.generate_mode_simple(src),
IrEnumMode::Complex => self.generate_mode_complex(src),
IrEnumMode::Simple => self.generate_mode_simple(src, &body),
IrEnumMode::Complex => self.generate_mode_complex(src, &body),
}
}
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
use crate::codegen::generator::api_dart::spec_generator::class::field::{
generate_field_default, generate_field_required_modifier,
};
use crate::codegen::generator::api_dart::spec_generator::class::method::generate_api_methods;
use crate::codegen::generator::api_dart::spec_generator::class::misc::generate_class_extra_body;
use crate::codegen::generator::api_dart::spec_generator::class::ApiDartGeneratedClass;
use crate::codegen::generator::api_dart::spec_generator::misc::{
generate_dart_comments, generate_dart_maybe_implements_exception,
Expand All @@ -17,7 +15,11 @@ use itertools::Itertools;
const BACKTRACE_IDENT: &str = "backtrace";

impl<'a> EnumRefApiDartGenerator<'a> {
pub(crate) fn generate_mode_complex(&self, src: &IrEnum) -> Option<ApiDartGeneratedClass> {
pub(crate) fn generate_mode_complex(
&self,
src: &IrEnum,
extra_body: &str,
) -> Option<ApiDartGeneratedClass> {
let variants = src
.variants()
.iter()
Expand All @@ -33,10 +35,6 @@ impl<'a> EnumRefApiDartGenerator<'a> {
let maybe_implements_exception =
generate_dart_maybe_implements_exception(self.ir.is_exception);

let methods_str = generate_api_methods(&src.name, self.context).join("\n");
let extra_body =
generate_class_extra_body(self.ir_type(), &self.context.ir_pack.dart_code_of_type);

Some(ApiDartGeneratedClass {
namespace: src.name.namespace.clone(),
class_name: name.clone(),
Expand All @@ -47,7 +45,6 @@ impl<'a> EnumRefApiDartGenerator<'a> {
{variants}
{methods_str}
{extra_body}
}}",
),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,11 @@ use crate::utils::dart_keywords::make_string_keyword_safe;
use itertools::Itertools;

impl<'a> EnumRefApiDartGenerator<'a> {
pub(crate) fn generate_mode_simple(&self, src: &IrEnum) -> Option<ApiDartGeneratedClass> {
pub(crate) fn generate_mode_simple(
&self,
src: &IrEnum,
extra_body: &str,
) -> Option<ApiDartGeneratedClass> {
let comments = generate_dart_comments(&src.comments);

let variants = src
Expand All @@ -24,6 +28,8 @@ impl<'a> EnumRefApiDartGenerator<'a> {
code: format!(
"{comments}enum {name} {{
{variants}
;
{extra_body}
}}",
),
needs_freezed: false,
Expand Down
28 changes: 28 additions & 0 deletions frb_example/pure_dart/frb_generated.h
Original file line number Diff line number Diff line change
Expand Up @@ -3681,6 +3681,9 @@ void frbgen_frb_example_pure_dart_wire_simple_enum_twin_normal_return_self_twin_
void frbgen_frb_example_pure_dart_wire_simple_enum_twin_normal_simple_method_twin_normal(int64_t port_,
struct wire_cst_simple_enum_twin_normal *that);

void frbgen_frb_example_pure_dart_wire_simple_primitive_enum_twin_normal_simple_method_twin_normal(int64_t port_,
int32_t that);

void frbgen_frb_example_pure_dart_wire_simple_struct_twin_normal_arg_self_twin_normal(int64_t port_,
struct wire_cst_simple_struct_twin_normal *a,
struct wire_cst_simple_struct_twin_normal *b);
Expand Down Expand Up @@ -7847,6 +7850,9 @@ void frbgen_frb_example_pure_dart_wire_simple_enum_twin_rust_async_return_self_t
void frbgen_frb_example_pure_dart_wire_simple_enum_twin_rust_async_simple_method_twin_rust_async(int64_t port_,
struct wire_cst_simple_enum_twin_rust_async *that);

void frbgen_frb_example_pure_dart_wire_simple_primitive_enum_twin_rust_async_simple_method_twin_rust_async(int64_t port_,
int32_t that);

void frbgen_frb_example_pure_dart_wire_simple_struct_twin_rust_async_arg_self_twin_rust_async(int64_t port_,
struct wire_cst_simple_struct_twin_rust_async *a,
struct wire_cst_simple_struct_twin_rust_async *b);
Expand Down Expand Up @@ -7941,6 +7947,11 @@ void frbgen_frb_example_pure_dart_wire_simple_enum_twin_rust_async_sse_simple_me
int32_t rust_vec_len_,
int32_t data_len_);

void frbgen_frb_example_pure_dart_wire_simple_primitive_enum_twin_rust_async_sse_simple_method_twin_rust_async_sse(int64_t port_,
uint8_t *ptr_,
int32_t rust_vec_len_,
int32_t data_len_);

void frbgen_frb_example_pure_dart_wire_simple_struct_twin_rust_async_sse_arg_self_twin_rust_async_sse(int64_t port_,
uint8_t *ptr_,
int32_t rust_vec_len_,
Expand Down Expand Up @@ -8046,6 +8057,11 @@ void frbgen_frb_example_pure_dart_wire_simple_enum_twin_sse_simple_method_twin_s
int32_t rust_vec_len_,
int32_t data_len_);

void frbgen_frb_example_pure_dart_wire_simple_primitive_enum_twin_sse_simple_method_twin_sse(int64_t port_,
uint8_t *ptr_,
int32_t rust_vec_len_,
int32_t data_len_);

void frbgen_frb_example_pure_dart_wire_simple_struct_twin_sse_arg_self_twin_sse(int64_t port_,
uint8_t *ptr_,
int32_t rust_vec_len_,
Expand Down Expand Up @@ -8120,6 +8136,8 @@ WireSyncRust2DartDco frbgen_frb_example_pure_dart_wire_simple_enum_twin_sync_ret

WireSyncRust2DartDco frbgen_frb_example_pure_dart_wire_simple_enum_twin_sync_simple_method_twin_sync(struct wire_cst_simple_enum_twin_sync *that);

WireSyncRust2DartDco frbgen_frb_example_pure_dart_wire_simple_primitive_enum_twin_sync_simple_method_twin_sync(int32_t that);

WireSyncRust2DartDco frbgen_frb_example_pure_dart_wire_simple_struct_twin_sync_arg_self_twin_sync(struct wire_cst_simple_struct_twin_sync *a,
struct wire_cst_simple_struct_twin_sync *b);

Expand Down Expand Up @@ -8193,6 +8211,10 @@ WireSyncRust2DartSse frbgen_frb_example_pure_dart_wire_simple_enum_twin_sync_sse
int32_t rust_vec_len_,
int32_t data_len_);

WireSyncRust2DartSse frbgen_frb_example_pure_dart_wire_simple_primitive_enum_twin_sync_sse_simple_method_twin_sync_sse(uint8_t *ptr_,
int32_t rust_vec_len_,
int32_t data_len_);

WireSyncRust2DartSse frbgen_frb_example_pure_dart_wire_simple_struct_twin_sync_sse_arg_self_twin_sync_sse(uint8_t *ptr_,
int32_t rust_vec_len_,
int32_t data_len_);
Expand Down Expand Up @@ -17186,6 +17208,12 @@ static int64_t dummy_method_to_enforce_bundling(void) {
dummy_var ^= ((int64_t) (void*) frbgen_frb_example_pure_dart_wire_simple_enum_twin_sync_simple_method_twin_sync);
dummy_var ^= ((int64_t) (void*) frbgen_frb_example_pure_dart_wire_simple_enum_twin_sync_sse_return_self_twin_sync_sse);
dummy_var ^= ((int64_t) (void*) frbgen_frb_example_pure_dart_wire_simple_enum_twin_sync_sse_simple_method_twin_sync_sse);
dummy_var ^= ((int64_t) (void*) frbgen_frb_example_pure_dart_wire_simple_primitive_enum_twin_normal_simple_method_twin_normal);
dummy_var ^= ((int64_t) (void*) frbgen_frb_example_pure_dart_wire_simple_primitive_enum_twin_rust_async_simple_method_twin_rust_async);
dummy_var ^= ((int64_t) (void*) frbgen_frb_example_pure_dart_wire_simple_primitive_enum_twin_rust_async_sse_simple_method_twin_rust_async_sse);
dummy_var ^= ((int64_t) (void*) frbgen_frb_example_pure_dart_wire_simple_primitive_enum_twin_sse_simple_method_twin_sse);
dummy_var ^= ((int64_t) (void*) frbgen_frb_example_pure_dart_wire_simple_primitive_enum_twin_sync_simple_method_twin_sync);
dummy_var ^= ((int64_t) (void*) frbgen_frb_example_pure_dart_wire_simple_primitive_enum_twin_sync_sse_simple_method_twin_sync_sse);
dummy_var ^= ((int64_t) (void*) frbgen_frb_example_pure_dart_wire_simple_struct_twin_normal_arg_self_twin_normal);
dummy_var ^= ((int64_t) (void*) frbgen_frb_example_pure_dart_wire_simple_struct_twin_normal_receiver_borrow_twin_normal);
dummy_var ^= ((int64_t) (void*) frbgen_frb_example_pure_dart_wire_simple_struct_twin_normal_receiver_own_twin_normal);
Expand Down
2 changes: 2 additions & 0 deletions frb_example/pure_dart/lib/src/rust/api/enumeration.dart
Original file line number Diff line number Diff line change
Expand Up @@ -64,11 +64,13 @@ sealed class DistanceTwinNormal with _$DistanceTwinNormal {
enum EnumSimpleTwinNormal {
a,
b,
;
}

enum EnumWithDiscriminantTwinNormal {
oneHundred,
fifty,
;
}

@freezed
Expand Down
10 changes: 10 additions & 0 deletions frb_example/pure_dart/lib/src/rust/api/method.dart
Original file line number Diff line number Diff line change
Expand Up @@ -159,6 +159,16 @@ sealed class SimpleEnumTwinNormal with _$SimpleEnumTwinNormal {
.simpleEnumTwinNormalSimpleMethodTwinNormal(that: this, hint: hint);
}

enum SimplePrimitiveEnumTwinNormal {
first,
second,
;

Future<int> simpleMethodTwinNormal({dynamic hint}) =>
RustLib.instance.api.simplePrimitiveEnumTwinNormalSimpleMethodTwinNormal(
that: this, hint: hint);
}

class SimpleStructTwinNormal {
final String one;

Expand Down
1 change: 1 addition & 0 deletions frb_example/pure_dart/lib/src/rust/api/misc_example.dart
Original file line number Diff line number Diff line change
Expand Up @@ -214,4 +214,5 @@ enum WeekdaysTwinNormal {
friday,
saturday,
sunday,
;
}
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,7 @@ sealed class BasicGeneralEnumTwinNormal with _$BasicGeneralEnumTwinNormal {
enum BasicPrimitiveEnumTwinNormal {
apple,
orange,
;
}

class BasicStructTwinNormal {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,7 @@ sealed class BasicGeneralEnumTwinRustAsync
enum BasicPrimitiveEnumTwinRustAsync {
apple,
orange,
;
}

class BasicStructTwinRustAsync {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,7 @@ sealed class BasicGeneralEnumTwinRustAsyncSse
enum BasicPrimitiveEnumTwinRustAsyncSse {
apple,
orange,
;
}

class BasicStructTwinRustAsyncSse {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,7 @@ sealed class BasicGeneralEnumTwinSse with _$BasicGeneralEnumTwinSse {
enum BasicPrimitiveEnumTwinSse {
apple,
orange,
;
}

class BasicStructTwinSse {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,7 @@ sealed class BasicGeneralEnumTwinSync with _$BasicGeneralEnumTwinSync {
enum BasicPrimitiveEnumTwinSync {
apple,
orange,
;
}

class BasicStructTwinSync {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,7 @@ sealed class BasicGeneralEnumTwinSyncSse with _$BasicGeneralEnumTwinSyncSse {
enum BasicPrimitiveEnumTwinSyncSse {
apple,
orange,
;
}

class BasicStructTwinSyncSse {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -69,11 +69,13 @@ sealed class DistanceTwinRustAsync with _$DistanceTwinRustAsync {
enum EnumSimpleTwinRustAsync {
a,
b,
;
}

enum EnumWithDiscriminantTwinRustAsync {
oneHundred,
fifty,
;
}

@freezed
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -73,11 +73,13 @@ sealed class DistanceTwinRustAsyncSse with _$DistanceTwinRustAsyncSse {
enum EnumSimpleTwinRustAsyncSse {
a,
b,
;
}

enum EnumWithDiscriminantTwinRustAsyncSse {
oneHundred,
fifty,
;
}

@freezed
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,11 +62,13 @@ sealed class DistanceTwinSse with _$DistanceTwinSse {
enum EnumSimpleTwinSse {
a,
b,
;
}

enum EnumWithDiscriminantTwinSse {
oneHundred,
fifty,
;
}

@freezed
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,11 +62,13 @@ sealed class DistanceTwinSync with _$DistanceTwinSync {
enum EnumSimpleTwinSync {
a,
b,
;
}

enum EnumWithDiscriminantTwinSync {
oneHundred,
fifty,
;
}

@freezed
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -64,11 +64,13 @@ sealed class DistanceTwinSyncSse with _$DistanceTwinSyncSse {
enum EnumSimpleTwinSyncSse {
a,
b,
;
}

enum EnumWithDiscriminantTwinSyncSse {
oneHundred,
fifty,
;
}

@freezed
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -161,6 +161,16 @@ sealed class SimpleEnumTwinRustAsync with _$SimpleEnumTwinRustAsync {
.simpleEnumTwinRustAsyncSimpleMethodTwinRustAsync(that: this, hint: hint);
}

enum SimplePrimitiveEnumTwinRustAsync {
first,
second,
;

Future<int> simpleMethodTwinRustAsync({dynamic hint}) => RustLib.instance.api
.simplePrimitiveEnumTwinRustAsyncSimpleMethodTwinRustAsync(
that: this, hint: hint);
}

class SimpleStructTwinRustAsync {
final String one;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -167,6 +167,17 @@ sealed class SimpleEnumTwinRustAsyncSse with _$SimpleEnumTwinRustAsyncSse {
that: this, hint: hint);
}

enum SimplePrimitiveEnumTwinRustAsyncSse {
first,
second,
;

Future<int> simpleMethodTwinRustAsyncSse({dynamic hint}) =>
RustLib.instance.api
.simplePrimitiveEnumTwinRustAsyncSseSimpleMethodTwinRustAsyncSse(
that: this, hint: hint);
}

class SimpleStructTwinRustAsyncSse {
final String one;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -156,6 +156,15 @@ sealed class SimpleEnumTwinSse with _$SimpleEnumTwinSse {
.simpleEnumTwinSseSimpleMethodTwinSse(that: this, hint: hint);
}

enum SimplePrimitiveEnumTwinSse {
first,
second,
;

Future<int> simpleMethodTwinSse({dynamic hint}) => RustLib.instance.api
.simplePrimitiveEnumTwinSseSimpleMethodTwinSse(that: this, hint: hint);
}

class SimpleStructTwinSse {
final String one;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -156,6 +156,15 @@ sealed class SimpleEnumTwinSync with _$SimpleEnumTwinSync {
.simpleEnumTwinSyncSimpleMethodTwinSync(that: this, hint: hint);
}

enum SimplePrimitiveEnumTwinSync {
first,
second,
;

int simpleMethodTwinSync({dynamic hint}) => RustLib.instance.api
.simplePrimitiveEnumTwinSyncSimpleMethodTwinSync(that: this, hint: hint);
}

class SimpleStructTwinSync {
final String one;

Expand Down

0 comments on commit d6fc16d

Please sign in to comment.