Skip to content

Commit

Permalink
Add support for returning references in Dart (#402)
Browse files Browse the repository at this point in the history
* Add skip_if_unsupported; use to enable borrow-returning feature test

* Track ownership of opaques in dart

* Add support for return-of-reference to dart
  • Loading branch information
Manishearth committed Jan 10, 2024
1 parent 2d647ac commit f19bb8a
Show file tree
Hide file tree
Showing 40 changed files with 216 additions and 95 deletions.
2 changes: 2 additions & 0 deletions Makefile.toml
Original file line number Diff line number Diff line change
Expand Up @@ -202,6 +202,7 @@ exec --fail-on-error npm run test
[tasks.test-dart-example]
category = "Tests"
script_runner = "@duckscript"
dependencies = ["build-example"]
script = '''
exit_on_error true
cd example/dart/
Expand All @@ -212,6 +213,7 @@ exec --fail-on-error dart --enable-experiment=native-assets test
[tasks.test-dart-feature]
category = "Tests"
script_runner = "@duckscript"
dependencies = ["build-feature"]
script = '''
exit_on_error true
cd feature_tests/dart/
Expand Down
16 changes: 13 additions & 3 deletions core/src/ast/attrs.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,19 @@ use syn::{Attribute, Ident, LitStr, Meta, Token};
pub struct Attrs {
pub cfg: Vec<Attribute>,
pub attrs: Vec<DiplomatBackendAttr>,
/// AST backends only. For using features that may panic AST backends, like returning references.
///
/// This isn't a regular attribute since AST backends do not handle regular attributes. Do not use
/// in HIR backends,
pub skip_if_unsupported: bool,
}

impl Attrs {
fn add_attr(&mut self, attr: Attr) {
match attr {
Attr::Cfg(attr) => self.cfg.push(attr),
Attr::DiplomatBackendAttr(attr) => self.attrs.push(attr),
Attr::DiplomatBackend(attr) => self.attrs.push(attr),
Attr::SkipIfUnsupported => self.skip_if_unsupported = true,
}
}

Expand Down Expand Up @@ -45,21 +51,25 @@ impl From<&[Attribute]> for Attrs {

enum Attr {
Cfg(Attribute),
DiplomatBackendAttr(DiplomatBackendAttr),
DiplomatBackend(DiplomatBackendAttr),
SkipIfUnsupported,
// More goes here
}

fn syn_attr_to_ast_attr(attrs: &[Attribute]) -> impl Iterator<Item = Attr> + '_ {
let cfg_path: syn::Path = syn::parse_str("cfg").unwrap();
let dattr_path: syn::Path = syn::parse_str("diplomat::attr").unwrap();
let skipast: syn::Path = syn::parse_str("diplomat::skip_if_unsupported").unwrap();
attrs.iter().filter_map(move |a| {
if a.path() == &cfg_path {
Some(Attr::Cfg(a.clone()))
} else if a.path() == &dattr_path {
Some(Attr::DiplomatBackendAttr(
Some(Attr::DiplomatBackend(
a.parse_args()
.expect("Failed to parse malformed diplomat::attr"),
))
} else if a.path() == &skipast {
Some(Attr::SkipIfUnsupported)
} else {
None
}
Expand Down
8 changes: 5 additions & 3 deletions example/dart/lib/src/ICU4XDataProvider.g.dart

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 5 additions & 3 deletions example/dart/lib/src/ICU4XFixedDecimal.g.dart

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 5 additions & 3 deletions example/dart/lib/src/ICU4XFixedDecimalFormatter.g.dart

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 5 additions & 3 deletions example/dart/lib/src/ICU4XLocale.g.dart

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions feature_tests/c/include/Bar.h

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 4 additions & 0 deletions feature_tests/c2/include/Bar.h

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions feature_tests/cpp/docs/source/lifetimes_ffi.rst

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions feature_tests/cpp/include/Bar.h

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions feature_tests/cpp/include/Bar.hpp

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 4 additions & 0 deletions feature_tests/cpp2/include/Bar.d.hpp

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 4 additions & 0 deletions feature_tests/cpp2/include/Bar.h

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions feature_tests/cpp2/include/Bar.hpp

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 4 additions & 2 deletions feature_tests/dart/lib/src/AttrOpaque1.g.dart

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 4 additions & 2 deletions feature_tests/dart/lib/src/AttrOpaque2.g.dart

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

15 changes: 13 additions & 2 deletions feature_tests/dart/lib/src/Bar.g.dart

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

20 changes: 11 additions & 9 deletions feature_tests/dart/lib/src/Float64Vec.g.dart

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading

0 comments on commit f19bb8a

Please sign in to comment.