Skip to content

Commit a855b25

Browse files
committed
fix: parse and ignore return named arguments
1 parent 257ed1b commit a855b25

File tree

8 files changed

+37
-31
lines changed

8 files changed

+37
-31
lines changed

Cargo.lock

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

src/core/generate/rs/src/bindings/javascript.rs

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -163,18 +163,20 @@ fn pp_fields(fs: &[Field]) -> RcDoc<'_> {
163163

164164
fn pp_function(func: &Function) -> RcDoc<'_> {
165165
let args = pp_args(&func.args);
166-
let rets = pp_rets(&func.rets);
166+
let rets = pp_args(&func.rets);
167167
let modes = pp_modes(&func.modes);
168168
sep_enclose([args, rets, modes], ",", "(", ")").nest(INDENT_SPACE)
169169
}
170170

171171
fn pp_args(args: &[ArgType]) -> RcDoc<'_> {
172-
let args = args.iter().map(|arg| pp_ty(&arg.typ));
173-
sep_enclose(args, ",", "[", "]")
172+
pp_types(args.iter().map(|arg| &arg.typ))
174173
}
175174

176-
fn pp_rets(args: &[Type]) -> RcDoc<'_> {
177-
sep_enclose(args.iter().map(pp_ty), ",", "[", "]")
175+
fn pp_types<'a, T>(types: T) -> RcDoc<'a>
176+
where
177+
T: Iterator<Item = &'a Type>,
178+
{
179+
sep_enclose(types.map(pp_ty), ",", "[", "]")
178180
}
179181

