Merge pull request #159 from jgalenson/underscore

Allow wildcard argument names.
This commit is contained in:
David Tolnay 2020-04-27 16:46:22 -07:00 committed by GitHub
commit d6c521916f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 32 additions and 3 deletions

View File

@ -6,9 +6,9 @@ use crate::syntax::{
use quote::{format_ident, quote};
use syn::punctuated::Punctuated;
use syn::{
Abi, Error, Fields, FnArg, ForeignItem, ForeignItemFn, ForeignItemType, GenericArgument, Item,
ItemForeignMod, ItemStruct, Pat, PathArguments, Result, ReturnType, Token, Type as RustType,
TypeBareFn, TypePath, TypeReference, TypeSlice,
Abi, Error, Fields, FnArg, ForeignItem, ForeignItemFn, ForeignItemType, GenericArgument, Ident,
Item, ItemForeignMod, ItemStruct, Pat, PathArguments, Result, ReturnType, Token,
Type as RustType, TypeBareFn, TypePath, TypeReference, TypeSlice,
};
pub mod kw {
@ -193,6 +193,9 @@ fn parse_extern_fn(foreign_fn: &ForeignItemFn, lang: Lang) -> Result<ExternFn> {
FnArg::Typed(arg) => {
let ident = match arg.pat.as_ref() {
Pat::Ident(pat) => pat.ident.clone(),
Pat::Wild(pat) => {
Ident::new(&format!("_{}", args.len()), pat.underscore_token.span)
}
_ => return Err(Error::new_spanned(arg, "unsupported signature")),
};
let ty = parse_type(&arg.ty)?;

View File

@ -34,6 +34,8 @@ pub mod ffi {
fn c_return_ref_vector(c: &C) -> &CxxVector<u8>;
fn c_return_rust_vec() -> Vec<u8>;
fn c_return_ref_rust_vec(c: &C) -> &Vec<u8>;
fn c_return_identity(_: usize) -> usize;
fn c_return_sum(_: usize, _: usize) -> usize;
fn c_take_primitive(n: usize);
fn c_take_shared(shared: Shared);
@ -86,6 +88,8 @@ pub mod ffi {
fn r_return_unique_ptr_string() -> UniquePtr<CxxString>;
fn r_return_rust_vec() -> Vec<u8>;
fn r_return_ref_rust_vec(shared: &Shared) -> &Vec<u8>;
fn r_return_identity(_: usize) -> usize;
fn r_return_sum(_: usize, _: usize) -> usize;
fn r_take_primitive(n: usize);
fn r_take_shared(shared: Shared);
@ -184,6 +188,14 @@ fn r_return_ref_rust_vec(shared: &ffi::Shared) -> &Vec<u8> {
unimplemented!()
}
fn r_return_identity(n: usize) -> usize {
n
}
fn r_return_sum(n1: usize, n2: usize) -> usize {
n1 + n2
}
fn r_take_primitive(n: usize) {
assert_eq!(n, 2020);
}

View File

@ -102,6 +102,14 @@ const rust::Vec<uint8_t> &c_return_ref_rust_vec(const C &c) {
throw std::runtime_error("unimplemented");
}
size_t c_return_identity(size_t n) {
return n;
}
size_t c_return_sum(size_t n1, size_t n2) {
return n1 + n2;
}
void c_take_primitive(size_t n) {
if (n == 2020) {
cxx_test_suite_set_correct();
@ -265,6 +273,8 @@ extern "C" const char *cxx_run_test() noexcept {
ASSERT(std::string(r_return_str(Shared{2020})) == "2020");
ASSERT(std::string(r_return_rust_string()) == "2020");
ASSERT(*r_return_unique_ptr_string() == "2020");
ASSERT(r_return_identity(2020) == 2020);
ASSERT(r_return_sum(2020, 1) == 2021);
r_take_primitive(2020);
r_take_shared(Shared{2020});

View File

@ -38,6 +38,8 @@ std::unique_ptr<std::vector<C>> c_return_unique_ptr_vector_opaque();
const std::vector<uint8_t> &c_return_ref_vector(const C &c);
rust::Vec<uint8_t> c_return_rust_vec();
const rust::Vec<uint8_t> &c_return_ref_rust_vec(const C &c);
size_t c_return_identity(size_t n);
size_t c_return_sum(size_t n1, size_t n2);
void c_take_primitive(size_t n);
void c_take_shared(Shared shared);

View File

@ -49,6 +49,8 @@ fn test_c_return() {
.map(|o| o.z)
.sum(),
);
assert_eq!(2020, ffi::c_return_identity(2020));
assert_eq!(2021, ffi::c_return_sum(2020, 1));
}
#[test]