180182
fn pp_modes(modes: &[candid::types::FuncMode]) -> RcDoc<'_> {
@@ -276,7 +278,7 @@ pub fn compile(env: &TypeEnv, actor: &Option<Type>) -> String {
276278
.append(";");
277279

278280
let idl_init_args = str("export const idlInitArgs = ")
279-
.append(pp_rets(init_types))
281+
.append(pp_types(init_types.iter()))
280282
.append(";");
281283

282284
let idl_factory_return = kwd("return").append(actor).append(";");
@@ -287,7 +289,9 @@ pub fn compile(env: &TypeEnv, actor: &Option<Type>) -> String {
287289
let init_defs = chase_types(env, init_types).unwrap();
288290
let init_recs = infer_rec(env, &init_defs).unwrap();
289291
let init_defs_doc = pp_defs(env, &init_defs, &init_recs, false);
290-
let init_doc = kwd("return").append(pp_rets(init_types)).append(";");
292+
let init_doc = kwd("return")
293+
.append(pp_types(init_types.iter()))
294+
.append(";");
291295
let init_doc = init_defs_doc.append(init_doc);
292296
let init_doc =
293297
str("export const init = ({ IDL }) => ").append(enclose_space("{", init_doc, "};"));

src/core/generate/rs/src/bindings/typescript.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -209,9 +209,9 @@ fn pp_function<'a>(env: &'a TypeEnv, func: &'a Function) -> RcDoc<'a> {
209209
let args = sep_enclose(args, ",", "[", "]");
210210
let rets = match func.rets.len() {
211211
0 => str("undefined"),
212-
1 => pp_ty(env, &func.rets[0], true),
212+
1 => pp_ty(env, &func.rets[0].typ, true),
213213
_ => sep_enclose(
214-
func.rets.iter().map(|ty| pp_ty(env, ty, true)),
214+
func.rets.iter().map(|ret| pp_ty(env, &ret.typ, true)),
215215
",",
216216
"[",
217217
"]",

src/core/generate/rs/src/bindings/typescript_native/compile_wrapper.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -354,18 +354,20 @@ fn create_actor_method(
354354
span: DUMMY_SP,
355355
kind: TsKeywordTypeKind::TsVoidKeyword,
356356
}),
357-
1 => convert_type_with_converter(converter, env, &func.rets[0], None, true),
357+
1 => convert_type_with_converter(converter, env, &func.rets[0].typ, None, true),
358358
_ => {
359359
// Create a tuple type for multiple return values
360360
TsType::TsTupleType(TsTupleType {
361361
span: DUMMY_SP,
362362
elem_types: func
363363
.rets
364364
.iter()
365-
.map(|ty| TsTupleElement {
365+
.map(|ret| TsTupleElement {
366366
span: DUMMY_SP,
367367
label: None,
368-
ty: Box::new(convert_type_with_converter(converter, env, ty, None, true)),
368+
ty: Box::new(convert_type_with_converter(
369+
converter, env, &ret.typ, None, true,
370+
)),
369371
})
370372
.collect(),
371373
})

src/core/generate/rs/src/bindings/typescript_native/conversion_functions_generator.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use super::comments::PosCursor;
22
use super::new_typescript_native_types::{convert_type_with_converter, is_recursive_optional};
33
use super::original_typescript_types::OriginalTypescriptTypes;
44
use super::utils::{EnumDeclarations, contains_unicode_characters, get_ident_guarded};
5-
use candid::types::{Field, Label, Type, TypeEnv, TypeInner};
5+
use candid::types::{ArgType, Field, Label, Type, TypeEnv, TypeInner};
66
use std::collections::{HashMap, HashSet};
77
use swc_core::common::{DUMMY_SP, SyntaxContext, comments::SingleThreadedComments};
88
use swc_core::ecma::ast::*;
@@ -1703,14 +1703,14 @@ impl<'a> TypeConverter<'a> {
17031703
pub fn convert_multi_return_from_candid(
17041704
converter: &mut TypeConverter,
17051705
expr: &Expr,
1706-
types: &[Type],
1706+
types: &[ArgType],
17071707
) -> Expr {
17081708
if types.is_empty() {
17091709
// No return value, return void
17101710
Expr::Lit(Lit::Null(Null { span: DUMMY_SP }))
17111711
} else if types.len() == 1 {
17121712
// Single return value
1713-
converter.convert_from_candid(expr, &types[0])
1713+
converter.convert_from_candid(expr, &types[0].typ)
17141714
} else {
17151715
// Multiple return values in a tuple
17161716
Expr::Array(ArrayLit {
@@ -1734,12 +1734,12 @@ pub fn convert_multi_return_from_candid(
17341734
});
17351735

17361736
// If type doesn't need conversion, use it directly
1737-
let value = if !converter.needs_conversion(ty) {
1737+
let value = if !converter.needs_conversion(&ty.typ) {
17381738
elem_expr
17391739
} else {
17401740
// Convert the return value using the appropriate function
1741-
let function_name = converter.get_from_candid_function_name(ty);
1742-
converter.generate_from_candid_function(ty, &function_name);
1741+
let function_name = converter.get_from_candid_function_name(&ty.typ);
1742+
converter.generate_from_candid_function(&ty.typ, &function_name);
17431743
Expr::Call(CallExpr {
17441744
span: DUMMY_SP,
17451745
callee: Callee::Expr(Box::new(Expr::Ident(Ident::new(

src/core/generate/rs/src/bindings/typescript_native/new_typescript_native_types.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -928,18 +928,18 @@ fn create_method_signature(
928928
span: DUMMY_SP,
929929
kind: TsKeywordTypeKind::TsVoidKeyword,
930930
}),
931-
1 => convert_type(top_level_nodes, env, &func.rets[0], None, true),
931+
1 => convert_type(top_level_nodes, env, &func.rets[0].typ, None, true),
932932
_ => {
933933
// Create a tuple type for multiple return values
934934
TsType::TsTupleType(TsTupleType {
935935
span: DUMMY_SP,
936936
elem_types: func
937937
.rets
938938
.iter()
939-
.map(|ty| TsTupleElement {
939+
.map(|ret| TsTupleElement {
940940
span: DUMMY_SP,
941941
label: None,
942-
ty: Box::new(convert_type(top_level_nodes, env, ty, None, true)),
942+
ty: Box::new(convert_type(top_level_nodes, env, &ret.typ, None, true)),
943943
})
944944
.collect(),
945945
})
@@ -1003,18 +1003,18 @@ fn create_function_type(
10031003
span: DUMMY_SP,
10041004
kind: TsKeywordTypeKind::TsVoidKeyword,
10051005
}),
1006-
1 => convert_type(top_level_nodes, env, &func.rets[0], None, true),
1006+
1 => convert_type(top_level_nodes, env, &func.rets[0].typ, None, true),
10071007
_ => {
10081008
// Create a tuple type for multiple return values
10091009
TsType::TsTupleType(TsTupleType {
10101010
span: DUMMY_SP,
10111011
elem_types: func
10121012
.rets
10131013
.iter()
1014-
.map(|ty| TsTupleElement {
1014+
.map(|ret| TsTupleElement {
10151015
span: DUMMY_SP,
10161016
label: None,
1017-
ty: Box::new(convert_type(top_level_nodes, env, ty, None, true)),
1017+
ty: Box::new(convert_type(top_level_nodes, env, &ret.typ, None, true)),
10181018
})
10191019
.collect(),
10201020
})

src/core/generate/rs/src/parser.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,8 +74,8 @@ pub fn check_type(env: &Env, t: &IDLType) -> Result<Type> {
7474
t1.push(check_arg(env, arg)?);
7575
}
7676
let mut t2 = Vec::new();
77-
for t in func.rets.iter() {
78-
t2.push(check_type(env, t)?);
77+
for ret in func.rets.iter() {
78+
t2.push(check_arg(env, ret)?);
7979
}
8080
if func.modes.len() > 1 {
8181
return Err(Error::msg("cannot have more than one mode"));

tests/assets/example.did

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ type my_variant = variant {
8383
service server : {
8484
// Doc comment for f1 method of service
8585
f1 : (list, test: blob, opt bool) -> () oneway;
86-
g1 : (my_type, nested_opt, List, opt List, nested) -> (int, broker, nested_res) query;
86+
g1 : (my_type, nested_opt, List, opt List, nested) -> (ret0 : int, broker, ret2 : nested_res) query;
8787
h : (vec opt text, variant { A: nat; B: opt text }, opt List) -> (
8888
record {
8989
// Doc comment for id field in h method return, currently ignored

0 commit comments

Comments
 (0)